diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 9c01a8d979..2a8df98763 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -50,8 +50,8 @@ jobs: - name: Publish changelog (Discord) run: Tools/actions_changelogs_since_last_run.py env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - DISCORD_WEBHOOK_URL: ${{ secrets.CHANGELOG_DISCORD_WEBHOOK }} + PUBLISH_TOKEN: ${{ secrets.PUBLISH_TOKEN }} + GITHUB_REPOSITORY: ${{ vars.GITHUB_REPOSITORY }} - name: Publish changelog (RSS) run: Tools/actions_changelog_rss.py diff --git a/.github/workflows/update-credits.yml b/.github/workflows/update-credits.yml index 69a8bc1988..5dc6299c6c 100644 --- a/.github/workflows/update-credits.yml +++ b/.github/workflows/update-credits.yml @@ -19,6 +19,8 @@ jobs: - name: Get this week's Contributors shell: pwsh + env: + GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} run: Tools/dump_github_contributors.ps1 > Resources/Credits/GitHub.txt # TODO diff --git a/Content.Client/Administration/UI/DepartmentWhitelistPanel.xaml b/Content.Client/Administration/UI/DepartmentWhitelistPanel.xaml new file mode 100644 index 0000000000..d5f77aedd5 --- /dev/null +++ b/Content.Client/Administration/UI/DepartmentWhitelistPanel.xaml @@ -0,0 +1,11 @@ + + + + + + diff --git a/Content.Client/Administration/UI/DepartmentWhitelistPanel.xaml.cs b/Content.Client/Administration/UI/DepartmentWhitelistPanel.xaml.cs new file mode 100644 index 0000000000..275055daf6 --- /dev/null +++ b/Content.Client/Administration/UI/DepartmentWhitelistPanel.xaml.cs @@ -0,0 +1,49 @@ +using Content.Shared.Roles; +using Robust.Client.AutoGenerated; +using Robust.Client.UserInterface; +using Robust.Client.UserInterface.Controls; +using Robust.Client.UserInterface.CustomControls; +using Robust.Client.UserInterface.XAML; +using Robust.Shared.Prototypes; + +namespace Content.Client.Administration.UI; + +[GenerateTypedNameReferences] +public sealed partial class DepartmentWhitelistPanel : PanelContainer +{ + public Action, bool>? OnSetJob; + + public DepartmentWhitelistPanel(DepartmentPrototype department, IPrototypeManager proto, HashSet> whitelists) + { + RobustXamlLoader.Load(this); + + var allWhitelisted = true; + var grey = Color.FromHex("#ccc"); + foreach (var id in department.Roles) + { + var thisJob = id; // closure capturing funny + var button = new CheckBox(); + button.Text = proto.Index(id).LocalizedName; + if (!proto.Index(id).Whitelisted) + button.Modulate = grey; // Let admins know whitelisting this job is only for futureproofing. + button.Pressed = whitelists.Contains(id); + button.OnPressed += _ => OnSetJob?.Invoke(thisJob, button.Pressed); + JobsContainer.AddChild(button); + + allWhitelisted &= button.Pressed; + } + + Department.Text = Loc.GetString(department.ID); + Department.Modulate = department.Color; + Department.Pressed = allWhitelisted; + Department.OnPressed += args => + { + foreach (var id in department.Roles) + { + // only request to whitelist roles that aren't already whitelisted, and vice versa + if (whitelists.Contains(id) != Department.Pressed) + OnSetJob?.Invoke(id, Department.Pressed); + } + }; + } +} diff --git a/Content.Client/Administration/UI/JobWhitelistsEui.cs b/Content.Client/Administration/UI/JobWhitelistsEui.cs new file mode 100644 index 0000000000..b8fe974c0a --- /dev/null +++ b/Content.Client/Administration/UI/JobWhitelistsEui.cs @@ -0,0 +1,40 @@ +using Content.Client.Eui; +using Content.Shared.Administration; +using Content.Shared.Eui; + +namespace Content.Client.Administration.UI; + +public sealed class JobWhitelistsEui : BaseEui +{ + private JobWhitelistsWindow Window; + + public JobWhitelistsEui() + { + Window = new JobWhitelistsWindow(); + Window.OnClose += () => SendMessage(new CloseEuiMessage()); + Window.OnSetJob += (id, whitelisted) => SendMessage(new SetJobWhitelistedMessage(id, whitelisted)); + } + + public override void HandleState(EuiStateBase state) + { + if (state is not JobWhitelistsEuiState cast) + return; + + Window.HandleState(cast); + } + + public override void Opened() + { + base.Opened(); + + Window.OpenCentered(); + } + + public override void Closed() + { + base.Closed(); + + Window.Close(); + Window.Dispose(); + } +} diff --git a/Content.Client/Administration/UI/JobWhitelistsWindow.xaml b/Content.Client/Administration/UI/JobWhitelistsWindow.xaml new file mode 100644 index 0000000000..165f5ac3d7 --- /dev/null +++ b/Content.Client/Administration/UI/JobWhitelistsWindow.xaml @@ -0,0 +1,11 @@ + + + + diff --git a/Content.Client/Administration/UI/JobWhitelistsWindow.xaml.cs b/Content.Client/Administration/UI/JobWhitelistsWindow.xaml.cs new file mode 100644 index 0000000000..51fb5287dc --- /dev/null +++ b/Content.Client/Administration/UI/JobWhitelistsWindow.xaml.cs @@ -0,0 +1,46 @@ +using Content.Client.UserInterface.Controls; +using Content.Shared.Database; +using Content.Shared.Administration; +using Content.Shared.Roles; +using Robust.Client.AutoGenerated; +using Robust.Client.UserInterface; +using Robust.Client.UserInterface.Controls; +using Robust.Client.UserInterface.CustomControls; +using Robust.Client.UserInterface.XAML; +using Robust.Shared.Prototypes; + +namespace Content.Client.Administration.UI; + +/// +/// An admin panel to toggle whitelists for individual jobs or entire departments. +/// This should generally be preferred to a blanket whitelist (Whitelisted: True) since +/// being good with a batong doesn't mean you know engineering and vice versa. +/// +[GenerateTypedNameReferences] +public sealed partial class JobWhitelistsWindow : FancyWindow +{ + [Dependency] private readonly IPrototypeManager _proto = default!; + + public Action, bool>? OnSetJob; + + public JobWhitelistsWindow() + { + RobustXamlLoader.Load(this); + IoCManager.InjectDependencies(this); + + PlayerName.Text = "???"; + } + + public void HandleState(JobWhitelistsEuiState state) + { + PlayerName.Text = state.PlayerName; + + Departments.RemoveAllChildren(); + foreach (var proto in _proto.EnumeratePrototypes()) + { + var panel = new DepartmentWhitelistPanel(proto, _proto, state.Whitelists); + panel.OnSetJob += (id, whitelisting) => OnSetJob?.Invoke(id, whitelisting); + Departments.AddChild(panel); + } + } +} diff --git a/Content.Client/CartridgeLoader/Cartridges/NewsReaderUiFragment.xaml.cs b/Content.Client/CartridgeLoader/Cartridges/NewsReaderUiFragment.xaml.cs index f3b2d373d7..2d4d192ea8 100644 --- a/Content.Client/CartridgeLoader/Cartridges/NewsReaderUiFragment.xaml.cs +++ b/Content.Client/CartridgeLoader/Cartridges/NewsReaderUiFragment.xaml.cs @@ -31,7 +31,7 @@ public void UpdateState(NewsArticle article, int targetNum, int totalNum, bool n Author.Visible = true; PageName.Text = article.Title; - PageText.SetMarkup(article.Content); + PageText.SetMarkupPermissive(article.Content); PageNum.Text = $"{targetNum}/{totalNum}"; diff --git a/Content.Client/Chapel/SacrificialAltarSystem.cs b/Content.Client/Chapel/SacrificialAltarSystem.cs new file mode 100644 index 0000000000..5b694e4b4e --- /dev/null +++ b/Content.Client/Chapel/SacrificialAltarSystem.cs @@ -0,0 +1,5 @@ +using Content.Shared.Chapel; + +namespace Content.Client.Chapel; + +public sealed class SacrificialAltarSystem : SharedSacrificialAltarSystem; diff --git a/Content.Client/Arachne/CocoonSystem.cs b/Content.Client/Cocoon/CocoonSystem.cs similarity index 98% rename from Content.Client/Arachne/CocoonSystem.cs rename to Content.Client/Cocoon/CocoonSystem.cs index 7645c5bc81..d3eb4a8205 100644 --- a/Content.Client/Arachne/CocoonSystem.cs +++ b/Content.Client/Cocoon/CocoonSystem.cs @@ -1,4 +1,4 @@ -using Content.Shared.Arachne; +using Content.Shared.Cocoon; using Content.Shared.Humanoid; using Robust.Client.GameObjects; using Robust.Shared.Containers; diff --git a/Content.Client/LateJoin/LateJoinGui.cs b/Content.Client/LateJoin/LateJoinGui.cs index 1b2a87be72..e474f0c942 100644 --- a/Content.Client/LateJoin/LateJoinGui.cs +++ b/Content.Client/LateJoin/LateJoinGui.cs @@ -261,7 +261,24 @@ private void RebuildUI() jobButton.OnPressed += _ => SelectedId.Invoke((id, jobButton.JobId)); - if (!_characterRequirements.CheckRequirementsValid( + if (!_jobRequirements.CheckJobWhitelist(prototype, out var reason)) + { + jobButton.Disabled = true; + + var tooltip = new Tooltip(); + tooltip.SetMessage(reason); + jobButton.TooltipSupplier = _ => tooltip; + + jobSelector.AddChild(new TextureRect + { + TextureScale = new Vector2(0.4f, 0.4f), + Stretch = TextureRect.StretchMode.KeepCentered, + Texture = _sprites.Frame0(new SpriteSpecifier.Texture(new ("/Textures/Interface/Nano/lock.svg.192dpi.png"))), + HorizontalExpand = true, + HorizontalAlignment = HAlignment.Right, + }); + } + else if (!_characterRequirements.CheckRequirementsValid( prototype.Requirements ?? new(), prototype, (HumanoidCharacterProfile) (_prefs.Preferences?.SelectedCharacter diff --git a/Content.Client/Lobby/LobbyUIController.cs b/Content.Client/Lobby/LobbyUIController.cs index ccefbb0aa4..26643cb603 100644 --- a/Content.Client/Lobby/LobbyUIController.cs +++ b/Content.Client/Lobby/LobbyUIController.cs @@ -63,12 +63,8 @@ public override void Initialize() _requirements.Updated += OnRequirementsUpdated; _configurationManager.OnValueChanged(CCVars.FlavorText, _ => _profileEditor?.RefreshFlavorText()); - _configurationManager.OnValueChanged(CCVars.GameRoleTimers, - _ => - { - _profileEditor?.RefreshAntags(); - _profileEditor?.RefreshJobs(); - }); + _configurationManager.OnValueChanged(CCVars.GameRoleTimers, _ => RefreshProfileEditor()); + _configurationManager.OnValueChanged(CCVars.GameRoleWhitelist, _ => RefreshProfileEditor()); _preferencesManager.OnServerDataLoaded += PreferencesDataLoaded; } @@ -168,6 +164,12 @@ private void RefreshLobbyPreview() PreviewPanel.SetSummaryText(humanoid.Summary); } + private void RefreshProfileEditor() + { + _profileEditor?.RefreshAntags(); + _profileEditor?.RefreshJobs(); + } + private void SaveProfile() { DebugTools.Assert(EditedProfile != null); diff --git a/Content.Client/Lobby/UI/HumanoidProfileEditor.xaml.cs b/Content.Client/Lobby/UI/HumanoidProfileEditor.xaml.cs index 012d894aee..3f526981a4 100644 --- a/Content.Client/Lobby/UI/HumanoidProfileEditor.xaml.cs +++ b/Content.Client/Lobby/UI/HumanoidProfileEditor.xaml.cs @@ -639,6 +639,8 @@ public void SetProfile(HumanoidCharacterProfile? profile, int? slot) UpdateGenderControls(); UpdateSkinColor(); UpdateSpawnPriorityControls(); + UpdateFlavorTextEdit(); + UpdateCustomSpecieNameEdit(); UpdateAgeEdit(); UpdateEyePickers(); UpdateSaveButton(); @@ -770,7 +772,9 @@ public void RefreshJobs() icon.Texture = jobIcon.Icon.Frame0(); selector.Setup(items, job.LocalizedName, 200, job.LocalizedDescription, icon); - if (!_characterRequirementsSystem.CheckRequirementsValid( + if (!_requirements.CheckJobWhitelist(job, out var reason)) + selector.LockRequirements(reason); + else if (!_characterRequirementsSystem.CheckRequirementsValid( job.Requirements ?? new(), job, Profile ?? HumanoidCharacterProfile.DefaultWithSpecies(), @@ -916,7 +920,9 @@ private void UpdateRoleRequirements() icon.Texture = jobIcon.Icon.Frame0(); selector.Setup(items, job.LocalizedName, 200, job.LocalizedDescription, icon); - if (!_characterRequirementsSystem.CheckRequirementsValid( + if (!_requirements.CheckJobWhitelist(job, out var reason)) + selector.LockRequirements(reason); + else if (!_characterRequirementsSystem.CheckRequirementsValid( job.Requirements ?? new(), job, Profile ?? HumanoidCharacterProfile.DefaultWithSpecies(), @@ -972,6 +978,7 @@ private void EnsureJobRequirementsValid() { var proto = _prototypeManager.Index(jobId); if ((JobPriority) selector.Selected == JobPriority.Never + || _requirements.CheckJobWhitelist(proto, out _) || _characterRequirementsSystem.CheckRequirementsValid( proto.Requirements ?? new(), proto, @@ -1200,15 +1207,9 @@ private void UpdateNameEdit() private void UpdateCustomSpecieNameEdit() { - if (Profile == null) - return; - - _customspecienameEdit.Text = Profile.Customspeciename ?? ""; - - if (!_prototypeManager.TryIndex(Profile.Species, out var speciesProto)) - return; - - _ccustomspecienamecontainerEdit.Visible = speciesProto.CustomName; + var species = _species.Find(x => x.ID == Profile?.Species) ?? _species.First(); + _customspecienameEdit.Text = string.IsNullOrEmpty(Profile?.Customspeciename) ? Loc.GetString(species.Name) : Profile.Customspeciename; + _ccustomspecienamecontainerEdit.Visible = species.CustomName; } private void UpdateFlavorTextEdit() @@ -1437,7 +1438,7 @@ private void UpdateWeight() var avg = (Profile.Width + Profile.Height) / 2; var weight = MathF.Round(MathF.PI * MathF.Pow(radius * avg, 2) * density); WeightLabel.Text = Loc.GetString("humanoid-profile-editor-weight-label", ("weight", (int) weight)); - } + } else // Whelp, the fixture doesn't exist, guesstimate it instead WeightLabel.Text = Loc.GetString("humanoid-profile-editor-weight-label", ("weight", (int) 71)); diff --git a/Content.Client/MassMedia/Ui/ArticleEditorPanel.xaml.cs b/Content.Client/MassMedia/Ui/ArticleEditorPanel.xaml.cs index 7f98e3e0c3..5e068f1e9c 100644 --- a/Content.Client/MassMedia/Ui/ArticleEditorPanel.xaml.cs +++ b/Content.Client/MassMedia/Ui/ArticleEditorPanel.xaml.cs @@ -76,7 +76,7 @@ private void OnPreview(BaseButton.ButtonEventArgs eventArgs) TextEditPanel.Visible = !_preview; PreviewPanel.Visible = _preview; - PreviewLabel.SetMarkup(Rope.Collapse(ContentField.TextRope)); + PreviewLabel.SetMarkupPermissive(Rope.Collapse(ContentField.TextRope)); } private void OnCancel(BaseButton.ButtonEventArgs eventArgs) diff --git a/Content.Client/Message/RichTextLabelExt.cs b/Content.Client/Message/RichTextLabelExt.cs index ab6d17bf44..f3de61be12 100644 --- a/Content.Client/Message/RichTextLabelExt.cs +++ b/Content.Client/Message/RichTextLabelExt.cs @@ -5,9 +5,27 @@ namespace Content.Client.Message; public static class RichTextLabelExt { + + + /// + /// Sets the labels markup. + /// + /// + /// Invalid markup will cause exceptions to be thrown. Don't use this for user input! + /// public static RichTextLabel SetMarkup(this RichTextLabel label, string markup) { label.SetMessage(FormattedMessage.FromMarkup(markup)); return label; } + + /// + /// Sets the labels markup.
+ /// Uses FormatedMessage.FromMarkupPermissive which treats invalid markup as text. + ///
+ public static RichTextLabel SetMarkupPermissive(this RichTextLabel label, string markup) + { + label.SetMessage(FormattedMessage.FromMarkupPermissive(markup)); + return label; + } } diff --git a/Content.Client/Overlays/ColorTintOverlay.cs b/Content.Client/Overlays/ColorTintOverlay.cs new file mode 100644 index 0000000000..f40a8d7342 --- /dev/null +++ b/Content.Client/Overlays/ColorTintOverlay.cs @@ -0,0 +1,63 @@ +using Robust.Client.Graphics; +using Robust.Client.Player; +using Robust.Shared.Enums; +using Robust.Shared.Prototypes; +using Content.Shared.Shadowkin; + +namespace Content.Client.Overlays; + +/// +/// A simple overlay that applies a colored tint to the screen. +/// +public sealed class ColorTintOverlay : Overlay +{ + [Dependency] private readonly IPrototypeManager _prototype = default!; + [Dependency] private readonly IPlayerManager _player = default!; + [Dependency] IEntityManager _entityManager = default!; + + public override bool RequestScreenTexture => true; + public override OverlaySpace Space => OverlaySpace.WorldSpace; + private readonly ShaderInstance _shader; + + /// + /// The color to tint the screen to as RGB on a scale of 0-1. + /// + public Vector3? TintColor = null; + /// + /// The percent to tint the screen by on a scale of 0-1. + /// + public float? TintAmount = null; + + public ColorTintOverlay() + { + IoCManager.InjectDependencies(this); + _shader = _prototype.Index("ColorTint").InstanceUnique(); + } + + protected override bool BeforeDraw(in OverlayDrawArgs args) + { + if (_player.LocalEntity is not { Valid: true } player + || !_entityManager.HasComponent(player)) + return false; + + return base.BeforeDraw(in args); + } + protected override void Draw(in OverlayDrawArgs args) + { + if (ScreenTexture is null) + return; + + _shader.SetParameter("SCREEN_TEXTURE", ScreenTexture); + if (TintColor != null) + _shader.SetParameter("tint_color", (Vector3) TintColor); + if (TintAmount != null) + _shader.SetParameter("tint_amount", (float) TintAmount); + + var worldHandle = args.WorldHandle; + var viewport = args.WorldBounds; + worldHandle.SetTransform(Matrix3.Identity); + worldHandle.UseShader(_shader); + worldHandle.DrawRect(viewport, Color.White); + worldHandle.UseShader(null); + } +} \ No newline at end of file diff --git a/Content.Client/Overlays/EtherealOverlay.cs b/Content.Client/Overlays/EtherealOverlay.cs new file mode 100644 index 0000000000..3d771de8ce --- /dev/null +++ b/Content.Client/Overlays/EtherealOverlay.cs @@ -0,0 +1,48 @@ +using Robust.Client.Graphics; +using Robust.Client.Player; +using Robust.Shared.Enums; +using Robust.Shared.Prototypes; +using Content.Shared.Shadowkin; + +namespace Content.Client.Overlays; + +public sealed class EtherealOverlay : Overlay +{ + [Dependency] private readonly IPrototypeManager _prototype = default!; + [Dependency] private readonly IPlayerManager _player = default!; + [Dependency] IEntityManager _entityManager = default!; + + public override bool RequestScreenTexture => true; + public override OverlaySpace Space => OverlaySpace.WorldSpaceBelowFOV; + private readonly ShaderInstance _shader; + + public EtherealOverlay() + { + IoCManager.InjectDependencies(this); + _shader = _prototype.Index("Ethereal").InstanceUnique(); + } + + protected override bool BeforeDraw(in OverlayDrawArgs args) + { + if (_player.LocalEntity is not { Valid: true } player + || !_entityManager.HasComponent(player)) + return false; + + return base.BeforeDraw(in args); + } + + protected override void Draw(in OverlayDrawArgs args) + { + if (ScreenTexture is null) + return; + + _shader.SetParameter("SCREEN_TEXTURE", ScreenTexture); + + var worldHandle = args.WorldHandle; + var viewport = args.WorldBounds; + worldHandle.SetTransform(Matrix3.Identity); + worldHandle.UseShader(_shader); + worldHandle.DrawRect(viewport, Color.White); + worldHandle.UseShader(null); + } +} \ No newline at end of file diff --git a/Content.Client/Players/PlayTimeTracking/JobRequirementsManager.cs b/Content.Client/Players/PlayTimeTracking/JobRequirementsManager.cs index a2f8061d05..286358b85e 100644 --- a/Content.Client/Players/PlayTimeTracking/JobRequirementsManager.cs +++ b/Content.Client/Players/PlayTimeTracking/JobRequirementsManager.cs @@ -1,6 +1,7 @@ using System.Diagnostics.CodeAnalysis; using Content.Shared.CCVar; using Content.Shared.Customization.Systems; +using Content.Shared.Players.JobWhitelist; using Content.Shared.Players; using Content.Shared.Players.PlayTimeTracking; using Content.Shared.Roles; @@ -18,13 +19,13 @@ public sealed partial class JobRequirementsManager : ISharedPlaytimeManager { [Dependency] private readonly IBaseClient _client = default!; [Dependency] private readonly IClientNetManager _net = default!; + [Dependency] private readonly IConfigurationManager _cfg = default!; [Dependency] private readonly IPrototypeManager _prototypes = default!; private readonly Dictionary _roles = new(); private readonly List _roleBans = new(); - private ISawmill _sawmill = default!; - + private readonly List _jobWhitelists = new(); public event Action? Updated; public void Initialize() @@ -35,6 +36,7 @@ public void Initialize() _net.RegisterNetMessage(RxRoleBans); _net.RegisterNetMessage(RxPlayTime); _net.RegisterNetMessage(RxWhitelist); + _net.RegisterNetMessage(RxJobWhitelist); _client.RunLevelChanged += ClientOnRunLevelChanged; } @@ -78,6 +80,28 @@ private void RxPlayTime(MsgPlayTime message) Updated?.Invoke(); } + private void RxJobWhitelist(MsgJobWhitelist message) + { + _jobWhitelists.Clear(); + _jobWhitelists.AddRange(message.Whitelist); + Updated?.Invoke(); + } + + public bool CheckJobWhitelist(JobPrototype job, [NotNullWhen(false)] out FormattedMessage? reason) + { + reason = default; + if (!_cfg.GetCVar(CCVars.GameRoleWhitelist)) + return true; + + if (job.Whitelisted && !_jobWhitelists.Contains(job.ID)) + { + reason = FormattedMessage.FromUnformatted(Loc.GetString("role-not-whitelisted")); + return false; + } + + return true; + } + public TimeSpan FetchOverallPlaytime() { return _roles.TryGetValue("Overall", out var overallPlaytime) ? overallPlaytime : TimeSpan.Zero; diff --git a/Content.Client/RadialSelector/RadialSelectorMenuBUI.cs b/Content.Client/RadialSelector/RadialSelectorMenuBUI.cs new file mode 100644 index 0000000000..6b2a89f7a9 --- /dev/null +++ b/Content.Client/RadialSelector/RadialSelectorMenuBUI.cs @@ -0,0 +1,202 @@ +using System.Linq; +using System.Numerics; +using Content.Client.UserInterface.Controls; +using Content.Shared.Construction.Prototypes; +using Content.Shared.RadialSelector; +using JetBrains.Annotations; +using Robust.Client.GameObjects; +using Robust.Client.Graphics; +using Robust.Client.Input; +using Robust.Client.ResourceManagement; +using Robust.Client.UserInterface; +using Robust.Client.UserInterface.Controls; +using Robust.Shared.Prototypes; + +// ReSharper disable InconsistentNaming + +namespace Content.Client.RadialSelector; + +[UsedImplicitly] +public sealed class RadialSelectorMenuBUI : BoundUserInterface +{ + [Dependency] private readonly IClyde _displayManager = default!; + [Dependency] private readonly IInputManager _inputManager = default!; + [Dependency] private readonly IResourceCache _resources = default!; + [Dependency] private readonly IPrototypeManager _protoManager = default!; + [Dependency] private readonly IEntityManager _entManager = default!; + + private readonly SpriteSystem _spriteSystem; + + private readonly RadialMenu _menu; + + // Used to clearing on state changing + private readonly HashSet _cachedContainers = new(); + + private bool _openCentered; + private readonly Vector2 ItemSize = Vector2.One * 64; + + public RadialSelectorMenuBUI(EntityUid owner, Enum uiKey) : base(owner, uiKey) + { + _spriteSystem = _entManager.System(); + _menu = new RadialMenu + { + HorizontalExpand = true, + VerticalExpand = true, + BackButtonStyleClass = "RadialMenuBackButton", + CloseButtonStyleClass = "RadialMenuCloseButton" + }; + } + + protected override void Open() + { + _menu.OnClose += Close; + + if (_openCentered) + _menu.OpenCentered(); + else + _menu.OpenCenteredAt(_inputManager.MouseScreenPosition.Position / _displayManager.ScreenSize); + } + + protected override void UpdateState(BoundUserInterfaceState state) + { + base.UpdateState(state); + + if (state is not RadialSelectorState radialSelectorState) + return; + + ClearExistingContainers(); + CreateMenu(radialSelectorState.Entries); + _openCentered = radialSelectorState.OpenCentered; + } + + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + if (disposing) + _menu.Dispose(); + } + + private void CreateMenu(List entries, string parentCategory = "") + { + var container = new RadialContainer + { + Name = !string.IsNullOrEmpty(parentCategory) ? parentCategory : "Main", + Radius = 48f + 24f * MathF.Log(entries.Count), + }; + + _menu.AddChild(container); + _cachedContainers.Add(container); + + foreach (var entry in entries) + { + if (entry.Category != null) + { + var button = CreateButton(entry.Category.Name, _spriteSystem.Frame0(entry.Category.Icon)); + button.TargetLayer = entry.Category.Name; + CreateMenu(entry.Category.Entries, entry.Category.Name); + container.AddChild(button); + } + else if (entry.Prototype != null) + { + var name = GetName(entry.Prototype); + var icon = GetTextures(entry); + var button = CreateButton(name, icon); + button.OnButtonUp += _ => + { + var msg = new RadialSelectorSelectedMessage(entry.Prototype); + SendPredictedMessage(msg); + }; + + container.AddChild(button); + } + } + } + + private string GetName(string proto) + { + if (_protoManager.TryIndex(proto, out var prototype)) + return prototype.Name; + + if (_protoManager.TryIndex(proto, out ConstructionPrototype? constructionPrototype)) + return constructionPrototype.Name; + + return proto; + } + + private List GetTextures(RadialSelectorEntry entry) + { + var result = new List(); + if (entry.Icon is not null) + { + result.Add(_spriteSystem.Frame0(entry.Icon)); + return result; + } + + if (_protoManager.TryIndex(entry.Prototype!, out var prototype)) + { + result.AddRange(SpriteComponent.GetPrototypeTextures(prototype, _resources).Select(o => o.Default)); + return result; + } + + if (_protoManager.TryIndex(entry.Prototype!, out ConstructionPrototype? constructionProto)) + { + result.Add(_spriteSystem.Frame0(constructionProto.Icon)); + return result; + } + + // No icons provided and no icons found in prototypes. There's nothing we can do. + return result; + } + + private RadialMenuTextureButton CreateButton(string name, Texture icon) + { + var button = new RadialMenuTextureButton + { + ToolTip = Loc.GetString(name), + StyleClasses = { "RadialMenuButton" }, + SetSize = ItemSize + }; + + var iconScale = ItemSize / icon.Size; + var texture = new TextureRect + { + VerticalAlignment = Control.VAlignment.Center, + HorizontalAlignment = Control.HAlignment.Center, + Texture = icon, + TextureScale = iconScale + }; + + button.AddChild(texture); + return button; + } + + private RadialMenuTextureButton CreateButton(string name, List icons) + { + var button = new RadialMenuTextureButton + { + ToolTip = Loc.GetString(name), + StyleClasses = { "RadialMenuButton" }, + SetSize = ItemSize + }; + + var iconScale = ItemSize / icons[0].Size; + var texture = new LayeredTextureRect + { + VerticalAlignment = Control.VAlignment.Center, + HorizontalAlignment = Control.HAlignment.Center, + Textures = icons, + TextureScale = iconScale + }; + + button.AddChild(texture); + return button; + } + + private void ClearExistingContainers() + { + foreach (var container in _cachedContainers) + _menu.RemoveChild(container); + + _cachedContainers.Clear(); + } +} diff --git a/Content.Client/Shadowkin/EtherealSystem.cs b/Content.Client/Shadowkin/EtherealSystem.cs new file mode 100644 index 0000000000..cb289a87f1 --- /dev/null +++ b/Content.Client/Shadowkin/EtherealSystem.cs @@ -0,0 +1,52 @@ +using Content.Shared.Shadowkin; +using Robust.Client.Graphics; +using Robust.Shared.Player; +using Content.Client.Overlays; + +namespace Content.Client.Shadowkin; + +public sealed partial class EtherealSystem : EntitySystem +{ + [Dependency] private readonly IOverlayManager _overlayMan = default!; + [Dependency] private readonly ISharedPlayerManager _playerMan = default!; + + private EtherealOverlay _overlay = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnInit); + SubscribeLocalEvent(Onhutdown); + SubscribeLocalEvent(OnPlayerAttached); + SubscribeLocalEvent(OnPlayerDetached); + + _overlay = new(); + } + + private void OnInit(EntityUid uid, EtherealComponent component, ComponentInit args) + { + if (uid != _playerMan.LocalEntity) + return; + + _overlayMan.AddOverlay(_overlay); + } + + private void Onhutdown(EntityUid uid, EtherealComponent component, ComponentShutdown args) + { + if (uid != _playerMan.LocalEntity) + return; + + _overlayMan.RemoveOverlay(_overlay); + } + + private void OnPlayerAttached(EntityUid uid, EtherealComponent component, LocalPlayerAttachedEvent args) + { + _overlayMan.AddOverlay(_overlay); + } + + private void OnPlayerDetached(EntityUid uid, EtherealComponent component, LocalPlayerDetachedEvent args) + { + _overlayMan.RemoveOverlay(_overlay); + } +} diff --git a/Content.Client/Shadowkin/ShadowkinSystem.cs b/Content.Client/Shadowkin/ShadowkinSystem.cs new file mode 100644 index 0000000000..d8e1b69fc7 --- /dev/null +++ b/Content.Client/Shadowkin/ShadowkinSystem.cs @@ -0,0 +1,114 @@ +using Content.Shared.Shadowkin; +using Content.Shared.CCVar; +using Robust.Client.Graphics; +using Robust.Shared.Configuration; +using Robust.Shared.Player; +using Content.Shared.Humanoid; +using Content.Shared.Abilities.Psionics; +using Content.Client.Overlays; + +namespace Content.Client.Shadowkin; + +public sealed partial class ShadowkinSystem : EntitySystem +{ + [Dependency] private readonly IOverlayManager _overlayMan = default!; + [Dependency] private readonly IConfigurationManager _cfg = default!; + [Dependency] private readonly ISharedPlayerManager _playerMan = default!; + + private ColorTintOverlay _overlay = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnInit); + SubscribeLocalEvent(Onhutdown); + SubscribeLocalEvent(OnPlayerAttached); + SubscribeLocalEvent(OnPlayerDetached); + + Subs.CVar(_cfg, CCVars.NoVisionFilters, OnNoVisionFiltersChanged); + + _overlay = new(); + } + + private void OnInit(EntityUid uid, ShadowkinComponent component, ComponentInit args) + { + if (uid != _playerMan.LocalEntity + || _cfg.GetCVar(CCVars.NoVisionFilters)) + return; + + _overlayMan.AddOverlay(_overlay); + } + + private void Onhutdown(EntityUid uid, ShadowkinComponent component, ComponentShutdown args) + { + if (uid != _playerMan.LocalEntity) + return; + + _overlayMan.RemoveOverlay(_overlay); + } + + private void OnPlayerAttached(EntityUid uid, ShadowkinComponent component, LocalPlayerAttachedEvent args) + { + if (_cfg.GetCVar(CCVars.NoVisionFilters)) + return; + + _overlayMan.AddOverlay(_overlay); + } + + private void OnPlayerDetached(EntityUid uid, ShadowkinComponent component, LocalPlayerDetachedEvent args) + { + _overlayMan.RemoveOverlay(_overlay); + } + + private void OnNoVisionFiltersChanged(bool enabled) + { + if (enabled) + _overlayMan.RemoveOverlay(_overlay); + else + _overlayMan.AddOverlay(_overlay); + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + + if (_cfg.GetCVar(CCVars.NoVisionFilters)) + return; + + var uid = _playerMan.LocalEntity; + if (uid == null + || !TryComp(uid, out var comp) + || !TryComp(uid, out var humanoid)) + return; + + // 1/3 = 0.333... + // intensity = min + (power / max) + // intensity = intensity / 0.333 + // intensity = clamp intensity min, max + + var tintIntensity = 0.65f; + if (TryComp(uid, out var magic)) + { + var min = 0.45f; + var max = 0.75f; + tintIntensity = Math.Clamp(min + (magic.Mana / magic.MaxMana) * 0.333f, min, max); + } + + UpdateShader(new Vector3(humanoid.EyeColor.R, humanoid.EyeColor.G, humanoid.EyeColor.B), tintIntensity); + } + + private void UpdateShader(Vector3? color, float? intensity) + { + while (_overlayMan.HasOverlay()) + _overlayMan.RemoveOverlay(_overlay); + + if (color != null) + _overlay.TintColor = color; + if (intensity != null) + _overlay.TintAmount = intensity; + + if (!_cfg.GetCVar(CCVars.NoVisionFilters)) + _overlayMan.AddOverlay(_overlay); + } +} diff --git a/Content.Client/ShortConstruction/ShortConstructionSystem.cs b/Content.Client/ShortConstruction/ShortConstructionSystem.cs new file mode 100644 index 0000000000..492411977b --- /dev/null +++ b/Content.Client/ShortConstruction/ShortConstructionSystem.cs @@ -0,0 +1,46 @@ +using Content.Client.Construction; +using Content.Shared.Construction.Prototypes; +using Content.Shared.RadialSelector; +using Content.Shared.ShortConstruction; +using Robust.Client.Placement; +using Robust.Shared.Enums; +using Robust.Shared.Prototypes; +using Robust.Shared.Timing; + +namespace Content.Client.ShortConstruction; + +public sealed class ShortConstructionSystem : EntitySystem +{ + [Dependency] private readonly IGameTiming _gameTiming = default!; + [Dependency] private readonly IPlacementManager _placement = default!; + [Dependency] private readonly IPrototypeManager _proto = default!; + + [Dependency] private readonly ConstructionSystem _construction = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnItemRecieved); + } + + private void OnItemRecieved(Entity ent, ref RadialSelectorSelectedMessage args) + { + if (!_proto.TryIndex(args.SelectedItem, out ConstructionPrototype? prototype) || + !_gameTiming.IsFirstTimePredicted) + return; + + if (prototype.Type == ConstructionType.Item) + { + _construction.TryStartItemConstruction(prototype.ID); + return; + } + + _placement.BeginPlacing(new PlacementInformation + { + IsTile = false, + PlacementOption = prototype.PlacementMode + }, + new ConstructionPlacementHijack(_construction, prototype)); + } +} diff --git a/Content.Client/ShortConstruction/UI/ShortConstructionMenuBUI.cs b/Content.Client/ShortConstruction/UI/ShortConstructionMenuBUI.cs deleted file mode 100644 index 95da2e0a33..0000000000 --- a/Content.Client/ShortConstruction/UI/ShortConstructionMenuBUI.cs +++ /dev/null @@ -1,137 +0,0 @@ -using System.Numerics; -using Content.Client.Construction; -using Content.Client.UserInterface.Controls; -using Content.Shared.Construction.Prototypes; -using Content.Shared.ShortConstruction; -using JetBrains.Annotations; -using Robust.Client.GameObjects; -using Robust.Client.Graphics; -using Robust.Client.Input; -using Robust.Client.Placement; -using Robust.Client.UserInterface; -using Robust.Client.UserInterface.Controls; -using Robust.Shared.Enums; -using Robust.Shared.Prototypes; -using Robust.Shared.Utility; - -// ReSharper disable InconsistentNaming - -namespace Content.Client.ShortConstruction.UI; - -[UsedImplicitly] -public sealed class ShortConstructionMenuBUI : BoundUserInterface -{ - [Dependency] private readonly IClyde _displayManager = default!; - [Dependency] private readonly IInputManager _inputManager = default!; - [Dependency] private readonly EntityManager _entManager = default!; - [Dependency] private readonly IPrototypeManager _protoManager = default!; - [Dependency] private readonly IPlacementManager _placementManager = default!; - - private readonly ConstructionSystem _construction; - private readonly SpriteSystem _spriteSystem; - - private RadialMenu? _menu; - public ShortConstructionMenuBUI(EntityUid owner, Enum uiKey) : base(owner, uiKey) - { - _construction = _entManager.System(); - _spriteSystem = _entManager.System(); - } - - protected override void Open() - { - _menu = new RadialMenu - { - HorizontalExpand = true, - VerticalExpand = true, - BackButtonStyleClass = "RadialMenuBackButton", - CloseButtonStyleClass = "RadialMenuCloseButton" - }; - - if (_entManager.TryGetComponent(Owner, out var crafting)) - CreateMenu(crafting.Entries); - - _menu.OpenCenteredAt(_inputManager.MouseScreenPosition.Position / _displayManager.ScreenSize); - } - - protected override void Dispose(bool disposing) - { - base.Dispose(disposing); - if (disposing) - _menu?.Dispose(); - } - - private void CreateMenu(List entries, string? parentCategory = null) - { - if (_menu == null) - return; - - var container = new RadialContainer - { - Name = parentCategory ?? "Main", - Radius = 48f + 24f * MathF.Log(entries.Count), - }; - - _menu.AddChild(container); - - foreach (var entry in entries) - { - if (entry.Category != null) - { - var button = CreateButton(entry.Category.Name, entry.Category.Icon); - button.TargetLayer = entry.Category.Name; - CreateMenu(entry.Category.Entries, entry.Category.Name); - container.AddChild(button); - } - else if (entry.Prototype != null - && _protoManager.TryIndex(entry.Prototype, out var proto)) - { - var button = CreateButton(proto.Name, proto.Icon); - button.OnButtonUp += _ => ConstructItem(proto); - container.AddChild(button); - } - } - - } - - private RadialMenuTextureButton CreateButton(string name, SpriteSpecifier icon) - { - var button = new RadialMenuTextureButton - { - ToolTip = Loc.GetString(name), - StyleClasses = { "RadialMenuButton" }, - SetSize = new Vector2(64f, 64f), - }; - - var texture = new TextureRect - { - VerticalAlignment = Control.VAlignment.Center, - HorizontalAlignment = Control.HAlignment.Center, - Texture = _spriteSystem.Frame0(icon), - TextureScale = new Vector2(2f, 2f) - }; - - button.AddChild(texture); - return button; - } - - /// - /// Makes an item or places a schematic based on the type of construction recipe. - /// - private void ConstructItem(ConstructionPrototype prototype) - { - if (prototype.Type == ConstructionType.Item) - { - _construction.TryStartItemConstruction(prototype.ID); - return; - } - - _placementManager.BeginPlacing(new PlacementInformation - { - IsTile = false, - PlacementOption = prototype.PlacementMode - }, new ConstructionPlacementHijack(_construction, prototype)); - - // Should only close the menu if we're placing a construction hijack. - // Theres not much point to closing it though. _menu!.Close(); - } -} diff --git a/Content.Client/Tips/TippyUIController.cs b/Content.Client/Tips/TippyUIController.cs index 67c3ee45a7..2cc694d97d 100644 --- a/Content.Client/Tips/TippyUIController.cs +++ b/Content.Client/Tips/TippyUIController.cs @@ -175,7 +175,7 @@ private void NextState(TippyUI tippy) sprite.LayerSetVisible("hiding", false); } sprite.Rotation = 0; - tippy.Label.SetMarkup(_currentMessage.Msg); + tippy.Label.SetMarkupPermissive(_currentMessage.Msg); tippy.Label.Visible = false; tippy.LabelPanel.Visible = false; tippy.Visible = true; diff --git a/Content.Client/UserInterface/Systems/Storage/Controls/StorageContainer.cs b/Content.Client/UserInterface/Systems/Storage/Controls/StorageContainer.cs index e39ac5d322..a9d7e09826 100644 --- a/Content.Client/UserInterface/Systems/Storage/Controls/StorageContainer.cs +++ b/Content.Client/UserInterface/Systems/Storage/Controls/StorageContainer.cs @@ -254,7 +254,7 @@ public void BuildItemPieces() //todo. at some point, we may want to only rebuild the pieces that have actually received new data. - _pieceGrid.Children.Clear(); + _pieceGrid.RemoveAllChildren(); _pieceGrid.Rows = boundingGrid.Height + 1; _pieceGrid.Columns = boundingGrid.Width + 1; for (var y = boundingGrid.Bottom; y <= boundingGrid.Top; y++) @@ -275,18 +275,29 @@ public void BuildItemPieces() if (_entity.TryGetComponent(itemEnt, out var itemEntComponent)) { - var gridPiece = new ItemGridPiece((itemEnt, itemEntComponent), itemPos, _entity) + ItemGridPiece gridPiece; + + if (_storageController.CurrentlyDragging?.Entity is { } dragging + && dragging == itemEnt) + { + _storageController.CurrentlyDragging.Orphan(); + gridPiece = _storageController.CurrentlyDragging; + } + else { - MinSize = size, - Marked = Array.IndexOf(containedEntities, itemEnt) switch + gridPiece = new ItemGridPiece((itemEnt, itemEntComponent), itemPos, _entity) { - 0 => ItemGridPieceMarks.First, - 1 => ItemGridPieceMarks.Second, - _ => null, - } - }; - gridPiece.OnPiecePressed += OnPiecePressed; - gridPiece.OnPieceUnpressed += OnPieceUnpressed; + MinSize = size, + Marked = Array.IndexOf(containedEntities, itemEnt) switch + { + 0 => ItemGridPieceMarks.First, + 1 => ItemGridPieceMarks.Second, + _ => null, + } + }; + gridPiece.OnPiecePressed += OnPiecePressed; + gridPiece.OnPieceUnpressed += OnPieceUnpressed; + } control.AddChild(gridPiece); } diff --git a/Content.Client/UserInterface/Systems/Storage/StorageUIController.cs b/Content.Client/UserInterface/Systems/Storage/StorageUIController.cs index 346469d29d..97c9d8b795 100644 --- a/Content.Client/UserInterface/Systems/Storage/StorageUIController.cs +++ b/Content.Client/UserInterface/Systems/Storage/StorageUIController.cs @@ -314,15 +314,16 @@ private void OnPieceUnpressed(GUIBoundKeyEventArgs args, ItemGridPiece control) _entity.GetNetEntity(storageEnt))); } + _menuDragHelper.EndDrag(); _container?.BuildItemPieces(); } else //if we just clicked, then take it out of the bag. { + _menuDragHelper.EndDrag(); _entity.RaisePredictiveEvent(new StorageInteractWithItemEvent( _entity.GetNetEntity(control.Entity), _entity.GetNetEntity(storageEnt))); } - _menuDragHelper.EndDrag(); args.Handle(); } diff --git a/Content.IntegrationTests/PoolManager.Cvars.cs b/Content.IntegrationTests/PoolManager.Cvars.cs index aa6b4dffdc..5acd9d502c 100644 --- a/Content.IntegrationTests/PoolManager.Cvars.cs +++ b/Content.IntegrationTests/PoolManager.Cvars.cs @@ -21,6 +21,7 @@ private static readonly (string cvar, string value)[] TestCvars = (CCVars.NPCMaxUpdates.Name, "999999"), (CVars.ThreadParallelCount.Name, "1"), (CCVars.GameRoleTimers.Name, "false"), + (CCVars.GameRoleWhitelist.Name, "false"), (CCVars.GridFill.Name, "false"), (CCVars.PreloadGrids.Name, "false"), (CCVars.ArrivalsShuttles.Name, "false"), diff --git a/Content.Server.Database/Migrations/Postgres/20241018043329_RoleWhitelist.Designer.cs b/Content.Server.Database/Migrations/Postgres/20241018043329_RoleWhitelist.Designer.cs new file mode 100644 index 0000000000..159af4d192 --- /dev/null +++ b/Content.Server.Database/Migrations/Postgres/20241018043329_RoleWhitelist.Designer.cs @@ -0,0 +1,1896 @@ +// +using System; +using System.Net; +using System.Text.Json; +using Content.Server.Database; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using NpgsqlTypes; + +#nullable disable + +namespace Content.Server.Database.Migrations.Postgres +{ + [DbContext(typeof(PostgresServerDbContext))] + [Migration("20241018043329_RoleWhitelist")] + partial class RoleWhitelist + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.0") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Content.Server.Database.Admin", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.Property("AdminRankId") + .HasColumnType("integer") + .HasColumnName("admin_rank_id"); + + b.Property("Title") + .HasColumnType("text") + .HasColumnName("title"); + + b.HasKey("UserId") + .HasName("PK_admin"); + + b.HasIndex("AdminRankId") + .HasDatabaseName("IX_admin_admin_rank_id"); + + b.ToTable("admin", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.AdminFlag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("admin_flag_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AdminId") + .HasColumnType("uuid") + .HasColumnName("admin_id"); + + b.Property("Flag") + .IsRequired() + .HasColumnType("text") + .HasColumnName("flag"); + + b.Property("Negative") + .HasColumnType("boolean") + .HasColumnName("negative"); + + b.HasKey("Id") + .HasName("PK_admin_flag"); + + b.HasIndex("AdminId") + .HasDatabaseName("IX_admin_flag_admin_id"); + + b.HasIndex("Flag", "AdminId") + .IsUnique(); + + b.ToTable("admin_flag", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.AdminLog", b => + { + b.Property("RoundId") + .HasColumnType("integer") + .HasColumnName("round_id"); + + b.Property("Id") + .HasColumnType("integer") + .HasColumnName("admin_log_id"); + + b.Property("Date") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); + + b.Property("Impact") + .HasColumnType("smallint") + .HasColumnName("impact"); + + b.Property("Json") + .IsRequired() + .HasColumnType("jsonb") + .HasColumnName("json"); + + b.Property("Message") + .IsRequired() + .HasColumnType("text") + .HasColumnName("message"); + + b.Property("Type") + .HasColumnType("integer") + .HasColumnName("type"); + + b.HasKey("RoundId", "Id") + .HasName("PK_admin_log"); + + b.HasIndex("Date"); + + b.HasIndex("Message") + .HasAnnotation("Npgsql:TsVectorConfig", "english"); + + NpgsqlIndexBuilderExtensions.HasMethod(b.HasIndex("Message"), "GIN"); + + b.HasIndex("Type") + .HasDatabaseName("IX_admin_log_type"); + + b.ToTable("admin_log", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.AdminLogPlayer", b => + { + b.Property("RoundId") + .HasColumnType("integer") + .HasColumnName("round_id"); + + b.Property("LogId") + .HasColumnType("integer") + .HasColumnName("log_id"); + + b.Property("PlayerUserId") + .HasColumnType("uuid") + .HasColumnName("player_user_id"); + + b.HasKey("RoundId", "LogId", "PlayerUserId") + .HasName("PK_admin_log_player"); + + b.HasIndex("PlayerUserId") + .HasDatabaseName("IX_admin_log_player_player_user_id"); + + b.ToTable("admin_log_player", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.AdminMessage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("admin_messages_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("uuid") + .HasColumnName("created_by_id"); + + b.Property("Deleted") + .HasColumnType("boolean") + .HasColumnName("deleted"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("deleted_at"); + + b.Property("DeletedById") + .HasColumnType("uuid") + .HasColumnName("deleted_by_id"); + + b.Property("Dismissed") + .HasColumnType("boolean") + .HasColumnName("dismissed"); + + b.Property("ExpirationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("expiration_time"); + + b.Property("LastEditedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("last_edited_at"); + + b.Property("LastEditedById") + .HasColumnType("uuid") + .HasColumnName("last_edited_by_id"); + + b.Property("Message") + .IsRequired() + .HasMaxLength(4096) + .HasColumnType("character varying(4096)") + .HasColumnName("message"); + + b.Property("PlayerUserId") + .HasColumnType("uuid") + .HasColumnName("player_user_id"); + + b.Property("PlaytimeAtNote") + .HasColumnType("interval") + .HasColumnName("playtime_at_note"); + + b.Property("RoundId") + .HasColumnType("integer") + .HasColumnName("round_id"); + + b.Property("Seen") + .HasColumnType("boolean") + .HasColumnName("seen"); + + b.HasKey("Id") + .HasName("PK_admin_messages"); + + b.HasIndex("CreatedById"); + + b.HasIndex("DeletedById"); + + b.HasIndex("LastEditedById"); + + b.HasIndex("PlayerUserId") + .HasDatabaseName("IX_admin_messages_player_user_id"); + + b.HasIndex("RoundId") + .HasDatabaseName("IX_admin_messages_round_id"); + + b.ToTable("admin_messages", null, t => + { + t.HasCheckConstraint("NotDismissedAndSeen", "NOT dismissed OR seen"); + }); + }); + + modelBuilder.Entity("Content.Server.Database.AdminNote", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("admin_notes_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("uuid") + .HasColumnName("created_by_id"); + + b.Property("Deleted") + .HasColumnType("boolean") + .HasColumnName("deleted"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("deleted_at"); + + b.Property("DeletedById") + .HasColumnType("uuid") + .HasColumnName("deleted_by_id"); + + b.Property("ExpirationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("expiration_time"); + + b.Property("LastEditedAt") + .IsRequired() + .HasColumnType("timestamp with time zone") + .HasColumnName("last_edited_at"); + + b.Property("LastEditedById") + .HasColumnType("uuid") + .HasColumnName("last_edited_by_id"); + + b.Property("Message") + .IsRequired() + .HasMaxLength(4096) + .HasColumnType("character varying(4096)") + .HasColumnName("message"); + + b.Property("PlayerUserId") + .HasColumnType("uuid") + .HasColumnName("player_user_id"); + + b.Property("PlaytimeAtNote") + .HasColumnType("interval") + .HasColumnName("playtime_at_note"); + + b.Property("RoundId") + .HasColumnType("integer") + .HasColumnName("round_id"); + + b.Property("Secret") + .HasColumnType("boolean") + .HasColumnName("secret"); + + b.Property("Severity") + .HasColumnType("integer") + .HasColumnName("severity"); + + b.HasKey("Id") + .HasName("PK_admin_notes"); + + b.HasIndex("CreatedById"); + + b.HasIndex("DeletedById"); + + b.HasIndex("LastEditedById"); + + b.HasIndex("PlayerUserId") + .HasDatabaseName("IX_admin_notes_player_user_id"); + + b.HasIndex("RoundId") + .HasDatabaseName("IX_admin_notes_round_id"); + + b.ToTable("admin_notes", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.AdminRank", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("admin_rank_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.HasKey("Id") + .HasName("PK_admin_rank"); + + b.ToTable("admin_rank", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.AdminRankFlag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("admin_rank_flag_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AdminRankId") + .HasColumnType("integer") + .HasColumnName("admin_rank_id"); + + b.Property("Flag") + .IsRequired() + .HasColumnType("text") + .HasColumnName("flag"); + + b.HasKey("Id") + .HasName("PK_admin_rank_flag"); + + b.HasIndex("AdminRankId"); + + b.HasIndex("Flag", "AdminRankId") + .IsUnique(); + + b.ToTable("admin_rank_flag", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.AdminWatchlist", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("admin_watchlists_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("uuid") + .HasColumnName("created_by_id"); + + b.Property("Deleted") + .HasColumnType("boolean") + .HasColumnName("deleted"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("deleted_at"); + + b.Property("DeletedById") + .HasColumnType("uuid") + .HasColumnName("deleted_by_id"); + + b.Property("ExpirationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("expiration_time"); + + b.Property("LastEditedAt") + .IsRequired() + .HasColumnType("timestamp with time zone") + .HasColumnName("last_edited_at"); + + b.Property("LastEditedById") + .HasColumnType("uuid") + .HasColumnName("last_edited_by_id"); + + b.Property("Message") + .IsRequired() + .HasMaxLength(4096) + .HasColumnType("character varying(4096)") + .HasColumnName("message"); + + b.Property("PlayerUserId") + .HasColumnType("uuid") + .HasColumnName("player_user_id"); + + b.Property("PlaytimeAtNote") + .HasColumnType("interval") + .HasColumnName("playtime_at_note"); + + b.Property("RoundId") + .HasColumnType("integer") + .HasColumnName("round_id"); + + b.HasKey("Id") + .HasName("PK_admin_watchlists"); + + b.HasIndex("CreatedById"); + + b.HasIndex("DeletedById"); + + b.HasIndex("LastEditedById"); + + b.HasIndex("PlayerUserId") + .HasDatabaseName("IX_admin_watchlists_player_user_id"); + + b.HasIndex("RoundId") + .HasDatabaseName("IX_admin_watchlists_round_id"); + + b.ToTable("admin_watchlists", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Antag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("antag_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AntagName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("antag_name"); + + b.Property("ProfileId") + .HasColumnType("integer") + .HasColumnName("profile_id"); + + b.HasKey("Id") + .HasName("PK_antag"); + + b.HasIndex("ProfileId", "AntagName") + .IsUnique(); + + b.ToTable("antag", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.AssignedUserId", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("assigned_user_id_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.Property("UserName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("user_name"); + + b.HasKey("Id") + .HasName("PK_assigned_user_id"); + + b.HasIndex("UserId") + .IsUnique(); + + b.HasIndex("UserName") + .IsUnique(); + + b.ToTable("assigned_user_id", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.BanTemplate", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("ban_template_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AutoDelete") + .HasColumnType("boolean") + .HasColumnName("auto_delete"); + + b.Property("ExemptFlags") + .HasColumnType("integer") + .HasColumnName("exempt_flags"); + + b.Property("Hidden") + .HasColumnType("boolean") + .HasColumnName("hidden"); + + b.Property("Length") + .HasColumnType("interval") + .HasColumnName("length"); + + b.Property("Reason") + .IsRequired() + .HasColumnType("text") + .HasColumnName("reason"); + + b.Property("Severity") + .HasColumnType("integer") + .HasColumnName("severity"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text") + .HasColumnName("title"); + + b.HasKey("Id") + .HasName("PK_ban_template"); + + b.ToTable("ban_template", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.ConnectionLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("connection_log_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Address") + .IsRequired() + .HasColumnType("inet") + .HasColumnName("address"); + + b.Property("Denied") + .HasColumnType("smallint") + .HasColumnName("denied"); + + b.Property("HWId") + .HasColumnType("bytea") + .HasColumnName("hwid"); + + b.Property("ServerId") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValue(0) + .HasColumnName("server_id"); + + b.Property("Time") + .HasColumnType("timestamp with time zone") + .HasColumnName("time"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.Property("UserName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("user_name"); + + b.HasKey("Id") + .HasName("PK_connection_log"); + + b.HasIndex("ServerId") + .HasDatabaseName("IX_connection_log_server_id"); + + b.HasIndex("UserId"); + + b.ToTable("connection_log", null, t => + { + t.HasCheckConstraint("AddressNotIPv6MappedIPv4", "NOT inet '::ffff:0.0.0.0/96' >>= address"); + }); + }); + + modelBuilder.Entity("Content.Server.Database.Job", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("job_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("JobName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("job_name"); + + b.Property("Priority") + .HasColumnType("integer") + .HasColumnName("priority"); + + b.Property("ProfileId") + .HasColumnType("integer") + .HasColumnName("profile_id"); + + b.HasKey("Id") + .HasName("PK_job"); + + b.HasIndex("ProfileId"); + + b.HasIndex("ProfileId", "JobName") + .IsUnique(); + + b.HasIndex(new[] { "ProfileId" }, "IX_job_one_high_priority") + .IsUnique() + .HasFilter("priority = 3"); + + b.ToTable("job", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Loadout", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("loadout_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("LoadoutName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("loadout_name"); + + b.Property("ProfileId") + .HasColumnType("integer") + .HasColumnName("profile_id"); + + b.HasKey("Id") + .HasName("PK_loadout"); + + b.HasIndex("ProfileId", "LoadoutName") + .IsUnique(); + + b.ToTable("loadout", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.PlayTime", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("play_time_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("PlayerId") + .HasColumnType("uuid") + .HasColumnName("player_id"); + + b.Property("TimeSpent") + .HasColumnType("interval") + .HasColumnName("time_spent"); + + b.Property("Tracker") + .IsRequired() + .HasColumnType("text") + .HasColumnName("tracker"); + + b.HasKey("Id") + .HasName("PK_play_time"); + + b.HasIndex("PlayerId", "Tracker") + .IsUnique(); + + b.ToTable("play_time", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Player", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("player_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("FirstSeenTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("first_seen_time"); + + b.Property("LastReadRules") + .HasColumnType("timestamp with time zone") + .HasColumnName("last_read_rules"); + + b.Property("LastSeenAddress") + .IsRequired() + .HasColumnType("inet") + .HasColumnName("last_seen_address"); + + b.Property("LastSeenHWId") + .HasColumnType("bytea") + .HasColumnName("last_seen_hwid"); + + b.Property("LastSeenTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("last_seen_time"); + + b.Property("LastSeenUserName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("last_seen_user_name"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("PK_player"); + + b.HasAlternateKey("UserId") + .HasName("ak_player_user_id"); + + b.HasIndex("LastSeenUserName"); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("player", null, t => + { + t.HasCheckConstraint("LastSeenAddressNotIPv6MappedIPv4", "NOT inet '::ffff:0.0.0.0/96' >>= last_seen_address"); + }); + }); + + modelBuilder.Entity("Content.Server.Database.Preference", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("preference_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AdminOOCColor") + .IsRequired() + .HasColumnType("text") + .HasColumnName("admin_ooc_color"); + + b.Property("SelectedCharacterSlot") + .HasColumnType("integer") + .HasColumnName("selected_character_slot"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("PK_preference"); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("preference", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Profile", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("profile_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Age") + .HasColumnType("integer") + .HasColumnName("age"); + + b.Property("Backpack") + .IsRequired() + .HasColumnType("text") + .HasColumnName("backpack"); + + b.Property("CharacterName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("char_name"); + + b.Property("Clothing") + .IsRequired() + .HasColumnType("text") + .HasColumnName("clothing"); + + b.Property("CustomSpecieName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("custom_specie_name"); + + b.Property("EyeColor") + .IsRequired() + .HasColumnType("text") + .HasColumnName("eye_color"); + + b.Property("FacialHairColor") + .IsRequired() + .HasColumnType("text") + .HasColumnName("facial_hair_color"); + + b.Property("FacialHairName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("facial_hair_name"); + + b.Property("FlavorText") + .IsRequired() + .HasColumnType("text") + .HasColumnName("flavor_text"); + + b.Property("Gender") + .IsRequired() + .HasColumnType("text") + .HasColumnName("gender"); + + b.Property("HairColor") + .IsRequired() + .HasColumnType("text") + .HasColumnName("hair_color"); + + b.Property("HairName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("hair_name"); + + b.Property("Height") + .HasColumnType("real") + .HasColumnName("height"); + + b.Property("Markings") + .HasColumnType("jsonb") + .HasColumnName("markings"); + + b.Property("PreferenceId") + .HasColumnType("integer") + .HasColumnName("preference_id"); + + b.Property("PreferenceUnavailable") + .HasColumnType("integer") + .HasColumnName("pref_unavailable"); + + b.Property("Sex") + .IsRequired() + .HasColumnType("text") + .HasColumnName("sex"); + + b.Property("SkinColor") + .IsRequired() + .HasColumnType("text") + .HasColumnName("skin_color"); + + b.Property("Slot") + .HasColumnType("integer") + .HasColumnName("slot"); + + b.Property("SpawnPriority") + .HasColumnType("integer") + .HasColumnName("spawn_priority"); + + b.Property("Species") + .IsRequired() + .HasColumnType("text") + .HasColumnName("species"); + + b.Property("Width") + .HasColumnType("real") + .HasColumnName("width"); + + b.HasKey("Id") + .HasName("PK_profile"); + + b.HasIndex("PreferenceId") + .HasDatabaseName("IX_profile_preference_id"); + + b.HasIndex("Slot", "PreferenceId") + .IsUnique(); + + b.ToTable("profile", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.RoleWhitelist", b => + { + b.Property("PlayerUserId") + .HasColumnType("uuid") + .HasColumnName("player_user_id"); + + b.Property("RoleId") + .HasColumnType("text") + .HasColumnName("role_id"); + + b.HasKey("PlayerUserId", "RoleId") + .HasName("PK_role_whitelists"); + + b.ToTable("role_whitelists", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Round", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("round_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ServerId") + .HasColumnType("integer") + .HasColumnName("server_id"); + + b.Property("StartDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("start_date"); + + b.HasKey("Id") + .HasName("PK_round"); + + b.HasIndex("ServerId") + .HasDatabaseName("IX_round_server_id"); + + b.HasIndex("StartDate"); + + b.ToTable("round", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Server", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("server_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.HasKey("Id") + .HasName("PK_server"); + + b.ToTable("server", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.ServerBan", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("server_ban_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Address") + .HasColumnType("inet") + .HasColumnName("address"); + + b.Property("AutoDelete") + .HasColumnType("boolean") + .HasColumnName("auto_delete"); + + b.Property("BanTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("ban_time"); + + b.Property("BanningAdmin") + .HasColumnType("uuid") + .HasColumnName("banning_admin"); + + b.Property("ExemptFlags") + .HasColumnType("integer") + .HasColumnName("exempt_flags"); + + b.Property("ExpirationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("expiration_time"); + + b.Property("HWId") + .HasColumnType("bytea") + .HasColumnName("hwid"); + + b.Property("Hidden") + .HasColumnType("boolean") + .HasColumnName("hidden"); + + b.Property("LastEditedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("last_edited_at"); + + b.Property("LastEditedById") + .HasColumnType("uuid") + .HasColumnName("last_edited_by_id"); + + b.Property("PlayerUserId") + .HasColumnType("uuid") + .HasColumnName("player_user_id"); + + b.Property("PlaytimeAtNote") + .HasColumnType("interval") + .HasColumnName("playtime_at_note"); + + b.Property("Reason") + .IsRequired() + .HasColumnType("text") + .HasColumnName("reason"); + + b.Property("RoundId") + .HasColumnType("integer") + .HasColumnName("round_id"); + + b.Property("Severity") + .HasColumnType("integer") + .HasColumnName("severity"); + + b.HasKey("Id") + .HasName("PK_server_ban"); + + b.HasIndex("Address"); + + b.HasIndex("BanningAdmin"); + + b.HasIndex("LastEditedById"); + + b.HasIndex("PlayerUserId") + .HasDatabaseName("IX_server_ban_player_user_id"); + + b.HasIndex("RoundId") + .HasDatabaseName("IX_server_ban_round_id"); + + b.ToTable("server_ban", null, t => + { + t.HasCheckConstraint("AddressNotIPv6MappedIPv4", "NOT inet '::ffff:0.0.0.0/96' >>= address"); + + t.HasCheckConstraint("HaveEitherAddressOrUserIdOrHWId", "address IS NOT NULL OR player_user_id IS NOT NULL OR hwid IS NOT NULL"); + }); + }); + + modelBuilder.Entity("Content.Server.Database.ServerBanExemption", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.Property("Flags") + .HasColumnType("integer") + .HasColumnName("flags"); + + b.HasKey("UserId") + .HasName("PK_server_ban_exemption"); + + b.ToTable("server_ban_exemption", null, t => + { + t.HasCheckConstraint("FlagsNotZero", "flags != 0"); + }); + }); + + modelBuilder.Entity("Content.Server.Database.ServerBanHit", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("server_ban_hit_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("BanId") + .HasColumnType("integer") + .HasColumnName("ban_id"); + + b.Property("ConnectionId") + .HasColumnType("integer") + .HasColumnName("connection_id"); + + b.HasKey("Id") + .HasName("PK_server_ban_hit"); + + b.HasIndex("BanId") + .HasDatabaseName("IX_server_ban_hit_ban_id"); + + b.HasIndex("ConnectionId") + .HasDatabaseName("IX_server_ban_hit_connection_id"); + + b.ToTable("server_ban_hit", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.ServerRoleBan", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("server_role_ban_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Address") + .HasColumnType("inet") + .HasColumnName("address"); + + b.Property("BanTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("ban_time"); + + b.Property("BanningAdmin") + .HasColumnType("uuid") + .HasColumnName("banning_admin"); + + b.Property("ExpirationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("expiration_time"); + + b.Property("HWId") + .HasColumnType("bytea") + .HasColumnName("hwid"); + + b.Property("Hidden") + .HasColumnType("boolean") + .HasColumnName("hidden"); + + b.Property("LastEditedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("last_edited_at"); + + b.Property("LastEditedById") + .HasColumnType("uuid") + .HasColumnName("last_edited_by_id"); + + b.Property("PlayerUserId") + .HasColumnType("uuid") + .HasColumnName("player_user_id"); + + b.Property("PlaytimeAtNote") + .HasColumnType("interval") + .HasColumnName("playtime_at_note"); + + b.Property("Reason") + .IsRequired() + .HasColumnType("text") + .HasColumnName("reason"); + + b.Property("RoleId") + .IsRequired() + .HasColumnType("text") + .HasColumnName("role_id"); + + b.Property("RoundId") + .HasColumnType("integer") + .HasColumnName("round_id"); + + b.Property("Severity") + .HasColumnType("integer") + .HasColumnName("severity"); + + b.HasKey("Id") + .HasName("PK_server_role_ban"); + + b.HasIndex("Address"); + + b.HasIndex("BanningAdmin"); + + b.HasIndex("LastEditedById"); + + b.HasIndex("PlayerUserId") + .HasDatabaseName("IX_server_role_ban_player_user_id"); + + b.HasIndex("RoundId") + .HasDatabaseName("IX_server_role_ban_round_id"); + + b.ToTable("server_role_ban", null, t => + { + t.HasCheckConstraint("AddressNotIPv6MappedIPv4", "NOT inet '::ffff:0.0.0.0/96' >>= address"); + + t.HasCheckConstraint("HaveEitherAddressOrUserIdOrHWId", "address IS NOT NULL OR player_user_id IS NOT NULL OR hwid IS NOT NULL"); + }); + }); + + modelBuilder.Entity("Content.Server.Database.ServerRoleUnban", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("role_unban_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("BanId") + .HasColumnType("integer") + .HasColumnName("ban_id"); + + b.Property("UnbanTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("unban_time"); + + b.Property("UnbanningAdmin") + .HasColumnType("uuid") + .HasColumnName("unbanning_admin"); + + b.HasKey("Id") + .HasName("PK_server_role_unban"); + + b.HasIndex("BanId") + .IsUnique(); + + b.ToTable("server_role_unban", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.ServerUnban", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("unban_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("BanId") + .HasColumnType("integer") + .HasColumnName("ban_id"); + + b.Property("UnbanTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("unban_time"); + + b.Property("UnbanningAdmin") + .HasColumnType("uuid") + .HasColumnName("unbanning_admin"); + + b.HasKey("Id") + .HasName("PK_server_unban"); + + b.HasIndex("BanId") + .IsUnique(); + + b.ToTable("server_unban", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Trait", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("trait_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ProfileId") + .HasColumnType("integer") + .HasColumnName("profile_id"); + + b.Property("TraitName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("trait_name"); + + b.HasKey("Id") + .HasName("PK_trait"); + + b.HasIndex("ProfileId", "TraitName") + .IsUnique(); + + b.ToTable("trait", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.UploadedResourceLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("uploaded_resource_log_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Data") + .IsRequired() + .HasColumnType("bytea") + .HasColumnName("data"); + + b.Property("Date") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); + + b.Property("Path") + .IsRequired() + .HasColumnType("text") + .HasColumnName("path"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("PK_uploaded_resource_log"); + + b.ToTable("uploaded_resource_log", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Whitelist", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.HasKey("UserId") + .HasName("PK_whitelist"); + + b.ToTable("whitelist", (string)null); + }); + + modelBuilder.Entity("PlayerRound", b => + { + b.Property("PlayersId") + .HasColumnType("integer") + .HasColumnName("players_id"); + + b.Property("RoundsId") + .HasColumnType("integer") + .HasColumnName("rounds_id"); + + b.HasKey("PlayersId", "RoundsId") + .HasName("PK_player_round"); + + b.HasIndex("RoundsId") + .HasDatabaseName("IX_player_round_rounds_id"); + + b.ToTable("player_round", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Admin", b => + { + b.HasOne("Content.Server.Database.AdminRank", "AdminRank") + .WithMany("Admins") + .HasForeignKey("AdminRankId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_admin_admin_rank_admin_rank_id"); + + b.Navigation("AdminRank"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminFlag", b => + { + b.HasOne("Content.Server.Database.Admin", "Admin") + .WithMany("Flags") + .HasForeignKey("AdminId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_admin_flag_admin_admin_id"); + + b.Navigation("Admin"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminLog", b => + { + b.HasOne("Content.Server.Database.Round", "Round") + .WithMany("AdminLogs") + .HasForeignKey("RoundId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_admin_log_round_round_id"); + + b.Navigation("Round"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminLogPlayer", b => + { + b.HasOne("Content.Server.Database.Player", "Player") + .WithMany("AdminLogs") + .HasForeignKey("PlayerUserId") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_admin_log_player_player_player_user_id"); + + b.HasOne("Content.Server.Database.AdminLog", "Log") + .WithMany("Players") + .HasForeignKey("RoundId", "LogId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_admin_log_player_admin_log_round_id_log_id"); + + b.Navigation("Log"); + + b.Navigation("Player"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminMessage", b => + { + b.HasOne("Content.Server.Database.Player", "CreatedBy") + .WithMany("AdminMessagesCreated") + .HasForeignKey("CreatedById") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_admin_messages_player_created_by_id"); + + b.HasOne("Content.Server.Database.Player", "DeletedBy") + .WithMany("AdminMessagesDeleted") + .HasForeignKey("DeletedById") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_admin_messages_player_deleted_by_id"); + + b.HasOne("Content.Server.Database.Player", "LastEditedBy") + .WithMany("AdminMessagesLastEdited") + .HasForeignKey("LastEditedById") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_admin_messages_player_last_edited_by_id"); + + b.HasOne("Content.Server.Database.Player", "Player") + .WithMany("AdminMessagesReceived") + .HasForeignKey("PlayerUserId") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .HasConstraintName("FK_admin_messages_player_player_user_id"); + + b.HasOne("Content.Server.Database.Round", "Round") + .WithMany() + .HasForeignKey("RoundId") + .HasConstraintName("FK_admin_messages_round_round_id"); + + b.Navigation("CreatedBy"); + + b.Navigation("DeletedBy"); + + b.Navigation("LastEditedBy"); + + b.Navigation("Player"); + + b.Navigation("Round"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminNote", b => + { + b.HasOne("Content.Server.Database.Player", "CreatedBy") + .WithMany("AdminNotesCreated") + .HasForeignKey("CreatedById") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_admin_notes_player_created_by_id"); + + b.HasOne("Content.Server.Database.Player", "DeletedBy") + .WithMany("AdminNotesDeleted") + .HasForeignKey("DeletedById") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_admin_notes_player_deleted_by_id"); + + b.HasOne("Content.Server.Database.Player", "LastEditedBy") + .WithMany("AdminNotesLastEdited") + .HasForeignKey("LastEditedById") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_admin_notes_player_last_edited_by_id"); + + b.HasOne("Content.Server.Database.Player", "Player") + .WithMany("AdminNotesReceived") + .HasForeignKey("PlayerUserId") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .HasConstraintName("FK_admin_notes_player_player_user_id"); + + b.HasOne("Content.Server.Database.Round", "Round") + .WithMany() + .HasForeignKey("RoundId") + .HasConstraintName("FK_admin_notes_round_round_id"); + + b.Navigation("CreatedBy"); + + b.Navigation("DeletedBy"); + + b.Navigation("LastEditedBy"); + + b.Navigation("Player"); + + b.Navigation("Round"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminRankFlag", b => + { + b.HasOne("Content.Server.Database.AdminRank", "Rank") + .WithMany("Flags") + .HasForeignKey("AdminRankId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_admin_rank_flag_admin_rank_admin_rank_id"); + + b.Navigation("Rank"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminWatchlist", b => + { + b.HasOne("Content.Server.Database.Player", "CreatedBy") + .WithMany("AdminWatchlistsCreated") + .HasForeignKey("CreatedById") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_admin_watchlists_player_created_by_id"); + + b.HasOne("Content.Server.Database.Player", "DeletedBy") + .WithMany("AdminWatchlistsDeleted") + .HasForeignKey("DeletedById") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_admin_watchlists_player_deleted_by_id"); + + b.HasOne("Content.Server.Database.Player", "LastEditedBy") + .WithMany("AdminWatchlistsLastEdited") + .HasForeignKey("LastEditedById") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_admin_watchlists_player_last_edited_by_id"); + + b.HasOne("Content.Server.Database.Player", "Player") + .WithMany("AdminWatchlistsReceived") + .HasForeignKey("PlayerUserId") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .HasConstraintName("FK_admin_watchlists_player_player_user_id"); + + b.HasOne("Content.Server.Database.Round", "Round") + .WithMany() + .HasForeignKey("RoundId") + .HasConstraintName("FK_admin_watchlists_round_round_id"); + + b.Navigation("CreatedBy"); + + b.Navigation("DeletedBy"); + + b.Navigation("LastEditedBy"); + + b.Navigation("Player"); + + b.Navigation("Round"); + }); + + modelBuilder.Entity("Content.Server.Database.Antag", b => + { + b.HasOne("Content.Server.Database.Profile", "Profile") + .WithMany("Antags") + .HasForeignKey("ProfileId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_antag_profile_profile_id"); + + b.Navigation("Profile"); + }); + + modelBuilder.Entity("Content.Server.Database.ConnectionLog", b => + { + b.HasOne("Content.Server.Database.Server", "Server") + .WithMany("ConnectionLogs") + .HasForeignKey("ServerId") + .OnDelete(DeleteBehavior.SetNull) + .IsRequired() + .HasConstraintName("FK_connection_log_server_server_id"); + + b.Navigation("Server"); + }); + + modelBuilder.Entity("Content.Server.Database.Job", b => + { + b.HasOne("Content.Server.Database.Profile", "Profile") + .WithMany("Jobs") + .HasForeignKey("ProfileId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_job_profile_profile_id"); + + b.Navigation("Profile"); + }); + + modelBuilder.Entity("Content.Server.Database.Loadout", b => + { + b.HasOne("Content.Server.Database.Profile", "Profile") + .WithMany("Loadouts") + .HasForeignKey("ProfileId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_loadout_profile_profile_id"); + + b.Navigation("Profile"); + }); + + modelBuilder.Entity("Content.Server.Database.Profile", b => + { + b.HasOne("Content.Server.Database.Preference", "Preference") + .WithMany("Profiles") + .HasForeignKey("PreferenceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_profile_preference_preference_id"); + + b.Navigation("Preference"); + }); + + modelBuilder.Entity("Content.Server.Database.RoleWhitelist", b => + { + b.HasOne("Content.Server.Database.Player", "Player") + .WithMany("JobWhitelists") + .HasForeignKey("PlayerUserId") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_role_whitelists_player_player_user_id"); + + b.Navigation("Player"); + }); + + modelBuilder.Entity("Content.Server.Database.Round", b => + { + b.HasOne("Content.Server.Database.Server", "Server") + .WithMany("Rounds") + .HasForeignKey("ServerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_round_server_server_id"); + + b.Navigation("Server"); + }); + + modelBuilder.Entity("Content.Server.Database.ServerBan", b => + { + b.HasOne("Content.Server.Database.Player", "CreatedBy") + .WithMany("AdminServerBansCreated") + .HasForeignKey("BanningAdmin") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_server_ban_player_banning_admin"); + + b.HasOne("Content.Server.Database.Player", "LastEditedBy") + .WithMany("AdminServerBansLastEdited") + .HasForeignKey("LastEditedById") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_server_ban_player_last_edited_by_id"); + + b.HasOne("Content.Server.Database.Round", "Round") + .WithMany() + .HasForeignKey("RoundId") + .HasConstraintName("FK_server_ban_round_round_id"); + + b.Navigation("CreatedBy"); + + b.Navigation("LastEditedBy"); + + b.Navigation("Round"); + }); + + modelBuilder.Entity("Content.Server.Database.ServerBanHit", b => + { + b.HasOne("Content.Server.Database.ServerBan", "Ban") + .WithMany("BanHits") + .HasForeignKey("BanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_server_ban_hit_server_ban_ban_id"); + + b.HasOne("Content.Server.Database.ConnectionLog", "Connection") + .WithMany("BanHits") + .HasForeignKey("ConnectionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_server_ban_hit_connection_log_connection_id"); + + b.Navigation("Ban"); + + b.Navigation("Connection"); + }); + + modelBuilder.Entity("Content.Server.Database.ServerRoleBan", b => + { + b.HasOne("Content.Server.Database.Player", "CreatedBy") + .WithMany("AdminServerRoleBansCreated") + .HasForeignKey("BanningAdmin") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_server_role_ban_player_banning_admin"); + + b.HasOne("Content.Server.Database.Player", "LastEditedBy") + .WithMany("AdminServerRoleBansLastEdited") + .HasForeignKey("LastEditedById") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_server_role_ban_player_last_edited_by_id"); + + b.HasOne("Content.Server.Database.Round", "Round") + .WithMany() + .HasForeignKey("RoundId") + .HasConstraintName("FK_server_role_ban_round_round_id"); + + b.Navigation("CreatedBy"); + + b.Navigation("LastEditedBy"); + + b.Navigation("Round"); + }); + + modelBuilder.Entity("Content.Server.Database.ServerRoleUnban", b => + { + b.HasOne("Content.Server.Database.ServerRoleBan", "Ban") + .WithOne("Unban") + .HasForeignKey("Content.Server.Database.ServerRoleUnban", "BanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_server_role_unban_server_role_ban_ban_id"); + + b.Navigation("Ban"); + }); + + modelBuilder.Entity("Content.Server.Database.ServerUnban", b => + { + b.HasOne("Content.Server.Database.ServerBan", "Ban") + .WithOne("Unban") + .HasForeignKey("Content.Server.Database.ServerUnban", "BanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_server_unban_server_ban_ban_id"); + + b.Navigation("Ban"); + }); + + modelBuilder.Entity("Content.Server.Database.Trait", b => + { + b.HasOne("Content.Server.Database.Profile", "Profile") + .WithMany("Traits") + .HasForeignKey("ProfileId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_trait_profile_profile_id"); + + b.Navigation("Profile"); + }); + + modelBuilder.Entity("PlayerRound", b => + { + b.HasOne("Content.Server.Database.Player", null) + .WithMany() + .HasForeignKey("PlayersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_player_round_player_players_id"); + + b.HasOne("Content.Server.Database.Round", null) + .WithMany() + .HasForeignKey("RoundsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_player_round_round_rounds_id"); + }); + + modelBuilder.Entity("Content.Server.Database.Admin", b => + { + b.Navigation("Flags"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminLog", b => + { + b.Navigation("Players"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminRank", b => + { + b.Navigation("Admins"); + + b.Navigation("Flags"); + }); + + modelBuilder.Entity("Content.Server.Database.ConnectionLog", b => + { + b.Navigation("BanHits"); + }); + + modelBuilder.Entity("Content.Server.Database.Player", b => + { + b.Navigation("AdminLogs"); + + b.Navigation("AdminMessagesCreated"); + + b.Navigation("AdminMessagesDeleted"); + + b.Navigation("AdminMessagesLastEdited"); + + b.Navigation("AdminMessagesReceived"); + + b.Navigation("AdminNotesCreated"); + + b.Navigation("AdminNotesDeleted"); + + b.Navigation("AdminNotesLastEdited"); + + b.Navigation("AdminNotesReceived"); + + b.Navigation("AdminServerBansCreated"); + + b.Navigation("AdminServerBansLastEdited"); + + b.Navigation("AdminServerRoleBansCreated"); + + b.Navigation("AdminServerRoleBansLastEdited"); + + b.Navigation("AdminWatchlistsCreated"); + + b.Navigation("AdminWatchlistsDeleted"); + + b.Navigation("AdminWatchlistsLastEdited"); + + b.Navigation("AdminWatchlistsReceived"); + + b.Navigation("JobWhitelists"); + }); + + modelBuilder.Entity("Content.Server.Database.Preference", b => + { + b.Navigation("Profiles"); + }); + + modelBuilder.Entity("Content.Server.Database.Profile", b => + { + b.Navigation("Antags"); + + b.Navigation("Jobs"); + + b.Navigation("Loadouts"); + + b.Navigation("Traits"); + }); + + modelBuilder.Entity("Content.Server.Database.Round", b => + { + b.Navigation("AdminLogs"); + }); + + modelBuilder.Entity("Content.Server.Database.Server", b => + { + b.Navigation("ConnectionLogs"); + + b.Navigation("Rounds"); + }); + + modelBuilder.Entity("Content.Server.Database.ServerBan", b => + { + b.Navigation("BanHits"); + + b.Navigation("Unban"); + }); + + modelBuilder.Entity("Content.Server.Database.ServerRoleBan", b => + { + b.Navigation("Unban"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Content.Server.Database/Migrations/Postgres/20241018043329_RoleWhitelist.cs b/Content.Server.Database/Migrations/Postgres/20241018043329_RoleWhitelist.cs new file mode 100644 index 0000000000..13cd23a7fc --- /dev/null +++ b/Content.Server.Database/Migrations/Postgres/20241018043329_RoleWhitelist.cs @@ -0,0 +1,40 @@ +#nullable disable + +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace Content.Server.Database.Migrations.Postgres +{ + /// + public partial class RoleWhitelist : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "role_whitelists", + columns: table => new + { + player_user_id = table.Column(type: "uuid", nullable: false), + role_id = table.Column(type: "text", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_role_whitelists", x => new { x.player_user_id, x.role_id }); + table.ForeignKey( + name: "FK_role_whitelists_player_player_user_id", + column: x => x.player_user_id, + principalTable: "player", + principalColumn: "user_id", + onDelete: ReferentialAction.Cascade); + }); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "role_whitelists"); + } + } +} diff --git a/Content.Server.Database/Migrations/Postgres/PostgresServerDbContextModelSnapshot.cs b/Content.Server.Database/Migrations/Postgres/PostgresServerDbContextModelSnapshot.cs index 4a13022fec..0282063649 100644 --- a/Content.Server.Database/Migrations/Postgres/PostgresServerDbContextModelSnapshot.cs +++ b/Content.Server.Database/Migrations/Postgres/PostgresServerDbContextModelSnapshot.cs @@ -917,6 +917,22 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable("profile", (string)null); }); + modelBuilder.Entity("Content.Server.Database.RoleWhitelist", b => + { + b.Property("PlayerUserId") + .HasColumnType("uuid") + .HasColumnName("player_user_id"); + + b.Property("RoleId") + .HasColumnType("text") + .HasColumnName("role_id"); + + b.HasKey("PlayerUserId", "RoleId") + .HasName("PK_role_whitelists"); + + b.ToTable("role_whitelists", (string)null); + }); + modelBuilder.Entity("Content.Server.Database.Round", b => { b.Property("Id") @@ -1616,6 +1632,19 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Navigation("Preference"); }); + modelBuilder.Entity("Content.Server.Database.RoleWhitelist", b => + { + b.HasOne("Content.Server.Database.Player", "Player") + .WithMany("JobWhitelists") + .HasForeignKey("PlayerUserId") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_role_whitelists_player_player_user_id"); + + b.Navigation("Player"); + }); + modelBuilder.Entity("Content.Server.Database.Round", b => { b.HasOne("Content.Server.Database.Server", "Server") @@ -1815,6 +1844,8 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Navigation("AdminWatchlistsLastEdited"); b.Navigation("AdminWatchlistsReceived"); + + b.Navigation("JobWhitelists"); }); modelBuilder.Entity("Content.Server.Database.Preference", b => diff --git a/Content.Server.Database/Migrations/Sqlite/20241018043307_RoleWhitelist.Designer.cs b/Content.Server.Database/Migrations/Sqlite/20241018043307_RoleWhitelist.Designer.cs new file mode 100644 index 0000000000..bef2d1038f --- /dev/null +++ b/Content.Server.Database/Migrations/Sqlite/20241018043307_RoleWhitelist.Designer.cs @@ -0,0 +1,1823 @@ +// +using System; +using Content.Server.Database; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace Content.Server.Database.Migrations.Sqlite +{ + [DbContext(typeof(SqliteServerDbContext))] + [Migration("20241018043307_RoleWhitelist")] + partial class RoleWhitelist + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "8.0.0"); + + modelBuilder.Entity("Content.Server.Database.Admin", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasColumnName("user_id"); + + b.Property("AdminRankId") + .HasColumnType("INTEGER") + .HasColumnName("admin_rank_id"); + + b.Property("Title") + .HasColumnType("TEXT") + .HasColumnName("title"); + + b.HasKey("UserId") + .HasName("PK_admin"); + + b.HasIndex("AdminRankId") + .HasDatabaseName("IX_admin_admin_rank_id"); + + b.ToTable("admin", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.AdminFlag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("admin_flag_id"); + + b.Property("AdminId") + .HasColumnType("TEXT") + .HasColumnName("admin_id"); + + b.Property("Flag") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("flag"); + + b.Property("Negative") + .HasColumnType("INTEGER") + .HasColumnName("negative"); + + b.HasKey("Id") + .HasName("PK_admin_flag"); + + b.HasIndex("AdminId") + .HasDatabaseName("IX_admin_flag_admin_id"); + + b.HasIndex("Flag", "AdminId") + .IsUnique(); + + b.ToTable("admin_flag", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.AdminLog", b => + { + b.Property("RoundId") + .HasColumnType("INTEGER") + .HasColumnName("round_id"); + + b.Property("Id") + .HasColumnType("INTEGER") + .HasColumnName("admin_log_id"); + + b.Property("Date") + .HasColumnType("TEXT") + .HasColumnName("date"); + + b.Property("Impact") + .HasColumnType("INTEGER") + .HasColumnName("impact"); + + b.Property("Json") + .IsRequired() + .HasColumnType("jsonb") + .HasColumnName("json"); + + b.Property("Message") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("message"); + + b.Property("Type") + .HasColumnType("INTEGER") + .HasColumnName("type"); + + b.HasKey("RoundId", "Id") + .HasName("PK_admin_log"); + + b.HasIndex("Date"); + + b.HasIndex("Type") + .HasDatabaseName("IX_admin_log_type"); + + b.ToTable("admin_log", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.AdminLogPlayer", b => + { + b.Property("RoundId") + .HasColumnType("INTEGER") + .HasColumnName("round_id"); + + b.Property("LogId") + .HasColumnType("INTEGER") + .HasColumnName("log_id"); + + b.Property("PlayerUserId") + .HasColumnType("TEXT") + .HasColumnName("player_user_id"); + + b.HasKey("RoundId", "LogId", "PlayerUserId") + .HasName("PK_admin_log_player"); + + b.HasIndex("PlayerUserId") + .HasDatabaseName("IX_admin_log_player_player_user_id"); + + b.ToTable("admin_log_player", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.AdminMessage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("admin_messages_id"); + + b.Property("CreatedAt") + .HasColumnType("TEXT") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("TEXT") + .HasColumnName("created_by_id"); + + b.Property("Deleted") + .HasColumnType("INTEGER") + .HasColumnName("deleted"); + + b.Property("DeletedAt") + .HasColumnType("TEXT") + .HasColumnName("deleted_at"); + + b.Property("DeletedById") + .HasColumnType("TEXT") + .HasColumnName("deleted_by_id"); + + b.Property("Dismissed") + .HasColumnType("INTEGER") + .HasColumnName("dismissed"); + + b.Property("ExpirationTime") + .HasColumnType("TEXT") + .HasColumnName("expiration_time"); + + b.Property("LastEditedAt") + .HasColumnType("TEXT") + .HasColumnName("last_edited_at"); + + b.Property("LastEditedById") + .HasColumnType("TEXT") + .HasColumnName("last_edited_by_id"); + + b.Property("Message") + .IsRequired() + .HasMaxLength(4096) + .HasColumnType("TEXT") + .HasColumnName("message"); + + b.Property("PlayerUserId") + .HasColumnType("TEXT") + .HasColumnName("player_user_id"); + + b.Property("PlaytimeAtNote") + .HasColumnType("TEXT") + .HasColumnName("playtime_at_note"); + + b.Property("RoundId") + .HasColumnType("INTEGER") + .HasColumnName("round_id"); + + b.Property("Seen") + .HasColumnType("INTEGER") + .HasColumnName("seen"); + + b.HasKey("Id") + .HasName("PK_admin_messages"); + + b.HasIndex("CreatedById"); + + b.HasIndex("DeletedById"); + + b.HasIndex("LastEditedById"); + + b.HasIndex("PlayerUserId") + .HasDatabaseName("IX_admin_messages_player_user_id"); + + b.HasIndex("RoundId") + .HasDatabaseName("IX_admin_messages_round_id"); + + b.ToTable("admin_messages", null, t => + { + t.HasCheckConstraint("NotDismissedAndSeen", "NOT dismissed OR seen"); + }); + }); + + modelBuilder.Entity("Content.Server.Database.AdminNote", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("admin_notes_id"); + + b.Property("CreatedAt") + .HasColumnType("TEXT") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("TEXT") + .HasColumnName("created_by_id"); + + b.Property("Deleted") + .HasColumnType("INTEGER") + .HasColumnName("deleted"); + + b.Property("DeletedAt") + .HasColumnType("TEXT") + .HasColumnName("deleted_at"); + + b.Property("DeletedById") + .HasColumnType("TEXT") + .HasColumnName("deleted_by_id"); + + b.Property("ExpirationTime") + .HasColumnType("TEXT") + .HasColumnName("expiration_time"); + + b.Property("LastEditedAt") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("last_edited_at"); + + b.Property("LastEditedById") + .HasColumnType("TEXT") + .HasColumnName("last_edited_by_id"); + + b.Property("Message") + .IsRequired() + .HasMaxLength(4096) + .HasColumnType("TEXT") + .HasColumnName("message"); + + b.Property("PlayerUserId") + .HasColumnType("TEXT") + .HasColumnName("player_user_id"); + + b.Property("PlaytimeAtNote") + .HasColumnType("TEXT") + .HasColumnName("playtime_at_note"); + + b.Property("RoundId") + .HasColumnType("INTEGER") + .HasColumnName("round_id"); + + b.Property("Secret") + .HasColumnType("INTEGER") + .HasColumnName("secret"); + + b.Property("Severity") + .HasColumnType("INTEGER") + .HasColumnName("severity"); + + b.HasKey("Id") + .HasName("PK_admin_notes"); + + b.HasIndex("CreatedById"); + + b.HasIndex("DeletedById"); + + b.HasIndex("LastEditedById"); + + b.HasIndex("PlayerUserId") + .HasDatabaseName("IX_admin_notes_player_user_id"); + + b.HasIndex("RoundId") + .HasDatabaseName("IX_admin_notes_round_id"); + + b.ToTable("admin_notes", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.AdminRank", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("admin_rank_id"); + + b.Property("Name") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("name"); + + b.HasKey("Id") + .HasName("PK_admin_rank"); + + b.ToTable("admin_rank", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.AdminRankFlag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("admin_rank_flag_id"); + + b.Property("AdminRankId") + .HasColumnType("INTEGER") + .HasColumnName("admin_rank_id"); + + b.Property("Flag") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("flag"); + + b.HasKey("Id") + .HasName("PK_admin_rank_flag"); + + b.HasIndex("AdminRankId"); + + b.HasIndex("Flag", "AdminRankId") + .IsUnique(); + + b.ToTable("admin_rank_flag", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.AdminWatchlist", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("admin_watchlists_id"); + + b.Property("CreatedAt") + .HasColumnType("TEXT") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("TEXT") + .HasColumnName("created_by_id"); + + b.Property("Deleted") + .HasColumnType("INTEGER") + .HasColumnName("deleted"); + + b.Property("DeletedAt") + .HasColumnType("TEXT") + .HasColumnName("deleted_at"); + + b.Property("DeletedById") + .HasColumnType("TEXT") + .HasColumnName("deleted_by_id"); + + b.Property("ExpirationTime") + .HasColumnType("TEXT") + .HasColumnName("expiration_time"); + + b.Property("LastEditedAt") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("last_edited_at"); + + b.Property("LastEditedById") + .HasColumnType("TEXT") + .HasColumnName("last_edited_by_id"); + + b.Property("Message") + .IsRequired() + .HasMaxLength(4096) + .HasColumnType("TEXT") + .HasColumnName("message"); + + b.Property("PlayerUserId") + .HasColumnType("TEXT") + .HasColumnName("player_user_id"); + + b.Property("PlaytimeAtNote") + .HasColumnType("TEXT") + .HasColumnName("playtime_at_note"); + + b.Property("RoundId") + .HasColumnType("INTEGER") + .HasColumnName("round_id"); + + b.HasKey("Id") + .HasName("PK_admin_watchlists"); + + b.HasIndex("CreatedById"); + + b.HasIndex("DeletedById"); + + b.HasIndex("LastEditedById"); + + b.HasIndex("PlayerUserId") + .HasDatabaseName("IX_admin_watchlists_player_user_id"); + + b.HasIndex("RoundId") + .HasDatabaseName("IX_admin_watchlists_round_id"); + + b.ToTable("admin_watchlists", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Antag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("antag_id"); + + b.Property("AntagName") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("antag_name"); + + b.Property("ProfileId") + .HasColumnType("INTEGER") + .HasColumnName("profile_id"); + + b.HasKey("Id") + .HasName("PK_antag"); + + b.HasIndex("ProfileId", "AntagName") + .IsUnique(); + + b.ToTable("antag", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.AssignedUserId", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("assigned_user_id_id"); + + b.Property("UserId") + .HasColumnType("TEXT") + .HasColumnName("user_id"); + + b.Property("UserName") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("user_name"); + + b.HasKey("Id") + .HasName("PK_assigned_user_id"); + + b.HasIndex("UserId") + .IsUnique(); + + b.HasIndex("UserName") + .IsUnique(); + + b.ToTable("assigned_user_id", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.BanTemplate", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("ban_template_id"); + + b.Property("AutoDelete") + .HasColumnType("INTEGER") + .HasColumnName("auto_delete"); + + b.Property("ExemptFlags") + .HasColumnType("INTEGER") + .HasColumnName("exempt_flags"); + + b.Property("Hidden") + .HasColumnType("INTEGER") + .HasColumnName("hidden"); + + b.Property("Length") + .HasColumnType("TEXT") + .HasColumnName("length"); + + b.Property("Reason") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("reason"); + + b.Property("Severity") + .HasColumnType("INTEGER") + .HasColumnName("severity"); + + b.Property("Title") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("title"); + + b.HasKey("Id") + .HasName("PK_ban_template"); + + b.ToTable("ban_template", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.ConnectionLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("connection_log_id"); + + b.Property("Address") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("address"); + + b.Property("Denied") + .HasColumnType("INTEGER") + .HasColumnName("denied"); + + b.Property("HWId") + .HasColumnType("BLOB") + .HasColumnName("hwid"); + + b.Property("ServerId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasDefaultValue(0) + .HasColumnName("server_id"); + + b.Property("Time") + .HasColumnType("TEXT") + .HasColumnName("time"); + + b.Property("UserId") + .HasColumnType("TEXT") + .HasColumnName("user_id"); + + b.Property("UserName") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("user_name"); + + b.HasKey("Id") + .HasName("PK_connection_log"); + + b.HasIndex("ServerId") + .HasDatabaseName("IX_connection_log_server_id"); + + b.HasIndex("UserId"); + + b.ToTable("connection_log", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Job", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("job_id"); + + b.Property("JobName") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("job_name"); + + b.Property("Priority") + .HasColumnType("INTEGER") + .HasColumnName("priority"); + + b.Property("ProfileId") + .HasColumnType("INTEGER") + .HasColumnName("profile_id"); + + b.HasKey("Id") + .HasName("PK_job"); + + b.HasIndex("ProfileId"); + + b.HasIndex("ProfileId", "JobName") + .IsUnique(); + + b.HasIndex(new[] { "ProfileId" }, "IX_job_one_high_priority") + .IsUnique() + .HasFilter("priority = 3"); + + b.ToTable("job", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Loadout", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("loadout_id"); + + b.Property("LoadoutName") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("loadout_name"); + + b.Property("ProfileId") + .HasColumnType("INTEGER") + .HasColumnName("profile_id"); + + b.HasKey("Id") + .HasName("PK_loadout"); + + b.HasIndex("ProfileId", "LoadoutName") + .IsUnique(); + + b.ToTable("loadout", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.PlayTime", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("play_time_id"); + + b.Property("PlayerId") + .HasColumnType("TEXT") + .HasColumnName("player_id"); + + b.Property("TimeSpent") + .HasColumnType("TEXT") + .HasColumnName("time_spent"); + + b.Property("Tracker") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("tracker"); + + b.HasKey("Id") + .HasName("PK_play_time"); + + b.HasIndex("PlayerId", "Tracker") + .IsUnique(); + + b.ToTable("play_time", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Player", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("player_id"); + + b.Property("FirstSeenTime") + .HasColumnType("TEXT") + .HasColumnName("first_seen_time"); + + b.Property("LastReadRules") + .HasColumnType("TEXT") + .HasColumnName("last_read_rules"); + + b.Property("LastSeenAddress") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("last_seen_address"); + + b.Property("LastSeenHWId") + .HasColumnType("BLOB") + .HasColumnName("last_seen_hwid"); + + b.Property("LastSeenTime") + .HasColumnType("TEXT") + .HasColumnName("last_seen_time"); + + b.Property("LastSeenUserName") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("last_seen_user_name"); + + b.Property("UserId") + .HasColumnType("TEXT") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("PK_player"); + + b.HasAlternateKey("UserId") + .HasName("ak_player_user_id"); + + b.HasIndex("LastSeenUserName"); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("player", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Preference", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("preference_id"); + + b.Property("AdminOOCColor") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("admin_ooc_color"); + + b.Property("SelectedCharacterSlot") + .HasColumnType("INTEGER") + .HasColumnName("selected_character_slot"); + + b.Property("UserId") + .HasColumnType("TEXT") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("PK_preference"); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("preference", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Profile", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("profile_id"); + + b.Property("Age") + .HasColumnType("INTEGER") + .HasColumnName("age"); + + b.Property("Backpack") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("backpack"); + + b.Property("CharacterName") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("char_name"); + + b.Property("Clothing") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("clothing"); + + b.Property("CustomSpecieName") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("custom_specie_name"); + + b.Property("EyeColor") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("eye_color"); + + b.Property("FacialHairColor") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("facial_hair_color"); + + b.Property("FacialHairName") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("facial_hair_name"); + + b.Property("FlavorText") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("flavor_text"); + + b.Property("Gender") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("gender"); + + b.Property("HairColor") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("hair_color"); + + b.Property("HairName") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("hair_name"); + + b.Property("Height") + .HasColumnType("REAL") + .HasColumnName("height"); + + b.Property("Markings") + .HasColumnType("jsonb") + .HasColumnName("markings"); + + b.Property("PreferenceId") + .HasColumnType("INTEGER") + .HasColumnName("preference_id"); + + b.Property("PreferenceUnavailable") + .HasColumnType("INTEGER") + .HasColumnName("pref_unavailable"); + + b.Property("Sex") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("sex"); + + b.Property("SkinColor") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("skin_color"); + + b.Property("Slot") + .HasColumnType("INTEGER") + .HasColumnName("slot"); + + b.Property("SpawnPriority") + .HasColumnType("INTEGER") + .HasColumnName("spawn_priority"); + + b.Property("Species") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("species"); + + b.Property("Width") + .HasColumnType("REAL") + .HasColumnName("width"); + + b.HasKey("Id") + .HasName("PK_profile"); + + b.HasIndex("PreferenceId") + .HasDatabaseName("IX_profile_preference_id"); + + b.HasIndex("Slot", "PreferenceId") + .IsUnique(); + + b.ToTable("profile", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.RoleWhitelist", b => + { + b.Property("PlayerUserId") + .HasColumnType("TEXT") + .HasColumnName("player_user_id"); + + b.Property("RoleId") + .HasColumnType("TEXT") + .HasColumnName("role_id"); + + b.HasKey("PlayerUserId", "RoleId") + .HasName("PK_role_whitelists"); + + b.ToTable("role_whitelists", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Round", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("round_id"); + + b.Property("ServerId") + .HasColumnType("INTEGER") + .HasColumnName("server_id"); + + b.Property("StartDate") + .HasColumnType("TEXT") + .HasColumnName("start_date"); + + b.HasKey("Id") + .HasName("PK_round"); + + b.HasIndex("ServerId") + .HasDatabaseName("IX_round_server_id"); + + b.HasIndex("StartDate"); + + b.ToTable("round", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Server", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("server_id"); + + b.Property("Name") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("name"); + + b.HasKey("Id") + .HasName("PK_server"); + + b.ToTable("server", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.ServerBan", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("server_ban_id"); + + b.Property("Address") + .HasColumnType("TEXT") + .HasColumnName("address"); + + b.Property("AutoDelete") + .HasColumnType("INTEGER") + .HasColumnName("auto_delete"); + + b.Property("BanTime") + .HasColumnType("TEXT") + .HasColumnName("ban_time"); + + b.Property("BanningAdmin") + .HasColumnType("TEXT") + .HasColumnName("banning_admin"); + + b.Property("ExemptFlags") + .HasColumnType("INTEGER") + .HasColumnName("exempt_flags"); + + b.Property("ExpirationTime") + .HasColumnType("TEXT") + .HasColumnName("expiration_time"); + + b.Property("HWId") + .HasColumnType("BLOB") + .HasColumnName("hwid"); + + b.Property("Hidden") + .HasColumnType("INTEGER") + .HasColumnName("hidden"); + + b.Property("LastEditedAt") + .HasColumnType("TEXT") + .HasColumnName("last_edited_at"); + + b.Property("LastEditedById") + .HasColumnType("TEXT") + .HasColumnName("last_edited_by_id"); + + b.Property("PlayerUserId") + .HasColumnType("TEXT") + .HasColumnName("player_user_id"); + + b.Property("PlaytimeAtNote") + .HasColumnType("TEXT") + .HasColumnName("playtime_at_note"); + + b.Property("Reason") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("reason"); + + b.Property("RoundId") + .HasColumnType("INTEGER") + .HasColumnName("round_id"); + + b.Property("Severity") + .HasColumnType("INTEGER") + .HasColumnName("severity"); + + b.HasKey("Id") + .HasName("PK_server_ban"); + + b.HasIndex("Address"); + + b.HasIndex("BanningAdmin"); + + b.HasIndex("LastEditedById"); + + b.HasIndex("PlayerUserId") + .HasDatabaseName("IX_server_ban_player_user_id"); + + b.HasIndex("RoundId") + .HasDatabaseName("IX_server_ban_round_id"); + + b.ToTable("server_ban", null, t => + { + t.HasCheckConstraint("HaveEitherAddressOrUserIdOrHWId", "address IS NOT NULL OR player_user_id IS NOT NULL OR hwid IS NOT NULL"); + }); + }); + + modelBuilder.Entity("Content.Server.Database.ServerBanExemption", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasColumnName("user_id"); + + b.Property("Flags") + .HasColumnType("INTEGER") + .HasColumnName("flags"); + + b.HasKey("UserId") + .HasName("PK_server_ban_exemption"); + + b.ToTable("server_ban_exemption", null, t => + { + t.HasCheckConstraint("FlagsNotZero", "flags != 0"); + }); + }); + + modelBuilder.Entity("Content.Server.Database.ServerBanHit", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("server_ban_hit_id"); + + b.Property("BanId") + .HasColumnType("INTEGER") + .HasColumnName("ban_id"); + + b.Property("ConnectionId") + .HasColumnType("INTEGER") + .HasColumnName("connection_id"); + + b.HasKey("Id") + .HasName("PK_server_ban_hit"); + + b.HasIndex("BanId") + .HasDatabaseName("IX_server_ban_hit_ban_id"); + + b.HasIndex("ConnectionId") + .HasDatabaseName("IX_server_ban_hit_connection_id"); + + b.ToTable("server_ban_hit", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.ServerRoleBan", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("server_role_ban_id"); + + b.Property("Address") + .HasColumnType("TEXT") + .HasColumnName("address"); + + b.Property("BanTime") + .HasColumnType("TEXT") + .HasColumnName("ban_time"); + + b.Property("BanningAdmin") + .HasColumnType("TEXT") + .HasColumnName("banning_admin"); + + b.Property("ExpirationTime") + .HasColumnType("TEXT") + .HasColumnName("expiration_time"); + + b.Property("HWId") + .HasColumnType("BLOB") + .HasColumnName("hwid"); + + b.Property("Hidden") + .HasColumnType("INTEGER") + .HasColumnName("hidden"); + + b.Property("LastEditedAt") + .HasColumnType("TEXT") + .HasColumnName("last_edited_at"); + + b.Property("LastEditedById") + .HasColumnType("TEXT") + .HasColumnName("last_edited_by_id"); + + b.Property("PlayerUserId") + .HasColumnType("TEXT") + .HasColumnName("player_user_id"); + + b.Property("PlaytimeAtNote") + .HasColumnType("TEXT") + .HasColumnName("playtime_at_note"); + + b.Property("Reason") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("reason"); + + b.Property("RoleId") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("role_id"); + + b.Property("RoundId") + .HasColumnType("INTEGER") + .HasColumnName("round_id"); + + b.Property("Severity") + .HasColumnType("INTEGER") + .HasColumnName("severity"); + + b.HasKey("Id") + .HasName("PK_server_role_ban"); + + b.HasIndex("Address"); + + b.HasIndex("BanningAdmin"); + + b.HasIndex("LastEditedById"); + + b.HasIndex("PlayerUserId") + .HasDatabaseName("IX_server_role_ban_player_user_id"); + + b.HasIndex("RoundId") + .HasDatabaseName("IX_server_role_ban_round_id"); + + b.ToTable("server_role_ban", null, t => + { + t.HasCheckConstraint("HaveEitherAddressOrUserIdOrHWId", "address IS NOT NULL OR player_user_id IS NOT NULL OR hwid IS NOT NULL"); + }); + }); + + modelBuilder.Entity("Content.Server.Database.ServerRoleUnban", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("role_unban_id"); + + b.Property("BanId") + .HasColumnType("INTEGER") + .HasColumnName("ban_id"); + + b.Property("UnbanTime") + .HasColumnType("TEXT") + .HasColumnName("unban_time"); + + b.Property("UnbanningAdmin") + .HasColumnType("TEXT") + .HasColumnName("unbanning_admin"); + + b.HasKey("Id") + .HasName("PK_server_role_unban"); + + b.HasIndex("BanId") + .IsUnique(); + + b.ToTable("server_role_unban", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.ServerUnban", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("unban_id"); + + b.Property("BanId") + .HasColumnType("INTEGER") + .HasColumnName("ban_id"); + + b.Property("UnbanTime") + .HasColumnType("TEXT") + .HasColumnName("unban_time"); + + b.Property("UnbanningAdmin") + .HasColumnType("TEXT") + .HasColumnName("unbanning_admin"); + + b.HasKey("Id") + .HasName("PK_server_unban"); + + b.HasIndex("BanId") + .IsUnique(); + + b.ToTable("server_unban", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Trait", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("trait_id"); + + b.Property("ProfileId") + .HasColumnType("INTEGER") + .HasColumnName("profile_id"); + + b.Property("TraitName") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("trait_name"); + + b.HasKey("Id") + .HasName("PK_trait"); + + b.HasIndex("ProfileId", "TraitName") + .IsUnique(); + + b.ToTable("trait", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.UploadedResourceLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("uploaded_resource_log_id"); + + b.Property("Data") + .IsRequired() + .HasColumnType("BLOB") + .HasColumnName("data"); + + b.Property("Date") + .HasColumnType("TEXT") + .HasColumnName("date"); + + b.Property("Path") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("path"); + + b.Property("UserId") + .HasColumnType("TEXT") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("PK_uploaded_resource_log"); + + b.ToTable("uploaded_resource_log", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Whitelist", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasColumnName("user_id"); + + b.HasKey("UserId") + .HasName("PK_whitelist"); + + b.ToTable("whitelist", (string)null); + }); + + modelBuilder.Entity("PlayerRound", b => + { + b.Property("PlayersId") + .HasColumnType("INTEGER") + .HasColumnName("players_id"); + + b.Property("RoundsId") + .HasColumnType("INTEGER") + .HasColumnName("rounds_id"); + + b.HasKey("PlayersId", "RoundsId") + .HasName("PK_player_round"); + + b.HasIndex("RoundsId") + .HasDatabaseName("IX_player_round_rounds_id"); + + b.ToTable("player_round", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Admin", b => + { + b.HasOne("Content.Server.Database.AdminRank", "AdminRank") + .WithMany("Admins") + .HasForeignKey("AdminRankId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_admin_admin_rank_admin_rank_id"); + + b.Navigation("AdminRank"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminFlag", b => + { + b.HasOne("Content.Server.Database.Admin", "Admin") + .WithMany("Flags") + .HasForeignKey("AdminId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_admin_flag_admin_admin_id"); + + b.Navigation("Admin"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminLog", b => + { + b.HasOne("Content.Server.Database.Round", "Round") + .WithMany("AdminLogs") + .HasForeignKey("RoundId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_admin_log_round_round_id"); + + b.Navigation("Round"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminLogPlayer", b => + { + b.HasOne("Content.Server.Database.Player", "Player") + .WithMany("AdminLogs") + .HasForeignKey("PlayerUserId") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_admin_log_player_player_player_user_id"); + + b.HasOne("Content.Server.Database.AdminLog", "Log") + .WithMany("Players") + .HasForeignKey("RoundId", "LogId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_admin_log_player_admin_log_round_id_log_id"); + + b.Navigation("Log"); + + b.Navigation("Player"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminMessage", b => + { + b.HasOne("Content.Server.Database.Player", "CreatedBy") + .WithMany("AdminMessagesCreated") + .HasForeignKey("CreatedById") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_admin_messages_player_created_by_id"); + + b.HasOne("Content.Server.Database.Player", "DeletedBy") + .WithMany("AdminMessagesDeleted") + .HasForeignKey("DeletedById") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_admin_messages_player_deleted_by_id"); + + b.HasOne("Content.Server.Database.Player", "LastEditedBy") + .WithMany("AdminMessagesLastEdited") + .HasForeignKey("LastEditedById") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_admin_messages_player_last_edited_by_id"); + + b.HasOne("Content.Server.Database.Player", "Player") + .WithMany("AdminMessagesReceived") + .HasForeignKey("PlayerUserId") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .HasConstraintName("FK_admin_messages_player_player_user_id"); + + b.HasOne("Content.Server.Database.Round", "Round") + .WithMany() + .HasForeignKey("RoundId") + .HasConstraintName("FK_admin_messages_round_round_id"); + + b.Navigation("CreatedBy"); + + b.Navigation("DeletedBy"); + + b.Navigation("LastEditedBy"); + + b.Navigation("Player"); + + b.Navigation("Round"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminNote", b => + { + b.HasOne("Content.Server.Database.Player", "CreatedBy") + .WithMany("AdminNotesCreated") + .HasForeignKey("CreatedById") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_admin_notes_player_created_by_id"); + + b.HasOne("Content.Server.Database.Player", "DeletedBy") + .WithMany("AdminNotesDeleted") + .HasForeignKey("DeletedById") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_admin_notes_player_deleted_by_id"); + + b.HasOne("Content.Server.Database.Player", "LastEditedBy") + .WithMany("AdminNotesLastEdited") + .HasForeignKey("LastEditedById") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_admin_notes_player_last_edited_by_id"); + + b.HasOne("Content.Server.Database.Player", "Player") + .WithMany("AdminNotesReceived") + .HasForeignKey("PlayerUserId") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .HasConstraintName("FK_admin_notes_player_player_user_id"); + + b.HasOne("Content.Server.Database.Round", "Round") + .WithMany() + .HasForeignKey("RoundId") + .HasConstraintName("FK_admin_notes_round_round_id"); + + b.Navigation("CreatedBy"); + + b.Navigation("DeletedBy"); + + b.Navigation("LastEditedBy"); + + b.Navigation("Player"); + + b.Navigation("Round"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminRankFlag", b => + { + b.HasOne("Content.Server.Database.AdminRank", "Rank") + .WithMany("Flags") + .HasForeignKey("AdminRankId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_admin_rank_flag_admin_rank_admin_rank_id"); + + b.Navigation("Rank"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminWatchlist", b => + { + b.HasOne("Content.Server.Database.Player", "CreatedBy") + .WithMany("AdminWatchlistsCreated") + .HasForeignKey("CreatedById") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_admin_watchlists_player_created_by_id"); + + b.HasOne("Content.Server.Database.Player", "DeletedBy") + .WithMany("AdminWatchlistsDeleted") + .HasForeignKey("DeletedById") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_admin_watchlists_player_deleted_by_id"); + + b.HasOne("Content.Server.Database.Player", "LastEditedBy") + .WithMany("AdminWatchlistsLastEdited") + .HasForeignKey("LastEditedById") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_admin_watchlists_player_last_edited_by_id"); + + b.HasOne("Content.Server.Database.Player", "Player") + .WithMany("AdminWatchlistsReceived") + .HasForeignKey("PlayerUserId") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .HasConstraintName("FK_admin_watchlists_player_player_user_id"); + + b.HasOne("Content.Server.Database.Round", "Round") + .WithMany() + .HasForeignKey("RoundId") + .HasConstraintName("FK_admin_watchlists_round_round_id"); + + b.Navigation("CreatedBy"); + + b.Navigation("DeletedBy"); + + b.Navigation("LastEditedBy"); + + b.Navigation("Player"); + + b.Navigation("Round"); + }); + + modelBuilder.Entity("Content.Server.Database.Antag", b => + { + b.HasOne("Content.Server.Database.Profile", "Profile") + .WithMany("Antags") + .HasForeignKey("ProfileId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_antag_profile_profile_id"); + + b.Navigation("Profile"); + }); + + modelBuilder.Entity("Content.Server.Database.ConnectionLog", b => + { + b.HasOne("Content.Server.Database.Server", "Server") + .WithMany("ConnectionLogs") + .HasForeignKey("ServerId") + .OnDelete(DeleteBehavior.SetNull) + .IsRequired() + .HasConstraintName("FK_connection_log_server_server_id"); + + b.Navigation("Server"); + }); + + modelBuilder.Entity("Content.Server.Database.Job", b => + { + b.HasOne("Content.Server.Database.Profile", "Profile") + .WithMany("Jobs") + .HasForeignKey("ProfileId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_job_profile_profile_id"); + + b.Navigation("Profile"); + }); + + modelBuilder.Entity("Content.Server.Database.Loadout", b => + { + b.HasOne("Content.Server.Database.Profile", "Profile") + .WithMany("Loadouts") + .HasForeignKey("ProfileId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_loadout_profile_profile_id"); + + b.Navigation("Profile"); + }); + + modelBuilder.Entity("Content.Server.Database.Profile", b => + { + b.HasOne("Content.Server.Database.Preference", "Preference") + .WithMany("Profiles") + .HasForeignKey("PreferenceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_profile_preference_preference_id"); + + b.Navigation("Preference"); + }); + + modelBuilder.Entity("Content.Server.Database.RoleWhitelist", b => + { + b.HasOne("Content.Server.Database.Player", "Player") + .WithMany("JobWhitelists") + .HasForeignKey("PlayerUserId") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_role_whitelists_player_player_user_id"); + + b.Navigation("Player"); + }); + + modelBuilder.Entity("Content.Server.Database.Round", b => + { + b.HasOne("Content.Server.Database.Server", "Server") + .WithMany("Rounds") + .HasForeignKey("ServerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_round_server_server_id"); + + b.Navigation("Server"); + }); + + modelBuilder.Entity("Content.Server.Database.ServerBan", b => + { + b.HasOne("Content.Server.Database.Player", "CreatedBy") + .WithMany("AdminServerBansCreated") + .HasForeignKey("BanningAdmin") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_server_ban_player_banning_admin"); + + b.HasOne("Content.Server.Database.Player", "LastEditedBy") + .WithMany("AdminServerBansLastEdited") + .HasForeignKey("LastEditedById") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_server_ban_player_last_edited_by_id"); + + b.HasOne("Content.Server.Database.Round", "Round") + .WithMany() + .HasForeignKey("RoundId") + .HasConstraintName("FK_server_ban_round_round_id"); + + b.Navigation("CreatedBy"); + + b.Navigation("LastEditedBy"); + + b.Navigation("Round"); + }); + + modelBuilder.Entity("Content.Server.Database.ServerBanHit", b => + { + b.HasOne("Content.Server.Database.ServerBan", "Ban") + .WithMany("BanHits") + .HasForeignKey("BanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_server_ban_hit_server_ban_ban_id"); + + b.HasOne("Content.Server.Database.ConnectionLog", "Connection") + .WithMany("BanHits") + .HasForeignKey("ConnectionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_server_ban_hit_connection_log_connection_id"); + + b.Navigation("Ban"); + + b.Navigation("Connection"); + }); + + modelBuilder.Entity("Content.Server.Database.ServerRoleBan", b => + { + b.HasOne("Content.Server.Database.Player", "CreatedBy") + .WithMany("AdminServerRoleBansCreated") + .HasForeignKey("BanningAdmin") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_server_role_ban_player_banning_admin"); + + b.HasOne("Content.Server.Database.Player", "LastEditedBy") + .WithMany("AdminServerRoleBansLastEdited") + .HasForeignKey("LastEditedById") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_server_role_ban_player_last_edited_by_id"); + + b.HasOne("Content.Server.Database.Round", "Round") + .WithMany() + .HasForeignKey("RoundId") + .HasConstraintName("FK_server_role_ban_round_round_id"); + + b.Navigation("CreatedBy"); + + b.Navigation("LastEditedBy"); + + b.Navigation("Round"); + }); + + modelBuilder.Entity("Content.Server.Database.ServerRoleUnban", b => + { + b.HasOne("Content.Server.Database.ServerRoleBan", "Ban") + .WithOne("Unban") + .HasForeignKey("Content.Server.Database.ServerRoleUnban", "BanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_server_role_unban_server_role_ban_ban_id"); + + b.Navigation("Ban"); + }); + + modelBuilder.Entity("Content.Server.Database.ServerUnban", b => + { + b.HasOne("Content.Server.Database.ServerBan", "Ban") + .WithOne("Unban") + .HasForeignKey("Content.Server.Database.ServerUnban", "BanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_server_unban_server_ban_ban_id"); + + b.Navigation("Ban"); + }); + + modelBuilder.Entity("Content.Server.Database.Trait", b => + { + b.HasOne("Content.Server.Database.Profile", "Profile") + .WithMany("Traits") + .HasForeignKey("ProfileId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_trait_profile_profile_id"); + + b.Navigation("Profile"); + }); + + modelBuilder.Entity("PlayerRound", b => + { + b.HasOne("Content.Server.Database.Player", null) + .WithMany() + .HasForeignKey("PlayersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_player_round_player_players_id"); + + b.HasOne("Content.Server.Database.Round", null) + .WithMany() + .HasForeignKey("RoundsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_player_round_round_rounds_id"); + }); + + modelBuilder.Entity("Content.Server.Database.Admin", b => + { + b.Navigation("Flags"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminLog", b => + { + b.Navigation("Players"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminRank", b => + { + b.Navigation("Admins"); + + b.Navigation("Flags"); + }); + + modelBuilder.Entity("Content.Server.Database.ConnectionLog", b => + { + b.Navigation("BanHits"); + }); + + modelBuilder.Entity("Content.Server.Database.Player", b => + { + b.Navigation("AdminLogs"); + + b.Navigation("AdminMessagesCreated"); + + b.Navigation("AdminMessagesDeleted"); + + b.Navigation("AdminMessagesLastEdited"); + + b.Navigation("AdminMessagesReceived"); + + b.Navigation("AdminNotesCreated"); + + b.Navigation("AdminNotesDeleted"); + + b.Navigation("AdminNotesLastEdited"); + + b.Navigation("AdminNotesReceived"); + + b.Navigation("AdminServerBansCreated"); + + b.Navigation("AdminServerBansLastEdited"); + + b.Navigation("AdminServerRoleBansCreated"); + + b.Navigation("AdminServerRoleBansLastEdited"); + + b.Navigation("AdminWatchlistsCreated"); + + b.Navigation("AdminWatchlistsDeleted"); + + b.Navigation("AdminWatchlistsLastEdited"); + + b.Navigation("AdminWatchlistsReceived"); + + b.Navigation("JobWhitelists"); + }); + + modelBuilder.Entity("Content.Server.Database.Preference", b => + { + b.Navigation("Profiles"); + }); + + modelBuilder.Entity("Content.Server.Database.Profile", b => + { + b.Navigation("Antags"); + + b.Navigation("Jobs"); + + b.Navigation("Loadouts"); + + b.Navigation("Traits"); + }); + + modelBuilder.Entity("Content.Server.Database.Round", b => + { + b.Navigation("AdminLogs"); + }); + + modelBuilder.Entity("Content.Server.Database.Server", b => + { + b.Navigation("ConnectionLogs"); + + b.Navigation("Rounds"); + }); + + modelBuilder.Entity("Content.Server.Database.ServerBan", b => + { + b.Navigation("BanHits"); + + b.Navigation("Unban"); + }); + + modelBuilder.Entity("Content.Server.Database.ServerRoleBan", b => + { + b.Navigation("Unban"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Content.Server.Database/Migrations/Sqlite/20241018043307_RoleWhitelist.cs b/Content.Server.Database/Migrations/Sqlite/20241018043307_RoleWhitelist.cs new file mode 100644 index 0000000000..9d192fc685 --- /dev/null +++ b/Content.Server.Database/Migrations/Sqlite/20241018043307_RoleWhitelist.cs @@ -0,0 +1,40 @@ +#nullable disable + +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace Content.Server.Database.Migrations.Sqlite +{ + /// + public partial class RoleWhitelist : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "role_whitelists", + columns: table => new + { + player_user_id = table.Column(type: "TEXT", nullable: false), + role_id = table.Column(type: "TEXT", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_role_whitelists", x => new { x.player_user_id, x.role_id }); + table.ForeignKey( + name: "FK_role_whitelists_player_player_user_id", + column: x => x.player_user_id, + principalTable: "player", + principalColumn: "user_id", + onDelete: ReferentialAction.Cascade); + }); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "role_whitelists"); + } + } +} diff --git a/Content.Server.Database/Migrations/Sqlite/SqliteServerDbContextModelSnapshot.cs b/Content.Server.Database/Migrations/Sqlite/SqliteServerDbContextModelSnapshot.cs index d2d47f60b4..c7a79b9717 100644 --- a/Content.Server.Database/Migrations/Sqlite/SqliteServerDbContextModelSnapshot.cs +++ b/Content.Server.Database/Migrations/Sqlite/SqliteServerDbContextModelSnapshot.cs @@ -866,6 +866,22 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable("profile", (string)null); }); + modelBuilder.Entity("Content.Server.Database.RoleWhitelist", b => + { + b.Property("PlayerUserId") + .HasColumnType("TEXT") + .HasColumnName("player_user_id"); + + b.Property("RoleId") + .HasColumnType("TEXT") + .HasColumnName("role_id"); + + b.HasKey("PlayerUserId", "RoleId") + .HasName("PK_role_whitelists"); + + b.ToTable("role_whitelists", (string)null); + }); + modelBuilder.Entity("Content.Server.Database.Round", b => { b.Property("Id") @@ -1543,6 +1559,19 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Navigation("Preference"); }); + modelBuilder.Entity("Content.Server.Database.RoleWhitelist", b => + { + b.HasOne("Content.Server.Database.Player", "Player") + .WithMany("JobWhitelists") + .HasForeignKey("PlayerUserId") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_role_whitelists_player_player_user_id"); + + b.Navigation("Player"); + }); + modelBuilder.Entity("Content.Server.Database.Round", b => { b.HasOne("Content.Server.Database.Server", "Server") @@ -1742,6 +1771,8 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Navigation("AdminWatchlistsLastEdited"); b.Navigation("AdminWatchlistsReceived"); + + b.Navigation("JobWhitelists"); }); modelBuilder.Entity("Content.Server.Database.Preference", b => diff --git a/Content.Server.Database/Model.cs b/Content.Server.Database/Model.cs index 187fb81a20..e698805cfc 100644 --- a/Content.Server.Database/Model.cs +++ b/Content.Server.Database/Model.cs @@ -41,6 +41,7 @@ protected ServerDbContext(DbContextOptions options) : base(options) public DbSet AdminWatchlists { get; set; } = null!; public DbSet AdminMessages { get; set; } = null!; public DbSet BanTemplate { get; set; } = null!; + public DbSet RoleWhitelists { get; set; } = null!; protected override void OnModelCreating(ModelBuilder modelBuilder) { @@ -49,19 +50,19 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) .IsUnique(); modelBuilder.Entity() - .HasIndex(p => new {p.Slot, PrefsId = p.PreferenceId}) + .HasIndex(p => new { p.Slot, PrefsId = p.PreferenceId }) .IsUnique(); modelBuilder.Entity() - .HasIndex(p => new {HumanoidProfileId = p.ProfileId, p.AntagName}) + .HasIndex(p => new { HumanoidProfileId = p.ProfileId, p.AntagName }) .IsUnique(); modelBuilder.Entity() - .HasIndex(p => new {HumanoidProfileId = p.ProfileId, p.TraitName}) + .HasIndex(p => new { HumanoidProfileId = p.ProfileId, p.TraitName }) .IsUnique(); modelBuilder.Entity() - .HasIndex(p => new {HumanoidProfileId = p.ProfileId, p.LoadoutName}) + .HasIndex(p => new { HumanoidProfileId = p.ProfileId, p.LoadoutName }) .IsUnique(); modelBuilder.Entity() @@ -91,15 +92,15 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) .OnDelete(DeleteBehavior.SetNull); modelBuilder.Entity() - .HasIndex(f => new {f.Flag, f.AdminId}) + .HasIndex(f => new { f.Flag, f.AdminId }) .IsUnique(); modelBuilder.Entity() - .HasIndex(f => new {f.Flag, f.AdminRankId}) + .HasIndex(f => new { f.Flag, f.AdminRankId }) .IsUnique(); modelBuilder.Entity() - .HasKey(log => new {log.RoundId, log.Id}); + .HasKey(log => new { log.RoundId, log.Id }); modelBuilder.Entity() .Property(log => log.Id); @@ -124,7 +125,7 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) .HasIndex(round => round.StartDate); modelBuilder.Entity() - .HasKey(logPlayer => new {logPlayer.RoundId, logPlayer.LogId, logPlayer.PlayerUserId}); + .HasKey(logPlayer => new { logPlayer.RoundId, logPlayer.LogId, logPlayer.PlayerUserId }); modelBuilder.Entity() .HasIndex(p => p.PlayerUserId); @@ -301,6 +302,13 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) .HasForeignKey(ban => ban.LastEditedById) .HasPrincipalKey(author => author.UserId) .OnDelete(DeleteBehavior.SetNull); + + modelBuilder.Entity() + .HasOne(w => w.Player) + .WithMany(p => p.JobWhitelists) + .HasForeignKey(w => w.PlayerUserId) + .HasPrincipalKey(p => p.UserId) + .OnDelete(DeleteBehavior.Cascade); } public virtual IQueryable SearchLogs(IQueryable query, string searchText) @@ -457,6 +465,7 @@ public class Player public List AdminServerBansLastEdited { get; set; } = null!; public List AdminServerRoleBansCreated { get; set; } = null!; public List AdminServerRoleBansLastEdited { get; set; } = null!; + public List JobWhitelists { get; set; } = null!; } [Table("whitelist")] @@ -597,7 +606,7 @@ public interface IUnbanCommon public enum ServerBanExemptFlags { // @formatter:off - None = 0, + None = 0, /// /// Ban is a datacenter range, connections usually imply usage of a VPN service. @@ -1027,6 +1036,17 @@ public class AdminMessage : IAdminRemarksCommon public bool Dismissed { get; set; } } + [PrimaryKey(nameof(PlayerUserId), nameof(RoleId))] + public class RoleWhitelist + { + [Required, ForeignKey("Player")] + public Guid PlayerUserId { get; set; } + public Player Player { get; set; } = default!; + + [Required] + public string RoleId { get; set; } = default!; + } + /// /// Defines a template that admins can use to quickly fill out ban information. /// diff --git a/Content.Server/Abilities/Psionics/Abilities/AnomalyPowerSystem.EntitySpawn.cs b/Content.Server/Abilities/Psionics/Abilities/AnomalyPowerSystem.EntitySpawn.cs index 8d4898ed8d..456f278486 100644 --- a/Content.Server/Abilities/Psionics/Abilities/AnomalyPowerSystem.EntitySpawn.cs +++ b/Content.Server/Abilities/Psionics/Abilities/AnomalyPowerSystem.EntitySpawn.cs @@ -76,4 +76,4 @@ private void SpawnEntities(EntityUid uid, PsionicComponent component, EntitySpaw foreach (var tileref in tiles) Spawn(_random.Pick(entry.Spawns), _mapSystem.ToCenterCoordinates(tileref, grid)); } -} \ No newline at end of file +} diff --git a/Content.Server/Abilities/Psionics/Abilities/DarkSwapSystem.cs b/Content.Server/Abilities/Psionics/Abilities/DarkSwapSystem.cs new file mode 100644 index 0000000000..fd394e0a22 --- /dev/null +++ b/Content.Server/Abilities/Psionics/Abilities/DarkSwapSystem.cs @@ -0,0 +1,58 @@ +using Content.Shared.Abilities.Psionics; +using Content.Shared.Actions.Events; +using Content.Shared.Shadowkin; +using Content.Shared.Physics; +using Content.Shared.Popups; +using Content.Shared.Maps; +using Robust.Server.GameObjects; + +namespace Content.Server.Abilities.Psionics +{ + public sealed class DarkSwapSystem : EntitySystem + { + [Dependency] private readonly SharedPsionicAbilitiesSystem _psionics = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly PhysicsSystem _physics = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnPowerUsed); + } + + private void OnPowerUsed(DarkSwapActionEvent args) + { + if (TryComp(args.Performer, out var ethereal)) + { + var tileref = Transform(args.Performer).Coordinates.GetTileRef(); + if (tileref != null + && _physics.GetEntitiesIntersectingBody(args.Performer, (int) CollisionGroup.Impassable).Count > 0) + { + _popup.PopupEntity(Loc.GetString("revenant-in-solid"), args.Performer, args.Performer); + return; + } + + if (_psionics.OnAttemptPowerUse(args.Performer, "DarkSwap", args.ManaCost / 2, args.CheckInsulation)) + { + RemComp(args.Performer, ethereal); + args.Handled = true; + } + } + else if (_psionics.OnAttemptPowerUse(args.Performer, "DarkSwap", args.ManaCost, args.CheckInsulation)) + { + var newethereal = EnsureComp(args.Performer); + newethereal.Darken = true; + + SpawnAtPosition("ShadowkinShadow", Transform(args.Performer).Coordinates); + SpawnAtPosition("EffectFlashShadowkinDarkSwapOn", Transform(args.Performer).Coordinates); + + args.Handled = true; + } + + if (args.Handled) + _psionics.LogPowerUsed(args.Performer, "DarkSwap", 0, 0); + } + } +} + + diff --git a/Content.Server/Abilities/Psionics/Abilities/DispelPowerSystem.cs b/Content.Server/Abilities/Psionics/Abilities/DispelPowerSystem.cs index cdfda7c801..ecffc86c76 100644 --- a/Content.Server/Abilities/Psionics/Abilities/DispelPowerSystem.cs +++ b/Content.Server/Abilities/Psionics/Abilities/DispelPowerSystem.cs @@ -38,6 +38,9 @@ public override void Initialize() private void OnPowerUsed(DispelPowerActionEvent args) { + if (!_psionics.OnAttemptPowerUse(args.Performer, "dispel")) + return; + var ev = new DispelledEvent(); RaiseLocalEvent(args.Target, ev, false); diff --git a/Content.Server/Abilities/Psionics/Abilities/HealOtherPowerSystem.cs b/Content.Server/Abilities/Psionics/Abilities/HealOtherPowerSystem.cs index 138a341ce8..6a2e90dd88 100644 --- a/Content.Server/Abilities/Psionics/Abilities/HealOtherPowerSystem.cs +++ b/Content.Server/Abilities/Psionics/Abilities/HealOtherPowerSystem.cs @@ -44,7 +44,7 @@ public override void Initialize() private void OnPowerUsed(EntityUid uid, PsionicComponent component, PsionicHealOtherPowerActionEvent args) { - if (component.DoAfter is not null) + if (!_psionics.OnAttemptPowerUse(args.Performer, args.PowerName)) return; args.ModifiedAmplification = _psionics.ModifiedAmplification(uid, component); diff --git a/Content.Server/Abilities/Psionics/Abilities/MetapsionicPowerSystem.cs b/Content.Server/Abilities/Psionics/Abilities/MetapsionicPowerSystem.cs index 58d7d804da..24ef344f63 100644 --- a/Content.Server/Abilities/Psionics/Abilities/MetapsionicPowerSystem.cs +++ b/Content.Server/Abilities/Psionics/Abilities/MetapsionicPowerSystem.cs @@ -19,6 +19,9 @@ public override void Initialize() private void OnPowerUsed(EntityUid uid, MetapsionicPowerComponent component, MetapsionicPowerActionEvent args) { + if (!_psionics.OnAttemptPowerUse(args.Performer, "metapsionic pulse")) + return; + foreach (var entity in _lookup.GetEntitiesInRange(uid, component.Range)) { if (HasComp(entity) && entity != uid && !HasComp(entity) && diff --git a/Content.Server/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs b/Content.Server/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs index 2d106706c6..869bf269ab 100644 --- a/Content.Server/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs +++ b/Content.Server/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs @@ -38,7 +38,8 @@ public override void Initialize() private void OnPowerUsed(MindSwapPowerActionEvent args) { - if (!(TryComp(args.Target, out var damageable) && damageable.DamageContainerID == "Biological")) + if (!_psionics.OnAttemptPowerUse(args.Performer, "mind swap") + || !(TryComp(args.Target, out var damageable) && damageable.DamageContainerID == "Biological")) return; Swap(args.Performer, args.Target); @@ -116,8 +117,8 @@ private void OnGhostAttempt(GhostAttemptHandleEvent args) private void OnSwapInit(EntityUid uid, MindSwappedComponent component, ComponentInit args) { - _actions.AddAction(uid, ref component.MindSwapReturnActionEntity, component.MindSwapReturnActionId ); - _actions.TryGetActionData( component.MindSwapReturnActionEntity, out var actionData ); + _actions.AddAction(uid, ref component.MindSwapReturnActionEntity, component.MindSwapReturnActionId); + _actions.TryGetActionData(component.MindSwapReturnActionEntity, out var actionData); if (actionData is { UseDelay: not null }) _actions.StartUseDelay(component.MindSwapReturnActionEntity); } @@ -132,11 +133,13 @@ public void Swap(EntityUid performer, EntityUid target, bool end = false) MindComponent? targetMind = null; // This is here to prevent missing MindContainerComponent Resolve errors. - if(!_mindSystem.TryGetMind(performer, out var performerMindId, out performerMind)){ + if (!_mindSystem.TryGetMind(performer, out var performerMindId, out performerMind)) + { performerMind = null; }; - if(!_mindSystem.TryGetMind(target, out var targetMindId, out targetMind)){ + if (!_mindSystem.TryGetMind(target, out var targetMindId, out targetMind)) + { targetMind = null; }; //This is a terrible way to 'unattach' minds. I wanted to use UnVisit but in TransferTo's code they say diff --git a/Content.Server/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs b/Content.Server/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs index c2f5920639..22c4f2e500 100644 --- a/Content.Server/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs +++ b/Content.Server/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs @@ -22,6 +22,9 @@ public override void Initialize() private void OnPowerUsed(NoosphericZapPowerActionEvent args) { + if (!_psionics.OnAttemptPowerUse(args.Performer, "noospheric zap")) + return; + _beam.TryCreateBeam(args.Performer, args.Target, "LightningNoospheric"); _stunSystem.TryParalyze(args.Target, TimeSpan.FromSeconds(5), false); diff --git a/Content.Server/Abilities/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs b/Content.Server/Abilities/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs index 1965862954..c6a01912a0 100644 --- a/Content.Server/Abilities/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs +++ b/Content.Server/Abilities/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs @@ -31,13 +31,14 @@ public override void Initialize() private void OnPowerUsed(EntityUid uid, PsionicInvisibilityPowerComponent component, PsionicInvisibilityPowerActionEvent args) { - if (HasComp(uid)) + if (!_psionics.OnAttemptPowerUse(args.Performer, "psionic invisibility") + || HasComp(uid)) return; ToggleInvisibility(args.Performer); var action = Spawn(PsionicInvisibilityUsedComponent.PsionicInvisibilityUsedActionPrototype); _actions.AddAction(uid, action, action); - _actions.TryGetActionData( action, out var actionData ); + _actions.TryGetActionData(action, out var actionData); if (actionData is { UseDelay: not null }) _actions.StartUseDelay(action); @@ -93,7 +94,8 @@ public void ToggleInvisibility(EntityUid uid) if (!HasComp(uid)) { EnsureComp(uid); - } else + } + else { RemComp(uid); } diff --git a/Content.Server/Abilities/Psionics/Abilities/PsionicRegenerationPowerSystem.cs b/Content.Server/Abilities/Psionics/Abilities/PsionicRegenerationPowerSystem.cs index 17e9249e65..d7ad2d49ab 100644 --- a/Content.Server/Abilities/Psionics/Abilities/PsionicRegenerationPowerSystem.cs +++ b/Content.Server/Abilities/Psionics/Abilities/PsionicRegenerationPowerSystem.cs @@ -40,6 +40,9 @@ public override void Initialize() private void OnPowerUsed(EntityUid uid, PsionicRegenerationPowerComponent component, PsionicRegenerationPowerActionEvent args) { + if (!_psionics.OnAttemptPowerUse(args.Performer, "psionic regeneration")) + return; + var ev = new PsionicRegenerationDoAfterEvent(_gameTiming.CurTime); var doAfterArgs = new DoAfterArgs(EntityManager, uid, component.UseDelay, ev, uid); diff --git a/Content.Server/Abilities/Psionics/Abilities/PyrokinesisPowerSystem.cs b/Content.Server/Abilities/Psionics/Abilities/PyrokinesisPowerSystem.cs index 3740822667..4a75083602 100644 --- a/Content.Server/Abilities/Psionics/Abilities/PyrokinesisPowerSystem.cs +++ b/Content.Server/Abilities/Psionics/Abilities/PyrokinesisPowerSystem.cs @@ -19,6 +19,9 @@ public override void Initialize() } private void OnPowerUsed(PyrokinesisPowerActionEvent args) { + if (!_psionics.OnAttemptPowerUse(args.Performer, "pyrokinesis")) + return; + if (!TryComp(args.Target, out var flammableComponent)) return; diff --git a/Content.Server/Abilities/Psionics/Abilities/TelegnosisPowerSystem.cs b/Content.Server/Abilities/Psionics/Abilities/TelegnosisPowerSystem.cs index 7a3f663a43..abbbdfacc5 100644 --- a/Content.Server/Abilities/Psionics/Abilities/TelegnosisPowerSystem.cs +++ b/Content.Server/Abilities/Psionics/Abilities/TelegnosisPowerSystem.cs @@ -18,6 +18,9 @@ public override void Initialize() private void OnPowerUsed(EntityUid uid, TelegnosisPowerComponent component, TelegnosisPowerActionEvent args) { + if (!_psionics.OnAttemptPowerUse(args.Performer, "telegnosis")) + return; + var projection = Spawn(component.Prototype, Transform(uid).Coordinates); Transform(projection).AttachToGridOrMap(); _mindSwap.Swap(uid, projection); diff --git a/Content.Server/Abilities/Psionics/AnomalyPowerSystem.cs b/Content.Server/Abilities/Psionics/AnomalyPowerSystem.cs index 73d5aae210..ff9910c400 100644 --- a/Content.Server/Abilities/Psionics/AnomalyPowerSystem.cs +++ b/Content.Server/Abilities/Psionics/AnomalyPowerSystem.cs @@ -49,8 +49,7 @@ public override void Initialize() private void OnPowerUsed(EntityUid uid, PsionicComponent component, AnomalyPowerActionEvent args) { - if (HasComp(uid) - || HasComp(uid)) + if (!_psionics.OnAttemptPowerUse(args.Performer, args.Settings.PowerName, args.Settings.ManaCost, args.Settings.CheckInsulation)) return; var overcharged = args.Settings.DoSupercritical ? _glimmerSystem.Glimmer * component.CurrentAmplification diff --git a/Content.Server/Abilities/Psionics/PsionicAbilitiesSystem.cs b/Content.Server/Abilities/Psionics/PsionicAbilitiesSystem.cs index 536235b6d6..bdf295615e 100644 --- a/Content.Server/Abilities/Psionics/PsionicAbilitiesSystem.cs +++ b/Content.Server/Abilities/Psionics/PsionicAbilitiesSystem.cs @@ -12,7 +12,6 @@ using System.Linq; using Robust.Server.Player; using Content.Server.Chat.Managers; -using Content.Server.Psionics.Glimmer; namespace Content.Server.Abilities.Psionics { @@ -29,6 +28,7 @@ public sealed class PsionicAbilitiesSystem : EntitySystem [Dependency] private readonly ISerializationManager _serialization = default!; [Dependency] private readonly IPlayerManager _playerManager = default!; [Dependency] private readonly IChatManager _chatManager = default!; + [Dependency] private readonly PsionicFamiliarSystem _psionicFamiliar = default!; private ProtoId _pool = "RandomPsionicPowerPool"; private const string GenericInitializationMessage = "generic-power-initialization-feedback"; @@ -59,6 +59,7 @@ private void OnPsionicShutdown(EntityUid uid, PsionicComponent component, Compon || HasComp(uid)) return; + KillFamiliars(component); RemoveAllPsionicPowers(uid); } @@ -215,8 +216,13 @@ public void RemoveAllPsionicPowers(EntityUid uid, bool mindbreak = false) _popups.PopupEntity(Loc.GetString(psionic.MindbreakingFeedback, ("entity", MetaData(uid).EntityName)), uid, uid, PopupType.MediumCaution); + KillFamiliars(psionic); RemComp(uid); RemComp(uid); + + var ev = new OnMindbreakEvent(); + RaiseLocalEvent(uid, ref ev); + return; } RefreshPsionicModifiers(uid, psionic); @@ -364,5 +370,20 @@ private void RemovePsionicStatSources(EntityUid uid, PsionicPowerPrototype proto RefreshPsionicModifiers(uid, psionic); } + + private void KillFamiliars(PsionicComponent component) + { + if (component.Familiars.Count <= 0) + return; + + foreach (var familiar in component.Familiars) + { + if (!TryComp(familiar, out var familiarComponent) + || !familiarComponent.DespawnOnMasterDeath) + continue; + + _psionicFamiliar.DespawnFamiliar(familiar, familiarComponent); + } + } } } diff --git a/Content.Server/Abilities/Psionics/PsionicFamiliarSystem.cs b/Content.Server/Abilities/Psionics/PsionicFamiliarSystem.cs new file mode 100644 index 0000000000..d382c1f231 --- /dev/null +++ b/Content.Server/Abilities/Psionics/PsionicFamiliarSystem.cs @@ -0,0 +1,140 @@ +using Content.Server.NPC; +using Content.Server.NPC.Components; +using Content.Server.NPC.HTN; +using Content.Server.NPC.Systems; +using Content.Server.Popups; +using Content.Shared.Abilities.Psionics; +using Content.Shared.Actions.Events; +using Content.Shared.Interaction.Events; +using Content.Shared.Mobs; +using Robust.Shared.Map; +using System.Numerics; + +namespace Content.Server.Abilities.Psionics; + +public sealed partial class PsionicFamiliarSystem : EntitySystem +{ + [Dependency] private readonly SharedPsionicAbilitiesSystem _psionics = default!; + [Dependency] private readonly NpcFactionSystem _factions = default!; + [Dependency] private readonly NPCSystem _npc = default!; + [Dependency] private readonly HTNSystem _htn = default!; + [Dependency] private readonly PopupSystem _popup = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnSummon); + SubscribeLocalEvent(OnFamiliarShutdown); + SubscribeLocalEvent(OnFamiliarAttack); + SubscribeLocalEvent(OnFamiliarDeath); + } + + private void OnSummon(EntityUid uid, PsionicComponent psionicComponent, SummonPsionicFamiliarActionEvent args) + { + if (psionicComponent.Familiars.Count >= psionicComponent.FamiliarLimit + || !_psionics.OnAttemptPowerUse(args.Performer, args.PowerName, args.ManaCost, args.CheckInsulation) + || args.Handled || args.FamiliarProto is null) + return; + + args.Handled = true; + var familiar = Spawn(args.FamiliarProto, Transform(uid).Coordinates); + EnsureComp(familiar, out var familiarComponent); + familiarComponent.Master = uid; + psionicComponent.Familiars.Add(familiar); + Dirty(familiar, familiarComponent); + Dirty(uid, psionicComponent); + + InheritFactions(uid, familiar, familiarComponent); + HandleBlackboards(uid, familiar, args); + DoGlimmerEffects(uid, psionicComponent, args); + } + + private void InheritFactions(EntityUid uid, EntityUid familiar, PsionicFamiliarComponent familiarComponent) + { + if (!familiarComponent.InheritMasterFactions + || !TryComp(uid, out var masterFactions) + || masterFactions.Factions.Count <= 0) + return; + + EnsureComp(familiar, out var familiarFactions); + foreach (var faction in masterFactions.Factions) + { + if (familiarFactions.Factions.Contains(faction)) + continue; + + _factions.AddFaction(familiar, faction, true); + } + } + + private void HandleBlackboards(EntityUid master, EntityUid familiar, SummonPsionicFamiliarActionEvent args) + { + if (!args.FollowMaster + || !TryComp(familiar, out var htnComponent)) + return; + + _npc.SetBlackboard(familiar, NPCBlackboard.FollowTarget, new EntityCoordinates(master, Vector2.Zero), htnComponent); + _htn.Replan(htnComponent); + } + + private void DoGlimmerEffects(EntityUid uid, PsionicComponent component, SummonPsionicFamiliarActionEvent args) + { + if (!args.DoGlimmerEffects + || args.MinGlimmer == 0 && args.MaxGlimmer == 0) + return; + + var minGlimmer = (int) Math.Round(MathF.MinMagnitude(args.MinGlimmer, args.MaxGlimmer) + * component.CurrentAmplification - component.CurrentDampening); + var maxGlimmer = (int) Math.Round(MathF.MaxMagnitude(args.MinGlimmer, args.MaxGlimmer) + * component.CurrentAmplification - component.CurrentDampening); + + _psionics.LogPowerUsed(uid, args.PowerName, minGlimmer, maxGlimmer); + } + + private void OnFamiliarShutdown(EntityUid uid, PsionicFamiliarComponent component, ComponentShutdown args) + { + if (!Exists(component.Master) + || !TryComp(component.Master, out var psionicComponent) + || !psionicComponent.Familiars.Contains(uid)) + return; + + psionicComponent.Familiars.Remove(uid); + } + + private void OnFamiliarAttack(EntityUid uid, PsionicFamiliarComponent component, AttackAttemptEvent args) + { + if (component.CanAttackMaster || args.Target is null + || args.Target != component.Master) + return; + + args.Cancel(); + if (!Loc.TryGetString(component.AttackMasterText, out var attackFailMessage)) + return; + + _popup.PopupEntity(attackFailMessage, uid, uid, component.AttackPopupType); + } + + private void OnFamiliarDeath(EntityUid uid, PsionicFamiliarComponent component, MobStateChangedEvent args) + { + if (!component.DespawnOnFamiliarDeath + || args.NewMobState != MobState.Dead) + return; + + DespawnFamiliar(uid, component); + } + + public void DespawnFamiliar(EntityUid uid) + { + if (!TryComp(uid, out var familiarComponent)) + return; + + DespawnFamiliar(uid, familiarComponent); + } + + public void DespawnFamiliar(EntityUid uid, PsionicFamiliarComponent component) + { + var popupText = Loc.GetString(component.DespawnText, ("entity", MetaData(uid).EntityName)); + _popup.PopupEntity(popupText, uid, component.DespawnPopopType); + QueueDel(uid); + } +} diff --git a/Content.Server/Administration/Commands/JobWhitelistCommands.cs b/Content.Server/Administration/Commands/JobWhitelistCommands.cs new file mode 100644 index 0000000000..f06cecabd7 --- /dev/null +++ b/Content.Server/Administration/Commands/JobWhitelistCommands.cs @@ -0,0 +1,214 @@ +using System.Linq; +using Content.Server.Database; +using Content.Server.Players.JobWhitelist; +using Content.Shared.Administration; +using Content.Shared.Roles; +using Robust.Server.Player; +using Robust.Shared.Console; +using Robust.Shared.Prototypes; + +namespace Content.Server.Administration.Commands; + +[AdminCommand(AdminFlags.Ban)] +public sealed class JobWhitelistAddCommand : LocalizedCommands +{ + [Dependency] private readonly IServerDbManager _db = default!; + [Dependency] private readonly JobWhitelistManager _jobWhitelist = default!; + [Dependency] private readonly IPlayerLocator _playerLocator = default!; + [Dependency] private readonly IPlayerManager _players = default!; + [Dependency] private readonly IPrototypeManager _prototypes = default!; + + public override string Command => "jobwhitelistadd"; + + public override async void Execute(IConsoleShell shell, string argStr, string[] args) + { + if (args.Length != 2) + { + shell.WriteError(Loc.GetString("shell-wrong-arguments-number-need-specific", + ("properAmount", 2), + ("currentAmount", args.Length))); + shell.WriteLine(Help); + return; + } + + var player = args[0].Trim(); + var job = new ProtoId(args[1].Trim()); + if (!_prototypes.TryIndex(job, out var jobPrototype)) + { + shell.WriteError(Loc.GetString("cmd-jobwhitelist-job-does-not-exist", ("job", job.Id))); + shell.WriteLine(Help); + return; + } + + var data = await _playerLocator.LookupIdByNameAsync(player); + if (data != null) + { + var guid = data.UserId; + var isWhitelisted = await _db.IsJobWhitelisted(guid, job); + if (isWhitelisted) + { + shell.WriteLine(Loc.GetString("cmd-jobwhitelist-already-whitelisted", + ("player", player), + ("jobId", job.Id), + ("jobName", jobPrototype.LocalizedName))); + return; + } + + _jobWhitelist.AddWhitelist(guid, job); + shell.WriteLine(Loc.GetString("cmd-jobwhitelistadd-added", + ("player", player), + ("jobId", job.Id), + ("jobName", jobPrototype.LocalizedName))); + return; + } + + shell.WriteError(Loc.GetString("cmd-jobwhitelist-player-not-found", ("player", player))); + } + + public override CompletionResult GetCompletion(IConsoleShell shell, string[] args) + { + if (args.Length == 1) + { + return CompletionResult.FromHintOptions( + _players.Sessions.Select(s => s.Name), + Loc.GetString("cmd-jobwhitelist-hint-player")); + } + + if (args.Length == 2) + { + return CompletionResult.FromHintOptions( + _prototypes.EnumeratePrototypes().Select(p => p.ID), + Loc.GetString("cmd-jobwhitelist-hint-job")); + } + + return CompletionResult.Empty; + } +} + +[AdminCommand(AdminFlags.Ban)] +public sealed class GetJobWhitelistCommand : LocalizedCommands +{ + [Dependency] private readonly IServerDbManager _db = default!; + [Dependency] private readonly IPlayerLocator _playerLocator = default!; + [Dependency] private readonly IPlayerManager _players = default!; + + public override string Command => "jobwhitelistget"; + + public override async void Execute(IConsoleShell shell, string argStr, string[] args) + { + if (args.Length == 0) + { + shell.WriteError("This command needs at least one argument."); + shell.WriteLine(Help); + return; + } + + var player = string.Join(' ', args).Trim(); + var data = await _playerLocator.LookupIdByNameAsync(player); + if (data != null) + { + var guid = data.UserId; + var whitelists = await _db.GetJobWhitelists(guid); + if (whitelists.Count == 0) + { + shell.WriteLine(Loc.GetString("cmd-jobwhitelistget-whitelisted-none", ("player", player))); + return; + } + + shell.WriteLine(Loc.GetString("cmd-jobwhitelistget-whitelisted-for", + ("player", player), + ("jobs", string.Join(", ", whitelists)))); + return; + } + + shell.WriteError(Loc.GetString("cmd-jobwhitelist-player-not-found", ("player", player))); + } + + public override CompletionResult GetCompletion(IConsoleShell shell, string[] args) + { + if (args.Length == 1) + { + return CompletionResult.FromHintOptions( + _players.Sessions.Select(s => s.Name), + Loc.GetString("cmd-jobwhitelist-hint-player")); + } + + return CompletionResult.Empty; + } +} + +[AdminCommand(AdminFlags.Ban)] +public sealed class RemoveJobWhitelistCommand : LocalizedCommands +{ + [Dependency] private readonly IServerDbManager _db = default!; + [Dependency] private readonly JobWhitelistManager _jobWhitelist = default!; + [Dependency] private readonly IPlayerLocator _playerLocator = default!; + [Dependency] private readonly IPlayerManager _players = default!; + [Dependency] private readonly IPrototypeManager _prototypes = default!; + + public override string Command => "jobwhitelistremove"; + + public override async void Execute(IConsoleShell shell, string argStr, string[] args) + { + if (args.Length != 2) + { + shell.WriteError(Loc.GetString("shell-wrong-arguments-number-need-specific", + ("properAmount", 2), + ("currentAmount", args.Length))); + shell.WriteLine(Help); + return; + } + + var player = args[0].Trim(); + var job = new ProtoId(args[1].Trim()); + if (!_prototypes.TryIndex(job, out var jobPrototype)) + { + shell.WriteError(Loc.GetString("cmd-jobwhitelist-job-does-not-exist", ("job", job))); + shell.WriteLine(Help); + return; + } + + var data = await _playerLocator.LookupIdByNameAsync(player); + if (data != null) + { + var guid = data.UserId; + var isWhitelisted = await _db.IsJobWhitelisted(guid, job); + if (!isWhitelisted) + { + shell.WriteError(Loc.GetString("cmd-jobwhitelistremove-was-not-whitelisted", + ("player", player), + ("jobId", job.Id), + ("jobName", jobPrototype.LocalizedName))); + return; + } + + _jobWhitelist.RemoveWhitelist(guid, job); + shell.WriteLine(Loc.GetString("cmd-jobwhitelistremove-removed", + ("player", player), + ("jobId", job.Id), + ("jobName", jobPrototype.LocalizedName))); + return; + } + + shell.WriteError(Loc.GetString("cmd-jobwhitelist-player-not-found", ("player", player))); + } + + public override CompletionResult GetCompletion(IConsoleShell shell, string[] args) + { + if (args.Length == 1) + { + return CompletionResult.FromHintOptions( + _players.Sessions.Select(s => s.Name), + Loc.GetString("cmd-jobwhitelist-hint-player")); + } + + if (args.Length == 2) + { + return CompletionResult.FromHintOptions( + _prototypes.EnumeratePrototypes().Select(p => p.ID), + Loc.GetString("cmd-jobwhitelist-hint-job")); + } + + return CompletionResult.Empty; + } +} diff --git a/Content.Server/Administration/Commands/JobWhitelistsCommand.cs b/Content.Server/Administration/Commands/JobWhitelistsCommand.cs new file mode 100644 index 0000000000..6ad44a0c73 --- /dev/null +++ b/Content.Server/Administration/Commands/JobWhitelistsCommand.cs @@ -0,0 +1,61 @@ +using System.Linq; +using Content.Server.Administration; +using Content.Server.EUI; +using Content.Shared.Administration; +using Robust.Shared.Console; +using Robust.Server.Player; + +namespace Content.Server.Administration.Commands; + +/// +/// Opens the job whitelists panel for editing player whitelists. +/// To use this ingame it's easiest to first open the player panel, then hit Job Whitelists. +/// +[AdminCommand(AdminFlags.Whitelist)] +public sealed class JobWhitelistsCommand : LocalizedCommands +{ + [Dependency] private readonly EuiManager _eui = default!; + [Dependency] private readonly IPlayerLocator _locator = default!; + [Dependency] private readonly IPlayerManager _players = default!; + + public override string Command => "jobwhitelists"; + + public override async void Execute(IConsoleShell shell, string argStr, string[] args) + { + if (shell.Player is not {} player) + { + shell.WriteError(Loc.GetString("shell-cannot-run-command-from-server")); + return; + } + + if (args.Length != 1) + { + shell.WriteLine(Loc.GetString("cmd-ban-invalid-arguments")); + shell.WriteLine(Help); + } + + var playerarg = string.Join(' ', args).Trim(); + var located = await _locator.LookupIdByNameAsync(playerarg); + if (located is null) + { + shell.WriteError(Loc.GetString("cmd-jobwhitelists-player-err")); + return; + } + + var ui = new JobWhitelistsEui(located.UserId, located.Username); + ui.LoadWhitelists(); + _eui.OpenEui(ui, player); + } + + public override CompletionResult GetCompletion(IConsoleShell shell, string[] args) + { + if (args.Length == 1) + { + return CompletionResult.FromHintOptions( + _players.Sessions.Select(s => s.Name), + Loc.GetString("cmd-jobwhitelist-hint-player")); + } + + return CompletionResult.Empty; + } +} diff --git a/Content.Server/Administration/JobWhitelistsEui.cs b/Content.Server/Administration/JobWhitelistsEui.cs new file mode 100644 index 0000000000..9d50a72183 --- /dev/null +++ b/Content.Server/Administration/JobWhitelistsEui.cs @@ -0,0 +1,90 @@ +using System.Threading.Tasks; +using Content.Server.Administration.Managers; +using Content.Server.Database; +using Content.Server.EUI; +using Content.Server.Players.JobWhitelist; +using Content.Shared.Administration; +using Content.Shared.Administration; +using Content.Shared.Eui; +using Content.Shared.Roles; +using Robust.Shared.Log; +using Robust.Shared.Network; +using Robust.Shared.Prototypes; + +namespace Content.Server.Administration; + +public sealed class JobWhitelistsEui : BaseEui +{ + [Dependency] private readonly IAdminManager _admin = default!; + [Dependency] private readonly ILogManager _log = default!; + [Dependency] private readonly IPrototypeManager _proto = default!; + [Dependency] private readonly IServerDbManager _db = default!; + [Dependency] private readonly JobWhitelistManager _jobWhitelist = default!; + + private readonly ISawmill _sawmill; + + public NetUserId PlayerId; + public string PlayerName; + + public HashSet> Whitelists = new(); + + public JobWhitelistsEui(NetUserId playerId, string playerName) + { + IoCManager.InjectDependencies(this); + + _sawmill = _log.GetSawmill("admin.job_whitelists_eui"); + + PlayerId = playerId; + PlayerName = playerName; + } + + public async void LoadWhitelists() + { + var jobs = await _db.GetJobWhitelists(PlayerId.UserId); + foreach (var id in jobs) + { + if (_proto.HasIndex(id)) + Whitelists.Add(id); + } + + StateDirty(); + } + + public override EuiStateBase GetNewState() + { + return new JobWhitelistsEuiState(PlayerName, Whitelists); + } + + public override void HandleMessage(EuiMessageBase msg) + { + base.HandleMessage(msg); + + if (msg is not SetJobWhitelistedMessage args) + return; + + if (!_admin.HasAdminFlag(Player, AdminFlags.Whitelist)) + { + _sawmill.Warning($"{Player.Name} ({Player.UserId}) tried to change role whitelists for {PlayerName} without whitelists flag"); + return; + } + + if (!_proto.HasIndex(args.Job)) + return; + + if (args.Whitelisting) + { + _jobWhitelist.AddWhitelist(PlayerId, args.Job); + Whitelists.Add(args.Job); + } + else + { + _jobWhitelist.RemoveWhitelist(PlayerId, args.Job); + Whitelists.Remove(args.Job); + } + + var verb = args.Whitelisting ? "added" : "removed"; + _sawmill.Info($"{Player.Name} ({Player.UserId}) {verb} whitelist for {args.Job} to player {PlayerName} ({PlayerId.UserId})"); + + StateDirty(); + } +} diff --git a/Content.Server/Administration/Managers/BanManager.cs b/Content.Server/Administration/Managers/BanManager.cs index 3a05b934b2..68bd817026 100644 --- a/Content.Server/Administration/Managers/BanManager.cs +++ b/Content.Server/Administration/Managers/BanManager.cs @@ -73,7 +73,9 @@ private async Task AddRoleBan(ServerRoleBanDef banDef) public HashSet? GetRoleBans(NetUserId playerUserId) { - return _cachedRoleBans.TryGetValue(playerUserId, out var roleBans) ? roleBans.Select(banDef => banDef.Role).ToHashSet() : null; + return _cachedRoleBans.TryGetValue(playerUserId, out var roleBans) + ? roleBans.Select(banDef => banDef.Role).ToHashSet() + : null; } private async Task CacheDbRoleBans(NetUserId userId, IPAddress? address = null, ImmutableArray? hwId = null) @@ -263,13 +265,13 @@ public async Task PardonRoleBan(int banId, NetUserId? unbanningAdmin, Da return $"Pardoned ban with id {banId}"; } - public HashSet? GetJobBans(NetUserId playerUserId) + public HashSet>? GetJobBans(NetUserId playerUserId) { if (!_cachedRoleBans.TryGetValue(playerUserId, out var roleBans)) return null; return roleBans .Where(ban => ban.Role.StartsWith(JobPrefix, StringComparison.Ordinal)) - .Select(ban => ban.Role[JobPrefix.Length..]) + .Select(ban => new ProtoId(ban.Role[JobPrefix.Length..])) .ToHashSet(); } #endregion diff --git a/Content.Server/Administration/Managers/IBanManager.cs b/Content.Server/Administration/Managers/IBanManager.cs index dafe3d35bd..b60e0a2535 100644 --- a/Content.Server/Administration/Managers/IBanManager.cs +++ b/Content.Server/Administration/Managers/IBanManager.cs @@ -2,8 +2,10 @@ using System.Net; using System.Threading.Tasks; using Content.Shared.Database; +using Content.Shared.Roles; using Robust.Shared.Network; using Robust.Shared.Player; +using Robust.Shared.Prototypes; namespace Content.Server.Administration.Managers; @@ -24,7 +26,7 @@ public interface IBanManager /// Reason for the ban public void CreateServerBan(NetUserId? target, string? targetUsername, NetUserId? banningAdmin, (IPAddress, int)? addressRange, ImmutableArray? hwid, uint? minutes, NoteSeverity severity, string reason); public HashSet? GetRoleBans(NetUserId playerUserId); - public HashSet? GetJobBans(NetUserId playerUserId); + public HashSet>? GetJobBans(NetUserId playerUserId); /// /// Creates a job ban for the specified target, username or GUID diff --git a/Content.Server/Alert/Click/CheckHealth.cs b/Content.Server/Alert/Click/CheckHealth.cs new file mode 100644 index 0000000000..31beff69c2 --- /dev/null +++ b/Content.Server/Alert/Click/CheckHealth.cs @@ -0,0 +1,44 @@ +using Content.Server.Chat.Managers; +using Content.Shared.Alert; +using Content.Shared.Chat; +using Content.Shared.Damage; +using Content.Shared.HealthExaminable; +using JetBrains.Annotations; +using Robust.Server.Player; +using Robust.Shared.Player; + +namespace Content.Server.Alert.Click; + +[UsedImplicitly] +[DataDefinition] +public sealed partial class CheckHealth : IAlertClick +{ + public void AlertClicked(EntityUid player) + { + var chatManager = IoCManager.Resolve(); + var entityManager = IoCManager.Resolve(); + var playerManager = IoCManager.Resolve(); + + var healthExaminableSystem = entityManager.System(); + + if (!entityManager.TryGetComponent(player, out HealthExaminableComponent? healthExaminable) || + !entityManager.TryGetComponent(player, out DamageableComponent? damageable) || + !playerManager.TryGetSessionByEntity(player, out var session)) + return; + + var baseMsg = Loc.GetString("health-alert-start"); + SendMessage(chatManager, baseMsg, session); + var markup = healthExaminableSystem.GetMarkup(player, (player, healthExaminable), damageable).ToMarkup(); + SendMessage(chatManager, markup, session); + } + + private static void SendMessage(IChatManager chatManager, string msg, ICommonSession session) + { + chatManager.ChatMessageToOne(ChatChannel.Emotes, + msg, + msg, + EntityUid.Invalid, + false, + session.Channel); + } +} diff --git a/Content.Server/Body/Components/RespiratorImmuneComponent.cs b/Content.Server/Body/Components/RespiratorImmuneComponent.cs new file mode 100644 index 0000000000..afc261eff2 --- /dev/null +++ b/Content.Server/Body/Components/RespiratorImmuneComponent.cs @@ -0,0 +1,4 @@ +namespace Content.Server.Body.Components; + +[RegisterComponent] +public sealed partial class RespiratorImmuneComponent : Component { } \ No newline at end of file diff --git a/Content.Server/Body/Systems/RespiratorSystem.cs b/Content.Server/Body/Systems/RespiratorSystem.cs index 389e5fbab7..f6a17d32b6 100644 --- a/Content.Server/Body/Systems/RespiratorSystem.cs +++ b/Content.Server/Body/Systems/RespiratorSystem.cs @@ -66,6 +66,9 @@ public override void Update(float frameTime) if (_mobState.IsDead(uid)) continue; + if (HasComp(uid)) + continue; + UpdateSaturation(uid, -(float) respirator.UpdateInterval.TotalSeconds, respirator); if (!_mobState.IsIncapacitated(uid)) // cannot breathe in crit. diff --git a/Content.Server/Chapel/SacrificialAltarSystem.cs b/Content.Server/Chapel/SacrificialAltarSystem.cs new file mode 100644 index 0000000000..e7144e1185 --- /dev/null +++ b/Content.Server/Chapel/SacrificialAltarSystem.cs @@ -0,0 +1,129 @@ +using Content.Server.Bible.Components; +using Content.Shared.Abilities.Psionics; +using Content.Shared.Administration.Logs; +using Content.Shared.Body.Components; +using Content.Shared.Body.Systems; +using Content.Shared.Database; +using Content.Shared.Chapel; +using Content.Shared.DoAfter; +using Content.Shared.Humanoid; +using Content.Shared.Mind; +using Content.Shared.Popups; +using Content.Shared.Psionics.Glimmer; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Player; +using Robust.Shared.Prototypes; +using Robust.Shared.Random; + +namespace Content.Server.Chapel; + +public sealed class SacrificialAltarSystem : SharedSacrificialAltarSystem +{ + [Dependency] private readonly GlimmerSystem _glimmer = default!; + [Dependency] private readonly IPrototypeManager _proto = default!; + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly SharedBodySystem _body = default!; + [Dependency] private readonly SharedMindSystem _mind = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnDoAfter); + } + + private void OnDoAfter(Entity ent, ref SacrificeDoAfterEvent args) + { + ent.Comp.SacrificeStream = _audio.Stop(ent.Comp.SacrificeStream); + ent.Comp.DoAfter = null; + + if (args.Cancelled || args.Handled || args.Args.Target is not { } target + || !TryComp(target, out var psionic) + || !_mind.TryGetMind(target, out var _, out var _)) + return; + + _adminLogger.Add(LogType.Action, LogImpact.Extreme, $"{ToPrettyString(args.Args.User):player} sacrificed {ToPrettyString(target):target} on {ToPrettyString(ent):altar}"); + + // lower glimmer by a random amount + _glimmer.Glimmer -= (int) (ent.Comp.GlimmerReduction * psionic.CurrentAmplification); + + if (ent.Comp.RewardPool is not null && _random.Prob(ent.Comp.BaseItemChance * psionic.CurrentDampening)) + { + var proto = _proto.Index(_random.Pick(ent.Comp.RewardPool)); + Spawn(proto.ToString(), Transform(ent).Coordinates); + } + // TODO GOLEMS: create a soul crystal and transfer mind into it + + // finally gib the targets old body + if (TryComp(target, out var body)) + _body.GibBody(target, gibOrgans: false, body, launchGibs: true); + else + QueueDel(target); + } + + protected override void AttemptSacrifice(Entity ent, EntityUid user, EntityUid target) + { + if (ent.Comp.DoAfter != null) + return; + + // can't sacrifice yourself + if (user == target) + { + _popup.PopupEntity(Loc.GetString("altar-failure-reason-self"), ent, user, PopupType.SmallCaution); + return; + } + + // you need to be psionic OR bible user + if (!HasComp(user) && !HasComp(user)) + { + _popup.PopupEntity(Loc.GetString("altar-failure-reason-user"), ent, user, PopupType.SmallCaution); + return; + } + + // and no golems or familiars or whatever should be sacrificing + if (!HasComp(user)) + { + _popup.PopupEntity(Loc.GetString("altar-failure-reason-user-humanoid"), ent, user, PopupType.SmallCaution); + return; + } + + // prevent psichecking SSD people... + // notably there is no check in OnDoAfter so you can't alt f4 to survive being sacrificed + if (!HasComp(target) || _mind.GetMind(target) == null) + { + _popup.PopupEntity(Loc.GetString("altar-failure-reason-target-catatonic", ("target", target)), ent, user, PopupType.SmallCaution); + return; + } + + // TODO: there should be a penalty to the user for psichecking like this + if (!HasComp(target)) + { + _popup.PopupEntity(Loc.GetString("altar-failure-reason-target", ("target", target)), ent, user, PopupType.SmallCaution); + return; + } + + if (!HasComp(target)) + { + _popup.PopupEntity(Loc.GetString("altar-failure-reason-target-humanoid", ("target", target)), ent, user, PopupType.SmallCaution); + return; + } + + _popup.PopupEntity(Loc.GetString("altar-sacrifice-popup", ("user", user), ("target", target)), ent, PopupType.LargeCaution); + + ent.Comp.SacrificeStream = _audio.PlayPvs(ent.Comp.SacrificeSound, ent)?.Entity; + + var ev = new SacrificeDoAfterEvent(); + var args = new DoAfterArgs(EntityManager, user, ent.Comp.SacrificeTime, ev, target: target, eventTarget: ent) + { + BreakOnDamage = true, + BreakOnUserMove = true, + BreakOnTargetMove = true, + BreakOnWeightlessMove = true, + NeedHand = true + }; + DoAfter.TryStartDoAfter(args, out ent.Comp.DoAfter); + } +} diff --git a/Content.Server/Chat/EmpathyChatSystem.cs b/Content.Server/Chat/EmpathyChatSystem.cs new file mode 100644 index 0000000000..b46bbdc34e --- /dev/null +++ b/Content.Server/Chat/EmpathyChatSystem.cs @@ -0,0 +1,83 @@ +using System.Linq; +using Robust.Shared.Utility; +using Content.Server.Chat.Managers; +using Content.Server.Language; +using Content.Server.Chat.Systems; +using Content.Server.Administration.Managers; +using Robust.Shared.Network; +using Robust.Shared.Player; +using Content.Shared.Chat; +using Content.Shared.Language; +using Robust.Shared.Prototypes; +using Content.Shared.Language.Components; + +namespace Content.Server.Chat; + +public sealed partial class EmpathyChatSystem : EntitySystem +{ + [Dependency] private readonly IChatManager _chatManager = default!; + [Dependency] private readonly LanguageSystem _language = default!; + [Dependency] private readonly IAdminManager _adminManager = default!; + [Dependency] private readonly IPrototypeManager _prototype = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnSpeak); + } + + private void OnSpeak(EntityUid uid, LanguageSpeakerComponent component, EntitySpokeEvent args) + { + if (args.Source != uid + || !args.Language.SpeechOverride.EmpathySpeech + || args.IsWhisper) + return; + + SendEmpathyChat(args.Source, args.Message, false); + } + + /// + /// Send a Message in the Shadowkin Empathy Chat. + /// + /// The entity making the message + /// The contents of the message + /// Set the ChatTransmitRange + public void SendEmpathyChat(EntityUid source, string message, bool hideChat) + { + var clients = GetEmpathChatClients(); + string wrappedMessage; + + wrappedMessage = Loc.GetString("chat-manager-send-empathy-chat-wrap-message", + ("source", source), + ("message", FormattedMessage.EscapeText(message))); + + _chatManager.ChatMessageToMany(ChatChannel.Telepathic, message, wrappedMessage, source, hideChat, true, clients.ToList(), Color.FromHex("#be3cc5")); + } + + private IEnumerable GetEmpathChatClients() + { + return Filter.Empty() + .AddWhereAttachedEntity(entity => + CanHearEmpathy(entity)) + .Recipients + .Union(_adminManager.ActiveAdmins) + .Select(p => p.Channel); + } + + /// + /// Check if an entity can hear Empathy. + /// (Admins will always be able to hear Empathy) + /// + /// The entity to check + public bool CanHearEmpathy(EntityUid entity) + { + var understood = _language.GetUnderstoodLanguages(entity); + for (int i = 0; i < understood.Count; i++) + { + var language = _prototype.Index(understood[i]); + if (language.SpeechOverride.EmpathySpeech) + return true; + } + return false; + } +} \ No newline at end of file diff --git a/Content.Server/Arachne/ArachneSystem.cs b/Content.Server/Cocoon/CocoonerSystem.cs similarity index 51% rename from Content.Server/Arachne/ArachneSystem.cs rename to Content.Server/Cocoon/CocoonerSystem.cs index 27e8851247..a53ebbb5f5 100644 --- a/Content.Server/Arachne/ArachneSystem.cs +++ b/Content.Server/Cocoon/CocoonerSystem.cs @@ -1,7 +1,6 @@ -using Content.Shared.Arachne; +using Content.Shared.Cocoon; using Content.Shared.IdentityManagement; using Content.Shared.Verbs; -using Content.Shared.Buckle.Components; using Content.Shared.DoAfter; using Content.Shared.Stunnable; using Content.Shared.Eye.Blinding.Systems; @@ -10,29 +9,21 @@ using Content.Shared.Administration.Logs; using Content.Shared.Database; using Content.Shared.Humanoid; -using Content.Server.Buckle.Systems; using Content.Server.Popups; using Content.Server.DoAfter; -using Content.Server.Body.Components; -using Content.Server.Vampiric; using Content.Server.Speech.Components; using Robust.Shared.Containers; -using Robust.Shared.Utility; -using Robust.Server.Console; +using Content.Shared.Mobs.Components; -namespace Content.Server.Arachne +namespace Content.Server.Cocoon { - public sealed class ArachneSystem : EntitySystem + public sealed class CocooningSystem : EntitySystem { [Dependency] private readonly PopupSystem _popupSystem = default!; [Dependency] private readonly DoAfterSystem _doAfter = default!; - [Dependency] private readonly BuckleSystem _buckleSystem = default!; [Dependency] private readonly ItemSlotsSystem _itemSlots = default!; [Dependency] private readonly BlindableSystem _blindableSystem = default!; [Dependency] private readonly DamageableSystem _damageableSystem = default!; - - [Dependency] private readonly IServerConsoleHost _host = default!; - [Dependency] private readonly BloodSuckerSystem _bloodSuckerSystem = default!; [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; private const string BodySlot = "body_slot"; @@ -40,27 +31,16 @@ public sealed class ArachneSystem : EntitySystem public override void Initialize() { base.Initialize(); - SubscribeLocalEvent>(AddCocoonVerb); - + SubscribeLocalEvent>(AddCocoonVerb); SubscribeLocalEvent(OnCocEntInserted); SubscribeLocalEvent(OnCocEntRemoved); SubscribeLocalEvent(OnDamageChanged); - SubscribeLocalEvent>(AddSuccVerb); - SubscribeLocalEvent(OnCocoonDoAfter); + SubscribeLocalEvent(OnCocoonDoAfter); } - private void AddCocoonVerb(EntityUid uid, ArachneComponent component, GetVerbsEvent args) + private void AddCocoonVerb(EntityUid uid, CocoonerComponent component, GetVerbsEvent args) { - if (!args.CanAccess || !args.CanInteract) - return; - - if (args.Target == uid) - return; - - if (!TryComp(args.Target, out var bloodstream)) - return; - - if (bloodstream.BloodReagent != component.WebBloodReagent) + if (!args.CanAccess || !args.CanInteract || !HasComp(args.Target)) return; InnateVerb verb = new() @@ -77,31 +57,23 @@ private void AddCocoonVerb(EntityUid uid, ArachneComponent component, GetVerbsEv private void OnCocEntInserted(EntityUid uid, CocoonComponent component, EntInsertedIntoContainerMessage args) { - _blindableSystem.UpdateIsBlind(args.Entity); - EnsureComp(args.Entity); + component.Victim = args.Entity; if (TryComp(args.Entity, out var currentAccent)) - { - component.WasReplacementAccent = true; component.OldAccent = currentAccent.Accent; - currentAccent.Accent = "mumble"; - } else - { - component.WasReplacementAccent = false; - var replacement = EnsureComp(args.Entity); - replacement.Accent = "mumble"; - } + + EnsureComp(args.Entity).Accent = "mumble"; + EnsureComp(args.Entity); + + _blindableSystem.UpdateIsBlind(args.Entity); } private void OnCocEntRemoved(EntityUid uid, CocoonComponent component, EntRemovedFromContainerMessage args) { - if (component.WasReplacementAccent && TryComp(args.Entity, out var replacement)) - { - replacement.Accent = component.OldAccent; - } else - { + if (TryComp(args.Entity, out var replacement)) + replacement.Accent = component.OldAccent ?? replacement.Accent; + else RemComp(args.Entity); - } RemComp(args.Entity); _blindableSystem.UpdateIsBlind(args.Entity); @@ -109,79 +81,24 @@ private void OnCocEntRemoved(EntityUid uid, CocoonComponent component, EntRemove private void OnDamageChanged(EntityUid uid, CocoonComponent component, DamageChangedEvent args) { - if (!args.DamageIncreased) - return; - - if (args.DamageDelta == null) - return; - - var body = _itemSlots.GetItemOrNull(uid, BodySlot); - - if (body == null) + if (!args.DamageIncreased || args.DamageDelta == null || component.Victim == null) return; var damage = args.DamageDelta * component.DamagePassthrough; - _damageableSystem.TryChangeDamage(body, damage); + _damageableSystem.TryChangeDamage(component.Victim, damage); } - private void AddSuccVerb(EntityUid uid, CocoonComponent component, GetVerbsEvent args) - { - if (!args.CanAccess || !args.CanInteract) - return; - - if (!TryComp(args.User, out var sucker)) - return; - - if (!sucker.WebRequired) - return; - - var victim = _itemSlots.GetItemOrNull(uid, BodySlot); - - if (victim == null) - return; - - if (!TryComp(victim, out var stream)) - return; - - AlternativeVerb verb = new() - { - Act = () => - { - _bloodSuckerSystem.StartSuccDoAfter(args.User, victim.Value, sucker, stream, false); // start doafter - }, - Text = Loc.GetString("action-name-suck-blood"), - Icon = new SpriteSpecifier.Texture(new ("/Textures/Nyanotrasen/Icons/verbiconfangs.png")), - Priority = 2 - }; - args.Verbs.Add(verb); - } - - private void OnEntRemoved(EntityUid uid, WebComponent web, EntRemovedFromContainerMessage args) - { - if (!TryComp(uid, out var strap)) - return; - - if (HasComp(args.Entity)) - _buckleSystem.StrapSetEnabled(uid, false, strap); - } - - private void StartCocooning(EntityUid uid, ArachneComponent component, EntityUid target) + private void StartCocooning(EntityUid uid, CocoonerComponent component, EntityUid target) { _popupSystem.PopupEntity(Loc.GetString("cocoon-start-third-person", ("target", Identity.Entity(target, EntityManager)), ("spider", Identity.Entity(uid, EntityManager))), uid, Shared.Popups.PopupType.MediumCaution); - _popupSystem.PopupEntity(Loc.GetString("cocoon-start-second-person", ("target", Identity.Entity(target, EntityManager))), uid, uid, Shared.Popups.PopupType.Medium); - var delay = component.CocoonDelay; if (HasComp(target)) delay *= component.CocoonKnockdownMultiplier; - // Is it good practice to use empty data just to disambiguate doafters - // Who knows, there's no docs! - var ev = new ArachneCocoonDoAfterEvent(); - - var args = new DoAfterArgs(EntityManager, uid, delay, ev, uid, target: target) + var args = new DoAfterArgs(EntityManager, uid, delay, new CocoonDoAfterEvent(), uid, target: target) { BreakOnUserMove = true, BreakOnTargetMove = true, @@ -190,7 +107,7 @@ private void StartCocooning(EntityUid uid, ArachneComponent component, EntityUid _doAfter.TryStartDoAfter(args); } - private void OnCocoonDoAfter(EntityUid uid, ArachneComponent component, ArachneCocoonDoAfterEvent args) + private void OnCocoonDoAfter(EntityUid uid, CocoonerComponent component, CocoonDoAfterEvent args) { if (args.Handled || args.Cancelled || args.Args.Target == null) return; diff --git a/Content.Server/Database/ServerDbBase.cs b/Content.Server/Database/ServerDbBase.cs index 3ac755facf..8286defd11 100644 --- a/Content.Server/Database/ServerDbBase.cs +++ b/Content.Server/Database/ServerDbBase.cs @@ -17,6 +17,8 @@ using Robust.Shared.Enums; using Robust.Shared.Network; using Robust.Shared.Utility; +using Content.Shared.Roles; +using Robust.Shared.Prototypes; namespace Content.Server.Database { @@ -141,7 +143,7 @@ public async Task InitPrefsAsync(NetUserId userId, ICharacter await db.DbContext.SaveChangesAsync(); - return new PlayerPreferences(new[] {new KeyValuePair(0, defaultProfile)}, 0, Color.FromHex(prefs.AdminOOCColor)); + return new PlayerPreferences(new[] { new KeyValuePair(0, defaultProfile) }, 0, Color.FromHex(prefs.AdminOOCColor)); } public async Task DeleteSlotAndSetSelectedIndex(NetUserId userId, int deleteSlot, int newSlot) @@ -281,25 +283,25 @@ private static Profile ConvertProfiles(HumanoidCharacterProfile humanoid, int sl profile.Jobs.AddRange( humanoid.JobPriorities .Where(j => j.Value != JobPriority.Never) - .Select(j => new Job {JobName = j.Key, Priority = (DbJobPriority) j.Value}) + .Select(j => new Job { JobName = j.Key, Priority = (DbJobPriority) j.Value }) ); profile.Antags.Clear(); profile.Antags.AddRange( humanoid.AntagPreferences - .Select(a => new Antag {AntagName = a}) + .Select(a => new Antag { AntagName = a }) ); profile.Traits.Clear(); profile.Traits.AddRange( humanoid.TraitPreferences - .Select(t => new Trait {TraitName = t}) + .Select(t => new Trait { TraitName = t }) ); profile.Loadouts.Clear(); profile.Loadouts.AddRange( humanoid.LoadoutPreferences - .Select(t => new Loadout {LoadoutName = t}) + .Select(t => new Loadout { LoadoutName = t }) ); return profile; @@ -1236,7 +1238,7 @@ ban.Unban is null ban.LastEditedAt, ban.ExpirationTime, ban.Hidden, - new [] { ban.RoleId.Replace(BanManager.JobPrefix, null) }, + new[] { ban.RoleId.Replace(BanManager.JobPrefix, null) }, MakePlayerRecord(unbanningAdmin), ban.Unban?.UnbanTime); } @@ -1400,10 +1402,10 @@ public async Task> GetActiveWatchlists(Guid player) protected async Task> GetActiveWatchlistsImpl(DbGuard db, Guid player) { var entities = await (from watchlist in db.DbContext.AdminWatchlists - where watchlist.PlayerUserId == player && - !watchlist.Deleted && - (watchlist.ExpirationTime == null || DateTime.UtcNow < watchlist.ExpirationTime) - select watchlist) + where watchlist.PlayerUserId == player && + !watchlist.Deleted && + (watchlist.ExpirationTime == null || DateTime.UtcNow < watchlist.ExpirationTime) + select watchlist) .Include(note => note.Round) .ThenInclude(r => r!.Server) .Include(note => note.CreatedBy) @@ -1428,9 +1430,9 @@ public async Task> GetMessages(Guid player) protected async Task> GetMessagesImpl(DbGuard db, Guid player) { var entities = await (from message in db.DbContext.AdminMessages - where message.PlayerUserId == player && !message.Deleted && - (message.ExpirationTime == null || DateTime.UtcNow < message.ExpirationTime) - select message).Include(note => note.Round) + where message.PlayerUserId == player && !message.Deleted && + (message.ExpirationTime == null || DateTime.UtcNow < message.ExpirationTime) + select message).Include(note => note.Round) .ThenInclude(r => r!.Server) .Include(note => note.CreatedBy) .Include(note => note.LastEditedBy) @@ -1509,7 +1511,7 @@ protected async Task> GetGroupedServerRoleBansAsNo // Client side query, as EF can't do groups yet var bansEnumerable = bansQuery - .GroupBy(ban => new { ban.BanTime, CreatedBy = (Player?)ban.CreatedBy, ban.Reason, Unbanned = ban.Unban == null }) + .GroupBy(ban => new { ban.BanTime, CreatedBy = (Player?) ban.CreatedBy, ban.Reason, Unbanned = ban.Unban == null }) .Select(banGroup => banGroup) .ToArray(); @@ -1577,5 +1579,64 @@ protected abstract class DbGuard : IAsyncDisposable public abstract ValueTask DisposeAsync(); } + + #region Job Whitelists + + public async Task AddJobWhitelist(Guid player, ProtoId job) + { + await using var db = await GetDb(); + var exists = await db.DbContext.RoleWhitelists + .Where(w => w.PlayerUserId == player) + .Where(w => w.RoleId == job.Id) + .AnyAsync(); + + if (exists) + return false; + + var whitelist = new RoleWhitelist + { + PlayerUserId = player, + RoleId = job + }; + db.DbContext.RoleWhitelists.Add(whitelist); + await db.DbContext.SaveChangesAsync(); + return true; + } + + public async Task> GetJobWhitelists(Guid player, CancellationToken cancel) + { + await using var db = await GetDb(cancel); + return await db.DbContext.RoleWhitelists + .Where(w => w.PlayerUserId == player) + .Select(w => w.RoleId) + .ToListAsync(cancellationToken: cancel); + } + + public async Task IsJobWhitelisted(Guid player, ProtoId job) + { + await using var db = await GetDb(); + return await db.DbContext.RoleWhitelists + .Where(w => w.PlayerUserId == player) + .Where(w => w.RoleId == job.Id) + .AnyAsync(); + } + + public async Task RemoveJobWhitelist(Guid player, ProtoId job) + { + await using var db = await GetDb(); + var entry = await db.DbContext.RoleWhitelists + .Where(w => w.PlayerUserId == player) + .Where(w => w.RoleId == job.Id) + .SingleOrDefaultAsync(); + + if (entry == null) + return false; + + db.DbContext.RoleWhitelists.Remove(entry); + await db.DbContext.SaveChangesAsync(); + return true; + } + + #endregion } } diff --git a/Content.Server/Database/ServerDbManager.cs b/Content.Server/Database/ServerDbManager.cs index 01d1526727..a9c5e8c43a 100644 --- a/Content.Server/Database/ServerDbManager.cs +++ b/Content.Server/Database/ServerDbManager.cs @@ -19,6 +19,8 @@ using Robust.Shared.Network; using LogLevel = Robust.Shared.Log.LogLevel; using MSLogLevel = Microsoft.Extensions.Logging.LogLevel; +using Content.Shared.Roles; +using Robust.Shared.Prototypes; namespace Content.Server.Database { @@ -87,7 +89,7 @@ Task> GetServerBansAsync( IPAddress? address, NetUserId? userId, ImmutableArray? hwId, - bool includeUnbanned=true); + bool includeUnbanned = true); Task AddServerBanAsync(ServerBanDef serverBan); Task AddServerUnbanAsync(ServerUnbanDef serverBan); @@ -290,6 +292,18 @@ Task AddConnectionLogAsync( Task MarkMessageAsSeen(int id, bool dismissedToo); #endregion + + #region Job Whitelists + + Task AddJobWhitelist(Guid player, ProtoId job); + + + Task> GetJobWhitelists(Guid player, CancellationToken cancel = default); + Task IsJobWhitelisted(Guid player, ProtoId job); + + Task RemoveJobWhitelist(Guid player, ProtoId job); + + #endregion } public sealed class ServerDbManager : IServerDbManager @@ -421,7 +435,7 @@ public Task> GetServerBansAsync( IPAddress? address, NetUserId? userId, ImmutableArray? hwId, - bool includeUnbanned=true) + bool includeUnbanned = true) { DbReadOpsMetric.Inc(); return RunDbCommand(() => _db.GetServerBansAsync(address, userId, hwId, includeUnbanned)); @@ -792,7 +806,7 @@ public Task AddAdminMessage(int? roundId, Guid player, TimeSpan playtimeAtN return RunDbCommand(() => _db.GetServerRoleBanAsNoteAsync(id)); } - public Task> GetAllAdminRemarks(Guid player) + public Task> GetAllAdminRemarks(Guid player) { DbReadOpsMetric.Inc(); return RunDbCommand(() => _db.GetAllAdminRemarks(player)); @@ -869,6 +883,30 @@ public Task MarkMessageAsSeen(int id, bool dismissedToo) return RunDbCommand(() => _db.MarkMessageAsSeen(id, dismissedToo)); } + public Task AddJobWhitelist(Guid player, ProtoId job) + { + DbWriteOpsMetric.Inc(); + return RunDbCommand(() => _db.AddJobWhitelist(player, job)); + } + + public Task> GetJobWhitelists(Guid player, CancellationToken cancel = default) + { + DbReadOpsMetric.Inc(); + return RunDbCommand(() => _db.GetJobWhitelists(player, cancel)); + } + + public Task IsJobWhitelisted(Guid player, ProtoId job) + { + DbReadOpsMetric.Inc(); + return RunDbCommand(() => _db.IsJobWhitelisted(player, job)); + } + + public Task RemoveJobWhitelist(Guid player, ProtoId job) + { + DbWriteOpsMetric.Inc(); + return RunDbCommand(() => _db.RemoveJobWhitelist(player, job)); + } + // Wrapper functions to run DB commands from the thread pool. // This will avoid SynchronizationContext capturing and avoid running CPU work on the main thread. // For SQLite, this will also enable read parallelization (within limits). diff --git a/Content.Server/Database/UserDbDataManager.cs b/Content.Server/Database/UserDbDataManager.cs index c58c594dba..fde610a6fd 100644 --- a/Content.Server/Database/UserDbDataManager.cs +++ b/Content.Server/Database/UserDbDataManager.cs @@ -1,8 +1,6 @@ using System.Threading; using System.Threading.Tasks; -using Content.Server.Players.PlayTimeTracking; using Content.Server.Preferences.Managers; -using Robust.Server.Player; using Robust.Shared.Network; using Robust.Shared.Player; using Robust.Shared.Utility; @@ -19,11 +17,12 @@ namespace Content.Server.Database; /// public sealed class UserDbDataManager : IPostInjectInit { - [Dependency] private readonly IServerPreferencesManager _prefs = default!; [Dependency] private readonly ILogManager _logManager = default!; - [Dependency] private readonly PlayTimeTrackingManager _playTimeTracking = default!; private readonly Dictionary _users = new(); + private readonly List _onLoadPlayer = []; + private readonly List _onFinishLoad = []; + private readonly List _onPlayerDisconnect = []; private ISawmill _sawmill = default!; @@ -51,8 +50,10 @@ public void ClientDisconnected(ICommonSession session) data.Cancel.Cancel(); data.Cancel.Dispose(); - _prefs.OnClientDisconnected(session); - _playTimeTracking.ClientDisconnected(session); + foreach (var onDisconnect in _onPlayerDisconnect) + { + onDisconnect(session); + } } private async Task Load(ICommonSession session, CancellationToken cancel) @@ -62,12 +63,19 @@ private async Task Load(ICommonSession session, CancellationToken cancel) // As such, this task must NOT throw a non-cancellation error! try { - await Task.WhenAll( - _prefs.LoadData(session, cancel), - _playTimeTracking.LoadData(session, cancel)); + var tasks = new List(); + foreach (var action in _onLoadPlayer) + { + tasks.Add(action(session, cancel)); + } + + await Task.WhenAll(tasks); cancel.ThrowIfCancellationRequested(); - _prefs.FinishLoad(session); + foreach (var action in _onFinishLoad) + { + action(session); + } _sawmill.Verbose($"Load complete for user {session}"); } @@ -123,5 +131,26 @@ void IPostInjectInit.PostInject() _sawmill = _logManager.GetSawmill("userdb"); } + public void AddOnLoadPlayer(OnLoadPlayer action) + { + _onLoadPlayer.Add(action); + } + + public void AddOnFinishLoad(OnFinishLoad action) + { + _onFinishLoad.Add(action); + } + + public void AddOnPlayerDisconnect(OnPlayerDisconnect action) + { + _onPlayerDisconnect.Add(action); + } + private sealed record UserData(CancellationTokenSource Cancel, Task Task); + + public delegate Task OnLoadPlayer(ICommonSession player, CancellationToken cancel); + + public delegate void OnFinishLoad(ICommonSession player); + + public delegate void OnPlayerDisconnect(ICommonSession player); } diff --git a/Content.Server/DeltaV/StationEvents/Components/GlimmerMobRuleComponent.cs b/Content.Server/DeltaV/StationEvents/Components/GlimmerMobRuleComponent.cs deleted file mode 100644 index bde0422a1a..0000000000 --- a/Content.Server/DeltaV/StationEvents/Components/GlimmerMobRuleComponent.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Content.Server.StationEvents.Events; -using Robust.Shared.Prototypes; - -namespace Content.Server.StationEvents.Components; - -[RegisterComponent, Access(typeof(GlimmerMobRule))] -public sealed partial class GlimmerMobRuleComponent : Component -{ - [DataField(required: true)] - public EntProtoId MobPrototype = string.Empty; -} diff --git a/Content.Server/DeltaV/StationEvents/Components/PirateRadioSpawnRuleComponent.cs b/Content.Server/DeltaV/StationEvents/Components/PirateRadioSpawnRuleComponent.cs deleted file mode 100644 index fb4c1751f6..0000000000 --- a/Content.Server/DeltaV/StationEvents/Components/PirateRadioSpawnRuleComponent.cs +++ /dev/null @@ -1,30 +0,0 @@ -using Content.Server.StationEvents.Events; - -namespace Content.Server.StationEvents.Components; - -[RegisterComponent, Access(typeof(PirateRadioSpawnRule))] -public sealed partial class PirateRadioSpawnRuleComponent : Component -{ - [DataField("PirateRadioShuttlePath")] - public string PirateRadioShuttlePath = "Maps/Shuttles/DeltaV/DV-pirateradio.yml"; - - [DataField("additionalRule")] - public EntityUid? AdditionalRule; - - [DataField("debrisCount")] - public int DebrisCount { get; set; } - - [DataField("distanceModifier")] - public float DistanceModifier { get; set; } - - [DataField("debrisDistanceModifier")] - public float DebrisDistanceModifier { get; set; } - - /// - /// "Stations of Unusual Size Constant", derived from the AABB.Width of Shoukou. - /// This Constant is used to check the size of a station relative to the reference point - /// - [DataField("sousk")] - public float SOUSK = 123.44f; - -} diff --git a/Content.Server/DeltaV/StationEvents/Events/GlimmerMobSpawnRule.cs b/Content.Server/DeltaV/StationEvents/Events/GlimmerMobSpawnRule.cs deleted file mode 100644 index c9bf659fd9..0000000000 --- a/Content.Server/DeltaV/StationEvents/Events/GlimmerMobSpawnRule.cs +++ /dev/null @@ -1,88 +0,0 @@ -using System.Linq; -using Content.Server.GameTicking.Components; -using Robust.Shared.Random; -using Content.Server.GameTicking; -using Content.Server.NPC.Components; -using Content.Server.Psionics.Glimmer; -using Content.Server.StationEvents.Components; -using Content.Shared.Psionics.Glimmer; -using Content.Shared.Abilities.Psionics; - -namespace Content.Server.StationEvents.Events; - -public sealed class GlimmerMobRule : StationEventSystem -{ - [Dependency] private readonly IRobustRandom _robustRandom = default!; - [Dependency] private readonly GlimmerSystem _glimmerSystem = default!; - [Dependency] private readonly GameTicker _gameTicker = default!; - - - protected override void Started(EntityUid uid, GlimmerMobRuleComponent component, GameRuleComponent gameRule, GameRuleStartedEvent args) - { - base.Started(uid, component, gameRule, args); - - var station = _gameTicker.GetSpawnableStations(); - if (station is null) - return; - - var glimmerSources = new List<(GlimmerSourceComponent, TransformComponent)>(); - foreach (var source in EntityQuery().ToList()) - { - if (!station.Contains(source.Item2.Owner)) - continue; - - glimmerSources.Add(source); - } - - - var normalSpawnLocations = new List<(VentCritterSpawnLocationComponent, TransformComponent)>(); - foreach (var source in EntityQuery().ToList()) - { - if (!station.Contains(source.Item2.Owner)) - continue; - - normalSpawnLocations.Add(source); - } - - var hiddenSpawnLocations = new List<(MidRoundAntagSpawnLocationComponent, TransformComponent)>(); - foreach (var source in EntityQuery().ToList()) - { - if (!station.Contains(source.Item2.Owner)) - continue; - - hiddenSpawnLocations.Add(source); - } - - var baseCount = Math.Max(1, EntityQuery().Count() / 10); - int multiplier = Math.Max(1, (int) _glimmerSystem.GetGlimmerTier() - 2); - - var total = baseCount * multiplier; - - int i = 0; - while (i < total) - { - if (glimmerSources.Count != 0 && _robustRandom.Prob(0.4f)) - { - Spawn(component.MobPrototype, _robustRandom.Pick(glimmerSources).Item2.Coordinates); - i++; - continue; - } - - if (normalSpawnLocations.Count != 0) - { - Spawn(component.MobPrototype, _robustRandom.Pick(normalSpawnLocations).Item2.Coordinates); - i++; - continue; - } - - if (hiddenSpawnLocations.Count != 0) - { - Spawn(component.MobPrototype, _robustRandom.Pick(hiddenSpawnLocations).Item2.Coordinates); - i++; - continue; - } - - return; - } - } -} diff --git a/Content.Server/DeltaV/StationEvents/Events/PirateRadioSpawnRule.cs b/Content.Server/DeltaV/StationEvents/Events/PirateRadioSpawnRule.cs deleted file mode 100644 index 43e7c3b474..0000000000 --- a/Content.Server/DeltaV/StationEvents/Events/PirateRadioSpawnRule.cs +++ /dev/null @@ -1,96 +0,0 @@ -using Robust.Server.GameObjects; -using Robust.Server.Maps; -using Robust.Shared.Configuration; -using Robust.Shared.Map; -using Robust.Shared.Map.Components; -using Robust.Shared.Prototypes; -using Robust.Shared.Random; -using Robust.Shared.Utility; -using Content.Server.GameTicking; -using Content.Server.GameTicking.Rules.Components; -using Content.Server.StationEvents.Components; -using Content.Server.Station.Components; -using Content.Shared.Salvage; -using Content.Shared.Random.Helpers; -using System.Linq; -using Content.Server.GameTicking.Components; -using Content.Shared.CCVar; - -namespace Content.Server.StationEvents.Events; - -public sealed class PirateRadioSpawnRule : StationEventSystem -{ - [Dependency] private readonly IEntityManager _entities = default!; - [Dependency] private readonly IMapManager _mapManager = default!; - [Dependency] private readonly MapLoaderSystem _map = default!; - [Dependency] private readonly IRobustRandom _random = default!; - [Dependency] private readonly IPrototypeManager _prototypeManager = default!; - [Dependency] private readonly IConfigurationManager _confMan = default!; - - protected override void Started(EntityUid uid, PirateRadioSpawnRuleComponent component, GameRuleComponent gameRule, GameRuleStartedEvent args) - { - //Start of Syndicate Listening Outpost spawning system - base.Started(uid, component, gameRule, args); - var xformQuery = GetEntityQuery(); - var aabbs = EntityQuery().SelectMany(x => - x.Grids.Select(x => - xformQuery.GetComponent(x).WorldMatrix.TransformBox(_entities.GetComponent(x).LocalAABB))) - .ToArray(); - if (aabbs.Length < 1) return; - var aabb = aabbs[0]; - - for (var i = 1; i < aabbs.Length; i++) - { - aabb.Union(aabbs[i]); - } - var distanceFactorCoefficient = component.SOUSK / aabb.Width; - var distanceModifier = Math.Clamp(component.DistanceModifier, 1, 25); - var distanceModifierNormalized = distanceModifier * distanceFactorCoefficient; - var a = MathF.Max(aabb.Height / 2f, aabb.Width / 2f) * distanceModifierNormalized; - var randomoffset = _random.NextVector2(a, a * 2.5f); - var outpostOptions = new MapLoadOptions - { - Offset = aabb.Center + randomoffset, - LoadMap = false, - }; - if (!_map.TryLoad(GameTicker.DefaultMap, component.PirateRadioShuttlePath, out var outpostids, outpostOptions)) return; - //End of Syndicate Listening Outpost spawning system - - //Start of Debris Field Generation - var debrisSpawner = _confMan.GetCVar(CCVars.WorldgenEnabled); - if (debrisSpawner == true) return; - var debrisCount = Math.Clamp(component.DebrisCount, 0, 6); - if (debrisCount == 0) return; - var debrisDistanceModifier = Math.Clamp(component.DebrisDistanceModifier, 3, 10); - foreach (var id in outpostids) - { - if (!TryComp(id, out var grid)) return; - var outpostaabb = _entities.GetComponent(id).WorldMatrix.TransformBox(grid.LocalAABB); - var b = MathF.Max(outpostaabb.Height / 2f, aabb.Width / 2f) * debrisDistanceModifier; - var k = 1; - while (k < debrisCount + 1) - { - var debrisRandomOffset = _random.NextVector2(b, b * 2.5f); - var randomer = _random.NextVector2(b, b * 5f); //Second random vector to ensure the outpost isn't perfectly centered in the debris field - var debrisOptions = new MapLoadOptions - { - Offset = outpostaabb.Center + debrisRandomOffset + randomer, - LoadMap = false, - }; - - var salvageProto = _random.Pick(_prototypeManager.EnumeratePrototypes().ToList()); - _map.TryLoad(GameTicker.DefaultMap, salvageProto.MapPath.ToString(), out _, debrisOptions); - k++; - } - } - //End of Debris Field generation - } - - protected override void Ended(EntityUid uid, PirateRadioSpawnRuleComponent component, GameRuleComponent gameRule, GameRuleEndedEvent args) - { - base.Ended(uid, component, gameRule, args); - - if (component.AdditionalRule != null) - GameTicker.EndGameRule(component.AdditionalRule.Value); - } -} diff --git a/Content.Server/Ensnaring/EnsnareableSystem.cs b/Content.Server/Ensnaring/EnsnareableSystem.cs index f939e087e0..7b810b4f49 100644 --- a/Content.Server/Ensnaring/EnsnareableSystem.cs +++ b/Content.Server/Ensnaring/EnsnareableSystem.cs @@ -14,7 +14,7 @@ public sealed partial class EnsnareableSystem : SharedEnsnareableSystem [Dependency] private readonly ContainerSystem _container = default!; [Dependency] private readonly SharedHandsSystem _hands = default!; [Dependency] private readonly PopupSystem _popup = default!; - + public override void Initialize() { base.Initialize(); @@ -48,8 +48,11 @@ private void OnDoAfter(EntityUid uid, EnsnareableComponent component, DoAfterEve Dirty(component); ensnaring.Ensnared = null; - _hands.PickupOrDrop(args.Args.User, args.Args.Used.Value); - + if (ensnaring.DestroyOnRemove) + QueueDel(args.Args.Used); + else + _hands.PickupOrDrop(args.Args.User, args.Args.Used.Value); + _popup.PopupEntity(Loc.GetString("ensnare-component-try-free-complete", ("ensnare", args.Args.Used)), uid, uid, PopupType.Medium); UpdateAlert(args.Args.Target.Value, component); diff --git a/Content.Server/Entry/EntryPoint.cs b/Content.Server/Entry/EntryPoint.cs index 48a6597349..dda783c432 100644 --- a/Content.Server/Entry/EntryPoint.cs +++ b/Content.Server/Entry/EntryPoint.cs @@ -14,6 +14,7 @@ using Content.Server.GuideGenerator; using Content.Server.Info; using Content.Server.IoC; +using Content.Server.Players.JobWhitelist; using Content.Server.Maps; using Content.Server.NodeContainer.NodeGroups; using Content.Server.Players.PlayTimeTracking; @@ -111,6 +112,7 @@ public override void Init() _voteManager.Initialize(); _updateManager.Initialize(); _playTimeTracking.Initialize(); + IoCManager.Resolve().Initialize(); } } diff --git a/Content.Server/Execution/ExecutionSystem.cs b/Content.Server/Execution/ExecutionSystem.cs index 326aa1d6a4..c1080b84ad 100644 --- a/Content.Server/Execution/ExecutionSystem.cs +++ b/Content.Server/Execution/ExecutionSystem.cs @@ -281,7 +281,7 @@ private void OnDoafterGun(EntityUid uid, GunComponent component, DoAfterEvent ar var prevention = new ShotAttemptedEvent { User = attacker, - Used = weapon + Used = new Entity(uid, component) }; RaiseLocalEvent(weapon, ref prevention); diff --git a/Content.Server/GameTicking/Events/GetDisallowedJobsEvent.cs b/Content.Server/GameTicking/Events/GetDisallowedJobsEvent.cs new file mode 100644 index 0000000000..cd15cfb8f8 --- /dev/null +++ b/Content.Server/GameTicking/Events/GetDisallowedJobsEvent.cs @@ -0,0 +1,8 @@ +using Content.Shared.Roles; +using Robust.Shared.Player; +using Robust.Shared.Prototypes; + +namespace Content.Server.GameTicking.Events; + +[ByRefEvent] +public readonly record struct GetDisallowedJobsEvent(ICommonSession Player, HashSet> Jobs); diff --git a/Content.Server/GameTicking/Events/IsJobAllowedEvent.cs b/Content.Server/GameTicking/Events/IsJobAllowedEvent.cs new file mode 100644 index 0000000000..51969d61ea --- /dev/null +++ b/Content.Server/GameTicking/Events/IsJobAllowedEvent.cs @@ -0,0 +1,13 @@ +using Content.Shared.Roles; +using Robust.Shared.Player; +using Robust.Shared.Prototypes; + +namespace Content.Server.GameTicking.Events; + +[ByRefEvent] +public struct IsJobAllowedEvent(ICommonSession player, ProtoId jobId, bool cancelled = false) +{ + public readonly ICommonSession Player = player; + public readonly ProtoId JobId = jobId; + public bool Cancelled = cancelled; +} diff --git a/Content.Server/GameTicking/GameTicker.Spawning.cs b/Content.Server/GameTicking/GameTicker.Spawning.cs index 074c2d6a69..2e526b4d13 100644 --- a/Content.Server/GameTicking/GameTicker.Spawning.cs +++ b/Content.Server/GameTicking/GameTicker.Spawning.cs @@ -2,6 +2,7 @@ using System.Linq; using System.Numerics; using Content.Server.Administration.Managers; +using Content.Server.GameTicking.Events; using Content.Server.Ghost; using Content.Server.Spawners.Components; using Content.Server.Speech.Components; @@ -138,8 +139,14 @@ private void SpawnPlayer(ICommonSession player, if (jobBans == null || jobId != null && jobBans.Contains(jobId)) return; - if (jobId != null && !_playTimeTrackings.IsAllowed(player, jobId)) - return; + if (jobId != null) + { + var ev = new IsJobAllowedEvent(player, new ProtoId(jobId)); + RaiseLocalEvent(ref ev); + if (ev.Cancelled) + return; + } + SpawnPlayer(player, character, station, jobId, lateJoin, silent); } @@ -196,10 +203,9 @@ private void SpawnPlayer(ICommonSession player, } // Figure out job restrictions - var restrictedRoles = new HashSet(); - - var getDisallowed = _playTimeTrackings.GetDisallowedJobs(player); - restrictedRoles.UnionWith(getDisallowed); + var restrictedRoles = new HashSet>(); + var ev = new GetDisallowedJobsEvent(player, restrictedRoles); + RaiseLocalEvent(ref ev); var jobBans = _banManager.GetJobBans(player.UserId); if (jobBans != null) @@ -233,7 +239,7 @@ private void SpawnPlayer(ICommonSession player, _mind.SetUserId(newMind, data.UserId); var jobPrototype = _prototypeManager.Index(jobId); - var job = new JobComponent {Prototype = jobId}; + var job = new JobComponent { Prototype = jobId }; _roles.MindAddRole(newMind, job, silent: silent); var jobName = _jobs.MindTryGetJobName(newMind); diff --git a/Content.Server/IoC/ServerContentIoC.cs b/Content.Server/IoC/ServerContentIoC.cs index bc39997735..7c15014133 100644 --- a/Content.Server/IoC/ServerContentIoC.cs +++ b/Content.Server/IoC/ServerContentIoC.cs @@ -13,6 +13,7 @@ using Content.Server.GhostKick; using Content.Server.Info; using Content.Server.Maps; +using Content.Server.Players.JobWhitelist; using Content.Server.MoMMI; using Content.Server.NodeContainer.NodeGroups; using Content.Server.Players.PlayTimeTracking; @@ -61,6 +62,7 @@ public static void Register() IoCManager.Register(); IoCManager.Register(); IoCManager.Register(); + IoCManager.Register(); IoCManager.Register(); IoCManager.Register(); IoCManager.Register(); diff --git a/Content.Server/LifeDrainer/LifeDrainerComponent.cs b/Content.Server/LifeDrainer/LifeDrainerComponent.cs new file mode 100644 index 0000000000..c5d09266c7 --- /dev/null +++ b/Content.Server/LifeDrainer/LifeDrainerComponent.cs @@ -0,0 +1,60 @@ +using Content.Shared.Damage; +using Content.Shared.DoAfter; +using Content.Shared.Whitelist; +using Robust.Shared.Audio; + +namespace Content.Server.LifeDrainer; + +/// +/// Adds a verb to drain life from a crit mob that matches a whitelist. +/// Successfully draining a mob rejuvenates you completely. +/// +[RegisterComponent, Access(typeof(LifeDrainerSystem))] +public sealed partial class LifeDrainerComponent : Component +{ + /// + /// Damage to give to the target when draining is complete + /// + [DataField(required: true)] + public DamageSpecifier Damage = new(); + + /// + /// Mobs have to match this whitelist to be drained. + /// + [DataField] + public EntityWhitelist? Whitelist; + + /// + /// The time that it takes to drain an entity. + /// + [DataField] + public TimeSpan Delay = TimeSpan.FromSeconds(8.35f); + + /// + /// Sound played while draining a mob. + /// + [DataField] + public SoundSpecifier DrainSound = new SoundPathSpecifier("/Audio/DeltaV/Effects/clang2.ogg"); + + /// + /// Sound played after draining is complete. + /// + [DataField] + public SoundSpecifier FinishSound = new SoundPathSpecifier("/Audio/Effects/guardian_inject.ogg"); + + [DataField] + public EntityUid? DrainStream; + + /// + /// A current drain doafter in progress. + /// + [DataField] + public DoAfterId? DoAfter; + + /// + /// What mob is being targeted for draining. + /// When draining stops the AI will try to drain this target again until successful. + /// + [DataField] + public EntityUid? Target; +} diff --git a/Content.Server/LifeDrainer/LifeDrainerSystem.cs b/Content.Server/LifeDrainer/LifeDrainerSystem.cs new file mode 100644 index 0000000000..900438ff71 --- /dev/null +++ b/Content.Server/LifeDrainer/LifeDrainerSystem.cs @@ -0,0 +1,143 @@ +using Content.Server.Carrying; +using Content.Server.NPC.Systems; +using Content.Shared.ActionBlocker; +using Content.Shared.Damage; +using Content.Shared.DoAfter; +using Content.Shared.Interaction; +using Content.Shared.Mobs.Systems; +using Content.Shared.Movement.Pulling.Components; +using Content.Shared.Popups; +using Content.Shared.Rejuvenate; +using Content.Shared.Verbs; +using Content.Shared.Whitelist; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Player; +using Robust.Shared.Utility; + +namespace Content.Server.LifeDrainer; + +public sealed class LifeDrainerSystem : EntitySystem +{ + [Dependency] private readonly ActionBlockerSystem _actionBlocker = default!; + [Dependency] private readonly DamageableSystem _damageable = default!; + [Dependency] private readonly EntityWhitelistSystem _whitelist = default!; + [Dependency] private readonly MobStateSystem _mob = default!; + [Dependency] private readonly NpcFactionSystem _faction = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; + [Dependency] private readonly SharedInteractionSystem _interaction = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent>(OnGetVerbs); + SubscribeLocalEvent(OnDrain); + } + + private void OnGetVerbs(Entity ent, ref GetVerbsEvent args) + { + var target = args.Target; + if (!args.CanAccess || !args.CanInteract || !CanDrain(ent, target)) + return; + + args.Verbs.Add(new InnateVerb() + { + Act = () => + { + TryDrain(ent, target); + }, + Text = Loc.GetString("verb-life-drain"), + Icon = new SpriteSpecifier.Texture(new ("/Textures/Nyanotrasen/Icons/verbiconfangs.png")), + Priority = 2 + }); + } + + private void OnDrain(Entity ent, ref LifeDrainDoAfterEvent args) + { + var (uid, comp) = ent; + CancelDrain(comp); + if (args.Handled || args.Args.Target is not {} target) + return; + + // attack whoever interrupted the draining + if (args.Cancelled) + { + // someone pulled the psionic away + if (TryComp(target, out var pullable) && pullable.Puller is {} puller) + _faction.AggroEntity(uid, puller); + + // someone pulled me away + if (TryComp(ent, out pullable) && pullable.Puller is {} selfPuller) + _faction.AggroEntity(uid, selfPuller); + + // someone carried the psionic away + if (TryComp(target, out var carried)) + _faction.AggroEntity(uid, carried.Carrier); + + return; + } + + _popup.PopupEntity(Loc.GetString("life-drain-second-end", ("drainer", uid)), target, target, PopupType.LargeCaution); + _popup.PopupEntity(Loc.GetString("life-drain-third-end", ("drainer", uid), ("target", target)), target, Filter.PvsExcept(target), true, PopupType.LargeCaution); + + var rejuv = new RejuvenateEvent(); + RaiseLocalEvent(uid, rejuv); + + _audio.PlayPvs(comp.FinishSound, uid); + + _damageable.TryChangeDamage(target, comp.Damage, true, origin: uid); + } + + public bool CanDrain(Entity ent, EntityUid target) + { + var (uid, comp) = ent; + return !IsDraining(comp) + && uid != target + && (comp.Whitelist is null || _whitelist.IsValid(comp.Whitelist, target)) + && _mob.IsCritical(target); + } + + public bool IsDraining(LifeDrainerComponent comp) + { + return _doAfter.GetStatus(comp.DoAfter) == DoAfterStatus.Running; + } + + public bool TryDrain(Entity ent, EntityUid target) + { + var (uid, comp) = ent; + if (!CanDrain(ent, target) || !_actionBlocker.CanInteract(uid, target) || !_interaction.InRangeUnobstructed(ent, target, popup: true)) + return false; + + _popup.PopupEntity(Loc.GetString("life-drain-second-start", ("drainer", uid)), target, target, PopupType.LargeCaution); + _popup.PopupEntity(Loc.GetString("life-drain-third-start", ("drainer", uid), ("target", target)), target, Filter.PvsExcept(target), true, PopupType.LargeCaution); + + if (_audio.PlayPvs(comp.DrainSound, target) is {} stream) + comp.DrainStream = stream.Item1; + + var ev = new LifeDrainDoAfterEvent(); + var args = new DoAfterArgs(EntityManager, uid, comp.Delay, ev, target: target, eventTarget: uid) + { + BreakOnTargetMove = true, + BreakOnUserMove = true, + MovementThreshold = 2f, + NeedHand = false + }; + + if (!_doAfter.TryStartDoAfter(args, out var id)) + return false; + + comp.DoAfter = id; + comp.Target = target; + return true; + } + + public void CancelDrain(LifeDrainerComponent comp) + { + comp.DrainStream = _audio.Stop(comp.DrainStream); + _doAfter.Cancel(comp.DoAfter); + comp.DoAfter = null; + comp.Target = null; + } +} diff --git a/Content.Server/Medical/PenLightSystem.cs b/Content.Server/Medical/PenLightSystem.cs index 29cb4888eb..f1df356cab 100644 --- a/Content.Server/Medical/PenLightSystem.cs +++ b/Content.Server/Medical/PenLightSystem.cs @@ -99,11 +99,10 @@ public bool TryStartExam(EntityUid uid, EntityUid target, EntityUid user, PenLig } private void OpenUserInterface(EntityUid user, EntityUid penlight) { - if (!TryComp(user, out var actor) - || !_uiSystem.TryGetOpenUi(penlight, PenLightUiKey.Key, out var ui)) + if (!_uiSystem.HasUi(penlight, PenLightUiKey.Key)) return; - _uiSystem.OpenUi(ui.Owner, ui.UiKey, actor.PlayerSession); + _uiSystem.OpenUi(penlight, PenLightUiKey.Key, user); } /// @@ -111,7 +110,7 @@ private void OpenUserInterface(EntityUid user, EntityUid penlight) /// private void Diagnose(EntityUid penlight, EntityUid target) { - if (!_uiSystem.TryGetOpenUi(penlight, PenLightUiKey.Key, out var ui) + if (!_uiSystem.HasUi(penlight, PenLightUiKey.Key) || !HasComp(target) || !HasComp(target)) return; @@ -136,8 +135,8 @@ private void Diagnose(EntityUid penlight, EntityUid target) var healthy = !(blind || drunk || eyeDamage || seeingRainbows); _uiSystem.ServerSendUiMessage( - ui.Owner, - ui.UiKey, + penlight, + PenLightUiKey.Key, new PenLightUserMessage(GetNetEntity(target), blind, drunk, diff --git a/Content.Server/NPC/Components/NPCRetaliationComponent.cs b/Content.Server/NPC/Components/NPCRetaliationComponent.cs index c0bf54d76e..21b806c448 100644 --- a/Content.Server/NPC/Components/NPCRetaliationComponent.cs +++ b/Content.Server/NPC/Components/NPCRetaliationComponent.cs @@ -21,4 +21,10 @@ public sealed partial class NPCRetaliationComponent : Component /// todo: this needs to support timeoffsetserializer at some point [DataField("attackMemories")] public Dictionary AttackMemories = new(); + + /// + /// Whether this NPC will retaliate against a "Friendly" NPC. + /// + [DataField] + public bool RetaliateFriendlies; } diff --git a/Content.Server/NPC/Components/NpcFactionMemberComponent.cs b/Content.Server/NPC/Components/NpcFactionMemberComponent.cs index ce7e59ea2c..f38d8cca0f 100644 --- a/Content.Server/NPC/Components/NpcFactionMemberComponent.cs +++ b/Content.Server/NPC/Components/NpcFactionMemberComponent.cs @@ -4,7 +4,6 @@ namespace Content.Server.NPC.Components { [RegisterComponent] - [Access(typeof(NpcFactionSystem))] public sealed partial class NpcFactionMemberComponent : Component { /// diff --git a/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Interactions/DrainOperator.cs b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Interactions/DrainOperator.cs new file mode 100644 index 0000000000..ecb6e16c9d --- /dev/null +++ b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Interactions/DrainOperator.cs @@ -0,0 +1,50 @@ +using Content.Server.LifeDrainer; + +namespace Content.Server.NPC.HTN.PrimitiveTasks.Operators.Interactions; + +public sealed partial class DrainOperator : HTNOperator +{ + [Dependency] private readonly IEntityManager _entMan = default!; + + private LifeDrainerSystem _drainer = default!; + private EntityQuery _drainerQuery; + + [DataField(required: true)] + public string DrainKey = string.Empty; + + public override void Initialize(IEntitySystemManager sysManager) + { + base.Initialize(sysManager); + + _drainer = sysManager.GetEntitySystem(); + _drainerQuery = _entMan.GetEntityQuery(); + } + + public override HTNOperatorStatus Update(NPCBlackboard blackboard, float frameTime) + { + var owner = blackboard.GetValue(NPCBlackboard.Owner); + var target = blackboard.GetValue(DrainKey); + + if (_entMan.Deleted(target)) + return HTNOperatorStatus.Failed; + + if (!_drainerQuery.TryComp(owner, out var wisp)) + return HTNOperatorStatus.Failed; + + // still draining hold your horses + if (_drainer.IsDraining(wisp)) + return HTNOperatorStatus.Continuing; + + // not draining and no target set, start to drain + if (wisp.Target == null) + { + return _drainer.TryDrain((owner, wisp), target) + ? HTNOperatorStatus.Continuing + : HTNOperatorStatus.Failed; + } + + // stopped draining, clean up and find another one after + _drainer.CancelDrain(wisp); + return HTNOperatorStatus.Finished; + } +} diff --git a/Content.Server/NPC/HTN/PrimitiveTasks/Operators/PickDrainTargetOperator.cs b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/PickDrainTargetOperator.cs new file mode 100644 index 0000000000..52c12777aa --- /dev/null +++ b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/PickDrainTargetOperator.cs @@ -0,0 +1,74 @@ +using System.Threading; +using System.Threading.Tasks; +using Content.Server.LifeDrainer; +using Content.Server.NPC.Pathfinding; +using Content.Server.NPC.Systems; + +namespace Content.Server.NPC.HTN.PrimitiveTasks.Operators; + +public sealed partial class PickDrainTargetOperator : HTNOperator +{ + [Dependency] private readonly IEntityManager _entMan = default!; + + private LifeDrainerSystem _drainer = default!; + private NpcFactionSystem _faction = default!; + private PathfindingSystem _pathfinding = default!; + + private EntityQuery _drainerQuery; + private EntityQuery _xformQuery; + + [DataField(required: true)] public string + RangeKey = string.Empty, + TargetKey = string.Empty, + DrainKey = string.Empty; + + /// + /// Where the pathfinding result will be stored (if applicable). This gets removed after execution. + /// + [DataField] + public string PathfindKey = NPCBlackboard.PathfindKey; + + public override void Initialize(IEntitySystemManager sysMan) + { + base.Initialize(sysMan); + + _drainer = sysMan.GetEntitySystem(); + _faction = sysMan.GetEntitySystem(); + _pathfinding = sysMan.GetEntitySystem(); + + _drainerQuery = _entMan.GetEntityQuery(); + _xformQuery = _entMan.GetEntityQuery(); + } + + public override async Task<(bool Valid, Dictionary? Effects)> Plan(NPCBlackboard blackboard, CancellationToken cancelToken) { + var owner = blackboard.GetValue(NPCBlackboard.Owner); + if (!_drainerQuery.TryComp(owner, out var drainer)) + return (false, null); + + var ent = (owner, drainer); + if (!blackboard.TryGetValue(RangeKey, out var range, _entMan)) + return (false, null); + + // find crit psionics nearby + foreach (var target in _faction.GetNearbyHostiles(owner, range)) + { + if (!_drainer.CanDrain(ent, target) || !_xformQuery.TryComp(target, out var xform)) + continue; + + // pathfind to the first crit psionic in range to start draining + var targetCoords = xform.Coordinates; + var path = await _pathfinding.GetPath(owner, target, range, cancelToken); + if (path.Result != PathResult.Path) + continue; + + return (true, new Dictionary() + { + { TargetKey, targetCoords }, + { DrainKey, target }, + { PathfindKey, path } + }); + } + + return (false, null); + } +} diff --git a/Content.Server/NPC/Systems/NPCRetaliationSystem.cs b/Content.Server/NPC/Systems/NPCRetaliationSystem.cs index cde8decefc..a855c9915a 100644 --- a/Content.Server/NPC/Systems/NPCRetaliationSystem.cs +++ b/Content.Server/NPC/Systems/NPCRetaliationSystem.cs @@ -47,7 +47,8 @@ public bool TryRetaliate(EntityUid uid, EntityUid target, NPCRetaliationComponen if (!HasComp(target)) return false; - if (_npcFaction.IsEntityFriendly(uid, target)) + if (!component.RetaliateFriendlies + && _npcFaction.IsEntityFriendly(uid, target)) return false; _npcFaction.AggroEntity(uid, target); diff --git a/Content.Server/Nyanotrasen/Psionics/NPC/PsionicNpcCombatSystem.cs b/Content.Server/Nyanotrasen/Psionics/NPC/PsionicNpcCombatSystem.cs new file mode 100644 index 0000000000..9caef36a75 --- /dev/null +++ b/Content.Server/Nyanotrasen/Psionics/NPC/PsionicNpcCombatSystem.cs @@ -0,0 +1,51 @@ +using Content.Shared.Abilities.Psionics; +using Content.Shared.Actions; +using Content.Server.NPC.Events; +using Content.Server.NPC.Components; +using Content.Server.Abilities.Psionics; +using Content.Shared.Psionics; +using Robust.Shared.Prototypes; +using Robust.Shared.Timing; +using Robust.Shared.Utility; + +namespace Content.Server.Psionics.NPC; + +// TODO this is nyanotrasen shitcode. It works, but it needs to be refactored to be more generic. +public sealed class PsionicNpcCombatSystem : EntitySystem +{ + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly IPrototypeManager _protoMan = default!; + [Dependency] private readonly SharedActionsSystem _actions = default!; + + private static readonly ProtoId NoosphericZapProto = "NoosphericZapPower"; + private PsionicPowerPrototype NoosphericZap = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(ZapCombat); + + NoosphericZap = _protoMan.Index(NoosphericZapProto); + DebugTools.Assert(NoosphericZap.Actions.Count == 1, "I can't account for this, so it's your problem now"); + } + + private void ZapCombat(Entity ent, ref NPCSteeringEvent args) + { + PsionicComponent? psionics = null; + if (!Resolve(ent, ref psionics, logMissing: true) + || !psionics.Actions.TryGetValue(NoosphericZap.Actions[0], out var action) + || action is null) + return; + + var actionTarget = Comp(action.Value); + if (actionTarget.Cooldown is {} cooldown && cooldown.End > _timing.CurTime + || !TryComp(ent, out var combat) + || !_actions.ValidateEntityTarget(ent, combat.Target, (action.Value, actionTarget)) + || actionTarget.Event is not {} ev) + return; + + ev.Target = combat.Target; + _actions.PerformAction(ent, null, action.Value, actionTarget, ev, _timing.CurTime, predicted: false); + } +} diff --git a/Content.Server/Players/JobWhitelist/JobWhitelistManager.cs b/Content.Server/Players/JobWhitelist/JobWhitelistManager.cs new file mode 100644 index 0000000000..04289a4098 --- /dev/null +++ b/Content.Server/Players/JobWhitelist/JobWhitelistManager.cs @@ -0,0 +1,114 @@ +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Content.Server.Database; +using Content.Shared.CCVar; +using Content.Shared.Players.JobWhitelist; +using Content.Shared.Roles; +using Robust.Server.Player; +using Robust.Shared.Configuration; +using Robust.Shared.Network; +using Robust.Shared.Player; +using Robust.Shared.Prototypes; +using Serilog; + +namespace Content.Server.Players.JobWhitelist; + +public sealed class JobWhitelistManager : IPostInjectInit +{ + [Dependency] private readonly IConfigurationManager _config = default!; + [Dependency] private readonly IServerDbManager _db = default!; + [Dependency] private readonly INetManager _net = default!; + [Dependency] private readonly IPlayerManager _player = default!; + [Dependency] private readonly IPrototypeManager _prototypes = default!; + [Dependency] private readonly UserDbDataManager _userDb = default!; + + private readonly Dictionary> _whitelists = new(); + + public void Initialize() + { + _net.RegisterNetMessage(); + } + + private async Task LoadData(ICommonSession session, CancellationToken cancel) + { + var whitelists = await _db.GetJobWhitelists(session.UserId, cancel); + cancel.ThrowIfCancellationRequested(); + _whitelists[session.UserId] = whitelists.ToHashSet(); + } + + private void FinishLoad(ICommonSession session) + { + SendJobWhitelist(session); + } + + private void ClientDisconnected(ICommonSession session) + { + _whitelists.Remove(session.UserId); + } + + public async void AddWhitelist(NetUserId player, ProtoId job) + { + if (_whitelists.TryGetValue(player, out var whitelists)) + whitelists.Add(job); + + await _db.AddJobWhitelist(player, job); + + if (_player.TryGetSessionById(player, out var session)) + SendJobWhitelist(session); + } + + public bool IsAllowed(ICommonSession session, ProtoId job) + { + if (!_config.GetCVar(CCVars.GameRoleWhitelist)) + return true; + + if (!_prototypes.TryIndex(job, out var jobPrototype) || + !jobPrototype.Whitelisted) + { + return true; + } + + return IsWhitelisted(session.UserId, job); + } + + public bool IsWhitelisted(NetUserId player, ProtoId job) + { + if (!_whitelists.TryGetValue(player, out var whitelists)) + { + Log.Error("Unable to check if player {Player} is whitelisted for {Job}. Stack trace:\\n{StackTrace}", + player, + job, + Environment.StackTrace); + return false; + } + + return whitelists.Contains(job); + } + + public async void RemoveWhitelist(NetUserId player, ProtoId job) + { + _whitelists.GetValueOrDefault(player)?.Remove(job); + await _db.RemoveJobWhitelist(player, job); + + if (_player.TryGetSessionById(new NetUserId(player), out var session)) + SendJobWhitelist(session); + } + + public void SendJobWhitelist(ICommonSession player) + { + var msg = new MsgJobWhitelist + { + Whitelist = _whitelists.GetValueOrDefault(player.UserId) ?? new HashSet() + }; + + _net.ServerSendMessage(msg, player.Channel); + } + + void IPostInjectInit.PostInject() + { + _userDb.AddOnLoadPlayer(LoadData); + _userDb.AddOnFinishLoad(FinishLoad); + _userDb.AddOnPlayerDisconnect(ClientDisconnected); + } +} diff --git a/Content.Server/Players/JobWhitelist/JobWhitelistSystem.cs b/Content.Server/Players/JobWhitelist/JobWhitelistSystem.cs new file mode 100644 index 0000000000..aaada99dea --- /dev/null +++ b/Content.Server/Players/JobWhitelist/JobWhitelistSystem.cs @@ -0,0 +1,83 @@ +using System.Collections.Immutable; +using Content.Server.GameTicking.Events; +using Content.Server.Station.Events; +using Content.Shared.CCVar; +using Content.Shared.Roles; +using Robust.Server.Player; +using Robust.Shared.Configuration; +using Robust.Shared.Prototypes; +using Robust.Shared.Utility; + +namespace Content.Server.Players.JobWhitelist; + +public sealed class JobWhitelistSystem : EntitySystem +{ + [Dependency] private readonly IConfigurationManager _config = default!; + [Dependency] private readonly JobWhitelistManager _manager = default!; + [Dependency] private readonly IPlayerManager _player = default!; + [Dependency] private readonly IPrototypeManager _prototypes = default!; + + private ImmutableArray> _whitelistedJobs = []; + + public override void Initialize() + { + SubscribeLocalEvent(OnPrototypesReloaded); + SubscribeLocalEvent(OnStationJobsGetCandidates); + SubscribeLocalEvent(OnIsJobAllowed); + SubscribeLocalEvent(OnGetDisallowedJobs); + + CacheJobs(); + } + + private void OnPrototypesReloaded(PrototypesReloadedEventArgs ev) + { + if (ev.WasModified()) + CacheJobs(); + } + + private void OnStationJobsGetCandidates(ref StationJobsGetCandidatesEvent ev) + { + if (!_config.GetCVar(CCVars.GameRoleWhitelist)) + return; + + for (var i = ev.Jobs.Count - 1; i >= 0; i--) + { + var jobId = ev.Jobs[i]; + if (_player.TryGetSessionById(ev.Player, out var player) && + !_manager.IsAllowed(player, jobId)) + { + ev.Jobs.RemoveSwap(i); + } + } + } + + private void OnIsJobAllowed(ref IsJobAllowedEvent ev) + { + if (!_manager.IsAllowed(ev.Player, ev.JobId)) + ev.Cancelled = true; + } + + private void OnGetDisallowedJobs(ref GetDisallowedJobsEvent ev) + { + if (!_config.GetCVar(CCVars.GameRoleWhitelist)) + return; + + foreach (var job in _whitelistedJobs) + { + if (!_manager.IsAllowed(ev.Player, job)) + ev.Jobs.Add(job); + } + } + + private void CacheJobs() + { + var builder = ImmutableArray.CreateBuilder>(); + foreach (var job in _prototypes.EnumeratePrototypes()) + { + if (job.Whitelisted) + builder.Add(job.ID); + } + + _whitelistedJobs = builder.ToImmutable(); + } +} diff --git a/Content.Server/Players/PlayTimeTracking/PlayTimeTrackingManager.cs b/Content.Server/Players/PlayTimeTracking/PlayTimeTrackingManager.cs index 943b4cf786..295d11f898 100644 --- a/Content.Server/Players/PlayTimeTracking/PlayTimeTrackingManager.cs +++ b/Content.Server/Players/PlayTimeTracking/PlayTimeTrackingManager.cs @@ -55,7 +55,7 @@ namespace Content.Server.Players.PlayTimeTracking; /// Operations like refreshing and sending play time info to clients are deferred until the next frame (note: not tick). /// /// -public sealed partial class PlayTimeTrackingManager : ISharedPlaytimeManager +public sealed partial class PlayTimeTrackingManager : ISharedPlaytimeManager, IPostInjectInit { [Dependency] private readonly IServerDbManager _db = default!; [Dependency] private readonly IServerNetManager _net = default!; @@ -63,6 +63,7 @@ public sealed partial class PlayTimeTrackingManager : ISharedPlaytimeManager [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly ITaskManager _task = default!; [Dependency] private readonly IRuntimeLog _runtimeLog = default!; + [Dependency] private readonly UserDbDataManager _userDb = default!; private ISawmill _sawmill = default!; @@ -456,4 +457,10 @@ private sealed class PlayTimeData /// public readonly HashSet DbTrackersDirty = new(); } + + void IPostInjectInit.PostInject() + { + _userDb.AddOnLoadPlayer(LoadData); + _userDb.AddOnPlayerDisconnect(ClientDisconnected); + } } diff --git a/Content.Server/Players/PlayTimeTracking/PlayTimeTrackingSystem.cs b/Content.Server/Players/PlayTimeTracking/PlayTimeTrackingSystem.cs index 14eefbd6b8..ba7b9f3c37 100644 --- a/Content.Server/Players/PlayTimeTracking/PlayTimeTrackingSystem.cs +++ b/Content.Server/Players/PlayTimeTracking/PlayTimeTrackingSystem.cs @@ -4,7 +4,9 @@ using Content.Server.Afk; using Content.Server.Afk.Events; using Content.Server.GameTicking; +using Content.Server.GameTicking.Events; using Content.Server.Mind; +using Content.Server.Station.Events; using Content.Server.Preferences.Managers; using Content.Shared.CCVar; using Content.Shared.Customization.Systems; @@ -15,7 +17,6 @@ using Content.Shared.Players.PlayTimeTracking; using Content.Shared.Preferences; using Content.Shared.Roles; -using Robust.Server.GameObjects; using Robust.Server.Player; using Robust.Shared.Configuration; using Robust.Shared.Network; @@ -57,6 +58,9 @@ public override void Initialize() SubscribeLocalEvent(OnUnAFK); SubscribeLocalEvent(OnMobStateChanged); SubscribeLocalEvent(OnPlayerJoinedLobby); + SubscribeLocalEvent(OnStationJobsGetCandidates); + SubscribeLocalEvent(OnIsJobAllowed); + SubscribeLocalEvent(OnGetDisallowedJobs); _adminManager.OnPermsChanged += AdminPermsChanged; } @@ -174,6 +178,22 @@ private void OnMobStateChanged(MobStateChangedEvent ev) _tracking.QueueRefreshTrackers(actor.PlayerSession); } + private void OnStationJobsGetCandidates(ref StationJobsGetCandidatesEvent ev) + { + RemoveDisallowedJobs(ev.Player, ev.Jobs); + } + + private void OnIsJobAllowed(ref IsJobAllowedEvent ev) + { + if (!IsAllowed(ev.Player, ev.JobId)) + ev.Cancelled = true; + } + + private void OnGetDisallowedJobs(ref GetDisallowedJobsEvent ev) + { + ev.Jobs.UnionWith(GetDisallowedJobs(ev.Player)); + } + private void OnPlayerJoinedLobby(PlayerJoinedLobbyEvent ev) { _tracking.QueueRefreshTrackers(ev.PlayerSession); @@ -210,9 +230,9 @@ public bool IsAllowed(ICommonSession player, string role) out _); } - public HashSet GetDisallowedJobs(ICommonSession player) + public HashSet> GetDisallowedJobs(ICommonSession player) { - var roles = new HashSet(); + var roles = new HashSet>(); if (!_cfg.GetCVar(CCVars.GameRoleTimers)) return roles; @@ -251,7 +271,7 @@ public HashSet GetDisallowedJobs(ICommonSession player) return roles; } - public void RemoveDisallowedJobs(NetUserId userId, ref List jobs) + public void RemoveDisallowedJobs(NetUserId userId, List> jobs) { if (!_cfg.GetCVar(CCVars.GameRoleTimers)) return; @@ -270,7 +290,7 @@ public void RemoveDisallowedJobs(NetUserId userId, ref List jobs) { var job = jobs[i]; - if (!_prototypes.TryIndex(job, out var jobber) || + if (!_prototypes.TryIndex(job, out var jobber) || jobber.Requirements == null || jobber.Requirements.Count == 0) continue; diff --git a/Content.Server/Preferences/Managers/ServerPreferencesManager.cs b/Content.Server/Preferences/Managers/ServerPreferencesManager.cs index 052eccb280..df7bac72e9 100644 --- a/Content.Server/Preferences/Managers/ServerPreferencesManager.cs +++ b/Content.Server/Preferences/Managers/ServerPreferencesManager.cs @@ -18,7 +18,7 @@ namespace Content.Server.Preferences.Managers /// Sends before the client joins the lobby. /// Receives and at any time. /// - public sealed class ServerPreferencesManager : IServerPreferencesManager + public sealed class ServerPreferencesManager : IServerPreferencesManager, IPostInjectInit { [Dependency] private readonly IServerNetManager _netManager = default!; [Dependency] private readonly IConfigurationManager _cfg = default!; @@ -26,6 +26,7 @@ public sealed class ServerPreferencesManager : IServerPreferencesManager [Dependency] private readonly IPlayerManager _playerManager = default!; [Dependency] private readonly IDependencyCollection _dependencies = default!; [Dependency] private readonly ILogManager _log = default!; + [Dependency] private readonly UserDbDataManager _userDb = default!; // Cache player prefs on the server so we don't need as much async hell related to them. private readonly Dictionary _cachedPlayerPrefs = @@ -178,7 +179,7 @@ public async Task LoadData(ICommonSession session, CancellationToken cancel) { PrefsLoaded = true, Prefs = new PlayerPreferences( - new[] {new KeyValuePair(0, HumanoidCharacterProfile.Random())}, + new[] { new KeyValuePair(0, HumanoidCharacterProfile.Random()) }, 0, Color.Transparent) }; @@ -321,5 +322,12 @@ private sealed class PlayerPrefData public bool PrefsLoaded; public PlayerPreferences? Prefs; } + + void IPostInjectInit.PostInject() + { + _userDb.AddOnLoadPlayer(LoadData); + _userDb.AddOnFinishLoad(FinishLoad); + _userDb.AddOnPlayerDisconnect(OnClientDisconnected); + } } } diff --git a/Content.Server/Psionics/PsionicsCommands.cs b/Content.Server/Psionics/PsionicsCommands.cs index 2894343c66..565146629b 100644 --- a/Content.Server/Psionics/PsionicsCommands.cs +++ b/Content.Server/Psionics/PsionicsCommands.cs @@ -38,7 +38,7 @@ public sealed class AddPsionicPowerCommand : IConsoleCommand public async void Execute(IConsoleShell shell, string argStr, string[] args) { var entMan = IoCManager.Resolve(); - var psionicPowers = IoCManager.Resolve(); + var psionicPowers = entMan.System(); var protoMan = IoCManager.Resolve(); if (args.Length != 2) diff --git a/Content.Server/Psionics/PsionicsSystem.cs b/Content.Server/Psionics/PsionicsSystem.cs index 90f69cf796..9685334dab 100644 --- a/Content.Server/Psionics/PsionicsSystem.cs +++ b/Content.Server/Psionics/PsionicsSystem.cs @@ -16,7 +16,9 @@ using Robust.Server.Player; using Content.Server.Chat.Managers; using Robust.Shared.Prototypes; -using Content.Shared.Psionics; +using Content.Shared.Mobs; +using Content.Shared.Damage; +using Content.Shared.Interaction.Events; namespace Content.Server.Psionics; @@ -35,6 +37,8 @@ public sealed class PsionicsSystem : EntitySystem [Dependency] private readonly IPlayerManager _playerManager = default!; [Dependency] private readonly IChatManager _chatManager = default!; [Dependency] private readonly IPrototypeManager _protoMan = default!; + [Dependency] private readonly PsionicFamiliarSystem _psionicFamiliar = default!; + [Dependency] private readonly NPCRetaliationSystem _retaliationSystem = default!; private const string BaselineAmplification = "Baseline Amplification"; private const string BaselineDampening = "Baseline Dampening"; @@ -64,6 +68,9 @@ public override void Initialize() SubscribeLocalEvent(OnStartup); SubscribeLocalEvent(OnMeleeHit); SubscribeLocalEvent(OnStamHit); + SubscribeLocalEvent(OnMobstateChanged); + SubscribeLocalEvent(OnDamageChanged); + SubscribeLocalEvent(OnAttackAttempt); SubscribeLocalEvent(OnInit); SubscribeLocalEvent(OnRemove); @@ -250,4 +257,59 @@ public void RerollPsionics(EntityUid uid, PsionicComponent? psionic = null, floa RollPsionics(uid, psionic, true, bonusMuliplier); psionic.CanReroll = false; } + + private void OnMobstateChanged(EntityUid uid, PsionicComponent component, MobStateChangedEvent args) + { + if (component.Familiars.Count <= 0 + || args.NewMobState != MobState.Dead) + return; + + foreach (var familiar in component.Familiars) + { + if (!TryComp(familiar, out var familiarComponent) + || !familiarComponent.DespawnOnMasterDeath) + continue; + + _psionicFamiliar.DespawnFamiliar(familiar, familiarComponent); + } + } + + /// + /// When a caster with active summons is attacked, aggro their familiars to the attacker. + /// + private void OnDamageChanged(EntityUid uid, PsionicComponent component, DamageChangedEvent args) + { + if (component.Familiars.Count <= 0 + || !args.DamageIncreased + || args.Origin is not { } origin + || origin == uid) + return; + + SetFamiliarTarget(origin, component); + } + + /// + /// When a caster with active summons attempts to attack something, aggro their familiars to the target. + /// + private void OnAttackAttempt(EntityUid uid, PsionicComponent component, AttackAttemptEvent args) + { + if (component.Familiars.Count <= 0 + || args.Target == uid + || args.Target is not { } target + || component.Familiars.Contains(target)) + return; + + SetFamiliarTarget(target, component); + } + + private void SetFamiliarTarget(EntityUid target, PsionicComponent component) + { + foreach (var familiar in component.Familiars) + { + if (!TryComp(familiar, out var retaliationComponent)) + continue; + + _retaliationSystem.TryRetaliate(familiar, target, retaliationComponent); + } + } } diff --git a/Content.Server/Shadowkin/EtherealLightComponent.cs b/Content.Server/Shadowkin/EtherealLightComponent.cs new file mode 100644 index 0000000000..8f47d86200 --- /dev/null +++ b/Content.Server/Shadowkin/EtherealLightComponent.cs @@ -0,0 +1,15 @@ +namespace Content.Server.Shadowkin; + +[RegisterComponent] +public sealed partial class EtherealLightComponent : Component +{ + public EntityUid AttachedEntity = EntityUid.Invalid; + + public float OldRadius = 0f; + + public bool OldRadiusEdited = false; + + public float OldEnergy = 0f; + + public bool OldEnergyEdited = false; +} \ No newline at end of file diff --git a/Content.Server/Shadowkin/EtherealStunItemSystem.cs b/Content.Server/Shadowkin/EtherealStunItemSystem.cs new file mode 100644 index 0000000000..b48b4d4fec --- /dev/null +++ b/Content.Server/Shadowkin/EtherealStunItemSystem.cs @@ -0,0 +1,44 @@ +using Content.Shared.Interaction.Events; +using Content.Shared.Damage.Components; +using Content.Shared.Damage.Systems; +using Content.Shared.Shadowkin; +using Content.Shared.Abilities.Psionics; +using Content.Shared.Stacks; + +namespace Content.Server.Shadowkin; + +public sealed class EtherealStunItemSystem : EntitySystem +{ + [Dependency] private readonly StaminaSystem _stamina = default!; + [Dependency] private readonly EntityLookupSystem _lookup = default!; + [Dependency] private readonly SharedStackSystem _sharedStackSystem = default!; + public override void Initialize() + { + SubscribeLocalEvent(OnUseInHand); + } + + private void OnUseInHand(EntityUid uid, EtherealStunItemComponent component, UseInHandEvent args) + { + foreach (var ent in _lookup.GetEntitiesInRange(uid, component.Radius)) + { + if (!TryComp(ent, out var ethereal)) + continue; + + RemComp(ent, ethereal); + + if (TryComp(ent, out var stamina)) + _stamina.TakeStaminaDamage(ent, stamina.CritThreshold, stamina, ent); + + if (TryComp(ent, out var magic)) + magic.Mana = 0; + } + + if (!component.DeleteOnUse) + return; + + if (TryComp(uid, out var stack)) + _sharedStackSystem.Use(uid, 1, stack); + else + QueueDel(uid); + } +} diff --git a/Content.Server/Shadowkin/EtherealSystem.cs b/Content.Server/Shadowkin/EtherealSystem.cs new file mode 100644 index 0000000000..2622547a3f --- /dev/null +++ b/Content.Server/Shadowkin/EtherealSystem.cs @@ -0,0 +1,216 @@ +using Content.Shared.Eye; +using Content.Shared.Shadowkin; +using Robust.Server.GameObjects; +using Content.Server.Atmos.Components; +using Content.Server.Temperature.Components; +using Content.Shared.Movement.Components; +using Content.Shared.Stealth; +using Content.Shared.Stealth.Components; +using Content.Server.Body.Components; +using Content.Server.NPC.Components; +using Content.Server.NPC.Systems; +using System.Linq; +using Content.Shared.Abilities.Psionics; +using Robust.Shared.Random; +using Content.Server.Light.Components; + +namespace Content.Server.Shadowkin; + +public sealed class EtherealSystem : SharedEtherealSystem +{ + [Dependency] private readonly VisibilitySystem _visibilitySystem = default!; + [Dependency] private readonly SharedStealthSystem _stealth = default!; + [Dependency] private readonly EyeSystem _eye = default!; + [Dependency] private readonly NpcFactionSystem _factions = default!; + [Dependency] private readonly EntityLookupSystem _lookup = default!; + [Dependency] private readonly SharedPointLightSystem _light = default!; + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; + + public override void OnStartup(EntityUid uid, EtherealComponent component, MapInitEvent args) + { + base.OnStartup(uid, component, args); + + var visibility = EnsureComp(uid); + _visibilitySystem.RemoveLayer((uid, visibility), (int) VisibilityFlags.Normal, false); + _visibilitySystem.AddLayer((uid, visibility), (int) VisibilityFlags.Ethereal, false); + _visibilitySystem.RefreshVisibility(uid, visibility); + + if (TryComp(uid, out var eye)) + _eye.SetVisibilityMask(uid, eye.VisibilityMask | (int) (VisibilityFlags.Ethereal), eye); + + if (TryComp(uid, out var temp)) + temp.AtmosTemperatureTransferEfficiency = 0; + + var stealth = EnsureComp(uid); + _stealth.SetVisibility(uid, 0.8f, stealth); + + SuppressFactions(uid, component, true); + + EnsureComp(uid); + EnsureComp(uid); + EnsureComp(uid); + + if (HasComp(uid)) + RemComp(uid, component); + } + + public override void OnShutdown(EntityUid uid, EtherealComponent component, ComponentShutdown args) + { + base.OnShutdown(uid, component, args); + + if (TryComp(uid, out var visibility)) + { + _visibilitySystem.AddLayer((uid, visibility), (int) VisibilityFlags.Normal, false); + _visibilitySystem.RemoveLayer((uid, visibility), (int) VisibilityFlags.Ethereal, false); + _visibilitySystem.RefreshVisibility(uid, visibility); + } + + if (TryComp(uid, out var eye)) + _eye.SetVisibilityMask(uid, (int) VisibilityFlags.Normal, eye); + + if (TryComp(uid, out var temp)) + temp.AtmosTemperatureTransferEfficiency = 0.1f; + + SuppressFactions(uid, component, false); + + RemComp(uid); + RemComp(uid); + RemComp(uid); + RemComp(uid); + + SpawnAtPosition("ShadowkinShadow", Transform(uid).Coordinates); + SpawnAtPosition("EffectFlashShadowkinDarkSwapOff", Transform(uid).Coordinates); + + foreach (var light in component.DarkenedLights.ToArray()) + { + if (!TryComp(light, out var pointLight) + || !TryComp(light, out var etherealLight)) + continue; + + ResetLight(light, pointLight, etherealLight); + } + } + + public void SuppressFactions(EntityUid uid, EtherealComponent component, bool set) + { + if (set) + { + if (!TryComp(uid, out var factions)) + return; + + component.SuppressedFactions = factions.Factions.ToList(); + + foreach (var faction in factions.Factions) + _factions.RemoveFaction(uid, faction); + } + else + { + foreach (var faction in component.SuppressedFactions) + _factions.AddFaction(uid, faction); + + component.SuppressedFactions.Clear(); + } + } + + public void ResetLight(EntityUid uid, PointLightComponent light, EtherealLightComponent etherealLight) + { + etherealLight.AttachedEntity = EntityUid.Invalid; + + if (etherealLight.OldRadiusEdited) + _light.SetRadius(uid, etherealLight.OldRadius); + etherealLight.OldRadiusEdited = false; + + if (etherealLight.OldEnergyEdited) + _light.SetEnergy(uid, etherealLight.OldEnergy); + etherealLight.OldEnergyEdited = false; + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var component)) + { + if (!component.Darken) + continue; + + component.DarkenAccumulator += frameTime; + + if (component.DarkenAccumulator <= 1) + continue; + + component.DarkenAccumulator -= component.DarkenRate; + + var darkened = new List(); + var lightQuery = _lookup.GetEntitiesInRange(uid, component.DarkenRange, flags: LookupFlags.StaticSundries) + .Where(x => HasComp(x) && HasComp(x)); + + foreach (var entity in lightQuery) + if (!darkened.Contains(entity)) + darkened.Add(entity); + + _random.Shuffle(darkened); + component.DarkenedLights = darkened; + + var playerPos = _transform.GetWorldPosition(uid); + + foreach (var light in component.DarkenedLights.ToArray()) + { + var lightPos = _transform.GetWorldPosition(light); + if (!TryComp(light, out var pointLight) + || !TryComp(light, out var etherealLight)) + continue; + + if (TryComp(light, out var powered) && !powered.On) + { + ResetLight(light, pointLight, etherealLight); + continue; + } + + if (etherealLight.AttachedEntity == EntityUid.Invalid) + etherealLight.AttachedEntity = uid; + + if (etherealLight.AttachedEntity != EntityUid.Invalid + && etherealLight.AttachedEntity != uid) + { + component.DarkenedLights.Remove(light); + continue; + } + + if (etherealLight.AttachedEntity == uid + && _random.Prob(0.03f)) + etherealLight.AttachedEntity = EntityUid.Invalid; + + if (!etherealLight.OldRadiusEdited) + { + etherealLight.OldRadius = pointLight.Radius; + etherealLight.OldRadiusEdited = true; + } + if (!etherealLight.OldEnergyEdited) + { + etherealLight.OldEnergy = pointLight.Energy; + etherealLight.OldEnergyEdited = true; + } + + var distance = (lightPos - playerPos).Length(); + var radius = distance * 2f; + var energy = distance * 0.8f; + + if (etherealLight.OldRadiusEdited && radius > etherealLight.OldRadius) + radius = etherealLight.OldRadius; + if (etherealLight.OldRadiusEdited && radius < etherealLight.OldRadius * 0.20f) + radius = etherealLight.OldRadius * 0.20f; + + if (etherealLight.OldEnergyEdited && energy > etherealLight.OldEnergy) + energy = etherealLight.OldEnergy; + if (etherealLight.OldEnergyEdited && energy < etherealLight.OldEnergy * 0.20f) + energy = etherealLight.OldEnergy * 0.20f; + + _light.SetRadius(light, radius); + _light.SetEnergy(light, energy); + } + } + } +} \ No newline at end of file diff --git a/Content.Server/Shadowkin/ShadowkinCuffSystem.cs b/Content.Server/Shadowkin/ShadowkinCuffSystem.cs new file mode 100644 index 0000000000..ce2b258817 --- /dev/null +++ b/Content.Server/Shadowkin/ShadowkinCuffSystem.cs @@ -0,0 +1,29 @@ +using Content.Shared.Inventory.Events; +using Content.Shared.Clothing.Components; +using Content.Shared.Shadowkin; + +namespace Content.Server.Shadowkin; + +public sealed class ShadowkinCuffSystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnEquipped); + SubscribeLocalEvent(OnUnequipped); + } + + private void OnEquipped(EntityUid uid, ShadowkinCuffComponent component, GotEquippedEvent args) + { + if (!TryComp(uid, out var clothing) + || !clothing.Slots.HasFlag(args.SlotFlags)) + return; + + EnsureComp(args.Equipee); + } + + private void OnUnequipped(EntityUid uid, ShadowkinCuffComponent component, GotUnequippedEvent args) + { + RemComp(args.Equipee); + } +} \ No newline at end of file diff --git a/Content.Server/Shadowkin/ShadowkinSystem.cs b/Content.Server/Shadowkin/ShadowkinSystem.cs new file mode 100644 index 0000000000..83461e7a7f --- /dev/null +++ b/Content.Server/Shadowkin/ShadowkinSystem.cs @@ -0,0 +1,181 @@ +using Content.Shared.Examine; +using Content.Shared.Abilities.Psionics; +using Content.Shared.Humanoid; +using Content.Shared.Psionics; +using Content.Shared.Bed.Sleep; +using Content.Shared.Damage.Components; +using Content.Shared.Damage.Systems; +using Content.Shared.Shadowkin; +using Content.Shared.Rejuvenate; +using Content.Shared.Alert; +using Content.Shared.Rounding; +using Content.Shared.Actions; +using Robust.Shared.Prototypes; +using Content.Server.Abilities.Psionics; + +namespace Content.Server.Shadowkin; + +public sealed class ShadowkinSystem : EntitySystem +{ + [Dependency] private readonly StaminaSystem _stamina = default!; + [Dependency] private readonly PsionicAbilitiesSystem _psionicAbilitiesSystem = default!; + [Dependency] private readonly AlertsSystem _alerts = default!; + [Dependency] private readonly SharedActionsSystem _actionsSystem = default!; + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + + public const string ShadowkinSleepActionId = "ShadowkinActionSleep"; + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnInit); + SubscribeLocalEvent(OnExamined); + SubscribeLocalEvent(OnMindbreak); + SubscribeLocalEvent(OnAttemptPowerUse); + SubscribeLocalEvent(OnManaUpdate); + SubscribeLocalEvent(OnRejuvenate); + SubscribeLocalEvent(OnEyeColorChange); + } + + private void OnInit(EntityUid uid, ShadowkinComponent component, ComponentStartup args) + { + if (component.BlackeyeSpawn) + ApplyBlackEye(uid); + + _actionsSystem.AddAction(uid, ref component.ShadowkinSleepAction, ShadowkinSleepActionId, uid); + + UpdateShadowkinAlert(uid, component); + } + + private void OnEyeColorChange(EntityUid uid, ShadowkinComponent component, EyeColorInitEvent args) + { + if (!TryComp(uid, out var humanoid) + || !component.BlackeyeSpawn + || humanoid.EyeColor == component.OldEyeColor) + return; + + component.OldEyeColor = humanoid.EyeColor; + humanoid.EyeColor = component.BlackEyeColor; + Dirty(humanoid); + } + + private void OnExamined(EntityUid uid, ShadowkinComponent component, ExaminedEvent args) + { + if (!args.IsInDetailsRange + || !TryComp(uid, out var magic) + || HasComp(uid)) + return; + + var severity = "shadowkin-power-" + ContentHelpers.RoundToLevels(magic.Mana, magic.MaxMana, 6); + var powerType = Loc.GetString(severity); + + if (args.Examined == args.Examiner) + args.PushMarkup(Loc.GetString("shadowkin-power-examined-self", + ("power", Math.Floor(magic.Mana)), + ("powerMax", Math.Floor(magic.MaxMana)), + ("powerType", powerType) + )); + else + args.PushMarkup(Loc.GetString("shadowkin-power-examined-other", + ("target", uid), + ("powerType", powerType) + )); + } + + /// + /// Update the Shadowkin Alert, if Blackeye will remove the Alert, if not will update to its current power status. + /// + public void UpdateShadowkinAlert(EntityUid uid, ShadowkinComponent component) + { + if (TryComp(uid, out var magic)) + { + var severity = (short) ContentHelpers.RoundToLevels(magic.Mana, magic.MaxMana, 8); + _alerts.ShowAlert(uid, AlertType.ShadowkinPower, severity); + } + else + _alerts.ClearAlert(uid, AlertType.ShadowkinPower); + } + + private void OnAttemptPowerUse(EntityUid uid, ShadowkinComponent component, OnAttemptPowerUseEvent args) + { + if (HasComp(uid)) + args.Cancel(); + } + + private void OnManaUpdate(EntityUid uid, ShadowkinComponent component, ref OnManaUpdateEvent args) + { + if (!TryComp(uid, out var magic)) + return; + + if (component.SleepManaRegen + && TryComp(uid, out var sleep)) + magic.ManaGainMultiplier = component.SleepManaRegenMultiplier; + else + magic.ManaGainMultiplier = 1; + + if (magic.Mana <= component.BlackEyeMana) + ApplyBlackEye(uid); + + Dirty(magic); // Update Shadowkin Overlay. + UpdateShadowkinAlert(uid, component); + } + + /// + /// Blackeye the Shadowkin, its just a function to mindbreak the shadowkin but making sure "Removable" is checked true during it. + /// + /// + public void ApplyBlackEye(EntityUid uid) + { + if (!TryComp(uid, out var magic)) + return; + + magic.Removable = true; + _psionicAbilitiesSystem.MindBreak(uid); + } + + private void OnMindbreak(EntityUid uid, ShadowkinComponent component, ref OnMindbreakEvent args) + { + if (TryComp(uid, out var mindbreak)) + mindbreak.MindbrokenExaminationText = "examine-mindbroken-shadowkin-message"; + + if (TryComp(uid, out var humanoid)) + { + component.OldEyeColor = humanoid.EyeColor; + humanoid.EyeColor = component.BlackEyeColor; + Dirty(humanoid); + } + + if (component.BlackeyeSpawn) + return; + + if (TryComp(uid, out var stamina)) + _stamina.TakeStaminaDamage(uid, stamina.CritThreshold, stamina, uid); + } + + private void OnRejuvenate(EntityUid uid, ShadowkinComponent component, RejuvenateEvent args) + { + if (component.BlackeyeSpawn + || !HasComp(uid)) + return; + + RemComp(uid); + + if (TryComp(uid, out var humanoid)) + { + humanoid.EyeColor = component.OldEyeColor; + Dirty(humanoid); + } + + EnsureComp(uid, out var magic); + magic.Mana = 250; + magic.MaxMana = 250; + magic.ManaGain = 0.25f; + magic.BypassManaCheck = true; + magic.Removable = false; + magic.MindbreakingFeedback = "shadowkin-blackeye"; + + if (_prototypeManager.TryIndex("ShadowkinPowers", out var shadowkinPowers)) + _psionicAbilitiesSystem.InitializePsionicPower(uid, shadowkinPowers); + + UpdateShadowkinAlert(uid, component); + } +} diff --git a/Content.Server/Shadowkin/ShowEtherealSystem.cs b/Content.Server/Shadowkin/ShowEtherealSystem.cs new file mode 100644 index 0000000000..151c379afb --- /dev/null +++ b/Content.Server/Shadowkin/ShowEtherealSystem.cs @@ -0,0 +1,88 @@ +using Content.Shared.Shadowkin; +using Content.Shared.Eye; +using Robust.Server.GameObjects; +using Content.Shared.Inventory.Events; +using Content.Shared.Interaction.Events; +using Robust.Shared.Timing; +using Content.Shared.Popups; +using Content.Shared.Clothing.Components; + +namespace Content.Server.Shadowkin; +public sealed class ShowEtherealSystem : EntitySystem +{ + [Dependency] private readonly EyeSystem _eye = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly IGameTiming _gameTiming = default!; + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnInit); + SubscribeLocalEvent(OnShutdown); + SubscribeLocalEvent(OnEquipped); + SubscribeLocalEvent(OnUnequipped); + SubscribeLocalEvent(OnInteractionAttempt); + SubscribeLocalEvent(OnAttackAttempt); + } + + private void OnInit(EntityUid uid, ShowEtherealComponent component, MapInitEvent args) + { + Toggle(uid, true); + } + + public void OnShutdown(EntityUid uid, ShowEtherealComponent component, ComponentShutdown args) + { + Toggle(uid, false); + } + + private void OnEquipped(EntityUid uid, ShowEtherealComponent component, GotEquippedEvent args) + { + if (!TryComp(uid, out var clothing) + || !clothing.Slots.HasFlag(args.SlotFlags)) + return; + + EnsureComp(args.Equipee); + } + + private void OnUnequipped(EntityUid uid, ShowEtherealComponent component, GotUnequippedEvent args) + { + RemComp(args.Equipee); + } + + private void Toggle(EntityUid uid, bool toggle) + { + if (!TryComp(uid, out var eye)) + return; + + if (toggle) + { + _eye.SetVisibilityMask(uid, eye.VisibilityMask | (int) (VisibilityFlags.Ethereal), eye); + return; + } + else if (HasComp(uid)) + return; + + _eye.SetVisibilityMask(uid, (int) VisibilityFlags.Normal, eye); + } + + private void OnInteractionAttempt(EntityUid uid, ShowEtherealComponent component, InteractionAttemptEvent args) + { + if (HasComp(uid) + || !HasComp(args.Target)) + return; + + args.Cancel(); + if (_gameTiming.InPrediction) + return; + + _popup.PopupEntity(Loc.GetString("ethereal-pickup-fail"), args.Target.Value, uid); + } + + private void OnAttackAttempt(EntityUid uid, ShowEtherealComponent component, AttackAttemptEvent args) + { + if (HasComp(uid) + || !HasComp(args.Target)) + return; + + args.Cancel(); + } +} \ No newline at end of file diff --git a/Content.Server/ShortConstruction/ShortConstructionSystem.cs b/Content.Server/ShortConstruction/ShortConstructionSystem.cs new file mode 100644 index 0000000000..b274b6e9bf --- /dev/null +++ b/Content.Server/ShortConstruction/ShortConstructionSystem.cs @@ -0,0 +1,24 @@ +using Content.Shared.RadialSelector; +using Content.Shared.ShortConstruction; +using Content.Shared.UserInterface; +using Robust.Server.GameObjects; + +namespace Content.Server.ShortConstruction; + +public sealed class ShortConstructionSystem : EntitySystem +{ + [Dependency] private readonly UserInterfaceSystem _ui = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(BeforeUiOpen); + } + + private void BeforeUiOpen(Entity ent, ref BeforeActivatableUIOpenEvent args) + { + var state = new RadialSelectorState(ent.Comp.Entries); + _ui.SetUiState(ent.Owner, RadialSelectorUiKey.Key, state); + } +} diff --git a/Content.Server/Shuttles/Systems/ArrivalsSystem.cs b/Content.Server/Shuttles/Systems/ArrivalsSystem.cs index 4a2dc5df53..fef671fc30 100644 --- a/Content.Server/Shuttles/Systems/ArrivalsSystem.cs +++ b/Content.Server/Shuttles/Systems/ArrivalsSystem.cs @@ -18,6 +18,7 @@ using Content.Shared.Mobs.Components; using Content.Shared.Movement.Components; using Content.Shared.Parallax.Biomes; +using Content.Shared.Roles; using Content.Shared.Salvage; using Content.Shared.Shuttles.Components; using Content.Shared.Tiles; @@ -311,6 +312,12 @@ public void HandlePlayerSpawning(PlayerSpawningEvent ev) if (!Enabled || _ticker.RunLevel != GameRunLevel.InRound) return; + if (ev.Job is not null + && ev.Job.Prototype is not null + && _protoManager.Index(ev.Job.Prototype.Value.Id).AlwaysUseSpawner) + return; + + if (!HasComp(ev.Station)) return; diff --git a/Content.Server/Station/Events/StationJobsGetCandidatesEvent.cs b/Content.Server/Station/Events/StationJobsGetCandidatesEvent.cs new file mode 100644 index 0000000000..58d860b1e1 --- /dev/null +++ b/Content.Server/Station/Events/StationJobsGetCandidatesEvent.cs @@ -0,0 +1,8 @@ +using Content.Shared.Roles; +using Robust.Shared.Network; +using Robust.Shared.Prototypes; + +namespace Content.Server.Station.Events; + +[ByRefEvent] +public readonly record struct StationJobsGetCandidatesEvent(NetUserId Player, List> Jobs); diff --git a/Content.Server/Station/Systems/StationJobsSystem.Roundstart.cs b/Content.Server/Station/Systems/StationJobsSystem.Roundstart.cs index 4b7cd64961..c3c3865c7b 100644 --- a/Content.Server/Station/Systems/StationJobsSystem.Roundstart.cs +++ b/Content.Server/Station/Systems/StationJobsSystem.Roundstart.cs @@ -2,6 +2,7 @@ using Content.Server.Administration.Managers; using Content.Server.Players.PlayTimeTracking; using Content.Server.Station.Components; +using Content.Server.Station.Events; using Content.Shared.Preferences; using Content.Shared.Roles; using Robust.Shared.Network; @@ -342,8 +343,9 @@ private Dictionary> GetPlayersJobCandidates(int? weight, foreach (var (player, profile) in profiles) { var roleBans = _banManager.GetJobBans(player); - var profileJobs = profile.JobPriorities.Keys.ToList(); - _playTime.RemoveDisallowedJobs(player, ref profileJobs); + var profileJobs = profile.JobPriorities.Keys.Select(k => new ProtoId(k)).ToList(); + var ev = new StationJobsGetCandidatesEvent(player, profileJobs); + RaiseLocalEvent(ref ev); List? availableJobs = null; @@ -354,7 +356,7 @@ private Dictionary> GetPlayersJobCandidates(int? weight, if (!(priority == selectedPriority || selectedPriority is null)) continue; - if (!_prototypeManager.TryIndex(jobId, out JobPrototype? job)) + if (!_prototypeManager.TryIndex(jobId, out var job)) continue; if (weight is not null && job.Weight != weight.Value) diff --git a/Content.Server/Station/Systems/StationJobsSystem.cs b/Content.Server/Station/Systems/StationJobsSystem.cs index debac8902e..3bfa815af1 100644 --- a/Content.Server/Station/Systems/StationJobsSystem.cs +++ b/Content.Server/Station/Systems/StationJobsSystem.cs @@ -428,7 +428,7 @@ public IReadOnlySet GetOverflowJobs(EntityUid station, StationJobsCompon /// Whether or not to pick from the overflow list. /// A set of disallowed jobs, if any. /// The selected job, if any. - public string? PickBestAvailableJobWithPriority(EntityUid station, IReadOnlyDictionary jobPriorities, bool pickOverflows, IReadOnlySet? disallowedJobs = null) + public string? PickBestAvailableJobWithPriority(EntityUid station, IReadOnlyDictionary jobPriorities, bool pickOverflows, IReadOnlySet>? disallowedJobs = null) { if (station == EntityUid.Invalid) return null; diff --git a/Content.Server/StationEvents/Components/GlimmerMobRuleComponent.cs b/Content.Server/StationEvents/Components/GlimmerMobRuleComponent.cs new file mode 100644 index 0000000000..982cb35ae8 --- /dev/null +++ b/Content.Server/StationEvents/Components/GlimmerMobRuleComponent.cs @@ -0,0 +1,51 @@ +using Content.Server.StationEvents.Events; +using Content.Shared.Psionics.Glimmer; +using Robust.Shared.Prototypes; + +namespace Content.Server.StationEvents.Components; + +/// +/// Tries to spawn a random number of mobs scaling with psionic people. +/// Rolls glimmer sources then vents then midround spawns in that order. +/// +[RegisterComponent, Access(typeof(GlimmerMobRule))] +public sealed partial class GlimmerMobRuleComponent : Component +{ + /// + /// The mob to spawn. + /// + [DataField(required: true)] + public EntProtoId MobPrototype = string.Empty; + + /// + /// Every this number of psionics spawns 1 mob. + /// + [DataField] + public int MobsPerPsionic = 10; + + /// + /// If the current glimmer tier is above this, mob count gets multiplied by the difference. + /// So by default 500-900 glimmer will double it and 900+ will triple it. + /// + [DataField] + public GlimmerTier GlimmerTier = GlimmerTier.Moderate; + + /// + /// Probability of rolling a glimmer source location. + /// + [DataField] + public float GlimmerProb = 0.4f; + + /// + /// Probability of rolling a vent location. + /// + [DataField] + public float NormalProb = 1f; + + /// + /// Probability of rolling a midround antag location. + /// Should always be 1 to guarantee the right number of spawned mobs. + /// + [DataField] + public float HiddenProb = 1f; +} diff --git a/Content.Server/StationEvents/Components/GlimmerWispRuleComponent.cs b/Content.Server/StationEvents/Components/GlimmerWispRuleComponent.cs deleted file mode 100644 index 60477e6a6a..0000000000 --- a/Content.Server/StationEvents/Components/GlimmerWispRuleComponent.cs +++ /dev/null @@ -1,8 +0,0 @@ -using Content.Server.StationEvents.Events; - -namespace Content.Server.StationEvents.Components; - -[RegisterComponent, Access(typeof(GlimmerWispRule))] -public sealed partial class GlimmerWispRuleComponent : Component -{ -} diff --git a/Content.Server/StationEvents/Components/PirateRadioSpawnRuleComponent.cs b/Content.Server/StationEvents/Components/PirateRadioSpawnRuleComponent.cs new file mode 100644 index 0000000000..3bfa189ec6 --- /dev/null +++ b/Content.Server/StationEvents/Components/PirateRadioSpawnRuleComponent.cs @@ -0,0 +1,37 @@ +using Content.Server.StationEvents.Events; + +namespace Content.Server.StationEvents.Components; + +[RegisterComponent, Access(typeof(PirateRadioSpawnRule))] +public sealed partial class PirateRadioSpawnRuleComponent : Component +{ + [DataField] + public List PirateRadioShuttlePath { get; private set; } = new() + { + "Maps/Shuttles/pirateradio.yml", + }; + + [DataField] + public EntityUid? AdditionalRule; + + [DataField] + public int DebrisCount { get; set; } + + [DataField] + public float MinimumDistance { get; set; } = 750f; + + [DataField] + public float MaximumDistance { get; set; } = 1250f; + + [DataField] + public float MinimumDebrisDistance { get; set; } = 150f; + + [DataField] + public float MaximumDebrisDistance { get; set; } = 250f; + + [DataField] + public float DebrisMinimumOffset { get; set; } = 50f; + + [DataField] + public float DebrisMaximumOffset { get; set; } = 100f; +} diff --git a/Content.Server/StationEvents/Events/GlimmerMobSpawnRule.cs b/Content.Server/StationEvents/Events/GlimmerMobSpawnRule.cs new file mode 100644 index 0000000000..702147842c --- /dev/null +++ b/Content.Server/StationEvents/Events/GlimmerMobSpawnRule.cs @@ -0,0 +1,77 @@ +using System.Linq; +using Content.Server.GameTicking.Components; +using Robust.Shared.Random; +using Content.Server.GameTicking; +using Content.Server.NPC.Components; +using Content.Server.Psionics.Glimmer; +using Content.Server.Station.Systems; +using Content.Server.StationEvents.Components; +using Content.Shared.Psionics.Glimmer; +using Content.Shared.Abilities.Psionics; +using Robust.Shared.Map; + +namespace Content.Server.StationEvents.Events; + +public sealed class GlimmerMobRule : StationEventSystem +{ + [Dependency] private readonly GameTicker _gameTicker = default!; + [Dependency] private readonly GlimmerSystem _glimmer = default!; + [Dependency] private readonly StationSystem _stations = default!; + + protected override void Started(EntityUid uid, GlimmerMobRuleComponent comp, GameRuleComponent gameRule, GameRuleStartedEvent args) + { + base.Started(uid, comp, gameRule, args); + + var stations = _gameTicker.GetSpawnableStations(); + if (stations.Count <= 0) + return; + + List + glimmerSources = GetCoords(stations), + normalSpawns = GetCoords(stations), + hiddenSpawns = GetCoords(stations); + + var psionics = EntityQuery().Count(); + var baseCount = Math.Max(1, psionics / comp.MobsPerPsionic); + var multiplier = Math.Max(1, (int) _glimmer.GetGlimmerTier() - (int) comp.GlimmerTier); + var total = baseCount * multiplier; + + Log.Info($"Spawning {total} of {comp.MobPrototype} from {ToPrettyString(uid):rule}"); + + for (var i = 0; i < total; i++) + { + // if we cant get a spawn just give up + if (!TrySpawn(comp, glimmerSources, comp.GlimmerProb) && + !TrySpawn(comp, normalSpawns, comp.NormalProb) && + !TrySpawn(comp, hiddenSpawns, comp.HiddenProb)) + return; + } + } + + private List GetCoords(List allowedStations) where T : IComponent + { + var coords = new List(); + var query = EntityQueryEnumerator(); + + while (query.MoveNext(out var uid, out _, out var xform)) + { + var station = _stations.GetOwningStation(uid, xform); + if (station is null || !allowedStations.Contains(station.Value)) + continue; + + coords.Add(xform.Coordinates); + } + + return coords; + } + + private bool TrySpawn(GlimmerMobRuleComponent comp, List spawns, float prob) + { + if (spawns.Count == 0 || !RobustRandom.Prob(prob)) + return false; + + var coords = RobustRandom.Pick(spawns); + Spawn(comp.MobPrototype, coords); + return true; + } +} diff --git a/Content.Server/StationEvents/Events/GlimmerWispSpawnRule.cs b/Content.Server/StationEvents/Events/GlimmerWispSpawnRule.cs deleted file mode 100644 index c2cb4eca6d..0000000000 --- a/Content.Server/StationEvents/Events/GlimmerWispSpawnRule.cs +++ /dev/null @@ -1,59 +0,0 @@ -using System.Linq; -using Content.Server.GameTicking.Components; -using Robust.Shared.Random; -using Content.Server.GameTicking.Rules.Components; -using Content.Server.NPC.Components; -using Content.Server.Psionics.Glimmer; -using Content.Server.StationEvents.Components; -using Content.Shared.Psionics.Glimmer; -using Content.Shared.Abilities.Psionics; - -namespace Content.Server.StationEvents.Events; - -internal sealed class GlimmerWispRule : StationEventSystem -{ - [Dependency] private readonly IRobustRandom _robustRandom = default!; - [Dependency] private readonly GlimmerSystem _glimmerSystem = default!; - - private static readonly string WispPrototype = "MobGlimmerWisp"; - - protected override void Started(EntityUid uid, GlimmerWispRuleComponent component, GameRuleComponent gameRule, GameRuleStartedEvent args) - { - base.Started(uid, component, gameRule, args); - - var glimmerSources = EntityManager.EntityQuery().ToList(); - var normalSpawnLocations = EntityManager.EntityQuery().ToList(); - var hiddenSpawnLocations = EntityManager.EntityQuery().ToList(); - - var baseCount = Math.Max(1, EntityManager.EntityQuery().Count() / 10); - int multiplier = Math.Max(1, (int) _glimmerSystem.GetGlimmerTier() - 2); - - var total = baseCount * multiplier; - - int i = 0; - while (i < total) - { - if (glimmerSources.Count != 0 && _robustRandom.Prob(0.4f)) - { - EntityManager.SpawnEntity(WispPrototype, _robustRandom.Pick(glimmerSources).Item2.Coordinates); - i++; - continue; - } - - if (normalSpawnLocations.Count != 0) - { - EntityManager.SpawnEntity(WispPrototype, _robustRandom.Pick(normalSpawnLocations).Item2.Coordinates); - i++; - continue; - } - - if (hiddenSpawnLocations.Count != 0) - { - EntityManager.SpawnEntity(WispPrototype, _robustRandom.Pick(hiddenSpawnLocations).Item2.Coordinates); - i++; - continue; - } - return; - } - } -} diff --git a/Content.Server/StationEvents/Events/PirateRadioSpawnRule.cs b/Content.Server/StationEvents/Events/PirateRadioSpawnRule.cs new file mode 100644 index 0000000000..e080313204 --- /dev/null +++ b/Content.Server/StationEvents/Events/PirateRadioSpawnRule.cs @@ -0,0 +1,84 @@ +using Robust.Server.GameObjects; +using Robust.Server.Maps; +using Robust.Shared.Configuration; +using Robust.Shared.Prototypes; +using Robust.Shared.Random; +using Content.Server.GameTicking; +using Content.Server.StationEvents.Components; +using Content.Shared.Salvage; +using Content.Shared.Random.Helpers; +using System.Linq; +using Content.Server.GameTicking.Components; +using Content.Shared.CCVar; + +namespace Content.Server.StationEvents.Events; + +public sealed class PirateRadioSpawnRule : StationEventSystem +{ + [Dependency] private readonly MapLoaderSystem _map = default!; + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + [Dependency] private readonly IConfigurationManager _confMan = default!; + [Dependency] private readonly GameTicker _gameTicker = default!; + [Dependency] private readonly TransformSystem _xform = default!; + + protected override void Started(EntityUid uid, PirateRadioSpawnRuleComponent component, GameRuleComponent gameRule, GameRuleStartedEvent args) + { + base.Started(uid, component, gameRule, args); + + var stations = _gameTicker.GetSpawnableStations(); + if (stations is null || stations.Count <= 0) + return; + + var targetStation = _random.Pick(stations); + var randomOffset = _random.NextVector2(component.MinimumDistance, component.MaximumDistance); + + var outpostOptions = new MapLoadOptions + { + Offset = _xform.GetWorldPosition(targetStation) + randomOffset, + LoadMap = false, + }; + + if (!_map.TryLoad(GameTicker.DefaultMap, _random.Pick(component.PirateRadioShuttlePath), out var outpostids, outpostOptions)) + return; + + SpawnDebris(component, outpostids); + } + + private void SpawnDebris(PirateRadioSpawnRuleComponent component, IReadOnlyList outpostids) + { + if (_confMan.GetCVar(CCVars.WorldgenEnabled) + || component.DebrisCount <= 0) + return; + + foreach (var id in outpostids) + { + var outpostaabb = _xform.GetWorldPosition(id); + var k = 0; + while (k < component.DebrisCount) + { + var debrisRandomOffset = _random.NextVector2(component.MinimumDebrisDistance, component.MaximumDebrisDistance); + var randomer = _random.NextVector2(component.DebrisMinimumOffset, component.DebrisMaximumOffset); //Second random vector to ensure the outpost isn't perfectly centered in the debris field + var debrisOptions = new MapLoadOptions + { + Offset = outpostaabb + debrisRandomOffset + randomer, + LoadMap = false, + }; + + var salvageProto = _random.Pick(_prototypeManager.EnumeratePrototypes().ToList()); + if (!_map.TryLoad(GameTicker.DefaultMap, salvageProto.MapPath.ToString(), out _, debrisOptions)) + return; + + k++; + } + } + } + + protected override void Ended(EntityUid uid, PirateRadioSpawnRuleComponent component, GameRuleComponent gameRule, GameRuleEndedEvent args) + { + base.Ended(uid, component, gameRule, args); + + if (component.AdditionalRule != null) + GameTicker.EndGameRule(component.AdditionalRule.Value); + } +} diff --git a/Content.Server/Stunnable/Components/KnockdownOnHitComponent.cs b/Content.Server/Stunnable/Components/KnockdownOnHitComponent.cs new file mode 100644 index 0000000000..b89e674ece --- /dev/null +++ b/Content.Server/Stunnable/Components/KnockdownOnHitComponent.cs @@ -0,0 +1,16 @@ +using Content.Shared.Standing; + +namespace Content.Server.Stunnable.Components; + +[RegisterComponent] +public sealed partial class KnockdownOnHitComponent : Component +{ + [DataField] + public TimeSpan Duration = TimeSpan.FromSeconds(1); + + [DataField] + public DropHeldItemsBehavior DropHeldItemsBehavior = DropHeldItemsBehavior.NoDrop; + + [DataField] + public bool RefreshDuration = true; +} diff --git a/Content.Server/Stunnable/Systems/KnockdownOnHitSystem.cs b/Content.Server/Stunnable/Systems/KnockdownOnHitSystem.cs new file mode 100644 index 0000000000..d1300c54f0 --- /dev/null +++ b/Content.Server/Stunnable/Systems/KnockdownOnHitSystem.cs @@ -0,0 +1,40 @@ +using System.Linq; +using Content.Server.Stunnable.Components; +using Content.Shared.StatusEffect; +using Content.Shared.Stunnable.Events; +using Content.Shared.Weapons.Melee.Events; + +namespace Content.Server.Stunnable.Systems; + +public sealed class KnockdownOnHitSystem : EntitySystem +{ + [Dependency] private readonly StunSystem _stun = default!; + + public override void Initialize() + { + SubscribeLocalEvent(OnMeleeHit); + } + + private void OnMeleeHit(Entity entity, ref MeleeHitEvent args) + { + if (args.Direction.HasValue || !args.IsHit || !args.HitEntities.Any() || entity.Comp.Duration <= TimeSpan.Zero) + return; + + var ev = new KnockdownOnHitAttemptEvent(); + RaiseLocalEvent(entity, ref ev); + if (ev.Cancelled) + return; + + foreach (var target in args.HitEntities) + { + if (!TryComp(target, out StatusEffectsComponent? statusEffects)) + continue; + + _stun.TryKnockdown(target, + entity.Comp.Duration, + entity.Comp.RefreshDuration, + entity.Comp.DropHeldItemsBehavior, + statusEffects); + } + } +} diff --git a/Content.Server/TelescopicBaton/TelescopicBatonComponent.cs b/Content.Server/TelescopicBaton/TelescopicBatonComponent.cs new file mode 100644 index 0000000000..1846c76c75 --- /dev/null +++ b/Content.Server/TelescopicBaton/TelescopicBatonComponent.cs @@ -0,0 +1,17 @@ +namespace Content.Server.TelescopicBaton; + +[RegisterComponent] +public sealed partial class TelescopicBatonComponent : Component +{ + [DataField] + public bool CanKnockDown; + + /// + /// The amount of time during which the baton will be able to knockdown someone after activating it. + /// + [DataField] + public TimeSpan AttackTimeframe = TimeSpan.FromSeconds(1.5f); + + [ViewVariables(VVAccess.ReadOnly)] + public TimeSpan TimeframeAccumulator = TimeSpan.FromSeconds(0); +} diff --git a/Content.Server/TelescopicBaton/TelescopicBatonSystem.cs b/Content.Server/TelescopicBaton/TelescopicBatonSystem.cs new file mode 100644 index 0000000000..a859b44750 --- /dev/null +++ b/Content.Server/TelescopicBaton/TelescopicBatonSystem.cs @@ -0,0 +1,67 @@ +using Content.Shared.Item.ItemToggle.Components; +using Content.Shared.Stunnable.Events; +using Content.Shared.TelescopicBaton; +using Robust.Server.GameObjects; + +namespace Content.Server.TelescopicBaton; + +public sealed class TelescopicBatonSystem : EntitySystem +{ + [Dependency] private readonly AppearanceSystem _appearance = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnMapInit); + SubscribeLocalEvent(OnToggled); + SubscribeLocalEvent(OnKnockdownAttempt); + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var baton)) + { + if (!baton.CanKnockDown) + continue; + + baton.TimeframeAccumulator += TimeSpan.FromSeconds(frameTime); + if (baton.TimeframeAccumulator <= baton.AttackTimeframe) + continue; + + baton.CanKnockDown = false; // Only disable knockdown + baton.TimeframeAccumulator = TimeSpan.Zero; + } + } + + private void OnMapInit(Entity baton, ref MapInitEvent args) + { + ToggleBaton(baton, false); + } + + private void OnToggled(Entity baton, ref ItemToggledEvent args) + { + ToggleBaton(baton, args.Activated); + } + + private void OnKnockdownAttempt(Entity baton, ref KnockdownOnHitAttemptEvent args) + { + if (!baton.Comp.CanKnockDown) + { + args.Cancelled = true; + return; + } + + baton.Comp.CanKnockDown = false; + } + + public void ToggleBaton(Entity baton, bool state) + { + baton.Comp.TimeframeAccumulator = TimeSpan.Zero; + baton.Comp.CanKnockDown = state; + _appearance.SetData(baton, TelescopicBatonVisuals.State, state); + } +} diff --git a/Content.Server/Traits/TraitSystem.cs b/Content.Server/Traits/TraitSystem.cs index bd36b4ecef..afdf01524d 100644 --- a/Content.Server/Traits/TraitSystem.cs +++ b/Content.Server/Traits/TraitSystem.cs @@ -14,6 +14,7 @@ using Content.Shared.Psionics; using Content.Server.Language; using Content.Shared.Mood; +using Content.Server.NPC.Systems; namespace Content.Server.Traits; @@ -28,6 +29,7 @@ public sealed class TraitSystem : EntitySystem [Dependency] private readonly PsionicAbilitiesSystem _psionicAbilities = default!; [Dependency] private readonly IComponentFactory _componentFactory = default!; [Dependency] private readonly LanguageSystem _languageSystem = default!; + [Dependency] private readonly NpcFactionSystem _factionSystem = default!; public override void Initialize() { @@ -71,6 +73,8 @@ public void AddTrait(EntityUid uid, TraitPrototype traitPrototype) AddTraitLanguage(uid, traitPrototype); RemoveTraitLanguage(uid, traitPrototype); AddTraitMoodlets(uid, traitPrototype); + RemoveTraitFactions(uid, traitPrototype); + AddTraitFactions(uid, traitPrototype); } /// @@ -225,4 +229,28 @@ public void AddTraitMoodlets(EntityUid uid, TraitPrototype traitPrototype) if (_prototype.TryIndex(moodProto, out var moodlet)) RaiseLocalEvent(uid, new MoodEffectEvent(moodlet.ID)); } + + /// + /// If a trait includes any faction removals, this removes the faction from the receiving entity. + /// + public void RemoveTraitFactions(EntityUid uid, TraitPrototype traitPrototype) + { + if (traitPrototype.RemoveFactions is null) + return; + + foreach (var faction in traitPrototype.RemoveFactions) + _factionSystem.RemoveFaction(uid, faction); + } + + /// + /// If a trait includes any factions to add, this adds the factions to the receiving entity. + /// + public void AddTraitFactions(EntityUid uid, TraitPrototype traitPrototype) + { + if (traitPrototype.AddFactions is null) + return; + + foreach (var faction in traitPrototype.AddFactions) + _factionSystem.AddFaction(uid, faction); + } } diff --git a/Content.Server/Vampire/BloodSuckerSystem.cs b/Content.Server/Vampire/BloodSuckerSystem.cs index 81d2854318..41afe0d666 100644 --- a/Content.Server/Vampire/BloodSuckerSystem.cs +++ b/Content.Server/Vampire/BloodSuckerSystem.cs @@ -6,6 +6,7 @@ using Content.Shared.Inventory; using Content.Shared.Administration.Logs; using Content.Shared.Vampiric; +using Content.Shared.Cocoon; using Content.Server.Atmos.Components; using Content.Server.Body.Components; using Content.Server.Body.Systems; @@ -45,23 +46,28 @@ public override void Initialize() private void AddSuccVerb(EntityUid uid, BloodSuckerComponent component, GetVerbsEvent args) { - if (args.User == args.Target) - return; - if (component.WebRequired) - return; // handled elsewhere - if (!TryComp(args.Target, out var bloodstream)) + + var victim = args.Target; + var ignoreClothes = false; + + if (TryComp(args.Target, out var cocoon)) + { + victim = cocoon.Victim ?? args.Target; + ignoreClothes = cocoon.Victim != null; + } else if (component.WebRequired) return; - if (!args.CanAccess) + + if (!TryComp(victim, out var bloodstream) || args.User == victim || !args.CanAccess) return; InnateVerb verb = new() { Act = () => { - StartSuccDoAfter(uid, args.Target, component, bloodstream); // start doafter + StartSuccDoAfter(uid, victim, component, bloodstream, !ignoreClothes); // start doafter }, Text = Loc.GetString("action-name-suck-blood"), - Icon = new SpriteSpecifier.Texture(new ("/Textures/Nyanotrasen/Icons/verbiconfangs.png")), + Icon = new SpriteSpecifier.Texture(new("/Textures/Nyanotrasen/Icons/verbiconfangs.png")), Priority = 2 }; args.Verbs.Add(verb); @@ -80,10 +86,8 @@ private void OnDamageChanged(EntityUid uid, BloodSuckedComponent component, Dama if (_prototypeManager.TryIndex("Brute", out var brute) && args.Damageable.Damage.TryGetDamageInGroup(brute, out var bruteTotal) && _prototypeManager.TryIndex("Airloss", out var airloss) && args.Damageable.Damage.TryGetDamageInGroup(airloss, out var airlossTotal)) - { if (bruteTotal == 0 && airlossTotal == 0) RemComp(uid); - } } private void OnDoAfter(EntityUid uid, BloodSuckerComponent component, BloodSuckDoAfterEvent args) @@ -96,18 +100,13 @@ private void OnDoAfter(EntityUid uid, BloodSuckerComponent component, BloodSuckD public void StartSuccDoAfter(EntityUid bloodsucker, EntityUid victim, BloodSuckerComponent? bloodSuckerComponent = null, BloodstreamComponent? stream = null, bool doChecks = true) { - if (!Resolve(bloodsucker, ref bloodSuckerComponent)) - return; - - if (!Resolve(victim, ref stream)) + if (!Resolve(bloodsucker, ref bloodSuckerComponent) || !Resolve(victim, ref stream)) return; if (doChecks) { if (!_interactionSystem.InRangeUnobstructed(bloodsucker, victim)) - { return; - } if (_inventorySystem.TryGetSlotEntity(victim, "head", out var headUid) && HasComp(headUid)) { @@ -125,19 +124,15 @@ public void StartSuccDoAfter(EntityUid bloodsucker, EntityUid victim, BloodSucke } if (stream.BloodReagent != "Blood") - { - _popups.PopupEntity(Loc.GetString("bloodsucker-fail-not-blood", ("target", victim)), victim, bloodsucker, Shared.Popups.PopupType.Medium); - return; - } - - if (_solutionSystem.PercentFull(stream.Owner) != 0) + _popups.PopupEntity(Loc.GetString("bloodsucker-not-blood", ("target", victim)), victim, bloodsucker, Shared.Popups.PopupType.Medium); + else if (_solutionSystem.PercentFull(victim) != 0) _popups.PopupEntity(Loc.GetString("bloodsucker-fail-no-blood", ("target", victim)), victim, bloodsucker, Shared.Popups.PopupType.Medium); + else + _popups.PopupEntity(Loc.GetString("bloodsucker-doafter-start", ("target", victim)), victim, bloodsucker, Shared.Popups.PopupType.Medium); _popups.PopupEntity(Loc.GetString("bloodsucker-doafter-start-victim", ("sucker", bloodsucker)), victim, victim, Shared.Popups.PopupType.LargeCaution); - _popups.PopupEntity(Loc.GetString("bloodsucker-doafter-start", ("target", victim)), victim, bloodsucker, Shared.Popups.PopupType.Medium); - var ev = new BloodSuckDoAfterEvent(); - var args = new DoAfterArgs(EntityManager, bloodsucker, bloodSuckerComponent.Delay, ev, bloodsucker, target: victim) + var args = new DoAfterArgs(EntityManager, bloodsucker, bloodSuckerComponent.Delay, new BloodSuckDoAfterEvent(), bloodsucker, target: victim) { BreakOnTargetMove = true, BreakOnUserMove = false, @@ -206,8 +201,5 @@ public bool TrySucc(EntityUid bloodsucker, EntityUid victim, BloodSuckerComponen //} return true; } - - private record struct BloodSuckData() - {} } } diff --git a/Content.Shared/Actions/Events/AnomalyPowerActionEvent.cs b/Content.Shared/Actions/Events/AnomalyPowerActionEvent.cs index 7ef98a152c..9184460153 100644 --- a/Content.Shared/Actions/Events/AnomalyPowerActionEvent.cs +++ b/Content.Shared/Actions/Events/AnomalyPowerActionEvent.cs @@ -76,6 +76,10 @@ public partial record struct AnomalyPowerSettings() { public string PowerName; + public float ManaCost; + + public bool CheckInsulation; + /// /// When casting above the Supercritical Threshold, if not 0, this will cause all powers to enter cooldown for the given duration. /// diff --git a/Content.Shared/Actions/Events/DarkSwapActionEvent.cs b/Content.Shared/Actions/Events/DarkSwapActionEvent.cs new file mode 100644 index 0000000000..ad60d0ede4 --- /dev/null +++ b/Content.Shared/Actions/Events/DarkSwapActionEvent.cs @@ -0,0 +1,9 @@ +namespace Content.Shared.Actions.Events; +public sealed partial class DarkSwapActionEvent : InstantActionEvent +{ + [DataField] + public float ManaCost; + + [DataField] + public bool CheckInsulation; +} \ No newline at end of file diff --git a/Content.Shared/Actions/Events/SummonPsionicFamiliarActionEvent.cs b/Content.Shared/Actions/Events/SummonPsionicFamiliarActionEvent.cs new file mode 100644 index 0000000000..0df9d86f51 --- /dev/null +++ b/Content.Shared/Actions/Events/SummonPsionicFamiliarActionEvent.cs @@ -0,0 +1,54 @@ +using Robust.Shared.Prototypes; + +namespace Content.Shared.Actions.Events; + +public sealed partial class SummonPsionicFamiliarActionEvent : InstantActionEvent +{ + /// + /// The entity to be spawned by this power. + /// + [DataField] + public EntProtoId? FamiliarProto; + + /// + /// The name of this power, used for logging purposes. + /// + [DataField] + public string PowerName; + + /// + /// How much Mana this power should cost, if any. + /// + [DataField] + public float ManaCost; + + /// + /// Whether this power checks if the wearer is psionically insulated. + /// + [DataField] + public bool CheckInsulation; + + /// + /// Whether this power generates glimmer when used. + /// + [DataField] + public bool DoGlimmerEffects; + + /// + /// Whether the summoned entity will follow the one who summoned it. + /// + [DataField] + public bool FollowMaster; + + /// + /// The minimum amount of glimmer generated by this power. + /// + [DataField] + public int MinGlimmer; + + /// + /// The maximum amount of glimmer generated by this power. + /// + [DataField] + public int MaxGlimmer; +} diff --git a/Content.Shared/Administration/JobWhitelistsEuiState.cs b/Content.Shared/Administration/JobWhitelistsEuiState.cs new file mode 100644 index 0000000000..e993ab3aa5 --- /dev/null +++ b/Content.Shared/Administration/JobWhitelistsEuiState.cs @@ -0,0 +1,35 @@ +using Content.Shared.Eui; +using Content.Shared.Roles; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; + +namespace Content.Shared.Administration; + +[Serializable, NetSerializable] +public sealed class JobWhitelistsEuiState : EuiStateBase +{ + public string PlayerName; + public HashSet> Whitelists; + + public JobWhitelistsEuiState(string playerName, HashSet> whitelists) + { + PlayerName = playerName; + Whitelists = whitelists; + } +} + +/// +/// Tries to add or remove a whitelist of a job for a player. +/// +[Serializable, NetSerializable] +public sealed class SetJobWhitelistedMessage : EuiMessageBase +{ + public ProtoId Job; + public bool Whitelisting; + + public SetJobWhitelistedMessage(ProtoId job, bool whitelisting) + { + Job = job; + Whitelisting = whitelisting; + } +} diff --git a/Content.Shared/Alert/AlertType.cs b/Content.Shared/Alert/AlertType.cs index 0808114b9d..bd8c1dbe25 100644 --- a/Content.Shared/Alert/AlertType.cs +++ b/Content.Shared/Alert/AlertType.cs @@ -71,6 +71,7 @@ public enum AlertType : byte BorgCrit, BorgDead, Offer, + ShadowkinPower, Deflecting, } diff --git a/Content.Shared/Arachne/ArachneComponent.cs b/Content.Shared/Arachne/ArachneComponent.cs deleted file mode 100644 index 04c369cc45..0000000000 --- a/Content.Shared/Arachne/ArachneComponent.cs +++ /dev/null @@ -1,21 +0,0 @@ -using Robust.Shared.GameStates; - -namespace Content.Shared.Arachne -{ - [RegisterComponent, NetworkedComponent] - public sealed partial class ArachneComponent : Component - { - [DataField("cocoonDelay")] - public float CocoonDelay = 12f; - - [DataField("cocoonKnockdownMultiplier")] - public float CocoonKnockdownMultiplier = 0.5f; - - /// - /// Blood reagent required to web up a mob. - /// - - [DataField("webBloodReagent")] - public string WebBloodReagent = "Blood"; - } -} diff --git a/Content.Shared/Arachne/Events.cs b/Content.Shared/Arachne/Events.cs deleted file mode 100644 index 02001286ac..0000000000 --- a/Content.Shared/Arachne/Events.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Robust.Shared.Map; -using Robust.Shared.Serialization; -using Content.Shared.DoAfter; - -namespace Content.Shared.Arachne -{ - [Serializable, NetSerializable] - public sealed partial class ArachneCocoonDoAfterEvent : SimpleDoAfterEvent - { - } -} diff --git a/Content.Shared/Arachne/WebComponent.cs b/Content.Shared/Arachne/WebComponent.cs deleted file mode 100644 index c8284f3943..0000000000 --- a/Content.Shared/Arachne/WebComponent.cs +++ /dev/null @@ -1,8 +0,0 @@ -using Robust.Shared.GameStates; - -namespace Content.Shared.Arachne -{ - [RegisterComponent, NetworkedComponent] - public sealed partial class WebComponent : Component - {} -} diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index 679b99524e..92967805a7 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -224,6 +224,13 @@ public static readonly CVarDef public static readonly CVarDef GameMap = CVarDef.Create("game.map", string.Empty, CVar.SERVERONLY); + /// + /// If roles should be restricted based on whether or not they are whitelisted. + /// + public static readonly CVarDef + GameRoleWhitelist = CVarDef.Create("game.role_whitelist", true, CVar.SERVER | CVar.REPLICATED); + + /// /// Controls whether to use world persistence or not. /// @@ -1994,6 +2001,12 @@ public static readonly CVarDef public static readonly CVarDef ICShowSSDIndicator = CVarDef.Create("ic.show_ssd_indicator", true, CVar.CLIENTONLY); + /// + /// Allow Ethereal Ent to PassThrough Walls/Objects while in Ethereal. + /// + public static readonly CVarDef EtherealPassThrough = + CVarDef.Create("ic.EtherealPassThrough", false, CVar.SERVER); + /* * Salvage */ @@ -2049,13 +2062,13 @@ public static readonly CVarDef */ /// - /// Time that players have to wait before rules can be accepted. + /// Time that players have to wait before rules can be accepted. /// public static readonly CVarDef RulesWaitTime = - CVarDef.Create("rules.time", 60f, CVar.SERVER | CVar.REPLICATED); + CVarDef.Create("rules.time", 10f, CVar.SERVER | CVar.REPLICATED); /// - /// Don't show rules to localhost/loopback interface. + /// Don't show rules to localhost/loopback interface. /// public static readonly CVarDef RulesExemptLocal = CVarDef.Create("rules.exempt_local", true, CVar.SERVERONLY); diff --git a/Content.Shared/Chapel/SacrificeDoAfterEvent.cs b/Content.Shared/Chapel/SacrificeDoAfterEvent.cs index 444871a2fc..f730bab883 100644 --- a/Content.Shared/Chapel/SacrificeDoAfterEvent.cs +++ b/Content.Shared/Chapel/SacrificeDoAfterEvent.cs @@ -2,8 +2,6 @@ using Content.Shared.DoAfter; namespace Content.Shared.Chapel; -[Serializable, NetSerializable] -public sealed partial class SacrificeDoAfterEvent : SimpleDoAfterEvent -{ -} +[Serializable, NetSerializable] +public sealed partial class SacrificeDoAfterEvent : SimpleDoAfterEvent { } diff --git a/Content.Shared/Chapel/SacrificialAltarComponent.cs b/Content.Shared/Chapel/SacrificialAltarComponent.cs new file mode 100644 index 0000000000..c3db338861 --- /dev/null +++ b/Content.Shared/Chapel/SacrificialAltarComponent.cs @@ -0,0 +1,48 @@ +using Content.Shared.Random; +using Content.Shared.DoAfter; +using Robust.Shared.Audio; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Chapel; + +/// +/// Altar that lets you sacrifice psionics to lower glimmer by a large amount. +/// +[RegisterComponent, NetworkedComponent, Access(typeof(SharedSacrificialAltarSystem))] +public sealed partial class SacrificialAltarComponent : Component +{ + /// + /// DoAfter for an active sacrifice. + /// + [DataField] + public DoAfterId? DoAfter; + + /// + /// How long it takes to sacrifice someone once they die. + /// This is the window to interrupt a sacrifice if you want glimmer to stay high, or need the psionic to be revived. + /// + [DataField] + public TimeSpan SacrificeTime = TimeSpan.FromSeconds(8.35); + + [DataField] + public SoundSpecifier SacrificeSound = new SoundPathSpecifier("/Audio/Psionics/heartbeat_fast.ogg"); + + [DataField] + public EntityUid? SacrificeStream; + + /// + /// Base amount to reduce glimmer by, multiplied by the victim's Amplification stat. + /// + [DataField] + public float GlimmerReduction = 25; + + [DataField] + public List>? RewardPool; + + /// + /// The base chance to generate an item of power, multiplied by the victim's Dampening stat. + /// + [DataField] + public float BaseItemChance = 0.1f; +} diff --git a/Content.Shared/Chapel/SharedSacrificialAltarSystem.cs b/Content.Shared/Chapel/SharedSacrificialAltarSystem.cs new file mode 100644 index 0000000000..92df7e0f6b --- /dev/null +++ b/Content.Shared/Chapel/SharedSacrificialAltarSystem.cs @@ -0,0 +1,61 @@ +using System.Linq; +using Content.Shared.Buckle.Components; +using Content.Shared.DoAfter; +using Content.Shared.Examine; +using Content.Shared.Verbs; + +namespace Content.Shared.Chapel; + +public abstract partial class SharedSacrificialAltarSystem : EntitySystem +{ + [Dependency] protected readonly SharedDoAfterSystem DoAfter = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnExamined); + SubscribeLocalEvent(OnUnstrapped); + SubscribeLocalEvent>(OnGetVerbs); + } + + private void OnExamined(Entity ent, ref ExaminedEvent args) + { + args.PushMarkup(Loc.GetString("altar-examine")); + } + + private void OnUnstrapped(Entity ent, ref BuckleChangeEvent args) + { + if (ent.Comp.DoAfter is not { } id) + return; + + DoAfter.Cancel(id); + ent.Comp.DoAfter = null; + } + + private void OnGetVerbs(Entity ent, ref GetVerbsEvent args) + { + if (!args.CanAccess || !args.CanInteract || ent.Comp.DoAfter != null + || !TryComp(ent, out var strap) + || GetFirstBuckled(strap) is not { } target) + return; + + var user = args.User; + args.Verbs.Add(new AlternativeVerb() + { + Act = () => AttemptSacrifice(ent, user, target), + Text = Loc.GetString("altar-sacrifice-verb"), + Priority = 2 + }); + } + + private EntityUid? GetFirstBuckled(StrapComponent strap) + { + if (strap.BuckledEntities.Count <= 0) + return null; + + return strap.BuckledEntities.First(); + } + + protected virtual void AttemptSacrifice(Entity ent, EntityUid user, EntityUid target) { } +} diff --git a/Content.Shared/Arachne/CocoonComponent.cs b/Content.Shared/Cocoon/CocoonComponent.cs similarity index 61% rename from Content.Shared/Arachne/CocoonComponent.cs rename to Content.Shared/Cocoon/CocoonComponent.cs index e22e393ffd..66ba6e6dd3 100644 --- a/Content.Shared/Arachne/CocoonComponent.cs +++ b/Content.Shared/Cocoon/CocoonComponent.cs @@ -1,13 +1,14 @@ -namespace Content.Shared.Arachne +namespace Content.Shared.Cocoon { [RegisterComponent] public sealed partial class CocoonComponent : Component { - public bool WasReplacementAccent = false; + public string? OldAccent; - public string OldAccent = ""; + public EntityUid? Victim; [DataField("damagePassthrough")] public float DamagePassthrough = 0.5f; + } } diff --git a/Content.Shared/Cocoon/CocoonDoAfterEvent.cs b/Content.Shared/Cocoon/CocoonDoAfterEvent.cs new file mode 100644 index 0000000000..55986d2894 --- /dev/null +++ b/Content.Shared/Cocoon/CocoonDoAfterEvent.cs @@ -0,0 +1,10 @@ +using Robust.Shared.Serialization; +using Content.Shared.DoAfter; + +namespace Content.Shared.Cocoon +{ + [Serializable, NetSerializable] + public sealed partial class CocoonDoAfterEvent : SimpleDoAfterEvent + { + } +} diff --git a/Content.Shared/Cocoon/CocoonerComponent.cs b/Content.Shared/Cocoon/CocoonerComponent.cs new file mode 100644 index 0000000000..17cce97309 --- /dev/null +++ b/Content.Shared/Cocoon/CocoonerComponent.cs @@ -0,0 +1,14 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Cocoon +{ + [RegisterComponent, NetworkedComponent] + public sealed partial class CocoonerComponent : Component + { + [DataField("cocoonDelay")] + public float CocoonDelay = 12f; + + [DataField("cocoonKnockdownMultiplier")] + public float CocoonKnockdownMultiplier = 0.5f; + } +} diff --git a/Content.Shared/Contests/ContestsSystem.Utilities.cs b/Content.Shared/Contests/ContestsSystem.Utilities.cs index 0278d75e94..2bcb6dcc32 100644 --- a/Content.Shared/Contests/ContestsSystem.Utilities.cs +++ b/Content.Shared/Contests/ContestsSystem.Utilities.cs @@ -30,27 +30,27 @@ public float ContestConstructor(EntityUid user, ContestArgs args) return 1; if (!args.DoEveryInteraction) - return args.DoMassInteraction ? ((!args.MassDisadvantage + return args.DoMassInteraction ? ((args.MassDisadvantage ? MassContest(user, args.MassBypassClamp, args.MassRangeModifier) : 1 / MassContest(user, args.MassBypassClamp, args.MassRangeModifier)) + args.MassOffset) : 1 - * (args.DoStaminaInteraction ? ((!args.StaminaDisadvantage + * (args.DoStaminaInteraction ? ((args.StaminaDisadvantage ? StaminaContest(user, args.StaminaBypassClamp, args.StaminaRangeModifier) : 1 / StaminaContest(user, args.StaminaBypassClamp, args.StaminaRangeModifier)) + args.StaminaOffset) : 1) - * (args.DoHealthInteraction ? ((!args.HealthDisadvantage + * (args.DoHealthInteraction ? ((args.HealthDisadvantage ? HealthContest(user, args.HealthBypassClamp, args.HealthRangeModifier) : 1 / HealthContest(user, args.HealthBypassClamp, args.HealthRangeModifier)) + args.HealthOffset) : 1) - * (args.DoMindInteraction ? ((!args.MindDisadvantage + * (args.DoMindInteraction ? ((args.MindDisadvantage ? MindContest(user, args.MindBypassClamp, args.MindRangeModifier) : 1 / MindContest(user, args.MindBypassClamp, args.MindRangeModifier)) + args.MindOffset) : 1) - * (args.DoMoodInteraction ? ((!args.MoodDisadvantage + * (args.DoMoodInteraction ? ((args.MoodDisadvantage ? MoodContest(user, args.MoodBypassClamp, args.MoodRangeModifier) : 1 / MoodContest(user, args.MoodBypassClamp, args.MoodRangeModifier)) + args.MoodOffset) @@ -280,4 +280,4 @@ public sealed partial class ContestArgs /// [DataField] public bool EveryInteractionSumOrMultiply; -} \ No newline at end of file +} diff --git a/Content.Shared/Customization/Systems/CharacterRequirements.Whitelist.cs b/Content.Shared/Customization/Systems/CharacterRequirements.Whitelist.cs index d23d472e06..78a520ca8d 100644 --- a/Content.Shared/Customization/Systems/CharacterRequirements.Whitelist.cs +++ b/Content.Shared/Customization/Systems/CharacterRequirements.Whitelist.cs @@ -6,6 +6,7 @@ using Robust.Shared.Prototypes; using Robust.Shared.Serialization; using Robust.Shared.Utility; +using Robust.Shared.Network; namespace Content.Shared.Customization.Systems; diff --git a/Content.Shared/DeltaV/GlimmerWisp/Events.cs b/Content.Shared/DeltaV/GlimmerWisp/Events.cs new file mode 100644 index 0000000000..10d985193b --- /dev/null +++ b/Content.Shared/DeltaV/GlimmerWisp/Events.cs @@ -0,0 +1,5 @@ +using Content.Shared.DoAfter; +using Robust.Shared.Serialization; + +[NetSerializable, Serializable] +public sealed partial class LifeDrainDoAfterEvent : SimpleDoAfterEvent; diff --git a/Content.Shared/Ensnaring/Components/EnsnaringComponent.cs b/Content.Shared/Ensnaring/Components/EnsnaringComponent.cs index 6e1f3077f3..fe415e0f4a 100644 --- a/Content.Shared/Ensnaring/Components/EnsnaringComponent.cs +++ b/Content.Shared/Ensnaring/Components/EnsnaringComponent.cs @@ -11,59 +11,57 @@ public sealed partial class EnsnaringComponent : Component /// /// How long it should take to free someone else. /// - [ViewVariables(VVAccess.ReadWrite)] - [DataField("freeTime")] + [DataField] public float FreeTime = 3.5f; /// /// How long it should take for an entity to free themselves. /// - [ViewVariables(VVAccess.ReadWrite)] - [DataField("breakoutTime")] + [DataField] public float BreakoutTime = 30.0f; /// /// How much should this slow down the entities walk? /// - [ViewVariables(VVAccess.ReadWrite)] - [DataField("walkSpeed")] + [DataField] public float WalkSpeed = 0.9f; /// /// How much should this slow down the entities sprint? /// - [ViewVariables(VVAccess.ReadWrite)] - [DataField("sprintSpeed")] + [DataField] public float SprintSpeed = 0.9f; /// /// How much stamina does the ensnare sap /// - [ViewVariables(VVAccess.ReadWrite)] - [DataField("staminaDamage")] + [DataField] public float StaminaDamage = 55f; /// /// Should this ensnare someone when thrown? /// - [ViewVariables(VVAccess.ReadWrite)] - [DataField("canThrowTrigger")] + [DataField] public bool CanThrowTrigger; /// /// What is ensnared? /// - [ViewVariables(VVAccess.ReadWrite)] - [DataField("ensnared")] + [DataField] public EntityUid? Ensnared; /// /// Should breaking out be possible when moving? /// - [ViewVariables(VVAccess.ReadWrite)] - [DataField("canMoveBreakout")] + [DataField] public bool CanMoveBreakout; + /// + /// Should the ensaring entity be deleted upon removal? + /// + [DataField] + public bool DestroyOnRemove = false; + } /// diff --git a/Content.Shared/Eye/VisibilityFlags.cs b/Content.Shared/Eye/VisibilityFlags.cs index 7e2dd33d7d..2e20b1de4f 100644 --- a/Content.Shared/Eye/VisibilityFlags.cs +++ b/Content.Shared/Eye/VisibilityFlags.cs @@ -6,10 +6,11 @@ namespace Content.Shared.Eye [FlagsFor(typeof(VisibilityMaskLayer))] public enum VisibilityFlags : int { - None = 0, + None = 0, Normal = 1 << 0, - Ghost = 1 << 1, + Ghost = 1 << 1, PsionicInvisibility = 1 << 2, //Nyano - Summary: adds Psionic Invisibility as a visibility layer. Currently does nothing. - TelegnosticProjection = 5, + TelegnosticProjection = 5, + Ethereal = 1 << 3, } } diff --git a/Content.Shared/Hands/Components/HandHelpers.cs b/Content.Shared/Hands/Components/HandHelpers.cs index 11fff6d9c8..aecf3a6936 100644 --- a/Content.Shared/Hands/Components/HandHelpers.cs +++ b/Content.Shared/Hands/Components/HandHelpers.cs @@ -1,4 +1,5 @@ using System.Linq; +using Content.Shared.Hands.EntitySystems; namespace Content.Shared.Hands.Components; @@ -20,6 +21,15 @@ public static class HandHelpers /// public static int CountFreeHands(this HandsComponent component) => component.Hands.Values.Count(hand => hand.IsEmpty); + /// + /// Get the number of hands that are not currently holding anything. This is a LinQ method, not a property, so + /// cache it instead of accessing this multiple times. + /// + public static int CountFreeableHands(this Entity component, SharedHandsSystem system) + { + return system.CountFreeableHands(component); + } + /// /// Get a list of hands that are currently holding nothing. This is a LinQ method, not a property, so cache /// it instead of accessing this multiple times. diff --git a/Content.Shared/Hands/EntitySystems/SharedHandsSystem.cs b/Content.Shared/Hands/EntitySystems/SharedHandsSystem.cs index fd732009e9..40f2c5bbd5 100644 --- a/Content.Shared/Hands/EntitySystems/SharedHandsSystem.cs +++ b/Content.Shared/Hands/EntitySystems/SharedHandsSystem.cs @@ -5,7 +5,6 @@ using Content.Shared.Hands.Components; using Content.Shared.Interaction; using Content.Shared.Inventory.VirtualItem; -using Content.Shared.Item; using Content.Shared.Storage.EntitySystems; using Robust.Shared.Containers; using Robust.Shared.Input.Binding; @@ -299,4 +298,14 @@ public bool TryGetHand(EntityUid handsUid, string handId, [NotNullWhen(true)] ou return hands.Hands.TryGetValue(handId, out hand); } + + public int CountFreeableHands(Entity hands) + { + var freeable = 0; + foreach (var hand in hands.Comp.Hands.Values) + if (hand.IsEmpty || CanDropHeld(hands, hand)) + freeable++; + + return freeable; + } } diff --git a/Content.Shared/HealthExaminable/HealthExaminableSystem.cs b/Content.Shared/HealthExaminable/HealthExaminableSystem.cs index 39addfc941..091176a3cb 100644 --- a/Content.Shared/HealthExaminable/HealthExaminableSystem.cs +++ b/Content.Shared/HealthExaminable/HealthExaminableSystem.cs @@ -30,30 +30,33 @@ private void OnGetExamineVerbs(EntityUid uid, HealthExaminableComponent componen var detailsRange = _examineSystem.IsInDetailsRange(args.User, uid); - var verb = new ExamineVerb() + var verb = new ExamineVerb { Act = () => { - FormattedMessage markup; - if (uid == args.User - && TryComp(uid, out var selfAware)) - markup = CreateMarkupSelfAware(uid, selfAware, component, damage); - else - markup = CreateMarkup(uid, component, damage); - + var markup = GetMarkup(args.User, (uid, component), damage); _examineSystem.SendExamineTooltip(args.User, uid, markup, false, false); }, Text = Loc.GetString("health-examinable-verb-text"), Category = VerbCategory.Examine, Disabled = !detailsRange, Message = detailsRange ? null : Loc.GetString("health-examinable-verb-disabled"), - Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/VerbIcons/rejuvenate.svg.192dpi.png")) + Icon = new SpriteSpecifier.Texture(new ResPath("/Textures/Interface/VerbIcons/rejuvenate.svg.192dpi.png")) }; args.Verbs.Add(verb); } - public FormattedMessage CreateMarkup(EntityUid uid, HealthExaminableComponent component, DamageableComponent damage) + public FormattedMessage GetMarkup(EntityUid examiner, + Entity examinable, + DamageableComponent damageable) + { + return examiner == examinable.Owner && TryComp(examinable, out var selfAware) + ? CreateMarkupSelfAware(examinable, selfAware, examinable.Comp, damageable) + : CreateMarkup(examinable, examinable.Comp, damageable); + } + + private FormattedMessage CreateMarkup(EntityUid uid, HealthExaminableComponent component, DamageableComponent damage) { var msg = new FormattedMessage(); diff --git a/Content.Shared/Humanoid/EyeColor.cs b/Content.Shared/Humanoid/EyeColor.cs new file mode 100644 index 0000000000..a39e090a86 --- /dev/null +++ b/Content.Shared/Humanoid/EyeColor.cs @@ -0,0 +1,4 @@ +namespace Content.Shared.Humanoid; + +[ByRefEvent] +public record struct EyeColorInitEvent(); \ No newline at end of file diff --git a/Content.Shared/Humanoid/SharedHumanoidAppearanceSystem.cs b/Content.Shared/Humanoid/SharedHumanoidAppearanceSystem.cs index dc1e6b736c..a1e8bec2cd 100644 --- a/Content.Shared/Humanoid/SharedHumanoidAppearanceSystem.cs +++ b/Content.Shared/Humanoid/SharedHumanoidAppearanceSystem.cs @@ -15,6 +15,7 @@ using Robust.Shared.Network; using Robust.Shared.Player; using Robust.Shared.Prototypes; +using Content.Shared.Shadowkin; using Robust.Shared.Serialization.Manager; using Robust.Shared.Serialization.Markdown; using Robust.Shared.Utility; @@ -104,6 +105,12 @@ private void OnExamined(EntityUid uid, HumanoidAppearanceComponent component, Ex var identity = Identity.Entity(uid, EntityManager); var species = GetSpeciesRepresentation(component.Species, component.CustomSpecieName).ToLower(); var age = GetAgeRepresentation(component.Species, component.Age); + if (HasComp(uid)) + { + var color = component.EyeColor.Name(); + if (color != null) + age = Loc.GetString("identity-eye-shadowkin", ("color", color)); + } args.PushText(Loc.GetString("humanoid-appearance-component-examine", ("user", identity), ("age", age), ("species", species))); } @@ -362,6 +369,8 @@ public virtual void LoadProfile(EntityUid uid, HumanoidCharacterProfile profile, SetSpecies(uid, profile.Species, false, humanoid); SetSex(uid, profile.Sex, false, humanoid); humanoid.EyeColor = profile.Appearance.EyeColor; + var ev = new EyeColorInitEvent(); + RaiseLocalEvent(uid, ref ev); SetSkinColor(uid, profile.Appearance.SkinColor, false); diff --git a/Content.Shared/Inventory/VirtualItem/SharedVirtualItemSystem.cs b/Content.Shared/Inventory/VirtualItem/SharedVirtualItemSystem.cs index e45530e458..60beb54652 100644 --- a/Content.Shared/Inventory/VirtualItem/SharedVirtualItemSystem.cs +++ b/Content.Shared/Inventory/VirtualItem/SharedVirtualItemSystem.cs @@ -4,6 +4,7 @@ using Content.Shared.Interaction; using Content.Shared.Inventory.Events; using Content.Shared.Item; +using Content.Shared.Popups; using Robust.Shared.Containers; using Robust.Shared.Network; using Robust.Shared.Prototypes; @@ -29,6 +30,7 @@ public abstract class SharedVirtualItemSystem : EntitySystem [Dependency] private readonly SharedItemSystem _itemSystem = default!; [Dependency] private readonly InventorySystem _inventorySystem = default!; [Dependency] private readonly SharedHandsSystem _handsSystem = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; [ValidatePrototypeId] private const string VirtualItem = "VirtualItem"; @@ -71,23 +73,48 @@ private void OnBeforeRangedInteract(Entity ent, ref Before } #region Hands + /// /// Spawns a virtual item in a empty hand /// /// The entity we will make a virtual entity copy of /// The entity that we want to insert the virtual entity - public bool TrySpawnVirtualItemInHand(EntityUid blockingEnt, EntityUid user) + /// Whether or not to try and drop other items to make space + public bool TrySpawnVirtualItemInHand(EntityUid blockingEnt, EntityUid user, bool dropOthers = false) { - return TrySpawnVirtualItemInHand(blockingEnt, user, out _); + return TrySpawnVirtualItemInHand(blockingEnt, user, out _, dropOthers); } - /// - public bool TrySpawnVirtualItemInHand(EntityUid blockingEnt, EntityUid user, [NotNullWhen(true)] out EntityUid? virtualItem) + /// + public bool TrySpawnVirtualItemInHand(EntityUid blockingEnt, EntityUid user, [NotNullWhen(true)] out EntityUid? virtualItem, bool dropOthers = false) { - if (!TrySpawnVirtualItem(blockingEnt, user, out virtualItem) || !_handsSystem.TryGetEmptyHand(user, out var hand)) + virtualItem = null; + if (!_handsSystem.TryGetEmptyHand(user, out var empty)) + { + if (!dropOthers) + return false; + + foreach (var hand in _handsSystem.EnumerateHands(user)) + { + if (hand.HeldEntity is not { } held + || held == blockingEnt + || HasComp(held) + || !_handsSystem.TryDrop(user, hand)) + continue; + + if (!TerminatingOrDeleted(held)) + _popup.PopupClient(Loc.GetString("virtual-item-dropped-other", ("dropped", held)), user, user); + + empty = hand; + break; + } + } + + if (empty == null + || !TrySpawnVirtualItem(blockingEnt, user, out virtualItem)) return false; - _handsSystem.DoPickup(user, hand, virtualItem.Value); + _handsSystem.DoPickup(user, empty, virtualItem.Value); return true; } @@ -120,6 +147,7 @@ public void DeleteInHandsMatching(EntityUid user, EntityUid matching) /// The entity we will make a virtual entity copy of /// The entity that we want to insert the virtual entity /// The slot to which we will insert the virtual entity (could be the "shoes" slot, for example) + /// Whether or not to force an equip public bool TrySpawnVirtualItemInInventory(EntityUid blockingEnt, EntityUid user, string slot, bool force = false) { return TrySpawnVirtualItemInInventory(blockingEnt, user, slot, force, out _); @@ -140,6 +168,8 @@ public bool TrySpawnVirtualItemInInventory(EntityUid blockingEnt, EntityUid user /// that's done check if the found virtual entity is a copy of our matching entity, /// if it is, delete it /// + /// The entity that we want to delete the virtual entity from + /// The entity that made the virtual entity /// Set this param if you have the name of the slot, it avoids unnecessary queries public void DeleteInSlotMatching(EntityUid user, EntityUid matching, string? slotName = null) { @@ -178,6 +208,7 @@ public void DeleteInSlotMatching(EntityUid user, EntityUid matching, string? slo /// /// The entity we will make a virtual entity copy of /// The entity that we want to insert the virtual entity + /// The virtual item, if spawned public bool TrySpawnVirtualItem(EntityUid blockingEnt, EntityUid user, [NotNullWhen(true)] out EntityUid? virtualItem) { if (_netManager.IsClient) diff --git a/Content.Shared/Language/LanguagePrototype.cs b/Content.Shared/Language/LanguagePrototype.cs index 2137e4e838..3b2b24c4b2 100644 --- a/Content.Shared/Language/LanguagePrototype.cs +++ b/Content.Shared/Language/LanguagePrototype.cs @@ -53,6 +53,14 @@ public sealed partial class SpeechOverrideInfo [DataField] public bool AllowRadio = true; + /// + /// If true, the message will be relayed to the Empathy Chat and + /// anyone with that language will also hear Empathy Chat. (Unless user has ShadowkinBlackeyeComponent) + /// This is mostly only use for "Marish" but... fuckit modularity :p + /// + [DataField] + public bool EmpathySpeech = false; + /// /// If false, the entity can use this language even when it's unable to speak (i.e. muffled or muted), /// and accents are not applied to messages in this language. diff --git a/Content.Shared/Players/JobWhitelist/MsgJobWhitelist.cs b/Content.Shared/Players/JobWhitelist/MsgJobWhitelist.cs new file mode 100644 index 0000000000..27b0b6c614 --- /dev/null +++ b/Content.Shared/Players/JobWhitelist/MsgJobWhitelist.cs @@ -0,0 +1,33 @@ +using Lidgren.Network; +using Robust.Shared.Network; +using Robust.Shared.Serialization; + +namespace Content.Shared.Players.JobWhitelist; + +public sealed class MsgJobWhitelist : NetMessage +{ + public override MsgGroups MsgGroup => MsgGroups.EntityEvent; + + public HashSet Whitelist = new(); + + public override void ReadFromBuffer(NetIncomingMessage buffer, IRobustSerializer serializer) + { + var count = buffer.ReadVariableInt32(); + Whitelist.EnsureCapacity(count); + + for (var i = 0; i < count; i++) + { + Whitelist.Add(buffer.ReadString()); + } + } + + public override void WriteToBuffer(NetOutgoingMessage buffer, IRobustSerializer serializer) + { + buffer.WriteVariableInt32(Whitelist.Count); + + foreach (var ban in Whitelist) + { + buffer.Write(ban); + } + } +} diff --git a/Content.Shared/Psionics/PsionicComponent.cs b/Content.Shared/Psionics/PsionicComponent.cs index 37d0a9a7ef..16e0f028de 100644 --- a/Content.Shared/Psionics/PsionicComponent.cs +++ b/Content.Shared/Psionics/PsionicComponent.cs @@ -5,9 +5,38 @@ namespace Content.Shared.Abilities.Psionics { - [RegisterComponent, NetworkedComponent] + [RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true)] public sealed partial class PsionicComponent : Component { + /// + /// Current Mana. + /// + [DataField, AutoNetworkedField] + public float Mana; + + /// + /// Max Mana Possible. + /// + [DataField, AutoNetworkedField] + public float MaxMana = 100; + + /// + /// How much energy is gained per second. + /// + [DataField] + public float ManaGain = 1; + + /// + /// ManaGain Multiplier + /// + [DataField] + public float ManaGainMultiplier = 1; + + public float ManaAccumulator; + + [DataField] + public bool BypassManaCheck; + /// /// How close a Psion is to generating a new power. When Potentia reaches the NextPowerCost, it is "Spent" in order to "Buy" a random new power. /// TODO: Psi-Potentiometry should be able to read how much Potentia a person has. @@ -45,6 +74,10 @@ public sealed partial class PsionicComponent : Component public string MindbreakingStutterAccent = "StutteringAccent"; + /// + /// The message feedback given on mindbreak. + /// + [DataField] public string MindbreakingFeedback = "mindbreaking-feedback"; /// @@ -163,6 +196,7 @@ private set [ViewVariables(VVAccess.ReadWrite)] public int PowerSlotsTaken; + /// /// List of descriptors this entity will bring up for psychognomy. Used to remove /// unneccesary subs for unique psionic entities like e.g. Oracle. /// @@ -176,5 +210,20 @@ private set /// Popup to play if a Psion attempts to start casting a power while already casting one [DataField] public string AlreadyCasting = "already-casting"; + + /// Popup to play if there no Mana left for a power to execute. + public string NoMana = "no-mana"; + + /// + /// The list of Familiars currently bound to this Psion. + /// + [DataField] + public List Familiars = new(); + + /// + /// The maximum number of Familiars a Psion may bind. + /// + [DataField] + public int FamiliarLimit = 1; } } diff --git a/Content.Shared/Psionics/PsionicEvents.cs b/Content.Shared/Psionics/PsionicEvents.cs index be3bf03af6..4d13441798 100644 --- a/Content.Shared/Psionics/PsionicEvents.cs +++ b/Content.Shared/Psionics/PsionicEvents.cs @@ -8,4 +8,10 @@ namespace Content.Shared.Psionics; /// /// [ByRefEvent] -public record struct OnSetPsionicStatsEvent(float AmplificationChangedAmount, float DampeningChangedAmount); \ No newline at end of file +public record struct OnSetPsionicStatsEvent(float AmplificationChangedAmount, float DampeningChangedAmount); + +[ByRefEvent] +public record struct OnMindbreakEvent(); + +[ByRefEvent] +public record struct OnManaUpdateEvent(); \ No newline at end of file diff --git a/Content.Shared/Psionics/PsionicFamiliarComponent.cs b/Content.Shared/Psionics/PsionicFamiliarComponent.cs new file mode 100644 index 0000000000..d47b01e7e7 --- /dev/null +++ b/Content.Shared/Psionics/PsionicFamiliarComponent.cs @@ -0,0 +1,75 @@ +using Content.Shared.Popups; +using Robust.Shared.GameStates; + +namespace Content.Shared.Abilities.Psionics; + +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true)] +public sealed partial class PsionicFamiliarComponent : Component +{ + /// + /// The entity that summoned this Familiar. + /// + [DataField, AutoNetworkedField] + public EntityUid? Master; + + /// + /// Whether the familiar is allowed to attack its Master. + /// + [DataField] + public bool CanAttackMaster; + + /// + /// Popup to play when a familiar that isn't allowed to attack its Master, attempts to do so. + /// + [DataField] + public string AttackMasterText = "psionic-familiar-cant-attack-master"; + + /// + /// Popup type to use when failing to attack the familiar's Master. + /// + [DataField] + public PopupType AttackPopupType = PopupType.SmallCaution; + + /// + /// Text to display when a Familiar is forced to return from whence it came. + /// + [DataField] + public string DespawnText = "psionic-familiar-despawn-text"; + + /// + /// Popup type to use when a Familiar is forced to return from whence it came. + /// + [DataField] + public PopupType DespawnPopopType = PopupType.MediumCaution; + + /// + /// Whether a Psionic Familiar is sent back from whence it came if its Master dies. + /// + [DataField] + public bool DespawnOnMasterDeath = true; + + /// + /// Whether a Psionic Familiar is sent back from whence it came if it dies. + /// + [DataField] + public bool DespawnOnFamiliarDeath = true; + + /// + /// Whether a Psionic Familiar is sent back from whence it came if its Master is mindbroken. + /// + [DataField] + public bool DespawnOnMasterMindbroken = true; + + /// + /// Should the Familiar despawn when the player controlling it disconnects. + /// + [DataField] + public bool DespawnOnPlayerDetach; + + /// + /// Whether a Psionic Familiar inherits its Master's factions. + /// This can get people into trouble if the familiar inherits a hostile faction such as Syndicate. + /// + [DataField] + public bool InheritMasterFactions = true; +} diff --git a/Content.Shared/Psionics/SharedPsionicAbilitiesSystem.cs b/Content.Shared/Psionics/SharedPsionicAbilitiesSystem.cs index 2792864568..b79dabbc41 100644 --- a/Content.Shared/Psionics/SharedPsionicAbilitiesSystem.cs +++ b/Content.Shared/Psionics/SharedPsionicAbilitiesSystem.cs @@ -1,9 +1,13 @@ using Content.Shared.Administration.Logs; using Content.Shared.Contests; using Content.Shared.Popups; +using Content.Shared.Psionics; using Content.Shared.Psionics.Glimmer; using Robust.Shared.Random; using Robust.Shared.Serialization; +using Content.Shared.Mobs.Systems; +using Content.Shared.FixedPoint; +using Content.Shared.Rejuvenate; namespace Content.Shared.Abilities.Psionics { @@ -15,11 +19,54 @@ public sealed class SharedPsionicAbilitiesSystem : EntitySystem [Dependency] private readonly GlimmerSystem _glimmerSystem = default!; [Dependency] private readonly IRobustRandom _robustRandom = default!; [Dependency] private readonly ContestsSystem _contests = default!; + [Dependency] private readonly MobStateSystem _mobState = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnPowerUsed); + SubscribeLocalEvent(OnRejuvenate); + } + + public bool OnAttemptPowerUse(EntityUid uid, string power, float? manacost = null, bool checkInsulation = true) + { + if (!TryComp(uid, out var component) + || HasComp(uid) + || checkInsulation + && HasComp(uid)) + return false; + + var tev = new OnAttemptPowerUseEvent(uid, power); + RaiseLocalEvent(uid, tev); + + if (tev.Cancelled) + return false; + + if (component.DoAfter is not null) + { + _popups.PopupEntity(Loc.GetString(component.AlreadyCasting), uid, uid, PopupType.LargeCaution); + return false; + } + + if (manacost is null) + return true; + + if (component.Mana >= manacost + || component.BypassManaCheck) + { + var newmana = component.Mana - manacost; + component.Mana = newmana ?? component.Mana; + + var ev = new OnManaUpdateEvent(); + RaiseLocalEvent(uid, ref ev); + } + else + { + _popups.PopupEntity(Loc.GetString(component.NoMana), uid, uid, PopupType.LargeCaution); + return false; + } + + return true; } private void OnPowerUsed(EntityUid uid, PsionicComponent component, PsionicPowerUsedEvent args) @@ -85,6 +132,45 @@ public float ModifiedDampening(EntityUid uid, PsionicComponent component) { return component.CurrentDampening / _contests.MoodContest(uid, true); } + + public void OnRejuvenate(EntityUid uid, PsionicComponent component, RejuvenateEvent args) + { + component.Mana = component.MaxMana; + var ev = new OnManaUpdateEvent(); + RaiseLocalEvent(uid, ref ev); + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var component)) + { + if (_mobState.IsDead(uid)) + continue; + + component.ManaAccumulator += frameTime; + + if (component.ManaAccumulator <= 1) + continue; + + component.ManaAccumulator -= 1; + + if (component.Mana > component.MaxMana) + component.Mana = component.MaxMana; + + if (component.Mana < component.MaxMana) + { + var gainedmana = component.ManaGain * component.ManaGainMultiplier; + component.Mana += gainedmana; + FixedPoint2.Min(component.Mana, component.MaxMana); + + var ev = new OnManaUpdateEvent(); + RaiseLocalEvent(uid, ref ev); + } + } + } } public sealed class PsionicPowerUsedEvent : HandledEntityEventArgs @@ -99,6 +185,18 @@ public PsionicPowerUsedEvent(EntityUid user, string power) } } + public sealed class OnAttemptPowerUseEvent : CancellableEntityEventArgs + { + public EntityUid User { get; } + public string Power = string.Empty; + + public OnAttemptPowerUseEvent(EntityUid user, string power) + { + User = user; + Power = power; + } + } + [Serializable] [NetSerializable] public sealed class PsionicsChangedEvent : EntityEventArgs diff --git a/Content.Shared/RadialSelector/Ui.cs b/Content.Shared/RadialSelector/Ui.cs new file mode 100644 index 0000000000..656e194dfe --- /dev/null +++ b/Content.Shared/RadialSelector/Ui.cs @@ -0,0 +1,52 @@ +using Robust.Shared.Serialization; +using Robust.Shared.Utility; + +namespace Content.Shared.RadialSelector; + +[NetSerializable, Serializable] +public enum RadialSelectorUiKey : byte +{ + Key, +} + +[Serializable, NetSerializable] +public sealed class RadialSelectorState(List entries, bool openCentered = false) + : BoundUserInterfaceState +{ + [DataField(required: true)] + public List Entries = entries; + + public bool OpenCentered { get; } = openCentered; +} + +[Serializable, NetSerializable] +public sealed class RadialSelectorSelectedMessage(string selectedItem) : BoundUserInterfaceMessage +{ + public string SelectedItem { get; private set; } = selectedItem; +} + +[DataDefinition, Serializable, NetSerializable] +public sealed partial class RadialSelectorEntry +{ + [DataField] + public string? Prototype { get; set; } + + [DataField] + public SpriteSpecifier? Icon { get; set; } + + [DataField] + public RadialSelectorCategory? Category { get; set; } +} + +[DataDefinition, Serializable, NetSerializable] +public sealed partial class RadialSelectorCategory +{ + [DataField(required: true)] + public string Name { get; set; } = string.Empty; + + [DataField(required: true)] + public SpriteSpecifier Icon { get; set; } = default!; + + [DataField(required: true)] + public List Entries { get; set; } = new(); +} diff --git a/Content.Shared/Roles/JobPrototype.cs b/Content.Shared/Roles/JobPrototype.cs index 15f8233aab..5cf8cf38fb 100644 --- a/Content.Shared/Roles/JobPrototype.cs +++ b/Content.Shared/Roles/JobPrototype.cs @@ -123,6 +123,9 @@ public sealed partial class JobPrototype : IPrototype [DataField("extendedAccessGroups")] public IReadOnlyCollection> ExtendedAccessGroups { get; private set; } = Array.Empty>(); + + [DataField] + public bool Whitelisted; } /// diff --git a/Content.Shared/Shadowkin/EtherealComponent.cs b/Content.Shared/Shadowkin/EtherealComponent.cs new file mode 100644 index 0000000000..0fc50c0f12 --- /dev/null +++ b/Content.Shared/Shadowkin/EtherealComponent.cs @@ -0,0 +1,36 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Shadowkin; + +[RegisterComponent, NetworkedComponent] +public sealed partial class EtherealComponent : Component +{ + /// + /// Does the Ent, Dark lights around it? + /// + [DataField] + public bool Darken = false; + + /// + /// Range of the Darken Effect. + /// + [DataField] + public float DarkenRange = 5; + + /// + /// Darken Effect Rate. + /// + [DataField] + public float DarkenRate = 0.084f; + + public List DarkenedLights = new(); + + public float DarkenAccumulator; + + public int OldMobMask; + + public int OldMobLayer; + + public List SuppressedFactions = new(); + public bool HasDoorBumpTag; +} \ No newline at end of file diff --git a/Content.Shared/Shadowkin/EtherealStunItemComponent.cs b/Content.Shared/Shadowkin/EtherealStunItemComponent.cs new file mode 100644 index 0000000000..053b5c11f6 --- /dev/null +++ b/Content.Shared/Shadowkin/EtherealStunItemComponent.cs @@ -0,0 +1,11 @@ +namespace Content.Shared.Shadowkin; + +[RegisterComponent] +public sealed partial class EtherealStunItemComponent : Component +{ + [DataField] + public float Radius = 10; + + [DataField] + public bool DeleteOnUse = true; +} \ No newline at end of file diff --git a/Content.Shared/Shadowkin/ShadowkinComponent.cs b/Content.Shared/Shadowkin/ShadowkinComponent.cs new file mode 100644 index 0000000000..b382f3112b --- /dev/null +++ b/Content.Shared/Shadowkin/ShadowkinComponent.cs @@ -0,0 +1,42 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Shadowkin; + +[RegisterComponent, NetworkedComponent] +public sealed partial class ShadowkinComponent : Component +{ + /// + /// Apply the SleepManaRegenMultiplier on SleepComponent if true. + /// + [DataField] + public bool SleepManaRegen = true; + + /// + /// What do edit the ManaRegenMultiplier when on Sleep. + /// + [DataField] + public float SleepManaRegenMultiplier = 4; + + /// + /// On MapInitEvent, will Blackeye the Shadowkin. + /// + [DataField] + public bool BlackeyeSpawn; + + /// + /// If mana is equal or lower then this value, blackeye the shadowkin. + /// + [DataField] + public float BlackEyeMana; + + /// + /// Set the Black-Eye Color. + /// + [DataField] + public Color BlackEyeColor = Color.Black; + + public Color OldEyeColor = Color.LimeGreen; + + [DataField] + public EntityUid? ShadowkinSleepAction; +} \ No newline at end of file diff --git a/Content.Shared/Shadowkin/ShadowkinCuffComponent.cs b/Content.Shared/Shadowkin/ShadowkinCuffComponent.cs new file mode 100644 index 0000000000..b4c62d6664 --- /dev/null +++ b/Content.Shared/Shadowkin/ShadowkinCuffComponent.cs @@ -0,0 +1,4 @@ +namespace Content.Shared.Shadowkin; + +[RegisterComponent] +public sealed partial class ShadowkinCuffComponent : Component { } \ No newline at end of file diff --git a/Content.Shared/Shadowkin/SharedEtherealSystem.cs b/Content.Shared/Shadowkin/SharedEtherealSystem.cs new file mode 100644 index 0000000000..66196faf0a --- /dev/null +++ b/Content.Shared/Shadowkin/SharedEtherealSystem.cs @@ -0,0 +1,141 @@ +using Content.Shared.Physics; +using Robust.Shared.Physics; +using System.Linq; +using Robust.Shared.Physics.Systems; +using Content.Shared.Interaction.Events; +using Robust.Shared.Timing; +using Content.Shared.Popups; +using Content.Shared.Throwing; +using Content.Shared.Weapons.Ranged.Events; +using Content.Shared.CombatMode.Pacification; +using Content.Shared.Psionics; +using Content.Shared.Mobs; +using Content.Shared.CCVar; +using Robust.Shared.Configuration; +using Content.Shared.Abilities.Psionics; +using Content.Shared.Tag; + +namespace Content.Shared.Shadowkin; + +public abstract class SharedEtherealSystem : EntitySystem +{ + [Dependency] private readonly SharedPhysicsSystem _physics = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly IGameTiming _gameTiming = default!; + [Dependency] private readonly IConfigurationManager _cfg = default!; + [Dependency] private readonly TagSystem _tag = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnStartup); + SubscribeLocalEvent(OnShutdown); + SubscribeLocalEvent(OnInteractionAttempt); + SubscribeLocalEvent(OnBeforeThrow); + SubscribeLocalEvent(OnAttemptPowerUse); + SubscribeLocalEvent(OnAttackAttempt); + SubscribeLocalEvent(OnShootAttempt); + SubscribeLocalEvent(OnMindbreak); + SubscribeLocalEvent(OnMobStateChanged); + } + + public virtual void OnStartup(EntityUid uid, EtherealComponent component, MapInitEvent args) + { + if (!TryComp(uid, out var fixtures)) + return; + + var fixture = fixtures.Fixtures.First(); + + component.OldMobMask = fixture.Value.CollisionMask; + component.OldMobLayer = fixture.Value.CollisionLayer; + + if (_cfg.GetCVar(CCVars.EtherealPassThrough)) + { + _physics.SetCollisionMask(uid, fixture.Key, fixture.Value, (int) CollisionGroup.GhostImpassable, fixtures); + _physics.SetCollisionLayer(uid, fixture.Key, fixture.Value, 0, fixtures); + + if (_tag.RemoveTag(uid, "DoorBumpOpener")) + component.HasDoorBumpTag = true; + + return; + } + + _physics.SetCollisionMask(uid, fixture.Key, fixture.Value, (int) CollisionGroup.FlyingMobMask, fixtures); + _physics.SetCollisionLayer(uid, fixture.Key, fixture.Value, (int) CollisionGroup.FlyingMobLayer, fixtures); + } + + public virtual void OnShutdown(EntityUid uid, EtherealComponent component, ComponentShutdown args) + { + if (!TryComp(uid, out var fixtures)) + return; + + var fixture = fixtures.Fixtures.First(); + + _physics.SetCollisionMask(uid, fixture.Key, fixture.Value, component.OldMobMask, fixtures); + _physics.SetCollisionLayer(uid, fixture.Key, fixture.Value, component.OldMobLayer, fixtures); + + if (component.HasDoorBumpTag) + _tag.AddTag(uid, "DoorBumpOpener"); + } + + private void OnMindbreak(EntityUid uid, EtherealComponent component, ref OnMindbreakEvent args) + { + RemComp(uid, component); + } + + private void OnMobStateChanged(EntityUid uid, EtherealComponent component, MobStateChangedEvent args) + { + if (args.NewMobState == MobState.Critical + || args.NewMobState == MobState.Dead) + RemComp(uid, component); + } + + private void OnShootAttempt(Entity ent, ref ShotAttemptedEvent args) + { + args.Cancel(); + } + + private void OnAttackAttempt(EntityUid uid, EtherealComponent component, AttackAttemptEvent args) + { + if (HasComp(args.Target)) + return; + + args.Cancel(); + } + + private void OnBeforeThrow(Entity ent, ref BeforeThrowEvent args) + { + var thrownItem = args.ItemUid; + + // Raise an AttemptPacifiedThrow event and rely on other systems to check + // whether the candidate item is OK to throw: + var ev = new AttemptPacifiedThrowEvent(thrownItem, ent); + RaiseLocalEvent(thrownItem, ref ev); + if (!ev.Cancelled) + return; + + args.Cancelled = true; + } + + private void OnInteractionAttempt(EntityUid uid, EtherealComponent component, InteractionAttemptEvent args) + { + if (!HasComp(args.Target) + || HasComp(args.Target)) + return; + + args.Cancel(); + if (_gameTiming.InPrediction) + return; + + _popup.PopupEntity(Loc.GetString("ethereal-pickup-fail"), args.Target.Value, uid); + } + + private void OnAttemptPowerUse(EntityUid uid, EtherealComponent component, OnAttemptPowerUseEvent args) + { + if (args.Power == "DarkSwap") + return; + + args.Cancel(); + } +} diff --git a/Content.Shared/Shadowkin/ShowEtherealComponent.cs b/Content.Shared/Shadowkin/ShowEtherealComponent.cs new file mode 100644 index 0000000000..45fa78fa0c --- /dev/null +++ b/Content.Shared/Shadowkin/ShowEtherealComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Shadowkin; + +[RegisterComponent] +public sealed partial class ShowEtherealComponent : Component { } \ No newline at end of file diff --git a/Content.Shared/ShortConstruction/ShortConstructionComponent.cs b/Content.Shared/ShortConstruction/ShortConstructionComponent.cs index dedf8605bd..579110f52f 100644 --- a/Content.Shared/ShortConstruction/ShortConstructionComponent.cs +++ b/Content.Shared/ShortConstruction/ShortConstructionComponent.cs @@ -1,8 +1,5 @@ -using Content.Shared.Construction.Prototypes; +using Content.Shared.RadialSelector; using Robust.Shared.GameStates; -using Robust.Shared.Prototypes; -using Robust.Shared.Serialization; -using Robust.Shared.Utility; namespace Content.Shared.ShortConstruction; @@ -10,34 +7,5 @@ namespace Content.Shared.ShortConstruction; public sealed partial class ShortConstructionComponent : Component { [DataField(required: true)] - public List Entries = new(); -} - -[DataDefinition] -public sealed partial class ShortConstructionEntry -{ - [DataField] - public ProtoId? Prototype { get; set; } - - [DataField] - public ShortConstructionCategory? Category { get; set; } -} - -[DataDefinition] -public sealed partial class ShortConstructionCategory -{ - [DataField] - public string Name { get; set; } = string.Empty; - - [DataField] - public SpriteSpecifier Icon { get; set; } = default!; - - [DataField] - public List Entries { get; set; } = new(); -} - -[NetSerializable, Serializable] -public enum ShortConstructionUiKey : byte -{ - Key, + public List Entries = new(); } diff --git a/Content.Shared/Standing/SharedLayingDownSystem.cs b/Content.Shared/Standing/SharedLayingDownSystem.cs index 914b04cdef..9fa4717045 100644 --- a/Content.Shared/Standing/SharedLayingDownSystem.cs +++ b/Content.Shared/Standing/SharedLayingDownSystem.cs @@ -178,6 +178,7 @@ public bool TryLieDown(EntityUid uid, LayingDownComponent? layingDown = null, St [Serializable, NetSerializable] public sealed partial class StandingUpDoAfterEvent : SimpleDoAfterEvent; +[Serializable, NetSerializable] public enum DropHeldItemsBehavior : byte { NoDrop, diff --git a/Content.Shared/StatusEffect/StatusEffectsSystem.cs b/Content.Shared/StatusEffect/StatusEffectsSystem.cs index 6aec3a8b3b..cc6dedae49 100644 --- a/Content.Shared/StatusEffect/StatusEffectsSystem.cs +++ b/Content.Shared/StatusEffect/StatusEffectsSystem.cs @@ -123,6 +123,33 @@ public bool TryAddStatusEffect(EntityUid uid, string key, TimeSpan time, bool return false; } + /// + /// Tries to add a status effect to an entity, with a given component added as well. + /// + /// The entity to add the effect to. + /// The status effect ID to add. + /// How long the effect should last for. + /// The status effect cooldown should be refreshed (true) or accumulated (false). + /// The component of status effect itself. + /// The status effects component to change, if you already have it. + /// False if the effect could not be added or the component already exists, true otherwise. + public bool TryAddStatusEffect(EntityUid uid, string key, TimeSpan time, bool refresh, Component component, + StatusEffectsComponent? status = null) + { + if (!Resolve(uid, ref status, false) + || !TryAddStatusEffect(uid, key, time, refresh, status)) + return false; + + // If they already have the comp, we just won't bother updating anything. + if (!EntityManager.HasComponent(uid, component.GetType())) + { + EntityManager.AddComponent(uid, component); + status.ActiveEffects[key].RelevantComponent = _componentFactory.GetComponentName(component.GetType()); + } + + return true; + } + public bool TryAddStatusEffect(EntityUid uid, string key, TimeSpan time, bool refresh, string component, StatusEffectsComponent? status = null) { diff --git a/Content.Shared/Stunnable/Events/KnockdownOnHitEvent.cs b/Content.Shared/Stunnable/Events/KnockdownOnHitEvent.cs new file mode 100644 index 0000000000..b177f0e3f3 --- /dev/null +++ b/Content.Shared/Stunnable/Events/KnockdownOnHitEvent.cs @@ -0,0 +1,4 @@ +namespace Content.Shared.Stunnable.Events; + +[ByRefEvent] +public record struct KnockdownOnHitAttemptEvent(bool Cancelled); diff --git a/Content.Shared/Stunnable/KnockedDownComponent.cs b/Content.Shared/Stunnable/KnockedDownComponent.cs index e4f11b8cda..865c69bf6e 100644 --- a/Content.Shared/Stunnable/KnockedDownComponent.cs +++ b/Content.Shared/Stunnable/KnockedDownComponent.cs @@ -1,6 +1,6 @@ +using Content.Shared.Standing; using Robust.Shared.Audio; using Robust.Shared.GameStates; -using Robust.Shared.Serialization; namespace Content.Shared.Stunnable; @@ -13,6 +13,9 @@ public sealed partial class KnockedDownComponent : Component [DataField("helpAttemptSound")] public SoundSpecifier StunAttemptSound = new SoundPathSpecifier("/Audio/Effects/thudswoosh.ogg"); + [DataField] + public DropHeldItemsBehavior DropHeldItemsBehavior = DropHeldItemsBehavior.DropIfStanding; + [ViewVariables, AutoNetworkedField] public float HelpTimer = 0f; } diff --git a/Content.Shared/Stunnable/SharedStunSystem.cs b/Content.Shared/Stunnable/SharedStunSystem.cs index 52225843f2..05d6b8ec53 100644 --- a/Content.Shared/Stunnable/SharedStunSystem.cs +++ b/Content.Shared/Stunnable/SharedStunSystem.cs @@ -27,6 +27,8 @@ namespace Content.Shared.Stunnable; public abstract class SharedStunSystem : EntitySystem { + [Dependency] private readonly IComponentFactory _componentFactory = default!; + [Dependency] private readonly ActionBlockerSystem _blocker = default!; [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; [Dependency] private readonly MovementSpeedModifierSystem _movementSpeedModifier = default!; @@ -110,7 +112,7 @@ private void UpdateCanMove(EntityUid uid, StunnedComponent component, EntityEven private void OnKnockInit(EntityUid uid, KnockedDownComponent component, ComponentInit args) { RaiseNetworkEvent(new CheckAutoGetUpEvent(GetNetEntity(uid))); - _layingDown.TryLieDown(uid, null, null, DropHeldItemsBehavior.DropIfStanding); + _layingDown.TryLieDown(uid, null, null, component.DropHeldItemsBehavior); } private void OnKnockShutdown(EntityUid uid, KnockedDownComponent component, ComponentShutdown args) @@ -171,6 +173,26 @@ public bool TryStun(EntityUid uid, TimeSpan time, bool refresh, return true; } + /// + /// Knocks down the entity, making it fall to the ground. + /// + public bool TryKnockdown(EntityUid uid, TimeSpan time, bool refresh, + DropHeldItemsBehavior behavior = DropHeldItemsBehavior.DropIfStanding, + StatusEffectsComponent? status = null) + { + if (time <= TimeSpan.Zero || !Resolve(uid, ref status, false)) + return false; + + var component = _componentFactory.GetComponent(); + component.DropHeldItemsBehavior = behavior; + if (!_statusEffect.TryAddStatusEffect(uid, "KnockedDown", time, refresh, component)) + return false; + + var ev = new KnockedDownEvent(); + RaiseLocalEvent(uid, ref ev); + return true; + } + /// /// Knocks down the entity, making it fall to the ground. /// diff --git a/Content.Shared/TelescopicBaton/TelescopicBatonVisuals.cs b/Content.Shared/TelescopicBaton/TelescopicBatonVisuals.cs new file mode 100644 index 0000000000..25e6f583c8 --- /dev/null +++ b/Content.Shared/TelescopicBaton/TelescopicBatonVisuals.cs @@ -0,0 +1,10 @@ +using Robust.Shared.Serialization; + +namespace Content.Shared.TelescopicBaton; + +[Serializable, NetSerializable] +public enum TelescopicBatonVisuals +{ + State, + Layer +} diff --git a/Content.Shared/Traits/Assorted/Systems/SharedSingerSystem.cs b/Content.Shared/Traits/Assorted/Systems/SharedSingerSystem.cs index 56f76af9bb..13270ae45d 100644 --- a/Content.Shared/Traits/Assorted/Systems/SharedSingerSystem.cs +++ b/Content.Shared/Traits/Assorted/Systems/SharedSingerSystem.cs @@ -4,6 +4,7 @@ using Content.Shared.Traits.Assorted.Components; using Content.Shared.Traits.Assorted.Prototypes; using Content.Shared.Zombies; +using Robust.Shared.Player; using Robust.Shared.Prototypes; namespace Content.Shared.Traits.Assorted.Systems; @@ -15,7 +16,6 @@ public abstract class SharedSingerSystem : EntitySystem [Dependency] private readonly SharedActionsSystem _actionsSystem = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] private readonly SharedInstrumentSystem _instrument = default!; - [Dependency] private readonly SharedUserInterfaceSystem _ui = default!; public override void Initialize() { @@ -26,6 +26,7 @@ public override void Initialize() SubscribeLocalEvent(OnShutdown); SubscribeLocalEvent(OnBoundUIClosed); SubscribeLocalEvent(OnBoundUIOpened); + SubscribeLocalEvent(OnPlayerDetached); } private void OnStartup(Entity ent, ref ComponentStartup args) @@ -69,6 +70,11 @@ private void OnBoundUIOpened(EntityUid uid, SingerComponent component, BoundUIOp _appearance.SetData(uid, HarpyVisualLayers.Singing, SingingVisualLayer.True, appearance); } + private void OnPlayerDetached(EntityUid uid, SingerComponent component, PlayerDetachedEvent args) + { + CloseMidiUi(uid); + } + /// /// Closes the MIDI UI if it is open. Does nothing on client side. /// diff --git a/Content.Shared/Traits/Prototypes/TraitPrototype.cs b/Content.Shared/Traits/Prototypes/TraitPrototype.cs index 7c0e429a69..fb8ccf5464 100644 --- a/Content.Shared/Traits/Prototypes/TraitPrototype.cs +++ b/Content.Shared/Traits/Prototypes/TraitPrototype.cs @@ -87,4 +87,22 @@ public sealed partial class TraitPrototype : IPrototype /// [DataField] public List>? MoodEffects { get; private set; } = default!; + + /// + /// The list of all Factions that this trait removes. + /// + /// + /// I can't actually Validate these because the proto lives in Shared. + /// + [DataField] + public List? RemoveFactions { get; private set; } = default!; + + /// + /// The list of all Factions that this trait adds. + /// + /// + /// I can't actually Validate these because the proto lives in Shared. + /// + [DataField] + public List? AddFactions { get; private set; } = default!; } diff --git a/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs b/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs index 694273e5bf..5fc92ce37a 100644 --- a/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs +++ b/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs @@ -166,10 +166,7 @@ public sealed partial class MeleeWeaponComponent : Component { DoStaminaInteraction = true, StaminaDisadvantage = true, - StaminaRangeModifier = 2, - StaminaOffset = 0.25f, DoHealthInteraction = true, - HealthRangeModifier = 1.5f, }; /// diff --git a/Content.Shared/Weapons/Ranged/Components/GunRequiresWieldComponent.cs b/Content.Shared/Weapons/Ranged/Components/GunRequiresWieldComponent.cs index 2ae71334b4..fa3732209f 100644 --- a/Content.Shared/Weapons/Ranged/Components/GunRequiresWieldComponent.cs +++ b/Content.Shared/Weapons/Ranged/Components/GunRequiresWieldComponent.cs @@ -6,8 +6,13 @@ namespace Content.Shared.Weapons.Ranged.Components; /// /// Indicates that this gun requires wielding to be useable. /// -[RegisterComponent, NetworkedComponent, Access(typeof(WieldableSystem))] +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +[Access(typeof(WieldableSystem))] public sealed partial class GunRequiresWieldComponent : Component { + [DataField, AutoNetworkedField] + public TimeSpan LastPopup; + [DataField, AutoNetworkedField] + public TimeSpan PopupCooldown = TimeSpan.FromSeconds(1); } diff --git a/Content.Shared/Weapons/Ranged/Events/ShotAttemptedEvent.cs b/Content.Shared/Weapons/Ranged/Events/ShotAttemptedEvent.cs index 40925ad614..d61862bf1a 100644 --- a/Content.Shared/Weapons/Ranged/Events/ShotAttemptedEvent.cs +++ b/Content.Shared/Weapons/Ranged/Events/ShotAttemptedEvent.cs @@ -1,3 +1,5 @@ +using Content.Shared.Weapons.Ranged.Components; + namespace Content.Shared.Weapons.Ranged.Events; /// @@ -15,7 +17,7 @@ public record struct ShotAttemptedEvent /// /// The gun being shot. /// - public EntityUid Used; + public Entity Used; public bool Cancelled { get; private set; } diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs index 989fad160c..b714acefbd 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs @@ -249,7 +249,7 @@ private void AttemptShoot(EntityUid user, EntityUid gunUid, GunComponent gun) var prevention = new ShotAttemptedEvent { User = user, - Used = gunUid + Used = (gunUid, gun) }; RaiseLocalEvent(gunUid, ref prevention); if (prevention.Cancelled) diff --git a/Content.Shared/Wieldable/WieldableSystem.cs b/Content.Shared/Wieldable/WieldableSystem.cs index 778a664e2c..95fc69e061 100644 --- a/Content.Shared/Wieldable/WieldableSystem.cs +++ b/Content.Shared/Wieldable/WieldableSystem.cs @@ -1,3 +1,4 @@ +using System.Linq; using Content.Shared.Examine; using Content.Shared.Hands; using Content.Shared.Hands.Components; @@ -16,7 +17,7 @@ using Content.Shared.Weapons.Ranged.Systems; using Content.Shared.Wieldable.Components; using Robust.Shared.Audio.Systems; -using Robust.Shared.Player; +using Robust.Shared.Timing; namespace Content.Shared.Wieldable; @@ -30,6 +31,7 @@ public sealed class WieldableSystem : EntitySystem [Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] private readonly UseDelaySystem _delay = default!; [Dependency] private readonly SharedGunSystem _gun = default!; + [Dependency] private readonly IGameTiming _timing = default!; public override void Initialize() { @@ -40,9 +42,10 @@ public override void Initialize() SubscribeLocalEvent(OnItemLeaveHand); SubscribeLocalEvent(OnVirtualItemDeleted); SubscribeLocalEvent>(AddToggleWieldVerb); + SubscribeLocalEvent(OnDeselectWieldable); SubscribeLocalEvent(OnMeleeAttempt); - SubscribeLocalEvent(OnShootAttempt); + SubscribeLocalEvent(OnShootAttempt); SubscribeLocalEvent(OnGunWielded); SubscribeLocalEvent(OnGunUnwielded); SubscribeLocalEvent(OnGunRefreshModifiers); @@ -61,16 +64,21 @@ private void OnMeleeAttempt(EntityUid uid, MeleeRequiresWieldComponent component } } - private void OnShootAttempt(EntityUid uid, GunRequiresWieldComponent component, ref AttemptShootEvent args) + private void OnShootAttempt(EntityUid uid, GunRequiresWieldComponent component, ref ShotAttemptedEvent args) { if (TryComp(uid, out var wieldable) && !wieldable.Wielded) { - args.Cancelled = true; + args.Cancel(); - if (!HasComp(uid) && !HasComp(uid)) + var time = _timing.CurTime; + if (time > component.LastPopup + component.PopupCooldown && + !HasComp(uid) && + !HasComp(uid)) { - args.Message = Loc.GetString("wieldable-component-requires", ("item", uid)); + component.LastPopup = time; + var message = Loc.GetString("wieldable-component-requires", ("item", uid)); + _popupSystem.PopupClient(message, args.Used, args.User); } } } @@ -85,6 +93,15 @@ private void OnGunWielded(EntityUid uid, GunWieldBonusComponent component, ref I _gun.RefreshModifiers(uid); } + private void OnDeselectWieldable(EntityUid uid, WieldableComponent component, HandDeselectedEvent args) + { + if (!component.Wielded || + _handsSystem.EnumerateHands(args.User).Count() > 2) + return; + + TryUnwield(uid, component, args.User); + } + private void OnGunRefreshModifiers(Entity bonus, ref GunRefreshModifiersEvent args) { if (TryComp(bonus, out WieldableComponent? wield) && @@ -155,7 +172,7 @@ public bool CanWield(EntityUid uid, WieldableComponent component, EntityUid user return false; } - if (hands.CountFreeHands() < component.FreeHandsRequired) + if (_handsSystem.CountFreeableHands((user, hands)) < component.FreeHandsRequired) { if (!quiet) { @@ -196,9 +213,19 @@ public bool TryWield(EntityUid used, WieldableComponent component, EntityUid use if (component.WieldSound != null) _audioSystem.PlayPredicted(component.WieldSound, used, user); + var virtuals = new List(); for (var i = 0; i < component.FreeHandsRequired; i++) { - _virtualItemSystem.TrySpawnVirtualItemInHand(used, user); + if (_virtualItemSystem.TrySpawnVirtualItemInHand(used, user, out var virtualItem, true)) + { + virtuals.Add(virtualItem.Value); + continue; + } + + foreach (var existingVirtual in virtuals) + QueueDel(existingVirtual); + + return false; } if (TryComp(used, out UseDelayComponent? useDelay) diff --git a/Resources/Audio/Ambience/attributions.yml b/Resources/Audio/Ambience/attributions.yml index 01d1f1c92e..931d27f22e 100644 --- a/Resources/Audio/Ambience/attributions.yml +++ b/Resources/Audio/Ambience/attributions.yml @@ -121,3 +121,9 @@ license: "CC0-1.0" copyright: "Created by dimbark1, edited and converted to mono by TheShuEd" source: "https://freesound.org/people/dimbark1/sounds/316797/" + +- files: ["wisp_ambience.ogg"] + license: "CC-BY-4.0" + copyright: "Created by AlienXXX, touched up by Rane" + source: "https://freesound.org/people/AlienXXX/sounds/123647/" + diff --git a/Resources/Audio/Ambience/wisp_ambience.ogg b/Resources/Audio/Ambience/wisp_ambience.ogg new file mode 100644 index 0000000000..83f823ec81 Binary files /dev/null and b/Resources/Audio/Ambience/wisp_ambience.ogg differ diff --git a/Resources/Audio/DeltaV/Effects/attributions.yml b/Resources/Audio/DeltaV/Effects/attributions.yml new file mode 100644 index 0000000000..6a4a98a7ee --- /dev/null +++ b/Resources/Audio/DeltaV/Effects/attributions.yml @@ -0,0 +1,4 @@ +- files: ["clang2.ogg"] + license: "CC-BY-NC-3.0" + copyright: "Freesound user BristolStories" + source: "https://freesound.org/people/BristolStories/sounds/65915/" diff --git a/Resources/Audio/DeltaV/Effects/clang2.ogg b/Resources/Audio/DeltaV/Effects/clang2.ogg new file mode 100644 index 0000000000..74f0909a9e Binary files /dev/null and b/Resources/Audio/DeltaV/Effects/clang2.ogg differ diff --git a/Resources/Audio/Effects/Shadowkin/Powers/darkswapoff.ogg b/Resources/Audio/Effects/Shadowkin/darkswapoff.ogg similarity index 100% rename from Resources/Audio/Effects/Shadowkin/Powers/darkswapoff.ogg rename to Resources/Audio/Effects/Shadowkin/darkswapoff.ogg diff --git a/Resources/Audio/Effects/Shadowkin/Powers/darkswapon.ogg b/Resources/Audio/Effects/Shadowkin/darkswapon.ogg similarity index 100% rename from Resources/Audio/Effects/Shadowkin/Powers/darkswapon.ogg rename to Resources/Audio/Effects/Shadowkin/darkswapon.ogg diff --git a/Resources/Audio/Effects/Shadowkin/Powers/futuristic-teleport.ogg b/Resources/Audio/Effects/Shadowkin/futuristic-teleport.ogg similarity index 100% rename from Resources/Audio/Effects/Shadowkin/Powers/futuristic-teleport.ogg rename to Resources/Audio/Effects/Shadowkin/futuristic-teleport.ogg diff --git a/Resources/Audio/Effects/Shadowkin/Powers/license.txt b/Resources/Audio/Effects/Shadowkin/license.txt similarity index 75% rename from Resources/Audio/Effects/Shadowkin/Powers/license.txt rename to Resources/Audio/Effects/Shadowkin/license.txt index c77ea8eb09..d87bd10983 100644 --- a/Resources/Audio/Effects/Shadowkin/Powers/license.txt +++ b/Resources/Audio/Effects/Shadowkin/license.txt @@ -1,4 +1,4 @@ darkswapon.ogg licensed under Pixabay Licence taken from https://pixabay.com/users/cristian_changing-30278997/ darkswapoff.ogg licensed under Pixabay Licence taken from https://pixabay.com/users/cristian_changing-30278997/ futuristic-teleport.ogg licensed under Pixabay Licence taken from https://pixabay.com/users/cristian_changing-30278997/ -teleport.ogg licensed under Pixabay Licence taken from https://pixabay.com/users/cristian_changing-30278997/ +shadeskip.ogg licensed under Pixabay Licence taken from https://pixabay.com/users/cristian_changing-30278997/ diff --git a/Resources/Audio/Effects/Shadowkin/Powers/teleport.ogg b/Resources/Audio/Effects/Shadowkin/shadeskip.ogg similarity index 100% rename from Resources/Audio/Effects/Shadowkin/Powers/teleport.ogg rename to Resources/Audio/Effects/Shadowkin/shadeskip.ogg diff --git a/Resources/Audio/Effects/attributions.yml b/Resources/Audio/Effects/attributions.yml index 2554b84bd3..7199a008eb 100644 --- a/Resources/Audio/Effects/attributions.yml +++ b/Resources/Audio/Effects/attributions.yml @@ -232,3 +232,22 @@ license: "CC-BY-SA-3.0" source: https://github.com/YuriyKiss/space-station-14/commit/971a135a9c83aed46e967aac9302ab5b35562b5f +- files: ["magic_missile_1.ogg"] + license: "CC-BY-SA-4.0" + copyright: "From battle for wesnoth" + source: "https://github.com/wesnoth/wesnoth" + +- files: ["magic_missile_2.ogg"] + license: "CC-BY-SA-4.0" + copyright: "From battle for wesnoth" + source: "https://github.com/wesnoth/wesnoth" + +- files: ["magic_missile_3.ogg"] + license: "CC-BY-SA-4.0" + copyright: "From battle for wesnoth" + source: "https://github.com/wesnoth/wesnoth" + +- files: ["wail.ogg"] + license: "CC-BY-SA-4.0" + copyright: "From battle for wesnoth" + source: "https://github.com/wesnoth/wesnoth" diff --git a/Resources/Audio/Effects/magic_missile_1.ogg b/Resources/Audio/Effects/magic_missile_1.ogg new file mode 100644 index 0000000000..331a3efc54 Binary files /dev/null and b/Resources/Audio/Effects/magic_missile_1.ogg differ diff --git a/Resources/Audio/Effects/magic_missile_2.ogg b/Resources/Audio/Effects/magic_missile_2.ogg new file mode 100644 index 0000000000..8aac11d665 Binary files /dev/null and b/Resources/Audio/Effects/magic_missile_2.ogg differ diff --git a/Resources/Audio/Effects/magic_missile_3.ogg b/Resources/Audio/Effects/magic_missile_3.ogg new file mode 100644 index 0000000000..b7f4e94111 Binary files /dev/null and b/Resources/Audio/Effects/magic_missile_3.ogg differ diff --git a/Resources/Audio/Effects/wail.ogg b/Resources/Audio/Effects/wail.ogg new file mode 100644 index 0000000000..b40ec5ab25 Binary files /dev/null and b/Resources/Audio/Effects/wail.ogg differ diff --git a/Resources/Audio/Voice/Shadowkin/attributions.yml b/Resources/Audio/Voice/Shadowkin/attributions.yml new file mode 100644 index 0000000000..4ab746f465 --- /dev/null +++ b/Resources/Audio/Voice/Shadowkin/attributions.yml @@ -0,0 +1,4 @@ +- files: ["wurble.ogg", "mar.ogg"] + license: "CC-BY-SA-3.0" + copyright: "Taken from CHOMPStation" + source: "https://github.com/CHOMPStation2/CHOMPStation2" \ No newline at end of file diff --git a/Resources/Audio/Voice/Shadowkin/mar.ogg b/Resources/Audio/Voice/Shadowkin/mar.ogg new file mode 100644 index 0000000000..b13d2df837 Binary files /dev/null and b/Resources/Audio/Voice/Shadowkin/mar.ogg differ diff --git a/Resources/Audio/Voice/Shadowkin/wurble.ogg b/Resources/Audio/Voice/Shadowkin/wurble.ogg new file mode 100644 index 0000000000..859c9df353 Binary files /dev/null and b/Resources/Audio/Voice/Shadowkin/wurble.ogg differ diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 96ce3622f1..f3edcf68ea 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -7329,3 +7329,339 @@ Entries: id: 6458 time: '2024-10-16T22:54:33.0000000+00:00' url: https://github.com/Simple-Station/Einstein-Engines/pull/1061 +- author: Aidenkrz + changes: + - type: Tweak + message: >- + All spiders, arachne, and arachnids can cocoon mobs, and drink their + blood. + id: 6459 + time: '2024-10-17T19:21:01.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1058 +- author: zelezniciar + changes: + - type: Fix + message: Fixes Air Alarms not entering danger/warning state when pressure is low + id: 6460 + time: '2024-10-19T08:25:27.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/996 +- author: VMSolidus + changes: + - type: Fix + message: >- + Fixed issues with Contests System that allowed mobs such as Space Carps + to smash through barriers that were not intended to be breakable by said + mobs. + id: 6461 + time: '2024-10-19T08:26:32.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1069 +- author: VMSolidus + changes: + - type: Fix + message: >- + Fixed Cryptobiolin not providing temporary Psionic Insulation. It now + provides protection from psionic abilities and events for 15 minutes. + id: 6462 + time: '2024-10-19T08:28:28.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1081 +- author: VMSolidus + changes: + - type: Add + message: Arena now has a properly functional Arrivals Dock. + id: 6463 + time: '2024-10-19T08:30:22.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1086 +- author: VMSolidus + changes: + - type: Fix + message: 'addpsionicpower command now works. ' + id: 6464 + time: '2024-10-19T08:34:03.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1095 +- author: VMSolidus + changes: + - type: Add + message: >- + The Syndicate has significantly expanded their Listening Outpost + operations, featuring larger, better defended outposts. These new + outposts also serve as supply depots for Syndicate agents in the field. + id: 6465 + time: '2024-10-19T08:45:44.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1065 +- author: VMSolidus + changes: + - type: Fix + message: >- + Fixed the "Steal The Head of Security's Weapon" so that it is now a + single objective that counts for any anique weapon chosen by the Head of + Security. The objective will also once again correctly not generate if + there are no valid items for it on the station. + id: 6466 + time: '2024-10-19T21:28:16.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1084 +- author: Mocho + changes: + - type: Add + message: Added an uplink with 20TC for all Listening Post Operatives + id: 6467 + time: '2024-10-19T21:28:50.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1062 +- author: FoxxoTrystan + changes: + - type: Add + message: Job Whitelist! + id: 6468 + time: '2024-10-19T22:10:51.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1093 +- author: VMSolidus + changes: + - type: Fix + message: Ported literally all of Wizden's Wielding Quality Of Life improvements. + id: 6469 + time: '2024-10-20T01:45:50.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1078 +- author: VMSolidus + changes: + - type: Add + message: >- + Being in an Atmosphere(such as Planets like Glacier & Nukieworld) + bypasses the limitation of "NO TALKING IN SPACE" + id: 6470 + time: '2024-10-20T05:40:19.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1089 +- author: VMSolidus + changes: + - type: Fix + message: >- + Breath of Life now correctly displays its esoteric text popup if the + right conditions are met. + id: 6471 + time: '2024-10-20T16:03:28.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1109 +- author: FoxxoTrystan + changes: + - type: Add + message: Added a new species, Shadowkin! + id: 6472 + time: '2024-10-20T16:31:21.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/960 +- author: VMSolidus + changes: + - type: Fix + message: Removed latejoin spawners from the Salvage Pathfinder. + id: 6473 + time: '2024-10-20T16:32:43.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1105 +- author: VMSolidus + changes: + - type: Add + message: >- + Musicians can now select for free, any 3 instruments in the game with + their loadout. This now includes things like Piano flatpacks. The only + instruments not included are the Sypersynth, DAW, and "Admeme + Instruments". + - type: Remove + message: >- + Musicians no longer spawn with a Saxophone and Acoustic guitar by + default. You pick which instruments you spawn with in your loadouts now. + id: 6474 + time: '2024-10-20T16:32:53.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1108 +- author: VMSolidus + changes: + - type: Add + message: 'Added localizations for all Epistemics jobs. ' + id: 6475 + time: '2024-10-20T16:35:00.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1094 +- author: VMSolidus + changes: + - type: Fix + message: >- + Fixed the Captain's Office on Gax Station missing an LV cable that would + power its doors. + id: 6476 + time: '2024-10-20T18:18:35.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1112 +- author: VMSolidus + changes: + - type: Fix + message: >- + Fixed prisoner not spawning in the Prison if the Arrivals station is + enabled. + id: 6477 + time: '2024-10-20T19:28:35.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1113 +- author: VMSolidus + changes: + - type: Add + message: >- + Sacrificing Psions has been added. Psions can be sacrificed by + Epistemics upon an altar in order to dramatically reduce glimmer. The + more powerful the Psion to be sacrificed, the more glimmer is reduced. + id: 6478 + time: '2024-10-20T21:34:05.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1110 +- author: Aidenkrz + changes: + - type: Fix + message: Flavor text can be updated again. + id: 6479 + time: '2024-10-21T00:24:18.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1119 +- author: VMSolidus + changes: + - type: Add + message: Glacier is now on a planetary surface + id: 6480 + time: '2024-10-21T00:41:02.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1115 +- author: VMSolidus + changes: + - type: Fix + message: >- + Asterisk Station no longer spawns entombed in snow, and is now on top of + an ice sheet. + id: 6481 + time: '2024-10-21T00:41:18.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1118 +- author: Aidenkrz + changes: + - type: Fix + message: Custom specie name doesn't disappear in the editor anymore. + id: 6482 + time: '2024-10-22T01:42:11.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1120 +- author: Remuchi + changes: + - type: Fix + message: Cybereyes examine message no longer reveals person's identity. + id: 6483 + time: '2024-10-23T04:16:15.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1127 +- author: Mnemotechnician + changes: + - type: Add + message: >- + Raising glimmer too high can now cause glimmer wisps to start haunting + the station. + id: 6484 + time: '2024-10-23T04:19:00.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1125 +- author: Mnemotechnician + changes: + - type: Fix + message: >- + Fixed the "high amplification" trait lowering your amplification instead + of increasing it. + id: 6485 + time: '2024-10-25T16:22:01.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1137 +- author: Remuchi + changes: + - type: Fix + message: Added missing deflect alert locale. + id: 6486 + time: '2024-10-25T16:23:04.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1140 +- author: VMSolidus + changes: + - type: Add + message: Added Pyrokinetic Flare as a new Psi ability. + id: 6487 + time: '2024-10-25T19:03:57.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1138 +- author: SleepyScarecrow + changes: + - type: Fix + message: Fixed penlights + id: 6488 + time: '2024-10-25T19:04:14.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1142 +- author: Ichaie + changes: + - type: Fix + message: '#1126 ' + id: 6489 + time: '2024-10-27T15:30:55.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1129 +- author: VMSolidus + changes: + - type: Tweak + message: >- + The Syndicate Listening Post now has a custom communications console, + which no longer can recall Nanotrasen shuttles, and doesn't sign its + messages as Nuclear Operatives. + id: 6490 + time: '2024-10-27T15:31:16.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1143 +- author: Remuchi + changes: + - type: Fix + message: Layered icons are now properly displayed in radial menus. + id: 6491 + time: '2024-10-27T15:34:45.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1150 +- author: Remuchi + changes: + - type: Add + message: >- + Clicking on health alert now will print message in chat, displaying your + health state. + id: 6492 + time: '2024-10-27T15:36:43.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1139 +- author: VMSolidus + changes: + - type: Add + message: >- + The Animal Friend trait has been added to the game. Characters with this + trait are not attacked by animals. + id: 6493 + time: '2024-10-27T16:44:50.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/955 +- author: Remuchi + changes: + - type: Add + message: Added telescopic baton - a self-defense weapon for Command staff. + id: 6494 + time: '2024-10-27T16:45:05.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1144 +- author: VMSolidus + changes: + - type: Add + message: >- + A new class of Psionic powers has been added, "Summon Familiar". + Familiars are a new kind of Psionic creature that can be summoned by + Psions with the right power. Familiars will automatically follow their + Master, attack anyone who attacks their Master, fight back when + attacked, and attack anyone their Master attacks. Additionally, + Familiars are also ghostroles, so that they can be taken over by a + player, but otherwise do not require player control to function. + Familiars disappear when they die, and will also disappear if their + Master is either killed, or mindbroken. Psions can have a maximum of + one(1) familiar at a time. + - type: Add + message: >- + New psi-power "Summon Imp", as the first new Psi Familiar. Imps are + small motes of living flame that follow and protect their summoner. Imps + also emit an incredibly bright light, and can natively cast Pyrokinetic + Flare. + - type: Add + message: >- + Remilia has been updated to be a Psi Familiar, and no longer requires + the Bible to summon. Chaplains now start with a Power that lets them + summon Remilia once every 2 minutes. + id: 6495 + time: '2024-10-27T16:51:18.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1146 +- author: VMSolidus + changes: + - type: Tweak + message: >- + Changed the default "Following distance" of Psionic Familiars from 10 + meters to 3 meters, so that they don't have an ungodly hard time keeping + up with their Master. + id: 6496 + time: '2024-10-29T02:24:08.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1162 diff --git a/Resources/Credits/GitHub.txt b/Resources/Credits/GitHub.txt index 3a7e0e7ed6..7b0e97dea4 100644 --- a/Resources/Credits/GitHub.txt +++ b/Resources/Credits/GitHub.txt @@ -1 +1 @@ -0x6273, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 4dplanner, 612git, 778b, Ablankmann, Acruid, actioninja, adamsong, Admiral-Obvious-001, Adrian16199, Aerocrux, Aexxie, africalimedrop, Agoichi, Ahion, AJCM-git, AjexRose, Alekshhh, AlexMorgan3817, AlmondFlour, AlphaQwerty, Altoids1, amylizzle, ancientpower, angelofallars, ArchPigeon, Arendian, arimah, Arteben, AruMoon, as334, AsikKEsel, asperger-sind, aspiringLich, avghdev, AzzyIsNotHere, BananaFlambe, BasedUser, beck-thompson, BGare, BingoJohnson-zz, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, BlueHNT, Boaz1111, BobdaBiscuit, brainfood1183, BramvanZijp, Brandon-Huu, Bribrooo, Bright0, brndd, BubblegumBlue, BYONDFuckery, c4llv07e, CaasGit, CakeQ, CaptainSqrBeard, Carbonhell, Carolyn3114, CatTheSystem, Centronias, chairbender, Charlese2, Cheackraze, cheesePizza2, Chief-Engineer, chromiumboy, Chronophylos, CilliePaint, clorl, Clyybber, CodedCrow, ColdAutumnRain, Colin-Tel, collinlunn, ComicIronic, coolmankid12345, corentt, crazybrain23, creadth, CrigCrag, Crotalus, CrudeWax, CrzyPotato, Cyberboss, d34d10cc, Daemon, daerSeebaer, dahnte, dakamakat, dakimasu, DamianX, DangerRevolution, daniel-cr, Darkenson, DawBla, dch-GH, Deahaka, DEATHB4DEFEAT, DeathCamel58, deathride58, DebugOk, Decappi, Deeeeja, deepdarkdepths, Delete69, deltanedas, DeltaV-Bot, DerbyX, DoctorBeard, DogZeroX, dontbetank, dootythefrooty, Doru991, DoubleRiceEddiedd, DrMelon, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, Duddino, Dutch-VanDerLinde, Easypoller, eclips_e, EEASAS, Efruit, ElectroSR, elthundercloud, Emisse, EmoGarbage404, Endecc, enumerate0, eoineoineoin, ERORR404V1, Errant-4, estacaoespacialpirata, Evgencheg, exincore, exp111, Fahasor, FairlySadPanda, Fansana, ficcialfaint, Fildrance, FillerVK, Fishfish458, Flareguy, FluffiestFloof, FluidRock, FoLoKe, fooberticus, Fortune117, FoxxoTrystan, freeman2651, Froffy025, Fromoriss, FungiFellow, GalacticChimp, gbasood, Geekyhobo, geraeumig, Git-Nivrak, github-actions[bot], gituhabu, gluesniffler, Golinth, GoodWheatley, graevy, GreyMario, Guess-My-Name, gusxyz, h3half, Hanzdegloker, Hardly3D, harikattar, HerCoyote23, HoofedEar, Hoolny, hord-brayden, hubismal, Hugal31, Huxellberger, iacore, IamVelcroboy, icekot8, igorsaux, ike709, Illiux, Ilya246, IlyaElDunaev, Injazz, Insineer, Interrobang01, IProduceWidgets, ItsMeThom, Jackal298, Jackrost, jamessimo, janekvap, JerryImMouse, Jessetriesagain, jessicamaybe, Jezithyr, jicksaw, JiimBob, JoeHammad1844, JohnGinnane, johnku1, joshepvodka, jproads, Jrpl, juliangiebel, JustArt1m, JustCone14, JustinTrotter, KaiShibaa, kalane15, kalanosh, Kelrak, kerisargit, keronshb, KIBORG04, Killerqu00, KingFroozy, kira-er, Kit0vras, KittenColony, Ko4ergaPunk, komunre, koteq, Krunklehorn, kxvvv, Lamrr, LankLTE, lapatison, Leander-0, leonardo-dabepis, LetterN, Level10Cybermancer, lever1209, Lgibb18, liltenhead, LittleBuilderJane, Lomcastar, LordCarve, LordEclipse, LovelyLophi, Lukasz825700516, lunarcomets, luringens, lvvova1, lzimann, lzk228, MACMAN2003, Macoron, MagnusCrowe, ManelNavola, Matz05, MehimoNemo, MeltedPixel, MemeProof, Menshin, Mervill, metalgearsloth, mhamsterr, MilenVolf, Minty642, Mirino97, mirrorcult, misandrie, MishaUnity, MisterMecky, Mith-randalf, Mnemotechnician, Moneyl, Moomoobeef, moony, Morb0, Mr0maks, musicmanvr, Myakot, Myctai, N3X15, Nairodian, Naive817, namespace-Memory, NickPowers43, nikthechampiongr, Nimfar11, Nirnael, nmajask, nok-ko, notafet, notquitehadouken, noudoit, nuke-haus, NULL882, nyeogmi, OCOtheOmega, OctoRocket, OldDanceJacket, onoira, osjarw, Owai-Seek, pali6, Pangogie, patrikturi, PaulRitter, Peptide90, peptron1, Phantom-Lily, PHCodes, PixelTheKermit, PJB3005, Plykiya, pofitlo, pointer-to-null, PolterTzi, PoorMansDreams, potato1234x, ProfanedBane, PrPleGoo, ps3moira, Pspritechologist, Psychpsyo, psykzz, PuroSlavKing, quatre, QuietlyWhisper, qwerltaz, Radosvik, Radrark, Rainbeon, Rainfey, Rane, ravage123321, rbertoche, Redict, RedlineTriad, RednoWCirabrab, RemberBM, RemieRichards, RemTim, rene-descartes2021, RiceMar1244, RieBi, Rinkashikachi, Rockdtben, rolfero, rosieposieeee, Saakra, Samsterious, SaphireLattice, ScalyChimp, scrato, Scribbles0, Serkket, ShadowCommander, Shadowtheprotogen546, ShatteredSwords, SignalWalker, SimpleStation14, Simyon264, Sirionaut, siyengar04, Skarletto, Skrauz, Skyedra, SlamBamActionman, slarticodefast, Slava0135, SleepyScarecrow, Snowni, snowsignal, SonicHDC, SoulSloth, SpaceManiac, SpeltIncorrectyl, spoogemonster, ssdaniel24, stalengd, Stealthbomber16, stellar-novas, StrawberryMoses, superjj18, SweptWasTaken, Szunti, TadJohnson00, takemysoult, TaralGit, Tayrtahn, tday93, TekuNut, TemporalOroboros, tentekal, tgrkzus, thatrandomcanadianguy, TheArturZh, theashtronaut, thedraccx, themias, Theomund, theOperand, TheShuEd, TimrodDX, Titian3, tkdrg, Tmanzxd, tmtmtl30, TokenStyle, tom-leys, tomasalves8, Tomeno, Tornado-Technology, tosatur, Tryded, TsjipTsjip, Tunguso4ka, TurboTrackerss14, Tyler-IN, Tyzemol, UbaserB, UKNOWH, UltimateJester, UnicornOnLSD, Uriende, UristMcDorf, Vaaankas, Varen, VasilisThePikachu, veliebm, Veritius, Vermidia, Verslebas, VigersRay, Visne, VMSolidus, volundr-, Voomra, Vordenburg, vulppine, wafehling, WarMechanic, waylon531, weaversam8, whateverusername0, Willhelm53, Winkarst-cpu, wixoaGit, WlarusFromDaSpace, wrexbe, xRiriq, yathxyz, Ygg01, YotaXP, YuriyKiss, zach-hill, Zandario, Zap527, Zealith-Gamer, zelezniciar1, ZelteHonor, zerorulez, zionnBE, ZNixian, ZoldorfTheWizard, Zumorica, Zymem +0x6273, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 4dplanner, 612git, 778b, Ablankmann, Acruid, actioninja, adamsong, Admiral-Obvious-001, Adrian16199, Aerocrux, Aexxie, africalimedrop, Agoichi, Ahion, Aidenkrz, AJCM-git, AjexRose, Alekshhh, AlexMorgan3817, AlmondFlour, AlphaQwerty, Altoids1, amylizzle, ancientpower, angelofallars, ArchPigeon, Arendian, arimah, Arteben, AruMoon, as334, AsikKEsel, asperger-sind, aspiringLich, avghdev, AzzyIsNotHere, BananaFlambe, BasedUser, beck-thompson, BGare, BingoJohnson-zz, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, BlueHNT, Boaz1111, BobdaBiscuit, brainfood1183, BramvanZijp, Brandon-Huu, Bribrooo, Bright0, brndd, BubblegumBlue, BYONDFuckery, c4llv07e, CaasGit, CakeQ, CaptainSqrBeard, Carbonhell, Carolyn3114, CatTheSystem, Centronias, chairbender, Charlese2, Cheackraze, cheesePizza2, Chief-Engineer, chromiumboy, Chronophylos, CilliePaint, clorl, Clyybber, CodedCrow, ColdAutumnRain, Colin-Tel, collinlunn, ComicIronic, coolmankid12345, corentt, crazybrain23, creadth, CrigCrag, Crotalus, CrudeWax, CrzyPotato, Cyberboss, d34d10cc, d4kii, Daemon, daerSeebaer, dahnte, dakamakat, DamianX, DangerRevolution, daniel-cr, Darkenson, DawBla, dch-GH, Deahaka, DEATHB4DEFEAT, DeathCamel58, deathride58, DebugOk, Decappi, Deeeeja, deepdarkdepths, Delete69, deltanedas, DeltaV-Bot, DerbyX, DoctorBeard, DogZeroX, dontbetank, dootythefrooty, Doru991, DoubleRiceEddiedd, DrMelon, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, Duddino, Dutch-VanDerLinde, Easypoller, eclips_e, EEASAS, Efruit, ElectroSR, elthundercloud, Emisse, EmoGarbage404, Endecc, enumerate0, eoineoineoin, ERORR404V1, Errant-4, estacaoespacialpirata, Evgencheg, exincore, exp111, Fahasor, FairlySadPanda, Fansana, ficcialfaint, Fildrance, FillerVK, Fishfish458, Flareguy, FluffiestFloof, FoLoKe, fooberticus, Fortune117, FoxxoTrystan, freeman2651, Fromoriss, FungiFellow, GalacticChimp, gbasood, Geekyhobo, geraeumig, Git-Nivrak, github-actions[bot], gituhabu, gluesniffler, Golinth, GoodWheatley, gradientvera, graevy, GreyMario, Guess-My-Name, gusxyz, h3half, Hanzdegloker, Hardly3D, harikattar, HerCoyote23, HoofedEar, Hoolny, hord-brayden, hubismal, Hugal31, Huxellberger, iacore, IamVelcroboy, icekot8, Ichaie, igorsaux, ike709, Illiux, Ilya246, IlyaElDunaev, Injazz, Insineer, Interrobang01, IProduceWidgets, ItsMeThom, Jackal298, Jackrost, jamessimo, janekvap, JerryImMouse, Jessetriesagain, jessicamaybe, Jezithyr, jicksaw, JiimBob, JoeHammad1844, JohnGinnane, johnku1, joshepvodka, Jrpl, juliangiebel, JustArt1m, JustCone14, JustinTrotter, KaiShibaa, kalane15, kalanosh, Kelrak, kerisargit, keronshb, KIBORG04, Killerqu00, KingFroozy, kira-er, Kit0vras, KittenColony, Ko4ergaPunk, komunre, koteq, Krunklehorn, kxvvv, Lamrr, LankLTE, lapatison, Leander-0, leonardo-dabepis, LetterN, Level10Cybermancer, lever1209, Lgibb18, liltenhead, LittleBuilderJane, Lomcastar, LordCarve, LordEclipse, LovelyLophi, Lukasz825700516, lunarcomets, luringens, lvvova1, lzimann, lzk228, MACMAN2003, Macoron, MagnusCrowe, ManelNavola, Matz05, MehimoNemo, MeltedPixel, MemeProof, Menshin, Mervill, metalgearsloth, mhamsterr, MilenVolf, Minty642, Mirino97, mirrorcult, misandrie, MishaUnity, MisterMecky, Mith-randalf, Mnemotechnician, Moneyl, Moomoobeef, moony, Morb0, Mr0maks, musicmanvr, Myakot, Myctai, N3X15, Nairodian, Naive817, namespace-Memory, NickPowers43, nikthechampiongr, Nimfar11, Nirnael, nmajask, nok-ko, notafet, notquitehadouken, noudoit, nuke-haus, NULL882, nyeogmi, OCOtheOmega, OctoRocket, OldDanceJacket, onoira, osjarw, Owai-Seek, pali6, Pangogie, paolordls, patrikturi, PaulRitter, Peptide90, peptron1, Phantom-Lily, PHCodes, PixelTheKermit, PJB3005, Plykiya, pofitlo, pointer-to-null, PolterTzi, PoorMansDreams, potato1234x, ProfanedBane, PrPleGoo, ps3moira, Pspritechologist, Psychpsyo, psykzz, PuroSlavKing, quatre, QuietlyWhisper, qwerltaz, Radosvik, Radrark, Rainbeon, Rainfey, Rane, ravage123321, rbertoche, Redict, RedlineTriad, RednoWCirabrab, RemberBM, RemieRichards, RemTim, Remuchi, rene-descartes2021, RiceMar1244, RieBi, Rinkashikachi, Rockdtben, rolfero, rosieposieeee, Saakra, Samsterious, SaphireLattice, ScalyChimp, scrato, Scribbles0, Serkket, ShadowCommander, ShatteredSwords, SignalWalker, SimpleStation14, Simyon264, Sirionaut, siyengar04, Skarletto, Skrauz, Skyedra, SlamBamActionman, slarticodefast, Slava0135, SleepyScarecrow, Snowni, snowsignal, SonicHDC, SoulSloth, SpaceManiac, SpeltIncorrectyl, spoogemonster, ssdaniel24, stalengd, Stealthbomber16, stellar-novas, StrawberryMoses, superjj18, SweptWasTaken, Szunti, TadJohnson00, takemysoult, TaralGit, Tayrtahn, tday93, TekuNut, TemporalOroboros, tentekal, tgrkzus, thatrandomcanadianguy, TheArturZh, theashtronaut, thedraccx, themias, theomund, theOperand, TheShuEd, TimrodDX, Titian3, tkdrg, Tmanzxd, tmtmtl30, TokenStyle, tom-leys, tomasalves8, Tomeno, Tornado-Technology, tosatur, Tryded, TsjipTsjip, Tunguso4ka, TurboTrackerss14, Tyler-IN, Tyzemol, UbaserB, UKNOWH, UltimateJester, UnicornOnLSD, Uriende, UristMcDorf, Vaaankas, Varen, VasilisThePikachu, veliebm, Veritius, Vermidia, Verslebas, VigersRay, Visne, VMSolidus, volundr-, Voomra, Vordenburg, vulppine, wafehling, WarMechanic, waylon531, weaversam8, whateverusername0, Willhelm53, Winkarst-cpu, wixoaGit, WlarusFromDaSpace, wrexbe, xRiriq, yathxyz, Ygg01, YotaXP, YuriyKiss, zach-hill, Zandario, Zap527, Zealith-Gamer, zelezniciar1, ZelteHonor, zerorulez, zionnBE, ZNixian, ZoldorfTheWizard, Zymem diff --git a/Resources/Fonts/Lymphatic.ttf b/Resources/Fonts/Lymphatic.ttf new file mode 100644 index 0000000000..36beef04b1 Binary files /dev/null and b/Resources/Fonts/Lymphatic.ttf differ diff --git a/Resources/Locale/en-US/abilities/bloodsucker.ftl b/Resources/Locale/en-US/abilities/bloodsucker.ftl index d956eaff84..c8aa0ed854 100644 --- a/Resources/Locale/en-US/abilities/bloodsucker.ftl +++ b/Resources/Locale/en-US/abilities/bloodsucker.ftl @@ -4,9 +4,9 @@ action-description-suck-blood = Suck the blood of the victim in your hand. bloodsucker-fail-helmet = You'd need to remove {THE($helmet)}. bloodsucker-fail-mask = You'd need to remove your mask! -bloodsucker-fail-not-blood = { CAPITALIZE(SUBJECT($target)) } doesn't have delicious, nourishing mortal blood. -bloodsucker-fail-no-blood = { CAPITALIZE(SUBJECT($target)) } has no blood in { POSS-ADJ($target) } body. -bloodsucker-fail-no-blood-bloodsucked = { CAPITALIZE(SUBJECT($target)) } has been sucked dry. +bloodsucker-not-blood = {$target} doesn't have delicious, nourishing blood. +bloodsucker-fail-no-blood = {$target} has no blood in { POSS-ADJ($target) } body. +bloodsucker-fail-no-blood-bloodsucked = {$target} has been sucked dry. bloodsucker-blood-sucked = You suck some blood from {$target}. bloodsucker-doafter-start = You try to suck blood from {$target}. diff --git a/Resources/Locale/en-US/abilities/lifedrainer.ftl b/Resources/Locale/en-US/abilities/lifedrainer.ftl new file mode 100644 index 0000000000..4072129ab0 --- /dev/null +++ b/Resources/Locale/en-US/abilities/lifedrainer.ftl @@ -0,0 +1,5 @@ +verb-life-drain = Life drain +life-drain-second-start = {CAPITALIZE(THE($drainer))} starts draining your life force! +life-drain-third-start = {CAPITALIZE(THE($drainer))} starts draining {THE($target)}'s life force! +life-drain-second-end = Your being is annihilated. +life-drain-third-end = {CAPITALIZE(THE($drainer))} drains {THE($target)}'s life force! diff --git a/Resources/Locale/en-US/actions/actions/shadowkin.ftl b/Resources/Locale/en-US/actions/actions/shadowkin.ftl new file mode 100644 index 0000000000..063e1eafb7 --- /dev/null +++ b/Resources/Locale/en-US/actions/actions/shadowkin.ftl @@ -0,0 +1,2 @@ +action-name-shadowkin-rest = Rest +action-description-shadowkin-rest = Rama diff --git a/Resources/Locale/en-US/administration/ui/player-panel.ftl b/Resources/Locale/en-US/administration/ui/player-panel.ftl new file mode 100644 index 0000000000..208268d589 --- /dev/null +++ b/Resources/Locale/en-US/administration/ui/player-panel.ftl @@ -0,0 +1 @@ +player-panel-job-whitelists = Job Whitelists diff --git a/Resources/Locale/en-US/alerts/alerts.ftl b/Resources/Locale/en-US/alerts/alerts.ftl index 03f04ec7ba..ad61ae8967 100644 --- a/Resources/Locale/en-US/alerts/alerts.ftl +++ b/Resources/Locale/en-US/alerts/alerts.ftl @@ -113,3 +113,6 @@ alerts-walking-desc = Indicates how fast you're moving. alerts-offer-name = Offer alerts-offer-desc = Someone offers you an item. + +alerts-deflecting-name = Deflecting +alerts-deflecting-desc = You have a chance to deflect incoming projectiles. Standing still or moving slowly will increase this chance. diff --git a/Resources/Locale/en-US/alerts/shadowkin.ftl b/Resources/Locale/en-US/alerts/shadowkin.ftl new file mode 100644 index 0000000000..10f8438b76 --- /dev/null +++ b/Resources/Locale/en-US/alerts/shadowkin.ftl @@ -0,0 +1,2 @@ +alerts-shadowkin-power-name = Power Level +alerts-shadowkin-power-desc = How much energy is available to spend on Shadowkin powers. \ No newline at end of file diff --git a/Resources/Locale/en-US/chapel/altar.ftl b/Resources/Locale/en-US/chapel/altar.ftl new file mode 100644 index 0000000000..ed031d638a --- /dev/null +++ b/Resources/Locale/en-US/chapel/altar.ftl @@ -0,0 +1,11 @@ +altar-examine = [color=purple]This altar can be used to sacrifice Psionics.[/color] +altar-sacrifice-verb = Sacrifice + +altar-failure-reason-self = You can't sacrifice yourself! +altar-failure-reason-user = You are not psionic or clerically trained! +altar-failure-reason-user-humanoid = You are not a humanoid! +altar-failure-reason-target = {CAPITALIZE(THE($target))} {CONJUGATE-BE($target)} not psionic! +altar-failure-reason-target-humanoid = {CAPITALIZE(THE($target))} {CONJUGATE-BE($target)} not a humanoid! +altar-failure-reason-target-catatonic = {CAPITALIZE(THE($target))} {CONJUGATE-BE($target)} braindead! + +altar-sacrifice-popup = {$user} starts to sacrifice {$target}! diff --git a/Resources/Locale/en-US/chat/emotes.ftl b/Resources/Locale/en-US/chat/emotes.ftl index e95cb2795d..4e26752c4b 100644 --- a/Resources/Locale/en-US/chat/emotes.ftl +++ b/Resources/Locale/en-US/chat/emotes.ftl @@ -28,6 +28,8 @@ chat-emote-name-monkeyscreeches = Monkey Screeches chat-emote-name-robotbeep = Robot chat-emote-name-yawn = Yawn chat-emote-name-snore = Snore +chat-emote-name-mars = Mars +chat-emote-name-wurble = Wurble # Message chat-emote-msg-scream = screams! diff --git a/Resources/Locale/en-US/chat/managers/chat-manager.ftl b/Resources/Locale/en-US/chat/managers/chat-manager.ftl index 034f38f854..e25522ac1d 100644 --- a/Resources/Locale/en-US/chat/managers/chat-manager.ftl +++ b/Resources/Locale/en-US/chat/managers/chat-manager.ftl @@ -50,6 +50,8 @@ chat-manager-admin-channel-name = ADMIN chat-manager-rate-limited = You are sending messages too quickly! chat-manager-rate-limit-admin-announcement = Player { $player } breached chat rate limits. Watch them if this is a regular occurence. +chat-manager-send-empathy-chat-wrap-message = {$source}: {$message} + ## Speech verbs for chat chat-speech-verb-suffix-exclamation = ! @@ -156,3 +158,5 @@ chat-speech-verb-name-electricity = Electricity chat-speech-verb-electricity-1 = crackles chat-speech-verb-electricity-2 = buzzes chat-speech-verb-electricity-3 = screeches + +chat-speech-verb-marish = Mars \ No newline at end of file diff --git a/Resources/Locale/en-US/chat/ui/chat-box.ftl b/Resources/Locale/en-US/chat/ui/chat-box.ftl index 720f0d15ab..0dbfc0a27b 100644 --- a/Resources/Locale/en-US/chat/ui/chat-box.ftl +++ b/Resources/Locale/en-US/chat/ui/chat-box.ftl @@ -30,4 +30,4 @@ hud-chatbox-channel-Notifications = Notifications hud-chatbox-channel-Server = Server hud-chatbox-channel-Visual = Actions hud-chatbox-channel-Damage = Damage -hud-chatbox-channel-Unspecified = Unspecified +hud-chatbox-channel-Unspecified = Unspecified \ No newline at end of file diff --git a/Resources/Locale/en-US/commands/job-whitelist-command.ftl b/Resources/Locale/en-US/commands/job-whitelist-command.ftl new file mode 100644 index 0000000000..add6bca760 --- /dev/null +++ b/Resources/Locale/en-US/commands/job-whitelist-command.ftl @@ -0,0 +1,18 @@ +cmd-jobwhitelist-job-does-not-exist = Job {$job} does not exist. +cmd-jobwhitelist-player-not-found = Player {$player} not found. +cmd-jobwhitelist-hint-player = [player] +cmd-jobwhitelist-hint-job = [job] +cmd-jobwhitelistadd-desc = Lets a player play a whitelisted job. +cmd-jobwhitelistadd-help = Usage: jobwhitelistadd +cmd-jobwhitelistadd-already-whitelisted = {$player} is already whitelisted to play as {$jobId} .({$jobName}). +cmd-jobwhitelistadd-added = Added {$player} to the {$jobId} ({$jobName}) whitelist. +cmd-jobwhitelistget-desc = Gets all the jobs that a player has been whitelisted for. +cmd-jobwhitelistget-help = Usage: jobwhitelistadd +cmd-jobwhitelistget-whitelisted-none = Player {$player} is not whitelisted for any jobs. +cmd-jobwhitelistget-whitelisted-for = "Player {$player} is whitelisted for: +{$jobs}" + +cmd-jobwhitelistremove-desc = Removes a player's ability to play a whitelisted job. +cmd-jobwhitelistremove-help = Usage: jobwhitelistadd +cmd-jobwhitelistremove-was-not-whitelisted = {$player} was not whitelisted to play as {$jobId} ({$jobName}). +cmd-jobwhitelistremove-removed = Removed {$player} from the whitelist for {$jobId} ({$jobName}). diff --git a/Resources/Locale/en-US/deltav/changelog/changelog-window.ftl b/Resources/Locale/en-US/deltav/changelog/changelog-window.ftl deleted file mode 100644 index 1ab6e37cb0..0000000000 --- a/Resources/Locale/en-US/deltav/changelog/changelog-window.ftl +++ /dev/null @@ -1 +0,0 @@ -changelog-tab-title-DeltaVChangelog = Gooblog diff --git a/Resources/Locale/en-US/deltav/connection-messages.ftl b/Resources/Locale/en-US/deltav/connection-messages.ftl deleted file mode 100644 index 1787707934..0000000000 --- a/Resources/Locale/en-US/deltav/connection-messages.ftl +++ /dev/null @@ -1 +0,0 @@ -whitelist-not-whitelisted-peri = You are not whitelisted. To become whitelisted, apply on our discord. It can be found at https://www.discord.com/goobstation/ diff --git a/Resources/Locale/en-US/guidebook/guides.ftl b/Resources/Locale/en-US/guidebook/guides.ftl index e807bcad9d..84f3d9957f 100644 --- a/Resources/Locale/en-US/guidebook/guides.ftl +++ b/Resources/Locale/en-US/guidebook/guides.ftl @@ -72,4 +72,5 @@ guide-entry-writing = Writing guide-entry-glossary = Glossary guide-entry-altars-golemancy = Altars and Golemancy +guide-entry-glimmer-creatures = Glimmer Creatures guide-entry-reverse-engineering = Reverse Engineering diff --git a/Resources/Locale/en-US/health-examinable/health-examinable-comp.ftl b/Resources/Locale/en-US/health-examinable/health-examinable-comp.ftl index af31837ab8..60204eb2bd 100644 --- a/Resources/Locale/en-US/health-examinable/health-examinable-comp.ftl +++ b/Resources/Locale/en-US/health-examinable/health-examinable-comp.ftl @@ -1,2 +1,4 @@ health-examinable-verb-text = Health health-examinable-verb-disabled = Perform a basic health examination in close range. + +health-alert-start = [font size=12][color=green]Health:[/color][/font] diff --git a/Resources/Locale/en-US/health-examinable/health-examinable-silicon.ftl b/Resources/Locale/en-US/health-examinable/health-examinable-silicon.ftl index 03eaf07a3b..1608d8511d 100644 --- a/Resources/Locale/en-US/health-examinable/health-examinable-silicon.ftl +++ b/Resources/Locale/en-US/health-examinable/health-examinable-silicon.ftl @@ -1,4 +1,4 @@ -health-examinable-silicon-none = There is no obvious damage to be seen. +health-examinable-silicon-none = [color=green]There is no obvious damage to be seen.[/color] health-examinable-silicon-Blunt-25 = [color=red]{ CAPITALIZE(SUBJECT($target)) } { CONJUGATE-HAVE($target) } minor dents on { POSS-ADJ($target) } chassis.[/color] health-examinable-silicon-Blunt-50 = [color=crimson]{ CAPITALIZE(POSS-ADJ($target)) } chassis is severely dented![/color] diff --git a/Resources/Locale/en-US/info/whitelists.ftl b/Resources/Locale/en-US/info/whitelists.ftl new file mode 100644 index 0000000000..b67fc3e0ad --- /dev/null +++ b/Resources/Locale/en-US/info/whitelists.ftl @@ -0,0 +1,3 @@ +cmd-jobwhitelists-desc = Opens the job whitelists window +cmd-jobwhitelists-help = Usage: jobwhitelists [name or user guid] +cmd-jobwhitelists-player-err = The specified player could not be found diff --git a/Resources/Locale/en-US/interaction/verbs/noop.ftl b/Resources/Locale/en-US/interaction/verbs/noop.ftl index 37e8508c8d..953b2808ec 100644 --- a/Resources/Locale/en-US/interaction/verbs/noop.ftl +++ b/Resources/Locale/en-US/interaction/verbs/noop.ftl @@ -13,7 +13,7 @@ interaction-Hug-success-others-popup = {THE($user)} hugs {THE($target)}. interaction-Pet-name = Pet interaction-Pet-description = Pet your co-worker to ease their stress. interaction-Pet-success-self-popup = You pet {THE($target)} on {POSS-ADJ($target)} head. -interaction-Pet-success-target-popup = {THE($user)} pets you on {POSS-ADJ($target)} head. +interaction-Pet-success-target-popup = {THE($user)} pets you on your head. interaction-Pet-success-others-popup = {THE($user)} pets {THE($target)}. interaction-PetAnimal-name = {interaction-Pet-name} diff --git a/Resources/Locale/en-US/job/job-names.ftl b/Resources/Locale/en-US/job/job-names.ftl index 534620f0f2..60ab9b0543 100644 --- a/Resources/Locale/en-US/job/job-names.ftl +++ b/Resources/Locale/en-US/job/job-names.ftl @@ -5,10 +5,11 @@ job-name-hos = Head of Security job-name-detective = Detective job-name-brigmedic = Corpsman job-name-borg = Cyborg -job-name-scientist = Scientist -job-name-research-assistant = Research Assistant +job-name-senior-researcher = Mystic +job-name-scientist = Acolyte +job-name-research-assistant = Noviciate job-name-rd = Mystagogue -job-name-roboticist = Roboticist +job-name-roboticist = Golemancer job-name-psychologist = Psychologist job-name-intern = Medical Intern job-name-doctor = Medical Doctor @@ -86,17 +87,17 @@ JobPassenger = Passenger JobPsychologist = Psychologist JobQuartermaster = Logistics Officer JobReporter = Reporter -JobResearchAssistant = Research Assistant +JobResearchAssistant = Noviciate JobResearchDirector = Mystagogue -JobRoboticist = Roboticist +JobRoboticist = Golemancer JobSalvageSpecialist = Salvage Specialist -JobScientist = Scientist +JobScientist = Acolyte JobSecurityCadet = Security Cadet JobSecurityOfficer = Security Officer JobSeniorEngineer = Senior Engineer JobSeniorOfficer = Senior Officer JobSeniorPhysician = Senior Physician -JobSeniorResearcher = Senior Researcher +JobSeniorResearcher = Mystic JobServiceWorker = Service Worker JobStationEngineer = Station Engineer JobTechnicalAssistant = Technical Assistant diff --git a/Resources/Locale/en-US/job/role-whitelist.ftl b/Resources/Locale/en-US/job/role-whitelist.ftl new file mode 100644 index 0000000000..70031a650d --- /dev/null +++ b/Resources/Locale/en-US/job/role-whitelist.ftl @@ -0,0 +1 @@ +role-not-whitelisted = You are not whitelisted to play this role. diff --git a/Resources/Locale/en-US/language/languages.ftl b/Resources/Locale/en-US/language/languages.ftl index 02527498db..935eef896a 100644 --- a/Resources/Locale/en-US/language/languages.ftl +++ b/Resources/Locale/en-US/language/languages.ftl @@ -61,6 +61,9 @@ language-RobotTalk-description = A language consisting of harsh binary chirps, w language-Sign-name = Tau-Ceti Basic Sign Language language-Sign-description = TCB-SL for short, this sign language is prevalent among mute and deaf people. +language-Marish-name = Marish +language-Marish-description = An inherently empathetic language, conveying emotions with a single word; spoken effortlessly by Shadowkins, though nearly impossible to learn or replicate. + language-ValyrianStandard-name = Valyrian Standard language-ValyrianStandard-description = A language descended from eastern european languages of old earth - Valyrian Standard is the commonly spoken tongue of Harpies brought up on their homeworld of Valyrian 4b diff --git a/Resources/Locale/en-US/loadouts/categories.ftl b/Resources/Locale/en-US/loadouts/categories.ftl index 193760005e..778d0869b7 100644 --- a/Resources/Locale/en-US/loadouts/categories.ftl +++ b/Resources/Locale/en-US/loadouts/categories.ftl @@ -29,6 +29,7 @@ loadout-category-JobsServiceBartender = Bartender loadout-category-JobsServiceBotanist = Botanist loadout-category-JobsServiceChef = Chef loadout-category-JobsServiceJanitor = Janitor +loadout-category-JobsServiceMusician = Musician loadout-category-Mask = Mask loadout-category-Neck = Neck loadout-category-Outer = Outer diff --git a/Resources/Locale/en-US/loadouts/itemgroups.ftl b/Resources/Locale/en-US/loadouts/itemgroups.ftl index 9e66e200bc..dba4cf72a9 100644 --- a/Resources/Locale/en-US/loadouts/itemgroups.ftl +++ b/Resources/Locale/en-US/loadouts/itemgroups.ftl @@ -42,6 +42,10 @@ character-item-group-LoadoutUniformsScience = Epistemics Uniforms # Epistemics - Cataloguer character-item-group-LoadoutCataloguerUniforms = Cataloguer Uniforms +# Epistemics - Chaplain +character-item-group-LoadoutChaplainUniforms = Chaplain Uniforms +character-item-group-LoadoutChaplainEquipment = Chaplain Equipment + # Medical character-item-group-LoadoutEyesMedical = Medical Eyewear character-item-group-LoadoutGlovesMedical = Medical Gloves @@ -98,4 +102,4 @@ character-item-group-LoadoutMusicianInstruments = Musician Instruments # Traits - Languages character-item-group-TraitsLanguagesBasic = Basic Languages -character-item-group-TraitsAccents = Accents \ No newline at end of file +character-item-group-TraitsAccents = Accents diff --git a/Resources/Locale/en-US/markings/shadowkin.ftl b/Resources/Locale/en-US/markings/shadowkin.ftl new file mode 100644 index 0000000000..5ad1f09963 --- /dev/null +++ b/Resources/Locale/en-US/markings/shadowkin.ftl @@ -0,0 +1,7 @@ +marking-EyesShadowkin = Shadowkin + +marking-TailShadowkin = Shadowkin +marking-TailShadowkinBig = Shadowkin (Big) +marking-TailShadowkinShorter = Shadowkin (Short) +marking-TailShadowkinMedium = Shadowkin (Medium) +marking-TailShadowkinBigFluff = Shadowkin (Big and Fluffy) \ No newline at end of file diff --git a/Resources/Locale/en-US/metabolism/metabolizer-types.ftl b/Resources/Locale/en-US/metabolism/metabolizer-types.ftl index 30ab6c050e..d0f57e2bc0 100644 --- a/Resources/Locale/en-US/metabolism/metabolizer-types.ftl +++ b/Resources/Locale/en-US/metabolism/metabolizer-types.ftl @@ -11,3 +11,4 @@ metabolizer-type-moth = Moth metabolizer-type-arachnid = Arachnid metabolizer-type-vampiric = Vampiric metabolizer-type-liquorlifeline = Liquor Lifeline +metabolizer-type-shadowkin = Shadowkin diff --git a/Resources/Locale/en-US/mood/mood.ftl b/Resources/Locale/en-US/mood/mood.ftl index 5c31af0a4d..fbd41fed12 100644 --- a/Resources/Locale/en-US/mood/mood.ftl +++ b/Resources/Locale/en-US/mood/mood.ftl @@ -5,7 +5,7 @@ mood-effect-HungerOkay = I am feeling full. mood-effect-HungerPeckish = I could go for a snack right about now. mood-effect-HungerStarving = I NEED FOOD! -mood-effect-ThirstOverHydrated = I feel dizzy after drinking too much. +mood-effect-ThirstOverHydrated = I've had my fill of water. mood-effect-ThirstOkay = I'm feeling refreshed. mood-effect-ThirstThirsty = My lips are a little dry. mood-effect-ThirstParched = I NEED WATER! @@ -72,4 +72,4 @@ mood-effect-NicotineWithdrawal = mood-effect-EthanolBenefit = I feel so relaxed from drinking. mood-effect-SpaceDrugsBenefit = - Woaaaah, such pretty colors maaaaan. It's like I can hear color and taste sound maaan. \ No newline at end of file + Woaaaah, such pretty colors maaaaan. It's like I can hear color and taste sound maaan. diff --git a/Resources/Locale/en-US/psionics/psionic-powers.ftl b/Resources/Locale/en-US/psionics/psionic-powers.ftl index 37482a41b6..a7cec77aa2 100644 --- a/Resources/Locale/en-US/psionics/psionic-powers.ftl +++ b/Resources/Locale/en-US/psionics/psionic-powers.ftl @@ -1,5 +1,6 @@ generic-power-initialization-feedback = I Awaken. already-casting = I cannot channel more than one power at a time. +no-mana = I cannot channel enough power. # Dispel dispel-power-description = Dispel summoned entities such as familiars or forcewalls. @@ -69,7 +70,7 @@ revivify-power-initialization-feedback = The Secret of Life in its fullness. I feel my entire existence burning out from within, merely by knowing it. Power flows through me as a mighty river, begging to be released with a simple spoken word. revivify-power-metapsionic-feedback = {CAPITALIZE($entity)} bears the Greater Secret of Life. -revivify-word-begin = {CAPITALIZE($entity)} enunciates a word of such divine power, that those who hear it weep from joy. +revivify-begin = {CAPITALIZE($entity)} enunciates a word of such divine power, that those who hear it weep from joy. # Telegnosis telegnosis-power-description = Create a telegnostic projection to remotely observe things. @@ -131,6 +132,32 @@ telekinetic-pulse-power-initialization-feedback = As I reach through the veil with my psyche, I discover a wellspring of pure kinetic energy. It courses through me, but I seem to lack fine control over it. telekinetic-pulse-power-metapsionic-feedback = {CAPITALIZE($entity)} has the essence of pure kinesis flowing through him. +# Pyrokinetic Flare +action-name-pyrokinetic-flare = Pyrokinetic Flare +action-description-pyrokinetic-flare = + Generate a flash of firelight from Gehenna to blind your adversaries. +pyrokinetic-flare-power-description = { action-description-pyrokinetic-flare } +pyrokinetic-flare-power-initialization-feedback = + My gaze is briefly filled with a flash of immense light and head, and for a single moment I can see a glimpse of a realm + of fire and pain, of hunger and suffering. Just as soon as I glimpse it, the vision fades. But the memory of that flash lingers within my mind. + I can recall it still, a glimpse of the fires of Gehenna. +pyrokinetic-flare-power-metapsionic-feedback = Guh these don't even matter because nobody can read this line in-game and I don't know when I'm ever bringing back Narrow Pulse + +# Summon Imp +action-name-summon-imp = Summon Imp +action-description-summon-imp = + Summon and bind an Imp from Gehenna to serve as your Familiar. +summon-imp-power-description = { action-description-summon-imp } +summon-imp-power-initialization-feedback = + For a brief time, I find myself wandering the blackened fields of Gehenna. I sift between the ashes, finding a smoldering coal in the shape of an eye. + I breathe upon it, and it bursts alight with flame. Before I return, the creature thanks me and tells me its name. + +# Summon Remilia +action-name-summon-remilia = Summon Remilia +action-description-summon-remilia = + Call forth your ever-loyal familiar Remilia. +summon-remilia-power-description = { action-description-summon-remilia } + # Psionic System Messages mindbreaking-feedback = The light of life vanishes from {CAPITALIZE($entity)}'s eyes, leaving behind a husk pretending at sapience examine-mindbroken-message = @@ -139,3 +166,21 @@ examine-mindbroken-message = psionic-roll-failed = For a moment, my consciousness expands, yet I feel that it is not enough. entity-anomaly-no-grid = There is nowhere for me to conjure beings. power-overwhelming-power-feedback = {CAPITALIZE($entity)} wields a vast connection to the noösphere + +# Shadowkin ShadeSkip +action-description-shadowkin-shadeskip = Aaramrra! + +# DarkSwap +action-name-darkswap = DarkSwap +action-description-darkswap = Mmra Mamm! + +ethereal-pickup-fail = My hand sizzles as it passes through... + +# Psionic Familiar System +psionic-familiar-cant-attack-master = I am bound by my Master, I cannot harm them. +psionic-familiar-despawn-text = {CAPITALIZE($entity)} returns from whence it came! +ghost-role-information-familiar-name = Psionic Familiar +ghost-role-information-familiar-description = An interdimensional creature bound to the will of a Psion. +ghost-role-information-familiar-rules = + Obey the one who summoned you. Do not act against the interests of your Master. You will die for your Master if it is necessary. + diff --git a/Resources/Locale/en-US/research/technologies.ftl b/Resources/Locale/en-US/research/technologies.ftl index 684a08dd9a..fe7293d848 100644 --- a/Resources/Locale/en-US/research/technologies.ftl +++ b/Resources/Locale/en-US/research/technologies.ftl @@ -43,6 +43,7 @@ research-technology-basic-xenoarcheology = Basic XenoArcheology research-technology-alternative-research = Alternative Research research-technology-magnets-tech = Localized Magnetism research-technology-advanced-parts = Advanced Parts +research-technology-advanced-bluespace = Advanced Bluespace Research research-technology-anomaly-harnessing = Anomaly Core Harnessing research-technology-grappling = Grappling research-technology-abnormal-artifact-manipulation = Artifact Recycling diff --git a/Resources/Locale/en-US/species/shadowkin.ftl b/Resources/Locale/en-US/species/shadowkin.ftl new file mode 100644 index 0000000000..ebc56487b7 --- /dev/null +++ b/Resources/Locale/en-US/species/shadowkin.ftl @@ -0,0 +1,15 @@ +shadowkin-power-examined-other = {CAPITALIZE(SUBJECT($target))} seems to be {$powerType}. +shadowkin-power-examined-self = I have {$power}/{$powerMax} energy, I am {$powerType}. + +shadowkin-power-5 = energetic +shadowkin-power-4 = great +shadowkin-power-3 = good +shadowkin-power-2 = okay +shadowkin-power-1 = exhausted +shadowkin-power-0 = drained + +examine-mindbroken-shadowkin-message = {CAPITALIZE($entity)} seems to be a blackeye. + +identity-eye-shadowkin = {$color}-eye + +shadowkin-blackeye = I feel my power draining away... \ No newline at end of file diff --git a/Resources/Locale/en-US/species/species.ftl b/Resources/Locale/en-US/species/species.ftl index 6c40c45404..9278267cc4 100644 --- a/Resources/Locale/en-US/species/species.ftl +++ b/Resources/Locale/en-US/species/species.ftl @@ -11,3 +11,4 @@ species-name-moth = Moth Person species-name-skeleton = Skeleton species-name-vox = Vox species-name-ipc = IPC +species-name-shadowkin = Shadowkin \ No newline at end of file diff --git a/Resources/Locale/en-US/traits/misc.ftl b/Resources/Locale/en-US/traits/misc.ftl index b76dfa9729..814614f4e2 100644 --- a/Resources/Locale/en-US/traits/misc.ftl +++ b/Resources/Locale/en-US/traits/misc.ftl @@ -1 +1 @@ -examine-cybereyes-message = {$entity}'s eyes shine with a faint inner light. +examine-cybereyes-message = {CAPITALIZE(POSS-ADJ($entity))} eyes shine with a faint inner light. diff --git a/Resources/Locale/en-US/traits/traits.ftl b/Resources/Locale/en-US/traits/traits.ftl index cfd53bbde3..921546d466 100644 --- a/Resources/Locale/en-US/traits/traits.ftl +++ b/Resources/Locale/en-US/traits/traits.ftl @@ -318,6 +318,10 @@ trait-name-AddictionNicotine = Nicotine Addiction trait-description-AddictionNicotine = You have an addiction to Nicotine, and will require frequent smoke breaks to keep your mood in check. +trait-name-AnimalFriend = Animal Friend +trait-description-AnimalFriend = + You have a way with animals. You will never be attacked by animals, unless you attack them first. + trait-name-Liar = Pathological liar trait-description-Liar = You can hardly bring yourself to tell the truth. Sometimes you lie anyway. @@ -400,3 +404,6 @@ trait-description-CyberEyesOmni = This expensive implant provides the combined benefits of a SecHud, MedHud, and a DiagHud. Note that this augmentation is considered Contraband for anyone not under the employ of station Security personel, and may be disabled by your employer before dispatch to the station. + +trait-name-ShadowkinBlackeye = Blackeye +trait-description-ShadowkinBlackeye = You lose your special Shadowkin powers, in return for some points. diff --git a/Resources/Locale/en-US/virtual/virtual-item.ftl b/Resources/Locale/en-US/virtual/virtual-item.ftl new file mode 100644 index 0000000000..cb91f24cf7 --- /dev/null +++ b/Resources/Locale/en-US/virtual/virtual-item.ftl @@ -0,0 +1 @@ +virtual-item-dropped-other = You dropped {THE($dropped)}! diff --git a/Resources/Maps/Shuttles/pathfinder.yml b/Resources/Maps/Shuttles/pathfinder.yml index cc43ba831c..d28c1fc820 100644 --- a/Resources/Maps/Shuttles/pathfinder.yml +++ b/Resources/Maps/Shuttles/pathfinder.yml @@ -2594,18 +2594,6 @@ entities: - type: Transform pos: 4.5,-2.5 parent: 1 -- proto: SpawnPointLatejoin - entities: - - uid: 357 - components: - - type: Transform - pos: -2.5,-4.5 - parent: 1 - - uid: 358 - components: - - type: Transform - pos: -2.5,-2.5 - parent: 1 - proto: SubstationWallBasic entities: - uid: 52 diff --git a/Resources/Maps/Shuttles/DeltaV/DV-pirateradio.yml b/Resources/Maps/Shuttles/pirateradio.yml similarity index 91% rename from Resources/Maps/Shuttles/DeltaV/DV-pirateradio.yml rename to Resources/Maps/Shuttles/pirateradio.yml index 9cff388fc8..28cd42f185 100644 --- a/Resources/Maps/Shuttles/DeltaV/DV-pirateradio.yml +++ b/Resources/Maps/Shuttles/pirateradio.yml @@ -25,32 +25,31 @@ entities: - type: MetaData name: unknown - type: Transform - parent: invalid - type: MapGrid chunks: 0,0: ind: 0,0 - tiles: QwAAAAAAewAAAAADQQAAAAAAQQAAAAAAewAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAKQAAAAAAJgAAAAAAJgAAAAAAJgAAAAAAKQAAAAADUAAAAAAAfgAAAAAAfgAAAAAAQwAAAAAAewAAAAAAQQAAAAAAQQAAAAAAewAAAAADQwAAAAAAWQAAAAAAQwAAAAAAKQAAAAABJgAAAAAAJgAAAAAAJgAAAAAAKQAAAAABUAAAAAAAfgAAAAAAfgAAAAAAQwAAAAAAewAAAAAAQQAAAAAAQQAAAAAAewAAAAABKQAAAAABWQAAAAAAQwAAAAAAKQAAAAADKQAAAAACKQAAAAACKQAAAAACKQAAAAACUAAAAAAAfgAAAAAAfgAAAAAAKQAAAAAAewAAAAADewAAAAABewAAAAAAewAAAAABQwAAAAAAWQAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAGQAAAAABfgAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAKQAAAAABQwAAAAAAQwAAAAAABwAAAAAABwAAAAAAGQAAAAAAGQAAAAABGQAAAAADGQAAAAADGQAAAAACGQAAAAABGQAAAAACGQAAAAAEQwAAAAAAbQAAAAAAQwAAAAAAbQAAAAAAbQAAAAAABwAAAAAAGQAAAAACGQAAAAAGGQAAAAACGQAAAAAEGQAAAAAFGQAAAAAEGQAAAAACGQAAAAAEGQAAAAABGQAAAAADQwAAAAAABwAAAAAAQwAAAAAAQwAAAAAAQwAAAAAABwAAAAAAfgAAAAAAGQAAAAADGQAAAAAAGQAAAAAGGQAAAAABGQAAAAABGQAAAAAEGQAAAAADGQAAAAAAGQAAAAADGQAAAAABGQAAAAAAGQAAAAACGQAAAAAEGQAAAAACGQAAAAAEGQAAAAACGQAAAAAEGQAAAAAAGQAAAAAFGQAAAAAEGQAAAAACGQAAAAAFGQAAAAAFGQAAAAAAGQAAAAAGGQAAAAABGQAAAAAEGQAAAAAAGQAAAAABGQAAAAAAGQAAAAAAGQAAAAABGQAAAAAGGQAAAAAAGQAAAAACGQAAAAAFGQAAAAAEGQAAAAAAAAAAAAAAAAAAAAAAGQAAAAAEGQAAAAADGQAAAAAFGQAAAAADGQAAAAABGQAAAAAGGQAAAAADGQAAAAAFGQAAAAABAAAAAAAAAAAAAAAAGQAAAAACGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAFGQAAAAAEGQAAAAAAGQAAAAABfgAAAAAAGQAAAAACGQAAAAAFGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAEGQAAAAACGQAAAAABGQAAAAAFGQAAAAAFGQAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAAGQAAAAAEAAAAAAAAGQAAAAAAGQAAAAAGAAAAAAAAGQAAAAACGQAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: QwAAAAAAewAAAAADQQAAAAAAQQAAAAAAewAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAKQAAAAAAJgAAAAAAJgAAAAAAJgAAAAAAKQAAAAADUAAAAAAAfgAAAAAAfgAAAAAAQwAAAAAAewAAAAAAQQAAAAAAQQAAAAAAewAAAAADQwAAAAAAWQAAAAAAQwAAAAAAKQAAAAABJgAAAAAAJgAAAAAAJgAAAAAAKQAAAAABUAAAAAAAfgAAAAAAfgAAAAAAQwAAAAAAewAAAAAAQQAAAAAAQQAAAAAAewAAAAABKQAAAAABWQAAAAAAQwAAAAAAKQAAAAADKQAAAAACKQAAAAACKQAAAAACKQAAAAACUAAAAAAAfgAAAAAAfgAAAAAAKQAAAAAAewAAAAADewAAAAABewAAAAAAewAAAAABQwAAAAAAWQAAAAAAQwAAAAAAKQAAAAAAKQAAAAAAKQAAAAAAKQAAAAAAKQAAAAAAQwAAAAAAGQAAAAABfgAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAKQAAAAABQwAAAAAAQwAAAAAABwAAAAAABwAAAAAAKQAAAAAAKQAAAAAAKQAAAAAAKQAAAAAAKQAAAAAAGQAAAAABGQAAAAACGQAAAAAEQwAAAAAAbQAAAAAAQwAAAAAAbQAAAAAAbQAAAAAABwAAAAAAGQAAAAACGQAAAAAGGQAAAAACGQAAAAAEGQAAAAAFKQAAAAAAGQAAAAACGQAAAAAEGQAAAAABGQAAAAADQwAAAAAABwAAAAAAQwAAAAAAQwAAAAAAQwAAAAAABwAAAAAAfgAAAAAAKQAAAAAAKQAAAAAAKQAAAAAAKQAAAAAAKQAAAAAAKQAAAAAAKQAAAAAAKQAAAAAAGQAAAAADGQAAAAABGQAAAAAAGQAAAAACGQAAAAAEGQAAAAACGQAAAAAEGQAAAAACGQAAAAAEKQAAAAAAKQAAAAAAKQAAAAAAKQAAAAAAKQAAAAAAKQAAAAAAKQAAAAAAGQAAAAAGGQAAAAABGQAAAAAEGQAAAAAAGQAAAAABGQAAAAAAGQAAAAAAGQAAAAABGQAAAAAGKQAAAAAAKQAAAAAAKQAAAAAAKQAAAAAAKQAAAAAAKQAAAAAAKQAAAAAAGQAAAAAEGQAAAAADGQAAAAAFGQAAAAADGQAAAAABGQAAAAAGGQAAAAADGQAAAAAFGQAAAAABGQAAAAAAKQAAAAAAKQAAAAAAbQAAAAAAGQAAAAAAGQAAAAAAGQAAAAAAGQAAAAAAGQAAAAAFGQAAAAAEGQAAAAAAGQAAAAABfgAAAAAAGQAAAAACGQAAAAAFGQAAAAAAGQAAAAAAGQAAAAAAGQAAAAAAbQAAAAAAGQAAAAAAGQAAAAAAGQAAAAAAGQAAAAAAAAAAAAAAGQAAAAAEGQAAAAACGQAAAAABGQAAAAAFGQAAAAAFGQAAAAAFGQAAAAAAGQAAAAAAGQAAAAAAGQAAAAAAbQAAAAAAGQAAAAAAfgAAAAAAGQAAAAAAAAAAAAAAGQAAAAAAGQAAAAAEAAAAAAAAGQAAAAAAGQAAAAAGGQAAAAAAGQAAAAACGQAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 0,-1: ind: 0,-1 - tiles: GQAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAAGQAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAGGQAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAGAAAAAAAAGQAAAAAGGQAAAAABAAAAAAAAAAAAAAAAGQAAAAABAAAAAAAAAAAAAAAAGQAAAAACAAAAAAAAAAAAAAAAGQAAAAABGQAAAAADAAAAAAAAAAAAAAAAGQAAAAACGQAAAAAFGQAAAAAEGQAAAAACGQAAAAABGQAAAAAAGQAAAAABGQAAAAACGQAAAAABGQAAAAABAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAACAAAAAAAAAAAAAAAAGQAAAAAEGQAAAAADGQAAAAAGGQAAAAADGQAAAAABGQAAAAAAGQAAAAAFGQAAAAACGQAAAAABGQAAAAACGQAAAAAFAAAAAAAAGQAAAAACGQAAAAAAAAAAAAAAAAAAAAAAGQAAAAAFGQAAAAAEGQAAAAAAGQAAAAAFfgAAAAAAGQAAAAABGQAAAAACGQAAAAADGQAAAAAGGQAAAAADGQAAAAAGGQAAAAAEGQAAAAADAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAGGQAAAAAFGQAAAAADGQAAAAAAGQAAAAAFGQAAAAAFGQAAAAAGGQAAAAAGGQAAAAABGQAAAAAEGQAAAAAEGQAAAAAEGQAAAAAFGQAAAAAFGQAAAAAEAAAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAGQAAAAABGQAAAAAEGQAAAAABGQAAAAAGGQAAAAABGQAAAAAAGQAAAAACGQAAAAABGQAAAAAEGQAAAAABGQAAAAAEGQAAAAAAWQAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAWQAAAAAAQwAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAGQAAAAAEGQAAAAADGQAAAAAGGQAAAAADGQAAAAAGGQAAAAACGQAAAAABWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAQwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAQwAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAGQAAAAAEGQAAAAABQwAAAAAAQwAAAAAAKQAAAAACQwAAAAAAQwAAAAAAQwAAAAAAewAAAAAAewAAAAACewAAAAACQwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAQwAAAAAAGQAAAAABQwAAAAAAYAAAAAACYAAAAAAAYAAAAAADYAAAAAAAQwAAAAAAewAAAAACewAAAAADewAAAAABQwAAAAAAKQAAAAAAKQAAAAABKQAAAAADKQAAAAAAQwAAAAAAGQAAAAAGQwAAAAAAYAAAAAACYAAAAAACYAAAAAAAYAAAAAABQwAAAAAAewAAAAACewAAAAABewAAAAADKQAAAAACKQAAAAAAKQAAAAACKQAAAAADKQAAAAADQwAAAAAAGQAAAAAGQwAAAAAAYAAAAAACYAAAAAADYAAAAAACYAAAAAACQwAAAAAAewAAAAACewAAAAACewAAAAAAQwAAAAAAKQAAAAADKQAAAAAAKQAAAAABKQAAAAABQwAAAAAAGQAAAAABQwAAAAAAQwAAAAAAKQAAAAACQwAAAAAAQwAAAAAAQwAAAAAAKQAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAUAAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAGQAAAAADKQAAAAACewAAAAABewAAAAABewAAAAACewAAAAADKQAAAAAAKQAAAAACKQAAAAABKQAAAAACKQAAAAABKQAAAAACKQAAAAACKQAAAAAAUAAAAAAAfgAAAAAAfgAAAAAA + tiles: GQAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAAGQAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAGGQAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAGAAAAAAAAGQAAAAAGGQAAAAABAAAAAAAAAAAAAAAAGQAAAAABAAAAAAAAAAAAAAAAGQAAAAACAAAAAAAAAAAAAAAAGQAAAAABGQAAAAADAAAAAAAAAAAAAAAAGQAAAAACGQAAAAAFGQAAAAAEGQAAAAACGQAAAAABGQAAAAAAGQAAAAABGQAAAAACGQAAAAABGQAAAAABAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAACAAAAAAAAAAAAAAAAGQAAAAAEGQAAAAADGQAAAAAGGQAAAAADGQAAAAABGQAAAAAAGQAAAAAFGQAAAAACGQAAAAABGQAAAAACGQAAAAAFAAAAAAAAGQAAAAACGQAAAAAAAAAAAAAAAAAAAAAAGQAAAAAFGQAAAAAEGQAAAAAAGQAAAAAFfgAAAAAAGQAAAAABGQAAAAACGQAAAAADGQAAAAAGGQAAAAADGQAAAAAGGQAAAAAEGQAAAAADAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAGGQAAAAAFGQAAAAADGQAAAAAAGQAAAAAFGQAAAAAFKQAAAAAAGQAAAAAGGQAAAAABGQAAAAAEGQAAAAAEGQAAAAAEGQAAAAAFGQAAAAAFGQAAAAAEAAAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAGQAAAAABGQAAAAAEGQAAAAABGQAAAAAGGQAAAAABGQAAAAAAGQAAAAACGQAAAAABGQAAAAAEGQAAAAABGQAAAAAEGQAAAAAAWQAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAWQAAAAAAQwAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAGQAAAAAEGQAAAAADGQAAAAAGGQAAAAADGQAAAAAGGQAAAAACGQAAAAABWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAQwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAQwAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAGQAAAAAEGQAAAAABQwAAAAAAQwAAAAAAKQAAAAACQwAAAAAAQwAAAAAAQwAAAAAAewAAAAAAewAAAAACewAAAAACQwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAQwAAAAAAGQAAAAABQwAAAAAAYAAAAAACYAAAAAAAYAAAAAADYAAAAAAAQwAAAAAAewAAAAACewAAAAADewAAAAABQwAAAAAAKQAAAAAAKQAAAAABKQAAAAADKQAAAAAAQwAAAAAAGQAAAAAGQwAAAAAAYAAAAAACYAAAAAACYAAAAAAAYAAAAAABQwAAAAAAewAAAAACewAAAAABewAAAAADKQAAAAACKQAAAAAAKQAAAAACKQAAAAADKQAAAAADQwAAAAAAGQAAAAAGQwAAAAAAYAAAAAACYAAAAAADYAAAAAACYAAAAAACQwAAAAAAewAAAAACewAAAAACewAAAAAAQwAAAAAAKQAAAAADKQAAAAAAKQAAAAABKQAAAAABQwAAAAAAGQAAAAABQwAAAAAAQwAAAAAAKQAAAAACQwAAAAAAQwAAAAAAQwAAAAAAKQAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAUAAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAGQAAAAADKQAAAAACewAAAAABewAAAAABewAAAAACewAAAAADKQAAAAAAKQAAAAACKQAAAAABKQAAAAACKQAAAAABKQAAAAACKQAAAAACKQAAAAAAUAAAAAAAfgAAAAAAfgAAAAAA version: 6 -1,0: ind: -1,0 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAADAAAAAAAAGQAAAAACGQAAAAAFGQAAAAAEGQAAAAADQwAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAGGQAAAAACGQAAAAABGQAAAAAAfgAAAAAAGQAAAAADQwAAAAAAQwAAAAAAWQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAEGQAAAAAAGQAAAAAFGQAAAAAEQwAAAAAAQwAAAAAAQwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAAGQAAAAAAGQAAAAAGGQAAAAABGQAAAAAAGQAAAAAFQwAAAAAAbQAAAAAAbQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAFGQAAAAAAGQAAAAAEAAAAAAAAGQAAAAABGQAAAAAFGQAAAAAFGQAAAAADQwAAAAAAbQAAAAAAbQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAABAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAADGQAAAAAFfgAAAAAAGQAAAAACQwAAAAAAbQAAAAAAbQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAACGQAAAAAAGQAAAAAEGQAAAAACGQAAAAAAGQAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAEGQAAAAACGQAAAAAGGQAAAAAGGQAAAAAEGQAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAGGQAAAAAFGQAAAAABGQAAAAAFGQAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAADGQAAAAABGQAAAAAAGQAAAAACGQAAAAAFGQAAAAABGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAEGQAAAAACGQAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAADAAAAAAAAGQAAAAACGQAAAAAFGQAAAAAEGQAAAAADQwAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAGGQAAAAACGQAAAAABGQAAAAAAfgAAAAAAGQAAAAADQwAAAAAAQwAAAAAAWQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAEGQAAAAAAGQAAAAAFGQAAAAAEQwAAAAAAQwAAAAAAQwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAAGQAAAAAAGQAAAAAGGQAAAAABGQAAAAAAGQAAAAAFQwAAAAAAbQAAAAAAbQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAFGQAAAAAAGQAAAAAEAAAAAAAAGQAAAAABGQAAAAAFGQAAAAAFGQAAAAADQwAAAAAAbQAAAAAAbQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAABAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAADGQAAAAAFfgAAAAAAGQAAAAACQwAAAAAAbQAAAAAAbQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAACGQAAAAAAGQAAAAAEGQAAAAACGQAAAAAAGQAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAEGQAAAAACGQAAAAAGGQAAAAAGGQAAAAAEGQAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAGGQAAAAAFGQAAAAABGQAAAAAFGQAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAADGQAAAAABGQAAAAAAfgAAAAAAGQAAAAAFGQAAAAABGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAEGQAAAAACGQAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 -1,-1: ind: -1,-1 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAEAAAAAAAAAAAAAAAAGQAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAGGQAAAAACAAAAAAAAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAADGQAAAAADAAAAAAAAAAAAAAAAGQAAAAACGQAAAAACGQAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAABAAAAAAAAGQAAAAADGQAAAAABGQAAAAADGQAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAABGQAAAAAGGQAAAAAAGQAAAAAFGQAAAAABGQAAAAADGQAAAAAGGQAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAEGQAAAAAGGQAAAAAEGQAAAAAAGQAAAAAAGQAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAEGQAAAAADGQAAAAAFGQAAAAACQwAAAAAAQwAAAAAAQwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAEGQAAAAAAGQAAAAAAGQAAAAAAQwAAAAAAIAAAAAADIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAEGQAAAAACGQAAAAAAGQAAAAAFGQAAAAABQwAAAAAAWQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAACGQAAAAAAGQAAAAAAGQAAAAADGQAAAAACGQAAAAAGGQAAAAAEQwAAAAAAWQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAADGQAAAAABGQAAAAACGQAAAAABGQAAAAAEQwAAAAAAQwAAAAAAQwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAGGQAAAAAGfgAAAAAAGQAAAAAAQwAAAAAAWgAAAAAAWgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAAGQAAAAAFGQAAAAABGQAAAAABGQAAAAACGQAAAAABGQAAAAAEQwAAAAAAWgAAAAAAWgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAGAAAAAAAAAAAAAAAAGQAAAAAAGQAAAAAAGQAAAAADGQAAAAAFQwAAAAAAKQAAAAACQwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAEGQAAAAAEGQAAAAABQwAAAAAAQwAAAAAAWQAAAAAAWQAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAEAAAAAAAAAAAAAAAAGQAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAGGQAAAAACAAAAAAAAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAADGQAAAAADAAAAAAAAAAAAAAAAGQAAAAACGQAAAAACGQAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAABAAAAAAAAGQAAAAADGQAAAAABGQAAAAADGQAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAABGQAAAAAGGQAAAAAAGQAAAAAFGQAAAAABGQAAAAADGQAAAAAGGQAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAEGQAAAAAGGQAAAAAEGQAAAAAAGQAAAAAAGQAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAGQAAAAADGQAAAAAFGQAAAAACQwAAAAAAQwAAAAAAQwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAEGQAAAAAAGQAAAAAAGQAAAAAAQwAAAAAAIAAAAAADIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAEGQAAAAACGQAAAAAAGQAAAAAFGQAAAAABQwAAAAAAWQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAACGQAAAAAAGQAAAAAAGQAAAAADGQAAAAACGQAAAAAGGQAAAAAEQwAAAAAAWQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAADGQAAAAABGQAAAAACGQAAAAABGQAAAAAEQwAAAAAAQwAAAAAAQwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAGGQAAAAAGfgAAAAAAGQAAAAAAQwAAAAAAWgAAAAAAWgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAAGQAAAAAFGQAAAAABGQAAAAABGQAAAAACGQAAAAABGQAAAAAEQwAAAAAAWgAAAAAAWgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAGAAAAAAAAAAAAAAAAGQAAAAAAGQAAAAAAGQAAAAADGQAAAAAFQwAAAAAAKQAAAAACQwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAEGQAAAAAEGQAAAAABQwAAAAAAQwAAAAAAWQAAAAAAWQAAAAAA version: 6 1,-1: ind: 1,-1 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAEGQAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAEGQAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAADGQAAAAAFAAAAAAAAGQAAAAABGQAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAGGQAAAAABGQAAAAACGQAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAAGQAAAAAGGQAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAADGQAAAAAGGQAAAAABAAAAAAAAAAAAAAAAGQAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAEGQAAAAAGGQAAAAACAAAAAAAAAAAAAAAAGQAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAFGQAAAAAFGQAAAAAAGQAAAAAAGQAAAAAAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAGGQAAAAADGQAAAAAFGQAAAAABGQAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAACGQAAAAABGQAAAAADGQAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAEGQAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAEGQAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAADGQAAAAAFAAAAAAAAGQAAAAABGQAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAGGQAAAAABGQAAAAACGQAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAAGQAAAAAGGQAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAADGQAAAAAGGQAAAAABAAAAAAAAAAAAAAAAGQAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAEGQAAAAAGfgAAAAAAfgAAAAAAAAAAAAAAGQAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAFGQAAAAAFGQAAAAAAGQAAAAAAGQAAAAAAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAGGQAAAAADGQAAAAAFGQAAAAABGQAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAACGQAAAAABGQAAAAADGQAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 1,0: ind: 1,0 - tiles: GQAAAAADGQAAAAABGQAAAAADGQAAAAADGQAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAAGQAAAAAAGQAAAAAEGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAACGQAAAAAAGQAAAAAGGQAAAAADGQAAAAACGQAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAADGQAAAAACGQAAAAABGQAAAAABGQAAAAAFGQAAAAAFGQAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAACGQAAAAAEGQAAAAADGQAAAAAAGQAAAAAAGQAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAEGQAAAAAAGQAAAAAGGQAAAAAFGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAAAAAAAAAAAAAAAAAAGQAAAAADGQAAAAADGQAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAGGQAAAAAAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAABAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAEGQAAAAAAGQAAAAAGGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAFAAAAAAAAGQAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: GQAAAAADGQAAAAABGQAAAAADGQAAAAADGQAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAAGQAAAAAAGQAAAAAEGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAACGQAAAAAAGQAAAAAGGQAAAAADGQAAAAACGQAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAADGQAAAAACGQAAAAABGQAAAAABGQAAAAAFGQAAAAAFGQAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAACGQAAAAAEGQAAAAADGQAAAAAAGQAAAAAAGQAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAEGQAAAAAAGQAAAAAGGQAAAAAFGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAAGQAAAAAAAAAAAAAAGQAAAAADGQAAAAADGQAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAAGQAAAAAAAAAAAAAAAAAAAAAAGQAAAAAGGQAAAAAAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAABGQAAAAAAGQAAAAAAAAAAAAAAGQAAAAAEGQAAAAAAGQAAAAAGGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAFAAAAAAAAGQAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAAGQAAAAAAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 - type: Broadphase - type: Physics @@ -71,11 +70,33 @@ entities: chunkCollection: version: 2 nodes: + - node: + color: '#FFFFFFFF' + id: Arrows + decals: + 59: 12,8 + - node: + angle: 3.141592653589793 rad + color: '#FFFFFFFF' + id: Arrows + decals: + 60: 12,6 + - node: + color: '#FF0000FF' + id: BoxGreyscale + decals: + 58: 13,7 - node: color: '#FFFFFFFF' id: Caution decals: 0: 3.018731,5.165427 + - node: + angle: 4.71238898038469 rad + color: '#FFFFFFFF' + id: StandClear + decals: + 54: 12,7 - node: color: '#FFFFFFFF' id: WarnBox @@ -96,6 +117,12 @@ entities: id: WarnCornerSmallSW decals: 17: 4,7 + - node: + color: '#FFFFFFFF' + id: WarnLineE + decals: + 78: 12,-10 + 80: 6,-10 - node: color: '#FFFFFFFF' id: WarnLineN @@ -120,16 +147,17 @@ entities: 42: 10,-8 43: 7,-9 44: 6,-9 + 79: 6,-10 - node: color: '#FFFFFFFF' id: WoodTrimThinCornerNe decals: - 2: 12,2 + 45: 12,4 - node: color: '#FFFFFFFF' id: WoodTrimThinCornerNw decals: - 5: 8,2 + 46: 8,4 - node: color: '#FFFFFFFF' id: WoodTrimThinCornerSe @@ -169,15 +197,17 @@ entities: 22: 1,2 23: 1,1 24: 1,0 + 50: 12,3 + 51: 12,2 - node: color: '#FFFFFFFF' id: WoodTrimThinLineN decals: - 6: 9,2 - 7: 10,2 - 8: 11,2 26: 2,-1 27: 3,-1 + 47: 9,4 + 48: 10,4 + 49: 11,4 - node: color: '#FFFFFFFF' id: WoodTrimThinLineS @@ -195,11 +225,78 @@ entities: 19: 4,2 20: 4,1 21: 4,0 + 52: 8,3 + 53: 8,2 - node: color: '#FF0000FF' id: space decals: 1: 3.018731,4.884177 + - node: + color: '#FFFFFFFF' + id: syndlogo1 + decals: + 74: 8,8 + - node: + color: '#FFFFFFFF' + id: syndlogo10 + decals: + 67: 9,6 + - node: + color: '#FFFFFFFF' + id: syndlogo11 + decals: + 68: 10,6 + - node: + color: '#FFFFFFFF' + id: syndlogo12 + decals: + 69: 11,6 + - node: + color: '#FFFFFFFF' + id: syndlogo13 + decals: + 77: 10,6 + - node: + color: '#FFFFFFFF' + id: syndlogo2 + decals: + 62: 9,8 + - node: + color: '#FFFFFFFF' + id: syndlogo3 + decals: + 63: 10,8 + - node: + color: '#FFFFFFFF' + id: syndlogo4 + decals: + 73: 11,8 + - node: + color: '#FFFFFFFF' + id: syndlogo5 + decals: + 75: 8,7 + - node: + color: '#FFFFFFFF' + id: syndlogo6 + decals: + 64: 9,7 + - node: + color: '#FFFFFFFF' + id: syndlogo7 + decals: + 65: 10,7 + - node: + color: '#FFFFFFFF' + id: syndlogo8 + decals: + 72: 11,7 + - node: + color: '#FFFFFFFF' + id: syndlogo9 + decals: + 76: 8,6 - type: GridAtmosphere version: 2 data: @@ -374,8 +471,6 @@ entities: - 384 - 716 - 724 - - type: AtmosDevice - joinedGrid: 1 - proto: AirCanister entities: - uid: 3 @@ -386,8 +481,6 @@ entities: parent: 1 - type: Physics bodyType: Static - - type: AtmosDevice - joinedGrid: 1 - proto: AirlockExternalShuttleSyndicateLocked entities: - uid: 4 @@ -403,6 +496,20 @@ entities: - 806 missingComponents: - Docking + - uid: 414 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 11.5,11.5 + parent: 1 +- proto: AirlockHatchSyndicate + entities: + - uid: 405 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 11.5,9.5 + parent: 1 - proto: AirlockSyndicate entities: - uid: 5 @@ -461,6 +568,11 @@ entities: - type: Transform pos: 3.5,4.5 parent: 1 + - uid: 401 + components: + - type: Transform + pos: 11.5,5.5 + parent: 1 - uid: 950 components: - type: MetaData @@ -500,6 +612,14 @@ entities: rot: 3.141592653589793 rad pos: 4.5,7.5 parent: 1 +- proto: AlwaysPoweredLightPostSmallRed + entities: + - uid: 1006 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 13.5,11.5 + parent: 1 - proto: AlwaysPoweredSmallLightMaintenanceRed entities: - uid: 953 @@ -554,21 +674,11 @@ entities: - type: Transform pos: 4.5,8.5 parent: 1 - - uid: 30 - components: - - type: Transform - pos: 6.5,5.5 - parent: 1 - uid: 31 components: - type: Transform pos: 5.5,8.5 parent: 1 - - uid: 32 - components: - - type: Transform - pos: 6.5,8.5 - parent: 1 - uid: 33 components: - type: Transform @@ -594,11 +704,6 @@ entities: - type: Transform pos: 14.5,4.5 parent: 1 - - uid: 38 - components: - - type: Transform - pos: 15.5,4.5 - parent: 1 - uid: 39 components: - type: Transform @@ -609,26 +714,6 @@ entities: - type: Transform pos: 2.5,8.5 parent: 1 - - uid: 41 - components: - - type: Transform - pos: 7.5,5.5 - parent: 1 - - uid: 42 - components: - - type: Transform - pos: 7.5,7.5 - parent: 1 - - uid: 43 - components: - - type: Transform - pos: 8.5,5.5 - parent: 1 - - uid: 44 - components: - - type: Transform - pos: 14.5,5.5 - parent: 1 - uid: 45 components: - type: Transform @@ -729,11 +814,6 @@ entities: - type: Transform pos: 1.5,8.5 parent: 1 - - uid: 67 - components: - - type: Transform - pos: 6.5,10.5 - parent: 1 - uid: 68 components: - type: Transform @@ -1009,71 +1089,6 @@ entities: - type: Transform pos: 16.5,5.5 parent: 1 - - uid: 125 - components: - - type: Transform - pos: 15.5,5.5 - parent: 1 - - uid: 126 - components: - - type: Transform - pos: 13.5,5.5 - parent: 1 - - uid: 127 - components: - - type: Transform - pos: 11.5,8.5 - parent: 1 - - uid: 128 - components: - - type: Transform - pos: 12.5,8.5 - parent: 1 - - uid: 129 - components: - - type: Transform - pos: 9.5,6.5 - parent: 1 - - uid: 130 - components: - - type: Transform - pos: 8.5,8.5 - parent: 1 - - uid: 131 - components: - - type: Transform - pos: 7.5,8.5 - parent: 1 - - uid: 132 - components: - - type: Transform - pos: 7.5,9.5 - parent: 1 - - uid: 133 - components: - - type: Transform - pos: 9.5,8.5 - parent: 1 - - uid: 134 - components: - - type: Transform - pos: 13.5,6.5 - parent: 1 - - uid: 135 - components: - - type: Transform - pos: 12.5,6.5 - parent: 1 - - uid: 136 - components: - - type: Transform - pos: 12.5,7.5 - parent: 1 - - uid: 137 - components: - - type: Transform - pos: 14.5,6.5 - parent: 1 - uid: 138 components: - type: Transform @@ -1384,16 +1399,6 @@ entities: - type: Transform pos: 20.5,4.5 parent: 1 - - uid: 201 - components: - - type: Transform - pos: 14.5,7.5 - parent: 1 - - uid: 202 - components: - - type: Transform - pos: 15.5,7.5 - parent: 1 - uid: 203 components: - type: Transform @@ -1424,16 +1429,6 @@ entities: - type: Transform pos: 5.5,9.5 parent: 1 - - uid: 209 - components: - - type: Transform - pos: 5.5,11.5 - parent: 1 - - uid: 210 - components: - - type: Transform - pos: 6.5,9.5 - parent: 1 - uid: 211 components: - type: Transform @@ -1499,11 +1494,6 @@ entities: - type: Transform pos: -5.5,4.5 parent: 1 - - uid: 224 - components: - - type: Transform - pos: 4.5,11.5 - parent: 1 - uid: 225 components: - type: Transform @@ -1544,11 +1534,6 @@ entities: - type: Transform pos: 9.5,-14.5 parent: 1 - - uid: 233 - components: - - type: Transform - pos: 6.5,11.5 - parent: 1 - uid: 234 components: - type: Transform @@ -1824,11 +1809,6 @@ entities: - type: Transform pos: 21.5,-4.5 parent: 1 - - uid: 289 - components: - - type: Transform - pos: 6.5,-9.5 - parent: 1 - uid: 290 components: - type: Transform @@ -1909,26 +1889,6 @@ entities: - type: Transform pos: 23.5,9.5 parent: 1 - - uid: 307 - components: - - type: Transform - pos: 11.5,10.5 - parent: 1 - - uid: 308 - components: - - type: Transform - pos: 7.5,12.5 - parent: 1 - - uid: 309 - components: - - type: Transform - pos: 7.5,13.5 - parent: 1 - - uid: 310 - components: - - type: Transform - pos: 7.5,14.5 - parent: 1 - uid: 312 components: - type: Transform @@ -1979,127 +1939,201 @@ entities: - type: Transform pos: 2.5,-9.5 parent: 1 - - uid: 322 + - uid: 326 components: - type: Transform - pos: 12.5,4.5 + pos: -3.5,4.5 parent: 1 - - uid: 323 + - uid: 334 components: - type: Transform - pos: 10.5,4.5 + pos: 0.5,-9.5 parent: 1 - - uid: 324 + - uid: 337 components: - type: Transform - pos: 13.5,4.5 + pos: 1.5,7.5 parent: 1 - - uid: 325 + - uid: 339 components: - type: Transform - pos: 12.5,5.5 + pos: 1.5,-10.5 parent: 1 - - uid: 326 + - uid: 373 components: - type: Transform - pos: -3.5,4.5 + pos: 1.5,-9.5 parent: 1 - - uid: 327 + - uid: 374 components: - type: Transform - pos: 10.5,5.5 + pos: -3.5,2.5 parent: 1 - - uid: 328 + - uid: 609 components: - type: Transform - pos: 9.5,4.5 + pos: -4.5,3.5 parent: 1 - - uid: 329 + - uid: 616 components: - type: Transform - pos: 9.5,5.5 + pos: -5.5,-3.5 + parent: 1 + - uid: 818 + components: + - type: Transform + pos: -3.5,3.5 + parent: 1 + - uid: 884 + components: + - type: Transform + pos: 17.5,-1.5 + parent: 1 +- proto: AsteroidAltRockMining + entities: + - uid: 67 + components: + - type: Transform + pos: 15.5,10.5 + parent: 1 + - uid: 127 + components: + - type: Transform + pos: 16.5,10.5 + parent: 1 + - uid: 129 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 8.5,10.5 + parent: 1 + - uid: 137 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 9.5,10.5 + parent: 1 + - uid: 186 + components: + - type: Transform + pos: -8.5,-5.5 + parent: 1 + - uid: 202 + components: + - type: Transform + pos: 7.5,12.5 + parent: 1 + - uid: 210 + components: + - type: Transform + pos: 7.5,11.5 + parent: 1 + - uid: 224 + components: + - type: Transform + pos: 6.5,12.5 + parent: 1 + - uid: 306 + components: + - type: Transform + pos: 16.5,8.5 + parent: 1 + - uid: 307 + components: + - type: Transform + pos: 5.5,12.5 + parent: 1 + - uid: 310 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 9.5,11.5 + parent: 1 + - uid: 328 + components: + - type: Transform + pos: 13.5,10.5 parent: 1 - uid: 330 components: - type: Transform - pos: 11.5,5.5 + pos: 16.5,9.5 parent: 1 - uid: 331 components: - type: Transform - pos: 10.5,6.5 + rot: 1.5707963267948966 rad + pos: 8.5,11.5 parent: 1 - - uid: 333 + - uid: 383 components: - type: Transform - pos: 11.5,4.5 + pos: 16.5,7.5 parent: 1 - - uid: 334 + - uid: 412 components: - type: Transform - pos: 0.5,-9.5 + pos: 14.5,11.5 parent: 1 - - uid: 337 + - uid: 413 components: - type: Transform - pos: 1.5,7.5 + pos: 14.5,10.5 parent: 1 - - uid: 339 + - uid: 415 components: - type: Transform - pos: 1.5,-10.5 + pos: 16.5,6.5 parent: 1 - - uid: 364 + - uid: 418 components: - type: Transform - pos: 8.5,4.5 + pos: 17.5,7.5 parent: 1 - - uid: 372 + - uid: 419 components: - type: Transform - pos: 11.5,6.5 + pos: 17.5,9.5 parent: 1 - - uid: 373 + - uid: 420 components: - type: Transform - pos: 1.5,-9.5 + pos: 17.5,11.5 parent: 1 - - uid: 374 + - uid: 536 components: - type: Transform - pos: -3.5,2.5 + pos: 18.5,11.5 parent: 1 - - uid: 609 + - uid: 540 components: - type: Transform - pos: -4.5,3.5 + pos: 16.5,11.5 parent: 1 - - uid: 616 + - uid: 581 components: - type: Transform - pos: -5.5,-3.5 + pos: 15.5,9.5 parent: 1 - - uid: 818 + - uid: 582 components: - type: Transform - pos: -3.5,3.5 + pos: 15.5,8.5 parent: 1 - - uid: 884 + - uid: 583 components: - type: Transform - pos: 17.5,-1.5 + pos: 15.5,7.5 parent: 1 -- proto: AsteroidAltRockMining - entities: - - uid: 186 + - uid: 584 components: - type: Transform - pos: -8.5,-5.5 + pos: 15.5,6.5 parent: 1 - - uid: 306 + - uid: 585 components: - type: Transform - pos: 16.5,8.5 + pos: 15.5,5.5 parent: 1 - proto: AtmosDeviceFanTiny entities: @@ -2168,13 +2202,20 @@ entities: rot: -1.5707963267948966 rad pos: 8.5,-5.5 parent: 1 - - uid: 984 + - uid: 541 components: - type: Transform - pos: 11.5,2.5 + rot: -1.5707963267948966 rad + pos: 12.5,3.5 parent: 1 - proto: BenchSofaCorpRight entities: + - uid: 402 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 12.5,4.5 + parent: 1 - uid: 404 components: - type: Transform @@ -2187,13 +2228,32 @@ entities: rot: -1.5707963267948966 rad pos: 8.5,-4.5 parent: 1 - - uid: 985 +- proto: BlastDoorOpen + entities: + - uid: 324 components: - type: Transform - pos: 10.5,2.5 + pos: 12.5,7.5 parent: 1 -- proto: BlastDoorOpen - entities: + - type: DeviceLinkSink + links: + - 593 + - uid: 325 + components: + - type: Transform + pos: 12.5,6.5 + parent: 1 + - type: DeviceLinkSink + links: + - 593 + - uid: 329 + components: + - type: Transform + pos: 12.5,8.5 + parent: 1 + - type: DeviceLinkSink + links: + - 593 - uid: 350 components: - type: Transform @@ -2346,20 +2406,31 @@ entities: - type: InsideEntityStorage - proto: BriefcaseBrownFilled entities: - - uid: 401 + - uid: 403 components: - type: Transform - pos: 12.580331,-0.57071495 + pos: 12.615925,-0.21887398 parent: 1 - - uid: 402 +- proto: BriefcaseSyndieLobbyingBundleFilled + entities: + - uid: 371 components: - type: Transform - pos: 12.615925,0.015501022 + pos: 12.604369,-0.012328386 parent: 1 - - uid: 403 +- proto: BriefcaseSyndieSniperBundleFilled + entities: + - uid: 370 components: - type: Transform - pos: 12.615925,-0.21887398 + pos: 12.604369,-0.3873284 + parent: 1 +- proto: ButtonFrameCautionSecurity + entities: + - uid: 592 + components: + - type: Transform + pos: 12.5,5.5 parent: 1 - proto: CableApcExtension entities: @@ -2638,6 +2709,66 @@ entities: - type: Transform pos: 9.5,2.5 parent: 1 + - uid: 993 + components: + - type: Transform + pos: 9.5,1.5 + parent: 1 + - uid: 994 + components: + - type: Transform + pos: 9.5,2.5 + parent: 1 + - uid: 995 + components: + - type: Transform + pos: 9.5,3.5 + parent: 1 + - uid: 996 + components: + - type: Transform + pos: 9.5,4.5 + parent: 1 + - uid: 997 + components: + - type: Transform + pos: 10.5,4.5 + parent: 1 + - uid: 998 + components: + - type: Transform + pos: 11.5,4.5 + parent: 1 + - uid: 999 + components: + - type: Transform + pos: 11.5,5.5 + parent: 1 + - uid: 1000 + components: + - type: Transform + pos: 11.5,6.5 + parent: 1 + - uid: 1001 + components: + - type: Transform + pos: 11.5,7.5 + parent: 1 + - uid: 1002 + components: + - type: Transform + pos: 11.5,8.5 + parent: 1 + - uid: 1003 + components: + - type: Transform + pos: 11.5,9.5 + parent: 1 + - uid: 1004 + components: + - type: Transform + pos: 11.5,10.5 + parent: 1 - proto: CableHV entities: - uid: 493 @@ -2896,6 +3027,36 @@ entities: rot: 1.5707963267948966 rad pos: 8.5,-4.5 parent: 1 + - uid: 594 + components: + - type: Transform + pos: 10.5,2.5 + parent: 1 + - uid: 595 + components: + - type: Transform + pos: 9.5,2.5 + parent: 1 + - uid: 596 + components: + - type: Transform + pos: 9.5,3.5 + parent: 1 + - uid: 597 + components: + - type: Transform + pos: 10.5,3.5 + parent: 1 + - uid: 598 + components: + - type: Transform + pos: 11.5,3.5 + parent: 1 + - uid: 620 + components: + - type: Transform + pos: 11.5,2.5 + parent: 1 - uid: 960 components: - type: Transform @@ -3003,17 +3164,35 @@ entities: parent: 1 - proto: ChairOfficeDark entities: - - uid: 535 + - uid: 369 components: - type: Transform rot: -1.5707963267948966 rad - pos: 9.5,1.5 + pos: 9.383302,3.471712 parent: 1 - - uid: 536 + - uid: 372 components: - type: Transform rot: 1.5707963267948966 rad - pos: 11.5,1.5 + pos: 11.762909,1.1363623 + parent: 1 + - uid: 409 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 8.407137,7.5838184 + parent: 1 + - uid: 410 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 11.684784,2.2144873 + parent: 1 + - uid: 535 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 9.5,1.5 parent: 1 - proto: CigPackSyndicate entities: @@ -3027,55 +3206,6 @@ entities: - type: Transform pos: 4.7236505,1.7666011 parent: 1 -- proto: ClosetWallBlack - entities: - - uid: 405 - components: - - type: MetaData - desc: A closet packed with forged stamps - name: stamp closet - - type: Transform - pos: 10.5,3.5 - parent: 1 - - type: EntityStorage - air: - volume: 200 - immutable: False - temperature: 293.14673 - moles: - - 1.7459903 - - 6.568249 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - type: ContainerContainer - containers: - entity_storage: !type:Container - showEnts: False - occludes: True - ents: - - 411 - - 410 - - 409 - - 408 - - 407 - - 406 - - 412 - - 413 - - 414 - - 415 - - 416 - - 417 - - 418 - - 419 - - 420 - proto: ClosetWallMixed entities: - uid: 388 @@ -3172,15 +3302,17 @@ entities: - type: InsideEntityStorage - proto: ClothingMaskGasVoiceChameleon entities: - - uid: 540 + - uid: 549 components: - type: Transform - pos: 11.346417,2.446512 + rot: -1.5707963267948966 rad + pos: 12.464487,4.225065 parent: 1 - - uid: 541 + - uid: 578 components: - type: Transform - pos: 10.971417,2.462137 + rot: -1.5707963267948966 rad + pos: 12.464487,3.6313155 parent: 1 - proto: ClothingUniformJumpsuitPyjamaSyndicateBlack entities: @@ -3280,6 +3412,21 @@ entities: maxRange: 2048 - type: WorldLoader radius: 2048 +- proto: ComputerSurveillanceCameraMonitor + entities: + - uid: 991 + components: + - type: Transform + pos: 10.5,4.5 + parent: 1 +- proto: ComputerSurveillanceWirelessCameraMonitor + entities: + - uid: 406 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 12.5,2.5 + parent: 1 - proto: CrateFoodDonkpocketSavory entities: - uid: 551 @@ -3312,6 +3459,18 @@ entities: - type: Transform pos: -1.5,4.5 parent: 1 +- proto: CrateSyndicateSurplusBundle + entities: + - uid: 411 + components: + - type: Transform + pos: 9.5,6.5 + parent: 1 + - uid: 992 + components: + - type: Transform + pos: 10.5,6.5 + parent: 1 - proto: CrowbarRed entities: - uid: 378 @@ -3489,8 +3648,6 @@ entities: - 625 - 627 - 633 - - type: AtmosDevice - joinedGrid: 1 - proto: Firelock entities: - uid: 622 @@ -3604,8 +3761,6 @@ entities: rot: 1.5707963267948966 rad pos: -5.5,1.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#FF1212FF' - uid: 635 @@ -3613,8 +3768,6 @@ entities: - type: Transform pos: 6.5,6.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#FF1212FF' - uid: 636 @@ -3622,8 +3775,6 @@ entities: - type: Transform pos: 4.5,10.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#FF1212FF' - uid: 637 @@ -3632,8 +3783,6 @@ entities: rot: -1.5707963267948966 rad pos: 14.5,-0.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#FF1212FF' - uid: 638 @@ -3642,8 +3791,6 @@ entities: rot: 3.141592653589793 rad pos: 13.5,-6.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#FF1212FF' - uid: 639 @@ -3652,8 +3799,6 @@ entities: rot: 3.141592653589793 rad pos: 8.5,-7.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#FF1212FF' - uid: 640 @@ -3662,8 +3807,6 @@ entities: rot: 3.141592653589793 rad pos: 4.5,-10.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#FF1212FF' - uid: 641 @@ -3672,8 +3815,6 @@ entities: rot: 1.5707963267948966 rad pos: -4.5,-3.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#FF1212FF' - uid: 642 @@ -3682,8 +3823,6 @@ entities: rot: 1.5707963267948966 rad pos: -4.5,5.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#FF1212FF' - proto: GasPipeBend @@ -4184,8 +4323,6 @@ entities: - type: Transform pos: 1.5,5.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0335FCFF' - proto: GasVentPump @@ -4198,8 +4335,6 @@ entities: - type: DeviceNetwork deviceLists: - 576 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0335FCFF' - uid: 707 @@ -4211,8 +4346,6 @@ entities: - type: DeviceNetwork deviceLists: - 576 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0335FCFF' - uid: 708 @@ -4223,8 +4356,6 @@ entities: - type: DeviceNetwork deviceLists: - 576 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0335FCFF' - uid: 709 @@ -4236,8 +4367,6 @@ entities: - type: DeviceNetwork deviceLists: - 576 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0335FCFF' - uid: 710 @@ -4249,8 +4378,6 @@ entities: - type: DeviceNetwork deviceLists: - 576 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0335FCFF' - uid: 711 @@ -4262,8 +4389,6 @@ entities: - type: DeviceNetwork deviceLists: - 576 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0335FCFF' - uid: 712 @@ -4275,8 +4400,6 @@ entities: - type: DeviceNetwork deviceLists: - 576 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0335FCFF' - uid: 713 @@ -4288,8 +4411,6 @@ entities: - type: DeviceNetwork deviceLists: - 576 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0335FCFF' - uid: 714 @@ -4301,8 +4422,6 @@ entities: - type: DeviceNetwork deviceLists: - 576 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0335FCFF' - uid: 716 @@ -4314,8 +4433,6 @@ entities: - type: DeviceNetwork deviceLists: - 576 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0335FCFF' - uid: 717 @@ -4324,8 +4441,6 @@ entities: rot: 1.5707963267948966 rad pos: -0.5,-3.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - proto: GasVentScrubber entities: - uid: 718 @@ -4337,8 +4452,6 @@ entities: - type: DeviceNetwork deviceLists: - 576 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#FF1212FF' - uid: 719 @@ -4350,8 +4463,6 @@ entities: - type: DeviceNetwork deviceLists: - 576 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#FF1212FF' - uid: 720 @@ -4363,8 +4474,6 @@ entities: - type: DeviceNetwork deviceLists: - 576 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#FF1212FF' - uid: 721 @@ -4376,8 +4485,6 @@ entities: - type: DeviceNetwork deviceLists: - 576 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#FF1212FF' - uid: 722 @@ -4388,8 +4495,6 @@ entities: - type: DeviceNetwork deviceLists: - 576 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#FF1212FF' - uid: 723 @@ -4400,8 +4505,6 @@ entities: - type: DeviceNetwork deviceLists: - 576 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#FF1212FF' - uid: 724 @@ -4412,8 +4515,6 @@ entities: - type: DeviceNetwork deviceLists: - 576 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#FF1212FF' - uid: 725 @@ -4425,8 +4526,6 @@ entities: - type: DeviceNetwork deviceLists: - 576 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#FF1212FF' - uid: 726 @@ -4438,8 +4537,6 @@ entities: - type: DeviceNetwork deviceLists: - 576 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#FF1212FF' - proto: GeneratorWallmountAPU @@ -4483,6 +4580,22 @@ entities: parent: 1 - proto: Grille entities: + - uid: 130 + components: + - type: Transform + pos: 7.5,7.5 + parent: 1 + - uid: 309 + components: + - type: Transform + pos: 7.5,8.5 + parent: 1 + - uid: 588 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 7.5,6.5 + parent: 1 - uid: 735 components: - type: Transform @@ -4543,6 +4656,20 @@ entities: - type: Transform pos: 11.5,-5.5 parent: 1 +- proto: GrilleDiagonal + entities: + - uid: 589 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 8.5,6.5 + parent: 1 + - uid: 590 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 8.5,8.5 + parent: 1 - proto: HospitalCurtainsOpen entities: - uid: 747 @@ -4596,6 +4723,16 @@ entities: parent: 1 - proto: LandMineExplosive entities: + - uid: 364 + components: + - type: Transform + pos: 5.269056,11.251331 + parent: 1 + - uid: 579 + components: + - type: Transform + pos: 6.784681,11.813831 + parent: 1 - uid: 756 components: - type: Transform @@ -4874,14 +5011,6 @@ entities: rot: -1.5707963267948966 rad pos: -0.5,-4.5 parent: 1 -- proto: PosterLegitNoERP - entities: - - uid: 578 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 11.5,3.5 - parent: 1 - proto: PowerCellRecharger entities: - uid: 768 @@ -4974,6 +5103,11 @@ entities: - type: DeviceLinkSink links: - 46 + - uid: 1005 + components: + - type: Transform + pos: 10.5,8.5 + parent: 1 - proto: PoweredLightColoredRed entities: - uid: 20 @@ -4985,14 +5119,6 @@ entities: - type: DeviceLinkSink links: - 46 - - uid: 22 - components: - - type: Transform - pos: 12.5,2.5 - parent: 1 - - type: DeviceLinkSink - links: - - 46 - uid: 23 components: - type: Transform @@ -5109,10 +5235,16 @@ entities: parent: 1 - proto: RandomPosterContraband entities: + - uid: 417 + components: + - type: Transform + pos: 9.5,5.5 + parent: 1 - uid: 780 components: - type: Transform - pos: 9.5,3.5 + rot: -1.5707963267948966 rad + pos: 10.5,10.5 parent: 1 - uid: 781 components: @@ -5140,6 +5272,12 @@ entities: - type: Transform pos: 5.5,-3.5 parent: 1 + - uid: 827 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 12.5,10.5 + parent: 1 - proto: RandomVendingDrinks entities: - uid: 787 @@ -5158,6 +5296,22 @@ entities: - type: Emagged - proto: ReinforcedPlasmaWindow entities: + - uid: 38 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 7.5,6.5 + parent: 1 + - uid: 289 + components: + - type: Transform + pos: 7.5,7.5 + parent: 1 + - uid: 308 + components: + - type: Transform + pos: 7.5,8.5 + parent: 1 - uid: 789 components: - type: Transform @@ -5218,141 +5372,139 @@ entities: - type: Transform pos: 8.5,-6.5 parent: 1 +- proto: ReinforcedPlasmaWindowDiagonal + entities: + - uid: 586 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 8.5,8.5 + parent: 1 + - uid: 587 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 8.5,6.5 + parent: 1 - proto: RubberStampApproved entities: - - uid: 407 + - uid: 830 components: - type: Transform - parent: 405 - - type: Physics - canCollide: False - - type: InsideEntityStorage + pos: 8.336427,4.768587 + parent: 1 - proto: RubberStampCaptain entities: - - uid: 417 + - uid: 836 components: - type: Transform - parent: 405 - - type: Physics - canCollide: False - - type: InsideEntityStorage + pos: 8.570802,4.612337 + parent: 1 - proto: RubberStampCE entities: - - uid: 413 + - uid: 880 components: - type: Transform - parent: 405 - - type: Physics - canCollide: False - - type: InsideEntityStorage + pos: 8.883302,4.831087 + parent: 1 +- proto: RubberStampCentcom + entities: + - uid: 831 + components: + - type: Transform + pos: 8.602052,4.815462 + parent: 1 - proto: RubberStampChaplain entities: - - uid: 416 + - uid: 837 components: - type: Transform - parent: 405 - - type: Physics - canCollide: False - - type: InsideEntityStorage + pos: 8.539552,4.440462 + parent: 1 +- proto: RubberStampChiefJustice + entities: + - uid: 903 + components: + - type: Transform + pos: 8.836427,4.612337 + parent: 1 - proto: RubberStampClown entities: - - uid: 414 + - uid: 905 components: - type: Transform - parent: 405 - - type: Physics - canCollide: False - - type: InsideEntityStorage + pos: 9.164552,4.815462 + parent: 1 - proto: RubberStampCMO entities: - - uid: 412 + - uid: 904 components: - type: Transform - parent: 405 - - type: Physics - canCollide: False - - type: InsideEntityStorage + pos: 8.789552,4.502962 + parent: 1 - proto: RubberStampDenied entities: - - uid: 411 + - uid: 835 components: - type: Transform - parent: 405 - - type: Physics - canCollide: False - - type: InsideEntityStorage -- proto: RubberStampHop + pos: 8.305177,4.549837 + parent: 1 +- proto: RubberStampDetective entities: - - uid: 419 + - uid: 912 components: - type: Transform - parent: 405 - - type: Physics - canCollide: False - - type: InsideEntityStorage -- proto: RubberStampHos + pos: 9.133302,4.674837 + parent: 1 +- proto: RubberStampHop entities: - - uid: 409 + - uid: 919 components: - type: Transform - parent: 405 - - type: Physics - canCollide: False - - type: InsideEntityStorage -- proto: RubberStampMantis + pos: 9.055177,4.518587 + parent: 1 +- proto: RubberStampHos entities: - - uid: 415 + - uid: 961 components: - type: Transform - parent: 405 - - type: Physics - canCollide: False - - type: InsideEntityStorage -- proto: RubberStampMime + pos: 9.430177,4.862337 + parent: 1 +- proto: RubberStampLawyer entities: - - uid: 420 + - uid: 984 components: - type: Transform - parent: 405 - - type: Physics - canCollide: False - - type: InsideEntityStorage -- proto: RubberStampQm + pos: 9.398927,4.706087 + parent: 1 +- proto: RubberStampMantis entities: - - uid: 408 + - uid: 986 components: - type: Transform - parent: 405 - - type: Physics - canCollide: False - - type: InsideEntityStorage -- proto: RubberStampRd + pos: 9.633302,4.799837 + parent: 1 +- proto: RubberStampMime entities: - - uid: 418 + - uid: 987 components: - type: Transform - parent: 405 - - type: Physics - canCollide: False - - type: InsideEntityStorage -- proto: RubberStampSyndicate + pos: 9.570802,4.581087 + parent: 1 +- proto: RubberStampQm entities: - - uid: 410 + - uid: 985 components: - type: Transform - parent: 405 - - type: Physics - canCollide: False - - type: InsideEntityStorage -- proto: RubberStampWarden + pos: 9.320802,4.565462 + parent: 1 +- proto: RubberStampRd entities: - - uid: 406 + - uid: 988 components: - type: Transform - parent: 405 - - type: Physics - canCollide: False - - type: InsideEntityStorage + pos: 9.773927,4.784212 + parent: 1 - proto: SalvageLorePaperGamingSpawner entities: - uid: 801 @@ -5383,6 +5535,21 @@ entities: parent: 1 - proto: SignalButton entities: + - uid: 593 + components: + - type: MetaData + name: turret shutters + - type: Transform + pos: 12.5,5.5 + parent: 1 + - type: DeviceLinkSource + linkedPorts: + 329: + - Pressed: Toggle + 324: + - Pressed: Toggle + 325: + - Pressed: Toggle - uid: 805 components: - type: MetaData @@ -5506,9 +5673,6 @@ entities: 19: - On: On - Off: Off - 22: - - On: Off - - Off: On - proto: SinkStemlessWater entities: - uid: 808 @@ -5603,6 +5767,18 @@ entities: - 0 - 0 - 0 +- proto: SyndicateComputerComms + entities: + - uid: 715 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 8.5,3.5 + parent: 1 + - type: CommunicationsConsole + color: gold + title: "Pirate Broadcast" + canShuttle: false - proto: SyndicateMonitoringServer entities: - uid: 338 @@ -5681,12 +5857,6 @@ entities: rot: 3.141592653589793 rad pos: 8.5,0.5 parent: 1 - - uid: 383 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 12.5,2.5 - parent: 1 - uid: 385 components: - type: Transform @@ -5711,6 +5881,18 @@ entities: rot: -1.5707963267948966 rad pos: 4.5,1.5 parent: 1 + - uid: 828 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 8.5,4.5 + parent: 1 + - uid: 829 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 9.5,4.5 + parent: 1 - proto: TelecomServerFilled entities: - uid: 612 @@ -5755,27 +5937,6 @@ entities: - type: Transform pos: 4.5330567,5.310578 parent: 1 -- proto: ToyFigurineNukie - entities: - - uid: 835 - components: - - type: Transform - pos: 12.208444,2.8347092 - parent: 1 -- proto: ToyFigurineNukieCommander - entities: - - uid: 836 - components: - - type: Transform - pos: 12.791773,2.838885 - parent: 1 -- proto: ToyFigurineNukieElite - entities: - - uid: 837 - components: - - type: Transform - pos: 12.489692,2.4701266 - parent: 1 - proto: ToyNuke entities: - uid: 838 @@ -5839,15 +6000,111 @@ entities: parent: 1 - proto: WallPlastitanium entities: + - uid: 22 + components: + - type: Transform + pos: 7.5,5.5 + parent: 1 + - uid: 30 + components: + - type: Transform + pos: 9.5,5.5 + parent: 1 + - uid: 41 + components: + - type: Transform + pos: 10.5,5.5 + parent: 1 + - uid: 42 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 10.5,11.5 + parent: 1 + - uid: 43 + components: + - type: Transform + pos: 12.5,9.5 + parent: 1 + - uid: 44 + components: + - type: Transform + pos: 8.5,9.5 + parent: 1 - uid: 54 components: - type: Transform pos: 5.5,-8.5 parent: 1 + - uid: 125 + components: + - type: Transform + pos: 13.5,5.5 + parent: 1 + - uid: 126 + components: + - type: Transform + pos: 13.5,9.5 + parent: 1 + - uid: 132 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 9.5,9.5 + parent: 1 + - uid: 133 + components: + - type: Transform + pos: 12.5,5.5 + parent: 1 + - uid: 134 + components: + - type: Transform + pos: 14.5,6.5 + parent: 1 + - uid: 135 + components: + - type: Transform + pos: 14.5,7.5 + parent: 1 + - uid: 136 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 10.5,9.5 + parent: 1 + - uid: 201 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 14.5,9.5 + parent: 1 + - uid: 209 + components: + - type: Transform + pos: 8.5,5.5 + parent: 1 + - uid: 322 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 12.5,11.5 + parent: 1 + - uid: 323 + components: + - type: Transform + pos: 13.5,4.5 + parent: 1 + - uid: 327 + components: + - type: Transform + pos: 12.5,10.5 + parent: 1 - uid: 332 components: - type: Transform - pos: 10.5,3.5 + rot: 1.5707963267948966 rad + pos: 10.5,10.5 parent: 1 - uid: 335 components: @@ -5864,6 +6121,17 @@ entities: - type: Transform pos: 0.5,-8.5 parent: 1 + - uid: 407 + components: + - type: Transform + pos: 14.5,8.5 + parent: 1 + - uid: 416 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 14.5,5.5 + parent: 1 - uid: 425 components: - type: Transform @@ -6049,11 +6317,6 @@ entities: - type: Transform pos: 0.5,-4.5 parent: 1 - - uid: 880 - components: - - type: Transform - pos: 12.5,3.5 - parent: 1 - uid: 881 components: - type: Transform @@ -6154,16 +6417,6 @@ entities: - type: Transform pos: 0.5,-2.5 parent: 1 - - uid: 903 - components: - - type: Transform - pos: 11.5,3.5 - parent: 1 - - uid: 905 - components: - - type: Transform - pos: 9.5,3.5 - parent: 1 - uid: 906 components: - type: Transform @@ -6194,11 +6447,6 @@ entities: - type: Transform pos: 7.5,3.5 parent: 1 - - uid: 912 - components: - - type: Transform - pos: 8.5,3.5 - parent: 1 - uid: 913 components: - type: Transform @@ -6334,6 +6582,24 @@ entities: - type: Transform pos: -3.5,-0.5 parent: 1 +- proto: WallPlastitaniumDiagonal + entities: + - uid: 128 + components: + - type: Transform + pos: 13.5,6.5 + parent: 1 + - uid: 333 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 13.5,8.5 + parent: 1 + - uid: 591 + components: + - type: Transform + pos: 7.5,9.5 + parent: 1 - proto: WarpPoint entities: - uid: 942 @@ -6381,6 +6647,49 @@ entities: - type: Physics canCollide: False - type: InsideEntityStorage +- proto: WeaponTurretSyndicate + entities: + - uid: 32 + components: + - type: Transform + pos: 15.5,4.5 + parent: 1 + - uid: 131 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 18.5,-3.5 + parent: 1 + - uid: 233 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 6.5,-9.5 + parent: 1 + - uid: 408 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 6.5,5.5 + parent: 1 + - uid: 580 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 13.5,7.5 + parent: 1 + - uid: 989 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -6.5,-8.5 + parent: 1 + - uid: 990 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -3.5,9.5 + parent: 1 - proto: Windoor entities: - uid: 618 diff --git a/Resources/Maps/arena.yml b/Resources/Maps/arena.yml index ab548d14f2..362de16141 100644 --- a/Resources/Maps/arena.yml +++ b/Resources/Maps/arena.yml @@ -73,14 +73,15 @@ entities: - type: MetaData - type: Transform - type: Map + mapPaused: True - type: PhysicsMap + - type: GridTree + - type: MovedGrids - type: Broadphase - type: OccluderTree - type: Parallax parallax: ArenaStation - type: LoadedMap - - type: GridTree - - type: MovedGrids - uid: 6747 components: - type: MetaData @@ -263,11 +264,11 @@ entities: version: 6 4,-2: ind: 4,-2 - tiles: fgAAAAAAAAAAAAAAfwAAAAAAdgAAAAAALwAAAAAAdgAAAAABfwAAAAAAAAAAAAAAfwAAAAAAMAAAAAACXgAAAAADMAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAALwAAAAAAUAAAAAAALwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAACXgAAAAAAXgAAAAADUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXgAAAAAAXgAAAAAAMAAAAAABXgAAAAACXgAAAAACXgAAAAACMAAAAAAAXgAAAAADXgAAAAAAXgAAAAABMAAAAAADXgAAAAABUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAABXgAAAAAAXgAAAAAAXgAAAAACMAAAAAACXgAAAAACXgAAAAADXgAAAAADMAAAAAABXgAAAAACXgAAAAADXgAAAAACUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXgAAAAAAXgAAAAAAMAAAAAACXgAAAAABXgAAAAABXgAAAAACMAAAAAADXgAAAAACXgAAAAAAXgAAAAACMAAAAAADXgAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAXgAAAAACXgAAAAAAXgAAAAABfwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAXgAAAAADXgAAAAACXgAAAAAAXgAAAAADXgAAAAACXgAAAAAAXgAAAAACXgAAAAACXgAAAAADfwAAAAAAUAAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAXgAAAAACXgAAAAADXgAAAAABXgAAAAADXgAAAAABXgAAAAABXgAAAAADXgAAAAABXgAAAAADfwAAAAAAfwAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAXgAAAAACXgAAAAAAXgAAAAAAXgAAAAACXgAAAAABXgAAAAABXgAAAAABXgAAAAAAXgAAAAABfwAAAAAAUAAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAXgAAAAADXgAAAAACXgAAAAADXgAAAAABXgAAAAAAXgAAAAACXgAAAAAAXgAAAAABXgAAAAABUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAXgAAAAABXgAAAAADXgAAAAACXgAAAAADXgAAAAADXgAAAAABXgAAAAADXgAAAAACXgAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAXgAAAAAAXgAAAAACXgAAAAAAXgAAAAABXgAAAAAAXgAAAAACXgAAAAADXgAAAAADXgAAAAADfwAAAAAAUAAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAXgAAAAABXgAAAAABXgAAAAABXgAAAAAAXgAAAAACXgAAAAAAXgAAAAADXgAAAAAAXgAAAAACfwAAAAAAfwAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAXgAAAAACXgAAAAADXgAAAAAAXgAAAAACXgAAAAACXgAAAAACXgAAAAAAXgAAAAAAXgAAAAAAfwAAAAAAUAAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: fgAAAAAAAAAAAAAAfwAAAAAAdgAAAAAALwAAAAAAdgAAAAABfwAAAAAAAAAAAAAAfwAAAAAAMAAAAAACXgAAAAADMAAAAAAAUAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAALwAAAAAAUAAAAAAALwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAACXgAAAAAAXgAAAAADUAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAXgAAAAAAXgAAAAAAMAAAAAABXgAAAAACXgAAAAACXgAAAAACMAAAAAAAXgAAAAADXgAAAAAAXgAAAAABMAAAAAADXgAAAAABUAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAMAAAAAABXgAAAAAAXgAAAAAAXgAAAAACMAAAAAACXgAAAAACXgAAAAADXgAAAAADMAAAAAABXgAAAAACXgAAAAADXgAAAAACUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXgAAAAAAXgAAAAAAMAAAAAACXgAAAAABXgAAAAABXgAAAAACMAAAAAADXgAAAAACXgAAAAAAXgAAAAACMAAAAAADXgAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAXgAAAAACXgAAAAAAXgAAAAABfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAXgAAAAADXgAAAAACXgAAAAAAXgAAAAADXgAAAAACXgAAAAAAXgAAAAACXgAAAAACXgAAAAADfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAXgAAAAACXgAAAAADXgAAAAABXgAAAAADXgAAAAABXgAAAAABXgAAAAADXgAAAAABXgAAAAADfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAXgAAAAACXgAAAAAAXgAAAAAAXgAAAAACXgAAAAABXgAAAAABXgAAAAABXgAAAAAAXgAAAAABfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAXgAAAAADXgAAAAACXgAAAAADXgAAAAABXgAAAAAAXgAAAAACXgAAAAAAXgAAAAABXgAAAAABUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAXgAAAAABXgAAAAADXgAAAAACXgAAAAADXgAAAAADXgAAAAABXgAAAAADXgAAAAACXgAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAXgAAAAAAXgAAAAACXgAAAAAAXgAAAAABXgAAAAAAXgAAAAACXgAAAAADXgAAAAADXgAAAAADfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAXgAAAAABXgAAAAABXgAAAAABXgAAAAAAXgAAAAACXgAAAAAAXgAAAAADXgAAAAAAXgAAAAACfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAXgAAAAACXgAAAAADXgAAAAAAXgAAAAACXgAAAAACXgAAAAACXgAAAAAAXgAAAAAAXgAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 4,-3: ind: 4,-3 - tiles: XgAAAAABMAAAAAABXgAAAAACXgAAAAADXgAAAAAAMAAAAAACXgAAAAACXgAAAAABXgAAAAADMAAAAAADXgAAAAAAMAAAAAABUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXgAAAAACXgAAAAADXgAAAAACMAAAAAAAXgAAAAACXgAAAAAAXgAAAAADMAAAAAADXgAAAAADXgAAAAAAXgAAAAAAXgAAAAACUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXgAAAAABMAAAAAADXgAAAAADXgAAAAABXgAAAAABMAAAAAAAXgAAAAADXgAAAAAAXgAAAAADXgAAAAADMAAAAAADXgAAAAABfwAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAXgAAAAACXgAAAAADXgAAAAADfwAAAAAAXgAAAAAAXgAAAAACXgAAAAADXgAAAAABXgAAAAABXgAAAAACXgAAAAACfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAXgAAAAABXgAAAAACXgAAAAAAUAAAAAAAXgAAAAADXgAAAAADXgAAAAACXgAAAAACMAAAAAADXgAAAAADMAAAAAACfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAXgAAAAAAXgAAAAACXgAAAAABUAAAAAAAXgAAAAABXgAAAAABXgAAAAABXgAAAAACXgAAAAABXgAAAAADXgAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAUAAAAAAAXgAAAAACXgAAAAADXgAAAAACUAAAAAAAXgAAAAABXgAAAAABXgAAAAABXgAAAAAAXgAAAAAAMAAAAAAAXgAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAUAAAAAAAXgAAAAAAXgAAAAAAXgAAAAABUAAAAAAAXgAAAAABXgAAAAAAXgAAAAACXgAAAAACXgAAAAADXgAAAAAAXgAAAAADUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAXgAAAAAAXgAAAAACXgAAAAAAUAAAAAAAXgAAAAABXgAAAAACXgAAAAACXgAAAAADMAAAAAADXgAAAAACMAAAAAACUAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAXgAAAAADXgAAAAAAXgAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAXgAAAAADMAAAAAAAXgAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAfgAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAfgAAAAAAUAAAAAAAXgAAAAABXgAAAAAAXgAAAAABfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAAAAAAAAAUAAAAAAALwAAAAAAdgAAAAADLwAAAAAAUAAAAAAAAAAAAAAAUAAAAAAAMAAAAAADXgAAAAADMAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAAAAAAAAAUAAAAAAALwAAAAAAdgAAAAABLwAAAAAAUAAAAAAAAAAAAAAAUAAAAAAAXgAAAAABXgAAAAADXgAAAAACfwAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAUAAAAAAAAAAAAAAAUAAAAAAALwAAAAAAdgAAAAABLwAAAAAAUAAAAAAAAAAAAAAAfwAAAAAAXgAAAAACMAAAAAAAXgAAAAADfwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAfgAAAAAAUAAAAAAAdgAAAAAAdgAAAAABdgAAAAAAUAAAAAAAfgAAAAAAfwAAAAAAXgAAAAADXgAAAAADXgAAAAACUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: XgAAAAABMAAAAAABXgAAAAACXgAAAAADXgAAAAAAMAAAAAACXgAAAAACXgAAAAABXgAAAAADMAAAAAADXgAAAAAAMAAAAAABUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXgAAAAACXgAAAAADXgAAAAACMAAAAAAAXgAAAAACXgAAAAAAXgAAAAADMAAAAAADXgAAAAADXgAAAAAAXgAAAAAAXgAAAAACUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXgAAAAABMAAAAAADXgAAAAADXgAAAAABXgAAAAABMAAAAAAAXgAAAAADXgAAAAAAXgAAAAADXgAAAAADMAAAAAADXgAAAAABfwAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAXgAAAAACXgAAAAADXgAAAAADfwAAAAAAXgAAAAAAXgAAAAACXgAAAAADXgAAAAABXgAAAAABXgAAAAACXgAAAAACfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAXgAAAAABXgAAAAACXgAAAAAAUAAAAAAAXgAAAAADXgAAAAADXgAAAAACXgAAAAACMAAAAAADXgAAAAADMAAAAAACfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAXgAAAAAAXgAAAAACXgAAAAABUAAAAAAAXgAAAAABXgAAAAABXgAAAAABXgAAAAACXgAAAAABXgAAAAADXgAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAUAAAAAAAXgAAAAACXgAAAAADXgAAAAACUAAAAAAAXgAAAAABXgAAAAABXgAAAAABXgAAAAAAXgAAAAAAMAAAAAAAXgAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAUAAAAAAAXgAAAAAAXgAAAAAAXgAAAAABUAAAAAAAXgAAAAABXgAAAAAAXgAAAAACXgAAAAACXgAAAAADXgAAAAAAXgAAAAADUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAXgAAAAAAXgAAAAACXgAAAAAAUAAAAAAAXgAAAAABXgAAAAACXgAAAAACXgAAAAADMAAAAAADXgAAAAACMAAAAAACUAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAXgAAAAADXgAAAAAAXgAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAXgAAAAADMAAAAAAAXgAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAfgAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAfgAAAAAAUAAAAAAAXgAAAAABXgAAAAAAXgAAAAABXgAAAAAAXgAAAAAAXgAAAAAAXgAAAAAAUAAAAAAAAAAAAAAAUAAAAAAALwAAAAAAdgAAAAADLwAAAAAAUAAAAAAAAAAAAAAAUAAAAAAAMAAAAAADXgAAAAADMAAAAAAAXgAAAAAAXgAAAAAAXgAAAAAAMAAAAAAAUAAAAAAAAAAAAAAAUAAAAAAALwAAAAAAdgAAAAABLwAAAAAAUAAAAAAAAAAAAAAAUAAAAAAAXgAAAAABXgAAAAADXgAAAAACfwAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAUAAAAAAAAAAAAAAAUAAAAAAALwAAAAAAdgAAAAABLwAAAAAAUAAAAAAAAAAAAAAAfwAAAAAAXgAAAAACMAAAAAAAXgAAAAADfwAAAAAAfgAAAAAAAAAAAAAAfgAAAAAAfwAAAAAAfgAAAAAAUAAAAAAAdgAAAAAAdgAAAAABdgAAAAAAUAAAAAAAfgAAAAAAfwAAAAAAXgAAAAADXgAAAAADXgAAAAACUAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAA version: 6 2,-4: ind: 2,-4 @@ -315,7 +316,7 @@ entities: version: 6 5,-3: ind: 5,-3 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAXgAAAAAAMAAAAAAAXgAAAAAAMAAAAAAAXgAAAAAAXgAAAAAAXgAAAAAAXgAAAAAAXgAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAXgAAAAAAMAAAAAAAXgAAAAAAXgAAAAAAXgAAAAAAXgAAAAAAXgAAAAAAXgAAAAAAXgAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAXgAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAMAAAAAAAMAAAAAAAfwAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfwAAAAAAXgAAAAAAXgAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAA version: 6 0,-6: ind: 0,-6 @@ -339,7 +340,7 @@ entities: version: 6 4,-1: ind: 4,-1 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfwAAAAAAUAAAAAAAVQAAAAAAVQAAAAAAUAAAAAAAfwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfwAAAAAAWgAAAAAAVQAAAAAAVQAAAAAAWgAAAAAAfwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAfwAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAfwAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAWgAAAAAAVQAAAAAAWgAAAAAAWgAAAAAAVQAAAAAAWgAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAWgAAAAAAVQAAAAAAWgAAAAAAWgAAAAAAVQAAAAAAWgAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAWgAAAAAAVQAAAAAAWgAAAAAAWgAAAAAAVQAAAAAAWgAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAfwAAAAAAWgAAAAAAWgAAAAAAWgAAAAAAWgAAAAAAfwAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfwAAAAAAUAAAAAAAVQAAAAAAVQAAAAAAUAAAAAAAfwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfwAAAAAAWgAAAAAAVQAAAAAAVQAAAAAAWgAAAAAAfwAAAAAAfgAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAfwAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAfwAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAWgAAAAAAVQAAAAAAWgAAAAAAWgAAAAAAVQAAAAAAWgAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAWgAAAAAAVQAAAAAAWgAAAAAAWgAAAAAAVQAAAAAAWgAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAWgAAAAAAVQAAAAAAWgAAAAAAWgAAAAAAVQAAAAAAWgAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAfwAAAAAAWgAAAAAAWgAAAAAAWgAAAAAAWgAAAAAAfwAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 -4,-2: ind: -4,-2 @@ -491,11 +492,11 @@ entities: version: 6 5,-1: ind: 5,-1 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAA version: 6 5,-2: ind: 5,-2 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAA + tiles: fgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfwAAAAAAXgAAAAAAXgAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfwAAAAAAMAAAAAAAMAAAAAAAfwAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfwAAAAAAXgAAAAAAXgAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAXgAAAAAAXgAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAMAAAAAAAMAAAAAAAfwAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAXgAAAAAAXgAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAXgAAAAAAXgAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAXgAAAAAAXgAAAAAAfwAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAMAAAAAAAMAAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAXgAAAAAAXgAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAXgAAAAAAXgAAAAAAfwAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAMAAAAAAAMAAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAXgAAAAAAXgAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAXgAAAAAAXgAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAA version: 6 6,-1: ind: 6,-1 @@ -519,7 +520,11 @@ entities: version: 6 6,-2: ind: 6,-2 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: AAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + version: 6 + 6,-3: + ind: 6,-3 + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 - type: Broadphase - type: Physics @@ -11312,8 +11317,6 @@ entities: - 13077 - 8433 - 7909 - - type: AtmosDevice - joinedGrid: 6747 - uid: 490 components: - type: Transform @@ -11334,8 +11337,6 @@ entities: - 14634 - 14896 - 23520 - - type: AtmosDevice - joinedGrid: 6747 - uid: 1755 components: - type: Transform @@ -11359,8 +11360,6 @@ entities: - 21751 - 13451 - 13162 - - type: AtmosDevice - joinedGrid: 6747 - uid: 3694 components: - type: Transform @@ -11378,8 +11377,6 @@ entities: - 13867 - 13866 - 13951 - - type: AtmosDevice - joinedGrid: 6747 - uid: 7456 components: - type: Transform @@ -11403,8 +11400,6 @@ entities: - 27297 - 27396 - 27395 - - type: AtmosDevice - joinedGrid: 6747 - uid: 8860 components: - type: Transform @@ -11444,8 +11439,6 @@ entities: - 22284 - 13376 - 13246 - - type: AtmosDevice - joinedGrid: 6747 - uid: 9063 components: - type: Transform @@ -11474,8 +11467,6 @@ entities: - 26056 - 22745 - 25606 - - type: AtmosDevice - joinedGrid: 6747 - uid: 13485 components: - type: Transform @@ -11509,8 +11500,6 @@ entities: - 15810 - 23752 - 23751 - - type: AtmosDevice - joinedGrid: 6747 - uid: 13930 components: - type: Transform @@ -11547,8 +11536,6 @@ entities: - 24134 - 24138 - 24178 - - type: AtmosDevice - joinedGrid: 6747 - uid: 21858 components: - type: Transform @@ -11564,8 +11551,6 @@ entities: - 15006 - 15004 - 14712 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22036 components: - type: Transform @@ -11586,8 +11571,6 @@ entities: - 14231 - 14279 - 14264 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22037 components: - type: Transform @@ -11619,8 +11602,6 @@ entities: - 13588 - 13667 - 13586 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22038 components: - type: Transform @@ -11649,8 +11630,6 @@ entities: - 13658 - 13659 - 13561 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22041 components: - type: Transform @@ -11669,8 +11648,6 @@ entities: - 13496 - 13500 - 13499 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22043 components: - type: Transform @@ -11703,8 +11680,6 @@ entities: - 22323 - 22324 - 21389 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22087 components: - type: Transform @@ -11725,8 +11700,6 @@ entities: - 17141 - 25308 - 25307 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22089 components: - type: Transform @@ -11749,8 +11722,6 @@ entities: - 21797 - 21795 - 21796 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22091 components: - type: Transform @@ -11780,8 +11751,6 @@ entities: - 25302 - 25303 - 25304 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22093 components: - type: Transform @@ -11818,8 +11787,6 @@ entities: - 14526 - 14733 - 14515 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22096 components: - type: Transform @@ -11846,8 +11813,6 @@ entities: - 15412 - 15339 - 15411 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22097 components: - type: Transform @@ -11867,8 +11832,6 @@ entities: - 16656 - 16657 - 27085 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22099 components: - type: Transform @@ -11888,8 +11851,6 @@ entities: - 15170 - 15172 - 15168 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22101 components: - type: Transform @@ -11906,8 +11867,6 @@ entities: - 14631 - 14630 - 14829 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22103 components: - type: Transform @@ -11925,8 +11884,6 @@ entities: - 14841 - 14842 - 14629 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22105 components: - type: Transform @@ -11945,15 +11902,11 @@ entities: - 15131 - 15133 - 15132 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22111 components: - type: Transform pos: 24.5,-62.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22113 components: - type: Transform @@ -11970,8 +11923,6 @@ entities: - 14364 - 14365 - 14727 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22115 components: - type: Transform @@ -11985,8 +11936,6 @@ entities: - 21782 - 14394 - 14717 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22117 components: - type: Transform @@ -12004,8 +11953,6 @@ entities: - 13953 - 13874 - 13954 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22119 components: - type: Transform @@ -12020,8 +11967,6 @@ entities: - 21907 - 13875 - 13960 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22121 components: - type: Transform @@ -12062,8 +12007,6 @@ entities: - 14293 - 13595 - 13673 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22123 components: - type: Transform @@ -12084,8 +12027,6 @@ entities: - 21908 - 13959 - 13873 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22125 components: - type: Transform @@ -12110,8 +12051,6 @@ entities: - 25258 - 22295 - 1148 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22130 components: - type: Transform @@ -12135,8 +12074,6 @@ entities: - 14324 - 14396 - 14439 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22132 components: - type: Transform @@ -12152,8 +12089,6 @@ entities: - 15005 - 14680 - 15007 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22158 components: - type: Transform @@ -12165,8 +12100,6 @@ entities: - 10125 - 22157 - 21810 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22163 components: - type: Transform @@ -12186,8 +12119,6 @@ entities: - 16537 - 15574 - 16536 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22223 components: - type: Transform @@ -12219,8 +12150,6 @@ entities: - 17074 - 17367 - 17362 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22225 components: - type: Transform @@ -12236,8 +12165,6 @@ entities: - 14647 - 15011 - 23041 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22229 components: - type: Transform @@ -12258,8 +12185,6 @@ entities: - 14525 - 14524 - 14735 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22234 components: - type: Transform @@ -12277,8 +12202,6 @@ entities: - 438 - 25595 - 25608 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22239 components: - type: Transform @@ -12296,8 +12219,6 @@ entities: - 15431 - 15359 - 21428 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22288 components: - type: Transform @@ -12319,8 +12240,6 @@ entities: - 14234 - 14032 - 14232 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22293 components: - type: Transform @@ -12335,8 +12254,6 @@ entities: - 21911 - 13958 - 13872 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22317 components: - type: Transform @@ -12359,8 +12276,6 @@ entities: - 14088 - 14131 - 14130 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22330 components: - type: Transform @@ -12373,8 +12288,6 @@ entities: - 21931 - 15716 - 15989 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22346 components: - type: Transform @@ -12385,8 +12298,6 @@ entities: - 9416 - 9417 - 9418 - - type: AtmosDevice - joinedGrid: 6747 - uid: 25271 components: - type: Transform @@ -12410,8 +12321,6 @@ entities: - 23685 - 24135 - 24119 - - type: AtmosDevice - joinedGrid: 6747 - uid: 25275 components: - type: Transform @@ -12425,8 +12334,6 @@ entities: - 25207 - 24185 - 24179 - - type: AtmosDevice - joinedGrid: 6747 - uid: 25278 components: - type: Transform @@ -12441,8 +12348,6 @@ entities: - 24196 - 24199 - 24200 - - type: AtmosDevice - joinedGrid: 6747 - uid: 25281 components: - type: Transform @@ -12470,8 +12375,6 @@ entities: - 24296 - 24323 - 24295 - - type: AtmosDevice - joinedGrid: 6747 - uid: 25283 components: - type: Transform @@ -12490,8 +12393,6 @@ entities: - 24269 - 24350 - 24268 - - type: AtmosDevice - joinedGrid: 6747 - uid: 25286 components: - type: Transform @@ -12512,8 +12413,6 @@ entities: - 24433 - 24432 - 24417 - - type: AtmosDevice - joinedGrid: 6747 - uid: 25287 components: - type: Transform @@ -12534,8 +12433,6 @@ entities: - 24287 - 24450 - 25289 - - type: AtmosDevice - joinedGrid: 6747 - uid: 25290 components: - type: Transform @@ -12563,8 +12460,6 @@ entities: - 24699 - 24711 - 24701 - - type: AtmosDevice - joinedGrid: 6747 - uid: 25293 components: - type: Transform @@ -12585,8 +12480,6 @@ entities: - 24850 - 24844 - 24839 - - type: AtmosDevice - joinedGrid: 6747 - uid: 25295 components: - type: Transform @@ -12602,8 +12495,6 @@ entities: - 25236 - 24880 - 24879 - - type: AtmosDevice - joinedGrid: 6747 - uid: 25298 components: - type: Transform @@ -12623,8 +12514,6 @@ entities: - 24908 - 24909 - 24889 - - type: AtmosDevice - joinedGrid: 6747 - uid: 25299 components: - type: Transform @@ -12649,8 +12538,6 @@ entities: - 24848 - 24847 - 25018 - - type: AtmosDevice - joinedGrid: 6747 - uid: 25305 components: - type: Transform @@ -12678,8 +12565,6 @@ entities: - 16024 - 24924 - 24478 - - type: AtmosDevice - joinedGrid: 6747 - uid: 25309 components: - type: Transform @@ -12720,8 +12605,6 @@ entities: - 25028 - 25096 - 25148 - - type: AtmosDevice - joinedGrid: 6747 - uid: 25311 components: - type: Transform @@ -12747,8 +12630,6 @@ entities: - 25039 - 24991 - 25065 - - type: AtmosDevice - joinedGrid: 6747 - uid: 25315 components: - type: Transform @@ -12768,8 +12649,6 @@ entities: - 25117 - 25020 - 25116 - - type: AtmosDevice - joinedGrid: 6747 - uid: 25317 components: - type: Transform @@ -12793,8 +12672,6 @@ entities: - 24988 - 25074 - 24970 - - type: AtmosDevice - joinedGrid: 6747 - uid: 25319 components: - type: Transform @@ -12814,8 +12691,6 @@ entities: - 25253 - 25147 - 25178 - - type: AtmosDevice - joinedGrid: 6747 - uid: 25321 components: - type: Transform @@ -12827,8 +12702,6 @@ entities: - 15911 - 25184 - 25185 - - type: AtmosDevice - joinedGrid: 6747 - uid: 25323 components: - type: Transform @@ -12847,8 +12720,6 @@ entities: - 24085 - 24089 - 24083 - - type: AtmosDevice - joinedGrid: 6747 - uid: 25325 components: - type: Transform @@ -12865,8 +12736,6 @@ entities: - 25258 - 13955 - 1148 - - type: AtmosDevice - joinedGrid: 6747 - uid: 26597 components: - type: Transform @@ -12876,8 +12745,6 @@ entities: - type: DeviceList devices: - 27051 - - type: AtmosDevice - joinedGrid: 6747 - uid: 26945 components: - type: Transform @@ -12893,8 +12760,6 @@ entities: - 26058 - 26064 - 26131 - - type: AtmosDevice - joinedGrid: 6747 - uid: 26958 components: - type: Transform @@ -12913,16 +12778,12 @@ entities: - 26226 - 26130 - 26069 - - type: AtmosDevice - joinedGrid: 6747 - uid: 26963 components: - type: Transform rot: 1.5707963267948966 rad pos: 39.5,16.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 26970 components: - type: Transform @@ -12954,8 +12815,6 @@ entities: - 26317 - 26275 - 26276 - - type: AtmosDevice - joinedGrid: 6747 - uid: 26989 components: - type: Transform @@ -12973,8 +12832,6 @@ entities: - 26949 - 26030 - 26049 - - type: AtmosDevice - joinedGrid: 6747 - uid: 26991 components: - type: Transform @@ -12996,8 +12853,6 @@ entities: - 26952 - 26028 - 26051 - - type: AtmosDevice - joinedGrid: 6747 - uid: 27003 components: - type: Transform @@ -13020,8 +12875,6 @@ entities: - 27020 - 26329 - 27021 - - type: AtmosDevice - joinedGrid: 6747 - uid: 27005 components: - type: Transform @@ -13044,8 +12897,6 @@ entities: - 26316 - 13333 - 22062 - - type: AtmosDevice - joinedGrid: 6747 - uid: 27009 components: - type: Transform @@ -13061,8 +12912,6 @@ entities: - 26199 - 13217 - 26345 - - type: AtmosDevice - joinedGrid: 6747 - uid: 27036 components: - type: Transform @@ -13077,8 +12926,6 @@ entities: - 27035 - 26831 - 26824 - - type: AtmosDevice - joinedGrid: 6747 - uid: 27087 components: - type: Transform @@ -13098,8 +12945,6 @@ entities: - 14910 - 14908 - 27086 - - type: AtmosDevice - joinedGrid: 6747 - proto: AirCanister entities: - uid: 7790 @@ -13107,43 +12952,31 @@ entities: - type: Transform pos: 48.5,42.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 8184 components: - type: Transform pos: 32.5,33.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 11336 components: - type: Transform pos: 57.5,-19.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 11372 components: - type: Transform pos: 34.5,22.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 12029 components: - type: Transform pos: 33.5,24.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 16663 components: - type: Transform pos: 13.5,-20.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - proto: Airlock entities: - uid: 1212 @@ -13683,16 +13516,6 @@ entities: - type: Transform pos: 69.5,-51.5 parent: 6747 - - uid: 588 - components: - - type: Transform - pos: 76.5,-24.5 - parent: 6747 - - uid: 880 - components: - - type: Transform - pos: 76.5,-19.5 - parent: 6747 - uid: 6216 components: - type: Transform @@ -13777,11 +13600,6 @@ entities: - type: Transform pos: 76.5,-44.5 parent: 6747 - - uid: 40 - components: - - type: Transform - pos: 76.5,-35.5 - parent: 6747 - uid: 514 components: - type: Transform @@ -13792,21 +13610,6 @@ entities: - type: Transform pos: 79.5,-43.5 parent: 6747 - - uid: 548 - components: - - type: Transform - pos: 76.5,-36.5 - parent: 6747 - - uid: 567 - components: - - type: Transform - pos: 79.5,-36.5 - parent: 6747 - - uid: 928 - components: - - type: Transform - pos: 79.5,-35.5 - parent: 6747 - uid: 994 components: - type: Transform @@ -13907,25 +13710,39 @@ entities: - type: Transform pos: -52.5,-18.5 parent: 6747 -- proto: AirlockExternalGlassShuttleEscape +- proto: AirlockExternalGlassShuttleArrivals entities: - - uid: 1129 + - uid: 5978 components: - type: Transform - rot: 3.141592653589793 rad - pos: 6.5,12.5 + rot: 1.5707963267948966 rad + pos: 76.5,-18.5 parent: 6747 - - uid: 6196 + - uid: 5999 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 78.5,-19.5 + rot: -1.5707963267948966 rad + pos: 86.5,-25.5 parent: 6747 - - uid: 6197 + - uid: 6001 components: - type: Transform rot: 1.5707963267948966 rad - pos: 78.5,-24.5 + pos: 76.5,-25.5 + parent: 6747 + - uid: 19446 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 86.5,-18.5 + parent: 6747 +- proto: AirlockExternalGlassShuttleEscape + entities: + - uid: 1129 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 6.5,12.5 parent: 6747 - uid: 7439 components: @@ -13959,24 +13776,12 @@ entities: rot: 3.141592653589793 rad pos: 21.5,36.5 parent: 6747 - - uid: 1081 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 82.5,-36.5 - parent: 6747 - uid: 1091 components: - type: Transform rot: 1.5707963267948966 rad pos: 82.5,-44.5 parent: 6747 - - uid: 1092 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 82.5,-35.5 - parent: 6747 - proto: AirlockExternalLocked entities: - uid: 7375 @@ -14035,6 +13840,18 @@ entities: parent: 6747 - proto: AirlockGlass entities: + - uid: 567 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 76.5,-36.5 + parent: 6747 + - uid: 588 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 76.5,-35.5 + parent: 6747 - uid: 1449 components: - type: Transform @@ -14140,6 +13957,12 @@ entities: - type: Transform pos: 62.5,-48.5 parent: 6747 + - uid: 5881 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 86.5,-36.5 + parent: 6747 - uid: 7084 components: - type: Transform @@ -14150,6 +13973,12 @@ entities: - type: Transform pos: 24.5,4.5 parent: 6747 + - uid: 11804 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 86.5,-35.5 + parent: 6747 - uid: 12906 components: - type: Transform @@ -16066,6 +15895,28 @@ entities: - type: Transform pos: 14.5,-54.5 parent: 6747 +- proto: AlwaysPoweredLightPostSmallRed + entities: + - uid: 5996 + components: + - type: Transform + pos: 76.5,-11.5 + parent: 6747 + - uid: 27687 + components: + - type: Transform + pos: 86.5,-11.5 + parent: 6747 + - uid: 27688 + components: + - type: Transform + pos: 78.5,-30.5 + parent: 6747 + - uid: 27689 + components: + - type: Transform + pos: 84.5,-30.5 + parent: 6747 - proto: AmeController entities: - uid: 17261 @@ -17588,30 +17439,22 @@ entities: - type: Transform pos: -1.5,-23.5 parent: 6747 - - uid: 5889 - components: - - type: Transform - pos: 78.5,-19.5 - parent: 6747 - - uid: 5902 + - uid: 5894 components: - type: Transform - pos: 82.5,-35.5 + rot: 1.5707963267948966 rad + pos: 76.5,-25.5 parent: 6747 - uid: 5959 components: - type: Transform pos: 82.5,-43.5 parent: 6747 - - uid: 5973 - components: - - type: Transform - pos: 82.5,-36.5 - parent: 6747 - - uid: 5982 + - uid: 5997 components: - type: Transform - pos: 78.5,-24.5 + rot: 1.5707963267948966 rad + pos: 76.5,-18.5 parent: 6747 - uid: 6098 components: @@ -18212,8 +18055,6 @@ entities: - type: Transform pos: 10.5,-24.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - proto: Beaker entities: - uid: 4364 @@ -18265,7 +18106,6 @@ entities: solutions: beaker: temperature: 293.15 - canMix: True canReact: True maxVol: 50 name: null @@ -19527,6 +19367,8 @@ entities: - type: Transform pos: 30.5,-13.5 parent: 6747 + - type: SpamEmitSound + enabled: False - proto: BoardGameSpawner entities: - uid: 6565 @@ -20363,6 +20205,11 @@ entities: parent: 6747 - proto: CableApcExtension entities: + - uid: 40 + components: + - type: Transform + pos: 84.5,-36.5 + parent: 6747 - uid: 346 components: - type: Transform @@ -20478,6 +20325,11 @@ entities: - type: Transform pos: 18.5,8.5 parent: 6747 + - uid: 4218 + components: + - type: Transform + pos: 85.5,-36.5 + parent: 6747 - uid: 4317 components: - type: Transform @@ -20516,13 +20368,23 @@ entities: - uid: 5891 components: - type: Transform - pos: 76.5,-19.5 + pos: 76.5,-18.5 + parent: 6747 + - uid: 5899 + components: + - type: Transform + pos: 75.5,-25.5 parent: 6747 - uid: 5901 components: - type: Transform pos: 71.5,-7.5 parent: 6747 + - uid: 5902 + components: + - type: Transform + pos: 76.5,-25.5 + parent: 6747 - uid: 5903 components: - type: Transform @@ -20553,6 +20415,11 @@ entities: - type: Transform pos: 76.5,-36.5 parent: 6747 + - uid: 5980 + components: + - type: Transform + pos: 86.5,-36.5 + parent: 6747 - uid: 6000 components: - type: Transform @@ -20603,10 +20470,10 @@ entities: - type: Transform pos: 69.5,-6.5 parent: 6747 - - uid: 6198 + - uid: 6173 components: - type: Transform - pos: 76.5,-24.5 + pos: 82.5,-36.5 parent: 6747 - uid: 6200 components: @@ -20628,10 +20495,10 @@ entities: - type: Transform pos: 72.5,-10.5 parent: 6747 - - uid: 6443 + - uid: 6539 components: - type: Transform - pos: 75.5,-24.5 + pos: 81.5,-36.5 parent: 6747 - uid: 6584 components: @@ -20773,6 +20640,11 @@ entities: - type: Transform pos: 8.5,0.5 parent: 6747 + - uid: 11803 + components: + - type: Transform + pos: 83.5,-36.5 + parent: 6747 - uid: 11806 components: - type: Transform @@ -25348,11 +25220,6 @@ entities: - type: Transform pos: 74.5,-20.5 parent: 6747 - - uid: 19446 - components: - - type: Transform - pos: 75.5,-26.5 - parent: 6747 - uid: 19447 components: - type: Transform @@ -36143,6 +36010,116 @@ entities: - type: Transform pos: -42.5,-17.5 parent: 6747 + - uid: 27724 + components: + - type: Transform + pos: 87.5,-36.5 + parent: 6747 + - uid: 27725 + components: + - type: Transform + pos: 87.5,-35.5 + parent: 6747 + - uid: 27726 + components: + - type: Transform + pos: 88.5,-35.5 + parent: 6747 + - uid: 27727 + components: + - type: Transform + pos: 88.5,-34.5 + parent: 6747 + - uid: 27728 + components: + - type: Transform + pos: 88.5,-33.5 + parent: 6747 + - uid: 27729 + components: + - type: Transform + pos: 88.5,-32.5 + parent: 6747 + - uid: 27730 + components: + - type: Transform + pos: 88.5,-31.5 + parent: 6747 + - uid: 27731 + components: + - type: Transform + pos: 88.5,-29.5 + parent: 6747 + - uid: 27732 + components: + - type: Transform + pos: 88.5,-30.5 + parent: 6747 + - uid: 27733 + components: + - type: Transform + pos: 88.5,-28.5 + parent: 6747 + - uid: 27734 + components: + - type: Transform + pos: 88.5,-27.5 + parent: 6747 + - uid: 27735 + components: + - type: Transform + pos: 88.5,-26.5 + parent: 6747 + - uid: 27736 + components: + - type: Transform + pos: 88.5,-25.5 + parent: 6747 + - uid: 27737 + components: + - type: Transform + pos: 88.5,-24.5 + parent: 6747 + - uid: 27738 + components: + - type: Transform + pos: 88.5,-22.5 + parent: 6747 + - uid: 27739 + components: + - type: Transform + pos: 88.5,-23.5 + parent: 6747 + - uid: 27740 + components: + - type: Transform + pos: 88.5,-21.5 + parent: 6747 + - uid: 27741 + components: + - type: Transform + pos: 88.5,-20.5 + parent: 6747 + - uid: 27742 + components: + - type: Transform + pos: 88.5,-19.5 + parent: 6747 + - uid: 27743 + components: + - type: Transform + pos: 87.5,-19.5 + parent: 6747 + - uid: 27744 + components: + - type: Transform + pos: 87.5,-18.5 + parent: 6747 + - uid: 27745 + components: + - type: Transform + pos: 86.5,-18.5 + parent: 6747 - proto: CableApcStack entities: - uid: 5081 @@ -47901,8 +47878,6 @@ entities: - type: Transform pos: 4.5,-82.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - proto: CargoPallet entities: - uid: 4595 @@ -53624,6 +53599,146 @@ entities: - type: Transform pos: -52.5,16.5 parent: 6747 + - uid: 27761 + components: + - type: Transform + pos: 92.5,-28.5 + parent: 6747 + - uid: 27762 + components: + - type: Transform + pos: 92.5,-26.5 + parent: 6747 + - uid: 27763 + components: + - type: Transform + pos: 92.5,-27.5 + parent: 6747 + - uid: 27764 + components: + - type: Transform + pos: 92.5,-29.5 + parent: 6747 + - uid: 27765 + components: + - type: Transform + pos: 92.5,-30.5 + parent: 6747 + - uid: 27766 + components: + - type: Transform + pos: 92.5,-31.5 + parent: 6747 + - uid: 27767 + components: + - type: Transform + pos: 92.5,-32.5 + parent: 6747 + - uid: 27768 + components: + - type: Transform + pos: 92.5,-33.5 + parent: 6747 + - uid: 27769 + components: + - type: Transform + pos: 92.5,-34.5 + parent: 6747 + - uid: 27770 + components: + - type: Transform + pos: 92.5,-35.5 + parent: 6747 + - uid: 27771 + components: + - type: Transform + pos: 92.5,-36.5 + parent: 6747 + - uid: 27772 + components: + - type: Transform + pos: 92.5,-37.5 + parent: 6747 + - uid: 27773 + components: + - type: Transform + pos: 92.5,-38.5 + parent: 6747 + - uid: 27774 + components: + - type: Transform + pos: 92.5,-39.5 + parent: 6747 + - uid: 27775 + components: + - type: Transform + pos: 93.5,-39.5 + parent: 6747 + - uid: 27776 + components: + - type: Transform + pos: 93.5,-38.5 + parent: 6747 + - uid: 27777 + components: + - type: Transform + pos: 93.5,-37.5 + parent: 6747 + - uid: 27778 + components: + - type: Transform + pos: 93.5,-36.5 + parent: 6747 + - uid: 27779 + components: + - type: Transform + pos: 93.5,-35.5 + parent: 6747 + - uid: 27780 + components: + - type: Transform + pos: 93.5,-34.5 + parent: 6747 + - uid: 27781 + components: + - type: Transform + pos: 93.5,-33.5 + parent: 6747 + - uid: 27782 + components: + - type: Transform + pos: 93.5,-32.5 + parent: 6747 + - uid: 27783 + components: + - type: Transform + pos: 93.5,-30.5 + parent: 6747 + - uid: 27784 + components: + - type: Transform + pos: 93.5,-31.5 + parent: 6747 + - uid: 27785 + components: + - type: Transform + pos: 93.5,-29.5 + parent: 6747 + - uid: 27786 + components: + - type: Transform + pos: 93.5,-28.5 + parent: 6747 + - uid: 27787 + components: + - type: Transform + pos: 93.5,-27.5 + parent: 6747 + - uid: 27788 + components: + - type: Transform + pos: 93.5,-26.5 + parent: 6747 - proto: Cautery entities: - uid: 23896 @@ -55655,6 +55770,12 @@ entities: - type: Transform pos: -19.450268,-35.39411 parent: 6747 + - uid: 27810 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 93.521675,-29.405575 + parent: 6747 - proto: Cigarette entities: - uid: 3419 @@ -55813,16 +55934,6 @@ entities: - type: Transform pos: 69.5,-11.5 parent: 6747 - - uid: 6538 - components: - - type: Transform - pos: 75.5,-18.5 - parent: 6747 - - uid: 6539 - components: - - type: Transform - pos: 67.5,-18.5 - parent: 6747 - uid: 8724 components: - type: Transform @@ -55910,16 +56021,6 @@ entities: - type: Transform pos: 72.5,-11.5 parent: 6747 - - uid: 6541 - components: - - type: Transform - pos: 74.5,-18.5 - parent: 6747 - - uid: 6542 - components: - - type: Transform - pos: 68.5,-18.5 - parent: 6747 - uid: 8216 components: - type: Transform @@ -56365,6 +56466,16 @@ entities: - type: Transform pos: -8.5,-82.5 parent: 6747 + - uid: 5968 + components: + - type: Transform + pos: 69.5,-17.5 + parent: 6747 + - uid: 6197 + components: + - type: Transform + pos: 72.5,-17.5 + parent: 6747 - uid: 6621 components: - type: Transform @@ -56704,25 +56815,6 @@ entities: - type: Transform pos: 30.735046,7.834367 parent: 6747 -- proto: ClothingHeadHatHairflower - entities: - - uid: 7182 - components: - - type: Transform - pos: 36.539196,-16.411207 - parent: 6747 - - uid: 12967 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -1.258544,-30.379358 - parent: 6747 - - uid: 17532 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 36.309444,-94.22372 - parent: 6747 - proto: ClothingHeadHatHardhatWhite entities: - uid: 4362 @@ -56842,6 +56934,13 @@ entities: - type: Transform pos: -15.503069,13.299613 parent: 6747 +- proto: ClothingHeadHelmetBasic + entities: + - uid: 11582 + components: + - type: Transform + pos: 32.51328,-89.3608 + parent: 6747 - proto: ClothingHeadHelmetCosmonaut entities: - uid: 21864 @@ -56914,13 +57013,6 @@ entities: rot: 3.141592653589793 rad pos: -33.477093,1.431968 parent: 6747 -- proto: ClothingHeadHelmetScaf - entities: - - uid: 11582 - components: - - type: Transform - pos: 32.51328,-89.3608 - parent: 6747 - proto: ClothingHeadHelmetTemplar entities: - uid: 21866 @@ -57905,6 +57997,18 @@ entities: rot: 3.141592653589793 rad pos: 50.5,-43.5 parent: 6747 + - uid: 27813 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 93.5,-30.5 + parent: 6747 + - uid: 27814 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 93.5,-28.5 + parent: 6747 - proto: CommsComputerCircuitboard entities: - uid: 17712 @@ -59445,7 +59549,7 @@ entities: - type: Transform pos: -44.5,5.5 parent: 6747 -- proto: CrateFunPlushie +- proto: CrateFunToyBox entities: - uid: 11269 components: @@ -59962,8 +60066,6 @@ entities: - type: Transform pos: 12.5,-17.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - proto: CryoPodMachineCircuitboard entities: - uid: 17743 @@ -60184,8 +60286,6 @@ entities: - type: Transform pos: 67.5,14.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconAnomalyGenerator entities: - uid: 27409 @@ -60193,8 +60293,6 @@ entities: - type: Transform pos: 26.5,-66.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconArmory entities: - uid: 27410 @@ -60202,8 +60300,6 @@ entities: - type: Transform pos: -31.5,2.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconArrivals entities: - uid: 6925 @@ -60211,8 +60307,6 @@ entities: - type: Transform pos: 72.5,-22.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconArtifactLab entities: - uid: 27411 @@ -60220,8 +60314,6 @@ entities: - type: Transform pos: -6.5,-83.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconAtmospherics entities: - uid: 27077 @@ -60229,8 +60321,6 @@ entities: - type: Transform pos: 46.5,29.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconBar entities: - uid: 12090 @@ -60238,8 +60328,6 @@ entities: - type: Transform pos: -20.5,-30.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconBotany entities: - uid: 8864 @@ -60247,15 +60335,11 @@ entities: - type: Transform pos: -3.5,-16.5 parent: 6747 - missingComponents: - - WarpPoint - uid: 10931 components: - type: Transform pos: -18.5,-17.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconBridge entities: - uid: 12094 @@ -60263,8 +60347,6 @@ entities: - type: Transform pos: -25.5,-48.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconCameraServerRoom entities: - uid: 8862 @@ -60272,8 +60354,6 @@ entities: - type: Transform pos: -18.5,-57.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconCaptainsQuarters entities: - uid: 8858 @@ -60281,8 +60361,6 @@ entities: - type: Transform pos: -30.5,-54.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconCargoBay entities: - uid: 534 @@ -60290,8 +60368,6 @@ entities: - type: Transform pos: 20.5,35.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconCargoReception entities: - uid: 27567 @@ -60299,8 +60375,6 @@ entities: - type: Transform pos: 24.5,18.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconCERoom entities: - uid: 27412 @@ -60308,8 +60382,6 @@ entities: - type: Transform pos: 55.5,7.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconChapel entities: - uid: 27415 @@ -60317,8 +60389,6 @@ entities: - type: Transform pos: 14.5,-53.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconChemistry entities: - uid: 12093 @@ -60326,8 +60396,6 @@ entities: - type: Transform pos: 11.5,-26.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconCMORoom entities: - uid: 27413 @@ -60335,8 +60403,6 @@ entities: - type: Transform pos: 24.5,-36.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconConferenceRoom entities: - uid: 8721 @@ -60344,8 +60410,6 @@ entities: - type: Transform pos: -22.5,-52.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconCourtroom entities: - uid: 10934 @@ -60353,8 +60417,6 @@ entities: - type: Transform pos: -12.5,-44.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconCryonics entities: - uid: 12095 @@ -60362,8 +60424,6 @@ entities: - type: Transform pos: 10.5,-18.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconCryosleep entities: - uid: 27416 @@ -60371,8 +60431,6 @@ entities: - type: Transform pos: 68.5,-32.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconDetectiveRoom entities: - uid: 27417 @@ -60380,8 +60438,6 @@ entities: - type: Transform pos: -18.5,5.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconDisposals entities: - uid: 27418 @@ -60389,8 +60445,6 @@ entities: - type: Transform pos: 40.5,-0.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconDorms entities: - uid: 10935 @@ -60398,8 +60452,6 @@ entities: - type: Transform pos: 41.5,-14.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconEngineering entities: - uid: 649 @@ -60407,8 +60459,6 @@ entities: - type: Transform pos: 43.5,10.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconEscapePod entities: - uid: 10937 @@ -60416,15 +60466,11 @@ entities: - type: Transform pos: 6.5,11.5 parent: 6747 - missingComponents: - - WarpPoint - uid: 12097 components: - type: Transform pos: -53.5,-12.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconEvac entities: - uid: 7708 @@ -60432,8 +60478,6 @@ entities: - type: Transform pos: 66.5,-44.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconEVAStorage entities: - uid: 12096 @@ -60443,8 +60487,6 @@ entities: parent: 6747 - type: NavMapBeacon text: EVA - missingComponents: - - WarpPoint - proto: DefaultStationBeaconExam entities: - uid: 12098 @@ -60452,8 +60494,6 @@ entities: - type: Transform pos: 16.5,-24.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconGravGen entities: - uid: 27420 @@ -60461,8 +60501,6 @@ entities: - type: Transform pos: 66.5,6.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconHOPOffice entities: - uid: 12107 @@ -60470,8 +60508,6 @@ entities: - type: Transform pos: 41.5,-35.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconHOSRoom entities: - uid: 27421 @@ -60479,8 +60515,6 @@ entities: - type: Transform pos: -11.5,-6.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconJanitorsOffice entities: - uid: 22365 @@ -60488,8 +60522,6 @@ entities: - type: Transform pos: 30.5,2.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconKitchen entities: - uid: 22363 @@ -60497,8 +60529,6 @@ entities: - type: Transform pos: -7.5,-24.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconLawOffice entities: - uid: 10915 @@ -60506,8 +60536,6 @@ entities: - type: Transform pos: -8.5,-62.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconLibrary entities: - uid: 27422 @@ -60515,8 +60543,6 @@ entities: - type: Transform pos: 30.5,-56.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconMailroom entities: - uid: 3687 @@ -60524,8 +60550,6 @@ entities: - type: Transform pos: 32.5,15.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconMantis entities: - uid: 12109 @@ -60533,8 +60557,6 @@ entities: - type: Transform pos: 2.5,-55.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconMedbay entities: - uid: 1608 @@ -60542,8 +60564,6 @@ entities: - type: Transform pos: 25.5,-28.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconMedicalOutpost entities: - uid: 10927 @@ -60551,15 +60571,11 @@ entities: - type: Transform pos: -21.5,-10.5 parent: 6747 - missingComponents: - - WarpPoint - uid: 10928 components: - type: Transform pos: 49.5,-42.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconMetempsychosis entities: - uid: 10933 @@ -60567,8 +60583,6 @@ entities: - type: Transform pos: 19.5,-33.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconMorgue entities: - uid: 27423 @@ -60576,8 +60590,6 @@ entities: - type: Transform pos: 13.5,-38.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconPark entities: - uid: 22367 @@ -60585,8 +60597,6 @@ entities: - type: Transform pos: 13.5,-43.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconPermaBrig entities: - uid: 10921 @@ -60594,8 +60604,6 @@ entities: - type: Transform pos: -48.5,2.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconPowerBank entities: - uid: 27427 @@ -60603,8 +60611,6 @@ entities: - type: Transform pos: 59.5,20.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconPsychologist entities: - uid: 23899 @@ -60612,8 +60618,6 @@ entities: - type: Transform pos: 49.5,-52.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconQMRoom entities: - uid: 27424 @@ -60621,8 +60625,6 @@ entities: - type: Transform pos: 14.5,20.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconRDRoom entities: - uid: 27425 @@ -60630,8 +60632,6 @@ entities: - type: Transform pos: 14.5,-68.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconReporter entities: - uid: 22378 @@ -60639,8 +60639,6 @@ entities: - type: Transform pos: 37.5,-51.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconRND entities: - uid: 24100 @@ -60648,8 +60646,6 @@ entities: - type: Transform pos: 4.5,-75.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconRobotics entities: - uid: 27426 @@ -60657,8 +60653,6 @@ entities: - type: Transform pos: 2.5,-70.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconSalvage entities: - uid: 24101 @@ -60666,8 +60660,6 @@ entities: - type: Transform pos: -2.5,37.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconScience entities: - uid: 10936 @@ -60675,8 +60667,6 @@ entities: - type: Transform pos: 22.5,-50.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconSecurity entities: - uid: 22370 @@ -60686,15 +60676,11 @@ entities: parent: 6747 - type: NavMapBeacon text: Shooting Range - missingComponents: - - WarpPoint - uid: 24102 components: - type: Transform pos: 0.5,-4.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconService entities: - uid: 6477 @@ -60704,8 +60690,6 @@ entities: parent: 6747 - type: NavMapBeacon text: Barber - missingComponents: - - WarpPoint - uid: 27428 components: - type: Transform @@ -60713,8 +60697,6 @@ entities: parent: 6747 - type: NavMapBeacon text: Service Lounge - missingComponents: - - WarpPoint - proto: DefaultStationBeaconSolars entities: - uid: 25590 @@ -60722,22 +60704,16 @@ entities: - type: Transform pos: 40.5,49.5 parent: 6747 - missingComponents: - - WarpPoint - uid: 27429 components: - type: Transform pos: 78.5,18.5 parent: 6747 - missingComponents: - - WarpPoint - uid: 27431 components: - type: Transform pos: -53.5,-24.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconSurgery entities: - uid: 24103 @@ -60745,8 +60721,6 @@ entities: - type: Transform pos: 11.5,-31.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconTechVault entities: - uid: 27432 @@ -60754,8 +60728,6 @@ entities: - type: Transform pos: 72.5,9.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconTEG entities: - uid: 24980 @@ -60763,8 +60735,6 @@ entities: - type: Transform pos: 58.5,27.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconTelecoms entities: - uid: 27433 @@ -60772,8 +60742,6 @@ entities: - type: Transform pos: 62.5,8.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconTheater entities: - uid: 26333 @@ -60783,8 +60751,6 @@ entities: parent: 6747 - type: NavMapBeacon text: Arena - missingComponents: - - WarpPoint - proto: DefaultStationBeaconToolRoom entities: - uid: 27434 @@ -60792,8 +60758,6 @@ entities: - type: Transform pos: 54.5,-25.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconVault entities: - uid: 27435 @@ -60801,8 +60765,6 @@ entities: - type: Transform pos: -34.5,-46.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconVirology entities: - uid: 27076 @@ -60810,8 +60772,6 @@ entities: - type: Transform pos: 21.5,-15.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefaultStationBeaconWardensOffice entities: - uid: 27436 @@ -60819,8 +60779,6 @@ entities: - type: Transform pos: -21.5,-6.5 parent: 6747 - missingComponents: - - WarpPoint - proto: DefibrillatorCabinet entities: - uid: 3246 @@ -70845,7 +70803,6 @@ entities: solutions: drink: temperature: 293.15 - canMix: False canReact: True maxVol: 100 name: null @@ -71036,7 +70993,6 @@ entities: solutions: drink: temperature: 293.15 - canMix: True canReact: True maxVol: 20 name: null @@ -71197,7 +71153,6 @@ entities: solutions: drink: temperature: 293.15 - canMix: False canReact: True maxVol: 20 name: null @@ -71214,7 +71169,6 @@ entities: solutions: drink: temperature: 293.15 - canMix: False canReact: True maxVol: 20 name: null @@ -71238,7 +71192,6 @@ entities: solutions: drink: temperature: 293.15 - canMix: False canReact: True maxVol: 100 name: null @@ -71325,7 +71278,6 @@ entities: solutions: drink: temperature: 293.15 - canMix: False canReact: True maxVol: 20 name: null @@ -71344,7 +71296,6 @@ entities: solutions: drink: temperature: 293.15 - canMix: False canReact: True maxVol: 20 name: null @@ -71363,7 +71314,6 @@ entities: solutions: drink: temperature: 293.15 - canMix: False canReact: True maxVol: 20 name: null @@ -71376,29 +71326,11 @@ entities: - type: Transform pos: -59.004444,-0.28683114 parent: 6747 - - type: SolutionContainerManager - solutions: - drink: - temperature: 293.15 - canMix: False - canReact: True - maxVol: 20 - name: null - reagents: [] - uid: 23573 components: - type: Transform pos: -58.941944,-0.5161569 parent: 6747 - - type: SolutionContainerManager - solutions: - drink: - temperature: 293.15 - canMix: False - canReact: True - maxVol: 20 - name: null - reagents: [] - proto: DrinkWaterJug entities: - uid: 17594 @@ -72674,8 +72606,6 @@ entities: - 26981 - 26982 - 26983 - - type: AtmosDevice - joinedGrid: 6747 - uid: 295 components: - type: Transform @@ -72698,8 +72628,6 @@ entities: - 21749 - 21750 - 21751 - - type: AtmosDevice - joinedGrid: 6747 - uid: 767 components: - type: Transform @@ -72729,8 +72657,6 @@ entities: - 15913 - 25266 - 25268 - - type: AtmosDevice - joinedGrid: 6747 - uid: 1781 components: - type: Transform @@ -72753,8 +72679,6 @@ entities: - 25209 - 1958 - 25206 - - type: AtmosDevice - joinedGrid: 6747 - uid: 3693 components: - type: Transform @@ -72768,8 +72692,6 @@ entities: - 21775 - 22292 - 21906 - - type: AtmosDevice - joinedGrid: 6747 - uid: 7457 components: - type: Transform @@ -72785,8 +72707,6 @@ entities: - 5324 - 5866 - 5878 - - type: AtmosDevice - joinedGrid: 6747 - uid: 7458 components: - type: Transform @@ -72802,8 +72722,6 @@ entities: - 7446 - 7445 - 7444 - - type: AtmosDevice - joinedGrid: 6747 - uid: 13176 components: - type: Transform @@ -72819,8 +72737,6 @@ entities: - 26988 - 1959 - 2421 - - type: AtmosDevice - joinedGrid: 6747 - uid: 13869 components: - type: Transform @@ -72842,8 +72758,6 @@ entities: - 21749 - 21750 - 21751 - - type: AtmosDevice - joinedGrid: 6747 - uid: 17095 components: - type: Transform @@ -72860,8 +72774,6 @@ entities: - 22151 - 21882 - 23520 - - type: AtmosDevice - joinedGrid: 6747 - uid: 17357 components: - type: Transform @@ -72877,8 +72789,6 @@ entities: - 25257 - 25258 - 1148 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22035 components: - type: Transform @@ -72894,8 +72804,6 @@ entities: - 21769 - 21770 - 22290 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22039 components: - type: Transform @@ -72910,8 +72818,6 @@ entities: - 21918 - 8989 - 8988 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22040 components: - type: Transform @@ -72927,8 +72833,6 @@ entities: - 9007 - 22184 - 21917 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22042 components: - type: Transform @@ -72943,8 +72847,6 @@ entities: - 22188 - 22328 - 22327 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22044 components: - type: Transform @@ -72971,8 +72873,6 @@ entities: - 8984 - 21916 - 21389 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22088 components: - type: Transform @@ -72987,8 +72887,6 @@ entities: - 17141 - 25308 - 25307 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22090 components: - type: Transform @@ -73005,8 +72903,6 @@ entities: - 21797 - 21795 - 21796 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22092 components: - type: Transform @@ -73030,8 +72926,6 @@ entities: - 25302 - 25303 - 25304 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22094 components: - type: Transform @@ -73060,8 +72954,6 @@ entities: - 8966 - 21784 - 21783 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22095 components: - type: Transform @@ -73075,8 +72967,6 @@ entities: - 22161 - 22160 - 22159 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22098 components: - type: Transform @@ -73087,8 +72977,6 @@ entities: - 21788 - 21891 - 27085 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22100 components: - type: Transform @@ -73102,8 +72990,6 @@ entities: - 21890 - 21787 - 21889 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22102 components: - type: Transform @@ -73116,8 +73002,6 @@ entities: - 22236 - 22237 - 21886 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22104 components: - type: Transform @@ -73129,8 +73013,6 @@ entities: - 21888 - 21887 - 22154 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22106 components: - type: Transform @@ -73141,15 +73023,11 @@ entities: - 21885 - 22147 - 21786 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22112 components: - type: Transform pos: 28.5,-62.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22114 components: - type: Transform @@ -73162,8 +73040,6 @@ entities: - 22142 - 22146 - 21783 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22116 components: - type: Transform @@ -73175,8 +73051,6 @@ entities: - 21879 - 22144 - 21782 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22118 components: - type: Transform @@ -73191,8 +73065,6 @@ entities: - 22174 - 22178 - 21909 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22120 components: - type: Transform @@ -73205,8 +73077,6 @@ entities: - 22176 - 22177 - 21907 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22122 components: - type: Transform @@ -73239,8 +73109,6 @@ entities: - 8975 - 8973 - 22177 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22124 components: - type: Transform @@ -73259,8 +73127,6 @@ entities: - 21781 - 21772 - 21908 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22126 components: - type: Transform @@ -73281,8 +73147,6 @@ entities: - 25257 - 25258 - 1148 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22127 components: - type: Transform @@ -73292,8 +73156,6 @@ entities: devices: - 22321 - 21931 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22131 components: - type: Transform @@ -73305,8 +73167,6 @@ entities: - 22136 - 22137 - 22139 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22140 components: - type: Transform @@ -73318,8 +73178,6 @@ entities: - 22136 - 22138 - 22135 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22164 components: - type: Transform @@ -73335,8 +73193,6 @@ entities: - 21414 - 21415 - 22246 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22224 components: - type: Transform @@ -73358,8 +73214,6 @@ entities: - 17052 - 17367 - 17362 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22226 components: - type: Transform @@ -73373,8 +73227,6 @@ entities: - 21811 - 22143 - 23041 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22230 components: - type: Transform @@ -73389,8 +73241,6 @@ entities: - 22228 - 22231 - 21881 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22235 components: - type: Transform @@ -73403,8 +73253,6 @@ entities: - 22153 - 22152 - 438 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22238 components: - type: Transform @@ -73416,8 +73264,6 @@ entities: - 10125 - 22157 - 21810 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22240 components: - type: Transform @@ -73431,8 +73277,6 @@ entities: - 22157 - 10125 - 10126 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22289 components: - type: Transform @@ -73450,8 +73294,6 @@ entities: - 6533 - 9007 - 21915 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22294 components: - type: Transform @@ -73464,8 +73306,6 @@ entities: - 22181 - 22180 - 21911 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22318 components: - type: Transform @@ -73482,8 +73322,6 @@ entities: - 21818 - 21819 - 22186 - - type: AtmosDevice - joinedGrid: 6747 - uid: 25272 components: - type: Transform @@ -73499,8 +73337,6 @@ entities: - 25204 - 25212 - 25205 - - type: AtmosDevice - joinedGrid: 6747 - uid: 25276 components: - type: Transform @@ -73512,8 +73348,6 @@ entities: - 25212 - 25277 - 25207 - - type: AtmosDevice - joinedGrid: 6747 - uid: 25279 components: - type: Transform @@ -73524,8 +73358,6 @@ entities: devices: - 25212 - 25208 - - type: AtmosDevice - joinedGrid: 6747 - uid: 25282 components: - type: Transform @@ -73547,8 +73379,6 @@ entities: - 25232 - 25220 - 25221 - - type: AtmosDevice - joinedGrid: 6747 - uid: 25284 components: - type: Transform @@ -73559,8 +73389,6 @@ entities: devices: - 25219 - 25216 - - type: AtmosDevice - joinedGrid: 6747 - uid: 25285 components: - type: Transform @@ -73571,8 +73399,6 @@ entities: devices: - 25219 - 25217 - - type: AtmosDevice - joinedGrid: 6747 - uid: 25288 components: - type: Transform @@ -73585,8 +73411,6 @@ entities: - 25222 - 22246 - 25224 - - type: AtmosDevice - joinedGrid: 6747 - uid: 25291 components: - type: Transform @@ -73598,8 +73422,6 @@ entities: - 25226 - 25229 - 25230 - - type: AtmosDevice - joinedGrid: 6747 - uid: 25294 components: - type: Transform @@ -73614,8 +73436,6 @@ entities: - 25236 - 22162 - 25235 - - type: AtmosDevice - joinedGrid: 6747 - uid: 25296 components: - type: Transform @@ -73629,8 +73449,6 @@ entities: - 25234 - 25233 - 25236 - - type: AtmosDevice - joinedGrid: 6747 - uid: 25297 components: - type: Transform @@ -73644,8 +73462,6 @@ entities: - 25241 - 25238 - 25237 - - type: AtmosDevice - joinedGrid: 6747 - uid: 25300 components: - type: Transform @@ -73662,8 +73478,6 @@ entities: - 25219 - 25221 - 25220 - - type: AtmosDevice - joinedGrid: 6747 - uid: 25306 components: - type: Transform @@ -73688,8 +73502,6 @@ entities: - 25301 - 22249 - 25307 - - type: AtmosDevice - joinedGrid: 6747 - uid: 25310 components: - type: Transform @@ -73725,8 +73537,6 @@ entities: - 15908 - 15907 - 15905 - - type: AtmosDevice - joinedGrid: 6747 - uid: 25312 components: - type: Transform @@ -73748,8 +73558,6 @@ entities: - 25264 - 25314 - 25313 - - type: AtmosDevice - joinedGrid: 6747 - uid: 25318 components: - type: Transform @@ -73767,8 +73575,6 @@ entities: - 25252 - 25260 - 25261 - - type: AtmosDevice - joinedGrid: 6747 - uid: 25320 components: - type: Transform @@ -73786,8 +73592,6 @@ entities: - 25261 - 25254 - 25253 - - type: AtmosDevice - joinedGrid: 6747 - uid: 25322 components: - type: Transform @@ -73798,8 +73602,6 @@ entities: devices: - 25262 - 15911 - - type: AtmosDevice - joinedGrid: 6747 - uid: 25324 components: - type: Transform @@ -73812,8 +73614,6 @@ entities: - 25268 - 25219 - 25267 - - type: AtmosDevice - joinedGrid: 6747 - uid: 25386 components: - type: Transform @@ -73829,8 +73629,6 @@ entities: - 15916 - 15915 - 15914 - - type: AtmosDevice - joinedGrid: 6747 - uid: 26947 components: - type: Transform @@ -73842,8 +73640,6 @@ entities: - 21921 - 26953 - 26952 - - type: AtmosDevice - joinedGrid: 6747 - uid: 26959 components: - type: Transform @@ -73854,16 +73650,12 @@ entities: devices: - 21921 - 26954 - - type: AtmosDevice - joinedGrid: 6747 - uid: 26964 components: - type: Transform rot: 1.5707963267948966 rad pos: 39.5,15.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 26971 components: - type: Transform @@ -73889,8 +73681,6 @@ entities: - 26972 - 22433 - 26974 - - type: AtmosDevice - joinedGrid: 6747 - uid: 26990 components: - type: Transform @@ -73905,8 +73695,6 @@ entities: - 26946 - 26948 - 26949 - - type: AtmosDevice - joinedGrid: 6747 - uid: 26992 components: - type: Transform @@ -73926,8 +73714,6 @@ entities: - 26951 - 26960 - 26952 - - type: AtmosDevice - joinedGrid: 6747 - uid: 27004 components: - type: Transform @@ -73941,8 +73727,6 @@ entities: - 1820 - 27002 - 27001 - - type: AtmosDevice - joinedGrid: 6747 - uid: 27006 components: - type: Transform @@ -73961,8 +73745,6 @@ entities: - 26969 - 26972 - 26973 - - type: AtmosDevice - joinedGrid: 6747 - uid: 27008 components: - type: Transform @@ -73975,8 +73757,6 @@ entities: - 26974 - 21928 - 27010 - - type: AtmosDevice - joinedGrid: 6747 - uid: 27037 components: - type: Transform @@ -73989,8 +73769,6 @@ entities: - 27034 - 25212 - 27035 - - type: AtmosDevice - joinedGrid: 6747 - uid: 27088 components: - type: Transform @@ -74004,8 +73782,6 @@ entities: - 23520 - 5046 - 27086 - - type: AtmosDevice - joinedGrid: 6747 - proto: FireAlarmElectronics entities: - uid: 7654 @@ -76228,7 +76004,7 @@ entities: - type: Transform pos: 110.47042,36.19293 parent: 6747 -- proto: FoodChili +- proto: FoodChiliPepper entities: - uid: 3862 components: @@ -76606,6 +76382,25 @@ entities: - type: Transform pos: 48.306625,-15.94488 parent: 6747 +- proto: FoodPoppy + entities: + - uid: 7182 + components: + - type: Transform + pos: 36.539196,-16.411207 + parent: 6747 + - uid: 12967 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -1.258544,-30.379358 + parent: 6747 + - uid: 17532 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 36.309444,-94.22372 + parent: 6747 - proto: FoodPotato entities: - uid: 218 @@ -76809,8 +76604,6 @@ entities: - type: Transform pos: 11.5,-20.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#99FFFFFF' - uid: 7925 @@ -76819,8 +76612,6 @@ entities: rot: 1.5707963267948966 rad pos: 50.5,35.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#CC6600FF' - uid: 11423 @@ -76829,8 +76620,6 @@ entities: rot: -1.5707963267948966 rad pos: 43.5,30.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#66FF66FF' - uid: 11971 @@ -76839,8 +76628,6 @@ entities: rot: 3.141592653589793 rad pos: 58.5,38.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#00FFFFFF' - uid: 13117 @@ -76849,16 +76636,12 @@ entities: rot: -1.5707963267948966 rad pos: 60.5,31.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 13152 components: - type: Transform rot: -1.5707963267948966 rad pos: 59.5,31.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#CC6600FF' - uid: 13364 @@ -76866,8 +76649,6 @@ entities: - type: Transform pos: 60.5,35.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#00FFFFFF' - uid: 13369 @@ -76876,8 +76657,6 @@ entities: rot: 3.141592653589793 rad pos: 62.5,35.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#00FFFFFF' - uid: 26913 @@ -76885,8 +76664,6 @@ entities: - type: Transform pos: 11.5,-19.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#99FFFFFF' - proto: GasFilterFlipped @@ -76897,8 +76674,6 @@ entities: rot: -1.5707963267948966 rad pos: 36.5,35.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 7868 @@ -76907,8 +76682,6 @@ entities: rot: -1.5707963267948966 rad pos: 38.5,35.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#CC6600FF' - uid: 7869 @@ -76917,8 +76690,6 @@ entities: rot: -1.5707963267948966 rad pos: 40.5,35.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#CC6600FF' - uid: 7870 @@ -76927,8 +76698,6 @@ entities: rot: -1.5707963267948966 rad pos: 42.5,35.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#CC6600FF' - uid: 7871 @@ -76937,8 +76706,6 @@ entities: rot: -1.5707963267948966 rad pos: 44.5,35.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#CC6600FF' - uid: 7872 @@ -76947,8 +76714,6 @@ entities: rot: -1.5707963267948966 rad pos: 46.5,35.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#CC6600FF' - uid: 8120 @@ -76956,8 +76721,6 @@ entities: - type: Transform pos: 53.5,43.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#CC6600FF' - proto: GasMinerNitrogenStation @@ -76967,8 +76730,6 @@ entities: - type: Transform pos: 38.5,41.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - proto: GasMinerOxygenStation entities: - uid: 6693 @@ -76976,8 +76737,6 @@ entities: - type: Transform pos: 36.5,41.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - proto: GasMixer entities: - uid: 11233 @@ -76986,8 +76745,6 @@ entities: rot: -1.5707963267948966 rad pos: 2.5,-85.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - proto: GasMixerFlipped entities: - uid: 7887 @@ -76999,8 +76756,6 @@ entities: - type: GasMixer inletTwoConcentration: 0.79 inletOneConcentration: 0.21 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 11232 @@ -77009,8 +76764,6 @@ entities: rot: 3.141592653589793 rad pos: 1.5,-85.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - proto: GasOutletInjector entities: - uid: 250 @@ -77019,15 +76772,11 @@ entities: rot: 1.5707963267948966 rad pos: -20.5,9.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 7259 components: - type: Transform pos: 42.5,40.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF9999FF' - uid: 7261 @@ -77035,8 +76784,6 @@ entities: - type: Transform pos: 40.5,40.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF5500FF' - uid: 7262 @@ -77044,8 +76791,6 @@ entities: - type: Transform pos: 38.5,40.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF3333FF' - uid: 7263 @@ -77053,8 +76798,6 @@ entities: - type: Transform pos: 36.5,40.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#00FFFFFF' - uid: 7938 @@ -77062,8 +76805,6 @@ entities: - type: Transform pos: 44.5,40.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#3399FFFF' - uid: 7939 @@ -77071,15 +76812,11 @@ entities: - type: Transform pos: 46.5,40.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 7940 components: - type: Transform pos: 48.5,40.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 8107 @@ -77087,8 +76824,6 @@ entities: - type: Transform pos: 53.5,49.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#CC6600FF' - uid: 8108 @@ -77096,48 +76831,36 @@ entities: - type: Transform pos: 54.5,49.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 11251 components: - type: Transform rot: 3.141592653589793 rad pos: 3.5,-90.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 11252 components: - type: Transform rot: 3.141592653589793 rad pos: 1.5,-90.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 13284 components: - type: Transform rot: -1.5707963267948966 rad pos: 65.5,28.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 13370 components: - type: Transform rot: -1.5707963267948966 rad pos: 65.5,35.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 15078 components: - type: Transform rot: 1.5707963267948966 rad pos: -10.5,-73.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 15079 @@ -77146,8 +76869,6 @@ entities: rot: 3.141592653589793 rad pos: -9.5,-78.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 15482 @@ -77156,45 +76877,33 @@ entities: rot: 3.141592653589793 rad pos: -34.5,-71.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 15483 components: - type: Transform rot: -1.5707963267948966 rad pos: -23.5,-68.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 15484 components: - type: Transform pos: -42.5,-53.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 15485 components: - type: Transform rot: 3.141592653589793 rad pos: -48.5,-82.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 16591 components: - type: Transform pos: -31.5,17.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 16592 components: - type: Transform pos: -26.5,15.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - proto: GasPassiveGate entities: - uid: 7933 @@ -77203,8 +76912,6 @@ entities: rot: 3.141592653589793 rad pos: 46.5,31.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#66FF66FF' - uid: 23527 @@ -77212,8 +76919,6 @@ entities: - type: Transform pos: 43.5,33.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#66FF66FF' - uid: 25075 @@ -77222,8 +76927,6 @@ entities: rot: 3.141592653589793 rad pos: -1.5,-24.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - proto: GasPassiveVent @@ -77233,8 +76936,6 @@ entities: - type: Transform pos: 55.5,48.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#CC6600FF' - uid: 7945 @@ -77243,8 +76944,6 @@ entities: rot: 1.5707963267948966 rad pos: 36.5,42.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#00FFFFFF' - uid: 7946 @@ -77253,8 +76952,6 @@ entities: rot: 1.5707963267948966 rad pos: 38.5,42.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF3333FF' - uid: 7947 @@ -77263,8 +76960,6 @@ entities: rot: 1.5707963267948966 rad pos: 40.5,42.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF5500FF' - uid: 7948 @@ -77273,8 +76968,6 @@ entities: rot: 1.5707963267948966 rad pos: 42.5,42.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF9999FF' - uid: 7949 @@ -77283,8 +76976,6 @@ entities: rot: 1.5707963267948966 rad pos: 44.5,42.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#3399FFFF' - uid: 7950 @@ -77293,16 +76984,12 @@ entities: rot: 1.5707963267948966 rad pos: 46.5,42.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 7951 components: - type: Transform rot: 1.5707963267948966 rad pos: 48.5,42.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 8031 @@ -77310,8 +76997,6 @@ entities: - type: Transform pos: 51.5,38.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#CC6600FF' - uid: 8151 @@ -77319,23 +77004,17 @@ entities: - type: Transform pos: 53.5,44.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 11253 components: - type: Transform rot: 3.141592653589793 rad pos: 2.5,-89.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 13272 components: - type: Transform pos: 57.5,41.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - proto: GasPipeBend entities: - uid: 344 @@ -108146,16 +107825,12 @@ entities: rot: 3.141592653589793 rad pos: 10.5,-25.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 7258 components: - type: Transform rot: -1.5707963267948966 rad pos: 52.5,34.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#CC6600FF' - uid: 7260 @@ -108164,8 +107839,6 @@ entities: rot: -1.5707963267948966 rad pos: 52.5,33.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#CC6600FF' - uid: 7753 @@ -108174,8 +107847,6 @@ entities: rot: -1.5707963267948966 rad pos: 35.5,32.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 7864 @@ -108184,8 +107855,6 @@ entities: rot: -1.5707963267948966 rad pos: 35.5,33.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 7865 @@ -108194,8 +107863,6 @@ entities: rot: -1.5707963267948966 rad pos: 35.5,34.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 7883 @@ -108204,8 +107871,6 @@ entities: rot: 1.5707963267948966 rad pos: 36.5,34.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#00FFFFFF' - uid: 7888 @@ -108214,8 +107879,6 @@ entities: rot: 1.5707963267948966 rad pos: 38.5,34.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF3333FF' - uid: 7910 @@ -108224,56 +107887,42 @@ entities: rot: 3.141592653589793 rad pos: 49.5,34.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 7913 components: - type: Transform rot: 3.141592653589793 rad pos: 45.5,34.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 7917 components: - type: Transform rot: 3.141592653589793 rad pos: 41.5,34.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 7918 components: - type: Transform rot: 3.141592653589793 rad pos: 47.5,34.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 7926 components: - type: Transform rot: 3.141592653589793 rad pos: 48.5,31.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 8128 components: - type: Transform rot: 3.141592653589793 rad pos: 54.5,44.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 8144 components: - type: Transform rot: 1.5707963267948966 rad pos: 53.5,33.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#CC6600FF' - uid: 8145 @@ -108282,8 +107931,6 @@ entities: rot: 1.5707963267948966 rad pos: 53.5,34.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#CC6600FF' - uid: 11226 @@ -108291,44 +107938,32 @@ entities: - type: Transform pos: 1.5,-83.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 11227 components: - type: Transform pos: 2.5,-83.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 11228 components: - type: Transform pos: 3.5,-83.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 11229 components: - type: Transform pos: 4.5,-83.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 11256 components: - type: Transform pos: 2.5,-86.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 11427 components: - type: Transform rot: 1.5707963267948966 rad pos: 49.5,32.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#CC6600FF' - uid: 11428 @@ -108337,8 +107972,6 @@ entities: rot: 1.5707963267948966 rad pos: 49.5,33.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#CC6600FF' - uid: 11442 @@ -108347,8 +107980,6 @@ entities: rot: 1.5707963267948966 rad pos: 42.5,32.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#66FF66FF' - uid: 11769 @@ -108356,16 +107987,12 @@ entities: - type: Transform pos: -8.5,-84.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 13084 components: - type: Transform rot: 1.5707963267948966 rad pos: 59.5,33.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#00FFFFFF' - uid: 13145 @@ -108373,16 +108000,12 @@ entities: - type: Transform pos: 60.5,32.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 13150 components: - type: Transform rot: 3.141592653589793 rad pos: 61.5,28.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#CC6600FF' - uid: 13151 @@ -108391,8 +108014,6 @@ entities: rot: 3.141592653589793 rad pos: 60.5,28.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#CC6600FF' - uid: 13282 @@ -108401,24 +108022,18 @@ entities: rot: 1.5707963267948966 rad pos: 62.5,28.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 13340 components: - type: Transform rot: 1.5707963267948966 rad pos: 59.5,35.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 13341 components: - type: Transform rot: 1.5707963267948966 rad pos: 59.5,34.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#00FFFFFF' - uid: 14914 @@ -108427,24 +108042,18 @@ entities: rot: 3.141592653589793 rad pos: 13.5,-20.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22211 components: - type: Transform rot: 1.5707963267948966 rad pos: 10.5,-20.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 23526 components: - type: Transform rot: 1.5707963267948966 rad pos: 42.5,34.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF9999FF' - uid: 23897 @@ -108453,8 +108062,6 @@ entities: rot: 1.5707963267948966 rad pos: 10.5,-19.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - proto: GasPressurePump entities: - uid: 246 @@ -108463,8 +108070,6 @@ entities: rot: -1.5707963267948966 rad pos: -19.5,9.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 7880 @@ -108472,8 +108077,6 @@ entities: - type: Transform pos: 37.5,35.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#00FFFFFF' - uid: 7881 @@ -108481,8 +108084,6 @@ entities: - type: Transform pos: 39.5,35.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF3333FF' - uid: 7901 @@ -108491,8 +108092,6 @@ entities: rot: 3.141592653589793 rad pos: 48.5,35.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 7903 @@ -108500,8 +108099,6 @@ entities: - type: Transform pos: 48.5,32.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 7907 @@ -108509,8 +108106,6 @@ entities: - type: Transform pos: 49.5,35.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 7914 @@ -108518,15 +108113,11 @@ entities: - type: Transform pos: 47.5,35.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 7915 components: - type: Transform pos: 41.5,35.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF5500FF' - uid: 7919 @@ -108534,8 +108125,6 @@ entities: - type: Transform pos: 43.5,35.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF9999FF' - uid: 7920 @@ -108543,8 +108132,6 @@ entities: - type: Transform pos: 45.5,35.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#3399FFFF' - uid: 7931 @@ -108553,8 +108140,6 @@ entities: rot: -1.5707963267948966 rad pos: 48.5,30.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#CC6600FF' - uid: 8121 @@ -108563,8 +108148,6 @@ entities: rot: 3.141592653589793 rad pos: 53.5,46.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#CC6600FF' - uid: 8127 @@ -108573,15 +108156,11 @@ entities: rot: 3.141592653589793 rad pos: 54.5,45.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 8141 components: - type: Transform pos: 54.5,35.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#CC6600FF' - uid: 11245 @@ -108589,31 +108168,23 @@ entities: - type: Transform pos: 1.5,-87.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 11246 components: - type: Transform pos: 3.5,-87.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 11255 components: - type: Transform rot: 3.141592653589793 rad pos: 2.5,-87.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 11425 components: - type: Transform rot: 1.5707963267948966 rad pos: 44.5,32.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#66FF66FF' - uid: 11439 @@ -108622,8 +108193,6 @@ entities: rot: 3.141592653589793 rad pos: 40.5,29.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 11441 @@ -108631,8 +108200,6 @@ entities: - type: Transform pos: 41.5,30.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 13283 @@ -108641,16 +108208,12 @@ entities: rot: 1.5707963267948966 rad pos: 63.5,28.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 15071 components: - type: Transform rot: -1.5707963267948966 rad pos: -8.5,-73.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 15486 @@ -108659,8 +108222,6 @@ entities: rot: 1.5707963267948966 rad pos: -24.5,-68.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 15521 @@ -108669,8 +108230,6 @@ entities: rot: 3.141592653589793 rad pos: -42.5,-54.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 15538 @@ -108678,8 +108237,6 @@ entities: - type: Transform pos: -34.5,-70.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 15546 @@ -108687,8 +108244,6 @@ entities: - type: Transform pos: -48.5,-81.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 16571 @@ -108697,8 +108252,6 @@ entities: rot: 3.141592653589793 rad pos: -31.5,16.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 16572 @@ -108707,8 +108260,6 @@ entities: rot: 3.141592653589793 rad pos: -26.5,14.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 26911 @@ -108717,8 +108268,6 @@ entities: rot: 3.141592653589793 rad pos: 13.5,-19.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#99FFFFFF' - proto: GasRecycler @@ -108728,8 +108277,6 @@ entities: - type: Transform pos: 45.5,31.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#66FF66FF' - proto: GasThermoMachineFreezer @@ -108741,8 +108288,6 @@ entities: parent: 6747 - type: AtmosPipeColor color: '#0335FCFF' - - type: AtmosDevice - joinedGrid: 6747 - uid: 8147 components: - type: Transform @@ -108750,22 +108295,16 @@ entities: parent: 6747 - type: AtmosPipeColor color: '#CC6600FF' - - type: AtmosDevice - joinedGrid: 6747 - uid: 11224 components: - type: Transform pos: 0.5,-83.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 11601 components: - type: Transform pos: -3.5,-86.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22329 components: - type: Transform @@ -108773,8 +108312,6 @@ entities: parent: 6747 - type: AtmosPipeColor color: '#99FFFFFF' - - type: AtmosDevice - joinedGrid: 6747 - proto: GasThermoMachineFreezerEnabled entities: - uid: 11825 @@ -108784,8 +108321,6 @@ entities: parent: 6747 - type: GasThermoMachine targetTemperature: 249.8167 - - type: AtmosDevice - joinedGrid: 6747 - proto: GasThermoMachineHeater entities: - uid: 7935 @@ -108796,8 +108331,6 @@ entities: parent: 6747 - type: AtmosPipeColor color: '#66FF66FF' - - type: AtmosDevice - joinedGrid: 6747 - uid: 8146 components: - type: Transform @@ -108805,22 +108338,16 @@ entities: parent: 6747 - type: AtmosPipeColor color: '#CC6600FF' - - type: AtmosDevice - joinedGrid: 6747 - uid: 11225 components: - type: Transform pos: 0.5,-85.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 11602 components: - type: Transform pos: -11.5,-86.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22502 components: - type: Transform @@ -108828,8 +108355,6 @@ entities: parent: 6747 - type: AtmosPipeColor color: '#0335FCFF' - - type: AtmosDevice - joinedGrid: 6747 - proto: GasValve entities: - uid: 7542 @@ -108839,8 +108364,6 @@ entities: parent: 6747 - type: GasValve open: False - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#CC6600FF' - uid: 7862 @@ -108848,8 +108371,6 @@ entities: - type: Transform pos: 34.5,31.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 7892 @@ -108858,8 +108379,6 @@ entities: rot: 3.141592653589793 rad pos: 41.5,32.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 7893 @@ -108870,8 +108389,6 @@ entities: parent: 6747 - type: GasValve open: False - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 8030 @@ -108879,8 +108396,6 @@ entities: - type: Transform pos: 51.5,37.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#CC6600FF' - uid: 8210 @@ -108891,8 +108406,6 @@ entities: parent: 6747 - type: GasValve open: False - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#CC6600FF' - uid: 11944 @@ -108902,8 +108415,6 @@ entities: parent: 6747 - type: GasValve open: False - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#CC6600FF' - uid: 14625 @@ -108913,8 +108424,6 @@ entities: parent: 6747 - type: GasValve open: False - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 14628 @@ -108924,8 +108433,6 @@ entities: parent: 6747 - type: GasValve open: False - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24983 @@ -108934,8 +108441,6 @@ entities: rot: -1.5707963267948966 rad pos: -0.5,-21.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#E5CCFFFF' - proto: GasVentPump @@ -108949,8 +108454,6 @@ entities: - type: DeviceNetwork deviceLists: - 7456 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 7254 @@ -108958,8 +108461,6 @@ entities: - type: Transform pos: 47.5,17.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 8433 @@ -108968,8 +108469,6 @@ entities: rot: -1.5707963267948966 rad pos: 42.5,29.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 11770 @@ -108978,15 +108477,11 @@ entities: rot: 3.141592653589793 rad pos: -8.5,-87.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 13062 components: - type: Transform pos: 53.5,17.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 13246 @@ -108995,8 +108490,6 @@ entities: rot: 1.5707963267948966 rad pos: 23.5,-2.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 13451 @@ -109005,8 +108498,6 @@ entities: rot: -1.5707963267948966 rad pos: 39.5,10.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 13452 @@ -109015,8 +108506,6 @@ entities: rot: 1.5707963267948966 rad pos: 19.5,10.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 13484 @@ -109025,8 +108514,6 @@ entities: rot: 1.5707963267948966 rad pos: 10.5,27.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 13486 @@ -109034,8 +108521,6 @@ entities: - type: Transform pos: -0.5,35.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 13487 @@ -109044,8 +108529,6 @@ entities: rot: 3.141592653589793 rad pos: -56.5,-42.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 13496 @@ -109053,8 +108536,6 @@ entities: - type: Transform pos: 32.5,1.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 13499 @@ -109063,8 +108544,6 @@ entities: rot: -1.5707963267948966 rad pos: 37.5,-0.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 13658 @@ -109072,8 +108551,6 @@ entities: - type: Transform pos: 36.5,-6.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 13659 @@ -109081,8 +108558,6 @@ entities: - type: Transform pos: 39.5,-9.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 13660 @@ -109090,8 +108565,6 @@ entities: - type: Transform pos: 41.5,-6.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 13661 @@ -109099,8 +108572,6 @@ entities: - type: Transform pos: 48.5,-6.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 13662 @@ -109109,8 +108580,6 @@ entities: rot: -1.5707963267948966 rad pos: 51.5,-10.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 13664 @@ -109119,8 +108588,6 @@ entities: rot: -1.5707963267948966 rad pos: 50.5,-21.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 13665 @@ -109129,8 +108596,6 @@ entities: rot: 3.141592653589793 rad pos: 46.5,-24.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 13666 @@ -109139,8 +108604,6 @@ entities: rot: 3.141592653589793 rad pos: 41.5,-24.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 13667 @@ -109149,8 +108612,6 @@ entities: rot: -1.5707963267948966 rad pos: 45.5,-17.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 13668 @@ -109159,8 +108620,6 @@ entities: rot: -1.5707963267948966 rad pos: 45.5,-13.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 13669 @@ -109169,8 +108628,6 @@ entities: rot: 3.141592653589793 rad pos: 36.5,-13.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 13670 @@ -109178,8 +108635,6 @@ entities: - type: Transform pos: 36.5,-17.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 13671 @@ -109188,8 +108643,6 @@ entities: rot: 3.141592653589793 rad pos: 38.5,-24.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 13672 @@ -109198,8 +108651,6 @@ entities: rot: 3.141592653589793 rad pos: 36.5,-24.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 13673 @@ -109208,8 +108659,6 @@ entities: rot: -1.5707963267948966 rad pos: 29.5,-14.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 13674 @@ -109217,8 +108666,6 @@ entities: - type: Transform pos: 28.5,-9.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 13676 @@ -109226,8 +108673,6 @@ entities: - type: Transform pos: 38.5,-20.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 13774 @@ -109236,8 +108681,6 @@ entities: rot: -1.5707963267948966 rad pos: 26.5,-9.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 13784 @@ -109246,8 +108689,6 @@ entities: rot: 3.141592653589793 rad pos: 32.5,-22.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 13951 @@ -109256,8 +108697,6 @@ entities: rot: 1.5707963267948966 rad pos: 5.5,-37.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 13952 @@ -109266,8 +108705,6 @@ entities: rot: -1.5707963267948966 rad pos: 17.5,-37.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 13953 @@ -109276,8 +108713,6 @@ entities: rot: 1.5707963267948966 rad pos: 14.5,-34.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 13954 @@ -109286,8 +108721,6 @@ entities: rot: 3.141592653589793 rad pos: 21.5,-33.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 13955 @@ -109296,8 +108729,6 @@ entities: rot: 1.5707963267948966 rad pos: 12.5,-26.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 13956 @@ -109305,8 +108736,6 @@ entities: - type: Transform pos: 17.5,-25.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 13957 @@ -109314,8 +108743,6 @@ entities: - type: Transform pos: 18.5,-13.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 13958 @@ -109323,8 +108750,6 @@ entities: - type: Transform pos: 25.5,-22.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 13959 @@ -109333,8 +108758,6 @@ entities: rot: 3.141592653589793 rad pos: 26.5,-27.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 13960 @@ -109343,8 +108766,6 @@ entities: rot: 3.141592653589793 rad pos: 26.5,-35.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 14115 @@ -109352,8 +108773,6 @@ entities: - type: Transform pos: 58.5,-1.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 14125 @@ -109362,8 +108781,6 @@ entities: rot: 3.141592653589793 rad pos: 58.5,-10.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 14130 @@ -109372,8 +108789,6 @@ entities: rot: -1.5707963267948966 rad pos: 58.5,-19.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 14230 @@ -109382,8 +108797,6 @@ entities: rot: 3.141592653589793 rad pos: 37.5,-29.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 14231 @@ -109392,8 +108805,6 @@ entities: rot: 3.141592653589793 rad pos: 46.5,-32.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 14232 @@ -109401,8 +108812,6 @@ entities: - type: Transform pos: 53.5,-24.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 14234 @@ -109411,8 +108820,6 @@ entities: rot: 3.141592653589793 rad pos: 53.5,-29.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 14235 @@ -109420,8 +108827,6 @@ entities: - type: Transform pos: 74.5,-20.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 14236 @@ -109433,8 +108838,6 @@ entities: - type: DeviceNetwork deviceLists: - 7456 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 14264 @@ -109443,8 +108846,6 @@ entities: rot: 1.5707963267948966 rad pos: 36.5,-39.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 14293 @@ -109453,8 +108854,6 @@ entities: rot: -1.5707963267948966 rad pos: 30.5,-36.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 14294 @@ -109463,8 +108862,6 @@ entities: rot: -1.5707963267948966 rad pos: 41.5,-32.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 14397 @@ -109472,8 +108869,6 @@ entities: - type: Transform pos: 67.5,-41.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 14439 @@ -109482,8 +108877,6 @@ entities: rot: 1.5707963267948966 rad pos: 58.5,-41.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 14717 @@ -109492,8 +108885,6 @@ entities: rot: 3.141592653589793 rad pos: 36.5,-51.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 14718 @@ -109501,8 +108892,6 @@ entities: - type: Transform pos: 36.5,-45.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 14719 @@ -109510,8 +108899,6 @@ entities: - type: Transform pos: 54.5,-45.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 14720 @@ -109520,8 +108907,6 @@ entities: rot: -1.5707963267948966 rad pos: 74.5,-47.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 14721 @@ -109529,8 +108914,6 @@ entities: - type: Transform pos: 72.5,-41.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 14726 @@ -109539,8 +108922,6 @@ entities: rot: 1.5707963267948966 rad pos: 28.5,-50.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 14727 @@ -109549,8 +108930,6 @@ entities: rot: 3.141592653589793 rad pos: 29.5,-61.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 14733 @@ -109558,8 +108937,6 @@ entities: - type: Transform pos: 25.5,-44.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 14735 @@ -109568,8 +108945,6 @@ entities: rot: 3.141592653589793 rad pos: 25.5,-56.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 14743 @@ -109578,8 +108953,6 @@ entities: rot: -1.5707963267948966 rad pos: 26.5,-49.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 14744 @@ -109587,8 +108960,6 @@ entities: - type: Transform pos: 19.5,-45.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 14759 @@ -109597,8 +108968,6 @@ entities: rot: 3.141592653589793 rad pos: -11.5,-48.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 14760 @@ -109606,8 +108975,6 @@ entities: - type: Transform pos: -9.5,-42.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 14763 @@ -109615,8 +108982,6 @@ entities: - type: Transform pos: -11.5,-45.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 14774 @@ -109624,8 +108989,6 @@ entities: - type: Transform pos: -5.5,-45.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 14806 @@ -109633,8 +108996,6 @@ entities: - type: Transform pos: 5.5,-45.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 14829 @@ -109643,8 +109004,6 @@ entities: rot: 3.141592653589793 rad pos: 1.5,-82.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 14830 @@ -109652,8 +109011,6 @@ entities: - type: Transform pos: 3.5,-75.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 14841 @@ -109662,8 +109019,6 @@ entities: rot: 1.5707963267948966 rad pos: -7.5,-83.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 14842 @@ -109672,8 +109027,6 @@ entities: rot: -1.5707963267948966 rad pos: -4.5,-81.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 14896 @@ -109682,8 +109035,6 @@ entities: rot: 1.5707963267948966 rad pos: 8.5,-62.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 14897 @@ -109691,8 +109042,6 @@ entities: - type: Transform pos: 6.5,-72.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 14899 @@ -109701,8 +109050,6 @@ entities: rot: 1.5707963267948966 rad pos: 8.5,-67.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 14902 @@ -109711,8 +109058,6 @@ entities: rot: 3.141592653589793 rad pos: 19.5,-66.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 14903 @@ -109721,8 +109066,6 @@ entities: rot: 1.5707963267948966 rad pos: 19.5,-58.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 14906 @@ -109731,8 +109074,6 @@ entities: rot: 1.5707963267948966 rad pos: 19.5,-51.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 14910 @@ -109741,8 +109082,6 @@ entities: rot: 3.141592653589793 rad pos: 20.5,-68.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 14920 @@ -109751,8 +109090,6 @@ entities: rot: 1.5707963267948966 rad pos: 14.5,-67.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 14926 @@ -109761,8 +109098,6 @@ entities: rot: 3.141592653589793 rad pos: 28.5,-66.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 15004 @@ -109771,8 +109106,6 @@ entities: rot: 1.5707963267948966 rad pos: 24.5,-87.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 15005 @@ -109781,8 +109114,6 @@ entities: rot: 1.5707963267948966 rad pos: 32.5,-81.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 15006 @@ -109790,8 +109121,6 @@ entities: - type: Transform pos: 27.5,-78.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 15007 @@ -109800,8 +109129,6 @@ entities: rot: 3.141592653589793 rad pos: 37.5,-83.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 15011 @@ -109810,8 +109137,6 @@ entities: rot: 3.141592653589793 rad pos: 18.5,-74.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 15131 @@ -109819,8 +109144,6 @@ entities: - type: Transform pos: 10.5,-55.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 15132 @@ -109829,8 +109152,6 @@ entities: rot: -1.5707963267948966 rad pos: 15.5,-56.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 15141 @@ -109839,8 +109160,6 @@ entities: rot: 3.141592653589793 rad pos: 10.5,-59.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 15144 @@ -109849,8 +109168,6 @@ entities: rot: 3.141592653589793 rad pos: 14.5,-58.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 15162 @@ -109859,8 +109176,6 @@ entities: rot: 1.5707963267948966 rad pos: 2.5,-56.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 15170 @@ -109869,8 +109184,6 @@ entities: rot: 1.5707963267948966 rad pos: -0.5,-58.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 15172 @@ -109879,8 +109192,6 @@ entities: rot: 3.141592653589793 rad pos: 3.5,-60.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 15208 @@ -109889,8 +109200,6 @@ entities: rot: -1.5707963267948966 rad pos: 9.5,-42.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 15211 @@ -109899,8 +109208,6 @@ entities: rot: 1.5707963267948966 rad pos: -0.5,-44.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 15230 @@ -109909,8 +109216,6 @@ entities: rot: -1.5707963267948966 rad pos: -5.5,-54.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 15267 @@ -109919,8 +109224,6 @@ entities: rot: -1.5707963267948966 rad pos: 1.5,-65.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 15391 @@ -109928,8 +109231,6 @@ entities: - type: Transform pos: -33.5,-47.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 15392 @@ -109937,8 +109238,6 @@ entities: - type: Transform pos: -31.5,-47.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 15393 @@ -109947,8 +109246,6 @@ entities: rot: -1.5707963267948966 rad pos: -23.5,-49.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 15394 @@ -109960,8 +109257,6 @@ entities: - type: DeviceNetwork deviceLists: - 22089 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 15395 @@ -109973,8 +109268,6 @@ entities: - type: DeviceNetwork deviceLists: - 22089 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 15396 @@ -109986,8 +109279,6 @@ entities: - type: DeviceNetwork deviceLists: - 22089 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 15403 @@ -109996,8 +109287,6 @@ entities: rot: 1.5707963267948966 rad pos: -32.5,-54.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 15411 @@ -110006,8 +109295,6 @@ entities: rot: -1.5707963267948966 rad pos: -27.5,-58.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 15412 @@ -110016,8 +109303,6 @@ entities: rot: 3.141592653589793 rad pos: -31.5,-59.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 15431 @@ -110029,8 +109314,6 @@ entities: - type: DeviceNetwork deviceLists: - 22239 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 15445 @@ -110039,8 +109322,6 @@ entities: rot: 3.141592653589793 rad pos: 61.5,-52.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 15555 @@ -110049,8 +109330,6 @@ entities: rot: 3.141592653589793 rad pos: -45.5,-37.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 15574 @@ -110058,8 +109337,6 @@ entities: - type: Transform pos: -44.5,-40.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 15989 @@ -110067,8 +109344,6 @@ entities: - type: Transform pos: 16.5,-1.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 15990 @@ -110077,8 +109352,6 @@ entities: rot: 3.141592653589793 rad pos: 10.5,-10.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 16067 @@ -110087,8 +109360,6 @@ entities: rot: -1.5707963267948966 rad pos: 2.5,-36.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 16623 @@ -110097,8 +109368,6 @@ entities: rot: 3.141592653589793 rad pos: -9.5,-65.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 16624 @@ -110107,8 +109376,6 @@ entities: rot: 3.141592653589793 rad pos: -7.5,-65.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 16625 @@ -110117,8 +109384,6 @@ entities: rot: -1.5707963267948966 rad pos: -6.5,-61.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 16626 @@ -110127,8 +109392,6 @@ entities: rot: -1.5707963267948966 rad pos: -5.5,-58.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 16723 @@ -110136,8 +109399,6 @@ entities: - type: Transform pos: 13.5,-21.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 16844 @@ -110146,8 +109407,6 @@ entities: rot: 1.5707963267948966 rad pos: 46.5,-41.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 16846 @@ -110156,8 +109415,6 @@ entities: rot: -1.5707963267948966 rad pos: 51.5,-43.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 17062 @@ -110166,8 +109423,6 @@ entities: rot: 3.141592653589793 rad pos: 54.5,-42.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 17395 @@ -110176,8 +109431,6 @@ entities: rot: 3.141592653589793 rad pos: 47.5,-51.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 21428 @@ -110188,8 +109441,6 @@ entities: - type: DeviceNetwork deviceLists: - 22239 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 22062 @@ -110197,8 +109448,6 @@ entities: - type: Transform pos: 12.5,34.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 22268 @@ -110207,8 +109456,6 @@ entities: rot: -1.5707963267948966 rad pos: 6.5,-13.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 22284 @@ -110217,8 +109464,6 @@ entities: rot: 1.5707963267948966 rad pos: 15.5,5.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 22310 @@ -110226,8 +109471,6 @@ entities: - type: Transform pos: 22.5,-13.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 22311 @@ -110236,8 +109479,6 @@ entities: rot: 1.5707963267948966 rad pos: 21.5,-16.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 22312 @@ -110246,8 +109487,6 @@ entities: rot: 3.141592653589793 rad pos: 22.5,-19.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 22324 @@ -110255,8 +109494,6 @@ entities: - type: Transform pos: 18.5,-7.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 22326 @@ -110265,8 +109502,6 @@ entities: rot: -1.5707963267948966 rad pos: 33.5,-14.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 23663 @@ -110275,8 +109510,6 @@ entities: rot: 1.5707963267948966 rad pos: -2.5,-21.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#E5CCFFFF' - uid: 23664 @@ -110284,8 +109517,6 @@ entities: - type: Transform pos: -19.5,-46.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 23671 @@ -110294,8 +109525,6 @@ entities: rot: 3.141592653589793 rad pos: 4.5,-5.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 23683 @@ -110304,8 +109533,6 @@ entities: rot: 1.5707963267948966 rad pos: -2.5,-0.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 23684 @@ -110314,8 +109541,6 @@ entities: rot: 3.141592653589793 rad pos: -0.5,-5.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 23752 @@ -110323,8 +109548,6 @@ entities: - type: Transform pos: -12.5,-10.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24049 @@ -110333,8 +109556,6 @@ entities: rot: 3.141592653589793 rad pos: 34.5,-94.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24050 @@ -110342,8 +109563,6 @@ entities: - type: Transform pos: 27.5,-91.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24051 @@ -110352,8 +109571,6 @@ entities: rot: 3.141592653589793 rad pos: 27.5,-94.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24087 @@ -110362,8 +109579,6 @@ entities: rot: 1.5707963267948966 rad pos: -25.5,-11.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24088 @@ -110371,8 +109586,6 @@ entities: - type: Transform pos: -20.5,-10.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24089 @@ -110380,8 +109593,6 @@ entities: - type: Transform pos: -18.5,-10.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24119 @@ -110390,8 +109601,6 @@ entities: rot: 3.141592653589793 rad pos: -5.5,-6.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24120 @@ -110399,8 +109608,6 @@ entities: - type: Transform pos: -5.5,-1.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24133 @@ -110409,8 +109616,6 @@ entities: rot: -1.5707963267948966 rad pos: -5.5,2.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24175 @@ -110419,8 +109624,6 @@ entities: rot: 3.141592653589793 rad pos: -17.5,-2.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24178 @@ -110429,8 +109632,6 @@ entities: rot: -1.5707963267948966 rad pos: -6.5,-6.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24179 @@ -110439,8 +109640,6 @@ entities: rot: 1.5707963267948966 rad pos: -13.5,-6.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24200 @@ -110449,8 +109648,6 @@ entities: rot: 1.5707963267948966 rad pos: -23.5,-6.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24201 @@ -110459,8 +109656,6 @@ entities: rot: 3.141592653589793 rad pos: -20.5,-6.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24259 @@ -110468,8 +109663,6 @@ entities: - type: Transform pos: -38.5,7.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24268 @@ -110477,8 +109670,6 @@ entities: - type: Transform pos: -33.5,3.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24269 @@ -110487,8 +109678,6 @@ entities: rot: 1.5707963267948966 rad pos: -33.5,6.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24270 @@ -110497,8 +109686,6 @@ entities: rot: 1.5707963267948966 rad pos: -33.5,9.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24323 @@ -110507,8 +109694,6 @@ entities: rot: -1.5707963267948966 rad pos: -29.5,-12.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24324 @@ -110517,8 +109702,6 @@ entities: rot: -1.5707963267948966 rad pos: -29.5,-8.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24325 @@ -110527,8 +109710,6 @@ entities: rot: -1.5707963267948966 rad pos: -29.5,-5.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24384 @@ -110536,8 +109717,6 @@ entities: - type: Transform pos: -37.5,0.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24407 @@ -110546,8 +109725,6 @@ entities: rot: 3.141592653589793 rad pos: -43.5,-0.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24408 @@ -110556,8 +109733,6 @@ entities: rot: 3.141592653589793 rad pos: -41.5,0.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24409 @@ -110566,8 +109741,6 @@ entities: rot: 3.141592653589793 rad pos: -45.5,-0.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24410 @@ -110576,8 +109749,6 @@ entities: rot: 3.141592653589793 rad pos: -47.5,-0.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24432 @@ -110586,8 +109757,6 @@ entities: rot: -1.5707963267948966 rad pos: -42.5,9.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24433 @@ -110595,8 +109764,6 @@ entities: - type: Transform pos: -46.5,8.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24435 @@ -110605,8 +109772,6 @@ entities: rot: -1.5707963267948966 rad pos: -46.5,4.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24457 @@ -110615,8 +109780,6 @@ entities: rot: -1.5707963267948966 rad pos: -41.5,-9.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24459 @@ -110624,8 +109787,6 @@ entities: - type: Transform pos: -42.5,-4.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24461 @@ -110634,8 +109795,6 @@ entities: rot: 3.141592653589793 rad pos: -41.5,-5.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24643 @@ -110644,8 +109803,6 @@ entities: rot: 1.5707963267948966 rad pos: -67.5,-3.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24705 @@ -110653,8 +109810,6 @@ entities: - type: Transform pos: -63.5,12.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24706 @@ -110663,8 +109818,6 @@ entities: rot: 1.5707963267948966 rad pos: -64.5,7.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24707 @@ -110672,8 +109825,6 @@ entities: - type: Transform pos: -60.5,6.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24708 @@ -110681,8 +109832,6 @@ entities: - type: Transform pos: -66.5,7.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24709 @@ -110690,8 +109839,6 @@ entities: - type: Transform pos: -71.5,5.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24710 @@ -110700,8 +109847,6 @@ entities: rot: 3.141592653589793 rad pos: -68.5,0.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24711 @@ -110710,8 +109855,6 @@ entities: rot: 3.141592653589793 rad pos: -63.5,-6.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24844 @@ -110720,8 +109863,6 @@ entities: rot: -1.5707963267948966 rad pos: -42.5,-24.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24847 @@ -110730,8 +109871,6 @@ entities: rot: -1.5707963267948966 rad pos: -34.5,-30.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24848 @@ -110740,8 +109879,6 @@ entities: rot: -1.5707963267948966 rad pos: -34.5,-27.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24849 @@ -110749,8 +109886,6 @@ entities: - type: Transform pos: -37.5,-26.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24850 @@ -110758,8 +109893,6 @@ entities: - type: Transform pos: -39.5,-22.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24879 @@ -110768,8 +109901,6 @@ entities: rot: 3.141592653589793 rad pos: -37.5,-36.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24887 @@ -110778,8 +109909,6 @@ entities: rot: -1.5707963267948966 rad pos: -25.5,-35.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24888 @@ -110788,8 +109917,6 @@ entities: rot: 3.141592653589793 rad pos: -26.5,-39.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24889 @@ -110798,8 +109925,6 @@ entities: rot: 3.141592653589793 rad pos: -32.5,-39.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24924 @@ -110808,8 +109933,6 @@ entities: rot: 1.5707963267948966 rad pos: -14.5,-36.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 24940 @@ -110818,8 +109941,6 @@ entities: rot: 1.5707963267948966 rad pos: -0.5,-31.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 25038 @@ -110828,8 +109949,6 @@ entities: rot: -1.5707963267948966 rad pos: -4.5,-30.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 25039 @@ -110838,8 +109957,6 @@ entities: rot: 1.5707963267948966 rad pos: -21.5,-28.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 25065 @@ -110848,8 +109965,6 @@ entities: rot: 3.141592653589793 rad pos: -19.5,-35.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 25074 @@ -110858,8 +109973,6 @@ entities: rot: -1.5707963267948966 rad pos: 3.5,-25.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 25096 @@ -110868,8 +109981,6 @@ entities: rot: 1.5707963267948966 rad pos: -12.5,-23.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 25114 @@ -110878,8 +109989,6 @@ entities: rot: 1.5707963267948966 rad pos: -29.5,-17.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 25115 @@ -110888,8 +109997,6 @@ entities: rot: 1.5707963267948966 rad pos: -29.5,-22.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 25116 @@ -110897,8 +110004,6 @@ entities: - type: Transform pos: -24.5,-18.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 25117 @@ -110907,8 +110012,6 @@ entities: rot: 3.141592653589793 rad pos: -24.5,-29.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 25131 @@ -110917,8 +110020,6 @@ entities: rot: 3.141592653589793 rad pos: -27.5,-23.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 25136 @@ -110926,8 +110027,6 @@ entities: - type: Transform pos: -6.5,-22.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 25178 @@ -110936,8 +110035,6 @@ entities: rot: -1.5707963267948966 rad pos: -3.5,-17.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 25179 @@ -110945,8 +110042,6 @@ entities: - type: Transform pos: -11.5,-14.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 25185 @@ -110954,8 +110049,6 @@ entities: - type: Transform pos: -19.5,-19.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 25289 @@ -110964,8 +110057,6 @@ entities: rot: 3.141592653589793 rad pos: -35.5,-5.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 25441 @@ -110974,8 +110065,6 @@ entities: rot: -1.5707963267948966 rad pos: -53.5,-11.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 25442 @@ -110984,8 +110073,6 @@ entities: rot: -1.5707963267948966 rad pos: -53.5,-7.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 25595 @@ -110993,8 +110080,6 @@ entities: - type: Transform pos: 3.5,-70.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 25606 @@ -111003,8 +110088,6 @@ entities: rot: 3.141592653589793 rad pos: 47.5,8.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 26028 @@ -111013,8 +110096,6 @@ entities: rot: -1.5707963267948966 rad pos: 59.5,18.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 26030 @@ -111023,8 +110104,6 @@ entities: rot: -1.5707963267948966 rad pos: 58.5,26.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 26031 @@ -111033,8 +110112,6 @@ entities: rot: 1.5707963267948966 rad pos: 54.5,26.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 26056 @@ -111043,8 +110120,6 @@ entities: rot: 3.141592653589793 rad pos: 61.5,11.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 26058 @@ -111053,8 +110128,6 @@ entities: rot: 3.141592653589793 rad pos: 66.5,11.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 26064 @@ -111063,8 +110136,6 @@ entities: rot: 3.141592653589793 rad pos: 71.5,6.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 26069 @@ -111073,8 +110144,6 @@ entities: rot: 1.5707963267948966 rad pos: 68.5,9.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 26070 @@ -111083,8 +110152,6 @@ entities: rot: 3.141592653589793 rad pos: 50.5,8.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 26072 @@ -111093,8 +110160,6 @@ entities: rot: 3.141592653589793 rad pos: 55.5,8.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 26074 @@ -111103,8 +110168,6 @@ entities: rot: 3.141592653589793 rad pos: 60.5,8.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 26169 @@ -111113,8 +110176,6 @@ entities: rot: -1.5707963267948966 rad pos: 35.5,25.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 26170 @@ -111123,8 +110184,6 @@ entities: rot: 1.5707963267948966 rad pos: 28.5,32.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 26172 @@ -111133,8 +110192,6 @@ entities: rot: 1.5707963267948966 rad pos: 28.5,24.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 26276 @@ -111143,8 +110200,6 @@ entities: rot: 1.5707963267948966 rad pos: 33.5,14.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 26317 @@ -111153,8 +110208,6 @@ entities: rot: 3.141592653589793 rad pos: 26.5,19.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 26337 @@ -111163,8 +110216,6 @@ entities: rot: -1.5707963267948966 rad pos: 17.5,25.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 26345 @@ -111172,8 +110223,6 @@ entities: - type: Transform pos: 18.5,22.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 26346 @@ -111182,8 +110231,6 @@ entities: rot: 1.5707963267948966 rad pos: 11.5,21.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 26367 @@ -111191,8 +110238,6 @@ entities: - type: Transform pos: 23.5,27.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 26828 @@ -111201,8 +110246,6 @@ entities: rot: 1.5707963267948966 rad pos: -25.5,7.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 26829 @@ -111211,8 +110254,6 @@ entities: rot: 1.5707963267948966 rad pos: -25.5,4.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 26830 @@ -111221,8 +110262,6 @@ entities: rot: 1.5707963267948966 rad pos: -25.5,1.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 26831 @@ -111231,8 +110270,6 @@ entities: rot: -1.5707963267948966 rad pos: -17.5,6.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 26997 @@ -111240,8 +110277,6 @@ entities: - type: Transform pos: 16.5,14.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 27011 @@ -111250,8 +110285,6 @@ entities: rot: 1.5707963267948966 rad pos: 4.5,29.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 27020 @@ -111260,8 +110293,6 @@ entities: rot: 3.141592653589793 rad pos: 3.5,24.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 27021 @@ -111270,8 +110301,6 @@ entities: rot: 3.141592653589793 rad pos: 6.5,24.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 27297 @@ -111283,8 +110312,6 @@ entities: - type: DeviceNetwork deviceLists: - 7456 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - uid: 27395 @@ -111296,8 +110323,6 @@ entities: - type: DeviceNetwork deviceLists: - 7456 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#0335FCFF' - proto: GasVentScrubber @@ -111311,8 +110336,6 @@ entities: - type: DeviceNetwork deviceLists: - 7456 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 3755 @@ -111324,8 +110347,6 @@ entities: - type: DeviceNetwork deviceLists: - 7456 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 7909 @@ -111333,8 +110354,6 @@ entities: - type: Transform pos: 36.5,32.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 11508 @@ -111343,8 +110362,6 @@ entities: rot: 3.141592653589793 rad pos: 36.5,-29.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 13077 @@ -111352,8 +110369,6 @@ entities: - type: Transform pos: 51.5,25.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 13162 @@ -111362,8 +110377,6 @@ entities: rot: -1.5707963267948966 rad pos: 39.5,9.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 13163 @@ -111371,8 +110384,6 @@ entities: - type: Transform pos: 30.5,33.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 13174 @@ -111381,8 +110392,6 @@ entities: rot: -1.5707963267948966 rad pos: 35.5,26.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 13208 @@ -111390,8 +110399,6 @@ entities: - type: Transform pos: 30.5,1.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 13217 @@ -111400,8 +110407,6 @@ entities: rot: 1.5707963267948966 rad pos: 15.5,18.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 13231 @@ -111409,8 +110414,6 @@ entities: - type: Transform pos: 52.5,17.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 13332 @@ -111418,8 +110421,6 @@ entities: - type: Transform pos: -1.5,35.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 13333 @@ -111428,8 +110429,6 @@ entities: rot: -1.5707963267948966 rad pos: 13.5,32.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 13334 @@ -111438,8 +110437,6 @@ entities: rot: 3.141592653589793 rad pos: 11.5,25.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 13335 @@ -111448,8 +110445,6 @@ entities: rot: 1.5707963267948966 rad pos: 19.5,9.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 13376 @@ -111458,8 +110453,6 @@ entities: rot: 1.5707963267948966 rad pos: 23.5,-1.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 13500 @@ -111468,8 +110461,6 @@ entities: rot: -1.5707963267948966 rad pos: 37.5,1.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 13561 @@ -111478,8 +110469,6 @@ entities: rot: 3.141592653589793 rad pos: 38.5,-10.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 13576 @@ -111488,8 +110477,6 @@ entities: rot: -1.5707963267948966 rad pos: 51.5,-9.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 13577 @@ -111497,8 +110484,6 @@ entities: - type: Transform pos: 47.5,-6.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 13578 @@ -111506,8 +110491,6 @@ entities: - type: Transform pos: 42.5,-6.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 13579 @@ -111515,8 +110498,6 @@ entities: - type: Transform pos: 37.5,-6.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 13580 @@ -111525,8 +110506,6 @@ entities: rot: -1.5707963267948966 rad pos: 26.5,-8.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 13586 @@ -111535,8 +110514,6 @@ entities: rot: -1.5707963267948966 rad pos: 45.5,-16.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 13587 @@ -111545,8 +110522,6 @@ entities: rot: -1.5707963267948966 rad pos: 45.5,-12.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 13588 @@ -111555,8 +110530,6 @@ entities: rot: -1.5707963267948966 rad pos: 50.5,-20.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 13589 @@ -111565,8 +110538,6 @@ entities: rot: 3.141592653589793 rad pos: 37.5,-21.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 13595 @@ -111575,8 +110546,6 @@ entities: rot: 1.5707963267948966 rad pos: 29.5,-13.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 13596 @@ -111584,8 +110553,6 @@ entities: - type: Transform pos: 30.5,-9.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 13635 @@ -111594,8 +110561,6 @@ entities: rot: 3.141592653589793 rad pos: 47.5,-24.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 13636 @@ -111604,8 +110569,6 @@ entities: rot: 3.141592653589793 rad pos: 42.5,-24.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 13637 @@ -111614,8 +110577,6 @@ entities: rot: 3.141592653589793 rad pos: 39.5,-24.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 13638 @@ -111624,8 +110585,6 @@ entities: rot: 3.141592653589793 rad pos: 35.5,-24.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 13639 @@ -111633,8 +110592,6 @@ entities: - type: Transform pos: 37.5,-17.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 13675 @@ -111643,8 +110600,6 @@ entities: rot: 3.141592653589793 rad pos: 37.5,-13.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 13783 @@ -111653,8 +110608,6 @@ entities: rot: 3.141592653589793 rad pos: 33.5,-22.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 13866 @@ -111663,8 +110616,6 @@ entities: rot: 1.5707963267948966 rad pos: 5.5,-38.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 13867 @@ -111673,8 +110624,6 @@ entities: rot: -1.5707963267948966 rad pos: 17.5,-38.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 13868 @@ -111683,8 +110632,6 @@ entities: rot: 1.5707963267948966 rad pos: 14.5,-30.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 13870 @@ -111692,8 +110639,6 @@ entities: - type: Transform pos: 17.5,-22.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 13871 @@ -111701,8 +110646,6 @@ entities: - type: Transform pos: 19.5,-13.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 13872 @@ -111710,8 +110653,6 @@ entities: - type: Transform pos: 24.5,-22.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 13873 @@ -111720,8 +110661,6 @@ entities: rot: -1.5707963267948966 rad pos: 25.5,-30.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 13874 @@ -111730,8 +110669,6 @@ entities: rot: 3.141592653589793 rad pos: 22.5,-33.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 13875 @@ -111740,8 +110677,6 @@ entities: rot: 3.141592653589793 rad pos: 24.5,-35.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 14021 @@ -111753,8 +110688,6 @@ entities: - type: DeviceNetwork deviceLists: - 7456 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 14022 @@ -111762,8 +110695,6 @@ entities: - type: Transform pos: 75.5,-20.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 14031 @@ -111772,8 +110703,6 @@ entities: rot: 3.141592653589793 rad pos: 54.5,-29.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 14032 @@ -111781,8 +110710,6 @@ entities: - type: Transform pos: 54.5,-24.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 14041 @@ -111791,8 +110718,6 @@ entities: rot: 3.141592653589793 rad pos: 47.5,-32.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 14074 @@ -111801,8 +110726,6 @@ entities: rot: -1.5707963267948966 rad pos: 58.5,3.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 14088 @@ -111811,8 +110734,6 @@ entities: rot: 3.141592653589793 rad pos: 57.5,-10.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 14131 @@ -111821,8 +110742,6 @@ entities: rot: -1.5707963267948966 rad pos: 58.5,-20.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 14277 @@ -111831,8 +110750,6 @@ entities: rot: -1.5707963267948966 rad pos: 30.5,-37.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 14278 @@ -111841,8 +110758,6 @@ entities: rot: -1.5707963267948966 rad pos: 41.5,-33.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 14279 @@ -111851,8 +110766,6 @@ entities: rot: 3.141592653589793 rad pos: 40.5,-39.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 14316 @@ -111861,8 +110774,6 @@ entities: rot: -1.5707963267948966 rad pos: 74.5,-46.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 14324 @@ -111870,16 +110781,12 @@ entities: - type: Transform pos: 65.5,-41.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 14364 components: - type: Transform rot: -1.5707963267948966 rad pos: 32.5,-50.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 14365 @@ -111888,8 +110795,6 @@ entities: rot: 3.141592653589793 rad pos: 30.5,-61.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 14393 @@ -111897,8 +110802,6 @@ entities: - type: Transform pos: 35.5,-45.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 14394 @@ -111907,8 +110810,6 @@ entities: rot: 3.141592653589793 rad pos: 40.5,-51.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 14395 @@ -111916,8 +110817,6 @@ entities: - type: Transform pos: 53.5,-45.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 14396 @@ -111925,8 +110824,6 @@ entities: - type: Transform pos: 58.5,-40.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 14398 @@ -111934,8 +110831,6 @@ entities: - type: Transform pos: 69.5,-41.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 14473 @@ -111943,8 +110838,6 @@ entities: - type: Transform pos: -12.5,-45.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 14474 @@ -111953,8 +110846,6 @@ entities: rot: 3.141592653589793 rad pos: -12.5,-49.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 14515 @@ -111963,8 +110854,6 @@ entities: rot: 3.141592653589793 rad pos: 25.5,-43.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 14524 @@ -111973,8 +110862,6 @@ entities: rot: 3.141592653589793 rad pos: 24.5,-54.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 14525 @@ -111983,8 +110870,6 @@ entities: rot: -1.5707963267948966 rad pos: 26.5,-50.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 14526 @@ -111992,8 +110877,6 @@ entities: - type: Transform pos: 21.5,-45.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 14559 @@ -112001,8 +110884,6 @@ entities: - type: Transform pos: -9.5,-83.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 14626 @@ -112011,24 +110892,18 @@ entities: rot: 3.141592653589793 rad pos: -9.5,-86.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 14627 components: - type: Transform rot: 3.141592653589793 rad pos: -5.5,-86.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 14629 components: - type: Transform rot: 3.141592653589793 rad pos: -1.5,-78.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 14630 @@ -112037,8 +110912,6 @@ entities: rot: 3.141592653589793 rad pos: 2.5,-82.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 14631 @@ -112047,8 +110920,6 @@ entities: rot: 3.141592653589793 rad pos: 4.5,-80.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 14633 @@ -112057,8 +110928,6 @@ entities: rot: 3.141592653589793 rad pos: 7.5,-73.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 14634 @@ -112066,8 +110935,6 @@ entities: - type: Transform pos: 10.5,-62.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 14635 @@ -112076,8 +110943,6 @@ entities: rot: 3.141592653589793 rad pos: 21.5,-66.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 14643 @@ -112086,8 +110951,6 @@ entities: rot: 3.141592653589793 rad pos: 24.5,-67.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 14647 @@ -112096,8 +110959,6 @@ entities: rot: 3.141592653589793 rad pos: 17.5,-74.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 14680 @@ -112106,8 +110967,6 @@ entities: rot: -1.5707963267948966 rad pos: 37.5,-88.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 14711 @@ -112116,8 +110975,6 @@ entities: rot: -1.5707963267948966 rad pos: 27.5,-77.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 14712 @@ -112126,8 +110983,6 @@ entities: rot: 1.5707963267948966 rad pos: 24.5,-85.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 14713 @@ -112136,8 +110991,6 @@ entities: rot: -1.5707963267948966 rad pos: 29.5,-84.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 14761 @@ -112145,8 +110998,6 @@ entities: - type: Transform pos: -10.5,-42.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 14775 @@ -112154,8 +111005,6 @@ entities: - type: Transform pos: -4.5,-45.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 14805 @@ -112163,8 +111012,6 @@ entities: - type: Transform pos: 4.5,-45.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 14898 @@ -112173,8 +111020,6 @@ entities: rot: 1.5707963267948966 rad pos: 8.5,-68.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 14904 @@ -112183,8 +111028,6 @@ entities: rot: 1.5707963267948966 rad pos: 19.5,-57.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 14905 @@ -112193,8 +111036,6 @@ entities: rot: 1.5707963267948966 rad pos: 19.5,-50.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 14908 @@ -112203,8 +111044,6 @@ entities: rot: -1.5707963267948966 rad pos: 20.5,-69.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 14915 @@ -112213,8 +111052,6 @@ entities: rot: 1.5707963267948966 rad pos: -4.5,-72.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 14917 @@ -112223,8 +111060,6 @@ entities: rot: -1.5707963267948966 rad pos: 17.5,-67.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 15133 @@ -112233,8 +111068,6 @@ entities: rot: -1.5707963267948966 rad pos: 15.5,-55.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 15134 @@ -112243,8 +111076,6 @@ entities: rot: 3.141592653589793 rad pos: 9.5,-56.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 15142 @@ -112253,8 +111084,6 @@ entities: rot: 3.141592653589793 rad pos: 8.5,-59.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 15143 @@ -112263,8 +111092,6 @@ entities: rot: 3.141592653589793 rad pos: 13.5,-58.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 15161 @@ -112273,8 +111100,6 @@ entities: rot: -1.5707963267948966 rad pos: 5.5,-56.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 15163 @@ -112283,8 +111108,6 @@ entities: rot: 1.5707963267948966 rad pos: -0.5,-57.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 15168 @@ -112293,8 +111116,6 @@ entities: rot: 3.141592653589793 rad pos: 4.5,-60.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 15207 @@ -112303,8 +111124,6 @@ entities: rot: -1.5707963267948966 rad pos: 9.5,-41.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 15210 @@ -112313,8 +111132,6 @@ entities: rot: 1.5707963267948966 rad pos: -0.5,-43.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 15266 @@ -112322,8 +111139,6 @@ entities: - type: Transform pos: 3.5,-65.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 15279 @@ -112331,8 +111146,6 @@ entities: - type: Transform pos: -6.5,-49.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 15304 @@ -112344,8 +111157,6 @@ entities: - type: DeviceNetwork deviceLists: - 22089 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 15313 @@ -112353,8 +111164,6 @@ entities: - type: Transform pos: -27.5,-46.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 15317 @@ -112363,8 +111172,6 @@ entities: rot: 1.5707963267948966 rad pos: -33.5,-46.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 15320 @@ -112372,8 +111179,6 @@ entities: - type: Transform pos: -29.5,-45.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 15330 @@ -112382,8 +111187,6 @@ entities: rot: 1.5707963267948966 rad pos: -32.5,-51.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 15338 @@ -112392,8 +111195,6 @@ entities: rot: 3.141592653589793 rad pos: -29.5,-58.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 15339 @@ -112402,8 +111203,6 @@ entities: rot: -1.5707963267948966 rad pos: -27.5,-57.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 15340 @@ -112414,8 +111213,6 @@ entities: - type: DeviceNetwork deviceLists: - 22089 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 15341 @@ -112426,8 +111223,6 @@ entities: - type: DeviceNetwork deviceLists: - 22089 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 15358 @@ -112439,8 +111234,6 @@ entities: - type: DeviceNetwork deviceLists: - 22239 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 15359 @@ -112452,8 +111245,6 @@ entities: - type: DeviceNetwork deviceLists: - 22239 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 15716 @@ -112461,8 +111252,6 @@ entities: - type: Transform pos: 19.5,-1.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 15810 @@ -112471,8 +111260,6 @@ entities: rot: 3.141592653589793 rad pos: 9.5,-10.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 16024 @@ -112481,8 +111268,6 @@ entities: rot: -1.5707963267948966 rad pos: 2.5,-37.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 16144 @@ -112491,8 +111276,6 @@ entities: rot: 3.141592653589793 rad pos: 62.5,-52.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 16468 @@ -112501,8 +111284,6 @@ entities: rot: 3.141592653589793 rad pos: -20.5,-46.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 16535 @@ -112510,8 +111291,6 @@ entities: - type: Transform pos: -56.5,-39.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 16536 @@ -112520,8 +111299,6 @@ entities: rot: -1.5707963267948966 rad pos: -45.5,-39.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 16537 @@ -112530,8 +111307,6 @@ entities: rot: 1.5707963267948966 rad pos: -47.5,-37.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 16654 @@ -112539,8 +111314,6 @@ entities: - type: Transform pos: -8.5,-56.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 16655 @@ -112549,8 +111322,6 @@ entities: rot: 1.5707963267948966 rad pos: -11.5,-62.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 16656 @@ -112559,8 +111330,6 @@ entities: rot: 3.141592653589793 rad pos: -10.5,-65.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 16657 @@ -112569,8 +111338,6 @@ entities: rot: 3.141592653589793 rad pos: -6.5,-65.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 16897 @@ -112579,8 +111346,6 @@ entities: rot: 3.141592653589793 rad pos: 53.5,-43.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 17074 @@ -112589,8 +111354,6 @@ entities: rot: 1.5707963267948966 rad pos: 46.5,-42.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 17075 @@ -112599,8 +111362,6 @@ entities: rot: -1.5707963267948966 rad pos: 49.5,-43.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 17363 @@ -112609,16 +111370,12 @@ entities: rot: 3.141592653589793 rad pos: 48.5,-52.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 22267 components: - type: Transform rot: -1.5707963267948966 rad pos: 6.5,-14.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 22283 @@ -112627,8 +111384,6 @@ entities: rot: 1.5707963267948966 rad pos: 15.5,6.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 22298 @@ -112637,8 +111392,6 @@ entities: rot: -1.5707963267948966 rad pos: 22.5,-15.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 22299 @@ -112646,8 +111399,6 @@ entities: - type: Transform pos: 21.5,-13.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 22300 @@ -112656,8 +111407,6 @@ entities: rot: 3.141592653589793 rad pos: 21.5,-18.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 22323 @@ -112665,8 +111414,6 @@ entities: - type: Transform pos: 17.5,-7.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 22325 @@ -112675,8 +111422,6 @@ entities: rot: 1.5707963267948966 rad pos: 32.5,-15.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 22440 @@ -112684,8 +111429,6 @@ entities: - type: Transform pos: 10.5,-21.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 22571 @@ -112694,8 +111437,6 @@ entities: rot: 1.5707963267948966 rad pos: 6.5,29.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 22745 @@ -112704,8 +111445,6 @@ entities: rot: 3.141592653589793 rad pos: 48.5,8.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 23659 @@ -112714,8 +111453,6 @@ entities: rot: 3.141592653589793 rad pos: 3.5,-5.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 23685 @@ -112724,8 +111461,6 @@ entities: rot: 3.141592653589793 rad pos: -1.5,-5.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 23686 @@ -112734,8 +111469,6 @@ entities: rot: 1.5707963267948966 rad pos: -2.5,-1.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 23751 @@ -112744,8 +111477,6 @@ entities: rot: 3.141592653589793 rad pos: -12.5,-9.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24029 @@ -112754,8 +111485,6 @@ entities: rot: 3.141592653589793 rad pos: 35.5,-94.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24030 @@ -112764,8 +111493,6 @@ entities: rot: 3.141592653589793 rad pos: 26.5,-95.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24031 @@ -112773,8 +111500,6 @@ entities: - type: Transform pos: 26.5,-90.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24083 @@ -112783,8 +111508,6 @@ entities: rot: 3.141592653589793 rad pos: -18.5,-9.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24085 @@ -112793,8 +111516,6 @@ entities: rot: 3.141592653589793 rad pos: -20.5,-9.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24086 @@ -112803,8 +111524,6 @@ entities: rot: 1.5707963267948966 rad pos: -25.5,-10.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24134 @@ -112813,8 +111532,6 @@ entities: rot: 1.5707963267948966 rad pos: -5.5,-2.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24135 @@ -112823,8 +111540,6 @@ entities: rot: 3.141592653589793 rad pos: -4.5,-6.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24138 @@ -112833,8 +111548,6 @@ entities: rot: 1.5707963267948966 rad pos: -6.5,-5.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24144 @@ -112842,8 +111555,6 @@ entities: - type: Transform pos: -4.5,2.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24174 @@ -112852,8 +111563,6 @@ entities: rot: 3.141592653589793 rad pos: -16.5,-2.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24185 @@ -112862,8 +111571,6 @@ entities: rot: 1.5707963267948966 rad pos: -12.5,-3.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24196 @@ -112872,8 +111579,6 @@ entities: rot: 3.141592653589793 rad pos: -19.5,-5.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24199 @@ -112882,8 +111587,6 @@ entities: rot: 3.141592653589793 rad pos: -23.5,-5.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24287 @@ -112892,8 +111595,6 @@ entities: rot: -1.5707963267948966 rad pos: -39.5,-9.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24288 @@ -112902,8 +111603,6 @@ entities: rot: 1.5707963267948966 rad pos: -41.5,-6.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24289 @@ -112911,8 +111610,6 @@ entities: - type: Transform pos: -40.5,-4.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24295 @@ -112921,8 +111618,6 @@ entities: rot: 1.5707963267948966 rad pos: -32.5,-12.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24296 @@ -112931,8 +111626,6 @@ entities: rot: 1.5707963267948966 rad pos: -32.5,-8.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24297 @@ -112940,8 +111633,6 @@ entities: - type: Transform pos: -31.5,-5.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24348 @@ -112950,8 +111641,6 @@ entities: rot: -1.5707963267948966 rad pos: -30.5,9.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24349 @@ -112960,8 +111649,6 @@ entities: rot: -1.5707963267948966 rad pos: -30.5,6.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24350 @@ -112970,8 +111657,6 @@ entities: rot: -1.5707963267948966 rad pos: -29.5,1.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24351 @@ -112979,8 +111664,6 @@ entities: - type: Transform pos: -36.5,7.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24383 @@ -112988,8 +111671,6 @@ entities: - type: Transform pos: -36.5,-0.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24399 @@ -112997,8 +111678,6 @@ entities: - type: Transform pos: -48.5,-0.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24400 @@ -113006,8 +111685,6 @@ entities: - type: Transform pos: -46.5,-0.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24401 @@ -113015,8 +111692,6 @@ entities: - type: Transform pos: -44.5,-0.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24402 @@ -113024,8 +111699,6 @@ entities: - type: Transform pos: -41.5,-0.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24417 @@ -113034,8 +111707,6 @@ entities: rot: -1.5707963267948966 rad pos: -42.5,7.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24418 @@ -113043,8 +111714,6 @@ entities: - type: Transform pos: -44.5,8.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24420 @@ -113053,8 +111722,6 @@ entities: rot: 1.5707963267948966 rad pos: -45.5,5.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24450 @@ -113062,8 +111729,6 @@ entities: - type: Transform pos: -36.5,-5.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24478 @@ -113072,8 +111737,6 @@ entities: rot: -1.5707963267948966 rad pos: -13.5,-39.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24697 @@ -113082,8 +111745,6 @@ entities: rot: 3.141592653589793 rad pos: -71.5,0.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24698 @@ -113092,8 +111753,6 @@ entities: rot: 3.141592653589793 rad pos: -67.5,0.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24699 @@ -113102,8 +111761,6 @@ entities: rot: 1.5707963267948966 rad pos: -66.5,-2.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24700 @@ -113112,8 +111769,6 @@ entities: rot: -1.5707963267948966 rad pos: -63.5,-2.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24701 @@ -113122,8 +111777,6 @@ entities: rot: 3.141592653589793 rad pos: -64.5,-6.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24702 @@ -113132,8 +111785,6 @@ entities: rot: 3.141592653589793 rad pos: -60.5,-0.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24703 @@ -113142,8 +111793,6 @@ entities: rot: 1.5707963267948966 rad pos: -66.5,5.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24704 @@ -113151,8 +111800,6 @@ entities: - type: Transform pos: -64.5,12.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24828 @@ -113161,8 +111808,6 @@ entities: rot: -1.5707963267948966 rad pos: -34.5,-22.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24829 @@ -113170,8 +111815,6 @@ entities: - type: Transform pos: -36.5,-17.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24836 @@ -113180,8 +111823,6 @@ entities: rot: -1.5707963267948966 rad pos: -37.5,-24.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24838 @@ -113189,8 +111830,6 @@ entities: - type: Transform pos: -39.5,-26.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24839 @@ -113199,8 +111838,6 @@ entities: rot: 1.5707963267948966 rad pos: -43.5,-29.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24880 @@ -113209,8 +111846,6 @@ entities: rot: 3.141592653589793 rad pos: -38.5,-38.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24907 @@ -113219,8 +111854,6 @@ entities: rot: -1.5707963267948966 rad pos: -25.5,-37.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24908 @@ -113229,8 +111862,6 @@ entities: rot: 3.141592653589793 rad pos: -27.5,-39.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24909 @@ -113239,8 +111870,6 @@ entities: rot: 3.141592653589793 rad pos: -31.5,-39.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24966 @@ -113249,8 +111878,6 @@ entities: rot: -1.5707963267948966 rad pos: -1.5,-32.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24967 @@ -113258,8 +111885,6 @@ entities: - type: Transform pos: -4.5,-31.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24970 @@ -113268,8 +111893,6 @@ entities: rot: -1.5707963267948966 rad pos: 3.5,-26.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24988 @@ -113278,8 +111901,6 @@ entities: rot: 3.141592653589793 rad pos: -1.5,-27.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 24991 @@ -113288,8 +111909,6 @@ entities: rot: 3.141592653589793 rad pos: -18.5,-35.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 25002 @@ -113297,8 +111916,6 @@ entities: - type: Transform pos: -18.5,-30.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 25017 @@ -113307,8 +111924,6 @@ entities: rot: 3.141592653589793 rad pos: -23.5,-29.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 25018 @@ -113317,8 +111932,6 @@ entities: rot: 1.5707963267948966 rad pos: -29.5,-30.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 25019 @@ -113327,8 +111940,6 @@ entities: rot: 1.5707963267948966 rad pos: -29.5,-27.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 25020 @@ -113336,8 +111947,6 @@ entities: - type: Transform pos: -23.5,-18.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 25028 @@ -113345,8 +111954,6 @@ entities: - type: Transform pos: -12.5,-25.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 25076 @@ -113354,8 +111961,6 @@ entities: - type: Transform pos: -0.5,-22.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 25135 @@ -113363,8 +111968,6 @@ entities: - type: Transform pos: -27.5,-25.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 25147 @@ -113372,8 +111975,6 @@ entities: - type: Transform pos: -1.5,-17.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 25148 @@ -113381,8 +111982,6 @@ entities: - type: Transform pos: -10.5,-14.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 25184 @@ -113390,8 +111989,6 @@ entities: - type: Transform pos: -18.5,-19.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 25425 @@ -113400,8 +111997,6 @@ entities: rot: 1.5707963267948966 rad pos: -53.5,-9.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 25426 @@ -113410,8 +112005,6 @@ entities: rot: 3.141592653589793 rad pos: -52.5,-12.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 25608 @@ -113419,8 +112012,6 @@ entities: - type: Transform pos: 1.5,-70.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 26049 @@ -113429,8 +112020,6 @@ entities: rot: 1.5707963267948966 rad pos: 61.5,26.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 26051 @@ -113439,8 +112028,6 @@ entities: rot: 3.141592653589793 rad pos: 60.5,18.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 26130 @@ -113449,8 +112036,6 @@ entities: rot: 1.5707963267948966 rad pos: 68.5,7.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 26131 @@ -113459,8 +112044,6 @@ entities: rot: 3.141592653589793 rad pos: 73.5,6.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 26136 @@ -113469,8 +112052,6 @@ entities: rot: 3.141592653589793 rad pos: 66.5,17.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 26143 @@ -113479,8 +112060,6 @@ entities: rot: 3.141592653589793 rad pos: 63.5,11.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 26145 @@ -113489,8 +112068,6 @@ entities: rot: -1.5707963267948966 rad pos: 45.5,17.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 26199 @@ -113499,8 +112076,6 @@ entities: rot: 1.5707963267948966 rad pos: 11.5,20.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 26226 @@ -113508,8 +112083,6 @@ entities: - type: Transform pos: 61.5,8.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 26227 @@ -113517,8 +112090,6 @@ entities: - type: Transform pos: 54.5,8.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 26228 @@ -113527,8 +112098,6 @@ entities: rot: 3.141592653589793 rad pos: 51.5,6.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 26254 @@ -113537,8 +112106,6 @@ entities: rot: 1.5707963267948966 rad pos: 18.5,14.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 26275 @@ -113547,8 +112114,6 @@ entities: rot: -1.5707963267948966 rad pos: 33.5,17.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 26308 @@ -113557,8 +112122,6 @@ entities: rot: -1.5707963267948966 rad pos: 23.5,19.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 26316 @@ -113566,8 +112129,6 @@ entities: - type: Transform pos: 22.5,27.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 26318 @@ -113575,8 +112136,6 @@ entities: - type: Transform pos: 19.5,25.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 26329 @@ -113585,8 +112144,6 @@ entities: rot: 3.141592653589793 rad pos: 7.5,24.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 26336 @@ -113595,8 +112152,6 @@ entities: rot: 3.141592653589793 rad pos: 4.5,24.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 26824 @@ -113605,8 +112160,6 @@ entities: rot: -1.5707963267948966 rad pos: -17.5,4.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 26825 @@ -113615,8 +112168,6 @@ entities: rot: 1.5707963267948966 rad pos: -25.5,2.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 26826 @@ -113625,8 +112176,6 @@ entities: rot: 1.5707963267948966 rad pos: -25.5,5.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 26827 @@ -113635,8 +112184,6 @@ entities: rot: 1.5707963267948966 rad pos: -25.5,8.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 26916 @@ -113645,8 +112192,6 @@ entities: rot: 3.141592653589793 rad pos: 12.5,-24.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - uid: 27396 @@ -113658,8 +112203,6 @@ entities: - type: DeviceNetwork deviceLists: - 7456 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF1212FF' - proto: GasVolumePump @@ -113670,8 +112213,6 @@ entities: rot: 1.5707963267948966 rad pos: 63.5,29.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF5500FF' - uid: 13366 @@ -113680,8 +112221,6 @@ entities: rot: 3.141592653589793 rad pos: 62.5,34.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#00FFFFFF' - proto: Gauze @@ -114125,6 +112664,12 @@ entities: - type: Transform pos: 69.5,6.5 parent: 6747 + - uid: 880 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 84.5,-34.5 + parent: 6747 - uid: 932 components: - type: Transform @@ -114315,6 +112860,12 @@ entities: - type: Transform pos: 8.5,26.5 parent: 6747 + - uid: 1092 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 84.5,-37.5 + parent: 6747 - uid: 1105 components: - type: Transform @@ -115570,6 +114121,12 @@ entities: - type: Transform pos: -5.5,-72.5 parent: 6747 + - uid: 4508 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 85.5,-34.5 + parent: 6747 - uid: 4525 components: - type: Transform @@ -115970,11 +114527,6 @@ entities: - type: Transform pos: 39.5,-48.5 parent: 6747 - - uid: 5968 - components: - - type: Transform - pos: 77.5,-18.5 - parent: 6747 - uid: 5969 components: - type: Transform @@ -115995,25 +114547,17 @@ entities: - type: Transform pos: 76.5,-31.5 parent: 6747 - - uid: 5978 - components: - - type: Transform - pos: 76.5,-30.5 - parent: 6747 - - uid: 5979 - components: - - type: Transform - pos: 77.5,-20.5 - parent: 6747 - uid: 5994 components: - type: Transform - pos: 77.5,-23.5 + rot: -1.5707963267948966 rad + pos: 85.5,-37.5 parent: 6747 - - uid: 5996 + - uid: 6002 components: - type: Transform - pos: 77.5,-25.5 + rot: -1.5707963267948966 rad + pos: 82.5,-34.5 parent: 6747 - uid: 6006 components: @@ -116108,7 +114652,8 @@ entities: - uid: 6072 components: - type: Transform - pos: 76.5,-29.5 + rot: -1.5707963267948966 rad + pos: 82.5,-37.5 parent: 6747 - uid: 6103 components: @@ -119680,6 +118225,294 @@ entities: - type: Transform pos: -19.5,-56.5 parent: 6747 + - uid: 27642 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 89.5,-23.5 + parent: 6747 + - uid: 27646 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 87.5,-37.5 + parent: 6747 + - uid: 27647 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 88.5,-37.5 + parent: 6747 + - uid: 27648 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 89.5,-35.5 + parent: 6747 + - uid: 27649 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 89.5,-34.5 + parent: 6747 + - uid: 27650 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 89.5,-32.5 + parent: 6747 + - uid: 27651 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 89.5,-31.5 + parent: 6747 + - uid: 27652 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 89.5,-29.5 + parent: 6747 + - uid: 27653 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 89.5,-28.5 + parent: 6747 + - uid: 27654 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 89.5,-26.5 + parent: 6747 + - uid: 27655 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 89.5,-25.5 + parent: 6747 + - uid: 27656 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 89.5,-22.5 + parent: 6747 + - uid: 27657 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 89.5,-20.5 + parent: 6747 + - uid: 27658 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 89.5,-19.5 + parent: 6747 + - uid: 27659 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 88.5,-17.5 + parent: 6747 + - uid: 27660 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 87.5,-17.5 + parent: 6747 + - uid: 27667 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 76.5,-23.5 + parent: 6747 + - uid: 27668 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 76.5,-20.5 + parent: 6747 + - uid: 27669 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 86.5,-20.5 + parent: 6747 + - uid: 27670 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 86.5,-21.5 + parent: 6747 + - uid: 27671 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 86.5,-22.5 + parent: 6747 + - uid: 27672 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 86.5,-23.5 + parent: 6747 + - uid: 27680 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 86.5,-32.5 + parent: 6747 + - uid: 27681 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 86.5,-31.5 + parent: 6747 + - uid: 27682 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 86.5,-28.5 + parent: 6747 + - uid: 27683 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 86.5,-27.5 + parent: 6747 + - uid: 27746 + components: + - type: Transform + pos: 98.5,-25.5 + parent: 6747 + - uid: 27747 + components: + - type: Transform + pos: 98.5,-26.5 + parent: 6747 + - uid: 27748 + components: + - type: Transform + pos: 98.5,-27.5 + parent: 6747 + - uid: 27749 + components: + - type: Transform + pos: 98.5,-28.5 + parent: 6747 + - uid: 27750 + components: + - type: Transform + pos: 98.5,-30.5 + parent: 6747 + - uid: 27751 + components: + - type: Transform + pos: 98.5,-31.5 + parent: 6747 + - uid: 27752 + components: + - type: Transform + pos: 98.5,-32.5 + parent: 6747 + - uid: 27753 + components: + - type: Transform + pos: 98.5,-33.5 + parent: 6747 + - uid: 27754 + components: + - type: Transform + pos: 98.5,-35.5 + parent: 6747 + - uid: 27755 + components: + - type: Transform + pos: 98.5,-36.5 + parent: 6747 + - uid: 27756 + components: + - type: Transform + pos: 98.5,-37.5 + parent: 6747 + - uid: 27757 + components: + - type: Transform + pos: 98.5,-38.5 + parent: 6747 + - uid: 27792 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 97.5,-39.5 + parent: 6747 + - uid: 27793 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 97.5,-40.5 + parent: 6747 + - uid: 27794 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 96.5,-40.5 + parent: 6747 + - uid: 27795 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 95.5,-41.5 + parent: 6747 + - uid: 27796 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 94.5,-41.5 + parent: 6747 + - uid: 27797 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 93.5,-42.5 + parent: 6747 + - uid: 27798 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 92.5,-42.5 + parent: 6747 + - uid: 27799 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 91.5,-41.5 + parent: 6747 + - uid: 27800 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 90.5,-41.5 + parent: 6747 + - uid: 27801 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 89.5,-40.5 + parent: 6747 + - uid: 27802 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 89.5,-39.5 + parent: 6747 + - uid: 27803 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 89.5,-38.5 + parent: 6747 - proto: GrilleBroken entities: - uid: 9970 @@ -120250,8 +119083,6 @@ entities: rot: 1.5707963267948966 rad pos: 66.5,30.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF5500FF' - uid: 13089 @@ -120260,8 +119091,6 @@ entities: rot: 1.5707963267948966 rad pos: 67.5,31.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF5500FF' - uid: 13090 @@ -120270,8 +119099,6 @@ entities: rot: 1.5707963267948966 rad pos: 67.5,32.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF5500FF' - uid: 13091 @@ -120280,8 +119107,6 @@ entities: rot: 1.5707963267948966 rad pos: 66.5,33.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#FF5500FF' - uid: 13318 @@ -120290,8 +119115,6 @@ entities: rot: -1.5707963267948966 rad pos: 62.5,42.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#00FFFFFF' - uid: 13319 @@ -120300,8 +119123,6 @@ entities: rot: -1.5707963267948966 rad pos: 62.5,40.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#00FFFFFF' - uid: 13320 @@ -120310,8 +119131,6 @@ entities: rot: -1.5707963267948966 rad pos: 62.5,39.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - type: AtmosPipeColor color: '#00FFFFFF' - proto: HelicopterInstrument @@ -121052,7 +119871,6 @@ entities: solutions: beaker: temperature: 293.15 - canMix: True canReact: True maxVol: 200 name: null @@ -121334,7 +120152,6 @@ entities: solutions: tank: temperature: 293.15 - canMix: False canReact: True maxVol: 1500 name: null @@ -121509,7 +120326,6 @@ entities: solutions: beaker: temperature: 293.15 - canMix: True canReact: True maxVol: 100 name: null @@ -125209,78 +124025,56 @@ entities: - type: Transform pos: 8.5,-73.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 5108 components: - type: Transform pos: 30.5,-74.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 5315 components: - type: Transform pos: 49.5,-32.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 7756 components: - type: Transform pos: 38.5,42.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 7878 components: - type: Transform pos: -35.5,-57.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 8183 components: - type: Transform pos: 33.5,34.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 10992 components: - type: Transform pos: 50.5,-39.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 11190 components: - type: Transform pos: 41.5,-80.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 11353 components: - type: Transform pos: 52.5,-1.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 15935 components: - type: Transform pos: 8.5,-6.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 25414 components: - type: Transform pos: -51.5,-13.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - proto: NitrogenTankFilled entities: - uid: 1301 @@ -125344,15 +124138,11 @@ entities: - type: Transform pos: 42.5,42.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 8189 components: - type: Transform pos: 32.5,30.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - proto: NitrousOxideTank entities: - uid: 7877 @@ -125440,7 +124230,7 @@ entities: - type: Transform pos: 3.5,-69.5 parent: 6747 -- proto: Oracle +- proto: OracleSpawner entities: - uid: 8917 components: @@ -125491,92 +124281,66 @@ entities: - type: Transform pos: 0.5,12.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 5069 components: - type: Transform pos: 9.5,-73.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 5093 components: - type: Transform pos: 31.5,-74.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 5314 components: - type: Transform pos: 49.5,-31.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 7786 components: - type: Transform pos: 36.5,42.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 8180 components: - type: Transform pos: 32.5,35.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 8181 components: - type: Transform pos: 33.5,35.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 10130 components: - type: Transform pos: -49.5,-69.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 11340 components: - type: Transform pos: 4.5,4.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 11356 components: - type: Transform pos: 53.5,-15.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 11378 components: - type: Transform pos: 43.5,-37.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 11409 components: - type: Transform pos: -35.5,-58.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 25415 components: - type: Transform pos: -52.5,-13.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - proto: OxygenTankFilled entities: - uid: 11534 @@ -130299,7 +129063,6 @@ entities: solutions: food: temperature: 293.15 - canMix: False canReact: True maxVol: 25 name: null @@ -130317,7 +129080,6 @@ entities: solutions: food: temperature: 293.15 - canMix: False canReact: True maxVol: 25 name: null @@ -130335,7 +129097,6 @@ entities: solutions: food: temperature: 293.15 - canMix: False canReact: True maxVol: 25 name: null @@ -130353,7 +129114,6 @@ entities: solutions: food: temperature: 293.15 - canMix: False canReact: True maxVol: 25 name: null @@ -130371,7 +129131,6 @@ entities: solutions: food: temperature: 293.15 - canMix: False canReact: True maxVol: 25 name: null @@ -130467,8 +129226,6 @@ entities: - type: Transform pos: 59.5,25.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - proto: PlasmaOre1 entities: - uid: 25553 @@ -134084,32 +132841,32 @@ entities: rot: 1.5707963267948966 rad pos: 57.5,-34.5 parent: 6747 -- proto: PoweredLightBlueInterior - entities: - - uid: 2197 + - uid: 27673 components: - type: Transform rot: 1.5707963267948966 rad - pos: 77.5,-33.5 + pos: 87.5,-23.5 parent: 6747 - - type: ApcPowerReceiver - powerLoad: 0 - - uid: 4218 + - uid: 27789 components: - type: Transform rot: 1.5707963267948966 rad - pos: 77.5,-17.5 + pos: 87.5,-31.5 parent: 6747 - - type: ApcPowerReceiver - powerLoad: 0 - - uid: 4508 + - uid: 27790 components: - type: Transform - rot: 3.141592653589793 rad - pos: 76.5,-16.5 + rot: 1.5707963267948966 rad + pos: 90.5,-33.5 parent: 6747 - - type: ApcPowerReceiver - powerLoad: 0 + - uid: 27791 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 90.5,-21.5 + parent: 6747 +- proto: PoweredLightBlueInterior + entities: - uid: 4509 components: - type: Transform @@ -134259,14 +133016,6 @@ entities: parent: 6747 - type: ApcPowerReceiver powerLoad: 0 - - uid: 11804 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 77.5,-26.5 - parent: 6747 - - type: ApcPowerReceiver - powerLoad: 0 - uid: 11805 components: - type: Transform @@ -134483,6 +133232,23 @@ entities: rot: 1.5707963267948966 rad pos: -77.5,3.5 parent: 6747 + - uid: 27684 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 79.5,-33.5 + parent: 6747 + - uid: 27685 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 83.5,-33.5 + parent: 6747 + - uid: 27686 + components: + - type: Transform + pos: 83.5,-38.5 + parent: 6747 - proto: PoweredLightColoredBlack entities: - uid: 6279 @@ -135753,7 +134519,6 @@ entities: solutions: puddle: temperature: 293.15 - canMix: False canReact: True maxVol: 1000 name: null @@ -135772,7 +134537,6 @@ entities: solutions: puddle: temperature: 293.15 - canMix: False canReact: True maxVol: 1000 name: null @@ -135801,7 +134565,6 @@ entities: solutions: puddle: temperature: 293.15 - canMix: False canReact: True maxVol: 1000 name: null @@ -135822,7 +134585,6 @@ entities: solutions: puddle: temperature: 293.15 - canMix: False canReact: True maxVol: 1000 name: null @@ -137220,6 +135982,123 @@ entities: - type: Transform pos: 79.5,16.5 parent: 6747 + - uid: 27690 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 76.5,-16.5 + parent: 6747 + - uid: 27691 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 76.5,-15.5 + parent: 6747 + - uid: 27698 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 86.5,-16.5 + parent: 6747 + - uid: 27699 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 86.5,-15.5 + parent: 6747 + - uid: 27700 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 84.5,-12.5 + parent: 6747 + - uid: 27701 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 78.5,-12.5 + parent: 6747 + - uid: 27702 + components: + - type: Transform + pos: 80.5,-10.5 + parent: 6747 + - uid: 27703 + components: + - type: Transform + pos: 81.5,-10.5 + parent: 6747 + - uid: 27704 + components: + - type: Transform + pos: 82.5,-10.5 + parent: 6747 + - uid: 27715 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 78.5,-30.5 + parent: 6747 + - uid: 27716 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 79.5,-30.5 + parent: 6747 + - uid: 27717 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 80.5,-30.5 + parent: 6747 + - uid: 27718 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 82.5,-30.5 + parent: 6747 + - uid: 27719 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 81.5,-30.5 + parent: 6747 + - uid: 27720 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 83.5,-30.5 + parent: 6747 + - uid: 27721 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 84.5,-30.5 + parent: 6747 + - uid: 27808 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 93.5,-29.5 + parent: 6747 + - uid: 27811 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 92.5,-30.5 + parent: 6747 + - uid: 27815 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 92.5,-29.5 + parent: 6747 + - uid: 27817 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 92.5,-28.5 + parent: 6747 - proto: RailingCorner entities: - uid: 379 @@ -137334,6 +136213,51 @@ entities: - type: Transform pos: 80.5,16.5 parent: 6747 + - uid: 27692 + components: + - type: Transform + pos: 78.5,-13.5 + parent: 6747 + - uid: 27693 + components: + - type: Transform + pos: 77.5,-14.5 + parent: 6747 + - uid: 27694 + components: + - type: Transform + pos: 79.5,-11.5 + parent: 6747 + - uid: 27695 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 83.5,-11.5 + parent: 6747 + - uid: 27696 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 84.5,-13.5 + parent: 6747 + - uid: 27697 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 85.5,-14.5 + parent: 6747 + - uid: 27713 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 77.5,-29.5 + parent: 6747 + - uid: 27714 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 85.5,-29.5 + parent: 6747 - proto: RailingCornerSmall entities: - uid: 9019 @@ -137382,6 +136306,76 @@ entities: rot: 1.5707963267948966 rad pos: 29.5,-42.5 parent: 6747 + - uid: 27705 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 76.5,-14.5 + parent: 6747 + - uid: 27706 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 77.5,-13.5 + parent: 6747 + - uid: 27707 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 78.5,-11.5 + parent: 6747 + - uid: 27708 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 79.5,-10.5 + parent: 6747 + - uid: 27709 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 83.5,-10.5 + parent: 6747 + - uid: 27710 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 84.5,-11.5 + parent: 6747 + - uid: 27711 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 85.5,-13.5 + parent: 6747 + - uid: 27712 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 86.5,-14.5 + parent: 6747 + - uid: 27722 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 77.5,-30.5 + parent: 6747 + - uid: 27723 + components: + - type: Transform + pos: 85.5,-30.5 + parent: 6747 + - uid: 27809 + components: + - type: Transform + pos: 92.5,-31.5 + parent: 6747 + - uid: 27816 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 92.5,-27.5 + parent: 6747 - proto: RandomAnimalSpawner entities: - uid: 1707 @@ -143095,6 +142089,45 @@ entities: - type: Transform pos: 98.5,-24.5 parent: 6747 + - uid: 27758 + components: + - type: Transform + pos: 98.5,-29.5 + parent: 6747 + - uid: 27759 + components: + - type: Transform + pos: 98.5,-34.5 + parent: 6747 + - uid: 27760 + components: + - type: Transform + pos: 98.5,-39.5 + parent: 6747 + - uid: 27804 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 95.5,-40.5 + parent: 6747 + - uid: 27805 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 94.5,-42.5 + parent: 6747 + - uid: 27806 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 91.5,-42.5 + parent: 6747 + - uid: 27807 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 89.5,-41.5 + parent: 6747 - proto: ReinforcedPlasmaWindow entities: - uid: 887 @@ -143534,6 +142567,12 @@ entities: - type: Transform pos: -32.5,-38.5 parent: 6747 + - uid: 548 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 89.5,-26.5 + parent: 6747 - uid: 591 components: - type: Transform @@ -143589,6 +142628,12 @@ entities: - type: Transform pos: 42.5,10.5 parent: 6747 + - uid: 928 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 82.5,-34.5 + parent: 6747 - uid: 981 components: - type: Transform @@ -144262,7 +143307,8 @@ entities: - uid: 3387 components: - type: Transform - pos: 77.5,-20.5 + rot: -1.5707963267948966 rad + pos: 84.5,-34.5 parent: 6747 - uid: 3450 components: @@ -144529,11 +143575,6 @@ entities: - type: Transform pos: 76.5,-22.5 parent: 6747 - - uid: 5894 - components: - - type: Transform - pos: 77.5,-18.5 - parent: 6747 - uid: 5905 components: - type: Transform @@ -144569,10 +143610,17 @@ entities: - type: Transform pos: 78.5,-37.5 parent: 6747 - - uid: 5990 + - uid: 5973 components: - type: Transform - pos: 77.5,-23.5 + rot: -1.5707963267948966 rad + pos: 76.5,-20.5 + parent: 6747 + - uid: 5979 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 86.5,-21.5 parent: 6747 - uid: 5991 components: @@ -144584,16 +143632,6 @@ entities: - type: Transform pos: 76.5,-27.5 parent: 6747 - - uid: 5995 - components: - - type: Transform - pos: 76.5,-30.5 - parent: 6747 - - uid: 5997 - components: - - type: Transform - pos: 77.5,-25.5 - parent: 6747 - uid: 6024 components: - type: Transform @@ -144602,7 +143640,8 @@ entities: - uid: 6030 components: - type: Transform - pos: 76.5,-29.5 + rot: -1.5707963267948966 rad + pos: 88.5,-37.5 parent: 6747 - uid: 6037 components: @@ -144834,6 +143873,12 @@ entities: - type: Transform pos: 76.5,-31.5 parent: 6747 + - uid: 6198 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 85.5,-37.5 + parent: 6747 - uid: 6201 components: - type: Transform @@ -144984,6 +144029,12 @@ entities: - type: Transform pos: 57.5,-26.5 parent: 6747 + - uid: 6443 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 85.5,-34.5 + parent: 6747 - uid: 6457 components: - type: Transform @@ -145059,6 +144110,36 @@ entities: - type: Transform pos: 67.5,-38.5 parent: 6747 + - uid: 6538 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 87.5,-37.5 + parent: 6747 + - uid: 6541 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 86.5,-20.5 + parent: 6747 + - uid: 6542 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 76.5,-23.5 + parent: 6747 + - uid: 6566 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 84.5,-37.5 + parent: 6747 + - uid: 6583 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 89.5,-29.5 + parent: 6747 - uid: 6592 components: - type: Transform @@ -145304,6 +144385,12 @@ entities: - type: Transform pos: 64.5,21.5 parent: 6747 + - uid: 8311 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 82.5,-37.5 + parent: 6747 - uid: 8316 components: - type: Transform @@ -146314,6 +145401,114 @@ entities: - type: Transform pos: -19.5,-56.5 parent: 6747 + - uid: 27624 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 89.5,-35.5 + parent: 6747 + - uid: 27625 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 89.5,-34.5 + parent: 6747 + - uid: 27627 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 89.5,-32.5 + parent: 6747 + - uid: 27628 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 89.5,-31.5 + parent: 6747 + - uid: 27630 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 89.5,-28.5 + parent: 6747 + - uid: 27632 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 89.5,-25.5 + parent: 6747 + - uid: 27634 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 89.5,-23.5 + parent: 6747 + - uid: 27635 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 89.5,-22.5 + parent: 6747 + - uid: 27637 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 89.5,-20.5 + parent: 6747 + - uid: 27638 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 89.5,-19.5 + parent: 6747 + - uid: 27640 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 88.5,-17.5 + parent: 6747 + - uid: 27641 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 87.5,-17.5 + parent: 6747 + - uid: 27663 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 86.5,-22.5 + parent: 6747 + - uid: 27664 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 86.5,-23.5 + parent: 6747 + - uid: 27676 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 86.5,-27.5 + parent: 6747 + - uid: 27677 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 86.5,-28.5 + parent: 6747 + - uid: 27678 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 86.5,-31.5 + parent: 6747 + - uid: 27679 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 86.5,-32.5 + parent: 6747 - proto: RemoteSignaller entities: - uid: 1379 @@ -149825,18 +149020,6 @@ entities: rot: 3.141592653589793 rad pos: 4.5,12.5 parent: 6747 - - uid: 6566 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 76.5,-20.5 - parent: 6747 - - uid: 6583 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 76.5,-23.5 - parent: 6747 - uid: 18891 components: - type: Transform @@ -151249,7 +150432,7 @@ entities: - type: Transform pos: 103.5,18.5 parent: 6747 -- proto: SophicScribe +- proto: SophicScribeSpawner entities: - uid: 8916 components: @@ -151386,6 +150569,8 @@ entities: - type: Transform pos: 28.5,-13.5 parent: 6747 + - type: SpamEmitSound + enabled: False - proto: SpaceVillainArcadeFilled entities: - uid: 12178 @@ -151394,6 +150579,8 @@ entities: rot: 1.5707963267948966 rad pos: -39.5,-36.5 parent: 6747 + - type: SpamEmitSound + enabled: False - proto: SpareIdCabinetFilled entities: - uid: 27349 @@ -152785,99 +151972,71 @@ entities: - type: Transform pos: 22.5,-59.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 4418 components: - type: Transform pos: 22.5,-60.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 7669 components: - type: Transform pos: 61.5,25.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 7788 components: - type: Transform pos: 44.5,42.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 7789 components: - type: Transform pos: 46.5,42.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 8186 components: - type: Transform pos: 32.5,32.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 8187 components: - type: Transform pos: 33.5,32.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 8191 components: - type: Transform pos: 33.5,30.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 11259 components: - type: Transform pos: 4.5,-91.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 11355 components: - type: Transform pos: 53.5,-18.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 15857 components: - type: Transform pos: -50.5,-5.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 15858 components: - type: Transform pos: -49.5,-5.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 16210 components: - type: Transform pos: 10.5,-20.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 26917 components: - type: Transform pos: 10.5,-19.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - proto: StrangePill entities: - uid: 20202 @@ -155148,6 +154307,14 @@ entities: - type: Transform pos: -51.5,7.5 parent: 6747 +- proto: TableFancyBlack + entities: + - uid: 27812 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 93.5,-29.5 + parent: 6747 - proto: TableFancyBlue entities: - uid: 10932 @@ -157354,8 +156521,6 @@ entities: rot: 3.141592653589793 rad pos: 61.5,32.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - proto: TegCirculator entities: - uid: 13000 @@ -160221,6 +159386,12 @@ entities: - type: Transform pos: 10.5,23.5 parent: 6747 + - uid: 1081 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 86.5,-17.5 + parent: 6747 - uid: 1085 components: - type: Transform @@ -161246,6 +160417,12 @@ entities: - type: Transform pos: 21.5,-36.5 parent: 6747 + - uid: 2197 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 83.5,-37.5 + parent: 6747 - uid: 2198 components: - type: Transform @@ -164241,11 +163418,6 @@ entities: - type: Transform pos: 56.5,-38.5 parent: 6747 - - uid: 5881 - components: - - type: Transform - pos: 78.5,-23.5 - parent: 6747 - uid: 5882 components: - type: Transform @@ -164271,10 +163443,11 @@ entities: - type: Transform pos: 76.5,-17.5 parent: 6747 - - uid: 5899 + - uid: 5889 components: - type: Transform - pos: 78.5,-18.5 + rot: -1.5707963267948966 rad + pos: 86.5,-37.5 parent: 6747 - uid: 5907 components: @@ -164331,30 +163504,29 @@ entities: - type: Transform pos: 76.5,-38.5 parent: 6747 - - uid: 5980 + - uid: 5982 components: - type: Transform - pos: 78.5,-25.5 + rot: -1.5707963267948966 rad + pos: 76.5,-29.5 parent: 6747 - uid: 5988 components: - type: Transform - pos: 76.5,-20.5 - parent: 6747 - - uid: 5999 - components: - - type: Transform - pos: 76.5,-23.5 + rot: -1.5707963267948966 rad + pos: 86.5,-34.5 parent: 6747 - - uid: 6001 + - uid: 5990 components: - type: Transform - pos: 78.5,-20.5 + rot: -1.5707963267948966 rad + pos: 83.5,-34.5 parent: 6747 - - uid: 6002 + - uid: 5995 components: - type: Transform - pos: 76.5,-18.5 + rot: -1.5707963267948966 rad + pos: 76.5,-30.5 parent: 6747 - uid: 6015 components: @@ -164424,17 +163596,19 @@ entities: - uid: 6169 components: - type: Transform - pos: 82.5,-37.5 + rot: -1.5707963267948966 rad + pos: 86.5,-30.5 parent: 6747 - uid: 6170 components: - type: Transform pos: 79.5,-37.5 parent: 6747 - - uid: 6173 + - uid: 6196 components: - type: Transform - pos: 76.5,-25.5 + rot: -1.5707963267948966 rad + pos: 86.5,-33.5 parent: 6747 - uid: 6341 components: @@ -167111,11 +166285,6 @@ entities: - type: Transform pos: -12.5,-89.5 parent: 6747 - - uid: 11803 - components: - - type: Transform - pos: 82.5,-34.5 - parent: 6747 - uid: 11818 components: - type: Transform @@ -168541,6 +167710,96 @@ entities: - type: Transform pos: -43.5,15.5 parent: 6747 + - uid: 27626 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 89.5,-33.5 + parent: 6747 + - uid: 27629 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 89.5,-30.5 + parent: 6747 + - uid: 27631 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 89.5,-27.5 + parent: 6747 + - uid: 27633 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 89.5,-24.5 + parent: 6747 + - uid: 27636 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 89.5,-21.5 + parent: 6747 + - uid: 27639 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 89.5,-17.5 + parent: 6747 + - uid: 27643 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 89.5,-18.5 + parent: 6747 + - uid: 27644 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 89.5,-36.5 + parent: 6747 + - uid: 27645 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 89.5,-37.5 + parent: 6747 + - uid: 27661 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 76.5,-24.5 + parent: 6747 + - uid: 27662 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 76.5,-19.5 + parent: 6747 + - uid: 27665 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 86.5,-19.5 + parent: 6747 + - uid: 27666 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 86.5,-24.5 + parent: 6747 + - uid: 27674 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 86.5,-29.5 + parent: 6747 + - uid: 27675 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 86.5,-26.5 + parent: 6747 - proto: WallShuttle entities: - uid: 6231 @@ -174456,22 +173715,16 @@ entities: - type: Transform pos: 32.5,31.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 8270 components: - type: Transform pos: 60.5,25.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - uid: 11258 components: - type: Transform pos: 3.5,-82.5 parent: 6747 - - type: AtmosDevice - joinedGrid: 6747 - proto: WeaponCapacitorRecharger entities: - uid: 120 diff --git a/Resources/Maps/asterisk.yml b/Resources/Maps/asterisk.yml index 156fb2de6e..bfd8a71261 100644 --- a/Resources/Maps/asterisk.yml +++ b/Resources/Maps/asterisk.yml @@ -63,7 +63,29 @@ entities: - type: Broadphase - type: OccluderTree - type: Parallax - parallax: AngleStation + parallax: Snow + - type: MapAtmosphere + space: False + mixture: + volume: 2500 + immutable: True + temperature: 213.15 + moles: + - 21.824879 + - 82.10312 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - type: Gravity + enabled: true + inherent: true - type: LoadedMap - uid: 2 components: @@ -71,6 +93,9 @@ entities: - type: Transform pos: -0.5104167,-0.4739367 parent: 1 + - type: PassiveDampening + linearDampening: 1 + angularDampening: 1 - type: MapGrid chunks: 0,0: diff --git a/Resources/Maps/gaxstation.yml b/Resources/Maps/gaxstation.yml index 1e2d999ab2..3de887a3b3 100644 --- a/Resources/Maps/gaxstation.yml +++ b/Resources/Maps/gaxstation.yml @@ -29289,6 +29289,11 @@ entities: - type: Transform pos: 72.5,24.5 parent: 2 + - uid: 18587 + components: + - type: Transform + pos: 69.5,22.5 + parent: 2 - uid: 18794 components: - type: Transform @@ -124673,7 +124678,7 @@ entities: lastSignals: DoorStatus: True - type: Door - secondsUntilStateChange: -79958.195 + secondsUntilStateChange: -80064.195 state: Opening - uid: 18112 components: diff --git a/Resources/Maps/glacier.yml b/Resources/Maps/glacier.yml index d9e4276b4d..5cf7518212 100644 --- a/Resources/Maps/glacier.yml +++ b/Resources/Maps/glacier.yml @@ -72,7 +72,10 @@ entities: - type: GridTree - type: MovedGrids - type: Parallax - parallax: Sky + parallax: Snow + - type: Gravity + enabled: true + inherent: true - type: MapAtmosphere space: False mixture: @@ -100,6 +103,9 @@ entities: - type: MetaData - type: Transform parent: 1 + - type: PassiveDampening + linearDampening: 1 + angularDampening: 1 - type: MapGrid chunks: -1,-1: @@ -316,7 +322,7 @@ entities: version: 6 5,-1: ind: 5,-1 - tiles: FQAAAAAAFQAAAAAEFQAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFQAAAAAEFQAAAAACFQAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAPwAAAAAAFQAAAAAGFQAAAAAGPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAKAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAKAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAKAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAKAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPQAAAAAAPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAAAACKAAAAAACKAAAAAABPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: FQAAAAAAFQAAAAAEPwAAAAAAPwAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFQAAAAAEFQAAAAACPwAAAAAAPwAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPQAAAAAAPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAAAACKAAAAAACKAAAAAABPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 4,-3: ind: 4,-3 @@ -328,7 +334,7 @@ entities: version: 6 5,-2: ind: 5,-2 - tiles: YQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYAAAAAAAYAAAAAAAYAAAAAAAYQAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAABQAAAAAABQAAAAAABQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAABQAAAAAABQAAAAAABQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYAAAAAAAYAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAABQAAAAAABQAAAAAABQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYAAAAAAAYAAAAAAAYAAAAAAAYQAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAAAACQAAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: YQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYAAAAAAAYAAAAAAAYAAAAAAAYQAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAABQAAAAAABQAAAAAABQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAABQAAAAAABQAAAAAABQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYAAAAAAAYAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAABQAAAAAABQAAAAAABQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYAAAAAAAYAAAAAAAYAAAAAAAYQAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAAAACQAAAAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAAAARwAAAAAARwAAAAAARwAAAAAARwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAAAARwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 -4,1: ind: -4,1 @@ -2751,11 +2757,6 @@ entities: 3815: -39.85408,-7.657089 3816: -38.037838,-6.831524 3817: -40.293243,-5.1342893 - - node: - color: '#2559C7D0' - id: Flowersbr1 - decals: - 1414: 80.20305,-16.79779 - node: color: '#2B72B4BD' id: Flowersbr1 @@ -2879,8 +2880,6 @@ entities: 1408: 62.92135,-38.572655 1409: 67.42135,-35.61953 1410: 70.712,-35.933105 - 1411: 78.82805,-19.23529 - 1412: 79.20305,-17.26654 - node: color: '#3AB3DA7F' id: Flowersbr2 @@ -3037,8 +3036,6 @@ entities: id: Flowersy1 decals: 1404: 52,-32 - 1413: 78.14055,-18.438416 - 1415: 80.03117,-18.375916 - node: color: '#3375A4BD' id: Flowersy1 @@ -8790,6 +8787,7 @@ entities: 5325: -56.75957,1.4266167 5326: -56.923634,1.0281792 5327: -48.51849,2.093442 + 5979: 80.11802,-21.809238 - node: color: '#FFFFFFE6' id: grasssnowb1 @@ -8888,7 +8886,6 @@ entities: 2285: 3.9030752,-5.9041996 2291: 19.729828,-33.013443 2294: 45.10163,-30.335632 - 2295: 79.1315,-17.643627 2297: 14.678892,11.182862 - node: zIndex: 1 @@ -8901,6 +8898,7 @@ entities: id: grasssnowc1 decals: 3742: -44.000923,5.2940826 + 5978: 81.227394,-23.777988 - node: color: '#FFFFFFE6' id: grasssnowc2 @@ -8908,6 +8906,11 @@ entities: 2270: 45.595287,-13.74883 2271: 62.10621,-9.182607 2286: 5.9226108,-1.9519272 + - node: + color: '#FFFFFFFF' + id: grasssnowc2 + decals: + 5977: 80.352394,-24.840488 - node: color: '#FFFFFFCD' id: grasssnowc3 @@ -8925,6 +8928,11 @@ entities: 2266: -19.638706,-9.343069 2267: 35.956028,-9.619087 2499: 41.014008,22.813168 + - node: + color: '#FFFFFFFF' + id: grasssnowc3 + decals: + 5980: 79.93052,-21.152988 - node: cleanable: True color: '#FF4A3AFF' @@ -9683,9 +9691,9 @@ entities: 0: 111 -4,12: 0: 30583 - 3: 34952 + 2: 34952 -4,10: - 2: 12 + 3: 12 0: 52224 -4,11: 0: 3276 @@ -9693,12 +9701,12 @@ entities: 0: 118 -3,10: 0: 4352 - 3: 26214 + 2: 26214 -3,11: 0: 281 - 3: 26214 + 2: 26214 -3,12: - 3: 63351 + 2: 63351 -2,9: 0: 2039 -2,10: @@ -9707,7 +9715,7 @@ entities: 0: 30591 -2,12: 0: 119 - 3: 61440 + 2: 61440 -1,9: 0: 30711 -1,10: @@ -9716,16 +9724,16 @@ entities: 0: 30503 -1,12: 0: 119 - 3: 61440 + 2: 61440 0,8: 0: 63351 0,9: 0: 63736 0,10: - 3: 61712 + 2: 61712 0: 232 0,11: - 3: 16255 + 2: 16255 0,-4: 0: 60428 0,-3: @@ -9841,17 +9849,17 @@ entities: 4,7: 0: 61663 0,12: - 3: 64443 + 2: 64443 1,9: 0: 32767 1,10: 0: 35507 - 3: 12288 + 2: 12288 1,11: - 3: 8994 + 2: 8994 0: 34944 1,12: - 3: 291 + 2: 291 2,9: 0: 4095 2,10: @@ -9868,7 +9876,7 @@ entities: 0: 65534 3,12: 0: 28927 - 3: 32768 + 2: 32768 4,8: 0: 65294 4,9: @@ -9983,7 +9991,7 @@ entities: 0: 56831 4,12: 0: 255 - 3: 61440 + 2: 61440 5,9: 0: 3838 5,10: @@ -9992,7 +10000,7 @@ entities: 0: 65528 5,12: 0: 33535 - 3: 28672 + 2: 28672 6,9: 0: 61439 6,10: @@ -10149,16 +10157,16 @@ entities: 0: 43008 10,12: 0: 19 - 3: 27784 + 2: 27784 11,9: 0: 65534 11,10: 0: 56559 11,11: 0: 477 - 3: 17408 + 2: 17408 11,12: - 3: 4407 + 2: 4407 12,8: 0: 30583 12,9: @@ -10168,73 +10176,73 @@ entities: 12,11: 0: 3327 0,13: - 3: 43929 + 2: 43929 -1,13: - 3: 2039 + 2: 2039 0,14: - 3: 61038 + 2: 61038 0: 128 -1,14: 0: 65535 0,15: - 3: 61166 + 2: 61166 -1,15: 0: 15 4: 65280 0,16: - 3: 43942 + 2: 43942 0: 8 1,13: - 3: 273 + 2: 273 0: 8 1,14: - 3: 51711 + 2: 51711 1,15: - 3: 39127 + 2: 39127 0: 8 1,16: - 3: 25823 + 2: 25823 2,13: 0: 3067 2,14: - 3: 60303 + 2: 60303 3,13: 0: 2867 - 3: 136 + 2: 136 3,14: 0: 65535 4,13: - 3: 255 + 2: 255 0: 36608 4,14: 0: 65535 5,13: - 3: 30583 + 2: 30583 0: 34952 5,14: - 3: 1911 + 2: 1911 0: 63624 6,13: 0: 61167 6,14: - 3: 12784 + 2: 12784 5,15: 0: 8 6,15: 0: 15 7,13: 0: 13107 - 3: 34952 + 2: 34952 7,14: - 3: 62200 + 2: 62200 7,15: 0: 27718 7,16: 0: 98 8,13: - 3: 17615 + 2: 17615 8,14: - 3: 7748 + 2: 7748 0: 57344 12,4: 0: 6 @@ -10252,14 +10260,14 @@ entities: 0: 61439 15,6: 0: 20480 - 3: 35840 + 2: 35840 15,7: 0: 61661 16,6: - 3: 12288 + 2: 12288 16,7: 0: 61489 - 3: 70 + 2: 70 13,9: 0: 28671 13,10: @@ -10284,10 +10292,10 @@ entities: 0: 28912 16,9: 0: 61489 - 3: 70 + 2: 70 16,10: 0: 12528 - 3: 16384 + 2: 16384 16,11: 0: 1 13,0: @@ -10298,7 +10306,7 @@ entities: 0: 12407 13,3: 0: 51 - 3: 1024 + 2: 1024 13,-1: 0: 34835 -8,4: @@ -10402,20 +10410,20 @@ entities: 4,-6: 0: 33075 -8,-3: - 3: 12544 + 2: 12544 -9,-3: 0: 64250 - 3: 1285 + 2: 1285 -8,-1: 0: 61731 -9,-2: 0: 64170 - 3: 1365 + 2: 1365 -9,-1: 0: 64174 - 3: 1361 + 2: 1361 -8,-2: - 3: 512 + 2: 512 -8,0: 0: 65526 -7,-3: @@ -10424,7 +10432,7 @@ entities: 0: 62321 -7,-5: 0: 24576 - 3: 119 + 2: 119 -7,-4: 0: 49152 -7,-2: @@ -10445,27 +10453,27 @@ entities: 0: 30513 -9,0: 0: 64170 - 3: 1365 + 2: 1365 -8,1: - 3: 1799 + 2: 1799 0: 2296 -9,1: 0: 64250 - 3: 1285 + 2: 1285 -8,2: 0: 64384 -9,2: 0: 51200 - 3: 1 + 2: 1 -9,3: 0: 47308 -7,1: - 3: 1799 + 2: 1799 0: 2296 -7,2: 0: 65392 -6,1: - 3: 263 + 2: 263 0: 248 -6,2: 0: 52424 @@ -10474,9 +10482,9 @@ entities: 8,15: 0: 49356 9,13: - 3: 34959 + 2: 34959 9,14: - 3: 3464 + 2: 3464 0: 61440 9,15: 0: 4351 @@ -10485,23 +10493,23 @@ entities: 9,16: 0: 4095 10,13: - 3: 3 + 2: 3 10,14: - 3: 33568 + 2: 33568 0: 28672 10,15: 0: 61503 10,16: 0: 311 11,14: - 3: 8177 + 2: 8177 0: 57344 11,15: 0: 207 11,13: - 3: 4401 + 2: 4401 12,14: - 3: 12561 + 2: 12561 12,15: 0: 8209 11,16: @@ -10522,10 +10530,10 @@ entities: 0: 65535 -12,3: 0: 49151 - 3: 16384 + 2: 16384 -13,3: 0: 9215 - 3: 56320 + 2: 56320 -11,0: 0: 65535 -11,1: @@ -10533,7 +10541,7 @@ entities: -11,2: 0: 65535 -11,3: - 3: 1799 + 2: 1799 0: 63736 -11,-1: 0: 65535 @@ -10543,12 +10551,12 @@ entities: 0: 65535 -10,1: 0: 63999 - 3: 1536 + 2: 1536 -10,2: - 3: 1285 + 2: 1285 0: 31482 -10,3: - 3: 773 + 2: 773 0: 12338 -10,-1: 0: 65535 @@ -10562,19 +10570,19 @@ entities: 0: 61183 -13,5: 0: 58468 - 3: 2 + 2: 2 -13,6: 0: 26188 - 3: 48 + 2: 48 -12,7: 0: 45056 - 3: 16384 + 2: 16384 -12,8: - 3: 1799 + 2: 1799 0: 12536 -13,7: 0: 57344 - 3: 4914 + 2: 4914 -11,5: 0: 30583 -11,6: @@ -10582,7 +10590,7 @@ entities: -11,7: 0: 61986 -11,8: - 3: 1797 + 2: 1797 0: 59642 -10,6: 0: 52479 @@ -10591,7 +10599,7 @@ entities: -10,5: 0: 52430 -10,8: - 3: 771 + 2: 771 0: 29812 -9,6: 0: 12545 @@ -10600,7 +10608,7 @@ entities: -12,-4: 0: 61440 -12,-3: - 3: 1799 + 2: 1799 0: 63736 -13,-3: 0: 3935 @@ -10612,28 +10620,28 @@ entities: 0: 65535 -11,-4: 0: 12288 - 3: 16384 + 2: 16384 -11,-3: - 3: 1807 + 2: 1807 0: 63728 -11,-2: 0: 65535 -10,-3: - 3: 1797 + 2: 1797 0: 63736 -10,-2: 0: 65535 -10,-4: - 3: 6152 + 2: 6152 0: 49152 -10,-5: 0: 34952 -9,-4: - 3: 1365 + 2: 1365 0: 64170 -9,-5: 0: 64175 - 3: 1360 + 2: 1360 -16,-4: 0: 28671 -16,-5: @@ -10650,19 +10658,19 @@ entities: 0: 28398 -16,-1: 0: 49138 - 3: 16384 + 2: 16384 -17,-1: 0: 2240 - 3: 32768 + 2: 32768 -16,0: - 3: 1 + 2: 1 0: 1150 -15,-4: 0: 819 - 3: 32768 + 2: 32768 -15,-3: 0: 819 - 3: 34952 + 2: 34952 -15,-2: 0: 13107 -15,-1: @@ -10677,41 +10685,41 @@ entities: 0: 65534 -14,-4: 0: 57344 - 3: 64 + 2: 64 -14,-2: - 3: 15 + 2: 15 0: 51328 -14,0: 0: 65535 -13,-4: 0: 28672 - 3: 144 + 2: 144 -10,-6: 0: 32768 -9,-6: 0: 61440 -8,-5: - 3: 255 + 2: 255 -16,-6: - 3: 15 + 2: 15 0: 63232 -17,-6: - 3: 74 + 2: 74 0: 61696 -17,-5: 0: 57561 -16,-7: - 3: 8192 + 2: 8192 -15,-6: - 3: 16400 + 2: 16400 0: 45056 -14,-6: 0: 4096 - 3: 8192 + 2: 8192 -14,-5: - 3: 4352 + 2: 4352 -17,0: - 3: 8 + 2: 8 0: 2240 -16,1: 0: 3824 @@ -10728,7 +10736,7 @@ entities: -16,4: 0: 65535 -15,1: - 3: 752 + 2: 752 0: 8456 -15,3: 0: 20447 @@ -10736,29 +10744,29 @@ entities: 0: 50786 -15,4: 0: 9830 - 3: 2048 + 2: 2048 -14,1: 0: 61439 -14,2: 0: 62606 - 3: 320 + 2: 320 -14,3: 0: 8191 - 3: 57344 + 2: 57344 -14,4: - 3: 1834 + 2: 1834 0: 34944 -13,4: 0: 24578 - 3: 544 + 2: 544 -18,-7: - 3: 2112 + 2: 2112 -18,-6: 0: 51396 -18,-5: 0: 12 -17,-7: - 3: 40064 + 2: 40064 -19,2: 0: 9319 -19,3: @@ -10826,7 +10834,7 @@ entities: 0: 7103 8,-9: 0: 57344 - 3: 224 + 2: 224 9,-8: 0: 53755 9,-7: @@ -10835,7 +10843,7 @@ entities: 0: 4081 9,-9: 0: 47296 - 3: 16 + 2: 16 10,-8: 0: 56343 10,-7: @@ -10965,22 +10973,22 @@ entities: 17,-2: 0: 34955 17,-1: - 3: 22016 + 2: 22016 0: 43208 17,0: 0: 30475 - 3: 4 + 2: 4 18,-3: 0: 30591 18,-2: 0: 25207 - 3: 5376 + 2: 5376 18,-1: 0: 61203 - 3: 4196 + 2: 4196 18,0: 0: 49117 - 3: 16418 + 2: 16418 19,-3: 0: 49087 19,-1: @@ -11015,7 +11023,7 @@ entities: 0: 65532 -13,8: 0: 43257 - 3: 1798 + 2: 1798 -11,9: 0: 3104 -10,9: @@ -11038,40 +11046,40 @@ entities: 0: 65394 -14,7: 0: 45736 - 3: 19522 + 2: 19522 -14,8: 0: 9386 - 3: 51780 + 2: 51780 -4,13: 0: 119 - 3: 62600 + 2: 62600 -5,13: 0: 30632 -4,14: - 3: 65023 + 2: 65023 -5,14: - 3: 21882 + 2: 21882 0: 5 -4,15: - 3: 4383 + 2: 4383 -5,15: - 3: 29772 + 2: 29772 -4,16: - 3: 18255 + 2: 18255 -3,13: - 3: 14071 + 2: 14071 -3,14: - 3: 13107 + 2: 13107 0: 34952 -3,15: - 3: 8739 + 2: 8739 0: 8 4: 34816 -3,16: - 3: 60963 + 2: 60963 4: 8 -2,13: - 3: 3324 + 2: 3324 0: 49152 -2,14: 0: 65535 @@ -11080,64 +11088,64 @@ entities: 4: 65280 -2,16: 4: 15 - 3: 65280 + 2: 65280 -1,16: 4: 15 - 3: 7936 + 2: 7936 -5,16: - 3: 7962 + 2: 7962 0: 16452 -4,17: - 3: 47332 + 2: 47332 0: 16384 -5,17: - 3: 42567 + 2: 42567 0: 16384 -4,18: - 3: 35820 + 2: 35820 0: 1024 -5,18: - 3: 4030 + 2: 4030 -4,19: - 3: 51400 + 2: 51400 -3,17: - 3: 49722 + 2: 49722 0: 12288 -3,18: - 3: 3631 + 2: 3631 0: 256 -3,19: - 3: 4112 + 2: 4112 -4,20: - 3: 51400 + 2: 51400 -2,17: - 3: 61453 + 2: 61453 -2,18: - 3: 3455 + 2: 3455 0: 512 -1,17: - 3: 57617 + 2: 57617 0: 4096 -1,18: - 3: 36767 + 2: 36767 -1,19: - 3: 51400 + 2: 51400 0,17: - 3: 30891 + 2: 30891 0: 32768 0,18: - 3: 185 + 2: 185 0: 256 0,19: - 3: 4112 + 2: 4112 -1,20: - 3: 51400 + 2: 51400 1,17: - 3: 4372 + 2: 4372 1,18: - 3: 99 + 2: 99 2,16: - 3: 1 + 2: 1 -8,12: 0: 65328 -9,12: @@ -11153,9 +11161,9 @@ entities: -6,14: 0: 35055 -6,15: - 3: 34952 + 2: 34952 -6,16: - 3: 7960 + 2: 7960 0: 32896 21,-4: 0: 4096 @@ -11202,14 +11210,14 @@ entities: 15,-13: 0: 65409 21,-8: - 3: 32903 + 2: 32903 0: 32624 21,-7: - 3: 7 + 2: 7 22,-8: - 3: 18241 + 2: 18241 22,-7: - 3: 1 + 2: 1 -16,5: 0: 14199 -17,5: @@ -11220,23 +11228,23 @@ entities: 0: 61198 -15,5: 0: 4402 - 3: 17984 + 2: 17984 -15,6: - 3: 16 + 2: 16 0: 236 -14,6: 0: 8208 - 3: 224 + 2: 224 -14,5: - 3: 8 + 2: 8 -8,16: - 3: 20288 + 2: 20288 -7,16: - 3: 24400 + 2: 24400 -6,17: - 3: 34952 + 2: 34952 -6,18: - 3: 136 + 2: 136 0: 2048 12,16: 0: 23955 @@ -11248,23 +11256,23 @@ entities: 0: 16 -7,-6: 0: 36864 - 3: 26222 + 2: 26222 -7,-8: - 3: 26342 + 2: 26342 -7,-9: - 3: 28262 + 2: 28262 -7,-7: - 3: 26222 + 2: 26222 -6,-8: - 3: 8244 + 2: 8244 0: 52424 -6,-7: - 3: 17 + 2: 17 0: 63342 -6,-6: 0: 179 -6,-9: - 3: 20300 + 2: 20300 0: 32768 -5,-8: 0: 63863 @@ -11272,7 +11280,7 @@ entities: 0: 34968 -5,-9: 0: 16382 - 3: 1 + 2: 1 -4,-8: 0: 17417 -4,-6: @@ -11346,20 +11354,20 @@ entities: 17,-14: 0: 4096 -3,20: - 3: 4112 + 2: 4112 -4,21: - 3: 136 + 2: 136 0,20: - 3: 4112 + 2: 4112 -1,21: - 3: 136 + 2: 136 -7,-10: 0: 2050 - 3: 26348 + 2: 26348 -6,-10: - 3: 17663 + 2: 17663 -5,-10: - 3: 17 + 2: 17 0: 51456 -5,-11: 0: 4096 @@ -11385,7 +11393,7 @@ entities: 1: 3 0: 3712 16,0: - 3: 4 + 2: 4 0: 51208 16,1: 0: 2248 @@ -11393,30 +11401,30 @@ entities: 0: 1911 18,1: 0: 4081 - 3: 14 + 2: 14 19,1: - 3: 13 + 2: 13 0: 3826 20,0: 0: 62208 - 3: 3072 + 2: 3072 20,1: 0: 1023 - 3: 3072 + 2: 3072 21,0: - 3: 9472 + 2: 9472 0: 4096 21,1: 0: 19 - 3: 1324 + 2: 1324 22,1: - 3: 31 + 2: 31 22,0: - 3: 4096 + 2: 4096 23,1: - 3: 17 + 2: 17 23,0: - 3: 4096 + 2: 4096 uniqueMixes: - volume: 2500 temperature: 293.15 @@ -11449,10 +11457,11 @@ entities: - 0 - 0 - volume: 2500 - temperature: 293.15 + immutable: True + temperature: 213.15 moles: - - 0 - - 6666.982 + - 21.824879 + - 82.10312 - 0 - 0 - 0 @@ -11464,11 +11473,10 @@ entities: - 0 - 0 - volume: 2500 - immutable: True - temperature: 213.15 + temperature: 293.15 moles: - - 21.824879 - - 82.10312 + - 0 + - 6666.982 - 0 - 0 - 0 @@ -12253,6 +12261,20 @@ entities: - type: Transform pos: 51.5,3.5 parent: 2 +- proto: AirlockExternalGlassShuttleArrivals + entities: + - uid: 5846 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 84.5,-16.5 + parent: 2 + - uid: 12802 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 84.5,-9.5 + parent: 2 - proto: AirlockExternalGlassShuttleEmergencyLocked entities: - uid: 107 @@ -14446,6 +14468,30 @@ entities: - type: Transform pos: -69.5,22.5 parent: 2 + - uid: 17404 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 75.5,-11.5 + parent: 2 + - uid: 17406 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 75.5,-12.5 + parent: 2 + - uid: 17407 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 84.5,-9.5 + parent: 2 + - uid: 17408 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 84.5,-16.5 + parent: 2 - proto: AtmosFixBlockerMarker entities: - uid: 551 @@ -15181,7 +15227,6 @@ entities: solutions: beaker: temperature: 293.15 - canMix: False canReact: True maxVol: 50 name: null @@ -28681,6 +28726,61 @@ entities: - type: Transform pos: -69.5,26.5 parent: 2 + - uid: 17388 + components: + - type: Transform + pos: 82.5,-10.5 + parent: 2 + - uid: 17389 + components: + - type: Transform + pos: 83.5,-10.5 + parent: 2 + - uid: 17390 + components: + - type: Transform + pos: 83.5,-9.5 + parent: 2 + - uid: 17391 + components: + - type: Transform + pos: 84.5,-9.5 + parent: 2 + - uid: 17392 + components: + - type: Transform + pos: 82.5,-12.5 + parent: 2 + - uid: 17393 + components: + - type: Transform + pos: 82.5,-13.5 + parent: 2 + - uid: 17394 + components: + - type: Transform + pos: 83.5,-13.5 + parent: 2 + - uid: 17395 + components: + - type: Transform + pos: 83.5,-14.5 + parent: 2 + - uid: 17396 + components: + - type: Transform + pos: 83.5,-15.5 + parent: 2 + - uid: 17397 + components: + - type: Transform + pos: 83.5,-16.5 + parent: 2 + - uid: 17398 + components: + - type: Transform + pos: 84.5,-16.5 + parent: 2 - proto: CableApcStack entities: - uid: 3087 @@ -43323,18 +43423,6 @@ entities: rot: 1.5707963267948966 rad pos: 80.5,-10.5 parent: 2 - - uid: 5846 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 84.5,-11.5 - parent: 2 - - uid: 5847 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 84.5,-9.5 - parent: 2 - uid: 5848 components: - type: Transform @@ -44324,6 +44412,14 @@ entities: rot: 1.5707963267948966 rad pos: 28.5,-15.5 parent: 2 +- proto: CigarCase + entities: + - uid: 12432 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 80.47377,-7.4654655 + parent: 2 - proto: Cigarette entities: - uid: 5985 @@ -45975,8 +46071,11 @@ entities: - uid: 6259 components: - type: Transform - pos: 80.79694,-16.95121 + pos: 81.71729,-23.264704 parent: 2 + - type: Physics + angularDamping: 0 + linearDamping: 0 - proto: ClothingUniformJumpsuitMonasticRobeDark entities: - uid: 6260 @@ -46043,6 +46142,12 @@ entities: parent: 2 - type: Physics bodyType: Dynamic + - uid: 5847 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 79.5,-7.5 + parent: 2 - uid: 6271 components: - type: Transform @@ -47630,6 +47735,11 @@ entities: - type: Transform pos: 55.5,27.5 parent: 2 + - uid: 17386 + components: + - type: Transform + pos: 79.5,-12.5 + parent: 2 - proto: DefaultStationBeaconArtifactLab entities: - uid: 14128 @@ -47763,13 +47873,6 @@ entities: - type: Transform pos: 16.5,39.5 parent: 2 -- proto: DefaultStationBeaconEvac - entities: - - uid: 4014 - components: - - type: Transform - pos: 64.5,36.5 - parent: 2 - proto: DefaultStationBeaconExam entities: - uid: 6835 @@ -53503,6 +53606,12 @@ entities: parent: 2 - proto: FloraTreeConifer01 entities: + - uid: 4014 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 80.01541,-17.046658 + parent: 2 - uid: 7320 components: - type: Transform @@ -53573,11 +53682,6 @@ entities: - type: Transform pos: -46.620007,3.2367477 parent: 2 - - uid: 7334 - components: - - type: Transform - pos: 79.78117,-17.17279 - parent: 2 - uid: 7335 components: - type: Transform @@ -53588,6 +53692,12 @@ entities: - type: Transform pos: 8.925767,5.7541437 parent: 2 + - uid: 12810 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 80.63917,-23.639704 + parent: 2 - proto: FloraTreeConifer02 entities: - uid: 7337 @@ -54217,11 +54327,6 @@ entities: - type: Transform pos: 72.679436,-17.541761 parent: 2 - - uid: 7460 - components: - - type: Transform - pos: 81.68742,-16.92279 - parent: 2 - uid: 7461 components: - type: Transform @@ -54237,6 +54342,18 @@ entities: - type: Transform pos: 5.2628946,14.259887 parent: 2 + - uid: 11794 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 80.09354,-18.656033 + parent: 2 + - uid: 12801 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 81.63917,-22.170954 + parent: 2 - proto: FloraTreeSnow06 entities: - uid: 7464 @@ -69766,13 +69883,6 @@ entities: - type: Transform pos: 63.191357,-49.411076 parent: 2 -- proto: GravityGenerator - entities: - - uid: 9482 - components: - - type: Transform - pos: 27.5,54.5 - parent: 2 - proto: GravityGeneratorMini entities: - uid: 9483 @@ -72104,11 +72214,6 @@ entities: - type: Transform pos: 69.5,-6.5 parent: 2 - - uid: 9975 - components: - - type: Transform - pos: 84.5,-13.5 - parent: 2 - uid: 9976 components: - type: Transform @@ -72354,6 +72459,24 @@ entities: - type: Transform pos: -15.5,64.5 parent: 2 + - uid: 11783 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 82.5,-17.5 + parent: 2 + - uid: 11784 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 84.5,-17.5 + parent: 2 + - uid: 11793 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 83.5,-17.5 + parent: 2 - uid: 12427 components: - type: Transform @@ -72399,6 +72522,30 @@ entities: - type: Transform pos: 73.5,7.5 parent: 2 + - uid: 17382 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 84.5,-14.5 + parent: 2 + - uid: 17383 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 84.5,-13.5 + parent: 2 + - uid: 17384 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 84.5,-12.5 + parent: 2 + - uid: 17385 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 84.5,-11.5 + parent: 2 - proto: GrilleBroken entities: - uid: 10026 @@ -73463,7 +73610,6 @@ entities: solutions: beaker: temperature: 293.15 - canMix: False canReact: True maxVol: 100 name: null @@ -81999,16 +82145,6 @@ entities: - type: Transform pos: 75.5,-13.5 parent: 2 - - uid: 11783 - components: - - type: Transform - pos: 82.5,-13.5 - parent: 2 - - uid: 11784 - components: - - type: Transform - pos: 83.5,-13.5 - parent: 2 - uid: 11785 components: - type: Transform @@ -82049,16 +82185,6 @@ entities: - type: Transform pos: 81.5,-15.5 parent: 2 - - uid: 11793 - components: - - type: Transform - pos: 82.5,-14.5 - parent: 2 - - uid: 11794 - components: - - type: Transform - pos: 82.5,-15.5 - parent: 2 - uid: 11795 components: - type: Transform @@ -83807,7 +83933,7 @@ entities: - type: Transform pos: -7.5,-5.5 parent: 2 -- proto: Oracle +- proto: OracleSpawner entities: - uid: 12108 components: @@ -86097,12 +86223,6 @@ entities: rot: 3.141592653589793 rad pos: -6.5,24.5 parent: 2 - - uid: 12432 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 79.5,-8.5 - parent: 2 - uid: 12433 components: - type: Transform @@ -86471,6 +86591,18 @@ entities: rot: 3.141592653589793 rad pos: 56.5,31.5 parent: 2 + - uid: 17399 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 83.5,-15.5 + parent: 2 + - uid: 17400 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 83.5,-10.5 + parent: 2 - proto: PoweredLightBlueInterior entities: - uid: 9259 @@ -88545,24 +88677,6 @@ entities: rot: 3.141592653589793 rad pos: -12.5,-22.5 parent: 2 - - uid: 12801 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 84.5,-11.5 - parent: 2 - - uid: 12802 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 84.5,-9.5 - parent: 2 - - uid: 12803 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 84.5,-12.5 - parent: 2 - uid: 12804 components: - type: Transform @@ -88583,36 +88697,6 @@ entities: - type: Transform pos: 74.5,-9.5 parent: 2 - - uid: 12810 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 84.5,-10.5 - parent: 2 - - uid: 12811 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 81.5,-7.5 - parent: 2 - - uid: 12812 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 79.5,-7.5 - parent: 2 - - uid: 12813 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 82.5,-7.5 - parent: 2 - - uid: 12814 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 80.5,-7.5 - parent: 2 - uid: 12815 components: - type: Transform @@ -91492,31 +91576,108 @@ entities: - type: Transform pos: 21.5,10.5 parent: 2 -- proto: RandomVending +- proto: RandomVendingSnacks entities: - uid: 13123 components: - type: Transform + rot: 1.5707963267948966 rad pos: -15.5,-5.5 parent: 2 - uid: 13124 components: - type: Transform + rot: 3.141592653589793 rad pos: 23.5,4.5 parent: 2 -- proto: RandomVendingDrinks - entities: - uid: 13196 components: - type: Transform - pos: 52.5,36.5 + rot: 1.5707963267948966 rad + pos: 52.5,33.5 parent: 2 -- proto: RandomVendingSnacks - entities: - uid: 13220 components: - type: Transform - pos: 52.5,33.5 + rot: 1.5707963267948966 rad + pos: 52.5,36.5 + parent: 2 + - uid: 14621 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 59.5,34.5 + parent: 2 + - uid: 14628 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 24.5,24.5 + parent: 2 + - uid: 14630 + components: + - type: Transform + pos: 54.5,-10.5 + parent: 2 + - uid: 14634 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 81.5,-13.5 + parent: 2 + - uid: 14635 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 6.5,12.5 + parent: 2 + - uid: 14638 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 37.5,44.5 + parent: 2 + - uid: 14639 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 24.5,25.5 + parent: 2 + - uid: 14646 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 37.5,45.5 + parent: 2 + - uid: 14666 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 29.5,12.5 + parent: 2 + - uid: 14669 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 79.5,-13.5 + parent: 2 + - uid: 14670 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 8.5,-4.5 + parent: 2 + - uid: 17403 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 30.5,12.5 + parent: 2 + - uid: 17405 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 8.5,-5.5 parent: 2 - proto: RCD entities: @@ -91907,6 +92068,12 @@ entities: - type: Transform pos: 55.5,9.5 parent: 2 + - uid: 9975 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 84.5,-17.5 + parent: 2 - uid: 12688 components: - type: Transform @@ -91917,6 +92084,12 @@ entities: - type: Transform pos: 54.5,11.5 parent: 2 + - uid: 12803 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 83.5,-17.5 + parent: 2 - uid: 13203 components: - type: Transform @@ -93175,7 +93348,8 @@ entities: - uid: 13473 components: - type: Transform - pos: 84.5,-13.5 + rot: 1.5707963267948966 rad + pos: 82.5,-17.5 parent: 2 - uid: 13474 components: @@ -93347,6 +93521,30 @@ entities: - type: Transform pos: 73.5,7.5 parent: 2 + - uid: 17378 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 84.5,-11.5 + parent: 2 + - uid: 17379 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 84.5,-12.5 + parent: 2 + - uid: 17380 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 84.5,-13.5 + parent: 2 + - uid: 17381 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 84.5,-14.5 + parent: 2 - proto: ResearchAndDevelopmentServer entities: - uid: 13502 @@ -95358,7 +95556,7 @@ entities: - type: Transform pos: -0.5,85.5 parent: 2 -- proto: SophicScribe +- proto: SophicScribeSpawner entities: - uid: 13789 components: @@ -95425,6 +95623,13 @@ entities: - type: Transform pos: -7.5,45.5 parent: 2 +- proto: SpaceHeaterEnabled + entities: + - uid: 17409 + components: + - type: Transform + pos: 83.5,-12.5 + parent: 2 - proto: SpawnMobArcticFoxSiobhan entities: - uid: 14071 @@ -95810,33 +96015,6 @@ entities: - type: Transform pos: -23.5,-10.5 parent: 2 -- proto: SpawnPointMailCarrier - entities: - - uid: 13932 - components: - - type: Transform - pos: 41.5,14.5 - parent: 2 - - uid: 13933 - components: - - type: Transform - pos: 41.5,15.5 - parent: 2 - - uid: 13934 - components: - - type: Transform - pos: 42.5,15.5 - parent: 2 - - uid: 13935 - components: - - type: Transform - pos: 44.5,15.5 - parent: 2 - - uid: 13936 - components: - - type: Transform - pos: 43.5,15.5 - parent: 2 - proto: SpawnPointDetective entities: - uid: 15402 @@ -96050,6 +96228,33 @@ entities: - type: Transform pos: -57.5,2.5 parent: 2 +- proto: SpawnPointMailCarrier + entities: + - uid: 13932 + components: + - type: Transform + pos: 41.5,14.5 + parent: 2 + - uid: 13933 + components: + - type: Transform + pos: 41.5,15.5 + parent: 2 + - uid: 13934 + components: + - type: Transform + pos: 42.5,15.5 + parent: 2 + - uid: 13935 + components: + - type: Transform + pos: 44.5,15.5 + parent: 2 + - uid: 13936 + components: + - type: Transform + pos: 43.5,15.5 + parent: 2 - proto: SpawnPointMedicalBorg entities: - uid: 16486 @@ -98851,6 +99056,14 @@ entities: - type: Transform pos: 58.5,-45.5 parent: 2 +- proto: TableFancyRed + entities: + - uid: 16249 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 80.5,-7.5 + parent: 2 - proto: TableGlass entities: - uid: 786 @@ -100842,13 +101055,6 @@ entities: - type: Transform pos: 30.5,21.5 parent: 2 -- proto: VendingMachineChang - entities: - - uid: 14621 - components: - - type: Transform - pos: 59.5,34.5 - parent: 2 - proto: VendingMachineChapel entities: - uid: 14622 @@ -100891,11 +101097,6 @@ entities: parent: 2 - proto: VendingMachineCigs entities: - - uid: 14628 - components: - - type: Transform - pos: 24.5,24.5 - parent: 2 - uid: 14629 components: - type: MetaData @@ -100903,11 +101104,6 @@ entities: - type: Transform pos: 56.5,38.5 parent: 2 - - uid: 14630 - components: - - type: Transform - pos: 54.5,-10.5 - parent: 2 - uid: 14631 components: - type: Transform @@ -100925,35 +101121,13 @@ entities: - type: Transform pos: 71.5,-20.5 parent: 2 -- proto: VendingMachineCoffee - entities: - - uid: 14634 - components: - - type: Transform - pos: 79.5,-13.5 - parent: 2 - proto: VendingMachineCola entities: - - uid: 14635 - components: - - type: Transform - pos: 6.5,12.5 - parent: 2 - uid: 14636 components: - type: Transform pos: -63.5,-8.5 parent: 2 - - uid: 14638 - components: - - type: Transform - pos: 37.5,44.5 - parent: 2 - - uid: 14639 - components: - - type: Transform - pos: 24.5,25.5 - parent: 2 - uid: 14641 components: - type: Transform @@ -101006,13 +101180,6 @@ entities: - type: Transform pos: 11.5,12.5 parent: 2 -- proto: VendingMachineDonut - entities: - - uid: 14646 - components: - - type: Transform - pos: 37.5,45.5 - parent: 2 - proto: VendingMachineEngiDrobe entities: - uid: 14647 @@ -101025,6 +101192,7 @@ entities: - uid: 14648 components: - type: Transform + rot: 3.141592653589793 rad pos: 18.5,37.5 parent: 2 - proto: VendingMachineGames @@ -101151,26 +101319,11 @@ entities: parent: 2 - proto: VendingMachineSnack entities: - - uid: 14666 - components: - - type: Transform - pos: 29.5,12.5 - parent: 2 - uid: 14667 components: - type: Transform pos: -63.5,-7.5 parent: 2 - - uid: 14669 - components: - - type: Transform - pos: 81.5,-13.5 - parent: 2 - - uid: 14670 - components: - - type: Transform - pos: 8.5,-4.5 - parent: 2 - proto: VendingMachineSovietSoda entities: - uid: 17140 @@ -101274,11 +101427,22 @@ entities: - type: Transform pos: -15.5,-6.5 parent: 2 + - uid: 17401 + components: + - type: Transform + pos: 81.5,-7.5 + parent: 2 + - uid: 17402 + components: + - type: Transform + pos: 82.5,-7.5 + parent: 2 - proto: VendingMachineYouTool entities: - uid: 14685 components: - type: Transform + rot: 3.141592653589793 rad pos: 17.5,37.5 parent: 2 - uid: 14686 @@ -106214,6 +106378,18 @@ entities: - type: Transform pos: 1.5,-10.5 parent: 2 + - uid: 7334 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 81.5,-16.5 + parent: 2 + - uid: 7460 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 81.5,-17.5 + parent: 2 - uid: 9457 components: - type: Transform @@ -108164,6 +108340,18 @@ entities: - type: Transform pos: -5.5,-6.5 parent: 2 + - uid: 16290 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 84.5,-15.5 + parent: 2 + - uid: 16971 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 84.5,-10.5 + parent: 2 - uid: 17012 components: - type: Transform @@ -109667,13 +109855,6 @@ entities: parent: 2 - type: WarpPoint location: Perma - - uid: 16249 - components: - - type: Transform - pos: 64.5,36.5 - parent: 2 - - type: WarpPoint - location: Evac - uid: 16250 components: - type: Transform @@ -109730,6 +109911,14 @@ entities: parent: 2 - type: WarpPoint location: West Docks +- proto: WarpPointArrivals + entities: + - uid: 17387 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 80.5,-12.5 + parent: 2 - proto: WarpPointBombing entities: - uid: 767 @@ -110953,6 +111142,30 @@ entities: rot: 3.141592653589793 rad pos: -10.5,47.5 parent: 2 + - uid: 12811 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 81.5,-7.5 + parent: 2 + - uid: 12812 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 79.5,-7.5 + parent: 2 + - uid: 12813 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 82.5,-7.5 + parent: 2 + - uid: 12814 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 80.5,-7.5 + parent: 2 - uid: 16441 components: - type: Transform diff --git a/Resources/Maps/radstation.yml b/Resources/Maps/radstation.yml index 198d27abbc..ccd6233274 100644 --- a/Resources/Maps/radstation.yml +++ b/Resources/Maps/radstation.yml @@ -112,7 +112,7 @@ entities: version: 6 -3,-1: ind: -3,-1 - tiles: cQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAADVAAAAAADVAAAAAADcQAAAAAAVAAAAAADVAAAAAACVAAAAAABcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAAAcQAAAAAAcQAAAAAAVAAAAAAAVAAAAAABVAAAAAADAAAAAAAAAAAAAAAAcQAAAAAAVAAAAAACVAAAAAACVAAAAAABcQAAAAAAVAAAAAAAVAAAAAACVAAAAAAAVAAAAAADVAAAAAADcQAAAAAAVAAAAAABVAAAAAADVAAAAAACAAAAAAAAAAAAAAAAcQAAAAAAGwAAAAADGwAAAAABGwAAAAACcQAAAAAAGwAAAAADGwAAAAADGwAAAAAAVAAAAAADVAAAAAABcQAAAAAAVAAAAAACVAAAAAABVAAAAAABAAAAAAAAAAAAAAAAGwAAAAADGwAAAAADGwAAAAAAGwAAAAADGwAAAAACGwAAAAABGwAAAAABGwAAAAABVAAAAAABVAAAAAADcQAAAAAAVAAAAAADVAAAAAAAVAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAGwAAAAAAGwAAAAADGwAAAAADVAAAAAADVAAAAAABcQAAAAAAVAAAAAAAVAAAAAADVAAAAAABAAAAAAAAAAAAAAAAcQAAAAAAVAAAAAACVAAAAAACVAAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAABVAAAAAAAVAAAAAACcQAAAAAAVAAAAAACVAAAAAABVAAAAAADAAAAAAAAAAAAAAAAcQAAAAAAGwAAAAABGwAAAAABGwAAAAACGwAAAAABGwAAAAABGwAAAAACGwAAAAAAVAAAAAACVAAAAAAAVAAAAAAAVAAAAAABVAAAAAACVAAAAAACAAAAAAAAAAAAAAAAcQAAAAAAVAAAAAACVAAAAAADVAAAAAACcQAAAAAAGwAAAAABGwAAAAACGwAAAAACVAAAAAAAVAAAAAACcQAAAAAAVAAAAAACVAAAAAACVAAAAAABAAAAAAAAAAAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAAAGwAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAADVAAAAAACVAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAGwAAAAADGwAAAAABGwAAAAACGwAAAAABYQAAAAAAVAAAAAADVAAAAAACVAAAAAACGwAAAAAAcQAAAAAAVAAAAAACVAAAAAACVAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAGwAAAAABcQAAAAAAVAAAAAAAVAAAAAABVAAAAAAAVAAAAAABVAAAAAAAVAAAAAABGwAAAAAAcQAAAAAAVAAAAAAAVAAAAAABVAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAGwAAAAACcQAAAAAAVAAAAAABVAAAAAACVAAAAAAAVAAAAAAAVAAAAAACVAAAAAACGwAAAAADcQAAAAAAVAAAAAACVAAAAAADVAAAAAABAAAAAAAAAAAAAAAAGwAAAAACGwAAAAACcQAAAAAAVAAAAAACVAAAAAADVAAAAAABVAAAAAABVAAAAAADVAAAAAAAGwAAAAADcQAAAAAAVAAAAAACVAAAAAACVAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAYAAAAAAAYAAAAAAAVAAAAAACVAAAAAABVAAAAAAAVAAAAAADVAAAAAADVAAAAAADGwAAAAAAcQAAAAAAVAAAAAABVAAAAAACVAAAAAACAAAAAAAAAAAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAABVAAAAAABVAAAAAAAVAAAAAADVAAAAAACVAAAAAAAGwAAAAAAcQAAAAAAVAAAAAABVAAAAAADVAAAAAAC + tiles: cQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAADVAAAAAADVAAAAAADcQAAAAAAVAAAAAADVAAAAAACVAAAAAABcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAAAcQAAAAAAcQAAAAAAVAAAAAAAVAAAAAABVAAAAAADcAAAAAAAcAAAAAAAcQAAAAAAVAAAAAACVAAAAAACVAAAAAABcQAAAAAAVAAAAAAAVAAAAAACVAAAAAAAVAAAAAADVAAAAAADcQAAAAAAVAAAAAABVAAAAAADVAAAAAACAAAAAAAAcAAAAAAAcQAAAAAAGwAAAAADGwAAAAABGwAAAAACcQAAAAAAGwAAAAADGwAAAAADGwAAAAAAVAAAAAADVAAAAAABcQAAAAAAVAAAAAACVAAAAAABVAAAAAABAAAAAAAAcAAAAAAAGwAAAAADGwAAAAADGwAAAAAAGwAAAAADGwAAAAACGwAAAAABGwAAAAABGwAAAAABVAAAAAABVAAAAAADcQAAAAAAVAAAAAADVAAAAAAAVAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAGwAAAAAAGwAAAAADGwAAAAADVAAAAAADVAAAAAABcQAAAAAAVAAAAAAAVAAAAAADVAAAAAABAAAAAAAAAAAAAAAAcQAAAAAAVAAAAAACVAAAAAACVAAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAABVAAAAAAAVAAAAAACcQAAAAAAVAAAAAACVAAAAAABVAAAAAADAAAAAAAAAAAAAAAAcQAAAAAAGwAAAAABGwAAAAABGwAAAAACGwAAAAABGwAAAAABGwAAAAACGwAAAAAAVAAAAAACVAAAAAAAVAAAAAAAVAAAAAABVAAAAAACVAAAAAACAAAAAAAAAAAAAAAAcQAAAAAAVAAAAAACVAAAAAADVAAAAAACcQAAAAAAGwAAAAABGwAAAAACGwAAAAACVAAAAAAAVAAAAAACcQAAAAAAVAAAAAACVAAAAAACVAAAAAABAAAAAAAAAAAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAAAGwAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAADVAAAAAACVAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAGwAAAAADGwAAAAABGwAAAAACGwAAAAABYQAAAAAAVAAAAAADVAAAAAACVAAAAAACGwAAAAAAcQAAAAAAVAAAAAACVAAAAAACVAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAGwAAAAABcQAAAAAAVAAAAAAAVAAAAAABVAAAAAAAVAAAAAABVAAAAAAAVAAAAAABGwAAAAAAcQAAAAAAVAAAAAAAVAAAAAABVAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAGwAAAAACcQAAAAAAVAAAAAABVAAAAAACVAAAAAAAVAAAAAAAVAAAAAACVAAAAAACGwAAAAADcQAAAAAAVAAAAAACVAAAAAADVAAAAAABAAAAAAAAAAAAAAAAGwAAAAACGwAAAAACcQAAAAAAVAAAAAACVAAAAAADVAAAAAABVAAAAAABVAAAAAADVAAAAAAAGwAAAAADcQAAAAAAVAAAAAACVAAAAAACVAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAYAAAAAAAYAAAAAAAVAAAAAACVAAAAAABVAAAAAAAVAAAAAADVAAAAAADVAAAAAADGwAAAAAAcQAAAAAAVAAAAAABVAAAAAACVAAAAAACAAAAAAAAAAAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAABVAAAAAABVAAAAAAAVAAAAAADVAAAAAACVAAAAAAAGwAAAAAAcQAAAAAAVAAAAAABVAAAAAADVAAAAAAC version: 6 -3,0: ind: -3,0 @@ -132,15 +132,15 @@ entities: version: 6 -4,-2: ind: -4,-2 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAcQAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAcQAAAAAAVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAcQAAAAAAVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAcQAAAAAAcQAAAAAA version: 6 -4,-1: ind: -4,-1 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAcQAAAAAAVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAcQAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 -3,-3: ind: -3,-3 - tiles: AAAAAAAAAAAAAAAAcAAAAAAAcQAAAAAASAAAAAAASAAAAAAASAAAAAAAcQAAAAAASAAAAAAAcQAAAAAAGwAAAAABGwAAAAAAGwAAAAAAGwAAAAACGwAAAAACGwAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAcQAAAAAASAAAAAAASAAAAAAASAAAAAAASAAAAAAASAAAAAAASAAAAAAAGwAAAAAAGwAAAAAAGwAAAAADGwAAAAACGwAAAAADGwAAAAADAAAAAAAAAAAAAAAAcAAAAAAAcQAAAAAASAAAAAAASAAAAAAASAAAAAAAcQAAAAAASAAAAAAAcQAAAAAAGwAAAAABGwAAAAADGwAAAAAAGwAAAAABGwAAAAABGwAAAAACAAAAAAAAAAAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAGwAAAAABcQAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAGwAAAAADGwAAAAADGwAAAAACGwAAAAACGwAAAAADGwAAAAAAGwAAAAABGwAAAAABVAAAAAABVAAAAAAAVAAAAAADAAAAAAAAAAAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAGwAAAAADGwAAAAABGwAAAAACGwAAAAADGwAAAAAAGwAAAAACGwAAAAACGwAAAAACVAAAAAADVAAAAAABVAAAAAACAAAAAAAAAAAAAAAAcQAAAAAAGwAAAAACGwAAAAABGwAAAAAAGwAAAAABGwAAAAACGwAAAAABGwAAAAADGwAAAAABGwAAAAAAcQAAAAAAVAAAAAACVAAAAAABVAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAGwAAAAACGwAAAAABGwAAAAABGwAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAACVAAAAAAAVAAAAAABAAAAAAAAAAAAAAAAcQAAAAAAGwAAAAACGwAAAAAAGwAAAAADGwAAAAABcQAAAAAAGwAAAAABGwAAAAABGwAAAAABcQAAAAAAVAAAAAABVAAAAAACVAAAAAABVAAAAAADAAAAAAAAAAAAAAAAcQAAAAAAGwAAAAACGwAAAAAAGwAAAAAAGwAAAAAAcQAAAAAAGwAAAAACGwAAAAADGwAAAAAAcQAAAAAAVAAAAAADVAAAAAACVAAAAAADVAAAAAABAAAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAGwAAAAAAGwAAAAABcQAAAAAAcQAAAAAAGwAAAAABGwAAAAAAGwAAAAAAcQAAAAAAVAAAAAABVAAAAAABVAAAAAADVAAAAAABAAAAAAAAcQAAAAAAGwAAAAAAGwAAAAADGwAAAAAAGwAAAAACGwAAAAAAGwAAAAADGwAAAAACGwAAAAABGwAAAAABcQAAAAAAVAAAAAACVAAAAAACVAAAAAADVAAAAAACcQAAAAAAcQAAAAAAGwAAAAABGwAAAAADGwAAAAADGwAAAAACGwAAAAACGwAAAAADGwAAAAACGwAAAAABGwAAAAAAcQAAAAAAcQAAAAAAVAAAAAADVAAAAAAAVAAAAAADcQAAAAAAcQAAAAAAGwAAAAACGwAAAAAAGwAAAAACGwAAAAADGwAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAADVAAAAAACVAAAAAAAcQAAAAAAcQAAAAAAGwAAAAACGwAAAAABGwAAAAAAGwAAAAACGwAAAAABcQAAAAAAVAAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAADVAAAAAACVAAAAAABVAAAAAACGwAAAAABGwAAAAAAGwAAAAABGwAAAAAAGwAAAAABGwAAAAADGwAAAAADcQAAAAAAVAAAAAADVAAAAAABcQAAAAAAcQAAAAAAVAAAAAAAVAAAAAACVAAAAAACVAAAAAAB + tiles: AAAAAAAAAAAAAAAAcAAAAAAAcQAAAAAASAAAAAAASAAAAAAASAAAAAAAcQAAAAAASAAAAAAAcQAAAAAAGwAAAAABGwAAAAAAGwAAAAAAGwAAAAACGwAAAAACGwAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAcQAAAAAASAAAAAAASAAAAAAASAAAAAAASAAAAAAASAAAAAAASAAAAAAAGwAAAAAAGwAAAAAAGwAAAAADGwAAAAACGwAAAAADGwAAAAADAAAAAAAAAAAAAAAAcAAAAAAAcQAAAAAASAAAAAAASAAAAAAASAAAAAAAcQAAAAAASAAAAAAAcQAAAAAAGwAAAAABGwAAAAADGwAAAAAAGwAAAAABGwAAAAABGwAAAAACAAAAAAAAAAAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAGwAAAAABcQAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAGwAAAAADGwAAAAADGwAAAAACGwAAAAACGwAAAAADGwAAAAAAGwAAAAABGwAAAAABVAAAAAABVAAAAAAAVAAAAAADAAAAAAAAAAAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAGwAAAAADGwAAAAABGwAAAAACGwAAAAADGwAAAAAAGwAAAAACGwAAAAACGwAAAAACVAAAAAADVAAAAAABVAAAAAACAAAAAAAAAAAAAAAAcQAAAAAAGwAAAAACGwAAAAABGwAAAAAAGwAAAAABGwAAAAACGwAAAAABGwAAAAADGwAAAAABGwAAAAAAcQAAAAAAVAAAAAACVAAAAAABVAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAGwAAAAACGwAAAAABGwAAAAABGwAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAACVAAAAAAAVAAAAAABAAAAAAAAAAAAAAAAcQAAAAAAGwAAAAACGwAAAAAAGwAAAAADGwAAAAABcQAAAAAAGwAAAAABGwAAAAABGwAAAAABcQAAAAAAVAAAAAABVAAAAAACVAAAAAABVAAAAAADAAAAAAAAAAAAAAAAcQAAAAAAGwAAAAACGwAAAAAAGwAAAAAAGwAAAAAAcQAAAAAAGwAAAAACGwAAAAADGwAAAAAAcQAAAAAAVAAAAAADVAAAAAACVAAAAAADVAAAAAABAAAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAGwAAAAAAGwAAAAABcQAAAAAAcQAAAAAAGwAAAAABGwAAAAAAGwAAAAAAcQAAAAAAVAAAAAABVAAAAAABVAAAAAADVAAAAAABAAAAAAAAcQAAAAAAGwAAAAAAGwAAAAADGwAAAAAAGwAAAAACGwAAAAAAGwAAAAADGwAAAAACGwAAAAABGwAAAAABcQAAAAAAVAAAAAACVAAAAAACVAAAAAADVAAAAAACcQAAAAAAcQAAAAAAGwAAAAABGwAAAAADGwAAAAADGwAAAAACGwAAAAACGwAAAAADGwAAAAACGwAAAAABGwAAAAAAcQAAAAAAcQAAAAAAVAAAAAADVAAAAAAAVAAAAAADcQAAAAAAcQAAAAAAGwAAAAACGwAAAAAAGwAAAAACGwAAAAADGwAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAADVAAAAAACVAAAAAAAcQAAAAAAcQAAAAAAGwAAAAACGwAAAAABGwAAAAAAGwAAAAACGwAAAAABcQAAAAAAVAAAAAAAcQAAAAAAcQAAAAAAVAAAAAAAVAAAAAADVAAAAAACVAAAAAABVAAAAAACGwAAAAABGwAAAAAAGwAAAAABGwAAAAAAGwAAAAABGwAAAAADGwAAAAADcQAAAAAAVAAAAAADVAAAAAABcQAAAAAAcQAAAAAAVAAAAAAAVAAAAAACVAAAAAACVAAAAAAB version: 6 -2,-3: ind: -2,-3 @@ -212,7 +212,7 @@ entities: version: 6 1,1: ind: 1,1 - tiles: GwAAAAABGwAAAAAAcQAAAAAAZAAAAAAAZAAAAAADZAAAAAABZAAAAAADZAAAAAACZAAAAAACZAAAAAACZAAAAAABcQAAAAAAVAAAAAABVAAAAAACVAAAAAABVAAAAAAAGwAAAAABGwAAAAADcQAAAAAAZAAAAAADZAAAAAAAZAAAAAACZAAAAAACZAAAAAADZAAAAAACZAAAAAABZAAAAAAAcQAAAAAAVAAAAAADVAAAAAAAVAAAAAAAcQAAAAAAGwAAAAACGwAAAAAAcQAAAAAAZAAAAAABZAAAAAABZAAAAAABZAAAAAADZAAAAAABZAAAAAADZAAAAAAAZAAAAAABcQAAAAAAVAAAAAABVAAAAAABVAAAAAACcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAZAAAAAACZAAAAAADZAAAAAACZAAAAAABZAAAAAACZAAAAAABcQAAAAAAVAAAAAACVAAAAAABVAAAAAADcQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcQAAAAAAcQAAAAAAKgAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAABVAAAAAABVAAAAAAAcQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcQAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAcQAAAAAAcQAAAAAAVAAAAAAAcQAAAAAAcQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcQAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAcQAAAAAAVAAAAAAAVAAAAAACVAAAAAACcQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcQAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAcQAAAAAAVAAAAAADVAAAAAACVAAAAAACVAAAAAADcQAAAAAAVAAAAAABcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAABVAAAAAADVAAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAABVAAAAAACVAAAAAADVAAAAAADcQAAAAAAVAAAAAADVAAAAAACVAAAAAADcQAAAAAAcQAAAAAAVAAAAAABVAAAAAAAVAAAAAABcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAAAVAAAAAADVAAAAAADVAAAAAABcQAAAAAAVAAAAAABVAAAAAADVAAAAAADVAAAAAABcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAACVAAAAAADVAAAAAABVAAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAAAVAAAAAABVAAAAAACVAAAAAAAcQAAAAAAGwAAAAADGwAAAAAAGwAAAAADGwAAAAACGwAAAAABGwAAAAAAGwAAAAAAGwAAAAABVAAAAAADcQAAAAAAVAAAAAACVAAAAAACVAAAAAADVAAAAAADVAAAAAACcQAAAAAAGwAAAAADGwAAAAABGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAVAAAAAAAcQAAAAAAVAAAAAADVAAAAAADVAAAAAAAVAAAAAAAVAAAAAAAcQAAAAAAGwAAAAACGwAAAAABGwAAAAABGwAAAAADGwAAAAADGwAAAAAAGwAAAAACGwAAAAADGwAAAAACVAAAAAAAVAAAAAABVAAAAAABVAAAAAACVAAAAAADcQAAAAAA + tiles: GwAAAAABGwAAAAAAcQAAAAAAZAAAAAAAZAAAAAADZAAAAAABZAAAAAADZAAAAAACZAAAAAACZAAAAAACZAAAAAABcQAAAAAAVAAAAAABVAAAAAACVAAAAAABVAAAAAAAGwAAAAABGwAAAAADcQAAAAAAZAAAAAADZAAAAAAAZAAAAAACZAAAAAACZAAAAAADZAAAAAACZAAAAAABZAAAAAAAcQAAAAAAVAAAAAADVAAAAAAAVAAAAAAAVAAAAAAAGwAAAAACGwAAAAAAcQAAAAAAZAAAAAABZAAAAAABZAAAAAABZAAAAAADZAAAAAABZAAAAAADZAAAAAAAZAAAAAABcQAAAAAAVAAAAAABVAAAAAABVAAAAAACcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAZAAAAAACZAAAAAADZAAAAAACZAAAAAABZAAAAAACZAAAAAABcQAAAAAAVAAAAAACVAAAAAABVAAAAAADcQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcQAAAAAAcQAAAAAAKgAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAABVAAAAAABVAAAAAAAcQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcQAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAcQAAAAAAcQAAAAAAVAAAAAAAcQAAAAAAcQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcQAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAcQAAAAAAVAAAAAAAVAAAAAACVAAAAAACcQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcQAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAcQAAAAAAVAAAAAADVAAAAAACVAAAAAACVAAAAAADcQAAAAAAVAAAAAABcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAABVAAAAAADVAAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAABVAAAAAACVAAAAAADVAAAAAADcQAAAAAAVAAAAAADVAAAAAACVAAAAAADcQAAAAAAcQAAAAAAVAAAAAABVAAAAAAAVAAAAAABcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAAAVAAAAAADVAAAAAADVAAAAAABcQAAAAAAVAAAAAABVAAAAAADVAAAAAADVAAAAAABcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAACVAAAAAADVAAAAAABVAAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAAAVAAAAAABVAAAAAACVAAAAAAAcQAAAAAAGwAAAAADGwAAAAAAGwAAAAADGwAAAAACGwAAAAABGwAAAAAAGwAAAAAAGwAAAAABVAAAAAADcQAAAAAAVAAAAAACVAAAAAACVAAAAAADVAAAAAADVAAAAAACcQAAAAAAGwAAAAADGwAAAAABGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAVAAAAAAAcQAAAAAAVAAAAAADVAAAAAADVAAAAAAAVAAAAAAAVAAAAAAAcQAAAAAAGwAAAAACGwAAAAABGwAAAAABGwAAAAADGwAAAAADGwAAAAAAGwAAAAACGwAAAAADGwAAAAACVAAAAAAAVAAAAAABVAAAAAABVAAAAAACVAAAAAADcQAAAAAA version: 6 2,1: ind: 2,1 @@ -340,11 +340,11 @@ entities: version: 6 1,-3: ind: 1,-3 - tiles: cQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAAAVAAAAAAAVAAAAAAAVAAAAAAAVAAAAAAAVAAAAAAAVAAAAAAAVAAAAAAAVAAAAAAAVAAAAAAAVAAAAAAAVAAAAAAAVAAAAAAAVAAAAAAAVAAAAAAAVAAAAAAAVAAAAAAAcQAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAcQAAAAAAGwAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAJgAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAJgAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAACcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAABcQAAAAAAcQAAAAAAVAAAAAACcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAACcQAAAAAAVAAAAAABVAAAAAADcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAASgAAAAAAbQAAAAADbQAAAAAAbQAAAAAAbQAAAAACbQAAAAAAGwAAAAAAGwAAAAADcQAAAAAAVAAAAAADVAAAAAADVAAAAAAAVAAAAAADcQAAAAAAcQAAAAAAcQAAAAAA + tiles: cQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAAAVAAAAAAAVAAAAAAAVAAAAAAAVAAAAAAAVAAAAAAAVAAAAAAAVAAAAAAAVAAAAAAAVAAAAAAAVAAAAAAAVAAAAAAAVAAAAAAAVAAAAAAAVAAAAAAAVAAAAAAAVAAAAAAAcQAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAcQAAAAAAGwAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAGwAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAJgAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAJgAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAACcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAABcQAAAAAAcQAAAAAAVAAAAAACcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAACcQAAAAAAVAAAAAABVAAAAAADcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAASgAAAAAAbQAAAAADbQAAAAAAbQAAAAAAbQAAAAACbQAAAAAAGwAAAAAAGwAAAAADcQAAAAAAVAAAAAADVAAAAAADVAAAAAAAVAAAAAADcQAAAAAAcQAAAAAAcQAAAAAA version: 6 0,-3: ind: 0,-3 - tiles: GwAAAAACcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAADVAAAAAABVAAAAAADVAAAAAAAVAAAAAAAYAAAAAAAYAAAAAAAYAAAAAAAYAAAAAAAcQAAAAAAVAAAAAAAVAAAAAABVAAAAAADVAAAAAAAVAAAAAADVAAAAAADVAAAAAACVAAAAAABVAAAAAACcQAAAAAAVAAAAAAAYAAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAABVAAAAAACVAAAAAAAVAAAAAACVAAAAAAAVAAAAAACVAAAAAACVAAAAAABGwAAAAACcQAAAAAAVAAAAAAAYAAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAGwAAAAABGwAAAAACGwAAAAAAGwAAAAABGwAAAAACVAAAAAABVAAAAAAAGwAAAAABGwAAAAAAcQAAAAAAVAAAAAAAYAAAAAAAcQAAAAAAHAAAAAAAcQAAAAAAcQAAAAAAVAAAAAADcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAADVAAAAAADcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAAAYAAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAABVAAAAAADVAAAAAADcQAAAAAAVAAAAAABVAAAAAABVAAAAAADVAAAAAAAVAAAAAADcQAAAAAAVAAAAAAAYAAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAACVAAAAAAAVAAAAAADVAAAAAADVAAAAAADVAAAAAABVAAAAAAAVAAAAAACVAAAAAAAVAAAAAABVAAAAAAAYAAAAAAAYAAAAAAAYAAAAAAAYAAAAAAAcQAAAAAAVAAAAAACVAAAAAADVAAAAAADVAAAAAAAVAAAAAADVAAAAAACVAAAAAABVAAAAAACVAAAAAAAVAAAAAADVAAAAAAAVAAAAAAAVAAAAAAAVAAAAAAAVAAAAAAAVAAAAAAAVAAAAAADVAAAAAAAVAAAAAAAcQAAAAAAVAAAAAADVAAAAAAAVAAAAAABVAAAAAABVAAAAAABcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAADVAAAAAABVAAAAAADcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAAAVAAAAAACVAAAAAAAcQAAAAAAVAAAAAAAJgAAAAAAcQAAAAAAcQAAAAAAVAAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAAAcQAAAAAAcQAAAAAAVAAAAAAAVAAAAAADVAAAAAABcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAAAVAAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAADVAAAAAADcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAAAVAAAAAACVAAAAAABcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAACVAAAAAAAVAAAAAABVAAAAAACVAAAAAACVAAAAAAAVAAAAAAAVAAAAAABcQAAAAAAVAAAAAAAcQAAAAAAcQAAAAAAVAAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAABVAAAAAACVAAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAACVAAAAAADVAAAAAADcQAAAAAAVAAAAAACVAAAAAAAVAAAAAAAVAAAAAACVAAAAAADVAAAAAABVAAAAAAAcQAAAAAAVAAAAAAAVAAAAAAAVAAAAAACcQAAAAAA + tiles: GwAAAAACcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAADVAAAAAABVAAAAAADVAAAAAAAVAAAAAAAYAAAAAAAYAAAAAAAYAAAAAAAYAAAAAAAcQAAAAAAVAAAAAAAVAAAAAABVAAAAAADVAAAAAAAVAAAAAADVAAAAAADVAAAAAACVAAAAAABVAAAAAACcQAAAAAAVAAAAAAAYAAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAABVAAAAAACVAAAAAAAVAAAAAACVAAAAAAAVAAAAAACVAAAAAACVAAAAAABGwAAAAACcQAAAAAAVAAAAAAAYAAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAGwAAAAABGwAAAAACGwAAAAAAGwAAAAABGwAAAAACVAAAAAABVAAAAAAAGwAAAAABGwAAAAAAcQAAAAAAVAAAAAAAYAAAAAAAcQAAAAAAHAAAAAAAcQAAAAAAcQAAAAAAVAAAAAADcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAADVAAAAAADcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAAAYAAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAABVAAAAAADVAAAAAADcQAAAAAAVAAAAAABVAAAAAABVAAAAAADVAAAAAAAVAAAAAADcQAAAAAAVAAAAAAAYAAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAACVAAAAAAAVAAAAAADVAAAAAADVAAAAAADVAAAAAABVAAAAAAAVAAAAAACVAAAAAAAVAAAAAABVAAAAAAAYAAAAAAAYAAAAAAAYAAAAAAAYAAAAAAAcQAAAAAAVAAAAAACVAAAAAADVAAAAAADVAAAAAAAVAAAAAADVAAAAAACVAAAAAABVAAAAAACVAAAAAAAVAAAAAADVAAAAAAAVAAAAAAAVAAAAAAAVAAAAAAAVAAAAAAAVAAAAAAAVAAAAAADVAAAAAAAVAAAAAAAcQAAAAAAVAAAAAADVAAAAAAAVAAAAAABVAAAAAABVAAAAAABcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAADVAAAAAABVAAAAAADcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAAAVAAAAAACVAAAAAAAcQAAAAAAVAAAAAAAJgAAAAAAcQAAAAAAcQAAAAAAVAAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAAAcQAAAAAAcQAAAAAAVAAAAAAAVAAAAAADVAAAAAABcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAAAVAAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAADVAAAAAADcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAAAVAAAAAACVAAAAAABcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAACVAAAAAAAVAAAAAABVAAAAAACVAAAAAACVAAAAAAAVAAAAAAAVAAAAAABcQAAAAAAVAAAAAAAcQAAAAAAcQAAAAAAVAAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAABVAAAAAACVAAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVAAAAAACVAAAAAADVAAAAAADcQAAAAAAVAAAAAACVAAAAAAAVAAAAAAAVAAAAAACVAAAAAADVAAAAAABVAAAAAAAcQAAAAAAVAAAAAAAVAAAAAAAVAAAAAACcQAAAAAA version: 6 0,-4: ind: 0,-4 @@ -13558,6 +13558,16 @@ entities: - type: Transform pos: -21.5,12.5 parent: 2 + - uid: 12222 + components: + - type: Transform + pos: 2.5,-42.5 + parent: 2 + - uid: 12224 + components: + - type: Transform + pos: 1.5,-42.5 + parent: 2 - proto: Airlock entities: - uid: 146 @@ -14388,6 +14398,24 @@ entities: rot: -1.5707963267948966 rad pos: -43.5,22.5 parent: 2 + - uid: 16324 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -51.5,-18.5 + parent: 2 + - uid: 16373 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -51.5,-19.5 + parent: 2 + - uid: 23014 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -51.5,-20.5 + parent: 2 - proto: AirlockExternalLocked entities: - uid: 263 @@ -15105,7 +15133,7 @@ entities: pos: 34.5,-35.5 parent: 2 - type: Door - secondsUntilStateChange: -52177.2 + secondsUntilStateChange: -53230.88 state: Opening - uid: 383 components: @@ -17745,7 +17773,6 @@ entities: solutions: beaker: temperature: 293.15 - canMix: True canReact: True maxVol: 50 name: null @@ -17764,7 +17791,6 @@ entities: solutions: beaker: temperature: 293.15 - canMix: True canReact: True maxVol: 50 name: null @@ -17787,7 +17813,6 @@ entities: solutions: beaker: temperature: 293.15 - canMix: True canReact: True maxVol: 50 name: null @@ -44026,11 +44051,6 @@ entities: - type: Transform pos: -6.5,-56.5 parent: 2 - - uid: 5940 - components: - - type: Transform - pos: 34.5,-46.5 - parent: 2 - uid: 5941 components: - type: Transform @@ -44059,17 +44079,7 @@ entities: - uid: 5946 components: - type: Transform - pos: 35.5,-49.5 - parent: 2 - - uid: 5947 - components: - - type: Transform - pos: 35.5,-47.5 - parent: 2 - - uid: 5948 - components: - - type: Transform - pos: 35.5,-48.5 + pos: 34.5,-47.5 parent: 2 - uid: 5949 components: @@ -44516,6 +44526,16 @@ entities: - type: Transform pos: 4.5,-69.5 parent: 2 + - uid: 7208 + components: + - type: Transform + pos: 34.5,-46.5 + parent: 2 + - uid: 16303 + components: + - type: Transform + pos: 34.5,-48.5 + parent: 2 - uid: 23837 components: - type: Transform @@ -50491,12 +50511,6 @@ entities: parent: 2 - proto: CableTerminal entities: - - uid: 7208 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 34.5,-46.5 - parent: 2 - uid: 7209 components: - type: Transform @@ -50562,6 +50576,11 @@ entities: rot: 1.5707963267948966 rad pos: 7.5,34.5 parent: 2 + - uid: 18224 + components: + - type: Transform + pos: 34.5,-45.5 + parent: 2 - proto: CandleRedInfinite entities: - uid: 7220 @@ -77745,7 +77764,7 @@ entities: pos: 31.5,-61.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#FF00BFFF' - uid: 11547 components: - type: Transform @@ -77753,7 +77772,7 @@ entities: pos: 31.5,-57.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#FF00BFFF' - proto: GasMixerFlipped entities: - uid: 11548 @@ -77769,7 +77788,7 @@ entities: pos: 31.5,-53.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#FF00BFFF' - uid: 11550 components: - type: Transform @@ -77777,7 +77796,7 @@ entities: pos: 24.5,-63.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#FF00BFFF' - uid: 11551 components: - type: Transform @@ -77787,7 +77806,7 @@ entities: inletTwoConcentration: 0.22000003 inletOneConcentration: 0.78 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#0000FFFF' - proto: GasOutletInjector entities: - uid: 11552 @@ -77845,6 +77864,8 @@ entities: rot: 1.5707963267948966 rad pos: 18.5,-53.5 parent: 2 + - type: AtmosPipeColor + color: '#0000FFFF' - uid: 11560 components: - type: Transform @@ -77946,7 +77967,7 @@ entities: pos: 18.5,-63.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#0000FFFF' - uid: 11571 components: - type: Transform @@ -77954,7 +77975,7 @@ entities: pos: 18.5,-59.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#0000FFFF' - uid: 11572 components: - type: Transform @@ -77962,7 +77983,7 @@ entities: pos: 18.5,-55.5 parent: 2 - type: AtmosPipeColor - color: '#03E8FCFF' + color: '#0000FFFF' - uid: 11573 components: - type: Transform @@ -77970,7 +77991,7 @@ entities: pos: 36.5,-53.5 parent: 2 - type: AtmosPipeColor - color: '#9003FCFF' + color: '#FF00BFFF' - uid: 14655 components: - type: Transform @@ -78005,7 +78026,7 @@ entities: pos: 31.5,-45.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11576 components: - type: Transform @@ -78018,7 +78039,7 @@ entities: pos: 45.5,-25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11578 components: - type: Transform @@ -78061,7 +78082,7 @@ entities: pos: -6.5,-35.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11585 components: - type: Transform @@ -78088,7 +78109,7 @@ entities: pos: 34.5,-45.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11589 components: - type: Transform @@ -78245,7 +78266,7 @@ entities: pos: 20.5,-58.5 parent: 2 - type: AtmosPipeColor - color: '#00FFFFFF' + color: '#0000FFFF' - uid: 11611 components: - type: Transform @@ -78253,14 +78274,14 @@ entities: pos: 22.5,-52.5 parent: 2 - type: AtmosPipeColor - color: '#03E8FCFF' + color: '#0000FFFF' - uid: 11612 components: - type: Transform pos: 20.5,-53.5 parent: 2 - type: AtmosPipeColor - color: '#00FFFFFF' + color: '#0000FFFF' - uid: 11613 components: - type: Transform @@ -78299,7 +78320,7 @@ entities: pos: 22.5,-55.5 parent: 2 - type: AtmosPipeColor - color: '#03E8FCFF' + color: '#0000FFFF' - uid: 11618 components: - type: Transform @@ -78307,14 +78328,14 @@ entities: pos: 20.5,-62.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#0000FFFF' - uid: 11619 components: - type: Transform pos: 24.5,-62.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#FF00BFFF' - uid: 11620 components: - type: Transform @@ -78322,7 +78343,7 @@ entities: pos: 31.5,-63.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#FF00BFFF' - uid: 11621 components: - type: Transform @@ -78411,7 +78432,7 @@ entities: pos: 27.5,-52.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11633 components: - type: Transform @@ -78457,7 +78478,7 @@ entities: pos: 31.5,-46.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11639 components: - type: Transform @@ -78465,14 +78486,14 @@ entities: pos: 34.5,-43.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11640 components: - type: Transform pos: 27.5,-41.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11641 components: - type: Transform @@ -78480,7 +78501,7 @@ entities: pos: 0.5,-41.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11642 components: - type: Transform @@ -78502,7 +78523,7 @@ entities: pos: -24.5,-28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11645 components: - type: Transform @@ -78510,7 +78531,7 @@ entities: pos: -24.5,-31.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11646 components: - type: Transform @@ -78518,7 +78539,7 @@ entities: pos: -28.5,-31.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11647 components: - type: Transform @@ -78526,14 +78547,14 @@ entities: pos: -28.5,-32.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11648 components: - type: Transform pos: -41.5,-32.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11649 components: - type: Transform @@ -78541,7 +78562,7 @@ entities: pos: -41.5,-43.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11650 components: - type: Transform @@ -78555,7 +78576,7 @@ entities: pos: -12.5,-47.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11652 components: - type: Transform @@ -78563,7 +78584,7 @@ entities: pos: 37.5,17.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11653 components: - type: Transform @@ -78571,7 +78592,7 @@ entities: pos: 38.5,-32.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11654 components: - type: Transform @@ -78585,7 +78606,7 @@ entities: pos: 6.5,-46.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11656 components: - type: Transform @@ -78593,7 +78614,7 @@ entities: pos: 6.5,-54.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11657 components: - type: Transform @@ -78601,7 +78622,7 @@ entities: pos: 2.5,-54.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11658 components: - type: Transform @@ -78609,7 +78630,7 @@ entities: pos: 2.5,-56.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11659 components: - type: Transform @@ -78617,7 +78638,7 @@ entities: pos: -7.5,-56.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11660 components: - type: Transform @@ -78625,7 +78646,7 @@ entities: pos: -7.5,-57.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11661 components: - type: Transform @@ -78641,7 +78662,7 @@ entities: pos: -4.5,-61.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11663 components: - type: Transform @@ -78649,7 +78670,7 @@ entities: pos: -5.5,-61.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11664 components: - type: Transform @@ -78657,7 +78678,7 @@ entities: pos: -5.5,-76.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11665 components: - type: Transform @@ -78665,7 +78686,7 @@ entities: pos: 6.5,-76.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11666 components: - type: Transform @@ -78673,7 +78694,7 @@ entities: pos: 6.5,-64.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11667 components: - type: Transform @@ -78689,7 +78710,7 @@ entities: pos: 14.5,-11.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11669 components: - type: Transform @@ -78697,7 +78718,7 @@ entities: pos: 17.5,-11.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11670 components: - type: Transform @@ -78705,7 +78726,7 @@ entities: pos: -34.5,-23.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11671 components: - type: Transform @@ -78729,14 +78750,14 @@ entities: pos: -30.5,-5.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11674 components: - type: Transform pos: 10.5,4.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11675 components: - type: Transform @@ -78744,14 +78765,14 @@ entities: pos: -19.5,18.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11676 components: - type: Transform pos: -16.5,34.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11677 components: - type: Transform @@ -78759,7 +78780,7 @@ entities: pos: -17.5,34.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11678 components: - type: Transform @@ -78767,7 +78788,7 @@ entities: pos: -17.5,39.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11679 components: - type: Transform @@ -78775,7 +78796,7 @@ entities: pos: -24.5,27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11680 components: - type: Transform @@ -78783,7 +78804,7 @@ entities: pos: -31.5,23.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11681 components: - type: Transform @@ -78791,7 +78812,7 @@ entities: pos: -41.5,28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11682 components: - type: Transform @@ -78807,7 +78828,7 @@ entities: pos: -2.5,59.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11684 components: - type: Transform @@ -78815,7 +78836,7 @@ entities: pos: -2.5,54.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11685 components: - type: Transform @@ -78823,14 +78844,14 @@ entities: pos: -6.5,54.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11686 components: - type: Transform pos: 7.5,52.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11687 components: - type: Transform @@ -78838,14 +78859,14 @@ entities: pos: 4.5,52.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11688 components: - type: Transform pos: 5.5,17.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11689 components: - type: Transform @@ -78853,14 +78874,14 @@ entities: pos: 22.5,13.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11690 components: - type: Transform pos: 22.5,16.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11691 components: - type: Transform @@ -78868,7 +78889,7 @@ entities: pos: 42.5,6.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11692 components: - type: Transform @@ -78876,21 +78897,21 @@ entities: pos: 19.5,30.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11693 components: - type: Transform pos: 28.5,38.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11694 components: - type: Transform pos: 32.5,34.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11695 components: - type: Transform @@ -78898,7 +78919,7 @@ entities: pos: 44.5,27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11696 components: - type: Transform @@ -78906,14 +78927,14 @@ entities: pos: 40.5,39.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11697 components: - type: Transform pos: 44.5,42.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11698 components: - type: Transform @@ -78921,14 +78942,14 @@ entities: pos: -29.5,6.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11699 components: - type: Transform pos: 20.5,13.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11700 components: - type: Transform @@ -78936,7 +78957,7 @@ entities: pos: 32.5,-11.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11701 components: - type: Transform @@ -78944,7 +78965,7 @@ entities: pos: 32.5,-4.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11702 components: - type: Transform @@ -78952,14 +78973,14 @@ entities: pos: 34.5,-4.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11703 components: - type: Transform pos: 34.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11704 components: - type: Transform @@ -78967,21 +78988,21 @@ entities: pos: 9.5,4.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11705 components: - type: Transform pos: 26.5,-18.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11706 components: - type: Transform pos: 43.5,-11.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11707 components: - type: Transform @@ -78989,7 +79010,7 @@ entities: pos: 43.5,-17.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11708 components: - type: Transform @@ -78997,7 +79018,7 @@ entities: pos: 9.5,-52.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11709 components: - type: Transform @@ -79012,7 +79033,7 @@ entities: pos: 9.5,-53.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11711 components: - type: Transform @@ -79020,7 +79041,7 @@ entities: pos: 30.5,-31.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11712 components: - type: Transform @@ -79028,7 +79049,7 @@ entities: pos: 32.5,14.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11713 components: - type: Transform @@ -79036,7 +79057,7 @@ entities: pos: 42.5,17.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11714 components: - type: Transform @@ -79044,7 +79065,7 @@ entities: pos: 37.5,15.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11715 components: - type: Transform @@ -79429,7 +79450,7 @@ entities: pos: -22.5,-32.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11765 components: - type: Transform @@ -79452,7 +79473,7 @@ entities: pos: -15.5,-20.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11768 components: - type: Transform @@ -79492,7 +79513,7 @@ entities: pos: -4.5,-36.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11773 components: - type: Transform @@ -79500,7 +79521,7 @@ entities: pos: -4.5,-40.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11774 components: - type: Transform @@ -79524,7 +79545,7 @@ entities: pos: -35.5,-32.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11777 components: - type: Transform @@ -79532,14 +79553,14 @@ entities: pos: -35.5,-28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11778 components: - type: Transform pos: -29.5,-39.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11779 components: - type: Transform @@ -79562,7 +79583,7 @@ entities: pos: -32.5,-48.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11782 components: - type: Transform @@ -79570,7 +79591,7 @@ entities: pos: -33.5,-48.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11783 components: - type: Transform @@ -79601,7 +79622,7 @@ entities: pos: -11.5,10.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11787 components: - type: Transform @@ -79609,7 +79630,7 @@ entities: pos: -8.5,22.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11788 components: - type: Transform @@ -79647,7 +79668,7 @@ entities: pos: -11.5,32.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11793 components: - type: Transform @@ -79663,7 +79684,7 @@ entities: pos: -19.5,32.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11795 components: - type: Transform @@ -79695,7 +79716,7 @@ entities: pos: -28.5,34.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11799 components: - type: Transform @@ -79726,7 +79747,7 @@ entities: pos: -41.5,36.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11803 components: - type: Transform @@ -79734,7 +79755,7 @@ entities: pos: -37.5,39.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11804 components: - type: Transform @@ -79750,7 +79771,7 @@ entities: pos: -41.5,26.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11806 components: - type: Transform @@ -79766,7 +79787,7 @@ entities: pos: -35.5,20.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11808 components: - type: Transform @@ -79774,7 +79795,7 @@ entities: pos: -23.5,24.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11809 components: - type: Transform @@ -79782,7 +79803,7 @@ entities: pos: 7.5,34.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11810 components: - type: Transform @@ -79836,7 +79857,7 @@ entities: pos: 6.5,59.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11817 components: - type: Transform @@ -79867,14 +79888,14 @@ entities: pos: -3.5,71.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11821 components: - type: Transform pos: -3.5,72.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11822 components: - type: Transform @@ -79882,7 +79903,7 @@ entities: pos: -4.5,72.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11823 components: - type: Transform @@ -79906,7 +79927,7 @@ entities: pos: 6.5,73.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11826 components: - type: Transform @@ -79914,7 +79935,7 @@ entities: pos: 7.5,73.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11827 components: - type: Transform @@ -79922,14 +79943,14 @@ entities: pos: 5.5,82.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11828 components: - type: Transform pos: 5.5,83.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11829 components: - type: Transform @@ -79968,7 +79989,7 @@ entities: pos: -2.5,83.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11834 components: - type: Transform @@ -79976,7 +79997,7 @@ entities: pos: -2.5,82.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11835 components: - type: Transform @@ -79984,7 +80005,7 @@ entities: pos: -4.5,82.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11836 components: - type: Transform @@ -79992,7 +80013,7 @@ entities: pos: -4.5,76.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11837 components: - type: Transform @@ -80015,7 +80036,7 @@ entities: pos: 18.5,25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11840 components: - type: Transform @@ -80023,7 +80044,7 @@ entities: pos: 13.5,-25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11841 components: - type: Transform @@ -80031,7 +80052,7 @@ entities: pos: 13.5,-24.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11842 components: - type: Transform @@ -80044,7 +80065,7 @@ entities: pos: 15.5,-24.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11844 components: - type: Transform @@ -80052,7 +80073,7 @@ entities: pos: 15.5,-25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11845 components: - type: Transform @@ -80079,7 +80100,7 @@ entities: pos: 28.5,-53.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#FF00BFFF' - uid: 11849 components: - type: Transform @@ -80100,56 +80121,56 @@ entities: pos: -22.5,-28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11852 components: - type: Transform pos: -12.5,-35.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11853 components: - type: Transform pos: -12.5,-44.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11854 components: - type: Transform pos: 5.5,-41.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11855 components: - type: Transform pos: 19.5,-25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11856 components: - type: Transform pos: 38.5,-25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11857 components: - type: Transform pos: 30.5,-25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11858 components: - type: Transform pos: -4.5,-56.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11859 components: - type: Transform @@ -80163,14 +80184,14 @@ entities: pos: -34.5,8.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11861 components: - type: Transform pos: 0.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11862 components: - type: Transform @@ -80184,56 +80205,56 @@ entities: pos: -16.5,27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11864 components: - type: Transform pos: -16.5,32.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11865 components: - type: Transform pos: -35.5,23.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11866 components: - type: Transform pos: 0.5,29.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11867 components: - type: Transform pos: 0.5,59.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11868 components: - type: Transform pos: 28.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11869 components: - type: Transform pos: 28.5,6.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11870 components: - type: Transform pos: 28.5,30.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11871 components: - type: Transform @@ -80332,7 +80353,7 @@ entities: pos: 8.5,-53.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11885 components: - type: Transform @@ -80340,14 +80361,14 @@ entities: pos: -30.5,-26.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11886 components: - type: Transform pos: -6.5,-29.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11887 components: - type: Transform @@ -80355,7 +80376,7 @@ entities: pos: 39.5,17.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11888 components: - type: Transform @@ -80377,7 +80398,7 @@ entities: pos: 6.5,54.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11891 components: - type: Transform @@ -80453,7 +80474,7 @@ entities: pos: -8.5,-35.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11904 components: - type: Transform @@ -80461,7 +80482,7 @@ entities: pos: -6.5,-34.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11905 components: - type: Transform @@ -80469,7 +80490,7 @@ entities: pos: -7.5,-35.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11906 components: - type: Transform @@ -80484,7 +80505,7 @@ entities: pos: 10.5,2.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11908 components: - type: Transform @@ -80492,7 +80513,7 @@ entities: pos: 7.5,37.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11909 components: - type: Transform @@ -80521,7 +80542,7 @@ entities: pos: -12.5,-40.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11913 components: - type: Transform @@ -80529,14 +80550,14 @@ entities: pos: 7.5,38.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11914 components: - type: Transform pos: 26.5,-59.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#FF00BFFF' - uid: 11915 components: - type: Transform @@ -80544,7 +80565,7 @@ entities: pos: -9.5,-35.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11916 components: - type: Transform @@ -80552,7 +80573,7 @@ entities: pos: 35.5,15.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 11917 components: - type: Transform @@ -81085,7 +81106,7 @@ entities: pos: 20.5,-55.5 parent: 2 - type: AtmosPipeColor - color: '#00FFFFFF' + color: '#0000FFFF' - uid: 11987 components: - type: Transform @@ -81124,7 +81145,7 @@ entities: pos: 29.5,-53.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#FF00BFFF' - uid: 11992 components: - type: Transform @@ -81132,7 +81153,7 @@ entities: pos: 27.5,-53.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#FF00BFFF' - uid: 11993 components: - type: Transform @@ -81140,7 +81161,7 @@ entities: pos: 31.5,-54.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#FF00BFFF' - uid: 11994 components: - type: Transform @@ -81154,7 +81175,7 @@ entities: pos: 28.5,-54.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#FF00BFFF' - uid: 11996 components: - type: Transform @@ -81184,14 +81205,14 @@ entities: pos: 26.5,-62.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#FF00BFFF' - uid: 12000 components: - type: Transform pos: 26.5,-63.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#FF00BFFF' - uid: 12001 components: - type: Transform @@ -81221,7 +81242,7 @@ entities: pos: 33.5,-53.5 parent: 2 - type: AtmosPipeColor - color: '#9003FCFF' + color: '#FF00BFFF' - uid: 12005 components: - type: Transform @@ -81229,7 +81250,7 @@ entities: pos: 34.5,-53.5 parent: 2 - type: AtmosPipeColor - color: '#9003FCFF' + color: '#FF00BFFF' - uid: 12006 components: - type: Transform @@ -81237,7 +81258,7 @@ entities: pos: 35.5,-53.5 parent: 2 - type: AtmosPipeColor - color: '#9003FCFF' + color: '#FF00BFFF' - uid: 12007 components: - type: Transform @@ -81245,7 +81266,7 @@ entities: pos: 30.5,-53.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#FF00BFFF' - uid: 12008 components: - type: Transform @@ -81260,7 +81281,7 @@ entities: pos: 26.5,-55.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#FF00BFFF' - uid: 12010 components: - type: Transform @@ -81281,7 +81302,7 @@ entities: pos: 22.5,-54.5 parent: 2 - type: AtmosPipeColor - color: '#03E8FCFF' + color: '#0000FFFF' - uid: 12013 components: - type: Transform @@ -81289,14 +81310,14 @@ entities: pos: 28.5,-63.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#FF00BFFF' - uid: 12014 components: - type: Transform pos: 26.5,-54.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#FF00BFFF' - uid: 12015 components: - type: Transform @@ -81312,7 +81333,7 @@ entities: pos: 23.5,-52.5 parent: 2 - type: AtmosPipeColor - color: '#03E8FCFF' + color: '#0000FFFF' - uid: 12017 components: - type: Transform @@ -81320,28 +81341,28 @@ entities: pos: 22.5,-53.5 parent: 2 - type: AtmosPipeColor - color: '#03E8FCFF' + color: '#0000FFFF' - uid: 12018 components: - type: Transform pos: 26.5,-61.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#FF00BFFF' - uid: 12019 components: - type: Transform pos: 26.5,-58.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#FF00BFFF' - uid: 12020 components: - type: Transform pos: 26.5,-57.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#FF00BFFF' - uid: 12021 components: - type: Transform @@ -81349,7 +81370,7 @@ entities: pos: 21.5,-55.5 parent: 2 - type: AtmosPipeColor - color: '#03E8FCFF' + color: '#0000FFFF' - uid: 12022 components: - type: Transform @@ -81357,7 +81378,7 @@ entities: pos: 20.5,-54.5 parent: 2 - type: AtmosPipeColor - color: '#00FFFFFF' + color: '#0000FFFF' - uid: 12023 components: - type: Transform @@ -81365,7 +81386,7 @@ entities: pos: 20.5,-55.5 parent: 2 - type: AtmosPipeColor - color: '#03E8FCFF' + color: '#0000FFFF' - uid: 12024 components: - type: Transform @@ -81373,7 +81394,7 @@ entities: pos: 19.5,-53.5 parent: 2 - type: AtmosPipeColor - color: '#00FFFFFF' + color: '#0000FFFF' - uid: 12025 components: - type: Transform @@ -81381,7 +81402,7 @@ entities: pos: 19.5,-55.5 parent: 2 - type: AtmosPipeColor - color: '#03E8FCFF' + color: '#0000FFFF' - uid: 12026 components: - type: Transform @@ -81389,7 +81410,7 @@ entities: pos: 21.5,-58.5 parent: 2 - type: AtmosPipeColor - color: '#00FFFFFF' + color: '#0000FFFF' - uid: 12027 components: - type: Transform @@ -81397,14 +81418,14 @@ entities: pos: 23.5,-58.5 parent: 2 - type: AtmosPipeColor - color: '#00FFFFFF' + color: '#0000FFFF' - uid: 12028 components: - type: Transform pos: 26.5,-56.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#FF00BFFF' - uid: 12029 components: - type: Transform @@ -81412,7 +81433,7 @@ entities: pos: 20.5,-56.5 parent: 2 - type: AtmosPipeColor - color: '#00FFFFFF' + color: '#0000FFFF' - uid: 12030 components: - type: Transform @@ -81420,7 +81441,7 @@ entities: pos: 20.5,-57.5 parent: 2 - type: AtmosPipeColor - color: '#00FFFFFF' + color: '#0000FFFF' - uid: 12031 components: - type: Transform @@ -81443,7 +81464,7 @@ entities: pos: 22.5,-62.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#0000FFFF' - uid: 12034 components: - type: Transform @@ -81451,7 +81472,7 @@ entities: pos: 21.5,-62.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#0000FFFF' - uid: 12035 components: - type: Transform @@ -81459,7 +81480,7 @@ entities: pos: 20.5,-60.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#0000FFFF' - uid: 12036 components: - type: Transform @@ -81467,7 +81488,7 @@ entities: pos: 20.5,-61.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#0000FFFF' - uid: 12037 components: - type: Transform @@ -81475,7 +81496,7 @@ entities: pos: 19.5,-59.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#0000FFFF' - uid: 12038 components: - type: Transform @@ -81483,7 +81504,7 @@ entities: pos: 21.5,-59.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#0000FFFF' - uid: 12039 components: - type: Transform @@ -81491,7 +81512,7 @@ entities: pos: 22.5,-62.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#0000FFFF' - uid: 12040 components: - type: Transform @@ -81499,7 +81520,7 @@ entities: pos: 22.5,-61.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#0000FFFF' - uid: 12041 components: - type: Transform @@ -81507,7 +81528,7 @@ entities: pos: 22.5,-60.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#0000FFFF' - uid: 12042 components: - type: Transform @@ -81515,7 +81536,7 @@ entities: pos: 19.5,-63.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#0000FFFF' - uid: 12043 components: - type: Transform @@ -81523,7 +81544,7 @@ entities: pos: 20.5,-63.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#0000FFFF' - uid: 12044 components: - type: Transform @@ -81531,7 +81552,7 @@ entities: pos: 21.5,-63.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#0000FFFF' - uid: 12045 components: - type: Transform @@ -81539,7 +81560,7 @@ entities: pos: 25.5,-63.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#FF00BFFF' - uid: 12046 components: - type: Transform @@ -81547,7 +81568,7 @@ entities: pos: 27.5,-63.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#FF00BFFF' - uid: 12047 components: - type: Transform @@ -81555,7 +81576,7 @@ entities: pos: 29.5,-63.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#FF00BFFF' - uid: 12048 components: - type: Transform @@ -81563,7 +81584,7 @@ entities: pos: 30.5,-63.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#FF00BFFF' - uid: 12049 components: - type: Transform @@ -81571,7 +81592,7 @@ entities: pos: 31.5,-62.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#FF00BFFF' - uid: 12050 components: - type: Transform @@ -81579,7 +81600,7 @@ entities: pos: 31.5,-60.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#FF00BFFF' - uid: 12051 components: - type: Transform @@ -81587,7 +81608,7 @@ entities: pos: 31.5,-59.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#FF00BFFF' - uid: 12052 components: - type: Transform @@ -81595,7 +81616,7 @@ entities: pos: 31.5,-58.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#FF00BFFF' - uid: 12053 components: - type: Transform @@ -81616,7 +81637,7 @@ entities: pos: 26.5,-62.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#FF00BFFF' - uid: 12056 components: - type: Transform @@ -81624,7 +81645,7 @@ entities: pos: 31.5,-55.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#FF00BFFF' - uid: 12057 components: - type: Transform @@ -82002,7 +82023,7 @@ entities: pos: 26.5,-63.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#FF00BFFF' - uid: 12107 components: - type: Transform @@ -82308,7 +82329,7 @@ entities: pos: 27.5,-51.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12147 components: - type: Transform @@ -82316,7 +82337,7 @@ entities: pos: 27.5,-50.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12148 components: - type: Transform @@ -82324,7 +82345,7 @@ entities: pos: 27.5,-49.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12149 components: - type: Transform @@ -82332,7 +82353,7 @@ entities: pos: 27.5,-48.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12150 components: - type: Transform @@ -82340,7 +82361,7 @@ entities: pos: 27.5,-47.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12151 components: - type: Transform @@ -82348,7 +82369,7 @@ entities: pos: 25.5,-52.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12152 components: - type: Transform @@ -82356,7 +82377,7 @@ entities: pos: 26.5,-52.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12153 components: - type: Transform @@ -82402,7 +82423,7 @@ entities: pos: 26.5,35.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12159 components: - type: Transform @@ -82410,7 +82431,7 @@ entities: pos: 31.5,-25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12160 components: - type: Transform @@ -82418,7 +82439,7 @@ entities: pos: 3.5,-41.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12161 components: - type: Transform @@ -82426,7 +82447,7 @@ entities: pos: 28.5,-46.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12162 components: - type: Transform @@ -82434,7 +82455,7 @@ entities: pos: 29.5,-46.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12163 components: - type: Transform @@ -82442,7 +82463,7 @@ entities: pos: 30.5,-46.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12164 components: - type: Transform @@ -82450,7 +82471,7 @@ entities: pos: 32.5,-45.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12165 components: - type: Transform @@ -82458,7 +82479,7 @@ entities: pos: 34.5,-44.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12166 components: - type: Transform @@ -82466,14 +82487,14 @@ entities: pos: 33.5,-45.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12167 components: - type: Transform pos: 27.5,-43.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12168 components: - type: Transform @@ -82495,7 +82516,7 @@ entities: pos: 4.5,-41.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12171 components: - type: Transform @@ -82510,7 +82531,7 @@ entities: pos: 27.5,-42.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12173 components: - type: Transform @@ -82532,7 +82553,7 @@ entities: pos: 26.5,-41.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12176 components: - type: Transform @@ -82540,7 +82561,7 @@ entities: pos: 25.5,-41.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12177 components: - type: Transform @@ -82548,7 +82569,7 @@ entities: pos: 24.5,-41.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12178 components: - type: Transform @@ -82556,7 +82577,7 @@ entities: pos: 23.5,-41.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12179 components: - type: Transform @@ -82564,7 +82585,7 @@ entities: pos: 22.5,-41.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12180 components: - type: Transform @@ -82572,7 +82593,7 @@ entities: pos: 21.5,-41.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12181 components: - type: Transform @@ -82580,7 +82601,7 @@ entities: pos: 20.5,-41.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12182 components: - type: Transform @@ -82588,7 +82609,7 @@ entities: pos: 19.5,-41.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12183 components: - type: Transform @@ -82596,7 +82617,7 @@ entities: pos: 18.5,-41.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12184 components: - type: Transform @@ -82604,7 +82625,7 @@ entities: pos: 17.5,-41.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12185 components: - type: Transform @@ -82612,7 +82633,7 @@ entities: pos: 16.5,-41.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12186 components: - type: Transform @@ -82620,7 +82641,7 @@ entities: pos: 15.5,-41.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12187 components: - type: Transform @@ -82628,7 +82649,7 @@ entities: pos: 14.5,-41.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12188 components: - type: Transform @@ -82636,7 +82657,7 @@ entities: pos: 13.5,-41.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12189 components: - type: Transform @@ -82644,7 +82665,7 @@ entities: pos: 12.5,-41.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12190 components: - type: Transform @@ -82652,7 +82673,7 @@ entities: pos: 10.5,-41.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12191 components: - type: Transform @@ -82667,7 +82688,7 @@ entities: pos: 8.5,-41.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12193 components: - type: Transform @@ -82787,7 +82808,7 @@ entities: pos: 7.5,-41.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12208 components: - type: Transform @@ -82795,7 +82816,7 @@ entities: pos: 9.5,-41.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12209 components: - type: Transform @@ -82883,7 +82904,7 @@ entities: pos: 1.5,-56.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12220 components: - type: Transform @@ -82891,39 +82912,7 @@ entities: pos: 27.5,-45.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' - - uid: 12221 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 1.5,-41.5 - parent: 2 - - type: AtmosPipeColor - color: '#0335FCFF' - - uid: 12222 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 1.5,-41.5 - parent: 2 - - type: AtmosPipeColor - color: '#0335FCFF' - - uid: 12223 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 2.5,-41.5 - parent: 2 - - type: AtmosPipeColor - color: '#0335FCFF' - - uid: 12224 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 2.5,-41.5 - parent: 2 - - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12225 components: - type: Transform @@ -82931,7 +82920,7 @@ entities: pos: 4.5,-41.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12226 components: - type: Transform @@ -82939,7 +82928,7 @@ entities: pos: 4.5,-41.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12227 components: - type: Transform @@ -82947,7 +82936,7 @@ entities: pos: 6.5,-41.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12228 components: - type: Transform @@ -82955,7 +82944,7 @@ entities: pos: 6.5,-41.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12229 components: - type: Transform @@ -82963,7 +82952,7 @@ entities: pos: 3.5,-41.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12230 components: - type: Transform @@ -82971,7 +82960,7 @@ entities: pos: 0.5,-40.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12231 components: - type: Transform @@ -82979,7 +82968,7 @@ entities: pos: 0.5,-39.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12232 components: - type: Transform @@ -82987,7 +82976,7 @@ entities: pos: 0.5,-38.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12233 components: - type: Transform @@ -82995,49 +82984,49 @@ entities: pos: 0.5,-37.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12234 components: - type: Transform pos: 0.5,-34.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12235 components: - type: Transform pos: 0.5,-33.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12236 components: - type: Transform pos: 0.5,-32.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12237 components: - type: Transform pos: 0.5,-31.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12238 components: - type: Transform pos: 0.5,-30.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12239 components: - type: Transform pos: 0.5,-29.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12240 components: - type: Transform @@ -83045,7 +83034,7 @@ entities: pos: -0.5,-28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12241 components: - type: Transform @@ -83053,7 +83042,7 @@ entities: pos: -1.5,-28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12242 components: - type: Transform @@ -83061,7 +83050,7 @@ entities: pos: -2.5,-28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12243 components: - type: Transform @@ -83069,7 +83058,7 @@ entities: pos: -3.5,-28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12244 components: - type: Transform @@ -83077,7 +83066,7 @@ entities: pos: -4.5,-28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12245 components: - type: Transform @@ -83085,21 +83074,21 @@ entities: pos: -5.5,-28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12246 components: - type: Transform pos: -6.5,-30.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12247 components: - type: Transform pos: -6.5,-31.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12248 components: - type: Transform @@ -83107,7 +83096,7 @@ entities: pos: -8.5,-28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12249 components: - type: Transform @@ -83115,7 +83104,7 @@ entities: pos: -9.5,-28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12250 components: - type: Transform @@ -83123,7 +83112,7 @@ entities: pos: -7.5,-28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12251 components: - type: Transform @@ -83131,7 +83120,7 @@ entities: pos: -11.5,-28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12252 components: - type: Transform @@ -83139,7 +83128,7 @@ entities: pos: -12.5,-28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12253 components: - type: Transform @@ -83147,7 +83136,7 @@ entities: pos: -13.5,-28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12254 components: - type: Transform @@ -83155,7 +83144,7 @@ entities: pos: -14.5,-28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12255 components: - type: Transform @@ -83163,7 +83152,7 @@ entities: pos: -16.5,-28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12256 components: - type: Transform @@ -83171,7 +83160,7 @@ entities: pos: -17.5,-28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12257 components: - type: Transform @@ -83179,7 +83168,7 @@ entities: pos: -18.5,-28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12258 components: - type: Transform @@ -83187,7 +83176,7 @@ entities: pos: -19.5,-28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12259 components: - type: Transform @@ -83195,7 +83184,7 @@ entities: pos: -20.5,-28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12260 components: - type: Transform @@ -83203,21 +83192,21 @@ entities: pos: -21.5,-28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12261 components: - type: Transform pos: -24.5,-29.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12262 components: - type: Transform pos: -24.5,-30.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12263 components: - type: Transform @@ -83225,7 +83214,7 @@ entities: pos: -25.5,-31.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12264 components: - type: Transform @@ -83233,7 +83222,7 @@ entities: pos: -26.5,-31.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12265 components: - type: Transform @@ -83241,7 +83230,7 @@ entities: pos: -27.5,-31.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12266 components: - type: Transform @@ -83249,7 +83238,7 @@ entities: pos: -29.5,-32.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12267 components: - type: Transform @@ -83257,14 +83246,14 @@ entities: pos: -31.5,-32.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12268 components: - type: Transform pos: -32.5,-33.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12269 components: - type: Transform @@ -83272,7 +83261,7 @@ entities: pos: -32.5,-34.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12270 components: - type: Transform @@ -83287,42 +83276,42 @@ entities: pos: -32.5,-35.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12272 components: - type: Transform pos: -32.5,-36.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12273 components: - type: Transform pos: -32.5,-37.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12274 components: - type: Transform pos: -32.5,-40.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12275 components: - type: Transform pos: -32.5,-41.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12276 components: - type: Transform pos: -32.5,-42.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12277 components: - type: Transform @@ -83330,7 +83319,7 @@ entities: pos: -33.5,-43.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12278 components: - type: Transform @@ -83338,7 +83327,7 @@ entities: pos: -35.5,-43.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12279 components: - type: Transform @@ -83346,7 +83335,7 @@ entities: pos: -36.5,-43.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12280 components: - type: Transform @@ -83354,7 +83343,7 @@ entities: pos: -37.5,-43.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12281 components: - type: Transform @@ -83362,7 +83351,7 @@ entities: pos: -38.5,-43.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12282 components: - type: Transform @@ -83370,7 +83359,7 @@ entities: pos: -39.5,-43.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12283 components: - type: Transform @@ -83378,7 +83367,7 @@ entities: pos: -40.5,-43.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12284 components: - type: Transform @@ -83386,7 +83375,7 @@ entities: pos: -42.5,-32.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12285 components: - type: Transform @@ -83394,7 +83383,7 @@ entities: pos: -41.5,-34.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12286 components: - type: Transform @@ -83402,7 +83391,7 @@ entities: pos: -41.5,-33.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12287 components: - type: Transform @@ -83410,7 +83399,7 @@ entities: pos: -41.5,-35.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12288 components: - type: Transform @@ -83418,7 +83407,7 @@ entities: pos: -41.5,-36.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12289 components: - type: Transform @@ -83426,7 +83415,7 @@ entities: pos: -41.5,-37.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12290 components: - type: Transform @@ -83442,7 +83431,7 @@ entities: pos: -41.5,-38.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12292 components: - type: Transform @@ -83450,7 +83439,7 @@ entities: pos: -41.5,-39.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12293 components: - type: Transform @@ -83458,7 +83447,7 @@ entities: pos: -41.5,-41.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12294 components: - type: Transform @@ -83466,7 +83455,7 @@ entities: pos: -41.5,-42.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12295 components: - type: Transform @@ -83474,7 +83463,7 @@ entities: pos: -34.5,-43.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12296 components: - type: Transform @@ -83482,7 +83471,7 @@ entities: pos: 29.5,-31.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12297 components: - type: Transform @@ -83490,7 +83479,7 @@ entities: pos: -32.5,-44.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12298 components: - type: Transform @@ -83498,7 +83487,7 @@ entities: pos: -32.5,-45.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12299 components: - type: Transform @@ -83506,7 +83495,7 @@ entities: pos: -32.5,-46.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12300 components: - type: Transform @@ -83514,14 +83503,14 @@ entities: pos: -31.5,-47.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12301 components: - type: Transform pos: -6.5,-33.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12302 components: - type: Transform @@ -83534,21 +83523,21 @@ entities: pos: -12.5,-37.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12304 components: - type: Transform pos: -12.5,-43.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12305 components: - type: Transform pos: -12.5,-46.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12306 components: - type: Transform @@ -83556,7 +83545,7 @@ entities: pos: -10.5,-35.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12307 components: - type: Transform @@ -83564,7 +83553,7 @@ entities: pos: -11.5,-35.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12308 components: - type: Transform @@ -83572,7 +83561,7 @@ entities: pos: -13.5,-35.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12309 components: - type: Transform @@ -83580,7 +83569,7 @@ entities: pos: -14.5,-35.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12310 components: - type: Transform @@ -83588,7 +83577,7 @@ entities: pos: -15.5,-35.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12311 components: - type: Transform @@ -83596,14 +83585,14 @@ entities: pos: -15.5,-35.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12312 components: - type: Transform pos: -12.5,-36.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12313 components: - type: Transform @@ -83611,7 +83600,7 @@ entities: pos: -12.5,-45.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12314 components: - type: Transform @@ -83619,7 +83608,7 @@ entities: pos: -12.5,-42.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12315 components: - type: Transform @@ -83627,7 +83616,7 @@ entities: pos: -12.5,-39.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12316 components: - type: Transform @@ -83635,7 +83624,7 @@ entities: pos: -15.5,-38.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12317 components: - type: Transform @@ -83643,7 +83632,7 @@ entities: pos: -14.5,-38.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12318 components: - type: Transform @@ -83651,7 +83640,7 @@ entities: pos: -13.5,-38.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12319 components: - type: Transform @@ -83659,7 +83648,7 @@ entities: pos: -15.5,-41.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12320 components: - type: Transform @@ -83667,7 +83656,7 @@ entities: pos: -13.5,-41.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12321 components: - type: Transform @@ -83675,7 +83664,7 @@ entities: pos: -14.5,-41.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12322 components: - type: Transform @@ -83683,7 +83672,7 @@ entities: pos: -15.5,-44.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12323 components: - type: Transform @@ -83691,7 +83680,7 @@ entities: pos: -14.5,-44.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12324 components: - type: Transform @@ -83699,7 +83688,7 @@ entities: pos: -13.5,-44.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12325 components: - type: Transform @@ -83707,7 +83696,7 @@ entities: pos: -15.5,-47.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12326 components: - type: Transform @@ -83715,7 +83704,7 @@ entities: pos: -14.5,-47.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12327 components: - type: Transform @@ -83723,7 +83712,7 @@ entities: pos: -13.5,-47.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12328 components: - type: Transform @@ -83731,7 +83720,7 @@ entities: pos: 30.5,-19.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12329 components: - type: Transform @@ -83739,7 +83728,7 @@ entities: pos: 0.5,-27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12330 components: - type: Transform @@ -83747,7 +83736,7 @@ entities: pos: 0.5,-26.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12331 components: - type: Transform @@ -83755,7 +83744,7 @@ entities: pos: 1.5,-25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12332 components: - type: Transform @@ -83763,7 +83752,7 @@ entities: pos: 2.5,-25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12333 components: - type: Transform @@ -83771,7 +83760,7 @@ entities: pos: 3.5,-25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12334 components: - type: Transform @@ -83779,7 +83768,7 @@ entities: pos: 4.5,-25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12335 components: - type: Transform @@ -83787,7 +83776,7 @@ entities: pos: 12.5,-25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12336 components: - type: Transform @@ -83795,7 +83784,7 @@ entities: pos: 11.5,-25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12337 components: - type: Transform @@ -83803,7 +83792,7 @@ entities: pos: 9.5,-25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12338 components: - type: Transform @@ -83811,7 +83800,7 @@ entities: pos: 7.5,-25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12339 components: - type: Transform @@ -83819,7 +83808,7 @@ entities: pos: 5.5,-25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12340 components: - type: Transform @@ -83827,14 +83816,14 @@ entities: pos: 14.5,-19.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12341 components: - type: Transform pos: 30.5,-26.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12342 components: - type: Transform @@ -83842,7 +83831,7 @@ entities: pos: 29.5,-25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12343 components: - type: Transform @@ -83850,7 +83839,7 @@ entities: pos: 28.5,-25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12344 components: - type: Transform @@ -83858,7 +83847,7 @@ entities: pos: 27.5,-25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12345 components: - type: Transform @@ -83874,7 +83863,7 @@ entities: pos: 24.5,-25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12347 components: - type: Transform @@ -83882,7 +83871,7 @@ entities: pos: 23.5,-25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12348 components: - type: Transform @@ -83890,7 +83879,7 @@ entities: pos: 21.5,-25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12349 components: - type: Transform @@ -83898,7 +83887,7 @@ entities: pos: 20.5,-25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12350 components: - type: Transform @@ -83906,7 +83895,7 @@ entities: pos: 18.5,-25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12351 components: - type: Transform @@ -83914,7 +83903,7 @@ entities: pos: 17.5,-25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12352 components: - type: Transform @@ -83922,7 +83911,7 @@ entities: pos: 16.5,-25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12353 components: - type: Transform @@ -83930,7 +83919,7 @@ entities: pos: 30.5,-20.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12354 components: - type: Transform @@ -83938,7 +83927,7 @@ entities: pos: 30.5,-21.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12355 components: - type: Transform @@ -83946,7 +83935,7 @@ entities: pos: 30.5,-22.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12356 components: - type: Transform @@ -83954,7 +83943,7 @@ entities: pos: 30.5,-23.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12357 components: - type: Transform @@ -83962,7 +83951,7 @@ entities: pos: 42.5,-10.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12358 components: - type: Transform @@ -83970,7 +83959,7 @@ entities: pos: 42.5,-8.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12359 components: - type: Transform @@ -83978,7 +83967,7 @@ entities: pos: 32.5,-25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12360 components: - type: Transform @@ -83986,7 +83975,7 @@ entities: pos: 33.5,-25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12361 components: - type: Transform @@ -83994,7 +83983,7 @@ entities: pos: 34.5,-25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12362 components: - type: Transform @@ -84002,7 +83991,7 @@ entities: pos: 35.5,-25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12363 components: - type: Transform @@ -84010,7 +83999,7 @@ entities: pos: 36.5,-25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12364 components: - type: Transform @@ -84018,7 +84007,7 @@ entities: pos: 37.5,-25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12365 components: - type: Transform @@ -84026,42 +84015,42 @@ entities: pos: 38.5,-26.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12366 components: - type: Transform pos: 38.5,-24.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12367 components: - type: Transform pos: 38.5,-22.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12368 components: - type: Transform pos: 38.5,-21.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12369 components: - type: Transform pos: 38.5,-20.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12370 components: - type: Transform pos: 38.5,-18.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12371 components: - type: Transform @@ -84076,42 +84065,42 @@ entities: pos: 38.5,-16.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12373 components: - type: Transform pos: 38.5,-15.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12374 components: - type: Transform pos: 38.5,-14.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12375 components: - type: Transform pos: 38.5,-13.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12376 components: - type: Transform pos: 38.5,-12.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12377 components: - type: Transform pos: 0.5,-24.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12378 components: - type: Transform @@ -84119,7 +84108,7 @@ entities: pos: 38.5,-27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12379 components: - type: Transform @@ -84127,7 +84116,7 @@ entities: pos: 38.5,-28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12380 components: - type: Transform @@ -84135,7 +84124,7 @@ entities: pos: 38.5,-29.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12381 components: - type: Transform @@ -84143,7 +84132,7 @@ entities: pos: 38.5,-30.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12382 components: - type: Transform @@ -84151,7 +84140,7 @@ entities: pos: 38.5,-31.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12383 components: - type: Transform @@ -84159,7 +84148,7 @@ entities: pos: 39.5,-32.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12384 components: - type: Transform @@ -84167,7 +84156,7 @@ entities: pos: 42.5,-9.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12385 components: - type: Transform @@ -84175,7 +84164,7 @@ entities: pos: 42.5,-7.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12386 components: - type: Transform @@ -84183,7 +84172,7 @@ entities: pos: 42.5,-6.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12387 components: - type: Transform @@ -84191,7 +84180,7 @@ entities: pos: 40.5,17.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12388 components: - type: Transform @@ -84199,7 +84188,7 @@ entities: pos: 37.5,-11.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12389 components: - type: Transform @@ -84207,7 +84196,7 @@ entities: pos: 36.5,-11.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12390 components: - type: Transform @@ -84215,7 +84204,7 @@ entities: pos: 35.5,-11.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12391 components: - type: Transform @@ -84223,7 +84212,7 @@ entities: pos: 0.5,-12.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12392 components: - type: Transform @@ -84231,7 +84220,7 @@ entities: pos: 0.5,-11.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12393 components: - type: Transform @@ -84239,7 +84228,7 @@ entities: pos: 4.5,-46.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12394 components: - type: Transform @@ -84247,28 +84236,28 @@ entities: pos: 0.5,-9.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12395 components: - type: Transform pos: 0.5,-20.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12396 components: - type: Transform pos: 0.5,-21.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12397 components: - type: Transform pos: 0.5,-22.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12398 components: - type: Transform @@ -84276,7 +84265,7 @@ entities: pos: 0.5,-13.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12399 components: - type: Transform @@ -84284,7 +84273,7 @@ entities: pos: 0.5,-10.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12400 components: - type: Transform @@ -84292,7 +84281,7 @@ entities: pos: 0.5,-14.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12401 components: - type: Transform @@ -84300,7 +84289,7 @@ entities: pos: 0.5,-15.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12402 components: - type: Transform @@ -84308,7 +84297,7 @@ entities: pos: 0.5,-16.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12403 components: - type: Transform @@ -84316,7 +84305,7 @@ entities: pos: 0.5,-17.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12404 components: - type: Transform @@ -84324,7 +84313,7 @@ entities: pos: 0.5,-18.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12405 components: - type: Transform @@ -84332,7 +84321,7 @@ entities: pos: 0.5,-0.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12406 components: - type: Transform @@ -84340,7 +84329,7 @@ entities: pos: 0.5,-1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12407 components: - type: Transform @@ -84348,7 +84337,7 @@ entities: pos: 0.5,-2.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12408 components: - type: Transform @@ -84356,7 +84345,7 @@ entities: pos: 0.5,-3.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12409 components: - type: Transform @@ -84364,7 +84353,7 @@ entities: pos: 0.5,-4.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12410 components: - type: Transform @@ -84372,7 +84361,7 @@ entities: pos: 0.5,-5.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12411 components: - type: Transform @@ -84380,7 +84369,7 @@ entities: pos: 0.5,-6.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12412 components: - type: Transform @@ -84388,7 +84377,7 @@ entities: pos: 0.5,-7.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12413 components: - type: Transform @@ -84396,28 +84385,28 @@ entities: pos: 0.5,-8.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12414 components: - type: Transform pos: 5.5,-43.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12415 components: - type: Transform pos: 5.5,-44.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12416 components: - type: Transform pos: 5.5,-42.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12417 components: - type: Transform @@ -84425,7 +84414,7 @@ entities: pos: 3.5,-46.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12418 components: - type: Transform @@ -84433,7 +84422,7 @@ entities: pos: 5.5,-45.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12419 components: - type: Transform @@ -84441,7 +84430,7 @@ entities: pos: 2.5,-46.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12420 components: - type: Transform @@ -84449,35 +84438,35 @@ entities: pos: 1.5,-46.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12421 components: - type: Transform pos: 6.5,-48.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12422 components: - type: Transform pos: 6.5,-47.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12423 components: - type: Transform pos: 6.5,-49.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12424 components: - type: Transform pos: 6.5,-51.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12425 components: - type: Transform @@ -84485,7 +84474,7 @@ entities: pos: 5.5,-54.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12426 components: - type: Transform @@ -84493,14 +84482,14 @@ entities: pos: 4.5,-54.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12427 components: - type: Transform pos: 2.5,-55.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12428 components: - type: Transform @@ -84508,7 +84497,7 @@ entities: pos: 1.5,-56.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12429 components: - type: Transform @@ -84516,7 +84505,7 @@ entities: pos: 0.5,-56.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12430 components: - type: Transform @@ -84524,7 +84513,7 @@ entities: pos: -0.5,-56.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12431 components: - type: Transform @@ -84532,7 +84521,7 @@ entities: pos: -1.5,-56.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12432 components: - type: Transform @@ -84540,7 +84529,7 @@ entities: pos: -2.5,-56.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12433 components: - type: Transform @@ -84555,7 +84544,7 @@ entities: pos: -5.5,-56.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12435 components: - type: Transform @@ -84563,7 +84552,7 @@ entities: pos: -6.5,-56.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12436 components: - type: Transform @@ -84571,7 +84560,7 @@ entities: pos: -8.5,-57.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12437 components: - type: Transform @@ -84579,7 +84568,7 @@ entities: pos: -8.5,-57.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12438 components: - type: Transform @@ -84587,7 +84576,7 @@ entities: pos: -9.5,-57.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12439 components: - type: Transform @@ -84595,7 +84584,7 @@ entities: pos: -10.5,-57.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12440 components: - type: Transform @@ -84603,7 +84592,7 @@ entities: pos: -11.5,-57.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12441 components: - type: Transform @@ -84642,7 +84631,7 @@ entities: pos: -4.5,-57.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12446 components: - type: Transform @@ -84654,77 +84643,77 @@ entities: pos: -4.5,-58.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12448 components: - type: Transform pos: -4.5,-59.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12449 components: - type: Transform pos: -4.5,-60.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12450 components: - type: Transform pos: -5.5,-62.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12451 components: - type: Transform pos: -5.5,-65.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12452 components: - type: Transform pos: -5.5,-64.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12453 components: - type: Transform pos: -5.5,-63.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12454 components: - type: Transform pos: -5.5,-62.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12455 components: - type: Transform pos: -5.5,-66.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12456 components: - type: Transform pos: -5.5,-67.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12457 components: - type: Transform pos: -5.5,-68.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12458 components: - type: Transform @@ -84732,7 +84721,7 @@ entities: pos: -5.5,-70.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12459 components: - type: Transform @@ -84740,7 +84729,7 @@ entities: pos: -5.5,-71.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12460 components: - type: Transform @@ -84748,7 +84737,7 @@ entities: pos: -5.5,-72.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12461 components: - type: Transform @@ -84756,7 +84745,7 @@ entities: pos: -5.5,-73.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12462 components: - type: Transform @@ -84764,7 +84753,7 @@ entities: pos: -5.5,-74.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12463 components: - type: Transform @@ -84772,7 +84761,7 @@ entities: pos: -5.5,-75.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12464 components: - type: Transform @@ -84780,7 +84769,7 @@ entities: pos: -4.5,-76.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12465 components: - type: Transform @@ -84788,7 +84777,7 @@ entities: pos: -3.5,-76.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12466 components: - type: Transform @@ -84796,7 +84785,7 @@ entities: pos: -2.5,-76.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12467 components: - type: Transform @@ -84804,7 +84793,7 @@ entities: pos: -1.5,-76.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12468 components: - type: Transform @@ -84812,7 +84801,7 @@ entities: pos: -0.5,-76.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12469 components: - type: Transform @@ -84820,7 +84809,7 @@ entities: pos: 0.5,-76.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12470 components: - type: Transform @@ -84828,7 +84817,7 @@ entities: pos: 1.5,-76.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12471 components: - type: Transform @@ -84836,7 +84825,7 @@ entities: pos: 2.5,-76.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12472 components: - type: Transform @@ -84844,7 +84833,7 @@ entities: pos: 3.5,-76.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12473 components: - type: Transform @@ -84852,7 +84841,7 @@ entities: pos: 4.5,-76.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12474 components: - type: Transform @@ -84860,70 +84849,70 @@ entities: pos: 5.5,-76.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12475 components: - type: Transform pos: 6.5,-75.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12476 components: - type: Transform pos: 6.5,-65.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12477 components: - type: Transform pos: 6.5,-71.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12478 components: - type: Transform pos: 6.5,-72.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12479 components: - type: Transform pos: 6.5,-73.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12480 components: - type: Transform pos: 6.5,-74.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12481 components: - type: Transform pos: 6.5,-70.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12482 components: - type: Transform pos: 6.5,-66.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12483 components: - type: Transform pos: 6.5,-67.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12484 components: - type: Transform @@ -84931,7 +84920,7 @@ entities: pos: 6.5,-68.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12485 components: - type: Transform @@ -84939,7 +84928,7 @@ entities: pos: 7.5,-64.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12486 components: - type: Transform @@ -84947,7 +84936,7 @@ entities: pos: 8.5,-64.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12487 components: - type: Transform @@ -84955,7 +84944,7 @@ entities: pos: 9.5,-64.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12488 components: - type: Transform @@ -84963,7 +84952,7 @@ entities: pos: 10.5,-64.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12489 components: - type: Transform @@ -84971,7 +84960,7 @@ entities: pos: 11.5,-64.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12490 components: - type: Transform @@ -84987,7 +84976,7 @@ entities: pos: 14.5,-18.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12492 components: - type: Transform @@ -84995,7 +84984,7 @@ entities: pos: 14.5,-17.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12493 components: - type: Transform @@ -85003,7 +84992,7 @@ entities: pos: 14.5,-16.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12494 components: - type: Transform @@ -85011,7 +85000,7 @@ entities: pos: 14.5,-20.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12495 components: - type: Transform @@ -85019,7 +85008,7 @@ entities: pos: 14.5,-21.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12496 components: - type: Transform @@ -85027,7 +85016,7 @@ entities: pos: 14.5,-22.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12497 components: - type: Transform @@ -85035,7 +85024,7 @@ entities: pos: 14.5,-23.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12498 components: - type: Transform @@ -85043,7 +85032,7 @@ entities: pos: 14.5,-12.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12499 components: - type: Transform @@ -85051,7 +85040,7 @@ entities: pos: 14.5,-13.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12500 components: - type: Transform @@ -85059,7 +85048,7 @@ entities: pos: 14.5,-14.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12501 components: - type: Transform @@ -85067,7 +85056,7 @@ entities: pos: 15.5,-11.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12502 components: - type: Transform @@ -85075,7 +85064,7 @@ entities: pos: 15.5,-11.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12503 components: - type: Transform @@ -85083,7 +85072,7 @@ entities: pos: 16.5,-11.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12504 components: - type: Transform @@ -85091,7 +85080,7 @@ entities: pos: 10.5,-25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12505 components: - type: Transform @@ -85099,7 +85088,7 @@ entities: pos: 44.5,-32.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12506 components: - type: Transform @@ -85107,7 +85096,7 @@ entities: pos: 43.5,-32.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12507 components: - type: Transform @@ -85115,7 +85104,7 @@ entities: pos: 42.5,-32.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12508 components: - type: Transform @@ -85123,7 +85112,7 @@ entities: pos: 41.5,-32.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12509 components: - type: Transform @@ -85131,7 +85120,7 @@ entities: pos: 45.5,-32.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12510 components: - type: Transform @@ -85139,7 +85128,7 @@ entities: pos: -3.5,-56.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12511 components: - type: Transform @@ -85153,7 +85142,7 @@ entities: pos: -23.5,-23.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12513 components: - type: Transform @@ -85168,28 +85157,28 @@ entities: pos: -23.5,-24.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12515 components: - type: Transform pos: -23.5,-25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12516 components: - type: Transform pos: -23.5,-26.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12517 components: - type: Transform pos: -23.5,-27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12518 components: - type: Transform @@ -85204,7 +85193,7 @@ entities: pos: 1.5,59.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12520 components: - type: Transform @@ -85212,7 +85201,7 @@ entities: pos: -30.5,-24.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12521 components: - type: Transform @@ -85220,7 +85209,7 @@ entities: pos: -30.5,-25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12522 components: - type: Transform @@ -85252,7 +85241,7 @@ entities: pos: -31.5,-23.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12526 components: - type: Transform @@ -85260,7 +85249,7 @@ entities: pos: -32.5,-23.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12527 components: - type: Transform @@ -85268,7 +85257,7 @@ entities: pos: -33.5,-23.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12528 components: - type: Transform @@ -85276,7 +85265,7 @@ entities: pos: -34.5,-11.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12529 components: - type: Transform @@ -85284,7 +85273,7 @@ entities: pos: -34.5,-13.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12530 components: - type: Transform @@ -85292,7 +85281,7 @@ entities: pos: -34.5,-14.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12531 components: - type: Transform @@ -85300,7 +85289,7 @@ entities: pos: -34.5,-15.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12532 components: - type: Transform @@ -85308,7 +85297,7 @@ entities: pos: -34.5,-16.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12533 components: - type: Transform @@ -85316,14 +85305,14 @@ entities: pos: -34.5,-17.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12534 components: - type: Transform pos: -34.5,-19.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12535 components: - type: Transform @@ -85331,7 +85320,7 @@ entities: pos: -37.5,-14.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12536 components: - type: Transform @@ -85339,7 +85328,7 @@ entities: pos: -34.5,-21.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12537 components: - type: Transform @@ -85347,7 +85336,7 @@ entities: pos: -34.5,-22.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12538 components: - type: Transform @@ -85355,7 +85344,7 @@ entities: pos: -34.5,-6.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12539 components: - type: Transform @@ -85363,7 +85352,7 @@ entities: pos: -34.5,-7.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12540 components: - type: Transform @@ -85371,7 +85360,7 @@ entities: pos: -34.5,-8.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12541 components: - type: Transform @@ -85379,7 +85368,7 @@ entities: pos: -34.5,-9.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12542 components: - type: Transform @@ -85387,7 +85376,7 @@ entities: pos: -34.5,-10.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12543 components: - type: Transform @@ -85395,7 +85384,7 @@ entities: pos: -37.5,-12.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12544 components: - type: Transform @@ -85403,7 +85392,7 @@ entities: pos: -36.5,8.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12545 components: - type: Transform @@ -85411,7 +85400,7 @@ entities: pos: -34.5,-20.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12546 components: - type: Transform @@ -85419,7 +85408,7 @@ entities: pos: -37.5,-13.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12547 components: - type: Transform @@ -85466,7 +85455,7 @@ entities: pos: -37.5,-16.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12553 components: - type: Transform @@ -85474,7 +85463,7 @@ entities: pos: -37.5,-15.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12554 components: - type: Transform @@ -85482,7 +85471,7 @@ entities: pos: -37.5,-8.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12555 components: - type: Transform @@ -85490,7 +85479,7 @@ entities: pos: -37.5,-10.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12556 components: - type: Transform @@ -85498,7 +85487,7 @@ entities: pos: -37.5,-9.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12557 components: - type: Transform @@ -85506,7 +85495,7 @@ entities: pos: -37.5,2.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12558 components: - type: Transform @@ -85514,7 +85503,7 @@ entities: pos: -37.5,-7.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12559 components: - type: Transform @@ -85522,7 +85511,7 @@ entities: pos: -37.5,-6.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12560 components: - type: Transform @@ -85530,7 +85519,7 @@ entities: pos: -37.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12561 components: - type: Transform @@ -85538,7 +85527,7 @@ entities: pos: -37.5,-0.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12562 components: - type: Transform @@ -85546,7 +85535,7 @@ entities: pos: -37.5,-1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12563 components: - type: Transform @@ -85554,7 +85543,7 @@ entities: pos: -37.5,-2.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12564 components: - type: Transform @@ -85562,7 +85551,7 @@ entities: pos: -37.5,-3.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12565 components: - type: Transform @@ -85570,7 +85559,7 @@ entities: pos: -37.5,-4.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12566 components: - type: Transform @@ -85578,7 +85567,7 @@ entities: pos: -37.5,-5.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12567 components: - type: Transform @@ -85586,7 +85575,7 @@ entities: pos: -37.5,7.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12568 components: - type: Transform @@ -85594,7 +85583,7 @@ entities: pos: -37.5,6.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12569 components: - type: Transform @@ -85602,7 +85591,7 @@ entities: pos: -37.5,5.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12570 components: - type: Transform @@ -85610,91 +85599,91 @@ entities: pos: -37.5,4.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12571 components: - type: Transform pos: -34.5,-2.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12572 components: - type: Transform pos: -34.5,-3.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12573 components: - type: Transform pos: -34.5,-4.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12574 components: - type: Transform pos: -34.5,-1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12575 components: - type: Transform pos: -34.5,-1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12576 components: - type: Transform pos: -34.5,-0.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12577 components: - type: Transform pos: -34.5,0.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12578 components: - type: Transform pos: -34.5,2.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12579 components: - type: Transform pos: -34.5,3.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12580 components: - type: Transform pos: -34.5,4.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12581 components: - type: Transform pos: -34.5,6.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12582 components: - type: Transform pos: -34.5,7.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12583 components: - type: Transform @@ -85702,7 +85691,7 @@ entities: pos: -34.5,9.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12584 components: - type: Transform @@ -85710,7 +85699,7 @@ entities: pos: -35.5,8.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12585 components: - type: Transform @@ -85718,7 +85707,7 @@ entities: pos: -34.5,14.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12586 components: - type: Transform @@ -85726,7 +85715,7 @@ entities: pos: -34.5,10.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12587 components: - type: Transform @@ -85734,7 +85723,7 @@ entities: pos: -34.5,11.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12588 components: - type: Transform @@ -85742,7 +85731,7 @@ entities: pos: -34.5,12.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12589 components: - type: Transform @@ -85750,7 +85739,7 @@ entities: pos: -34.5,13.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12590 components: - type: Transform @@ -85758,7 +85747,7 @@ entities: pos: -34.5,13.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12591 components: - type: Transform @@ -85766,7 +85755,7 @@ entities: pos: -33.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12592 components: - type: Transform @@ -85774,7 +85763,7 @@ entities: pos: -23.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12593 components: - type: Transform @@ -85782,7 +85771,7 @@ entities: pos: -24.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12594 components: - type: Transform @@ -85790,7 +85779,7 @@ entities: pos: -25.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12595 components: - type: Transform @@ -85798,7 +85787,7 @@ entities: pos: -26.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12596 components: - type: Transform @@ -85806,7 +85795,7 @@ entities: pos: -27.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12597 components: - type: Transform @@ -85814,7 +85803,7 @@ entities: pos: -28.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12598 components: - type: Transform @@ -85822,7 +85811,7 @@ entities: pos: -29.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12599 components: - type: Transform @@ -85830,7 +85819,7 @@ entities: pos: -31.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12600 components: - type: Transform @@ -85838,14 +85827,14 @@ entities: pos: -32.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12601 components: - type: Transform pos: 0.5,0.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12602 components: - type: Transform @@ -85853,7 +85842,7 @@ entities: pos: -21.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12603 components: - type: Transform @@ -85861,7 +85850,7 @@ entities: pos: -20.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12604 components: - type: Transform @@ -85869,7 +85858,7 @@ entities: pos: -19.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12605 components: - type: Transform @@ -85877,7 +85866,7 @@ entities: pos: -18.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12606 components: - type: Transform @@ -85885,7 +85874,7 @@ entities: pos: -17.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12607 components: - type: Transform @@ -85893,7 +85882,7 @@ entities: pos: -16.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12608 components: - type: Transform @@ -85901,7 +85890,7 @@ entities: pos: -15.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12609 components: - type: Transform @@ -85909,7 +85898,7 @@ entities: pos: -14.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12610 components: - type: Transform @@ -85917,7 +85906,7 @@ entities: pos: -13.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12611 components: - type: Transform @@ -85925,7 +85914,7 @@ entities: pos: -12.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12612 components: - type: Transform @@ -85933,7 +85922,7 @@ entities: pos: -11.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12613 components: - type: Transform @@ -85941,7 +85930,7 @@ entities: pos: -10.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12614 components: - type: Transform @@ -85949,7 +85938,7 @@ entities: pos: -8.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12615 components: - type: Transform @@ -85957,7 +85946,7 @@ entities: pos: -7.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12616 components: - type: Transform @@ -85965,7 +85954,7 @@ entities: pos: -6.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12617 components: - type: Transform @@ -85973,7 +85962,7 @@ entities: pos: -5.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12618 components: - type: Transform @@ -85981,7 +85970,7 @@ entities: pos: -4.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12619 components: - type: Transform @@ -85989,7 +85978,7 @@ entities: pos: -3.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12620 components: - type: Transform @@ -85997,7 +85986,7 @@ entities: pos: -2.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12621 components: - type: Transform @@ -86005,7 +85994,7 @@ entities: pos: -1.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12622 components: - type: Transform @@ -86013,49 +86002,49 @@ entities: pos: -0.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12623 components: - type: Transform pos: -30.5,-0.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12624 components: - type: Transform pos: -30.5,0.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12625 components: - type: Transform pos: -30.5,-1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12626 components: - type: Transform pos: -30.5,-2.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12627 components: - type: Transform pos: -30.5,-3.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12628 components: - type: Transform pos: -30.5,-4.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12629 components: - type: Transform @@ -86063,7 +86052,7 @@ entities: pos: 8.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12630 components: - type: Transform @@ -86071,7 +86060,7 @@ entities: pos: 7.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12631 components: - type: Transform @@ -86079,7 +86068,7 @@ entities: pos: 6.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12632 components: - type: Transform @@ -86087,7 +86076,7 @@ entities: pos: 5.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12633 components: - type: Transform @@ -86095,7 +86084,7 @@ entities: pos: 4.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12634 components: - type: Transform @@ -86103,7 +86092,7 @@ entities: pos: 3.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12635 components: - type: Transform @@ -86111,7 +86100,7 @@ entities: pos: 2.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12636 components: - type: Transform @@ -86119,7 +86108,7 @@ entities: pos: 1.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12637 components: - type: Transform @@ -86127,105 +86116,105 @@ entities: pos: 1.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12638 components: - type: Transform pos: 0.5,16.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12639 components: - type: Transform pos: 0.5,14.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12640 components: - type: Transform pos: 0.5,13.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12641 components: - type: Transform pos: 0.5,12.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12642 components: - type: Transform pos: 0.5,11.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12643 components: - type: Transform pos: 0.5,10.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12644 components: - type: Transform pos: 0.5,9.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12645 components: - type: Transform pos: 0.5,8.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12646 components: - type: Transform pos: 0.5,7.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12647 components: - type: Transform pos: 0.5,6.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12648 components: - type: Transform pos: 0.5,5.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12649 components: - type: Transform pos: 0.5,4.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12650 components: - type: Transform pos: 0.5,3.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12651 components: - type: Transform pos: 0.5,2.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12652 components: - type: Transform @@ -86233,7 +86222,7 @@ entities: pos: -9.5,18.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12653 components: - type: Transform @@ -86241,7 +86230,7 @@ entities: pos: -8.5,18.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12654 components: - type: Transform @@ -86249,7 +86238,7 @@ entities: pos: -7.5,18.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12655 components: - type: Transform @@ -86257,7 +86246,7 @@ entities: pos: -6.5,18.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12656 components: - type: Transform @@ -86265,7 +86254,7 @@ entities: pos: -5.5,18.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12657 components: - type: Transform @@ -86273,7 +86262,7 @@ entities: pos: -4.5,18.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12658 components: - type: Transform @@ -86281,7 +86270,7 @@ entities: pos: -3.5,18.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12659 components: - type: Transform @@ -86289,7 +86278,7 @@ entities: pos: -2.5,18.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12660 components: - type: Transform @@ -86297,7 +86286,7 @@ entities: pos: -1.5,18.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12661 components: - type: Transform @@ -86305,7 +86294,7 @@ entities: pos: -0.5,18.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12662 components: - type: Transform @@ -86313,7 +86302,7 @@ entities: pos: -15.5,18.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12663 components: - type: Transform @@ -86321,7 +86310,7 @@ entities: pos: -14.5,18.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12664 components: - type: Transform @@ -86329,7 +86318,7 @@ entities: pos: -13.5,18.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12665 components: - type: Transform @@ -86337,7 +86326,7 @@ entities: pos: -11.5,18.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12666 components: - type: Transform @@ -86345,7 +86334,7 @@ entities: pos: -10.5,18.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12667 components: - type: Transform @@ -86353,7 +86342,7 @@ entities: pos: -17.5,18.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12668 components: - type: Transform @@ -86361,63 +86350,63 @@ entities: pos: -18.5,18.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12669 components: - type: Transform pos: -16.5,26.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12670 components: - type: Transform pos: -16.5,25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12671 components: - type: Transform pos: -16.5,24.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12672 components: - type: Transform pos: -16.5,23.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12673 components: - type: Transform pos: -16.5,22.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12674 components: - type: Transform pos: -16.5,21.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12675 components: - type: Transform pos: -16.5,20.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12676 components: - type: Transform pos: -16.5,19.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12677 components: - type: Transform @@ -86425,7 +86414,7 @@ entities: pos: -30.5,5.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12678 components: - type: Transform @@ -86433,7 +86422,7 @@ entities: pos: -31.5,5.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12679 components: - type: Transform @@ -86441,7 +86430,7 @@ entities: pos: -32.5,5.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12680 components: - type: Transform @@ -86449,14 +86438,14 @@ entities: pos: -33.5,5.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12681 components: - type: Transform pos: 32.5,33.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12682 components: - type: Transform @@ -86464,7 +86453,7 @@ entities: pos: -3.5,27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12683 components: - type: Transform @@ -86472,7 +86461,7 @@ entities: pos: -4.5,27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12684 components: - type: Transform @@ -86480,7 +86469,7 @@ entities: pos: -5.5,27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12685 components: - type: Transform @@ -86488,7 +86477,7 @@ entities: pos: -6.5,27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12686 components: - type: Transform @@ -86496,7 +86485,7 @@ entities: pos: -7.5,27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12687 components: - type: Transform @@ -86504,7 +86493,7 @@ entities: pos: -10.5,27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12688 components: - type: Transform @@ -86512,7 +86501,7 @@ entities: pos: -12.5,27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12689 components: - type: Transform @@ -86520,7 +86509,7 @@ entities: pos: -13.5,27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12690 components: - type: Transform @@ -86528,7 +86517,7 @@ entities: pos: -14.5,27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12691 components: - type: Transform @@ -86536,7 +86525,7 @@ entities: pos: -15.5,27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12692 components: - type: Transform @@ -86544,7 +86533,7 @@ entities: pos: -2.5,28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12693 components: - type: Transform @@ -86552,7 +86541,7 @@ entities: pos: -2.5,29.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12694 components: - type: Transform @@ -86560,7 +86549,7 @@ entities: pos: -2.5,30.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12695 components: - type: Transform @@ -86568,7 +86557,7 @@ entities: pos: -2.5,31.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12696 components: - type: Transform @@ -86576,7 +86565,7 @@ entities: pos: -2.5,32.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12697 components: - type: Transform @@ -86584,7 +86573,7 @@ entities: pos: -2.5,33.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12698 components: - type: Transform @@ -86592,7 +86581,7 @@ entities: pos: -2.5,34.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12699 components: - type: Transform @@ -86600,7 +86589,7 @@ entities: pos: -2.5,35.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12700 components: - type: Transform @@ -86608,7 +86597,7 @@ entities: pos: -2.5,36.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12701 components: - type: Transform @@ -86616,7 +86605,7 @@ entities: pos: -24.5,41.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12702 components: - type: Transform @@ -86624,7 +86613,7 @@ entities: pos: -16.5,31.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12703 components: - type: Transform @@ -86632,7 +86621,7 @@ entities: pos: -16.5,30.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12704 components: - type: Transform @@ -86640,7 +86629,7 @@ entities: pos: -16.5,29.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12705 components: - type: Transform @@ -86648,14 +86637,14 @@ entities: pos: -16.5,28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12706 components: - type: Transform pos: -24.5,43.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12707 components: - type: Transform @@ -86663,7 +86652,7 @@ entities: pos: -17.5,35.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12708 components: - type: Transform @@ -86671,7 +86660,7 @@ entities: pos: -17.5,36.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12709 components: - type: Transform @@ -86679,7 +86668,7 @@ entities: pos: -17.5,37.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12710 components: - type: Transform @@ -86687,7 +86676,7 @@ entities: pos: -17.5,38.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12711 components: - type: Transform @@ -86695,7 +86684,7 @@ entities: pos: -17.5,27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12712 components: - type: Transform @@ -86703,7 +86692,7 @@ entities: pos: -22.5,27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12713 components: - type: Transform @@ -86711,7 +86700,7 @@ entities: pos: -21.5,27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12714 components: - type: Transform @@ -86719,7 +86708,7 @@ entities: pos: -20.5,27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12715 components: - type: Transform @@ -86727,7 +86716,7 @@ entities: pos: -18.5,27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12716 components: - type: Transform @@ -86735,7 +86724,7 @@ entities: pos: -26.5,28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12717 components: - type: Transform @@ -86743,7 +86732,7 @@ entities: pos: -25.5,28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12718 components: - type: Transform @@ -86751,7 +86740,7 @@ entities: pos: -27.5,28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12719 components: - type: Transform @@ -86759,7 +86748,7 @@ entities: pos: -28.5,28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12720 components: - type: Transform @@ -86767,7 +86756,7 @@ entities: pos: -29.5,28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12721 components: - type: Transform @@ -86775,7 +86764,7 @@ entities: pos: -31.5,28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12722 components: - type: Transform @@ -86783,7 +86772,7 @@ entities: pos: -32.5,28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12723 components: - type: Transform @@ -86791,7 +86780,7 @@ entities: pos: -33.5,28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12724 components: - type: Transform @@ -86799,21 +86788,21 @@ entities: pos: -34.5,28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12725 components: - type: Transform pos: -35.5,27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12726 components: - type: Transform pos: -35.5,25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12727 components: - type: Transform @@ -86821,7 +86810,7 @@ entities: pos: -35.5,24.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12728 components: - type: Transform @@ -86829,7 +86818,7 @@ entities: pos: -34.5,23.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12729 components: - type: Transform @@ -86837,7 +86826,7 @@ entities: pos: -33.5,23.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12730 components: - type: Transform @@ -86845,14 +86834,14 @@ entities: pos: -32.5,23.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12731 components: - type: Transform pos: 0.5,35.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12732 components: - type: Transform @@ -86860,7 +86849,7 @@ entities: pos: -0.5,37.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12733 components: - type: Transform @@ -86868,7 +86857,7 @@ entities: pos: -36.5,28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12734 components: - type: Transform @@ -86876,7 +86865,7 @@ entities: pos: -38.5,28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12735 components: - type: Transform @@ -86884,7 +86873,7 @@ entities: pos: -39.5,28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12736 components: - type: Transform @@ -86892,7 +86881,7 @@ entities: pos: -40.5,28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12737 components: - type: Transform @@ -86900,7 +86889,7 @@ entities: pos: -41.5,29.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12738 components: - type: Transform @@ -86908,7 +86897,7 @@ entities: pos: -41.5,30.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12739 components: - type: Transform @@ -86916,7 +86905,7 @@ entities: pos: -41.5,32.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12740 components: - type: Transform @@ -86924,7 +86913,7 @@ entities: pos: -41.5,31.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12741 components: - type: Transform @@ -86955,42 +86944,42 @@ entities: pos: -1.5,37.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12745 components: - type: Transform pos: -24.5,29.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12746 components: - type: Transform pos: -24.5,30.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12747 components: - type: Transform pos: -24.5,31.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12748 components: - type: Transform pos: -24.5,32.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12749 components: - type: Transform pos: -24.5,33.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12750 components: - type: Transform @@ -86998,7 +86987,7 @@ entities: pos: -25.5,34.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12751 components: - type: Transform @@ -87006,7 +86995,7 @@ entities: pos: -26.5,34.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12752 components: - type: Transform @@ -87014,7 +87003,7 @@ entities: pos: -27.5,34.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12753 components: - type: Transform @@ -87022,7 +87011,7 @@ entities: pos: -24.5,35.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12754 components: - type: Transform @@ -87030,7 +87019,7 @@ entities: pos: -24.5,36.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12755 components: - type: Transform @@ -87038,7 +87027,7 @@ entities: pos: -24.5,37.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12756 components: - type: Transform @@ -87046,7 +87035,7 @@ entities: pos: -24.5,38.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12757 components: - type: Transform @@ -87054,7 +87043,7 @@ entities: pos: -24.5,38.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12758 components: - type: Transform @@ -87062,7 +87051,7 @@ entities: pos: -24.5,37.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12759 components: - type: Transform @@ -87070,7 +87059,7 @@ entities: pos: -24.5,40.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12760 components: - type: Transform @@ -87078,105 +87067,105 @@ entities: pos: -24.5,38.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12761 components: - type: Transform pos: 0.5,36.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12762 components: - type: Transform pos: 0.5,24.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12763 components: - type: Transform pos: 0.5,23.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12764 components: - type: Transform pos: 0.5,22.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12765 components: - type: Transform pos: 0.5,21.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12766 components: - type: Transform pos: 0.5,20.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12767 components: - type: Transform pos: 0.5,19.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12768 components: - type: Transform pos: 0.5,33.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12769 components: - type: Transform pos: 0.5,32.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12770 components: - type: Transform pos: 0.5,31.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12771 components: - type: Transform pos: 0.5,30.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12772 components: - type: Transform pos: 0.5,28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12773 components: - type: Transform pos: 0.5,27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12774 components: - type: Transform pos: 0.5,26.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12775 components: - type: Transform @@ -87184,7 +87173,7 @@ entities: pos: 0.5,39.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12776 components: - type: Transform @@ -87192,7 +87181,7 @@ entities: pos: 0.5,38.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12777 components: - type: Transform @@ -87200,7 +87189,7 @@ entities: pos: 0.5,58.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12778 components: - type: Transform @@ -87208,7 +87197,7 @@ entities: pos: 0.5,57.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12779 components: - type: Transform @@ -87216,7 +87205,7 @@ entities: pos: 0.5,56.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12780 components: - type: Transform @@ -87224,7 +87213,7 @@ entities: pos: 0.5,55.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12781 components: - type: Transform @@ -87232,7 +87221,7 @@ entities: pos: 0.5,54.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12782 components: - type: Transform @@ -87240,7 +87229,7 @@ entities: pos: 0.5,52.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12783 components: - type: Transform @@ -87248,7 +87237,7 @@ entities: pos: 0.5,51.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12784 components: - type: Transform @@ -87256,7 +87245,7 @@ entities: pos: 0.5,50.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12785 components: - type: Transform @@ -87264,7 +87253,7 @@ entities: pos: 0.5,49.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12786 components: - type: Transform @@ -87272,7 +87261,7 @@ entities: pos: 0.5,48.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12787 components: - type: Transform @@ -87280,7 +87269,7 @@ entities: pos: 0.5,47.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12788 components: - type: Transform @@ -87288,7 +87277,7 @@ entities: pos: 0.5,45.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12789 components: - type: Transform @@ -87296,7 +87285,7 @@ entities: pos: 0.5,44.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12790 components: - type: Transform @@ -87304,7 +87293,7 @@ entities: pos: 0.5,43.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12791 components: - type: Transform @@ -87312,7 +87301,7 @@ entities: pos: 0.5,42.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12792 components: - type: Transform @@ -87320,7 +87309,7 @@ entities: pos: 0.5,41.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12793 components: - type: Transform @@ -87328,7 +87317,7 @@ entities: pos: 0.5,40.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12794 components: - type: Transform @@ -87344,7 +87333,7 @@ entities: pos: -0.5,59.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12796 components: - type: Transform @@ -87352,35 +87341,35 @@ entities: pos: -1.5,59.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12797 components: - type: Transform pos: -2.5,58.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12798 components: - type: Transform pos: -2.5,57.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12799 components: - type: Transform pos: -2.5,56.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12800 components: - type: Transform pos: -2.5,55.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12801 components: - type: Transform @@ -87388,7 +87377,7 @@ entities: pos: -3.5,54.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12802 components: - type: Transform @@ -87396,7 +87385,7 @@ entities: pos: -4.5,54.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12803 components: - type: Transform @@ -87404,42 +87393,42 @@ entities: pos: -4.5,54.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12804 components: - type: Transform pos: -6.5,53.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12805 components: - type: Transform pos: -6.5,52.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12806 components: - type: Transform pos: -6.5,51.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12807 components: - type: Transform pos: -6.5,50.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12808 components: - type: Transform pos: -6.5,49.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12809 components: - type: Transform @@ -87447,7 +87436,7 @@ entities: pos: 2.5,59.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12810 components: - type: Transform @@ -87455,35 +87444,35 @@ entities: pos: 3.5,59.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12811 components: - type: Transform pos: 4.5,58.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12812 components: - type: Transform pos: 4.5,57.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12813 components: - type: Transform pos: 4.5,56.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12814 components: - type: Transform pos: 4.5,55.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12815 components: - type: Transform @@ -87491,7 +87480,7 @@ entities: pos: 7.5,51.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12816 components: - type: Transform @@ -87499,7 +87488,7 @@ entities: pos: 1.5,34.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12817 components: - type: Transform @@ -87507,7 +87496,7 @@ entities: pos: 2.5,34.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12818 components: - type: Transform @@ -87555,7 +87544,7 @@ entities: pos: 7.5,36.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12824 components: - type: Transform @@ -87563,7 +87552,7 @@ entities: pos: 7.5,35.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12825 components: - type: Transform @@ -87571,7 +87560,7 @@ entities: pos: 7.5,39.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12826 components: - type: Transform @@ -87579,7 +87568,7 @@ entities: pos: 7.5,50.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12827 components: - type: Transform @@ -87587,7 +87576,7 @@ entities: pos: 6.5,52.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12828 components: - type: Transform @@ -87595,7 +87584,7 @@ entities: pos: 5.5,52.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12829 components: - type: Transform @@ -87603,7 +87592,7 @@ entities: pos: 7.5,49.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12830 components: - type: Transform @@ -87611,7 +87600,7 @@ entities: pos: 7.5,50.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12831 components: - type: Transform @@ -87619,7 +87608,7 @@ entities: pos: 5.5,54.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12832 components: - type: Transform @@ -87627,7 +87616,7 @@ entities: pos: 1.5,53.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12833 components: - type: Transform @@ -87635,7 +87624,7 @@ entities: pos: 2.5,53.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12834 components: - type: Transform @@ -87643,7 +87632,7 @@ entities: pos: 3.5,53.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12835 components: - type: Transform @@ -87651,7 +87640,7 @@ entities: pos: 1.5,25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12836 components: - type: Transform @@ -87659,7 +87648,7 @@ entities: pos: 2.5,25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12837 components: - type: Transform @@ -87667,7 +87656,7 @@ entities: pos: 3.5,25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12838 components: - type: Transform @@ -87675,7 +87664,7 @@ entities: pos: 4.5,25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12839 components: - type: Transform @@ -87707,7 +87696,7 @@ entities: pos: 27.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12843 components: - type: Transform @@ -87715,7 +87704,7 @@ entities: pos: 1.5,17.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12844 components: - type: Transform @@ -87723,7 +87712,7 @@ entities: pos: 2.5,17.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12845 components: - type: Transform @@ -87731,7 +87720,7 @@ entities: pos: 3.5,17.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12846 components: - type: Transform @@ -87739,7 +87728,7 @@ entities: pos: 4.5,17.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12847 components: - type: Transform @@ -87747,7 +87736,7 @@ entities: pos: 26.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12848 components: - type: Transform @@ -87755,7 +87744,7 @@ entities: pos: 25.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12849 components: - type: Transform @@ -87763,7 +87752,7 @@ entities: pos: 24.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12850 components: - type: Transform @@ -87771,7 +87760,7 @@ entities: pos: 23.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12851 components: - type: Transform @@ -87779,7 +87768,7 @@ entities: pos: 21.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12852 components: - type: Transform @@ -87787,7 +87776,7 @@ entities: pos: 20.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12853 components: - type: Transform @@ -87795,7 +87784,7 @@ entities: pos: 19.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12854 components: - type: Transform @@ -87803,7 +87792,7 @@ entities: pos: 18.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12855 components: - type: Transform @@ -87811,7 +87800,7 @@ entities: pos: 17.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12856 components: - type: Transform @@ -87819,7 +87808,7 @@ entities: pos: 16.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12857 components: - type: Transform @@ -87827,7 +87816,7 @@ entities: pos: 15.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12858 components: - type: Transform @@ -87835,7 +87824,7 @@ entities: pos: 14.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12859 components: - type: Transform @@ -87843,7 +87832,7 @@ entities: pos: 13.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12860 components: - type: Transform @@ -87851,7 +87840,7 @@ entities: pos: 12.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12861 components: - type: Transform @@ -87859,7 +87848,7 @@ entities: pos: 28.5,2.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12862 components: - type: Transform @@ -87867,7 +87856,7 @@ entities: pos: 28.5,3.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12863 components: - type: Transform @@ -87875,7 +87864,7 @@ entities: pos: 28.5,4.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12864 components: - type: Transform @@ -87883,7 +87872,7 @@ entities: pos: 28.5,5.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12865 components: - type: Transform @@ -87891,7 +87880,7 @@ entities: pos: 25.5,6.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12866 components: - type: Transform @@ -87899,7 +87888,7 @@ entities: pos: 27.5,6.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12867 components: - type: Transform @@ -87907,7 +87896,7 @@ entities: pos: 26.5,6.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12868 components: - type: Transform @@ -87915,7 +87904,7 @@ entities: pos: 24.5,6.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12869 components: - type: Transform @@ -87923,7 +87912,7 @@ entities: pos: 22.5,6.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12870 components: - type: Transform @@ -87931,7 +87920,7 @@ entities: pos: 23.5,6.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12871 components: - type: Transform @@ -87939,7 +87928,7 @@ entities: pos: 21.5,6.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12872 components: - type: Transform @@ -87947,7 +87936,7 @@ entities: pos: 19.5,6.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12873 components: - type: Transform @@ -87955,42 +87944,42 @@ entities: pos: 18.5,6.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12874 components: - type: Transform pos: 28.5,7.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12875 components: - type: Transform pos: 28.5,8.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12876 components: - type: Transform pos: 28.5,9.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12877 components: - type: Transform pos: 28.5,11.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12878 components: - type: Transform pos: 28.5,12.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12879 components: - type: Transform @@ -87998,7 +87987,7 @@ entities: pos: 27.5,13.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12880 components: - type: Transform @@ -88006,7 +87995,7 @@ entities: pos: 25.5,13.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12881 components: - type: Transform @@ -88014,7 +88003,7 @@ entities: pos: 26.5,13.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12882 components: - type: Transform @@ -88022,7 +88011,7 @@ entities: pos: 24.5,13.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12883 components: - type: Transform @@ -88030,7 +88019,7 @@ entities: pos: 23.5,13.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12884 components: - type: Transform @@ -88038,42 +88027,42 @@ entities: pos: 22.5,15.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12886 components: - type: Transform pos: 21.5,17.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12887 components: - type: Transform pos: 21.5,18.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12888 components: - type: Transform pos: 21.5,19.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12889 components: - type: Transform pos: 21.5,20.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12890 components: - type: Transform pos: 21.5,21.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12891 components: - type: Transform @@ -88081,7 +88070,7 @@ entities: pos: 29.5,6.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12892 components: - type: Transform @@ -88089,7 +88078,7 @@ entities: pos: 30.5,6.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12893 components: - type: Transform @@ -88097,7 +88086,7 @@ entities: pos: 31.5,6.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12894 components: - type: Transform @@ -88105,7 +88094,7 @@ entities: pos: 32.5,6.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12895 components: - type: Transform @@ -88113,7 +88102,7 @@ entities: pos: 33.5,6.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12896 components: - type: Transform @@ -88121,7 +88110,7 @@ entities: pos: 34.5,6.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12897 components: - type: Transform @@ -88129,7 +88118,7 @@ entities: pos: 35.5,6.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12898 components: - type: Transform @@ -88137,7 +88126,7 @@ entities: pos: 36.5,6.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12899 components: - type: Transform @@ -88145,7 +88134,7 @@ entities: pos: 37.5,6.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12900 components: - type: Transform @@ -88153,7 +88142,7 @@ entities: pos: 38.5,6.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12901 components: - type: Transform @@ -88161,7 +88150,7 @@ entities: pos: 39.5,6.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12902 components: - type: Transform @@ -88169,7 +88158,7 @@ entities: pos: 40.5,6.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12903 components: - type: Transform @@ -88177,28 +88166,28 @@ entities: pos: 41.5,6.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12904 components: - type: Transform pos: 28.5,14.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12905 components: - type: Transform pos: 28.5,16.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12906 components: - type: Transform pos: 28.5,17.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12907 components: - type: Transform @@ -88206,7 +88195,7 @@ entities: pos: 28.5,20.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12908 components: - type: Transform @@ -88214,7 +88203,7 @@ entities: pos: 28.5,19.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12909 components: - type: Transform @@ -88222,7 +88211,7 @@ entities: pos: 29.5,15.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12910 components: - type: Transform @@ -88230,7 +88219,7 @@ entities: pos: 30.5,15.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12911 components: - type: Transform @@ -88238,7 +88227,7 @@ entities: pos: 31.5,15.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12912 components: - type: Transform @@ -88246,7 +88235,7 @@ entities: pos: 34.5,15.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12913 components: - type: Transform @@ -88254,7 +88243,7 @@ entities: pos: 33.5,15.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12914 components: - type: Transform @@ -88262,7 +88251,7 @@ entities: pos: 28.5,21.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12915 components: - type: Transform @@ -88270,7 +88259,7 @@ entities: pos: 28.5,22.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12916 components: - type: Transform @@ -88278,7 +88267,7 @@ entities: pos: 28.5,23.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12917 components: - type: Transform @@ -88286,7 +88275,7 @@ entities: pos: 28.5,24.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12918 components: - type: Transform @@ -88294,7 +88283,7 @@ entities: pos: 28.5,26.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12919 components: - type: Transform @@ -88302,7 +88291,7 @@ entities: pos: 31.5,27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12920 components: - type: Transform @@ -88310,7 +88299,7 @@ entities: pos: 29.5,27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12921 components: - type: Transform @@ -88318,7 +88307,7 @@ entities: pos: 30.5,27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12922 components: - type: Transform @@ -88326,7 +88315,7 @@ entities: pos: 32.5,27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12923 components: - type: Transform @@ -88334,7 +88323,7 @@ entities: pos: 33.5,27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12924 components: - type: Transform @@ -88342,21 +88331,21 @@ entities: pos: 34.5,27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12925 components: - type: Transform pos: 28.5,28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12926 components: - type: Transform pos: 28.5,29.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12927 components: - type: Transform @@ -88364,7 +88353,7 @@ entities: pos: 27.5,30.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12928 components: - type: Transform @@ -88372,7 +88361,7 @@ entities: pos: 26.5,30.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12929 components: - type: Transform @@ -88380,7 +88369,7 @@ entities: pos: 25.5,30.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12930 components: - type: Transform @@ -88388,7 +88377,7 @@ entities: pos: 24.5,30.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12931 components: - type: Transform @@ -88396,7 +88385,7 @@ entities: pos: 23.5,30.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12932 components: - type: Transform @@ -88404,7 +88393,7 @@ entities: pos: 22.5,30.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12933 components: - type: Transform @@ -88412,7 +88401,7 @@ entities: pos: 20.5,30.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12934 components: - type: Transform @@ -88428,7 +88417,7 @@ entities: pos: 19.5,31.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12936 components: - type: Transform @@ -88436,7 +88425,7 @@ entities: pos: 19.5,32.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12937 components: - type: Transform @@ -88444,7 +88433,7 @@ entities: pos: 19.5,33.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12938 components: - type: Transform @@ -88452,7 +88441,7 @@ entities: pos: 19.5,34.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12939 components: - type: Transform @@ -88460,7 +88449,7 @@ entities: pos: 19.5,34.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12940 components: - type: Transform @@ -88468,7 +88457,7 @@ entities: pos: 19.5,35.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12941 components: - type: Transform @@ -88476,7 +88465,7 @@ entities: pos: 19.5,36.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12942 components: - type: Transform @@ -88484,7 +88473,7 @@ entities: pos: 19.5,37.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12943 components: - type: Transform @@ -88492,7 +88481,7 @@ entities: pos: 18.5,38.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12944 components: - type: Transform @@ -88500,7 +88489,7 @@ entities: pos: 17.5,38.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12945 components: - type: Transform @@ -88508,7 +88497,7 @@ entities: pos: 16.5,38.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12946 components: - type: Transform @@ -88516,70 +88505,70 @@ entities: pos: 15.5,38.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12947 components: - type: Transform pos: 19.5,39.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12948 components: - type: Transform pos: 19.5,40.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12949 components: - type: Transform pos: 19.5,41.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12950 components: - type: Transform pos: 19.5,42.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12951 components: - type: Transform pos: 19.5,43.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12952 components: - type: Transform pos: 19.5,44.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12953 components: - type: Transform pos: 28.5,31.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12954 components: - type: Transform pos: 28.5,32.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12955 components: - type: Transform pos: 28.5,33.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12956 components: - type: Transform @@ -88587,7 +88576,7 @@ entities: pos: 30.5,34.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12957 components: - type: Transform @@ -88595,7 +88584,7 @@ entities: pos: 31.5,34.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12958 components: - type: Transform @@ -88603,7 +88592,7 @@ entities: pos: 29.5,34.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12959 components: - type: Transform @@ -88611,7 +88600,7 @@ entities: pos: 27.5,35.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12960 components: - type: Transform @@ -88627,7 +88616,7 @@ entities: pos: 28.5,36.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12962 components: - type: Transform @@ -88635,7 +88624,7 @@ entities: pos: 28.5,37.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12963 components: - type: Transform @@ -88643,7 +88632,7 @@ entities: pos: 27.5,38.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12964 components: - type: Transform @@ -88651,28 +88640,28 @@ entities: pos: 26.5,38.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12965 components: - type: Transform pos: 14.5,39.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12966 components: - type: Transform pos: 14.5,41.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12967 components: - type: Transform pos: 14.5,42.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12968 components: - type: Transform @@ -88680,7 +88669,7 @@ entities: pos: 35.5,27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12969 components: - type: Transform @@ -88688,7 +88677,7 @@ entities: pos: 37.5,27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12970 components: - type: Transform @@ -88696,7 +88685,7 @@ entities: pos: 38.5,27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12971 components: - type: Transform @@ -88704,7 +88693,7 @@ entities: pos: 39.5,27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12972 components: - type: Transform @@ -88712,7 +88701,7 @@ entities: pos: 41.5,27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12973 components: - type: Transform @@ -88720,7 +88709,7 @@ entities: pos: 42.5,27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12974 components: - type: Transform @@ -88728,49 +88717,49 @@ entities: pos: 43.5,27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12975 components: - type: Transform pos: 44.5,29.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12976 components: - type: Transform pos: 44.5,29.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12977 components: - type: Transform pos: 44.5,30.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12978 components: - type: Transform pos: 44.5,31.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12979 components: - type: Transform pos: 44.5,32.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12980 components: - type: Transform pos: 44.5,33.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12981 components: - type: Transform @@ -88778,14 +88767,14 @@ entities: pos: 44.5,36.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12982 components: - type: Transform pos: 44.5,34.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12983 components: - type: Transform @@ -88793,7 +88782,7 @@ entities: pos: 44.5,35.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12984 components: - type: Transform @@ -88801,7 +88790,7 @@ entities: pos: 44.5,37.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12985 components: - type: Transform @@ -88809,7 +88798,7 @@ entities: pos: 44.5,38.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12986 components: - type: Transform @@ -88817,7 +88806,7 @@ entities: pos: 43.5,39.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12987 components: - type: Transform @@ -88825,7 +88814,7 @@ entities: pos: 41.5,39.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12988 components: - type: Transform @@ -88833,7 +88822,7 @@ entities: pos: 42.5,39.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12989 components: - type: Transform @@ -88841,7 +88830,7 @@ entities: pos: 41.5,39.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12990 components: - type: Transform @@ -88849,21 +88838,21 @@ entities: pos: 40.5,40.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12991 components: - type: Transform pos: 44.5,40.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12992 components: - type: Transform pos: 44.5,41.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12993 components: - type: Transform @@ -88871,7 +88860,7 @@ entities: pos: 36.5,26.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12994 components: - type: Transform @@ -88879,7 +88868,7 @@ entities: pos: 36.5,25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12995 components: - type: Transform @@ -88887,14 +88876,14 @@ entities: pos: 36.5,24.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12996 components: - type: Transform pos: -24.5,42.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12997 components: - type: Transform @@ -88902,7 +88891,7 @@ entities: pos: 37.5,16.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12998 components: - type: Transform @@ -88910,7 +88899,7 @@ entities: pos: 42.5,10.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 12999 components: - type: Transform @@ -88918,7 +88907,7 @@ entities: pos: 20.5,7.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13000 components: - type: Transform @@ -88926,7 +88915,7 @@ entities: pos: 20.5,8.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13001 components: - type: Transform @@ -88934,7 +88923,7 @@ entities: pos: 20.5,9.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13002 components: - type: Transform @@ -88942,7 +88931,7 @@ entities: pos: 20.5,10.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13003 components: - type: Transform @@ -88950,7 +88939,7 @@ entities: pos: 20.5,11.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13004 components: - type: Transform @@ -88958,7 +88947,7 @@ entities: pos: 20.5,11.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13005 components: - type: Transform @@ -88966,7 +88955,7 @@ entities: pos: 20.5,12.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13006 components: - type: Transform @@ -88974,7 +88963,7 @@ entities: pos: 33.5,15.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13007 components: - type: Transform @@ -88982,7 +88971,7 @@ entities: pos: 35.5,15.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13008 components: - type: Transform @@ -88997,35 +88986,35 @@ entities: pos: 32.5,-8.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13010 components: - type: Transform pos: 32.5,-9.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13011 components: - type: Transform pos: 32.5,-10.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13012 components: - type: Transform pos: 32.5,-7.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13013 components: - type: Transform pos: 32.5,-5.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13014 components: - type: Transform @@ -89033,14 +89022,14 @@ entities: pos: 33.5,-4.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13015 components: - type: Transform pos: 32.5,-6.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13016 components: - type: Transform @@ -89048,7 +89037,7 @@ entities: pos: 34.5,-2.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13017 components: - type: Transform @@ -89056,7 +89045,7 @@ entities: pos: 34.5,-3.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13018 components: - type: Transform @@ -89064,7 +89053,7 @@ entities: pos: 34.5,-1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13019 components: - type: Transform @@ -89072,7 +89061,7 @@ entities: pos: 34.5,-0.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13020 components: - type: Transform @@ -89080,7 +89069,7 @@ entities: pos: 34.5,0.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13021 components: - type: Transform @@ -89088,7 +89077,7 @@ entities: pos: 33.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13022 components: - type: Transform @@ -89096,7 +89085,7 @@ entities: pos: 32.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13023 components: - type: Transform @@ -89104,7 +89093,7 @@ entities: pos: 31.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13024 components: - type: Transform @@ -89112,7 +89101,7 @@ entities: pos: 30.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13025 components: - type: Transform @@ -89120,7 +89109,7 @@ entities: pos: 29.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13026 components: - type: Transform @@ -89128,7 +89117,7 @@ entities: pos: 39.5,-11.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13027 components: - type: Transform @@ -89136,7 +89125,7 @@ entities: pos: 40.5,-11.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13028 components: - type: Transform @@ -89144,7 +89133,7 @@ entities: pos: 41.5,-11.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13029 components: - type: Transform @@ -89159,7 +89148,7 @@ entities: pos: 9.5,6.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13031 components: - type: Transform @@ -89167,7 +89156,7 @@ entities: pos: 9.5,6.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13032 components: - type: Transform @@ -89175,7 +89164,7 @@ entities: pos: 9.5,5.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13033 components: - type: Transform @@ -89183,14 +89172,14 @@ entities: pos: 9.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13034 components: - type: Transform pos: 10.5,3.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13035 components: - type: Transform @@ -89198,7 +89187,7 @@ entities: pos: 9.5,7.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13036 components: - type: Transform @@ -89206,7 +89195,7 @@ entities: pos: 9.5,7.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13037 components: - type: Transform @@ -89214,7 +89203,7 @@ entities: pos: 9.5,8.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13038 components: - type: Transform @@ -89222,7 +89211,7 @@ entities: pos: 9.5,8.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13039 components: - type: Transform @@ -89230,7 +89219,7 @@ entities: pos: 9.5,9.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13040 components: - type: Transform @@ -89238,7 +89227,7 @@ entities: pos: 9.5,10.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13041 components: - type: Transform @@ -89246,7 +89235,7 @@ entities: pos: 9.5,10.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13042 components: - type: Transform @@ -89254,7 +89243,7 @@ entities: pos: 9.5,11.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13043 components: - type: Transform @@ -89262,7 +89251,7 @@ entities: pos: 9.5,12.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13044 components: - type: Transform @@ -89270,7 +89259,7 @@ entities: pos: 9.5,12.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13045 components: - type: Transform @@ -89278,7 +89267,7 @@ entities: pos: -12.5,17.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13046 components: - type: Transform @@ -89286,7 +89275,7 @@ entities: pos: -12.5,16.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13047 components: - type: Transform @@ -89294,7 +89283,7 @@ entities: pos: -12.5,15.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13048 components: - type: Transform @@ -89302,7 +89291,7 @@ entities: pos: -28.5,6.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13049 components: - type: Transform @@ -89310,7 +89299,7 @@ entities: pos: -27.5,6.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13050 components: - type: Transform @@ -89318,7 +89307,7 @@ entities: pos: -26.5,6.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13051 components: - type: Transform @@ -89326,7 +89315,7 @@ entities: pos: -25.5,6.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13052 components: - type: Transform @@ -89341,28 +89330,28 @@ entities: pos: 6.5,-26.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13054 components: - type: Transform pos: 6.5,-27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13055 components: - type: Transform pos: 6.5,-28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13056 components: - type: Transform pos: 6.5,-29.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13057 components: - type: Transform @@ -89370,7 +89359,7 @@ entities: pos: 19.5,-24.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13058 components: - type: Transform @@ -89378,7 +89367,7 @@ entities: pos: 19.5,-23.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13059 components: - type: Transform @@ -89386,7 +89375,7 @@ entities: pos: 19.5,-22.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13060 components: - type: Transform @@ -89394,7 +89383,7 @@ entities: pos: 19.5,-21.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13061 components: - type: Transform @@ -89402,7 +89391,7 @@ entities: pos: 19.5,-20.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13062 components: - type: Transform @@ -89410,7 +89399,7 @@ entities: pos: 26.5,-24.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13063 components: - type: Transform @@ -89418,7 +89407,7 @@ entities: pos: 26.5,-22.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13064 components: - type: Transform @@ -89426,7 +89415,7 @@ entities: pos: 26.5,-23.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13065 components: - type: Transform @@ -89434,7 +89423,7 @@ entities: pos: 26.5,-21.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13066 components: - type: Transform @@ -89442,7 +89431,7 @@ entities: pos: 26.5,-20.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13067 components: - type: Transform @@ -89450,7 +89439,7 @@ entities: pos: 26.5,-19.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13068 components: - type: Transform @@ -89458,42 +89447,42 @@ entities: pos: 38.5,-23.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13069 components: - type: Transform pos: 43.5,-12.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13070 components: - type: Transform pos: 43.5,-13.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13071 components: - type: Transform pos: 43.5,-14.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13072 components: - type: Transform pos: 43.5,-15.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13073 components: - type: Transform pos: 43.5,-16.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13074 components: - type: Transform @@ -89501,7 +89490,7 @@ entities: pos: 39.5,-25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13075 components: - type: Transform @@ -89509,7 +89498,7 @@ entities: pos: 40.5,-25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13076 components: - type: Transform @@ -89517,7 +89506,7 @@ entities: pos: 42.5,-25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13077 components: - type: Transform @@ -89525,7 +89514,7 @@ entities: pos: 43.5,-25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13078 components: - type: Transform @@ -89533,7 +89522,7 @@ entities: pos: 42.5,-25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13079 components: - type: Transform @@ -89541,7 +89530,7 @@ entities: pos: 41.5,-25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13080 components: - type: Transform @@ -89549,7 +89538,7 @@ entities: pos: 43.5,-25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13081 components: - type: Transform @@ -89557,7 +89546,7 @@ entities: pos: 44.5,-25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13082 components: - type: Transform @@ -89565,7 +89554,7 @@ entities: pos: 19.5,-26.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13083 components: - type: Transform @@ -89573,7 +89562,7 @@ entities: pos: 19.5,-27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13084 components: - type: Transform @@ -89581,7 +89570,7 @@ entities: pos: 19.5,-28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13085 components: - type: Transform @@ -89589,7 +89578,7 @@ entities: pos: 19.5,-29.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13086 components: - type: Transform @@ -89597,7 +89586,7 @@ entities: pos: 19.5,-30.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13087 components: - type: Transform @@ -89638,7 +89627,7 @@ entities: pos: 6.5,-52.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13093 components: - type: Transform @@ -89753,7 +89742,7 @@ entities: pos: 10.5,-52.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13108 components: - type: Transform @@ -89761,7 +89750,7 @@ entities: pos: 11.5,-52.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13109 components: - type: Transform @@ -89769,7 +89758,7 @@ entities: pos: 25.5,-25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13110 components: - type: Transform @@ -89777,14 +89766,14 @@ entities: pos: 7.5,-53.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13111 components: - type: Transform pos: 30.5,-27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13112 components: - type: Transform @@ -89807,7 +89796,7 @@ entities: pos: 30.5,-28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13115 components: - type: Transform @@ -89823,7 +89812,7 @@ entities: pos: 30.5,-30.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13117 components: - type: Transform @@ -89831,7 +89820,7 @@ entities: pos: 28.5,-31.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13118 components: - type: Transform @@ -89839,14 +89828,14 @@ entities: pos: 38.5,17.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13119 components: - type: Transform pos: 42.5,9.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13120 components: - type: Transform @@ -89854,14 +89843,14 @@ entities: pos: 34.5,15.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13121 components: - type: Transform pos: 42.5,12.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13122 components: - type: Transform @@ -89869,14 +89858,14 @@ entities: pos: 36.5,15.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13123 components: - type: Transform pos: 42.5,13.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13124 components: - type: Transform @@ -89884,7 +89873,7 @@ entities: pos: 34.5,14.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13125 components: - type: Transform @@ -89892,7 +89881,7 @@ entities: pos: 41.5,17.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13126 components: - type: Transform @@ -89900,14 +89889,14 @@ entities: pos: 33.5,14.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13127 components: - type: Transform pos: 42.5,8.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13128 components: - type: Transform @@ -90531,7 +90520,7 @@ entities: pos: -0.5,-23.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13210 components: - type: Transform @@ -90539,7 +90528,7 @@ entities: pos: -1.5,-23.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13211 components: - type: Transform @@ -90547,7 +90536,7 @@ entities: pos: -2.5,-23.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13212 components: - type: Transform @@ -90555,7 +90544,7 @@ entities: pos: -3.5,-23.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13213 components: - type: Transform @@ -91433,7 +91422,7 @@ entities: pos: 34.5,-11.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13325 components: - type: Transform @@ -91601,7 +91590,7 @@ entities: pos: 28.5,0.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13346 components: - type: Transform @@ -91609,7 +91598,7 @@ entities: pos: 28.5,-0.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13347 components: - type: Transform @@ -91617,7 +91606,7 @@ entities: pos: 28.5,-1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13348 components: - type: Transform @@ -91645,7 +91634,7 @@ entities: pos: 28.5,-2.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13352 components: - type: Transform @@ -92055,7 +92044,7 @@ entities: pos: 42.5,11.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13404 components: - type: Transform @@ -92883,7 +92872,7 @@ entities: pos: 14.5,37.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13510 components: - type: Transform @@ -93779,7 +93768,7 @@ entities: pos: -37.5,3.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13625 components: - type: Transform @@ -93787,7 +93776,7 @@ entities: pos: -37.5,3.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13626 components: - type: Transform @@ -93952,7 +93941,7 @@ entities: pos: -33.5,-18.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13649 components: - type: Transform @@ -93960,7 +93949,7 @@ entities: pos: -32.5,-18.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13650 components: - type: Transform @@ -93968,7 +93957,7 @@ entities: pos: -31.5,-18.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13651 components: - type: Transform @@ -93976,7 +93965,7 @@ entities: pos: -30.5,-18.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13652 components: - type: Transform @@ -94016,7 +94005,7 @@ entities: pos: -30.5,-27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13657 components: - type: Transform @@ -94024,7 +94013,7 @@ entities: pos: -30.5,-28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13658 components: - type: Transform @@ -94032,7 +94021,7 @@ entities: pos: -30.5,-29.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13659 components: - type: Transform @@ -94135,7 +94124,7 @@ entities: pos: -30.5,-30.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13673 components: - type: Transform @@ -94143,28 +94132,28 @@ entities: pos: -30.5,-31.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13674 components: - type: Transform pos: -22.5,-29.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13675 components: - type: Transform pos: -22.5,-30.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13676 components: - type: Transform pos: -22.5,-31.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13677 components: - type: Transform @@ -94200,7 +94189,7 @@ entities: pos: -33.5,-12.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13682 components: - type: Transform @@ -94208,7 +94197,7 @@ entities: pos: -32.5,-12.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13683 components: - type: Transform @@ -94216,7 +94205,7 @@ entities: pos: -31.5,-12.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13684 components: - type: Transform @@ -94224,7 +94213,7 @@ entities: pos: -30.5,-12.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13685 components: - type: Transform @@ -94264,7 +94253,7 @@ entities: pos: -15.5,-27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13690 components: - type: Transform @@ -94272,7 +94261,7 @@ entities: pos: -15.5,-26.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13691 components: - type: Transform @@ -94280,7 +94269,7 @@ entities: pos: -15.5,-25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13692 components: - type: Transform @@ -94325,21 +94314,21 @@ entities: pos: -15.5,-23.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13698 components: - type: Transform pos: -15.5,-22.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13699 components: - type: Transform pos: -15.5,-21.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13700 components: - type: Transform @@ -94773,7 +94762,7 @@ entities: pos: -0.5,-36.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13755 components: - type: Transform @@ -94781,7 +94770,7 @@ entities: pos: -1.5,-36.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13756 components: - type: Transform @@ -94789,28 +94778,28 @@ entities: pos: -2.5,-36.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13757 components: - type: Transform pos: -4.5,-37.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13758 components: - type: Transform pos: -4.5,-38.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13759 components: - type: Transform pos: -4.5,-39.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13760 components: - type: Transform @@ -94842,7 +94831,7 @@ entities: pos: -33.5,-32.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13764 components: - type: Transform @@ -94850,7 +94839,7 @@ entities: pos: -34.5,-32.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13765 components: - type: Transform @@ -94858,7 +94847,7 @@ entities: pos: -35.5,-31.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13766 components: - type: Transform @@ -94866,7 +94855,7 @@ entities: pos: -35.5,-30.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13767 components: - type: Transform @@ -94874,7 +94863,7 @@ entities: pos: -35.5,-29.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13768 components: - type: Transform @@ -94946,7 +94935,7 @@ entities: pos: -34.5,-38.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13777 components: - type: Transform @@ -94954,7 +94943,7 @@ entities: pos: -35.5,-38.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13778 components: - type: Transform @@ -94962,7 +94951,7 @@ entities: pos: -36.5,-38.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13779 components: - type: Transform @@ -94970,7 +94959,7 @@ entities: pos: -37.5,-38.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13780 components: - type: Transform @@ -95031,7 +95020,7 @@ entities: pos: -31.5,-39.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13788 components: - type: Transform @@ -95039,7 +95028,7 @@ entities: pos: -30.5,-39.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13789 components: - type: Transform @@ -95186,7 +95175,7 @@ entities: pos: -30.5,-47.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13808 components: - type: Transform @@ -95194,7 +95183,7 @@ entities: pos: -29.5,-47.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13809 components: - type: Transform @@ -95202,7 +95191,7 @@ entities: pos: -28.5,-47.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13810 components: - type: Transform @@ -95539,7 +95528,7 @@ entities: pos: -10.5,14.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13855 components: - type: Transform @@ -95547,7 +95536,7 @@ entities: pos: -9.5,14.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13856 components: - type: Transform @@ -95555,7 +95544,7 @@ entities: pos: -8.5,14.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13857 components: - type: Transform @@ -95563,7 +95552,7 @@ entities: pos: -7.5,14.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13858 components: - type: Transform @@ -95571,7 +95560,7 @@ entities: pos: -6.5,14.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13859 components: - type: Transform @@ -95579,7 +95568,7 @@ entities: pos: -5.5,14.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13860 components: - type: Transform @@ -95672,14 +95661,14 @@ entities: pos: -11.5,13.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13872 components: - type: Transform pos: -11.5,12.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13873 components: - type: Transform @@ -95687,7 +95676,7 @@ entities: pos: -11.5,11.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13874 components: - type: Transform @@ -95695,7 +95684,7 @@ entities: pos: -13.5,10.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13875 components: - type: Transform @@ -95703,7 +95692,7 @@ entities: pos: -14.5,10.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13876 components: - type: Transform @@ -95711,7 +95700,7 @@ entities: pos: -15.5,10.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13877 components: - type: Transform @@ -95898,7 +95887,7 @@ entities: pos: -11.5,26.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13902 components: - type: Transform @@ -95906,7 +95895,7 @@ entities: pos: -11.5,25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13903 components: - type: Transform @@ -95914,28 +95903,28 @@ entities: pos: -11.5,24.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13904 components: - type: Transform pos: -8.5,26.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13905 components: - type: Transform pos: -8.5,25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13906 components: - type: Transform pos: -8.5,24.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13907 components: - type: Transform @@ -95943,7 +95932,7 @@ entities: pos: -8.5,23.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13908 components: - type: Transform @@ -96054,7 +96043,7 @@ entities: pos: -2.5,26.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13923 components: - type: Transform @@ -96062,7 +96051,7 @@ entities: pos: -2.5,25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13924 components: - type: Transform @@ -96070,7 +96059,7 @@ entities: pos: -2.5,24.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13925 components: - type: Transform @@ -96078,7 +96067,7 @@ entities: pos: -16.5,39.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13926 components: - type: Transform @@ -96131,7 +96120,7 @@ entities: pos: -15.5,32.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13933 components: - type: Transform @@ -96139,7 +96128,7 @@ entities: pos: -14.5,32.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13934 components: - type: Transform @@ -96147,7 +96136,7 @@ entities: pos: -13.5,32.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13935 components: - type: Transform @@ -96155,7 +96144,7 @@ entities: pos: -12.5,32.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13936 components: - type: Transform @@ -96202,7 +96191,7 @@ entities: pos: -19.5,26.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13942 components: - type: Transform @@ -96226,7 +96215,7 @@ entities: pos: -17.5,32.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13945 components: - type: Transform @@ -96234,7 +96223,7 @@ entities: pos: -18.5,32.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13946 components: - type: Transform @@ -96649,7 +96638,7 @@ entities: pos: -41.5,35.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 13999 components: - type: Transform @@ -96657,7 +96646,7 @@ entities: pos: -40.5,36.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14000 components: - type: Transform @@ -96665,7 +96654,7 @@ entities: pos: -39.5,36.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14001 components: - type: Transform @@ -96673,7 +96662,7 @@ entities: pos: -38.5,36.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14002 components: - type: Transform @@ -96681,7 +96670,7 @@ entities: pos: -37.5,37.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14003 components: - type: Transform @@ -96689,7 +96678,7 @@ entities: pos: -37.5,38.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14004 components: - type: Transform @@ -96697,7 +96686,7 @@ entities: pos: -36.5,39.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14005 components: - type: Transform @@ -96705,7 +96694,7 @@ entities: pos: -35.5,39.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14006 components: - type: Transform @@ -96713,7 +96702,7 @@ entities: pos: -34.5,39.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14007 components: - type: Transform @@ -96721,7 +96710,7 @@ entities: pos: -36.5,36.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14008 components: - type: Transform @@ -96729,7 +96718,7 @@ entities: pos: -35.5,36.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14009 components: - type: Transform @@ -96737,7 +96726,7 @@ entities: pos: -34.5,36.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14010 components: - type: Transform @@ -96745,7 +96734,7 @@ entities: pos: -40.5,33.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14011 components: - type: Transform @@ -96753,7 +96742,7 @@ entities: pos: -39.5,33.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14012 components: - type: Transform @@ -96761,7 +96750,7 @@ entities: pos: -38.5,33.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14013 components: - type: Transform @@ -96769,7 +96758,7 @@ entities: pos: -37.5,33.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14014 components: - type: Transform @@ -96777,7 +96766,7 @@ entities: pos: -36.5,33.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14015 components: - type: Transform @@ -96785,7 +96774,7 @@ entities: pos: -35.5,33.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14016 components: - type: Transform @@ -96793,7 +96782,7 @@ entities: pos: -34.5,33.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14017 components: - type: Transform @@ -96833,7 +96822,7 @@ entities: pos: -36.5,26.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14022 components: - type: Transform @@ -96841,7 +96830,7 @@ entities: pos: -37.5,26.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14023 components: - type: Transform @@ -96849,7 +96838,7 @@ entities: pos: -38.5,26.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14024 components: - type: Transform @@ -96857,7 +96846,7 @@ entities: pos: -39.5,26.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14025 components: - type: Transform @@ -96865,7 +96854,7 @@ entities: pos: -40.5,26.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14026 components: - type: Transform @@ -96935,14 +96924,14 @@ entities: pos: -35.5,22.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14035 components: - type: Transform pos: -35.5,21.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14036 components: - type: Transform @@ -96950,7 +96939,7 @@ entities: pos: -36.5,20.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14037 components: - type: Transform @@ -96958,7 +96947,7 @@ entities: pos: -37.5,20.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14038 components: - type: Transform @@ -96966,21 +96955,21 @@ entities: pos: -38.5,20.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14039 components: - type: Transform pos: -23.5,26.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14040 components: - type: Transform pos: -23.5,25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14041 components: - type: Transform @@ -97159,7 +97148,7 @@ entities: pos: 1.5,29.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14064 components: - type: Transform @@ -97167,7 +97156,7 @@ entities: pos: 2.5,29.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14065 components: - type: Transform @@ -97175,7 +97164,7 @@ entities: pos: 3.5,29.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14066 components: - type: Transform @@ -97183,7 +97172,7 @@ entities: pos: 4.5,29.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14067 components: - type: Transform @@ -97228,7 +97217,7 @@ entities: pos: 3.5,34.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14073 components: - type: Transform @@ -97236,7 +97225,7 @@ entities: pos: 4.5,34.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14074 components: - type: Transform @@ -97244,7 +97233,7 @@ entities: pos: 6.5,34.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14075 components: - type: Transform @@ -97604,7 +97593,7 @@ entities: pos: 5.5,59.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14123 components: - type: Transform @@ -97612,7 +97601,7 @@ entities: pos: 6.5,60.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14124 components: - type: Transform @@ -97620,7 +97609,7 @@ entities: pos: 6.5,61.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14125 components: - type: Transform @@ -97628,7 +97617,7 @@ entities: pos: 6.5,62.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14126 components: - type: Transform @@ -97636,7 +97625,7 @@ entities: pos: 6.5,63.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14127 components: - type: Transform @@ -97644,7 +97633,7 @@ entities: pos: 6.5,64.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14128 components: - type: Transform @@ -97652,7 +97641,7 @@ entities: pos: 6.5,65.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14129 components: - type: Transform @@ -97660,7 +97649,7 @@ entities: pos: 6.5,66.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14130 components: - type: Transform @@ -97668,7 +97657,7 @@ entities: pos: 6.5,67.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14131 components: - type: Transform @@ -97676,7 +97665,7 @@ entities: pos: 6.5,68.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14132 components: - type: Transform @@ -97684,7 +97673,7 @@ entities: pos: 6.5,69.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14133 components: - type: Transform @@ -97804,7 +97793,7 @@ entities: pos: 7.5,70.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14148 components: - type: Transform @@ -97812,7 +97801,7 @@ entities: pos: 5.5,71.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14149 components: - type: Transform @@ -97820,7 +97809,7 @@ entities: pos: 4.5,71.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14150 components: - type: Transform @@ -97828,7 +97817,7 @@ entities: pos: 3.5,71.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14151 components: - type: Transform @@ -97868,7 +97857,7 @@ entities: pos: 1.5,71.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14156 components: - type: Transform @@ -97876,7 +97865,7 @@ entities: pos: 0.5,71.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14157 components: - type: Transform @@ -97884,7 +97873,7 @@ entities: pos: -0.5,71.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14158 components: - type: Transform @@ -97892,7 +97881,7 @@ entities: pos: -1.5,71.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14159 components: - type: Transform @@ -97924,7 +97913,7 @@ entities: pos: -4.5,73.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14163 components: - type: Transform @@ -97932,7 +97921,7 @@ entities: pos: -4.5,74.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14164 components: - type: Transform @@ -97980,7 +97969,7 @@ entities: pos: 6.5,72.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14170 components: - type: Transform @@ -97988,7 +97977,7 @@ entities: pos: 7.5,74.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14171 components: - type: Transform @@ -98009,14 +97998,14 @@ entities: pos: 7.5,75.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14174 components: - type: Transform pos: 7.5,76.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14175 components: - type: Transform @@ -98064,7 +98053,7 @@ entities: pos: 7.5,78.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14181 components: - type: Transform @@ -98072,7 +98061,7 @@ entities: pos: 7.5,79.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14182 components: - type: Transform @@ -98080,7 +98069,7 @@ entities: pos: 7.5,80.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14183 components: - type: Transform @@ -98088,7 +98077,7 @@ entities: pos: 7.5,81.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14184 components: - type: Transform @@ -98096,7 +98085,7 @@ entities: pos: 7.5,83.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14185 components: - type: Transform @@ -98104,7 +98093,7 @@ entities: pos: 7.5,84.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14186 components: - type: Transform @@ -98112,7 +98101,7 @@ entities: pos: 6.5,82.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14187 components: - type: Transform @@ -98160,7 +98149,7 @@ entities: pos: 3.5,83.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14193 components: - type: Transform @@ -98168,7 +98157,7 @@ entities: pos: 2.5,83.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14194 components: - type: Transform @@ -98176,7 +98165,7 @@ entities: pos: 4.5,83.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14195 components: - type: Transform @@ -98232,7 +98221,7 @@ entities: pos: 0.5,83.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14202 components: - type: Transform @@ -98240,7 +98229,7 @@ entities: pos: -0.5,83.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14203 components: - type: Transform @@ -98248,7 +98237,7 @@ entities: pos: -1.5,83.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14204 components: - type: Transform @@ -98256,14 +98245,14 @@ entities: pos: -3.5,82.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14205 components: - type: Transform pos: -4.5,83.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14206 components: - type: Transform @@ -98278,7 +98267,7 @@ entities: pos: -4.5,75.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14208 components: - type: Transform @@ -98330,7 +98319,7 @@ entities: pos: 39.5,-17.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14215 components: - type: Transform @@ -98338,7 +98327,7 @@ entities: pos: 40.5,-17.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14216 components: - type: Transform @@ -98346,7 +98335,7 @@ entities: pos: 27.5,25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14217 components: - type: Transform @@ -98354,7 +98343,7 @@ entities: pos: 26.5,25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14218 components: - type: Transform @@ -98362,7 +98351,7 @@ entities: pos: 25.5,25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14219 components: - type: Transform @@ -98370,7 +98359,7 @@ entities: pos: 24.5,25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14220 components: - type: Transform @@ -98378,7 +98367,7 @@ entities: pos: 23.5,25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14221 components: - type: Transform @@ -98386,7 +98375,7 @@ entities: pos: 22.5,25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14222 components: - type: Transform @@ -98394,7 +98383,7 @@ entities: pos: 21.5,25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14223 components: - type: Transform @@ -98402,7 +98391,7 @@ entities: pos: 20.5,25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14224 components: - type: Transform @@ -98410,7 +98399,7 @@ entities: pos: 19.5,25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14225 components: - type: Transform @@ -98534,14 +98523,14 @@ entities: pos: 18.5,24.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14241 components: - type: Transform pos: 18.5,23.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14242 components: - type: Transform @@ -98569,21 +98558,21 @@ entities: pos: -12.5,-34.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14246 components: - type: Transform pos: -12.5,-33.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14247 components: - type: Transform pos: -12.5,-32.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14248 components: - type: Transform @@ -98592,6 +98581,20 @@ entities: parent: 2 - proto: GasPipeTJunction entities: + - uid: 12221 + components: + - type: Transform + pos: 2.5,-41.5 + parent: 2 + - type: AtmosPipeColor + color: '#0000FFFF' + - uid: 12223 + components: + - type: Transform + pos: 1.5,-41.5 + parent: 2 + - type: AtmosPipeColor + color: '#0000FFFF' - uid: 14249 components: - type: Transform @@ -98603,7 +98606,7 @@ entities: pos: 32.5,15.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14251 components: - type: Transform @@ -98644,7 +98647,7 @@ entities: pos: -12.5,-41.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14258 components: - type: Transform @@ -98652,7 +98655,7 @@ entities: pos: 27.5,-46.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14259 components: - type: Transform @@ -98660,7 +98663,7 @@ entities: pos: 38.5,-17.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14260 components: - type: Transform @@ -98676,7 +98679,7 @@ entities: pos: -6.5,-32.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14262 components: - type: Transform @@ -98860,7 +98863,7 @@ entities: pos: 26.5,-53.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#FF00BFFF' - uid: 14287 components: - type: Transform @@ -98876,7 +98879,7 @@ entities: pos: 31.5,-56.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#FF00BFFF' - uid: 14289 components: - type: Transform @@ -98892,7 +98895,7 @@ entities: pos: 26.5,-60.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#FF00BFFF' - uid: 14291 components: - type: Transform @@ -98907,14 +98910,14 @@ entities: pos: 22.5,-58.5 parent: 2 - type: AtmosPipeColor - color: '#00FFFFFF' + color: '#0000FFFF' - uid: 14293 components: - type: Transform pos: 20.5,-59.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#0000FFFF' - uid: 14294 components: - type: Transform @@ -98922,7 +98925,7 @@ entities: pos: 22.5,-63.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#0000FFFF' - uid: 14295 components: - type: Transform @@ -98953,7 +98956,7 @@ entities: pos: 11.5,-41.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14299 components: - type: Transform @@ -98961,7 +98964,7 @@ entities: pos: 0.5,-35.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14300 components: - type: Transform @@ -98969,7 +98972,7 @@ entities: pos: 27.5,-44.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14301 components: - type: Transform @@ -98985,7 +98988,7 @@ entities: pos: 27.5,-44.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14303 components: - type: Transform @@ -98999,7 +99002,7 @@ entities: pos: -6.5,-28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14305 components: - type: Transform @@ -99007,7 +99010,7 @@ entities: pos: -10.5,-28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14306 components: - type: Transform @@ -99015,7 +99018,7 @@ entities: pos: -15.5,-28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14307 components: - type: Transform @@ -99023,7 +99026,7 @@ entities: pos: -23.5,-28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14308 components: - type: Transform @@ -99031,14 +99034,14 @@ entities: pos: -30.5,-32.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14309 components: - type: Transform pos: -32.5,-32.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14310 components: - type: Transform @@ -99046,7 +99049,7 @@ entities: pos: -32.5,-38.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14311 components: - type: Transform @@ -99054,7 +99057,7 @@ entities: pos: -32.5,-39.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14312 components: - type: Transform @@ -99062,7 +99065,7 @@ entities: pos: -32.5,-43.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14313 components: - type: Transform @@ -99070,7 +99073,7 @@ entities: pos: -41.5,-40.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14314 components: - type: Transform @@ -99078,7 +99081,7 @@ entities: pos: -32.5,-47.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14315 components: - type: Transform @@ -99086,7 +99089,7 @@ entities: pos: -12.5,-38.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14316 components: - type: Transform @@ -99094,7 +99097,7 @@ entities: pos: 0.5,-28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14317 components: - type: Transform @@ -99102,14 +99105,14 @@ entities: pos: 0.5,-25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14318 components: - type: Transform pos: 6.5,-25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14319 components: - type: Transform @@ -99117,14 +99120,14 @@ entities: pos: 22.5,-25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14320 components: - type: Transform pos: 38.5,-11.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14321 components: - type: Transform @@ -99132,7 +99135,7 @@ entities: pos: 8.5,-25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14322 components: - type: Transform @@ -99140,7 +99143,7 @@ entities: pos: 30.5,-24.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14323 components: - type: Transform @@ -99148,7 +99151,7 @@ entities: pos: 38.5,-19.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14324 components: - type: Transform @@ -99156,7 +99159,7 @@ entities: pos: 40.5,-32.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14325 components: - type: Transform @@ -99164,7 +99167,7 @@ entities: pos: 0.5,-19.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14326 components: - type: Transform @@ -99180,7 +99183,7 @@ entities: pos: 5.5,-46.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14328 components: - type: Transform @@ -99188,7 +99191,7 @@ entities: pos: 6.5,-50.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14329 components: - type: Transform @@ -99196,14 +99199,14 @@ entities: pos: 6.5,-53.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14330 components: - type: Transform pos: 3.5,-54.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14331 components: - type: Transform @@ -99219,7 +99222,7 @@ entities: pos: -5.5,-69.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14333 components: - type: Transform @@ -99227,7 +99230,7 @@ entities: pos: 6.5,-69.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14334 components: - type: Transform @@ -99235,7 +99238,7 @@ entities: pos: 14.5,-15.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14335 components: - type: Transform @@ -99243,7 +99246,7 @@ entities: pos: -30.5,-23.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14336 components: - type: Transform @@ -99267,7 +99270,7 @@ entities: pos: -34.5,-5.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14339 components: - type: Transform @@ -99275,7 +99278,7 @@ entities: pos: -37.5,-11.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14340 components: - type: Transform @@ -99283,14 +99286,14 @@ entities: pos: -37.5,0.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14341 components: - type: Transform pos: -37.5,8.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14342 components: - type: Transform @@ -99298,7 +99301,7 @@ entities: pos: -34.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14343 components: - type: Transform @@ -99306,14 +99309,14 @@ entities: pos: -34.5,5.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14344 components: - type: Transform pos: -30.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14345 components: - type: Transform @@ -99321,7 +99324,7 @@ entities: pos: -22.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14346 components: - type: Transform @@ -99329,7 +99332,7 @@ entities: pos: -9.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14347 components: - type: Transform @@ -99361,7 +99364,7 @@ entities: pos: 10.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14351 components: - type: Transform @@ -99369,7 +99372,7 @@ entities: pos: 11.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14352 components: - type: Transform @@ -99377,7 +99380,7 @@ entities: pos: 0.5,18.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14353 components: - type: Transform @@ -99385,7 +99388,7 @@ entities: pos: 0.5,17.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14354 components: - type: Transform @@ -99393,7 +99396,7 @@ entities: pos: 0.5,15.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14355 components: - type: Transform @@ -99401,7 +99404,7 @@ entities: pos: -10.5,18.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14356 components: - type: Transform @@ -99409,14 +99412,14 @@ entities: pos: -16.5,18.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14357 components: - type: Transform pos: -12.5,18.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14358 components: - type: Transform @@ -99424,14 +99427,14 @@ entities: pos: -29.5,5.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14359 components: - type: Transform pos: -8.5,27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14360 components: - type: Transform @@ -99439,14 +99442,14 @@ entities: pos: -9.5,27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14361 components: - type: Transform pos: -11.5,27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14362 components: - type: Transform @@ -99454,7 +99457,7 @@ entities: pos: -2.5,27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14363 components: - type: Transform @@ -99462,21 +99465,21 @@ entities: pos: -16.5,33.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14364 components: - type: Transform pos: -23.5,27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14365 components: - type: Transform pos: -19.5,27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14366 components: - type: Transform @@ -99484,7 +99487,7 @@ entities: pos: -24.5,28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14367 components: - type: Transform @@ -99492,14 +99495,14 @@ entities: pos: -30.5,28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14368 components: - type: Transform pos: -35.5,28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14369 components: - type: Transform @@ -99507,7 +99510,7 @@ entities: pos: -35.5,26.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14370 components: - type: Transform @@ -99515,7 +99518,7 @@ entities: pos: -37.5,28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14371 components: - type: Transform @@ -99523,7 +99526,7 @@ entities: pos: -41.5,33.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14372 components: - type: Transform @@ -99531,7 +99534,7 @@ entities: pos: -41.5,34.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14373 components: - type: Transform @@ -99555,7 +99558,7 @@ entities: pos: -24.5,34.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14376 components: - type: Transform @@ -99563,7 +99566,7 @@ entities: pos: -24.5,39.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14377 components: - type: Transform @@ -99571,7 +99574,7 @@ entities: pos: 0.5,25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14378 components: - type: Transform @@ -99579,7 +99582,7 @@ entities: pos: -2.5,37.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14379 components: - type: Transform @@ -99587,7 +99590,7 @@ entities: pos: 0.5,34.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14380 components: - type: Transform @@ -99595,7 +99598,7 @@ entities: pos: 0.5,37.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14381 components: - type: Transform @@ -99603,7 +99606,7 @@ entities: pos: 0.5,53.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14382 components: - type: Transform @@ -99611,7 +99614,7 @@ entities: pos: 0.5,46.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14383 components: - type: Transform @@ -99619,14 +99622,14 @@ entities: pos: -5.5,54.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14384 components: - type: Transform pos: 4.5,59.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14385 components: - type: Transform @@ -99634,7 +99637,7 @@ entities: pos: 4.5,54.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14386 components: - type: Transform @@ -99650,7 +99653,7 @@ entities: pos: 4.5,53.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14388 components: - type: Transform @@ -99666,7 +99669,7 @@ entities: pos: 22.5,1.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14390 components: - type: Transform @@ -99674,7 +99677,7 @@ entities: pos: 20.5,6.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14391 components: - type: Transform @@ -99682,7 +99685,7 @@ entities: pos: 28.5,10.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14392 components: - type: Transform @@ -99690,7 +99693,7 @@ entities: pos: 28.5,13.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14393 components: - type: Transform @@ -99698,7 +99701,7 @@ entities: pos: 22.5,14.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14394 components: - type: Transform @@ -99706,7 +99709,7 @@ entities: pos: 21.5,16.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14395 components: - type: Transform @@ -99714,7 +99717,7 @@ entities: pos: 28.5,15.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14396 components: - type: Transform @@ -99722,7 +99725,7 @@ entities: pos: 28.5,18.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14397 components: - type: Transform @@ -99730,7 +99733,7 @@ entities: pos: 28.5,25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14398 components: - type: Transform @@ -99738,7 +99741,7 @@ entities: pos: 28.5,27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14399 components: - type: Transform @@ -99746,7 +99749,7 @@ entities: pos: 21.5,30.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14400 components: - type: Transform @@ -99754,7 +99757,7 @@ entities: pos: 19.5,38.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14401 components: - type: Transform @@ -99762,7 +99765,7 @@ entities: pos: 28.5,34.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14402 components: - type: Transform @@ -99770,7 +99773,7 @@ entities: pos: 28.5,35.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14403 components: - type: Transform @@ -99778,7 +99781,7 @@ entities: pos: 14.5,38.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14404 components: - type: Transform @@ -99786,21 +99789,21 @@ entities: pos: 14.5,40.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14405 components: - type: Transform pos: 36.5,27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14406 components: - type: Transform pos: 40.5,27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14407 components: - type: Transform @@ -99808,7 +99811,7 @@ entities: pos: 44.5,28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14408 components: - type: Transform @@ -99816,7 +99819,7 @@ entities: pos: 44.5,39.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14409 components: - type: Transform @@ -99824,7 +99827,7 @@ entities: pos: 42.5,7.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14410 components: - type: Transform @@ -99832,7 +99835,7 @@ entities: pos: 42.5,-11.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14411 components: - type: Transform @@ -99840,7 +99843,7 @@ entities: pos: -12.5,14.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14412 components: - type: Transform @@ -99848,7 +99851,7 @@ entities: pos: 33.5,-11.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14413 components: - type: Transform @@ -99863,7 +99866,7 @@ entities: pos: 26.5,-25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14415 components: - type: Transform @@ -99886,7 +99889,7 @@ entities: pos: 30.5,-29.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14418 components: - type: Transform @@ -99910,7 +99913,7 @@ entities: pos: 0.5,-36.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14421 components: - type: Transform @@ -99942,7 +99945,7 @@ entities: pos: 0.5,-23.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14425 components: - type: Transform @@ -100380,7 +100383,7 @@ entities: pos: -34.5,-12.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14482 components: - type: Transform @@ -100388,7 +100391,7 @@ entities: pos: -34.5,-18.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14483 components: - type: Transform @@ -100403,7 +100406,7 @@ entities: pos: -29.5,-18.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14485 components: - type: Transform @@ -100441,7 +100444,7 @@ entities: pos: -15.5,-24.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14490 components: - type: Transform @@ -100518,7 +100521,7 @@ entities: pos: -3.5,-36.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14500 components: - type: Transform @@ -100542,7 +100545,7 @@ entities: pos: -33.5,-38.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14503 components: - type: Transform @@ -100643,7 +100646,7 @@ entities: pos: -11.5,14.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14516 components: - type: Transform @@ -100658,7 +100661,7 @@ entities: pos: -12.5,10.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14518 components: - type: Transform @@ -100778,7 +100781,7 @@ entities: pos: -37.5,36.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14534 components: - type: Transform @@ -100839,7 +100842,7 @@ entities: pos: 5.5,34.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14542 components: - type: Transform @@ -100901,7 +100904,7 @@ entities: pos: 6.5,70.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14550 components: - type: Transform @@ -100909,21 +100912,21 @@ entities: pos: 6.5,71.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14551 components: - type: Transform pos: 2.5,71.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14552 components: - type: Transform pos: -2.5,71.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14553 components: - type: Transform @@ -100947,7 +100950,7 @@ entities: pos: 7.5,77.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14556 components: - type: Transform @@ -100955,7 +100958,7 @@ entities: pos: 7.5,82.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14557 components: - type: Transform @@ -100970,7 +100973,7 @@ entities: pos: 1.5,83.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14559 components: - type: Transform @@ -100986,7 +100989,7 @@ entities: pos: 14.5,-24.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - proto: GasPort entities: - uid: 14561 @@ -101194,6 +101197,8 @@ entities: rot: -1.5707963267948966 rad pos: 24.5,-58.5 parent: 2 + - type: AtmosPipeColor + color: '#0000FFFF' - uid: 14593 components: - type: Transform @@ -101211,6 +101216,22 @@ entities: - type: Transform pos: 7.5,-31.5 parent: 2 + - uid: 22671 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 1.5,-42.5 + parent: 2 + - type: AtmosPipeColor + color: '#0000FFFF' + - uid: 22839 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 2.5,-42.5 + parent: 2 + - type: AtmosPipeColor + color: '#0000FFFF' - proto: GasPressurePump entities: - uid: 14596 @@ -101245,6 +101266,8 @@ entities: parent: 2 - uid: 14601 components: + - type: MetaData + name: waste pump - type: Transform rot: -1.5707963267948966 rad pos: 24.5,-51.5 @@ -101307,27 +101330,31 @@ entities: parent: 2 - uid: 14611 components: + - type: MetaData + name: TEG burn pump - type: Transform rot: 3.141592653589793 rad pos: 26.5,-52.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#FF00BFFF' - uid: 14612 components: - type: Transform pos: 26.5,-64.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#FF00BFFF' - uid: 14613 components: + - type: MetaData + name: supermatter pump - type: Transform rot: 3.141592653589793 rad pos: 28.5,-52.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#FF00BFFF' - uid: 14614 components: - type: Transform @@ -101351,7 +101378,7 @@ entities: pos: 28.5,-55.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#FF00BFFF' - uid: 14617 components: - type: Transform @@ -101409,7 +101436,7 @@ entities: pos: 23.5,-62.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#0000FFFF' - uid: 14625 components: - type: Transform @@ -101417,7 +101444,7 @@ entities: pos: 23.5,-63.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#0000FFFF' - uid: 14626 components: - type: Transform @@ -101431,15 +101458,17 @@ entities: pos: 32.5,-53.5 parent: 2 - type: AtmosPipeColor - color: '#9003FCFF' + color: '#FF00BFFF' - uid: 14628 components: + - type: MetaData + name: distro pump - type: Transform rot: 1.5707963267948966 rad pos: 24.5,-52.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - proto: GasThermoMachineFreezer entities: - uid: 14629 @@ -101487,7 +101516,7 @@ entities: pos: 25.5,-60.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#FF00BFFF' - proto: GasThermoMachineFreezerEnabled entities: - uid: 14636 @@ -101517,7 +101546,7 @@ entities: pos: 32.5,-56.5 parent: 2 - type: AtmosPipeColor - color: '#8800FFFF' + color: '#FF00BFFF' - proto: GasThermoMachineHeaterEnabled entities: - uid: 14640 @@ -101610,7 +101639,7 @@ entities: pos: 42.5,18.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14652 components: - type: Transform @@ -101618,7 +101647,7 @@ entities: pos: -6.5,48.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14653 components: - type: Transform @@ -101626,7 +101655,7 @@ entities: pos: 7.5,54.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14654 components: - type: Transform @@ -101640,7 +101669,7 @@ entities: pos: 35.5,-43.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14659 components: - type: Transform @@ -101648,7 +101677,7 @@ entities: pos: 26.5,-44.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14660 components: - type: Transform @@ -101656,7 +101685,7 @@ entities: pos: 26.5,-44.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14661 components: - type: Transform @@ -101664,14 +101693,14 @@ entities: pos: -0.5,-35.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14662 components: - type: Transform pos: 11.5,-40.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14663 components: - type: Transform @@ -101679,14 +101708,14 @@ entities: pos: -5.5,-32.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14664 components: - type: Transform pos: -10.5,-27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14665 components: - type: Transform @@ -101694,7 +101723,7 @@ entities: pos: -16.5,-38.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14666 components: - type: Transform @@ -101702,7 +101731,7 @@ entities: pos: -16.5,-35.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14667 components: - type: Transform @@ -101710,7 +101739,7 @@ entities: pos: -16.5,-41.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14668 components: - type: Transform @@ -101718,7 +101747,7 @@ entities: pos: -16.5,-47.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14669 components: - type: Transform @@ -101726,14 +101755,14 @@ entities: pos: -16.5,-44.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14670 components: - type: Transform pos: 8.5,-24.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14671 components: - type: Transform @@ -101749,7 +101778,7 @@ entities: pos: -11.5,-44.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14673 components: - type: Transform @@ -101757,21 +101786,21 @@ entities: pos: 29.5,-24.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14674 components: - type: Transform pos: 30.5,-18.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14675 components: - type: Transform pos: 40.5,-31.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14676 components: - type: Transform @@ -101779,7 +101808,7 @@ entities: pos: -0.5,-19.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14677 components: - type: Transform @@ -101787,14 +101816,14 @@ entities: pos: 0.5,-46.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14678 components: - type: Transform pos: -4.5,-55.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14679 components: - type: Transform @@ -101802,7 +101831,7 @@ entities: pos: -12.5,-57.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14680 components: - type: Transform @@ -101810,7 +101839,7 @@ entities: pos: 12.5,-64.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14681 components: - type: Transform @@ -101818,7 +101847,7 @@ entities: pos: 15.5,-15.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14682 components: - type: Transform @@ -101826,14 +101855,14 @@ entities: pos: 46.5,-32.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14683 components: - type: Transform pos: -30.5,-22.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14684 components: - type: Transform @@ -101841,7 +101870,7 @@ entities: pos: -33.5,-5.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14685 components: - type: Transform @@ -101849,7 +101878,7 @@ entities: pos: -37.5,-17.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14686 components: - type: Transform @@ -101857,7 +101886,7 @@ entities: pos: -38.5,-11.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14687 components: - type: Transform @@ -101865,7 +101894,7 @@ entities: pos: -38.5,0.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14688 components: - type: Transform @@ -101873,7 +101902,7 @@ entities: pos: -38.5,8.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14689 components: - type: Transform @@ -101881,21 +101910,21 @@ entities: pos: -33.5,8.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14690 components: - type: Transform pos: -34.5,15.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14691 components: - type: Transform pos: -22.5,2.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14692 components: - type: Transform @@ -101903,35 +101932,35 @@ entities: pos: -29.5,-5.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14693 components: - type: Transform pos: -9.5,2.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14694 components: - type: Transform pos: 11.5,2.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14695 components: - type: Transform pos: -10.5,19.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14696 components: - type: Transform pos: -19.5,19.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14697 components: - type: Transform @@ -101939,7 +101968,7 @@ entities: pos: 23.5,14.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14698 components: - type: Transform @@ -101947,7 +101976,7 @@ entities: pos: -29.5,4.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14699 components: - type: Transform @@ -101955,14 +101984,14 @@ entities: pos: -15.5,33.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14700 components: - type: Transform pos: -30.5,29.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14701 components: - type: Transform @@ -101970,14 +101999,14 @@ entities: pos: -36.5,23.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14702 components: - type: Transform pos: -31.5,24.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14703 components: - type: Transform @@ -101985,7 +102014,7 @@ entities: pos: -23.5,39.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14704 components: - type: Transform @@ -101993,21 +102022,21 @@ entities: pos: -40.5,34.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14705 components: - type: Transform pos: -2.5,38.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14706 components: - type: Transform pos: -9.5,28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14707 components: - type: Transform @@ -102015,7 +102044,7 @@ entities: pos: -0.5,29.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14708 components: - type: Transform @@ -102023,14 +102052,14 @@ entities: pos: -0.5,46.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14709 components: - type: Transform pos: -5.5,55.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14710 components: - type: Transform @@ -102038,14 +102067,14 @@ entities: pos: 36.5,23.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14711 components: - type: Transform pos: 5.5,35.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14712 components: - type: Transform @@ -102053,7 +102082,7 @@ entities: pos: 7.5,48.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14713 components: - type: Transform @@ -102061,7 +102090,7 @@ entities: pos: 5.5,25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14714 components: - type: Transform @@ -102069,14 +102098,14 @@ entities: pos: 5.5,16.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14715 components: - type: Transform pos: 22.5,2.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14716 components: - type: Transform @@ -102084,7 +102113,7 @@ entities: pos: 17.5,6.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14717 components: - type: Transform @@ -102092,14 +102121,14 @@ entities: pos: 20.5,16.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14718 components: - type: Transform pos: 21.5,22.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14719 components: - type: Transform @@ -102107,21 +102136,21 @@ entities: pos: 29.5,18.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14720 components: - type: Transform pos: 21.5,31.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14721 components: - type: Transform pos: 19.5,45.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14722 components: - type: Transform @@ -102129,7 +102158,7 @@ entities: pos: 25.5,35.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14723 components: - type: Transform @@ -102137,14 +102166,14 @@ entities: pos: 25.5,38.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14724 components: - type: Transform pos: 14.5,43.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14725 components: - type: Transform @@ -102152,7 +102181,7 @@ entities: pos: 29.5,30.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14726 components: - type: Transform @@ -102160,7 +102189,7 @@ entities: pos: 40.5,26.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14727 components: - type: Transform @@ -102168,7 +102197,7 @@ entities: pos: 32.5,32.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14728 components: - type: Transform @@ -102176,14 +102205,14 @@ entities: pos: 43.5,28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14729 components: - type: Transform pos: 40.5,41.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14730 components: - type: Transform @@ -102191,14 +102220,14 @@ entities: pos: 43.5,42.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14731 components: - type: Transform pos: 42.5,13.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14732 components: - type: Transform @@ -102206,7 +102235,7 @@ entities: pos: 29.5,10.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14733 components: - type: Transform @@ -102214,21 +102243,21 @@ entities: pos: 19.5,13.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14734 components: - type: Transform pos: 42.5,-5.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14735 components: - type: Transform pos: 9.5,13.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14736 components: - type: Transform @@ -102236,7 +102265,7 @@ entities: pos: -12.5,13.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14737 components: - type: Transform @@ -102244,7 +102273,7 @@ entities: pos: -24.5,6.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14738 components: - type: Transform @@ -102252,21 +102281,21 @@ entities: pos: 6.5,-30.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14739 components: - type: Transform pos: 22.5,-24.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14740 components: - type: Transform pos: 19.5,-19.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14741 components: - type: Transform @@ -102274,7 +102303,7 @@ entities: pos: 25.5,-18.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14742 components: - type: Transform @@ -102282,7 +102311,7 @@ entities: pos: 37.5,-19.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14743 components: - type: Transform @@ -102290,14 +102319,14 @@ entities: pos: 44.5,-17.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14744 components: - type: Transform pos: 45.5,-24.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14745 components: - type: Transform @@ -102305,7 +102334,7 @@ entities: pos: 19.5,-31.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14746 components: - type: Transform @@ -102313,7 +102342,7 @@ entities: pos: 12.5,-52.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14747 components: - type: Transform @@ -102321,7 +102350,7 @@ entities: pos: 31.5,-29.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14748 components: - type: Transform @@ -102329,14 +102358,14 @@ entities: pos: 27.5,-31.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14749 components: - type: Transform pos: 17.5,-10.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14750 components: - type: Transform @@ -102344,14 +102373,14 @@ entities: pos: 35.5,14.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14751 components: - type: Transform pos: 42.5,18.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14752 components: - type: Transform @@ -102359,14 +102388,14 @@ entities: pos: -4.5,-23.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14753 components: - type: Transform pos: 33.5,-10.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14754 components: - type: Transform @@ -102374,7 +102403,7 @@ entities: pos: 28.5,-3.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14755 components: - type: Transform @@ -102382,7 +102411,7 @@ entities: pos: 15.5,40.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14756 components: - type: Transform @@ -102390,28 +102419,28 @@ entities: pos: 14.5,36.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14757 components: - type: Transform pos: -29.5,-17.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14758 components: - type: Transform pos: -23.5,-22.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14759 components: - type: Transform pos: -22.5,-27.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14760 components: - type: Transform @@ -102419,7 +102448,7 @@ entities: pos: -21.5,-32.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14761 components: - type: Transform @@ -102427,7 +102456,7 @@ entities: pos: -29.5,-12.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14762 components: - type: Transform @@ -102435,7 +102464,7 @@ entities: pos: -16.5,-24.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14763 components: - type: Transform @@ -102443,14 +102472,14 @@ entities: pos: -16.5,-20.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14764 components: - type: Transform pos: -3.5,-35.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14765 components: - type: Transform @@ -102458,7 +102487,7 @@ entities: pos: -3.5,-40.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14766 components: - type: Transform @@ -102466,7 +102495,7 @@ entities: pos: -34.5,-28.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14767 components: - type: Transform @@ -102474,7 +102503,7 @@ entities: pos: -38.5,-38.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14768 components: - type: Transform @@ -102482,14 +102511,14 @@ entities: pos: -29.5,-40.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14769 components: - type: Transform pos: -33.5,-37.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14770 components: - type: Transform @@ -102497,7 +102526,7 @@ entities: pos: -42.5,-40.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14771 components: - type: Transform @@ -102505,7 +102534,7 @@ entities: pos: -43.5,-32.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14772 components: - type: Transform @@ -102513,7 +102542,7 @@ entities: pos: -27.5,-47.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14773 components: - type: Transform @@ -102521,7 +102550,7 @@ entities: pos: -33.5,-49.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14774 components: - type: Transform @@ -102529,7 +102558,7 @@ entities: pos: -4.5,14.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14775 components: - type: Transform @@ -102537,7 +102566,7 @@ entities: pos: -16.5,10.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14776 components: - type: Transform @@ -102545,7 +102574,7 @@ entities: pos: -12.5,9.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14777 components: - type: Transform @@ -102553,7 +102582,7 @@ entities: pos: -11.5,23.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14778 components: - type: Transform @@ -102561,7 +102590,7 @@ entities: pos: -7.5,22.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14779 components: - type: Transform @@ -102569,7 +102598,7 @@ entities: pos: -2.5,23.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14780 components: - type: Transform @@ -102577,14 +102606,14 @@ entities: pos: -15.5,39.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14781 components: - type: Transform pos: -11.5,33.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14782 components: - type: Transform @@ -102592,14 +102621,14 @@ entities: pos: -19.5,25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14783 components: - type: Transform pos: -19.5,33.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14784 components: - type: Transform @@ -102607,14 +102636,14 @@ entities: pos: -28.5,33.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14785 components: - type: Transform pos: -24.5,44.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14786 components: - type: Transform @@ -102622,7 +102651,7 @@ entities: pos: -0.5,15.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14787 components: - type: Transform @@ -102630,14 +102659,14 @@ entities: pos: -0.5,15.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14788 components: - type: Transform pos: -37.5,29.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14789 components: - type: Transform @@ -102645,7 +102674,7 @@ entities: pos: -33.5,33.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14790 components: - type: Transform @@ -102653,7 +102682,7 @@ entities: pos: -33.5,36.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14791 components: - type: Transform @@ -102661,7 +102690,7 @@ entities: pos: -33.5,39.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14792 components: - type: Transform @@ -102669,7 +102698,7 @@ entities: pos: -41.5,25.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14793 components: - type: Transform @@ -102677,7 +102706,7 @@ entities: pos: -39.5,20.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14794 components: - type: Transform @@ -102685,7 +102714,7 @@ entities: pos: -24.5,24.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14795 components: - type: Transform @@ -102693,21 +102722,21 @@ entities: pos: 5.5,29.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14796 components: - type: Transform pos: 7.5,40.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14797 components: - type: Transform pos: 0.5,60.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14798 components: - type: Transform @@ -102715,7 +102744,7 @@ entities: pos: 8.5,70.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14799 components: - type: Transform @@ -102723,7 +102752,7 @@ entities: pos: 2.5,70.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14800 components: - type: Transform @@ -102731,7 +102760,7 @@ entities: pos: -2.5,70.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14801 components: - type: Transform @@ -102739,14 +102768,14 @@ entities: pos: 6.5,77.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14802 components: - type: Transform pos: 7.5,85.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14803 components: - type: Transform @@ -102754,14 +102783,14 @@ entities: pos: 1.5,82.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14804 components: - type: Transform pos: -4.5,84.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14805 components: - type: Transform @@ -102769,7 +102798,7 @@ entities: pos: -3.5,76.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14806 components: - type: Transform @@ -102777,7 +102806,7 @@ entities: pos: 7.5,-50.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14807 components: - type: Transform @@ -102785,7 +102814,7 @@ entities: pos: 3.5,-55.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14808 components: - type: Transform @@ -102793,7 +102822,7 @@ entities: pos: 7.5,-69.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14809 components: - type: Transform @@ -102801,14 +102830,14 @@ entities: pos: -6.5,-69.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14810 components: - type: Transform pos: 5.5,-40.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14811 components: - type: Transform @@ -102816,7 +102845,7 @@ entities: pos: 41.5,-17.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14812 components: - type: Transform @@ -102824,7 +102853,7 @@ entities: pos: 43.5,7.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14813 components: - type: Transform @@ -102832,14 +102861,14 @@ entities: pos: 18.5,22.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - uid: 14814 components: - type: Transform pos: -12.5,-31.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#0000FFFF' - proto: GasVentScrubber entities: - uid: 14815 @@ -107098,17 +107127,41 @@ entities: - type: Transform pos: -8.5,-25.5 parent: 2 + - uid: 16299 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -50.5,-17.5 + parent: 2 + - uid: 18223 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -49.5,-16.5 + parent: 2 - uid: 19032 components: - type: Transform rot: -1.5707963267948966 rad pos: 27.5,13.5 parent: 2 + - uid: 22678 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -50.5,-21.5 + parent: 2 - uid: 22837 components: - type: Transform pos: -24.5,-1.5 parent: 2 + - uid: 22954 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -49.5,-22.5 + parent: 2 - proto: GrilleBroken entities: - uid: 15519 @@ -110196,13 +110249,6 @@ entities: - type: Transform pos: -20.5,32.5 parent: 2 - - uid: 16321 - components: - - type: Transform - pos: -2.5,-44.5 - parent: 2 - - type: MailingUnit - tag: Engenharia - uid: 16325 components: - type: Transform @@ -110220,11 +110266,6 @@ entities: - type: Transform pos: 32.5,17.5 parent: 2 - - uid: 22671 - components: - - type: Transform - pos: 21.5,23.5 - parent: 2 - uid: 22676 components: - type: Transform @@ -110235,18 +110276,6 @@ entities: - type: Transform pos: 10.5,15.5 parent: 2 - - uid: 22678 - components: - - type: Transform - pos: -35.5,-33.5 - parent: 2 - - uid: 24030 - components: - - type: Transform - pos: 12.5,-32.5 - parent: 2 - - type: MailingUnit - tag: Medicina - proto: MailTeleporter entities: - uid: 15956 @@ -112375,6 +112404,38 @@ entities: - type: Transform pos: 20.5,47.5 parent: 2 +- proto: PlasticFlapsAirtightOpaque + entities: + - uid: 18225 + components: + - type: Transform + pos: 16.5,-37.5 + parent: 2 + - uid: 18226 + components: + - type: Transform + pos: -36.5,-33.5 + parent: 2 + - uid: 18227 + components: + - type: Transform + pos: 12.5,-33.5 + parent: 2 + - uid: 18228 + components: + - type: Transform + pos: -3.5,-44.5 + parent: 2 + - uid: 18245 + components: + - type: Transform + pos: 21.5,24.5 + parent: 2 + - uid: 22374 + components: + - type: Transform + pos: 31.5,17.5 + parent: 2 - proto: PlasticFlapsClear entities: - uid: 16310 @@ -112656,6 +112717,11 @@ entities: parent: 2 - proto: PortableScrubber entities: + - uid: 5948 + components: + - type: Transform + pos: 35.5,-48.5 + parent: 2 - uid: 16364 components: - type: Transform @@ -112701,11 +112767,6 @@ entities: - type: Transform pos: -6.5,-76.5 parent: 2 - - uid: 16373 - components: - - type: Transform - pos: 35.5,-48.5 - parent: 2 - uid: 16374 components: - type: Transform @@ -120671,6 +120732,24 @@ entities: parent: 2 - proto: ReinforcedWindow entities: + - uid: 16300 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -50.5,-21.5 + parent: 2 + - uid: 16301 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -49.5,-22.5 + parent: 2 + - uid: 16302 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -50.5,-17.5 + parent: 2 - uid: 17597 components: - type: Transform @@ -122869,6 +122948,12 @@ entities: - type: Transform pos: -9.5,-25.5 parent: 2 + - uid: 18222 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -49.5,-16.5 + parent: 2 - uid: 22835 components: - type: Transform @@ -124515,71 +124600,6 @@ entities: - type: DeviceLinkSink links: - 18265 -- proto: ShuttersWindow - entities: - - uid: 18222 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -49.5,-22.5 - parent: 2 - - type: DeviceLinkSink - links: - - 18245 - - uid: 18223 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -49.5,-21.5 - parent: 2 - - type: DeviceLinkSink - links: - - 18245 - - uid: 18224 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -49.5,-20.5 - parent: 2 - - type: DeviceLinkSink - links: - - 18245 - - uid: 18225 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -49.5,-19.5 - parent: 2 - - type: DeviceLinkSink - links: - - 18245 - - uid: 18226 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -49.5,-18.5 - parent: 2 - - type: DeviceLinkSink - links: - - 18245 - - uid: 18227 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -49.5,-17.5 - parent: 2 - - type: DeviceLinkSink - links: - - 18245 - - uid: 18228 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -49.5,-16.5 - parent: 2 - - type: DeviceLinkSink - links: - - 18245 - proto: ShuttersWindowOpen entities: - uid: 18229 @@ -124740,28 +124760,6 @@ entities: linkedPorts: 1000: - Pressed: Toggle - - uid: 18245 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -38.781517,-17.427288 - parent: 2 - - type: DeviceLinkSource - linkedPorts: - 18228: - - Pressed: Toggle - 18227: - - Pressed: Toggle - 18226: - - Pressed: Toggle - 18225: - - Pressed: Toggle - 18224: - - Pressed: Toggle - 18223: - - Pressed: Toggle - 18222: - - Pressed: Toggle - uid: 18246 components: - type: Transform @@ -127574,11 +127572,6 @@ entities: rot: 1.5707963267948966 rad pos: 31.5,12.5 parent: 2 - - uid: 18472 - components: - - type: Transform - pos: 31.5,17.5 - parent: 2 - proto: SignJanitor entities: - uid: 18473 @@ -128268,10 +128261,10 @@ entities: parent: 2 - proto: SMESBasic entities: - - uid: 18593 + - uid: 5940 components: - type: Transform - pos: 35.5,-46.5 + pos: 34.5,-46.5 parent: 2 - uid: 18594 components: @@ -138813,10 +138806,29 @@ entities: rot: 1.5707963267948966 rad pos: -18.5,-15.5 parent: 2 - - uid: 16324 + - uid: 16304 components: - type: Transform - pos: 16.5,-37.5 + rot: -1.5707963267948966 rad + pos: -49.5,-17.5 + parent: 2 + - uid: 16320 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -49.5,-21.5 + parent: 2 + - uid: 16321 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -51.5,-21.5 + parent: 2 + - uid: 16322 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -51.5,-17.5 parent: 2 - uid: 17057 components: @@ -138869,11 +138881,21 @@ entities: - type: Transform pos: 15.5,-7.5 parent: 2 + - uid: 18472 + components: + - type: Transform + pos: -3.5,-45.5 + parent: 2 - uid: 18551 components: - type: Transform pos: 14.5,-7.5 parent: 2 + - uid: 18593 + components: + - type: Transform + pos: -3.5,-43.5 + parent: 2 - uid: 18868 components: - type: Transform @@ -148909,8 +148931,7 @@ entities: - uid: 22277 components: - type: Transform - rot: 1.5707963267948966 rad - pos: -36.5,-33.5 + pos: -2.5,-43.5 parent: 2 - uid: 22278 components: @@ -149002,6 +149023,11 @@ entities: rot: 1.5707963267948966 rad pos: -22.5,-42.5 parent: 2 + - uid: 22373 + components: + - type: Transform + pos: -1.5,-43.5 + parent: 2 - uid: 22403 components: - type: Transform @@ -149379,11 +149405,6 @@ entities: - type: Transform pos: 13.5,-33.5 parent: 2 - - uid: 22954 - components: - - type: Transform - pos: 12.5,-33.5 - parent: 2 - uid: 23467 components: - type: Transform @@ -149593,15 +149614,10 @@ entities: parent: 2 - proto: WallSolid entities: - - uid: 16320 - components: - - type: Transform - pos: -3.5,-44.5 - parent: 2 - - uid: 16322 + - uid: 5947 components: - type: Transform - pos: 21.5,24.5 + pos: 33.5,-46.5 parent: 2 - uid: 19029 components: @@ -151882,28 +151898,10 @@ entities: rot: -1.5707963267948966 rad pos: -4.5,-49.5 parent: 2 - - uid: 22373 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -3.5,-45.5 - parent: 2 - - uid: 22374 - components: - - type: Transform - pos: -3.5,-43.5 - parent: 2 - uid: 22375 components: - type: Transform - rot: -1.5707963267948966 rad - pos: -2.5,-43.5 - parent: 2 - - uid: 22376 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -1.5,-43.5 + pos: 35.5,-47.5 parent: 2 - uid: 22377 components: @@ -154149,12 +154147,6 @@ entities: rot: -1.5707963267948966 rad pos: 23.5,20.5 parent: 2 - - uid: 22839 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 31.5,17.5 - parent: 2 - uid: 22842 components: - type: Transform @@ -154807,11 +154799,6 @@ entities: - type: Transform pos: 34.5,-47.5 parent: 2 - - uid: 23014 - components: - - type: Transform - pos: 35.5,-47.5 - parent: 2 - uid: 23015 components: - type: Transform @@ -154858,12 +154845,6 @@ entities: rot: -1.5707963267948966 rad pos: -24.5,-54.5 parent: 2 - - uid: 23024 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 33.5,-46.5 - parent: 2 - uid: 23025 components: - type: Transform @@ -156667,7 +156648,7 @@ entities: links: - 19976 - type: Door - secondsUntilStateChange: -188469.52 + secondsUntilStateChange: -189523.19 state: Opening - uid: 23356 components: @@ -158018,41 +157999,17 @@ entities: parent: 2 - proto: WindowReinforcedDirectional entities: - - uid: 16299 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 1.5,-69.5 - parent: 2 - - uid: 16300 + - uid: 22376 components: - type: Transform rot: 1.5707963267948966 rad - pos: 1.5,-68.5 + pos: -1.5,-68.5 parent: 2 - - uid: 16301 + - uid: 23024 components: - type: Transform rot: 1.5707963267948966 rad - pos: 1.5,-70.5 - parent: 2 - - uid: 16302 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -0.5,-70.5 - parent: 2 - - uid: 16303 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -0.5,-69.5 - parent: 2 - - uid: 16304 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -0.5,-68.5 + pos: -1.5,-69.5 parent: 2 - uid: 23584 components: @@ -159403,6 +159360,30 @@ entities: rot: 1.5707963267948966 rad pos: 19.5,-49.5 parent: 2 + - uid: 23892 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -1.5,-70.5 + parent: 2 + - uid: 23893 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 2.5,-68.5 + parent: 2 + - uid: 23894 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 2.5,-69.5 + parent: 2 + - uid: 23895 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 2.5,-70.5 + parent: 2 - proto: Wirecutter entities: - uid: 23818 diff --git a/Resources/Prototypes/Actions/psionics.yml b/Resources/Prototypes/Actions/psionics.yml index 138823313a..a372a480ac 100644 --- a/Resources/Prototypes/Actions/psionics.yml +++ b/Resources/Prototypes/Actions/psionics.yml @@ -4,18 +4,18 @@ description: action-description-dispel noSpawn: true components: - - type: EntityTargetAction - icon: Interface/VerbIcons/dispel.png - useDelay: 45 - checkCanAccess: false - range: 6 - itemIconStyle: BigAction - canTargetSelf: false - blacklist: - components: - - PsionicInsulation - - Mindbroken - event: !type:DispelPowerActionEvent + - type: EntityTargetAction + icon: Interface/VerbIcons/dispel.png + useDelay: 45 + checkCanAccess: false + range: 6 + itemIconStyle: BigAction + canTargetSelf: false + blacklist: + components: + - PsionicInsulation + - Mindbroken + event: !type:DispelPowerActionEvent - type: entity id: ActionMassSleep @@ -23,13 +23,13 @@ description: action-description-mass-sleep noSpawn: true components: - - type: WorldTargetAction - icon: Interface/VerbIcons/mass_sleep.png - useDelay: 60 - checkCanAccess: false - range: 8 - itemIconStyle: BigAction - event: !type:MassSleepPowerActionEvent + - type: WorldTargetAction + icon: Interface/VerbIcons/mass_sleep.png + useDelay: 60 + checkCanAccess: false + range: 8 + itemIconStyle: BigAction + event: !type:MassSleepPowerActionEvent - type: entity id: ActionMindSwap @@ -37,17 +37,17 @@ description: action-description-mind-swap noSpawn: true components: - - type: EntityTargetAction - icon: Interface/VerbIcons/mind_swap.png - useDelay: 240 - checkCanAccess: false - range: 8 - itemIconStyle: BigAction - blacklist: - components: - - PsionicInsulation - - Mindbroken - event: !type:MindSwapPowerActionEvent + - type: EntityTargetAction + icon: Interface/VerbIcons/mind_swap.png + useDelay: 240 + checkCanAccess: false + range: 8 + itemIconStyle: BigAction + blacklist: + components: + - PsionicInsulation + - Mindbroken + event: !type:MindSwapPowerActionEvent - type: entity id: ActionMindSwapReturn @@ -55,11 +55,11 @@ description: action-description-mind-swap-return noSpawn: true components: - - type: InstantAction - icon: Interface/VerbIcons/mind_swap_return.png - useDelay: 20 - checkCanInteract: false - event: !type:MindSwapPowerReturnActionEvent + - type: InstantAction + icon: Interface/VerbIcons/mind_swap_return.png + useDelay: 20 + checkCanInteract: false + event: !type:MindSwapPowerReturnActionEvent - type: entity id: ActionNoosphericZap @@ -67,16 +67,16 @@ description: action-description-noospheric-zap noSpawn: true components: - - type: EntityTargetAction - icon: Interface/VerbIcons/noospheric_zap.png - useDelay: 100 - range: 5 - itemIconStyle: BigAction - blacklist: - components: - - PsionicInsulation - - Mindbroken - event: !type:NoosphericZapPowerActionEvent + - type: EntityTargetAction + icon: Interface/VerbIcons/noospheric_zap.png + useDelay: 100 + range: 5 + itemIconStyle: BigAction + blacklist: + components: + - PsionicInsulation + - Mindbroken + event: !type:NoosphericZapPowerActionEvent - type: entity id: ActionPyrokinesis @@ -84,13 +84,13 @@ description: action-description-pyrokinesis noSpawn: true components: - - type: EntityTargetAction - icon: Interface/VerbIcons/pyrokinesis.png - useDelay: 50 - range: 6 - checkCanAccess: false - itemIconStyle: BigAction - event: !type:PyrokinesisPowerActionEvent + - type: EntityTargetAction + icon: Interface/VerbIcons/pyrokinesis.png + useDelay: 50 + range: 6 + checkCanAccess: false + itemIconStyle: BigAction + event: !type:PyrokinesisPowerActionEvent - type: entity id: ActionMetapsionic @@ -98,10 +98,10 @@ description: action-description-metapsionic noSpawn: true components: - - type: InstantAction - icon: Interface/VerbIcons/metapsionic.png - useDelay: 45 - event: !type:MetapsionicPowerActionEvent + - type: InstantAction + icon: Interface/VerbIcons/metapsionic.png + useDelay: 45 + event: !type:MetapsionicPowerActionEvent - type: entity id: ActionPsionicRegeneration @@ -109,10 +109,10 @@ description: action-description-psionic-regeneration noSpawn: true components: - - type: InstantAction - icon: Interface/VerbIcons/psionic_regeneration.png - useDelay: 120 - event: !type:PsionicRegenerationPowerActionEvent + - type: InstantAction + icon: Interface/VerbIcons/psionic_regeneration.png + useDelay: 120 + event: !type:PsionicRegenerationPowerActionEvent - type: entity id: ActionTelegnosis @@ -120,10 +120,10 @@ description: action-description-telegnosis noSpawn: true components: - - type: InstantAction - icon: Interface/VerbIcons/telegnosis.png - useDelay: 150 - event: !type:TelegnosisPowerActionEvent + - type: InstantAction + icon: Interface/VerbIcons/telegnosis.png + useDelay: 150 + event: !type:TelegnosisPowerActionEvent - type: entity id: ActionPsionicInvisibility @@ -131,10 +131,10 @@ description: action-description-psionic-invisibility noSpawn: true components: - - type: InstantAction - icon: Interface/VerbIcons/psionic_invisibility.png - useDelay: 120 - event: !type:PsionicInvisibilityPowerActionEvent + - type: InstantAction + icon: Interface/VerbIcons/psionic_invisibility.png + useDelay: 120 + event: !type:PsionicInvisibilityPowerActionEvent - type: entity id: ActionPsionicInvisibilityUsed @@ -142,9 +142,9 @@ description: action-description-psionic-invisibility-off noSpawn: true components: - - type: InstantAction - icon: Interface/VerbIcons/psionic_invisibility_off.png - event: !type:RemovePsionicInvisibilityOffPowerActionEvent + - type: InstantAction + icon: Interface/VerbIcons/psionic_invisibility_off.png + event: !type:RemovePsionicInvisibilityOffPowerActionEvent - type: entity id: ActionHealingWord @@ -152,36 +152,36 @@ description: action-description-healing-word noSpawn: true components: - - type: EntityTargetAction - icon: { sprite : Interface/Actions/psionics.rsi, state: healing_word } - useDelay: 10 - checkCanAccess: false - range: 6 - itemIconStyle: BigAction - canTargetSelf: true - blacklist: - components: - - PsionicInsulation - - Mindbroken - event: !type:PsionicHealOtherPowerActionEvent - healingAmount: - groups: # These all get divided by the number of damage types in the group. So they're all -2.5. - Genetic: -2.5 - Toxin: -5 - Airloss: -5 - Brute: -7.5 - Burn: -10 - rotReduction: 10 - useDelay: 1 - doRevive: true - powerName: Healing Word - popupText: healing-word-begin - playSound: true - minGlimmer: 2 - maxGlimmer: 4 - glimmerSoundThreshold: 100 - glimmerPopupThreshold: 200 - glimmerDoAfterVisibilityThreshold: 70 + - type: EntityTargetAction + icon: { sprite: Interface/Actions/psionics.rsi, state: healing_word } + useDelay: 10 + checkCanAccess: false + range: 6 + itemIconStyle: BigAction + canTargetSelf: true + blacklist: + components: + - PsionicInsulation + - Mindbroken + event: !type:PsionicHealOtherPowerActionEvent + healingAmount: + groups: # These all get divided by the number of damage types in the group. So they're all -2.5. + Genetic: -2.5 + Toxin: -5 + Airloss: -5 + Brute: -7.5 + Burn: -10 + rotReduction: 10 + useDelay: 1 + doRevive: true + powerName: Healing Word + popupText: healing-word-begin + playSound: true + minGlimmer: 2 + maxGlimmer: 4 + glimmerSoundThreshold: 100 + glimmerPopupThreshold: 200 + glimmerDoAfterVisibilityThreshold: 70 - type: entity id: ActionRevivify @@ -189,38 +189,38 @@ description: action-description-revivify noSpawn: true components: - - type: EntityTargetAction - icon: { sprite : Interface/Actions/psionics.rsi, state: revivify } - useDelay: 120 - checkCanAccess: false - range: 2 - itemIconStyle: BigAction - canTargetSelf: false - blacklist: - components: - - PsionicInsulation - - Mindbroken - event: !type:PsionicHealOtherPowerActionEvent - healingAmount: - # These all get divided by the number of damage types in the group. So they're all -15 - # Additionally, they're multiplied by the caster's Amplification, which, - # assuming this is the only power they have, the multiplier is between 2.9-3.9 - groups: - Genetic: -15 - Toxin: -30 - Airloss: -60 # Except airloss, which heals 30 per type - Brute: -45 - Burn: -60 - rotReduction: 60 - doRevive: true - powerName: Revivify - popupText: revivify-begin - playSound: true - minGlimmer: 10 # These also get multiplied by caster stats. So, - maxGlimmer: 15 # keeping in mind the ~3.5x multiplier, this spikes glimmer by as much as 60 points. - glimmerSoundThreshold: 50 - glimmerPopupThreshold: 100 - glimmerDoAfterVisibilityThreshold: 35 + - type: EntityTargetAction + icon: { sprite: Interface/Actions/psionics.rsi, state: revivify } + useDelay: 120 + checkCanAccess: false + range: 2 + itemIconStyle: BigAction + canTargetSelf: false + blacklist: + components: + - PsionicInsulation + - Mindbroken + event: !type:PsionicHealOtherPowerActionEvent + healingAmount: + # These all get divided by the number of damage types in the group. So they're all -15 + # Additionally, they're multiplied by the caster's Amplification, which, + # assuming this is the only power they have, the multiplier is between 2.9-3.9 + groups: + Genetic: -15 + Toxin: -30 + Airloss: -60 # Except airloss, which heals 30 per type + Brute: -45 + Burn: -60 + rotReduction: 60 + doRevive: true + powerName: Revivify + popupText: revivify-begin + playSound: true + minGlimmer: 10 # These also get multiplied by caster stats. So, + maxGlimmer: 15 # keeping in mind the ~3.5x multiplier, this spikes glimmer by as much as 60 points. + glimmerSoundThreshold: 50 + glimmerPopupThreshold: 100 + glimmerDoAfterVisibilityThreshold: 35 - type: entity id: ActionShadeskip @@ -263,30 +263,142 @@ description: action-description-telekinetic-pulse noSpawn: true components: - - type: InstantAction - icon: { sprite : Interface/Actions/psionics.rsi, state: telekinetic_pulse } - useDelay: 45 - checkCanInteract: false - event: !type:AnomalyPowerActionEvent - settings: - powerName: "Telekinetic Pulse" - overchargeFeedback: "shadeskip-overcharge-feedback" # The text behind this is fine. - overchargeCooldown: 120 - overchargeRecoil: - groups: - Burn: -100 #This will be divided by the caster's Dampening. - minGlimmer: 6 - maxGlimmer: 8 - doSupercritical: false - entitySpawnEntries: - - settings: - spawnOnPulse: true - minAmount: 1 - maxAmount: 1 - maxRange: 0.5 - spawns: - - EffectFlashTelekineticPulse - gravity: - maxThrowRange: 3 - maxThrowStrength: 5 - spaceRange: 3 + - type: InstantAction + icon: { sprite: Interface/Actions/psionics.rsi, state: telekinetic_pulse } + useDelay: 45 + checkCanInteract: false + event: !type:AnomalyPowerActionEvent + settings: + powerName: "Telekinetic Pulse" + overchargeFeedback: "shadeskip-overcharge-feedback" # The text behind this is fine. + overchargeCooldown: 120 + overchargeRecoil: + groups: + Burn: -100 #This will be divided by the caster's Dampening. + minGlimmer: 6 + maxGlimmer: 8 + doSupercritical: false + entitySpawnEntries: + - settings: + spawnOnPulse: true + minAmount: 1 + maxAmount: 1 + maxRange: 0.5 + spawns: + - EffectFlashTelekineticPulse + gravity: + maxThrowRange: 3 + maxThrowStrength: 5 + spaceRange: 3 + +- type: entity + id: ActionShadowkinShadeskip + name: action-name-shadeskip + description: action-description-shadowkin-shadeskip + noSpawn: true + components: + - type: InstantAction + icon: { sprite: Interface/Actions/shadowkin_icons.rsi, state: shadeskip } + useDelay: 10 + checkCanInteract: false + event: !type:AnomalyPowerActionEvent + settings: + powerName: "Shadowkin-Shadeskip" + manaCost: 25 + checkInsulation: false + minGlimmer: 0 + maxGlimmer: 0 + doSupercritical: false + entitySpawnEntries: + - settings: + spawnOnPulse: true + minAmount: 5 + maxAmount: 10 + maxRange: 2.5 + spawns: + - ShadowkinShadow + - settings: + spawnOnPulse: true + minAmount: 1 + maxAmount: 1 + maxRange: 0.5 + spawns: + - EffectFlashShadowkinShadeskip + +- type: entity + id: ActionDarkSwap + name: action-name-darkswap + description: action-description-darkswap + noSpawn: true + components: + - type: InstantAction + icon: { sprite: Interface/Actions/shadowkin_icons.rsi, state: darkswap } + useDelay: 10 + checkCanInteract: false + event: !type:DarkSwapActionEvent + manaCost: 100 + checkInsulation: false + +- type: entity + id: ActionPyrokineticFlare + name: action-name-pyrokinetic-flare + description: action-description-pyrokinetic-flare + noSpawn: true + components: + - type: InstantAction + icon: { sprite: Interface/Actions/psionics.rsi, state: pyrokinetic_flare } + useDelay: 25 + checkCanInteract: false + event: !type:AnomalyPowerActionEvent + settings: + powerName: "Pyrokinetic Flare" + minGlimmer: 3 + maxGlimmer: 5 + doSupercritical: false + entitySpawnEntries: + - settings: + spawnOnPulse: true + spawnOnSuperCritical: true + minAmount: 1 + maxAmount: 3 + maxRange: 1 + spawns: + - EffectPyrokineticFlare + +- type: entity + id: ActionSummonImp + name: action-name-summon-imp + description: action-description-summon-imp + noSpawn: true + components: + - type: InstantAction + icon: { sprite: Interface/Actions/psionics.rsi, state: summon_imp } + useDelay: 120 + checkCanInteract: false + event: !type:SummonPsionicFamiliarActionEvent + familiarProto: MobPsionicFamiliarImp + powerName: "Summon Imp" + checkInsulation: true + doGlimmerEffects: true + followMaster: true + minGlimmer: 10 + maxGlimmer: 20 + +- type: entity + id: ActionSummonRemilia + name: action-name-summon-remilia + description: action-description-summon-remilia + noSpawn: true + components: + - type: InstantAction + icon: { sprite: Interface/Actions/psionics.rsi, state: summon_remilia } + useDelay: 120 + checkCanInteract: false + event: !type:SummonPsionicFamiliarActionEvent + familiarProto: MobBatRemilia + powerName: "Summon Remilia" + checkInsulation: true + doGlimmerEffects: true + followMaster: true + minGlimmer: 5 + maxGlimmer: 10 diff --git a/Resources/Prototypes/Actions/types.yml b/Resources/Prototypes/Actions/types.yml index f81def7f7c..a7144cdda5 100644 --- a/Resources/Prototypes/Actions/types.yml +++ b/Resources/Prototypes/Actions/types.yml @@ -304,6 +304,18 @@ icon: { sprite: Clothing/Head/Hats/pyjamasyndicatered.rsi, state: icon } event: !type:SleepActionEvent +- type: entity + id: ShadowkinActionSleep + name: action-name-shadowkin-rest + description: action-description-shadowkin-rest + noSpawn: true + components: + - type: InstantAction + checkCanInteract: false + checkConsciousness: false + icon: { sprite: Interface/Actions/shadowkin_icons.rsi, state: rest } + event: !type:SleepActionEvent + - type: entity id: ActionWake name: Wake up diff --git a/Resources/Prototypes/Alerts/alerts.yml b/Resources/Prototypes/Alerts/alerts.yml index 1e0a8a8c62..e32eea3cc9 100644 --- a/Resources/Prototypes/Alerts/alerts.yml +++ b/Resources/Prototypes/Alerts/alerts.yml @@ -7,6 +7,7 @@ - category: Health - category: Mood - category: Stamina + - alertType: ShadowkinPower - alertType: SuitPower - category: Internals - alertType: Fire @@ -191,6 +192,7 @@ - type: alert id: HumanHealth category: Health + onClick: !type:CheckHealth { } icons: - sprite: /Textures/Interface/Alerts/human_alive.rsi state: health0 diff --git a/Resources/Prototypes/Alerts/shadowkin.yml b/Resources/Prototypes/Alerts/shadowkin.yml new file mode 100644 index 0000000000..66d41351ba --- /dev/null +++ b/Resources/Prototypes/Alerts/shadowkin.yml @@ -0,0 +1,23 @@ +- type: alert + id: ShadowkinPower + icons: + - sprite: /Textures/Interface/Alerts/shadowkin_power.rsi + state: power0 + - sprite: /Textures/Interface/Alerts/shadowkin_power.rsi + state: power1 + - sprite: /Textures/Interface/Alerts/shadowkin_power.rsi + state: power2 + - sprite: /Textures/Interface/Alerts/shadowkin_power.rsi + state: power3 + - sprite: /Textures/Interface/Alerts/shadowkin_power.rsi + state: power4 + - sprite: /Textures/Interface/Alerts/shadowkin_power.rsi + state: power5 + - sprite: /Textures/Interface/Alerts/shadowkin_power.rsi + state: power6 + - sprite: /Textures/Interface/Alerts/shadowkin_power.rsi + state: power7 + name: alerts-shadowkin-power-name + description: alerts-shadowkin-power-desc + minSeverity: 0 + maxSeverity: 7 \ No newline at end of file diff --git a/Resources/Prototypes/Atmospherics/thresholds.yml b/Resources/Prototypes/Atmospherics/thresholds.yml index 22ca42869e..81f7bda4d2 100644 --- a/Resources/Prototypes/Atmospherics/thresholds.yml +++ b/Resources/Prototypes/Atmospherics/thresholds.yml @@ -19,7 +19,7 @@ upperWarnAround: !type:AlarmThresholdSetting threshold: 0.7 # 385 kPa, WarningHighPressure from Atmospherics.cs lowerWarnAround: !type:AlarmThresholdSetting - threshold: 1.05 # ~90 kPa + threshold: 4.5 # ~90 kPa # a reminder that all of these are percentages (where 1 is 100%), # so 0.01 is 1%, diff --git a/Resources/Prototypes/Body/Organs/shadowkin.yml b/Resources/Prototypes/Body/Organs/shadowkin.yml new file mode 100644 index 0000000000..695ddec1ab --- /dev/null +++ b/Resources/Prototypes/Body/Organs/shadowkin.yml @@ -0,0 +1,113 @@ +- type: entity + id: OrganShadowkinBrain + parent: OrganHumanBrain + components: + - type: Sprite + sprite: Mobs/Species/Shadowkin/organs.rsi + state: brain + +- type: entity + id: OrganShadowkinEyes + parent: OrganHumanEyes + description: I see beyond anything you ever will! + components: + - type: Sprite + sprite: Mobs/Species/Shadowkin/organs.rsi + layers: + - state: eyes + +- type: entity + id: OrganShadowkinEars + parent: OrganHumanEars + description: Hey, listen! + components: + - type: Sprite + sprite: Mobs/Species/Shadowkin/organs.rsi + state: ears + +- type: entity + id: OrganShadowkinTongue + parent: OrganHumanTongue + components: + - type: Sprite + sprite: Mobs/Species/Shadowkin/organs.rsi + state: tongue + + +- type: entity + id: OrganShadowkinAppendix + parent: OrganHumanAppendix + components: + - type: Sprite + sprite: Mobs/Species/Shadowkin/organs.rsi + layers: + - state: appendix + + +- type: entity + id: OrganShadowkinHeart + parent: OrganHumanHeart + components: + - type: Sprite + sprite: Mobs/Species/Shadowkin/organs.rsi + state: heart + - type: Metabolizer + maxReagents: 2 + metabolizerTypes: [Shadowkin] + groups: + - id: Medicine + - id: Poison + - id: Narcotic + +- type: entity + id: OrganShadowkinStomach + parent: OrganHumanStomach + description: '"Yummy!", says the stomach, although you are unable to hear it.' + components: + - type: Sprite + sprite: Mobs/Species/Shadowkin/organs.rsi + state: stomach + - type: SolutionContainerManager + solutions: + stomach: + maxVol: 40 + food: + maxVol: 5 + reagents: + - ReagentId: UncookedAnimalProteins + Quantity: 5 + - type: Metabolizer + maxReagents: 3 + metabolizerTypes: [Shadowkin] + groups: + - id: Food + - id: Drink + +- type: entity + id: OrganShadowkinLiver + parent: OrganHumanLiver + description: "Live 'er? I hardly know 'er!" + components: + - type: Sprite + sprite: Mobs/Species/Shadowkin/organs.rsi + state: liver + - type: Metabolizer + maxReagents: 1 + metabolizerTypes: [Shadowkin] + groups: + - id: Alcohol + rateModifier: 0.1 + +- type: entity + id: OrganShadowkinKidneys + parent: OrganHumanKidneys + description: Give the kid their knees back, please, this is the third time this week. + components: + - type: Sprite + sprite: Mobs/Species/Shadowkin/organs.rsi + layers: + - state: kidneys + - type: Metabolizer + maxReagents: 5 + metabolizerTypes: [Shadowkin] + removeEmpty: true \ No newline at end of file diff --git a/Resources/Prototypes/Body/Parts/shadowkin.yml b/Resources/Prototypes/Body/Parts/shadowkin.yml new file mode 100644 index 0000000000..0ddff93443 --- /dev/null +++ b/Resources/Prototypes/Body/Parts/shadowkin.yml @@ -0,0 +1,155 @@ +- type: entity + id: PartShadowkin + parent: BaseItem + name: "Shadowkin body part" + abstract: true + components: + - type: Sprite + netsync: false + sprite: Mobs/Species/Shadowkin/parts.rsi + - type: Icon + sprite: Mobs/Species/Shadowkin/parts.rsi + - type: Damageable + damageContainer: Biological + - type: BodyPart + - type: ContainerContainer + containers: + bodypart: !type:Container + ents: [] + +- type: entity + id: TorsoShadowkin + name: "Shadowkin torso" + parent: PartShadowkin + components: + - type: Sprite + state: "torso_m" + - type: Icon + state: "torso_m" + - type: BodyPart + partType: Torso + +- type: entity + id: HeadShadowkin + name: "Shadowkin head" + parent: PartShadowkin + components: + - type: Sprite + state: "head_m" + - type: Icon + state: "head_m" + - type: BodyPart + partType: Head + - type: Input + context: "ghost" + - type: MovementSpeedModifier + baseWalkSpeed: 0 + baseSprintSpeed: 0 + - type: InputMover + - type: GhostOnMove + +- type: entity + id: LeftArmShadowkin + name: "left Shadowkin arm" + parent: PartShadowkin + components: + - type: Sprite + state: "l_arm" + - type: Icon + state: "l_arm" + - type: BodyPart + partType: Arm + symmetry: Left + +- type: entity + id: RightArmShadowkin + name: "right Shadowkin arm" + parent: PartShadowkin + components: + - type: Sprite + state: "r_arm" + - type: Icon + state: "r_arm" + - type: BodyPart + partType: Arm + symmetry: Right + +- type: entity + id: LeftHandShadowkin + name: "left Shadowkin hand" + parent: PartShadowkin + components: + - type: Sprite + state: "l_hand" + - type: Icon + state: "l_hand" + - type: BodyPart + partType: Hand + symmetry: Left + +- type: entity + id: RightHandShadowkin + name: "right Shadowkin hand" + parent: PartShadowkin + components: + - type: Sprite + state: "r_hand" + - type: Icon + state: "r_hand" + - type: BodyPart + partType: Hand + symmetry: Right + +- type: entity + id: LeftLegShadowkin + name: "left Shadowkin leg" + parent: PartShadowkin + components: + - type: Sprite + state: "l_leg" + - type: Icon + state: "l_leg" + - type: BodyPart + partType: Leg + symmetry: Left + - type: MovementBodyPart + +- type: entity + id: RightLegShadowkin + name: "right Shadowkin leg" + parent: PartShadowkin + components: + - type: Sprite + state: "r_leg" + - type: Icon + state: "r_leg" + - type: BodyPart + partType: Leg + symmetry: Right + - type: MovementBodyPart + +- type: entity + id: LeftFootShadowkin + name: "left Shadowkin foot" + parent: PartShadowkin + components: + - type: Sprite + state: "l_foot" + - type: Icon + state: "l_foot" + - type: BodyPart + partType: Foot + symmetry: Left + +- type: entity + id: RightFootShadowkin + name: "right Shadowkin foot" + parent: PartShadowkin + components: + - type: Sprite + state: "r_foot" + - type: Icon + state: "r_foot" + - type: BodyPart + partType: Foot + symmetry: Right diff --git a/Resources/Prototypes/Body/Prototypes/shadowkin.yml b/Resources/Prototypes/Body/Prototypes/shadowkin.yml new file mode 100644 index 0000000000..dddad7bdb5 --- /dev/null +++ b/Resources/Prototypes/Body/Prototypes/shadowkin.yml @@ -0,0 +1,48 @@ +- type: body + id: Shadowkin + name: "Shadowkin" + root: torso + slots: + head: + part: HeadShadowkin + connections: + - torso + organs: + brain: OrganShadowkinBrain + eyes: OrganShadowkinEyes + torso: + part: TorsoShadowkin + connections: + - left arm + - right arm + - left leg + - right leg + organs: + heart: OrganShadowkinHeart + stomach: OrganShadowkinStomach + liver: OrganShadowkinLiver + kidneys: OrganShadowkinKidneys + right arm: + part: RightArmShadowkin + connections: + - right hand + left arm: + part: LeftArmShadowkin + connections: + - left hand + right hand: + part: RightHandShadowkin + left hand: + part: LeftHandShadowkin + right leg: + part: RightLegShadowkin + connections: + - right foot + left leg: + part: LeftLegShadowkin + connections: + - left foot + right foot: + part: RightFootShadowkin + left foot: + part: LeftFootShadowkin \ No newline at end of file diff --git a/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/backpack.yml b/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/backpack.yml index 95f8cf87f2..da46ae7597 100644 --- a/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/backpack.yml +++ b/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/backpack.yml @@ -178,21 +178,11 @@ noSpawn: true parent: ClothingBackpack id: ClothingBackpackChaplainFilled - components: - - type: StorageFill - contents: - - id: Bible - - id: RubberStampChaplain - type: entity noSpawn: true parent: ClothingBackpack id: ClothingBackpackMusicianFilled - components: - - type: StorageFill - contents: - - id: AcousticGuitarInstrument - - id: SaxophoneInstrument - type: entity noSpawn: true diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/sec.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/sec.yml index 723f944222..f62ba72950 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/sec.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/sec.yml @@ -16,6 +16,7 @@ ClothingBeltSecurityWebbing: 5 CombatKnife: 3 Zipties: 12 + BolaEnergy: 6 RiotShield: 2 RiotLaserShield: 2 RiotBulletShield: 2 diff --git a/Resources/Prototypes/CharacterItemGroups/musicianInstrumentsGroups.yml b/Resources/Prototypes/CharacterItemGroups/musicianInstrumentsGroups.yml index ccad399e74..eac816b8db 100644 --- a/Resources/Prototypes/CharacterItemGroups/musicianInstrumentsGroups.yml +++ b/Resources/Prototypes/CharacterItemGroups/musicianInstrumentsGroups.yml @@ -2,14 +2,36 @@ id: LoadoutMusicianInstruments maxItems: 3 items: + # Brass - type: loadout - id: LoadoutItemSynthesizerInstrumentMusician + id: LoadoutItemTrumpetInstrumentMusician + - type: loadout + id: LoadoutItemTromboneInstrumentMusician + - type: loadout + id: LoadoutItemFrenchHornInstrumentMusician + - type: loadout + id: LoadoutItemEuphoniumInstrumentMusician + # Misc + - type: loadout + id: LoadoutItemSeashellInstrumentMusician + - type: loadout + id: LoadoutItemBirdToyInstrumentMusician + # Percussion + - type: loadout + id: LoadoutItemGlockenspielInstrumentMusician + - type: loadout + id: LoadoutItemMusicBoxInstrumentMusician + - type: loadout + id: LoadoutItemXylophoneInstrumentMusician - type: loadout id: LoadoutItemMicrophoneInstrumentMusician + - type: loadout + id: LoadoutItemSynthesizerInstrumentMusician - type: loadout id: LoadoutItemKalimbaInstrumentMusician - type: loadout - id: LoadoutItemTrumpetInstrumentMusician + id: LoadoutItemWoodblockInstrumentMusician + # String - type: loadout id: LoadoutItemElectricGuitarInstrumentMusician - type: loadout @@ -18,14 +40,55 @@ id: LoadoutItemRockGuitarInstrumentMusician - type: loadout id: LoadoutItemAcousticGuitarInstrumentMusician + - type: loadout + id: LoadoutItemBanjoInstrumentMusician - type: loadout id: LoadoutItemViolinInstrumentMusician - type: loadout - id: LoadoutItemHarmonicaInstrumentMusician + id: LoadoutItemViolaInstrumentMusician + - type: loadout + id: LoadoutItemCelloInstrumentMusician + # Structure + - type: loadout + id: LoadoutItemPianoInstrumentMusician + - type: loadout + id: LoadoutItemUprightPianoInstrumentMusician + - type: loadout + id: LoadoutItemVibraphoneInstrumentMusician + - type: loadout + id: LoadoutItemMarimbaInstrumentMusician + - type: loadout + id: LoadoutItemChurchOrganInstrumentMusician + - type: loadout + id: LoadoutItemTubaInstrumentMusician + - type: loadout + id: LoadoutItemHarpInstrumentMusician + - type: loadout + id: LoadoutItemTimpaniInstrumentMusician + - type: loadout + id: LoadoutItemTaikoInstrumentMusician + - type: loadout + id: LoadoutItemContrabassInstrumentMusician + - type: loadout + id: LoadoutItemMinimoogInstrumentMusician + - type: loadout + id: LoadoutItemTomDrumsInstrumentMusician + # Wind + - type: loadout + id: LoadoutItemSaxophoneInstrumentMusician - type: loadout id: LoadoutItemAccordionInstrumentMusician + - type: loadout + id: LoadoutItemHarmonicaInstrumentMusician + - type: loadout + id: LoadoutItemClarinetInstrumentMusician - type: loadout id: LoadoutItemFluteInstrumentMusician + - type: loadout + id: LoadoutItemRecorderInstrumentMusician + - type: loadout + id: LoadoutItemPanFluteInstrumentMusician - type: loadout id: LoadoutItemOcarinaInstrumentMusician - + - type: loadout + id: LoadoutItemBagpipeInstrumentMusician diff --git a/Resources/Prototypes/CharacterItemGroups/scienceGroups.yml b/Resources/Prototypes/CharacterItemGroups/scienceGroups.yml index ac41a9286a..26cb07dae9 100644 --- a/Resources/Prototypes/CharacterItemGroups/scienceGroups.yml +++ b/Resources/Prototypes/CharacterItemGroups/scienceGroups.yml @@ -119,4 +119,26 @@ - type: loadout id: LoadoutScienceJumpsuitLibrarianZav - type: loadout - id: LoadoutScienceJumpsuitLibrarianZeng \ No newline at end of file + id: LoadoutScienceJumpsuitLibrarianZeng + - type: loadout + id: LoadoutScienceJumpsuitLibrarian + - type: loadout + id: LoadoutScienceJumpskirtLibrarian + +# Chaplain +- type: characterItemGroup + id: LoadoutChaplainUniforms + items: + - type: loadout + id: LoadoutChaplainJumpsuit + - type: loadout + id: LoadoutChaplainJumpskirt + +- type: characterItemGroup + id: LoadoutChaplainEquipment + maxItems: 2 + items: + - type: loadout + id: LoadoutChaplainBible + - type: loadout + id: LoadoutChaplainStamp diff --git a/Resources/Prototypes/Chemistry/metabolizer_types.yml b/Resources/Prototypes/Chemistry/metabolizer_types.yml index b49fad6c27..80f69893c6 100644 --- a/Resources/Prototypes/Chemistry/metabolizer_types.yml +++ b/Resources/Prototypes/Chemistry/metabolizer_types.yml @@ -52,3 +52,7 @@ - type: metabolizerType id: LiquorLifeline name: metabolizer-type-liquorlifeline + +- type: metabolizerType + id: Shadowkin + name: metabolizer-type-shadowkin diff --git a/Resources/Prototypes/Damage/modifier_sets.yml b/Resources/Prototypes/Damage/modifier_sets.yml index 39c956df62..8cca467f69 100644 --- a/Resources/Prototypes/Damage/modifier_sets.yml +++ b/Resources/Prototypes/Damage/modifier_sets.yml @@ -358,6 +358,20 @@ Piercing: 0.6 Holy: 1.5 +- type: damageModifierSet + id: Shadowkin + coefficients: + Blunt: 0.95 + Slash: 1.2 + Piercing: 1.1 + Asphyxiation: 0 + Cold: 0.75 + Heat: 1.2 + Cellular: 0.25 + Bloodloss: 1.35 + Shock: 1.25 + Radiation: 1.3 + - type: damageModifierSet id: DermalArmor coefficients: diff --git a/Resources/Prototypes/Datasets/Names/shadowkin.yml b/Resources/Prototypes/Datasets/Names/shadowkin.yml new file mode 100644 index 0000000000..4dbf4c5dc5 --- /dev/null +++ b/Resources/Prototypes/Datasets/Names/shadowkin.yml @@ -0,0 +1,70 @@ +# Names for the shadowkin, +# Shadowkin names are descriptive of +# Their Primary Emotion, +# A State of Being, +# Or past Memories. + +- type: dataset + id: names_shadowkin + values: + # Mar + # - Mar + + # Sad + - Fragile + - Heartbreak + - Inferior + - Lone + - Lonesome + - Loss + - Solitary + - Solitude + - Sorrow + - Shade + + # Angry + - Fear + - Fearful + - Fury + - Pain + - Rage + - Rush + - Wrath + + # Happy + - Calm + - Content + - Contented + - Happy + - Hope + - Joyous + - Lovely + - Peace + - Peaceful + - Quiet + - Serene + - Serenity + - Tranquil + - Tranquility + + # Memory + - Dillusioned + - Forgotten + - Focusless + - Lost + - Memory + - Recollection + - Remembrance + - Reminisce + - Reminiscence + + # Other + - Apathy + - Collected + - Curiosity + - Free + - Interest + - Jax # White eye (jack of all trades) :) + - Still + - Unbound + - Shadows \ No newline at end of file diff --git a/Resources/Prototypes/DeltaV/Catalog/Fills/Items/Belts/belts.yml b/Resources/Prototypes/DeltaV/Catalog/Fills/Items/Belts/belts.yml index 2e9d2f7ff4..141349e827 100644 --- a/Resources/Prototypes/DeltaV/Catalog/Fills/Items/Belts/belts.yml +++ b/Resources/Prototypes/DeltaV/Catalog/Fills/Items/Belts/belts.yml @@ -16,7 +16,7 @@ description: An ornate belt, wrapped in gold filigree, with a ribbon made from a stasis-field preserved swatch of linen. The history of this sheath has been lost to time. components: - type: StealTarget - stealGroup: ClothingBeltKatanaSheathFilledHoS + stealGroup: HoSAntiqueWeapon - type: entity id: ClothingBeltCorpsmanWebbingFilled diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/glimmer_creatures.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/glimmer_creatures.yml deleted file mode 100644 index 0a39ef6de8..0000000000 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/glimmer_creatures.yml +++ /dev/null @@ -1,31 +0,0 @@ -- type: entity - name: glimmer mite - parent: MobCockroach - id: MobGlimmerMite - description: A strange pest from a world beyond the noosphere. - components: - - type: Sprite - sprite: DeltaV/Mobs/Ghosts/glimmermite.rsi - layers: - - map: ["enum.DamageStateVisualLayers.Base"] - state: mite - - type: DamageStateVisuals - states: - Alive: - Base: mite - Dead: - Base: mite_dead - baseDecayRate: 0.25 - - type: SolutionContainerManager - solutions: - food: - reagents: - - ReagentId: Ectoplasm - Quantity: 15 - - type: Psionic - - type: GlimmerSource - - type: AmbientSound - range: 6 - volume: -3 - sound: /Audio/DeltaV/Glimmer_Creatures/mite.ogg - - type: AmbientOnPowered diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Player/humanoid.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Player/humanoid.yml index 2c8b01553a..4db83e9ab1 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Player/humanoid.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Player/humanoid.yml @@ -10,6 +10,8 @@ - type: randomHumanoidSettings id: SyndicateListener + speciesBlacklist: + - Shadowkin components: - type: Loadout prototypes: [SyndicateListenerGear] @@ -34,6 +36,8 @@ - type: randomHumanoidSettings id: Mobster randomizeName: false + speciesBlacklist: + - Shadowkin components: - type: GhostRole name: Mobster @@ -65,6 +69,8 @@ - type: randomHumanoidSettings id: MobsterAlt randomizeName: false + speciesBlacklist: + - Shadowkin components: - type: GhostRole name: Mobster diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml index 9ff83bfd48..20947d3bc9 100644 --- a/Resources/Prototypes/DeltaV/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml @@ -114,7 +114,7 @@ - type: StaticPrice price: 750 - type: StealTarget - stealGroup: WeaponEnergyGunMultiphase + stealGroup: HoSAntiqueWeapon - type: entity name: miniature energy gun diff --git a/Resources/Prototypes/DeltaV/GameRules/events.yml b/Resources/Prototypes/DeltaV/GameRules/events.yml index 84a39e4c04..db727601f8 100644 --- a/Resources/Prototypes/DeltaV/GameRules/events.yml +++ b/Resources/Prototypes/DeltaV/GameRules/events.yml @@ -83,5 +83,3 @@ duration: 1 - type: PirateRadioSpawnRule debrisCount: 6 - distanceModifier: 13 - debrisDistanceModifier: 3 diff --git a/Resources/Prototypes/DeltaV/Objectives/stealTargetGroups.yml b/Resources/Prototypes/DeltaV/Objectives/stealTargetGroups.yml index 1236decde9..53022ce236 100644 --- a/Resources/Prototypes/DeltaV/Objectives/stealTargetGroups.yml +++ b/Resources/Prototypes/DeltaV/Objectives/stealTargetGroups.yml @@ -12,55 +12,6 @@ sprite: DeltaV/Objects/Misc/bureaucracy.rsi state: folder-hop-ian -- type: stealTargetGroup - id: WeaponEnergyGunMultiphase - name: x-01 multiphase energy gun - sprite: - sprite: DeltaV/Objects/Weapons/Guns/Battery/multiphase_energygun.rsi - state: base - -- type: stealTargetGroup - id: WeaponPulsePistolHoS - name: antique pulse pistol - sprite: - sprite: Objects/Weapons/Guns/Battery/pulse_pistol.rsi - state: base - -- type: stealTargetGroup - id: WeaponSubMachineGunWt550HoS - name: antique Wt550 - sprite: - sprite: Objects/Weapons/Guns/SMGs/wt550.rsi - state: base - -- type: stealTargetGroup - id: WeaponSubMachineGunC20rHoS - name: antique C20r - sprite: - sprite: Objects/Weapons/Guns/SMGs/c20r.rsi - state: base - -- type: stealTargetGroup - id: WeaponShotgunBulldogHoS - name: antique C20r - sprite: - sprite: Objects/Weapons/Guns/Shotguns/bulldog.rsi - state: base - -- type: stealTargetGroup - id: EnergySwordHoS - name: antique energy sword - sprite: - sprite: Objects/Weapons/Melee/e_sword.rsi - state: e_sword - -- type: stealTargetGroup - id: ClothingBeltKatanaSheathFilledHoS - name: antique katana sheaths - sprite: - sprite: Nyanotrasen/Clothing/Belt/katanasheath.rsi - state: sheath - - type: stealTargetGroup id: RubberStampNotary name: notary stamp diff --git a/Resources/Prototypes/DeltaV/Objectives/traitor.yml b/Resources/Prototypes/DeltaV/Objectives/traitor.yml index b753aaf165..c5c5318b5d 100644 --- a/Resources/Prototypes/DeltaV/Objectives/traitor.yml +++ b/Resources/Prototypes/DeltaV/Objectives/traitor.yml @@ -20,97 +20,6 @@ stealGroup: BookIanDossier # owner: job-name-hop -- type: entity # Head of Security steal objective. - noSpawn: true - parent: BaseTraitorStealObjective - id: HoSGunStealObjective - components: - - type: Objective - difficulty: 3 # HoS will mostly be using the gun to stop you from stealing it - - type: NotJobRequirement - job: HeadOfSecurity - - type: StealCondition - stealGroup: WeaponEnergyGunMultiphase - owner: job-name-hos - -- type: entity # Head of Security steal objective. - noSpawn: true - parent: BaseTraitorStealObjective - id: HoSPulsePistolStealObjective - components: - - type: Objective - difficulty: 3 # HoS will mostly be using the gun to stop you from stealing it - - type: NotJobRequirement - job: HeadOfSecurity - - type: StealCondition - stealGroup: WeaponPulsePistolHoS - owner: job-name-hos - -- type: entity # Head of Security steal objective. - noSpawn: true - parent: BaseTraitorStealObjective - id: HoSWt550StealObjective - components: - - type: Objective - difficulty: 3 # HoS will mostly be using the gun to stop you from stealing it - - type: NotJobRequirement - job: HeadOfSecurity - - type: StealCondition - stealGroup: WeaponSubMachineGunWt550HoS - owner: job-name-hos - -- type: entity # Head of Security steal objective. - noSpawn: true - parent: BaseTraitorStealObjective - id: HoSC20rStealObjective - components: - - type: Objective - difficulty: 3 # HoS will mostly be using the gun to stop you from stealing it - - type: NotJobRequirement - job: HeadOfSecurity - - type: StealCondition - stealGroup: WeaponSubMachineGunC20rHoS - owner: job-name-hos - -- type: entity # Head of Security steal objective. - noSpawn: true - parent: BaseTraitorStealObjective - id: HoSBulldogStealObjective - components: - - type: Objective - difficulty: 3 # HoS will mostly be using the gun to stop you from stealing it - - type: NotJobRequirement - job: HeadOfSecurity - - type: StealCondition - stealGroup: WeaponShotgunBulldogHoS - owner: job-name-hos - -- type: entity # Head of Security steal objective. - noSpawn: true - parent: BaseTraitorStealObjective - id: HoSEnergySwordStealObjective - components: - - type: Objective - difficulty: 3 # HoS will mostly be using the gun to stop you from stealing it - - type: NotJobRequirement - job: HeadOfSecurity - - type: StealCondition - stealGroup: EnergySwordHoS - owner: job-name-hos - -- type: entity # Head of Security steal objective. - noSpawn: true - parent: BaseTraitorStealObjective - id: HoSKatanaSheathStealObjective - components: - - type: Objective - difficulty: 3 # HoS will mostly be using the gun to stop you from stealing it - - type: NotJobRequirement - job: HeadOfSecurity - - type: StealCondition - stealGroup: ClothingBeltKatanaSheathFilledHoS - owner: job-name-hos - - type: entity # Clerk steal objective. noSpawn: true parent: BaseTraitorStealObjective diff --git a/Resources/Prototypes/DeltaV/Roles/Jobs/Fun/misc_startinggear.yml b/Resources/Prototypes/DeltaV/Roles/Jobs/Fun/misc_startinggear.yml index 7d7943ab69..db5e717a01 100644 --- a/Resources/Prototypes/DeltaV/Roles/Jobs/Fun/misc_startinggear.yml +++ b/Resources/Prototypes/DeltaV/Roles/Jobs/Fun/misc_startinggear.yml @@ -62,6 +62,7 @@ gloves: ClothingHandsGlovesCombat shoes: ClothingShoesSlippers id: SyndiListeningPostPDA + pocket1: BaseUplinkRadio20TC innerClothingSkirt: ClothingUniformJumpsuitPyjamaSyndicatePink # Mobsters diff --git a/Resources/Prototypes/DeltaV/Traits/altvision.yml b/Resources/Prototypes/DeltaV/Traits/altvision.yml index 390e14d4ad..54fec7df8b 100644 --- a/Resources/Prototypes/DeltaV/Traits/altvision.yml +++ b/Resources/Prototypes/DeltaV/Traits/altvision.yml @@ -7,6 +7,7 @@ species: - Vulpkanin - Harpy + - Shadowkin - !type:CharacterTraitRequirement inverted: true traits: @@ -23,6 +24,7 @@ species: - Vulpkanin - Harpy + - Shadowkin - !type:CharacterTraitRequirement inverted: true traits: diff --git a/Resources/Prototypes/DeltaV/Voice/speech_emote_sounds.yml b/Resources/Prototypes/DeltaV/Voice/speech_emote_sounds.yml index 119134dcf1..ad91d9c2d2 100644 --- a/Resources/Prototypes/DeltaV/Voice/speech_emote_sounds.yml +++ b/Resources/Prototypes/DeltaV/Voice/speech_emote_sounds.yml @@ -60,6 +60,10 @@ collection: VulpkaninHowls Weh: collection: Weh + Mars: + collection: Mars + Wurble: + collection: Wurble - type: emoteSounds id: MaleVulpkanin diff --git a/Resources/Prototypes/Entities/Clothing/Back/specific.yml b/Resources/Prototypes/Entities/Clothing/Back/specific.yml index fcdecffc8f..e2932537e9 100644 --- a/Resources/Prototypes/Entities/Clothing/Back/specific.yml +++ b/Resources/Prototypes/Entities/Clothing/Back/specific.yml @@ -61,3 +61,25 @@ solution: tank - type: ExaminableSolution solution: tank + +- type: entity + parent: Clothing + id: ClothingBackpackEtherealTeleporter + name: ethereal teleporter + description: Originally created while several research facilities were experimenting on Shadowkin, this backpack allows the wearer to jump the gap between the "normal" dimension and The Dark. + components: + - type: Tag + tags: + - WhitelistChameleon + - type: Sprite + sprite: Clothing/Back/etherealteleporter.rsi + state: icon + - type: Item + size: Ginormous + - type: Clothing + slots: BACK + sprite: Clothing/Back/etherealteleporter.rsi + # TODO: Uncomment this when ClothingGrantPsionicPower is fixed and back working. + # - type: ClothingGrantPsionicPower + # power: DarkSwapPower + # - type: Psionic diff --git a/Resources/Prototypes/Entities/Clothing/Eyes/glasses.yml b/Resources/Prototypes/Entities/Clothing/Eyes/glasses.yml index 9e47a685f0..f50b0dbca5 100644 --- a/Resources/Prototypes/Entities/Clothing/Eyes/glasses.yml +++ b/Resources/Prototypes/Entities/Clothing/Eyes/glasses.yml @@ -265,3 +265,15 @@ sprite: Clothing/Eyes/Glasses/meson.rsi - type: Clothing sprite: Clothing/Eyes/Glasses/meson.rsi + +- type: entity + parent: ClothingEyesBase + id: ClothingEyesGlassesEthereal + name: ethereal goggles + description: An unusual pair of goggles developed during a time of inhumane experimentation involving Shadowkin. They are designed to allow the wearer to peer into The Dark. + components: + - type: Sprite + sprite: Clothing/Eyes/Glasses/etherealgoogles.rsi + - type: Clothing + sprite: Clothing/Eyes/Glasses/etherealgoogles.rsi + - type: ShowEthereal \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/misc.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/misc.yml index f908465f7a..b5169a9cf6 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/misc.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/misc.yml @@ -428,3 +428,20 @@ sprite: Clothing/OuterClothing/Misc/unathirobe.rsi - type: Clothing sprite: Clothing/OuterClothing/Misc/unathirobe.rsi + +- type: entity + parent: ClothingOuterBase + id: ClothingOuterShadowkinRestraints + name: shadowkin restraints + description: One of the first creations after finding Shadowkin, these were used to contain the Shadowkin during research so they didn't teleport away. + components: + - type: Sprite + sprite: Clothing/OuterClothing/Misc/shadowkinrestraints.rsi + - type: Clothing + sprite: Clothing/OuterClothing/Misc/shadowkinrestraints.rsi + equipDelay: 0.5 + unequipDelay: 10 + - type: ShadowkinCuff + - type: GuideHelp + guides: + - Shadowkin \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Effects/bluespace_flash.yml b/Resources/Prototypes/Entities/Effects/bluespace_flash.yml index a0b3f81abc..b05681def2 100644 --- a/Resources/Prototypes/Entities/Effects/bluespace_flash.yml +++ b/Resources/Prototypes/Entities/Effects/bluespace_flash.yml @@ -38,4 +38,69 @@ lifetime: 1 - type: EmitSoundOnSpawn sound: - path: /Audio/Effects/Lightning/lightningbolt.ogg \ No newline at end of file + path: /Audio/Effects/Lightning/lightningbolt.ogg + +- type: entity + id: EffectFlashShadowkinShadeskip + noSpawn: true + components: + - type: PointLight + radius: 5 + energy: 3.5 + color: "#7100bd" + - type: TimedDespawn + lifetime: 3 + - type: EmitSoundOnSpawn + sound: + path: /Audio/Effects/Shadowkin/shadeskip.ogg + +- type: entity + id: EffectFlashShadowkinDarkSwapOn + noSpawn: true + components: + - type: PointLight + radius: 5 + energy: 3.5 + color: "#7100bd" + - type: TimedDespawn + lifetime: 3 + - type: EmitSoundOnSpawn + sound: + path: /Audio/Effects/Shadowkin/darkswapon.ogg + +- type: entity + id: EffectFlashShadowkinDarkSwapOff + noSpawn: true + components: + - type: PointLight + radius: 5 + energy: 3.5 + color: "#7100bd" + - type: TimedDespawn + lifetime: 3 + - type: EmitSoundOnSpawn + sound: + path: /Audio/Effects/Shadowkin/darkswapoff.ogg + +- type: entity + id: EffectPyrokineticFlare + noSpawn: true + components: + - type: Sprite + sprite: /Textures/Interface/Actions/psionics.rsi + visible: false + state: pyrokinetic_flare + - type: TriggerOnSpawn + - type: PointLight + radius: 5 + energy: 8 + color: "#ff4500" + - type: LightFade + duration: 0.5 + - type: TimedDespawn + lifetime: 0.5 + - type: FlashOnTrigger + range: 7 + - type: EmitSoundOnSpawn + sound: + path: "/Audio/Effects/flash_bang.ogg" diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/reptilian.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/reptilian.yml index cad3e77962..6197f82030 100644 --- a/Resources/Prototypes/Entities/Mobs/Customization/Markings/reptilian.yml +++ b/Resources/Prototypes/Entities/Mobs/Customization/Markings/reptilian.yml @@ -208,7 +208,7 @@ id: LizardChestTiger bodyPart: Chest markingCategory: Chest - speciesRestriction: [Reptilian] + speciesRestriction: [Reptilian, Shadowkin] sprites: - sprite: Mobs/Customization/reptilian_parts.rsi state: body_tiger diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/shadowkin.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/shadowkin.yml new file mode 100644 index 0000000000..f86852a987 --- /dev/null +++ b/Resources/Prototypes/Entities/Mobs/Customization/Markings/shadowkin.yml @@ -0,0 +1,83 @@ +# Ears + +- type: marking + id: EarsShadowkin + bodyPart: HeadTop + markingCategory: HeadTop + speciesRestriction: [Shadowkin] + forcedColoring: true + sprites: + - sprite: Mobs/Customization/Shadowkin/ears.rsi + state: shadowkin + +- type: marking + id: EarsShadowkinStriped + bodyPart: HeadTop + markingCategory: HeadTop + speciesRestriction: [Shadowkin] + coloring: + default: + type: + !type:SkinColoring + layers: + shadowkin_stripes: + type: + !type:SimpleColoring + color: "#FFFFFF" + sprites: + - sprite: Mobs/Customization/Shadowkin/ears.rsi + state: shadowkin + - sprite: Mobs/Customization/Shadowkin/ears.rsi + state: shadowkin_stripes + +# Tails + +- type: marking + id: TailShadowkin + bodyPart: Tail + markingCategory: Tail + speciesRestriction: [Shadowkin] + forcedColoring: true + sprites: + - sprite: Mobs/Customization/Shadowkin/tails64x32.rsi + state: shadowkin + +- type: marking + id: TailShadowkinBig + bodyPart: Tail + markingCategory: Tail + speciesRestriction: [Shadowkin] + forcedColoring: true + sprites: + - sprite: Mobs/Customization/Shadowkin/tails64x32.rsi + state: shadowkin_big + +- type: marking + id: TailShadowkinBigFluff + bodyPart: Tail + markingCategory: Tail + speciesRestriction: [Shadowkin] + forcedColoring: true + sprites: + - sprite: Mobs/Customization/Shadowkin/tails64x32.rsi + state: shadowkin_big_fluff + +- type: marking + id: TailShadowkinShorter + bodyPart: Tail + markingCategory: Tail + speciesRestriction: [Shadowkin] + forcedColoring: true + sprites: + - sprite: Mobs/Customization/Shadowkin/tails32x32.rsi + state: shadowkin_shorter + +- type: marking + id: TailShadowkinMedium + bodyPart: Tail + markingCategory: Tail + speciesRestriction: [Shadowkin] + forcedColoring: true + sprites: + - sprite: Mobs/Customization/Shadowkin/tails32x32.rsi + state: shadowkin_medium \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/slime.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/slime.yml index 57b25798e7..0bff234747 100644 --- a/Resources/Prototypes/Entities/Mobs/Customization/Markings/slime.yml +++ b/Resources/Prototypes/Entities/Mobs/Customization/Markings/slime.yml @@ -2,7 +2,7 @@ id: SlimeGradientLeftArm bodyPart: LArm markingCategory: LeftArm - speciesRestriction: [SlimePerson] + speciesRestriction: [SlimePerson, Shadowkin] sprites: - sprite: Mobs/Customization/slime_parts.rsi state: gradient_l_arm @@ -11,7 +11,7 @@ id: SlimeGradientRightArm bodyPart: RArm markingCategory: RightArm - speciesRestriction: [SlimePerson] + speciesRestriction: [SlimePerson, Shadowkin] sprites: - sprite: Mobs/Customization/slime_parts.rsi state: gradient_r_arm @@ -20,7 +20,7 @@ id: SlimeGradientLeftLeg bodyPart: LLeg markingCategory: LeftLeg - speciesRestriction: [SlimePerson] + speciesRestriction: [SlimePerson, Shadowkin] sprites: - sprite: Mobs/Customization/slime_parts.rsi state: gradient_l_leg @@ -29,7 +29,7 @@ id: SlimeGradientRightLeg bodyPart: RLeg markingCategory: RightLeg - speciesRestriction: [SlimePerson] + speciesRestriction: [SlimePerson, Shadowkin] sprites: - sprite: Mobs/Customization/slime_parts.rsi state: gradient_r_leg @@ -38,7 +38,7 @@ id: SlimeGradientLeftFoot bodyPart: LFoot markingCategory: LeftFoot - speciesRestriction: [SlimePerson] + speciesRestriction: [SlimePerson, Shadowkin] sprites: - sprite: Mobs/Customization/slime_parts.rsi state: gradient_l_foot @@ -47,7 +47,7 @@ id: SlimeGradientRightFoot bodyPart: RFoot markingCategory: RightFoot - speciesRestriction: [SlimePerson] + speciesRestriction: [SlimePerson, Shadowkin] sprites: - sprite: Mobs/Customization/slime_parts.rsi state: gradient_r_foot @@ -56,7 +56,7 @@ id: SlimeGradientLeftHand bodyPart: LHand markingCategory: LeftHand - speciesRestriction: [SlimePerson] + speciesRestriction: [SlimePerson, Shadowkin] sprites: - sprite: Mobs/Customization/slime_parts.rsi state: gradient_l_hand @@ -65,7 +65,7 @@ id: SlimeGradientRightHand bodyPart: RHand markingCategory: RightHand - speciesRestriction: [SlimePerson] + speciesRestriction: [SlimePerson, Shadowkin] sprites: - sprite: Mobs/Customization/slime_parts.rsi state: gradient_r_hand diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/tattoos.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/tattoos.yml index 8830708539..93a16fcfd3 100644 --- a/Resources/Prototypes/Entities/Mobs/Customization/Markings/tattoos.yml +++ b/Resources/Prototypes/Entities/Mobs/Customization/Markings/tattoos.yml @@ -2,7 +2,7 @@ id: TattooHiveChest bodyPart: Chest markingCategory: Chest - speciesRestriction: [Human, Dwarf, Felinid, Oni] # Delta V - Felinid, Oni + speciesRestriction: [Human, Dwarf, Felinid, Oni, Shadowkin] # Delta V - Felinid, Oni coloring: default: type: @@ -16,7 +16,7 @@ id: TattooNightlingChest bodyPart: Chest markingCategory: Chest - speciesRestriction: [Human, Dwarf, Felinid, Oni] # Delta V - Felinid, Oni + speciesRestriction: [Human, Dwarf, Felinid, Oni, Shadowkin] # Delta V - Felinid, Oni coloring: default: type: @@ -30,7 +30,7 @@ id: TattooSilverburghLeftLeg bodyPart: LLeg markingCategory: LeftLeg - speciesRestriction: [Human, Dwarf, Felinid, Oni] # Delta V - Felinid, Oni + speciesRestriction: [Human, Dwarf, Felinid, Oni, Shadowkin] # Delta V - Felinid, Oni coloring: default: type: @@ -44,7 +44,7 @@ id: TattooSilverburghRightLeg bodyPart: RLeg markingCategory: RightLeg - speciesRestriction: [Human, Dwarf, Felinid, Oni] # Delta V - Felinid, Oni + speciesRestriction: [Human, Dwarf, Felinid, Oni, Shadowkin] # Delta V - Felinid, Oni coloring: default: type: @@ -58,7 +58,7 @@ id: TattooCampbellLeftArm bodyPart: LArm markingCategory: LeftArm - speciesRestriction: [Human, Dwarf, Felinid, Oni] # Delta V - Felinid, Oni + speciesRestriction: [Human, Dwarf, Felinid, Oni, Shadowkin] # Delta V - Felinid, Oni coloring: default: type: @@ -72,7 +72,7 @@ id: TattooCampbellRightArm bodyPart: RArm markingCategory: RightArm - speciesRestriction: [Human, Dwarf, Felinid, Oni] # Delta V - Felinid, Oni + speciesRestriction: [Human, Dwarf, Felinid, Oni, Shadowkin] # Delta V - Felinid, Oni coloring: default: type: @@ -86,7 +86,7 @@ id: TattooCampbellLeftLeg bodyPart: LLeg markingCategory: LeftLeg - speciesRestriction: [Human, Dwarf, Felinid, Oni] # Delta V - Felinid, Oni + speciesRestriction: [Human, Dwarf, Felinid, Oni, Shadowkin] # Delta V - Felinid, Oni coloring: default: type: @@ -100,7 +100,7 @@ id: TattooCampbellRightLeg bodyPart: RLeg markingCategory: RightLeg - speciesRestriction: [Human, Dwarf, Felinid, Oni] # Delta V - Felinid, Oni + speciesRestriction: [Human, Dwarf, Felinid, Oni, Shadowkin] # Delta V - Felinid, Oni coloring: default: type: diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index d6c274751d..8dd348f47e 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -2357,6 +2357,9 @@ - type: RandomBark barkType: hissing barkMultiplier: 0.3 + - type: BloodSucker + webRequired: true + - type: Cocooner - type: entity name: tarantula diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/glimmer_creatures.yml b/Resources/Prototypes/Entities/Mobs/NPCs/glimmer_creatures.yml new file mode 100644 index 0000000000..33e4ecee26 --- /dev/null +++ b/Resources/Prototypes/Entities/Mobs/NPCs/glimmer_creatures.yml @@ -0,0 +1,163 @@ +- type: entity + name: glimmer mite + parent: MobCockroach + id: MobGlimmerMite + description: A strange pest from a world beyond the noosphere. + components: + - type: Sprite + sprite: DeltaV/Mobs/Ghosts/glimmermite.rsi + layers: + - map: ["enum.DamageStateVisualLayers.Base"] + state: mite + - type: DamageStateVisuals + states: + Alive: + Base: mite + Dead: + Base: mite_dead + baseDecayRate: 0.25 + - type: SolutionContainerManager + solutions: + food: + reagents: + - ReagentId: Ectoplasm + Quantity: 15 + - type: Psionic + - type: GlimmerSource + - type: AmbientSound + range: 6 + volume: -3 + sound: /Audio/DeltaV/Glimmer_Creatures/mite.ogg + - type: AmbientOnPowered + +- type: entity + parent: + - BaseMob + - MobCombat + - MobDamageable + id: MobGlimmerWisp + name: glimmer wisp + description: A strange orb that moves with intent. + components: + # appearance + - type: Sprite + drawDepth: Ghosts + sprite: Mobs/Demons/glimmer_wisp.rsi + layers: + - state: willowisp + shader: unshaded + - type: PointLight + color: "#419ba3" + - type: Stealth + lastVisibility: 0.66 + - type: AmbientSound + volume: -8 + range: 5 + sound: + path: /Audio/Ambience/wisp_ambience.ogg + # physical + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeCircle + radius: 0.35 + density: 13 + mask: + - Opaque + layer: + - MobLayer + - type: MovementSpeedModifier + baseSprintSpeed: 8 + baseWalkSpeed: 5 + - type: MovementIgnoreGravity + - type: Speech + # powers + - type: Psionic + removable: false + - type: InnatePsionicPowers + powersToAdd: + - NoosphericZapPower + - type: LifeDrainer + damage: + types: + Asphyxiation: 200 + whitelist: + components: + - Psionic + # damage + - type: Reactive + groups: + Acidic: [Touch] # Holy water + - type: MobState + allowedStates: + - Alive + - Dead + - type: MobThresholds + thresholds: + 0: Alive + 300: Dead + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 300 + behaviors: + - !type:PlaySoundBehavior + sound: + path: /Audio/Effects/wail.ogg + - !type:SpawnEntitiesBehavior + spawn: + Ectoplasm: + min: 2 + max: 3 + - !type:DoActsBehavior + acts: [ "Destruction" ] + - type: Damageable + damageContainer: Spirit + damageModifierSet: CorporealSpirit + - type: DamageOnDispel + damage: + types: + Heat: 100 + - type: SlowOnDamage + speedModifierThresholds: + 150: 0.8 + 200: 0.6 + 250: 0.3 + - type: StatusEffects + allowed: + - Stun + - KnockedDown #KnockedDown is inseperable from stun because... IT JUST IS OK? + - SlowedDown + - Pacified + # combat + - type: Gun + fireRate: 0.7 + soundGunshot: + collection: MagicMissile + showExamineText: false + selectedMode: SemiAuto + availableModes: + - SemiAuto + - type: HitscanBatteryAmmoProvider + proto: WispLash + fireCost: 1 + # TODO: implement upstream or make it use a proper thing, maybe copy dragon + #examinable: false + - type: Battery + maxCharge: 1000 + startingCharge: 1000 + - type: BatterySelfRecharger + autoRecharge: true + autoRechargeRate: 100 + # AI + - type: HTN + rootTask: + task: GlimmerWispCompound + - type: NpcFactionMember + factions: + - GlimmerMonster + - type: NPCRetaliation + attackMemoryLength: 10 + - type: NPCRangedCombat diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/space.yml b/Resources/Prototypes/Entities/Mobs/NPCs/space.yml index 919441dff5..4ea766c314 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/space.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/space.yml @@ -277,6 +277,9 @@ Unsexed: UnisexArachnid - type: TypingIndicator proto: spider + - type: BloodSucker + webRequired: true + - type: Cocooner - type: entity id: MobSpiderSpaceSalvage diff --git a/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml b/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml index c690bbb311..dce408ed82 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml @@ -10,6 +10,7 @@ - PsionicInvisibility - Ghost - Normal + - Ethereal - type: ContentEye maxZoom: 8.916104, 8.916104 - type: Tag diff --git a/Resources/Prototypes/Entities/Mobs/Player/familiars.yml b/Resources/Prototypes/Entities/Mobs/Player/familiars.yml index 87166f13a3..0804ba8258 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/familiars.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/familiars.yml @@ -1,6 +1,76 @@ +- type: entity + parent: + - BaseMob + - MobCombat + - MobDamageable + id: BaseMobPsionicFamiliar + abstract: true + components: + - type: Sprite + drawdepth: Mobs + layers: + - map: ["enum.DamageStateVisualLayers.Base"] + state: bat + sprite: Mobs/Animals/bat.rsi + - type: GhostRole + makeSentient: true + allowMovement: true + allowSpeech: true + name: ghost-role-information-familiar-name + description: ghost-role-information-familiar-description + rules: ghost-role-information-familiar-rules + raffle: + settings: default + - type: GhostTakeoverAvailable + - type: Tag + tags: + - DoorBumpOpener + - type: MobThresholds + thresholds: + 0: Alive + 100: Dead + - type: Damageable + damageContainer: CorporealSpirit + damageModifierSet: CorporealSpirit + - type: MindContainer + showExamineInfo: false + - type: NpcFactionMember + factions: + - PsionicInterloper + - type: Alerts + - type: Familiar + - type: Psionic + removable: false + psychognomicDescriptors: + - p-descriptor-bound + - p-descriptor-cyclic + - type: InnatePsionicPowers + powersToAdd: + - TelepathyPower + - type: HTN + rootTask: + task: MeleePsionicFamiliarCompound + blackboard: + IdleRange: !type:Single + 3.5 + FollowCloseRange: !type:Single + 2.0 + FollowRange: !type:Single + 3.0 + - type: NPCRetaliation + attackMemoryLength: 10 + retaliateFriendlies: true + - type: PsionicFamiliar + - type: DamageOnDispel + damage: + types: + Heat: 100 + - type: RandomMetadata + nameSegments: [names_golem] + - type: entity name: Remilia - parent: MobBat + parent: BaseMobPsionicFamiliar id: MobBatRemilia description: The chaplain's familiar. Likes fruit. components: @@ -23,25 +93,43 @@ - type: Access tags: - Chapel - - type: Damageable # Nyanotrasen - Corporeal Spirit allows Holy water to do damage - damageContainer: CorporealSpirit - damageModifierSet: CorporealSpirit - - type: MindContainer - showExamineInfo: true - - type: NpcFactionMember - factions: - - PetsNT - - PsionicInterloper #Nyano - Summary: makes a part of the psionic faction. - - type: Alerts - - type: Familiar - - type: Psionic - removable: false - psychognomicDescriptors: - - p-descriptor-bound - - p-descriptor-cyclic - type: InnatePsionicPowers powersToAdd: - TelepathyPower + - XenoglossyPower + - type: MovementSpeedModifier + baseWalkSpeed : 3 + baseSprintSpeed : 6 + - type: Speech + speechSounds: Squeak + speechVerb: SmallMob + allowedEmotes: ['Squeak'] + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeCircle + radius: 0.25 + density: 0.8 + mask: + - FlyingMobMask + layer: + - FlyingMobLayer + - type: InteractionPopup + successChance: 0.2 + interactSuccessString: petting-success-soft-floofy + interactFailureString: petting-failure-bat + interactSuccessSpawn: EffectHearts + interactSuccessSound: + path: /Audio/Animals/fox_squeak.ogg + - type: MeleeWeapon + soundHit: + path: /Audio/Effects/bite.ogg + angle: 0 + animation: WeaponArcBite + damage: + types: + Piercing: 5 - type: entity name: Cerberus @@ -74,7 +162,7 @@ - type: NpcFactionMember factions: - Syndicate - - PsionicInterloper #Nyano - Summary: makes part of the psionoic faction. + - PsionicInterloper - type: InteractionPopup successChance: 0.5 interactSuccessString: petting-success-corrupted-corgi @@ -99,7 +187,7 @@ showExamineInfo: true - type: Familiar - type: Dispellable - - type: Psionic #Nyano - Summary: makes psionic on creation. + - type: Psionic removable: false - type: InnatePsionicPowers powersToAdd: @@ -109,3 +197,45 @@ Male: Cerberus Female: Cerberus Unsexed: Cerberus + +- type: entity + name: imp familiar + parent: BaseMobPsionicFamiliar + id: MobPsionicFamiliarImp + description: A living mote of flame summoned from Gehenna. + components: + - type: Sprite + drawdepth: Mobs + layers: + - map: ["enum.DamageStateVisualLayers.Base"] + state: imp + sprite: Mobs/Demons/imp.rsi + - type: InnatePsionicPowers + powersToAdd: + - TelepathyPower + - PyrokineticFlare + - XenoglossyPower + - type: MeleeWeapon + damage: + types: + Heat: 9 + soundHit: + path: /Audio/Weapons/Guns/Hits/energy_meat1.ogg + params: + variation: 0.250 + volume: -10 + - type: PointLight + radius: 2 + energy: 30 + color: "#ff4500" + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeCircle + radius: 0.35 + density: 13 + mask: + - Opaque + layer: + - MobLayer diff --git a/Resources/Prototypes/Entities/Mobs/Player/humanoid.yml b/Resources/Prototypes/Entities/Mobs/Player/humanoid.yml index e96633dde8..a4bfe2289b 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/humanoid.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/humanoid.yml @@ -21,6 +21,8 @@ - type: randomHumanoidSettings id: DeathSquad randomizeName: false + speciesBlacklist: + - Shadowkin components: - type: MindShield - type: GhostRole @@ -59,6 +61,8 @@ - type: randomHumanoidSettings id: ERTLeader randomizeName: false + speciesBlacklist: + - Shadowkin components: - type: MindShield - type: GhostRole @@ -486,6 +490,8 @@ - type: randomHumanoidSettings id: CBURNAgent + speciesBlacklist: + - Shadowkin components: - type: MindShield - type: Loadout @@ -516,6 +522,8 @@ - type: randomHumanoidSettings id: CentcomOfficial + speciesBlacklist: + - Shadowkin components: - type: MindShield - type: GhostRole @@ -544,6 +552,8 @@ - type: randomHumanoidSettings id: SyndicateAgent + speciesBlacklist: + - Shadowkin components: - type: Loadout prototypes: [SyndicateOperativeGearExtremelyBasic] @@ -560,6 +570,8 @@ - type: randomHumanoidSettings id: NukeOp + speciesBlacklist: + - Shadowkin components: - type: NukeOperative - type: Psionic @@ -582,6 +594,8 @@ - type: randomHumanoidSettings id: Cluwne + speciesBlacklist: + - Shadowkin randomizeName: false components: - type: GhostRole diff --git a/Resources/Prototypes/Entities/Mobs/Player/observer.yml b/Resources/Prototypes/Entities/Mobs/Player/observer.yml index 0086be81d9..c92595ffc9 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/observer.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/observer.yml @@ -32,6 +32,7 @@ - PsionicInvisibility - Ghost - Normal + - Ethereal - type: Input context: "ghost" - type: Examiner diff --git a/Resources/Prototypes/Entities/Mobs/Player/shadowkin.yml b/Resources/Prototypes/Entities/Mobs/Player/shadowkin.yml new file mode 100644 index 0000000000..2a58fe5c1f --- /dev/null +++ b/Resources/Prototypes/Entities/Mobs/Player/shadowkin.yml @@ -0,0 +1,5 @@ +- type: entity + save: false + name: Urist McShadow + parent: MobShadowkinBase + id: MobShadowkin \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Mobs/Species/arachne.yml b/Resources/Prototypes/Entities/Mobs/Species/arachne.yml index e704f15725..24ebafd91d 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/arachne.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/arachne.yml @@ -111,7 +111,7 @@ bloodRegenerationThirst: 4 # 1 unit of demon's blood satiates 4 thirst - type: BloodSucker webRequired: true - - type: Arachne + - type: Cocooner - type: DamageVisuals targetLayers: - "enum.HumanoidVisualLayers.Chest" diff --git a/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml b/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml index bfb7796f44..d576101e65 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml @@ -44,6 +44,9 @@ methods: [Touch] effects: - !type:WashCreamPieReaction + - type: BloodSucker + webRequired: true + - type: Cocooner # Damage (Self) - type: Bloodstream bloodReagent: CopperBlood diff --git a/Resources/Prototypes/Entities/Mobs/Species/base.yml b/Resources/Prototypes/Entities/Mobs/Species/base.yml index c0d23c489c..2e5a1aea52 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/base.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/base.yml @@ -141,8 +141,8 @@ - TemporaryBlindness - Pacified - StaminaModifier - - PsionicsDisabled #Nyano - Summary: PCs can have psionics disabled. - - PsionicallyInsulated #Nyano - Summary: PCs can be made insulated from psionic powers. + - PsionicsDisabled + - PsionicallyInsulated - type: Reflect enabled: false reflectProb: 0 @@ -152,7 +152,6 @@ - type: Identity - type: IdExaminable - type: Hands - - type: Internals - type: Inventory - type: InventorySlots - type: FloatingVisuals @@ -273,6 +272,8 @@ - Muted - Pacified - StaminaModifier + - PsionicsDisabled + - PsionicallyInsulated - type: Blindable # Other - type: Temperature diff --git a/Resources/Prototypes/Entities/Mobs/Species/shadowkin.yml b/Resources/Prototypes/Entities/Mobs/Species/shadowkin.yml new file mode 100644 index 0000000000..393cb0b871 --- /dev/null +++ b/Resources/Prototypes/Entities/Mobs/Species/shadowkin.yml @@ -0,0 +1,304 @@ +- type: entity + save: false + parent: + - MobBloodstream + - MobAtmosStandard + - MobFlammable + - BaseMobSpecies + id: MobShadowkinBase + name: Urist McShadow + abstract: true + components: + - type: Destructible + thresholds: + - trigger: + !type:DamageTypeTrigger + damageType: Blunt + damage: 400 + behaviors: + - !type:GibBehavior {} + - !type:SpawnEntitiesBehavior + spawn: + ShadowkinShadow: + min: 1 + max: 1 + EffectFlashShadowkinShadeskip: + min: 1 + max: 1 + - trigger: + !type:DamageTypeTrigger + damageType: Heat + damage: 1500 + behaviors: + - !type:SpawnEntitiesBehavior + spawnInContainer: true + spawn: + Ash: + min: 1 + max: 1 + - !type:BurnBodyBehavior {} + - !type:PlaySoundBehavior + sound: + collection: MeatLaserImpact + - type: PassiveDamage # Slight passive regen. Assuming one damage type, comes out to about 4 damage a minute. + allowedStates: + - Alive + damageCap: 20 + damage: + types: + Heat: -0.07 + groups: + Brute: -0.07 + - type: StatusEffects + allowed: + - Stun + - KnockedDown + - SlowedDown + - Stutter + - SeeingRainbows + - Electrocution + - ForcedSleep + - TemporaryBlindness + - Drunk + - SlurredSpeech + - RatvarianLanguage + - PressureImmunity + - Muted + - Pacified + - StaminaModifier + - type: Blindable + - type: ThermalRegulator + metabolismHeat: 800 + radiatedHeat: 100 + implicitHeatRegulation: 500 + sweatHeatRegulation: 2000 + shiveringHeatRegulation: 2000 + normalBodyTemperature: 310.15 + thermalRegulationTemperatureThreshold: 25 + - type: Perishable + - type: FireVisuals + alternateState: Standing + - type: OfferItem + - type: LayingDown + - type: Shoving + - type: BloodstreamAffectedByMass + power: 0.6 + - type: Hunger + - type: Thirst + - type: Carriable + - type: HumanoidAppearance + species: Shadowkin + - type: Icon + sprite: Mobs/Species/Shadowkin/parts.rsi + state: full + - type: Body + prototype: Shadowkin + - type: Flammable + damage: + types: + Heat: 1.5 # burn more + - type: MobThresholds + thresholds: # Weak + 0: Alive + 80: Critical + 180: Dead + - type: SlowOnDamage + speedModifierThresholds: + 48: 0.85 + 64: 0.65 + - type: Damageable + damageContainer: Biological # Shadowkin + damageModifierSet: Shadowkin + - type: Barotrauma + damage: + types: + Blunt: 0.35 # per second, scales with pressure and other constants. + - type: Bloodstream + bloodlossDamage: + types: + Bloodloss: 1 + bloodlossHealDamage: + types: + Bloodloss: -0.25 + - type: Temperature + heatDamageThreshold: 330 + coldDamageThreshold: 195 + currentTemperature: 310.15 + specificHeat: 46 + coldDamage: + types: + Cold: 0.05 #per second, scales with temperature & other constants + heatDamage: + types: + Heat: 0.25 #per second, scales with temperature & other constants + - type: Fixtures + fixtures: + fix1: + shape: !type:PhysShapeCircle + radius: 0.35 + density: 130 #lower density + restitution: 0.0 + mask: + - MobMask + layer: + - MobLayer + - type: Sprite + netsync: false + noRot: true + drawdepth: Mobs + scale: 0.85, 0.85 + layers: + - map: ["enum.HumanoidVisualLayers.Chest"] + - map: ["enum.HumanoidVisualLayers.Head"] + - map: ["enum.HumanoidVisualLayers.Snout"] + - map: ["enum.HumanoidVisualLayers.Eyes"] + shader: unshaded + - map: ["enum.HumanoidVisualLayers.RArm"] + - map: ["enum.HumanoidVisualLayers.LArm"] + - map: ["enum.HumanoidVisualLayers.RLeg"] + - map: ["enum.HumanoidVisualLayers.LLeg"] + - shader: StencilClear + sprite: Mobs/Species/Human/parts.rsi + state: l_leg + - shader: StencilMask + map: ["enum.HumanoidVisualLayers.StencilMask"] + sprite: Mobs/Customization/masking_helpers.rsi + state: full + visible: false + - map: ["enum.HumanoidVisualLayers.LFoot"] + - map: ["enum.HumanoidVisualLayers.RFoot"] + - map: ["socks"] + - map: ["underpants"] + - map: ["undershirt"] + - map: ["jumpsuit"] + - map: ["enum.HumanoidVisualLayers.LHand"] + - map: ["enum.HumanoidVisualLayers.RHand"] + - map: ["enum.HumanoidVisualLayers.Handcuffs"] + color: "#ffffff" + sprite: Objects/Misc/handcuffs.rsi + state: body-overlay-2 + visible: false + - map: ["id"] + - map: ["gloves"] + - map: ["shoes"] + - map: ["ears"] + - map: ["outerClothing"] + - map: ["eyes"] + - map: ["belt"] + - map: ["neck"] + - map: ["back"] + - map: ["enum.HumanoidVisualLayers.FacialHair"] + - map: ["enum.HumanoidVisualLayers.Hair"] + - map: ["enum.HumanoidVisualLayers.HeadSide"] + - map: ["enum.HumanoidVisualLayers.HeadTop"] + - map: ["mask"] + - map: ["head"] + - map: ["pocket1"] + - map: ["pocket2"] + - map: ["enum.HumanoidVisualLayers.Tail"] + - type: MeleeWeapon + soundHit: + collection: AlienClaw + angle: 30 + animation: WeaponArcClaw + damage: + types: + Slash: 5 + - type: Vocal + sounds: + Male: MaleShadowkin + Female: FemaleShadowkin + Unsexed: MaleShadowkin + - type: TypingIndicator + proto: alien + - type: MovementSpeedModifier + baseWalkSpeed: 2.7 + baseSprintSpeed: 4.5 + - type: Flashable + eyeDamageChance: 0.3 + eyeDamage: 1 + durationMultiplier: 1.5 + - type: Speech + allowedEmotes: ['Mars', 'Wurble'] + - type: Shadowkin + - type: Psionic + mindbreakingFeedback: shadowkin-blackeye + manaGain: 0.25 + mana: 150 + maxMana: 250 + bypassManaCheck: true + removable: false + - type: InnatePsionicPowers + powersToAdd: + - ShadowkinPowers + - type: LanguageKnowledge + speaks: + - TauCetiBasic + - Marish + understands: + - TauCetiBasic + - Marish + +- type: entity + save: false + parent: MobHumanDummy + id: MobShadowkinDummy + noSpawn: true + description: A dummy shadowkin meant to be used in character setup. + components: + - type: HumanoidAppearance + species: Shadowkin + - type: Sprite + netsync: false + noRot: true + drawdepth: Mobs + scale: 0.85, 0.85 # Small + layers: + - map: ["enum.HumanoidVisualLayers.Chest"] + - map: ["enum.HumanoidVisualLayers.Head"] + - map: ["enum.HumanoidVisualLayers.Snout"] + - map: ["enum.HumanoidVisualLayers.Eyes"] + shader: unshaded + - map: ["enum.HumanoidVisualLayers.RArm"] + - map: ["enum.HumanoidVisualLayers.LArm"] + - map: ["enum.HumanoidVisualLayers.RLeg"] + - map: ["enum.HumanoidVisualLayers.LLeg"] + - shader: StencilClear + sprite: Mobs/Species/Human/parts.rsi + state: l_leg + - shader: StencilMask + map: ["enum.HumanoidVisualLayers.StencilMask"] + sprite: Mobs/Customization/masking_helpers.rsi + state: full + visible: false + - map: ["enum.HumanoidVisualLayers.LFoot"] + - map: ["enum.HumanoidVisualLayers.RFoot"] + - map: ["socks"] + - map: ["underpants"] + - map: ["undershirt"] + - map: ["jumpsuit"] + - map: ["enum.HumanoidVisualLayers.LHand"] + - map: ["enum.HumanoidVisualLayers.RHand"] + - map: ["enum.HumanoidVisualLayers.Handcuffs"] + color: "#ffffff" + sprite: Objects/Misc/handcuffs.rsi + state: body-overlay-2 + visible: false + - map: ["id"] + - map: ["gloves"] + - map: ["shoes"] + - map: ["ears"] + - map: ["outerClothing"] + - map: ["eyes"] + - map: ["belt"] + - map: ["neck"] + - map: ["back"] + - map: ["enum.HumanoidVisualLayers.FacialHair"] + - map: ["enum.HumanoidVisualLayers.Hair"] + - map: ["enum.HumanoidVisualLayers.HeadSide"] + - map: ["enum.HumanoidVisualLayers.HeadTop"] + - map: ["mask"] + - map: ["head"] + - map: ["pocket1"] + - map: ["pocket2"] + - map: ["enum.HumanoidVisualLayers.Tail"] diff --git a/Resources/Prototypes/Entities/Objects/Devices/instrumentFlatpacks.yml b/Resources/Prototypes/Entities/Objects/Devices/instrumentFlatpacks.yml new file mode 100644 index 0000000000..feb0e2ab5f --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Devices/instrumentFlatpacks.yml @@ -0,0 +1,121 @@ +- type: entity + parent: BaseFlatpack + id: InstrumentFlatpack + name: instrument flatpack + description: A flatpack used for constructing something. + categories: + - hideSpawnMenu + components: + - type: Item + size: Normal + - type: Sprite + layers: + - state: service_music + +- type: entity + parent: InstrumentFlatpack + id: PianoFlatpack + name: piano flatpack + description: A flatpack used for constructing a piano. + components: + - type: Flatpack + entity: PianoInstrument + +- type: entity + parent: InstrumentFlatpack + id: UprightPianoFlatpack + name: upright piano flatpack + description: A flatpack used for constructing an upright piano. + components: + - type: Flatpack + entity: UprightPianoInstrument + +- type: entity + parent: InstrumentFlatpack + id: VibraphoneFlatpack + name: vibraphone flatpack + description: A flatpack used for constructing a vibraphone. + components: + - type: Flatpack + entity: VibraphoneInstrument + +- type: entity + parent: InstrumentFlatpack + id: MarimbaFlatpack + name: marimba flatpack + description: A flatpack used for constructing a marimba. + components: + - type: Flatpack + entity: MarimbaInstrument + +- type: entity + parent: InstrumentFlatpack + id: ChurchOrganFlatpack + name: church organ flatpack + description: A flatpack used for constructing a church organ. + components: + - type: Flatpack + entity: ChurchOrganInstrument + +- type: entity + parent: InstrumentFlatpack + id: TubaFlatpack + name: tuba flatpack + description: A flatpack used for constructing a tuba. + components: + - type: Flatpack + entity: TubaInstrument + +- type: entity + parent: InstrumentFlatpack + id: HarpFlatpack + name: harp flatpack + description: A flatpack used for constructing a harp. + components: + - type: Flatpack + entity: HarpInstrument + +- type: entity + parent: InstrumentFlatpack + id: TimpaniFlatpack + name: timpani flatpack + description: A flatpack used for constructing a timpani. + components: + - type: Flatpack + entity: TimpaniInstrument + +- type: entity + parent: InstrumentFlatpack + id: TaikoFlatpack + name: taiko flatpack + description: A flatpack used for constructing a taiko. + components: + - type: Flatpack + entity: TaikoInstrument + +- type: entity + parent: InstrumentFlatpack + id: ContrabassFlatpack + name: contrabass flatpack + description: A flatpack used for constructing a contrabass. + components: + - type: Flatpack + entity: ContrabassInstrument + +- type: entity + parent: InstrumentFlatpack + id: MinimoogFlatpack + name: minimoog flatpack + description: A flatpack used for constructing a minimoog. + components: + - type: Flatpack + entity: MinimoogInstrument + +- type: entity + parent: InstrumentFlatpack + id: TomDrumsFlatpack + name: tom drums flatpack + description: A flatpack used for constructing a tom drums set. + components: + - type: Flatpack + entity: TomDrumsInstrument diff --git a/Resources/Prototypes/Entities/Objects/Devices/pda.yml b/Resources/Prototypes/Entities/Objects/Devices/pda.yml index ad8f3d5c71..3ff5a3955a 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/pda.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/pda.yml @@ -57,6 +57,7 @@ - idcard - Belt - type: UnpoweredFlashlight + - type: EtherealLight - type: PointLight enabled: false radius: 1.5 diff --git a/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_wind.yml b/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_wind.yml index e99f825d48..e37fbaa361 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_wind.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_wind.yml @@ -70,7 +70,7 @@ slots: - neck - type: ActivatableUI - inHandsOnly: false + inHandsOnly: false - type: Tag tags: - WoodwindInstrument diff --git a/Resources/Prototypes/Entities/Objects/Fun/pai.yml b/Resources/Prototypes/Entities/Objects/Fun/pai.yml index 1b9c5303c6..b73767fd81 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/pai.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/pai.yml @@ -72,6 +72,22 @@ Searching: { state: pai-searching-overlay } On: { state: pai-on-overlay } - type: StationMap + - type: LanguageKnowledge + speaks: + - TauCetiBasic + - SolCommon + - Tradeband + - Freespeak + - Elyran + - RobotTalk + understands: + - TauCetiBasic + - SolCommon + - Tradeband + - Freespeak + - Elyran + - RobotTalk + - Sign # It's intentional that they don't "Speak" sign language. - type: entity parent: PersonalAI diff --git a/Resources/Prototypes/Entities/Objects/Fun/prizeticket.yml b/Resources/Prototypes/Entities/Objects/Fun/prizeticket.yml index d6d86c08b2..19aa6a3015 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/prizeticket.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/prizeticket.yml @@ -285,6 +285,9 @@ - id: PetRock prob: 0.80 orGroup: Prize + - id: PlushieShadowkin + prob: 0.80 + orGroup: Prize # Uncommon - id: PrizeTicket60 prob: 0.50 diff --git a/Resources/Prototypes/Entities/Objects/Fun/toys.yml b/Resources/Prototypes/Entities/Objects/Fun/toys.yml index d7a5f3542d..fc771414b4 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/toys.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/toys.yml @@ -1954,4 +1954,14 @@ size: Ginormous sprite: Objects/Weapons/Melee/Throngler-in-hand.rsi - type: DisarmMalus - malus: 0 \ No newline at end of file + malus: 0 + +- type: entity + parent: BasePlushie + id: PlushieShadowkin + name: shadowkin plushie + description: A plushie of a Shadowkin. It's very soft. + components: + - type: Sprite + sprite: Objects/Fun/toys.rsi + state: shadowkin \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Objects/Materials/Sheets/glass.yml b/Resources/Prototypes/Entities/Objects/Materials/Sheets/glass.yml index 95100b340b..e318d7b188 100644 --- a/Resources/Prototypes/Entities/Objects/Materials/Sheets/glass.yml +++ b/Resources/Prototypes/Entities/Objects/Materials/Sheets/glass.yml @@ -93,10 +93,12 @@ Quantity: 10 - type: UserInterface interfaces: - enum.ShortConstructionUiKey.Key: - type: ShortConstructionMenuBUI + enum.RadialSelectorUiKey.Key: + type: RadialSelectorMenuBUI - type: ActivatableUI - key: enum.ShortConstructionUiKey.Key + key: enum.RadialSelectorUiKey.Key + inHandsOnly: true + requireActiveHand: false - type: ShortConstruction entries: - prototype: Window @@ -193,10 +195,12 @@ acts: [ "Destruction" ] - type: UserInterface interfaces: - enum.ShortConstructionUiKey.Key: - type: ShortConstructionMenuBUI + enum.RadialSelectorUiKey.Key: + type: RadialSelectorMenuBUI - type: ActivatableUI - key: enum.ShortConstructionUiKey.Key + key: enum.RadialSelectorUiKey.Key + inHandsOnly: true + requireActiveHand: false - type: ShortConstruction entries: - prototype: SheetRPGlass1 @@ -283,10 +287,12 @@ acts: [ "Destruction" ] - type: UserInterface interfaces: - enum.ShortConstructionUiKey.Key: - type: ShortConstructionMenuBUI + enum.RadialSelectorUiKey.Key: + type: RadialSelectorMenuBUI - type: ActivatableUI - key: enum.ShortConstructionUiKey.Key + key: enum.RadialSelectorUiKey.Key + inHandsOnly: true + requireActiveHand: false - type: ShortConstruction entries: - prototype: SheetRPGlass0 @@ -361,10 +367,12 @@ canReact: false - type: UserInterface interfaces: - enum.ShortConstructionUiKey.Key: - type: ShortConstructionMenuBUI + enum.RadialSelectorUiKey.Key: + type: RadialSelectorMenuBUI - type: ActivatableUI - key: enum.ShortConstructionUiKey.Key + key: enum.RadialSelectorUiKey.Key + inHandsOnly: true + requireActiveHand: false - type: ShortConstruction entries: - prototype: ReinforcedPlasmaWindow @@ -447,10 +455,12 @@ canReact: false - type: UserInterface interfaces: - enum.ShortConstructionUiKey.Key: - type: ShortConstructionMenuBUI + enum.RadialSelectorUiKey.Key: + type: RadialSelectorMenuBUI - type: ActivatableUI - key: enum.ShortConstructionUiKey.Key + key: enum.RadialSelectorUiKey.Key + inHandsOnly: true + requireActiveHand: false - type: ShortConstruction entries: - prototype: SheetRUGlass0 @@ -513,10 +523,12 @@ canReact: false - type: UserInterface interfaces: - enum.ShortConstructionUiKey.Key: - type: ShortConstructionMenuBUI + enum.RadialSelectorUiKey.Key: + type: RadialSelectorMenuBUI - type: ActivatableUI - key: enum.ShortConstructionUiKey.Key + key: enum.RadialSelectorUiKey.Key + inHandsOnly: true + requireActiveHand: false - type: ShortConstruction entries: - prototype: ReinforcedUraniumWindow diff --git a/Resources/Prototypes/Entities/Objects/Materials/Sheets/metal.yml b/Resources/Prototypes/Entities/Objects/Materials/Sheets/metal.yml index 040c6c81b1..f486125ff6 100644 --- a/Resources/Prototypes/Entities/Objects/Materials/Sheets/metal.yml +++ b/Resources/Prototypes/Entities/Objects/Materials/Sheets/metal.yml @@ -71,10 +71,12 @@ Quantity: 1 - type: UserInterface interfaces: - enum.ShortConstructionUiKey.Key: - type: ShortConstructionMenuBUI + enum.RadialSelectorUiKey.Key: + type: RadialSelectorMenuBUI - type: ActivatableUI - key: enum.ShortConstructionUiKey.Key + key: enum.RadialSelectorUiKey.Key + inHandsOnly: true + requireActiveHand: false - type: ShortConstruction entries: - prototype: Girder @@ -283,10 +285,12 @@ canReact: false - type: UserInterface interfaces: - enum.ShortConstructionUiKey.Key: - type: ShortConstructionMenuBUI + enum.RadialSelectorUiKey.Key: + type: RadialSelectorMenuBUI - type: ActivatableUI - key: enum.ShortConstructionUiKey.Key + key: enum.RadialSelectorUiKey.Key + inHandsOnly: true + requireActiveHand: false - type: ShortConstruction entries: - prototype: SecureWindoor diff --git a/Resources/Prototypes/Entities/Objects/Materials/Sheets/other.yml b/Resources/Prototypes/Entities/Objects/Materials/Sheets/other.yml index 781f35417d..ae6770d631 100644 --- a/Resources/Prototypes/Entities/Objects/Materials/Sheets/other.yml +++ b/Resources/Prototypes/Entities/Objects/Materials/Sheets/other.yml @@ -112,10 +112,12 @@ - Sheet - type: UserInterface interfaces: - enum.ShortConstructionUiKey.Key: - type: ShortConstructionMenuBUI + enum.RadialSelectorUiKey.Key: + type: RadialSelectorMenuBUI - type: ActivatableUI - key: enum.ShortConstructionUiKey.Key + key: enum.RadialSelectorUiKey.Key + inHandsOnly: true + requireActiveHand: false - type: ShortConstruction entries: - prototype: SheetPGlass @@ -175,10 +177,12 @@ canReact: false - type: UserInterface interfaces: - enum.ShortConstructionUiKey.Key: - type: ShortConstructionMenuBUI + enum.RadialSelectorUiKey.Key: + type: RadialSelectorMenuBUI - type: ActivatableUI - key: enum.ShortConstructionUiKey.Key + key: enum.RadialSelectorUiKey.Key + inHandsOnly: true + requireActiveHand: false - type: ShortConstruction entries: - prototype: CratePlastic @@ -246,10 +250,12 @@ canReact: false - type: UserInterface interfaces: - enum.ShortConstructionUiKey.Key: - type: ShortConstructionMenuBUI + enum.RadialSelectorUiKey.Key: + type: RadialSelectorMenuBUI - type: ActivatableUI - key: enum.ShortConstructionUiKey.Key + key: enum.RadialSelectorUiKey.Key + inHandsOnly: true + requireActiveHand: false - type: ShortConstruction entries: - prototype: SheetUGlass diff --git a/Resources/Prototypes/Entities/Objects/Materials/bluespace.yml b/Resources/Prototypes/Entities/Objects/Materials/bluespace.yml index bc0ed8f03c..7af87ca40d 100644 --- a/Resources/Prototypes/Entities/Objects/Materials/bluespace.yml +++ b/Resources/Prototypes/Entities/Objects/Materials/bluespace.yml @@ -14,6 +14,10 @@ - type: PhysicalComposition materialComposition: Bluespace: 100 + - type: EmitSoundOnUse + sound: + collection: RadiationPulse + - type: EtherealStunItem - type: Tag tags: - BluespaceCrystal diff --git a/Resources/Prototypes/Entities/Objects/Materials/parts.yml b/Resources/Prototypes/Entities/Objects/Materials/parts.yml index 95640dbbb5..cfbb3ff386 100644 --- a/Resources/Prototypes/Entities/Objects/Materials/parts.yml +++ b/Resources/Prototypes/Entities/Objects/Materials/parts.yml @@ -70,10 +70,12 @@ Quantity: 0.5 - type: UserInterface interfaces: - enum.ShortConstructionUiKey.Key: - type: ShortConstructionMenuBUI + enum.RadialSelectorUiKey.Key: + type: RadialSelectorMenuBUI - type: ActivatableUI - key: enum.ShortConstructionUiKey.Key + key: enum.RadialSelectorUiKey.Key + inHandsOnly: true + requireActiveHand: false - type: ShortConstruction entries: - prototype: Grille diff --git a/Resources/Prototypes/Entities/Objects/Misc/fluff_lights.yml b/Resources/Prototypes/Entities/Objects/Misc/fluff_lights.yml index a02f94215b..8fc465f4fb 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/fluff_lights.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/fluff_lights.yml @@ -40,6 +40,7 @@ sprite: Objects/Misc/Lights/lights.rsi size: Normal heldPrefix: off + - type: EtherealLight - type: PointLight enabled: false radius: 3 diff --git a/Resources/Prototypes/Entities/Objects/Misc/kudzu.yml b/Resources/Prototypes/Entities/Objects/Misc/kudzu.yml index a100500494..838715f1da 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/kudzu.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/kudzu.yml @@ -25,8 +25,7 @@ - type: MeleeSound soundGroups: Brute: - path: - "/Audio/Weapons/slash.ogg" + path: "/Audio/Weapons/slash.ogg" - type: Sprite sprite: Objects/Misc/kudzu.rsi state: kudzu_11 @@ -38,21 +37,19 @@ fix1: hard: false density: 7 - shape: - !type:PhysShapeAabb + shape: !type:PhysShapeAabb bounds: "-0.5,-0.5,0.5,0.5" layer: - - MidImpassable + - MidImpassable - type: Damageable damageModifierSet: Wood - type: Destructible thresholds: - - trigger: - !type:DamageTrigger - damage: 10 - behaviors: - - !type:DoActsBehavior - acts: [ "Destruction" ] + - trigger: !type:DamageTrigger + damage: 10 + behaviors: + - !type:DoActsBehavior + acts: ["Destruction"] - type: Temperature heatDamage: types: @@ -69,14 +66,14 @@ Flammable: [Touch] Extinguish: [Touch] reactions: - - reagents: [WeedKiller, PlantBGone] - methods: [Touch] - effects: - - !type:HealthChange - scaleByQuantity: true - damage: - types: - Heat: 10 + - reagents: [WeedKiller, PlantBGone] + methods: [Touch] + effects: + - !type:HealthChange + scaleByQuantity: true + damage: + types: + Heat: 10 - type: AtmosExposed - type: Kudzu growthTickChance: 0.3 @@ -86,19 +83,19 @@ sprintSpeedModifier: 0.2 ignoreWhitelist: components: - - IgnoreKudzu + - IgnoreKudzu - type: Food requiredStomachs: 2 # ruminants have 4 stomachs but i dont care to give them literally 4 stomachs. 2 is good delay: 0.5 - type: FlavorProfile flavors: - - fiber + - fiber - type: SolutionContainerManager solutions: food: reagents: - - ReagentId: Nutriment - Quantity: 2 + - ReagentId: Nutriment + Quantity: 2 - type: entity id: WeakKudzu @@ -127,22 +124,22 @@ sprintSpeedModifier: 0.8 ignoreWhitelist: components: - - IgnoreKudzu + - IgnoreKudzu - type: RandomSpawner deleteSpawnerAfterSpawn: false rareChance: 0.15 offset: 0.2 chance: 0.05 prototypes: - - LightTree01 - - LightTree02 - - LightTree03 - - LightTree04 - - LightTree05 - - LightTree06 - - CrystalCyan + - LightTree01 + - LightTree02 + - LightTree03 + - LightTree04 + - LightTree05 + - LightTree06 + - CrystalCyan rarePrototypes: - - AnomalyFloraBulb + - AnomalyFloraBulb - type: entity id: KudzuFlowerAngry @@ -154,11 +151,11 @@ - type: RandomSpawner chance: 0.05 rarePrototypes: - - AnomalyFloraBulb - - AnomalyFloraBulb - - MobLuminousEntity - - MobLuminousObject - - MobLuminousPerson + - AnomalyFloraBulb + - AnomalyFloraBulb + - MobLuminousEntity + - MobLuminousObject + - MobLuminousPerson - type: entity id: FleshKudzu @@ -173,8 +170,7 @@ - type: MeleeSound soundGroups: Brute: - path: - "/Audio/Weapons/slash.ogg" + path: "/Audio/Weapons/slash.ogg" - type: Sprite sprite: Objects/Misc/fleshkudzu.rsi state: kudzu_11 @@ -186,20 +182,18 @@ fix1: hard: false density: 7 - shape: - !type:PhysShapeAabb + shape: !type:PhysShapeAabb bounds: "-0.5,-0.5,0.5,0.5" layer: - - MidImpassable + - MidImpassable - type: Damageable - type: Destructible thresholds: - - trigger: - !type:DamageTrigger - damage: 40 - behaviors: - - !type:DoActsBehavior - acts: [ "Destruction" ] + - trigger: !type:DamageTrigger + damage: 40 + behaviors: + - !type:DoActsBehavior + acts: ["Destruction"] - type: DamageContacts damage: types: @@ -207,7 +201,7 @@ Piercing: 1.5 ignoreWhitelist: tags: - - Flesh + - Flesh - type: Kudzu growthTickChance: 0.1 spreadChance: 0.4 @@ -232,23 +226,23 @@ - type: Flammable fireSpread: true damage: - types: - Heat: 3 + types: + Heat: 3 - type: AtmosExposed - type: SpeedModifierContacts walkSpeedModifier: 0.3 sprintSpeedModifier: 0.3 ignoreWhitelist: tags: - - Flesh + - Flesh - type: Food # delightfully devilish ! delay: 0.5 - type: SolutionContainerManager solutions: food: reagents: - - ReagentId: Protein - Quantity: 2 + - ReagentId: Protein + Quantity: 2 - type: Respirator damage: types: @@ -260,7 +254,7 @@ - type: entity name: dark haze id: ShadowKudzu - parent: [ BaseKudzu, BaseShadow ] + parent: [BaseKudzu, BaseShadow] components: - type: Physics canCollide: false @@ -269,9 +263,9 @@ drawdepth: Effects sprite: Effects/spookysmoke.rsi layers: - - state: spookysmoke - color: "#793a80dd" - map: [base] + - state: spookysmoke + color: "#793a80dd" + map: [base] - type: Kudzu growthTickChance: 0.2 spreadChance: 0.99 @@ -281,10 +275,10 @@ offset: 0.2 chance: 0.45 prototypes: - - ShadowBasaltRandom + - ShadowBasaltRandom rarePrototypes: - - ShadowPortal - - ShadowKudzuLootSpawner + - ShadowPortal + - ShadowKudzuLootSpawner - type: Tag tags: - HideContextMenu @@ -292,10 +286,10 @@ - type: OptionsVisualizer visuals: base: - - options: Default - data: { state: spookysmoke } - - options: ReducedMotion - data: { state: spookysmoke_static } + - options: Default + data: { state: spookysmoke } + - options: ReducedMotion + data: { state: spookysmoke_static } - type: entity name: Haze @@ -304,3 +298,18 @@ components: - type: Kudzu spreadChance: 0 #appears during pulsation. It shouldnt spreading. + +- type: entity + name: Shadowkin Haze + id: ShadowkinShadow + parent: ShadowKudzuWeak + components: + - type: RandomSpawner + deleteSpawnerAfterSpawn: false + rareChance: 0 + offset: 0.2 + chance: 0.45 + prototypes: + - ShadowBasaltRandom + - type: TimedDespawn + lifetime: 30 \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Objects/Specific/Chapel/bibles.yml b/Resources/Prototypes/Entities/Objects/Specific/Chapel/bibles.yml index 9a0709e8e7..23ce5a36ee 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Chapel/bibles.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Chapel/bibles.yml @@ -20,8 +20,6 @@ Burn: 10 - type: Prayable bibleUserOnly: true - - type: Summonable - specialItem: SpawnPointGhostRemilia - type: ReactionMixer mixMessage: "bible-mixing-success" reactionTypes: diff --git a/Resources/Prototypes/Entities/Objects/Specific/Mech/mechs.yml b/Resources/Prototypes/Entities/Objects/Specific/Mech/mechs.yml index dab6f9f20f..6b5c634e93 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Mech/mechs.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Mech/mechs.yml @@ -72,7 +72,7 @@ shape: !type:PhysShapeCircle radius: 0.45 - density: 1000 + density: 21390 # 15 Tonnes mask: - MobMask layer: diff --git a/Resources/Prototypes/Entities/Objects/Tools/flashlights.yml b/Resources/Prototypes/Entities/Objects/Tools/flashlights.yml index 2a982ed6f7..cbb5dfee0a 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/flashlights.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/flashlights.yml @@ -65,6 +65,7 @@ - type: Item sprite: Objects/Tools/flashlight.rsi storedRotation: -90 + - type: EtherealLight - type: PointLight enabled: false mask: /Textures/Effects/LightMasks/cone.png diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/base_wieldable.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/base_wieldable.yml index cf858e1737..690658d0c7 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/base_wieldable.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/base_wieldable.yml @@ -4,6 +4,7 @@ abstract: true components: - type: Wieldable + unwieldOnUse: false - type: GunWieldBonus minAngle: -20 maxAngle: -30 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml index 7c281e1386..8f062a8620 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml @@ -275,7 +275,7 @@ description: One of the many weapons belonging to the Head of Security's private collection. This pistol is engraved with the words, "Forgive Us, Mother Sol'" components: - type: StealTarget - stealGroup: WeaponPulsePistolHoS + stealGroup: HoSAntiqueWeapon - type: entity name: pulse carbine diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml index 1fe6ab10a9..9657a8cf68 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml @@ -65,6 +65,7 @@ - type: Appearance - type: StaticPrice price: 500 + - type: AmmoCounter - type: entity name: viper diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/hitscan.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/hitscan.yml index 3f37d308db..94cac9bcec 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/hitscan.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/hitscan.yml @@ -138,3 +138,20 @@ impactFlash: sprite: Objects/Weapons/Guns/Projectiles/projectiles.rsi state: impact_beam_heavy2 + +# Glimmer wisp laser +- type: hitscan + id: WispLash + damage: + types: + Cold: 8 + Shock: 8 + muzzleFlash: + sprite: Objects/Weapons/Guns/Projectiles/projectiles.rsi + state: muzzle_omni + travelFlash: + sprite: Objects/Weapons/Guns/Projectiles/projectiles.rsi + state: beam_omni + impactFlash: + sprite: Objects/Weapons/Guns/Projectiles/projectiles.rsi + state: impact_omni diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml index 6abece7bc3..b448ddea3e 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml @@ -81,7 +81,7 @@ - type: entity name: C-20r sub machine gun - parent: BaseWeaponSubMachineGun + parent: [BaseWeaponSubMachineGun, BaseGunWieldable] id: WeaponSubMachineGunC20r description: Manufactured by Cybersun-Armaments, the C-20r is one of the most popular personal small-arms in the Coalition of Colonies. Uses .35 auto ammo. components: @@ -100,7 +100,7 @@ maxAngle: -16 - type: Gun minAngle: 21 - maxAngle: 32 + maxAngle: 32 shotsPerBurst: 5 availableModes: - SemiAuto @@ -124,11 +124,11 @@ description: This heavily worn submachine gun is engraved with the words, "Remember Mars". components: - type: StealTarget - stealGroup: WeaponSubMachineGunC20rHoS + stealGroup: HoSAntiqueWeapon - type: entity name: Drozd - parent: BaseWeaponSubMachineGun + parent: [BaseWeaponSubMachineGun, BaseGunWieldable] id: WeaponSubMachineGunDrozd description: An excellent fully automatic Heavy SMG. components: @@ -294,7 +294,7 @@ description: A prized possession of the station's Head of Security. The smell of dried blood lingers on this weapon's muzzle. A small torch with 24 stars surrounding it has been engraved on the grip. components: - type: StealTarget - stealGroup: WeaponSubMachineGunWt550HoS + stealGroup: HoSAntiqueWeapon # Rubber - type: entity diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml index 72154621e8..44ee4a08c1 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml @@ -110,7 +110,7 @@ description: This is a seemingly ordinary shotgun, no different from those issued as standard in the Republic of Biesel Navy. A close inspection reveals that this weapon's serial number is 000000013. components: - type: StealTarget - stealGroup: WeaponShotgunBulldogHoS + stealGroup: HoSAntiqueWeapon - type: entity name: double-barreled shotgun @@ -185,7 +185,7 @@ - type: Sprite sprite: DeltaV/Objects/Weapons/Guns/Shotguns/pump.rsi - type: Clothing - sprite: DeltaV/Objects/Weapons/Guns/Shotguns/pump.rsi + sprite: Objects/Weapons/Guns/Shotguns/pump.rsi - type: GunRequiresWield #remove when inaccuracy on spreads is fixed - type: BallisticAmmoProvider capacity: 4 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml index c29a4ae3e7..37b2b03d9e 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml @@ -94,7 +94,7 @@ colorOptions: - "#00CCFF" - type: StealTarget - stealGroup: EnergySwordHoS + stealGroup: HoSAntiqueWeapon - type: entity name: pen diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/telescopic_baton.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/telescopic_baton.yml new file mode 100644 index 0000000000..5e797c8536 --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/telescopic_baton.yml @@ -0,0 +1,71 @@ +- type: entity + id: TelescopicBaton + parent: BaseItem + name: telescopic baton + description: A compact and harmless personal defense weapon. Sturdy enough to knock the feet out from under attackers. + components: + - type: Sprite + sprite: Objects/Weapons/Melee/telebaton.rsi + layers: + - state: icon + map: [ "enum.TelescopicBatonVisuals.Layer" ] + - type: Item + size: Small + - type: ItemToggle + soundActivate: + path: /Audio/Weapons/telescopicon.ogg + params: + volume: -2 + soundDeactivate: + path: /Audio/Weapons/telescopicoff.ogg + params: + volume: -2 + - type: ItemToggleDisarmMalus + activatedDisarmMalus: 0.6 + - type: ItemToggleMeleeWeapon + activatedDamage: + types: + Blunt: 12 + - type: ItemToggleSize + activatedSize: Normal + - type: UseDelay + delay: 2 + - type: TelescopicBaton + - type: KnockdownOnHit + duration: 1.5 + dropHeldItemsBehavior: NoDrop + - type: MeleeWeapon + attackRate: 0.8 + bluntStaminaDamageFactor: 1.5 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 5 + maxTargets: 1 + angle: 40 + damage: + types: + Blunt: 1 + - type: Appearance + - type: GenericVisualizer + visuals: + enum.TelescopicBatonVisuals.State: + enum.TelescopicBatonVisuals.Layer: + True: { state: icon } + False: { state: icon-off } + +- type: entity + parent: TelescopicBaton + id: TelescopicBatonAdmeme + name: robust telescopic baton + description: A compact and HARMFUL personal defense weapon. Sturdy enough to break legs of the attackers, making them unable to walk again. + suffix: admeme, DO NOT MAP + components: + - type: TelescopicBaton + attackTimeframe: 300 # one minute after activation + - type: KnockdownOnHit + duration: 60 # + - type: MeleeWeapon + attackRate: 1.2 + - type: ItemToggleMeleeWeapon + activatedDamage: + types: + Blunt: 20 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/bola.yml b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/bola.yml index ca3edf68c0..7bbd0fe893 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/bola.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/bola.yml @@ -1,8 +1,9 @@ - type: entity name: bola + abstract: true + id: BaseBola parent: BaseItem - id: Bola - description: Linked together with some spare cuffs and metal. + description: High velocity entanglement tool. components: - type: Item size: Normal @@ -13,6 +14,25 @@ sound: /Audio/Weapons/bolathrow.ogg - type: EmitSoundOnLand sound: /Audio/Effects/snap.ogg + - type: DamageOnLand + damage: + types: + Blunt: 5 + - type: Ensnaring + freeTime: 2.0 + breakoutTime: 3.5 + walkSpeed: 0.7 + sprintSpeed: 0.7 + staminaDamage: 55 + canThrowTrigger: true + canMoveBreakout: true + +- type: entity + name: bola + parent: [BaseBola] + id: Bola + description: Linked together with some spare cuffs and metal. + components: - type: Construction graph: Bola node: bola @@ -35,16 +55,18 @@ collection: MetalBreak - !type:DoActsBehavior acts: [ "Destruction" ] + +- type: entity + name: energy bola + id: BolaEnergy + parent: BaseBola + description: An advanced hardlight criminal entangling tool. Otherwise known as an expensive piece of string. + components: + - type: Sprite + sprite: Objects/Weapons/Throwable/energy_bola.rsi - type: DamageOnLand damage: types: - Blunt: 5 + Heat: 5 - type: Ensnaring - freeTime: 2.0 - breakoutTime: 3.5 #all bola should generally be fast to remove - walkSpeed: 0.7 #makeshift bola shouldn't slow too much - sprintSpeed: 0.7 - staminaDamage: 55 # Sudden weight increase sapping stamina - canThrowTrigger: true - canMoveBreakout: true - + destroyOnRemove: true diff --git a/Resources/Prototypes/Entities/Structures/Furniture/altar.yml b/Resources/Prototypes/Entities/Structures/Furniture/altar.yml index 117967ef30..1153d5b7cc 100644 --- a/Resources/Prototypes/Entities/Structures/Furniture/altar.yml +++ b/Resources/Prototypes/Entities/Structures/Furniture/altar.yml @@ -25,8 +25,14 @@ - TableLayer - type: Sprite snapCardinals: true - - type: Climbable - type: Clickable + - type: SacrificialAltar + - type: Strap + position: Down + rotation: -90 + - type: GuideHelp + guides: + - AltarsGolemancy - type: entity id: AltarNanotrasen diff --git a/Resources/Prototypes/Entities/Structures/Lighting/base_lighting.yml b/Resources/Prototypes/Entities/Structures/Lighting/base_lighting.yml index 6b301a50ee..c6c55a916c 100644 --- a/Resources/Prototypes/Entities/Structures/Lighting/base_lighting.yml +++ b/Resources/Prototypes/Entities/Structures/Lighting/base_lighting.yml @@ -31,6 +31,7 @@ state: glow shader: unshaded state: base + - type: EtherealLight - type: PointLight color: "#FFE4CE" # 5000K color temp energy: 0.8 diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml index 35434003d2..72c6dc3743 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml @@ -806,11 +806,14 @@ - WeaponLaserCarbinePractice - Zipties - ShockCollar + - ShadowkinRestraints + # DeltaV - .38 special ammo - Add various .38 special ammo to security techfab - MagazineBoxSpecial - MagazineBoxSpecialPractice - SpeedLoaderSpecial - MagazinePistolSpecial dynamicRecipes: + - BolaEnergy - BoxBeanbag - BoxShotgunIncendiary - BoxShotgunUranium @@ -1398,6 +1401,7 @@ staticRecipes: - PrizeBall - PlushieMothRandom + - PlushieShadowkin - PlushieMothMusician - PlushieMothBartender - PlushieBee diff --git a/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml b/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml index e98b40b9a0..c79cfa2641 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml @@ -86,6 +86,7 @@ - type: Electrified enabled: false usesApcPower: true + - type: EtherealLight - type: PointLight enabled: false castShadows: false diff --git a/Resources/Prototypes/Guidebook/science.yml b/Resources/Prototypes/Guidebook/science.yml index a3f3f71ec3..56363a6a92 100644 --- a/Resources/Prototypes/Guidebook/science.yml +++ b/Resources/Prototypes/Guidebook/science.yml @@ -8,8 +8,9 @@ - Xenoarchaeology - Robotics - MachineUpgrading - # - AltarsGolemancy # When it's added # Nyanotrasen - Golemancy guidebook - - ReverseEngineering # Nyanotrasen - Reverse Engineering guidebook + - AltarsGolemancy + - ReverseEngineering + - GlimmerCreatures - type: guideEntry id: Technologies @@ -68,3 +69,8 @@ id: Cyborgs name: guide-entry-cyborgs text: "/ServerInfo/Guidebook/Science/Cyborgs.xml" + +- type: guideEntry + id: GlimmerCreatures + name: guide-entry-glimmer-creatures + text: /ServerInfo/Guidebook/DeltaV/Epistemics/GlimmerCreatures.xml diff --git a/Resources/Prototypes/Guidebook/species.yml b/Resources/Prototypes/Guidebook/species.yml index d9d039ea43..f7b77b7ec6 100644 --- a/Resources/Prototypes/Guidebook/species.yml +++ b/Resources/Prototypes/Guidebook/species.yml @@ -12,6 +12,7 @@ - SlimePerson - IPCs - Harpy + - Shadowkin - type: guideEntry id: Arachnid @@ -56,4 +57,9 @@ - type: guideEntry id: Harpy name: species-name-harpy - text: "/ServerInfo/Guidebook/Mobs/Harpy.xml" \ No newline at end of file + text: "/ServerInfo/Guidebook/Mobs/Harpy.xml" + +- type: guideEntry + id: Shadowkin + name: species-name-shadowkin + text: "/ServerInfo/Guidebook/Mobs/Shadowkin.xml" diff --git a/Resources/Prototypes/Language/Species-Specific/marish.yml b/Resources/Prototypes/Language/Species-Specific/marish.yml new file mode 100644 index 0000000000..872d67373d --- /dev/null +++ b/Resources/Prototypes/Language/Species-Specific/marish.yml @@ -0,0 +1,20 @@ +# Spoken by shadowkins. +- type: language + id: Marish + speech: + color: "#be3cc5" + fontId: Lymphatic + empathySpeech: true + speechVerbOverrides: + - chat-speech-verb-marish + obfuscation: + !type:SyllableObfuscation + minSyllables: 1 # Replacements are really short + maxSyllables: 2 + replacement: + - mar + - mwrrr + - maaAr + - aarrr + - wrurrl + - mmar \ No newline at end of file diff --git a/Resources/Prototypes/Loadouts/Categories/categories.yml b/Resources/Prototypes/Loadouts/Categories/categories.yml index c47d6ddef8..bfda095b19 100644 --- a/Resources/Prototypes/Loadouts/Categories/categories.yml +++ b/Resources/Prototypes/Loadouts/Categories/categories.yml @@ -68,6 +68,7 @@ - JobsServiceBotanist - JobsServiceChef - JobsServiceJanitor + - JobsServiceMusician - type: loadoutCategory id: JobsServiceUncategorized @@ -84,6 +85,9 @@ - type: loadoutCategory id: JobsServiceJanitor +- type: loadoutCategory + id: JobsServiceMusician + - type: loadoutCategory id: Mask root: true diff --git a/Resources/Prototypes/Loadouts/Jobs/Heads/command.yml b/Resources/Prototypes/Loadouts/Jobs/Heads/command.yml index bf45fb6ed7..ccc791460b 100644 --- a/Resources/Prototypes/Loadouts/Jobs/Heads/command.yml +++ b/Resources/Prototypes/Loadouts/Jobs/Heads/command.yml @@ -10,3 +10,15 @@ - Captain items: - ClothingHandsGlovesInspection + +- type: loadout + id: LoadoutCommandTelescopicBaton + category: JobsCommand + cost: 3 + exclusive: true + requirements: + - !type:CharacterDepartmentRequirement + departments: + - Command + items: + - TelescopicBaton diff --git a/Resources/Prototypes/Loadouts/Jobs/Service/musician.yml b/Resources/Prototypes/Loadouts/Jobs/Service/musician.yml new file mode 100644 index 0000000000..5bf5471697 --- /dev/null +++ b/Resources/Prototypes/Loadouts/Jobs/Service/musician.yml @@ -0,0 +1,554 @@ +# Musician +# Musician Instruments +# Brass Instruments +- type: loadout + id: LoadoutItemTrumpetInstrumentMusician + category: JobsServiceMusician + cost: 0 + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutMusicianInstruments + - !type:CharacterJobRequirement + jobs: + - Musician + items: + - TrumpetInstrument + +- type: loadout + id: LoadoutItemTromboneInstrumentMusician + category: JobsServiceMusician + cost: 0 + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutMusicianInstruments + - !type:CharacterJobRequirement + jobs: + - Musician + items: + - TromboneInstrument + +- type: loadout + id: LoadoutItemFrenchHornInstrumentMusician + category: JobsServiceMusician + cost: 0 + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutMusicianInstruments + - !type:CharacterJobRequirement + jobs: + - Musician + items: + - FrenchHornInstrument + +- type: loadout + id: LoadoutItemEuphoniumInstrumentMusician + category: JobsServiceMusician + cost: 0 + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutMusicianInstruments + - !type:CharacterJobRequirement + jobs: + - Musician + items: + - EuphoniumInstrument + +# Misc Instruments +- type: loadout + id: LoadoutItemSeashellInstrumentMusician + category: JobsServiceMusician + cost: 0 + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutMusicianInstruments + - !type:CharacterJobRequirement + jobs: + - Musician + items: + - SeashellInstrument + +- type: loadout + id: LoadoutItemBirdToyInstrumentMusician + category: JobsServiceMusician + cost: 0 + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutMusicianInstruments + - !type:CharacterJobRequirement + jobs: + - Musician + items: + - BirdToyInstrument + # After this are some instruments like "Phone, Helicopter, and Canned Aplause. I leave those to the Clown + +# Percussion +- type: loadout + id: LoadoutItemGlockenspielInstrumentMusician + category: JobsServiceMusician + cost: 0 + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutMusicianInstruments + - !type:CharacterJobRequirement + jobs: + - Musician + items: + - GlockenspielInstrument + +- type: loadout + id: LoadoutItemMusicBoxInstrumentMusician + category: JobsServiceMusician + cost: 0 + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutMusicianInstruments + - !type:CharacterJobRequirement + jobs: + - Musician + items: + - MusicBoxInstrument + +- type: loadout + id: LoadoutItemXylophoneInstrumentMusician + category: JobsServiceMusician + cost: 0 + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutMusicianInstruments + - !type:CharacterJobRequirement + jobs: + - Musician + items: + - XylophoneInstrument + +- type: loadout + id: LoadoutItemMicrophoneInstrumentMusician + category: JobsServiceMusician + cost: 0 + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutMusicianInstruments + - !type:CharacterJobRequirement + jobs: + - Musician + items: + - MicrophoneInstrument + +- type: loadout + id: LoadoutItemSynthesizerInstrumentMusician + category: JobsServiceMusician + cost: 0 + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutMusicianInstruments + - !type:CharacterJobRequirement + jobs: + - Musician + items: + - SynthesizerInstrument + +- type: loadout + id: LoadoutItemKalimbaInstrumentMusician + category: JobsServiceMusician + cost: 0 + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutMusicianInstruments + - !type:CharacterJobRequirement + jobs: + - Musician + items: + - KalimbaInstrument + +- type: loadout + id: LoadoutItemWoodblockInstrumentMusician + category: JobsServiceMusician + cost: 0 + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutMusicianInstruments + - !type:CharacterJobRequirement + jobs: + - Musician + items: + - WoodblockInstrument + +# Stringed Instruments +- type: loadout + id: LoadoutItemElectricGuitarInstrumentMusician + category: JobsServiceMusician + cost: 0 + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutMusicianInstruments + - !type:CharacterJobRequirement + jobs: + - Musician + items: + - ElectricGuitarInstrument + +- type: loadout + id: LoadoutItemBassGuitarInstrumentMusician + category: JobsServiceMusician + cost: 0 + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutMusicianInstruments + - !type:CharacterJobRequirement + jobs: + - Musician + items: + - BassGuitarInstrument + +- type: loadout + id: LoadoutItemRockGuitarInstrumentMusician + category: JobsServiceMusician + cost: 0 + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutMusicianInstruments + - !type:CharacterJobRequirement + jobs: + - Musician + items: + - RockGuitarInstrument + +- type: loadout + id: LoadoutItemAcousticGuitarInstrumentMusician + category: JobsServiceMusician + cost: 0 + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutMusicianInstruments + - !type:CharacterJobRequirement + jobs: + - Musician + items: + - AcousticGuitarInstrument + +- type: loadout + id: LoadoutItemBanjoInstrumentMusician + category: JobsServiceMusician + cost: 0 + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutMusicianInstruments + - !type:CharacterJobRequirement + jobs: + - Musician + items: + - BanjoInstrument + +- type: loadout + id: LoadoutItemViolinInstrumentMusician + category: JobsServiceMusician + cost: 0 + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutMusicianInstruments + - !type:CharacterJobRequirement + jobs: + - Musician + items: + - ViolinInstrument + +- type: loadout + id: LoadoutItemViolaInstrumentMusician + category: JobsServiceMusician + cost: 0 + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutMusicianInstruments + - !type:CharacterJobRequirement + jobs: + - Musician + items: + - ViolaInstrument + +- type: loadout + id: LoadoutItemCelloInstrumentMusician + category: JobsServiceMusician + cost: 0 + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutMusicianInstruments + - !type:CharacterJobRequirement + jobs: + - Musician + items: + - CelloInstrument + +# Structure Instruments +- type: loadout + id: LoadoutItemPianoInstrumentMusician + category: JobsServiceMusician + cost: 0 + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutMusicianInstruments + - !type:CharacterJobRequirement + jobs: + - Musician + items: + - PianoFlatpack + +- type: loadout + id: LoadoutItemUprightPianoInstrumentMusician + category: JobsServiceMusician + cost: 0 + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutMusicianInstruments + - !type:CharacterJobRequirement + jobs: + - Musician + items: + - UprightPianoFlatpack + +- type: loadout + id: LoadoutItemVibraphoneInstrumentMusician + category: JobsServiceMusician + cost: 0 + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutMusicianInstruments + - !type:CharacterJobRequirement + jobs: + - Musician + items: + - VibraphoneFlatpack + +- type: loadout + id: LoadoutItemMarimbaInstrumentMusician + category: JobsServiceMusician + cost: 0 + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutMusicianInstruments + - !type:CharacterJobRequirement + jobs: + - Musician + items: + - MarimbaFlatpack + +- type: loadout + id: LoadoutItemChurchOrganInstrumentMusician + category: JobsServiceMusician + cost: 0 + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutMusicianInstruments + - !type:CharacterJobRequirement + jobs: + - Musician + items: + - ChurchOrganFlatpack + +- type: loadout + id: LoadoutItemTubaInstrumentMusician + category: JobsServiceMusician + cost: 0 + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutMusicianInstruments + - !type:CharacterJobRequirement + jobs: + - Musician + items: + - TubaFlatpack + +- type: loadout + id: LoadoutItemHarpInstrumentMusician + category: JobsServiceMusician + cost: 0 + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutMusicianInstruments + - !type:CharacterJobRequirement + jobs: + - Musician + items: + - HarpFlatpack + +- type: loadout + id: LoadoutItemTimpaniInstrumentMusician + category: JobsServiceMusician + cost: 0 + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutMusicianInstruments + - !type:CharacterJobRequirement + jobs: + - Musician + items: + - TimpaniFlatpack + +- type: loadout + id: LoadoutItemTaikoInstrumentMusician + category: JobsServiceMusician + cost: 0 + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutMusicianInstruments + - !type:CharacterJobRequirement + jobs: + - Musician + items: + - TaikoFlatpack + +- type: loadout + id: LoadoutItemContrabassInstrumentMusician + category: JobsServiceMusician + cost: 0 + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutMusicianInstruments + - !type:CharacterJobRequirement + jobs: + - Musician + items: + - ContrabassFlatpack + +- type: loadout + id: LoadoutItemMinimoogInstrumentMusician + category: JobsServiceMusician + cost: 0 + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutMusicianInstruments + - !type:CharacterJobRequirement + jobs: + - Musician + items: + - MinimoogFlatpack + +- type: loadout + id: LoadoutItemTomDrumsInstrumentMusician + category: JobsServiceMusician + cost: 0 + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutMusicianInstruments + - !type:CharacterJobRequirement + jobs: + - Musician + items: + - TomDrumsFlatpack + +# Wind Instruments +- type: loadout + id: LoadoutItemSaxophoneInstrumentMusician + category: JobsServiceMusician + cost: 0 + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutMusicianInstruments + - !type:CharacterJobRequirement + jobs: + - Musician + items: + - SaxophoneInstrument + +- type: loadout + id: LoadoutItemAccordionInstrumentMusician + category: JobsServiceMusician + cost: 0 + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutMusicianInstruments + - !type:CharacterJobRequirement + jobs: + - Musician + items: + - AccordionInstrument + +- type: loadout + id: LoadoutItemHarmonicaInstrumentMusician + category: JobsServiceMusician + cost: 0 + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutMusicianInstruments + - !type:CharacterJobRequirement + jobs: + - Musician + items: + - HarmonicaInstrument + +- type: loadout + id: LoadoutItemClarinetInstrumentMusician + category: JobsServiceMusician + cost: 0 + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutMusicianInstruments + - !type:CharacterJobRequirement + jobs: + - Musician + items: + - ClarinetInstrument + +- type: loadout + id: LoadoutItemFluteInstrumentMusician + category: JobsServiceMusician + cost: 0 + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutMusicianInstruments + - !type:CharacterJobRequirement + jobs: + - Musician + items: + - FluteInstrument + +- type: loadout + id: LoadoutItemRecorderInstrumentMusician + category: JobsServiceMusician + cost: 0 + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutMusicianInstruments + - !type:CharacterJobRequirement + jobs: + - Musician + items: + - RecorderInstrument + +- type: loadout + id: LoadoutItemPanFluteInstrumentMusician + category: JobsServiceMusician + cost: 0 + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutMusicianInstruments + - !type:CharacterJobRequirement + jobs: + - Musician + items: + - PanFluteInstrument + +- type: loadout + id: LoadoutItemOcarinaInstrumentMusician + category: JobsServiceMusician + cost: 0 + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutMusicianInstruments + - !type:CharacterJobRequirement + jobs: + - Musician + items: + - OcarinaInstrument + +- type: loadout + id: LoadoutItemBagpipeInstrumentMusician + category: JobsServiceMusician + cost: 0 + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutMusicianInstruments + - !type:CharacterJobRequirement + jobs: + - Musician + items: + - BagpipeInstrument diff --git a/Resources/Prototypes/Loadouts/Jobs/science.yml b/Resources/Prototypes/Loadouts/Jobs/science.yml index 198d7f9cc6..3f376ec872 100644 --- a/Resources/Prototypes/Loadouts/Jobs/science.yml +++ b/Resources/Prototypes/Loadouts/Jobs/science.yml @@ -625,4 +625,89 @@ jobs: - Librarian items: - - ClothingUniformJumpsuitLibrarianZeng \ No newline at end of file + - ClothingUniformJumpsuitLibrarianZeng + +- type: loadout + id: LoadoutScienceJumpsuitLibrarian + category: JobsScience + cost: 0 + exclusive: true + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutCataloguerUniforms + - !type:CharacterJobRequirement + jobs: + - Librarian + items: + - ClothingUniformJumpsuitLibrarian + +- type: loadout + id: LoadoutScienceJumpskirtLibrarian + category: JobsScience + cost: 0 + exclusive: true + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutCataloguerUniforms + - !type:CharacterJobRequirement + jobs: + - Librarian + items: + - ClothingUniformJumpskirtLibrarian + +# Chaplain +- type: loadout + id: LoadoutChaplainJumpsuit + category: JobsScience + cost: 0 + exclusive: true + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutChaplainUniforms + - !type:CharacterJobRequirement + jobs: + - Chaplain + items: + - ClothingUniformJumpsuitChaplain + +- type: loadout + id: LoadoutChaplainJumpskirt + category: JobsScience + cost: 0 + exclusive: true + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutChaplainUniforms + - !type:CharacterJobRequirement + jobs: + - Chaplain + items: + - ClothingUniformJumpskirtChaplain + +- type: loadout + id: LoadoutChaplainBible + category: JobsScience + cost: 0 + exclusive: true + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutChaplainEquipment + - !type:CharacterJobRequirement + jobs: + - Chaplain + items: + - Bible + +- type: loadout + id: LoadoutChaplainStamp + category: JobsScience + cost: 0 + exclusive: true + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutChaplainEquipment + - !type:CharacterJobRequirement + jobs: + - Chaplain + items: + - RubberStampChaplain diff --git a/Resources/Prototypes/Loadouts/Jobs/service.yml b/Resources/Prototypes/Loadouts/Jobs/service.yml index b346bc3182..c0f04ef151 100644 --- a/Resources/Prototypes/Loadouts/Jobs/service.yml +++ b/Resources/Prototypes/Loadouts/Jobs/service.yml @@ -658,176 +658,6 @@ items: - ClothingUniformJumpskirtDetective -# Musician -- type: loadout - id: LoadoutItemSynthesizerInstrumentMusician - category: JobsServiceUncategorized - cost: 2 - requirements: - - !type:CharacterItemGroupRequirement - group: LoadoutMusicianInstruments - - !type:CharacterJobRequirement - jobs: - - Musician - items: - - SynthesizerInstrument - -- type: loadout - id: LoadoutItemMicrophoneInstrumentMusician - category: JobsServiceUncategorized - cost: 0 - requirements: - - !type:CharacterItemGroupRequirement - group: LoadoutMusicianInstruments - - !type:CharacterJobRequirement - jobs: - - Musician - items: - - MicrophoneInstrument - -- type: loadout - id: LoadoutItemKalimbaInstrumentMusician - category: Items - cost: 0 - requirements: - - !type:CharacterItemGroupRequirement - group: LoadoutMusicianInstruments - - !type:CharacterJobRequirement - jobs: - - Musician - items: - - KalimbaInstrument - -- type: loadout - id: LoadoutItemTrumpetInstrumentMusician - category: Items - cost: 2 - requirements: - - !type:CharacterItemGroupRequirement - group: LoadoutMusicianInstruments - - !type:CharacterJobRequirement - jobs: - - Musician - items: - - TrumpetInstrument - -- type: loadout - id: LoadoutItemElectricGuitarInstrumentMusician - category: Items - cost: 2 - requirements: - - !type:CharacterItemGroupRequirement - group: LoadoutMusicianInstruments - - !type:CharacterJobRequirement - jobs: - - Musician - items: - - ElectricGuitarInstrument - -- type: loadout - id: LoadoutItemBassGuitarInstrumentMusician - category: Items - cost: 2 - requirements: - - !type:CharacterItemGroupRequirement - group: LoadoutMusicianInstruments - - !type:CharacterJobRequirement - jobs: - - Musician - items: - - BassGuitarInstrument - -- type: loadout - id: LoadoutItemRockGuitarInstrumentMusician - category: Items - cost: 2 - requirements: - - !type:CharacterItemGroupRequirement - group: LoadoutMusicianInstruments - - !type:CharacterJobRequirement - jobs: - - Musician - items: - - RockGuitarInstrument - -- type: loadout - id: LoadoutItemAcousticGuitarInstrumentMusician - category: Items - cost: 2 - requirements: - - !type:CharacterItemGroupRequirement - group: LoadoutMusicianInstruments - - !type:CharacterJobRequirement - jobs: - - Musician - items: - - AcousticGuitarInstrument - -- type: loadout - id: LoadoutItemViolinInstrumentMusician - category: Items - cost: 2 - requirements: - - !type:CharacterItemGroupRequirement - group: LoadoutMusicianInstruments - - !type:CharacterJobRequirement - jobs: - - Musician - items: - - ViolinInstrument - -- type: loadout - id: LoadoutItemHarmonicaInstrumentMusician - category: Items - cost: 0 - requirements: - - !type:CharacterItemGroupRequirement - group: LoadoutMusicianInstruments - - !type:CharacterJobRequirement - jobs: - - Musician - items: - - HarmonicaInstrument - -- type: loadout - id: LoadoutItemAccordionInstrumentMusician - category: Items - cost: 0 - requirements: - - !type:CharacterItemGroupRequirement - group: LoadoutMusicianInstruments - - !type:CharacterJobRequirement - jobs: - - Musician - items: - - AccordionInstrument - -- type: loadout - id: LoadoutItemFluteInstrumentMusician - category: Items - cost: 0 - requirements: - - !type:CharacterItemGroupRequirement - group: LoadoutMusicianInstruments - - !type:CharacterJobRequirement - jobs: - - Musician - items: - - FluteInstrument - -- type: loadout - id: LoadoutItemOcarinaInstrumentMusician - category: Items - cost: 0 - requirements: - - !type:CharacterItemGroupRequirement - group: LoadoutMusicianInstruments - - !type:CharacterJobRequirement - jobs: - - Musician - items: - - OcarinaInstrument - # Chef - type: loadout id: LoadoutServiceJumpsuitChefNt @@ -996,4 +826,4 @@ jobs: - Janitor items: - - ClothingUniformJumpsuitJanitorOrion \ No newline at end of file + - ClothingUniformJumpsuitJanitorOrion diff --git a/Resources/Prototypes/Maps/asterisk.yml b/Resources/Prototypes/Maps/asterisk.yml index cf57fa2725..3ef57dd490 100644 --- a/Resources/Prototypes/Maps/asterisk.yml +++ b/Resources/Prototypes/Maps/asterisk.yml @@ -8,8 +8,6 @@ Asterisk: stationProto: StandardNanotrasenStation components: - - type: StationBiome - biome: Snow - type: StationRandomTransform enableStationRotation: false maxStationOffset: null diff --git a/Resources/Prototypes/Mood/drugs.yml b/Resources/Prototypes/Mood/drugs.yml index a9818d2021..379dd96006 100644 --- a/Resources/Prototypes/Mood/drugs.yml +++ b/Resources/Prototypes/Mood/drugs.yml @@ -4,7 +4,7 @@ - type: moodEffect id: LotoTranscendence moodChange: 30 - timeout: 600 #10 minutes + timeout: 1020 #17 minutes moodletOnEnd: LotoEnthrallment category: "LotophagoiAddiction" @@ -21,7 +21,7 @@ - type: moodEffect id: NicotineBenefit moodChange: 5 - timeout: 600 #10 minutes + timeout: 1020 #17 minutes moodletOnEnd: NicotineWithdrawal category: "NicotineAddiction" @@ -42,4 +42,4 @@ - type: moodEffect id: SpaceDrugsBenefit moodChange: 7 - timeout: 300 #5 minutes \ No newline at end of file + timeout: 300 #5 minutes diff --git a/Resources/Prototypes/Mood/genericNeeds.yml b/Resources/Prototypes/Mood/genericNeeds.yml index d0b24b7d7f..e0b8c25c08 100644 --- a/Resources/Prototypes/Mood/genericNeeds.yml +++ b/Resources/Prototypes/Mood/genericNeeds.yml @@ -1,7 +1,7 @@ # Hunger - type: moodEffect id: HungerOverfed - moodChange: -10 + moodChange: 10 category: "Hunger" - type: moodEffect @@ -22,7 +22,7 @@ # Thirst - type: moodEffect id: ThirstOverHydrated - moodChange: -3 + moodChange: 10 category: "Thirst" - type: moodEffect diff --git a/Resources/Prototypes/NPCs/psionic.yml b/Resources/Prototypes/NPCs/psionic.yml new file mode 100644 index 0000000000..0c3772bd91 --- /dev/null +++ b/Resources/Prototypes/NPCs/psionic.yml @@ -0,0 +1,25 @@ +- type: htnCompound + id: MeleePsionicFamiliarCompound + branches: + - tasks: + - !type:HTNCompoundTask + task: MeleeCombatCompound + - tasks: + - !type:HTNCompoundTask + task: FollowCompound + - tasks: + - !type:HTNCompoundTask + task: IdleCompound + +- type: htnCompound + id: RangedPsionicFamiliarCompound + branches: + - tasks: + - !type:HTNCompoundTask + task: InnateRangedCombatCompound + - tasks: + - !type:HTNCompoundTask + task: FollowCompound + - tasks: + - !type:HTNCompoundTask + task: IdleCompound diff --git a/Resources/Prototypes/NPCs/wisp.yml b/Resources/Prototypes/NPCs/wisp.yml new file mode 100644 index 0000000000..3793a47cb2 --- /dev/null +++ b/Resources/Prototypes/NPCs/wisp.yml @@ -0,0 +1,28 @@ +- type: htnCompound + id: GlimmerWispCompound + branches: + - tasks: + - !type:HTNCompoundTask + task: RangedCombatCompound + - tasks: + - !type:HTNCompoundTask + task: DrainPsionicCompound + - tasks: + - !type:HTNCompoundTask + task: IdleCompound + +- type: htnCompound + id: DrainPsionicCompound + branches: + - tasks: + - !type:HTNPrimitiveTask + operator: !type:PickDrainTargetOperator + targetKey: TargetCoordinates + drainKey: DrainTarget + rangeKey: IdleRange + - !type:HTNPrimitiveTask + operator: !type:MoveToOperator + pathfindInPlanning: false + - !type:HTNPrimitiveTask + operator: !type:DrainOperator + drainKey: DrainTarget diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/NPCs/mutants.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/NPCs/mutants.yml index ee75dd3c8e..b3de9e0191 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/NPCs/mutants.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/NPCs/mutants.yml @@ -109,7 +109,7 @@ # path: /Audio/Animals/snake_hiss.ogg # - type: Puller # needsHands: false -# - type: Arachne +# - type: Cocooner # cocoonDelay: 8 # - type: SolutionContainerManager # solutions: diff --git a/Resources/Prototypes/Nyanotrasen/GameRules/events.yml b/Resources/Prototypes/Nyanotrasen/GameRules/events.yml index e73ac51d5c..de9ea15a69 100644 --- a/Resources/Prototypes/Nyanotrasen/GameRules/events.yml +++ b/Resources/Prototypes/Nyanotrasen/GameRules/events.yml @@ -112,49 +112,52 @@ - type: MassMindSwapRule isTemporary: true # Permanent mindswap is hell. -#- type: entity -# id: GlimmerWispSpawn -# parent: BaseGlimmerEvent -# noSpawn: true -# components: -# - type: GlimmerEvent -# minimumGlimmer: 300 -# maximumGlimmer: 1000 -# report: glimmer-event-report-signatures -# - type: GlimmerWispRule +- type: entity + abstract: true + parent: BaseGlimmerEvent + id: BaseGlimmerSignaturesEvent + noSpawn: true + components: + - type: GlimmerEvent + minimumGlimmer: 300 + maximumGlimmer: 1000 + report: glimmer-event-report-signatures + +- type: entity + id: GlimmerWispSpawn + parent: BaseGlimmerSignaturesEvent + noSpawn: true + components: + - type: GlimmerMobRule + mobPrototype: MobGlimmerWisp - type: entity + parent: BaseGlimmerSignaturesEvent id: FreeProber - parent: BaseGlimmerEvent noSpawn: true components: - - type: GlimmerEvent - minimumGlimmer: 300 - maximumGlimmer: 1000 - report: glimmer-event-report-signatures - - type: FreeProberRule + - type: FreeProberRule ## converted upstream events - type: entity + parent: BaseGlimmerSignaturesEvent id: GlimmerRandomSentience - parent: BaseGlimmerEvent noSpawn: true components: - - type: StationEvent - weight: 7 - duration: 1 - earliestStart: 15 - reoccurrenceDelay: 15 - minimumPlayers: 10 - - type: GlimmerEvent - minimumGlimmer: 250 - maximumGlimmer: 900 - report: glimmer-event-report-signatures - - type: GlimmerRandomSentienceRule + - type: StationEvent + weight: 7 + duration: 1 + earliestStart: 15 + reoccurrenceDelay: 15 + minimumPlayers: 10 + - type: GlimmerEvent + minimumGlimmer: 350 + maximumGlimmer: 1000 + - type: GlimmerRandomSentienceRule - type: entity + parent: BaseGlimmerSignaturesEvent id: GlimmerRevenantSpawn - parent: BaseGlimmerEvent noSpawn: true components: - type: GlimmerEvent @@ -162,17 +165,16 @@ maximumGlimmer: 900 glimmerBurnLower: 50 glimmerBurnUpper: 100 # Gives epi a chance to recover - report: glimmer-event-report-signatures - type: GlimmerRevenantRule - type: entity + parent: BaseGlimmerSignaturesEvent id: GlimmerMiteSpawn - parent: BaseGlimmerEvent noSpawn: true components: - - type: GlimmerEvent - minimumGlimmer: 250 - maximumGlimmer: 900 - report: glimmer-event-report-signatures - - type: GlimmerMobRule - mobPrototype: MobGlimmerMite + - type: GlimmerEvent + minimumGlimmer: 250 + maximumGlimmer: 900 + - type: GlimmerMobRule + mobPrototype: MobGlimmerMite + glimmerTier: Low # get more mites earlier on diff --git a/Resources/Prototypes/Nyanotrasen/Guidebook/epistemics.yml b/Resources/Prototypes/Nyanotrasen/Guidebook/epistemics.yml index adfbc8ce72..2ae051100b 100644 --- a/Resources/Prototypes/Nyanotrasen/Guidebook/epistemics.yml +++ b/Resources/Prototypes/Nyanotrasen/Guidebook/epistemics.yml @@ -1,7 +1,7 @@ -# - type: guideEntry # When it's added -# id: AltarsGolemancy -# name: guide-entry-altars-golemancy -# text: "/ServerInfo/Nyanotrasen/Guidebook/Epistemics/Altar.xml" +- type: guideEntry + id: AltarsGolemancy + name: guide-entry-altars-golemancy + text: "/ServerInfo/Nyanotrasen/Guidebook/Epistemics/Altar.xml" - type: guideEntry id: ReverseEngineering diff --git a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml index f7a3120570..3834c3b95c 100644 --- a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml +++ b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml @@ -18,6 +18,12 @@ - !type:CharacterTraitRequirement traits: - AnomalousPositronics + - !type:CharacterLogicOrRequirement + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Shadowkin startingGear: ForensicMantisGear icon: "JobIconForensicMantis" supervisors: job-supervisors-rd diff --git a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/prisoner.yml b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/prisoner.yml index 00ffdde666..0ca1794742 100644 --- a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/prisoner.yml +++ b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/prisoner.yml @@ -13,6 +13,15 @@ - !type:DepartmentTimeRequirement department: Security min: 21600 + - !type:CharacterLogicOrRequirement + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Shadowkin + - !type:CharacterTraitRequirement + traits: + - ShadowkinBlackeye - type: startingGear id: PrisonerGear diff --git a/Resources/Prototypes/Nyanotrasen/psionicArtifacts.yml b/Resources/Prototypes/Nyanotrasen/psionicArtifacts.yml deleted file mode 100644 index 8f952b3905..0000000000 --- a/Resources/Prototypes/Nyanotrasen/psionicArtifacts.yml +++ /dev/null @@ -1,21 +0,0 @@ -- type: weightedRandom - id: PsionicArtifactPool - weights: - ClothingHandsDispelGloves: 1 - ClothingEyesTelegnosisSpectacles: 1 - ClothingHandsGlovesColorYellowUnsulated: 1 - PonderingOrbTelepathic: 1 - ClothingShoesBootsMagBlinding: 0.5 - LidOSaws: 0.25 - BedsheetInvisibilityCloak: 0.15 - # WeaponWandPolymorphCarp: 0.05 - # WeaponWandPolymorphMonkey: 0.05 - # WeaponWandFireball: 0.025 - # WeaponWandDeath: 0.001 - # WeaponWandPolymorphDoor: 0.05 - SpawnSpellbook: 0.025 - ForceWallSpellbook: 0.025 - BlinkBook: 0.025 - SmiteBook: 0.00025 - KnockSpellbook: 0.025 - FireballSpellbook: 0.01 diff --git a/Resources/Prototypes/Nyanotrasen/psionicPowers.yml b/Resources/Prototypes/Nyanotrasen/psionicPowers.yml index eaa77f05d5..8b2911018f 100644 --- a/Resources/Prototypes/Nyanotrasen/psionicPowers.yml +++ b/Resources/Prototypes/Nyanotrasen/psionicPowers.yml @@ -14,4 +14,6 @@ HealingWordPower: 0.85 RevivifyPower: 0.1 ShadeskipPower: 0.15 - TelekineticPulsePower: 0.15 \ No newline at end of file + TelekineticPulsePower: 0.15 + PyrokineticFlare: 0.3 + SummonImpPower: 0.15 diff --git a/Resources/Prototypes/Objectives/stealTargetGroups.yml b/Resources/Prototypes/Objectives/stealTargetGroups.yml index 5995278433..9c56881bd8 100644 --- a/Resources/Prototypes/Objectives/stealTargetGroups.yml +++ b/Resources/Prototypes/Objectives/stealTargetGroups.yml @@ -91,6 +91,13 @@ sprite: Objects/Misc/nukedisk.rsi state: icon +- type: stealTargetGroup + id: HoSAntiqueWeapon + name: head of security's personal weapon + sprite: + sprite: Objects/Weapons/Guns/Battery/pulse_pistol.rsi + state: base + # Thief Collection - type: stealTargetGroup diff --git a/Resources/Prototypes/Objectives/traitor.yml b/Resources/Prototypes/Objectives/traitor.yml index 554ccad264..b00d12529a 100644 --- a/Resources/Prototypes/Objectives/traitor.yml +++ b/Resources/Prototypes/Objectives/traitor.yml @@ -33,6 +33,20 @@ - type: ObjectiveLimit limit: 2 # there is usually only 1 of each steal objective, have 2 max for drama +- type: entity # Head of Security steal objective. + noSpawn: true + parent: BaseTraitorStealObjective + id: HoSAntiqueWeaponStealObjective + components: + - type: Objective + difficulty: 3 # HoS will mostly be using the gun to stop you from stealing it + - type: NotJobRequirement + job: HeadOfSecurity + - type: StealCondition + verifyMapExistence: true + stealGroup: HoSAntiqueWeapon + owner: job-name-hos + # state - type: entity @@ -323,4 +337,4 @@ - type: StealCondition stealGroup: SupermatterSliver objectiveNoOwnerText: objective-condition-steal-smsliver-title - descriptionText: objective-condition-steal-smsliver-description \ No newline at end of file + descriptionText: objective-condition-steal-smsliver-description diff --git a/Resources/Prototypes/Psionics/psionics.yml b/Resources/Prototypes/Psionics/psionics.yml index 378d48b3fa..7ee6e193e3 100644 --- a/Resources/Prototypes/Psionics/psionics.yml +++ b/Resources/Prototypes/Psionics/psionics.yml @@ -52,7 +52,7 @@ name: Pyrokinesis description: pyrokinesis-power-description actions: - - ActionPyrokinesis + - ActionPyrokinesis components: - type: PyrokinesisPower initializationFeedback: pyrokinesis-power-initialization-feedback @@ -64,7 +64,7 @@ name: Metapsionic Pulse description: metapsionic-power-description actions: - - ActionMetapsionic + - ActionMetapsionic components: - type: MetapsionicPower initializationFeedback: metapsionic-power-initialization-feedback @@ -77,7 +77,7 @@ name: Psionic Regeneration description: psionic-regeneration-power-description actions: - - ActionPsionicRegeneration + - ActionPsionicRegeneration components: - type: PsionicRegenerationPower initializationFeedback: psionic-regeneration-power-initialization-feedback @@ -90,7 +90,7 @@ name: Telegnosis description: telegnosis-power-description actions: - - ActionTelegnosis + - ActionTelegnosis components: - type: TelegnosisPower initializationFeedback: telegnosis-power-initialization-feedback @@ -103,7 +103,7 @@ name: Psionic Invisibility description: psionic-invisibility-power-description actions: - - ActionDispel + - ActionDispel components: - type: PsionicInvisibilityPower initializationFeedback: psionic-invisibility-power-initialization-feedback @@ -204,7 +204,7 @@ name: Shadeskip description: shadeskip-power-description actions: - - ActionShadeskip + - ActionShadeskip initializationFeedback: shadeskip-power-initialization-feedback metapsionicFeedback: shadeskip-power-metapsionic-feedback amplificationModifier: 1 @@ -214,7 +214,62 @@ name: Telekinetic Pulse description: telekinetic-pulse-power-description actions: - - ActionTelekineticPulse + - ActionTelekineticPulse initializationFeedback: telekinetic-pulse-power-initialization-feedback metapsionicFeedback: telekinetic-pulse-power-metapsionic-feedback - amplificationModifier: 1 \ No newline at end of file + amplificationModifier: 1 + +- type: psionicPower + id: ShadowkinPowers + name: Shadowkin Powers + description: shadowkin-powers-description + actions: + - ActionShadowkinShadeskip + - ActionDarkSwap + powerSlotCost: 1 + +- type: psionicPower + id: EtherealVisionPower + name: Ethereal Vision + description: ethereal-vision-powers-description + components: + - type: ShowEthereal + powerSlotCost: 0 + +- type: psionicPower + id: DarkSwapPower + name: DarkSwap + description: darkswap-power-description + actions: + - ActionDarkSwap + powerSlotCost: 1 + +- type: psionicPower + id: PyrokineticFlare + name: Pyrokinetic Flare + description: pyrokinetic-flare-power-description + actions: + - ActionPyrokineticFlare + powerSlotCost: 1 + initializationFeedback: pyrokinetic-flare-power-initialization-feedback + metapsionicFeedback: pyrokinetic-flare-power-metapsionic-feedback + amplificationModifier: 0.25 + +- type: psionicPower + id: SummonImpPower + name: Summon Imp + description: summon-imp-power-description + actions: + - ActionSummonImp + powerSlotCost: 1 + initializationFeedback: summon-imp-power-initialization-feedback + amplificationModifier: 0.5 + dampeningModifier: 0.5 + +- type: psionicPower + id: SummonRemiliaPower + name: Summon Remilia + description: summon-imp-power-description + actions: + - ActionSummonRemilia + powerSlotCost: 0 diff --git a/Resources/Prototypes/Reagents/medicine.yml b/Resources/Prototypes/Reagents/medicine.yml index 12c694e09e..6b441711e1 100644 --- a/Resources/Prototypes/Reagents/medicine.yml +++ b/Resources/Prototypes/Reagents/medicine.yml @@ -11,16 +11,20 @@ metabolismRate: 0.1 effects: - !type:GenericStatusEffect - key: PsionicallyInsulated #Nyano - Summary: makes the user psionically insulated from effects. - component: PsionicInsulation #Nyano - Summary: see above. + key: PsionicallyInsulated + component: PsionicInsulation type: Add + time: 900 - !type:GenericStatusEffect key: Stutter component: ScrambledAccent + type: Add + time: 900 - !type:GenericStatusEffect - key: PsionicsDisabled #Nyano - Summary: disables psinoics from being used by the wearer. - component: PsionicsDisabled #Nyano - Summary: see above. + key: PsionicsDisabled + component: PsionicsDisabled type: Add + time: 900 - !type:Drunk slurSpeech: false boozePower: 20 @@ -1120,7 +1124,7 @@ conditions: - !type:ReagentThreshold min: 12 - + - type: reagent id: Opporozidone #Name based of an altered version of the startreck chem "Opporozine" name: reagent-name-opporozidone diff --git a/Resources/Prototypes/Reagents/toxins.yml b/Resources/Prototypes/Reagents/toxins.yml index 5d29f024ce..abb33f832a 100644 --- a/Resources/Prototypes/Reagents/toxins.yml +++ b/Resources/Prototypes/Reagents/toxins.yml @@ -511,6 +511,12 @@ shouldHave: true reagent: Protein amount: 0.5 + - !type:AdjustReagent + conditions: + - !type:OrganType + type: Shadowkin + reagent: Protein + amount: 0.5 - type: reagent id: Allicin diff --git a/Resources/Prototypes/Recipes/Construction/utilities.yml b/Resources/Prototypes/Recipes/Construction/utilities.yml index 1647e98bce..19f2fee183 100644 --- a/Resources/Prototypes/Recipes/Construction/utilities.yml +++ b/Resources/Prototypes/Recipes/Construction/utilities.yml @@ -178,7 +178,7 @@ targetNode: pipe category: construction-category-utilities placementMode: SnapgridCenter - canBuildInImpassable: true + canBuildInImpassable: false icon: sprite: Structures/Piping/disposal.rsi state: conpipe-s diff --git a/Resources/Prototypes/Recipes/Crafting/Graphs/improvised/makeshifthandcuffs.yml b/Resources/Prototypes/Recipes/Crafting/Graphs/improvised/makeshifthandcuffs.yml index 08d6d57fb9..47eaf30e5c 100644 --- a/Resources/Prototypes/Recipes/Crafting/Graphs/improvised/makeshifthandcuffs.yml +++ b/Resources/Prototypes/Recipes/Crafting/Graphs/improvised/makeshifthandcuffs.yml @@ -11,4 +11,3 @@ doAfter: 5 - node: cuffscable entity: Cablecuffs - diff --git a/Resources/Prototypes/Recipes/Lathes/prizecounter.yml b/Resources/Prototypes/Recipes/Lathes/prizecounter.yml index c600702b20..9e5e239c6f 100644 --- a/Resources/Prototypes/Recipes/Lathes/prizecounter.yml +++ b/Resources/Prototypes/Recipes/Lathes/prizecounter.yml @@ -6,6 +6,14 @@ materials: PrizeTicket: 30 +- type: latheRecipe + id: PlushieShadowkin + result: PlushieShadowkin + applyMaterialDiscount: false + completetime: 0.1 + materials: + PrizeTicket: 50 + - type: latheRecipe id: PlushieMothRandom result: PlushieMothRandom diff --git a/Resources/Prototypes/Recipes/Lathes/security.yml b/Resources/Prototypes/Recipes/Lathes/security.yml index 04c2ad1ec1..4a2e737e15 100644 --- a/Resources/Prototypes/Recipes/Lathes/security.yml +++ b/Resources/Prototypes/Recipes/Lathes/security.yml @@ -12,6 +12,14 @@ materials: Plastic: 200 +- type: latheRecipe + id: BolaEnergy + result: BolaEnergy + completetime: 2 + materials: + Plastic: 200 + Plasma: 150 + - type: latheRecipe id: Stunbaton result: Stunbaton @@ -758,9 +766,10 @@ result: GrenadeBlast completetime: 3 materials: - Steel: 450 - Plastic: 300 - Gold: 150 + Steel: 150 + Plastic: 100 + Gold: 50 + - type: latheRecipe id: GrenadeFlash result: GrenadeFlash @@ -872,3 +881,10 @@ materials: Plastic: 15 Uranium: 10 + +- type: latheRecipe + id: ShadowkinRestraints + result: ClothingOuterShadowkinRestraints + completetime: 6 + materials: + Steel: 300 diff --git a/Resources/Prototypes/Research/arsenal.yml b/Resources/Prototypes/Research/arsenal.yml index b519d0b351..ee2be33c83 100644 --- a/Resources/Prototypes/Research/arsenal.yml +++ b/Resources/Prototypes/Research/arsenal.yml @@ -113,6 +113,7 @@ - TelescopicShield - HoloprojectorSecurity - WeaponDisablerSMG + - BolaEnergy # Tier 2 diff --git a/Resources/Prototypes/Roles/Antags/Thief.yml b/Resources/Prototypes/Roles/Antags/Thief.yml index 131db8cf1d..2715e6d96d 100644 --- a/Resources/Prototypes/Roles/Antags/Thief.yml +++ b/Resources/Prototypes/Roles/Antags/Thief.yml @@ -3,4 +3,4 @@ name: roles-antag-thief-name antagonist: true setPreference: true - objective: roles-antag-thief-objective + objective: roles-antag-thief-objective \ No newline at end of file diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/chaplain.yml b/Resources/Prototypes/Roles/Jobs/Civilian/chaplain.yml index 2b49155034..186fae3a69 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/chaplain.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/chaplain.yml @@ -16,6 +16,12 @@ - !type:CharacterTraitRequirement traits: - AnomalousPositronics + - !type:CharacterLogicOrRequirement + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Shadowkin startingGear: ChaplainGear icon: "JobIconChaplain" supervisors: job-supervisors-rd @@ -26,19 +32,20 @@ special: - !type:AddComponentSpecial components: - - type: BibleUser #Lets them heal with bibles + - type: BibleUser - type: Psionic powerRollMultiplier: 3 - type: InnatePsionicPowers powersToAdd: - TelepathyPower - HealingWordPower + - SummonRemiliaPower - type: startingGear id: ChaplainGear equipment: jumpsuit: ClothingUniformJumpsuitChaplain - back: ClothingBackpackChaplainFilled + back: ClothingBackpack shoes: ClothingShoesColorBlack id: ChaplainPDA ears: ClothingHeadsetScience diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/librarian.yml b/Resources/Prototypes/Roles/Jobs/Civilian/librarian.yml index 8552073dcc..3468d10f27 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/librarian.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/librarian.yml @@ -16,6 +16,12 @@ - !type:CharacterTraitRequirement traits: - AnomalousPositronics + - !type:CharacterLogicOrRequirement + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Shadowkin startingGear: LibrarianGear icon: "JobIconLibrarian" supervisors: job-supervisors-rd diff --git a/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml b/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml index 5e1b451cd0..fbf190deb1 100644 --- a/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml +++ b/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml @@ -18,6 +18,17 @@ min: 36000 # goob mrp - 10 hours - !type:CharacterOverallTimeRequirement min: 36000 # goob mrp - 10 hours + - !type:CharacterLogicOrRequirement + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Shadowkin + - !type:CharacterTraitRequirement + traits: + - ShadowkinBlackeye + + weight: 10 startingGear: CMOGear icon: "JobIconChiefMedicalOfficer" diff --git a/Resources/Prototypes/Roles/Jobs/Science/research_director.yml b/Resources/Prototypes/Roles/Jobs/Science/research_director.yml index 327e7ac610..3faba58704 100644 --- a/Resources/Prototypes/Roles/Jobs/Science/research_director.yml +++ b/Resources/Prototypes/Roles/Jobs/Science/research_director.yml @@ -19,6 +19,12 @@ - !type:CharacterTraitRequirement traits: - AnomalousPositronics + - !type:CharacterLogicOrRequirement + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Shadowkin weight: 10 startingGear: ResearchDirectorGear icon: "JobIconResearchDirector" diff --git a/Resources/Prototypes/Roles/Jobs/Science/senior_researcher.yml b/Resources/Prototypes/Roles/Jobs/Science/senior_researcher.yml index 79efa33049..d6c1d18c6d 100644 --- a/Resources/Prototypes/Roles/Jobs/Science/senior_researcher.yml +++ b/Resources/Prototypes/Roles/Jobs/Science/senior_researcher.yml @@ -3,7 +3,7 @@ name: job-name-senior-researcher description: job-description-senior-researcher playTimeTracker: JobSeniorResearcher - setPreference: false # DeltaV - Disable Senior Roles round start selection + setPreference: true requirements: - !type:CharacterDepartmentTimeRequirement department: Epistemics # DeltaV - Epistemics Department replacing Science diff --git a/Resources/Prototypes/Roles/Jobs/Security/security_officer.yml b/Resources/Prototypes/Roles/Jobs/Security/security_officer.yml index 01f14f8099..18f6d04022 100644 --- a/Resources/Prototypes/Roles/Jobs/Security/security_officer.yml +++ b/Resources/Prototypes/Roles/Jobs/Security/security_officer.yml @@ -6,7 +6,6 @@ requirements: - !type:CharacterDepartmentTimeRequirement department: Security - min: 14400 # DeltaV - 4 hours startingGear: SecurityOfficerGear icon: "JobIconSecurityOfficer" supervisors: job-supervisors-hos diff --git a/Resources/Prototypes/Shaders/shaders.yml b/Resources/Prototypes/Shaders/shaders.yml index 3f0cb5ae1f..41d04137bb 100644 --- a/Resources/Prototypes/Shaders/shaders.yml +++ b/Resources/Prototypes/Shaders/shaders.yml @@ -110,4 +110,16 @@ - type: shader id: Flap kind: source - path: "/Textures/Shaders/flap.swsl" \ No newline at end of file + path: "/Textures/Shaders/flap.swsl" + + # Shadowkin shaders + +- type: shader + id: ColorTint + kind: source + path: "/Textures/Shaders/color_tint.swsl" + +- type: shader + id: Ethereal + kind: source + path: "/Textures/Shaders/ethereal.swsl" \ No newline at end of file diff --git a/Resources/Prototypes/SoundCollections/emotes.yml b/Resources/Prototypes/SoundCollections/emotes.yml index 35693a70a4..f655a8cf6b 100644 --- a/Resources/Prototypes/SoundCollections/emotes.yml +++ b/Resources/Prototypes/SoundCollections/emotes.yml @@ -86,3 +86,13 @@ - /Audio/Voice/IPC/whirr1.ogg - /Audio/Voice/IPC/whirr2.ogg - /Audio/Voice/IPC/whirr3.ogg + +- type: soundCollection + id: Mars + files: + - /Audio/Voice/Shadowkin/mar.ogg + +- type: soundCollection + id: Wurble + files: + - /Audio/Voice/Shadowkin/wurble.ogg \ No newline at end of file diff --git a/Resources/Prototypes/SoundCollections/glimmer_wisp.yml b/Resources/Prototypes/SoundCollections/glimmer_wisp.yml new file mode 100644 index 0000000000..4fc0990397 --- /dev/null +++ b/Resources/Prototypes/SoundCollections/glimmer_wisp.yml @@ -0,0 +1,6 @@ +- type: soundCollection + id: MagicMissile + files: + - /Audio/Effects/magic_missile_1.ogg + - /Audio/Effects/magic_missile_2.ogg + - /Audio/Effects/magic_missile_3.ogg diff --git a/Resources/Prototypes/Species/shadowkin.yml b/Resources/Prototypes/Species/shadowkin.yml new file mode 100644 index 0000000000..7043397d8e --- /dev/null +++ b/Resources/Prototypes/Species/shadowkin.yml @@ -0,0 +1,179 @@ +- type: species + id: Shadowkin + name: species-name-shadowkin + roundStart: true + prototype: MobShadowkin + sprites: MobShadowkinSprites + defaultSkinTone: "#FFFFFF" + markingLimits: MobShadowkinMarkingLimits + dollPrototype: MobShadowkinDummy + skinColoration: Hues + naming: First + maleFirstNames: names_shadowkin + femaleFirstNames: names_shadowkin + minAge: 18 + maxAge: 300 + youngAge: 20 + oldAge: 250 + sexes: + - Male + - Female + - Unsexed + minHeight: 0.65 + defaultHeight: 0.85 + maxHeight: 1.15 + minWidth: 0.6 + defaultWidth: 0.85 + maxWidth: 1.2 + +- type: speciesBaseSprites + id: MobShadowkinSprites + sprites: + Head: MobShadowkinHead + Snout: MobShadowkinAnyMarkingFollowSkin + HeadTop: MobShadowkinAnyMarkingFollowSkin + HeadSide: MobShadowkinAnyMarkingFollowSkin + Tail: MobShadowkinAnyMarkingFollowSkin + Chest: MobShadowkinTorso + Eyes: MobShadowkinEyes + LArm: MobShadowkinLArm + RArm: MobShadowkinRArm + LHand: MobShadowkinLHand + RHand: MobShadowkinRHand + LLeg: MobShadowkinLLeg + RLeg: MobShadowkinRLeg + LFoot: MobShadowkinLFoot + RFoot: MobShadowkinRFoot + +- type: markingPoints + id: MobShadowkinMarkingLimits + points: + Tail: + points: 1 + required: true + defaultMarkings: [TailShadowkin] + HeadTop: + points: 1 + required: true + defaultMarkings: [EarsShadowkin] + Chest: + points: 1 + required: false + RightLeg: + points: 2 + required: false + RightFoot: + points: 2 + required: false + LeftLeg: + points: 2 + required: false + LeftFoot: + points: 2 + required: false + RightArm: + points: 2 + required: false + RightHand: + points: 2 + required: false + LeftArm: + points: 2 + required: false + LeftHand: + points: 2 + required: false + +- type: humanoidBaseSprite + id: MobShadowkinAnyMarkingFollowSkin + markingsMatchSkin: true + +- type: humanoidBaseSprite + id: MobShadowkinHead + baseSprite: + sprite: Mobs/Species/Shadowkin/parts.rsi + state: head_m + +- type: humanoidBaseSprite + id: MobShadowkinHeadMale + baseSprite: + sprite: Mobs/Species/Shadowkin/parts.rsi + state: head_m + +- type: humanoidBaseSprite + id: MobShadowkinHeadFemale + baseSprite: + sprite: Mobs/Species/Shadowkin/parts.rsi + state: head_f + +- type: humanoidBaseSprite + id: MobShadowkinTorso + baseSprite: + sprite: Mobs/Species/Shadowkin/parts.rsi + state: torso_m + +- type: humanoidBaseSprite + id: MobShadowkinTorsoMale + baseSprite: + sprite: Mobs/Species/Shadowkin/parts.rsi + state: torso_m + +- type: humanoidBaseSprite + id: MobShadowkinTorsoFemale + baseSprite: + sprite: Mobs/Species/Shadowkin/parts.rsi + state: torso_f + +- type: humanoidBaseSprite + id: MobShadowkinLLeg + baseSprite: + sprite: Mobs/Species/Shadowkin/parts.rsi + state: l_leg + +- type: humanoidBaseSprite + id: MobShadowkinLHand + baseSprite: + sprite: Mobs/Species/Shadowkin/parts.rsi + state: l_hand + +- type: humanoidBaseSprite + id: MobShadowkinEyes + baseSprite: + sprite: Mobs/Species/Shadowkin/parts.rsi + state: eyes + +- type: humanoidBaseSprite + id: MobShadowkinLArm + baseSprite: + sprite: Mobs/Species/Shadowkin/parts.rsi + state: l_arm + +- type: humanoidBaseSprite + id: MobShadowkinLFoot + baseSprite: + sprite: Mobs/Species/Shadowkin/parts.rsi + state: l_foot + +- type: humanoidBaseSprite + id: MobShadowkinRLeg + baseSprite: + sprite: Mobs/Species/Shadowkin/parts.rsi + state: r_leg + +- type: humanoidBaseSprite + id: MobShadowkinRHand + baseSprite: + sprite: Mobs/Species/Shadowkin/parts.rsi + state: r_hand + +- type: humanoidBaseSprite + id: MobShadowkinRArm + baseSprite: + sprite: Mobs/Species/Shadowkin/parts.rsi + state: r_arm + +- type: humanoidBaseSprite + id: MobShadowkinRFoot + baseSprite: + sprite: Mobs/Species/Shadowkin/parts.rsi + state: r_foot \ No newline at end of file diff --git a/Resources/Prototypes/Species/species_weights.yml b/Resources/Prototypes/Species/species_weights.yml index 990a8ccecf..d158862d38 100644 --- a/Resources/Prototypes/Species/species_weights.yml +++ b/Resources/Prototypes/Species/species_weights.yml @@ -4,8 +4,9 @@ weights: Human: 5 Reptilian: 4 - SlimePerson: 4 + SlimePerson: 3 Oni: 3 #Nyanotrasen Oni, see Prototypes/Nyanotrasen/Entities/Mobs/Species/Oni.yml Felinid: 4 # Nyanotrasen - Felinid, see Prototypes/Nyanotrasen/Entities/Mobs/Species/felinid.yml - Vulpkanin: 3 # DeltaV - Vulpkanin, see Prototypes/DeltaV/Entities/Mobs/Species/vulpkanin.yml + Vulpkanin: 4 # DeltaV - Vulpkanin, see Prototypes/DeltaV/Entities/Mobs/Species/vulpkanin.yml Diona: 2 + Shadowkin: 0 diff --git a/Resources/Prototypes/StatusEffects/security.yml b/Resources/Prototypes/StatusEffects/security.yml index 2a6695387b..31a22e5df3 100644 --- a/Resources/Prototypes/StatusEffects/security.yml +++ b/Resources/Prototypes/StatusEffects/security.yml @@ -9,33 +9,33 @@ parent: SecurityIcon id: SecurityIconDischarged icon: - sprite: Interface/Misc/security_icons.rsi + sprite: /Textures/Interface/Misc/security_icons.rsi state: hud_discharged - type: statusIcon parent: SecurityIcon id: SecurityIconIncarcerated icon: - sprite: Interface/Misc/security_icons.rsi + sprite: /Textures/Interface/Misc/security_icons.rsi state: hud_incarcerated - type: statusIcon parent: SecurityIcon id: SecurityIconParoled icon: - sprite: Interface/Misc/security_icons.rsi + sprite: /Textures/Interface/Misc/security_icons.rsi state: hud_paroled - type: statusIcon parent: SecurityIcon id: SecurityIconSuspected icon: - sprite: Interface/Misc/security_icons.rsi + sprite: /Textures/Interface/Misc/security_icons.rsi state: hud_suspected - type: statusIcon parent: SecurityIcon id: SecurityIconWanted icon: - sprite: Interface/Misc/security_icons.rsi + sprite: /Textures/Interface/Misc/security_icons.rsi state: hud_wanted diff --git a/Resources/Prototypes/Traits/disabilities.yml b/Resources/Prototypes/Traits/disabilities.yml index 9961c84948..5e5028035f 100644 --- a/Resources/Prototypes/Traits/disabilities.yml +++ b/Resources/Prototypes/Traits/disabilities.yml @@ -217,6 +217,7 @@ inverted: true species: - Vulpkanin # This trait functions exactly as-is for the Vulpkanin trait. + - Shadowkin components: - type: Flashable eyeDamageChance: 0.3 diff --git a/Resources/Prototypes/Traits/mental.yml b/Resources/Prototypes/Traits/mental.yml index 4a50c8c397..70fbfd24b7 100644 --- a/Resources/Prototypes/Traits/mental.yml +++ b/Resources/Prototypes/Traits/mental.yml @@ -27,6 +27,7 @@ inverted: true species: - Oni + - Shadowkin - !type:CharacterTraitRequirement inverted: true traits: @@ -64,6 +65,7 @@ inverted: true species: - Oni + - Shadowkin - !type:CharacterTraitRequirement inverted: true traits: @@ -97,6 +99,12 @@ - !type:CharacterTraitRequirement traits: - AnomalousPositronics + - !type:CharacterLogicOrRequirement + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Shadowkin - !type:CharacterTraitRequirement inverted: true traits: @@ -130,13 +138,19 @@ - !type:CharacterTraitRequirement traits: - AnomalousPositronics + - !type:CharacterLogicOrRequirement + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Shadowkin - !type:CharacterTraitRequirement inverted: true traits: - LowAmplification - PowerOverwhelming psionicPowers: - - LowAmplification + - HighAmplification - type: trait id: PowerOverwhelming @@ -163,6 +177,12 @@ - !type:CharacterTraitRequirement traits: - AnomalousPositronics + - !type:CharacterLogicOrRequirement + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Shadowkin - !type:CharacterTraitRequirement inverted: true traits: @@ -196,6 +216,12 @@ - !type:CharacterTraitRequirement traits: - AnomalousPositronics + - !type:CharacterLogicOrRequirement + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Shadowkin - !type:CharacterTraitRequirement inverted: true traits: @@ -228,6 +254,12 @@ - !type:CharacterTraitRequirement traits: - AnomalousPositronics + - !type:CharacterLogicOrRequirement + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Shadowkin - !type:CharacterTraitRequirement inverted: true traits: diff --git a/Resources/Prototypes/Traits/physical.yml b/Resources/Prototypes/Traits/physical.yml index 288386b8f4..afaaf0b2cb 100644 --- a/Resources/Prototypes/Traits/physical.yml +++ b/Resources/Prototypes/Traits/physical.yml @@ -305,6 +305,7 @@ species: - Felinid # Felinids already have cat claws. - Reptilian # Reptilians also have cat claws. + - Shadowkin # Shadowkins also have claws. # - Vulpkanin # Vulpkanin have "Blunt" claws. One could argue this trait "Sharpens" their claws. - !type:CharacterTraitRequirement inverted: true @@ -403,6 +404,7 @@ species: - Arachnid - Arachne + - Shadowkin - IPC components: - type: Sericulture diff --git a/Resources/Prototypes/Traits/skills.yml b/Resources/Prototypes/Traits/skills.yml index 0e4868f19b..fb0c6d4fc9 100644 --- a/Resources/Prototypes/Traits/skills.yml +++ b/Resources/Prototypes/Traits/skills.yml @@ -22,16 +22,16 @@ components: - type: SelfAware analyzableTypes: - - Blunt - - Slash - - Piercing - - Heat - - Shock - - Cold - - Caustic + - Blunt + - Slash + - Piercing + - Heat + - Shock + - Cold + - Caustic detectableGroups: - - Airloss - - Toxin + - Airloss + - Toxin - type: trait id: HeavyweightDrunk @@ -186,6 +186,12 @@ - !type:CharacterTraitRequirement traits: - AnomalousPositronics + - !type:CharacterLogicOrRequirement + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Shadowkin - !type:CharacterTraitRequirement inverted: true traits: @@ -221,6 +227,12 @@ inverted: true traits: - LatentPsychic + - !type:CharacterLogicOrRequirement + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Shadowkin - type: trait id: NaturalTelepath @@ -252,6 +264,12 @@ - !type:CharacterTraitRequirement traits: - AnomalousPositronics + - !type:CharacterLogicOrRequirement + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Shadowkin - type: trait id: TrapAvoider @@ -261,10 +279,10 @@ - type: StepTriggerImmune whitelist: types: - - Shard - - Landmine - - Mousetrap - - SlipEntity + - Shard + - Landmine + - Mousetrap + - SlipEntity requirements: - !type:CharacterSpeciesRequirement inverted: true @@ -282,3 +300,10 @@ - !type:CharacterSpeciesRequirement species: - IPC + +- type: trait + id: AnimalFriend + category: Mental + points: -4 + addFactions: + - AnimalFriend diff --git a/Resources/Prototypes/Traits/species.yml b/Resources/Prototypes/Traits/species.yml index 504cf469d4..17be3489fe 100644 --- a/Resources/Prototypes/Traits/species.yml +++ b/Resources/Prototypes/Traits/species.yml @@ -60,3 +60,17 @@ traits: - Swashbuckler - Spearmaster + +- type: trait + id: ShadowkinBlackeye + category: Mental + points: 4 + componentRemovals: + - Shadowkin + components: + - type: Shadowkin + blackeyeSpawn: true + requirements: + - !type:CharacterSpeciesRequirement + species: + - Shadowkin \ No newline at end of file diff --git a/Resources/Prototypes/Voice/speech_emote_sounds.yml b/Resources/Prototypes/Voice/speech_emote_sounds.yml index a5d05e24b7..5c3f8ec697 100644 --- a/Resources/Prototypes/Voice/speech_emote_sounds.yml +++ b/Resources/Prototypes/Voice/speech_emote_sounds.yml @@ -183,6 +183,90 @@ params: variation: 0.125 +- type: emoteSounds + id: MaleShadowkin + params: + variation: 0.125 + sounds: + Scream: + collection: SlimeMaleScreams + Laugh: + collection: MaleLaugh + Sneeze: + collection: MaleSneezes + Cough: + collection: MaleCoughs + Yawn: + collection: MaleYawn + Snore: + collection: Snores + Honk: + collection: BikeHorn + Sigh: + collection: MaleSigh + Crying: + collection: MaleCry + Whistle: + collection: Whistles + Weh: + collection: Weh + Hiss: + collection: FelinidHisses + Meow: + collection: FelinidMeows + Mew: + collection: FelinidMews + Growl: + collection: FelinidGrowls + Purr: + collection: FelinidPurrs + Mars: + collection: Mars + Wurble: + collection: Wurble + +- type: emoteSounds + id: FemaleShadowkin + params: + variation: 0.125 + sounds: + Scream: + collection: SlimeFemaleScreams + Laugh: + collection: MaleLaugh + Sneeze: + collection: FemaleSneezes + Cough: + collection: FemaleCoughs + Yawn: + collection: FemaleYawn + Snore: + collection: Snores + Honk: + collection: BikeHorn + Sigh: + collection: FemaleSigh + Crying: + collection: FemaleCry + Whistle: + collection: Whistles + Weh: + collection: Weh + Hiss: + collection: FelinidHisses + Meow: + collection: FelinidMeows + Mew: + collection: FelinidMews + Growl: + collection: FelinidGrowls + Purr: + collection: FelinidPurrs + Mars: + collection: Mars + Wurble: + collection: Wurble + - type: emoteSounds id: UnisexVox sounds: diff --git a/Resources/Prototypes/Voice/speech_emotes.yml b/Resources/Prototypes/Voice/speech_emotes.yml index ca4aa17229..309794c1dc 100644 --- a/Resources/Prototypes/Voice/speech_emotes.yml +++ b/Resources/Prototypes/Voice/speech_emotes.yml @@ -340,3 +340,19 @@ chatMessages: [ whirrs ] chatTriggers: - whirrs + +- type: emote + id: Mars + name: chat-emote-name-mars + category: Vocal + chatMessages: [ mars ] + chatTriggers: + - mars + +- type: emote + id: Wurble + name: chat-emote-name-wurble + category: Vocal + chatMessages: [ wurble ] + chatTriggers: + - wurble diff --git a/Resources/Prototypes/ai_factions.yml b/Resources/Prototypes/ai_factions.yml index 02a2ac168d..cdbbf86866 100644 --- a/Resources/Prototypes/ai_factions.yml +++ b/Resources/Prototypes/ai_factions.yml @@ -35,6 +35,8 @@ - type: npcFaction id: SimpleHostile + friendly: + - AnimalFriend hostile: - NanoTrasen - Syndicate @@ -86,6 +88,8 @@ - type: npcFaction id: Pibble + friendly: + - AnimalFriend hostile: - Cat - Birb @@ -99,3 +103,6 @@ - type: npcFaction id: Birb + +- type: npcFaction + id: AnimalFriend diff --git a/Resources/Prototypes/fonts.yml b/Resources/Prototypes/fonts.yml index 8e49fe8c35..c61a5fb804 100644 --- a/Resources/Prototypes/fonts.yml +++ b/Resources/Prototypes/fonts.yml @@ -62,6 +62,10 @@ id: Noganas path: /Fonts/Noganas.ttf +- type: font + id: Lymphatic + path: /Fonts/Lymphatic.ttf + - type: font id: Cambria path: /Fonts/Cambria.ttf diff --git a/Resources/ServerInfo/AssDayRules.txt b/Resources/ServerInfo/AssDayRules.txt deleted file mode 100644 index 827494c726..0000000000 --- a/Resources/ServerInfo/AssDayRules.txt +++ /dev/null @@ -1,20 +0,0 @@ -[color=#ff0000]You must be 14 or older to play. Users under 17 will be banned immediately.[/color] -[color=#ff0000]Speak English, please.[/color] - -[color=#FFD700] !!! ASS DAY !!! [/color] - -It's ass day! Finally, lower roleplay, something impossible to find on any other server but Goob Station. -Rules are relaxed today and admin abuse is more on the cards. - -[color=#a4885c]1.[/color] [color=#ff0000]DO NOT GRIEF OR OTHERWISE SELF-ANTAG. PLAY AS NORMAL.[/color] -[color=#a4885c]2.[/color] No intentionally crashing the server or causing lag. -[color=#a4885c]3.[/color] No bigotry. -[color=#a4885c]4.[/color] No sexual stuff. -[color=#a4885c]5.[/color] No creepy shit. -[color=#a4885c]6.[/color] No impersonating the admins. -[color=#a4885c]7.[/color] No walling off or obliterating arrivals. -[color=#a4885c]8.[/color] No singuloosing, plasma flooding, maxcapping, or spacing large parts of the station. -[color=#a4885c]9.[/color] If an admin tells you to quit doing something, quit it. -[color=#a4885c]10.[/color] No you do not get an antag token. - -Whiskey Echo Whiskey Lima Alpha Delta. diff --git a/Resources/ServerInfo/Guidebook/DeltaV/Epistemics/GlimmerCreatures.xml b/Resources/ServerInfo/Guidebook/DeltaV/Epistemics/GlimmerCreatures.xml new file mode 100644 index 0000000000..3d2f07a2fe --- /dev/null +++ b/Resources/ServerInfo/Guidebook/DeltaV/Epistemics/GlimmerCreatures.xml @@ -0,0 +1,87 @@ + +# Glimmer Creatures +As glimmer rises higher and higher, there can be occasional disturbances in the [color=#a4885c]noösphere[/color]. +When new psionic signatures are detected Central Command will make an announcement to the station. +Sometimes these signatures can be the appearance of glimmer creatures! + +Glimmer creatures can appear in numbers as low as 1, or multiple depending on how high glimmer is and how many psionics there are. + +These are the entities currently known to NanoTrasen. +Research is ongoing, more are yet to be discovered. + +# Glimmer Mite + + + +The glimmer mite is a small insect-like being that naturally provokes the noösphere. + +Minimum glimmer rating: Low + +## Assessment +As long as it is physically intact it will slowly raise glimmer. + +They show no signs of aggression and are physically harmless. + +## Procedure +Kill them as soon as they're spotted, they affect the noösphere and the brooding sound drives crew insane! + +## Analysis +You can get liquid [color=#a4885c]Ectoplasm[/color] from blending its body, so they can be a decent source of [color=#a4885c]Normality Crystals[/color]. + +In an emergency the body can be beaten to a pulp which will make it cease raising glimmer, at the cost of not yielding ectoplasm. + +Overall, a mild help to stopping glimmer, if you can find them. + +# Glimmer Wisp + + + +These wisps are physical manifestations of glimmer that are ghostly in appearance. + +Minimum glimmer rating: High + +## Assessment + +They don't directly affect the noösphere themselves, the main threat is that they [color=#a4885c]hunt down[/color] any psionics! + +Once a psionic is critically injured, they will begin to drain the life out of the body to [color=#a4885c]heal all injuries[/color]. + +## Procedure +Most physical attacks pass through them unnoticed, but holy weapons like the Chaplain's [color=#a4885c]Bible[/color] will weaken it. + +Once attacked they will retaliate for some time, so be prepared for a fight! + +They can also be dispelled by any gifted psionic. + +## Analysis +If you manage to kill a wisp, it will leave behind a large amount of ectoplasm which can easily make a drain or two. + +Extremely useful to a trained Epistemics team, but will require coordination to take it down. + +# Revenant + + + +A tortured soul taking revenge on those who wronged them, brought to this plane by the noösphere. + +Minimum glimmer rating: Dangerous + +## Assessment + +They have no effect on the noösphere but are a serious threat to the station, feeding on the souls of dead crew. + +Unlike wisps, revenants cannot be attacked in any way by default. + +Once a revenant uses their abilities, they can be attacked by any means for a short time. + +## Procedure +Holy damage from a bible or anti-psionic knife is especially effective at taking down wisps. + +Assistance from the Security department is usually recommended. + +Spare no time in putting down a revenant. + +## Analysis +Mostly annoying to the crew, limited exploitation due to low amount of ectoplasm when killed. + + diff --git a/Resources/ServerInfo/Guidebook/Mobs/Shadowkin.xml b/Resources/ServerInfo/Guidebook/Mobs/Shadowkin.xml new file mode 100644 index 0000000000..f2f73ee666 --- /dev/null +++ b/Resources/ServerInfo/Guidebook/Mobs/Shadowkin.xml @@ -0,0 +1,36 @@ + +# Shadowkin + + + + + +Fluffy lil' guys. + +## Ability Differences + +- Need no air to survive +- Can Shadeskip +- Can travel to and from The Dark at will +- Dims nearby lights when in the The Dark +- When too low on energy, they may fall into a powerful sleep +- Can "speak" in the Empathy, which only other Shadowkin can understand +- Slightly less blunt damage +- A bit more slash damage +- Slightly more piercing damage +- Less cold damage +- Slightly more heat damage +- Near no cellular damage +- More bloodloss damage +- Slightly more shock damage +- More radiation damage + +## Physical Differences + +- Very large and brightly colored eyes with no pupils +- Sees the world through their eyes' tint +- Very large ears +- Very fluffy +- Can be Male, Female, or Unisex +- Can be 18-300 years old + \ No newline at end of file diff --git a/Resources/ServerInfo/Guidebook/Mobs/shadowkin.Lore.txt b/Resources/ServerInfo/Guidebook/Mobs/shadowkin.Lore.txt new file mode 100644 index 0000000000..e3cda6d77e --- /dev/null +++ b/Resources/ServerInfo/Guidebook/Mobs/shadowkin.Lore.txt @@ -0,0 +1,178 @@ +# Lore + +## Biology + +[color=#a88b5e]Physicality[/color] + +Shadowkin seem very similar to canine species when looked at. +While mammalian in nature, it is nearly impossible to find any sexual dimorphism between genders, if they even have any. +They seem to all share the same body shape and often voices. + +The head consists of a snout with a nose, sharp teeth in the mouth, and two big ears on top of the head. +In addition to the two big ears, Shadowkin have two smaller ears lower down, giving them an exceptionally good ability to detect where exactly sounds come from. + +Shadowkin eyes are usually very large and fully mono-colored; they have no discernible pupils, irises, or similar. +The eye of a Shadowkin is a solid orb of color and, perhaps, their most defining trait. + +All observations show Shadowkin do not seem to age after a certain point. +Some may look older or younger than others, but the aging process seems to stop when the Shadowkin is chronologically in their 20s. + +Unusually, compiled medical data on Shadowkin shows that they have no lungs, thus not needing to breathe. +The compiled medical data also shows that they have a large, more circular shape where their lungs would be. + +[color=#a88b5e]Mentality[/color] + +Shadowkin core personalities are mirrored by their eye color. +Some common colors and their meanings are: + +- Red: Determined to reach a goal, even if it means sacrificing others. +- Green: Eager to learn and fit in with others. +- Blue: Very calm and collected, or shy. + +Other colors also exist in addition to these but are not as common. +The other colors are just mixes of the three main colors. +For example, here are a couple of mixes: + +- Purple: Determined, yet probably won't harm, in some cases shy. +- Yellow: Quite eager to be number one, especially if related to knowledge. +- Orange: Shy and calm, yet will fight if provoked. +- White: Very robust, exceeds expectations in most things they do, but is quite boring to interact with generally. + +There are rumors other colors exist as well. +Shadowkin that lose their ability to travel between dimensions have [color=#000000]black eyes[/color] no matter their core personality. +These black-eyed Shadowkin make up the largest number of them living in Realspace. + +## History + +Shadowkin are creatures native to their so-called Pocket Dimension, a part of space that is unable to be accurately pinpointed and/or visited by most people. +From there, Shadowkin visit our worlds, and sometimes a large number of them are forced into our world in mass migrations and then live among us. +What exactly causes these mass migrations is unknown, but may be related to them losing their ability to travel between dimensions. + +[color=#a88b5e]Homeworld[/color] + +While no home system or world has been found, some Shadowkin talk about dreaming of their homeworld, describing a lush and green land with abundant resources. + +[color=#a88b5e]Racial/Government Status[/color] + +There currently exists no Shadowkin government, and with Shadowkin being as rare as they are, they tend to fit into currently established societies and civilizations, with varying degrees of success in the past. +In recent years, however, many cultures have taken to accepting Shadowkin as another galactic constant, going as far as allowing them lives similar to those that any of the other species would lead. + +Some systems early on took and experimented on Shadowkin, in an attempt to utilize their powers in various technology, and even recreating them with very experimental technology. +The tests failed and this was met with a lot of resistance from Shadowkin, many of them being killed or becoming Blackeyes in the process. +After this, those systems realized that Shadowkin were a sentient species, and deeply apologized for their actions. + +## Culture + +[color=#a88b5e]The Typical Experience[/color] + +Most times, life is pretty normal. A Shadowkin can have a job, go to the job to work, then spend time off with friends. +The fact is most times of the day, the small abilities one might have are nice, but not overly useful. Sure, a Shadowkin could dim the nearby lights, but at the same time, the Shadowkin could also just flick the light switch. +However, it can sometimes happen that when a Shadowkin slept in and needs to get to work quickly, they might just teleport to work. +Some people might be overly wary of Shadowkin, some might be drawn towards Shadowkin. +Many Shadowkin are used to not wearing clothes, which can lead to some awkward situations, but those are generally the same situations any other furred species would have. + +[color=#a88b5e]Language[/color] + +The only recorded spoken language of the Shadowkin is an unusual language named "Mar", named after the fact that every single word in this language is the word "mar". +Spoken in different tones, with more or less emphasis on the various parts, or by drawing out parts of this word, a multitude of different "mar"s can be created, but they follow no apparent conventions. +Shadowkin can perfectly understand each other though and discuss complex topics using only this one word. +The Shadowkin can hear the Mar language from anywhere and understand it via Empathy, yet do not know who it is from unless they are close enough to see the sender. +Other humanoid species are incapable of understanding or learning Mar, as they are unable to accentuate their speech in the same way or hear some of the silent, Empathic tones they use. +Shadowkin tend to learn one or more languages of the Realspace beings. +The capability in such learned languages depends fully on each single Shadowkin, where some have only very broken capabilities, while others are fluent in several languages. + +[color=#a88b5e]Naming Conventions[/color] + +Shadowkin tend to name themselves with a singular word, ranging from states of being, such as Lone and Collected, to words that describe their memories connected to their supposed homeworld, like Dreamer. +Name schemes of the humans are usually frowned upon, as they do not reflect upon the Shadowkin, resulting in reactions ranging anywhere from an actual frown to being entirely ignored. +Shadowkin following another species naming scheme are often Blackeyes, not fitting in with other Shadowkin as well. +Names hold a great deal for Shadowkin because of how closely they are often tied to describing who they are. +Following life-changing events, Shadowkin often change their names to reflect the new person they have become. + +[color=#a88b5e]Rumors and Speculation[/color] + +Shadowkin are beings from another dimension, capable of performing feats that others could only describe as "magic", with no scientific explanation. +It is speculated that Shadowkin actually have a whole nation in their dimension, and those that come to Realspace just simply refuse to talk about it. +Sometimes Shadowkin mention a "Hub", acting as evidence for this theory. + +Some believe Shadowkin are the result of experimentation, though them being taken and experimented on is a large piece of evidence denying this theory. + +Some believe Shadowkin are the result of an expedition crew that disappeared hundreds of years ago, even though the first Shadowkin sightings were long before that. +Obviously, this expedition ship performed time travel. + +## OOC Notes + +Extra information, should be read if playing Shadowkin, if not you should try to learn this in gameplay. + +[color=#a88b5e]History[/color] + +Shadowkin used to live on a very lush forest planet, using primitive technology to work with metal, create tools, and build stone structures. +According to the dreams, Shadowkin back then had forged tools and blades, but had no electricity, presumably putting them at a medieval technology level. +In a sudden event, everyone and everything organic suddenly found themselves in an alternate dimension, sucked straight out of their previous home. +The Shadowkin being ripped from their homes happened in three total "dimensional ripples". + +Now stuck in this alternate dimension, Shadowkin changed a lot. +They stopped aging and with time developed the ability to use the energy of this dimension to power their unusual "magic". +And even later, they learned how to leave the dimension and travel to Realspace and back again. +However, as the eons passes, memories became shady of their home. +Many Shadowkin forgot more and more about the thousands of years they had lived, reducing memory to focus on the more important closer time. +However in dreams, Shadowkin, even those born in Realspace, often have visions of their home planet. +Some events can trigger certain memories to return like meeting someone they knew from the past makes them remember in great detail who they are. +As such, it can happen that two Shadowkin can randomly meet and remember that they met hundreds of years ago, often confusing nearby unknowing humanoids. + +[color=#a88b5e]Biology[/color] + +If a Shadowkin personality changes drastically, their eye color will change as an effect, reflecting upon their new personality. +Shadowkin, being ageless entities, can look older or younger, but that is merely a visual representation of how they feel about their age. +22 years after birth a Shadowkin stops aging, and in all of their history no instance of them dying of old age has been recorded. + +[color=#a88b5e]Shadowkin energy[/color] + +Shadowkin have an odd organ in them, their "Core". +This organ is the source and storage place for their power. +Without it, they would be unable to use their abilities. +The Core is very sensitive to physical trauma, yet is very resilient to electrical or magical damage. +The Core can get irreversibly destroyed from overloading it, using too much power too quickly, which is what happens to the Blackeyes. +The Core can not be replaced, using a new one would require a new body, and trying to use another Shadowkin Core will result in death. + +The Shadowkin's ability to fall into a deep sleep is a method to recharge their energy at a significantly higher rate than idling. +Though while in this deep sleep, it is difficult to wake up, and cannot be woken up by anything other than themself. + +Shadowkin can know exactly how much energy they have, and feel differently based on how much they have. +They can also Empathically sense the energy of others nearby and can estimate how much energy they have based on their feelings. + +[color=#a88b5e]Shadowkin Abilities[/color] + +Shadowkin have a few abilities. +They can teleport, requiring a small amount of energy, but they can do it quickly. +They can teleport to and from The Dark, requiring much more energy than teleportation. +They can immediately fall into a deep sleep at any time. + +[color=#a88b5e]The Ritual[/color] + +When a Shadowkin reaches adulthood, they undergo a "Ritual". +During this Ritual they intentionally overload their energy reserves, forcing their capacity to expand rapidly in order to gain enough energy to travel between dimensions. +Most Shadowkin pass the Ritual and that's the end of it, but some Shadowkin perish or become Blackeyes during the ritual. + +[color=#a88b5e]Important Terminology[/color] + +[color=#a88b5e]Shadowkin:[/color] +The name given for your race. +While your race doesn't have a name for itself, this is how most of the Galaxy refers to you, so it's how you refer to yourself too. + +[color=#a88b5e]The Dark:[/color] +The other dimension where you are from. +There are theories that The Dark and Bluespace are connected, but you don't know the details about that. +The Dark is a dimension where strange rules apply. +For outsiders who somehow enter it, whatever they imagine being in there, they see there, if not too complex. +If an outsider comes with a willing Shadowkin they may see what the Shadowkin sees, being anything they imagine, or a reflection of the station. + +[color=#a88b5e]Blackeyes:[/color] +A Shadowkin who has undergone and failed the Ritual, or lost their ability via other methods. +The Blackeyes have completely black eyes, no matter their actual personality. +They choose a new name, which follows a favorite species' naming scheme. +They are often ignored or left alone more by other Shadowkin. +[color=#a88b5e]Note:[/color] Blackeyes correlation with black eyes is done entirely via roleplay, the game will not handle this for you. + +[color=#a88b5e]Mar:[/color] +A word used to verbally communicate feelings, emotions, wishes, hopes, ideas, and whatever, in addition to your Empathy. \ No newline at end of file diff --git a/Resources/ServerInfo/Nyanotrasen/Guidebook/Epistemics/Altar.xml b/Resources/ServerInfo/Nyanotrasen/Guidebook/Epistemics/Altar.xml index c3b211d296..540e15a724 100644 --- a/Resources/ServerInfo/Nyanotrasen/Guidebook/Epistemics/Altar.xml +++ b/Resources/ServerInfo/Nyanotrasen/Guidebook/Epistemics/Altar.xml @@ -5,18 +5,11 @@ The chapel has a [color=#a4885c]sacrificial altar[/color]. To use it, a psionic humanoid must be placed on it, and someone with either psionics or clerical training must initiate the sacrifice. It appears in the context menu on the altar, which can be opened with the right mouse button by default. - -Once sacrificed, the psionic humanoid's soul is trapped inside a [color=#a4885c]soul crystal[/color]. This is not the end for them; they can still talk both vocally and telepathically, and this form is much harder to destroy. - - -10% of the time, the altar will spawn a powerful psionic item along with the soul crystal. This chance increases to 50% if the sacrifice was performed by someone with clerical training, such as the [color=#a4885c]chaplain[/color] or [color=#a4885c]mystagogue[/color]. + + +As a reward for sacrificing a psionic, glimmer will be lowered substantially and you will be given some loot. +Usually this is a few bluespace crystals, but you can also get a powerful psionic item. ## Golemancy - - - - -Soul crystals can be installed into [color=#a4885c]golems[/color] to give the soul a new body. Golems are bound to serve their master. As constructs, they do not need to eat, drink, or breathe. -Note that for wood golems, if plants are planted on top of their head, the plants will still need those things. - +[color=red]Note: Golemancy is not implemented yet. Once you sacrifice a psionic you can borg them with an MMI.[/color] diff --git a/Resources/ServerInfo/RP_Rules.txt b/Resources/ServerInfo/RP_Rules.txt deleted file mode 100644 index edfe5632ac..0000000000 --- a/Resources/ServerInfo/RP_Rules.txt +++ /dev/null @@ -1,126 +0,0 @@ -[color=#ff0000]YOU MUST BE AT LEAST 16 YEARS OF AGE TO PLAY ON WIZARD'S DEN SERVERS. ANY USERS SUSPECTED OF BEING UNDER 16 YEARS OF AGE WILL BE BANNED UNTIL THEY ARE OF AGE.[/color] - -[color=#ff0000]DISCONNECTING FROM OR IGNORING/EVADING ADMIN-HELPS WILL RESULT IN AN APPEAL ONLY BAN.[/color] - -This is the "short" form of the rules, which has all the information any regular player should need. You can find the "long" form of the rules with more examples & clarifications of any ambiguity on our wiki at [color=#a4885c]wiki.spacestation14.io[/color]. If you are already familiar with LRP rules and would like to get a quick idea of what the diffences are between MRP this page clearly highlights them. -Should you need it. Some RP-specific documents available on the wiki such as Space Law, the Standard Operating Procedure, and the Alert Procedure will be mentioned here and are expected to be followed. - -[color=#ff0000]Recent Changes[/color] - - Revolutionary rules have been added (#12, #16) - - Silicon rules have been added (#23) - - Security/command rules have been updated to address forced borging (#22) - -[color=#a4885c]01.[/color] [color=#a4885c]The[/color] [color=#ffd700]Golden[/color] [color=#a4885c]Rule.[/color] Admins may excercise discretion with rules as they see fit. If you rule lawyer or line skirt, you will get removed. Admins will answer for use of this privilege. - -[color=#ff0000]ZERO TOLERANCE RULES[/color] - -[color=#a4885c]02.[/color] Absolutely no hate speech, slurs, bigotry, racism, specism (demeaning other characters in-game due to their in-game race), sexism, or anything even remotely similar. (YOU WILL GET PERMABANNED) - -[color=#a4885c]03.[/color] Absolutely no Erotic Roleplay (ERP) or sexual content, including direct or indirect mentions of sexual behavior or actions. (YOU WILL GET PERMABANNED) (Leeway is given to insults, ex: 'You are a dickhead', do not push it) - -[color=#a4885c]04.[/color] Don't communicate in-game/in-character information through methods outside of the game (such as talking in Discord with other users actively playing or by talking to your sibling across the room while you are both playing). This is referred to as "Metacomming". Adminstrators cannot police metacommunications, we must assume it is being abused. (ALL INVOLVED WILL GET PERMABANNED) - -[color=#a4885c]05.[/color] Attempting to evade game bans will result in an automatic appeal-only permanent ban that is only appealable after six months and only with a voucher of good behavior from another SS13/SS14 server. Attempting to evade job bans will result in an appeal-only permanent ban. (YOU WILL GET BANNED MUCH WORSE THAN YOU ALREADY WERE) - -[color=#ff0000]GENERAL ETIQUETTE[/color] - -[color=#a4885c]06.[/color] These are English servers. Speak only English in IC and OOC. - -[color=#a4885c]07.[/color] Don't use exploits or external programs to play, gain an advantage, or disrupt/crash the round/server. This includes autoclickers and scripts to automate the game or evade AFK detection. Intentionally attempting to lag/crash the server will result in an immediate appeal-only ban. - -[color=#a4885c]08.[/color] Don't use multiple SS14 accounts to play (referred to as "multi-keying"). Users knowingly using multiple SS14 accounts will have all of their accounts banned. - -[color=#a4885c]09.[/color] Do not ignore the admin help relay or abuse it by flooding it with garbage, checking for admins before stating a problem (ex: "hello?", "any admins?"), using it as a chatroom, or sending messages of no substance. Hostility to administators in the relay will likely result in your removal. All admin helps are sent to the SS14 Discord. - -[color=#ff0000]IN GAME & ROLEPLAY RULES[/color] - -[color=#a4885c]10.[/color] Pick a realistic name that could appear on a birth certificate with at least a first and last name (leeway is given to this for Clowns, Mimes, and non-human races). - - Names of notable famous or fictional persons or names that resemble/parody them are strictly forbidden. You are not clever if you slightly change a famous name around. Terrible names open you up to being politely reminded to change it, smited, or instantly banned, depending on severity. - - Names resulting in inappropriate phonetic play-on-words are forbidden (ex: "Mike Oxlong", "Ben Dover", "Dixie Normus"). They are also extremely overdone. - -[color=#a4885c]11.[/color] Act like an actual human being on a space station in a medium-roleplay (MRP) environment. Do not use text speak or emoticons IC, and do not refer to OOC things like admins in-game. Do not threaten players that you are calling the admins on them. Do not use emotes to bypass speech filters or muteness. You are not required to write a backstory or follow procedure to exacts; however, you are expected to at least make an effort to act like your role. - - This server is a "Roleplay Expected" server. We define this as performing your assigned duties, "doing your job". This means it is important to do what is expected out of your department and not what would be expected out of other departments. - - Don’t do other peoples jobs for them. Opt in for the role you intend to play or change your job by visiting the Head of Personnel. Failure to do your basic duties may result in a job ban. - -[color=#a4885c]12.[/color] Don't be a dick. You are playing a multiplayer game with other people who also want to enjoy the game. - - [color=#ff0000]The arrivals station, shuttle, and general arrivals docking area are completely off-limits to any hostile activity, including activity by antagonists. Attacking newly spawned players in these areas or damaging/sabotaging these areas is strictly forbidden.[/color] - - Do not intentionally make other players' lives hell for your own amusement. - - [color=#ff0000]THE ROUND IS NOT OVER UNTIL THE GAME RETURNS TO THE LOBBY. ESCALATION AND SELF-ANTAG RULES APPLY EVEN AFTER THE ROUND SUMMARY APPEARS.[/color] - - Antagonists have a lot of leeway with this rule and may kill/sabotage as they see fit, however if your behavior degrades the experience for the majority of the server you will be told to stop. Antagonists are still generally forbidden from causing massive station damage early into the round (less than 30 minutes) and are forbidden from needlessly prolonging rounds. For antagonist specific rules, see the "long" form of the rules at [color=#a4885c]wiki.spacestation14.io[/color]. - -[color=#a4885c]13.[/color] Don't harass or target players across rounds for actions in prior rounds or for actions outside of the game (this is referred to as "Metagrudging".) - - Annoying players for IC reasons in the current round is fine; doing it across rounds or as a ghost role after they kill you is not. - -[color=#a4885c]14.[/color] Don't use information gained from outside your character's knowledge to gain an advantage (this is referred to as "Metagaming"). - - Using information you gain from outside your own character (such as spectating while a ghost, metacomms, or other means) to your advantage is strictly forbidden. If you take a ghost role, unless otherwise stated, you DO NOT REMEMBER ANYTHING from your past life. - - New Life Rule is in effect, you remember all events up until you fall unconscious unless you enter a dead state. Being defibrillated will return all your memories expect for the events leading up to your death, being cloned will make your character forget everything since the shift started. - -[color=#a4885c]15.[/color] Do your best not to interact negatively with SSD/AFK players. Moving them to safety is acceptable; killing, looting, or otherwise griefing them while they are away is not. - - SSD characters are players who are disconnected or AFK. It is possible for players to return to SSD bodies. Players become catatonic when they take a ghost spawner role or commit suicide. Players are NOT able to return to these bodies without admin intervention. - - If the player in question is an antag’s target or they are being secured by security, interactions to finish what is required of your duties/objectives are always acceptable. - - Ahelping about an SSD/AFK player may grant an exception to this rule. - - This does not apply to players that are catatonic, although needlessly killing or harming catatonic players is discouraged. - -[color=#a4885c]16.[/color] Follow escalation rules and don't murder someone for slipping you, use common sense. Do not make Cargonia. - - You can defend yourself to the extent of protecting your own life. - - Security may use less-lethal force to effect arrests of criminals. - - Don't outright leave people to die if you get in a fight, make an effort to heal them or bring them to Medbay. - - Adminhelp the situation if you think someone is over-escalating. - - Department strikes, revolutions (ex: cargonia and any variation thereof), riots, cults, and any other type of similar largely disruptive behavior are strictly forbidden. Other than for revolutionary antagonists, these activities are strictly forbidden. All players, including antagonists other than revolutionaries, must obtain admin permission before engaging in this behavior (forewarning: you are unlikely to get permission). - -[color=#a4885c]17.[/color] Don't immediately ghost or suicide from your role if you do not get antagonist (referred to as "Antag-rolling") or from head roles without notifying your chain of command or administrators. - - This is not fair to other players actually waiting patiently for an antagonist round. Alternatively, if you do not want to play an antagonist or do not want to cause conflict, do not opt-in for antagonist roles. - - Head of Staff roles help drive rounds. If you need to leave, please admin-help your role and that you are leaving. There is no need to wait for a reply when admin-helping that you need to disconnect as a head role. - -[color=#a4885c]18.[/color] Don't rush for or prepare equipment unrelated to your job for no purpose other then to have it "just in case" (referred to as "Powergaming"). - - A medical doctor does not need insulated gloves, and the Head of Personnel does not need to give themselves armory access so they can go grab a gun. Have an actual reason for needing these things. - - Don't manufacture weapons, bombs, or death poisons before you know of any reason you would need them. - - Don't pre-emptively hide antagonist objectives or pre-emptively secure them with higher security then normally required. - - Don't manufacture or prepare things for the "end of the round" when the shuttle docks with Central Command. - -[color=#a4885c]19.[/color] Intentionally making yourself a major problem/annoyance/disruption for the crew or other players at large while not an antagonist is forbidden (referred to as "self-antagging"). - - Don't openly try to cooperate with obvious or known antagonists as a non-antagonist. - -[color=#ff0000]SECURITY & COMMAND RULES[/color] -[color=#ff0000]Space Law, Standard Operating Procedure and Alert Procedure policy/guidelines are expected to be adhered to[/color]. These can be found at wiki.spacestation14.io. -If you regularly play Security or Command roles and got this far, we applaud you for reading. These rules also apply to any individual who is promoted or is acting in the place of a Security/Command role (unless they are an antagonist). - - -[color=#a4885c]20.[/color] Command and Security are held to a higher standard of play. - - Be competent in your job and department. Failure to know the basics of your department is liable to result in a job ban. - - Do not willingly and openly cooperate with terrorists/antagonists. Do not give away your objective items. Some leeway is given to making deals with antagonists if the deal benefits the safety or situation of the station as a whole and not just yourself. - - Uphold the Law & maintain order. Do not engage in lawbreaking activity or troublemaker behavior. Security is expected to intervene into criminal activity where possible. Heads of Staff are at minimum expected to report criminal activity to Security. - - Do not immediately abandon your position as a Command role and go do whatever you want instead of managing your department/the station. Do not abuse your position or use it to make arbitrary choices to the detriment of the station. - - Do not hire random crew to be your bodyguards or promote random to Captain or a Head of Staff at random. If you need bodyguards, talk to your security department. If you need a new Command role, talk to the personnel in that related department. - - '''Do not abandon the station during Nuclear Operatives. You are supposed to protect the station, not let operatives kill everyone on it without a fight.''' - -[color=#a4885c]21.[/color] Security/Command should try to remain non-lethal and effect arrests, except in the following special circumstances, where they may choose to use lethal force: - - Lethal force is used against you (ex: firearms, lasers, disabling/stunning weapons with intent to kill, deadly melee weapons) - - Suspect is wearing clothing or showing immediately dangerous equipment only used by enemy agents/antagonists (ex: Syndicate EVA Suit, Bloodred Hardsuit, Holoparasite, C-20R, etc.). - - You determine that your life or the life of an innocent is in immediate danger. - - The suspect is unable to be safely detained by less-lethal means. This includes suspects who continually resist efforts to be cuffed or continually manages to escape. - - If no other reasonable options are readily available and allowing the suspect to continue would be an unreasonable danger to the station/crew. - -Security/Command will be expected to answer for use of lethal force. Security/Command will be expected to effect arrests on criminals and prevent them from dying while in custody, even if lethal force is used. Security/Command is strongly required to clone antagonists and effect a sentence as deemed appropriate by Space Law. - -[color=#a4885c]22.[/color] Security/Command are expected to protect detainees in their custody to the best of their ability so as long as it does not come to unreasonable risk to themselves, the crew, or the station at large to do so. - - Brig times should generally not exceed 20 minutes unless stated otherwise in Space Law. Repeat offenders or antagonists may be permabrigged in accordance with Space Law. - - Security may choose to confiscate dangerous items (weapons, firearms) as well as items used to commission crimes or items that prove problematic in possession of the detainee (tools, insulated gloves, etc.). - - Detainees that die in your custody must be cloned unless they have been (legally) executed, suicide, or there is strong reason to believe they are an antagonist. - - Executions must be for a executable crime and approved by the Captain/Acting Captain, who will answer for approving it alongside Security's chain of command. Those who willingly attempt to damage/destroy or escape from the permabrig may be executed. - - Any prisoner may be borged with their consent. Borging may be offered as an alternative to execution, but cannot be forced if the prisoner is able to consent. - - Detainees in the brig have the right to know what they are being charged with, as well as basic medical aid, at least to the point they are no longer at risk of dying. - -[color=#ff0000]SILICON RULES[/color] -These rules also apply to any individual who is a silicon, including cyborgs and AI. As with other rules, more details are available on our wiki at [color=#a4885c]wiki.spacestation14.io[/color]. - -[color=#a4885c]23.[/color] You must follow your laws - - Silicons without any laws are free from any restrictions that would normally be placed by laws, but self-antagging rules still apply unless they are also antagonists. - - The order of your laws determines law priority. Law 1 takes priority over laws 2 and 3, and so on. - - Each individual silicon must remain consistent in their interpretations of laws through the round. - - Any silicon role not following their laws, or having laws that are a danger to the crew or station may be disabled or destroyed. Any silicon role posing a danger or disruption to the crew may be disabled or destroyed if there is no other reasonable and less severe way of dealing with them. - - Characters who are turned into cyborgs can remember their former lives, however they are still bound to their laws. - - Syndicate Agents and Revolutionaries are considered "crewmembers" for the purpose of laws that refer to crewmembers. Generally speaking, if the person appears on the crew manifest, they can be considered a crewmember. The captain or acting captain may hire or fire crewmembers by making it clear that they are no longer crew. Simply demoting someone to passenger is not sufficient to consider them fired. - - "Harm" is at minimum seen as physical violence or damage against someone or something. If the player wishes, they may choose to interpret psychological harm or similar aspects as harm as well. If two actions are likely to cause harm via action or inaction, silicons will be expected to try and pursue the option with the least potential for harm, however silicons instructed to prevent harm are still forbidden from directly causing harm. You can take an action or not act in cases that might result in eventual harm if it minimizes harm, but you cannot do so if it results in immediate harm. Silicons should default to inaction if neither action nor inaction can prevent harm. - - When receiving orders or directives from crewmembers and with a law that instructs you must obey, conflicting orders typically defer the choice to the silicon player of which directive you choose to obey if they conflict (taking into account the priorities of your other laws). - - Orders to silicons that are clearly unreasonable or obnoxious are a violation of the "Don't be a dick" rule. They can be ignored and can be ahelped. diff --git a/Resources/ServerInfo/RedialAddresses.txt b/Resources/ServerInfo/RedialAddresses.txt deleted file mode 100644 index a1845990bc..0000000000 --- a/Resources/ServerInfo/RedialAddresses.txt +++ /dev/null @@ -1,5 +0,0 @@ -# 1. Use addresses in the format ss14://example.com:1212 or ss14s://example.com:1212 or ss14://192.168.0.1:1212 etc -# 2. Make sure that your server has hub.server_url CVar set so that it will not redial people to itself. -# 3. Put comments on their own line -# Goob 1 -ss14://noda.avesmaximus.eu:4888 \ No newline at end of file diff --git a/Resources/ServerInfo/RedialAddressesCentral.txt b/Resources/ServerInfo/RedialAddressesCentral.txt deleted file mode 100644 index 58e77e2cfd..0000000000 --- a/Resources/ServerInfo/RedialAddressesCentral.txt +++ /dev/null @@ -1,6 +0,0 @@ -# 1. Use addresses in the format ss14://example.moe:1212 or ss14s://example.moe:1212 or ss14://192.168.0.1:1212 etc -# 2. Make sure that your server has hub.server_url CVar set so that it will not redial people to itself. -# 3. Put comments on their own line -# This version contains only servers listed on the hub located at https://central.spacestation14.io/hub/ -# Goob 1 -ss14://noda.avesmaximus.eu:4888 diff --git a/Resources/ServerInfo/Rules.txt b/Resources/ServerInfo/Rules.txt index 3e28580bbe..47b37a6343 100644 --- a/Resources/ServerInfo/Rules.txt +++ b/Resources/ServerInfo/Rules.txt @@ -1,20 +1,18 @@ [color=#ff0000]YOU MUST BE AT LEAST 14 YEARS OF AGE TO PLAY ON GOOB STATION SERVERS. ANY USERS SUSPECTED OF BEING UNDER 14 YEARS OF AGE WILL BE BANNED UNTIL THEY ARE OF AGE.[/color] -[color=#ff0000]DISCONNECTING FROM OR IGNORING/EVADING ADMIN-HELPS WILL RESULT IN AN APPEAL ONLY BAN.[/color] +[color=#bb00bb]This is the only source of server rules that apply here, which ideally has all the information any regular player should need. Please do not ever hesitate to ask either an Admin in[/color] [color=#DC143C]AHelp (F1)[/color][color=#bb00bb] or in the Discord server if you ever want clarification on the rules.[/color] -[color=#ff0000]THE USAGE OF ANY THIRD-PARTY APPLICATIONS/SCRIPTS/CLIENT MODIFICATIONS TO GAIN AN ADVANTAGE, AVOID INTENDED GAME/SERVER MECHANICS, OR TO HARM SERVER INFRASTRUCTURE IS STRICTLY PROHIBITED. ANY AND ALL INSTANCES OF THIS WILL BE MET WITH AN APPEAL-ONLY BAN.[/color] +We do not have a wiki, instead, we have or will have all the needed information available via Guidebooks (NumPad0), such as how to power the station. If we do not have some bit of information (how to do a job or how specifically to execute something a document says) you may ask an admin via [color=#DC143C]AHelp (F1)[/color] or ask other players via the [color=#66bbff]OOC[/color] or [color=#66e0e0]LOOC[/color] chat channels. -[color=#00ff00]Rules Update 11Mar2024 - Added Cryo Rules, Changed the Prisoner Rule, Expanded on EORG, added rules aimed at meta-grudging/vitriolic OOC/LOOC, and clarified part of Rule 6[/color] +[color=#a4885c]0.[/color] [color=#a4885c]The[/color] [color=#ffd700]Golden[/color] [color=#a4885c]Rule.[/color] Admins may exercise discretion with rules as they see fit. If you rule lawyer or line skirt, you will get removed. Admins will answer for use of this privilege. [color=#ffff00]Goob Station is a Medium Roleplay server. Try to immerse yourself into your character. This includes doing your job, interacting with your fellow crewmates, and using roleplay as the primary vessel to play the game. MRP places less emphasis on “winning” and more on just telling a story.[/color] -If you have any questions about these rules, please use the admin help (ahelp) menu by hitting F1 in-game or clicking the “Ahelp” button in the lobby. +[color=#a4885c]2.[/color] This is an English server, and you are expected to use English when communicating through any server-related channels. -[color=#a4885c]0.[/color] Admins can disregard any and all of these rules if they deem it in the best interest of the current round, server, and/or community at large. - - Administrators will be held fully accountable for their actions if they exercise this privilege. - - All of these rules apply as they are intended. Every example of a rule break cannot be defined as written, therefore, enforcement of the rules is subject to staff interpretation of the rule's intention. +[color=#a4885c]3.[/color] Do not ignore the [color=#DC143C]AHelp[/color] or abuse it by flooding it with garbage, checking for admins before stating a problem (i.e. "hello?", "any admins?" - also called "asking to ask"), or sending messages of no substance. -[color=#a4885c]1.[/color] Erotic Roleplay (ERP), erotic content, or 18+ sexual content is [color=#ff0000]not allowed under any circumstance[/color]. This includes comments not explicitly sexual in nature that contain words, phrases, or ideations that are deemed inappropriate. [color=#ff0000]If roleplay reaches a point where it has become sexual and/or uncomfortable, immediately stop and contact an administrator.[/color] +[color=#a4885c]4.[/color] Attempting to evade game bans will result in an automatic appeal-only permanent ban. Similarly, attempting to evade job bans will result in an appeal-only permanent ban. [color=#a4885c]2.[/color] Follow the server expectations - Do not cheat. @@ -31,17 +29,7 @@ If you have any questions about these rules, please use the admin help (ahelp) m * Neutral parties, such as space dragons or sentient artifacts activating harmful nodes. * Attempts to block the docking ports or ports leading into Central Command. -[color=#a4885c]3.[/color] Follow Chat Guidelines - - Use English as your primary method of communication. - - Do not spam. - - Do not advertise. - - Be respectful towards other players in LOOC and OOC channels, and avoid making others uncomfortable. This can range anywhere from starting arguments to personal attacks against others, depending on the context. - - Do not use netspeak in character (i.e. btw, lmfao). - - Do not use the Emotes channel to bypass an inability to speak. This includes examples like "motions for you to put parmesan THEN sauce on the spaghetti," "im friendly," and "huh weird looks like I can't type." - - Use the LOOC and OOC channels properly. Don’t speak of in-character matters in those channels unless you’re asking questions related to in-game concepts. - * DO NOT use in-character channels to bypass a lack of ability to use OOC/LOOC chats (e.g. "Huh, wonder where captain went? *OOC* He probably left to get dinner lol"). This will result in an immediate dewhitelist. - - Hate speech, slurs and bigotry are [color=#ff0000]not allowed[/color]. Words that are closely tied to real life slurs are [color=#ff0000]not allowed[/color]. - - No racist remarks towards in-game races/morphotypes (i.e. Simulated Racism), while you don’t have to like everybody, you should not be acting upon nor expressing your distaste for other races/morphotypes. +[color=#a4885c]6.[/color] No engaging in sexual acts. [color=#a4885c]4.[/color] Follow Metagaming guidelines - If you die and get revived, do not act on things you saw while you were dead. @@ -53,83 +41,41 @@ If you have any questions about these rules, please use the admin help (ahelp) m - [color=#ff0000]Do not stream the current round to the Goob Station Discord.[/color] - Do not place players into cryosleep unless they have given consent to do so, they are fully catatonic, or they have been sentenced to preservative stasis. Always examine a character to double check if they are SSD or catatonic prior to placing them into cryosleep. -[color=#a4885c]5.[/color] If a player dies and is brought back by way of cloning or borgification, they forget the last five minutes leading up to their death and cannot describe who or what killed them. - -Players that are revived by using a defibrillator CAN recall what killed them and do not have any forgetfulness about what happened while they were alive. - -[color=#ff0000]Please report players who violate this rule.[/color] - -[color=#a4885c]6.[/color] All constructed/summoned beings that have laws are bound by those laws and must abide by them. - - If a being has a master, they MUST follow their master's orders. - - Your master is held accountable if they order you to do something malicious. - *This does not apply to breaking server rules. If you are ordered to do something that would break a server rule, disregard it and inform an admin. - - Not having orders, or being given free will by your master does NOT give you permission to self-antag or grief the crew. - -[color=#a4885c]7.[/color] Follow Naming Conventions - - In-character names must fit the server standards of: - * Doesn't make obvious references - * Doesn't disturb roleplay - OR - * Is a result of random name generation. - - The only exception to the above is that theatrical roles like clown, boxer, and mime are allowed stage names with some freedom, as long as it is not obscene. - -[color=#a4885c]8.[/color] Follow Roleplay Guidelines - - Treat your character as a separate entity from you, the player. Your character's actions, feelings, and knowledge in-game should be based solely on the character's experiences and not your own as the player. Low roleplay actions that have no regard for your character or the setting (Memes, silly copy paste spam IC) are not acceptable. - - Character development can occur over rounds but each round is a soft-reset, meaning you can have previous shift experience but your character will never have died in the past. - - Command and Security will be held to a higher standard for roleplay. - - By picking prisoner, you have chosen to RP as a prisoner. You are still subject to rules pertaining to escalation, and should only seek to escape from the brig with good roleplay reasoning, such as abusive security, or a badly damaged perma. Escaping for no reason is considered a self-antag activity. If you are unsure whether your escape reason is valid, feel free to AHelp it first. - -[color=#a4885c]9.[/color] Follow Escalation Guidelines - - Do not escalate situations needlessly. Very few things are deserving of a fight to the death. - - Antagonistic ghost roles, and pest ghost roles like mice are always fair game for attacking. Don't grief crew-aligned ghost roles like familiars, drones, or pets without provocation. - - If a fight results in someone being critically injured, seek medical help for them. If they die, do not destroy or otherwise hide their body. - -[color=#a4885c]10.[/color] Follow Antagonist Guidelines - - The damage antagonists cause should be roughly proportional to their objectives, and contribute towards achieving them in some way. However antagonists have leniency in regards to what they can and can’t do. If you are concerned as to whether or not what you're about to do is allowed, feel free to ahelp and ask an admin. - - Other antagonists are not necessarily your friends. Traitors, rat kings, and possibly even space dragons are free agents, but no one should be working together with xenomorphs or zombies. - - Exploits, arrivals camping, unnecessary round extensions, and other extremely lame behavior are forbidden. - - Ghost roles have their own independent rules that must be followed. [color=#ff0000]Breaking these rules can result in a ban, whitelist removal, or both.[/color] - -[color=#a4885c]11.[/color] Psionics - - Players that have psionic powers are allowed to use them at-will to accomplish their roleplay goals. It should be noted that in-character consequences can happen as a result of their use, including being stripped of psionic powers or even death. - - As a mantis, it is not your goal to hunt down psionics. Do not mindbreak others against their will solely because they have psionic powers. - -[color=#a4885c]12.[/color] Don't rush for or prepare equipment unrelated to your job for no purpose other than to have it "just in case" (referred to as "Powergaming"). - - A medical doctor does not need insulated gloves, and the Head of Personnel does not need to give themselves armory access so they can go grab a gun. Have an actual reason for needing these things. - - Don't manufacture weapons, bombs, or deadly poisons before you know of any reason you would need them. - - Don't preemptively hide antagonist objectives or preemptively secure them with higher security than normally required. - - Don't manufacture or prepare things for the "end of the round" when the shuttle docks with Central Command. - -[color=#ff0000]SECURITY & COMMAND RULES[/color] -These rules apply to any individual who is promoted or is acting in the place of a Security/Command role (unless they are an antagonist). - -[color=#a4885c]13.[/color] Security and command roles are held to a higher standard and must follow space law. - - If you don’t have time to play a full round, do not select these roles. - - If you need to leave your computer, send an ahelp or notify your fellow crew via the radio. - - Be competent in your job and department. Failure to know the basics of your department is liable to result in a job ban. - - Security and Command roles are forbidden from using a syndicate uplink to receive contraband without written permission from Central Command. - - Do not give away your objective items (e.g. Captain’s equipment, Head of Personnel’s ID, etc.). Some leeway is given to making deals with criminals if the deal benefits the safety or situation of the station as a whole and not just yourself. - - Uphold the Law & maintain order. Do not engage in lawbreaking activity or troublemaker behavior. Security is expected to intervene into criminal activity where possible. Heads of Staff are at minimum expected to report criminal activity to Security. - - Do not immediately abandon your position as a Command role and go do whatever you want instead of managing your department/the station. Do not abuse your position or use it to make arbitrary choices to the detriment of the station. - - Do not hire random crew to be your bodyguards or promote random crewmember to Captain or a Head of Staff at random. If you need bodyguards, talk to your security department. If you need a new Command role, talk to the personnel in that related department. - - Do not abandon the station during Nuclear Operatives. You are supposed to protect the station, not let operatives kill everyone on it without a fight. - -[color=#a4885c]14.[/color] Security (and Command where applicable) should try to remain non-lethal and effect arrests. Security/Command will be expected to answer for use of lethal force. Security/Command will be expected to effect arrests on criminals and prevent them from dying while in custody, even if lethal force is used. - -In the following special circumstances, lethal force may be used by Security: - - Lethal force is used against you (ex: firearms, lasers, disabling/stunning weapons with intent to kill, deadly melee weapons) - - Suspect is equipped with dangerous equipment only used by enemy agents/antagonists and is not cuffed nor surrendering (ex: Bloodred Hardsuit, China Lake, C-20R, etc.). - - You determine that your life or the life of another person is in immediate danger. - - The suspect is unable to be safely detained by less-lethal means. This includes suspects who continually resist efforts to be cuffed or continuously manage to escape. - - If no other reasonable options are readily available and allowing the suspect to continue would be an unreasonable danger to the station/crew. - -[color=#a4885c]15.[/color] Security/Command are expected to protect detainees in their custody to the best of their ability so as long as it does not come to unreasonable risk to themselves, the crew, or the station at large to do so. - - Brig times should generally not exceed 20 minutes unless the crime is permabriggable. - - Security may choose to confiscate dangerous items (weapons, firearms) as well as items used to commit crimes or items that prove problematic in possession of the detainee (tools, insulated gloves, etc.). - - Security may inspect PDAs of detainees and withhold them for the duration of detention, but can only confiscate them if they are obviously contraband. Suspicion alone is NOT sufficient for PDA confiscation by Security. - - Security is prohibited from checking crewmates for implants without reasonable suspicion. - - Detainees that die in your custody must be cloned unless they have been (legally) executed or have committed suicide. - - Executions must be for a capital crime, used only as a last resort, and MUST be authorized by the highest ranking member of Security, who will answer to the use of execution. - - Detainees in the brig have the right to know what they are being charged with. - -[color=#a4885c]16.[/color] Command members besides the Logistics Officer are not permitted to leave the station on salvage expeditions. +[color=#a4885c]8.[/color] Don't communicate in-game/in-character information through methods outside the game (such as talking in Discord with other users actively playing about the game or by talking to your sibling across the room while you are both playing). This is referred to as "Metacomming" and it is strictly forbidden. + +[color=#a4885c]9.[/color] Don't "multi-key" (use multiple accounts simultaneously). Users knowingly using multiple SS14 accounts will have all of their accounts banned. + +[color=#a4885c]10.[/color] Don't use information gained from outside your character's knowledge to gain an advantage (this is referred to as "Metagaming"). + +[color=#a4885c]11.[/color] Don't rush for or prepare equipment unrelated to your job for no purpose other than to have it "just in case" (referred to as "Powergaming"). + +[color=#a4885c]12.[/color] Don't immediately ghost, suicide, or cryostasis if you do not get an antagonist role (referred to as "Antag-rolling"). + - This is not fair to other players actually waiting patiently for an antagonist round or wanting good staff. Alternatively, if you do not want to play an antagonist or do not want to cause conflict, do not opt in for antagonist roles. + +[color=#a4885c]13.[/color] Act like an actual human being on a space station. Avoid use of text speak or emoticons [color=#bbbbbb]IC[/color], and do not refer to [color=#66bbff]OOC[/color] things like admins in-game. Remember that this is a roleplaying game, and people are expected to try to react to situations realistically, even if it's not the "optimal" thing to do. What's good for Roleplay > What's good for Gameplay. + +[color=#a4885c]14.[/color] Don't harass or target players across rounds for actions in prior rounds or for actions outside the game without their approval (this is referred to as "Metagrudging"). + +[color=#a4885c]15.[/color] Intentionally making yourself a major problem/annoyance/disruption for the crew or other players at large while not an antagonist is forbidden without admin approval (referred to as "self-antagging"). + +[color=#a4885c]16.[/color] Follow escalation rules and don't murder someone for slipping you, use common sense. + - Don't outright leave people to die if you get in a fight, make an effort to heal them or bring them to [color=#52B4E9]Medical[/color]. + - [color=#DC143C]AHelp (F1)[/color] the situation if you think someone is over-escalating. + +[color=#ff0000]COMMAND/SECURITY RULES[/color] + +[color=#a4885c]17.[/color] If you sign up for a [color=#334E6D]Command[/color] or [color=#DE3A3A]Security[/color] role, you are expected to know the basics of the game, your job, and the job(s) you supervise, if any. + - Don't engage in common troublemaker behavior and lawbreaking as a [color=#334E6D]Command[/color] or [color=#DE3A3A]Security[/color] role. + - Do not immediately abandon your position as a [color=#334E6D]Command[/color] role and go do whatever you want instead of managing your department/the station. + - As a [color=#334E6D]Command[/color] role, do not take over the jobs of others. The [color=#334E6D]HoP[/color] is not the [color=#DE3A3A]HoS[/color], for instance, and holds no direct power over Security. + +[color=#a4885c]18.[/color] [color=#DE3A3A]Security[/color] should try to remain non-lethal and effect arrests, unless there is a great risk of loss of life. + +[color=#a4885c]19.[/color] [color=#DE3A3A]Security[/color] are expected to answer for use of lethal force. [color=#DE3A3A]Security[/color] will be expected to effect arrests of criminals and prevent them from dying while in custody, even if lethal force is used. [color=#DE3A3A]Security[/color] is strongly encouraged, but not required, to clone antagonists and effect a permabrigging or other sentence as deemed appropriate. + +[color=#a4885c]20.[/color] [color=#DE3A3A]Security[/color] are expected to protect detainees in their custody to the best of their ability, so as long as it does not come to an unreasonable risk to themselves, the crew, or the station at large to do so. + - Detainees that die in custody must be revived, unless they have been legally executed. + +[color=#a4885c]21.[/color] All [color=#334E6D]Command[/color] jobs should [color=#DC143C]AHelp (F1)[/color] when they need to stop playing. Do not play these roles if you do not expect to be able to finish the round. + - These roles must exhibit some competency. Incompetence can result in a job ban. [color=#334E6D]Command[/color] roles are designed to lead and manage departments first. They are not intended to become do-it-all members of their departments. + - Crew promoted to acting heads of staff must step down when an official head of staff arrives at the station. This is to prevent confusion with the Chain of command when the new crew mate arrives. diff --git a/Resources/ServerInfo/RulesLRP.txt b/Resources/ServerInfo/RulesLRP.txt deleted file mode 100644 index cb8d58819f..0000000000 --- a/Resources/ServerInfo/RulesLRP.txt +++ /dev/null @@ -1,64 +0,0 @@ -[color=#ff0000]You must be 16 or older to play. Users under 16 will be banned immediately.[/color] -[color=#ff0000]Speak English, please.[/color] - -[color=#ff0000]ERP OF ANY KIND IS BANNED.[/color] - -[color=#ff0000]This server is an LRP server, not an NRP server. You are still expected to RP somewhat, but not as much as you are expected on the MRP server.[/color] - -[color=#a4885c]The[/color] [color=#ffd700]Golden[/color] [color=#a4885c]Rule.[/color] Admins can disregard any and all of these rules if they deem it in the best interest of the current round, server, and/or community at large. They will of course be held fully accountable for their actions if they exercise this privilege. - -[color=#a4885c]2.[/color] Follow the community expectations. This includes both in game and elsewhere in our community. - -Don't be a dick. -Do not grief as a non-antagonist; this includes against AFK and catatonic players. -Don't be racist or bigoted. -Do not cheat or abuse glitches; please report all bugs on Discord. -Do not evade bans. - -[color=#a4885c]3.[/color] Do not use information gained outside of in-character means, and do not say In Character (IC) things in the Local Out Of Character (LOOC) chat channel. - -I.e. metagaming. This especially refers to communication between players outside of the game via things like Discord, known as meta-comms. Characters are otherwise allowed to know everything about in-game mechanics or antagonists, as well as keep persistent friendships and relationships with other characters when not for the purpose of unfair advantage by teaming up together for little IC reason. -Do not say LOOC things in IC either. - -[color=#a4885c]4.[/color] After cloning, metempsychosis or taking a ghost role, you forget your previous life. - -If cloned, you don't have amnesia, but you do forget the last five minutes leading to your death and cannot describe who or what killed you. -Don't act on anything you saw while ghosted. - -[color=#a4885c]5.[/color] Security and Command roles are held to a higher standard and must follow space law. - -If you don’t have time to play a full round, do not select these roles. -If you need to leave your computer, send an ahelp and notify your fellow crew via the radio. - -[color=#a4885c]6.[/color] Follow Chat Guidelines - -Only speak in English. -Do not spam. -Do not advertise. -Do not use netspeak in character (i.e. LOL, ROFL). -Hate speech, slurs and bigotry are not allowed. Words that are closely tied to real life slurs are not allowed. -No Simulated Racism, While you don’t have to like everybody, you should not be acting upon your distaste for other races/morphotypes. - -[color=#a4885c]7.[/color] All constructed/summoned beings are bound by their laws and must abide by these laws. - -If a being has a master, they must follow their master's orders. -Your master is held accountable if they order you to do something malicious. - -[color=#a4885c]8.[/color] Follow Roleplay Guidelines - -Be sure to capitalize your character's First and Last name. -Your character's name cannot include profanity (i.e. Dixie Nourmus, Mike Hawk, John Dildo, etc.) -Treat your character as a separate entity from you, the player. Your character's actions, feelings, and knowledge in-game should be based solely on the character's experiences and not your own as the player. -By picking prisoner, you have chosen to RP as a prisoner. While escape is allowed, there are consequences for your actions. - -[color=#a4885c]9.[/color] Follow Escalation Guidelines - -Do not escalate situations needlessly. Very few things are deserving of a fight to the death. -Antagonistic ghost roles, and pest ghost roles like mice are always fair game for attacking. Don't grief crew-aligned ghost roles like familiars, drones, or pets without provocation. -If a fight results in someone being critically injured, seek medical help for them. - -[color=#a4885c]10.[/color] Follow Antagonist Guidelines - -The damage antagonists cause should be roughly proportional to their objectives, and contribute towards achieving them in some way. However antagonists have leniency in regards to what they can and can’t do. If you are concerned as to whether or not what you're about to do is allowed, feel free to ahelp and ask an admin. -Other antagonists are not necessarily your friends. Traitors, rat kings, and possibly even space dragons are free agents, but no one should be working together with xenomorphs, nuclear operatives, or zombies. -Exploits, arrivals camping, and other extremely lame behavior are forbidden. \ No newline at end of file diff --git a/Resources/Textures/Clothing/Back/etherealteleporter.rsi/equipped-BACKPACK.png b/Resources/Textures/Clothing/Back/etherealteleporter.rsi/equipped-BACKPACK.png new file mode 100644 index 0000000000..7496c91c55 Binary files /dev/null and b/Resources/Textures/Clothing/Back/etherealteleporter.rsi/equipped-BACKPACK.png differ diff --git a/Resources/Textures/Clothing/Back/etherealteleporter.rsi/icon.png b/Resources/Textures/Clothing/Back/etherealteleporter.rsi/icon.png new file mode 100644 index 0000000000..265318a96f Binary files /dev/null and b/Resources/Textures/Clothing/Back/etherealteleporter.rsi/icon.png differ diff --git a/Resources/Textures/Clothing/Back/etherealteleporter.rsi/meta.json b/Resources/Textures/Clothing/Back/etherealteleporter.rsi/meta.json new file mode 100644 index 0000000000..e4f5aa0f92 --- /dev/null +++ b/Resources/Textures/Clothing/Back/etherealteleporter.rsi/meta.json @@ -0,0 +1,56 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/ParadiseSS13/Paradise/blob/master/icons/mob/clothing/back.dmi", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-BACKPACK", + "directions": 4, + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Clothing/Eyes/Glasses/etherealgoogles.rsi/equipped-EYES.png b/Resources/Textures/Clothing/Eyes/Glasses/etherealgoogles.rsi/equipped-EYES.png new file mode 100644 index 0000000000..39fafeb144 Binary files /dev/null and b/Resources/Textures/Clothing/Eyes/Glasses/etherealgoogles.rsi/equipped-EYES.png differ diff --git a/Resources/Textures/Clothing/Eyes/Glasses/etherealgoogles.rsi/icon.png b/Resources/Textures/Clothing/Eyes/Glasses/etherealgoogles.rsi/icon.png new file mode 100644 index 0000000000..8ef5aa68d0 Binary files /dev/null and b/Resources/Textures/Clothing/Eyes/Glasses/etherealgoogles.rsi/icon.png differ diff --git a/Resources/Textures/Clothing/Eyes/Glasses/etherealgoogles.rsi/inhand-left.png b/Resources/Textures/Clothing/Eyes/Glasses/etherealgoogles.rsi/inhand-left.png new file mode 100644 index 0000000000..7ecbd93e8a Binary files /dev/null and b/Resources/Textures/Clothing/Eyes/Glasses/etherealgoogles.rsi/inhand-left.png differ diff --git a/Resources/Textures/Clothing/Eyes/Glasses/etherealgoogles.rsi/inhand-right.png b/Resources/Textures/Clothing/Eyes/Glasses/etherealgoogles.rsi/inhand-right.png new file mode 100644 index 0000000000..26fd8e57a4 Binary files /dev/null and b/Resources/Textures/Clothing/Eyes/Glasses/etherealgoogles.rsi/inhand-right.png differ diff --git a/Resources/Textures/Clothing/Eyes/Glasses/etherealgoogles.rsi/meta.json b/Resources/Textures/Clothing/Eyes/Glasses/etherealgoogles.rsi/meta.json new file mode 100644 index 0000000000..555efbc7da --- /dev/null +++ b/Resources/Textures/Clothing/Eyes/Glasses/etherealgoogles.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "JustAnOrange", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-EYES", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Clothing/OuterClothing/Misc/shadowkinrestraints.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/Misc/shadowkinrestraints.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 0000000000..e8618fc6b7 Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/Misc/shadowkinrestraints.rsi/equipped-OUTERCLOTHING.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/Misc/shadowkinrestraints.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/Misc/shadowkinrestraints.rsi/icon.png new file mode 100644 index 0000000000..def3161bb0 Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/Misc/shadowkinrestraints.rsi/icon.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/Misc/shadowkinrestraints.rsi/inhand-left.png b/Resources/Textures/Clothing/OuterClothing/Misc/shadowkinrestraints.rsi/inhand-left.png new file mode 100644 index 0000000000..5c15def766 Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/Misc/shadowkinrestraints.rsi/inhand-left.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/Misc/shadowkinrestraints.rsi/inhand-right.png b/Resources/Textures/Clothing/OuterClothing/Misc/shadowkinrestraints.rsi/inhand-right.png new file mode 100644 index 0000000000..99c96d368a Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/Misc/shadowkinrestraints.rsi/inhand-right.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/Misc/shadowkinrestraints.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Misc/shadowkinrestraints.rsi/meta.json new file mode 100644 index 0000000000..57a0b994f9 --- /dev/null +++ b/Resources/Textures/Clothing/OuterClothing/Misc/shadowkinrestraints.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "JustAnOrange", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + }, + { + "name": "icon" + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Interface/Actions/psionics.rsi/meta.json b/Resources/Textures/Interface/Actions/psionics.rsi/meta.json index 7fc83a4291..735bc293d1 100644 --- a/Resources/Textures/Interface/Actions/psionics.rsi/meta.json +++ b/Resources/Textures/Interface/Actions/psionics.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Created by leonardo_dabepis (discord)", + "copyright": "healing_word, revivify, shadeskip by leonardo_dabepis (discord), telekinetic_pulse by .mocho (discord), pyrokinetic_flare, summon_remilia, summon_bat and summon_imp by ghost581 (discord)", "size": { "x": 64, "y": 64 @@ -18,6 +18,18 @@ }, { "name": "telekinetic_pulse" + }, + { + "name": "pyrokinetic_flare" + }, + { + "name": "summon_imp" + }, + { + "name": "summon_remilia" + }, + { + "name": "summon_bat" } ] } diff --git a/Resources/Textures/Interface/Actions/psionics.rsi/pyrokinetic_flare.png b/Resources/Textures/Interface/Actions/psionics.rsi/pyrokinetic_flare.png new file mode 100644 index 0000000000..db728ec603 Binary files /dev/null and b/Resources/Textures/Interface/Actions/psionics.rsi/pyrokinetic_flare.png differ diff --git a/Resources/Textures/Interface/Actions/psionics.rsi/summon_bat.png b/Resources/Textures/Interface/Actions/psionics.rsi/summon_bat.png new file mode 100644 index 0000000000..60f571278b Binary files /dev/null and b/Resources/Textures/Interface/Actions/psionics.rsi/summon_bat.png differ diff --git a/Resources/Textures/Interface/Actions/psionics.rsi/summon_imp.png b/Resources/Textures/Interface/Actions/psionics.rsi/summon_imp.png new file mode 100644 index 0000000000..5de7c274fc Binary files /dev/null and b/Resources/Textures/Interface/Actions/psionics.rsi/summon_imp.png differ diff --git a/Resources/Textures/Interface/Actions/psionics.rsi/summon_remilia.png b/Resources/Textures/Interface/Actions/psionics.rsi/summon_remilia.png new file mode 100644 index 0000000000..fcfe2a3726 Binary files /dev/null and b/Resources/Textures/Interface/Actions/psionics.rsi/summon_remilia.png differ diff --git a/Resources/Textures/Interface/Actions/shadowkin_icons.rsi/darkswap.png b/Resources/Textures/Interface/Actions/shadowkin_icons.rsi/darkswap.png new file mode 100644 index 0000000000..3c2815e8c2 Binary files /dev/null and b/Resources/Textures/Interface/Actions/shadowkin_icons.rsi/darkswap.png differ diff --git a/Resources/Textures/Interface/Actions/shadowkin_icons.rsi/meta.json b/Resources/Textures/Interface/Actions/shadowkin_icons.rsi/meta.json new file mode 100644 index 0000000000..62b03fecaf --- /dev/null +++ b/Resources/Textures/Interface/Actions/shadowkin_icons.rsi/meta.json @@ -0,0 +1,23 @@ +{ + "version": 1, + "size": { + "x": 64, + "y": 64 + }, + "license": "CC-BY-SA-3.0", + "copyright": "DEATHB4DEFEAT#4404 (801294818839756811)", + "states": [ + { + "name": "darkswap", + "directions": 1 + }, + { + "name": "rest", + "directions": 1 + }, + { + "name": "shadeskip", + "directions": 1 + } + ] +} diff --git a/Resources/Textures/Interface/Actions/shadowkin_icons.rsi/rest.png b/Resources/Textures/Interface/Actions/shadowkin_icons.rsi/rest.png new file mode 100644 index 0000000000..188b4ec591 Binary files /dev/null and b/Resources/Textures/Interface/Actions/shadowkin_icons.rsi/rest.png differ diff --git a/Resources/Textures/Interface/Actions/shadowkin_icons.rsi/shadeskip.png b/Resources/Textures/Interface/Actions/shadowkin_icons.rsi/shadeskip.png new file mode 100644 index 0000000000..b0f1bd8dc8 Binary files /dev/null and b/Resources/Textures/Interface/Actions/shadowkin_icons.rsi/shadeskip.png differ diff --git a/Resources/Textures/Interface/Alerts/shadowkin_power.rsi/meta.json b/Resources/Textures/Interface/Alerts/shadowkin_power.rsi/meta.json new file mode 100644 index 0000000000..f642565f9a --- /dev/null +++ b/Resources/Textures/Interface/Alerts/shadowkin_power.rsi/meta.json @@ -0,0 +1,43 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "DEATHB4DEFEAT#4404 (801294818839756811)", + "states": [ + { + "name": "power0", + "delays": [[0.8, 0.8, 0.8, 0.8, 0.8, 0.8]] + }, + { + "name": "power1", + "delays": [[0.7, 0.7, 0.7, 0.7, 0.7, 0.7]] + }, + { + "name": "power2", + "delays": [[0.6, 0.6, 0.6, 0.6, 0.6, 0.6]] + }, + { + "name": "power3", + "delays": [[0.5, 0.5, 0.5, 0.5, 0.5, 0.5]] + }, + { + "name": "power4", + "delays": [[0.4, 0.4, 0.4, 0.4, 0.4, 0.4]] + }, + { + "name": "power5", + "delays": [[0.3, 0.3, 0.3, 0.3, 0.3, 0.3]] + }, + { + "name": "power6", + "delays": [[0.2, 0.2, 0.2, 0.2, 0.2, 0.2]] + }, + { + "name": "power7", + "delays": [[0.1, 0.1, 0.1, 0.1, 0.1, 0.1]] + } + ] +} diff --git a/Resources/Textures/Interface/Alerts/shadowkin_power.rsi/power0.png b/Resources/Textures/Interface/Alerts/shadowkin_power.rsi/power0.png new file mode 100644 index 0000000000..ab370f753e Binary files /dev/null and b/Resources/Textures/Interface/Alerts/shadowkin_power.rsi/power0.png differ diff --git a/Resources/Textures/Interface/Alerts/shadowkin_power.rsi/power1.png b/Resources/Textures/Interface/Alerts/shadowkin_power.rsi/power1.png new file mode 100644 index 0000000000..d72965eeec Binary files /dev/null and b/Resources/Textures/Interface/Alerts/shadowkin_power.rsi/power1.png differ diff --git a/Resources/Textures/Interface/Alerts/shadowkin_power.rsi/power2.png b/Resources/Textures/Interface/Alerts/shadowkin_power.rsi/power2.png new file mode 100644 index 0000000000..1b2c51575c Binary files /dev/null and b/Resources/Textures/Interface/Alerts/shadowkin_power.rsi/power2.png differ diff --git a/Resources/Textures/Interface/Alerts/shadowkin_power.rsi/power3.png b/Resources/Textures/Interface/Alerts/shadowkin_power.rsi/power3.png new file mode 100644 index 0000000000..0f93f925ac Binary files /dev/null and b/Resources/Textures/Interface/Alerts/shadowkin_power.rsi/power3.png differ diff --git a/Resources/Textures/Interface/Alerts/shadowkin_power.rsi/power4.png b/Resources/Textures/Interface/Alerts/shadowkin_power.rsi/power4.png new file mode 100644 index 0000000000..3f3035da0d Binary files /dev/null and b/Resources/Textures/Interface/Alerts/shadowkin_power.rsi/power4.png differ diff --git a/Resources/Textures/Interface/Alerts/shadowkin_power.rsi/power5.png b/Resources/Textures/Interface/Alerts/shadowkin_power.rsi/power5.png new file mode 100644 index 0000000000..af3f716861 Binary files /dev/null and b/Resources/Textures/Interface/Alerts/shadowkin_power.rsi/power5.png differ diff --git a/Resources/Textures/Interface/Alerts/shadowkin_power.rsi/power6.png b/Resources/Textures/Interface/Alerts/shadowkin_power.rsi/power6.png new file mode 100644 index 0000000000..9f7957c44f Binary files /dev/null and b/Resources/Textures/Interface/Alerts/shadowkin_power.rsi/power6.png differ diff --git a/Resources/Textures/Interface/Alerts/shadowkin_power.rsi/power7.png b/Resources/Textures/Interface/Alerts/shadowkin_power.rsi/power7.png new file mode 100644 index 0000000000..ac9f17f55b Binary files /dev/null and b/Resources/Textures/Interface/Alerts/shadowkin_power.rsi/power7.png differ diff --git a/Resources/Textures/Interface/Misc/job_icons.rsi/Librarian.png b/Resources/Textures/Interface/Misc/job_icons.rsi/Librarian.png index b10b1ed71e..114283c053 100644 Binary files a/Resources/Textures/Interface/Misc/job_icons.rsi/Librarian.png and b/Resources/Textures/Interface/Misc/job_icons.rsi/Librarian.png differ diff --git a/Resources/Textures/Mobs/Customization/Shadowkin/ears.rsi/meta.json b/Resources/Textures/Mobs/Customization/Shadowkin/ears.rsi/meta.json new file mode 100644 index 0000000000..b67f4f3489 --- /dev/null +++ b/Resources/Textures/Mobs/Customization/Shadowkin/ears.rsi/meta.json @@ -0,0 +1,19 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from S.P.L.U.R.T ears.dmi at commit https://github.com/SPLURT-Station/S.P.L.U.R.T-Station-13/commit/8b4abffbe538fbded19b44b989ebc6808748f31f", + "states": [ + { + "name": "shadowkin", + "directions": 4 + }, + { + "name": "shadowkin_stripes", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Mobs/Customization/Shadowkin/ears.rsi/shadowkin.png b/Resources/Textures/Mobs/Customization/Shadowkin/ears.rsi/shadowkin.png new file mode 100644 index 0000000000..3aec926c5e Binary files /dev/null and b/Resources/Textures/Mobs/Customization/Shadowkin/ears.rsi/shadowkin.png differ diff --git a/Resources/Textures/Mobs/Customization/Shadowkin/ears.rsi/shadowkin_stripes.png b/Resources/Textures/Mobs/Customization/Shadowkin/ears.rsi/shadowkin_stripes.png new file mode 100644 index 0000000000..ce1f04ce60 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/Shadowkin/ears.rsi/shadowkin_stripes.png differ diff --git a/Resources/Textures/Mobs/Customization/Shadowkin/tails32x32.rsi/meta.json b/Resources/Textures/Mobs/Customization/Shadowkin/tails32x32.rsi/meta.json new file mode 100644 index 0000000000..4731b9de3d --- /dev/null +++ b/Resources/Textures/Mobs/Customization/Shadowkin/tails32x32.rsi/meta.json @@ -0,0 +1,19 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "https://github.com/SPLURT-Station/S.P.L.U.R.T-Station-13/commit/96703f76bccd8fe6a96b78524efb97a9af661767 Shadowkin big fluff made by DSC@Cabbage#9633 (561159087765848084)", + "states": [ + { + "name": "shadowkin_shorter", + "directions": 4 + }, + { + "name": "shadowkin_medium", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Mobs/Customization/Shadowkin/tails32x32.rsi/shadowkin_medium.png b/Resources/Textures/Mobs/Customization/Shadowkin/tails32x32.rsi/shadowkin_medium.png new file mode 100644 index 0000000000..ca162bb1b0 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/Shadowkin/tails32x32.rsi/shadowkin_medium.png differ diff --git a/Resources/Textures/Mobs/Customization/Shadowkin/tails32x32.rsi/shadowkin_shorter.png b/Resources/Textures/Mobs/Customization/Shadowkin/tails32x32.rsi/shadowkin_shorter.png new file mode 100644 index 0000000000..979e4e6b26 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/Shadowkin/tails32x32.rsi/shadowkin_shorter.png differ diff --git a/Resources/Textures/Mobs/Customization/Shadowkin/tails64x32.rsi/meta.json b/Resources/Textures/Mobs/Customization/Shadowkin/tails64x32.rsi/meta.json new file mode 100644 index 0000000000..535c01bbaf --- /dev/null +++ b/Resources/Textures/Mobs/Customization/Shadowkin/tails64x32.rsi/meta.json @@ -0,0 +1,23 @@ +{ + "version": 1, + "size": { + "x": 64, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "https://github.com/SPLURT-Station/S.P.L.U.R.T-Station-13/commit/96703f76bccd8fe6a96b78524efb97a9af661767 Shadowkin big fluff made by DSC@Cabbage#9633 (561159087765848084)", + "states": [ + { + "name": "shadowkin", + "directions": 4 + }, + { + "name": "shadowkin_big", + "directions": 4 + }, + { + "name": "shadowkin_big_fluff", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Mobs/Customization/Shadowkin/tails64x32.rsi/shadowkin.png b/Resources/Textures/Mobs/Customization/Shadowkin/tails64x32.rsi/shadowkin.png new file mode 100644 index 0000000000..94ff21d9cb Binary files /dev/null and b/Resources/Textures/Mobs/Customization/Shadowkin/tails64x32.rsi/shadowkin.png differ diff --git a/Resources/Textures/Mobs/Customization/Shadowkin/tails64x32.rsi/shadowkin_big.png b/Resources/Textures/Mobs/Customization/Shadowkin/tails64x32.rsi/shadowkin_big.png new file mode 100644 index 0000000000..988aa6e589 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/Shadowkin/tails64x32.rsi/shadowkin_big.png differ diff --git a/Resources/Textures/Mobs/Customization/Shadowkin/tails64x32.rsi/shadowkin_big_fluff.png b/Resources/Textures/Mobs/Customization/Shadowkin/tails64x32.rsi/shadowkin_big_fluff.png new file mode 100644 index 0000000000..20ad696cce Binary files /dev/null and b/Resources/Textures/Mobs/Customization/Shadowkin/tails64x32.rsi/shadowkin_big_fluff.png differ diff --git a/Resources/Textures/Mobs/Demons/glimmer_wisp.rsi/meta.json b/Resources/Textures/Mobs/Demons/glimmer_wisp.rsi/meta.json new file mode 100644 index 0000000000..4f2cce97e1 --- /dev/null +++ b/Resources/Textures/Mobs/Demons/glimmer_wisp.rsi/meta.json @@ -0,0 +1,14 @@ +{ + "version": 1, + "license": "CC-BY-SA-4.0", + "copyright": "Created by @Vordenburg (github) for Nyanotrasen", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "willowisp" + } + ] +} diff --git a/Resources/Textures/Mobs/Demons/glimmer_wisp.rsi/willowisp.png b/Resources/Textures/Mobs/Demons/glimmer_wisp.rsi/willowisp.png new file mode 100644 index 0000000000..6ee16245ed Binary files /dev/null and b/Resources/Textures/Mobs/Demons/glimmer_wisp.rsi/willowisp.png differ diff --git a/Resources/Textures/Mobs/Demons/imp.rsi/imp.png b/Resources/Textures/Mobs/Demons/imp.rsi/imp.png new file mode 100644 index 0000000000..575c223ee8 Binary files /dev/null and b/Resources/Textures/Mobs/Demons/imp.rsi/imp.png differ diff --git a/Resources/Textures/Mobs/Demons/imp.rsi/meta.json b/Resources/Textures/Mobs/Demons/imp.rsi/meta.json new file mode 100644 index 0000000000..98f33679c7 --- /dev/null +++ b/Resources/Textures/Mobs/Demons/imp.rsi/meta.json @@ -0,0 +1,15 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Created by ghost581(Discord)", + "states": [ + { + "name": "imp", + "delays": [[0.3, 0.3, 0.3, 0.3]] + } + ] +} diff --git a/Resources/Textures/Mobs/Species/Shadowkin/organs.rsi/appendix.png b/Resources/Textures/Mobs/Species/Shadowkin/organs.rsi/appendix.png new file mode 100644 index 0000000000..0d2ad309c7 Binary files /dev/null and b/Resources/Textures/Mobs/Species/Shadowkin/organs.rsi/appendix.png differ diff --git a/Resources/Textures/Mobs/Species/Shadowkin/organs.rsi/brain.png b/Resources/Textures/Mobs/Species/Shadowkin/organs.rsi/brain.png new file mode 100644 index 0000000000..ac2806b79c Binary files /dev/null and b/Resources/Textures/Mobs/Species/Shadowkin/organs.rsi/brain.png differ diff --git a/Resources/Textures/Mobs/Species/Shadowkin/organs.rsi/core.png b/Resources/Textures/Mobs/Species/Shadowkin/organs.rsi/core.png new file mode 100644 index 0000000000..ac2d7893fd Binary files /dev/null and b/Resources/Textures/Mobs/Species/Shadowkin/organs.rsi/core.png differ diff --git a/Resources/Textures/Mobs/Species/Shadowkin/organs.rsi/ears.png b/Resources/Textures/Mobs/Species/Shadowkin/organs.rsi/ears.png new file mode 100644 index 0000000000..6ff3ac86b7 Binary files /dev/null and b/Resources/Textures/Mobs/Species/Shadowkin/organs.rsi/ears.png differ diff --git a/Resources/Textures/Mobs/Species/Shadowkin/organs.rsi/eyes.png b/Resources/Textures/Mobs/Species/Shadowkin/organs.rsi/eyes.png new file mode 100644 index 0000000000..f7c0a306aa Binary files /dev/null and b/Resources/Textures/Mobs/Species/Shadowkin/organs.rsi/eyes.png differ diff --git a/Resources/Textures/Mobs/Species/Shadowkin/organs.rsi/heart.png b/Resources/Textures/Mobs/Species/Shadowkin/organs.rsi/heart.png new file mode 100644 index 0000000000..1b79b529ae Binary files /dev/null and b/Resources/Textures/Mobs/Species/Shadowkin/organs.rsi/heart.png differ diff --git a/Resources/Textures/Mobs/Species/Shadowkin/organs.rsi/kidneys.png b/Resources/Textures/Mobs/Species/Shadowkin/organs.rsi/kidneys.png new file mode 100644 index 0000000000..482bb24102 Binary files /dev/null and b/Resources/Textures/Mobs/Species/Shadowkin/organs.rsi/kidneys.png differ diff --git a/Resources/Textures/Mobs/Species/Shadowkin/organs.rsi/liver.png b/Resources/Textures/Mobs/Species/Shadowkin/organs.rsi/liver.png new file mode 100644 index 0000000000..0a2e6ab25a Binary files /dev/null and b/Resources/Textures/Mobs/Species/Shadowkin/organs.rsi/liver.png differ diff --git a/Resources/Textures/Mobs/Species/Shadowkin/organs.rsi/lungs.png b/Resources/Textures/Mobs/Species/Shadowkin/organs.rsi/lungs.png new file mode 100644 index 0000000000..a76c9fc1eb Binary files /dev/null and b/Resources/Textures/Mobs/Species/Shadowkin/organs.rsi/lungs.png differ diff --git a/Resources/Textures/Mobs/Species/Shadowkin/organs.rsi/meta.json b/Resources/Textures/Mobs/Species/Shadowkin/organs.rsi/meta.json new file mode 100644 index 0000000000..1c9aebfb6d --- /dev/null +++ b/Resources/Textures/Mobs/Species/Shadowkin/organs.rsi/meta.json @@ -0,0 +1,44 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "https://github.com/tgstation/tgstation/commit/f309886bf3e29808206693e9142304260df134e9", + "states": [ + { + "name": "appendix" + }, + { + "name": "brain" + }, + { + "name": "core" + }, + { + "name": "ears" + }, + { + "name": "eyes" + }, + { + "name": "heart" + }, + { + "name": "kidneys" + }, + { + "name": "liver" + }, + { + "name": "lungs" + }, + { + "name": "stomach" + }, + { + "name": "tongue" + } + ] +} diff --git a/Resources/Textures/Mobs/Species/Shadowkin/organs.rsi/stomach.png b/Resources/Textures/Mobs/Species/Shadowkin/organs.rsi/stomach.png new file mode 100644 index 0000000000..a0341750d3 Binary files /dev/null and b/Resources/Textures/Mobs/Species/Shadowkin/organs.rsi/stomach.png differ diff --git a/Resources/Textures/Mobs/Species/Shadowkin/organs.rsi/tongue.png b/Resources/Textures/Mobs/Species/Shadowkin/organs.rsi/tongue.png new file mode 100644 index 0000000000..64306900f5 Binary files /dev/null and b/Resources/Textures/Mobs/Species/Shadowkin/organs.rsi/tongue.png differ diff --git a/Resources/Textures/Mobs/Species/Shadowkin/parts.rsi/eyes.png b/Resources/Textures/Mobs/Species/Shadowkin/parts.rsi/eyes.png new file mode 100644 index 0000000000..20fd326f17 Binary files /dev/null and b/Resources/Textures/Mobs/Species/Shadowkin/parts.rsi/eyes.png differ diff --git a/Resources/Textures/Mobs/Species/Shadowkin/parts.rsi/full-nomarkings.png b/Resources/Textures/Mobs/Species/Shadowkin/parts.rsi/full-nomarkings.png new file mode 100644 index 0000000000..b62d81fec7 Binary files /dev/null and b/Resources/Textures/Mobs/Species/Shadowkin/parts.rsi/full-nomarkings.png differ diff --git a/Resources/Textures/Mobs/Species/Shadowkin/parts.rsi/full.png b/Resources/Textures/Mobs/Species/Shadowkin/parts.rsi/full.png new file mode 100644 index 0000000000..253eb0c3c9 Binary files /dev/null and b/Resources/Textures/Mobs/Species/Shadowkin/parts.rsi/full.png differ diff --git a/Resources/Textures/Mobs/Species/Shadowkin/parts.rsi/head_f.png b/Resources/Textures/Mobs/Species/Shadowkin/parts.rsi/head_f.png new file mode 100644 index 0000000000..9d99bd1890 Binary files /dev/null and b/Resources/Textures/Mobs/Species/Shadowkin/parts.rsi/head_f.png differ diff --git a/Resources/Textures/Mobs/Species/Shadowkin/parts.rsi/head_m.png b/Resources/Textures/Mobs/Species/Shadowkin/parts.rsi/head_m.png new file mode 100644 index 0000000000..9d99bd1890 Binary files /dev/null and b/Resources/Textures/Mobs/Species/Shadowkin/parts.rsi/head_m.png differ diff --git a/Resources/Textures/Mobs/Species/Shadowkin/parts.rsi/l_arm.png b/Resources/Textures/Mobs/Species/Shadowkin/parts.rsi/l_arm.png new file mode 100644 index 0000000000..078ca333f6 Binary files /dev/null and b/Resources/Textures/Mobs/Species/Shadowkin/parts.rsi/l_arm.png differ diff --git a/Resources/Textures/Mobs/Species/Shadowkin/parts.rsi/l_foot.png b/Resources/Textures/Mobs/Species/Shadowkin/parts.rsi/l_foot.png new file mode 100644 index 0000000000..30ad69dc3f Binary files /dev/null and b/Resources/Textures/Mobs/Species/Shadowkin/parts.rsi/l_foot.png differ diff --git a/Resources/Textures/Mobs/Species/Shadowkin/parts.rsi/l_hand.png b/Resources/Textures/Mobs/Species/Shadowkin/parts.rsi/l_hand.png new file mode 100644 index 0000000000..0cbc7371d1 Binary files /dev/null and b/Resources/Textures/Mobs/Species/Shadowkin/parts.rsi/l_hand.png differ diff --git a/Resources/Textures/Mobs/Species/Shadowkin/parts.rsi/l_leg.png b/Resources/Textures/Mobs/Species/Shadowkin/parts.rsi/l_leg.png new file mode 100644 index 0000000000..b961dfc842 Binary files /dev/null and b/Resources/Textures/Mobs/Species/Shadowkin/parts.rsi/l_leg.png differ diff --git a/Resources/Textures/Mobs/Species/Shadowkin/parts.rsi/meta.json b/Resources/Textures/Mobs/Species/Shadowkin/parts.rsi/meta.json new file mode 100644 index 0000000000..a259ab696b --- /dev/null +++ b/Resources/Textures/Mobs/Species/Shadowkin/parts.rsi/meta.json @@ -0,0 +1,71 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "https://github.com/SPLURT-Station/S.P.L.U.R.T-Station-13/commit/5bc3ea02ce03a551c85017f1ddd411315a19a5ca#diff-519788fa2ca74299d1686a44d3ab2098b49ed5ab65d293ec742bead7d49f0b8d", + "states": [ + { + "name": "full", + "directions": 4 + }, + { + "name": "full-nomarkings", + "directions": 4 + }, + { + "name": "head_m", + "directions": 4 + }, + { + "name": "head_f", + "directions": 4 + }, + { + "name": "torso_m", + "directions": 4 + }, + { + "name": "torso_f", + "directions": 4 + }, + { + "name": "r_arm", + "directions": 4 + }, + { + "name": "l_arm", + "directions": 4 + }, + { + "name": "r_hand", + "directions": 4 + }, + { + "name": "l_hand", + "directions": 4 + }, + { + "name": "r_leg", + "directions": 4 + }, + { + "name": "r_foot", + "directions": 4 + }, + { + "name": "l_leg", + "directions": 4 + }, + { + "name": "l_foot", + "directions": 4 + }, + { + "name": "eyes", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Mobs/Species/Shadowkin/parts.rsi/r_arm.png b/Resources/Textures/Mobs/Species/Shadowkin/parts.rsi/r_arm.png new file mode 100644 index 0000000000..c294120942 Binary files /dev/null and b/Resources/Textures/Mobs/Species/Shadowkin/parts.rsi/r_arm.png differ diff --git a/Resources/Textures/Mobs/Species/Shadowkin/parts.rsi/r_foot.png b/Resources/Textures/Mobs/Species/Shadowkin/parts.rsi/r_foot.png new file mode 100644 index 0000000000..390e0a27ee Binary files /dev/null and b/Resources/Textures/Mobs/Species/Shadowkin/parts.rsi/r_foot.png differ diff --git a/Resources/Textures/Mobs/Species/Shadowkin/parts.rsi/r_hand.png b/Resources/Textures/Mobs/Species/Shadowkin/parts.rsi/r_hand.png new file mode 100644 index 0000000000..331e33a587 Binary files /dev/null and b/Resources/Textures/Mobs/Species/Shadowkin/parts.rsi/r_hand.png differ diff --git a/Resources/Textures/Mobs/Species/Shadowkin/parts.rsi/r_leg.png b/Resources/Textures/Mobs/Species/Shadowkin/parts.rsi/r_leg.png new file mode 100644 index 0000000000..6b0270f634 Binary files /dev/null and b/Resources/Textures/Mobs/Species/Shadowkin/parts.rsi/r_leg.png differ diff --git a/Resources/Textures/Mobs/Species/Shadowkin/parts.rsi/torso_f.png b/Resources/Textures/Mobs/Species/Shadowkin/parts.rsi/torso_f.png new file mode 100644 index 0000000000..83cc63cdd2 Binary files /dev/null and b/Resources/Textures/Mobs/Species/Shadowkin/parts.rsi/torso_f.png differ diff --git a/Resources/Textures/Mobs/Species/Shadowkin/parts.rsi/torso_m.png b/Resources/Textures/Mobs/Species/Shadowkin/parts.rsi/torso_m.png new file mode 100644 index 0000000000..dafc83b65e Binary files /dev/null and b/Resources/Textures/Mobs/Species/Shadowkin/parts.rsi/torso_m.png differ diff --git a/Resources/Textures/Objects/Devices/flatpack.rsi/meta.json b/Resources/Textures/Objects/Devices/flatpack.rsi/meta.json index 8f46a0ca53..11f5d24e11 100644 --- a/Resources/Textures/Objects/Devices/flatpack.rsi/meta.json +++ b/Resources/Textures/Objects/Devices/flatpack.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC0-1.0", - "copyright": "Created by EmoGarbage404 (github) for SS14, solar-assembly-part taken from tgstation and modified at https://tgstation13.org/wiki/Guide_to_construction#Solar_Panels_and_Trackers, ame-part taken from vgstation at https://github.com/vgstation-coders/vgstation13/commit/1b7952787c06c21ef1623e494dcfe7cb1f46e041; singularity-generator, tesla-generator, radiation-collector, containment-field-generator, tesla-coil, grounding-rod inner icons made by lzk228; emitter made by pigeonpeas", + "copyright": "service_music by erhardsteinhauer, Created by EmoGarbage404 (github) for SS14, solar-assembly-part taken from tgstation and modified at https://tgstation13.org/wiki/Guide_to_construction#Solar_Panels_and_Trackers, ame-part taken from vgstation at https://github.com/vgstation-coders/vgstation13/commit/1b7952787c06c21ef1623e494dcfe7cb1f46e041; singularity-generator, tesla-generator, radiation-collector, containment-field-generator, tesla-coil, grounding-rod inner icons made by lzk228; emitter made by pigeonpeas", "size": { "x": 32, "y": 32 @@ -42,6 +42,9 @@ }, { "name": "emitter" + }, + { + "name": "service_music" } ] } diff --git a/Resources/Textures/Objects/Devices/flatpack.rsi/service_music.png b/Resources/Textures/Objects/Devices/flatpack.rsi/service_music.png new file mode 100644 index 0000000000..db1a9a8aec Binary files /dev/null and b/Resources/Textures/Objects/Devices/flatpack.rsi/service_music.png differ diff --git a/Resources/Textures/Objects/Fun/toys.rsi/meta.json b/Resources/Textures/Objects/Fun/toys.rsi/meta.json index 24345aadf3..cc03557e0b 100644 --- a/Resources/Textures/Objects/Fun/toys.rsi/meta.json +++ b/Resources/Textures/Objects/Fun/toys.rsi/meta.json @@ -386,6 +386,9 @@ { "name": "beachb-inhand-right", "directions": 4 + }, + { + "name": "shadowkin" } ] } \ No newline at end of file diff --git a/Resources/Textures/Objects/Fun/toys.rsi/shadowkin.png b/Resources/Textures/Objects/Fun/toys.rsi/shadowkin.png new file mode 100644 index 0000000000..df4118ecd4 Binary files /dev/null and b/Resources/Textures/Objects/Fun/toys.rsi/shadowkin.png differ diff --git a/Resources/Textures/Objects/Weapons/Melee/telebaton.rsi/icon-off.png b/Resources/Textures/Objects/Weapons/Melee/telebaton.rsi/icon-off.png new file mode 100644 index 0000000000..77efc57356 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Melee/telebaton.rsi/icon-off.png differ diff --git a/Resources/Textures/Objects/Weapons/Melee/telebaton.rsi/icon.png b/Resources/Textures/Objects/Weapons/Melee/telebaton.rsi/icon.png new file mode 100644 index 0000000000..fb6adc7b3d Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Melee/telebaton.rsi/icon.png differ diff --git a/Resources/Textures/Objects/Weapons/Melee/telebaton.rsi/inhand-left.png b/Resources/Textures/Objects/Weapons/Melee/telebaton.rsi/inhand-left.png new file mode 100644 index 0000000000..6f31eafd0f Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Melee/telebaton.rsi/inhand-left.png differ diff --git a/Resources/Textures/Objects/Weapons/Melee/telebaton.rsi/inhand-right.png b/Resources/Textures/Objects/Weapons/Melee/telebaton.rsi/inhand-right.png new file mode 100644 index 0000000000..3ff76ef4da Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Melee/telebaton.rsi/inhand-right.png differ diff --git a/Resources/Textures/Objects/Weapons/Melee/telebaton.rsi/meta.json b/Resources/Textures/Objects/Weapons/Melee/telebaton.rsi/meta.json new file mode 100644 index 0000000000..1abc5be52f --- /dev/null +++ b/Resources/Textures/Objects/Weapons/Melee/telebaton.rsi/meta.json @@ -0,0 +1,25 @@ +{ + "version": 1, + "license": "CC-BY-NC-SA-3.0", + "copyright": "Taken from Bee Station 13 at https://github.com/BeeStation/BeeStation-Hornet/commit/59b6fbe2e6f6f4194d650e2c51c6ae70b8a14aca", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "icon-off" + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Objects/Weapons/Throwable/energy_bola.rsi/icon.png b/Resources/Textures/Objects/Weapons/Throwable/energy_bola.rsi/icon.png new file mode 100644 index 0000000000..a7192bb8e9 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Throwable/energy_bola.rsi/icon.png differ diff --git a/Resources/Textures/Objects/Weapons/Throwable/energy_bola.rsi/meta.json b/Resources/Textures/Objects/Weapons/Throwable/energy_bola.rsi/meta.json new file mode 100644 index 0000000000..dbbae21857 --- /dev/null +++ b/Resources/Textures/Objects/Weapons/Throwable/energy_bola.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/b3e22d34474afbee7b84ba282ce0a9b8f332d377.", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon", + "delays": + [ + [0.1, 0.1] + ] + } + ] +} diff --git a/Resources/Textures/Shaders/color_tint.swsl b/Resources/Textures/Shaders/color_tint.swsl new file mode 100644 index 0000000000..a5449b2d4d --- /dev/null +++ b/Resources/Textures/Shaders/color_tint.swsl @@ -0,0 +1,56 @@ +light_mode unshaded; + +uniform sampler2D SCREEN_TEXTURE; +uniform lowp vec3 tint_color; // RGB color between 0 and 1 +uniform lowp float tint_amount; // Number between 0 and 1 + +// Function to convert RGB to HSV. +highp vec3 rgb2hsv(highp vec3 c) +{ + highp vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + highp vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g)); + highp vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r)); + + highp float d = q.x - min(q.w, q.y); + /* float e = 1.0e-10; */ + highp float e = 0.0000000001; + return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); +} + +// Function to convert HSV to RGB. +highp vec3 hsv2rgb(highp vec3 c) +{ + highp vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + highp vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); +} + +void fragment() { + highp vec4 color = zTextureSpec(SCREEN_TEXTURE, FRAGCOORD.xy * SCREEN_PIXEL_SIZE); + + // Convert color to HSV. + highp vec3 hsvTint = rgb2hsv(tint_color); + highp vec3 hsvColor = rgb2hsv(color.rgb); + + // Set the original hue to the tint hue as long as it's not greyscale. + if (hsvTint.y > 0.05 && hsvTint.z != 0.0) + { + hsvColor.x = hsvTint.x; + } + // Modify saturation based on tint color saturation, + // Halving it if it's higher and capping it at the original. + hsvColor.y = (hsvColor.y < hsvTint.y) ? + mix(hsvColor.y, hsvTint.y, 0.75) : mix(hsvColor.y, hsvTint.y, 0.35); + + // Modify value based on tint color value, but only if it's darker. + hsvColor.z = (mix(hsvColor.z, hsvTint.z, 0.85) <= hsvColor.z) ? + mix(hsvColor.z, hsvTint.z, 0.85) : hsvColor.z; + + // Convert back to RGB. + highp vec3 rgbColorMod = hsv2rgb(hsvColor); + + // Mix the final RGB product with the original color to the intensity of the tint. + color.rgb = mix(color.rgb, rgbColorMod, tint_amount); + + COLOR = color; +} \ No newline at end of file diff --git a/Resources/Textures/Shaders/ethereal.swsl b/Resources/Textures/Shaders/ethereal.swsl new file mode 100644 index 0000000000..dc9d971e1c --- /dev/null +++ b/Resources/Textures/Shaders/ethereal.swsl @@ -0,0 +1,75 @@ +light_mode unshaded; + +uniform sampler2D SCREEN_TEXTURE; + +// Function to convert RGB to HSV. +highp vec3 rgb2hsv(highp vec3 c) +{ + highp vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + highp vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g)); + highp vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r)); + + highp float d = q.x - min(q.w, q.y); + /* float e = 1.0e-10; */ + highp float e = 0.0000000001; + return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); +} + +// Function to convert HSV to RGB. +highp vec3 hsv2rgb(highp vec3 c) +{ + highp vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + highp vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); +} + +// Random number function with potential negative values. +highp float rand(highp vec2 n) { + highp float r = 2.0 * (0.5 + 0.5 * fract (sin (dot (n.xy, vec2(12.9898, 78.233)))* 43758.5453)) - 1.0; + return r * (r < 0.0 ? 0.8 : 1.3); +} + +void fragment() { + highp vec4 color = zTextureSpec(SCREEN_TEXTURE, FRAGCOORD.xy * SCREEN_PIXEL_SIZE); + + // Increase the contrast of the image if the luminance is low enough. + highp float luminance = dot(color.rgb, vec3(0.2126, 0.7152, 0.0722)); + if (luminance < 0.06) { + color.rgb *= 0.5; + } + + // Convert to HSV. + highp vec3 hsvColor = rgb2hsv(color.rgb); + + // Apply a breathing effect to the value of the image. + hsvColor.z *= mix(0.35, 0.7, (sin(TIME) * 0.65)); + + // Increase the saturation of the color, incorperating a random value, as long as the value is above 0.1. + if (hsvColor.z > 0.065) { + hsvColor.y *= (rand(FRAGCOORD.xy * (TIME * 0.15)) * 1.5) + 1.0; + } + + // Convert back to RGB. + color.rgb = hsv2rgb(hsvColor); + + + + // get distortion magnitude. hand crafted from a random jumble of trig functions + highp float w = sin(TIME + (FRAGCOORD.x + FRAGCOORD.y + 2.0*sin(TIME*0.3) * sin(TIME*0.3 + FRAGCOORD.x - FRAGCOORD.y)) ); + + // visualize distortion via: + // COLOR = vec4(w,w,w,1.0); + + w *= 5.0; + + highp vec4 background = zTextureSpec(SCREEN_TEXTURE, ( FRAGCOORD.xy + vec2(w) ) * SCREEN_PIXEL_SIZE ); + highp vec3 hsvBg = rgb2hsv(background.rgb); + hsvBg.x *= -1.0; + background.rgb = hsv2rgb(hsvBg); + + color.xyz = mix(background.xyz, color.xyz, 0.75); + + + + COLOR = color; +} diff --git a/Tools/contribs_shared.ps1 b/Tools/contribs_shared.ps1 index ba97c50a9a..12340cda70 100644 --- a/Tools/contribs_shared.ps1 +++ b/Tools/contribs_shared.ps1 @@ -9,6 +9,10 @@ $ignore = @{ "PJBot" = $true + "github-actions[bot]" = $true "ZDDM" = $true "TYoung86" = $true + "paul" = $true # erroneously included -- presumably from PaulRitter, somehow, who is already credited + "08a" = $true # erroneously included -- valid github account, but not an actual contributor, probably an alias of a contributor who does not own this github account and is already credited somewhere. + "UristMcContributor" = $true # this was an account used to demonstrate how to create a valid PR, and is in actuality Willhelm53, who is already credited. } diff --git a/Tools/dump_github_contributors.ps1 b/Tools/dump_github_contributors.ps1 index 193eec4692..d88b9db612 100755 --- a/Tools/dump_github_contributors.ps1 +++ b/Tools/dump_github_contributors.ps1 @@ -3,10 +3,22 @@ $scriptDir = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent . $(join-path $scriptDir contribs_shared.ps1) +if ($null -eq $env:GITHUB_TOKEN) +{ + throw "A GitHub API token is required to run this script properly without being rate limited. If you're a user, generate a personal access token and use that. If you're running this in a GitHub action, make sure you expose the GITHUB_TOKEN secret as an environment variable." +} + function load_contribs([string] $repo) { + # https://developer.github.com/enterprise/2.8/v3/repos/#list-contributors + # We use the ?anon=1 query param for reasons explained later. $qParams = @{ "per_page" = 100 + "anon" = 1 + } + + $headers = @{ + Authorization="Bearer $env:GITHUB_TOKEN" } $url = "https://api.github.com/repos/{0}/contributors" -f $repo @@ -15,7 +27,7 @@ function load_contribs([string] $repo) while ($null -ne $url) { - $resp = Invoke-WebRequest $url -Body $qParams + $resp = Invoke-WebRequest $url -Body $qParams -Headers $headers $url = $resp.RelationLink.next @@ -23,6 +35,80 @@ function load_contribs([string] $repo) $r += $j } + # After collecting all the paginated data, we still aren't done. + # GitHub's API, for some reason, has a hard cap on 500 email addresses per repo which it will collate + # SS14 has gone past this limit for quite some time, so GitHub will stop including accounts, starting + # with those that have lower contributions, as valid distinct users with a `login` field. + # + # This is obviously a problem. + # To remedy, we first use the ?anon=1 parameter to force GitHub to include all committers emails, even + # those that it has, in its great and infinite wisdom, chosen to not properly attach to a GitHub account. + # + # Of course, this is normally an issue -- we use this API specifically because we want to only get + # committers with valid GitHub accounts, otherwise we pollute the contributor log with random aliases + # and names that people don't use, things like that. + # + # So, okay, solution: + # 1) Go over our list, and check for ones which only have a `name` and `email` field ('anonymous' contributors) + # and which dont already appear. + # 2) Check to see if the email ends with `@users.noreply.github.com`. + # - To my knowledge, GitHub includes an email in the form of `(numbers)+(username)@users.noreply.github.com` + # - when commits are made using someones GitHub account, and they aren't attaching another email to their account + # 3) If an email of this form was found, we can assume this is one of the 'missing' contribs and extract their GitHub username. + # 4) If an email of this form -wasn't- found, but they're still anonymous, we -unfortunately- still have to check if they're a valid GitHub user + # because GitHub might have just force-anonymized them anyway! + # + # It's possible their `name` is a valid GitHub user, but that this is a coincidence and they aren't actually a contributor. + # There is kind of not really jack shit we can do about that! It's not that common though and it's probably more likely to attribute + # correctly than not. + # 5) Then, we just add a `login` field to our object with their true username and let the rest of the code do its job. + + foreach ($contributor in $r) + { + if ($null -ne $contributor.name ` + -And $null -ne $contributor.email ` + -And $contributor.email -match '\d+\+(.*)@users\.noreply\.github\.com$') + { + $username = $Matches.1 + # Use their `name` if its equivalent to the extracted username, + # since that one will have proper casing. Otherwise just let them be a lowercasecel + if ($contributor.name.ToLower() -eq $username) + { + $username = $contributor.name + } + + if (($r).login -contains $username) + { + continue + } + + $contributor | Add-Member -MemberType NoteProperty -Name "login" -Value $username + } + elseif ($null -eq $contributor.login ` + -And $null -ne $contributor.name ` + -And !$contributor.name.Contains(" ")) + { + $username = $contributor.name + # They're an anonymous user, without a GH email, and their name doesn't contain a space + # (since a valid GH username can't have a space) + # Might still be a valid contrib??? + if (($r).login -contains $username) + { + continue + } + + $userUrl = "https://api.github.com/users/{0}" -f $username + + try + { + $userResp = Invoke-WebRequest $userUrl -Headers $headers + $userJ = ConvertFrom-Json $userResp.Content + $contributor | Add-Member -MemberType NoteProperty -Name "login" -Value $userJ.login + } + catch {} # if it 404s do nothing. powershell doesn't seem to really have a simpler way to do this. + } + } + return $r } @@ -34,4 +120,4 @@ $contentJson = load_contribs("Simple-Station/Einstein-Engines") | Where-Object { -not $ignore[$_] }` | ForEach-Object { if($replacements[$_] -eq $null){ $_ } else { $replacements[$_] }} ` | Sort-object ` - | Join-String -Separator ", " + | Join-String -Separator ", " \ No newline at end of file