diff --git a/Content.Client/Access/AccessOverlay.cs b/Content.Client/Access/AccessOverlay.cs index 2be3d07e90d..59c9441036d 100644 --- a/Content.Client/Access/AccessOverlay.cs +++ b/Content.Client/Access/AccessOverlay.cs @@ -9,20 +9,20 @@ namespace Content.Client.Access; public sealed class AccessOverlay : Overlay { + private const string TextFontPath = "/Fonts/NotoSans/NotoSans-Regular.ttf"; + private const int TextFontSize = 12; + private readonly IEntityManager _entityManager; - private readonly EntityLookupSystem _lookup; - private readonly SharedTransformSystem _xform; + private readonly SharedTransformSystem _transformSystem; private readonly Font _font; public override OverlaySpace Space => OverlaySpace.ScreenSpace; - public AccessOverlay(IEntityManager entManager, IResourceCache cache, EntityLookupSystem lookup, SharedTransformSystem xform) + public AccessOverlay(IEntityManager entityManager, IResourceCache resourceCache, SharedTransformSystem transformSystem) { - _entityManager = entManager; - _lookup = lookup; - _xform = xform; - - _font = cache.GetFont("/Fonts/NotoSans/NotoSans-Regular.ttf", 12); + _entityManager = entityManager; + _transformSystem = transformSystem; + _font = resourceCache.GetFont(TextFontPath, TextFontSize); } protected override void Draw(in OverlayDrawArgs args) @@ -30,52 +30,65 @@ protected override void Draw(in OverlayDrawArgs args) if (args.ViewportControl == null) return; - var readerQuery = _entityManager.GetEntityQuery(); - var xformQuery = _entityManager.GetEntityQuery(); - - foreach (var ent in _lookup.GetEntitiesIntersecting(args.MapId, args.WorldAABB, - LookupFlags.Static | LookupFlags.Approximate)) + var textBuffer = new StringBuilder(); + var query = _entityManager.EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var accessReader, out var transform)) { - if (!readerQuery.TryGetComponent(ent, out var reader) || - !xformQuery.TryGetComponent(ent, out var xform)) + textBuffer.Clear(); + + var entityName = _entityManager.ToPrettyString(uid); + textBuffer.AppendLine(entityName.Prototype); + textBuffer.Append("UID: "); + textBuffer.Append(entityName.Uid.Id); + textBuffer.Append(", NUID: "); + textBuffer.Append(entityName.Nuid.Id); + textBuffer.AppendLine(); + + if (!accessReader.Enabled) { + textBuffer.AppendLine("-Disabled"); continue; } - var text = new StringBuilder(); - var index = 0; - var a = $"{_entityManager.ToPrettyString(ent)}"; - text.Append(a); - - foreach (var list in reader.AccessLists) + if (accessReader.AccessLists.Count > 0) { - a = $"Tag {index}"; - text.AppendLine(a); - - foreach (var entry in list) + var groupNumber = 0; + foreach (var accessList in accessReader.AccessLists) { - a = $"- {entry}"; - text.AppendLine(a); + groupNumber++; + foreach (var entry in accessList) + { + textBuffer.Append("+Set "); + textBuffer.Append(groupNumber); + textBuffer.Append(": "); + textBuffer.Append(entry.Id); + textBuffer.AppendLine(); + } } - - index++; } - - string textStr; - - if (text.Length >= 2) + else { - textStr = text.ToString(); - textStr = textStr[..^2]; + textBuffer.AppendLine("+Unrestricted"); } - else + + foreach (var key in accessReader.AccessKeys) { - textStr = ""; + textBuffer.Append("+Key "); + textBuffer.Append(key.OriginStation); + textBuffer.Append(": "); + textBuffer.Append(key.Id); + textBuffer.AppendLine(); } - var screenPos = args.ViewportControl.WorldToScreen(_xform.GetWorldPosition(xform)); + foreach (var tag in accessReader.DenyTags) + { + textBuffer.Append("-Tag "); + textBuffer.AppendLine(tag.Id); + } - args.ScreenHandle.DrawString(_font, screenPos, textStr, Color.Gold); + var accessInfoText = textBuffer.ToString(); + var screenPos = args.ViewportControl.WorldToScreen(_transformSystem.GetWorldPosition(transform)); + args.ScreenHandle.DrawString(_font, screenPos, accessInfoText, Color.Gold); } } } diff --git a/Content.Client/Access/Commands/ShowAccessReadersCommand.cs b/Content.Client/Access/Commands/ShowAccessReadersCommand.cs index 7c804dd9698..cb6cb6cf6bb 100644 --- a/Content.Client/Access/Commands/ShowAccessReadersCommand.cs +++ b/Content.Client/Access/Commands/ShowAccessReadersCommand.cs @@ -7,8 +7,16 @@ namespace Content.Client.Access.Commands; public sealed class ShowAccessReadersCommand : IConsoleCommand { public string Command => "showaccessreaders"; - public string Description => "Shows all access readers in the viewport"; - public string Help => $"{Command}"; + + public string Description => "Toggles showing access reader permissions on the map"; + public string Help => """ + Overlay Info: + -Disabled | The access reader is disabled + +Unrestricted | The access reader has no restrictions + +Set [Index]: [Tag Name]| A tag in an access set (accessor needs all tags in the set to be allowed by the set) + +Key [StationUid]: [StationRecordKeyId] | A StationRecordKey that is allowed + -Tag [Tag Name] | A tag that is not allowed (takes priority over other allows) + """; public void Execute(IConsoleShell shell, string argStr, string[] args) { var collection = IoCManager.Instance; @@ -26,10 +34,9 @@ public void Execute(IConsoleShell shell, string argStr, string[] args) var entManager = collection.Resolve(); var cache = collection.Resolve(); - var lookup = entManager.System(); var xform = entManager.System(); - overlay.AddOverlay(new AccessOverlay(entManager, cache, lookup, xform)); + overlay.AddOverlay(new AccessOverlay(entManager, cache, xform)); shell.WriteLine($"Set access reader debug overlay to true"); } } diff --git a/Content.Client/Administration/Managers/ClientAdminManager.cs b/Content.Client/Administration/Managers/ClientAdminManager.cs index fdd62fb6a2d..0f740c81045 100644 --- a/Content.Client/Administration/Managers/ClientAdminManager.cs +++ b/Content.Client/Administration/Managers/ClientAdminManager.cs @@ -126,12 +126,15 @@ void IPostInjectInit.PostInject() public AdminData? GetAdminData(EntityUid uid, bool includeDeAdmin = false) { - return uid == _player.LocalEntity ? _adminData : null; + if (uid == _player.LocalEntity && (_adminData?.Active ?? includeDeAdmin)) + return _adminData; + + return null; } public AdminData? GetAdminData(ICommonSession session, bool includeDeAdmin = false) { - if (_player.LocalUser == session.UserId) + if (_player.LocalUser == session.UserId && (_adminData?.Active ?? includeDeAdmin)) return _adminData; return null; diff --git a/Content.Client/Administration/UI/BanPanel/BanPanel.xaml.cs b/Content.Client/Administration/UI/BanPanel/BanPanel.xaml.cs index 1f32640f7dd..dc263d6055c 100644 --- a/Content.Client/Administration/UI/BanPanel/BanPanel.xaml.cs +++ b/Content.Client/Administration/UI/BanPanel/BanPanel.xaml.cs @@ -3,6 +3,7 @@ using System.Net.Sockets; using Content.Client.Administration.UI.CustomControls; using Content.Shared.Administration; +using Content.Shared.CCVar; using Content.Shared.Database; using Content.Shared.Roles; using Robust.Client.AutoGenerated; @@ -11,6 +12,7 @@ using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.CustomControls; using Robust.Client.UserInterface.XAML; +using Robust.Shared.Configuration; using Robust.Shared.Prototypes; using Robust.Shared.Timing; using Robust.Shared.Utility; @@ -32,8 +34,11 @@ public sealed partial class BanPanel : DefaultWindow // This is less efficient than just holding a reference to the root control and enumerating children, but you // have to know how the controls are nested, which makes the code more complicated. private readonly List _roleCheckboxes = new(); + private readonly ISawmill _banpanelSawmill; [Dependency] private readonly IGameTiming _gameTiming = default!; + [Dependency] private readonly IConfigurationManager _cfg = default!; + [Dependency] private readonly ILogManager _logManager = default!; private enum TabNumbers { @@ -65,6 +70,7 @@ public BanPanel() { RobustXamlLoader.Load(this); IoCManager.InjectDependencies(this); + _banpanelSawmill = _logManager.GetSawmill("admin.banpanel"); PlayerList.OnSelectionChanged += OnPlayerSelectionChanged; PlayerNameLine.OnFocusExit += _ => OnPlayerNameChanged(); PlayerCheckbox.OnPressed += _ => @@ -104,6 +110,11 @@ public BanPanel() }; SubmitButton.OnPressed += SubmitButtonOnOnPressed; + IpCheckbox.Pressed = _cfg.GetCVar(CCVars.ServerBanIpBanDefault); + HwidCheckbox.Pressed = _cfg.GetCVar(CCVars.ServerBanHwidBanDefault); + LastConnCheckbox.Pressed = _cfg.GetCVar(CCVars.ServerBanUseLastDetails); + EraseCheckbox.Pressed = _cfg.GetCVar(CCVars.ServerBanErasePlayer); + SeverityOption.AddItem(Loc.GetString("admin-note-editor-severity-none"), (int) NoteSeverity.None); SeverityOption.AddItem(Loc.GetString("admin-note-editor-severity-low"), (int) NoteSeverity.Minor); SeverityOption.AddItem(Loc.GetString("admin-note-editor-severity-medium"), (int) NoteSeverity.Medium); @@ -175,6 +186,39 @@ private void CreateRoleGroup(string roleName, IEnumerable roleList, Colo c.Pressed = args.Pressed; } } + + if (args.Pressed) + { + if (!Enum.TryParse(_cfg.GetCVar(CCVars.DepartmentBanDefaultSeverity), true, out NoteSeverity newSeverity)) + { + _banpanelSawmill + .Warning("Departmental role ban severity could not be parsed from config!"); + return; + } + SeverityOption.SelectId((int) newSeverity); + } + else + { + foreach (var childContainer in RolesContainer.Children) + { + if (childContainer is Container) + { + foreach (var child in childContainer.Children) + { + if (child is CheckBox { Pressed: true }) + return; + } + } + } + + if (!Enum.TryParse(_cfg.GetCVar(CCVars.RoleBanDefaultSeverity), true, out NoteSeverity newSeverity)) + { + _banpanelSawmill + .Warning("Role ban severity could not be parsed from config!"); + return; + } + SeverityOption.SelectId((int) newSeverity); + } }; outerContainer.AddChild(innerContainer); foreach (var role in roleList) @@ -353,6 +397,35 @@ private void OnTypeChanged() { TypeOption.ModulateSelfOverride = null; Tabs.SetTabVisible((int) TabNumbers.Roles, TypeOption.SelectedId == (int) Types.Role); + NoteSeverity? newSeverity = null; + switch (TypeOption.SelectedId) + { + case (int)Types.Server: + if (Enum.TryParse(_cfg.GetCVar(CCVars.ServerBanDefaultSeverity), true, out NoteSeverity serverSeverity)) + newSeverity = serverSeverity; + else + { + _banpanelSawmill + .Warning("Server ban severity could not be parsed from config!"); + } + + break; + case (int) Types.Role: + + if (Enum.TryParse(_cfg.GetCVar(CCVars.RoleBanDefaultSeverity), true, out NoteSeverity roleSeverity)) + { + newSeverity = roleSeverity; + } + else + { + _banpanelSawmill + .Warning("Role ban severity could not be parsed from config!"); + } + break; + } + + if (newSeverity != null) + SeverityOption.SelectId((int) newSeverity.Value); } private void UpdateSubmitEnabled() diff --git a/Content.Client/Atmos/UI/GasAnalyzerWindow.xaml.cs b/Content.Client/Atmos/UI/GasAnalyzerWindow.xaml.cs index b105e629cfa..b54af3a5871 100644 --- a/Content.Client/Atmos/UI/GasAnalyzerWindow.xaml.cs +++ b/Content.Client/Atmos/UI/GasAnalyzerWindow.xaml.cs @@ -163,6 +163,26 @@ private void GenerateGasDisplay(GasMixEntry gasMix, Control parent) parent.AddChild(panel); panel.AddChild(dataContainer); + // Volume label + var volBox = new BoxContainer { Orientation = BoxContainer.LayoutOrientation.Horizontal }; + + volBox.AddChild(new Label + { + Text = Loc.GetString("gas-analyzer-window-volume-text") + }); + volBox.AddChild(new Control + { + MinSize = new Vector2(10, 0), + HorizontalExpand = true + }); + volBox.AddChild(new Label + { + Text = Loc.GetString("gas-analyzer-window-volume-val-text", ("volume", $"{gasMix.Volume:0.##}")), + Align = Label.AlignMode.Right, + HorizontalExpand = true + }); + dataContainer.AddChild(volBox); + // Pressure label var presBox = new BoxContainer { Orientation = BoxContainer.LayoutOrientation.Horizontal }; diff --git a/Content.Client/Audio/Jukebox/JukeboxBoundUserInterface.cs b/Content.Client/Audio/Jukebox/JukeboxBoundUserInterface.cs new file mode 100644 index 00000000000..072730d65d4 --- /dev/null +++ b/Content.Client/Audio/Jukebox/JukeboxBoundUserInterface.cs @@ -0,0 +1,119 @@ +using Content.Shared.Audio.Jukebox; +using Robust.Client.Audio; +using Robust.Client.Player; +using Robust.Shared.Audio.Components; +using Robust.Shared.Player; +using Robust.Shared.Prototypes; + +namespace Content.Client.Audio.Jukebox; + +public sealed class JukeboxBoundUserInterface : BoundUserInterface +{ + [Dependency] private readonly IPlayerManager _player = default!; + [Dependency] private readonly IPrototypeManager _protoManager = default!; + + [ViewVariables] + private JukeboxMenu? _menu; + + public JukeboxBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey) + { + IoCManager.InjectDependencies(this); + } + + protected override void Open() + { + base.Open(); + + _menu = new JukeboxMenu(); + _menu.OnClose += Close; + _menu.OpenCentered(); + + _menu.OnPlayPressed += args => + { + if (args) + { + SendMessage(new JukeboxPlayingMessage()); + } + else + { + SendMessage(new JukeboxPauseMessage()); + } + }; + + _menu.OnStopPressed += () => + { + SendMessage(new JukeboxStopMessage()); + }; + + _menu.OnSongSelected += SelectSong; + + _menu.SetTime += SetTime; + PopulateMusic(); + Reload(); + } + + /// + /// Reloads the attached menu if it exists. + /// + public void Reload() + { + if (_menu == null || !EntMan.TryGetComponent(Owner, out JukeboxComponent? jukebox)) + return; + + _menu.SetAudioStream(jukebox.AudioStream); + + if (_protoManager.TryIndex(jukebox.SelectedSongId, out var songProto)) + { + var length = EntMan.System().GetAudioLength(songProto.Path.Path.ToString()); + _menu.SetSelectedSong(songProto.Name, (float) length.TotalSeconds); + } + else + { + _menu.SetSelectedSong(string.Empty, 0f); + } + } + + public void PopulateMusic() + { + _menu?.Populate(_protoManager.EnumeratePrototypes()); + } + + public void SelectSong(ProtoId songid) + { + SendMessage(new JukeboxSelectedMessage(songid)); + } + + public void SetTime(float time) + { + var sentTime = time; + + // You may be wondering, what the fuck is this + // Well we want to be able to predict the playback slider change, of which there are many ways to do it + // We can't just use SendPredictedMessage because it will reset every tick and audio updates every frame + // so it will go BRRRRT + // Using ping gets us close enough that it SHOULD, MOST OF THE TIME, fall within the 0.1 second tolerance + // that's still on engine so our playback position never gets corrected. + if (EntMan.TryGetComponent(Owner, out JukeboxComponent? jukebox) && + EntMan.TryGetComponent(jukebox.AudioStream, out AudioComponent? audioComp)) + { + audioComp.PlaybackPosition = time; + } + + SendMessage(new JukeboxSetTimeMessage(sentTime)); + } + + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + if (!disposing) + return; + + if (_menu == null) + return; + + _menu.OnClose -= Close; + _menu.Dispose(); + _menu = null; + } +} + diff --git a/Content.Client/Audio/Jukebox/JukeboxMenu.xaml b/Content.Client/Audio/Jukebox/JukeboxMenu.xaml new file mode 100644 index 00000000000..e8d39a9b119 --- /dev/null +++ b/Content.Client/Audio/Jukebox/JukeboxMenu.xaml @@ -0,0 +1,18 @@ + + + + + + + + Text="{Loc 'analysis-console-server-list-button'}"> + + + + + @@ -36,13 +52,13 @@ - + - + diff --git a/Content.Client/Xenoarchaeology/Ui/AnalysisConsoleMenu.xaml.cs b/Content.Client/Xenoarchaeology/Ui/AnalysisConsoleMenu.xaml.cs index 90732f814f8..2acf35da25b 100644 --- a/Content.Client/Xenoarchaeology/Ui/AnalysisConsoleMenu.xaml.cs +++ b/Content.Client/Xenoarchaeology/Ui/AnalysisConsoleMenu.xaml.cs @@ -3,6 +3,7 @@ using Content.Shared.Xenoarchaeology.Equipment; using Robust.Client.AutoGenerated; using Robust.Client.GameObjects; +using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.XAML; using Robust.Shared.Timing; using Robust.Shared.Utility; @@ -19,6 +20,8 @@ public sealed partial class AnalysisConsoleMenu : FancyWindow public event Action? OnScanButtonPressed; public event Action? OnPrintButtonPressed; public event Action? OnExtractButtonPressed; + public event Action? OnUpBiasButtonPressed; + public event Action? OnDownBiasButtonPressed; // For rendering the progress bar, updated from BUI state private TimeSpan? _startTime; @@ -36,6 +39,12 @@ public AnalysisConsoleMenu() ScanButton.OnPressed += _ => OnScanButtonPressed?.Invoke(); PrintButton.OnPressed += _ => OnPrintButtonPressed?.Invoke(); ExtractButton.OnPressed += _ => OnExtractButtonPressed?.Invoke(); + UpBiasButton.OnPressed += _ => OnUpBiasButtonPressed?.Invoke(); + DownBiasButton.OnPressed += _ => OnDownBiasButtonPressed?.Invoke(); + + var buttonGroup = new ButtonGroup(false); + UpBiasButton.Group = buttonGroup; + DownBiasButton.Group = buttonGroup; } protected override void FrameUpdate(FrameEventArgs args) @@ -60,7 +69,7 @@ protected override void FrameUpdate(FrameEventArgs args) ProgressBar.Value = Math.Clamp(1.0f - (float) remaining.Divide(total), 0.0f, 1.0f); } - public void SetButtonsDisabled(AnalysisConsoleScanUpdateState state) + public void SetButtonsDisabled(AnalysisConsoleUpdateState state) { ScanButton.Disabled = !state.CanScan; PrintButton.Disabled = !state.CanPrint; @@ -78,7 +87,6 @@ public void SetButtonsDisabled(AnalysisConsoleScanUpdateState state) ExtractButton.AddStyleClass("ButtonColorGreen"); } } - private void UpdateArtifactIcon(EntityUid? uid) { if (uid == null) @@ -91,7 +99,7 @@ private void UpdateArtifactIcon(EntityUid? uid) ArtifactDisplay.SetEntity(uid); } - public void UpdateInformationDisplay(AnalysisConsoleScanUpdateState state) + public void UpdateInformationDisplay(AnalysisConsoleUpdateState state) { var message = new FormattedMessage(); @@ -129,7 +137,7 @@ public void UpdateInformationDisplay(AnalysisConsoleScanUpdateState state) Information.SetMessage(message); } - public void UpdateProgressBar(AnalysisConsoleScanUpdateState state) + public void UpdateProgressBar(AnalysisConsoleUpdateState state) { ProgressBar.Visible = state.Scanning; ProgressLabel.Visible = state.Scanning; diff --git a/Content.IntegrationTests/Pair/TestMapData.cs b/Content.IntegrationTests/Pair/TestMapData.cs index bdf12080388..343641e1613 100644 --- a/Content.IntegrationTests/Pair/TestMapData.cs +++ b/Content.IntegrationTests/Pair/TestMapData.cs @@ -10,9 +10,8 @@ namespace Content.IntegrationTests.Pair; public sealed class TestMapData { public EntityUid MapUid { get; set; } - public EntityUid GridUid { get; set; } - public MapId MapId { get; set; } - public MapGridComponent MapGrid { get; set; } = default!; + public Entity Grid; + public MapId MapId; public EntityCoordinates GridCoords { get; set; } public MapCoordinates MapCoords { get; set; } public TileRef Tile { get; set; } @@ -21,4 +20,4 @@ public sealed class TestMapData public EntityUid CMapUid { get; set; } public EntityUid CGridUid { get; set; } public EntityCoordinates CGridCoords { get; set; } -} \ No newline at end of file +} diff --git a/Content.IntegrationTests/Pair/TestPair.Helpers.cs b/Content.IntegrationTests/Pair/TestPair.Helpers.cs index 554807b2d25..0ea6d3e2dcc 100644 --- a/Content.IntegrationTests/Pair/TestPair.Helpers.cs +++ b/Content.IntegrationTests/Pair/TestPair.Helpers.cs @@ -1,5 +1,6 @@ #nullable enable using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Linq; using Robust.Shared.GameObjects; using Robust.Shared.Map; @@ -14,36 +15,37 @@ public sealed partial class TestPair /// /// Creates a map, a grid, and a tile, and gives back references to them. /// - public async Task CreateTestMap() + [MemberNotNull(nameof(TestMap))] + public async Task CreateTestMap(bool initialized = true, string tile = "Plating") { + var mapData = new TestMapData(); + TestMap = mapData; await Server.WaitIdleAsync(); var tileDefinitionManager = Server.ResolveDependency(); - var mapData = new TestMapData(); TestMap = mapData; await Server.WaitPost(() => { - mapData.MapId = Server.MapMan.CreateMap(); - mapData.MapUid = Server.MapMan.GetMapEntityId(mapData.MapId); - var mapGrid = Server.MapMan.CreateGridEntity(mapData.MapId); - mapData.MapGrid = mapGrid; - mapData.GridUid = mapGrid.Owner; // Fixing this requires an engine PR. - mapData.GridCoords = new EntityCoordinates(mapData.GridUid, 0, 0); - var plating = tileDefinitionManager["Plating"]; + mapData.MapUid = Server.System().CreateMap(out mapData.MapId, runMapInit: initialized); + mapData.Grid = Server.MapMan.CreateGridEntity(mapData.MapId); + mapData.GridCoords = new EntityCoordinates(mapData.Grid, 0, 0); + var plating = tileDefinitionManager[tile]; var platingTile = new Tile(plating.TileId); - mapData.MapGrid.SetTile(mapData.GridCoords, platingTile); + mapData.Grid.Comp.SetTile(mapData.GridCoords, platingTile); mapData.MapCoords = new MapCoordinates(0, 0, mapData.MapId); - mapData.Tile = mapData.MapGrid.GetAllTiles().First(); + mapData.Tile = mapData.Grid.Comp.GetAllTiles().First(); }); + TestMap = mapData; if (!Settings.Connected) return mapData; await RunTicksSync(10); mapData.CMapUid = ToClientUid(mapData.MapUid); - mapData.CGridUid = ToClientUid(mapData.GridUid); + mapData.CGridUid = ToClientUid(mapData.Grid); mapData.CGridCoords = new EntityCoordinates(mapData.CGridUid, 0, 0); + TestMap = mapData; return mapData; } diff --git a/Content.IntegrationTests/Pair/TestPair.Recycle.cs b/Content.IntegrationTests/Pair/TestPair.Recycle.cs index 52fdf600bb4..c0f4b3b745f 100644 --- a/Content.IntegrationTests/Pair/TestPair.Recycle.cs +++ b/Content.IntegrationTests/Pair/TestPair.Recycle.cs @@ -131,7 +131,7 @@ public async Task CleanPooledPair(PoolSettings settings, TextWriter testOut) // Move to pre-round lobby. Required to toggle dummy ticker on and off if (gameTicker.RunLevel != GameRunLevel.PreRoundLobby) { - await testOut.WriteLineAsync($"Recycling: {Watch.Elapsed.TotalMilliseconds} ms: Restarting server."); + await testOut.WriteLineAsync($"Recycling: {Watch.Elapsed.TotalMilliseconds} ms: Restarting round."); Assert.That(gameTicker.DummyTicker, Is.False); Server.CfgMan.SetCVar(CCVars.GameLobbyEnabled, true); await Server.WaitPost(() => gameTicker.RestartRound()); @@ -146,6 +146,7 @@ public async Task CleanPooledPair(PoolSettings settings, TextWriter testOut) // Restart server. await testOut.WriteLineAsync($"Recycling: {Watch.Elapsed.TotalMilliseconds} ms: Restarting server again"); + await Server.WaitPost(() => Server.EntMan.FlushEntities()); await Server.WaitPost(() => gameTicker.RestartRound()); await RunTicksSync(1); diff --git a/Content.IntegrationTests/Tests/Administration/Logs/AddTests.cs b/Content.IntegrationTests/Tests/Administration/Logs/AddTests.cs index 98c7363a6c4..772af337a1a 100644 --- a/Content.IntegrationTests/Tests/Administration/Logs/AddTests.cs +++ b/Content.IntegrationTests/Tests/Administration/Logs/AddTests.cs @@ -32,8 +32,8 @@ public async Task AddAndGetSingleLog() var guid = Guid.NewGuid(); - var testMap = await pair.CreateTestMap(); - var coordinates = testMap.GridCoords; + await pair.CreateTestMap(); + var coordinates = pair.TestMap.GridCoords; await server.WaitPost(() => { var entity = sEntities.SpawnEntity(null, coordinates); diff --git a/Content.IntegrationTests/Tests/Construction/Interaction/CraftingTests.cs b/Content.IntegrationTests/Tests/Construction/Interaction/CraftingTests.cs index c49e20981e3..76911eba5f7 100644 --- a/Content.IntegrationTests/Tests/Construction/Interaction/CraftingTests.cs +++ b/Content.IntegrationTests/Tests/Construction/Interaction/CraftingTests.cs @@ -56,7 +56,7 @@ public async Task CraftSpear() // Player's hands should be full of the remaining rods, except those dropped during the failed crafting attempt. // Spear and left over stacks should be on the floor. - await AssertEntityLookup((Rod, 2), (Cable, 8), (ShardGlass, 2), (Spear, 1)); + await AssertEntityLookup((Rod, 2), (Cable, 7), (ShardGlass, 2), (Spear, 1)); } // The following is wrapped in an if DEBUG. This is because of cursed state handling bugs. Tests don't (de)serialize @@ -100,7 +100,7 @@ public async Task CancelCraft() Assert.That(sys.IsEntityInContainer(rods), Is.False); Assert.That(sys.IsEntityInContainer(wires), Is.False); Assert.That(rodStack, Has.Count.EqualTo(8)); - Assert.That(wireStack, Has.Count.EqualTo(8)); + Assert.That(wireStack, Has.Count.EqualTo(7)); await FindEntity(Spear, shouldSucceed: false); }); diff --git a/Content.IntegrationTests/Tests/DeviceNetwork/DeviceNetworkTest.cs b/Content.IntegrationTests/Tests/DeviceNetwork/DeviceNetworkTest.cs index 26ea726211b..b37f7cfa468 100644 --- a/Content.IntegrationTests/Tests/DeviceNetwork/DeviceNetworkTest.cs +++ b/Content.IntegrationTests/Tests/DeviceNetwork/DeviceNetworkTest.cs @@ -212,7 +212,7 @@ public async Task WiredNetworkDeviceSendAndReceive() DeviceNetworkComponent networkComponent1 = null; DeviceNetworkComponent networkComponent2 = null; WiredNetworkComponent wiredNetworkComponent = null; - var grid = testMap.MapGrid; + var grid = testMap.Grid.Comp; var testValue = "test"; var payload = new NetworkPayload diff --git a/Content.IntegrationTests/Tests/DoAfter/DoAfterCancellationTests.cs b/Content.IntegrationTests/Tests/DoAfter/DoAfterCancellationTests.cs index d47eb13273f..0ebd17d8879 100644 --- a/Content.IntegrationTests/Tests/DoAfter/DoAfterCancellationTests.cs +++ b/Content.IntegrationTests/Tests/DoAfter/DoAfterCancellationTests.cs @@ -3,8 +3,6 @@ using Content.IntegrationTests.Tests.Interaction; using Content.IntegrationTests.Tests.Weldable; using Content.Shared.Tools.Components; -using Content.Server.Tools.Components; -using Content.Shared.DoAfter; namespace Content.IntegrationTests.Tests.DoAfter; diff --git a/Content.IntegrationTests/Tests/EntityTest.cs b/Content.IntegrationTests/Tests/EntityTest.cs index 152eb725221..d3b1fb47221 100644 --- a/Content.IntegrationTests/Tests/EntityTest.cs +++ b/Content.IntegrationTests/Tests/EntityTest.cs @@ -354,41 +354,18 @@ public async Task AllComponentsOneToOneDeleteTest() await using var pair = await PoolManager.GetServerClient(); var server = pair.Server; - - var mapManager = server.ResolveDependency(); var entityManager = server.ResolveDependency(); var componentFactory = server.ResolveDependency(); - var tileDefinitionManager = server.ResolveDependency(); - var mapSystem = entityManager.System(); var logmill = server.ResolveDependency().GetSawmill("EntityTest"); - Entity grid = default!; - - await server.WaitPost(() => - { - // Create a one tile grid to stave off the grid 0 monsters - var mapId = mapManager.CreateMap(); - - mapManager.AddUninitializedMap(mapId); - - grid = mapManager.CreateGridEntity(mapId); - - var tileDefinition = tileDefinitionManager["Plating"]; - var tile = new Tile(tileDefinition.TileId); - var coordinates = new EntityCoordinates(grid.Owner, Vector2.Zero); - - mapSystem.SetTile(grid.Owner, grid.Comp!, coordinates, tile); - - mapManager.DoMapInitialize(mapId); - }); - + await pair.CreateTestMap(); await server.WaitRunTicks(5); + var testLocation = pair.TestMap.GridCoords; await server.WaitAssertion(() => { Assert.Multiple(() => { - var testLocation = new EntityCoordinates(grid.Owner, Vector2.Zero); foreach (var type in componentFactory.AllRegisteredTypes) { diff --git a/Content.IntegrationTests/Tests/Fluids/PuddleTest.cs b/Content.IntegrationTests/Tests/Fluids/PuddleTest.cs index 611af673809..a9069892dff 100644 --- a/Content.IntegrationTests/Tests/Fluids/PuddleTest.cs +++ b/Content.IntegrationTests/Tests/Fluids/PuddleTest.cs @@ -46,17 +46,14 @@ public async Task SpaceNoPuddleTest() var server = pair.Server; var testMap = await pair.CreateTestMap(); + var grid = testMap.Grid.Comp; var entitySystemManager = server.ResolveDependency(); var spillSystem = entitySystemManager.GetEntitySystem(); - MapGridComponent grid = null; - // Remove all tiles await server.WaitPost(() => { - grid = testMap.MapGrid; - foreach (var tile in grid.GetAllTiles()) { grid.SetTile(tile.GridIndices, Tile.Empty); diff --git a/Content.IntegrationTests/Tests/Interaction/InteractionTest.Helpers.cs b/Content.IntegrationTests/Tests/Interaction/InteractionTest.Helpers.cs index 88448e7b800..480fd9cde6f 100644 --- a/Content.IntegrationTests/Tests/Interaction/InteractionTest.Helpers.cs +++ b/Content.IntegrationTests/Tests/Interaction/InteractionTest.Helpers.cs @@ -989,7 +989,7 @@ protected void ToggleNeedPower(NetEntity? target = null) /// protected async Task AddGravity(EntityUid? uid = null) { - var target = uid ?? MapData.GridUid; + var target = uid ?? MapData.Grid; await Server.WaitPost(() => { var gravity = SEntMan.EnsureComponent(target); diff --git a/Content.IntegrationTests/Tests/Interaction/InteractionTest.cs b/Content.IntegrationTests/Tests/Interaction/InteractionTest.cs index bed27ba6efe..a4ed31e9983 100644 --- a/Content.IntegrationTests/Tests/Interaction/InteractionTest.cs +++ b/Content.IntegrationTests/Tests/Interaction/InteractionTest.cs @@ -184,7 +184,7 @@ public virtual async Task Setup() await Pair.CreateTestMap(); PlayerCoords = SEntMan.GetNetCoordinates(MapData.GridCoords.Offset(new Vector2(0.5f, 0.5f)).WithEntityId(MapData.MapUid, Transform, SEntMan)); TargetCoords = SEntMan.GetNetCoordinates(MapData.GridCoords.Offset(new Vector2(1.5f, 0.5f)).WithEntityId(MapData.MapUid, Transform, SEntMan)); - await SetTile(Plating, grid: MapData.MapGrid); + await SetTile(Plating, grid: MapData.Grid.Comp); // Get player data var sPlayerMan = Server.ResolveDependency(); diff --git a/Content.IntegrationTests/Tests/Interaction/MovementTest.cs b/Content.IntegrationTests/Tests/Interaction/MovementTest.cs index 553b031c2b7..dc5aec92cfc 100644 --- a/Content.IntegrationTests/Tests/Interaction/MovementTest.cs +++ b/Content.IntegrationTests/Tests/Interaction/MovementTest.cs @@ -31,7 +31,7 @@ public override async Task Setup() for (var i = -Tiles; i <= Tiles; i++) { - await SetTile(Plating, SEntMan.GetNetCoordinates(pCoords.Offset(new Vector2(i, 0))), MapData.MapGrid); + await SetTile(Plating, SEntMan.GetNetCoordinates(pCoords.Offset(new Vector2(i, 0))), MapData.Grid.Comp); } AssertGridCount(1); diff --git a/Content.IntegrationTests/Tests/MaterialArbitrageTest.cs b/Content.IntegrationTests/Tests/MaterialArbitrageTest.cs index a2faef0dd4d..51be2fb4311 100644 --- a/Content.IntegrationTests/Tests/MaterialArbitrageTest.cs +++ b/Content.IntegrationTests/Tests/MaterialArbitrageTest.cs @@ -183,7 +183,7 @@ public async Task NoMaterialArbitrage() var spawnedPrice = await GetSpawnedPrice(spawnedEnts); var price = await GetPrice(id); if (spawnedPrice > 0 && price > 0) - Assert.That(spawnedPrice, Is.LessThanOrEqualTo(price), $"{id} increases in price after being destroyed"); + Assert.That(spawnedPrice, Is.LessThanOrEqualTo(price), $"{id} increases in price after being destroyed\nEntities spawned on destruction: {string.Join(',', spawnedEnts)}"); // Check lathe production if (latheRecipes.TryGetValue(id, out var recipe)) @@ -359,7 +359,7 @@ await server.WaitPost(() => { var ent = entManager.SpawnEntity(id, testMap.GridCoords); stackSys.SetCount(ent, 1); - priceCache[id] = price = pricing.GetPrice(ent); + priceCache[id] = price = pricing.GetPrice(ent, false); entManager.DeleteEntity(ent); }); } diff --git a/Content.IntegrationTests/Tests/PostMapInitTest.cs b/Content.IntegrationTests/Tests/PostMapInitTest.cs index 07a6ddd89f1..bae52581480 100644 --- a/Content.IntegrationTests/Tests/PostMapInitTest.cs +++ b/Content.IntegrationTests/Tests/PostMapInitTest.cs @@ -150,7 +150,10 @@ public async Task NoSavedPostMapInitTest() [Test, TestCaseSource(nameof(GameMaps))] public async Task GameMapsLoadableTest(string mapProto) { - await using var pair = await PoolManager.GetServerClient(); + await using var pair = await PoolManager.GetServerClient(new PoolSettings + { + Dirty = true // Stations spawn a bunch of nullspace entities and maps like centcomm. + }); var server = pair.Server; var mapManager = server.ResolveDependency(); diff --git a/Content.IntegrationTests/Tests/PrototypeSaveTest.cs b/Content.IntegrationTests/Tests/PrototypeSaveTest.cs index e4a9c1a840d..9e26fa5eaa2 100644 --- a/Content.IntegrationTests/Tests/PrototypeSaveTest.cs +++ b/Content.IntegrationTests/Tests/PrototypeSaveTest.cs @@ -38,31 +38,15 @@ public async Task UninitializedSaveTest() var mapManager = server.ResolveDependency(); var entityMan = server.ResolveDependency(); var prototypeMan = server.ResolveDependency(); - var tileDefinitionManager = server.ResolveDependency(); var seriMan = server.ResolveDependency(); var compFact = server.ResolveDependency(); var prototypes = new List(); - MapGridComponent grid = default!; EntityUid uid; - MapId mapId = default; - //Build up test environment - await server.WaitPost(() => - { - // Create a one tile grid to stave off the grid 0 monsters - mapId = mapManager.CreateMap(); - - mapManager.AddUninitializedMap(mapId); - - grid = mapManager.CreateGrid(mapId); - - var tileDefinition = tileDefinitionManager["FloorSteel"]; // Wires n such disable ambiance while under the floor - var tile = new Tile(tileDefinition.TileId); - var coordinates = grid.Owner.ToCoordinates(); - - grid.SetTile(coordinates, tile); - }); + await pair.CreateTestMap(false, "FloorSteel"); // Wires n such disable ambiance while under the floor + var mapId = pair.TestMap.MapId; + var grid = pair.TestMap.Grid; await server.WaitRunTicks(5); diff --git a/Content.IntegrationTests/Tests/Shuttle/DockTest.cs b/Content.IntegrationTests/Tests/Shuttle/DockTest.cs index b6fc273570a..a1aa462a697 100644 --- a/Content.IntegrationTests/Tests/Shuttle/DockTest.cs +++ b/Content.IntegrationTests/Tests/Shuttle/DockTest.cs @@ -39,7 +39,7 @@ public async Task TestDockingConfig(Vector2 dock1Pos, Vector2 dock2Pos, Angle do await server.WaitAssertion(() => { - entManager.DeleteEntity(map.GridUid); + entManager.DeleteEntity(map.Grid); var grid1 = mapManager.CreateGridEntity(mapId); var grid2 = mapManager.CreateGridEntity(mapId); var grid1Ent = grid1.Owner; @@ -104,7 +104,7 @@ public async Task TestPlanetDock() // Spawn shuttle and affirm no valid docks. await server.WaitAssertion(() => { - entManager.DeleteEntity(map.GridUid); + entManager.DeleteEntity(map.Grid); Assert.That(entManager.System().TryLoad(otherMap.MapId, "/Maps/Shuttles/emergency.yml", out var rootUids)); shuttle = rootUids[0]; diff --git a/Content.IntegrationTests/Tests/Station/EvacShuttleTest.cs b/Content.IntegrationTests/Tests/Station/EvacShuttleTest.cs new file mode 100644 index 00000000000..b1a398c8050 --- /dev/null +++ b/Content.IntegrationTests/Tests/Station/EvacShuttleTest.cs @@ -0,0 +1,114 @@ +using System.Linq; +using Content.Server.GameTicking; +using Content.Server.Shuttles.Components; +using Content.Server.Shuttles.Systems; +using Content.Server.Station.Components; +using Content.Shared.CCVar; +using Content.Shared.Shuttles.Components; +using Robust.Shared.GameObjects; +using Robust.Shared.Map.Components; + +namespace Content.IntegrationTests.Tests.Station; + +[TestFixture] +[TestOf(typeof(EmergencyShuttleSystem))] +public sealed class EvacShuttleTest +{ + /// + /// Ensure that the emergency shuttle can be called, and that it will travel to centcomm + /// + [Test] + public async Task EmergencyEvacTest() + { + await using var pair = await PoolManager.GetServerClient(new PoolSettings { DummyTicker = true, Dirty = true }); + var server = pair.Server; + var entMan = server.EntMan; + var ticker = server.System(); + + // Dummy ticker tests should not have centcomm + Assert.That(entMan.Count(), Is.Zero); + + var shuttleEnabled = pair.Server.CfgMan.GetCVar(CCVars.EmergencyShuttleEnabled); + pair.Server.CfgMan.SetCVar(CCVars.GameMap, "Edge"); + pair.Server.CfgMan.SetCVar(CCVars.GameDummyTicker, false); + pair.Server.CfgMan.SetCVar(CCVars.EmergencyShuttleEnabled, true); + + await server.WaitPost(() => ticker.RestartRound()); + await pair.RunTicksSync(25); + Assert.That(ticker.RunLevel, Is.EqualTo(GameRunLevel.InRound)); + + // Find the station, centcomm, and shuttle, and ftl map. + + Assert.That(entMan.Count(), Is.EqualTo(1)); + Assert.That(entMan.Count(), Is.EqualTo(1)); + Assert.That(entMan.Count(), Is.EqualTo(1)); + Assert.That(entMan.Count(), Is.EqualTo(1)); + Assert.That(entMan.Count(), Is.EqualTo(0)); + + var station = (Entity) entMan.AllComponentsList().Single(); + var data = entMan.GetComponent(station); + var shuttleData = entMan.GetComponent(station); + + var saltern = data.Grids.Single(); + Assert.That(entMan.HasComponent(saltern)); + + var shuttle = shuttleData.EmergencyShuttle!.Value; + Assert.That(entMan.HasComponent(shuttle)); + Assert.That(entMan.HasComponent(shuttle)); + + var centcomm = station.Comp.Entity!.Value; + Assert.That(entMan.HasComponent(centcomm)); + + var centcommMap = station.Comp.MapEntity!.Value; + Assert.That(entMan.HasComponent(centcommMap)); + Assert.That(server.Transform(centcomm).MapUid, Is.EqualTo(centcommMap)); + + var salternXform = server.Transform(saltern); + Assert.That(salternXform.MapUid, Is.Not.Null); + Assert.That(salternXform.MapUid, Is.Not.EqualTo(centcommMap)); + + var shuttleXform = server.Transform(shuttle); + Assert.That(shuttleXform.MapUid, Is.Not.Null); + Assert.That(shuttleXform.MapUid, Is.EqualTo(centcommMap)); + + // Set up shuttle timing + var evacSys = server.System(); + evacSys.TransitTime = ShuttleSystem.DefaultTravelTime; // Absolute minimum transit time, so the test has to run for at least this long + // TODO SHUTTLE fix spaghetti + + var dockTime = server.CfgMan.GetCVar(CCVars.EmergencyShuttleDockTime); + server.CfgMan.SetCVar(CCVars.EmergencyShuttleDockTime, 2); + async Task RunSeconds(float seconds) + { + await pair.RunTicksSync((int) Math.Ceiling(seconds / server.Timing.TickPeriod.TotalSeconds)); + } + + // Call evac shuttle. + await pair.WaitCommand("callshuttle 0:02"); + await RunSeconds(3); + + // Shuttle should have arrived on the station + Assert.That(shuttleXform.MapUid, Is.EqualTo(salternXform.MapUid)); + + await RunSeconds(2); + + // Shuttle should be FTLing back to centcomm + Assert.That(entMan.Count(), Is.EqualTo(1)); + var ftl = (Entity) entMan.AllComponentsList().Single(); + Assert.That(entMan.HasComponent(ftl)); + Assert.That(ftl.Owner, Is.Not.EqualTo(centcommMap)); + Assert.That(ftl.Owner, Is.Not.EqualTo(salternXform.MapUid)); + Assert.That(shuttleXform.MapUid, Is.EqualTo(ftl.Owner)); + + // Shuttle should have arrived at centcomm + await RunSeconds(ShuttleSystem.DefaultTravelTime); + Assert.That(shuttleXform.MapUid, Is.EqualTo(centcommMap)); + + // Round should be ending now + Assert.That(ticker.RunLevel, Is.EqualTo(GameRunLevel.PostRound)); + + server.CfgMan.SetCVar(CCVars.EmergencyShuttleDockTime, dockTime); + pair.Server.CfgMan.SetCVar(CCVars.EmergencyShuttleEnabled, shuttleEnabled); + await pair.CleanReturnAsync(); + } +} diff --git a/Content.IntegrationTests/Tests/Tiles/TileConstructionTests.cs b/Content.IntegrationTests/Tests/Tiles/TileConstructionTests.cs index 0a2af88887a..083e817d697 100644 --- a/Content.IntegrationTests/Tests/Tiles/TileConstructionTests.cs +++ b/Content.IntegrationTests/Tests/Tiles/TileConstructionTests.cs @@ -37,7 +37,7 @@ public async Task CutThenPlaceLatticeNewGrid() // Remove grid await SetTile(null); await SetTile(null, PlayerCoords); - Assert.That(MapData.MapGrid.Deleted); + Assert.That(MapData.Grid.Comp.Deleted); AssertGridCount(0); // Place Lattice @@ -70,7 +70,7 @@ public async Task FloorConstructDeconstruct() // Remove grid await SetTile(null); await SetTile(null, PlayerCoords); - Assert.That(MapData.MapGrid.Deleted); + Assert.That(MapData.Grid.Comp.Deleted); AssertGridCount(0); // Space -> Lattice diff --git a/Content.Server.Database/Migrations/Postgres/20240409013837_FixRoundStartDateNullability.Designer.cs b/Content.Server.Database/Migrations/Postgres/20240409013837_FixRoundStartDateNullability.Designer.cs new file mode 100644 index 00000000000..bb165c37e8c --- /dev/null +++ b/Content.Server.Database/Migrations/Postgres/20240409013837_FixRoundStartDateNullability.Designer.cs @@ -0,0 +1,1766 @@ +// +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("20240409013837_FixRoundStartDateNullability")] + partial class FixRoundStartDateNullability + { + /// + 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.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.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("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("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.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.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.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.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"); + }); + + 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("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/20240409013837_FixRoundStartDateNullability.cs b/Content.Server.Database/Migrations/Postgres/20240409013837_FixRoundStartDateNullability.cs new file mode 100644 index 00000000000..84b296d4fea --- /dev/null +++ b/Content.Server.Database/Migrations/Postgres/20240409013837_FixRoundStartDateNullability.cs @@ -0,0 +1,40 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Content.Server.Database.Migrations.Postgres +{ + /// + public partial class FixRoundStartDateNullability : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "start_date", + table: "round", + type: "timestamp with time zone", + nullable: true, + oldClrType: typeof(DateTime), + oldType: "timestamp with time zone", + oldDefaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified)); + + migrationBuilder.Sql("UPDATE round SET start_date = NULL WHERE start_date = '-Infinity';"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "start_date", + table: "round", + type: "timestamp with time zone", + nullable: false, + defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), + oldClrType: typeof(DateTime), + oldType: "timestamp with time zone", + oldNullable: true); + } + } +} diff --git a/Content.Server.Database/Migrations/Postgres/PostgresServerDbContextModelSnapshot.cs b/Content.Server.Database/Migrations/Postgres/PostgresServerDbContextModelSnapshot.cs index 3155405b942..5b3e33f3db7 100644 --- a/Content.Server.Database/Migrations/Postgres/PostgresServerDbContextModelSnapshot.cs +++ b/Content.Server.Database/Migrations/Postgres/PostgresServerDbContextModelSnapshot.cs @@ -855,10 +855,8 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("integer") .HasColumnName("server_id"); - b.Property("StartDate") - .ValueGeneratedOnAdd() + b.Property("StartDate") .HasColumnType("timestamp with time zone") - .HasDefaultValue(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified)) .HasColumnName("start_date"); b.HasKey("Id") diff --git a/Content.Server.Database/Migrations/Sqlite/20240409013832_FixRoundStartDateNullability.Designer.cs b/Content.Server.Database/Migrations/Sqlite/20240409013832_FixRoundStartDateNullability.Designer.cs new file mode 100644 index 00000000000..e3ca0e78bd8 --- /dev/null +++ b/Content.Server.Database/Migrations/Sqlite/20240409013832_FixRoundStartDateNullability.Designer.cs @@ -0,0 +1,1697 @@ +// +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("20240409013832_FixRoundStartDateNullability")] + partial class FixRoundStartDateNullability + { + /// + 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.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.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("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("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.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.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.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.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"); + }); + + 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("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/20240409013832_FixRoundStartDateNullability.cs b/Content.Server.Database/Migrations/Sqlite/20240409013832_FixRoundStartDateNullability.cs new file mode 100644 index 00000000000..dbfd7776ba5 --- /dev/null +++ b/Content.Server.Database/Migrations/Sqlite/20240409013832_FixRoundStartDateNullability.cs @@ -0,0 +1,38 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Content.Server.Database.Migrations.Sqlite +{ + /// + public partial class FixRoundStartDateNullability : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "start_date", + table: "round", + type: "TEXT", + nullable: true, + oldClrType: typeof(DateTime), + oldType: "TEXT", + oldDefaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified)); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "start_date", + table: "round", + type: "TEXT", + nullable: false, + defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), + oldClrType: typeof(DateTime), + oldType: "TEXT", + oldNullable: true); + } + } +} diff --git a/Content.Server.Database/Migrations/Sqlite/20240409014937_FixRoundStartDateNullability2.Designer.cs b/Content.Server.Database/Migrations/Sqlite/20240409014937_FixRoundStartDateNullability2.Designer.cs new file mode 100644 index 00000000000..2ec05cdd45a --- /dev/null +++ b/Content.Server.Database/Migrations/Sqlite/20240409014937_FixRoundStartDateNullability2.Designer.cs @@ -0,0 +1,1697 @@ +// +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("20240409014937_FixRoundStartDateNullability2")] + partial class FixRoundStartDateNullability2 + { + /// + 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.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.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("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("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.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.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.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.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"); + }); + + 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("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/20240409014937_FixRoundStartDateNullability2.cs b/Content.Server.Database/Migrations/Sqlite/20240409014937_FixRoundStartDateNullability2.cs new file mode 100644 index 00000000000..01b90f8333d --- /dev/null +++ b/Content.Server.Database/Migrations/Sqlite/20240409014937_FixRoundStartDateNullability2.cs @@ -0,0 +1,25 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Content.Server.Database.Migrations.Sqlite +{ + /// + public partial class FixRoundStartDateNullability2 : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + // This needs to be its own separate migration, + // because EF Core re-arranges the order of the commands if it's a single migration... + // (only relevant for SQLite since it needs cursed shit to do ALTER COLUMN) + migrationBuilder.Sql("UPDATE round SET start_date = NULL WHERE start_date = '0001-01-01 00:00:00';"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + + } + } +} diff --git a/Content.Server.Database/Migrations/Sqlite/SqliteServerDbContextModelSnapshot.cs b/Content.Server.Database/Migrations/Sqlite/SqliteServerDbContextModelSnapshot.cs index 3ef069f8589..021ffee32f6 100644 --- a/Content.Server.Database/Migrations/Sqlite/SqliteServerDbContextModelSnapshot.cs +++ b/Content.Server.Database/Migrations/Sqlite/SqliteServerDbContextModelSnapshot.cs @@ -806,10 +806,8 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("INTEGER") .HasColumnName("server_id"); - b.Property("StartDate") - .ValueGeneratedOnAdd() + b.Property("StartDate") .HasColumnType("TEXT") - .HasDefaultValue(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified)) .HasColumnName("start_date"); b.HasKey("Id") diff --git a/Content.Server.Database/Model.cs b/Content.Server.Database/Model.cs index 874fe88cbbd..05da7866da0 100644 --- a/Content.Server.Database/Model.cs +++ b/Content.Server.Database/Model.cs @@ -118,10 +118,6 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) modelBuilder.Entity() .HasIndex(round => round.StartDate); - modelBuilder.Entity() - .Property(round => round.StartDate) - .HasDefaultValue(default(DateTime)); - modelBuilder.Entity() .HasKey(logPlayer => new {logPlayer.RoundId, logPlayer.LogId, logPlayer.PlayerUserId}); @@ -496,7 +492,7 @@ public class Round [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Id { get; set; } - public DateTime StartDate { get; set; } + public DateTime? StartDate { get; set; } public List Players { get; set; } = default!; @@ -881,8 +877,35 @@ public sealed class UploadedResourceLog public byte[] Data { get; set; } = default!; } + // Note: this interface isn't used by the game, but it *is* used by SS14.Admin. + // Don't remove! Or face the consequences! + public interface IAdminRemarksCommon + { + public int Id { get; } + + public int? RoundId { get; } + public Round? Round { get; } + + public Guid? PlayerUserId { get; } + public Player? Player { get; } + public TimeSpan PlaytimeAtNote { get; } + + public string Message { get; } + + public Player? CreatedBy { get; } + + public DateTime CreatedAt { get; } + + public Player? LastEditedBy { get; } + + public DateTime? LastEditedAt { get; } + public DateTime? ExpirationTime { get; } + + public bool Deleted { get; } + } + [Index(nameof(PlayerUserId))] - public class AdminNote + public class AdminNote : IAdminRemarksCommon { [Required, Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Id { get; set; } @@ -916,7 +939,7 @@ public class AdminNote } [Index(nameof(PlayerUserId))] - public class AdminWatchlist + public class AdminWatchlist : IAdminRemarksCommon { [Required, Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Id { get; set; } @@ -947,7 +970,7 @@ public class AdminWatchlist } [Index(nameof(PlayerUserId))] - public class AdminMessage + public class AdminMessage : IAdminRemarksCommon { [Required, Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Id { get; set; } diff --git a/Content.Server/Administration/ServerApi.Utility.cs b/Content.Server/Administration/ServerApi.Utility.cs new file mode 100644 index 00000000000..951e0039d69 --- /dev/null +++ b/Content.Server/Administration/ServerApi.Utility.cs @@ -0,0 +1,147 @@ +using System.Net; +using System.Net.Http; +using System.Threading.Tasks; +using Robust.Server.ServerStatus; + +namespace Content.Server.Administration; + +public sealed partial class ServerApi +{ + private void RegisterHandler(HttpMethod method, string exactPath, Func handler) + { + _statusHost.AddHandler(async context => + { + if (context.RequestMethod != method || context.Url.AbsolutePath != exactPath) + return false; + + if (!await CheckAccess(context)) + return true; + + await handler(context); + return true; + }); + } + + private void RegisterActorHandler(HttpMethod method, string exactPath, Func handler) + { + RegisterHandler(method, exactPath, async context => + { + if (await CheckActor(context) is not { } actor) + return; + + await handler(context, actor); + }); + } + + /// + /// Async helper function which runs a task on the main thread and returns the result. + /// + private async Task RunOnMainThread(Func func) + { + var taskCompletionSource = new TaskCompletionSource(); + _taskManager.RunOnMainThread(() => + { + try + { + taskCompletionSource.TrySetResult(func()); + } + catch (Exception e) + { + taskCompletionSource.TrySetException(e); + } + }); + + var result = await taskCompletionSource.Task; + return result; + } + + /// + /// Runs an action on the main thread. This does not return any value and is meant to be used for void functions. Use for functions that return a value. + /// + private async Task RunOnMainThread(Action action) + { + var taskCompletionSource = new TaskCompletionSource(); + _taskManager.RunOnMainThread(() => + { + try + { + action(); + taskCompletionSource.TrySetResult(); + } + catch (Exception e) + { + taskCompletionSource.TrySetException(e); + } + }); + + await taskCompletionSource.Task; + } + + private async Task RunOnMainThread(Func action) + { + var taskCompletionSource = new TaskCompletionSource(); + // ReSharper disable once AsyncVoidLambda + _taskManager.RunOnMainThread(async () => + { + try + { + await action(); + taskCompletionSource.TrySetResult(); + } + catch (Exception e) + { + taskCompletionSource.TrySetException(e); + } + }); + + await taskCompletionSource.Task; + } + + /// + /// Helper function to read JSON encoded data from the request body. + /// + private static async Task ReadJson(IStatusHandlerContext context) where T : notnull + { + try + { + var json = await context.RequestBodyJsonAsync(); + if (json == null) + await RespondBadRequest(context, "Request body is null"); + + return json; + } + catch (Exception e) + { + await RespondBadRequest(context, "Unable to parse request body", ExceptionData.FromException(e)); + return default; + } + } + + private static async Task RespondError( + IStatusHandlerContext context, + ErrorCode errorCode, + HttpStatusCode statusCode, + string message, + ExceptionData? exception = null) + { + await context.RespondJsonAsync(new BaseResponse(message, errorCode, exception), statusCode) + .ConfigureAwait(false); + } + + private static async Task RespondBadRequest( + IStatusHandlerContext context, + string message, + ExceptionData? exception = null) + { + await RespondError(context, ErrorCode.BadRequest, HttpStatusCode.BadRequest, message, exception) + .ConfigureAwait(false); + } + + private static async Task RespondOk(IStatusHandlerContext context) + { + await context.RespondJsonAsync(new BaseResponse("OK")) + .ConfigureAwait(false); + } + + private static string FormatLogActor(Actor actor) => $"{actor.Name} ({actor.Guid})"; +} diff --git a/Content.Server/Administration/ServerApi.cs b/Content.Server/Administration/ServerApi.cs new file mode 100644 index 00000000000..6f10ef9b479 --- /dev/null +++ b/Content.Server/Administration/ServerApi.cs @@ -0,0 +1,711 @@ +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Security.Cryptography; +using System.Text; +using System.Text.Json; +using System.Text.Json.Nodes; +using System.Threading.Tasks; +using Content.Server.Administration.Systems; +using Content.Server.GameTicking; +using Content.Server.GameTicking.Presets; +using Content.Server.GameTicking.Rules.Components; +using Content.Server.Maps; +using Content.Server.RoundEnd; +using Content.Shared.Administration.Managers; +using Content.Shared.CCVar; +using Content.Shared.Prototypes; +using Robust.Server.ServerStatus; +using Robust.Shared.Asynchronous; +using Robust.Shared.Configuration; +using Robust.Shared.Network; +using Robust.Shared.Player; +using Robust.Shared.Prototypes; +using Robust.Shared.Utility; + +namespace Content.Server.Administration; + +/// +/// Exposes various admin-related APIs via the game server's . +/// +public sealed partial class ServerApi : IPostInjectInit +{ + private const string SS14TokenScheme = "SS14Token"; + + private static readonly HashSet PanicBunkerCVars = + [ + CCVars.PanicBunkerEnabled.Name, + CCVars.PanicBunkerDisableWithAdmins.Name, + CCVars.PanicBunkerEnableWithoutAdmins.Name, + CCVars.PanicBunkerCountDeadminnedAdmins.Name, + CCVars.PanicBunkerShowReason.Name, + CCVars.PanicBunkerMinAccountAge.Name, + CCVars.PanicBunkerMinOverallHours.Name, + CCVars.PanicBunkerCustomReason.Name, + ]; + + [Dependency] private readonly IStatusHost _statusHost = default!; + [Dependency] private readonly IConfigurationManager _config = default!; + [Dependency] private readonly ISharedPlayerManager _playerManager = default!; + [Dependency] private readonly ISharedAdminManager _adminManager = default!; + [Dependency] private readonly IGameMapManager _gameMapManager = default!; + [Dependency] private readonly IServerNetManager _netManager = default!; + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + [Dependency] private readonly IComponentFactory _componentFactory = default!; + [Dependency] private readonly ITaskManager _taskManager = default!; + [Dependency] private readonly EntityManager _entityManager = default!; + [Dependency] private readonly ILogManager _logManager = default!; + [Dependency] private readonly IEntitySystemManager _entitySystemManager = default!; + [Dependency] private readonly ILocalizationManager _loc = default!; + + private string _token = string.Empty; + private ISawmill _sawmill = default!; + + void IPostInjectInit.PostInject() + { + _sawmill = _logManager.GetSawmill("serverApi"); + + // Get + RegisterActorHandler(HttpMethod.Get, "/admin/info", InfoHandler); + RegisterHandler(HttpMethod.Get, "/admin/game_rules", GetGameRules); + RegisterHandler(HttpMethod.Get, "/admin/presets", GetPresets); + + // Post + RegisterActorHandler(HttpMethod.Post, "/admin/actions/round/start", ActionRoundStart); + RegisterActorHandler(HttpMethod.Post, "/admin/actions/round/end", ActionRoundEnd); + RegisterActorHandler(HttpMethod.Post, "/admin/actions/round/restartnow", ActionRoundRestartNow); + RegisterActorHandler(HttpMethod.Post, "/admin/actions/kick", ActionKick); + RegisterActorHandler(HttpMethod.Post, "/admin/actions/add_game_rule", ActionAddGameRule); + RegisterActorHandler(HttpMethod.Post, "/admin/actions/end_game_rule", ActionEndGameRule); + RegisterActorHandler(HttpMethod.Post, "/admin/actions/force_preset", ActionForcePreset); + RegisterActorHandler(HttpMethod.Post, "/admin/actions/set_motd", ActionForceMotd); + RegisterActorHandler(HttpMethod.Patch, "/admin/actions/panic_bunker", ActionPanicPunker); + } + + public void Initialize() + { + _config.OnValueChanged(CCVars.AdminApiToken, UpdateToken, true); + } + + public void Shutdown() + { + _config.UnsubValueChanged(CCVars.AdminApiToken, UpdateToken); + } + + private void UpdateToken(string token) + { + _token = token; + } + + + #region Actions + + /// + /// Changes the panic bunker settings. + /// + private async Task ActionPanicPunker(IStatusHandlerContext context, Actor actor) + { + var request = await ReadJson(context); + if (request == null) + return; + + var toSet = new Dictionary(); + foreach (var (cVar, value) in request) + { + if (!PanicBunkerCVars.Contains(cVar)) + { + await RespondBadRequest(context, $"Invalid panic bunker CVar: '{cVar}'"); + return; + } + + if (value == null) + { + await RespondBadRequest(context, $"Value is null: '{cVar}'"); + return; + } + + if (value is not JsonValue jsonValue) + { + await RespondBadRequest(context, $"Value is not valid: '{cVar}'"); + return; + } + + object castValue; + var cVarType = _config.GetCVarType(cVar); + if (cVarType == typeof(bool)) + { + if (!jsonValue.TryGetValue(out bool b)) + { + await RespondBadRequest(context, $"CVar '{cVar}' must be of type bool."); + return; + } + + castValue = b; + } + else if (cVarType == typeof(int)) + { + if (!jsonValue.TryGetValue(out int i)) + { + await RespondBadRequest(context, $"CVar '{cVar}' must be of type int."); + return; + } + + castValue = i; + } + else if (cVarType == typeof(string)) + { + if (!jsonValue.TryGetValue(out string? s)) + { + await RespondBadRequest(context, $"CVar '{cVar}' must be of type string."); + return; + } + + castValue = s; + } + else + { + throw new NotSupportedException("Unsupported CVar type"); + } + + toSet[cVar] = castValue; + } + + await RunOnMainThread(() => + { + foreach (var (cVar, value) in toSet) + { + _config.SetCVar(cVar, value); + _sawmill.Info( + $"Panic bunker property '{cVar}' changed to '{value}' by {FormatLogActor(actor)}."); + } + }); + + await RespondOk(context); + } + + /// + /// Sets the current MOTD. + /// + private async Task ActionForceMotd(IStatusHandlerContext context, Actor actor) + { + var motd = await ReadJson(context); + if (motd == null) + return; + + _sawmill.Info($"MOTD changed to \"{motd.Motd}\" by {FormatLogActor(actor)}."); + + await RunOnMainThread(() => _config.SetCVar(CCVars.MOTD, motd.Motd)); + // A hook in the MOTD system sends the changes to each client + await RespondOk(context); + } + + /// + /// Forces the next preset- + /// + private async Task ActionForcePreset(IStatusHandlerContext context, Actor actor) + { + var body = await ReadJson(context); + if (body == null) + return; + + await RunOnMainThread(async () => + { + var ticker = _entitySystemManager.GetEntitySystem(); + if (ticker.RunLevel != GameRunLevel.PreRoundLobby) + { + await RespondError( + context, + ErrorCode.InvalidRoundState, + HttpStatusCode.Conflict, + "Game must be in pre-round lobby"); + return; + } + + var preset = ticker.FindGamePreset(body.PresetId); + if (preset == null) + { + await RespondError( + context, + ErrorCode.GameRuleNotFound, + HttpStatusCode.UnprocessableContent, + $"Game rule '{body.PresetId}' doesn't exist"); + return; + } + + ticker.SetGamePreset(preset); + _sawmill.Info($"Forced the game to start with preset {body.PresetId} by {FormatLogActor(actor)}."); + + await RespondOk(context); + }); + } + + /// + /// Ends an active game rule. + /// + private async Task ActionEndGameRule(IStatusHandlerContext context, Actor actor) + { + var body = await ReadJson(context); + if (body == null) + return; + + await RunOnMainThread(async () => + { + var ticker = _entitySystemManager.GetEntitySystem(); + var gameRule = ticker + .GetActiveGameRules() + .FirstOrNull(rule => + _entityManager.MetaQuery.GetComponent(rule).EntityPrototype?.ID == body.GameRuleId); + + if (gameRule == null) + { + await RespondError(context, + ErrorCode.GameRuleNotFound, + HttpStatusCode.UnprocessableContent, + $"Game rule '{body.GameRuleId}' not found or not active"); + + return; + } + + _sawmill.Info($"Ended game rule {body.GameRuleId} by {FormatLogActor(actor)}."); + ticker.EndGameRule(gameRule.Value); + + await RespondOk(context); + }); + } + + /// + /// Adds a game rule to the current round. + /// + private async Task ActionAddGameRule(IStatusHandlerContext context, Actor actor) + { + var body = await ReadJson(context); + if (body == null) + return; + + await RunOnMainThread(async () => + { + var ticker = _entitySystemManager.GetEntitySystem(); + if (!_prototypeManager.HasIndex(body.GameRuleId)) + { + await RespondError(context, + ErrorCode.GameRuleNotFound, + HttpStatusCode.UnprocessableContent, + $"Game rule '{body.GameRuleId}' not found or not active"); + return; + } + + var ruleEntity = ticker.AddGameRule(body.GameRuleId); + _sawmill.Info($"Added game rule {body.GameRuleId} by {FormatLogActor(actor)}."); + if (ticker.RunLevel == GameRunLevel.InRound) + { + ticker.StartGameRule(ruleEntity); + _sawmill.Info($"Started game rule {body.GameRuleId} by {FormatLogActor(actor)}."); + } + + await RespondOk(context); + }); + } + + /// + /// Kicks a player. + /// + private async Task ActionKick(IStatusHandlerContext context, Actor actor) + { + var body = await ReadJson(context); + if (body == null) + return; + + await RunOnMainThread(async () => + { + if (!_playerManager.TryGetSessionById(new NetUserId(body.Guid), out var player)) + { + await RespondError( + context, + ErrorCode.PlayerNotFound, + HttpStatusCode.UnprocessableContent, + "Player not found"); + return; + } + + var reason = body.Reason ?? "No reason supplied"; + reason += " (kicked by admin)"; + + _netManager.DisconnectChannel(player.Channel, reason); + await RespondOk(context); + + _sawmill.Info($"Kicked player {player.Name} ({player.UserId}) for {reason} by {FormatLogActor(actor)}"); + }); + } + + private async Task ActionRoundStart(IStatusHandlerContext context, Actor actor) + { + await RunOnMainThread(async () => + { + var ticker = _entitySystemManager.GetEntitySystem(); + + if (ticker.RunLevel != GameRunLevel.PreRoundLobby) + { + await RespondError( + context, + ErrorCode.InvalidRoundState, + HttpStatusCode.Conflict, + "Round already started"); + return; + } + + ticker.StartRound(); + _sawmill.Info($"Forced round start by {FormatLogActor(actor)}"); + await RespondOk(context); + }); + } + + private async Task ActionRoundEnd(IStatusHandlerContext context, Actor actor) + { + await RunOnMainThread(async () => + { + var roundEndSystem = _entitySystemManager.GetEntitySystem(); + var ticker = _entitySystemManager.GetEntitySystem(); + + if (ticker.RunLevel != GameRunLevel.InRound) + { + await RespondError( + context, + ErrorCode.InvalidRoundState, + HttpStatusCode.Conflict, + "Round is not active"); + return; + } + + roundEndSystem.EndRound(); + _sawmill.Info($"Forced round end by {FormatLogActor(actor)}"); + await RespondOk(context); + }); + } + + private async Task ActionRoundRestartNow(IStatusHandlerContext context, Actor actor) + { + await RunOnMainThread(async () => + { + var ticker = _entitySystemManager.GetEntitySystem(); + + ticker.RestartRound(); + _sawmill.Info($"Forced instant round restart by {FormatLogActor(actor)}"); + await RespondOk(context); + }); + } + + #endregion + + #region Fetching + + /// + /// Returns an array containing all available presets. + /// + private async Task GetPresets(IStatusHandlerContext context) + { + var presets = await RunOnMainThread(() => + { + var presets = new List(); + + foreach (var preset in _prototypeManager.EnumeratePrototypes()) + { + presets.Add(new PresetResponse.Preset + { + Id = preset.ID, + ModeTitle = _loc.GetString(preset.ModeTitle), + Description = _loc.GetString(preset.Description) + }); + } + + return presets; + }); + + await context.RespondJsonAsync(new PresetResponse + { + Presets = presets + }); + } + + /// + /// Returns an array containing all game rules. + /// + private async Task GetGameRules(IStatusHandlerContext context) + { + var gameRules = new List(); + foreach (var gameRule in _prototypeManager.EnumeratePrototypes()) + { + if (gameRule.Abstract) + continue; + + if (gameRule.HasComponent(_componentFactory)) + gameRules.Add(gameRule.ID); + } + + await context.RespondJsonAsync(new GameruleResponse + { + GameRules = gameRules + }); + } + + + /// + /// Handles fetching information. + /// + private async Task InfoHandler(IStatusHandlerContext context, Actor actor) + { + /* + Information to display + Round number + Connected players + Active admins + Active game rules + Active game preset + Active map + MOTD + Panic bunker status + */ + + var info = await RunOnMainThread(() => + { + var ticker = _entitySystemManager.GetEntitySystem(); + var adminSystem = _entitySystemManager.GetEntitySystem(); + + var players = new List(); + + foreach (var player in _playerManager.Sessions) + { + var adminData = _adminManager.GetAdminData(player, true); + + players.Add(new InfoResponse.Player + { + UserId = player.UserId.UserId, + Name = player.Name, + IsAdmin = adminData != null, + IsDeadminned = !adminData?.Active ?? false + }); + } + + InfoResponse.MapInfo? mapInfo = null; + if (_gameMapManager.GetSelectedMap() is { } mapPrototype) + { + mapInfo = new InfoResponse.MapInfo + { + Id = mapPrototype.ID, + Name = mapPrototype.MapName + }; + } + + var gameRules = new List(); + foreach (var addedGameRule in ticker.GetActiveGameRules()) + { + var meta = _entityManager.MetaQuery.GetComponent(addedGameRule); + gameRules.Add(meta.EntityPrototype?.ID ?? meta.EntityPrototype?.Name ?? "Unknown"); + } + + var panicBunkerCVars = PanicBunkerCVars.ToDictionary(c => c, c => _config.GetCVar(c)); + return new InfoResponse + { + Players = players, + RoundId = ticker.RoundId, + Map = mapInfo, + PanicBunker = panicBunkerCVars, + GamePreset = ticker.CurrentPreset?.ID, + GameRules = gameRules, + MOTD = _config.GetCVar(CCVars.MOTD) + }; + }); + + await context.RespondJsonAsync(info); + } + + #endregion + + private async Task CheckAccess(IStatusHandlerContext context) + { + var auth = context.RequestHeaders.TryGetValue("Authorization", out var authToken); + if (!auth) + { + await RespondError( + context, + ErrorCode.AuthenticationNeeded, + HttpStatusCode.Unauthorized, + "Authorization is required"); + return false; + } + + var authHeaderValue = authToken.ToString(); + var spaceIndex = authHeaderValue.IndexOf(' '); + if (spaceIndex == -1) + { + await RespondBadRequest(context, "Invalid Authorization header value"); + return false; + } + + var authScheme = authHeaderValue[..spaceIndex]; + var authValue = authHeaderValue[spaceIndex..].Trim(); + + if (authScheme != SS14TokenScheme) + { + await RespondBadRequest(context, "Invalid Authorization scheme"); + return false; + } + + if (_token == "") + { + _sawmill.Debug("No authorization token set for admin API"); + } + else if (CryptographicOperations.FixedTimeEquals( + Encoding.UTF8.GetBytes(authValue), + Encoding.UTF8.GetBytes(_token))) + { + return true; + } + + await RespondError( + context, + ErrorCode.AuthenticationInvalid, + HttpStatusCode.Unauthorized, + "Authorization is invalid"); + + // Invalid auth header, no access + _sawmill.Info($"Unauthorized access attempt to admin API from {context.RemoteEndPoint}"); + return false; + } + + private async Task CheckActor(IStatusHandlerContext context) + { + // The actor is JSON encoded in the header + var actor = context.RequestHeaders.TryGetValue("Actor", out var actorHeader) ? actorHeader.ToString() : null; + if (actor == null) + { + await RespondBadRequest(context, "Actor must be supplied"); + return null; + } + + Actor? actorData; + try + { + actorData = JsonSerializer.Deserialize(actor); + if (actorData == null) + { + await RespondBadRequest(context, "Actor is null"); + return null; + } + } + catch (JsonException exception) + { + await RespondBadRequest(context, "Actor field JSON is invalid", ExceptionData.FromException(exception)); + return null; + } + + return actorData; + } + + #region From Client + + private sealed class Actor + { + public required Guid Guid { get; init; } + public required string Name { get; init; } + } + + private sealed class KickActionBody + { + public required Guid Guid { get; init; } + public string? Reason { get; init; } + } + + private sealed class GameRuleActionBody + { + public required string GameRuleId { get; init; } + } + + private sealed class PresetActionBody + { + public required string PresetId { get; init; } + } + + private sealed class MotdActionBody + { + public required string Motd { get; init; } + } + + #endregion + + #region Responses + + private record BaseResponse( + string Message, + ErrorCode ErrorCode = ErrorCode.None, + ExceptionData? Exception = null); + + private record ExceptionData(string Message, string? StackTrace = null) + { + public static ExceptionData FromException(Exception e) + { + return new ExceptionData(e.Message, e.StackTrace); + } + } + + private enum ErrorCode + { + None = 0, + AuthenticationNeeded = 1, + AuthenticationInvalid = 2, + InvalidRoundState = 3, + PlayerNotFound = 4, + GameRuleNotFound = 5, + BadRequest = 6, + } + + #endregion + + #region Misc + + /// + /// Record used to send the response for the info endpoint. + /// + private sealed class InfoResponse + { + public required int RoundId { get; init; } + public required List Players { get; init; } + public required List GameRules { get; init; } + public required string? GamePreset { get; init; } + public required MapInfo? Map { get; init; } + public required string? MOTD { get; init; } + public required Dictionary PanicBunker { get; init; } + + public sealed class Player + { + public required Guid UserId { get; init; } + public required string Name { get; init; } + public required bool IsAdmin { get; init; } + public required bool IsDeadminned { get; init; } + } + + public sealed class MapInfo + { + public required string Id { get; init; } + public required string Name { get; init; } + } + } + + private sealed class PresetResponse + { + public required List Presets { get; init; } + + public sealed class Preset + { + public required string Id { get; init; } + public required string Description { get; init; } + public required string ModeTitle { get; init; } + } + } + + private sealed class GameruleResponse + { + public required List GameRules { get; init; } + } + + #endregion +} diff --git a/Content.Server/Administration/Systems/AdminSystem.cs b/Content.Server/Administration/Systems/AdminSystem.cs index 53eabb1a481..82bbe6e266b 100644 --- a/Content.Server/Administration/Systems/AdminSystem.cs +++ b/Content.Server/Administration/Systems/AdminSystem.cs @@ -61,7 +61,7 @@ public sealed class AdminSystem : EntitySystem public IReadOnlySet RoundActivePlayers => _roundActivePlayers; private readonly HashSet _roundActivePlayers = new(); - private readonly PanicBunkerStatus _panicBunker = new(); + public readonly PanicBunkerStatus PanicBunker = new(); public override void Initialize() { @@ -240,7 +240,7 @@ private PlayerInfo GetPlayerInfo(SessionData data, ICommonSession? session) private void OnPanicBunkerChanged(bool enabled) { - _panicBunker.Enabled = enabled; + PanicBunker.Enabled = enabled; _chat.SendAdminAlert(Loc.GetString(enabled ? "admin-ui-panic-bunker-enabled-admin-alert" : "admin-ui-panic-bunker-disabled-admin-alert" @@ -251,52 +251,52 @@ private void OnPanicBunkerChanged(bool enabled) private void OnPanicBunkerDisableWithAdminsChanged(bool enabled) { - _panicBunker.DisableWithAdmins = enabled; + PanicBunker.DisableWithAdmins = enabled; UpdatePanicBunker(); } private void OnPanicBunkerEnableWithoutAdminsChanged(bool enabled) { - _panicBunker.EnableWithoutAdmins = enabled; + PanicBunker.EnableWithoutAdmins = enabled; UpdatePanicBunker(); } private void OnPanicBunkerCountDeadminnedAdminsChanged(bool enabled) { - _panicBunker.CountDeadminnedAdmins = enabled; + PanicBunker.CountDeadminnedAdmins = enabled; UpdatePanicBunker(); } private void OnShowReasonChanged(bool enabled) { - _panicBunker.ShowReason = enabled; + PanicBunker.ShowReason = enabled; SendPanicBunkerStatusAll(); } private void OnPanicBunkerMinAccountAgeChanged(int minutes) { - _panicBunker.MinAccountAgeHours = minutes / 60; + PanicBunker.MinAccountAgeHours = minutes / 60; SendPanicBunkerStatusAll(); } private void OnPanicBunkerMinOverallHoursChanged(int hours) { - _panicBunker.MinOverallHours = hours; + PanicBunker.MinOverallHours = hours; SendPanicBunkerStatusAll(); } private void UpdatePanicBunker() { - var admins = _panicBunker.CountDeadminnedAdmins + var admins = PanicBunker.CountDeadminnedAdmins ? _adminManager.AllAdmins : _adminManager.ActiveAdmins; var hasAdmins = admins.Any(); - if (hasAdmins && _panicBunker.DisableWithAdmins) + if (hasAdmins && PanicBunker.DisableWithAdmins) { _config.SetCVar(CCVars.PanicBunkerEnabled, false); } - else if (!hasAdmins && _panicBunker.EnableWithoutAdmins) + else if (!hasAdmins && PanicBunker.EnableWithoutAdmins) { _config.SetCVar(CCVars.PanicBunkerEnabled, true); } @@ -306,7 +306,7 @@ private void UpdatePanicBunker() private void SendPanicBunkerStatusAll() { - var ev = new PanicBunkerChangedEvent(_panicBunker); + var ev = new PanicBunkerChangedEvent(PanicBunker); foreach (var admin in _adminManager.AllAdmins) { RaiseNetworkEvent(ev, admin); diff --git a/Content.Server/Administration/Systems/AdminVerbSystem.Antags.cs b/Content.Server/Administration/Systems/AdminVerbSystem.Antags.cs index 9849d2df79c..eff97136d06 100644 --- a/Content.Server/Administration/Systems/AdminVerbSystem.Antags.cs +++ b/Content.Server/Administration/Systems/AdminVerbSystem.Antags.cs @@ -111,7 +111,7 @@ private void AddAntagVerbs(GetVerbsEvent args) { Text = Loc.GetString("admin-verb-text-make-thief"), Category = VerbCategory.Antag, - Icon = new SpriteSpecifier.Rsi(new ResPath("/Textures/Clothing/Hands/Gloves/ihscombat.rsi"), "icon"), + Icon = new SpriteSpecifier.Rsi(new ResPath("/Textures/Clothing/Hands/Gloves/Color/black.rsi"), "icon"), Act = () => { _thief.AdminMakeThief(args.Target, false); //Midround add pacified is bad diff --git a/Content.Server/Advertise/Components/AdvertiseComponent.cs b/Content.Server/Advertise/Components/AdvertiseComponent.cs index 531b31031d2..3d617e3a340 100644 --- a/Content.Server/Advertise/Components/AdvertiseComponent.cs +++ b/Content.Server/Advertise/Components/AdvertiseComponent.cs @@ -24,6 +24,14 @@ public sealed partial class AdvertiseComponent : Component [DataField] public int MaximumWait { get; private set; } = 10 * 60; + /// + /// If true, the delay before the first advertisement (at MapInit) will ignore + /// and instead be rolled between 0 and . This only applies to the initial delay; + /// will be respected after that. + /// + [DataField] + public bool Prewarm = true; + /// /// The identifier for the advertisements pack prototype. /// diff --git a/Content.Server/Advertise/EntitySystems/AdvertiseSystem.cs b/Content.Server/Advertise/EntitySystems/AdvertiseSystem.cs index 12eac72cfe3..28fa01628f4 100644 --- a/Content.Server/Advertise/EntitySystems/AdvertiseSystem.cs +++ b/Content.Server/Advertise/EntitySystems/AdvertiseSystem.cs @@ -37,13 +37,14 @@ public override void Initialize() private void OnMapInit(EntityUid uid, AdvertiseComponent advert, MapInitEvent args) { - RandomizeNextAdvertTime(advert); + var prewarm = advert.Prewarm; + RandomizeNextAdvertTime(advert, prewarm); _nextCheckTime = MathHelper.Min(advert.NextAdvertisementTime, _nextCheckTime); } - private void RandomizeNextAdvertTime(AdvertiseComponent advert) + private void RandomizeNextAdvertTime(AdvertiseComponent advert, bool prewarm = false) { - var minDuration = Math.Max(1, advert.MinimumWait); + var minDuration = prewarm ? 0 : Math.Max(1, advert.MinimumWait); var maxDuration = Math.Max(minDuration, advert.MaximumWait); var waitDuration = TimeSpan.FromSeconds(_random.Next(minDuration, maxDuration)); diff --git a/Content.Server/Atmos/EntitySystems/AirtightSystem.cs b/Content.Server/Atmos/EntitySystems/AirtightSystem.cs index 152fba8fc4d..60d90e1e609 100644 --- a/Content.Server/Atmos/EntitySystems/AirtightSystem.cs +++ b/Content.Server/Atmos/EntitySystems/AirtightSystem.cs @@ -12,6 +12,7 @@ public sealed class AirtightSystem : EntitySystem [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly AtmosphereSystem _atmosphereSystem = default!; [Dependency] private readonly ExplosionSystem _explosionSystem = default!; + [Dependency] private readonly SharedMapSystem _mapSystem = default!; public override void Initialize() { @@ -59,12 +60,14 @@ private void OnAirtightPositionChanged(EntityUid uid, AirtightComponent airtight var gridId = xform.GridUid; var coords = xform.Coordinates; - - var tilePos = grid.TileIndicesFor(coords); + var tilePos = _mapSystem.TileIndicesFor(gridId.Value, grid, coords); // Update and invalidate new position. airtight.LastPosition = (gridId.Value, tilePos); InvalidatePosition(gridId.Value, tilePos); + + var airtightEv = new AirtightChanged(uid, airtight, (gridId.Value, tilePos)); + RaiseLocalEvent(uid, ref airtightEv, true); } private void OnAirtightReAnchor(EntityUid uid, AirtightComponent airtight, ref ReAnchorEvent args) @@ -74,6 +77,9 @@ private void OnAirtightReAnchor(EntityUid uid, AirtightComponent airtight, ref R // Update and invalidate new position. airtight.LastPosition = (gridId, args.TilePos); InvalidatePosition(gridId, args.TilePos); + + var airtightEv = new AirtightChanged(uid, airtight, (gridId, args.TilePos)); + RaiseLocalEvent(uid, ref airtightEv, true); } } @@ -153,6 +159,5 @@ private AtmosDirection Rotate(AtmosDirection myDirection, Angle myAngle) } [ByRefEvent] - public readonly record struct AirtightChanged(EntityUid Entity, AirtightComponent Airtight, - (EntityUid Grid, Vector2i Tile) Position); + public readonly record struct AirtightChanged(EntityUid Entity, AirtightComponent Airtight, (EntityUid Grid, Vector2i Tile) Position); } diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Commands.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Commands.cs index a5e37398c6a..f711b235af6 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Commands.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Commands.cs @@ -3,6 +3,7 @@ using Content.Server.Atmos.Components; using Content.Shared.Administration; using Content.Shared.Atmos; +using Content.Shared.Atmos.Components; using Robust.Shared.Console; using Robust.Shared.Map; using Robust.Shared.Map.Components; @@ -84,44 +85,72 @@ private void FixGridAtmosCommand(IConsoleShell shell, string argstr, string[] ar continue; } - var transform = Transform(euid.Value); + // Force Invalidate & update air on all tiles + Entity grid = + new(euid.Value, gridAtmosphere, Comp(euid.Value), gridComp, Transform(euid.Value)); - foreach (var (indices, tileMain) in gridAtmosphere.Tiles) - { - var tile = tileMain.Air; - if (tile == null) - continue; + RebuildGridTiles(grid); - if (!_mapSystem.TryGetTile(gridComp, indices, out var gTile) || gTile.IsEmpty) - { - gridAtmosphere.Tiles.Remove(indices); + var query = GetEntityQuery(); + foreach (var (indices, tile) in gridAtmosphere.Tiles.ToArray()) + { + if (tile.Air is not {Immutable: false} air) continue; - } - if (tile.Immutable && !IsTileSpace(euid, transform.MapUid, indices)) - { - tile = new GasMixture(tile.Volume) { Temperature = tile.Temperature }; - tileMain.Air = tile; - } - - tile.Clear(); + air.Clear(); var mixtureId = 0; - foreach (var entUid in gridComp.GetAnchoredEntities(indices)) + var enumerator = _mapSystem.GetAnchoredEntitiesEnumerator(grid, grid, indices); + while (enumerator.MoveNext(out var entUid)) { - if (!TryComp(entUid, out AtmosFixMarkerComponent? afm)) - continue; - mixtureId = afm.Mode; - break; + if (query.TryComp(entUid, out var marker)) + mixtureId = marker.Mode; } - var mixture = mixtures[mixtureId]; - Merge(tile, mixture); - tile.Temperature = mixture.Temperature; - gridAtmosphere.InvalidatedCoords.Add(indices); + var mixture = mixtures[mixtureId]; + Merge(air, mixture); + air.Temperature = mixture.Temperature; } } } + /// + /// Clears & re-creates all references to s stored on a grid. + /// + private void RebuildGridTiles( + Entity ent) + { + foreach (var indices in ent.Comp1.Tiles.Keys) + { + InvalidateVisuals((ent, ent), indices); + } + + var atmos = ent.Comp1; + atmos.MapTiles.Clear(); + atmos.ActiveTiles.Clear(); + atmos.ExcitedGroups.Clear(); + atmos.HotspotTiles.Clear(); + atmos.SuperconductivityTiles.Clear(); + atmos.HighPressureDelta.Clear(); + atmos.CurrentRunTiles.Clear(); + atmos.CurrentRunExcitedGroups.Clear(); + atmos.InvalidatedCoords.Clear(); + atmos.CurrentRunInvalidatedTiles.Clear(); + atmos.PossiblyDisconnectedTiles.Clear(); + atmos.Tiles.Clear(); + + var volume = GetVolumeForTiles(ent); + TryComp(ent.Comp4.MapUid, out MapAtmosphereComponent? mapAtmos); + + var enumerator = _map.GetAllTilesEnumerator(ent, ent); + while (enumerator.MoveNext(out var tileRef)) + { + var tile = GetOrNewTile(ent, ent, tileRef.Value.GridIndices); + UpdateTileData(ent, mapAtmos, tile); + UpdateAdjacentTiles(ent, tile, activate: true); + UpdateTileAir(ent, tile, volume); + } + } + private CompletionResult FixGridAtmosCommandCompletions(IConsoleShell shell, string[] args) { MapId? playerMap = null; diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Processing.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Processing.cs index bd023e8574a..85b1a93e20f 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Processing.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Processing.cs @@ -30,13 +30,15 @@ public sealed partial class AtmosphereSystem private int _currentRunAtmosphereIndex; private bool _simulationPaused; - private TileAtmosphere GetOrNewTile(EntityUid owner, GridAtmosphereComponent atmosphere, Vector2i index) + private TileAtmosphere GetOrNewTile(EntityUid owner, GridAtmosphereComponent atmosphere, Vector2i index, bool invalidateNew = true) { var tile = atmosphere.Tiles.GetOrNew(index, out var existing); if (existing) return tile; - atmosphere.InvalidatedCoords.Add(index); + if (invalidateNew) + atmosphere.InvalidatedCoords.Add(index); + tile.GridIndex = owner; tile.GridIndices = index; return tile; @@ -68,7 +70,7 @@ private bool ProcessRevalidate(Entity private void OnDisabledMessage(EntityUid uid, GasAnalyzerComponent component, GasAnalyzerDisableMessage message) { - if (message.Session.AttachedEntity is not {Valid: true}) + if (message.Session.AttachedEntity is not { Valid: true }) return; DisableAnalyzer(uid, component); } @@ -169,7 +169,7 @@ private bool UpdateAnalyzer(EntityUid uid, GasAnalyzerComponent? component = nul // Check if position is out of range => don't update and disable if (!component.LastPosition.Value.InRange(EntityManager, _transform, userPos, SharedInteractionSystem.InteractionRange)) { - if(component.User is { } userId && component.Enabled) + if (component.User is { } userId && component.Enabled) _popup.PopupEntity(Loc.GetString("gas-analyzer-shutoff"), userId, userId); DisableAnalyzer(uid, component, component.User); return false; @@ -182,13 +182,13 @@ private bool UpdateAnalyzer(EntityUid uid, GasAnalyzerComponent? component = nul var tileMixture = _atmo.GetContainingMixture(uid, true); if (tileMixture != null) { - gasMixList.Add(new GasMixEntry(Loc.GetString("gas-analyzer-window-environment-tab-label"), tileMixture.Pressure, tileMixture.Temperature, + gasMixList.Add(new GasMixEntry(Loc.GetString("gas-analyzer-window-environment-tab-label"), tileMixture.Volume, tileMixture.Pressure, tileMixture.Temperature, GenerateGasEntryArray(tileMixture))); } else { // No gases were found - gasMixList.Add(new GasMixEntry(Loc.GetString("gas-analyzer-window-environment-tab-label"), 0f, 0f)); + gasMixList.Add(new GasMixEntry(Loc.GetString("gas-analyzer-window-environment-tab-label"), 0f, 0f, 0f)); } var deviceFlipped = false; @@ -209,8 +209,8 @@ private bool UpdateAnalyzer(EntityUid uid, GasAnalyzerComponent? component = nul { foreach (var mixes in ev.GasMixtures) { - if(mixes.Value != null) - gasMixList.Add(new GasMixEntry(mixes.Key, mixes.Value.Pressure, mixes.Value.Temperature, GenerateGasEntryArray(mixes.Value))); + if (mixes.Item2 != null) + gasMixList.Add(new GasMixEntry(mixes.Item1, mixes.Item2.Volume, mixes.Item2.Pressure, mixes.Item2.Temperature, GenerateGasEntryArray(mixes.Item2))); } deviceFlipped = ev.DeviceFlipped; @@ -223,7 +223,16 @@ private bool UpdateAnalyzer(EntityUid uid, GasAnalyzerComponent? component = nul foreach (var pair in node.Nodes) { if (pair.Value is PipeNode pipeNode) - gasMixList.Add(new GasMixEntry(pair.Key, pipeNode.Air.Pressure, pipeNode.Air.Temperature, GenerateGasEntryArray(pipeNode.Air))); + { + // check if the volume is zero for some reason so we don't divide by zero + if (pipeNode.Air.Volume == 0f) + continue; + // only display the gas in the analyzed pipe element, not the whole system + var pipeAir = pipeNode.Air.Clone(); + pipeAir.Multiply(pipeNode.Volume / pipeNode.Air.Volume); + pipeAir.Volume = pipeNode.Volume; + gasMixList.Add(new GasMixEntry(pair.Key, pipeAir.Volume, pipeAir.Pressure, pipeAir.Temperature, GenerateGasEntryArray(pipeAir))); + } } } } @@ -286,9 +295,9 @@ private GasEntry[] GenerateGasEntryArray(GasMixture? mixture) public sealed class GasAnalyzerScanEvent : EntityEventArgs { /// - /// Key is the mix name (ex "pipe", "inlet", "filter"), value is the pipe direction and GasMixture. Add all mixes that should be reported when scanned. + /// The string is for the name (ex "pipe", "inlet", "filter"), GasMixture for the corresponding gas mix. Add all mixes that should be reported when scanned. /// - public Dictionary? GasMixtures; + public List<(string, GasMixture?)>? GasMixtures; /// /// If the device is flipped. Flipped is defined as when the inline input is 90 degrees CW to the side input diff --git a/Content.Server/Atmos/EntitySystems/GasTankSystem.cs b/Content.Server/Atmos/EntitySystems/GasTankSystem.cs index 80842416e8b..dd84756e45d 100644 --- a/Content.Server/Atmos/EntitySystems/GasTankSystem.cs +++ b/Content.Server/Atmos/EntitySystems/GasTankSystem.cs @@ -359,7 +359,8 @@ public void CheckStatus(Entity ent) /// private void OnAnalyzed(EntityUid uid, GasTankComponent component, GasAnalyzerScanEvent args) { - args.GasMixtures = new Dictionary { {Name(uid), component.Air} }; + args.GasMixtures ??= new List<(string, GasMixture?)>(); + args.GasMixtures.Add((Name(uid), component.Air)); } private void OnGasTankPrice(EntityUid uid, GasTankComponent component, ref PriceCalculationEvent args) diff --git a/Content.Server/Atmos/Piping/Trinary/EntitySystems/GasFilterSystem.cs b/Content.Server/Atmos/Piping/Trinary/EntitySystems/GasFilterSystem.cs index fbd42604694..c0c2b930f69 100644 --- a/Content.Server/Atmos/Piping/Trinary/EntitySystems/GasFilterSystem.cs +++ b/Content.Server/Atmos/Piping/Trinary/EntitySystems/GasFilterSystem.cs @@ -73,7 +73,7 @@ private void OnFilterUpdated(EntityUid uid, GasFilterComponent filter, ref Atmos if (filter.FilteredGas.HasValue) { - var filteredOut = new GasMixture() {Temperature = removed.Temperature}; + var filteredOut = new GasMixture() { Temperature = removed.Temperature }; filteredOut.SetMoles(filter.FilteredGas.Value, removed.GetMoles(filter.FilteredGas.Value)); removed.SetMoles(filter.FilteredGas.Value, 0f); @@ -180,17 +180,30 @@ private void OnSelectGasMessage(EntityUid uid, GasFilterComponent filter, GasFil /// private void OnFilterAnalyzed(EntityUid uid, GasFilterComponent component, GasAnalyzerScanEvent args) { - if (!EntityManager.TryGetComponent(uid, out NodeContainerComponent? nodeContainer)) - return; - - args.GasMixtures ??= new Dictionary(); + args.GasMixtures ??= new List<(string, GasMixture?)>(); - if(_nodeContainer.TryGetNode(nodeContainer, component.InletName, out PipeNode? inlet)) - args.GasMixtures.Add(Loc.GetString("gas-analyzer-window-text-inlet"), inlet.Air); - if(_nodeContainer.TryGetNode(nodeContainer, component.FilterName, out PipeNode? filterNode)) - args.GasMixtures.Add(Loc.GetString("gas-analyzer-window-text-filter"), filterNode.Air); - if(_nodeContainer.TryGetNode(nodeContainer, component.OutletName, out PipeNode? outlet)) - args.GasMixtures.Add(Loc.GetString("gas-analyzer-window-text-outlet"), outlet.Air); + // multiply by volume fraction to make sure to send only the gas inside the analyzed pipe element, not the whole pipe system + if (_nodeContainer.TryGetNode(uid, component.InletName, out PipeNode? inlet) && inlet.Air.Volume != 0f) + { + var inletAirLocal = inlet.Air.Clone(); + inletAirLocal.Multiply(inlet.Volume / inlet.Air.Volume); + inletAirLocal.Volume = inlet.Volume; + args.GasMixtures.Add((Loc.GetString("gas-analyzer-window-text-inlet"), inletAirLocal)); + } + if (_nodeContainer.TryGetNode(uid, component.FilterName, out PipeNode? filterNode) && filterNode.Air.Volume != 0f) + { + var filterNodeAirLocal = filterNode.Air.Clone(); + filterNodeAirLocal.Multiply(filterNode.Volume / filterNode.Air.Volume); + filterNodeAirLocal.Volume = filterNode.Volume; + args.GasMixtures.Add((Loc.GetString("gas-analyzer-window-text-filter"), filterNodeAirLocal)); + } + if (_nodeContainer.TryGetNode(uid, component.OutletName, out PipeNode? outlet) && outlet.Air.Volume != 0f) + { + var outletAirLocal = outlet.Air.Clone(); + outletAirLocal.Multiply(outlet.Volume / outlet.Air.Volume); + outletAirLocal.Volume = outlet.Volume; + args.GasMixtures.Add((Loc.GetString("gas-analyzer-window-text-outlet"), outletAirLocal)); + } args.DeviceFlipped = inlet != null && filterNode != null && inlet.CurrentPipeDirection.ToDirection() == filterNode.CurrentPipeDirection.ToDirection().GetClockwise90Degrees(); } diff --git a/Content.Server/Atmos/Piping/Trinary/EntitySystems/GasMixerSystem.cs b/Content.Server/Atmos/Piping/Trinary/EntitySystems/GasMixerSystem.cs index ba8ebf3c9ae..4d7fc134c70 100644 --- a/Content.Server/Atmos/Piping/Trinary/EntitySystems/GasMixerSystem.cs +++ b/Content.Server/Atmos/Piping/Trinary/EntitySystems/GasMixerSystem.cs @@ -205,19 +205,31 @@ private void OnChangeNodePercentageMessage(EntityUid uid, GasMixerComponent mixe /// private void OnMixerAnalyzed(EntityUid uid, GasMixerComponent component, GasAnalyzerScanEvent args) { - if (!EntityManager.TryGetComponent(uid, out NodeContainerComponent? nodeContainer)) - return; - - var gasMixDict = new Dictionary(); + args.GasMixtures ??= new List<(string, GasMixture?)>(); - if(_nodeContainer.TryGetNode(nodeContainer, component.InletOneName, out PipeNode? inletOne)) - gasMixDict.Add($"{inletOne.CurrentPipeDirection} {Loc.GetString("gas-analyzer-window-text-inlet")}", inletOne.Air); - if(_nodeContainer.TryGetNode(nodeContainer, component.InletTwoName, out PipeNode? inletTwo)) - gasMixDict.Add($"{inletTwo.CurrentPipeDirection} {Loc.GetString("gas-analyzer-window-text-inlet")}", inletTwo.Air); - if(_nodeContainer.TryGetNode(nodeContainer, component.OutletName, out PipeNode? outlet)) - gasMixDict.Add(Loc.GetString("gas-analyzer-window-text-outlet"), outlet.Air); + // multiply by volume fraction to make sure to send only the gas inside the analyzed pipe element, not the whole pipe system + if (_nodeContainer.TryGetNode(uid, component.InletOneName, out PipeNode? inletOne) && inletOne.Air.Volume != 0f) + { + var inletOneAirLocal = inletOne.Air.Clone(); + inletOneAirLocal.Multiply(inletOne.Volume / inletOne.Air.Volume); + inletOneAirLocal.Volume = inletOne.Volume; + args.GasMixtures.Add(($"{inletOne.CurrentPipeDirection} {Loc.GetString("gas-analyzer-window-text-inlet")}", inletOneAirLocal)); + } + if (_nodeContainer.TryGetNode(uid, component.InletTwoName, out PipeNode? inletTwo) && inletTwo.Air.Volume != 0f) + { + var inletTwoAirLocal = inletTwo.Air.Clone(); + inletTwoAirLocal.Multiply(inletTwo.Volume / inletTwo.Air.Volume); + inletTwoAirLocal.Volume = inletTwo.Volume; + args.GasMixtures.Add(($"{inletTwo.CurrentPipeDirection} {Loc.GetString("gas-analyzer-window-text-inlet")}", inletTwoAirLocal)); + } + if (_nodeContainer.TryGetNode(uid, component.OutletName, out PipeNode? outlet) && outlet.Air.Volume != 0f) + { + var outletAirLocal = outlet.Air.Clone(); + outletAirLocal.Multiply(outlet.Volume / outlet.Air.Volume); + outletAirLocal.Volume = outlet.Volume; + args.GasMixtures.Add((Loc.GetString("gas-analyzer-window-text-outlet"), outletAirLocal)); + } - args.GasMixtures = gasMixDict; args.DeviceFlipped = inletOne != null && inletTwo != null && inletOne.CurrentPipeDirection.ToDirection() == inletTwo.CurrentPipeDirection.ToDirection().GetClockwise90Degrees(); } } diff --git a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCanisterSystem.cs b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCanisterSystem.cs index 3e4340bf1db..bdc9e765381 100644 --- a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCanisterSystem.cs +++ b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCanisterSystem.cs @@ -294,9 +294,17 @@ private void CalculateCanisterPrice(EntityUid uid, GasCanisterComponent componen /// /// Returns the gas mixture for the gas analyzer /// - private void OnAnalyzed(EntityUid uid, GasCanisterComponent component, GasAnalyzerScanEvent args) + private void OnAnalyzed(EntityUid uid, GasCanisterComponent canisterComponent, GasAnalyzerScanEvent args) { - args.GasMixtures = new Dictionary { {Name(uid), component.Air} }; + args.GasMixtures ??= new List<(string, GasMixture?)>(); + args.GasMixtures.Add((Name(uid), canisterComponent.Air)); + // if a tank is inserted show it on the analyzer as well + if (canisterComponent.GasTankSlot.Item != null) + { + var tank = canisterComponent.GasTankSlot.Item.Value; + var tankComponent = Comp(tank); + args.GasMixtures.Add((Name(tank), tankComponent.Air)); + } } /// diff --git a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasVentPumpSystem.cs b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasVentPumpSystem.cs index a986385f5e9..7c12cf3f77f 100644 --- a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasVentPumpSystem.cs +++ b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasVentPumpSystem.cs @@ -80,7 +80,7 @@ private void OnGasVentPumpUpdated(EntityUid uid, GasVentPumpComponent vent, ref return; } - var timeDelta = args.dt; + var timeDelta = args.dt; var pressureDelta = timeDelta * vent.TargetPressureChange; if (vent.PumpDirection == VentPumpDirection.Releasing && pipe.Air.Pressure > 0) @@ -292,7 +292,7 @@ private void OnExamine(EntityUid uid, GasVentPumpComponent component, ExaminedEv /// private void OnAnalyzed(EntityUid uid, GasVentPumpComponent component, GasAnalyzerScanEvent args) { - var gasMixDict = new Dictionary(); + args.GasMixtures ??= new List<(string, GasMixture?)>(); // these are both called pipe, above it switches using this so I duplicated that...? var nodeName = component.PumpDirection switch @@ -301,10 +301,14 @@ private void OnAnalyzed(EntityUid uid, GasVentPumpComponent component, GasAnalyz VentPumpDirection.Siphoning => component.Outlet, _ => throw new ArgumentOutOfRangeException() }; - if (_nodeContainer.TryGetNode(uid, nodeName, out PipeNode? pipe)) - gasMixDict.Add(nodeName, pipe.Air); - - args.GasMixtures = gasMixDict; + // multiply by volume fraction to make sure to send only the gas inside the analyzed pipe element, not the whole pipe system + if (_nodeContainer.TryGetNode(uid, nodeName, out PipeNode? pipe) && pipe.Air.Volume != 0f) + { + var pipeAirLocal = pipe.Air.Clone(); + pipeAirLocal.Multiply(pipe.Volume / pipe.Air.Volume); + pipeAirLocal.Volume = pipe.Volume; + args.GasMixtures.Add((nodeName, pipeAirLocal)); + } } private void OnWeldChanged(EntityUid uid, GasVentPumpComponent component, ref WeldableChangedEvent args) diff --git a/Content.Server/Atmos/Portable/PortableScrubberSystem.cs b/Content.Server/Atmos/Portable/PortableScrubberSystem.cs index f9043c091a8..91ee5880574 100644 --- a/Content.Server/Atmos/Portable/PortableScrubberSystem.cs +++ b/Content.Server/Atmos/Portable/PortableScrubberSystem.cs @@ -151,10 +151,8 @@ private void UpdateAppearance(EntityUid uid, bool isFull, bool isRunning) /// private void OnScrubberAnalyzed(EntityUid uid, PortableScrubberComponent component, GasAnalyzerScanEvent args) { - args.GasMixtures ??= new Dictionary { { Name(uid), component.Air } }; - // If it's connected to a port, include the port side - if (_nodeContainer.TryGetNode(uid, component.PortName, out PipeNode? port)) - args.GasMixtures.Add(component.PortName, port.Air); + args.GasMixtures ??= new List<(string, GasMixture?)>(); + args.GasMixtures.Add((Name(uid), component.Air)); } } } diff --git a/Content.Server/Audio/AmbientSoundSystem.cs b/Content.Server/Audio/AmbientSoundSystem.cs index 53a03be2aa2..e78970d1243 100644 --- a/Content.Server/Audio/AmbientSoundSystem.cs +++ b/Content.Server/Audio/AmbientSoundSystem.cs @@ -1,6 +1,7 @@ using Content.Server.Power.Components; using Content.Server.Power.EntitySystems; using Content.Shared.Audio; +using Content.Shared.Mobs; namespace Content.Server.Audio; diff --git a/Content.Server/Audio/Jukebox/JukeboxSystem.cs b/Content.Server/Audio/Jukebox/JukeboxSystem.cs new file mode 100644 index 00000000000..bfb9b2099a4 --- /dev/null +++ b/Content.Server/Audio/Jukebox/JukeboxSystem.cs @@ -0,0 +1,152 @@ +using Content.Server.Power.Components; +using Content.Server.Power.EntitySystems; +using Content.Shared.Audio.Jukebox; +using Robust.Server.GameObjects; +using Robust.Shared.Audio; +using Robust.Shared.Audio.Components; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Prototypes; +using JukeboxComponent = Content.Shared.Audio.Jukebox.JukeboxComponent; + +namespace Content.Server.Audio.Jukebox; + + +public sealed class JukeboxSystem : SharedJukeboxSystem +{ + [Dependency] private readonly IPrototypeManager _protoManager = default!; + [Dependency] private readonly AppearanceSystem _appearanceSystem = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnJukeboxSelected); + SubscribeLocalEvent(OnJukeboxPlay); + SubscribeLocalEvent(OnJukeboxPause); + SubscribeLocalEvent(OnJukeboxStop); + SubscribeLocalEvent(OnJukeboxSetTime); + SubscribeLocalEvent(OnComponentInit); + SubscribeLocalEvent(OnComponentShutdown); + + SubscribeLocalEvent(OnPowerChanged); + } + + private void OnComponentInit(EntityUid uid, JukeboxComponent component, ComponentInit args) + { + if (HasComp(uid)) + { + TryUpdateVisualState(uid, component); + } + } + + private void OnJukeboxPlay(EntityUid uid, JukeboxComponent component, ref JukeboxPlayingMessage args) + { + if (Exists(component.AudioStream)) + { + Audio.SetState(component.AudioStream, AudioState.Playing); + } + else + { + component.AudioStream = Audio.Stop(component.AudioStream); + + if (string.IsNullOrEmpty(component.SelectedSongId) || + !_protoManager.TryIndex(component.SelectedSongId, out var jukeboxProto)) + { + return; + } + + component.AudioStream = Audio.PlayPvs(jukeboxProto.Path, uid, AudioParams.Default.WithMaxDistance(10f))?.Entity; + Dirty(uid, component); + } + } + + private void OnJukeboxPause(Entity ent, ref JukeboxPauseMessage args) + { + Audio.SetState(ent.Comp.AudioStream, AudioState.Paused); + } + + private void OnJukeboxSetTime(EntityUid uid, JukeboxComponent component, JukeboxSetTimeMessage args) + { + var offset = (args.Session.Channel.Ping * 1.5f) / 1000f; + Audio.SetPlaybackPosition(component.AudioStream, args.SongTime + offset); + } + + private void OnPowerChanged(Entity entity, ref PowerChangedEvent args) + { + TryUpdateVisualState(entity); + + if (!this.IsPowered(entity.Owner, EntityManager)) + { + Stop(entity); + } + } + + private void OnJukeboxStop(Entity entity, ref JukeboxStopMessage args) + { + Stop(entity); + } + + private void Stop(Entity entity) + { + Audio.SetState(entity.Comp.AudioStream, AudioState.Stopped); + Dirty(entity); + } + + private void OnJukeboxSelected(EntityUid uid, JukeboxComponent component, JukeboxSelectedMessage args) + { + if (!Audio.IsPlaying(component.AudioStream)) + { + component.SelectedSongId = args.SongId; + DirectSetVisualState(uid, JukeboxVisualState.Select); + component.Selecting = true; + component.AudioStream = Audio.Stop(component.AudioStream); + } + + Dirty(uid, component); + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var comp)) + { + if (comp.Selecting) + { + comp.SelectAccumulator += frameTime; + if (comp.SelectAccumulator >= 0.5f) + { + comp.SelectAccumulator = 0f; + comp.Selecting = false; + + TryUpdateVisualState(uid, comp); + } + } + } + } + + private void OnComponentShutdown(EntityUid uid, JukeboxComponent component, ComponentShutdown args) + { + component.AudioStream = Audio.Stop(component.AudioStream); + } + + private void DirectSetVisualState(EntityUid uid, JukeboxVisualState state) + { + _appearanceSystem.SetData(uid, JukeboxVisuals.VisualState, state); + } + + private void TryUpdateVisualState(EntityUid uid, JukeboxComponent? jukeboxComponent = null) + { + if (!Resolve(uid, ref jukeboxComponent)) + return; + + var finalState = JukeboxVisualState.On; + + if (!this.IsPowered(uid, EntityManager)) + { + finalState = JukeboxVisualState.Off; + } + + _appearanceSystem.SetData(uid, JukeboxVisuals.VisualState, finalState); + } +} diff --git a/Content.Server/Bed/Cryostorage/CryostorageSystem.cs b/Content.Server/Bed/Cryostorage/CryostorageSystem.cs index a3b7fb8d67b..2e7f8c4235a 100644 --- a/Content.Server/Bed/Cryostorage/CryostorageSystem.cs +++ b/Content.Server/Bed/Cryostorage/CryostorageSystem.cs @@ -1,11 +1,16 @@ +using System.Globalization; using System.Linq; using Content.Server.Chat.Managers; using Content.Server.GameTicking; using Content.Server.Hands.Systems; using Content.Server.Inventory; using Content.Server.Popups; +using Content.Server.Chat.Systems; using Content.Server.Station.Components; using Content.Server.Station.Systems; +using Content.Server.StationRecords; +using Content.Server.StationRecords.Systems; +using Content.Shared.StationRecords; using Content.Shared.UserInterface; using Content.Shared.Access.Systems; using Content.Shared.Bed.Cryostorage; @@ -32,6 +37,7 @@ public sealed class CryostorageSystem : SharedCryostorageSystem [Dependency] private readonly IPlayerManager _playerManager = default!; [Dependency] private readonly AudioSystem _audio = default!; [Dependency] private readonly AccessReaderSystem _accessReader = default!; + [Dependency] private readonly ChatSystem _chatSystem = default!; [Dependency] private readonly ClimbSystem _climb = default!; [Dependency] private readonly ContainerSystem _container = default!; [Dependency] private readonly GameTicker _gameTicker = default!; @@ -40,6 +46,7 @@ public sealed class CryostorageSystem : SharedCryostorageSystem [Dependency] private readonly PopupSystem _popup = default!; [Dependency] private readonly StationSystem _station = default!; [Dependency] private readonly StationJobsSystem _stationJobs = default!; + [Dependency] private readonly StationRecordsSystem _stationRecords = default!; [Dependency] private readonly TransformSystem _transform = default!; [Dependency] private readonly UserInterfaceSystem _ui = default!; @@ -163,26 +170,30 @@ public void HandleEnterCryostorage(Entity ent, Ne { var comp = ent.Comp; var cryostorageEnt = ent.Comp.Cryostorage; + + var station = _station.GetOwningStation(ent); + var name = Name(ent.Owner); + if (!TryComp(cryostorageEnt, out var cryostorageComponent)) return; // if we have a session, we use that to add back in all the job slots the player had. if (userId != null) { - foreach (var station in _station.GetStationsSet()) + foreach (var uniqueStation in _station.GetStationsSet()) { - if (!TryComp(station, out var stationJobs)) + if (!TryComp(uniqueStation, out var stationJobs)) continue; - if (!_stationJobs.TryGetPlayerJobs(station, userId.Value, out var jobs, stationJobs)) + if (!_stationJobs.TryGetPlayerJobs(uniqueStation, userId.Value, out var jobs, stationJobs)) continue; foreach (var job in jobs) { - _stationJobs.TryAdjustJobSlot(station, job, 1, clamp: true); + _stationJobs.TryAdjustJobSlot(uniqueStation, job, 1, clamp: true); } - _stationJobs.TryRemovePlayerJobs(station, userId.Value, stationJobs); + _stationJobs.TryRemovePlayerJobs(uniqueStation, userId.Value, stationJobs); } } @@ -203,12 +214,36 @@ public void HandleEnterCryostorage(Entity ent, Ne _gameTicker.OnGhostAttempt(mind.Value, false); } } + comp.AllowReEnteringBody = false; _transform.SetParent(ent, PausedMap.Value); cryostorageComponent.StoredPlayers.Add(ent); Dirty(ent, comp); UpdateCryostorageUIState((cryostorageEnt.Value, cryostorageComponent)); AdminLog.Add(LogType.Action, LogImpact.High, $"{ToPrettyString(ent):player} was entered into cryostorage inside of {ToPrettyString(cryostorageEnt.Value)}"); + + if (!TryComp(station, out var stationRecords)) + return; + + var jobName = Loc.GetString("earlyleave-cryo-job-unknown"); + var recordId = _stationRecords.GetRecordByName(station.Value, name); + if (recordId != null) + { + var key = new StationRecordKey(recordId.Value, station.Value); + if (_stationRecords.TryGetRecord(key, out var entry, stationRecords)) + jobName = entry.JobTitle; + + _stationRecords.RemoveRecord(key, stationRecords); + } + + _chatSystem.DispatchStationAnnouncement(station.Value, + Loc.GetString( + "earlyleave-cryo-announcement", + ("character", name), + ("job", CultureInfo.CurrentCulture.TextInfo.ToTitleCase(jobName)) + ), Loc.GetString("earlyleave-cryo-sender"), + playDefaultSound: false + ); } private void HandleCryostorageReconnection(Entity entity) diff --git a/Content.Server/Botany/SeedPrototype.cs b/Content.Server/Botany/SeedPrototype.cs index 1a3c0473a48..0ae56bc5fc6 100644 --- a/Content.Server/Botany/SeedPrototype.cs +++ b/Content.Server/Botany/SeedPrototype.cs @@ -2,16 +2,16 @@ using Content.Server.Botany.Systems; using Content.Shared.Atmos; using Content.Shared.Chemistry.Reagent; +using Robust.Shared.Audio; using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; using Robust.Shared.Utility; -using Robust.Shared.Audio; namespace Content.Server.Botany; [Prototype("seed")] -public sealed class SeedPrototype : SeedData, IPrototype +public sealed partial class SeedPrototype : SeedData, IPrototype { [IdDataField] public string ID { get; private init; } = default!; } diff --git a/Content.Server/Botany/Systems/PlantHolderSystem.cs b/Content.Server/Botany/Systems/PlantHolderSystem.cs index 0f54fd0da50..721536a7c07 100644 --- a/Content.Server/Botany/Systems/PlantHolderSystem.cs +++ b/Content.Server/Botany/Systems/PlantHolderSystem.cs @@ -159,7 +159,6 @@ private void OnInteractUsing(Entity entity, ref InteractUs if (!_botany.TryGetSeed(seeds, out var seed)) return; - float? seedHealth = seeds.HealthOverride; var name = Loc.GetString(seed.Name); var noun = Loc.GetString(seed.Noun); _popup.PopupCursor(Loc.GetString("plant-holder-component-plant-success-message", @@ -169,9 +168,9 @@ private void OnInteractUsing(Entity entity, ref InteractUs component.Seed = seed; component.Dead = false; component.Age = 1; - if (seedHealth is float realSeedHealth) + if (seeds.HealthOverride != null) { - component.Health = realSeedHealth; + component.Health = seeds.HealthOverride.Value; } else { @@ -288,8 +287,18 @@ private void OnInteractUsing(Entity entity, ref InteractUs } component.Health -= (_random.Next(3, 5) * 10); + + float? healthOverride; + if (component.Harvest) + { + healthOverride = null; + } + else + { + healthOverride = component.Health; + } component.Seed.Unique = false; - var seed = _botany.SpawnSeedPacket(component.Seed, Transform(args.User).Coordinates, args.User, component.Health); + var seed = _botany.SpawnSeedPacket(component.Seed, Transform(args.User).Coordinates, args.User, healthOverride); _randomHelper.RandomOffset(seed, 0.25f); var displayName = Loc.GetString(component.Seed.DisplayName); _popup.PopupCursor(Loc.GetString("plant-holder-component-take-sample-message", diff --git a/Content.Server/Cargo/Components/StationCargoBountyDatabaseComponent.cs b/Content.Server/Cargo/Components/StationCargoBountyDatabaseComponent.cs index d26794a6323..a7735787cbb 100644 --- a/Content.Server/Cargo/Components/StationCargoBountyDatabaseComponent.cs +++ b/Content.Server/Cargo/Components/StationCargoBountyDatabaseComponent.cs @@ -1,4 +1,5 @@ using Content.Shared.Cargo; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; namespace Content.Server.Cargo.Components; @@ -32,4 +33,16 @@ public sealed partial class StationCargoBountyDatabaseComponent : Component /// [DataField] public HashSet CheckedBounties = new(); + + /// + /// The time at which players will be able to skip the next bounty. + /// + [DataField(customTypeSerializer: typeof(TimeOffsetSerializer))] + public TimeSpan NextSkipTime = TimeSpan.Zero; + + /// + /// The time between skipping bounties. + /// + [DataField] + public TimeSpan SkipDelay = TimeSpan.FromMinutes(15); } diff --git a/Content.Server/Cargo/Systems/CargoSystem.Bounty.cs b/Content.Server/Cargo/Systems/CargoSystem.Bounty.cs index ee5ae631fd9..22e5c67e175 100644 --- a/Content.Server/Cargo/Systems/CargoSystem.Bounty.cs +++ b/Content.Server/Cargo/Systems/CargoSystem.Bounty.cs @@ -4,7 +4,7 @@ using Content.Server.Labels; using Content.Server.NameIdentifier; using Content.Server.Paper; -using Content.Server.Station.Systems; +using Content.Shared.Access.Components; using Content.Shared.Cargo; using Content.Shared.Cargo.Components; using Content.Shared.Cargo.Prototypes; @@ -35,6 +35,7 @@ private void InitializeBounty() { SubscribeLocalEvent(OnBountyConsoleOpened); SubscribeLocalEvent(OnPrintLabelMessage); + SubscribeLocalEvent(OnSkipBountyMessage); SubscribeLocalEvent(OnGetBountyPrice); SubscribeLocalEvent(OnSold); SubscribeLocalEvent(OnMapInit); @@ -50,7 +51,8 @@ private void OnBountyConsoleOpened(EntityUid uid, CargoBountyConsoleComponent co !TryComp(station, out var bountyDb)) return; - _uiSystem.TrySetUiState(uid, CargoConsoleUiKey.Bounty, new CargoBountyConsoleState(bountyDb.Bounties)); + var untilNextSkip = bountyDb.NextSkipTime - _timing.CurTime; + _uiSystem.TrySetUiState(uid, CargoConsoleUiKey.Bounty, new CargoBountyConsoleState(bountyDb.Bounties, untilNextSkip)); } private void OnPrintLabelMessage(EntityUid uid, CargoBountyConsoleComponent component, BountyPrintLabelMessage args) @@ -70,6 +72,37 @@ private void OnPrintLabelMessage(EntityUid uid, CargoBountyConsoleComponent comp _audio.PlayPvs(component.PrintSound, uid); } + private void OnSkipBountyMessage(EntityUid uid, CargoBountyConsoleComponent component, BountySkipMessage args) + { + if (_station.GetOwningStation(uid) is not { } station || !TryComp(station, out var db)) + return; + + if (_timing.CurTime < db.NextSkipTime) + return; + + if (!TryGetBountyFromId(station, args.BountyId, out var bounty)) + return; + + if (args.Session.AttachedEntity is not { Valid: true } mob) + return; + + if (TryComp(uid, out var accessReaderComponent) && + !_accessReaderSystem.IsAllowed(mob, uid, accessReaderComponent)) + { + _audio.PlayPvs(component.DenySound, uid); + return; + } + + if (!TryRemoveBounty(station, bounty.Value)) + return; + + FillBountyDatabase(station); + db.NextSkipTime = _timing.CurTime + db.SkipDelay; + var untilNextSkip = db.NextSkipTime - _timing.CurTime; + _uiSystem.TrySetUiState(uid, CargoConsoleUiKey.Bounty, new CargoBountyConsoleState(db.Bounties, untilNextSkip)); + _audio.PlayPvs(component.SkipSound, uid); + } + public void SetupBountyLabel(EntityUid uid, EntityUid stationId, CargoBountyData bounty, PaperComponent? paper = null, CargoBountyLabelComponent? label = null) { if (!Resolve(uid, ref paper, ref label) || !_protoMan.TryIndex(bounty.Bounty, out var prototype)) @@ -431,7 +464,8 @@ public void UpdateBountyConsoles() !TryComp(station, out var db)) continue; - _uiSystem.TrySetUiState(uid, CargoConsoleUiKey.Bounty, new CargoBountyConsoleState(db.Bounties), ui: ui); + var untilNextSkip = db.NextSkipTime - _timing.CurTime; + _uiSystem.TrySetUiState(uid, CargoConsoleUiKey.Bounty, new CargoBountyConsoleState(db.Bounties, untilNextSkip), ui: ui); } } diff --git a/Content.Server/Cargo/Systems/CargoSystem.Orders.cs b/Content.Server/Cargo/Systems/CargoSystem.Orders.cs index d8b55a7237f..75a431007f8 100644 --- a/Content.Server/Cargo/Systems/CargoSystem.Orders.cs +++ b/Content.Server/Cargo/Systems/CargoSystem.Orders.cs @@ -184,6 +184,15 @@ private void OnApproveOrderMessage(EntityUid uid, CargoOrderConsoleComponent com order.SetApproverData(idCard.Comp?.FullName, idCard.Comp?.JobTitle); _audio.PlayPvs(component.ConfirmSound, uid); + var approverName = idCard.Comp?.FullName ?? Loc.GetString("access-reader-unknown-id"); + var approverJob = idCard.Comp?.JobTitle ?? Loc.GetString("access-reader-unknown-id"); + var message = Loc.GetString("cargo-console-unlock-approved-order-broadcast", + ("productName", Loc.GetString(order.ProductName)), + ("orderAmount", order.OrderQuantity), + ("approverName", approverName), + ("approverJob", approverJob), + ("cost", cost)); + _radio.SendRadioMessage(uid, message, component.AnnouncementChannel, uid, escapeMarkup: false); ConsolePopup(args.Session, Loc.GetString("cargo-console-trade-station", ("destination", MetaData(tradeDestination.Value).EntityName))); // Log order approval @@ -329,7 +338,7 @@ private void PlayDenySound(EntityUid uid, CargoOrderConsoleComponent component) private static CargoOrderData GetOrderData(CargoConsoleAddOrderMessage args, CargoProductPrototype cargoProduct, int id) { - return new CargoOrderData(id, cargoProduct.Product, cargoProduct.Cost, args.Amount, args.Requester, args.Reason); + return new CargoOrderData(id, cargoProduct.Product, cargoProduct.Name, cargoProduct.Cost, args.Amount, args.Requester, args.Reason); } public static int GetOutstandingOrderCount(StationCargoOrderDatabaseComponent component) @@ -378,6 +387,7 @@ private void UpdateOrders(EntityUid dbUid, StationCargoOrderDatabaseComponent _) public bool AddAndApproveOrder( EntityUid dbUid, string spawnId, + string name, int cost, int qty, string sender, @@ -390,7 +400,7 @@ StationDataComponent stationData DebugTools.Assert(_protoMan.HasIndex(spawnId)); // Make an order var id = GenerateOrderId(component); - var order = new CargoOrderData(id, spawnId, cost, qty, sender, description); + var order = new CargoOrderData(id, spawnId, name, cost, qty, sender, description); // Approve it now order.SetApproverData(dest, sender); diff --git a/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs b/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs index 61d1cf02939..661067e3b40 100644 --- a/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs +++ b/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs @@ -178,7 +178,7 @@ private List GetProjectedOrders( // We won't be able to fit the whole order on, so make one // which represents the space we do have left: var reducedOrder = new CargoOrderData(order.OrderId, - order.ProductId, order.Price, spaceRemaining, order.Requester, order.Reason); + order.ProductId, order.ProductName, order.Price, spaceRemaining, order.Requester, order.Reason); orders.Add(reducedOrder); } else diff --git a/Content.Server/Cargo/Systems/CargoSystem.cs b/Content.Server/Cargo/Systems/CargoSystem.cs index 3d6fc964725..989a5e794b4 100644 --- a/Content.Server/Cargo/Systems/CargoSystem.cs +++ b/Content.Server/Cargo/Systems/CargoSystem.cs @@ -8,6 +8,7 @@ using Content.Server.Station.Systems; using Content.Shared.Access.Systems; using Content.Shared.Administration.Logs; +using Content.Server.Radio.EntitySystems; using Content.Shared.Cargo; using Content.Shared.Cargo.Components; using Content.Shared.Containers.ItemSlots; @@ -48,6 +49,7 @@ public sealed partial class CargoSystem : SharedCargoSystem [Dependency] private readonly IMapManager _mapManager = default!; [Dependency] private readonly IComponentFactory _factory = default!; [Dependency] private readonly MapLoaderSystem _mapLoader = default!; + [Dependency] private readonly RadioSystem _radio = default!; private EntityQuery _xformQuery; private EntityQuery _blacklistQuery; diff --git a/Content.Server/Cargo/Systems/PricingSystem.cs b/Content.Server/Cargo/Systems/PricingSystem.cs index 9e1970d63c9..f878eeee75c 100644 --- a/Content.Server/Cargo/Systems/PricingSystem.cs +++ b/Content.Server/Cargo/Systems/PricingSystem.cs @@ -199,7 +199,7 @@ public double GetEstimatedPrice(EntityPrototype prototype) /// This fires off an event to calculate the price. /// Calculating the price of an entity that somehow contains itself will likely hang. /// - public double GetPrice(EntityUid uid) + public double GetPrice(EntityUid uid, bool includeContents = true) { var ev = new PriceCalculationEvent(); RaiseLocalEvent(uid, ref ev); @@ -222,7 +222,7 @@ public double GetPrice(EntityUid uid) price += GetStaticPrice(uid); } - if (TryComp(uid, out var containers)) + if (includeContents && TryComp(uid, out var containers)) { foreach (var container in containers.Containers.Values) { diff --git a/Content.Server/Chat/V2/Commands/DeleteChatMessageCommand.cs b/Content.Server/Chat/V2/Commands/DeleteChatMessageCommand.cs new file mode 100644 index 00000000000..1f9203d299f --- /dev/null +++ b/Content.Server/Chat/V2/Commands/DeleteChatMessageCommand.cs @@ -0,0 +1,36 @@ +using System.Diagnostics; +using Content.Server.Administration; +using Content.Server.Chat.V2.Repository; +using Content.Shared.Administration; +using Robust.Shared.Toolshed; +using Robust.Shared.Toolshed.Errors; +using Robust.Shared.Utility; + +namespace Content.Server.Chat.V2.Commands; + +[ToolshedCommand, AdminCommand(AdminFlags.Admin)] +public sealed class DeleteChatMessageCommand : ToolshedCommand +{ + [Dependency] private readonly IEntitySystemManager _manager = default!; + + [CommandImplementation("id")] + public void DeleteChatMessage([CommandInvocationContext] IInvocationContext ctx, [CommandArgument] uint messageId) + { + if (!_manager.GetEntitySystem().Delete(messageId)) + { + ctx.ReportError(new MessageIdDoesNotExist()); + } + } +} + +public record struct MessageIdDoesNotExist() : IConError +{ + public FormattedMessage DescribeInner() + { + return FormattedMessage.FromUnformatted(Loc.GetString("command-error-deletechatmessage-id-notexist")); + } + + public string? Expression { get; set; } + public Vector2i? IssueSpan { get; set; } + public StackTrace? Trace { get; set; } +} diff --git a/Content.Server/Chat/V2/Commands/NukeChatMessagesCommand.cs b/Content.Server/Chat/V2/Commands/NukeChatMessagesCommand.cs new file mode 100644 index 00000000000..3d8b69dd765 --- /dev/null +++ b/Content.Server/Chat/V2/Commands/NukeChatMessagesCommand.cs @@ -0,0 +1,41 @@ +using System.Diagnostics; +using Content.Server.Administration; +using Content.Server.Chat.V2.Repository; +using Content.Shared.Administration; +using Robust.Shared.Toolshed; +using Robust.Shared.Toolshed.Errors; +using Robust.Shared.Utility; + +namespace Content.Server.Chat.V2.Commands; + +[ToolshedCommand, AdminCommand(AdminFlags.Admin)] +public sealed class NukeChatMessagesCommand : ToolshedCommand +{ + [Dependency] private readonly IEntitySystemManager _manager = default!; + + [CommandImplementation("usernames")] + public void Command([CommandInvocationContext] IInvocationContext ctx, [CommandArgument] string usernamesCsv) + { + var usernames = usernamesCsv.Split(','); + + foreach (var username in usernames) + { + if (!_manager.GetEntitySystem().NukeForUsername(username, out var reason)) + { + ctx.ReportError(new NukeMessagesForUsernameError(reason)); + } + } + } +} + +public record struct NukeMessagesForUsernameError(string Reason) : IConError +{ + public FormattedMessage DescribeInner() + { + return FormattedMessage.FromUnformatted(Reason); + } + + public string? Expression { get; set; } + public Vector2i? IssueSpan { get; set; } + public StackTrace? Trace { get; set; } +} diff --git a/Content.Server/Chat/V2/Messages.cs b/Content.Server/Chat/V2/Messages.cs new file mode 100644 index 00000000000..31a563cbebf --- /dev/null +++ b/Content.Server/Chat/V2/Messages.cs @@ -0,0 +1,94 @@ +using Content.Shared.Chat.Prototypes; +using Content.Shared.Chat.V2; +using Content.Shared.Radio; + +namespace Content.Server.Chat.V2; + +/// +/// Raised locally when a comms announcement is made. +/// +public sealed class CommsAnnouncementCreatedEvent(EntityUid sender, EntityUid console, string message) : IChatEvent +{ + public uint Id { get; set; } + public EntityUid Sender { get; set; } = sender; + public string Message { get; set; } = message; + public MessageType Type => MessageType.Announcement; + public EntityUid Console = console; +} + +/// +/// Raised locally when a character speaks in Dead Chat. +/// +public sealed class DeadChatCreatedEvent(EntityUid speaker, string message, bool isAdmin) : IChatEvent +{ + public uint Id { get; set; } + public EntityUid Sender { get; set; } = speaker; + public string Message { get; set; } = message; + public MessageType Type => MessageType.DeadChat; + public bool IsAdmin = isAdmin; +} + +/// +/// Raised locally when a character emotes. +/// +public sealed class EmoteCreatedEvent(EntityUid sender, string message, float range) : IChatEvent +{ + public uint Id { get; set; } + public EntityUid Sender { get; set; } = sender; + public string Message { get; set; } = message; + public MessageType Type => MessageType.Emote; + public float Range = range; +} + +/// +/// Raised locally when a character talks in local. +/// +public sealed class LocalChatCreatedEvent(EntityUid speaker, string message, float range) : IChatEvent +{ + public uint Id { get; set; } + public EntityUid Sender { get; set; } = speaker; + public string Message { get; set; } = message; + public MessageType Type => MessageType.Local; + public float Range = range; +} + +/// +/// Raised locally when a character speaks in LOOC. +/// +public sealed class LoocCreatedEvent(EntityUid speaker, string message) : IChatEvent +{ + public uint Id { get; set; } + public EntityUid Sender { get; set; } = speaker; + public string Message { get; set; } = message; + public MessageType Type => MessageType.Looc; +} + +/// +/// Raised locally when a character speaks on the radio. +/// +public sealed class RadioCreatedEvent( + EntityUid speaker, + string message, + RadioChannelPrototype channel) + : IChatEvent +{ + public uint Id { get; set; } + public EntityUid Sender { get; set; } = speaker; + public string Message { get; set; } = message; + public RadioChannelPrototype Channel = channel; + public MessageType Type => MessageType.Radio; +} + +/// +/// Raised locally when a character whispers. +/// +public sealed class WhisperCreatedEvent(EntityUid speaker, string message, float minRange, float maxRange) : IChatEvent +{ + public uint Id { get; set; } + public EntityUid Sender { get; set; } = speaker; + public string Message { get; set; } = message; + public MessageType Type => MessageType.Whisper; + public float MinRange = minRange; + public float MaxRange = maxRange; +} + diff --git a/Content.Server/Chat/V2/Repository/ChatRepository.cs b/Content.Server/Chat/V2/Repository/ChatRepository.cs new file mode 100644 index 00000000000..06de37128f5 --- /dev/null +++ b/Content.Server/Chat/V2/Repository/ChatRepository.cs @@ -0,0 +1,196 @@ +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using System.Runtime.InteropServices; +using Content.Shared.Chat.V2; +using Content.Shared.Chat.V2.Repository; +using Robust.Server.Player; +using Robust.Shared.Network; +using Robust.Shared.Replays; + +namespace Content.Server.Chat.V2.Repository; + +/// +/// Stores , gives them UIDs, and issues . +/// Allows for deletion of messages. +/// +public sealed class ChatRepositorySystem : EntitySystem +{ + [Dependency] private readonly IReplayRecordingManager _replay = default!; + [Dependency] private readonly IPlayerManager _player = default!; + + // Clocks should start at 1, as 0 indicates "clock not set" or "clock forgotten to be set by bad programmer". + private uint _nextMessageId = 1; + private Dictionary _messages = new(); + private Dictionary> _playerMessages = new(); + + public override void Initialize() + { + Refresh(); + + _replay.RecordingFinished += _ => + { + // TODO: resolve https://github.com/space-wizards/space-station-14/issues/25485 so we can dump the chat to disc. + Refresh(); + }; + } + + /// + /// Adds an to the repo and raises it with a UID for consumption elsewhere. + /// + /// The event to store and raise + /// If storing and raising succeeded. + public bool Add(IChatEvent ev) + { + if (!_player.TryGetSessionByEntity(ev.Sender, out var session)) + { + return false; + } + + var messageId = _nextMessageId; + + _nextMessageId++; + + ev.Id = messageId; + + var storedEv = new ChatRecord + { + UserName = session.Name, + UserId = session.UserId, + EntityName = Name(ev.Sender), + StoredEvent = ev + }; + + _messages[messageId] = storedEv; + + CollectionsMarshal.GetValueRefOrAddDefault(_playerMessages, storedEv.UserId, out _)?.Add(messageId); + + RaiseLocalEvent(ev.Sender, new MessageCreatedEvent(ev), true); + + return true; + } + + /// + /// Returns the event associated with a UID, if it exists. + /// + /// The UID of a event. + /// The event, if it exists. + public IChatEvent? GetEventFor(uint id) + { + return _messages.TryGetValue(id, out var record) ? record.StoredEvent : null; + } + + /// + /// Edits a specific message and issues a that says this happened both locally and + /// on the network. Note that this doesn't replay the message (yet), so translators and mutators won't act on it. + /// + /// The ID to edit + /// The new message to send + /// If patching did anything did anything + /// Should be used for admining and admemeing only. + public bool Patch(uint id, string message) + { + if (!_messages.TryGetValue(id, out var ev)) + { + return false; + } + + ev.StoredEvent.Message = message; + + RaiseLocalEvent(new MessagePatchedEvent(id, message)); + + return true; + } + + /// + /// Deletes a message from the repository and issues a that says this has happened + /// both locally and on the network. + /// + /// The ID to delete + /// If deletion did anything + /// Should only be used for adminning + public bool Delete(uint id) + { + if (!_messages.TryGetValue(id, out var ev)) + { + return false; + } + + _messages.Remove(id); + + if (_playerMessages.TryGetValue(ev.UserId, out var set)) + { + set.Remove(id); + } + + RaiseLocalEvent(new MessageDeletedEvent(id)); + + return true; + } + + /// + /// Nukes a user's entire chat history from the repo and issues a saying this has + /// happened. + /// + /// The user ID to nuke. + /// Why nuking failed, if it did. + /// If nuking did anything. + /// Note that this could be a very large event, as we send every single event ID over the wire. + /// By necessity we can't leak the player-source of chat messages (or if they even have the same origin) because of + /// client modders who could use that information to cheat/metagrudge/etc >:( + public bool NukeForUsername(string userName, [NotNullWhen(false)] out string? reason) + { + if (!_player.TryGetUserId(userName, out var userId)) + { + reason = Loc.GetString("command-error-nukechatmessages-usernames-usernamenotexist", ("username", userName)); + + return false; + } + + return NukeForUserId(userId, out reason); + } + + /// + /// Nukes a user's entire chat history from the repo and issues a saying this has + /// happened. + /// + /// The user ID to nuke. + /// Why nuking failed, if it did. + /// If nuking did anything. + /// Note that this could be a very large event, as we send every single event ID over the wire. + /// By necessity we can't leak the player-source of chat messages (or if they even have the same origin) because of + /// client modders who could use that information to cheat/metagrudge/etc >:( + public bool NukeForUserId(NetUserId userId, [NotNullWhen(false)] out string? reason) + { + if (!_playerMessages.TryGetValue(userId, out var dict)) + { + reason = Loc.GetString("command-error-nukechatmessages-usernames-usernamenomessages", ("userId", userId.UserId.ToString())); + + return false; + } + + foreach (var id in dict) + { + _messages.Remove(id); + } + + var ev = new MessagesNukedEvent(dict); + + CollectionsMarshal.GetValueRefOrAddDefault(_playerMessages, userId, out _)?.Clear(); + + RaiseLocalEvent(ev); + + reason = null; + + return true; + } + + /// + /// Dumps held chat storage data and refreshes the repo. + /// + public void Refresh() + { + _nextMessageId = 1; + _messages.Clear(); + _playerMessages.Clear(); + } +} diff --git a/Content.Server/Chemistry/Components/ReagentTankComponent.cs b/Content.Server/Chemistry/Components/ReagentTankComponent.cs deleted file mode 100644 index cc0d2657d7d..00000000000 --- a/Content.Server/Chemistry/Components/ReagentTankComponent.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Content.Shared.FixedPoint; - - -namespace Content.Server.Chemistry.Components -{ - [RegisterComponent] - public sealed partial class ReagentTankComponent : Component - { - [DataField("transferAmount")] - [ViewVariables(VVAccess.ReadWrite)] - public FixedPoint2 TransferAmount { get; set; } = FixedPoint2.New(10); - - [DataField("tankType")] - [ViewVariables(VVAccess.ReadWrite)] - public ReagentTankType TankType { get; set; } = ReagentTankType.Unspecified; - } - - public enum ReagentTankType : byte - { - Unspecified, - Fuel - } -} diff --git a/Content.Server/Chemistry/Containers/EntitySystems/SolutionContainerSystem.cs b/Content.Server/Chemistry/Containers/EntitySystems/SolutionContainerSystem.cs index 468212f5eaf..755312554c2 100644 --- a/Content.Server/Chemistry/Containers/EntitySystems/SolutionContainerSystem.cs +++ b/Content.Server/Chemistry/Containers/EntitySystems/SolutionContainerSystem.cs @@ -149,12 +149,12 @@ private Entity SpawnSolutionUnini var relation = new ContainedSolutionComponent() { Container = container.Owner, ContainerName = name }; AddComp(uid, relation); + MetaData.SetEntityName(uid, $"solution - {name}"); ContainerSystem.Insert(uid, container, force: true); return (uid, solution, relation); } - #region Event Handlers private void OnMapInit(Entity entity, ref MapInitEvent args) diff --git a/Content.Server/Chemistry/EntitySystems/ReactionMixerSystem.cs b/Content.Server/Chemistry/EntitySystems/ReactionMixerSystem.cs index 032374d4a55..d5f7655f884 100644 --- a/Content.Server/Chemistry/EntitySystems/ReactionMixerSystem.cs +++ b/Content.Server/Chemistry/EntitySystems/ReactionMixerSystem.cs @@ -30,7 +30,7 @@ private void OnAfterInteract(Entity entity, ref AfterInt return; } - if (!_solutionContainers.TryGetMixableSolution(args.Target.Value, out var solution)) + if (!_solutionContainers.TryGetMixableSolution(args.Target.Value, out var solution, out _)) return; _popup.PopupEntity(Loc.GetString(entity.Comp.MixMessage, ("mixed", Identity.Entity(args.Target.Value, EntityManager)), ("mixer", Identity.Entity(entity.Owner, EntityManager))), args.User, args.User); diff --git a/Content.Server/Clothing/MagbootsSystem.cs b/Content.Server/Clothing/MagbootsSystem.cs index bc6880552fc..f12558389e3 100644 --- a/Content.Server/Clothing/MagbootsSystem.cs +++ b/Content.Server/Clothing/MagbootsSystem.cs @@ -1,7 +1,6 @@ using Content.Server.Atmos.Components; using Content.Shared.Alert; using Content.Shared.Clothing; -using Content.Shared.Inventory.Events; namespace Content.Server.Clothing; @@ -13,8 +12,8 @@ public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnGotEquipped); - SubscribeLocalEvent(OnGotUnequipped); + SubscribeLocalEvent(OnGotEquipped); + SubscribeLocalEvent(OnGotUnequipped); } protected override void UpdateMagbootEffects(EntityUid parent, EntityUid uid, bool state, MagbootsComponent? component) @@ -38,19 +37,13 @@ protected override void UpdateMagbootEffects(EntityUid parent, EntityUid uid, bo } } - private void OnGotUnequipped(EntityUid uid, MagbootsComponent component, GotUnequippedEvent args) + private void OnGotUnequipped(EntityUid uid, MagbootsComponent component, ref ClothingGotUnequippedEvent args) { - if (args.Slot == "shoes") - { - UpdateMagbootEffects(args.Equipee, uid, false, component); - } + UpdateMagbootEffects(args.Wearer, uid, false, component); } - private void OnGotEquipped(EntityUid uid, MagbootsComponent component, GotEquippedEvent args) + private void OnGotEquipped(EntityUid uid, MagbootsComponent component, ref ClothingGotEquippedEvent args) { - if (args.Slot == "shoes") - { - UpdateMagbootEffects(args.Equipee, uid, true, component); - } + UpdateMagbootEffects(args.Wearer, uid, true, component); } } diff --git a/Content.Server/Connection/ConnectionManager.cs b/Content.Server/Connection/ConnectionManager.cs index 0f6ec231a60..bea37c1a65a 100644 --- a/Content.Server/Connection/ConnectionManager.cs +++ b/Content.Server/Connection/ConnectionManager.cs @@ -1,4 +1,5 @@ using System.Collections.Immutable; +using System.Runtime.InteropServices; using System.Text.Json.Nodes; using System.Threading.Tasks; using Content.Server.Database; @@ -12,6 +13,7 @@ using Robust.Server.Player; using Robust.Shared.Configuration; using Robust.Shared.Network; +using Robust.Shared.Timing; namespace Content.Server.Connection @@ -19,6 +21,18 @@ namespace Content.Server.Connection public interface IConnectionManager { void Initialize(); + + /// + /// Temporarily allow a user to bypass regular connection requirements. + /// + /// + /// The specified user will be allowed to bypass regular player cap, + /// whitelist and panic bunker restrictions for . + /// Bans are not bypassed. + /// + /// The user to give a temporary bypass. + /// How long the bypass should last for. + void AddTemporaryConnectBypass(NetUserId user, TimeSpan duration); } /// @@ -34,10 +48,18 @@ public sealed class ConnectionManager : IConnectionManager [Dependency] private readonly ILocalizationManager _loc = default!; [Dependency] private readonly ServerDbEntryManager _serverDbEntry = default!; [Dependency] private readonly ProxyDetectionManager _detectionManager = default!; + [Dependency] private readonly IGameTiming _gameTiming = default!; + [Dependency] private readonly ILogManager _logManager = default!; + + private readonly Dictionary _temporaryBypasses = []; + private ISawmill _sawmill = default!; + private List _connectedWhitelistedPlayers = new(); // DeltaV - Soft whitelist improvements public void Initialize() { + _sawmill = _logManager.GetSawmill("connections"); + _netMgr.Connecting += NetMgrOnConnecting; _netMgr.Connected += OnConnected; // DeltaV - Soft whitelist improvements _netMgr.Disconnect += OnDisconnected; // DeltaV - Soft whitelist improvements @@ -46,6 +68,15 @@ public void Initialize() // _netMgr.HandleApprovalCallback = HandleApproval; } + public void AddTemporaryConnectBypass(NetUserId user, TimeSpan duration) + { + ref var time = ref CollectionsMarshal.GetValueRefOrAddDefault(_temporaryBypasses, user, out _); + var newTime = _gameTiming.RealTime + duration; + // Make sure we only update the time if we wouldn't shrink it. + if (newTime > time) + time = newTime; + } + /* private async Task HandleApproval(NetApprovalEventArgs eventArgs) { @@ -115,6 +146,20 @@ private async Task NetMgrOnConnecting(NetConnectingArgs e) hwId = null; } + var bans = await _db.GetServerBansAsync(addr, userId, hwId, includeUnbanned: false); + if (bans.Count > 0) + { + var firstBan = bans[0]; + var message = firstBan.FormatBanMessage(_cfg, _loc); + return (ConnectionDenyReason.Ban, message, bans); + } + + if (HasTemporaryBypass(userId)) + { + _sawmill.Verbose("User {UserId} has temporary bypass, skipping further connection checks", userId); + return null; + } + var adminData = await _dbManager.GetAdminDataForAsync(e.UserId); if (_cfg.GetCVar(CCVars.PanicBunkerEnabled) && adminData == null) @@ -193,7 +238,7 @@ private async Task NetMgrOnConnecting(NetConnectingArgs e) } // DeltaV - Replace existing softwhitelist implementation - if (false) //_cfg.GetCVar(CCVars.WhitelistEnabled)) + if (false)// _cfg.GetCVar(CCVars.WhitelistEnabled)) { var min = _cfg.GetCVar(CCVars.WhitelistMinPlayers); var max = _cfg.GetCVar(CCVars.WhitelistMaxPlayers); @@ -235,6 +280,11 @@ private async Task NetMgrOnConnecting(NetConnectingArgs e) return null; } + private bool HasTemporaryBypass(NetUserId user) + { + return _temporaryBypasses.TryGetValue(user, out var time) && time > _gameTiming.RealTime; + } + private async Task AssignUserIdCallback(string name) { if (!_cfg.GetCVar(CCVars.GamePersistGuests)) diff --git a/Content.Server/Connection/GrantConnectBypassCommand.cs b/Content.Server/Connection/GrantConnectBypassCommand.cs new file mode 100644 index 00000000000..e2d0d7338a4 --- /dev/null +++ b/Content.Server/Connection/GrantConnectBypassCommand.cs @@ -0,0 +1,60 @@ +using Content.Server.Administration; +using Content.Shared.Administration; +using Robust.Shared.Console; + +namespace Content.Server.Connection; + +[AdminCommand(AdminFlags.Admin)] +public sealed class GrantConnectBypassCommand : LocalizedCommands +{ + private static readonly TimeSpan DefaultDuration = TimeSpan.FromHours(1); + + [Dependency] private readonly IPlayerLocator _playerLocator = default!; + [Dependency] private readonly IConnectionManager _connectionManager = default!; + + public override string Command => "grant_connect_bypass"; + + public override async void Execute(IConsoleShell shell, string argStr, string[] args) + { + if (args.Length is not (1 or 2)) + { + shell.WriteError(Loc.GetString("cmd-grant_connect_bypass-invalid-args")); + return; + } + + var argPlayer = args[0]; + var info = await _playerLocator.LookupIdByNameOrIdAsync(argPlayer); + if (info == null) + { + shell.WriteError(Loc.GetString("cmd-grant_connect_bypass-unknown-user", ("user", argPlayer))); + return; + } + + var duration = DefaultDuration; + if (args.Length > 1) + { + var argDuration = args[2]; + if (!uint.TryParse(argDuration, out var minutes)) + { + shell.WriteLine(Loc.GetString("cmd-grant_connect_bypass-invalid-duration", ("duration", argDuration))); + return; + } + + duration = TimeSpan.FromMinutes(minutes); + } + + _connectionManager.AddTemporaryConnectBypass(info.UserId, duration); + shell.WriteLine(Loc.GetString("cmd-grant_connect_bypass-success", ("user", argPlayer))); + } + + public override CompletionResult GetCompletion(IConsoleShell shell, string[] args) + { + if (args.Length == 1) + return CompletionResult.FromHint(Loc.GetString("cmd-grant_connect_bypass-arg-user")); + + if (args.Length == 2) + return CompletionResult.FromHint(Loc.GetString("cmd-grant_connect_bypass-arg-duration")); + + return CompletionResult.Empty; + } +} diff --git a/Content.Server/Construction/Components/WelderRefinableComponent.cs b/Content.Server/Construction/Components/WelderRefinableComponent.cs index 9d8958f7614..ed37d6f74b8 100644 --- a/Content.Server/Construction/Components/WelderRefinableComponent.cs +++ b/Content.Server/Construction/Components/WelderRefinableComponent.cs @@ -1,22 +1,24 @@ using Content.Shared.Tools; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; +using Robust.Shared.Prototypes; -namespace Content.Server.Construction.Components +namespace Content.Server.Construction.Components; + +/// +/// Used for something that can be refined by welder. +/// For example, glass shard can be refined to glass sheet. +/// +[RegisterComponent] +public sealed partial class WelderRefinableComponent : Component { - /// - /// Used for something that can be refined by welder. - /// For example, glass shard can be refined to glass sheet. - /// - [RegisterComponent] - public sealed partial class WelderRefinableComponent : Component - { - [DataField("refineResult")] - public HashSet? RefineResult = new(); + [DataField] + public HashSet? RefineResult = new(); + + [DataField] + public float RefineTime = 2f; - [DataField("refineTime")] - public float RefineTime = 2f; + [DataField] + public float RefineFuel; - [DataField("qualityNeeded", customTypeSerializer:typeof(PrototypeIdSerializer))] - public string QualityNeeded = "Welding"; - } + [DataField] + public ProtoId QualityNeeded = "Welding"; } diff --git a/Content.Server/Construction/ConstructionSystem.Interactions.cs b/Content.Server/Construction/ConstructionSystem.Interactions.cs index 59a5fd6af51..ad7b2a11b0e 100644 --- a/Content.Server/Construction/ConstructionSystem.Interactions.cs +++ b/Content.Server/Construction/ConstructionSystem.Interactions.cs @@ -11,10 +11,8 @@ using Content.Shared.Interaction; using Content.Shared.Prying.Systems; using Content.Shared.Radio.EntitySystems; -using Content.Shared.Tools.Components; using Content.Shared.Tools.Systems; using Robust.Shared.Containers; -using Robust.Shared.Map; using Robust.Shared.Utility; #if EXCEPTION_TOLERANCE // ReSharper disable once RedundantUsingDirective @@ -369,7 +367,8 @@ private HandleResult HandleInteraction(EntityUid uid, object ev, ConstructionGra TimeSpan.FromSeconds(toolInsertStep.DoAfter), new [] { toolInsertStep.Tool }, new ConstructionInteractDoAfterEvent(EntityManager, interactUsing), - out var doAfter); + out var doAfter, + toolInsertStep.Fuel); return result && doAfter != null ? HandleResult.DoAfter : HandleResult.False; } diff --git a/Content.Server/Construction/RefiningSystem.cs b/Content.Server/Construction/RefiningSystem.cs index b9d80c7170a..53cfb14528e 100644 --- a/Content.Server/Construction/RefiningSystem.cs +++ b/Content.Server/Construction/RefiningSystem.cs @@ -1,11 +1,8 @@ using Content.Server.Construction.Components; using Content.Server.Stack; using Content.Shared.Construction; -using Content.Shared.DoAfter; using Content.Shared.Interaction; using Content.Shared.Stacks; -using Content.Shared.Tools; -using Robust.Shared.Serialization; using SharedToolSystem = Content.Shared.Tools.Systems.SharedToolSystem; namespace Content.Server.Construction @@ -26,7 +23,7 @@ private void OnInteractUsing(EntityUid uid, WelderRefinableComponent component, if (args.Handled) return; - args.Handled = _toolSystem.UseTool(args.Used, args.User, uid, component.RefineTime, component.QualityNeeded, new WelderRefineDoAfterEvent()); + args.Handled = _toolSystem.UseTool(args.Used, args.User, uid, component.RefineTime, component.QualityNeeded, new WelderRefineDoAfterEvent(), fuel: component.RefineFuel); } private void OnDoAfter(EntityUid uid, WelderRefinableComponent component, WelderRefineDoAfterEvent args) @@ -41,7 +38,7 @@ private void OnDoAfter(EntityUid uid, WelderRefinableComponent component, Welder // spawn each result after refine foreach (var result in component.RefineResult!) { - var droppedEnt = EntityManager.SpawnEntity(result, resultPosition); + var droppedEnt = Spawn(result, resultPosition); // TODO: If something has a stack... Just use a prototype with a single thing in the stack. // This is not a good way to do it. diff --git a/Content.Server/Content.Server.csproj b/Content.Server/Content.Server.csproj index 8782454eacb..70e404fdef0 100644 --- a/Content.Server/Content.Server.csproj +++ b/Content.Server/Content.Server.csproj @@ -28,7 +28,6 @@ - diff --git a/Content.Server/CriminalRecords/Systems/CriminalRecordsSystem.cs b/Content.Server/CriminalRecords/Systems/CriminalRecordsSystem.cs index efec18485c2..9ffe9444867 100644 --- a/Content.Server/CriminalRecords/Systems/CriminalRecordsSystem.cs +++ b/Content.Server/CriminalRecords/Systems/CriminalRecordsSystem.cs @@ -3,7 +3,7 @@ using Content.Shared.CriminalRecords; using Content.Shared.Security; using Content.Shared.StationRecords; -using Robust.Shared.Timing; +using Content.Server.GameTicking; namespace Content.Server.CriminalRecords.Systems; @@ -17,7 +17,7 @@ namespace Content.Server.CriminalRecords.Systems; /// public sealed class CriminalRecordsSystem : EntitySystem { - [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly GameTicker _ticker = default!; [Dependency] private readonly StationRecordsSystem _stationRecords = default!; public override void Initialize() @@ -71,7 +71,7 @@ public bool TryAddHistory(StationRecordKey key, CrimeHistory entry) /// public bool TryAddHistory(StationRecordKey key, string line) { - var entry = new CrimeHistory(_timing.CurTime, line); + var entry = new CrimeHistory(_ticker.RoundDuration(), line); return TryAddHistory(key, entry); } diff --git a/Content.Server/Damage/Systems/DamageOnToolInteractSystem.cs b/Content.Server/Damage/Systems/DamageOnToolInteractSystem.cs index 264ec4a8ec4..42676c1891c 100644 --- a/Content.Server/Damage/Systems/DamageOnToolInteractSystem.cs +++ b/Content.Server/Damage/Systems/DamageOnToolInteractSystem.cs @@ -1,7 +1,5 @@ using Content.Server.Administration.Logs; using Content.Server.Damage.Components; -using Content.Server.Tools.Components; -using Content.Shared.Item; using Content.Shared.Damage; using Content.Shared.Database; using Content.Shared.Interaction; diff --git a/Content.Server/Database/DatabaseRecords.cs b/Content.Server/Database/DatabaseRecords.cs index 460a6c8222a..c0d81147bb4 100644 --- a/Content.Server/Database/DatabaseRecords.cs +++ b/Content.Server/Database/DatabaseRecords.cs @@ -123,6 +123,6 @@ public sealed record PlayerRecord( IPAddress LastSeenAddress, ImmutableArray? HWId); -public sealed record RoundRecord(int Id, DateTimeOffset StartDate, ServerRecord Server); +public sealed record RoundRecord(int Id, DateTimeOffset? StartDate, ServerRecord Server); public sealed record ServerRecord(int Id, string Name); diff --git a/Content.Server/Database/ServerDbBase.cs b/Content.Server/Database/ServerDbBase.cs index fc47fa2e95c..03435acecdb 100644 --- a/Content.Server/Database/ServerDbBase.cs +++ b/Content.Server/Database/ServerDbBase.cs @@ -700,7 +700,7 @@ public async Task AddAdminRankAsync(AdminRank rank, CancellationToken cancel) await db.DbContext.SaveChangesAsync(cancel); } - public virtual async Task AddNewRound(Server server, params Guid[] playerIds) + public async Task AddNewRound(Server server, params Guid[] playerIds) { await using var db = await GetDb(); diff --git a/Content.Server/Database/ServerDbSqlite.cs b/Content.Server/Database/ServerDbSqlite.cs index 1e77808b7dd..71d25f81ec0 100644 --- a/Content.Server/Database/ServerDbSqlite.cs +++ b/Content.Server/Database/ServerDbSqlite.cs @@ -453,34 +453,6 @@ public override async Task AddConnectionLogAsync( return (admins.Select(p => (p.a, p.LastSeenUserName)).ToArray(), adminRanks)!; } - public override async Task AddNewRound(Server server, params Guid[] playerIds) - { - await using var db = await GetDb(); - - var players = await db.DbContext.Player - .Where(player => playerIds.Contains(player.UserId)) - .ToListAsync(); - - var nextId = 1; - if (await db.DbContext.Round.AnyAsync()) - { - nextId = db.DbContext.Round.Max(round => round.Id) + 1; - } - - var round = new Round - { - Id = nextId, - Players = players, - ServerId = server.Id - }; - - db.DbContext.Round.Add(round); - - await db.DbContext.SaveChangesAsync(); - - return round.Id; - } - protected override IQueryable StartAdminLogsQuery(ServerDbContext db, LogFilter? filter = null) { IQueryable query = db.AdminLog; diff --git a/Content.Server/DeltaV/StationEvents/Events/PirateRadioSpawnRule.cs b/Content.Server/DeltaV/StationEvents/Events/PirateRadioSpawnRule.cs index f0538c47f95..ba042d89662 100644 --- a/Content.Server/DeltaV/StationEvents/Events/PirateRadioSpawnRule.cs +++ b/Content.Server/DeltaV/StationEvents/Events/PirateRadioSpawnRule.cs @@ -39,7 +39,7 @@ protected override void Started(EntityUid uid, PirateRadioSpawnRuleComponent com var xformQuery = GetEntityQuery(); var aabbs = EntityQuery().SelectMany(x => x.Grids.Select(x => - xformQuery.GetComponent(x).WorldMatrix.TransformBox(_mapManager.GetGridComp(x).LocalAABB))) + xformQuery.GetComponent(x).WorldMatrix.TransformBox(_entities.GetComponent(x).LocalAABB))) .ToArray(); if (aabbs.Length < 1) return; var aabb = aabbs[0]; diff --git a/Content.Server/Destructible/Thresholds/Behaviors/BurnBodyBehavior.cs b/Content.Server/Destructible/Thresholds/Behaviors/BurnBodyBehavior.cs new file mode 100644 index 00000000000..f0499dc6a2d --- /dev/null +++ b/Content.Server/Destructible/Thresholds/Behaviors/BurnBodyBehavior.cs @@ -0,0 +1,32 @@ +using Content.Shared.Body.Components; +using Content.Shared.Inventory; +using Content.Shared.Popups; +using JetBrains.Annotations; +using Robust.Server.GameObjects; + +namespace Content.Server.Destructible.Thresholds.Behaviors; + +[UsedImplicitly] +[DataDefinition] +public sealed partial class BurnBodyBehavior : IThresholdBehavior +{ + + public void Execute(EntityUid bodyId, DestructibleSystem system, EntityUid? cause = null) + { + var transformSystem = system.EntityManager.System(); + var inventorySystem = system.EntityManager.System(); + var sharedPopupSystem = system.EntityManager.System(); + + if (system.EntityManager.TryGetComponent(bodyId, out var comp)) + { + foreach (var item in inventorySystem.GetHandOrInventoryEntities(bodyId)) + { + transformSystem.DropNextTo(item, bodyId); + } + } + + sharedPopupSystem.PopupCoordinates(Loc.GetString("bodyburn-text-others", ("name", bodyId)), transformSystem.GetMoverCoordinates(bodyId), PopupType.LargeCaution); + + system.EntityManager.QueueDeleteEntity(bodyId); + } +} diff --git a/Content.Server/Destructible/Thresholds/Behaviors/SpawnEntitiesBehavior.cs b/Content.Server/Destructible/Thresholds/Behaviors/SpawnEntitiesBehavior.cs index ed5777c42aa..0fa3c06c04b 100644 --- a/Content.Server/Destructible/Thresholds/Behaviors/SpawnEntitiesBehavior.cs +++ b/Content.Server/Destructible/Thresholds/Behaviors/SpawnEntitiesBehavior.cs @@ -23,7 +23,10 @@ public sealed partial class SpawnEntitiesBehavior : IThresholdBehavior public float Offset { get; set; } = 0.5f; [DataField("transferForensics")] - public bool DoTransferForensics = false; + public bool DoTransferForensics; + + [DataField] + public bool SpawnInContainer; public void Execute(EntityUid owner, DestructibleSystem system, EntityUid? cause = null) { @@ -49,7 +52,9 @@ public void Execute(EntityUid owner, DestructibleSystem system, EntityUid? cause if (EntityPrototypeHelpers.HasComponent(entityId, system.PrototypeManager, system.ComponentFactory)) { - var spawned = system.EntityManager.SpawnEntity(entityId, position.Offset(getRandomVector())); + var spawned = SpawnInContainer + ? system.EntityManager.SpawnNextToOrDrop(entityId, owner) + : system.EntityManager.SpawnEntity(entityId, position.Offset(getRandomVector())); system.StackSystem.SetCount(spawned, count); TransferForensics(spawned, system, owner); @@ -58,7 +63,9 @@ public void Execute(EntityUid owner, DestructibleSystem system, EntityUid? cause { for (var i = 0; i < count; i++) { - var spawned = system.EntityManager.SpawnEntity(entityId, position.Offset(getRandomVector())); + var spawned = SpawnInContainer + ? system.EntityManager.SpawnNextToOrDrop(entityId, owner) + : system.EntityManager.SpawnEntity(entityId, position.Offset(getRandomVector())); TransferForensics(spawned, system, owner); } diff --git a/Content.Server/Electrocution/Components/ElectrifiedComponent.cs b/Content.Server/Electrocution/Components/ElectrifiedComponent.cs index 65a539eb08e..4ef07a0cca8 100644 --- a/Content.Server/Electrocution/Components/ElectrifiedComponent.cs +++ b/Content.Server/Electrocution/Components/ElectrifiedComponent.cs @@ -85,4 +85,7 @@ public sealed partial class ElectrifiedComponent : Component [DataField("shockVolume")] public float ShockVolume = 20; + + [DataField] + public float Probability = 1f; } diff --git a/Content.Server/Electrocution/ElectrocutionSystem.cs b/Content.Server/Electrocution/ElectrocutionSystem.cs index 11633062829..8291e97efe4 100644 --- a/Content.Server/Electrocution/ElectrocutionSystem.cs +++ b/Content.Server/Electrocution/ElectrocutionSystem.cs @@ -213,6 +213,9 @@ public bool TryDoElectrifiedAct(EntityUid uid, EntityUid targetUid, if (!IsPowered(uid, electrified, transform)) return false; + if (!_random.Prob(electrified.Probability)) + return false; + EnsureComp(uid); _appearance.SetData(uid, ElectrifiedVisuals.IsPowered, true); diff --git a/Content.Server/Entry/EntryPoint.cs b/Content.Server/Entry/EntryPoint.cs index bf7f3ea84ab..3cdf3bfe8e2 100644 --- a/Content.Server/Entry/EntryPoint.cs +++ b/Content.Server/Entry/EntryPoint.cs @@ -102,6 +102,7 @@ public override void Init() IoCManager.Resolve().Initialize(); IoCManager.Resolve().Initialize(); IoCManager.Resolve().Initialize(); + IoCManager.Resolve().Initialize(); _voteManager.Initialize(); _updateManager.Initialize(); @@ -167,6 +168,7 @@ protected override void Dispose(bool disposing) { _playTimeTracking?.Shutdown(); _dbManager?.Shutdown(); + IoCManager.Resolve().Shutdown(); } private static void LoadConfigPresets(IConfigurationManager cfg, IResourceManager res, ISawmill sawmill) diff --git a/Content.Server/Entry/IgnoredComponents.cs b/Content.Server/Entry/IgnoredComponents.cs index fe073da7a49..d9b81c8e5a5 100644 --- a/Content.Server/Entry/IgnoredComponents.cs +++ b/Content.Server/Entry/IgnoredComponents.cs @@ -14,12 +14,13 @@ public static class IgnoredComponents "Icon", "HandheldGPS", "CableVisualizer", + "SolutionItemStatus", "UIFragment", "PdaBorderColor", "InventorySlots", "LightFade", "HolidayRsiSwap", - "OptionsVisualizer", + "OptionsVisualizer" }; } } diff --git a/Content.Server/Explosion/EntitySystems/TriggerSystem.cs b/Content.Server/Explosion/EntitySystems/TriggerSystem.cs index 94f55855362..3675c214b14 100644 --- a/Content.Server/Explosion/EntitySystems/TriggerSystem.cs +++ b/Content.Server/Explosion/EntitySystems/TriggerSystem.cs @@ -153,7 +153,7 @@ private void HandleExplodeTrigger(EntityUid uid, ExplodeOnTriggerComponent compo private void HandleFlashTrigger(EntityUid uid, FlashOnTriggerComponent component, TriggerEvent args) { // TODO Make flash durations sane ffs. - _flashSystem.FlashArea(uid, args.User, component.Range, component.Duration * 1000f); + _flashSystem.FlashArea(uid, args.User, component.Range, component.Duration * 1000f, probability: component.Probability); args.Handled = true; } diff --git a/Content.Server/Flash/FlashSystem.cs b/Content.Server/Flash/FlashSystem.cs index fe7eb81d1e1..dd8cdab426c 100644 --- a/Content.Server/Flash/FlashSystem.cs +++ b/Content.Server/Flash/FlashSystem.cs @@ -19,6 +19,7 @@ using Robust.Server.Audio; using Robust.Server.GameObjects; using Robust.Shared.Audio; +using Robust.Shared.Random; using Robust.Shared.Timing; using InventoryComponent = Content.Shared.Inventory.InventoryComponent; @@ -37,6 +38,7 @@ internal sealed class FlashSystem : SharedFlashSystem [Dependency] private readonly PopupSystem _popup = default!; [Dependency] private readonly StunSystem _stun = default!; [Dependency] private readonly TagSystem _tag = default!; + [Dependency] private readonly IRobustRandom _random = default!; public override void Initialize() { @@ -63,7 +65,7 @@ private void OnFlashMeleeHit(EntityUid uid, FlashComponent comp, MeleeHitEvent a args.Handled = true; foreach (var e in args.HitEntities) { - Flash(e, args.User, uid, comp.FlashDuration, comp.SlowTo, melee: true); + Flash(e, args.User, uid, comp.FlashDuration, comp.SlowTo, melee: true, stunDuration: comp.MeleeStunDuration); } } @@ -73,7 +75,7 @@ private void OnFlashUseInHand(EntityUid uid, FlashComponent comp, UseInHandEvent return; args.Handled = true; - FlashArea(uid, args.User, comp.Range, comp.AoeFlashDuration, comp.SlowTo, true); + FlashArea(uid, args.User, comp.Range, comp.AoeFlashDuration, comp.SlowTo, true, comp.Probability); } private bool UseFlash(EntityUid uid, FlashComponent comp, EntityUid user) @@ -113,7 +115,8 @@ public void Flash(EntityUid target, float slowTo, bool displayPopup = true, FlashableComponent? flashable = null, - bool melee = false) + bool melee = false, + TimeSpan? stunDuration = null) { if (!Resolve(target, ref flashable, false)) return; @@ -137,41 +140,46 @@ public void Flash(EntityUid target, flashable.Duration = flashDuration / 1000f; // TODO: Make this sane... Dirty(target, flashable); - _stun.TrySlowdown(target, TimeSpan.FromSeconds(flashDuration/1000f), true, + if (stunDuration != null) + { + _stun.TryParalyze(target, stunDuration.Value, true); + } + else + { + _stun.TrySlowdown(target, TimeSpan.FromSeconds(flashDuration/1000f), true, slowTo, slowTo); + } if (displayPopup && user != null && target != user && Exists(user.Value)) { _popup.PopupEntity(Loc.GetString("flash-component-user-blinds-you", ("user", Identity.Entity(user.Value, EntityManager))), target, target); } - } - public void FlashArea(EntityUid source, EntityUid? user, float range, float duration, float slowTo = 0.8f, bool displayPopup = false, SoundSpecifier? sound = null) + public void FlashArea(Entity source, EntityUid? user, float range, float duration, float slowTo = 0.8f, bool displayPopup = false, float probability = 1f, SoundSpecifier? sound = null) { - var transform = EntityManager.GetComponent(source); + var transform = Transform(source); var mapPosition = _transform.GetMapCoordinates(transform); var flashableQuery = GetEntityQuery(); foreach (var entity in _entityLookup.GetEntitiesInRange(transform.Coordinates, range)) { - if (!flashableQuery.TryGetComponent(entity, out var flashable)) + if (!_random.Prob(probability)) continue; + if (!flashableQuery.TryGetComponent(entity, out var flashable)) + continue; // Check for unobstructed entities while ignoring the mobs with flashable components. - if (!_interaction.InRangeUnobstructed(entity, mapPosition, range, flashable.CollisionGroup, (e) => e == source)) + if (!_interaction.InRangeUnobstructed(entity, mapPosition, range, flashable.CollisionGroup, predicate: (e) => flashableQuery.HasComponent(e) || e == source.Owner)) continue; // They shouldn't have flash removed in between right? Flash(entity, user, source, duration, slowTo, displayPopup, flashableQuery.GetComponent(entity)); } - if (sound != null) - { - _audio.PlayPvs(sound, source, AudioParams.Default.WithVolume(1f).WithMaxDistance(3f)); - } + _audio.PlayPvs(sound, source, AudioParams.Default.WithVolume(1f).WithMaxDistance(3f)); } private void OnInventoryFlashAttempt(EntityUid uid, InventoryComponent component, FlashAttemptEvent args) diff --git a/Content.Server/Fluids/EntitySystems/PuddleSystem.Spillable.cs b/Content.Server/Fluids/EntitySystems/PuddleSystem.Spillable.cs index 7780e5d4676..d02dd44e81f 100644 --- a/Content.Server/Fluids/EntitySystems/PuddleSystem.Spillable.cs +++ b/Content.Server/Fluids/EntitySystems/PuddleSystem.Spillable.cs @@ -1,16 +1,14 @@ using Content.Server.Chemistry.Containers.EntitySystems; -using Content.Server.Fluids.Components; using Content.Shared.Chemistry.Components; using Content.Shared.Chemistry.EntitySystems; using Content.Shared.Chemistry.Reaction; using Content.Shared.Chemistry.Reagent; -using Content.Shared.Clothing.Components; +using Content.Shared.Clothing; using Content.Shared.CombatMode.Pacification; using Content.Shared.Database; using Content.Shared.FixedPoint; using Content.Shared.Fluids.Components; using Content.Shared.IdentityManagement; -using Content.Shared.Inventory.Events; using Content.Shared.Nutrition.EntitySystems; using Content.Shared.Popups; using Content.Shared.Spillable; @@ -29,8 +27,8 @@ protected override void InitializeSpillable() SubscribeLocalEvent(SpillOnLand); // Openable handles the event if it's closed SubscribeLocalEvent(SplashOnMeleeHit, after: [typeof(OpenableSystem)]); - SubscribeLocalEvent(OnGotEquipped); - SubscribeLocalEvent(OnGotUnequipped); + SubscribeLocalEvent(OnGotEquipped); + SubscribeLocalEvent(OnGotUnequipped); SubscribeLocalEvent(OnOverflow); SubscribeLocalEvent(OnDoAfter); SubscribeLocalEvent(OnAttemptPacifiedThrow); @@ -99,20 +97,11 @@ private void SplashOnMeleeHit(Entity entity, ref MeleeHitEve } } - private void OnGotEquipped(Entity entity, ref GotEquippedEvent args) + private void OnGotEquipped(Entity entity, ref ClothingGotEquippedEvent args) { if (!entity.Comp.SpillWorn) return; - if (!TryComp(entity, out ClothingComponent? clothing)) - return; - - // check if entity was actually used as clothing - // not just taken in pockets or something - var isCorrectSlot = clothing.Slots.HasFlag(args.SlotFlags); - if (!isCorrectSlot) - return; - if (!_solutionContainerSystem.TryGetSolution(entity.Owner, entity.Comp.SolutionName, out var soln, out var solution)) return; @@ -124,10 +113,10 @@ private void OnGotEquipped(Entity entity, ref GotEquippedEve // spill all solution on the player var drainedSolution = _solutionContainerSystem.Drain(entity.Owner, soln.Value, solution.Volume); - TrySplashSpillAt(entity.Owner, Transform(args.Equipee).Coordinates, drainedSolution, out _); + TrySplashSpillAt(entity.Owner, Transform(args.Wearer).Coordinates, drainedSolution, out _); } - private void OnGotUnequipped(Entity entity, ref GotUnequippedEvent args) + private void OnGotUnequipped(Entity entity, ref ClothingGotUnequippedEvent args) { if (!entity.Comp.SpillWorn) return; diff --git a/Content.Server/Forensics/Systems/ForensicsSystem.cs b/Content.Server/Forensics/Systems/ForensicsSystem.cs index a9ef23a2f58..1445e253f38 100644 --- a/Content.Server/Forensics/Systems/ForensicsSystem.cs +++ b/Content.Server/Forensics/Systems/ForensicsSystem.cs @@ -103,7 +103,7 @@ public void CopyForensicsFrom(ForensicsComponent src, EntityUid target) private void OnAfterInteract(EntityUid uid, CleansForensicsComponent component, AfterInteractEvent args) { - if (args.Handled) + if (args.Handled || !args.CanReach) return; if (!TryComp(args.Target, out var forensicsComp)) diff --git a/Content.Server/GameTicking/Rules/PiratesRuleSystem.cs b/Content.Server/GameTicking/Rules/PiratesRuleSystem.cs index 900554d8241..797d086710c 100644 --- a/Content.Server/GameTicking/Rules/PiratesRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/PiratesRuleSystem.cs @@ -24,6 +24,7 @@ using Robust.Shared.Configuration; using Robust.Shared.Enums; using Robust.Shared.Map; +using Robust.Shared.Map.Components; using Robust.Shared.Player; using Robust.Shared.Prototypes; using Robust.Shared.Random; @@ -180,7 +181,7 @@ private void OnPlayerSpawningEvent(RulePlayerSpawningEvent ev) var aabbs = EntityQuery().SelectMany(x => x.Grids.Select(x => - xformQuery.GetComponent(x).WorldMatrix.TransformBox(_mapManager.GetGridComp(x).LocalAABB))) + xformQuery.GetComponent(x).WorldMatrix.TransformBox(Comp(x).LocalAABB))) .ToArray(); var aabb = aabbs[0]; diff --git a/Content.Server/GameTicking/Rules/RevolutionaryRuleSystem.cs b/Content.Server/GameTicking/Rules/RevolutionaryRuleSystem.cs index 5caa223c9c1..ba9fb2ccbcc 100644 --- a/Content.Server/GameTicking/Rules/RevolutionaryRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/RevolutionaryRuleSystem.cs @@ -217,7 +217,6 @@ private void OnPostFlash(EntityUid uid, HeadRevolutionaryComponent comp, ref Aft _npcFaction.AddFaction(ev.Target, RevolutionaryNpcFaction); var revComp = EnsureComp(ev.Target); - _stun.TryParalyze(ev.Target, comp.StunTime, true); if (ev.User != null) { diff --git a/Content.Server/Hands/Systems/HandsSystem.cs b/Content.Server/Hands/Systems/HandsSystem.cs index bfd6393790a..e7527e2c76d 100644 --- a/Content.Server/Hands/Systems/HandsSystem.cs +++ b/Content.Server/Hands/Systems/HandsSystem.cs @@ -9,7 +9,6 @@ using Content.Shared.Explosion; using Content.Shared.Hands.Components; using Content.Shared.Hands.EntitySystems; -using Content.Shared.IdentityManagement; using Content.Shared.Input; using Content.Shared.Inventory.VirtualItem; using Content.Shared.Movement.Pulling.Components; @@ -17,8 +16,6 @@ using Content.Shared.Movement.Pulling.Systems; using Content.Shared.Stacks; using Content.Shared.Throwing; -using Robust.Shared.Audio; -using Robust.Shared.Audio.Systems; using Robust.Shared.GameStates; using Robust.Shared.Input.Binding; using Robust.Shared.Map; @@ -160,7 +157,7 @@ private void HandlePullStopped(EntityUid uid, HandsComponent component, PullStop continue; } - QueueDel(hand.HeldEntity.Value); + TryDrop(args.PullerUid, hand, handsComp: component); break; } } diff --git a/Content.Server/Humanoid/Systems/HumanoidAppearanceSystem.cs b/Content.Server/Humanoid/Systems/HumanoidAppearanceSystem.cs index 0ab77684d90..97766e482be 100644 --- a/Content.Server/Humanoid/Systems/HumanoidAppearanceSystem.cs +++ b/Content.Server/Humanoid/Systems/HumanoidAppearanceSystem.cs @@ -1,36 +1,23 @@ -using Content.Shared.Examine; using Content.Shared.Humanoid; using Content.Shared.Humanoid.Markings; using Content.Shared.Humanoid.Prototypes; -using Content.Shared.IdentityManagement; using Content.Shared.Preferences; using Content.Shared.Verbs; using Robust.Shared.GameObjects.Components.Localization; -using Robust.Shared.Prototypes; namespace Content.Server.Humanoid; public sealed partial class HumanoidAppearanceSystem : SharedHumanoidAppearanceSystem { [Dependency] private readonly MarkingManager _markingManager = default!; - [Dependency] private readonly IPrototypeManager _prototypeManager = default!; public override void Initialize() { base.Initialize(); + SubscribeLocalEvent(OnMarkingsSet); SubscribeLocalEvent(OnBaseLayersSet); SubscribeLocalEvent>(OnVerbsRequest); - SubscribeLocalEvent(OnExamined); - } - - private void OnExamined(EntityUid uid, HumanoidAppearanceComponent component, ExaminedEvent args) - { - var identity = Identity.Entity(uid, EntityManager); - var species = GetSpeciesRepresentation(component.Species).ToLower(); - var age = GetAgeRepresentation(component.Species, component.Age); - - args.PushText(Loc.GetString("humanoid-appearance-component-examine", ("user", identity), ("age", age), ("species", species))); } // this was done enough times that it only made sense to do it here @@ -168,42 +155,4 @@ public void SetMarkingColor(EntityUid uid, MarkingCategories category, int index Dirty(uid, humanoid); } - - /// - /// Takes ID of the species prototype, returns UI-friendly name of the species. - /// - public string GetSpeciesRepresentation(string speciesId) - { - if (_prototypeManager.TryIndex(speciesId, out var species)) - { - return Loc.GetString(species.Name); - } - else - { - return Loc.GetString("humanoid-appearance-component-unknown-species"); - } - } - - public string GetAgeRepresentation(string species, int age) - { - _prototypeManager.TryIndex(species, out var speciesPrototype); - - if (speciesPrototype == null) - { - Log.Error("Tried to get age representation of species that couldn't be indexed: " + species); - return Loc.GetString("identity-age-young"); - } - - if (age < speciesPrototype.YoungAge) - { - return Loc.GetString("identity-age-young"); - } - - if (age < speciesPrototype.OldAge) - { - return Loc.GetString("identity-age-middle-aged"); - } - - return Loc.GetString("identity-age-old"); - } } diff --git a/Content.Server/IdentityManagement/IdentitySystem.cs b/Content.Server/IdentityManagement/IdentitySystem.cs index ec8412ed1ab..a959b96ef97 100644 --- a/Content.Server/IdentityManagement/IdentitySystem.cs +++ b/Content.Server/IdentityManagement/IdentitySystem.cs @@ -62,6 +62,7 @@ private void OnMapInit(EntityUid uid, IdentityComponent component, MapInitEvent { var ident = Spawn(null, Transform(uid).Coordinates); + _metaData.SetEntityName(ident, "identity"); QueueIdentityUpdate(uid); _container.Insert(ident, component.IdentityEntitySlot); } diff --git a/Content.Server/ImmovableRod/ImmovableRodComponent.cs b/Content.Server/ImmovableRod/ImmovableRodComponent.cs index f3605914795..05fa3d9d9b2 100644 --- a/Content.Server/ImmovableRod/ImmovableRodComponent.cs +++ b/Content.Server/ImmovableRod/ImmovableRodComponent.cs @@ -1,3 +1,4 @@ +using Content.Shared.Damage; using Robust.Shared.Audio; namespace Content.Server.ImmovableRod; @@ -36,4 +37,16 @@ public sealed partial class ImmovableRodComponent : Component /// [DataField("destroyTiles")] public bool DestroyTiles = true; + + /// + /// If true, this will gib & delete bodies + /// + [DataField] + public bool ShouldGib = true; + + /// + /// Damage done, if not gibbing + /// + [DataField] + public DamageSpecifier? Damage; } diff --git a/Content.Server/ImmovableRod/ImmovableRodSystem.cs b/Content.Server/ImmovableRod/ImmovableRodSystem.cs index 429361cd8cd..f9873b0d6a9 100644 --- a/Content.Server/ImmovableRod/ImmovableRodSystem.cs +++ b/Content.Server/ImmovableRod/ImmovableRodSystem.cs @@ -1,9 +1,10 @@ using Content.Server.Body.Systems; +using Content.Server.Polymorph.Components; using Content.Server.Popups; using Content.Shared.Body.Components; +using Content.Shared.Damage; using Content.Shared.Examine; using Content.Shared.Popups; -using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; using Robust.Shared.Map; using Robust.Shared.Map.Components; @@ -22,6 +23,8 @@ public sealed class ImmovableRodSystem : EntitySystem [Dependency] private readonly PopupSystem _popup = default!; [Dependency] private readonly SharedPhysicsSystem _physics = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly DamageableSystem _damageable = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; public override void Update(float frameTime) { @@ -57,18 +60,21 @@ private void OnMapInit(EntityUid uid, ImmovableRodComponent component, MapInitEv _physics.SetFriction(uid, phys, 0f); _physics.SetBodyStatus(uid, phys, BodyStatus.InAir); - if (!component.RandomizeVelocity) - return; - var xform = Transform(uid); - var vel = component.DirectionOverride.Degrees switch + var (worldPos, worldRot) = _transform.GetWorldPositionRotation(uid); + var vel = worldRot.ToWorldVec() * component.MaxSpeed; + + if (component.RandomizeVelocity) { - 0f => _random.NextVector2(component.MinSpeed, component.MaxSpeed), - _ => xform.WorldRotation.RotateVec(component.DirectionOverride.ToVec()) * _random.NextFloat(component.MinSpeed, component.MaxSpeed) - }; + vel = component.DirectionOverride.Degrees switch + { + 0f => _random.NextVector2(component.MinSpeed, component.MaxSpeed), + _ => worldRot.RotateVec(component.DirectionOverride.ToVec()) * _random.NextFloat(component.MinSpeed, component.MaxSpeed) + }; + } _physics.ApplyLinearImpulse(uid, vel, body: phys); - xform.LocalRotation = (vel - xform.WorldPosition).ToWorldAngle() + MathHelper.PiOver2; + xform.LocalRotation = (vel - worldPos).ToWorldAngle() + MathHelper.PiOver2; } } @@ -94,12 +100,28 @@ private void OnCollide(EntityUid uid, ImmovableRodComponent component, ref Start return; } - // gib em + // dont delete/hurt self if polymoprhed into a rod + if (TryComp(uid, out var polymorphed)) + { + if (polymorphed.Parent == ent) + return; + } + + // gib or damage em if (TryComp(ent, out var body)) { component.MobCount++; - _popup.PopupEntity(Loc.GetString("immovable-rod-penetrated-mob", ("rod", uid), ("mob", ent)), uid, PopupType.LargeCaution); + + if (!component.ShouldGib) + { + if (component.Damage == null) + return; + + _damageable.TryChangeDamage(ent, component.Damage, ignoreResistances: true); + return; + } + _bodySystem.GibBody(ent, body: body); return; } diff --git a/Content.Server/Inventory/ServerInventorySystem.cs b/Content.Server/Inventory/ServerInventorySystem.cs index 29d39f37234..e3783753bbc 100644 --- a/Content.Server/Inventory/ServerInventorySystem.cs +++ b/Content.Server/Inventory/ServerInventorySystem.cs @@ -1,21 +1,15 @@ -using Content.Server.Storage.EntitySystems; using Content.Shared.Explosion; using Content.Shared.Inventory; -using Content.Shared.Inventory.Events; -using Content.Shared.Storage; namespace Content.Server.Inventory { public sealed class ServerInventorySystem : InventorySystem { - [Dependency] private readonly StorageSystem _storageSystem = default!; - public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnExploded); - SubscribeNetworkEvent(OnOpenSlotStorage); } private void OnExploded(Entity ent, ref BeforeExplodeEvent args) @@ -29,17 +23,6 @@ private void OnExploded(Entity ent, ref BeforeExplodeEvent a } } - private void OnOpenSlotStorage(OpenSlotStorageNetworkMessage ev, EntitySessionEventArgs args) - { - if (args.SenderSession.AttachedEntity is not { Valid: true } uid) - return; - - if (TryGetSlotEntity(uid, ev.Slot, out var entityUid) && TryComp(entityUid, out var storageComponent)) - { - _storageSystem.OpenStorageUI(entityUid.Value, uid, storageComponent); - } - } - public void TransferEntityInventories(Entity source, Entity target) { if (!Resolve(source.Owner, ref source.Comp) || !Resolve(target.Owner, ref target.Comp)) diff --git a/Content.Server/IoC/ServerContentIoC.cs b/Content.Server/IoC/ServerContentIoC.cs index bf858fb7d63..be07fc9a3d8 100644 --- a/Content.Server/IoC/ServerContentIoC.cs +++ b/Content.Server/IoC/ServerContentIoC.cs @@ -60,6 +60,7 @@ public static void Register() IoCManager.Register(); IoCManager.Register(); IoCManager.Register(); + IoCManager.Register(); } } } diff --git a/Content.Server/Kitchen/EntitySystems/SharpSystem.cs b/Content.Server/Kitchen/EntitySystems/SharpSystem.cs index 2caab4063cf..3c1e89b1f2d 100644 --- a/Content.Server/Kitchen/EntitySystems/SharpSystem.cs +++ b/Content.Server/Kitchen/EntitySystems/SharpSystem.cs @@ -1,5 +1,7 @@ using Content.Server.Body.Systems; using Content.Server.Kitchen.Components; +using Content.Server.Nutrition.EntitySystems; +using Content.Shared.Body.Components; using Content.Shared.Administration.Logs; using Content.Shared.Body.Components; using Content.Shared.Database; @@ -11,9 +13,14 @@ using Content.Shared.Verbs; using Content.Shared.Destructible; using Content.Shared.DoAfter; +using Content.Shared.Interaction; using Content.Shared.Kitchen; using Content.Shared.Mobs.Components; using Content.Shared.Mobs.Systems; +using Content.Shared.Nutrition.Components; +using Content.Shared.Popups; +using Content.Shared.Storage; +using Content.Shared.Verbs; using Robust.Server.Containers; using Robust.Shared.Random; using Robust.Shared.Utility; @@ -35,7 +42,7 @@ public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnAfterInteract, before: new[] { typeof(UtensilSystem) }); + SubscribeLocalEvent(OnAfterInteract, before: [typeof(UtensilSystem)]); SubscribeLocalEvent(OnDoAfter); SubscribeLocalEvent>(OnGetInteractionVerbs); @@ -43,16 +50,14 @@ public override void Initialize() private void OnAfterInteract(EntityUid uid, SharpComponent component, AfterInteractEvent args) { - if (args.Handled) - return; - - if (args.Target is null || !args.CanReach) + if (args.Handled || args.Target is null || !args.CanReach) return; - args.Handled = TryStartButcherDoAfter(uid, args.Target.Value, args.User); + if (TryStartButcherDoafter(uid, args.Target.Value, args.User)) + args.Handled = true; } - private bool TryStartButcherDoAfter(EntityUid knife, EntityUid target, EntityUid user) + private bool TryStartButcherDoafter(EntityUid knife, EntityUid target, EntityUid user) { if (!TryComp(target, out var butcher)) return false; @@ -66,11 +71,11 @@ private bool TryStartButcherDoAfter(EntityUid knife, EntityUid target, EntityUid if (butcher.Type != ButcheringType.Knife && target != user) { _popupSystem.PopupEntity(Loc.GetString("butcherable-different-tool", ("target", target)), knife, user); - return true; + return false; } if (!sharp.Butchering.Add(target)) - return true; + return false; var doAfter = new DoAfterArgs(EntityManager, user, sharp.ButcherDelayModifier * butcher.ButcherDelay, new SharpDoAfterEvent(), knife, target: target, used: knife) @@ -165,7 +170,7 @@ private void OnGetInteractionVerbs(EntityUid uid, ButcherableComponent component Act = () => { if (!disabled) - TryStartButcherDoAfter(args.Using!.Value, args.Target, args.User); + TryStartButcherDoafter(args.Using!.Value, args.Target, args.User); }, Message = message, Disabled = disabled, diff --git a/Content.Server/Labels/Label/LabelSystem.cs b/Content.Server/Labels/Label/LabelSystem.cs index f45eac8eabc..52184fb58f2 100644 --- a/Content.Server/Labels/Label/LabelSystem.cs +++ b/Content.Server/Labels/Label/LabelSystem.cs @@ -90,10 +90,7 @@ private void OnComponentInit(EntityUid uid, PaperLabelComponent component, Compo { _itemSlotsSystem.AddItemSlot(uid, ContainerName, component.LabelSlot); - if (!EntityManager.TryGetComponent(uid, out AppearanceComponent? appearance)) - return; - - _appearance.SetData(uid, PaperLabelVisuals.HasLabel, false, appearance); + UpdateAppearance((uid, component)); } private void OnComponentRemove(EntityUid uid, PaperLabelComponent component, ComponentRemove args) @@ -137,10 +134,18 @@ private void OnContainerModified(EntityUid uid, PaperLabelComponent label, Conta if (args.Container.ID != label.LabelSlot.ID) return; - if (!EntityManager.TryGetComponent(uid, out AppearanceComponent? appearance)) + UpdateAppearance((uid, label)); + } + + private void UpdateAppearance(Entity ent) + { + if (!Resolve(ent, ref ent.Comp2, false)) return; - _appearance.SetData(uid, PaperLabelVisuals.HasLabel, label.LabelSlot.HasItem, appearance); + var slot = ent.Comp1.LabelSlot; + _appearance.SetData(ent, PaperLabelVisuals.HasLabel, slot.HasItem, ent.Comp2); + if (TryComp(slot.Item, out var type)) + _appearance.SetData(ent, PaperLabelVisuals.LabelType, type.PaperType, ent.Comp2); } } } diff --git a/Content.Server/Light/Components/EmergencyLightComponent.cs b/Content.Server/Light/Components/EmergencyLightComponent.cs index 20de7f1c03b..b49a8c3868a 100644 --- a/Content.Server/Light/Components/EmergencyLightComponent.cs +++ b/Content.Server/Light/Components/EmergencyLightComponent.cs @@ -14,7 +14,7 @@ public sealed partial class EmergencyLightComponent : SharedEmergencyLightCompon /// /// Is this emergency light forced on for some reason and cannot be disabled through normal means - /// (i.e. delta alert level?) + /// (i.e. blue alert or higher?) /// public bool ForciblyEnabled = false; diff --git a/Content.Server/Light/EntitySystems/EmergencyLightSystem.cs b/Content.Server/Light/EntitySystems/EmergencyLightSystem.cs index 3fa5237948c..f2c4c7dcc59 100644 --- a/Content.Server/Light/EntitySystems/EmergencyLightSystem.cs +++ b/Content.Server/Light/EntitySystems/EmergencyLightSystem.cs @@ -31,9 +31,9 @@ public override void Initialize() SubscribeLocalEvent(OnEmergencyPower); } - private void OnEmergencyPower(EntityUid uid, EmergencyLightComponent component, ref PowerChangedEvent args) + private void OnEmergencyPower(Entity entity, ref PowerChangedEvent args) { - var meta = MetaData(uid); + var meta = MetaData(entity.Owner); // TODO: PowerChangedEvent shouldn't be issued for paused ents but this is the world we live in. if (meta.EntityLifeStage >= EntityLifeStage.Terminating || @@ -42,7 +42,7 @@ private void OnEmergencyPower(EntityUid uid, EmergencyLightComponent component, return; } - UpdateState(uid, component); + UpdateState(entity); } private void OnEmergencyExamine(EntityUid uid, EmergencyLightComponent component, ExaminedEvent args) @@ -111,13 +111,13 @@ private void OnAlertLevelChanged(AlertLevelChangedEvent ev) if (details.ForceEnableEmergencyLights && !light.ForciblyEnabled) { light.ForciblyEnabled = true; - TurnOn(uid, light); + TurnOn((uid, light)); } else if (!details.ForceEnableEmergencyLights && light.ForciblyEnabled) { // Previously forcibly enabled, and we went down an alert level. light.ForciblyEnabled = false; - UpdateState(uid, light); + UpdateState((uid, light)); } } } @@ -135,31 +135,31 @@ public override void Update(float frameTime) var query = EntityQueryEnumerator(); while (query.MoveNext(out var uid, out _, out var emergencyLight, out var battery)) { - Update(uid, emergencyLight, battery, frameTime); + Update((uid, emergencyLight), battery, frameTime); } } - private void Update(EntityUid uid, EmergencyLightComponent component, BatteryComponent battery, float frameTime) + private void Update(Entity entity, BatteryComponent battery, float frameTime) { - if (component.State == EmergencyLightState.On) + if (entity.Comp.State == EmergencyLightState.On) { - if (!_battery.TryUseCharge(uid, component.Wattage * frameTime, battery)) + if (!_battery.TryUseCharge(entity.Owner, entity.Comp.Wattage * frameTime, battery)) { - SetState(uid, component, EmergencyLightState.Empty); - TurnOff(uid, component); + SetState(entity.Owner, entity.Comp, EmergencyLightState.Empty); + TurnOff(entity); } } else { - _battery.SetCharge(uid, battery.CurrentCharge + component.ChargingWattage * frameTime * component.ChargingEfficiency, battery); + _battery.SetCharge(entity.Owner, battery.CurrentCharge + entity.Comp.ChargingWattage * frameTime * entity.Comp.ChargingEfficiency, battery); if (battery.IsFullyCharged) { - if (TryComp(uid, out var receiver)) + if (TryComp(entity.Owner, out var receiver)) { receiver.Load = 1; } - SetState(uid, component, EmergencyLightState.Full); + SetState(entity.Owner, entity.Comp, EmergencyLightState.Full); } } } @@ -167,35 +167,73 @@ private void Update(EntityUid uid, EmergencyLightComponent component, BatteryCom /// /// Updates the light's power drain, battery drain, sprite and actual light state. /// - public void UpdateState(EntityUid uid, EmergencyLightComponent component) + public void UpdateState(Entity entity) { - if (!TryComp(uid, out var receiver)) + if (!TryComp(entity.Owner, out var receiver)) return; - if (receiver.Powered && !component.ForciblyEnabled) + if (!TryComp(_station.GetOwningStation(entity.Owner), out var alerts)) + return; + + if (alerts.AlertLevels == null || !alerts.AlertLevels.Levels.TryGetValue(alerts.CurrentLevel, out var details)) { - receiver.Load = (int) Math.Abs(component.Wattage); - TurnOff(uid, component); - SetState(uid, component, EmergencyLightState.Charging); + TurnOff(entity, Color.Red); // if no alert, default to off red state + return; } - else + + if (receiver.Powered && !entity.Comp.ForciblyEnabled) // Green alert { - TurnOn(uid, component); - SetState(uid, component, EmergencyLightState.On); + receiver.Load = (int) Math.Abs(entity.Comp.Wattage); + TurnOff(entity, details.Color); + SetState(entity.Owner, entity.Comp, EmergencyLightState.Charging); + } + else if (!receiver.Powered) // If internal battery runs out it will end in off red state + { + TurnOn(entity, Color.Red); + SetState(entity.Owner, entity.Comp, EmergencyLightState.On); + } + else // Powered and enabled + { + TurnOn(entity, details.Color); + SetState(entity.Owner, entity.Comp, EmergencyLightState.On); } } - private void TurnOff(EntityUid uid, EmergencyLightComponent component) + private void TurnOff(Entity entity) { - _pointLight.SetEnabled(uid, false); - _appearance.SetData(uid, EmergencyLightVisuals.On, false); - _ambient.SetAmbience(uid, false); + _pointLight.SetEnabled(entity.Owner, false); + _appearance.SetData(entity.Owner, EmergencyLightVisuals.On, false); + _ambient.SetAmbience(entity.Owner, false); } - private void TurnOn(EntityUid uid, EmergencyLightComponent component) + /// + /// Turn off emergency light and set color. + /// + private void TurnOff(Entity entity, Color color) + { + _pointLight.SetEnabled(entity.Owner, false); + _pointLight.SetColor(entity.Owner, color); + _appearance.SetData(entity.Owner, EmergencyLightVisuals.Color, color); + _appearance.SetData(entity.Owner, EmergencyLightVisuals.On, false); + _ambient.SetAmbience(entity.Owner, false); + } + + private void TurnOn(Entity entity) + { + _pointLight.SetEnabled(entity.Owner, true); + _appearance.SetData(entity.Owner, EmergencyLightVisuals.On, true); + _ambient.SetAmbience(entity.Owner, true); + } + + /// + /// Turn on emergency light and set color. + /// + private void TurnOn(Entity entity, Color color) { - _pointLight.SetEnabled(uid, true); - _appearance.SetData(uid, EmergencyLightVisuals.On, true); - _ambient.SetAmbience(uid, true); + _pointLight.SetEnabled(entity.Owner, true); + _pointLight.SetColor(entity.Owner, color); + _appearance.SetData(entity.Owner, EmergencyLightVisuals.Color, color); + _appearance.SetData(entity.Owner, EmergencyLightVisuals.On, true); + _ambient.SetAmbience(entity.Owner, true); } } diff --git a/Content.Server/Mapping/MappingCommand.cs b/Content.Server/Mapping/MappingCommand.cs index 08ba0de8334..08f3dcccf9f 100644 --- a/Content.Server/Mapping/MappingCommand.cs +++ b/Content.Server/Mapping/MappingCommand.cs @@ -1,17 +1,14 @@ -// ReSharper disable once RedundantUsingDirective -// Used to warn the player in big red letters in debug mode - using System.Linq; using Content.Server.Administration; using Content.Server.GameTicking; using Content.Shared.Administration; using Content.Shared.CCVar; -using Robust.Server.Player; +using Robust.Server.GameObjects; +using Robust.Server.Maps; using Robust.Shared.Configuration; using Robust.Shared.Console; using Robust.Shared.ContentPack; using Robust.Shared.Map; -using Robust.Shared.Utility; namespace Content.Server.Mapping { @@ -19,6 +16,8 @@ namespace Content.Server.Mapping sealed class MappingCommand : IConsoleCommand { [Dependency] private readonly IEntityManager _entities = default!; + [Dependency] private readonly IMapManager _map = default!; + [Dependency] private readonly IConfigurationManager _cfg = default!; public string Command => "mapping"; public string Description => Loc.GetString("cmd-mapping-desc"); @@ -57,13 +56,13 @@ public void Execute(IConsoleShell shell, string argStr, string[] args) shell.WriteError(Loc.GetString("cmd-mapping-warning")); #endif - var mapManager = IoCManager.Resolve(); MapId mapId; + string? toLoad = null; + var mapSys = _entities.System(); // Get the map ID to use if (args.Length is 1 or 2) { - if (!int.TryParse(args[0], out var intMapId)) { shell.WriteError(Loc.GetString("cmd-mapping-failure-integer", ("arg", args[0]))); @@ -79,35 +78,33 @@ public void Execute(IConsoleShell shell, string argStr, string[] args) return; } - if (mapManager.MapExists(mapId)) + if (_map.MapExists(mapId)) { shell.WriteError(Loc.GetString("cmd-mapping-exists", ("mapId", mapId))); return; } - } - else - { - mapId = mapManager.NextMapId(); - } + // either load a map or create a new one. + if (args.Length <= 1) + { + mapSys.CreateMap(mapId, runMapInit: false); + } + else + { + var loadOptions = new MapLoadOptions {StoreMapUids = true}; + _entities.System().TryLoad(mapId, args[1], out _, loadOptions); + } - string? toLoad = null; - // either load a map or create a new one. - if (args.Length <= 1) - { - shell.ExecuteCommand($"addmap {mapId} false"); + // was the map actually created or did it fail somehow? + if (!_map.MapExists(mapId)) + { + shell.WriteError(Loc.GetString("cmd-mapping-error")); + return; + } } else { - toLoad = CommandParsing.Escape(args[1]); - shell.ExecuteCommand($"loadmap {mapId} \"{toLoad}\" 0 0 0 true"); - } - - // was the map actually created? - if (!mapManager.MapExists(mapId)) - { - shell.WriteError(Loc.GetString("cmd-mapping-error")); - return; + mapSys.CreateMap(out mapId, runMapInit: false); } // map successfully created. run misc helpful mapping commands @@ -117,17 +114,15 @@ public void Execute(IConsoleShell shell, string argStr, string[] args) shell.ExecuteCommand("aghost"); } - var cfg = IoCManager.Resolve(); - // don't interrupt mapping with events or auto-shuttle shell.ExecuteCommand("sudo cvar events.enabled false"); shell.ExecuteCommand("sudo cvar shuttle.auto_call_time 0"); - if (cfg.GetCVar(CCVars.AutosaveEnabled)) + if (_cfg.GetCVar(CCVars.AutosaveEnabled)) shell.ExecuteCommand($"toggleautosave {mapId} {toLoad ?? "NEWMAP"}"); shell.ExecuteCommand($"tp 0 0 {mapId}"); shell.RemoteExecuteCommand("mappingclientsidesetup"); - mapManager.SetMapPaused(mapId, true); + _map.SetMapPaused(mapId, true); if (args.Length == 2) shell.WriteLine(Loc.GetString("cmd-mapping-success-load",("mapId",mapId),("path", args[1]))); diff --git a/Content.Server/Medical/Components/CryoPodAirComponent.cs b/Content.Server/Medical/Components/CryoPodAirComponent.cs index baaa3bcda0e..72a10b391e7 100644 --- a/Content.Server/Medical/Components/CryoPodAirComponent.cs +++ b/Content.Server/Medical/Components/CryoPodAirComponent.cs @@ -11,5 +11,5 @@ public sealed partial class CryoPodAirComponent : Component /// [ViewVariables(VVAccess.ReadWrite)] [DataField("gasMixture")] - public GasMixture Air { get; set; } = new(Atmospherics.OneAtmosphere); + public GasMixture Air { get; set; } = new GasMixture(1000f); } diff --git a/Content.Server/Medical/CryoPodSystem.cs b/Content.Server/Medical/CryoPodSystem.cs index a949d980bef..02e8cebbe06 100644 --- a/Content.Server/Medical/CryoPodSystem.cs +++ b/Content.Server/Medical/CryoPodSystem.cs @@ -276,10 +276,17 @@ private void OnGasAnalyzed(Entity entity, ref GasAnalyzerScanE if (!TryComp(entity, out CryoPodAirComponent? cryoPodAir)) return; - args.GasMixtures ??= new Dictionary { { Name(entity.Owner), cryoPodAir.Air } }; + args.GasMixtures ??= new List<(string, GasMixture?)>(); + args.GasMixtures.Add((Name(entity.Owner), cryoPodAir.Air)); // If it's connected to a port, include the port side - if (_nodeContainer.TryGetNode(entity.Owner, entity.Comp.PortName, out PipeNode? port)) - args.GasMixtures.Add(entity.Comp.PortName, port.Air); + // multiply by volume fraction to make sure to send only the gas inside the analyzed pipe element, not the whole pipe system + if (_nodeContainer.TryGetNode(entity.Owner, entity.Comp.PortName, out PipeNode? port) && port.Air.Volume != 0f) + { + var portAirLocal = port.Air.Clone(); + portAirLocal.Multiply(port.Volume / port.Air.Volume); + portAirLocal.Volume = port.Volume; + args.GasMixtures.Add((entity.Comp.PortName, portAirLocal)); + } } private void OnEjected(Entity cryoPod, ref EntRemovedFromContainerMessage args) diff --git a/Content.Server/Medical/Stethoscope/StethoscopeSystem.cs b/Content.Server/Medical/Stethoscope/StethoscopeSystem.cs index f1864bb3a1c..b8304c562a4 100644 --- a/Content.Server/Medical/Stethoscope/StethoscopeSystem.cs +++ b/Content.Server/Medical/Stethoscope/StethoscopeSystem.cs @@ -3,11 +3,10 @@ using Content.Server.Medical.Stethoscope.Components; using Content.Server.Popups; using Content.Shared.Actions; -using Content.Shared.Clothing.Components; +using Content.Shared.Clothing; using Content.Shared.Damage; using Content.Shared.DoAfter; using Content.Shared.FixedPoint; -using Content.Shared.Inventory.Events; using Content.Shared.Medical; using Content.Shared.Medical.Stethoscope; using Content.Shared.Mobs.Components; @@ -26,8 +25,8 @@ public sealed class StethoscopeSystem : EntitySystem public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnEquipped); - SubscribeLocalEvent(OnUnequipped); + SubscribeLocalEvent(OnEquipped); + SubscribeLocalEvent(OnUnequipped); SubscribeLocalEvent>(AddStethoscopeVerb); SubscribeLocalEvent(OnGetActions); SubscribeLocalEvent(OnStethoscopeAction); @@ -37,26 +36,20 @@ public override void Initialize() /// /// Add the component the verb event subs to if the equippee is wearing the stethoscope. /// - private void OnEquipped(EntityUid uid, StethoscopeComponent component, GotEquippedEvent args) + private void OnEquipped(EntityUid uid, StethoscopeComponent component, ref ClothingGotEquippedEvent args) { - if (!TryComp(uid, out var clothing)) - return; - // Is the clothing in its actual slot? - if (!clothing.Slots.HasFlag(args.SlotFlags)) - return; - component.IsActive = true; - var wearingComp = EnsureComp(args.Equipee); + var wearingComp = EnsureComp(args.Wearer); wearingComp.Stethoscope = uid; } - private void OnUnequipped(EntityUid uid, StethoscopeComponent component, GotUnequippedEvent args) + private void OnUnequipped(EntityUid uid, StethoscopeComponent component, ref ClothingGotUnequippedEvent args) { if (!component.IsActive) return; - RemComp(args.Equipee); + RemComp(args.Wearer); component.IsActive = false; } diff --git a/Content.Server/Medical/SuitSensors/SuitSensorSystem.cs b/Content.Server/Medical/SuitSensors/SuitSensorSystem.cs index 9864badc620..38e88f6e1ed 100644 --- a/Content.Server/Medical/SuitSensors/SuitSensorSystem.cs +++ b/Content.Server/Medical/SuitSensors/SuitSensorSystem.cs @@ -7,10 +7,10 @@ using Content.Server.Medical.CrewMonitoring; using Content.Server.Popups; using Content.Server.Station.Systems; +using Content.Shared.Clothing; using Content.Shared.Damage; using Content.Shared.DeviceNetwork; using Content.Shared.Examine; -using Content.Shared.Inventory.Events; using Content.Shared.Medical.SuitSensor; using Content.Shared.Mobs.Components; using Content.Shared.Mobs.Systems; @@ -40,8 +40,8 @@ public override void Initialize() base.Initialize(); SubscribeLocalEvent(OnPlayerSpawn); SubscribeLocalEvent(OnMapInit); - SubscribeLocalEvent(OnEquipped); - SubscribeLocalEvent(OnUnequipped); + SubscribeLocalEvent(OnEquipped); + SubscribeLocalEvent(OnUnequipped); SubscribeLocalEvent(OnExamine); SubscribeLocalEvent>(OnVerb); SubscribeLocalEvent(OnInsert); @@ -160,19 +160,13 @@ private void OnMapInit(EntityUid uid, SuitSensorComponent component, MapInitEven } } - private void OnEquipped(EntityUid uid, SuitSensorComponent component, GotEquippedEvent args) + private void OnEquipped(EntityUid uid, SuitSensorComponent component, ref ClothingGotEquippedEvent args) { - if (args.Slot != component.ActivationSlot) - return; - - component.User = args.Equipee; + component.User = args.Wearer; } - private void OnUnequipped(EntityUid uid, SuitSensorComponent component, GotUnequippedEvent args) + private void OnUnequipped(EntityUid uid, SuitSensorComponent component, ref ClothingGotUnequippedEvent args) { - if (args.Slot != component.ActivationSlot) - return; - component.User = null; } diff --git a/Content.Server/Mind/MindSystem.cs b/Content.Server/Mind/MindSystem.cs index 4035fa0f864..dc12836d904 100644 --- a/Content.Server/Mind/MindSystem.cs +++ b/Content.Server/Mind/MindSystem.cs @@ -357,16 +357,17 @@ public override void SetUserId(EntityUid mindId, NetUserId? userId, MindComponen mind.UserId = userId; mind.OriginalOwnerUserId ??= userId; + // The UserId may not have a current session, but user data may still exist for disconnected players. + // So we cannot combine this with the TryGetSessionById() check below. + if (_players.GetPlayerData(userId.Value).ContentData() is { } data) + data.Mind = mindId; + if (_players.TryGetSessionById(userId.Value, out var ret)) { mind.Session = ret; _pvsOverride.AddSessionOverride(netMind, ret); _players.SetAttachedEntity(ret, mind.CurrentEntity); } - - // session may be null, but user data may still exist for disconnected players. - if (_players.GetPlayerData(userId.Value).ContentData() is { } data) - data.Mind = mindId; } public void ControlMob(EntityUid user, EntityUid target) diff --git a/Content.Server/NPC/Components/NPCImprintingOnSpawnBehaviourComponent.cs b/Content.Server/NPC/Components/NPCImprintingOnSpawnBehaviourComponent.cs new file mode 100644 index 00000000000..26439d2b300 --- /dev/null +++ b/Content.Server/NPC/Components/NPCImprintingOnSpawnBehaviourComponent.cs @@ -0,0 +1,34 @@ +using Content.Shared.Whitelist; +using Robust.Shared.Collections; + +namespace Content.Server.NPC.Components; +/// +/// A component that makes the entity friendly to nearby creatures it sees on init. +/// +[RegisterComponent] +public sealed partial class NPCImprintingOnSpawnBehaviourComponent : Component +{ + /// + /// filter who can be a friend to this creature + /// + [DataField] + public EntityWhitelist? Whitelist; + + /// + /// when a creature appears, it will memorize all creatures in the radius to remember them as friends + /// + [DataField] + public float SpawnFriendsSearchRadius = 3f; + + /// + /// if there is a FollowCompound in HTN, the target of the following will be selected from random nearby targets when it appears + /// + [DataField] + public bool Follow = true; + + /// + /// is used to determine who became a friend from this component + /// + [DataField] + public List Friends = new(); +} diff --git a/Content.Server/NPC/Systems/NPCImprintingOnSpawnBehaviourSystem.cs b/Content.Server/NPC/Systems/NPCImprintingOnSpawnBehaviourSystem.cs new file mode 100644 index 00000000000..cfd3b08c61a --- /dev/null +++ b/Content.Server/NPC/Systems/NPCImprintingOnSpawnBehaviourSystem.cs @@ -0,0 +1,49 @@ +using System.Numerics; +using Content.Shared.NPC.Components; +using Content.Shared.NPC.Systems; +using Robust.Shared.Collections; +using Robust.Shared.Map; +using Robust.Shared.Random; +using NPCImprintingOnSpawnBehaviourComponent = Content.Server.NPC.Components.NPCImprintingOnSpawnBehaviourComponent; + +namespace Content.Server.NPC.Systems; + +public sealed partial class NPCImprintingOnSpawnBehaviourSystem : SharedNPCImprintingOnSpawnBehaviourSystem +{ + [Dependency] private readonly EntityLookupSystem _lookup = default!; + [Dependency] private readonly NPCSystem _npc = default!; + [Dependency] private readonly IRobustRandom _random = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnMapInit); + } + + private void OnMapInit(Entity imprinting, ref MapInitEvent args) + { + HashSet friends = new(); + _lookup.GetEntitiesInRange(imprinting, imprinting.Comp.SpawnFriendsSearchRadius, friends); + + foreach (var friend in friends) + { + if (imprinting.Comp.Whitelist?.IsValid(friend) != false) + { + AddImprintingTarget(imprinting, friend, imprinting.Comp); + } + } + + if (imprinting.Comp.Follow && imprinting.Comp.Friends.Count > 0) + { + var mommy = _random.Pick(imprinting.Comp.Friends); + _npc.SetBlackboard(imprinting, NPCBlackboard.FollowTarget, new EntityCoordinates(mommy, Vector2.Zero)); + } + } + + public void AddImprintingTarget(EntityUid entity, EntityUid friend, NPCImprintingOnSpawnBehaviourComponent component) + { + component.Friends.Add(friend); + var exception = EnsureComp(entity); + exception.Ignored.Add(friend); + } +} diff --git a/Content.Server/NPC/Systems/NPCSystem.cs b/Content.Server/NPC/Systems/NPCSystem.cs index 8abe0f7f54c..91086294350 100644 --- a/Content.Server/NPC/Systems/NPCSystem.cs +++ b/Content.Server/NPC/Systems/NPCSystem.cs @@ -5,6 +5,7 @@ using Content.Shared.Mobs; using Content.Shared.Mobs.Systems; using Content.Shared.NPC; +using Content.Shared.NPC.Systems; using Robust.Server.GameObjects; using Robust.Shared.Configuration; using Robust.Shared.Player; diff --git a/Content.Server/Nutrition/Components/PressurizedDrinkComponent.cs b/Content.Server/Nutrition/Components/PressurizedDrinkComponent.cs deleted file mode 100644 index aafb3bc1065..00000000000 --- a/Content.Server/Nutrition/Components/PressurizedDrinkComponent.cs +++ /dev/null @@ -1,27 +0,0 @@ -using Content.Server.Nutrition.EntitySystems; -using Robust.Shared.Audio; - -namespace Content.Server.Nutrition.Components; - -/// -/// Lets a drink burst open when thrown while closed. -/// Requires and to work. -/// -[RegisterComponent, Access(typeof(DrinkSystem))] -public sealed partial class PressurizedDrinkComponent : Component -{ - /// - /// Chance for the drink to burst when thrown while closed. - /// - [DataField, ViewVariables(VVAccess.ReadWrite)] - public float BurstChance = 0.25f; - - /// - /// Sound played when the drink bursts. - /// - [DataField] - public SoundSpecifier BurstSound = new SoundPathSpecifier("/Audio/Effects/flash_bang.ogg") - { - Params = AudioParams.Default.WithVolume(-4) - }; -} diff --git a/Content.Server/Nutrition/EntitySystems/DrinkSystem.cs b/Content.Server/Nutrition/EntitySystems/DrinkSystem.cs index 74637d48137..aa2ed71d8f3 100644 --- a/Content.Server/Nutrition/EntitySystems/DrinkSystem.cs +++ b/Content.Server/Nutrition/EntitySystems/DrinkSystem.cs @@ -5,7 +5,6 @@ using Content.Server.Fluids.EntitySystems; using Content.Server.Forensics; using Content.Server.Inventory; -using Content.Server.Nutrition.Components; using Content.Server.Popups; using Content.Shared.Administration.Logs; using Content.Shared.Body.Components; @@ -16,7 +15,6 @@ using Content.Shared.Chemistry.Reagent; using Content.Shared.Database; using Content.Shared.DoAfter; -using Content.Shared.Examine; using Content.Shared.FixedPoint; using Content.Shared.IdentityManagement; using Content.Shared.Interaction; @@ -25,24 +23,21 @@ using Content.Shared.Nutrition; using Content.Shared.Nutrition.Components; using Content.Shared.Nutrition.EntitySystems; -using Content.Shared.Throwing; using Content.Shared.Verbs; using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; using Robust.Shared.Player; using Robust.Shared.Prototypes; -using Robust.Shared.Random; using Robust.Shared.Utility; namespace Content.Server.Nutrition.EntitySystems; -public sealed class DrinkSystem : EntitySystem +public sealed class DrinkSystem : SharedDrinkSystem { [Dependency] private readonly BodySystem _body = default!; [Dependency] private readonly FlavorProfileSystem _flavorProfile = default!; [Dependency] private readonly FoodSystem _food = default!; [Dependency] private readonly IPrototypeManager _proto = default!; - [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; [Dependency] private readonly MobStateSystem _mobState = default!; [Dependency] private readonly OpenableSystem _openable = default!; @@ -66,33 +61,10 @@ public override void Initialize() SubscribeLocalEvent(OnDrinkInit); // run before inventory so for bucket it always tries to drink before equipping (when empty) // run after openable so its always open -> drink - SubscribeLocalEvent(OnUse, before: new[] { typeof(ServerInventorySystem) }, after: new[] { typeof(OpenableSystem) }); + SubscribeLocalEvent(OnUse, before: [typeof(ServerInventorySystem)], after: [typeof(OpenableSystem)]); SubscribeLocalEvent(AfterInteract); SubscribeLocalEvent>(AddDrinkVerb); - // put drink amount after opened - SubscribeLocalEvent(OnExamined, after: new[] { typeof(OpenableSystem) }); SubscribeLocalEvent(OnDoAfter); - - SubscribeLocalEvent(OnPressurizedDrinkLand); - } - - private FixedPoint2 DrinkVolume(EntityUid uid, DrinkComponent? component = null) - { - if (!Resolve(uid, ref component)) - return FixedPoint2.Zero; - - if (!_solutionContainer.TryGetSolution(uid, component.Solution, out _, out var sol)) - return FixedPoint2.Zero; - - return sol.Volume; - } - - public bool IsEmpty(EntityUid uid, DrinkComponent? component = null) - { - if (!Resolve(uid, ref component)) - return true; - - return DrinkVolume(uid, component) <= 0; } /// @@ -129,38 +101,6 @@ public float TotalHydration(EntityUid uid, DrinkComponent? comp = null) return total; } - private void OnExamined(Entity entity, ref ExaminedEvent args) - { - TryComp(entity, out var openable); - if (_openable.IsClosed(entity.Owner, null, openable) || !args.IsInDetailsRange || !entity.Comp.Examinable) - return; - - var empty = IsEmpty(entity, entity.Comp); - if (empty) - { - args.PushMarkup(Loc.GetString("drink-component-on-examine-is-empty")); - return; - } - - if (HasComp(entity)) - { - //provide exact measurement for beakers - args.PushText(Loc.GetString("drink-component-on-examine-exact-volume", ("amount", DrinkVolume(entity, entity.Comp)))); - } - else - { - //general approximation - var remainingString = (int) _solutionContainer.PercentFull(entity) switch - { - 100 => "drink-component-on-examine-is-full", - > 66 => "drink-component-on-examine-is-mostly-full", - > 33 => HalfEmptyOrHalfFull(args), - _ => "drink-component-on-examine-is-mostly-empty", - }; - args.PushMarkup(Loc.GetString(remainingString)); - } - } - private void AfterInteract(Entity entity, ref AfterInteractEvent args) { if (args.Handled || args.Target == null || !args.CanReach) @@ -177,25 +117,6 @@ private void OnUse(Entity entity, ref UseInHandEvent args) args.Handled = TryDrink(args.User, args.User, entity.Comp, entity); } - private void OnPressurizedDrinkLand(Entity entity, ref LandEvent args) - { - if (!TryComp(entity, out var drink) || !TryComp(entity, out var openable)) - return; - - if (!openable.Opened && - _random.Prob(entity.Comp.BurstChance) && - _solutionContainer.TryGetSolution(entity.Owner, drink.Solution, out var soln, out var interactions)) - { - // using SetOpen instead of TryOpen to not play 2 sounds - _openable.SetOpen(entity, true, openable); - - var solution = _solutionContainer.SplitSolution(soln.Value, interactions.Volume); - _puddle.TrySpillAt(entity, solution, out _); - - _audio.PlayPvs(entity.Comp.BurstSound, entity); - } - } - private void OnDrinkInit(Entity entity, ref ComponentInit args) { if (TryComp(entity, out var existingDrainable)) @@ -433,16 +354,4 @@ private void AddDrinkVerb(Entity entity, ref GetVerbsEvent(args.Examiner, out var examiner) && examiner.EntityName.Length > 0 - && string.Compare(examiner.EntityName.Substring(0, 1), "m", StringComparison.InvariantCultureIgnoreCase) > 0) - remainingString = "drink-component-on-examine-is-half-empty"; - - return remainingString; - } } diff --git a/Content.Server/Nutrition/EntitySystems/UtensilSystem.cs b/Content.Server/Nutrition/EntitySystems/UtensilSystem.cs index 0edd0711b67..43087214a45 100644 --- a/Content.Server/Nutrition/EntitySystems/UtensilSystem.cs +++ b/Content.Server/Nutrition/EntitySystems/UtensilSystem.cs @@ -1,12 +1,11 @@ using Content.Shared.Containers.ItemSlots; using Content.Server.Nutrition.Components; -using Content.Shared.Nutrition.Components; -using Content.Shared.Nutrition.EntitySystems; using Content.Server.Popups; using Content.Shared.Interaction; +using Content.Shared.Nutrition.Components; +using Content.Shared.Nutrition.EntitySystems; using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; -using Robust.Shared.Player; using Robust.Shared.Random; namespace Content.Server.Nutrition.EntitySystems @@ -34,10 +33,7 @@ public override void Initialize() /// private void OnAfterInteract(EntityUid uid, UtensilComponent component, AfterInteractEvent ev) { - if (ev.Handled) - return; - - if (ev.Target == null || !ev.CanReach) + if (ev.Handled || ev.Target == null || !ev.CanReach) return; var result = TryUseUtensil(ev.User, ev.Target.Value, component); diff --git a/Content.Server/Pinpointer/NavMapSystem.cs b/Content.Server/Pinpointer/NavMapSystem.cs index 2a5639886ed..34c76a13206 100644 --- a/Content.Server/Pinpointer/NavMapSystem.cs +++ b/Content.Server/Pinpointer/NavMapSystem.cs @@ -1,36 +1,33 @@ -using System.Diagnostics.CodeAnalysis; using Content.Server.Administration.Logs; +using Content.Server.Atmos.Components; +using Content.Server.Atmos.EntitySystems; using Content.Server.Station.Systems; using Content.Server.Warps; using Content.Shared.Database; using Content.Shared.Examine; using Content.Shared.Localizations; +using Content.Shared.Maps; using Content.Shared.Pinpointer; -using Content.Shared.Tag; using JetBrains.Annotations; -using Robust.Server.GameObjects; -using Robust.Shared.GameStates; using Robust.Shared.Map; using Robust.Shared.Map.Components; -using Robust.Shared.Physics; -using Robust.Shared.Physics.Components; +using Robust.Shared.Timing; +using Robust.Shared.Utility; +using System.Diagnostics.CodeAnalysis; namespace Content.Server.Pinpointer; /// /// Handles data to be used for in-grid map displays. /// -public sealed class NavMapSystem : SharedNavMapSystem +public sealed partial class NavMapSystem : SharedNavMapSystem { [Dependency] private readonly IAdminLogManager _adminLog = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; - [Dependency] private readonly TagSystem _tags = default!; - [Dependency] private readonly MapSystem _map = default!; + [Dependency] private readonly SharedMapSystem _mapSystem = default!; + [Dependency] private readonly SharedTransformSystem _transformSystem = default!; [Dependency] private readonly IMapManager _mapManager = default!; - [Dependency] private readonly TransformSystem _transform = default!; - - private EntityQuery _physicsQuery; - private EntityQuery _tagQuery; + [Dependency] private readonly IGameTiming _gameTiming = default!; public const float CloseDistance = 15f; public const float FarDistance = 30f; @@ -39,63 +36,121 @@ public override void Initialize() { base.Initialize(); - _physicsQuery = GetEntityQuery(); - _tagQuery = GetEntityQuery(); - - SubscribeLocalEvent(OnAnchorChange); - SubscribeLocalEvent(OnReAnchor); + // Initialization events SubscribeLocalEvent(OnStationInit); - SubscribeLocalEvent(OnNavMapStartup); - SubscribeLocalEvent(OnGetState); + + // Grid change events SubscribeLocalEvent(OnNavMapSplit); + SubscribeLocalEvent(OnTileChanged); + // Airtight structure change event + SubscribeLocalEvent(OnAirtightChanged); + + // Beacon events SubscribeLocalEvent(OnNavMapBeaconMapInit); - SubscribeLocalEvent(OnNavMapBeaconStartup); SubscribeLocalEvent(OnNavMapBeaconAnchor); - - SubscribeLocalEvent(OnNavMapDoorStartup); - SubscribeLocalEvent(OnNavMapDoorAnchor); - SubscribeLocalEvent(OnConfigureMessage); SubscribeLocalEvent(OnConfigurableMapInit); SubscribeLocalEvent(OnConfigurableExamined); } + #region: Initialization event handling private void OnStationInit(StationGridAddedEvent ev) { var comp = EnsureComp(ev.GridId); RefreshGrid(ev.GridId, comp, Comp(ev.GridId)); } - private void OnNavMapBeaconMapInit(EntityUid uid, NavMapBeaconComponent component, MapInitEvent args) + #endregion + + #region: Grid change event handling + + private void OnNavMapSplit(ref GridSplitEvent args) { - if (component.DefaultText == null || component.Text != null) + if (!TryComp(args.Grid, out NavMapComponent? comp)) return; - component.Text = Loc.GetString(component.DefaultText); - Dirty(uid, component); - RefreshNavGrid(uid); + var gridQuery = GetEntityQuery(); + + foreach (var grid in args.NewGrids) + { + var newComp = EnsureComp(grid); + RefreshGrid(grid, newComp, gridQuery.GetComponent(grid)); + } + + RefreshGrid(args.Grid, comp, gridQuery.GetComponent(args.Grid)); } - private void OnNavMapBeaconStartup(EntityUid uid, NavMapBeaconComponent component, ComponentStartup args) + private void OnTileChanged(ref TileChangedEvent ev) { - RefreshNavGrid(uid); + if (!TryComp(ev.NewTile.GridUid, out var navMap)) + return; + + var tile = ev.NewTile.GridIndices; + var chunkOrigin = SharedMapSystem.GetChunkIndices(tile, ChunkSize); + + if (!navMap.Chunks.TryGetValue((NavMapChunkType.Floor, chunkOrigin), out var chunk)) + chunk = new(chunkOrigin); + + // This could be easily replaced in the future to accommodate diagonal tiles + if (ev.NewTile.IsSpace()) + chunk = UnsetAllEdgesForChunkTile(chunk, tile); + + else + chunk = SetAllEdgesForChunkTile(chunk, tile); + + chunk.LastUpdate = _gameTiming.CurTick; + navMap.Chunks[(NavMapChunkType.Floor, chunkOrigin)] = chunk; + + Dirty(ev.NewTile.GridUid, navMap); } - private void OnNavMapBeaconAnchor(EntityUid uid, NavMapBeaconComponent component, ref AnchorStateChangedEvent args) + private void OnAirtightChanged(ref AirtightChanged ev) { - UpdateBeaconEnabledVisuals((uid, component)); - RefreshNavGrid(uid); + var gridUid = ev.Position.Grid; + + if (!TryComp(gridUid, out var navMap) || + !TryComp(gridUid, out var mapGrid)) + return; + + // Refresh the affected tile + var tile = ev.Position.Tile; + var chunkOrigin = SharedMapSystem.GetChunkIndices(tile, ChunkSize); + + RefreshTileEntityContents(gridUid, navMap, mapGrid, chunkOrigin, tile); + + // Update potentially affected chunks + foreach (var category in EntityChunkTypes) + { + if (!navMap.Chunks.TryGetValue((category, chunkOrigin), out var chunk)) + continue; + + chunk.LastUpdate = _gameTiming.CurTick; + navMap.Chunks[(category, chunkOrigin)] = chunk; + } + + Dirty(gridUid, navMap); } - private void OnNavMapDoorStartup(Entity ent, ref ComponentStartup args) + #endregion + + #region: Beacon event handling + + private void OnNavMapBeaconMapInit(EntityUid uid, NavMapBeaconComponent component, MapInitEvent args) { - RefreshNavGrid(ent); + if (component.DefaultText == null || component.Text != null) + return; + + component.Text = Loc.GetString(component.DefaultText); + Dirty(uid, component); + + UpdateNavMapBeaconData(uid, component); } - private void OnNavMapDoorAnchor(Entity ent, ref AnchorStateChangedEvent args) + private void OnNavMapBeaconAnchor(EntityUid uid, NavMapBeaconComponent component, ref AnchorStateChangedEvent args) { - RefreshNavGrid(ent); + UpdateBeaconEnabledVisuals((uid, component)); + UpdateNavMapBeaconData(uid, component); } private void OnConfigureMessage(Entity ent, ref NavMapBeaconConfigureBuiMessage args) @@ -103,12 +158,12 @@ private void OnConfigureMessage(Entity ent, r if (args.Session.AttachedEntity is not { } user) return; - if (!TryComp(ent, out var navMap)) + if (!TryComp(ent, out var beacon)) return; - if (navMap.Text == args.Text && - navMap.Color == args.Color && - navMap.Enabled == args.Enabled) + if (beacon.Text == args.Text && + beacon.Color == args.Color && + beacon.Enabled == args.Enabled) return; _adminLog.Add(LogType.Action, LogImpact.Medium, @@ -119,12 +174,12 @@ private void OnConfigureMessage(Entity ent, r warpPoint.Location = args.Text; } - navMap.Text = args.Text; - navMap.Color = args.Color; - navMap.Enabled = args.Enabled; - UpdateBeaconEnabledVisuals((ent, navMap)); - Dirty(ent, navMap); - RefreshNavGrid(ent); + beacon.Text = args.Text; + beacon.Color = args.Color; + beacon.Enabled = args.Enabled; + + UpdateBeaconEnabledVisuals((ent, beacon)); + UpdateNavMapBeaconData(ent, beacon); } private void OnConfigurableMapInit(Entity ent, ref MapInitEvent args) @@ -134,9 +189,7 @@ private void OnConfigurableMapInit(Entity ent // We set this on mapinit just in case the text was edited via VV or something. if (TryComp(ent, out var warpPoint)) - { warpPoint.Location = navMap.Text; - } UpdateBeaconEnabledVisuals((ent, navMap)); } @@ -152,231 +205,134 @@ private void OnConfigurableExamined(Entity en ("label", navMap.Text ?? string.Empty))); } - private void UpdateBeaconEnabledVisuals(Entity ent) - { - _appearance.SetData(ent, NavMapBeaconVisuals.Enabled, ent.Comp.Enabled && Transform(ent).Anchored); - } - - /// - /// Refreshes the grid for the corresponding beacon. - /// - /// - private void RefreshNavGrid(EntityUid uid) - { - var xform = Transform(uid); + #endregion - if (!TryComp(xform.GridUid, out var navMap)) - return; - - Dirty(xform.GridUid.Value, navMap); - } + #region: Grid functions - private bool CanBeacon(EntityUid uid, TransformComponent? xform = null) + private void RefreshGrid(EntityUid uid, NavMapComponent component, MapGridComponent mapGrid) { - if (!Resolve(uid, ref xform)) - return false; + // Clear stale data + component.Chunks.Clear(); + component.Beacons.Clear(); - return xform.GridUid != null && xform.Anchored; - } + // Loop over all tiles + var tileRefs = _mapSystem.GetAllTiles(uid, mapGrid); - private void OnNavMapStartup(EntityUid uid, NavMapComponent component, ComponentStartup args) - { - if (!TryComp(uid, out var grid)) - return; + foreach (var tileRef in tileRefs) + { + var tile = tileRef.GridIndices; + var chunkOrigin = SharedMapSystem.GetChunkIndices(tile, ChunkSize); - RefreshGrid(uid, component, grid); - } + if (!component.Chunks.TryGetValue((NavMapChunkType.Floor, chunkOrigin), out var chunk)) + chunk = new(chunkOrigin); - private void OnNavMapSplit(ref GridSplitEvent args) - { - if (!TryComp(args.Grid, out NavMapComponent? comp)) - return; + chunk.LastUpdate = _gameTiming.CurTick; - var gridQuery = GetEntityQuery(); + // Refresh the floor tile + component.Chunks[(NavMapChunkType.Floor, chunkOrigin)] = SetAllEdgesForChunkTile(chunk, tile); - foreach (var grid in args.NewGrids) - { - var newComp = EnsureComp(grid); - RefreshGrid(grid, newComp, gridQuery.GetComponent(grid)); + // Refresh the contents of the tile + RefreshTileEntityContents(uid, component, mapGrid, chunkOrigin, tile); } - RefreshGrid(args.Grid, comp, gridQuery.GetComponent(args.Grid)); + Dirty(uid, component); } - private void RefreshGrid(EntityUid uid, NavMapComponent component, MapGridComponent grid) + private void RefreshTileEntityContents(EntityUid uid, NavMapComponent component, MapGridComponent mapGrid, Vector2i chunkOrigin, Vector2i tile) { - component.Chunks.Clear(); - - var tiles = grid.GetAllTilesEnumerator(); + var relative = SharedMapSystem.GetChunkRelative(tile, ChunkSize); + var flag = (ushort) GetFlag(relative); + var invFlag = (ushort) ~flag; - while (tiles.MoveNext(out var tile)) + // Clear stale data from the tile across all entity associated chunks + foreach (var category in EntityChunkTypes) { - var chunkOrigin = SharedMapSystem.GetChunkIndices(tile.Value.GridIndices, ChunkSize); + if (!component.Chunks.TryGetValue((category, chunkOrigin), out var chunk)) + chunk = new(chunkOrigin); - if (!component.Chunks.TryGetValue(chunkOrigin, out var chunk)) - { - chunk = new NavMapChunk(chunkOrigin); - component.Chunks[chunkOrigin] = chunk; - } + foreach (var (direction, _) in chunk.TileData) + chunk.TileData[direction] &= invFlag; - RefreshTile(uid, grid, component, chunk, tile.Value.GridIndices); + chunk.LastUpdate = _gameTiming.CurTick; + component.Chunks[(category, chunkOrigin)] = chunk; } - } - private void OnGetState(EntityUid uid, NavMapComponent component, ref ComponentGetState args) - { - if (!TryComp(uid, out var mapGrid)) - return; + // Update the tile data based on what entities are still anchored to the tile + var enumerator = _mapSystem.GetAnchoredEntitiesEnumerator(uid, mapGrid, tile); - var data = new Dictionary(component.Chunks.Count); - foreach (var (index, chunk) in component.Chunks) + while (enumerator.MoveNext(out var ent)) { - data.Add(index, chunk.TileData); - } + if (!TryComp(ent, out var entAirtight)) + continue; - var beaconQuery = AllEntityQuery(); - var beacons = new List(); + var category = GetAssociatedEntityChunkType(ent.Value); - while (beaconQuery.MoveNext(out var beaconUid, out var beacon, out var xform)) - { - if (!beacon.Enabled || xform.GridUid != uid || !CanBeacon(beaconUid, xform)) + if (!component.Chunks.TryGetValue((category, chunkOrigin), out var chunk)) continue; - // TODO: Make warp points use metadata name instead. - string? name = beacon.Text; - - if (string.IsNullOrEmpty(name)) + foreach (var (direction, _) in chunk.TileData) { - if (TryComp(beaconUid, out var warpPoint) && warpPoint.Location != null) - { - name = warpPoint.Location; - } - else - { - name = MetaData(beaconUid).EntityName; - } + if ((direction & entAirtight.AirBlockedDirection) > 0) + chunk.TileData[direction] |= flag; } - beacons.Add(new NavMapBeacon(beacon.Color, name, xform.LocalPosition)); + chunk.LastUpdate = _gameTiming.CurTick; + component.Chunks[(category, chunkOrigin)] = chunk; } - var airlockQuery = EntityQueryEnumerator(); - var airlocks = new List(); - while (airlockQuery.MoveNext(out _, out _, out var xform)) + // Remove walls that intersect with doors (unless they can both physically fit on the same tile) + if (component.Chunks.TryGetValue((NavMapChunkType.Wall, chunkOrigin), out var wallChunk) && + component.Chunks.TryGetValue((NavMapChunkType.Airlock, chunkOrigin), out var airlockChunk)) { - if (xform.GridUid != uid || !xform.Anchored) - continue; - - var pos = _map.TileIndicesFor(uid, mapGrid, xform.Coordinates); - var enumerator = _map.GetAnchoredEntitiesEnumerator(uid, mapGrid, pos); - - var wallPresent = false; - while (enumerator.MoveNext(out var ent)) + foreach (var (direction, _) in wallChunk.TileData) { - if (!_physicsQuery.TryGetComponent(ent, out var body) || - !body.CanCollide || - !body.Hard || - body.BodyType != BodyType.Static || - !_tags.HasTag(ent.Value, "Wall", _tagQuery) && - !_tags.HasTag(ent.Value, "Window", _tagQuery)) - { - continue; - } - - wallPresent = true; - break; + var airlockInvFlag = (ushort) ~airlockChunk.TileData[direction]; + wallChunk.TileData[direction] &= airlockInvFlag; } - if (wallPresent) - continue; - - airlocks.Add(new NavMapAirlock(xform.LocalPosition)); + wallChunk.LastUpdate = _gameTiming.CurTick; + component.Chunks[(NavMapChunkType.Wall, chunkOrigin)] = wallChunk; } - - // TODO: Diffs - args.State = new NavMapComponentState() - { - TileData = data, - Beacons = beacons, - Airlocks = airlocks - }; } - private void OnReAnchor(ref ReAnchorEvent ev) - { - if (TryComp(ev.OldGrid, out var oldGrid) && - TryComp(ev.OldGrid, out var navMap)) - { - var chunkOrigin = SharedMapSystem.GetChunkIndices(ev.TilePos, ChunkSize); - - if (navMap.Chunks.TryGetValue(chunkOrigin, out var chunk)) - { - RefreshTile(ev.OldGrid, oldGrid, navMap, chunk, ev.TilePos); - } - } + #endregion - HandleAnchor(ev.Xform); - } + #region: Beacon functions - private void OnAnchorChange(ref AnchorStateChangedEvent ev) + private void UpdateNavMapBeaconData(EntityUid uid, NavMapBeaconComponent component, TransformComponent? xform = null) { - HandleAnchor(ev.Transform); - } - - private void HandleAnchor(TransformComponent xform) - { - if (!TryComp(xform.GridUid, out var navMap) || - !TryComp(xform.GridUid, out var grid)) + if (!Resolve(uid, ref xform)) return; - var tile = grid.LocalToTile(xform.Coordinates); - var chunkOrigin = SharedMapSystem.GetChunkIndices(tile, ChunkSize); - - if (!navMap.Chunks.TryGetValue(chunkOrigin, out var chunk)) - { - chunk = new NavMapChunk(chunkOrigin); - navMap.Chunks[chunkOrigin] = chunk; - } - - RefreshTile(xform.GridUid.Value, grid, navMap, chunk, tile); - } - - private void RefreshTile(EntityUid uid, MapGridComponent grid, NavMapComponent component, NavMapChunk chunk, Vector2i tile) - { - var relative = SharedMapSystem.GetChunkRelative(tile, ChunkSize); - var existing = chunk.TileData; - var flag = GetFlag(relative); + if (xform.GridUid == null) + return; - chunk.TileData &= ~flag; + if (!TryComp(xform.GridUid, out var navMap)) + return; - var enumerator = grid.GetAnchoredEntitiesEnumerator(tile); - // TODO: Use something to get convex poly. + var netEnt = GetNetEntity(uid); + var oldBeacon = navMap.Beacons.FirstOrNull(x => x.NetEnt == netEnt); + var changed = false; - while (enumerator.MoveNext(out var ent)) + if (oldBeacon != null) { - if (!_physicsQuery.TryGetComponent(ent, out var body) || - !body.CanCollide || - !body.Hard || - body.BodyType != BodyType.Static || - !_tags.HasTag(ent.Value, "Wall", _tagQuery) && - !_tags.HasTag(ent.Value, "Window", _tagQuery)) - { - continue; - } - - chunk.TileData |= flag; - break; + navMap.Beacons.Remove(oldBeacon.Value); + changed = true; } - if (chunk.TileData == 0) + if (TryCreateNavMapBeaconData(uid, component, xform, out var beaconData)) { - component.Chunks.Remove(chunk.Origin); + navMap.Beacons.Add(beaconData.Value); + changed = true; } - if (existing == chunk.TileData) - return; + if (changed) + Dirty(xform.GridUid.Value, navMap); + } - Dirty(uid, component); + private void UpdateBeaconEnabledVisuals(Entity ent) + { + _appearance.SetData(ent, NavMapBeaconVisuals.Enabled, ent.Comp.Enabled && Transform(ent).Anchored); } /// @@ -389,9 +345,6 @@ public void SetBeaconEnabled(EntityUid uid, bool enabled, NavMapBeaconComponent? comp.Enabled = enabled; UpdateBeaconEnabledVisuals((uid, comp)); - Dirty(uid, comp); - - RefreshNavGrid(uid); } /// @@ -419,7 +372,7 @@ public bool TryGetNearestBeacon(Entity ent, if (!Resolve(ent, ref ent.Comp)) return false; - return TryGetNearestBeacon(_transform.GetMapCoordinates(ent, ent.Comp), out beacon, out beaconCoords); + return TryGetNearestBeacon(_transformSystem.GetMapCoordinates(ent, ent.Comp), out beacon, out beaconCoords); } /// @@ -446,7 +399,7 @@ public bool TryGetNearestBeacon(MapCoordinates coordinates, if (coordinates.MapId != xform.MapID) continue; - var coords = _transform.GetWorldPosition(xform); + var coords = _transformSystem.GetWorldPosition(xform); var distanceSquared = (coordinates.Position - coords).LengthSquared(); if (!float.IsInfinity(minDistance) && distanceSquared >= minDistance) continue; @@ -465,7 +418,7 @@ public string GetNearestBeaconString(Entity ent) if (!Resolve(ent, ref ent.Comp)) return Loc.GetString("nav-beacon-pos-no-beacons"); - return GetNearestBeaconString(_transform.GetMapCoordinates(ent, ent.Comp)); + return GetNearestBeaconString(_transformSystem.GetMapCoordinates(ent, ent.Comp)); } public string GetNearestBeaconString(MapCoordinates coordinates) @@ -494,11 +447,13 @@ public string GetNearestBeaconString(MapCoordinates coordinates) ? Loc.GetString("nav-beacon-pos-format-direction-mod-far") : string.Empty; - // we can null suppress the text being null because TRyGetNearestVisibleStationBeacon always gives us a beacon with not-null text. + // we can null suppress the text being null because TryGetNearestVisibleStationBeacon always gives us a beacon with not-null text. return Loc.GetString("nav-beacon-pos-format-direction", ("modifier", modifier), ("direction", ContentLocalizationManager.FormatDirection(adjustedDir).ToLowerInvariant()), ("color", beacon.Value.Comp.Color), ("marker", beacon.Value.Comp.Text!)); } + + #endregion } diff --git a/Content.Server/Polymorph/Systems/ChameleonProjectorSystem.cs b/Content.Server/Polymorph/Systems/ChameleonProjectorSystem.cs new file mode 100644 index 00000000000..1586973a21e --- /dev/null +++ b/Content.Server/Polymorph/Systems/ChameleonProjectorSystem.cs @@ -0,0 +1,99 @@ +using Content.Server.Polymorph.Components; +using Content.Shared.Actions; +using Content.Shared.Construction.Components; +using Content.Shared.Hands; +using Content.Shared.Mobs; +using Content.Shared.Mobs.Components; +using Content.Shared.Mobs.Systems; +using Content.Shared.Polymorph; +using Content.Shared.Polymorph.Components; +using Content.Shared.Polymorph.Systems; +using Content.Shared.StatusIcon.Components; +using Robust.Shared.Physics.Components; + +namespace Content.Server.Polymorph.Systems; + +public sealed class ChameleonProjectorSystem : SharedChameleonProjectorSystem +{ + [Dependency] private readonly MetaDataSystem _meta = default!; + [Dependency] private readonly MobThresholdSystem _mobThreshold = default!; + [Dependency] private readonly PolymorphSystem _polymorph = default!; + [Dependency] private readonly SharedActionsSystem _actions = default!; + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + [Dependency] private readonly SharedTransformSystem _xform = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnEquippedHand); + SubscribeLocalEvent(OnToggleNoRot); + SubscribeLocalEvent(OnToggleAnchored); + } + + private void OnEquippedHand(Entity ent, ref GotEquippedHandEvent args) + { + if (!TryComp(ent, out var poly)) + return; + + _polymorph.Revert((ent, poly)); + args.Handled = true; + } + + public override void Disguise(ChameleonProjectorComponent proj, EntityUid user, EntityUid entity) + { + if (_polymorph.PolymorphEntity(user, proj.Polymorph) is not {} disguise) + return; + + // make disguise look real (for simple things at least) + var meta = MetaData(entity); + _meta.SetEntityName(disguise, meta.EntityName); + _meta.SetEntityDescription(disguise, meta.EntityDescription); + + var comp = EnsureComp(disguise); + comp.SourceEntity = entity; + comp.SourceProto = Prototype(entity)?.ID; + Dirty(disguise, comp); + + // no sechud trolling + RemComp(disguise); + + _appearance.CopyData(entity, disguise); + + var mass = CompOrNull(entity)?.Mass ?? 0f; + + // let the disguise die when its taken enough damage, which then transfers to the player + // health is proportional to mass, and capped to not be insane + if (TryComp(disguise, out var thresholds)) + { + // if the player is of flesh and blood, cap max health to theirs + // so that when reverting damage scales 1:1 and not round removing + var playerMax = _mobThreshold.GetThresholdForState(user, MobState.Dead).Float(); + var max = playerMax == 0f ? proj.MaxHealth : Math.Max(proj.MaxHealth, playerMax); + + var health = Math.Clamp(mass, proj.MinHealth, proj.MaxHealth); + _mobThreshold.SetMobStateThreshold(disguise, health, MobState.Critical, thresholds); + _mobThreshold.SetMobStateThreshold(disguise, max, MobState.Dead, thresholds); + } + + // add actions for controlling transform aspects + _actions.AddAction(disguise, proj.NoRotAction); + _actions.AddAction(disguise, proj.AnchorAction); + } + + private void OnToggleNoRot(Entity ent, ref DisguiseToggleNoRotEvent args) + { + var xform = Transform(ent); + xform.NoLocalRotation = !xform.NoLocalRotation; + } + + private void OnToggleAnchored(Entity ent, ref DisguiseToggleAnchoredEvent args) + { + var uid = ent.Owner; + var xform = Transform(uid); + if (xform.Anchored) + _xform.Unanchor(uid, xform); + else + _xform.AnchorEntity((uid, xform)); + } +} diff --git a/Content.Server/Polymorph/Systems/PolymorphSystem.cs b/Content.Server/Polymorph/Systems/PolymorphSystem.cs index b7640ff9843..8cae15d70df 100644 --- a/Content.Server/Polymorph/Systems/PolymorphSystem.cs +++ b/Content.Server/Polymorph/Systems/PolymorphSystem.cs @@ -118,10 +118,12 @@ private void OnMapInit(Entity ent, ref MapInitEvent private void OnPolymorphActionEvent(Entity ent, ref PolymorphActionEvent args) { - if (!_proto.TryIndex(args.ProtoId, out var prototype)) + if (!_proto.TryIndex(args.ProtoId, out var prototype) || args.Handled) return; PolymorphEntity(ent, prototype.Configuration); + + args.Handled = true; } private void OnRevertPolymorphActionEvent(Entity ent, diff --git a/Content.Server/Popups/PopupSystem.cs b/Content.Server/Popups/PopupSystem.cs index 237ca33a4db..d1163a2be1b 100644 --- a/Content.Server/Popups/PopupSystem.cs +++ b/Content.Server/Popups/PopupSystem.cs @@ -126,5 +126,10 @@ public override void PopupPredicted(string? message, EntityUid uid, EntityUid? r RaiseNetworkEvent(new PopupEntityEvent(message, type, GetNetEntity(uid))); } } + + public override void PopupPredicted(string? recipientMessage, string? othersMessage, EntityUid uid, EntityUid? recipient, PopupType type = PopupType.Small) + { + PopupPredicted(othersMessage, uid, recipient, type); + } } } diff --git a/Content.Server/Power/Generation/Teg/TegNodeGroup.cs b/Content.Server/Power/Generation/Teg/TegNodeGroup.cs index ed6b46e304a..3c937f8f71d 100644 --- a/Content.Server/Power/Generation/Teg/TegNodeGroup.cs +++ b/Content.Server/Power/Generation/Teg/TegNodeGroup.cs @@ -66,11 +66,16 @@ public override void Initialize(Node sourceNode, IEntityManager entMan) public override void LoadNodes(List groupNodes) { - DebugTools.Assert(groupNodes.Count <= 3, "The TEG has at most 3 parts"); DebugTools.Assert(_entityManager != null); base.LoadNodes(groupNodes); + if (groupNodes.Count > 3) + { + // Somehow got more TEG parts. Probably shenanigans. Bail. + return; + } + Generator = groupNodes.OfType().SingleOrDefault(); if (Generator != null) { diff --git a/Content.Server/Prayer/PrayerSystem.cs b/Content.Server/Prayer/PrayerSystem.cs index f5051741c03..c8ef368dadf 100644 --- a/Content.Server/Prayer/PrayerSystem.cs +++ b/Content.Server/Prayer/PrayerSystem.cs @@ -39,7 +39,7 @@ private void AddPrayVerb(EntityUid uid, PrayableComponent comp, GetVerbsEvent - [ViewVariables(VVAccess.ReadWrite)] [DataField("damage")] + [DataField] public DamageSpecifier? Damage; - [ViewVariables(VVAccess.ReadWrite)] [DataField("fuelCost")] + [DataField] public int FuelCost = 5; - [ViewVariables(VVAccess.ReadWrite)] [DataField("qualityNeeded", customTypeSerializer:typeof(PrototypeIdSerializer))] - public string QualityNeeded = "Welding"; + [DataField] + public ProtoId QualityNeeded = "Welding"; - [ViewVariables(VVAccess.ReadWrite)] [DataField("doAfterDelay")] + [DataField] public int DoAfterDelay = 1; /// /// A multiplier that will be applied to the above if an entity is repairing themselves. /// - [ViewVariables(VVAccess.ReadWrite)] [DataField("selfRepairPenalty")] + [DataField] public float SelfRepairPenalty = 3f; /// /// Whether or not an entity is allowed to repair itself. /// - [DataField("allowSelfRepair")] + [DataField] public bool AllowSelfRepair = true; } } diff --git a/Content.Server/Repairable/RepairableSystem.cs b/Content.Server/Repairable/RepairableSystem.cs index 5bd580756da..ec24cd81975 100644 --- a/Content.Server/Repairable/RepairableSystem.cs +++ b/Content.Server/Repairable/RepairableSystem.cs @@ -4,7 +4,6 @@ using Content.Shared.Interaction; using Content.Shared.Popups; using Content.Shared.Repairable; -using Content.Shared.Tools; using SharedToolSystem = Content.Shared.Tools.Systems.SharedToolSystem; namespace Content.Server.Repairable @@ -70,7 +69,7 @@ public async void Repair(EntityUid uid, RepairableComponent component, InteractU } // Run the repairing doafter - args.Handled = _toolSystem.UseTool(args.Used, args.User, uid, delay, component.QualityNeeded, new RepairFinishedEvent()); + args.Handled = _toolSystem.UseTool(args.Used, args.User, uid, delay, component.QualityNeeded, new RepairFinishedEvent(), component.FuelCost); } } } diff --git a/Content.Server/RoundEnd/RoundEndSystem.cs b/Content.Server/RoundEnd/RoundEndSystem.cs index 3a8331f3f7a..42783f163bf 100644 --- a/Content.Server/RoundEnd/RoundEndSystem.cs +++ b/Content.Server/RoundEnd/RoundEndSystem.cs @@ -145,11 +145,15 @@ public void RequestRoundEnd(EntityUid? requester = null, bool checkCooldown = tr public void RequestRoundEnd(TimeSpan countdownTime, EntityUid? requester = null, bool checkCooldown = true, string text = "round-end-system-shuttle-called-announcement", string name = "Station") { - if (_gameTicker.RunLevel != GameRunLevel.InRound) return; + if (_gameTicker.RunLevel != GameRunLevel.InRound) + return; - if (checkCooldown && _cooldownTokenSource != null) return; + if (checkCooldown && _cooldownTokenSource != null) + return; + + if (_countdownTokenSource != null) + return; - if (_countdownTokenSource != null) return; _countdownTokenSource = new(); if (requester != null) @@ -188,6 +192,8 @@ public void RequestRoundEnd(TimeSpan countdownTime, EntityUid? requester = null, LastCountdownStart = _gameTiming.CurTime; ExpectedCountdownEnd = _gameTiming.CurTime + countdownTime; + + // TODO full game saves Timer.Spawn(countdownTime, _shuttle.CallEmergencyShuttle, _countdownTokenSource.Token); ActivateCooldown(); @@ -333,6 +339,8 @@ private void ActivateCooldown() { _cooldownTokenSource?.Cancel(); _cooldownTokenSource = new(); + + // TODO full game saves Timer.Spawn(DefaultCooldownDuration, () => { _cooldownTokenSource.Cancel(); diff --git a/Content.Server/Salvage/SalvageSystem.Expeditions.cs b/Content.Server/Salvage/SalvageSystem.Expeditions.cs index 839730ec873..4d5d569dabd 100644 --- a/Content.Server/Salvage/SalvageSystem.Expeditions.cs +++ b/Content.Server/Salvage/SalvageSystem.Expeditions.cs @@ -164,6 +164,7 @@ private void SpawnMission(SalvageMissionParams missionParams, EntityUid station, _dungeon, _metaData, _transform, + _mapSystem, station, coordinatesDisk, missionParams, diff --git a/Content.Server/Salvage/SalvageSystem.cs b/Content.Server/Salvage/SalvageSystem.cs index 9af4736345e..eb5719c892f 100644 --- a/Content.Server/Salvage/SalvageSystem.cs +++ b/Content.Server/Salvage/SalvageSystem.cs @@ -40,7 +40,6 @@ public sealed partial class SalvageSystem : SharedSalvageSystem { [Dependency] private readonly IChatManager _chat = default!; [Dependency] private readonly IConfigurationManager _configurationManager = default!; - [Dependency] private readonly IEntityManager _entManager = default!; [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly ILogManager _logManager = default!; [Dependency] private readonly IMapManager _mapManager = default!; @@ -56,6 +55,7 @@ public sealed partial class SalvageSystem : SharedSalvageSystem [Dependency] private readonly RadioSystem _radioSystem = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; + [Dependency] private readonly SharedMapSystem _mapSystem = default!; [Dependency] private readonly ShuttleSystem _shuttle = default!; [Dependency] private readonly ShuttleConsoleSystem _shuttleConsoles = default!; [Dependency] private readonly StationSystem _station = default!; diff --git a/Content.Server/Salvage/SpawnSalvageMissionJob.cs b/Content.Server/Salvage/SpawnSalvageMissionJob.cs index 180c8d145cf..47123e97845 100644 --- a/Content.Server/Salvage/SpawnSalvageMissionJob.cs +++ b/Content.Server/Salvage/SpawnSalvageMissionJob.cs @@ -50,6 +50,7 @@ public sealed class SpawnSalvageMissionJob : Job private readonly DungeonSystem _dungeon; private readonly MetaDataSystem _metaData; private readonly SharedTransformSystem _xforms; + private readonly SharedMapSystem _map; public readonly EntityUid Station; public readonly EntityUid? CoordinatesDisk; @@ -69,6 +70,7 @@ public SpawnSalvageMissionJob( DungeonSystem dungeon, MetaDataSystem metaData, SharedTransformSystem xform, + SharedMapSystem map, EntityUid station, EntityUid? coordinatesDisk, SalvageMissionParams missionParams, @@ -83,6 +85,7 @@ public SpawnSalvageMissionJob( _dungeon = dungeon; _metaData = metaData; _xforms = xform; + _map = map; Station = station; CoordinatesDisk = coordinatesDisk; _missionParams = missionParams; @@ -95,9 +98,7 @@ public SpawnSalvageMissionJob( protected override async Task Process() { _sawmill.Debug("salvage", $"Spawning salvage mission with seed {_missionParams.Seed}"); - var mapId = _mapManager.CreateMap(); - var mapUid = _mapManager.GetMapEntityId(mapId); - _mapManager.AddUninitializedMap(mapId); + var mapUid = _map.CreateMap(out var mapId, runMapInit: false); MetaDataComponent? metadata = null; var grid = _entManager.EnsureComponent(mapUid); var random = new Random(_missionParams.Seed); diff --git a/Content.Server/Shuttles/Components/FTLComponent.cs b/Content.Server/Shuttles/Components/FTLComponent.cs index ab40875e29a..c9b84064234 100644 --- a/Content.Server/Shuttles/Components/FTLComponent.cs +++ b/Content.Server/Shuttles/Components/FTLComponent.cs @@ -14,6 +14,8 @@ namespace Content.Server.Shuttles.Components; [RegisterComponent] public sealed partial class FTLComponent : Component { + // TODO Full game save / add datafields + [ViewVariables] public FTLState State = FTLState.Available; @@ -23,6 +25,7 @@ public sealed partial class FTLComponent : Component [ViewVariables(VVAccess.ReadWrite)] public float StartupTime = 0f; + // Because of sphagetti, actual travel time is Math.Max(TravelTime, DefaultArrivalTime) [ViewVariables(VVAccess.ReadWrite)] public float TravelTime = 0f; diff --git a/Content.Server/Shuttles/Components/StationEmergencyShuttleComponent.cs b/Content.Server/Shuttles/Components/StationEmergencyShuttleComponent.cs index bdfdcb273aa..58d23ee4326 100644 --- a/Content.Server/Shuttles/Components/StationEmergencyShuttleComponent.cs +++ b/Content.Server/Shuttles/Components/StationEmergencyShuttleComponent.cs @@ -13,7 +13,7 @@ public sealed partial class StationEmergencyShuttleComponent : Component /// /// The emergency shuttle assigned to this station. /// - [ViewVariables, Access(typeof(ShuttleSystem), typeof(EmergencyShuttleSystem), Friend = AccessPermissions.ReadWrite)] + [DataField, Access(typeof(ShuttleSystem), typeof(EmergencyShuttleSystem), Friend = AccessPermissions.ReadWrite)] public EntityUid? EmergencyShuttle; /// diff --git a/Content.Server/Shuttles/Systems/ArrivalsSystem.cs b/Content.Server/Shuttles/Systems/ArrivalsSystem.cs index ae742cf1f9e..12df965f45a 100644 --- a/Content.Server/Shuttles/Systems/ArrivalsSystem.cs +++ b/Content.Server/Shuttles/Systems/ArrivalsSystem.cs @@ -10,6 +10,7 @@ using Content.Server.Shuttles.Events; using Content.Server.Spawners.Components; using Content.Server.Station.Components; +using Content.Server.Station.Events; using Content.Server.Station.Systems; using Content.Shared.Administration; using Content.Shared.CCVar; @@ -77,7 +78,7 @@ public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnArrivalsStartup); + SubscribeLocalEvent(OnStationPostInit); SubscribeLocalEvent(OnShuttleStartup); SubscribeLocalEvent(OnShuttleTag); @@ -530,7 +531,7 @@ private void SetArrivals(bool obj) } } - private void OnArrivalsStartup(EntityUid uid, StationArrivalsComponent component, ComponentStartup args) + private void OnStationPostInit(EntityUid uid, StationArrivalsComponent component, ref StationPostInitEvent args) { if (!Enabled) return; diff --git a/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.Console.cs b/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.Console.cs index aeb2ebdbba1..803aa963f39 100644 --- a/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.Console.cs +++ b/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.Console.cs @@ -19,6 +19,8 @@ namespace Content.Server.Shuttles.Systems; +// TODO full game saves +// Move state data into the emergency shuttle component public sealed partial class EmergencyShuttleSystem { /* @@ -55,7 +57,7 @@ public sealed partial class EmergencyShuttleSystem /// /// How long it will take for the emergency shuttle to arrive at CentComm. /// - public float TransitTime { get; private set; } + public float TransitTime; /// /// @@ -132,6 +134,14 @@ private void UpdateEmergencyConsole(float frameTime) var minTime = -(TransitTime - (ShuttleSystem.DefaultStartupTime + ShuttleSystem.DefaultTravelTime + 1f)); // TODO: I know this is shit but I already just cleaned up a billion things. + + // This is very cursed spaghetti code. I don't even know what the fuck this is doing or why it exists. + // But I think it needs to be less than or equal to zero or the shuttle might never leave??? + // TODO Shuttle AAAAAAAAAAAAAAAAAAAAAAAAA + // Clean this up, just have a single timer with some state system. + // I.e., dont infer state from the current interval that the accumulator is in??? + minTime = Math.Min(0, minTime); // ???? + if (_consoleAccumulator < minTime) { return; diff --git a/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.cs b/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.cs index c043861b377..f0256aa15b9 100644 --- a/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.cs +++ b/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.cs @@ -15,6 +15,7 @@ using Content.Server.Shuttles.Components; using Content.Server.Shuttles.Events; using Content.Server.Station.Components; +using Content.Server.Station.Events; using Content.Server.Station.Systems; using Content.Shared.Access.Systems; using Content.Shared.CCVar; @@ -82,9 +83,9 @@ public override void Initialize() SubscribeLocalEvent(OnRoundStart); SubscribeLocalEvent(OnRoundCleanup); - SubscribeLocalEvent(OnStationStartup); + SubscribeLocalEvent(OnStationStartup); SubscribeLocalEvent(OnCentcommShutdown); - SubscribeLocalEvent(OnCentcommInit); + SubscribeLocalEvent(OnStationInit); SubscribeLocalEvent(OnEmergencyFTL); SubscribeLocalEvent(OnEmergencyFTLComplete); @@ -258,10 +259,13 @@ private void OnEmergencyFTLComplete(EntityUid uid, EmergencyShuttleComponent com /// public void CallEmergencyShuttle(EntityUid stationUid, StationEmergencyShuttleComponent? stationShuttle = null) { - if (!Resolve(stationUid, ref stationShuttle) || - !TryComp(stationShuttle.EmergencyShuttle, out var xform) || + if (!Resolve(stationUid, ref stationShuttle)) + return; + + if (!TryComp(stationShuttle.EmergencyShuttle, out var xform) || !TryComp(stationShuttle.EmergencyShuttle, out var shuttle)) { + Log.Error($"Attempted to call an emergency shuttle for an uninitialized station? Station: {ToPrettyString(stationUid)}. Shuttle: {ToPrettyString(stationShuttle.EmergencyShuttle)}"); return; } @@ -319,8 +323,10 @@ public void CallEmergencyShuttle(EntityUid stationUid, StationEmergencyShuttleCo } } - private void OnCentcommInit(EntityUid uid, StationCentcommComponent component, ComponentInit args) + private void OnStationInit(EntityUid uid, StationCentcommComponent component, MapInitEvent args) { + // This is handled on map-init, so that centcomm has finished initializing by the time the StationPostInitEvent + // gets raised if (!_emergencyShuttleEnabled) return; @@ -331,12 +337,12 @@ private void OnCentcommInit(EntityUid uid, StationCentcommComponent component, C return; } - AddCentcomm(component); + AddCentcomm(uid, component); } - private void OnStationStartup(EntityUid uid, StationEmergencyShuttleComponent component, ComponentStartup args) + private void OnStationStartup(Entity ent, ref StationPostInitEvent args) { - AddEmergencyShuttle(uid, component); + AddEmergencyShuttle((ent, ent)); } /// @@ -373,19 +379,22 @@ private void SetupEmergencyShuttle() var centcommQuery = AllEntityQuery(); - while (centcommQuery.MoveNext(out var centcomm)) + while (centcommQuery.MoveNext(out var uid, out var centcomm)) { - AddCentcomm(centcomm); + AddCentcomm(uid, centcomm); } var query = AllEntityQuery(); while (query.MoveNext(out var uid, out var comp)) - AddEmergencyShuttle(uid, comp); + { + AddEmergencyShuttle((uid, comp)); + } } - private void AddCentcomm(StationCentcommComponent component) + private void AddCentcomm(EntityUid station, StationCentcommComponent component) { + DebugTools.Assert(LifeStage(station)>= EntityLifeStage.MapInitialized); if (component.MapEntity != null || component.Entity != null) { Log.Warning("Attempted to re-add an existing centcomm map."); @@ -401,12 +410,13 @@ private void AddCentcomm(StationCentcommComponent component) if (!Exists(otherComp.MapEntity) || !Exists(otherComp.Entity)) { - Log.Error($"Disconvered invalid centcomm component?"); + Log.Error($"Discovered invalid centcomm component?"); ClearCentcomm(otherComp); continue; } component.MapEntity = otherComp.MapEntity; + component.Entity = otherComp.Entity; component.ShuttleIndex = otherComp.ShuttleIndex; return; } @@ -450,6 +460,7 @@ private void AddCentcomm(StationCentcommComponent component) component.MapEntity = map; component.Entity = grid; _shuttle.TryAddFTLDestination(mapId, false, out _); + Log.Info($"Created centcomm grid {ToPrettyString(grid)} on map {ToPrettyString(map)} for station {ToPrettyString(station)}"); } public HashSet GetCentcommMaps() @@ -466,49 +477,67 @@ public HashSet GetCentcommMaps() return maps; } - private void AddEmergencyShuttle(EntityUid uid, StationEmergencyShuttleComponent component) + private void AddEmergencyShuttle(Entity ent) { - if (!_emergencyShuttleEnabled - || component.EmergencyShuttle != null || - !TryComp(uid, out var centcomm) - || !TryComp(centcomm.MapEntity, out MapComponent? map)) + if (!Resolve(ent.Owner, ref ent.Comp1, ref ent.Comp2)) + return; + + if (!_emergencyShuttleEnabled) + return; + + if (ent.Comp1.EmergencyShuttle != null ) + { + if (Exists(ent.Comp1.EmergencyShuttle)) + { + Log.Error($"Attempted to add an emergency shuttle to {ToPrettyString(ent)}, despite a shuttle already existing?"); + return; + } + + Log.Error($"Encountered deleted emergency shuttle during initialization of {ToPrettyString(ent)}"); + ent.Comp1.EmergencyShuttle = null; + } + + if (!TryComp(ent.Comp2.MapEntity, out MapComponent? map)) { + Log.Error($"Failed to add emergency shuttle - centcomm has not been initialized? {ToPrettyString(ent)}"); return; } // Load escape shuttle - var shuttlePath = component.EmergencyShuttlePath; + var shuttlePath = ent.Comp1.EmergencyShuttlePath; var shuttle = _map.LoadGrid(map.MapId, shuttlePath.ToString(), new MapLoadOptions() { // Should be far enough... right? I'm too lazy to bounds check CentCom rn. - Offset = new Vector2(500f + centcomm.ShuttleIndex, 0f), + Offset = new Vector2(500f + ent.Comp2.ShuttleIndex, 0f), // fun fact: if you just fucking yeet centcomm into nullspace anytime you try to spawn the shuttle, then any distance is far enough. so lets not do that LoadMap = false, }); if (shuttle == null) { - Log.Error($"Unable to spawn emergency shuttle {shuttlePath} for {ToPrettyString(uid)}"); + Log.Error($"Unable to spawn emergency shuttle {shuttlePath} for {ToPrettyString(ent)}"); return; } - centcomm.ShuttleIndex += Comp(shuttle.Value).LocalAABB.Width + ShuttleSpawnBuffer; + ent.Comp2.ShuttleIndex += Comp(shuttle.Value).LocalAABB.Width + ShuttleSpawnBuffer; // Update indices for all centcomm comps pointing to same map var query = AllEntityQuery(); while (query.MoveNext(out var comp)) { - if (comp == centcomm || comp.MapEntity != centcomm.MapEntity) + if (comp == ent.Comp2 || comp.MapEntity != ent.Comp2.MapEntity) continue; - comp.ShuttleIndex = centcomm.ShuttleIndex; + comp.ShuttleIndex = ent.Comp2.ShuttleIndex; } - component.EmergencyShuttle = shuttle; + ent.Comp1.EmergencyShuttle = shuttle; EnsureComp(shuttle.Value); EnsureComp(shuttle.Value); EnsureComp(shuttle.Value); + + Log.Info($"Added emergency shuttle {ToPrettyString(shuttle)} for station {ToPrettyString(ent)} and centcomm {ToPrettyString(ent.Comp2.Entity)}"); } /// diff --git a/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs b/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs index 51288691039..a3cc2fde9b8 100644 --- a/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs +++ b/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs @@ -6,6 +6,7 @@ using Content.Server.Station.Events; using Content.Shared.Body.Components; using Content.Shared.Buckle.Components; +using Content.Shared.Database; using Content.Shared.Ghost; using Content.Shared.Maps; using Content.Shared.Parallax; @@ -40,6 +41,10 @@ public sealed partial class ShuttleSystem public const float FTLMassLimit = 300f; // I'm too lazy to make CVars. + // >:( + // Confusingly, some of them already are cvars? + // I.e., shuttle transit time??? + // TODO Shuttle: fix spaghetti private readonly SoundSpecifier _startupSound = new SoundPathSpecifier("/Audio/Effects/Shuttle/hyperspace_begin.ogg") { @@ -863,6 +868,8 @@ private void Smimsh(EntityUid uid, FixturesComponent? manager = null, MapGridCom if (_bodyQuery.TryGetComponent(ent, out var mob)) { + _logger.Add(LogType.Gib, LogImpact.Extreme, $"{ToPrettyString(ent):player} got gibbed by the shuttle" + + $" {ToPrettyString(uid)} arriving from FTL at {xform.Coordinates:coordinates}"); var gibs = _bobby.GibBody(ent, body: mob); _immuneEnts.UnionWith(gibs); continue; diff --git a/Content.Server/Shuttles/Systems/ShuttleSystem.cs b/Content.Server/Shuttles/Systems/ShuttleSystem.cs index 6dc25e8d766..6fe2324d51e 100644 --- a/Content.Server/Shuttles/Systems/ShuttleSystem.cs +++ b/Content.Server/Shuttles/Systems/ShuttleSystem.cs @@ -1,3 +1,4 @@ +using Content.Server.Administration.Logs; using Content.Server.Body.Systems; using Content.Server.Doors.Systems; using Content.Server.Parallax; @@ -48,6 +49,7 @@ public sealed partial class ShuttleSystem : SharedShuttleSystem [Dependency] private readonly ThrowingSystem _throwing = default!; [Dependency] private readonly ThrusterSystem _thruster = default!; [Dependency] private readonly UserInterfaceSystem _uiSystem = default!; + [Dependency] private readonly IAdminLogManager _logger = default!; public const float TileMassMultiplier = 0.5f; diff --git a/Content.Server/Singularity/EntitySystems/RadiationCollectorSystem.cs b/Content.Server/Singularity/EntitySystems/RadiationCollectorSystem.cs index b26ab301c64..9107ff2e32e 100644 --- a/Content.Server/Singularity/EntitySystems/RadiationCollectorSystem.cs +++ b/Content.Server/Singularity/EntitySystems/RadiationCollectorSystem.cs @@ -151,7 +151,8 @@ private void OnAnalyzed(EntityUid uid, RadiationCollectorComponent component, Ga if (!TryGetLoadedGasTank(uid, out var gasTankComponent)) return; - args.GasMixtures = new Dictionary { { Name(uid), gasTankComponent.Air } }; + args.GasMixtures ??= new List<(string, GasMixture?)>(); + args.GasMixtures.Add((Name(uid), gasTankComponent.Air)); } public void ToggleCollector(EntityUid uid, EntityUid? user = null, RadiationCollectorComponent? component = null) diff --git a/Content.Server/Sound/EmitSoundSystem.cs b/Content.Server/Sound/EmitSoundSystem.cs index 5b9620990eb..fc10d951e76 100644 --- a/Content.Server/Sound/EmitSoundSystem.cs +++ b/Content.Server/Sound/EmitSoundSystem.cs @@ -40,7 +40,6 @@ public override void Initialize() SubscribeLocalEvent(HandleEmitSoundOnTrigger); SubscribeLocalEvent(HandleEmitSoundOnUIOpen); - SubscribeLocalEvent(HandleSpamEmitSoundMapInit); } diff --git a/Content.Server/Speech/EntitySystems/AddAccentClothingSystem.cs b/Content.Server/Speech/EntitySystems/AddAccentClothingSystem.cs index 1f707c2249c..897cd061f42 100644 --- a/Content.Server/Speech/EntitySystems/AddAccentClothingSystem.cs +++ b/Content.Server/Speech/EntitySystems/AddAccentClothingSystem.cs @@ -1,6 +1,5 @@ using Content.Server.Speech.Components; -using Content.Shared.Clothing.Components; -using Content.Shared.Inventory.Events; +using Content.Shared.Clothing; namespace Content.Server.Speech.EntitySystems; @@ -11,29 +10,20 @@ public sealed class AddAccentClothingSystem : EntitySystem public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnGotEquipped); - SubscribeLocalEvent(OnGotUnequipped); + SubscribeLocalEvent(OnGotEquipped); + SubscribeLocalEvent(OnGotUnequipped); } - private void OnGotEquipped(EntityUid uid, AddAccentClothingComponent component, GotEquippedEvent args) + private void OnGotEquipped(EntityUid uid, AddAccentClothingComponent component, ref ClothingGotEquippedEvent args) { - if (!TryComp(uid, out ClothingComponent? clothing)) - return; - - // check if entity was actually used as clothing - // not just taken in pockets or something - var isCorrectSlot = clothing.Slots.HasFlag(args.SlotFlags); - if (!isCorrectSlot) - return; - // does the user already has this accent? var componentType = _componentFactory.GetRegistration(component.Accent).Type; - if (HasComp(args.Equipee, componentType)) + if (HasComp(args.Wearer, componentType)) return; // add accent to the user var accentComponent = (Component) _componentFactory.GetComponent(componentType); - AddComp(args.Equipee, accentComponent); + AddComp(args.Wearer, accentComponent); // snowflake case for replacement accent if (accentComponent is ReplacementAccentComponent rep) @@ -42,16 +32,16 @@ private void OnGotEquipped(EntityUid uid, AddAccentClothingComponent component, component.IsActive = true; } - private void OnGotUnequipped(EntityUid uid, AddAccentClothingComponent component, GotUnequippedEvent args) + private void OnGotUnequipped(EntityUid uid, AddAccentClothingComponent component, ref ClothingGotUnequippedEvent args) { if (!component.IsActive) return; // try to remove accent var componentType = _componentFactory.GetRegistration(component.Accent).Type; - if (EntityManager.HasComponent(args.Equipee, componentType)) + if (EntityManager.HasComponent(args.Wearer, componentType)) { - EntityManager.RemoveComponent(args.Equipee, componentType); + EntityManager.RemoveComponent(args.Wearer, componentType); } component.IsActive = false; diff --git a/Content.Server/Speech/EntitySystems/MobsterAccentSystem.cs b/Content.Server/Speech/EntitySystems/MobsterAccentSystem.cs index 4229bbe3d1e..f026664b383 100644 --- a/Content.Server/Speech/EntitySystems/MobsterAccentSystem.cs +++ b/Content.Server/Speech/EntitySystems/MobsterAccentSystem.cs @@ -1,4 +1,5 @@ -using System.Globalization; +using System.Globalization; +using System.Linq; using System.Text.RegularExpressions; using Content.Server.Speech.Components; using Robust.Shared.Random; @@ -78,20 +79,30 @@ public string Accentuate(string message, MobsterAccentComponent component) // thinking -> thinkin' // king -> king - msg = Regex.Replace(msg, @"(?<=\w\w)ing(?!\w)", "in'", RegexOptions.IgnoreCase); + //Uses captures groups to make sure the captialization of IN is kept + msg = Regex.Replace(msg, @"(?<=\w\w)(in)g(?!\w)", "$1'", RegexOptions.IgnoreCase); // or -> uh and ar -> ah in the middle of words (fuhget, tahget) - msg = Regex.Replace(msg, @"(?<=\w)or(?=\w)", "uh", RegexOptions.IgnoreCase); - msg = Regex.Replace(msg, @"(?<=\w)ar(?=\w)", "ah", RegexOptions.IgnoreCase); + msg = Regex.Replace(msg, @"(?<=\w)o[Rr](?=\w)", "uh"); + msg = Regex.Replace(msg, @"(?<=\w)O[Rr](?=\w)", "UH"); + msg = Regex.Replace(msg, @"(?<=\w)a[Rr](?=\w)", "ah"); + msg = Regex.Replace(msg, @"(?<=\w)A[Rr](?=\w)", "AH"); // Prefix if (_random.Prob(0.15f)) { + //Checks if the first word of the sentence is all caps + //So the prefix can be allcapped and to not resanitize the captial + var firstWordAllCaps = !Regex.Match(msg, @"^(\S+)").Value.Any(char.IsLower); var pick = _random.Next(1, 2); // Reverse sanitize capital - msg = msg[0].ToString().ToLower() + msg.Remove(0, 1); - msg = Loc.GetString($"accent-mobster-prefix-{pick}") + " " + msg; + var prefix = Loc.GetString($"accent-mobster-prefix-{pick}"); + if (!firstWordAllCaps) + msg = msg[0].ToString().ToLower() + msg.Remove(0, 1); + else + prefix = prefix.ToUpper(); + msg = prefix + " " + msg; } // Sanitize capital again, in case we substituted a word that should be capitalized @@ -100,16 +111,23 @@ public string Accentuate(string message, MobsterAccentComponent component) // Suffixes if (_random.Prob(0.4f)) { + //Checks if the last word of the sentence is all caps + //So the suffix can be allcapped + var lastWordAllCaps = !Regex.Match(msg, @"(\S+)$").Value.Any(char.IsLower); + var suffix = ""; if (component.IsBoss) { var pick = _random.Next(1, 4); - msg += Loc.GetString($"accent-mobster-suffix-boss-{pick}"); + suffix = Loc.GetString($"accent-mobster-suffix-boss-{pick}"); } else { var pick = _random.Next(1, 3); - msg += Loc.GetString($"accent-mobster-suffix-minion-{pick}"); + suffix = Loc.GetString($"accent-mobster-suffix-minion-{pick}"); } + if (lastWordAllCaps) + suffix = suffix.ToUpper(); + msg += suffix; } return msg; diff --git a/Content.Server/Speech/EntitySystems/PirateAccentSystem.cs b/Content.Server/Speech/EntitySystems/PirateAccentSystem.cs index f1d64ede101..9f5f8080b9b 100644 --- a/Content.Server/Speech/EntitySystems/PirateAccentSystem.cs +++ b/Content.Server/Speech/EntitySystems/PirateAccentSystem.cs @@ -1,3 +1,4 @@ +using System.Linq; using Content.Server.Speech.Components; using Robust.Shared.Random; using System.Text.RegularExpressions; @@ -19,17 +20,22 @@ public override void Initialize() // converts left word when typed into the right word. For example typing you becomes ye. public string Accentuate(string message, PirateAccentComponent component) { - var msg = message; - - msg = _replacement.ApplyReplacements(msg, "pirate"); + var msg = _replacement.ApplyReplacements(message, "pirate"); if (!_random.Prob(component.YarrChance)) return msg; + //Checks if the first word of the sentence is all caps + //So the prefix can be allcapped and to not resanitize the captial + var firstWordAllCaps = !Regex.Match(msg, @"^(\S+)").Value.Any(char.IsLower); var pick = _random.Pick(component.PirateWords); + var pirateWord = Loc.GetString(pick); // Reverse sanitize capital - msg = msg[0].ToString().ToLower() + msg.Remove(0, 1); - msg = Loc.GetString(pick) + " " + msg; + if (!firstWordAllCaps) + msg = msg[0].ToString().ToLower() + msg.Remove(0, 1); + else + pirateWord = pirateWord.ToUpper(); + msg = pirateWord + " " + msg; return msg; } diff --git a/Content.Server/Station/Components/StationBiomeComponent.cs b/Content.Server/Station/Components/StationBiomeComponent.cs new file mode 100644 index 00000000000..38800579a93 --- /dev/null +++ b/Content.Server/Station/Components/StationBiomeComponent.cs @@ -0,0 +1,19 @@ +using Content.Server.Station.Systems; +using Content.Shared.Parallax.Biomes; +using Robust.Shared.Prototypes; + +namespace Content.Server.Station.Components; + +/// +/// Runs EnsurePlanet against the largest grid on Mapinit. +/// +[RegisterComponent, Access(typeof(StationBiomeSystem))] +public sealed partial class StationBiomeComponent : Component +{ + [DataField(required: true)] + public ProtoId Biome = "Grasslands"; + + // If null, its random + [DataField] + public int? Seed = null; +} diff --git a/Content.Server/Station/Components/StationRandomTransformComponent.cs b/Content.Server/Station/Components/StationRandomTransformComponent.cs new file mode 100644 index 00000000000..ea0fc5f2696 --- /dev/null +++ b/Content.Server/Station/Components/StationRandomTransformComponent.cs @@ -0,0 +1,16 @@ +using Content.Server.Station.Systems; + +namespace Content.Server.Station.Components; + +/// +/// Stores station parameters that can be randomized by the roundstart +/// +[RegisterComponent, Access(typeof(StationSystem))] +public sealed partial class StationRandomTransformComponent : Component +{ + [DataField] + public float? MaxStationOffset = 100.0f; + + [DataField] + public bool EnableStationRotation = true; +} diff --git a/Content.Server/Station/Events/StationPostInitEvent.cs b/Content.Server/Station/Events/StationPostInitEvent.cs index 4f7927cee52..54b8eeeb312 100644 --- a/Content.Server/Station/Events/StationPostInitEvent.cs +++ b/Content.Server/Station/Events/StationPostInitEvent.cs @@ -4,6 +4,8 @@ namespace Content.Server.Station.Events; /// /// Raised directed on a station after it has been initialized, as well as broadcast. +/// This gets raised after the entity has been map-initialized, and the station's centcomm map/entity (if any) has been +/// set up. /// [ByRefEvent] public readonly record struct StationPostInitEvent(Entity Station); diff --git a/Content.Server/Station/Systems/StationBiomeSystem.cs b/Content.Server/Station/Systems/StationBiomeSystem.cs new file mode 100644 index 00000000000..821745fc4d7 --- /dev/null +++ b/Content.Server/Station/Systems/StationBiomeSystem.cs @@ -0,0 +1,35 @@ +using Content.Server.Parallax; +using Content.Server.Station.Components; +using Content.Server.Station.Events; +using Content.Server.Station.Systems; +using Robust.Shared.Map; +using Robust.Shared.Prototypes; + +namespace Content.Server.Station.Systems; +public sealed partial class StationBiomeSystem : EntitySystem +{ + [Dependency] private readonly BiomeSystem _biome = default!; + [Dependency] private readonly IMapManager _mapManager = default!; + [Dependency] private readonly IPrototypeManager _proto = default!; + [Dependency] private readonly StationSystem _station = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnStationPostInit); + } + + private void OnStationPostInit(Entity map, ref StationPostInitEvent args) + { + if (!TryComp(map, out StationDataComponent? dataComp)) + return; + + var station = _station.GetLargestGrid(dataComp); + if (station == null) return; + + var mapId = Transform(station.Value).MapID; + var mapUid = _mapManager.GetMapEntityId(mapId); + + _biome.EnsurePlanet(mapUid, _proto.Index(map.Comp.Biome), map.Comp.Seed); + } +} diff --git a/Content.Server/Station/Systems/StationSystem.cs b/Content.Server/Station/Systems/StationSystem.cs index 492f15c8e2b..2fa2671b196 100644 --- a/Content.Server/Station/Systems/StationSystem.cs +++ b/Content.Server/Station/Systems/StationSystem.cs @@ -1,9 +1,10 @@ using System.Linq; +using System.Numerics; using Content.Server.Chat.Systems; using Content.Server.GameTicking; using Content.Server.Station.Components; using Content.Server.Station.Events; -using Content.Shared.CCVar; +using Content.Shared.Fax; using Content.Shared.Station; using JetBrains.Annotations; using Robust.Server.GameObjects; @@ -49,17 +50,12 @@ public override void Initialize() _sawmill = _logManager.GetSawmill("station"); SubscribeLocalEvent(OnRoundEnd); - SubscribeLocalEvent(OnPreGameMapLoad); SubscribeLocalEvent(OnPostGameMapLoad); SubscribeLocalEvent(OnStationAdd); SubscribeLocalEvent(OnStationDeleted); SubscribeLocalEvent(OnStationGridDeleted); SubscribeLocalEvent(OnStationSplitEvent); - Subs.CVar(_configurationManager, CCVars.StationOffset, x => _randomStationOffset = x, true); - Subs.CVar(_configurationManager, CCVars.MaxStationOffset, x => _maxRandomStationOffset = x, true); - Subs.CVar(_configurationManager, CCVars.StationRotation, x => _randomStationRotation = x, true); - _player.PlayerStatusChanged += OnPlayerStatusChanged; } @@ -112,43 +108,16 @@ private void OnStationDeleted(EntityUid uid, StationDataComponent component, Com RaiseNetworkEvent(new StationsUpdatedEvent(GetStationNames()), Filter.Broadcast()); } - private void OnPreGameMapLoad(PreGameMapLoad ev) - { - // this is only for maps loaded during round setup! - if (_gameTicker.RunLevel == GameRunLevel.InRound) - return; - - if (_randomStationOffset) - ev.Options.Offset += _random.NextVector2(_maxRandomStationOffset); - - if (_randomStationRotation) - ev.Options.Rotation = _random.NextAngle(); - } - private void OnPostGameMapLoad(PostGameMapLoad ev) { var dict = new Dictionary>(); - void AddGrid(string station, EntityUid grid) - { - if (dict.ContainsKey(station)) - { - dict[station].Add(grid); - } - else - { - dict[station] = new List {grid}; - } - } - // Iterate over all BecomesStation foreach (var grid in ev.Grids) { // We still setup the grid - if (!TryComp(grid, out var becomesStation)) - continue; - - AddGrid(becomesStation.Id, grid); + if (TryComp(grid, out var becomesStation)) + dict.GetOrNew(becomesStation.Id).Add(grid); } if (!dict.Any()) @@ -319,11 +288,51 @@ public EntityUid InitializeNewStation(StationConfig stationConfig, IEnumerable(station); name ??= MetaData(station).EntityName; - foreach (var grid in gridIds ?? Array.Empty()) + var entry = gridIds ?? Array.Empty(); + + foreach (var grid in entry) { AddGridToStation(station, grid, null, data, name); } + if (TryComp(station, out var random)) + { + Angle? rotation = null; + Vector2? offset = null; + + if (random.MaxStationOffset != null) + offset = _random.NextVector2(-random.MaxStationOffset.Value, random.MaxStationOffset.Value); + + if (random.EnableStationRotation) + rotation = _random.NextAngle(); + + foreach (var grid in entry) + { + //planetary maps give an error when trying to change from position or rotation. + //This is still the case, but it will be irrelevant after the https://github.com/space-wizards/space-station-14/pull/26510 + if (rotation != null && offset != null) + { + var pos = _transform.GetWorldPosition(grid); + _transform.SetWorldPositionRotation(grid, pos + offset.Value, rotation.Value); + continue; + } + if (rotation != null) + { + _transform.SetWorldRotation(grid, rotation.Value); + continue; + } + if (offset != null) + { + var pos = _transform.GetWorldPosition(grid); + _transform.SetWorldPosition(grid, pos + offset.Value); + continue; + } + } + } + + if (LifeStage(station) < EntityLifeStage.MapInitialized) + throw new Exception($"Station must be man-initialized"); + var ev = new StationPostInitEvent((station, data)); RaiseLocalEvent(station, ref ev, true); diff --git a/Content.Server/StationEvents/Events/CargoGiftsRule.cs b/Content.Server/StationEvents/Events/CargoGiftsRule.cs index c174cc48c09..194786fca7a 100644 --- a/Content.Server/StationEvents/Events/CargoGiftsRule.cs +++ b/Content.Server/StationEvents/Events/CargoGiftsRule.cs @@ -1,4 +1,4 @@ -using System.Linq; +using System.Linq; using Content.Server.Cargo.Components; using Content.Server.Cargo.Systems; using Content.Server.GameTicking; @@ -62,6 +62,7 @@ protected override void ActiveTick(EntityUid uid, CargoGiftsRuleComponent compon if (!_cargoSystem.AddAndApproveOrder( station!.Value, product.Product, + product.Name, product.Cost, qty, Loc.GetString(component.Sender), diff --git a/Content.Server/Storage/EntitySystems/StorageSystem.Fill.cs b/Content.Server/Storage/EntitySystems/StorageSystem.Fill.cs index 10278cc8051..768491f9876 100644 --- a/Content.Server/Storage/EntitySystems/StorageSystem.Fill.cs +++ b/Content.Server/Storage/EntitySystems/StorageSystem.Fill.cs @@ -65,12 +65,23 @@ private void FillStorage(Entity entity var sortedItems = items .OrderByDescending(x => ItemSystem.GetItemShape(x.Comp).GetArea()); + ClearCantFillReasons(); foreach (var ent in sortedItems) { if (Insert(uid, ent, out _, out var reason, storageComp: storage, playSound: false)) continue; + if (CantFillReasons.Count > 0) + { + var reasons = string.Join(", ", CantFillReasons.Select(s => Loc.GetString(s))); + if (reason == null) + reason = reasons; + else + reason += $", {reasons}"; + } + Log.Error($"Tried to StorageFill {ToPrettyString(ent)} inside {ToPrettyString(uid)} but can't. reason: {reason}"); + ClearCantFillReasons(); Del(ent); } } diff --git a/Content.Server/Storage/EntitySystems/StorageSystem.cs b/Content.Server/Storage/EntitySystems/StorageSystem.cs index 0f5efda74de..27694ee61c4 100644 --- a/Content.Server/Storage/EntitySystems/StorageSystem.cs +++ b/Content.Server/Storage/EntitySystems/StorageSystem.cs @@ -3,8 +3,6 @@ using Content.Shared.Explosion; using Content.Shared.Ghost; using Content.Shared.Hands; -using Content.Shared.Input; -using Content.Shared.Inventory; using Content.Shared.Lock; using Content.Shared.Storage; using Content.Shared.Storage.Components; @@ -13,7 +11,6 @@ using Content.Shared.Verbs; using Robust.Server.GameObjects; using Robust.Shared.Audio.Systems; -using Robust.Shared.Input.Binding; using Robust.Shared.Map; using Robust.Shared.Player; using Robust.Shared.Prototypes; @@ -25,7 +22,6 @@ public sealed partial class StorageSystem : SharedStorageSystem { [Dependency] private readonly IAdminManager _admin = default!; [Dependency] private readonly IPrototypeManager _prototype = default!; - [Dependency] private readonly InventorySystem _inventory = default!; [Dependency] private readonly UserInterfaceSystem _uiSystem = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly UseDelaySystem _useDelay = default!; @@ -41,11 +37,6 @@ public override void Initialize() SubscribeLocalEvent(OnExploded); SubscribeLocalEvent(OnStorageFillMapInit); - - CommandBinds.Builder - .Bind(ContentKeyFunctions.OpenBackpack, InputCmdHandler.FromDelegate(HandleOpenBackpack)) - .Bind(ContentKeyFunctions.OpenBelt, InputCmdHandler.FromDelegate(HandleOpenBelt)) - .Register(); } private void AddUiVerb(EntityUid uid, StorageComponent component, GetVerbsEvent args) @@ -180,31 +171,4 @@ public void CloseNestedInterfaces(EntityUid uid, ICommonSession session, Storage } } } - - private void HandleOpenBackpack(ICommonSession? session) - { - HandleOpenSlotUI(session, "back"); - } - - private void HandleOpenBelt(ICommonSession? session) - { - HandleOpenSlotUI(session, "belt"); - } - - private void HandleOpenSlotUI(ICommonSession? session, string slot) - { - if (session is not { } playerSession) - return; - - if (playerSession.AttachedEntity is not {Valid: true} playerEnt || !Exists(playerEnt)) - return; - - if (!_inventory.TryGetSlotEntity(playerEnt, slot, out var storageEnt)) - return; - - if (!ActionBlocker.CanInteract(playerEnt, storageEnt)) - return; - - OpenStorageUI(storageEnt.Value, playerEnt); - } } diff --git a/Content.Server/Store/Systems/StoreSystem.Ui.cs b/Content.Server/Store/Systems/StoreSystem.Ui.cs index e6c4eb0ccea..25f64ba4b64 100644 --- a/Content.Server/Store/Systems/StoreSystem.Ui.cs +++ b/Content.Server/Store/Systems/StoreSystem.Ui.cs @@ -5,7 +5,6 @@ using Content.Server.Stack; using Content.Server.Store.Components; using Content.Shared.Actions; -using Content.Shared.Administration.Logs; using Content.Shared.Database; using Content.Shared.FixedPoint; using Content.Shared.Hands.EntitySystems; @@ -99,13 +98,13 @@ public void UpdateUserInterface(EntityUid? user, EntityUid store, StoreComponent } //dictionary for all currencies, including 0 values for currencies on the whitelist - Dictionary allCurrency = new(); + Dictionary, FixedPoint2> allCurrency = new(); foreach (var supported in component.CurrencyWhitelist) { allCurrency.Add(supported, FixedPoint2.Zero); - if (component.Balance.ContainsKey(supported)) - allCurrency[supported] = component.Balance[supported]; + if (component.Balance.TryGetValue(supported, out var value)) + allCurrency[supported] = value; } // TODO: if multiple users are supposed to be able to interact with a single BUI & see different diff --git a/Content.Server/Strip/StrippableSystem.cs b/Content.Server/Strip/StrippableSystem.cs index d28744fe4a8..9447dec4172 100644 --- a/Content.Server/Strip/StrippableSystem.cs +++ b/Content.Server/Strip/StrippableSystem.cs @@ -1,3 +1,4 @@ +using System.Linq; using Content.Server.Administration.Logs; using Content.Server.Ensnaring; using Content.Shared.CombatMode; @@ -20,7 +21,6 @@ using Robust.Server.GameObjects; using Robust.Shared.Player; using Robust.Shared.Utility; -using System.Linq; namespace Content.Server.Strip { @@ -111,7 +111,7 @@ public override void StartOpeningStripper(EntityUid user, Entity(user, out var mode) && mode.IsInCombatMode && !openInCombat) return; - if (TryComp(user, out var actor)) + if (TryComp(user, out var actor) && HasComp(user)) { if (_userInterfaceSystem.SessionHasOpenUi(strippable, StrippingUiKey.Key, actor.PlayerSession)) return; diff --git a/Content.Server/Tools/Components/WelderComponent.cs b/Content.Server/Tools/Components/WelderComponent.cs deleted file mode 100644 index b0db2c58e88..00000000000 --- a/Content.Server/Tools/Components/WelderComponent.cs +++ /dev/null @@ -1,56 +0,0 @@ -using Content.Shared.Chemistry.Components; -using Content.Shared.Chemistry.Reagent; -using Content.Shared.FixedPoint; -using Content.Shared.Tools.Components; -using Robust.Shared.Audio; -using Robust.Shared.Prototypes; - -namespace Content.Server.Tools.Components -{ - [RegisterComponent] - public sealed partial class WelderComponent : SharedWelderComponent - { - /// - /// Name of . - /// - [DataField("fuelSolution"), ViewVariables(VVAccess.ReadWrite)] - public string FuelSolutionName = "Welder"; - - /// - /// Solution on the entity that contains the fuel. - /// - [DataField("fuelSolutionRef")] - public Entity? FuelSolution = null; - - /// - /// Reagent that will be used as fuel for welding. - /// - [DataField, ViewVariables(VVAccess.ReadWrite)] - public ProtoId FuelReagent = "WeldingFuel"; - - /// - /// Fuel consumption per second while the welder is active. - /// - [DataField, ViewVariables(VVAccess.ReadWrite)] - public FixedPoint2 FuelConsumption = FixedPoint2.New(2.0f); - - /// - /// A fuel amount to be consumed when the welder goes from being unlit to being lit. - /// - [DataField, ViewVariables(VVAccess.ReadWrite)] - public FixedPoint2 FuelLitCost = FixedPoint2.New(0.5f); - - /// - /// Sound played when refilling the welder. - /// - [DataField] - public SoundSpecifier WelderRefill = new SoundPathSpecifier("/Audio/Effects/refill.ogg"); - - /// - /// Whether the item is safe to refill while lit without exploding the tank. - /// - [DataField] - public bool TankSafe = false; //I have no idea what I'm doing - - } -} diff --git a/Content.Server/Tools/ToolSystem.Welder.cs b/Content.Server/Tools/ToolSystem.Welder.cs deleted file mode 100644 index 727526b3989..00000000000 --- a/Content.Server/Tools/ToolSystem.Welder.cs +++ /dev/null @@ -1,211 +0,0 @@ -using Content.Server.Chemistry.Components; -using Content.Server.IgnitionSource; -using Content.Server.Tools.Components; -using Content.Shared.Chemistry.Components.SolutionManager; -using Content.Shared.Database; -using Content.Shared.DoAfter; -using Content.Shared.Examine; -using Content.Shared.FixedPoint; -using Content.Shared.Interaction; -using Content.Shared.Item.ItemToggle; -using Content.Shared.Tools.Components; -using Robust.Shared.GameStates; -using System.Linq; -using Content.Shared.Item.ItemToggle.Components; - -namespace Content.Server.Tools -{ - public sealed partial class ToolSystem - { - [Dependency] private readonly SharedItemToggleSystem _itemToggle = default!; - [Dependency] private readonly IgnitionSourceSystem _ignitionSource = default!; - private readonly HashSet _activeWelders = new(); - - private const float WelderUpdateTimer = 1f; - private float _welderTimer; - - public void InitializeWelders() - { - SubscribeLocalEvent(OnWelderExamine); - SubscribeLocalEvent(OnWelderAfterInteract); - SubscribeLocalEvent>(OnWelderToolUseAttempt); - SubscribeLocalEvent(OnWelderShutdown); - SubscribeLocalEvent(OnWelderGetState); - SubscribeLocalEvent(OnToggle); - SubscribeLocalEvent(OnActivateAttempt); - } - - public (FixedPoint2 fuel, FixedPoint2 capacity) GetWelderFuelAndCapacity(EntityUid uid, WelderComponent? welder = null, SolutionContainerManagerComponent? solutionContainer = null) - { - if (!Resolve(uid, ref welder, ref solutionContainer) - || !_solutionContainer.ResolveSolution((uid, solutionContainer), welder.FuelSolutionName, ref welder.FuelSolution, out var fuelSolution)) - return (FixedPoint2.Zero, FixedPoint2.Zero); - - return (fuelSolution.GetTotalPrototypeQuantity(welder.FuelReagent), fuelSolution.MaxVolume); - } - - private void OnToggle(Entity entity, ref ItemToggledEvent args) - { - if (args.Activated) - TurnOn(entity, args.User); - else - TurnOff(entity, args.User); - } - - private void OnActivateAttempt(Entity entity, ref ItemToggleActivateAttemptEvent args) - { - if (!_solutionContainer.ResolveSolution(entity.Owner, entity.Comp.FuelSolutionName, ref entity.Comp.FuelSolution, out var solution)) - { - args.Cancelled = true; - args.Popup = Loc.GetString("welder-component-no-fuel-message"); - return; - } - - var fuel = solution.GetTotalPrototypeQuantity(entity.Comp.FuelReagent); - if (fuel == FixedPoint2.Zero || fuel < entity.Comp.FuelLitCost) - { - args.Popup = Loc.GetString("welder-component-no-fuel-message"); - args.Cancelled = true; - } - } - - public void TurnOn(Entity entity, EntityUid? user) - { - if (!_solutionContainer.ResolveSolution(entity.Owner, entity.Comp.FuelSolutionName, ref entity.Comp.FuelSolution)) - return; - - _solutionContainer.RemoveReagent(entity.Comp.FuelSolution.Value, entity.Comp.FuelReagent, entity.Comp.FuelLitCost); - AdminLogger.Add(LogType.InteractActivate, LogImpact.Low, - $"{ToPrettyString(user):user} toggled {ToPrettyString(entity.Owner):welder} on"); - - var xform = Transform(entity); - if (xform.GridUid is { } gridUid) - { - var position = _transformSystem.GetGridOrMapTilePosition(entity.Owner, xform); - _atmosphereSystem.HotspotExpose(gridUid, position, 700, 50, entity.Owner, true); - } - - _activeWelders.Add(entity); - } - - public void TurnOff(Entity entity, EntityUid? user) - { - AdminLogger.Add(LogType.InteractActivate, LogImpact.Low, - $"{ToPrettyString(user):user} toggled {ToPrettyString(entity.Owner):welder} off"); - _activeWelders.Remove(entity); - } - - private void OnWelderExamine(Entity entity, ref ExaminedEvent args) - { - using (args.PushGroup(nameof(WelderComponent))) - { - if (_itemToggle.IsActivated(entity.Owner)) - { - args.PushMarkup(Loc.GetString("welder-component-on-examine-welder-lit-message")); - } - else - { - args.PushMarkup(Loc.GetString("welder-component-on-examine-welder-not-lit-message")); - } - - if (args.IsInDetailsRange) - { - var (fuel, capacity) = GetWelderFuelAndCapacity(entity.Owner, entity.Comp); - - args.PushMarkup(Loc.GetString("welder-component-on-examine-detailed-message", - ("colorName", fuel < capacity / FixedPoint2.New(4f) ? "darkorange" : "orange"), - ("fuelLeft", fuel), - ("fuelCapacity", capacity), - ("status", string.Empty))); // Lit status is handled above - } - } - } - - private void OnWelderAfterInteract(Entity entity, ref AfterInteractEvent args) - { - if (args.Handled) - return; - - if (args.Target is not { Valid: true } target || !args.CanReach) - return; - - if (TryComp(target, out ReagentTankComponent? tank) - && tank.TankType == ReagentTankType.Fuel - && _solutionContainer.TryGetDrainableSolution(target, out var targetSoln, out var targetSolution) - && _solutionContainer.ResolveSolution(entity.Owner, entity.Comp.FuelSolutionName, ref entity.Comp.FuelSolution, out var welderSolution)) - { - var trans = FixedPoint2.Min(welderSolution.AvailableVolume, targetSolution.Volume); - if (trans > 0) - { - var drained = _solutionContainer.Drain(target, targetSoln.Value, trans); - _solutionContainer.TryAddSolution(entity.Comp.FuelSolution.Value, drained); - _audio.PlayPvs(entity.Comp.WelderRefill, entity); - _popup.PopupEntity(Loc.GetString("welder-component-after-interact-refueled-message"), entity, args.User); - } - else if (welderSolution.AvailableVolume <= 0) - { - _popup.PopupEntity(Loc.GetString("welder-component-already-full"), entity, args.User); - } - else - { - _popup.PopupEntity(Loc.GetString("welder-component-no-fuel-in-tank", ("owner", args.Target)), entity, args.User); - } - - args.Handled = true; - } - } - - private void OnWelderToolUseAttempt(Entity entity, ref DoAfterAttemptEvent args) - { - var user = args.DoAfter.Args.User; - - if (!_itemToggle.IsActivated(entity.Owner)) - { - _popup.PopupEntity(Loc.GetString("welder-component-welder-not-lit-message"), entity, user); - args.Cancel(); - } - } - - private void OnWelderShutdown(Entity entity, ref ComponentShutdown args) - { - _activeWelders.Remove(entity); - } - - private void OnWelderGetState(Entity entity, ref ComponentGetState args) - { - var (fuel, capacity) = GetWelderFuelAndCapacity(entity.Owner, entity.Comp); - args.State = new WelderComponentState(capacity.Float(), fuel.Float()); - } - - private void UpdateWelders(float frameTime) - { - _welderTimer += frameTime; - - if (_welderTimer < WelderUpdateTimer) - return; - - // TODO Serialization. _activeWelders is not serialized. - // Need to use some "active" component, and EntityQuery over that. - // Probably best to generalize it to a "ToggleableFuelDrain" component. - foreach (var tool in _activeWelders.ToArray()) - { - if (!TryComp(tool, out WelderComponent? welder) - || !TryComp(tool, out SolutionContainerManagerComponent? solutionContainer)) - continue; - - if (!_solutionContainer.ResolveSolution((tool, solutionContainer), welder.FuelSolutionName, ref welder.FuelSolution, out var solution)) - continue; - - _solutionContainer.RemoveReagent(welder.FuelSolution.Value, welder.FuelReagent, welder.FuelConsumption * _welderTimer); - - if (solution.GetTotalPrototypeQuantity(welder.FuelReagent) <= FixedPoint2.Zero) - { - _itemToggle.Toggle(tool, predicted: false); - } - - Dirty(tool, welder); - } - _welderTimer -= WelderUpdateTimer; - } - } -} diff --git a/Content.Server/Tools/ToolSystem.cs b/Content.Server/Tools/ToolSystem.cs index 7bae1778923..7738a6398fa 100644 --- a/Content.Server/Tools/ToolSystem.cs +++ b/Content.Server/Tools/ToolSystem.cs @@ -1,40 +1,63 @@ using Content.Server.Atmos.EntitySystems; -using Content.Server.Chemistry.Containers.EntitySystems; -using Content.Server.Popups; -using Content.Server.Tools.Components; +using Content.Shared.Chemistry.Components.SolutionManager; +using Content.Shared.FixedPoint; +using Content.Shared.Tools.Components; using Robust.Server.GameObjects; -using Robust.Shared.Audio.Systems; using SharedToolSystem = Content.Shared.Tools.Systems.SharedToolSystem; -namespace Content.Server.Tools +namespace Content.Server.Tools; + +public sealed class ToolSystem : SharedToolSystem { - // TODO move tool system to shared, and make it a friend of Tool Component. - public sealed partial class ToolSystem : SharedToolSystem - { - [Dependency] private readonly AtmosphereSystem _atmosphereSystem = default!; - [Dependency] private readonly PopupSystem _popup = default!; - [Dependency] private readonly SharedAudioSystem _audio = default!; - [Dependency] private readonly SolutionContainerSystem _solutionContainer = default!; - [Dependency] private readonly TransformSystem _transformSystem = default!; + [Dependency] private readonly AtmosphereSystem _atmosphereSystem = default!; + [Dependency] private readonly TransformSystem _transformSystem = default!; - public override void Initialize() + public override void TurnOn(Entity entity, EntityUid? user) + { + base.TurnOn(entity, user); + var xform = Transform(entity); + if (xform.GridUid is { } gridUid) { - base.Initialize(); - - InitializeWelders(); + var position = _transformSystem.GetGridOrMapTilePosition(entity.Owner, xform); + _atmosphereSystem.HotspotExpose(gridUid, position, 700, 50, entity.Owner, true); } + } - public override void Update(float frameTime) - { - base.Update(frameTime); + public override void Update(float frameTime) + { + base.Update(frameTime); - UpdateWelders(frameTime); - } + UpdateWelders(frameTime); + } - protected override bool IsWelder(EntityUid uid) + //todo move to shared once you can remove reagents from shared without it freaking out. + private void UpdateWelders(float frameTime) + { + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var welder, out var solutionContainer)) { - return HasComp(uid); + if (!welder.Enabled) + continue; + + welder.WelderTimer += frameTime; + + if (welder.WelderTimer < welder.WelderUpdateTimer) + continue; + + if (!SolutionContainerSystem.TryGetSolution((uid, solutionContainer), welder.FuelSolutionName, out var solutionComp, out var solution)) + continue; + + SolutionContainerSystem.RemoveReagent(solutionComp.Value, welder.FuelReagent, welder.FuelConsumption * welder.WelderTimer); + + if (solution.GetTotalPrototypeQuantity(welder.FuelReagent) <= FixedPoint2.Zero) + { + ItemToggle.Toggle(uid, predicted: false); + } + + Dirty(uid, welder); + welder.WelderTimer -= welder.WelderUpdateTimer; } } } + diff --git a/Content.Server/UserInterface/ActivatableUISystem.cs b/Content.Server/UserInterface/ActivatableUISystem.cs index e3a11af4295..5f2314df90b 100644 --- a/Content.Server/UserInterface/ActivatableUISystem.cs +++ b/Content.Server/UserInterface/ActivatableUISystem.cs @@ -93,6 +93,9 @@ private void OnActivate(EntityUid uid, ActivatableUIComponent component, Activat if (component.InHandsOnly) return; + if (component.AllowedItems != null) + return; + args.Handled = InteractUI(args.User, uid, component); } @@ -104,6 +107,9 @@ private void OnUseInHand(EntityUid uid, ActivatableUIComponent component, UseInH if (component.RightClickOnly) return; + if (component.AllowedItems != null) + return; + args.Handled = InteractUI(args.User, uid, component); } diff --git a/Content.Server/VoiceMask/VoiceMaskSystem.Equip.cs b/Content.Server/VoiceMask/VoiceMaskSystem.Equip.cs index bd0c40f26a1..b97c47ceefc 100644 --- a/Content.Server/VoiceMask/VoiceMaskSystem.Equip.cs +++ b/Content.Server/VoiceMask/VoiceMaskSystem.Equip.cs @@ -1,6 +1,6 @@ using Content.Server.Actions; +using Content.Shared.Clothing; using Content.Shared.Inventory; -using Content.Shared.Inventory.Events; namespace Content.Server.VoiceMask; @@ -12,13 +12,9 @@ public sealed partial class VoiceMaskSystem private const string MaskSlot = "mask"; - private void OnEquip(EntityUid uid, VoiceMaskerComponent component, GotEquippedEvent args) + private void OnEquip(EntityUid uid, VoiceMaskerComponent component, ClothingGotEquippedEvent args) { - var user = args.Equipee; - // have to be wearing the mask to use it, duh. - if (!_inventory.TryGetSlotEntity(user, MaskSlot, out var maskEntity) || maskEntity != uid) - return; - + var user = args.Wearer; var comp = EnsureComp(user); comp.VoiceName = component.LastSetName; comp.SpeechVerb = component.LastSpeechVerb; @@ -26,9 +22,9 @@ private void OnEquip(EntityUid uid, VoiceMaskerComponent component, GotEquippedE _actions.AddAction(user, ref component.ActionEntity, component.Action, uid); } - private void OnUnequip(EntityUid uid, VoiceMaskerComponent compnent, GotUnequippedEvent args) + private void OnUnequip(EntityUid uid, VoiceMaskerComponent compnent, ClothingGotUnequippedEvent args) { - RemComp(args.Equipee); + RemComp(args.Wearer); } private VoiceMaskerComponent? TryGetMask(EntityUid user) diff --git a/Content.Server/VoiceMask/VoiceMaskSystem.cs b/Content.Server/VoiceMask/VoiceMaskSystem.cs index 19ed156a0b4..aec6f3a2e2a 100644 --- a/Content.Server/VoiceMask/VoiceMaskSystem.cs +++ b/Content.Server/VoiceMask/VoiceMaskSystem.cs @@ -3,7 +3,6 @@ using Content.Server.Popups; using Content.Shared.Clothing; using Content.Shared.Database; -using Content.Shared.Inventory.Events; using Content.Shared.Popups; using Content.Shared.Preferences; using Content.Shared.Speech; @@ -27,8 +26,8 @@ public override void Initialize() SubscribeLocalEvent(OnChangeName); SubscribeLocalEvent(OnChangeVerb); SubscribeLocalEvent(OnMaskToggled); - SubscribeLocalEvent(OnEquip); - SubscribeLocalEvent(OnUnequip); + SubscribeLocalEvent(OnEquip); + SubscribeLocalEvent(OnUnequip); SubscribeLocalEvent(OnSetName); // SubscribeLocalEvent>(GetVerbs); } diff --git a/Content.Server/Worldgen/Prototypes/NoiseChannelPrototype.cs b/Content.Server/Worldgen/Prototypes/NoiseChannelPrototype.cs index 67da4c4df18..02ca383d300 100644 --- a/Content.Server/Worldgen/Prototypes/NoiseChannelPrototype.cs +++ b/Content.Server/Worldgen/Prototypes/NoiseChannelPrototype.cs @@ -80,7 +80,7 @@ public class NoiseChannelConfig } [Prototype("noiseChannel")] -public sealed class NoiseChannelPrototype : NoiseChannelConfig, IPrototype, IInheritingPrototype +public sealed partial class NoiseChannelPrototype : NoiseChannelConfig, IPrototype, IInheritingPrototype { /// [ParentDataField(typeof(AbstractPrototypeIdArraySerializer))] diff --git a/Content.Server/Xenoarchaeology/Equipment/Components/TraversalDistorterComponent.cs b/Content.Server/Xenoarchaeology/Equipment/Components/TraversalDistorterComponent.cs index ec16083c538..fe95114f737 100644 --- a/Content.Server/Xenoarchaeology/Equipment/Components/TraversalDistorterComponent.cs +++ b/Content.Server/Xenoarchaeology/Equipment/Components/TraversalDistorterComponent.cs @@ -8,7 +8,7 @@ public sealed partial class TraversalDistorterComponent : Component { [ViewVariables(VVAccess.ReadWrite)] - public BiasDirection BiasDirection = BiasDirection.In; + public BiasDirection BiasDirection = BiasDirection.Up; public TimeSpan NextActivation = default!; public TimeSpan ActivationDelay = TimeSpan.FromSeconds(1); @@ -16,6 +16,6 @@ public sealed partial class TraversalDistorterComponent : Component public enum BiasDirection : byte { - In, //down the tree, towards depth 0 - Out //up the tree, away from depth 0 + Up, //Towards depth 0 + Down, //Away from depth 0 } diff --git a/Content.Server/Xenoarchaeology/Equipment/Systems/ArtifactAnalyzerSystem.cs b/Content.Server/Xenoarchaeology/Equipment/Systems/ArtifactAnalyzerSystem.cs index 27caebef808..caf3081204c 100644 --- a/Content.Server/Xenoarchaeology/Equipment/Systems/ArtifactAnalyzerSystem.cs +++ b/Content.Server/Xenoarchaeology/Equipment/Systems/ArtifactAnalyzerSystem.cs @@ -42,6 +42,7 @@ public sealed class ArtifactAnalyzerSystem : EntitySystem [Dependency] private readonly ResearchSystem _research = default!; [Dependency] private readonly MetaDataSystem _metaSystem = default!; [Dependency] private readonly GlimmerSystem _glimmerSystem = default!; //Nyano - Summary: pulls in the glimmer system. + [Dependency] private readonly TraversalDistorterSystem _traversalDistorter = default!; /// public override void Initialize() @@ -63,6 +64,7 @@ public override void Initialize() SubscribeLocalEvent(OnScanButton); SubscribeLocalEvent(OnPrintButton); SubscribeLocalEvent(OnExtractButton); + SubscribeLocalEvent(OnBiasButton); SubscribeLocalEvent((e, c, _) => UpdateUserInterface(e, c), after: new[] { typeof(ResearchSystem) }); @@ -194,6 +196,7 @@ private void UpdateUserInterface(EntityUid uid, AnalysisConsoleComponent? compon var canScan = false; var canPrint = false; var points = 0; + if (TryComp(component.AnalyzerEntity, out var analyzer)) { artifact = analyzer.LastAnalyzedArtifact; @@ -207,15 +210,20 @@ private void UpdateUserInterface(EntityUid uid, AnalysisConsoleComponent? compon if (GetArtifactForAnalysis(component.AnalyzerEntity, placer) is { } current) points = _artifact.GetResearchPointValue(current); } + var analyzerConnected = component.AnalyzerEntity != null; var serverConnected = TryComp(uid, out var client) && client.ConnectedToServer; var scanning = TryComp(component.AnalyzerEntity, out var active); var paused = active != null ? active.AnalysisPaused : false; + var biasDirection = BiasDirection.Up; - var state = new AnalysisConsoleScanUpdateState(GetNetEntity(artifact), analyzerConnected, serverConnected, - canScan, canPrint, msg, scanning, paused, active?.StartTime, active?.AccumulatedRunTime, totalTime, points); + if (TryComp(component.AnalyzerEntity, out var trav)) + biasDirection = trav.BiasDirection; + + var state = new AnalysisConsoleUpdateState(GetNetEntity(artifact), analyzerConnected, serverConnected, + canScan, canPrint, msg, scanning, paused, active?.StartTime, active?.AccumulatedRunTime, totalTime, points, biasDirection == BiasDirection.Down); var bui = _ui.GetUi(uid, ArtifactAnalzyerUiKey.Key); _ui.SetUiState(bui, state); @@ -382,6 +390,20 @@ private void OnExtractButton(EntityUid uid, AnalysisConsoleComponent component, UpdateUserInterface(uid, component); } + private void OnBiasButton(EntityUid uid, AnalysisConsoleComponent component, AnalysisConsoleBiasButtonPressedMessage args) + { + if (component.AnalyzerEntity == null) + return; + + if (!TryComp(component.AnalyzerEntity, out var trav)) + return; + + if (!_traversalDistorter.SetState(component.AnalyzerEntity.Value, trav, args.IsDown)) + return; + + UpdateUserInterface(uid, component); + } + /// /// Cancels scans if the artifact changes nodes (is activated) during the scan. /// diff --git a/Content.Server/Xenoarchaeology/Equipment/Systems/TraversalDistorterSystem.cs b/Content.Server/Xenoarchaeology/Equipment/Systems/TraversalDistorterSystem.cs index 230e639af49..2092f79f05b 100644 --- a/Content.Server/Xenoarchaeology/Equipment/Systems/TraversalDistorterSystem.cs +++ b/Content.Server/Xenoarchaeology/Equipment/Systems/TraversalDistorterSystem.cs @@ -17,8 +17,6 @@ public sealed class TraversalDistorterSystem : EntitySystem public override void Initialize() { SubscribeLocalEvent(OnInit); - - SubscribeLocalEvent(OnInteract); SubscribeLocalEvent(OnExamine); SubscribeLocalEvent(OnItemPlaced); @@ -30,30 +28,25 @@ private void OnInit(EntityUid uid, TraversalDistorterComponent component, MapIni component.NextActivation = _timing.CurTime; } - private void OnInteract(EntityUid uid, TraversalDistorterComponent component, ActivateInWorldEvent args) + /// + /// Switches the state of the traversal distorter between up and down. + /// + /// The distorter's entity + /// The component on the entity + /// If the distorter changed state + public bool SetState(EntityUid uid, TraversalDistorterComponent component, bool isDown) { - if (args.Handled || !this.IsPowered(uid, EntityManager)) - return; + if (!this.IsPowered(uid, EntityManager)) + return false; + if (_timing.CurTime < component.NextActivation) - return; - args.Handled = true; + return false; + component.NextActivation = _timing.CurTime + component.ActivationDelay; - component.BiasDirection = component.BiasDirection == BiasDirection.In - ? BiasDirection.Out - : BiasDirection.In; + component.BiasDirection = isDown ? BiasDirection.Down : BiasDirection.Up; - var toPopup = string.Empty; - switch (component.BiasDirection) - { - case BiasDirection.In: - toPopup = Loc.GetString("traversal-distorter-set-in"); - break; - case BiasDirection.Out: - toPopup = Loc.GetString("traversal-distorter-set-out"); - break; - } - _popup.PopupEntity(toPopup, uid); + return true; } private void OnExamine(EntityUid uid, TraversalDistorterComponent component, ExaminedEvent args) @@ -61,11 +54,11 @@ private void OnExamine(EntityUid uid, TraversalDistorterComponent component, Exa string examine = string.Empty; switch (component.BiasDirection) { - case BiasDirection.In: - examine = Loc.GetString("traversal-distorter-desc-in"); + case BiasDirection.Up: + examine = Loc.GetString("traversal-distorter-desc-up"); break; - case BiasDirection.Out: - examine = Loc.GetString("traversal-distorter-desc-out"); + case BiasDirection.Down: + examine = Loc.GetString("traversal-distorter-desc-down"); break; } diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.Nodes.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.Nodes.cs index 647f31a8953..895bb0217b3 100644 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.Nodes.cs +++ b/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.Nodes.cs @@ -19,26 +19,46 @@ public sealed partial class ArtifactSystem /// /// /// - /// The amount of nodes it has. - private void GenerateArtifactNodeTree(EntityUid artifact, ref List allNodes, int nodeAmount) + /// The amount of nodes it has. + private void GenerateArtifactNodeTree(EntityUid artifact, List allNodes, int nodesToCreate) { - if (nodeAmount < 1) + if (nodesToCreate < 1) { - Log.Error($"nodeAmount {nodeAmount} is less than 1. Aborting artifact tree generation."); + Log.Error($"nodesToCreate {nodesToCreate} is less than 1. Aborting artifact tree generation."); return; } _usedNodeIds.Clear(); + var uninitializedNodes = new List { new(){ Id = GetValidNodeId() } }; + var createdNodes = 1; - var rootNode = new ArtifactNode + while (uninitializedNodes.Count > 0) { - Id = GetValidNodeId() - }; - var uninitializedNodes = new List { rootNode }; - while (uninitializedNodes.Any()) - { - GenerateNode(artifact, ref uninitializedNodes, ref allNodes, nodeAmount); + var node = uninitializedNodes[0]; + uninitializedNodes.Remove(node); + + node.Trigger = GetRandomTrigger(artifact, ref node); + node.Effect = GetRandomEffect(artifact, ref node); + + var maxChildren = _random.Next(1, MaxEdgesPerNode - 1); + + for (var i = 0; i < maxChildren; i++) + { + if (nodesToCreate <= createdNodes) + { + break; + } + + var child = new ArtifactNode {Id = GetValidNodeId(), Depth = node.Depth + 1}; + node.Edges.Add(child.Id); + child.Edges.Add(node.Id); + + uninitializedNodes.Add(child); + createdNodes++; + } + + allNodes.Add(node); } } @@ -51,44 +71,8 @@ private int GetValidNodeId() } _usedNodeIds.Add(id); - return id; - } - /// - /// Generate an individual node on the tree. - /// - private void GenerateNode(EntityUid artifact, ref List uninitializedNodes, ref List allNodes, int targetNodeAmount) - { - if (!uninitializedNodes.Any()) - return; - - var node = uninitializedNodes.First(); - uninitializedNodes.Remove(node); - - //Generate the connected nodes - var maxEdges = Math.Max(1, targetNodeAmount - allNodes.Count - uninitializedNodes.Count - 1); - maxEdges = Math.Min(maxEdges, MaxEdgesPerNode); - var minEdges = Math.Clamp(targetNodeAmount - allNodes.Count - uninitializedNodes.Count - 1, 0, 1); - - var edgeAmount = _random.Next(minEdges, maxEdges); - - for (var i = 0; i < edgeAmount; i++) - { - var neighbor = new ArtifactNode - { - Depth = node.Depth + 1, - Id = GetValidNodeId() - }; - node.Edges.Add(neighbor.Id); - neighbor.Edges.Add(node.Id); - - uninitializedNodes.Add(neighbor); - } - - node.Trigger = GetRandomTrigger(artifact, ref node); - node.Effect = GetRandomEffect(artifact, ref node); - - allNodes.Add(node); + return id; } //yeah these two functions are near duplicates but i don't @@ -159,6 +143,7 @@ private int GetRandomTargetDepth(Dictionary weights) return key; } } + return _random.Pick(weights.Keys); //shouldn't happen } diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.cs index 955fe827d72..a5469e93dc0 100644 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.cs +++ b/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.cs @@ -129,7 +129,7 @@ public void RandomizeArtifact(EntityUid uid, ArtifactComponent component) { var nodeAmount = _random.Next(component.NodesMin, component.NodesMax); - GenerateArtifactNodeTree(uid, ref component.NodeTree, nodeAmount); + GenerateArtifactNodeTree(uid, component.NodeTree, nodeAmount); var firstNode = GetRootNode(component.NodeTree); EnterNode(uid, ref firstNode, component); } @@ -184,13 +184,14 @@ public void ForceActivateArtifact(EntityUid uid, EntityUid? user = null, Artifac var currentNode = GetNodeFromId(component.CurrentNodeId.Value, component); currentNode.Triggered = true; - if (currentNode.Edges.Any()) - { - var newNode = GetNewNode(uid, component); - if (newNode == null) - return; - EnterNode(uid, ref newNode, component); - } + if (currentNode.Edges.Count == 0) + return; + + var newNode = GetNewNode(uid, component); + if (newNode == null) + return; + + EnterNode(uid, ref newNode, component); } private ArtifactNode? GetNewNode(EntityUid uid, ArtifactComponent component) @@ -210,15 +211,15 @@ public void ForceActivateArtifact(EntityUid uid, EntityUid? user = null, Artifac { switch (trav.BiasDirection) { - case BiasDirection.In: - var foo = allNodes.Where(x => GetNodeFromId(x, component).Depth < currentNode.Depth).ToHashSet(); - if (foo.Any()) - allNodes = foo; + case BiasDirection.Up: + var upNodes = allNodes.Where(x => GetNodeFromId(x, component).Depth < currentNode.Depth).ToHashSet(); + if (upNodes.Count != 0) + allNodes = upNodes; break; - case BiasDirection.Out: - var bar = allNodes.Where(x => GetNodeFromId(x, component).Depth > currentNode.Depth).ToHashSet(); - if (bar.Any()) - allNodes = bar; + case BiasDirection.Down: + var downNodes = allNodes.Where(x => GetNodeFromId(x, component).Depth > currentNode.Depth).ToHashSet(); + if (downNodes.Count != 0) + allNodes = downNodes; break; } } @@ -226,12 +227,14 @@ public void ForceActivateArtifact(EntityUid uid, EntityUid? user = null, Artifac var undiscoveredNodes = allNodes.Where(x => !GetNodeFromId(x, component).Discovered).ToList(); Log.Debug($"Undiscovered nodes: {string.Join(", ", undiscoveredNodes)}"); var newNode = _random.Pick(allNodes); - if (undiscoveredNodes.Any() && _random.Prob(0.75f)) + + if (undiscoveredNodes.Count != 0 && _random.Prob(0.75f)) { newNode = _random.Pick(undiscoveredNodes); } Log.Debug($"Going to node {newNode}"); + return GetNodeFromId(newNode, component); } diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactMagnetTriggerSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactMagnetTriggerSystem.cs index 92a586547dd..c6f56a27508 100644 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactMagnetTriggerSystem.cs +++ b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactMagnetTriggerSystem.cs @@ -1,4 +1,4 @@ -using System.Linq; +using System.Linq; using Content.Server.Salvage; using Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Components; using Content.Shared.Clothing; @@ -42,7 +42,7 @@ public override void Update(float frameTime) if (!magXform.Coordinates.TryDistance(EntityManager, xform.Coordinates, out var distance)) continue; - if (distance > trigger.Range) + if (distance > trigger.MagbootRange) continue; _toActivate.Add(artifactUid); diff --git a/Content.Server/Zombies/PendingZombieComponent.cs b/Content.Server/Zombies/PendingZombieComponent.cs index a49b424c53f..10b62c05dc7 100644 --- a/Content.Server/Zombies/PendingZombieComponent.cs +++ b/Content.Server/Zombies/PendingZombieComponent.cs @@ -16,7 +16,7 @@ public sealed partial class PendingZombieComponent : Component { DamageDict = new () { - { "Poison", 0.3 }, + { "Poison", 0.2 }, } }; diff --git a/Content.Shared/Access/Systems/AccessReaderSystem.cs b/Content.Shared/Access/Systems/AccessReaderSystem.cs index 4c12622ab56..89c08e0a4e7 100644 --- a/Content.Shared/Access/Systems/AccessReaderSystem.cs +++ b/Content.Shared/Access/Systems/AccessReaderSystem.cs @@ -318,6 +318,7 @@ public void SetAccesses(EntityUid uid, AccessReaderComponent component, List>(){access}); } + Dirty(uid, component); RaiseLocalEvent(uid, new AccessReaderConfigurationChangedEvent()); } diff --git a/Content.Shared/Atmos/Components/GasAnalyzerComponent.cs b/Content.Shared/Atmos/Components/GasAnalyzerComponent.cs index 51ae8cc7406..dec9516c013 100644 --- a/Content.Shared/Atmos/Components/GasAnalyzerComponent.cs +++ b/Content.Shared/Atmos/Components/GasAnalyzerComponent.cs @@ -56,13 +56,15 @@ public struct GasMixEntry /// Name of the tab in the UI /// public readonly string Name; + public readonly float Volume; public readonly float Pressure; public readonly float Temperature; public readonly GasEntry[]? Gases; - public GasMixEntry(string name, float pressure, float temperature, GasEntry[]? gases = null) + public GasMixEntry(string name, float volume, float pressure, float temperature, GasEntry[]? gases = null) { Name = name; + Volume = volume; Pressure = pressure; Temperature = temperature; Gases = gases; diff --git a/Content.Shared/Audio/Jukebox/JukeboxComponent.cs b/Content.Shared/Audio/Jukebox/JukeboxComponent.cs new file mode 100644 index 00000000000..f9bb385f520 --- /dev/null +++ b/Content.Shared/Audio/Jukebox/JukeboxComponent.cs @@ -0,0 +1,80 @@ +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; + +namespace Content.Shared.Audio.Jukebox; + +[NetworkedComponent, RegisterComponent, AutoGenerateComponentState(true)] +[Access(typeof(SharedJukeboxSystem))] +public sealed partial class JukeboxComponent : Component +{ + [DataField, AutoNetworkedField] + public ProtoId? SelectedSongId; + + [DataField, AutoNetworkedField] + public EntityUid? AudioStream; + + /// + /// RSI state for the jukebox being on. + /// + [DataField] + public string? OnState; + + /// + /// RSI state for the jukebox being on. + /// + [DataField] + public string? OffState; + + /// + /// RSI state for the jukebox track being selected. + /// + [DataField] + public string? SelectState; + + [ViewVariables] + public bool Selecting; + + [ViewVariables] + public float SelectAccumulator; +} + +[Serializable, NetSerializable] +public sealed class JukeboxPlayingMessage : BoundUserInterfaceMessage; + +[Serializable, NetSerializable] +public sealed class JukeboxPauseMessage : BoundUserInterfaceMessage; + +[Serializable, NetSerializable] +public sealed class JukeboxStopMessage : BoundUserInterfaceMessage; + +[Serializable, NetSerializable] +public sealed class JukeboxSelectedMessage(ProtoId songId) : BoundUserInterfaceMessage +{ + public ProtoId SongId { get; } = songId; +} + +[Serializable, NetSerializable] +public sealed class JukeboxSetTimeMessage(float songTime) : BoundUserInterfaceMessage +{ + public float SongTime { get; } = songTime; +} + +[Serializable, NetSerializable] +public enum JukeboxVisuals : byte +{ + VisualState +} + +[Serializable, NetSerializable] +public enum JukeboxVisualState : byte +{ + On, + Off, + Select, +} + +public enum JukeboxVisualLayers : byte +{ + Base +} diff --git a/Content.Shared/Audio/Jukebox/JukeboxPrototype.cs b/Content.Shared/Audio/Jukebox/JukeboxPrototype.cs new file mode 100644 index 00000000000..ad690ef4973 --- /dev/null +++ b/Content.Shared/Audio/Jukebox/JukeboxPrototype.cs @@ -0,0 +1,23 @@ +using Robust.Shared.Audio; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Audio.Jukebox; + +/// +/// Soundtrack that's visible on the jukebox list. +/// +[Prototype] +public sealed partial class JukeboxPrototype : IPrototype +{ + [IdDataField] + public string ID { get; } = string.Empty; + + /// + /// User friendly name to use in UI. + /// + [DataField(required: true)] + public string Name = string.Empty; + + [DataField(required: true)] + public SoundPathSpecifier Path = default!; +} diff --git a/Content.Shared/Audio/Jukebox/JukeboxUi.cs b/Content.Shared/Audio/Jukebox/JukeboxUi.cs new file mode 100644 index 00000000000..bf1fc3d5d22 --- /dev/null +++ b/Content.Shared/Audio/Jukebox/JukeboxUi.cs @@ -0,0 +1,11 @@ +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; + +namespace Content.Shared.Audio.Jukebox; + + +[Serializable, NetSerializable] +public enum JukeboxUiKey : byte +{ + Key, +} diff --git a/Content.Shared/Audio/Jukebox/SharedJukeboxSystem.cs b/Content.Shared/Audio/Jukebox/SharedJukeboxSystem.cs new file mode 100644 index 00000000000..1a8f9cb3bb8 --- /dev/null +++ b/Content.Shared/Audio/Jukebox/SharedJukeboxSystem.cs @@ -0,0 +1,8 @@ +using Robust.Shared.Audio.Systems; + +namespace Content.Shared.Audio.Jukebox; + +public abstract class SharedJukeboxSystem : EntitySystem +{ + [Dependency] protected readonly SharedAudioSystem Audio = default!; +} diff --git a/Content.Shared/Audio/SharedAmbientSoundSystem.cs b/Content.Shared/Audio/SharedAmbientSoundSystem.cs index 5f17261825c..0a52b7c58e2 100644 --- a/Content.Shared/Audio/SharedAmbientSoundSystem.cs +++ b/Content.Shared/Audio/SharedAmbientSoundSystem.cs @@ -1,3 +1,4 @@ +using Content.Shared.Mobs; using Robust.Shared.Audio; using Robust.Shared.GameStates; @@ -12,6 +13,7 @@ public override void Initialize() base.Initialize(); SubscribeLocalEvent(GetCompState); SubscribeLocalEvent(HandleCompState); + _query = GetEntityQuery(); } diff --git a/Content.Shared/Audio/SoundWhileAliveComponent.cs b/Content.Shared/Audio/SoundWhileAliveComponent.cs new file mode 100644 index 00000000000..977d9372ce2 --- /dev/null +++ b/Content.Shared/Audio/SoundWhileAliveComponent.cs @@ -0,0 +1,10 @@ +using Content.Shared.Sound.Components; +using Robust.Shared.GameStates; + +namespace Content.Shared.Audio; + +/// +/// Toggles and off when this entity's MobState isn't Alive. +/// +[RegisterComponent, NetworkedComponent] +public sealed partial class SoundWhileAliveComponent : Component; diff --git a/Content.Shared/Bed/Cryostorage/SharedCryostorageSystem.cs b/Content.Shared/Bed/Cryostorage/SharedCryostorageSystem.cs index f14dc21c480..c3fa21e293e 100644 --- a/Content.Shared/Bed/Cryostorage/SharedCryostorageSystem.cs +++ b/Content.Shared/Bed/Cryostorage/SharedCryostorageSystem.cs @@ -4,6 +4,7 @@ using Content.Shared.GameTicking; using Content.Shared.Mind; using Content.Shared.Mind.Components; +using Content.Shared.Mobs.Systems; using Robust.Shared.Configuration; using Robust.Shared.Containers; using Robust.Shared.Map; @@ -22,6 +23,7 @@ public abstract class SharedCryostorageSystem : EntitySystem [Dependency] private readonly IMapManager _mapManager = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] protected readonly SharedMindSystem Mind = default!; + [Dependency] private readonly MobStateSystem _mobState = default!; protected EntityUid? PausedMap { get; private set; } @@ -81,6 +83,12 @@ private void OnInsertAttempt(Entity ent, ref ContainerIsIn if (args.Container.ID != comp.ContainerId) return; + if (_mobState.IsIncapacitated(args.EntityUid)) + { + args.Cancel(); + return; + } + if (!TryComp(args.EntityUid, out var mindContainer)) { args.Cancel(); diff --git a/Content.Shared/Burial/BurialSystem.cs b/Content.Shared/Burial/BurialSystem.cs index ccf5f1a298f..326272cc7de 100644 --- a/Content.Shared/Burial/BurialSystem.cs +++ b/Content.Shared/Burial/BurialSystem.cs @@ -116,8 +116,9 @@ private void StartDigging(EntityUid uid, EntityUid user, EntityUid? used, GraveC { if (used != null) { - _popupSystem.PopupClient(Loc.GetString("grave-start-digging-user", ("grave", uid), ("tool", used)), user, user); - _popupSystem.PopupEntity(Loc.GetString("grave-start-digging-others", ("user", user), ("grave", uid), ("tool", used)), user, Filter.PvsExcept(user), true); + var selfMessage = Loc.GetString("grave-start-digging-user", ("grave", uid), ("tool", used)); + var othersMessage = Loc.GetString("grave-start-digging-others", ("user", user), ("grave", uid), ("tool", used)); + _popupSystem.PopupPredicted(selfMessage, othersMessage, user, user); component.ActiveShovelDigging = true; Dirty(uid, component); } diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index 82478bdd9dd..c4f5f72d32e 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -229,25 +229,6 @@ public static readonly CVarDef public static readonly CVarDef GameCryoSleepRejoining = CVarDef.Create("game.cryo_sleep_rejoining", false, CVar.SERVER | CVar.REPLICATED); - /// - /// Whether a random position offset will be applied to the station on roundstart. - /// - public static readonly CVarDef StationOffset = - CVarDef.Create("game.station_offset", true); - - /// - /// When the default blueprint is loaded what is the maximum amount it can be offset from 0,0. - /// Does nothing without as true. - /// - public static readonly CVarDef MaxStationOffset = - CVarDef.Create("game.maxstationoffset", 1000.0f); - - /// - /// Whether a random rotation will be applied to the station on roundstart. - /// - public static readonly CVarDef StationRotation = - CVarDef.Create("game.station_rotation", true); - /// /// When enabled, guests will be assigned permanent UIDs and will have their preferences stored. /// @@ -726,7 +707,7 @@ public static readonly CVarDef public static readonly CVarDef CombatModeIndicatorsPointShow = CVarDef.Create("hud.combat_mode_indicators_point_show", true, CVar.ARCHIVE | CVar.CLIENTONLY); - + public static readonly CVarDef LoocAboveHeadShow = CVarDef.Create("hud.show_looc_above_head", true, CVar.ARCHIVE | CVar.CLIENTONLY); @@ -773,6 +754,13 @@ public static readonly CVarDef public static readonly CVarDef AdminAnnounceLogout = CVarDef.Create("admin.announce_logout", true, CVar.SERVERONLY); + /// + /// The token used to authenticate with the admin API. Leave empty to disable the admin API. This is a secret! Do not share! + /// + public static readonly CVarDef AdminApiToken = + CVarDef.Create("admin.api_token", string.Empty, CVar.SERVERONLY | CVar.CONFIDENTIAL); + + /// /// Should users be able to see their own notes? Admins will be able to see and set notes regardless /// @@ -808,19 +796,43 @@ public static readonly CVarDef /// Default severity for role bans /// public static readonly CVarDef RoleBanDefaultSeverity = - CVarDef.Create("admin.role_ban_default_severity", "medium", CVar.ARCHIVE | CVar.SERVER); + CVarDef.Create("admin.role_ban_default_severity", "medium", CVar.ARCHIVE | CVar.SERVER | CVar.REPLICATED); /// /// Default severity for department bans /// public static readonly CVarDef DepartmentBanDefaultSeverity = - CVarDef.Create("admin.department_ban_default_severity", "medium", CVar.ARCHIVE | CVar.SERVER); + CVarDef.Create("admin.department_ban_default_severity", "medium", CVar.ARCHIVE | CVar.SERVER | CVar.REPLICATED); /// /// Default severity for server bans /// public static readonly CVarDef ServerBanDefaultSeverity = - CVarDef.Create("admin.server_ban_default_severity", "High", CVar.ARCHIVE | CVar.SERVER); + CVarDef.Create("admin.server_ban_default_severity", "High", CVar.ARCHIVE | CVar.SERVER | CVar.REPLICATED); + + /// + /// Whether a server ban will ban the player's ip by default. + /// + public static readonly CVarDef ServerBanIpBanDefault = + CVarDef.Create("admin.server_ban_ip_ban_default", true, CVar.ARCHIVE | CVar.SERVER | CVar.REPLICATED); + + /// + /// Whether a server ban will ban the player's hardware id by default. + /// + public static readonly CVarDef ServerBanHwidBanDefault = + CVarDef.Create("admin.server_ban_hwid_ban_default", true, CVar.ARCHIVE | CVar.SERVER | CVar.REPLICATED); + + /// + /// Whether to use details from last connection for ip/hwid in the BanPanel. + /// + public static readonly CVarDef ServerBanUseLastDetails = + CVarDef.Create("admin.server_ban_use_last_details", true, CVar.ARCHIVE | CVar.SERVER | CVar.REPLICATED); + + /// + /// Whether to erase a player's chat messages and their entity from the game when banned. + /// + public static readonly CVarDef ServerBanErasePlayer = + CVarDef.Create("admin.server_ban_erase_player", false, CVar.ARCHIVE | CVar.SERVER | CVar.REPLICATED); /// /// Minimum explosion intensity to create an admin alert message. -1 to disable the alert. @@ -1225,7 +1237,7 @@ public static readonly CVarDef /// public static readonly CVarDef OocEnableDuringRound = CVarDef.Create("ooc.enable_during_round", false, CVar.NOTIFY | CVar.REPLICATED | CVar.SERVER); - + public static readonly CVarDef ShowOocPatronColor = CVarDef.Create("ooc.show_ooc_patron_color", true, CVar.ARCHIVE | CVar.REPLICATED | CVar.CLIENT); @@ -1458,6 +1470,7 @@ public static readonly CVarDef /// /// The minimum time for the emergency shuttle to arrive at centcomm. + /// Actual minimum travel time cannot be less than /// public static readonly CVarDef EmergencyShuttleMinTransitTime = CVarDef.Create("shuttle.emergency_transit_time_min", 90f, CVar.SERVERONLY); @@ -1566,6 +1579,9 @@ public static readonly CVarDef public static readonly CVarDef ViewportWidth = CVarDef.Create("viewport.width", 21, CVar.CLIENTONLY | CVar.ARCHIVE); + public static readonly CVarDef ViewportVerticalFit = + CVarDef.Create("viewport.vertical_fit", true, CVar.CLIENTONLY | CVar.ARCHIVE); + /* * UI */ diff --git a/Content.Shared/Cargo/CargoOrderData.cs b/Content.Shared/Cargo/CargoOrderData.cs index a6d5fb0a18a..831010cedd7 100644 --- a/Content.Shared/Cargo/CargoOrderData.cs +++ b/Content.Shared/Cargo/CargoOrderData.cs @@ -21,6 +21,11 @@ public sealed class CargoOrderData /// public readonly string ProductId; + /// + /// Prototype Name + /// + public readonly string ProductName; + /// /// The number of items in the order. Not readonly, as it might change /// due to caps on the amount of orders that can be placed. @@ -39,10 +44,11 @@ public sealed class CargoOrderData public bool Approved => Approver is not null; public string? Approver; - public CargoOrderData(int orderId, string productId, int price, int amount, string requester, string reason) + public CargoOrderData(int orderId, string productId, string productName, int price, int amount, string requester, string reason) { OrderId = orderId; ProductId = productId; + ProductName = productName; Price = price; OrderQuantity = amount; Requester = requester; diff --git a/Content.Shared/Cargo/Components/CargoBountyConsoleComponent.cs b/Content.Shared/Cargo/Components/CargoBountyConsoleComponent.cs index 7b1acf836fd..bf82a08127e 100644 --- a/Content.Shared/Cargo/Components/CargoBountyConsoleComponent.cs +++ b/Content.Shared/Cargo/Components/CargoBountyConsoleComponent.cs @@ -32,16 +32,30 @@ public sealed partial class CargoBountyConsoleComponent : Component /// [DataField("printSound")] public SoundSpecifier PrintSound = new SoundPathSpecifier("/Audio/Machines/printer.ogg"); + + /// + /// The sound made when the bounty is skipped. + /// + [DataField("skipSound")] + public SoundSpecifier SkipSound = new SoundPathSpecifier("/Audio/Effects/Cargo/ping.ogg"); + + /// + /// The sound made when bounty skipping is denied due to lacking access. + /// + [DataField("denySound")] + public SoundSpecifier DenySound = new SoundPathSpecifier("/Audio/Effects/Cargo/buzz_two.ogg"); } [NetSerializable, Serializable] public sealed class CargoBountyConsoleState : BoundUserInterfaceState { public List Bounties; + public TimeSpan UntilNextSkip; - public CargoBountyConsoleState(List bounties) + public CargoBountyConsoleState(List bounties, TimeSpan untilNextSkip) { Bounties = bounties; + UntilNextSkip = untilNextSkip; } } @@ -55,3 +69,14 @@ public BountyPrintLabelMessage(string bountyId) BountyId = bountyId; } } + +[Serializable, NetSerializable] +public sealed class BountySkipMessage : BoundUserInterfaceMessage +{ + public string BountyId; + + public BountySkipMessage(string bountyId) + { + BountyId = bountyId; + } +} diff --git a/Content.Shared/Cargo/Components/CargoOrderConsoleComponent.cs b/Content.Shared/Cargo/Components/CargoOrderConsoleComponent.cs index a7d1f531754..873e9bb7b9d 100644 --- a/Content.Shared/Cargo/Components/CargoOrderConsoleComponent.cs +++ b/Content.Shared/Cargo/Components/CargoOrderConsoleComponent.cs @@ -1,6 +1,8 @@ using Content.Shared.Cargo.Prototypes; using Robust.Shared.Audio; using Robust.Shared.GameStates; +using Content.Shared.Radio; +using Robust.Shared.Prototypes; namespace Content.Shared.Cargo.Components; @@ -21,5 +23,11 @@ public sealed partial class CargoOrderConsoleComponent : Component /// [DataField, ViewVariables(VVAccess.ReadWrite)] public List AllowedGroups = new() { "market" }; + + /// + /// Radio channel on which order approval announcements are transmitted + /// + [DataField, ViewVariables(VVAccess.ReadWrite)] + public ProtoId AnnouncementChannel = "Supply"; } diff --git a/Content.Shared/Cargo/Prototypes/CargoProductPrototype.cs b/Content.Shared/Cargo/Prototypes/CargoProductPrototype.cs index 1d0ca8abdb4..af2f6613d63 100644 --- a/Content.Shared/Cargo/Prototypes/CargoProductPrototype.cs +++ b/Content.Shared/Cargo/Prototypes/CargoProductPrototype.cs @@ -1,4 +1,4 @@ -using Robust.Shared.Prototypes; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Array; using Robust.Shared.Utility; diff --git a/Content.Shared/Chat/TypingIndicator/SharedTypingIndicatorSystem.cs b/Content.Shared/Chat/TypingIndicator/SharedTypingIndicatorSystem.cs index 41ed4b1b2ba..81ebcfb1088 100644 --- a/Content.Shared/Chat/TypingIndicator/SharedTypingIndicatorSystem.cs +++ b/Content.Shared/Chat/TypingIndicator/SharedTypingIndicatorSystem.cs @@ -1,5 +1,4 @@ -using Content.Shared.Clothing.Components; -using Content.Shared.Inventory.Events; +using Content.Shared.Clothing; namespace Content.Shared.Chat.TypingIndicator; @@ -17,25 +16,21 @@ public abstract class SharedTypingIndicatorSystem : EntitySystem public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnGotEquipped); - SubscribeLocalEvent(OnGotUnequipped); + SubscribeLocalEvent(OnGotEquipped); + SubscribeLocalEvent(OnGotUnequipped); } - private void OnGotEquipped(EntityUid uid, TypingIndicatorClothingComponent component, GotEquippedEvent args) + private void OnGotEquipped(EntityUid uid, TypingIndicatorClothingComponent component, ClothingGotEquippedEvent args) { - if (!TryComp(uid, out var clothing) || - !TryComp(args.Equipee, out var indicator)) + if (!TryComp(args.Wearer, out var indicator)) return; - var isCorrectSlot = clothing.Slots.HasFlag(args.SlotFlags); - if (!isCorrectSlot) return; - indicator.Prototype = component.Prototype; } - private void OnGotUnequipped(EntityUid uid, TypingIndicatorClothingComponent component, GotUnequippedEvent args) + private void OnGotUnequipped(EntityUid uid, TypingIndicatorClothingComponent component, ClothingGotUnequippedEvent args) { - if (!TryComp(args.Equipee, out var indicator)) + if (!TryComp(args.Wearer, out var indicator)) return; indicator.Prototype = SharedTypingIndicatorSystem.InitialIndicatorId; diff --git a/Content.Shared/Chat/V2/Repository/Types.cs b/Content.Shared/Chat/V2/Repository/Types.cs new file mode 100644 index 00000000000..59acb849d46 --- /dev/null +++ b/Content.Shared/Chat/V2/Repository/Types.cs @@ -0,0 +1,60 @@ +using System.Linq; +using System.Runtime.InteropServices; +using Robust.Shared.Network; +using Robust.Shared.Serialization; + +namespace Content.Shared.Chat.V2.Repository; + +/// +/// The record associated with a specific chat event. +/// +public struct ChatRecord(string userName, NetUserId userId, IChatEvent storedEvent, string entityName) +{ + public string UserName = userName; + public NetUserId UserId = userId; + public string EntityName = entityName; + public IChatEvent StoredEvent = storedEvent; +} + +/// +/// Notifies that a chat message has been created. +/// +/// +[Serializable, NetSerializable] +public sealed class MessageCreatedEvent(IChatEvent ev) : EntityEventArgs +{ + public IChatEvent Event = ev; +} + +/// +/// Notifies that a chat message has been changed. +/// +/// +/// +[Serializable, NetSerializable] +public sealed class MessagePatchedEvent(uint id, string newMessage) : EntityEventArgs +{ + public uint MessageId = id; + public string NewMessage = newMessage; +} + +/// +/// Notifies that a chat message has been deleted. +/// +/// +[Serializable, NetSerializable] +public sealed class MessageDeletedEvent(uint id) : EntityEventArgs +{ + public uint MessageId = id; +} + +/// +/// Notifies that a player's messages have been nuked. +/// +/// +[Serializable, NetSerializable] +public sealed class MessagesNukedEvent(List set) : EntityEventArgs +{ + public uint[] MessageIds = CollectionsMarshal.AsSpan(set).ToArray(); +} + diff --git a/Content.Shared/Chat/V2/Types.cs b/Content.Shared/Chat/V2/Types.cs new file mode 100644 index 00000000000..50e5a53ab50 --- /dev/null +++ b/Content.Shared/Chat/V2/Types.cs @@ -0,0 +1,94 @@ +namespace Content.Shared.Chat.V2; + +/// +/// The types of messages that can be sent, validated and processed via user input that are covered by Chat V2. +/// +public enum MessageType : byte +{ + #region Player-sendable types + + /// + /// Chat for announcements like CentCom telling you to stop sending them memes. + /// + Announcement, + /// + /// Chat that ghosts use to complain about being gibbed. + /// + DeadChat, + /// + /// Chat that mimes use to evade their vow. + /// + Emote, + /// + /// Chat that players use to make lame jokes to people nearby. + /// + Local, + /// + /// Chat that players use to complain about shitsec/admins/antags/balance/etc. + /// + Looc, + /// + /// Chat that players use to say "HELP MAINT", or plead to call the shuttle because a beaker spilled. + /// + /// This does not tell you what radio channel has been chatted on! + Radio, + /// + /// Chat that is used exclusively by syndie tots to collaborate on whatever tots do. + /// + Whisper, + + #endregion + + #region Non-player-sendable types + + /// + /// Chat that is sent to exactly one player; almost exclusively used for admemes and prayer responses. + /// + Subtle, + /// + /// Chat that is sent by automata, like when a vending machine thanks you for your unwise purchases. + /// + Background, + + #endregion +} + +/// +/// Defines a chat event that can be stored in a chat repository. +/// +public interface IChatEvent +{ + /// + /// The sender of the chat message. + /// + public EntityUid Sender + { + get; + } + + /// + /// The ID of the message. This is overwritten when saved into a repository. + /// + public uint Id + { + get; + set; + } + + /// + /// The sent message. + /// + public string Message + { + get; + set; + } + + /// + /// The type of sent message. + /// + public MessageType Type + { + get; + } +} diff --git a/Content.Shared/Chemistry/Components/MixableSolutionComponent.cs b/Content.Shared/Chemistry/Components/MixableSolutionComponent.cs new file mode 100644 index 00000000000..2b1c140aa69 --- /dev/null +++ b/Content.Shared/Chemistry/Components/MixableSolutionComponent.cs @@ -0,0 +1,13 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Chemistry.Components; + +[RegisterComponent, NetworkedComponent] +public sealed partial class MixableSolutionComponent : Component +{ + /// + /// Solution name which can be mixed with methods such as blessing + /// + [DataField, ViewVariables(VVAccess.ReadWrite)] + public string Solution = "default"; +} diff --git a/Content.Shared/Chemistry/Components/ReagentTankComponent.cs b/Content.Shared/Chemistry/Components/ReagentTankComponent.cs new file mode 100644 index 00000000000..3aa1756cf9c --- /dev/null +++ b/Content.Shared/Chemistry/Components/ReagentTankComponent.cs @@ -0,0 +1,22 @@ +using Content.Shared.FixedPoint; +using Robust.Shared.GameStates; +using Robust.Shared.Serialization; + +namespace Content.Shared.Chemistry.Components; + +[RegisterComponent, NetworkedComponent] +public sealed partial class ReagentTankComponent : Component +{ + [DataField, ViewVariables(VVAccess.ReadWrite)] + public FixedPoint2 TransferAmount { get; set; } = FixedPoint2.New(10); + + [DataField, ViewVariables(VVAccess.ReadWrite)] + public ReagentTankType TankType { get; set; } = ReagentTankType.Unspecified; +} + +[Serializable, NetSerializable] +public enum ReagentTankType : byte +{ + Unspecified, + Fuel +} diff --git a/Content.Shared/Chemistry/Components/Solution.cs b/Content.Shared/Chemistry/Components/Solution.cs index 1c24c860dd0..4de3c369f7c 100644 --- a/Content.Shared/Chemistry/Components/Solution.cs +++ b/Content.Shared/Chemistry/Components/Solution.cs @@ -48,13 +48,6 @@ public sealed partial class Solution : IEnumerable, ISerializat [DataField("canReact")] public bool CanReact { get; set; } = true; - /// - /// If reactions can occur via mixing. - /// - [ViewVariables(VVAccess.ReadWrite)] - [DataField("canMix")] - public bool CanMix { get; set; } = false; - /// /// Volume needed to fill this container. /// diff --git a/Content.Shared/Chemistry/EntitySystems/RehydratableSystem.cs b/Content.Shared/Chemistry/EntitySystems/RehydratableSystem.cs index e260280ae45..36ca791290a 100644 --- a/Content.Shared/Chemistry/EntitySystems/RehydratableSystem.cs +++ b/Content.Shared/Chemistry/EntitySystems/RehydratableSystem.cs @@ -1,12 +1,14 @@ using Content.Shared.Chemistry.Components; using Content.Shared.FixedPoint; using Content.Shared.Popups; +using Robust.Shared.Network; using Robust.Shared.Random; namespace Content.Shared.Chemistry.EntitySystems; public sealed class RehydratableSystem : EntitySystem { + [Dependency] private readonly INetManager _net = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly SharedSolutionContainerSystem _solutions = default!; @@ -31,6 +33,9 @@ private void OnSolutionChange(Entity ent, ref SolutionCon // Try not to make this public if you can help it. private void Expand(Entity ent) { + if (_net.IsClient) + return; + var (uid, comp) = ent; var randomMob = _random.Pick(comp.PossibleSpawns); diff --git a/Content.Shared/Chemistry/EntitySystems/SharedSolutionContainerSystem.Capabilities.cs b/Content.Shared/Chemistry/EntitySystems/SharedSolutionContainerSystem.Capabilities.cs index 0d4912a504b..ce0cfab0021 100644 --- a/Content.Shared/Chemistry/EntitySystems/SharedSolutionContainerSystem.Capabilities.cs +++ b/Content.Shared/Chemistry/EntitySystems/SharedSolutionContainerSystem.Capabilities.cs @@ -78,31 +78,15 @@ public bool TryGetFitsInDispenser(Entity container, [NotNullWhen(true)] out Entity? solution) + public bool TryGetMixableSolution(Entity entity, [NotNullWhen(true)] out Entity? soln, [NotNullWhen(true)] out Solution? solution) { - var getMixableSolutionAttempt = new GetMixableSolutionAttemptEvent(container); - RaiseLocalEvent(container, ref getMixableSolutionAttempt); - if (getMixableSolutionAttempt.MixedSolution != null) - { - solution = getMixableSolutionAttempt.MixedSolution; - return true; - } - - if (!Resolve(container, ref container.Comp, false)) + if (!Resolve(entity, ref entity.Comp1, logMissing: false)) { - solution = default!; + (soln, solution) = (default!, null); return false; } - var tryGetSolution = EnumerateSolutions(container).FirstOrNull(x => x.Solution.Comp.Solution.CanMix); - if (tryGetSolution.HasValue) - { - solution = tryGetSolution.Value.Solution; - return true; - } - - solution = default!; - return false; + return TryGetSolution((entity.Owner, entity.Comp2), entity.Comp1.Solution, out soln, out solution); } #endregion Solution Accessors diff --git a/Content.Shared/Chemistry/EntitySystems/SharedSolutionContainerSystem.cs b/Content.Shared/Chemistry/EntitySystems/SharedSolutionContainerSystem.cs index 5bb97e83ebf..e74c1463804 100644 --- a/Content.Shared/Chemistry/EntitySystems/SharedSolutionContainerSystem.cs +++ b/Content.Shared/Chemistry/EntitySystems/SharedSolutionContainerSystem.cs @@ -57,6 +57,7 @@ public abstract partial class SharedSolutionContainerSystem : EntitySystem [Dependency] protected readonly SharedAppearanceSystem AppearanceSystem = default!; [Dependency] protected readonly SharedHandsSystem Hands = default!; [Dependency] protected readonly SharedContainerSystem ContainerSystem = default!; + [Dependency] protected readonly MetaDataSystem MetaData = default!; public override void Initialize() { diff --git a/Content.Shared/Chemistry/Reaction/ReactionMixerComponent.cs b/Content.Shared/Chemistry/Reaction/ReactionMixerComponent.cs index ede73c49690..118f2240610 100644 --- a/Content.Shared/Chemistry/Reaction/ReactionMixerComponent.cs +++ b/Content.Shared/Chemistry/Reaction/ReactionMixerComponent.cs @@ -25,6 +25,3 @@ public sealed partial class ReactionMixerComponent : Component public record struct MixingAttemptEvent(EntityUid Mixed, bool Cancelled = false); public readonly record struct AfterMixingEvent(EntityUid Mixed, EntityUid Mixer); - -[ByRefEvent] -public record struct GetMixableSolutionAttemptEvent(EntityUid Mixed, Entity? MixedSolution = null); diff --git a/Content.Shared/Chemistry/Reagent/ReagentPrototype.cs b/Content.Shared/Chemistry/Reagent/ReagentPrototype.cs index 5d6d9d21208..df1b1aa20b4 100644 --- a/Content.Shared/Chemistry/Reagent/ReagentPrototype.cs +++ b/Content.Shared/Chemistry/Reagent/ReagentPrototype.cs @@ -104,6 +104,13 @@ public sealed partial class ReagentPrototype : IPrototype, IInheritingPrototype [DataField] public bool Slippery; + /// + /// How easily this reagent becomes fizzy when aggitated. + /// 0 - completely flat, 1 - fizzes up when nudged. + /// + [DataField] + public float Fizziness; + /// /// How much reagent slows entities down if it's part of a puddle. /// 0 - no slowdown; 1 - can't move. diff --git a/Content.Shared/Climbing/Systems/BonkSystem.cs b/Content.Shared/Climbing/Systems/BonkSystem.cs index 4fe2661aff9..ea4e04c621a 100644 --- a/Content.Shared/Climbing/Systems/BonkSystem.cs +++ b/Content.Shared/Climbing/Systems/BonkSystem.cs @@ -57,9 +57,11 @@ public bool TryBonk(EntityUid user, EntityUid bonkableUid, BonkableComponent? bo if (user == source) { // Non-local, non-bonking players - _popupSystem.PopupEntity(Loc.GetString("bonkable-success-message-others", ("user", userName), ("bonkable", bonkableName)), user, Filter.PvsExcept(user), true); + var othersMessage = Loc.GetString("bonkable-success-message-others", ("user", userName), ("bonkable", bonkableName)); // Local, bonking player - _popupSystem.PopupClient(Loc.GetString("bonkable-success-message-user", ("user", userName), ("bonkable", bonkableName)), user, user); + var selfMessage = Loc.GetString("bonkable-success-message-user", ("user", userName), ("bonkable", bonkableName)); + + _popupSystem.PopupPredicted(selfMessage, othersMessage, user, user); } else if (source != null) { diff --git a/Content.Shared/Climbing/Systems/ClimbSystem.cs b/Content.Shared/Climbing/Systems/ClimbSystem.cs index 5471f072501..1bdaecf730f 100644 --- a/Content.Shared/Climbing/Systems/ClimbSystem.cs +++ b/Content.Shared/Climbing/Systems/ClimbSystem.cs @@ -307,8 +307,7 @@ private void Climb(EntityUid uid, EntityUid user, EntityUid climbable, bool sile ("climbable", climbable)); } - _popupSystem.PopupEntity(othersMessage, uid, Filter.PvsExcept(user, entityManager: EntityManager), true); - _popupSystem.PopupClient(selfMessage, uid, user); + _popupSystem.PopupPredicted(selfMessage, othersMessage, uid, user); } /// diff --git a/Content.Shared/Clothing/ClothingEvents.cs b/Content.Shared/Clothing/ClothingEvents.cs index 1dcce2402ae..83afea45973 100644 --- a/Content.Shared/Clothing/ClothingEvents.cs +++ b/Content.Shared/Clothing/ClothingEvents.cs @@ -1,5 +1,6 @@ using Content.Shared.Actions; +using Content.Shared.Clothing.Components; namespace Content.Shared.Clothing; @@ -71,3 +72,31 @@ public sealed partial class ToggleMaskEvent : InstantActionEvent { } /// [ByRefEvent] public readonly record struct WearerMaskToggledEvent(bool IsToggled); + +/// +/// Raised on the clothing entity when it is equipped to a valid slot, +/// as determined by . +/// +[ByRefEvent] +public readonly record struct ClothingGotEquippedEvent(EntityUid Wearer, ClothingComponent Clothing); + +/// +/// Raised on the clothing entity when it is unequipped from a valid slot, +/// as determined by . +/// +[ByRefEvent] +public readonly record struct ClothingGotUnequippedEvent(EntityUid Wearer, ClothingComponent Clothing); + +/// +/// Raised on an entity when they equip a clothing item to a valid slot, +/// as determined by . +/// +[ByRefEvent] +public readonly record struct ClothingDidEquippedEvent(Entity Clothing); + +/// +/// Raised on an entity when they unequip a clothing item from a valid slot, +/// as determined by . +/// +[ByRefEvent] +public readonly record struct ClothingDidUnequippedEvent(Entity Clothing); diff --git a/Content.Shared/Clothing/Components/ClothingComponent.cs b/Content.Shared/Clothing/Components/ClothingComponent.cs index 0f4c7f68bfc..6d7226e767d 100644 --- a/Content.Shared/Clothing/Components/ClothingComponent.cs +++ b/Content.Shared/Clothing/Components/ClothingComponent.cs @@ -66,6 +66,9 @@ public sealed partial class ClothingComponent : Component [DataField("unisexMask")] public ClothingMask UnisexMask = ClothingMask.UniformFull; + /// + /// Name of the inventory slot the clothing is in. + /// public string? InSlot; [DataField, ViewVariables(VVAccess.ReadWrite)] diff --git a/Content.Shared/Clothing/Components/HideLayerClothingComponent.cs b/Content.Shared/Clothing/Components/HideLayerClothingComponent.cs new file mode 100644 index 00000000000..ac3d9b97896 --- /dev/null +++ b/Content.Shared/Clothing/Components/HideLayerClothingComponent.cs @@ -0,0 +1,24 @@ +using Content.Shared.Humanoid; +using Robust.Shared.GameStates; + +namespace Content.Shared.Clothing.Components; + +/// +/// This is used for a clothing item that hides an appearance layer. +/// The entity's HumanoidAppearance component must have the corresponding hideLayerOnEquip value. +/// +[RegisterComponent, NetworkedComponent] +public sealed partial class HideLayerClothingComponent : Component +{ + /// + /// The appearance layer to hide. + /// + [DataField] + public HashSet Slots = new(); + + /// + /// If true, the layer will only hide when the item is in a toggled state (e.g. masks) + /// + [DataField] + public bool HideOnToggle = false; +} diff --git a/Content.Shared/Clothing/Components/WaddleWhenWornComponent.cs b/Content.Shared/Clothing/Components/WaddleWhenWornComponent.cs new file mode 100644 index 00000000000..5cd7a724577 --- /dev/null +++ b/Content.Shared/Clothing/Components/WaddleWhenWornComponent.cs @@ -0,0 +1,35 @@ +using System.Numerics; + +namespace Content.Shared.Clothing.Components; + +/// +/// Defines something as causing waddling when worn. +/// +[RegisterComponent] +public sealed partial class WaddleWhenWornComponent : Component +{ + /// + /// How high should they hop during the waddle? Higher hop = more energy. + /// + [DataField] + public Vector2 HopIntensity = new(0, 0.25f); + + /// + /// How far should they rock backward and forward during the waddle? + /// Each step will alternate between this being a positive and negative rotation. More rock = more scary. + /// + [DataField] + public float TumbleIntensity = 20.0f; + + /// + /// How long should a complete step take? Less time = more chaos. + /// + [DataField] + public float AnimationLength = 0.66f; + + /// + /// How much shorter should the animation be when running? + /// + [DataField] + public float RunAnimationLengthMultiplier = 0.568f; +} diff --git a/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs b/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs index 85df04d20a1..d85506df4b1 100644 --- a/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs +++ b/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs @@ -6,26 +6,19 @@ using Content.Shared.Inventory; using Content.Shared.Inventory.Events; using Content.Shared.Item; -using Content.Shared.Tag; +using Robust.Shared.Containers; using Robust.Shared.GameStates; -using System.Linq; namespace Content.Shared.Clothing.EntitySystems; public abstract class ClothingSystem : EntitySystem { [Dependency] private readonly SharedItemSystem _itemSys = default!; + [Dependency] private readonly SharedContainerSystem _containerSys = default!; [Dependency] private readonly SharedHumanoidAppearanceSystem _humanoidSystem = default!; - [Dependency] private readonly TagSystem _tagSystem = default!; [Dependency] private readonly InventorySystem _invSystem = default!; [Dependency] private readonly SharedHandsSystem _handsSystem = default!; - [ValidatePrototypeId] - private const string HairTag = "HidesHair"; - - [ValidatePrototypeId] - private const string NoseTag = "HidesNose"; - public override void Initialize() { base.Initialize(); @@ -89,18 +82,22 @@ private void QuickEquip( } } - private void ToggleVisualLayer(EntityUid equipee, HumanoidVisualLayers layer, string tag) + private void ToggleVisualLayers(EntityUid equipee, HashSet layers, HashSet appearanceLayers) { - InventorySystem.InventorySlotEnumerator enumerator = _invSystem.GetSlotEnumerator(equipee, SlotFlags.HEAD ^ SlotFlags.MASK); - bool shouldLayerShow = true; - - while (enumerator.NextItem(out EntityUid item)) + foreach (HumanoidVisualLayers layer in layers) { - if (_tagSystem.HasTag(item, tag)) + if (!appearanceLayers.Contains(layer)) + break; + + InventorySystem.InventorySlotEnumerator enumerator = _invSystem.GetSlotEnumerator(equipee); + + bool shouldLayerShow = true; + while (enumerator.NextItem(out EntityUid item)) { - if (tag == NoseTag) //Special check needs to be made for NoseTag, due to masks being toggleable + if (TryComp(item, out HideLayerClothingComponent? comp)) { - if (TryComp(item, out MaskComponent? mask) && TryComp(item, out ClothingComponent? clothing)) + //Checks for mask toggling. TODO: Make a generic system for this + if (comp.HideOnToggle && TryComp(item, out MaskComponent? mask) && TryComp(item, out ClothingComponent? clothing)) { if (clothing.EquippedPrefix != mask.EquippedPrefix) { @@ -114,32 +111,39 @@ private void ToggleVisualLayer(EntityUid equipee, HumanoidVisualLayers layer, st break; } } - else - { - shouldLayerShow = false; - break; - } } + _humanoidSystem.SetLayerVisibility(equipee, layer, shouldLayerShow); } - _humanoidSystem.SetLayerVisibility(equipee, layer, shouldLayerShow); } protected virtual void OnGotEquipped(EntityUid uid, ClothingComponent component, GotEquippedEvent args) { component.InSlot = args.Slot; - if ((new string[] { "head" }).Contains(args.Slot) && _tagSystem.HasTag(args.Equipment, HairTag)) - ToggleVisualLayer(args.Equipee, HumanoidVisualLayers.Hair, HairTag); - if ((new string[] { "mask", "head" }).Contains(args.Slot) && _tagSystem.HasTag(args.Equipment, NoseTag)) - ToggleVisualLayer(args.Equipee, HumanoidVisualLayers.Snout, NoseTag); + CheckEquipmentForLayerHide(args.Equipment, args.Equipee); + + if ((component.Slots & args.SlotFlags) != SlotFlags.NONE) + { + var gotEquippedEvent = new ClothingGotEquippedEvent(args.Equipee, component); + RaiseLocalEvent(uid, ref gotEquippedEvent); + + var didEquippedEvent = new ClothingDidEquippedEvent((uid, component)); + RaiseLocalEvent(args.Equipee, ref didEquippedEvent); + } } protected virtual void OnGotUnequipped(EntityUid uid, ClothingComponent component, GotUnequippedEvent args) { + if ((component.Slots & args.SlotFlags) != SlotFlags.NONE) + { + var gotUnequippedEvent = new ClothingGotUnequippedEvent(args.Equipee, component); + RaiseLocalEvent(uid, ref gotUnequippedEvent); + + var didUnequippedEvent = new ClothingDidUnequippedEvent((uid, component)); + RaiseLocalEvent(args.Equipee, ref didUnequippedEvent); + } + component.InSlot = null; - if ((new string[] { "head" }).Contains(args.Slot) && _tagSystem.HasTag(args.Equipment, HairTag)) - ToggleVisualLayer(args.Equipee, HumanoidVisualLayers.Hair, HairTag); - if ((new string[] { "mask", "head" }).Contains(args.Slot) && _tagSystem.HasTag(args.Equipment, NoseTag)) - ToggleVisualLayer(args.Equipee, HumanoidVisualLayers.Snout, NoseTag); + CheckEquipmentForLayerHide(args.Equipment, args.Equipee); } private void OnGetState(EntityUid uid, ClothingComponent component, ref ComponentGetState args) @@ -150,14 +154,20 @@ private void OnGetState(EntityUid uid, ClothingComponent component, ref Componen private void OnHandleState(EntityUid uid, ClothingComponent component, ref ComponentHandleState args) { if (args.Current is ClothingComponentState state) + { SetEquippedPrefix(uid, state.EquippedPrefix, component); + if (component.InSlot != null && _containerSys.TryGetContainingContainer(uid, out var container)) + { + CheckEquipmentForLayerHide(uid, container.Owner); + } + } } private void OnMaskToggled(Entity ent, ref ItemMaskToggledEvent args) { //TODO: sprites for 'pulled down' state. defaults to invisible due to no sprite with this prefix SetEquippedPrefix(ent, args.IsToggled ? args.equippedPrefix : null, ent); - ToggleVisualLayer(args.Wearer, HumanoidVisualLayers.Snout, NoseTag); + CheckEquipmentForLayerHide(ent.Owner, args.Wearer); } private void OnEquipDoAfter(Entity ent, ref ClothingEquipDoAfterEvent args) @@ -176,6 +186,12 @@ private void OnUnequipDoAfter(Entity ent, ref ClothingUnequip _handsSystem.TryPickup(args.User, ent); } + private void CheckEquipmentForLayerHide(EntityUid equipment, EntityUid equipee) + { + if (TryComp(equipment, out HideLayerClothingComponent? clothesComp) && TryComp(equipee, out HumanoidAppearanceComponent? appearanceComp)) + ToggleVisualLayers(equipee, clothesComp.Slots, appearanceComp.HideLayersOnEquip); + } + #region Public API public void SetEquippedPrefix(EntityUid uid, string? prefix, ClothingComponent? clothing = null) diff --git a/Content.Shared/Clothing/EntitySystems/MaskSystem.cs b/Content.Shared/Clothing/EntitySystems/MaskSystem.cs index aab2a172dc1..d99777929f4 100644 --- a/Content.Shared/Clothing/EntitySystems/MaskSystem.cs +++ b/Content.Shared/Clothing/EntitySystems/MaskSystem.cs @@ -42,12 +42,10 @@ private void OnToggleMask(Entity ent, ref ToggleMaskEvent args) return; mask.IsToggled ^= true; - _actionSystem.SetToggled(mask.ToggleActionEntity, mask.IsToggled); - if (mask.IsToggled) - _popupSystem.PopupEntity(Loc.GetString("action-mask-pull-down-popup-message", ("mask", uid)), args.Performer, args.Performer); - else - _popupSystem.PopupEntity(Loc.GetString("action-mask-pull-up-popup-message", ("mask", uid)), args.Performer, args.Performer); + var dir = mask.IsToggled ? "down" : "up"; + var msg = $"action-mask-pull-{dir}-popup-message"; + _popupSystem.PopupEntity(Loc.GetString(msg, ("mask", uid)), args.Performer, args.Performer); ToggleMaskComponents(uid, mask, args.Performer, mask.EquippedPrefix); } @@ -55,18 +53,22 @@ private void OnToggleMask(Entity ent, ref ToggleMaskEvent args) // set to untoggled when unequipped, so it isn't left in a 'pulled down' state private void OnGotUnequipped(EntityUid uid, MaskComponent mask, GotUnequippedEvent args) { - if (mask.ToggleActionEntity == null) + if (!mask.IsToggled) return; mask.IsToggled = false; - Dirty(uid, mask); - _actionSystem.SetToggled(mask.ToggleActionEntity, mask.IsToggled); - ToggleMaskComponents(uid, mask, args.Equipee, mask.EquippedPrefix, true); } + /// + /// Called after setting IsToggled, raises events and dirties. + /// private void ToggleMaskComponents(EntityUid uid, MaskComponent mask, EntityUid wearer, string? equippedPrefix = null, bool isEquip = false) { + Dirty(uid, mask); + if (mask.ToggleActionEntity is {} action) + _actionSystem.SetToggled(action, mask.IsToggled); + var maskEv = new ItemMaskToggledEvent(wearer, equippedPrefix, mask.IsToggled, isEquip); RaiseLocalEvent(uid, ref maskEv); diff --git a/Content.Shared/Clothing/EntitySystems/SkatesSystem.cs b/Content.Shared/Clothing/EntitySystems/SkatesSystem.cs index 7d748a67a45..bbb640bd986 100644 --- a/Content.Shared/Clothing/EntitySystems/SkatesSystem.cs +++ b/Content.Shared/Clothing/EntitySystems/SkatesSystem.cs @@ -17,34 +17,28 @@ public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnGotEquipped); - SubscribeLocalEvent(OnGotUnequipped); + SubscribeLocalEvent(OnGotEquipped); + SubscribeLocalEvent(OnGotUnequipped); } /// /// When item is unequipped from the shoe slot, friction, aceleration and collide on impact return to default settings. /// - public void OnGotUnequipped(EntityUid uid, SkatesComponent component, GotUnequippedEvent args) + public void OnGotUnequipped(EntityUid uid, SkatesComponent component, ClothingGotUnequippedEvent args) { - if (!TryComp(args.Equipee, out MovementSpeedModifierComponent? speedModifier)) + if (!TryComp(args.Wearer, out MovementSpeedModifierComponent? speedModifier)) return; - if (args.Slot == "shoes") - { - _move.ChangeFriction(args.Equipee, MovementSpeedModifierComponent.DefaultFriction, MovementSpeedModifierComponent.DefaultFrictionNoInput, MovementSpeedModifierComponent.DefaultAcceleration, speedModifier); - _impact.ChangeCollide(args.Equipee, component.DefaultMinimumSpeed, component.DefaultStunSeconds, component.DefaultDamageCooldown, component.DefaultSpeedDamage); - } + _move.ChangeFriction(args.Wearer, MovementSpeedModifierComponent.DefaultFriction, MovementSpeedModifierComponent.DefaultFrictionNoInput, MovementSpeedModifierComponent.DefaultAcceleration, speedModifier); + _impact.ChangeCollide(args.Wearer, component.DefaultMinimumSpeed, component.DefaultStunSeconds, component.DefaultDamageCooldown, component.DefaultSpeedDamage); } /// /// When item is equipped into the shoe slot, friction, acceleration and collide on impact are adjusted. /// - private void OnGotEquipped(EntityUid uid, SkatesComponent component, GotEquippedEvent args) + private void OnGotEquipped(EntityUid uid, SkatesComponent component, ClothingGotEquippedEvent args) { - if (args.Slot == "shoes") - { - _move.ChangeFriction(args.Equipee, component.Friction, component.FrictionNoInput, component.Acceleration); - _impact.ChangeCollide(args.Equipee, component.MinimumSpeed, component.StunSeconds, component.DamageCooldown, component.SpeedDamage); - } + _move.ChangeFriction(args.Wearer, component.Friction, component.FrictionNoInput, component.Acceleration); + _impact.ChangeCollide(args.Wearer, component.MinimumSpeed, component.StunSeconds, component.DamageCooldown, component.SpeedDamage); } } diff --git a/Content.Shared/Damage/Prototypes/DamageModifierSetPrototype.cs b/Content.Shared/Damage/Prototypes/DamageModifierSetPrototype.cs index 99e13ee2842..a50856b0448 100644 --- a/Content.Shared/Damage/Prototypes/DamageModifierSetPrototype.cs +++ b/Content.Shared/Damage/Prototypes/DamageModifierSetPrototype.cs @@ -10,7 +10,7 @@ namespace Content.Shared.Damage.Prototypes /// just want normal data to be deserialized. /// [Prototype("damageModifierSet")] - public sealed class DamageModifierSetPrototype : DamageModifierSet, IPrototype + public sealed partial class DamageModifierSetPrototype : DamageModifierSet, IPrototype { [ViewVariables] [IdDataField] diff --git a/Content.Shared/DeviceLinking/DevicePortPrototype.cs b/Content.Shared/DeviceLinking/DevicePortPrototype.cs index c0a419ee653..e3421dda9db 100644 --- a/Content.Shared/DeviceLinking/DevicePortPrototype.cs +++ b/Content.Shared/DeviceLinking/DevicePortPrototype.cs @@ -29,13 +29,13 @@ public abstract class DevicePortPrototype [Prototype("sinkPort")] [Serializable, NetSerializable] -public sealed class SinkPortPrototype : DevicePortPrototype, IPrototype +public sealed partial class SinkPortPrototype : DevicePortPrototype, IPrototype { } [Prototype("sourcePort")] [Serializable, NetSerializable] -public sealed class SourcePortPrototype : DevicePortPrototype, IPrototype +public sealed partial class SourcePortPrototype : DevicePortPrototype, IPrototype { /// /// This is a set of sink ports that this source port will attempt to link to when using the diff --git a/Content.Shared/Flash/Components/FlashComponent.cs b/Content.Shared/Flash/Components/FlashComponent.cs index a26e32cb70f..a9098bc85a9 100644 --- a/Content.Shared/Flash/Components/FlashComponent.cs +++ b/Content.Shared/Flash/Components/FlashComponent.cs @@ -12,6 +12,13 @@ public sealed partial class FlashComponent : Component [ViewVariables(VVAccess.ReadWrite)] public int FlashDuration { get; set; } = 5000; + /// + /// How long a target is stunned when a melee flash is used. + /// If null, melee flashes will not stun at all + /// + [DataField] + public TimeSpan? MeleeStunDuration = TimeSpan.FromSeconds(1.5); + [DataField("range")] [ViewVariables(VVAccess.ReadWrite)] public float Range { get; set; } = 7f; @@ -32,5 +39,8 @@ public sealed partial class FlashComponent : Component }; public bool Flashing; + + [DataField] + public float Probability = 1f; } } diff --git a/Content.Shared/Flash/Components/FlashOnTriggerComponent.cs b/Content.Shared/Flash/Components/FlashOnTriggerComponent.cs index d1270e9db74..7658ca0ae5a 100644 --- a/Content.Shared/Flash/Components/FlashOnTriggerComponent.cs +++ b/Content.Shared/Flash/Components/FlashOnTriggerComponent.cs @@ -9,4 +9,5 @@ public sealed partial class FlashOnTriggerComponent : Component { [DataField] public float Range = 1.0f; [DataField] public float Duration = 8.0f; + [DataField] public float Probability = 1.0f; } diff --git a/Content.Shared/Humanoid/HumanoidAppearanceComponent.cs b/Content.Shared/Humanoid/HumanoidAppearanceComponent.cs index e948bd604bc..b53235f596b 100644 --- a/Content.Shared/Humanoid/HumanoidAppearanceComponent.cs +++ b/Content.Shared/Humanoid/HumanoidAppearanceComponent.cs @@ -85,6 +85,12 @@ public sealed partial class HumanoidAppearanceComponent : Component [ViewVariables(VVAccess.ReadOnly)] public Color? CachedFacialHairColor; + /// + /// Which layers of this humanoid that should be hidden on equipping a corresponding item.. + /// + [DataField] + public HashSet HideLayersOnEquip = [HumanoidVisualLayers.Hair]; + /// /// DeltaV - let paradox anomaly be cloned /// diff --git a/Content.Shared/Humanoid/HumanoidCharacterAppearance.cs b/Content.Shared/Humanoid/HumanoidCharacterAppearance.cs index f1f7de5c11a..95c7425e2ee 100644 --- a/Content.Shared/Humanoid/HumanoidCharacterAppearance.cs +++ b/Content.Shared/Humanoid/HumanoidCharacterAppearance.cs @@ -5,262 +5,246 @@ using Robust.Shared.Random; using Robust.Shared.Serialization; -namespace Content.Shared.Humanoid +namespace Content.Shared.Humanoid; + +[DataDefinition] +[Serializable, NetSerializable] +public sealed partial class HumanoidCharacterAppearance : ICharacterAppearance { - [DataDefinition] - [Serializable, NetSerializable] - public sealed partial class HumanoidCharacterAppearance : ICharacterAppearance + public HumanoidCharacterAppearance(string hairStyleId, + Color hairColor, + string facialHairStyleId, + Color facialHairColor, + Color eyeColor, + Color skinColor, + List markings) { - public HumanoidCharacterAppearance(string hairStyleId, - Color hairColor, - string facialHairStyleId, - Color facialHairColor, - Color eyeColor, - Color skinColor, - List markings) - { - HairStyleId = hairStyleId; - HairColor = ClampColor(hairColor); - FacialHairStyleId = facialHairStyleId; - FacialHairColor = ClampColor(facialHairColor); - EyeColor = ClampColor(eyeColor); - SkinColor = ClampColor(skinColor); - Markings = markings; - } + HairStyleId = hairStyleId; + HairColor = ClampColor(hairColor); + FacialHairStyleId = facialHairStyleId; + FacialHairColor = ClampColor(facialHairColor); + EyeColor = ClampColor(eyeColor); + SkinColor = ClampColor(skinColor); + Markings = markings; + } - [DataField("hair")] - public string HairStyleId { get; private set; } + [DataField("hair")] + public string HairStyleId { get; private set; } - [DataField("hairColor")] - public Color HairColor { get; private set; } + [DataField("hairColor")] + public Color HairColor { get; private set; } - [DataField("facialHair")] - public string FacialHairStyleId { get; private set; } + [DataField("facialHair")] + public string FacialHairStyleId { get; private set; } - [DataField("facialHairColor")] - public Color FacialHairColor { get; private set; } + [DataField("facialHairColor")] + public Color FacialHairColor { get; private set; } - [DataField("eyeColor")] - public Color EyeColor { get; private set; } + [DataField("eyeColor")] + public Color EyeColor { get; private set; } - [DataField("skinColor")] - public Color SkinColor { get; private set; } + [DataField("skinColor")] + public Color SkinColor { get; private set; } - [DataField("markings")] - public List Markings { get; private set; } + [DataField("markings")] + public List Markings { get; private set; } - public HumanoidCharacterAppearance WithHairStyleName(string newName) - { - return new(newName, HairColor, FacialHairStyleId, FacialHairColor, EyeColor, SkinColor, Markings); - } + public HumanoidCharacterAppearance WithHairStyleName(string newName) + { + return new(newName, HairColor, FacialHairStyleId, FacialHairColor, EyeColor, SkinColor, Markings); + } - public HumanoidCharacterAppearance WithHairColor(Color newColor) - { - return new(HairStyleId, newColor, FacialHairStyleId, FacialHairColor, EyeColor, SkinColor, Markings); - } + public HumanoidCharacterAppearance WithHairColor(Color newColor) + { + return new(HairStyleId, newColor, FacialHairStyleId, FacialHairColor, EyeColor, SkinColor, Markings); + } - public HumanoidCharacterAppearance WithFacialHairStyleName(string newName) - { - return new(HairStyleId, HairColor, newName, FacialHairColor, EyeColor, SkinColor, Markings); - } + public HumanoidCharacterAppearance WithFacialHairStyleName(string newName) + { + return new(HairStyleId, HairColor, newName, FacialHairColor, EyeColor, SkinColor, Markings); + } - public HumanoidCharacterAppearance WithFacialHairColor(Color newColor) - { - return new(HairStyleId, HairColor, FacialHairStyleId, newColor, EyeColor, SkinColor, Markings); - } + public HumanoidCharacterAppearance WithFacialHairColor(Color newColor) + { + return new(HairStyleId, HairColor, FacialHairStyleId, newColor, EyeColor, SkinColor, Markings); + } - public HumanoidCharacterAppearance WithEyeColor(Color newColor) - { - return new(HairStyleId, HairColor, FacialHairStyleId, FacialHairColor, newColor, SkinColor, Markings); - } + public HumanoidCharacterAppearance WithEyeColor(Color newColor) + { + return new(HairStyleId, HairColor, FacialHairStyleId, FacialHairColor, newColor, SkinColor, Markings); + } - public HumanoidCharacterAppearance WithSkinColor(Color newColor) - { - return new(HairStyleId, HairColor, FacialHairStyleId, FacialHairColor, EyeColor, newColor, Markings); - } + public HumanoidCharacterAppearance WithSkinColor(Color newColor) + { + return new(HairStyleId, HairColor, FacialHairStyleId, FacialHairColor, EyeColor, newColor, Markings); + } - public HumanoidCharacterAppearance WithMarkings(List newMarkings) + public HumanoidCharacterAppearance WithMarkings(List newMarkings) + { + return new(HairStyleId, HairColor, FacialHairStyleId, FacialHairColor, EyeColor, SkinColor, newMarkings); + } + + public HumanoidCharacterAppearance() : this( + HairStyles.DefaultHairStyle, + Color.Black, + HairStyles.DefaultFacialHairStyle, + Color.Black, + Color.Black, + Humanoid.SkinColor.ValidHumanSkinTone, + new () + ) + { + } + + public static HumanoidCharacterAppearance DefaultWithSpecies(string species) + { + var speciesPrototype = IoCManager.Resolve().Index(species); + var skinColor = speciesPrototype.SkinColoration switch { - return new(HairStyleId, HairColor, FacialHairStyleId, FacialHairColor, EyeColor, SkinColor, newMarkings); - } + HumanoidSkinColor.HumanToned => Humanoid.SkinColor.HumanSkinTone(speciesPrototype.DefaultHumanSkinTone), + HumanoidSkinColor.Hues => speciesPrototype.DefaultSkinTone, + HumanoidSkinColor.TintedHues => Humanoid.SkinColor.TintedHues(speciesPrototype.DefaultSkinTone), + // DeltaV - Blended tint for moths + HumanoidSkinColor.TintedHuesSkin => Humanoid.SkinColor.TintedHuesSkin(speciesPrototype.DefaultSkinTone, speciesPrototype.DefaultSkinTone), + _ => Humanoid.SkinColor.ValidHumanSkinTone + }; - public HumanoidCharacterAppearance() : this( + return new( HairStyles.DefaultHairStyle, Color.Black, HairStyles.DefaultFacialHairStyle, Color.Black, Color.Black, - Humanoid.SkinColor.ValidHumanSkinTone, + skinColor, new () - ) - { - } + ); + } - public static HumanoidCharacterAppearance DefaultWithSpecies(string species) - { - var speciesPrototype = IoCManager.Resolve().Index(species); - var skinColor = speciesPrototype.SkinColoration switch - { - HumanoidSkinColor.HumanToned => Humanoid.SkinColor.HumanSkinTone(speciesPrototype.DefaultHumanSkinTone), - HumanoidSkinColor.Hues => speciesPrototype.DefaultSkinTone, - HumanoidSkinColor.TintedHues => Humanoid.SkinColor.TintedHues(speciesPrototype.DefaultSkinTone), - // DeltaV - Blended tint for moths - HumanoidSkinColor.TintedHuesSkin => Humanoid.SkinColor.TintedHuesSkin(speciesPrototype.DefaultSkinTone, speciesPrototype.DefaultSkinTone), - _ => Humanoid.SkinColor.ValidHumanSkinTone - }; + private static IReadOnlyList RealisticEyeColors = new List + { + Color.Brown, + Color.Gray, + Color.Azure, + Color.SteelBlue, + Color.Black + }; + + public static HumanoidCharacterAppearance Random(string species, Sex sex) + { + var random = IoCManager.Resolve(); + var markingManager = IoCManager.Resolve(); + var hairStyles = markingManager.MarkingsByCategoryAndSpecies(MarkingCategories.Hair, species).Keys.ToList(); + var facialHairStyles = markingManager.MarkingsByCategoryAndSpecies(MarkingCategories.FacialHair, species).Keys.ToList(); - return new( - HairStyles.DefaultHairStyle, - Color.Black, - HairStyles.DefaultFacialHairStyle, - Color.Black, - Color.Black, - skinColor, - new () - ); - } + var newHairStyle = hairStyles.Count > 0 + ? random.Pick(hairStyles) + : HairStyles.DefaultHairStyle; - private static IReadOnlyList RealisticEyeColors = new List - { - Color.Brown, - Color.Gray, - Color.Azure, - Color.SteelBlue, - Color.Black - }; - - public static HumanoidCharacterAppearance Random(string species, Sex sex) - { - var random = IoCManager.Resolve(); - var markingManager = IoCManager.Resolve(); - var hairStyles = markingManager.MarkingsByCategoryAndSpecies(MarkingCategories.Hair, species).Keys.ToList(); - var facialHairStyles = markingManager.MarkingsByCategoryAndSpecies(MarkingCategories.FacialHair, species).Keys.ToList(); + var newFacialHairStyle = facialHairStyles.Count == 0 || sex == Sex.Female + ? HairStyles.DefaultFacialHairStyle + : random.Pick(facialHairStyles); - var newHairStyle = hairStyles.Count > 0 - ? random.Pick(hairStyles) - : HairStyles.DefaultHairStyle; + var newHairColor = random.Pick(HairStyles.RealisticHairColors); + newHairColor = newHairColor + .WithRed(RandomizeColor(newHairColor.R)) + .WithGreen(RandomizeColor(newHairColor.G)) + .WithBlue(RandomizeColor(newHairColor.B)); - var newFacialHairStyle = facialHairStyles.Count == 0 || sex == Sex.Female - ? HairStyles.DefaultFacialHairStyle - : random.Pick(facialHairStyles); + // TODO: Add random markings - var newHairColor = random.Pick(HairStyles.RealisticHairColors); - newHairColor = newHairColor - .WithRed(RandomizeColor(newHairColor.R)) - .WithGreen(RandomizeColor(newHairColor.G)) - .WithBlue(RandomizeColor(newHairColor.B)); + var newEyeColor = random.Pick(RealisticEyeColors); - // TODO: Add random markings + var skinType = IoCManager.Resolve().Index(species).SkinColoration; + var skinTone = IoCManager.Resolve().Index(species).DefaultSkinTone; // DeltaV, required for tone blending - var newEyeColor = random.Pick(RealisticEyeColors); + var newSkinColor = new Color(random.NextFloat(1), random.NextFloat(1), random.NextFloat(1), 1); + switch (skinType) + { + case HumanoidSkinColor.HumanToned: + var tone = Math.Round(Humanoid.SkinColor.HumanSkinToneFromColor(newSkinColor)); + newSkinColor = Humanoid.SkinColor.HumanSkinTone((int)tone); + break; + case HumanoidSkinColor.Hues: + break; + case HumanoidSkinColor.TintedHues: + newSkinColor = Humanoid.SkinColor.ValidTintedHuesSkinTone(newSkinColor); + break; + case HumanoidSkinColor.TintedHuesSkin: // DeltaV, tone blending + newSkinColor = Humanoid.SkinColor.ValidTintedHuesSkinTone(newSkinColor); + break; + } - var skinType = IoCManager.Resolve().Index(species).SkinColoration; - var skinTone = IoCManager.Resolve().Index(species).DefaultSkinTone; // DeltaV, required for tone blending + return new HumanoidCharacterAppearance(newHairStyle, newHairColor, newFacialHairStyle, newHairColor, newEyeColor, newSkinColor, new ()); - var newSkinColor = Humanoid.SkinColor.ValidHumanSkinTone; - switch (skinType) - { - case HumanoidSkinColor.HumanToned: - var tone = random.Next(0, 100); - newSkinColor = Humanoid.SkinColor.HumanSkinTone(tone); - break; - case HumanoidSkinColor.Hues: - case HumanoidSkinColor.TintedHues: - var rbyte = random.NextByte(); - var gbyte = random.NextByte(); - var bbyte = random.NextByte(); - newSkinColor = new Color(rbyte, gbyte, bbyte); - break; - case HumanoidSkinColor.TintedHuesSkin: // DeltaV, tone blending - rbyte = random.NextByte(); - gbyte = random.NextByte(); - bbyte = random.NextByte(); - newSkinColor = new Color(rbyte, gbyte, bbyte); - break; - } + float RandomizeColor(float channel) + { + return MathHelper.Clamp01(channel + random.Next(-25, 25) / 100f); + } + } - if (skinType == HumanoidSkinColor.TintedHues) - { - newSkinColor = Humanoid.SkinColor.ValidTintedHuesSkinTone(newSkinColor); - } + public static Color ClampColor(Color color) + { + return new(color.RByte, color.GByte, color.BByte); + } - if (skinType == HumanoidSkinColor.TintedHuesSkin) // DeltaV, tone blending - { - newSkinColor = Humanoid.SkinColor.ValidTintedHuesSkinTone(skinTone, newSkinColor); - } + public static HumanoidCharacterAppearance EnsureValid(HumanoidCharacterAppearance appearance, string species, Sex sex) + { + var hairStyleId = appearance.HairStyleId; + var facialHairStyleId = appearance.FacialHairStyleId; - return new HumanoidCharacterAppearance(newHairStyle, newHairColor, newFacialHairStyle, newHairColor, newEyeColor, newSkinColor, new ()); + var hairColor = ClampColor(appearance.HairColor); + var facialHairColor = ClampColor(appearance.FacialHairColor); + var eyeColor = ClampColor(appearance.EyeColor); - float RandomizeColor(float channel) - { - return MathHelper.Clamp01(channel + random.Next(-25, 25) / 100f); - } - } + var proto = IoCManager.Resolve(); + var markingManager = IoCManager.Resolve(); - public static Color ClampColor(Color color) + if (!markingManager.MarkingsByCategory(MarkingCategories.Hair).ContainsKey(hairStyleId)) { - return new(color.RByte, color.GByte, color.BByte); + hairStyleId = HairStyles.DefaultHairStyle; } - public static HumanoidCharacterAppearance EnsureValid(HumanoidCharacterAppearance appearance, string species, Sex sex) + if (!markingManager.MarkingsByCategory(MarkingCategories.FacialHair).ContainsKey(facialHairStyleId)) { - var hairStyleId = appearance.HairStyleId; - var facialHairStyleId = appearance.FacialHairStyleId; - - var hairColor = ClampColor(appearance.HairColor); - var facialHairColor = ClampColor(appearance.FacialHairColor); - var eyeColor = ClampColor(appearance.EyeColor); - - var proto = IoCManager.Resolve(); - var markingManager = IoCManager.Resolve(); - - if (!markingManager.MarkingsByCategory(MarkingCategories.Hair).ContainsKey(hairStyleId)) - { - hairStyleId = HairStyles.DefaultHairStyle; - } + facialHairStyleId = HairStyles.DefaultFacialHairStyle; + } - if (!markingManager.MarkingsByCategory(MarkingCategories.FacialHair).ContainsKey(facialHairStyleId)) - { - facialHairStyleId = HairStyles.DefaultFacialHairStyle; - } + var markingSet = new MarkingSet(); + var skinColor = appearance.SkinColor; + if (proto.TryIndex(species, out SpeciesPrototype? speciesProto)) + { + markingSet = new MarkingSet(appearance.Markings, speciesProto.MarkingPoints, markingManager, proto); + markingSet.EnsureValid(markingManager); - var markingSet = new MarkingSet(); - var skinColor = appearance.SkinColor; - if (proto.TryIndex(species, out SpeciesPrototype? speciesProto)) + if (!Humanoid.SkinColor.VerifySkinColor(speciesProto.SkinColoration, skinColor)) { - markingSet = new MarkingSet(appearance.Markings, speciesProto.MarkingPoints, markingManager, proto); - markingSet.EnsureValid(markingManager); - - if (!Humanoid.SkinColor.VerifySkinColor(speciesProto.SkinColoration, skinColor)) - { - skinColor = Humanoid.SkinColor.ValidSkinTone(speciesProto.SkinColoration, skinColor); - } - - markingSet.EnsureSpecies(species, skinColor, markingManager); - markingSet.EnsureSexes(sex, markingManager); + skinColor = Humanoid.SkinColor.ValidSkinTone(speciesProto.SkinColoration, skinColor); } - return new HumanoidCharacterAppearance( - hairStyleId, - hairColor, - facialHairStyleId, - facialHairColor, - eyeColor, - skinColor, - markingSet.GetForwardEnumerator().ToList()); + markingSet.EnsureSpecies(species, skinColor, markingManager); + markingSet.EnsureSexes(sex, markingManager); } - public bool MemberwiseEquals(ICharacterAppearance maybeOther) - { - if (maybeOther is not HumanoidCharacterAppearance other) return false; - if (HairStyleId != other.HairStyleId) return false; - if (!HairColor.Equals(other.HairColor)) return false; - if (FacialHairStyleId != other.FacialHairStyleId) return false; - if (!FacialHairColor.Equals(other.FacialHairColor)) return false; - if (!EyeColor.Equals(other.EyeColor)) return false; - if (!SkinColor.Equals(other.SkinColor)) return false; - if (!Markings.SequenceEqual(other.Markings)) return false; - return true; - } + return new HumanoidCharacterAppearance( + hairStyleId, + hairColor, + facialHairStyleId, + facialHairColor, + eyeColor, + skinColor, + markingSet.GetForwardEnumerator().ToList()); + } + + public bool MemberwiseEquals(ICharacterAppearance maybeOther) + { + if (maybeOther is not HumanoidCharacterAppearance other) return false; + if (HairStyleId != other.HairStyleId) return false; + if (!HairColor.Equals(other.HairColor)) return false; + if (FacialHairStyleId != other.FacialHairStyleId) return false; + if (!FacialHairColor.Equals(other.FacialHairColor)) return false; + if (!EyeColor.Equals(other.EyeColor)) return false; + if (!SkinColor.Equals(other.SkinColor)) return false; + if (!Markings.SequenceEqual(other.Markings)) return false; + return true; } } diff --git a/Content.Shared/Humanoid/SharedHumanoidAppearanceSystem.cs b/Content.Shared/Humanoid/SharedHumanoidAppearanceSystem.cs index 02d7f0fdf96..af13b79afa3 100644 --- a/Content.Shared/Humanoid/SharedHumanoidAppearanceSystem.cs +++ b/Content.Shared/Humanoid/SharedHumanoidAppearanceSystem.cs @@ -5,6 +5,7 @@ using Content.Shared.SimpleStation14.DetailExaminable; using Content.Shared.Humanoid.Markings; using Content.Shared.Humanoid.Prototypes; +using Content.Shared.IdentityManagement; using Content.Shared.Preferences; using Content.Shared.SimpleStation14.HeightAdjust; using Robust.Shared.Configuration; @@ -26,7 +27,7 @@ namespace Content.Shared.Humanoid; public abstract class SharedHumanoidAppearanceSystem : EntitySystem { [Dependency] private readonly INetManager _netManager = default!; - [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + [Dependency] private readonly IPrototypeManager _proto = default!; [Dependency] private readonly MarkingManager _markingManager = default!; [Dependency] private readonly IConfigurationManager _configurationManager = default!; [Dependency] private readonly HeightAdjustSystem _heightAdjust = default!; @@ -37,7 +38,9 @@ public abstract class SharedHumanoidAppearanceSystem : EntitySystem public override void Initialize() { base.Initialize(); + SubscribeLocalEvent(OnInit); + SubscribeLocalEvent(OnExamined); } private void OnInit(EntityUid uid, HumanoidAppearanceComponent humanoid, ComponentInit args) @@ -48,7 +51,7 @@ private void OnInit(EntityUid uid, HumanoidAppearanceComponent humanoid, Compone } if (string.IsNullOrEmpty(humanoid.Initial) - || !_prototypeManager.TryIndex(humanoid.Initial, out HumanoidProfilePrototype? startingSet)) + || !_proto.TryIndex(humanoid.Initial, out HumanoidProfilePrototype? startingSet)) { LoadProfile(uid, HumanoidCharacterProfile.DefaultWithSpecies(humanoid.Species), humanoid); return; @@ -63,6 +66,15 @@ private void OnInit(EntityUid uid, HumanoidAppearanceComponent humanoid, Compone LoadProfile(uid, startingSet.Profile, humanoid); } + private void OnExamined(EntityUid uid, HumanoidAppearanceComponent component, ExaminedEvent args) + { + var identity = Identity.Entity(uid, EntityManager); + var species = GetSpeciesRepresentation(component.Species).ToLower(); + var age = GetAgeRepresentation(component.Species, component.Age); + + args.PushText(Loc.GetString("humanoid-appearance-component-examine", ("user", identity), ("age", age), ("species", species))); + } + /// /// Toggles a humanoid's sprite layer visibility. /// @@ -143,7 +155,7 @@ protected virtual void SetLayerVisibility( /// Humanoid component of the entity public void SetSpecies(EntityUid uid, string species, bool sync = true, HumanoidAppearanceComponent? humanoid = null) { - if (!Resolve(uid, ref humanoid) || !_prototypeManager.TryIndex(species, out var prototype)) + if (!Resolve(uid, ref humanoid) || !_proto.TryIndex(species, out var prototype)) { return; } @@ -151,7 +163,7 @@ public void SetSpecies(EntityUid uid, string species, bool sync = true, Humanoid humanoid.Species = species; humanoid.MarkingSet.EnsureSpecies(species, humanoid.SkinColor, _markingManager); var oldMarkings = humanoid.MarkingSet.GetForwardEnumerator().ToList(); - humanoid.MarkingSet = new(oldMarkings, prototype.MarkingPoints, _markingManager, _prototypeManager); + humanoid.MarkingSet = new(oldMarkings, prototype.MarkingPoints, _markingManager, _proto); if (sync) Dirty(uid, humanoid); @@ -171,7 +183,7 @@ public virtual void SetSkinColor(EntityUid uid, Color skinColor, bool sync = tru if (!Resolve(uid, ref humanoid)) return; - if (!_prototypeManager.TryIndex(humanoid.Species, out var species)) + if (!_proto.TryIndex(humanoid.Species, out var species)) { return; } @@ -355,24 +367,24 @@ public virtual void LoadProfile(EntityUid uid, HumanoidCharacterProfile profile, // Hair/facial hair - this may eventually be deprecated. // We need to ensure hair before applying it or coloring can try depend on markings that can be invalid - var hairColor = _markingManager.MustMatchSkin(profile.Species, HumanoidVisualLayers.Hair, out var hairAlpha, _prototypeManager) + var hairColor = _markingManager.MustMatchSkin(profile.Species, HumanoidVisualLayers.Hair, out var hairAlpha, _proto) ? profile.Appearance.SkinColor.WithAlpha(hairAlpha) : profile.Appearance.HairColor; - var facialHairColor = _markingManager.MustMatchSkin(profile.Species, HumanoidVisualLayers.FacialHair, out var facialHairAlpha, _prototypeManager) + var facialHairColor = _markingManager.MustMatchSkin(profile.Species, HumanoidVisualLayers.FacialHair, out var facialHairAlpha, _proto) ? profile.Appearance.SkinColor.WithAlpha(facialHairAlpha) : profile.Appearance.FacialHairColor; if (_markingManager.Markings.TryGetValue(profile.Appearance.HairStyleId, out var hairPrototype) && - _markingManager.CanBeApplied(profile.Species, profile.Sex, hairPrototype, _prototypeManager)) + _markingManager.CanBeApplied(profile.Species, profile.Sex, hairPrototype, _proto)) { AddMarking(uid, profile.Appearance.HairStyleId, hairColor, false); } if (_markingManager.Markings.TryGetValue(profile.Appearance.FacialHairStyleId, out var facialHairPrototype) && - _markingManager.CanBeApplied(profile.Species, profile.Sex, facialHairPrototype, _prototypeManager)) + _markingManager.CanBeApplied(profile.Species, profile.Sex, facialHairPrototype, _proto)) { AddMarking(uid, profile.Appearance.FacialHairStyleId, facialHairColor, false); } - humanoid.MarkingSet.EnsureSpecies(profile.Species, profile.Appearance.SkinColor, _markingManager, _prototypeManager); + humanoid.MarkingSet.EnsureSpecies(profile.Species, profile.Appearance.SkinColor, _markingManager, _proto); // Finally adding marking with forced colors foreach (var (marking, prototype) in markingFColored) @@ -478,4 +490,39 @@ public void AddMarking(EntityUid uid, string marking, IReadOnlyList color if (sync) Dirty(uid, humanoid); } + + /// + /// Takes ID of the species prototype, returns UI-friendly name of the species. + /// + public string GetSpeciesRepresentation(string speciesId) + { + if (_proto.TryIndex(speciesId, out var species)) + { + return Loc.GetString(species.Name); + } + + Log.Error("Tried to get representation of unknown species: {speciesId}"); + return Loc.GetString("humanoid-appearance-component-unknown-species"); + } + + public string GetAgeRepresentation(string species, int age) + { + if (!_proto.TryIndex(species, out var speciesPrototype)) + { + Log.Error("Tried to get age representation of species that couldn't be indexed: " + species); + return Loc.GetString("identity-age-young"); + } + + if (age < speciesPrototype.YoungAge) + { + return Loc.GetString("identity-age-young"); + } + + if (age < speciesPrototype.OldAge) + { + return Loc.GetString("identity-age-middle-aged"); + } + + return Loc.GetString("identity-age-old"); + } } diff --git a/Content.Shared/Inventory/Events/UnequippedEvents.cs b/Content.Shared/Inventory/Events/UnequippedEvents.cs index ef607f071af..4e1764a7d2d 100644 --- a/Content.Shared/Inventory/Events/UnequippedEvents.cs +++ b/Content.Shared/Inventory/Events/UnequippedEvents.cs @@ -22,12 +22,18 @@ public abstract class UnequippedEventBase : EntityEventArgs /// public readonly string SlotGroup; + /// + /// Slotflags of the slot the entity just got unequipped from. + /// + public readonly SlotFlags SlotFlags; + public UnequippedEventBase(EntityUid equipee, EntityUid equipment, SlotDefinition slotDefinition) { Equipee = equipee; Equipment = equipment; Slot = slotDefinition.Name; SlotGroup = slotDefinition.SlotGroup; + SlotFlags = slotDefinition.SlotFlags; } } diff --git a/Content.Shared/Inventory/InventorySystem.Relay.cs b/Content.Shared/Inventory/InventorySystem.Relay.cs index c43a5885077..b418a1d4162 100644 --- a/Content.Shared/Inventory/InventorySystem.Relay.cs +++ b/Content.Shared/Inventory/InventorySystem.Relay.cs @@ -38,12 +38,14 @@ public void InitializeRelay() SubscribeLocalEvent(RelayInventoryEvent); // ComponentActivatedClientSystems - SubscribeLocalEvent>(RelayInventoryEvent); + SubscribeLocalEvent>(RelayInventoryEvent); SubscribeLocalEvent>(RelayInventoryEvent); SubscribeLocalEvent>(RelayInventoryEvent); SubscribeLocalEvent>(RelayInventoryEvent); SubscribeLocalEvent>(RelayInventoryEvent); + SubscribeLocalEvent>(RelayInventoryEvent); SubscribeLocalEvent>(RelayInventoryEvent); + SubscribeLocalEvent>(RelayInventoryEvent); SubscribeLocalEvent>(OnGetEquipmentVerbs); } diff --git a/Content.Shared/Inventory/InventorySystem.Slots.cs b/Content.Shared/Inventory/InventorySystem.Slots.cs index cbbee3a85bd..c634b68e041 100644 --- a/Content.Shared/Inventory/InventorySystem.Slots.cs +++ b/Content.Shared/Inventory/InventorySystem.Slots.cs @@ -1,4 +1,6 @@ using System.Diagnostics.CodeAnalysis; +using Content.Shared.Inventory.Events; +using Content.Shared.Storage; using Robust.Shared.Containers; using Robust.Shared.Prototypes; using Robust.Shared.Utility; @@ -13,6 +15,7 @@ public partial class InventorySystem : EntitySystem private void InitializeSlots() { SubscribeLocalEvent(OnInit); + SubscribeNetworkEvent(OnOpenSlotStorage); _vvm.GetTypeHandler() .AddHandler(HandleViewVariablesSlots, ListViewVariablesSlots); @@ -40,6 +43,17 @@ protected virtual void OnInit(EntityUid uid, InventoryComponent component, Compo } } + private void OnOpenSlotStorage(OpenSlotStorageNetworkMessage ev, EntitySessionEventArgs args) + { + if (args.SenderSession.AttachedEntity is not { Valid: true } uid) + return; + + if (TryGetSlotEntity(uid, ev.Slot, out var entityUid) && TryComp(entityUid, out var storageComponent)) + { + _storageSystem.OpenStorageUI(entityUid.Value, uid, storageComponent); + } + } + public bool TryGetSlotContainer(EntityUid uid, string slot, [NotNullWhen(true)] out ContainerSlot? containerSlot, [NotNullWhen(true)] out SlotDefinition? slotDefinition, InventoryComponent? inventory = null, ContainerManagerComponent? containerComp = null) { diff --git a/Content.Shared/Inventory/InventoryTemplatePrototype.cs b/Content.Shared/Inventory/InventoryTemplatePrototype.cs index 585f80d4ce9..3a605523bf8 100644 --- a/Content.Shared/Inventory/InventoryTemplatePrototype.cs +++ b/Content.Shared/Inventory/InventoryTemplatePrototype.cs @@ -17,6 +17,10 @@ public sealed partial class SlotDefinition { [DataField("name", required: true)] public string Name { get; private set; } = string.Empty; [DataField("slotTexture")] public string TextureName { get; private set; } = "pocket"; + /// + /// The texture displayed in a slot when it has an item inside of it. + /// + [DataField] public string FullTextureName { get; private set; } = "SlotBackground"; [DataField("slotFlags")] public SlotFlags SlotFlags { get; private set; } = SlotFlags.PREVENTEQUIP; [DataField("showInWindow")] public bool ShowInWindow { get; private set; } = true; [DataField("slotGroup")] public string SlotGroup { get; private set; } = "Default"; diff --git a/Content.Shared/Labels/Components/PaperLabelTypeComponent.cs b/Content.Shared/Labels/Components/PaperLabelTypeComponent.cs new file mode 100644 index 00000000000..b045a6af3b2 --- /dev/null +++ b/Content.Shared/Labels/Components/PaperLabelTypeComponent.cs @@ -0,0 +1,16 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Labels.Components; + +/// +/// Specifies the paper type (see textures/storage/crates/labels.rsi to see currently supported paper types) to show on crates this label is attached to. +/// +[RegisterComponent, NetworkedComponent] +public sealed partial class PaperLabelTypeComponent : Component +{ + /// + /// The type of label to show. + /// + [DataField] + public string PaperType = "Paper"; +} diff --git a/Content.Shared/Labels/LabelEvents.cs b/Content.Shared/Labels/LabelEvents.cs index 362500b7681..9f00354af24 100644 --- a/Content.Shared/Labels/LabelEvents.cs +++ b/Content.Shared/Labels/LabelEvents.cs @@ -13,9 +13,11 @@ public enum HandLabelerUiKey } [Serializable, NetSerializable] - public enum PaperLabelVisuals + public enum PaperLabelVisuals : byte { + Layer, HasLabel, + LabelType } /// diff --git a/Content.Shared/Mind/SharedMindSystem.cs b/Content.Shared/Mind/SharedMindSystem.cs index 1d6d052f9a1..1898126d803 100644 --- a/Content.Shared/Mind/SharedMindSystem.cs +++ b/Content.Shared/Mind/SharedMindSystem.cs @@ -26,6 +26,7 @@ public abstract class SharedMindSystem : EntitySystem [Dependency] private readonly SharedObjectivesSystem _objectives = default!; [Dependency] private readonly SharedPlayerSystem _player = default!; [Dependency] private readonly MetaDataSystem _metadata = default!; + [Dependency] private readonly ISharedPlayerManager _playerMan = default!; [ViewVariables] protected readonly Dictionary UserMinds = new(); @@ -107,6 +108,7 @@ public virtual bool TryGetMind(NetUserId user, [NotNullWhen(true)] out EntityUid TryComp(mindIdValue, out mind)) { DebugTools.Assert(mind.UserId == user); + mindId = mindIdValue; return true; } @@ -422,29 +424,26 @@ public bool TryGetMind( return TryComp(mindId, out mind); } - public bool TryGetMind( - ContentPlayerData contentPlayer, - out EntityUid mindId, - [NotNullWhen(true)] out MindComponent? mind) - { - mindId = contentPlayer.Mind ?? default; - return TryComp(mindId, out mind); - } - + // TODO MIND make this return a nullable EntityUid or Entity public bool TryGetMind( ICommonSession? player, out EntityUid mindId, [NotNullWhen(true)] out MindComponent? mind) { - mindId = default; - mind = null; - if (_player.ContentData(player) is not { } data) + if (player == null) + { + mindId = default; + mind = null; return false; + } - if (TryGetMind(data, out mindId, out mind)) + if (TryGetMind(player.UserId, out var mindUid, out mind)) + { + mindId = mindUid.Value; return true; + } - DebugTools.AssertNull(data.Mind); + mindId = default; return false; } diff --git a/Content.Shared/Mobs/Components/MobStateComponent.cs b/Content.Shared/Mobs/Components/MobStateComponent.cs index a2ff349e133..7cff0779cbe 100644 --- a/Content.Shared/Mobs/Components/MobStateComponent.cs +++ b/Content.Shared/Mobs/Components/MobStateComponent.cs @@ -13,30 +13,21 @@ namespace Content.Shared.Mobs.Components /// [RegisterComponent] [NetworkedComponent] + [AutoGenerateComponentState] [Access(typeof(MobStateSystem), typeof(MobThresholdSystem))] public sealed partial class MobStateComponent : Component { //default mobstate is always the lowest state level - [ViewVariables] public MobState CurrentState { get; set; } = MobState.Alive; + [AutoNetworkedField, ViewVariables] + public MobState CurrentState { get; set; } = MobState.Alive; - [DataField("allowedStates")] public HashSet AllowedStates = new() + [DataField] + [AutoNetworkedField] + public HashSet AllowedStates = new() { MobState.Alive, MobState.Critical, MobState.Dead }; } - - [Serializable, NetSerializable] - public sealed class MobStateComponentState : ComponentState - { - public readonly MobState CurrentState; - public readonly HashSet AllowedStates; - - public MobStateComponentState(MobState currentState, HashSet allowedStates) - { - CurrentState = currentState; - AllowedStates = allowedStates; - } - } } diff --git a/Content.Shared/Mobs/Systems/MobStateSystem.cs b/Content.Shared/Mobs/Systems/MobStateSystem.cs index ff54c30aaf4..a3886dd42e1 100644 --- a/Content.Shared/Mobs/Systems/MobStateSystem.cs +++ b/Content.Shared/Mobs/Systems/MobStateSystem.cs @@ -25,8 +25,6 @@ public override void Initialize() _sawmill = _logManager.GetSawmill("MobState"); base.Initialize(); SubscribeEvents(); - SubscribeLocalEvent(OnGetComponentState); - SubscribeLocalEvent(OnHandleComponentState); } #region Public API @@ -100,24 +98,5 @@ public bool IsInvalidState(EntityUid target, MobStateComponent? component = null #region Private Implementation - private void OnHandleComponentState(EntityUid uid, MobStateComponent component, ref ComponentHandleState args) - { - if (args.Current is not MobStateComponentState state) - return; - - component.CurrentState = state.CurrentState; - - if (!component.AllowedStates.SetEquals(state.AllowedStates)) - { - component.AllowedStates.Clear(); - component.AllowedStates.UnionWith(state.AllowedStates); - } - } - - private void OnGetComponentState(EntityUid uid, MobStateComponent component, ref ComponentGetState args) - { - args.State = new MobStateComponentState(component.CurrentState, component.AllowedStates); - } - #endregion } diff --git a/Content.Shared/Movement/Components/WaddleAnimationComponent.cs b/Content.Shared/Movement/Components/WaddleAnimationComponent.cs new file mode 100644 index 00000000000..c43ef3042eb --- /dev/null +++ b/Content.Shared/Movement/Components/WaddleAnimationComponent.cs @@ -0,0 +1,72 @@ +using System.Numerics; + +namespace Content.Shared.Movement.Components; + +/// +/// Declares that an entity has started to waddle like a duck/clown. +/// +/// The newly be-waddled. +[ByRefEvent] +public record struct StartedWaddlingEvent(EntityUid Entity) +{ + public EntityUid Entity = Entity; +} + +/// +/// Declares that an entity has stopped waddling like a duck/clown. +/// +/// The former waddle-er. +[ByRefEvent] +public record struct StoppedWaddlingEvent(EntityUid Entity) +{ + public EntityUid Entity = Entity; +} + +/// +/// Defines something as having a waddle animation when it moves. +/// +[RegisterComponent] +public sealed partial class WaddleAnimationComponent : Component +{ + /// + /// What's the name of this animation? Make sure it's unique so it can play along side other animations. + /// This prevents someone accidentally causing two identical waddling effects to play on someone at the same time. + /// + [DataField] + public string KeyName = "Waddle"; + + /// + /// How high should they hop during the waddle? Higher hop = more energy. + /// + [DataField] + public Vector2 HopIntensity = new(0, 0.25f); + + /// + /// How far should they rock backward and forward during the waddle? + /// Each step will alternate between this being a positive and negative rotation. More rock = more scary. + /// + [DataField] + public float TumbleIntensity = 20.0f; + + /// + /// How long should a complete step take? Less time = more chaos. + /// + [DataField] + public float AnimationLength = 0.66f; + + /// + /// How much shorter should the animation be when running? + /// + [DataField] + public float RunAnimationLengthMultiplier = 0.568f; + + /// + /// Stores which step we made last, so if someone cancels out of the animation mid-step then restarts it looks more natural. + /// + public bool LastStep; + + /// + /// Stores if we're currently waddling so we can start/stop as appropriate and can tell other systems our state. + /// + public bool IsCurrentlyWaddling; +} diff --git a/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs b/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs index acca7aafd05..3c265d5a027 100644 --- a/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs +++ b/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs @@ -301,7 +301,9 @@ public bool CanPull(EntityUid puller, EntityUid pullableUid, PullerComponent? pu return false; } - if (pullerComp.NeedsHands && !_handsSystem.TryGetEmptyHand(puller, out _)) + if (pullerComp.NeedsHands + && !_handsSystem.TryGetEmptyHand(puller, out _) + && pullerComp.Pulling == null) { return false; } @@ -365,7 +367,7 @@ public bool TogglePull(EntityUid pullerUid, PullerComponent puller) return TogglePull(puller.Pulling.Value, pullerUid, pullable); } - public bool TryStartPull(EntityUid pullerUid, EntityUid pullableUid, EntityUid? user = null, + public bool TryStartPull(EntityUid pullerUid, EntityUid pullableUid, PullerComponent? pullerComp = null, PullableComponent? pullableComp = null) { if (!Resolve(pullerUid, ref pullerComp, false) || @@ -387,23 +389,18 @@ public bool TryStartPull(EntityUid pullerUid, EntityUid pullableUid, EntityUid? } // Ensure that the puller is not currently pulling anything. - var oldPullable = pullerComp.Pulling; - - if (oldPullable != null) - { - // Well couldn't stop the old one. - if (!TryStopPull(oldPullable.Value, pullableComp, user)) - return false; - } + if (TryComp(pullerComp.Pulling, out var oldPullable) + && !TryStopPull(pullerComp.Pulling.Value, oldPullable, pullerUid)) + return false; - // Is the pullable currently being pulled by something else? + // Stop anyone else pulling the entity we want to pull if (pullableComp.Puller != null) { - // Uhhh + // We're already pulling this item if (pullableComp.Puller == pullerUid) return false; - if (!TryStopPull(pullableUid, pullableComp, pullerUid)) + if (!TryStopPull(pullableUid, pullableComp, pullableComp.Puller)) return false; } @@ -469,7 +466,7 @@ public bool TryStopPull(EntityUid pullableUid, PullableComponent pullable, Entit var pullerUidNull = pullable.Puller; if (pullerUidNull == null) - return false; + return true; var msg = new AttemptStopPullingEvent(user); RaiseLocalEvent(pullableUid, msg, true); diff --git a/Content.Shared/NPC/Components/FactionExceptionComponent.cs b/Content.Shared/NPC/Components/FactionExceptionComponent.cs index 54de0404c2f..ba7940d5027 100644 --- a/Content.Shared/NPC/Components/FactionExceptionComponent.cs +++ b/Content.Shared/NPC/Components/FactionExceptionComponent.cs @@ -7,7 +7,7 @@ namespace Content.Shared.NPC.Components; /// Prevents an NPC from attacking ignored entities from enemy factions. /// Can be added to if pettable, see PettableFriendComponent. /// -[RegisterComponent, NetworkedComponent, Access(typeof(NpcFactionSystem))] +[RegisterComponent, NetworkedComponent, Access(typeof(NpcFactionSystem), typeof(SharedNPCImprintingOnSpawnBehaviourSystem))] // TO DO (Metalgearsloth): If we start adding a billion access overrides they should be going through a system as then there's no reason to have access, but I'll fix this when I rework npcs. public sealed partial class FactionExceptionComponent : Component { /// diff --git a/Content.Shared/NPC/Systems/SharedNPCImprintingOnSpawnBehaviourSystem.cs b/Content.Shared/NPC/Systems/SharedNPCImprintingOnSpawnBehaviourSystem.cs new file mode 100644 index 00000000000..f06d496e9eb --- /dev/null +++ b/Content.Shared/NPC/Systems/SharedNPCImprintingOnSpawnBehaviourSystem.cs @@ -0,0 +1,5 @@ +namespace Content.Shared.NPC.Systems; + +public abstract partial class SharedNPCImprintingOnSpawnBehaviourSystem : EntitySystem +{ +} diff --git a/Content.Shared/NPC/Systems/SharedNPCSystem.cs b/Content.Shared/NPC/Systems/SharedNPCSystem.cs new file mode 100644 index 00000000000..247ab478a1b --- /dev/null +++ b/Content.Shared/NPC/Systems/SharedNPCSystem.cs @@ -0,0 +1,5 @@ +namespace Content.Shared.NPC.Systems; + +public abstract partial class SharedNPCSystem : EntitySystem +{ +} diff --git a/Content.Server/Nutrition/Components/DrinkComponent.cs b/Content.Shared/Nutrition/Components/DrinkComponent.cs similarity index 66% rename from Content.Server/Nutrition/Components/DrinkComponent.cs rename to Content.Shared/Nutrition/Components/DrinkComponent.cs index 20d47cda88c..17baaef5a37 100644 --- a/Content.Server/Nutrition/Components/DrinkComponent.cs +++ b/Content.Shared/Nutrition/Components/DrinkComponent.cs @@ -1,28 +1,30 @@ -using Content.Server.Nutrition.EntitySystems; +using Content.Shared.Nutrition.EntitySystems; using Content.Shared.FixedPoint; using Robust.Shared.Audio; +using Robust.Shared.GameStates; -namespace Content.Server.Nutrition.Components; +namespace Content.Shared.Nutrition.Components; -[RegisterComponent, Access(typeof(DrinkSystem))] +[NetworkedComponent, AutoGenerateComponentState] +[RegisterComponent, Access(typeof(SharedDrinkSystem))] public sealed partial class DrinkComponent : Component { - [DataField, ViewVariables(VVAccess.ReadWrite)] + [DataField] public string Solution = "drink"; - [DataField] + [DataField, AutoNetworkedField] public SoundSpecifier UseSound = new SoundPathSpecifier("/Audio/Items/drink.ogg"); - [DataField, ViewVariables(VVAccess.ReadWrite)] + [DataField, AutoNetworkedField] public FixedPoint2 TransferAmount = FixedPoint2.New(5); /// /// How long it takes to drink this yourself. /// - [DataField, ViewVariables(VVAccess.ReadWrite)] + [DataField, AutoNetworkedField] public float Delay = 1; - [DataField, ViewVariables(VVAccess.ReadWrite)] + [DataField, AutoNetworkedField] public bool Examinable = true; /// @@ -30,12 +32,12 @@ public sealed partial class DrinkComponent : Component /// This means other systems such as equipping on use can run. /// Example usecase is the bucket. /// - [DataField, ViewVariables(VVAccess.ReadWrite)] + [DataField] public bool IgnoreEmpty; /// /// This is how many seconds it takes to force feed someone this drink. /// - [DataField, ViewVariables(VVAccess.ReadWrite)] + [DataField, AutoNetworkedField] public float ForceFeedDelay = 3; } diff --git a/Content.Shared/Nutrition/Components/PressurizedSolutionComponent.cs b/Content.Shared/Nutrition/Components/PressurizedSolutionComponent.cs new file mode 100644 index 00000000000..7060f3bf799 --- /dev/null +++ b/Content.Shared/Nutrition/Components/PressurizedSolutionComponent.cs @@ -0,0 +1,106 @@ +using Content.Shared.Nutrition.EntitySystems; +using Robust.Shared.Audio; +using Robust.Shared.GameStates; + +namespace Content.Shared.Nutrition.Components; + +/// +/// Represents a solution container that can hold the pressure from a solution that +/// gets fizzy when aggitated, and can spray the solution when opened or thrown. +/// Handles simulating the fizziness of the solution, responding to aggitating events, +/// and spraying the solution out when opening or throwing the entity. +/// +[NetworkedComponent, AutoGenerateComponentState, AutoGenerateComponentPause] +[RegisterComponent, Access(typeof(PressurizedSolutionSystem))] +public sealed partial class PressurizedSolutionComponent : Component +{ + /// + /// The name of the solution to use. + /// + [DataField] + public string Solution = "drink"; + + /// + /// The sound to play when the solution sprays out of the container. + /// + [DataField] + public SoundSpecifier SpraySound = new SoundPathSpecifier("/Audio/Items/soda_spray.ogg"); + + /// + /// The longest amount of time that the solution can remain fizzy after being aggitated. + /// Put another way, how long the solution will remain fizzy when aggitated the maximum amount. + /// Used to calculate the current fizziness level. + /// + [DataField] + public TimeSpan FizzinessMaxDuration = TimeSpan.FromSeconds(120); + + /// + /// The time at which the solution will be fully settled after being shaken. + /// + [DataField, AutoNetworkedField, AutoPausedField] + public TimeSpan FizzySettleTime; + + /// + /// How much to increase the solution's fizziness each time it's shaken. + /// This assumes the solution has maximum fizzability. + /// A value of 1 will maximize it with a single shake, and a value of + /// 0.5 will increase it by half with each shake. + /// + [DataField] + public float FizzinessAddedOnShake = 1.0f; + + /// + /// How much to increase the solution's fizziness when it lands after being thrown. + /// This assumes the solution has maximum fizzability. + /// + [DataField] + public float FizzinessAddedOnLand = 0.25f; + + /// + /// How much to modify the chance of spraying when the entity is opened. + /// Increasing this effectively increases the fizziness value when checking if it should spray. + /// + [DataField] + public float SprayChanceModOnOpened = -0.01f; // Just enough to prevent spraying at 0 fizziness + + /// + /// How much to modify the chance of spraying when the entity is shaken. + /// Increasing this effectively increases the fizziness value when checking if it should spray. + /// + [DataField] + public float SprayChanceModOnShake = -1; // No spraying when shaken by default + + /// + /// How much to modify the chance of spraying when the entity lands after being thrown. + /// Increasing this effectively increases the fizziness value when checking if it should spray. + /// + [DataField] + public float SprayChanceModOnLand = 0.25f; + + /// + /// Holds the current randomly-rolled threshold value for spraying. + /// If fizziness exceeds this value when the entity is opened, it will spray. + /// By rolling this value when the entity is aggitated, we can have randomization + /// while still having prediction! + /// + [DataField, AutoNetworkedField] + public float SprayFizzinessThresholdRoll; + + /// + /// Popup message shown to user when sprayed by the solution. + /// + [DataField] + public LocId SprayHolderMessageSelf = "pressurized-solution-spray-holder-self"; + + /// + /// Popup message shown to others when a user is sprayed by the solution. + /// + [DataField] + public LocId SprayHolderMessageOthers = "pressurized-solution-spray-holder-others"; + + /// + /// Popup message shown above the entity when the solution sprays without a target. + /// + [DataField] + public LocId SprayGroundMessage = "pressurized-solution-spray-ground"; +} diff --git a/Content.Shared/Nutrition/Components/ShakeableComponent.cs b/Content.Shared/Nutrition/Components/ShakeableComponent.cs new file mode 100644 index 00000000000..cc1c08a9b23 --- /dev/null +++ b/Content.Shared/Nutrition/Components/ShakeableComponent.cs @@ -0,0 +1,50 @@ +using Robust.Shared.Audio; +using Robust.Shared.GameStates; + +namespace Content.Shared.Nutrition.Components; + +/// +/// Adds a "Shake" verb to the entity's verb menu. +/// Handles checking the entity can be shaken, displaying popups when shaking, +/// and raising a ShakeEvent when a shake occurs. +/// Reacting to being shaken is left up to other components. +/// +[RegisterComponent, NetworkedComponent] +public sealed partial class ShakeableComponent : Component +{ + /// + /// How long it takes to shake this item. + /// + [DataField] + public TimeSpan ShakeDuration = TimeSpan.FromSeconds(1f); + + /// + /// Does the entity need to be in the user's hand in order to be shaken? + /// + [DataField] + public bool RequireInHand; + + /// + /// Label to display in the verbs menu for this item's shake action. + /// + [DataField] + public LocId ShakeVerbText = "shakeable-verb"; + + /// + /// Text that will be displayed to the user when shaking this item. + /// + [DataField] + public LocId ShakePopupMessageSelf = "shakeable-popup-message-self"; + + /// + /// Text that will be displayed to other users when someone shakes this item. + /// + [DataField] + public LocId ShakePopupMessageOthers = "shakeable-popup-message-others"; + + /// + /// The sound that will be played when shaking this item. + /// + [DataField] + public SoundSpecifier ShakeSound = new SoundPathSpecifier("/Audio/Items/soda_shake.ogg"); +} diff --git a/Content.Shared/Nutrition/EntitySystems/HungerSystem.cs b/Content.Shared/Nutrition/EntitySystems/HungerSystem.cs index 68184718c44..f35510854f4 100644 --- a/Content.Shared/Nutrition/EntitySystems/HungerSystem.cs +++ b/Content.Shared/Nutrition/EntitySystems/HungerSystem.cs @@ -1,17 +1,22 @@ +using System.Diagnostics.CodeAnalysis; using Content.Shared.Alert; using Content.Shared.Damage; using Content.Shared.Mobs.Systems; using Content.Shared.Movement.Systems; using Content.Shared.Nutrition.Components; using Content.Shared.Rejuvenate; +using Content.Shared.StatusIcon; +using Robust.Shared.Prototypes; using Robust.Shared.Random; using Robust.Shared.Timing; +using Robust.Shared.Utility; namespace Content.Shared.Nutrition.EntitySystems; public sealed class HungerSystem : EntitySystem { [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly IPrototypeManager _prototype = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly AlertsSystem _alerts = default!; [Dependency] private readonly DamageableSystem _damageable = default!; @@ -19,10 +24,27 @@ public sealed class HungerSystem : EntitySystem [Dependency] private readonly MovementSpeedModifierSystem _movementSpeedModifier = default!; [Dependency] private readonly SharedJetpackSystem _jetpack = default!; + [ValidatePrototypeId] + private const string HungerIconOverfedId = "HungerIconOverfed"; + + [ValidatePrototypeId] + private const string HungerIconPeckishId = "HungerIconPeckish"; + + [ValidatePrototypeId] + private const string HungerIconStarvingId = "HungerIconStarving"; + + private StatusIconPrototype? _hungerIconOverfed; + private StatusIconPrototype? _hungerIconPeckish; + private StatusIconPrototype? _hungerIconStarving; + public override void Initialize() { base.Initialize(); + DebugTools.Assert(_prototype.TryIndex(HungerIconOverfedId, out _hungerIconOverfed) && + _prototype.TryIndex(HungerIconPeckishId, out _hungerIconPeckish) && + _prototype.TryIndex(HungerIconStarvingId, out _hungerIconStarving)); + SubscribeLocalEvent(OnMapInit); SubscribeLocalEvent(OnShutdown); SubscribeLocalEvent(OnRefreshMovespeed); @@ -196,6 +218,27 @@ private bool GetMovementThreshold(HungerThreshold threshold) } } + public bool TryGetStatusIconPrototype(HungerComponent component, [NotNullWhen(true)] out StatusIconPrototype? prototype) + { + switch (component.CurrentThreshold) + { + case HungerThreshold.Overfed: + prototype = _hungerIconOverfed; + break; + case HungerThreshold.Peckish: + prototype = _hungerIconPeckish; + break; + case HungerThreshold.Starving: + prototype = _hungerIconStarving; + break; + default: + prototype = null; + break; + } + + return prototype != null; + } + public override void Update(float frameTime) { base.Update(frameTime); diff --git a/Content.Shared/Nutrition/EntitySystems/OpenableSystem.cs b/Content.Shared/Nutrition/EntitySystems/OpenableSystem.cs index 0ad0877d222..2934ced8b4a 100644 --- a/Content.Shared/Nutrition/EntitySystems/OpenableSystem.cs +++ b/Content.Shared/Nutrition/EntitySystems/OpenableSystem.cs @@ -16,9 +16,9 @@ namespace Content.Shared.Nutrition.EntitySystems; /// public sealed partial class OpenableSystem : EntitySystem { - [Dependency] protected readonly SharedAppearanceSystem Appearance = default!; - [Dependency] protected readonly SharedAudioSystem Audio = default!; - [Dependency] protected readonly SharedPopupSystem Popup = default!; + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; public override void Initialize() { @@ -31,6 +31,8 @@ public override void Initialize() SubscribeLocalEvent(HandleIfClosed); SubscribeLocalEvent>(AddOpenCloseVerbs); SubscribeLocalEvent(OnTransferAttempt); + SubscribeLocalEvent(OnAttemptShake); + SubscribeLocalEvent(OnAttemptAddFizziness); } private void OnInit(EntityUid uid, OpenableComponent comp, ComponentInit args) @@ -100,6 +102,20 @@ private void OnTransferAttempt(Entity ent, ref SolutionTransf } } + private void OnAttemptShake(Entity entity, ref AttemptShakeEvent args) + { + // Prevent shaking open containers + if (entity.Comp.Opened) + args.Cancelled = true; + } + + private void OnAttemptAddFizziness(Entity entity, ref AttemptAddFizzinessEvent args) + { + // Can't add fizziness to an open container + if (entity.Comp.Opened) + args.Cancelled = true; + } + /// /// Returns true if the entity either does not have OpenableComponent or it is opened. /// Drinks that don't have OpenableComponent are automatically open, so it returns true. @@ -126,7 +142,7 @@ public bool IsClosed(EntityUid uid, EntityUid? user = null, OpenableComponent? c return false; if (user != null) - Popup.PopupEntity(Loc.GetString(comp.ClosedPopup, ("owner", uid)), user.Value, user.Value); + _popup.PopupEntity(Loc.GetString(comp.ClosedPopup, ("owner", uid)), user.Value, user.Value); return true; } @@ -139,13 +155,13 @@ public void UpdateAppearance(EntityUid uid, OpenableComponent? comp = null, Appe if (!Resolve(uid, ref comp)) return; - Appearance.SetData(uid, OpenableVisuals.Opened, comp.Opened, appearance); + _appearance.SetData(uid, OpenableVisuals.Opened, comp.Opened, appearance); } /// /// Sets the opened field and updates open visuals. /// - public void SetOpen(EntityUid uid, bool opened = true, OpenableComponent? comp = null) + public void SetOpen(EntityUid uid, bool opened = true, OpenableComponent? comp = null, EntityUid? user = null) { if (!Resolve(uid, ref comp, false) || opened == comp.Opened) return; @@ -155,12 +171,12 @@ public void SetOpen(EntityUid uid, bool opened = true, OpenableComponent? comp = if (opened) { - var ev = new OpenableOpenedEvent(); + var ev = new OpenableOpenedEvent(user); RaiseLocalEvent(uid, ref ev); } else { - var ev = new OpenableClosedEvent(); + var ev = new OpenableClosedEvent(user); RaiseLocalEvent(uid, ref ev); } @@ -176,8 +192,8 @@ public bool TryOpen(EntityUid uid, OpenableComponent? comp = null, EntityUid? us if (!Resolve(uid, ref comp, false) || comp.Opened) return false; - SetOpen(uid, true, comp); - Audio.PlayPredicted(comp.Sound, uid, user); + SetOpen(uid, true, comp, user); + _audio.PlayPredicted(comp.Sound, uid, user); return true; } @@ -190,9 +206,9 @@ public bool TryClose(EntityUid uid, OpenableComponent? comp = null, EntityUid? u if (!Resolve(uid, ref comp, false) || !comp.Opened || !comp.Closeable) return false; - SetOpen(uid, false, comp); + SetOpen(uid, false, comp, user); if (comp.CloseSound != null) - Audio.PlayPredicted(comp.CloseSound, uid, user); + _audio.PlayPredicted(comp.CloseSound, uid, user); return true; } } @@ -201,10 +217,10 @@ public bool TryClose(EntityUid uid, OpenableComponent? comp = null, EntityUid? u /// Raised after an Openable is opened. /// [ByRefEvent] -public record struct OpenableOpenedEvent; +public record struct OpenableOpenedEvent(EntityUid? User = null); /// /// Raised after an Openable is closed. /// [ByRefEvent] -public record struct OpenableClosedEvent; +public record struct OpenableClosedEvent(EntityUid? User = null); diff --git a/Content.Shared/Nutrition/EntitySystems/PressurizedSolutionSystem.cs b/Content.Shared/Nutrition/EntitySystems/PressurizedSolutionSystem.cs new file mode 100644 index 00000000000..d63b8e7326c --- /dev/null +++ b/Content.Shared/Nutrition/EntitySystems/PressurizedSolutionSystem.cs @@ -0,0 +1,285 @@ +using Content.Shared.Chemistry.Reagent; +using Content.Shared.Chemistry.EntitySystems; +using Content.Shared.Hands.EntitySystems; +using Content.Shared.Nutrition.Components; +using Content.Shared.Throwing; +using Content.Shared.IdentityManagement; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Random; +using Robust.Shared.Timing; +using Robust.Shared.Prototypes; +using Robust.Shared.Network; +using Content.Shared.Fluids; +using Content.Shared.Popups; + +namespace Content.Shared.Nutrition.EntitySystems; + +public sealed partial class PressurizedSolutionSystem : EntitySystem +{ + [Dependency] private readonly SharedSolutionContainerSystem _solutionContainer = default!; + [Dependency] private readonly OpenableSystem _openable = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly SharedHandsSystem _hands = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly SharedPuddleSystem _puddle = default!; + [Dependency] private readonly INetManager _net = default!; + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnMapInit); + SubscribeLocalEvent(OnShake); + SubscribeLocalEvent(OnOpened); + SubscribeLocalEvent(OnLand); + SubscribeLocalEvent(OnSolutionUpdate); + } + + /// + /// Helper method for checking if the solution's fizziness is high enough to spray. + /// is added to the actual fizziness for the comparison. + /// + private bool SprayCheck(Entity entity, float chanceMod = 0) + { + return Fizziness((entity, entity.Comp)) + chanceMod > entity.Comp.SprayFizzinessThresholdRoll; + } + + /// + /// Calculates how readily the contained solution becomes fizzy. + /// + private float SolutionFizzability(Entity entity) + { + if (!_solutionContainer.TryGetSolution(entity.Owner, entity.Comp.Solution, out var _, out var solution)) + return 0; + + // An empty solution can't be fizzy + if (solution.Volume <= 0) + return 0; + + var totalFizzability = 0f; + + // Check each reagent in the solution + foreach (var reagent in solution.Contents) + { + if (_prototypeManager.TryIndex(reagent.Reagent.Prototype, out ReagentPrototype? reagentProto) && reagentProto != null) + { + // What portion of the solution is this reagent? + var proportion = (float) (reagent.Quantity / solution.Volume); + totalFizzability += reagentProto.Fizziness * proportion; + } + } + + return totalFizzability; + } + + /// + /// Increases the fizziness level of the solution by the given amount, + /// scaled by the solution's fizzability. + /// 0 will result in no change, and 1 will maximize fizziness. + /// Also rerolls the spray threshold. + /// + private void AddFizziness(Entity entity, float amount) + { + var fizzability = SolutionFizzability(entity); + + // Can't add fizziness if the solution isn't fizzy + if (fizzability <= 0) + return; + + // Make sure nothing is preventing fizziness from being added + var attemptEv = new AttemptAddFizzinessEvent(entity, amount); + RaiseLocalEvent(entity, ref attemptEv); + if (attemptEv.Cancelled) + return; + + // Scale added fizziness by the solution's fizzability + amount *= fizzability; + + // Convert fizziness to time + var duration = amount * entity.Comp.FizzinessMaxDuration; + + // Add to the existing settle time, if one exists. Otherwise, add to the current time + var start = entity.Comp.FizzySettleTime > _timing.CurTime ? entity.Comp.FizzySettleTime : _timing.CurTime; + var newTime = start + duration; + + // Cap the maximum fizziness + var maxEnd = _timing.CurTime + entity.Comp.FizzinessMaxDuration; + if (newTime > maxEnd) + newTime = maxEnd; + + entity.Comp.FizzySettleTime = newTime; + + // Roll a new fizziness threshold + RollSprayThreshold(entity); + } + + /// + /// Helper method. Performs a . If it passes, calls . If it fails, . + /// + private void SprayOrAddFizziness(Entity entity, float chanceMod = 0, float fizzinessToAdd = 0, EntityUid? user = null) + { + if (SprayCheck(entity, chanceMod)) + TrySpray((entity, entity.Comp), user); + else + AddFizziness(entity, fizzinessToAdd); + } + + /// + /// Randomly generates a new spray threshold. + /// This is the value used to compare fizziness against when doing . + /// Since RNG will give different results between client and server, this is run on the server + /// and synced to the client by marking the component dirty. + /// We roll this in advance, rather than during , so that the value (hopefully) + /// has time to get synced to the client, so we can try be accurate with prediction. + /// + private void RollSprayThreshold(Entity entity) + { + // Can't predict random, so we wait for the server to tell us + if (!_net.IsServer) + return; + + entity.Comp.SprayFizzinessThresholdRoll = _random.NextFloat(); + Dirty(entity, entity.Comp); + } + + #region Public API + + /// + /// Does the entity contain a solution capable of being fizzy? + /// + public bool CanSpray(Entity entity) + { + if (!Resolve(entity, ref entity.Comp, false)) + return false; + + return SolutionFizzability((entity, entity.Comp)) > 0; + } + + /// + /// Attempts to spray the solution onto the given entity, or the ground if none is given. + /// Fails if the solution isn't able to be sprayed. + /// + public bool TrySpray(Entity entity, EntityUid? target = null) + { + if (!Resolve(entity, ref entity.Comp)) + return false; + + if (!CanSpray(entity)) + return false; + + if (!_solutionContainer.TryGetSolution(entity.Owner, entity.Comp.Solution, out var soln, out var interactions)) + return false; + + // If the container is openable, open it + _openable.SetOpen(entity, true); + + // Get the spray solution from the container + var solution = _solutionContainer.SplitSolution(soln.Value, interactions.Volume); + + // Spray the solution onto the ground and anyone nearby + if (TryComp(entity, out var transform)) + _puddle.TrySplashSpillAt(entity, transform.Coordinates, solution, out _, sound: false); + + var drinkName = Identity.Entity(entity, EntityManager); + + if (target != null) + { + var victimName = Identity.Entity(target.Value, EntityManager); + + var selfMessage = Loc.GetString(entity.Comp.SprayHolderMessageSelf, ("victim", victimName), ("drink", drinkName)); + var othersMessage = Loc.GetString(entity.Comp.SprayHolderMessageOthers, ("victim", victimName), ("drink", drinkName)); + _popup.PopupPredicted(selfMessage, othersMessage, target.Value, target.Value); + } + else + { + // Show a popup to everyone in PVS range + if (_timing.IsFirstTimePredicted) + _popup.PopupEntity(Loc.GetString(entity.Comp.SprayGroundMessage, ("drink", drinkName)), entity); + } + + _audio.PlayPredicted(entity.Comp.SpraySound, entity, target); + + // We just used all our fizziness, so clear it + TryClearFizziness(entity); + + return true; + } + + /// + /// What is the current fizziness level of the solution, from 0 to 1? + /// + public double Fizziness(Entity entity) + { + // No component means no fizz + if (!Resolve(entity, ref entity.Comp, false)) + return 0; + + // No negative fizziness + if (entity.Comp.FizzySettleTime <= _timing.CurTime) + return 0; + + var currentDuration = entity.Comp.FizzySettleTime - _timing.CurTime; + return Easings.InOutCubic((float) Math.Min(currentDuration / entity.Comp.FizzinessMaxDuration, 1)); + } + + /// + /// Attempts to clear any fizziness in the solution. + /// + /// Rolls a new spray threshold. + public void TryClearFizziness(Entity entity) + { + if (!Resolve(entity, ref entity.Comp)) + return; + + entity.Comp.FizzySettleTime = TimeSpan.Zero; + + // Roll a new fizziness threshold + RollSprayThreshold((entity, entity.Comp)); + } + + #endregion + + #region Event Handlers + private void OnMapInit(Entity entity, ref MapInitEvent args) + { + RollSprayThreshold(entity); + } + + private void OnOpened(Entity entity, ref OpenableOpenedEvent args) + { + // Make sure the opener is actually holding the drink + var held = args.User != null && _hands.IsHolding(args.User.Value, entity, out _); + + SprayOrAddFizziness(entity, entity.Comp.SprayChanceModOnOpened, -1, held ? args.User : null); + } + + private void OnShake(Entity entity, ref ShakeEvent args) + { + SprayOrAddFizziness(entity, entity.Comp.SprayChanceModOnShake, entity.Comp.FizzinessAddedOnShake, args.Shaker); + } + + private void OnLand(Entity entity, ref LandEvent args) + { + SprayOrAddFizziness(entity, entity.Comp.SprayChanceModOnLand, entity.Comp.FizzinessAddedOnLand); + } + + private void OnSolutionUpdate(Entity entity, ref SolutionContainerChangedEvent args) + { + if (args.SolutionId != entity.Comp.Solution) + return; + + // If the solution is no longer capable of being fizzy, clear any built up fizziness + if (SolutionFizzability(entity) <= 0) + TryClearFizziness((entity, entity.Comp)); + } + + #endregion +} + +[ByRefEvent] +public record struct AttemptAddFizzinessEvent(Entity Entity, float Amount) +{ + public bool Cancelled; +} diff --git a/Content.Shared/Nutrition/EntitySystems/ShakeableSystem.cs b/Content.Shared/Nutrition/EntitySystems/ShakeableSystem.cs new file mode 100644 index 00000000000..39890aada93 --- /dev/null +++ b/Content.Shared/Nutrition/EntitySystems/ShakeableSystem.cs @@ -0,0 +1,155 @@ +using Content.Shared.DoAfter; +using Content.Shared.Hands.EntitySystems; +using Content.Shared.IdentityManagement; +using Content.Shared.Nutrition.Components; +using Content.Shared.Popups; +using Content.Shared.Verbs; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Serialization; + +namespace Content.Shared.Nutrition.EntitySystems; + +public sealed partial class ShakeableSystem : EntitySystem +{ + [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; + [Dependency] private readonly SharedHandsSystem _hands = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent>(AddShakeVerb); + SubscribeLocalEvent(OnShakeDoAfter); + } + + private void AddShakeVerb(EntityUid uid, ShakeableComponent component, GetVerbsEvent args) + { + if (args.Hands == null || !args.CanAccess || !args.CanInteract) + return; + + if (!CanShake((uid, component), args.User)) + return; + + var shakeVerb = new Verb() + { + Text = Loc.GetString(component.ShakeVerbText), + Act = () => TryStartShake((args.Target, component), args.User) + }; + args.Verbs.Add(shakeVerb); + } + + private void OnShakeDoAfter(Entity entity, ref ShakeDoAfterEvent args) + { + if (args.Handled || args.Cancelled) + return; + + TryShake((entity, entity.Comp), args.User); + } + + /// + /// Attempts to start the doAfter to shake the entity. + /// Fails and returns false if the entity cannot be shaken for any reason. + /// If successful, displays popup messages, plays shake sound, and starts the doAfter. + /// + public bool TryStartShake(Entity entity, EntityUid user) + { + if (!Resolve(entity, ref entity.Comp)) + return false; + + if (!CanShake(entity, user)) + return false; + + var doAfterArgs = new DoAfterArgs(EntityManager, + user, + entity.Comp.ShakeDuration, + new ShakeDoAfterEvent(), + eventTarget: entity, + target: user, + used: entity) + { + NeedHand = true, + BreakOnDamage = true, + DistanceThreshold = 1, + MovementThreshold = 0.01f, + BreakOnHandChange = entity.Comp.RequireInHand, + }; + if (entity.Comp.RequireInHand) + doAfterArgs.BreakOnHandChange = true; + + if (!_doAfter.TryStartDoAfter(doAfterArgs)) + return false; + + var userName = Identity.Entity(user, EntityManager); + var shakeableName = Identity.Entity(entity, EntityManager); + + var selfMessage = Loc.GetString(entity.Comp.ShakePopupMessageSelf, ("user", userName), ("shakeable", shakeableName)); + var othersMessage = Loc.GetString(entity.Comp.ShakePopupMessageOthers, ("user", userName), ("shakeable", shakeableName)); + _popup.PopupPredicted(selfMessage, othersMessage, user, user); + + _audio.PlayPredicted(entity.Comp.ShakeSound, entity, user); + + return true; + } + + /// + /// Attempts to shake the entity, skipping the doAfter. + /// Fails and returns false if the entity cannot be shaken for any reason. + /// If successful, raises a ShakeEvent on the entity. + /// + public bool TryShake(Entity entity, EntityUid? user = null) + { + if (!Resolve(entity, ref entity.Comp)) + return false; + + if (!CanShake(entity, user)) + return false; + + var ev = new ShakeEvent(user); + RaiseLocalEvent(entity, ref ev); + + return true; + } + + + /// + /// Is it possible for the given user to shake the entity? + /// + public bool CanShake(Entity entity, EntityUid? user = null) + { + if (!Resolve(entity, ref entity.Comp, false)) + return false; + + // If required to be in hand, fail if the user is not holding this entity + if (user != null && entity.Comp.RequireInHand && !_hands.IsHolding(user.Value, entity, out _)) + return false; + + var attemptEv = new AttemptShakeEvent(); + RaiseLocalEvent(entity, ref attemptEv); + if (attemptEv.Cancelled) + return false; + return true; + } +} + +/// +/// Raised when a ShakeableComponent is shaken, after the doAfter completes. +/// +[ByRefEvent] +public record struct ShakeEvent(EntityUid? Shaker); + +/// +/// Raised when trying to shake a ShakeableComponent. If cancelled, the +/// entity will not be shaken. +/// +[ByRefEvent] +public record struct AttemptShakeEvent() +{ + public bool Cancelled; +} + +[Serializable, NetSerializable] +public sealed partial class ShakeDoAfterEvent : SimpleDoAfterEvent +{ +} diff --git a/Content.Shared/Nutrition/EntitySystems/SharedDrinkSystem.cs b/Content.Shared/Nutrition/EntitySystems/SharedDrinkSystem.cs new file mode 100644 index 00000000000..7cae3b92086 --- /dev/null +++ b/Content.Shared/Nutrition/EntitySystems/SharedDrinkSystem.cs @@ -0,0 +1,90 @@ +using Content.Shared.Chemistry.Components.SolutionManager; +using Content.Shared.Chemistry.EntitySystems; +using Content.Shared.Examine; +using Content.Shared.FixedPoint; +using Content.Shared.Nutrition.Components; + +namespace Content.Shared.Nutrition.EntitySystems; + +public abstract partial class SharedDrinkSystem : EntitySystem +{ + [Dependency] private readonly SharedSolutionContainerSystem _solutionContainer = default!; + [Dependency] private readonly OpenableSystem _openable = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnAttemptShake); + SubscribeLocalEvent(OnExamined); + } + + protected void OnAttemptShake(Entity entity, ref AttemptShakeEvent args) + { + if (IsEmpty(entity, entity.Comp)) + args.Cancelled = true; + } + + protected void OnExamined(Entity entity, ref ExaminedEvent args) + { + TryComp(entity, out var openable); + if (_openable.IsClosed(entity.Owner, null, openable) || !args.IsInDetailsRange || !entity.Comp.Examinable) + return; + + var empty = IsEmpty(entity, entity.Comp); + if (empty) + { + args.PushMarkup(Loc.GetString("drink-component-on-examine-is-empty")); + return; + } + + if (HasComp(entity)) + { + //provide exact measurement for beakers + args.PushText(Loc.GetString("drink-component-on-examine-exact-volume", ("amount", DrinkVolume(entity, entity.Comp)))); + } + else + { + //general approximation + var remainingString = (int) _solutionContainer.PercentFull(entity) switch + { + 100 => "drink-component-on-examine-is-full", + > 66 => "drink-component-on-examine-is-mostly-full", + > 33 => HalfEmptyOrHalfFull(args), + _ => "drink-component-on-examine-is-mostly-empty", + }; + args.PushMarkup(Loc.GetString(remainingString)); + } + } + + protected FixedPoint2 DrinkVolume(EntityUid uid, DrinkComponent? component = null) + { + if (!Resolve(uid, ref component)) + return FixedPoint2.Zero; + + if (!_solutionContainer.TryGetSolution(uid, component.Solution, out _, out var sol)) + return FixedPoint2.Zero; + + return sol.Volume; + } + + protected bool IsEmpty(EntityUid uid, DrinkComponent? component = null) + { + if (!Resolve(uid, ref component)) + return true; + + return DrinkVolume(uid, component) <= 0; + } + + // some see half empty, and others see half full + private string HalfEmptyOrHalfFull(ExaminedEvent args) + { + string remainingString = "drink-component-on-examine-is-half-full"; + + if (TryComp(args.Examiner, out var examiner) && examiner.EntityName.Length > 0 + && string.Compare(examiner.EntityName.Substring(0, 1), "m", StringComparison.InvariantCultureIgnoreCase) > 0) + remainingString = "drink-component-on-examine-is-half-empty"; + + return remainingString; + } +} diff --git a/Content.Shared/Nutrition/EntitySystems/ThirstSystem.cs b/Content.Shared/Nutrition/EntitySystems/ThirstSystem.cs index 29218f57198..8ea7d9140c3 100644 --- a/Content.Shared/Nutrition/EntitySystems/ThirstSystem.cs +++ b/Content.Shared/Nutrition/EntitySystems/ThirstSystem.cs @@ -3,9 +3,12 @@ using Content.Shared.Movement.Systems; using Content.Shared.Nutrition.Components; using Content.Shared.Rejuvenate; +using Content.Shared.StatusIcon; using JetBrains.Annotations; +using Robust.Shared.Prototypes; using Robust.Shared.Random; using Robust.Shared.Timing; +using Robust.Shared.Utility; namespace Content.Shared.Nutrition.EntitySystems; @@ -13,15 +16,33 @@ namespace Content.Shared.Nutrition.EntitySystems; public sealed class ThirstSystem : EntitySystem { [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly IPrototypeManager _prototype = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly AlertsSystem _alerts = default!; [Dependency] private readonly MovementSpeedModifierSystem _movement = default!; [Dependency] private readonly SharedJetpackSystem _jetpack = default!; + [ValidatePrototypeId] + private const string ThirstIconOverhydratedId = "ThirstIconOverhydrated"; + + [ValidatePrototypeId] + private const string ThirstIconThirstyId = "ThirstIconThirsty"; + + [ValidatePrototypeId] + private const string ThirstIconParchedId = "ThirstIconParched"; + + private StatusIconPrototype? _thirstIconOverhydrated = null; + private StatusIconPrototype? _thirstIconThirsty = null; + private StatusIconPrototype? _thirstIconParched = null; + public override void Initialize() { base.Initialize(); + DebugTools.Assert(_prototype.TryIndex(ThirstIconOverhydratedId, out _thirstIconOverhydrated) && + _prototype.TryIndex(ThirstIconThirstyId, out _thirstIconThirsty) && + _prototype.TryIndex(ThirstIconParchedId, out _thirstIconParched)); + SubscribeLocalEvent(OnRefreshMovespeed); SubscribeLocalEvent(OnMapInit); SubscribeLocalEvent(OnRejuvenate); @@ -107,6 +128,28 @@ private bool IsMovementThreshold(ThirstThreshold threshold) } } + public bool TryGetStatusIconPrototype(ThirstComponent component, out StatusIconPrototype? prototype) + { + switch (component.CurrentThirstThreshold) + { + case ThirstThreshold.OverHydrated: + prototype = _thirstIconOverhydrated; + return true; + + case ThirstThreshold.Thirsty: + prototype = _thirstIconThirsty; + return true; + + case ThirstThreshold.Parched: + prototype = _thirstIconParched; + return true; + + default: + prototype = null; + return false; + } + } + private void UpdateEffects(EntityUid uid, ThirstComponent component) { if (IsMovementThreshold(component.LastThirstThreshold) != IsMovementThreshold(component.CurrentThirstThreshold) && diff --git a/Content.Shared/Overlays/ShowCriminalRecordIconsComponent.cs b/Content.Shared/Overlays/ShowCriminalRecordIconsComponent.cs new file mode 100644 index 00000000000..cb0759be3ee --- /dev/null +++ b/Content.Shared/Overlays/ShowCriminalRecordIconsComponent.cs @@ -0,0 +1,9 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Overlays; + +/// +/// This component allows you to see criminal record status of mobs. +/// +[RegisterComponent, NetworkedComponent] +public sealed partial class ShowCriminalRecordIconsComponent : Component { } diff --git a/Content.Shared/Overlays/ShowHungerIconsComponent.cs b/Content.Shared/Overlays/ShowHungerIconsComponent.cs index bf1fb2dc19d..b3841bd80ff 100644 --- a/Content.Shared/Overlays/ShowHungerIconsComponent.cs +++ b/Content.Shared/Overlays/ShowHungerIconsComponent.cs @@ -3,7 +3,7 @@ namespace Content.Shared.Overlays; /// -/// This component allows you to see the hungriness of mobs. +/// This component allows you to see the hungriness of mobs. /// [RegisterComponent, NetworkedComponent] public sealed partial class ShowHungerIconsComponent : Component { } diff --git a/Content.Shared/Overlays/ShowSecurityIconsComponent.cs b/Content.Shared/Overlays/ShowJobIconsComponent.cs similarity index 51% rename from Content.Shared/Overlays/ShowSecurityIconsComponent.cs rename to Content.Shared/Overlays/ShowJobIconsComponent.cs index ec268174d18..aae97395063 100644 --- a/Content.Shared/Overlays/ShowSecurityIconsComponent.cs +++ b/Content.Shared/Overlays/ShowJobIconsComponent.cs @@ -3,7 +3,7 @@ namespace Content.Shared.Overlays; /// -/// This component allows you to see job icons above mobs. +/// This component allows you to see job icons above mobs. /// [RegisterComponent, NetworkedComponent] -public sealed partial class ShowSecurityIconsComponent : Component { } +public sealed partial class ShowJobIconsComponent : Component { } diff --git a/Content.Shared/Overlays/ShowMindShieldIconsComponent.cs b/Content.Shared/Overlays/ShowMindShieldIconsComponent.cs new file mode 100644 index 00000000000..624d5ab8efc --- /dev/null +++ b/Content.Shared/Overlays/ShowMindShieldIconsComponent.cs @@ -0,0 +1,9 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Overlays; + +/// +/// This component allows you to see mindshield icons above mobs. +/// +[RegisterComponent, NetworkedComponent] +public sealed partial class ShowMindShieldIconsComponent : Component { } diff --git a/Content.Shared/Overlays/ShowSyndicateIconsComponent.cs b/Content.Shared/Overlays/ShowSyndicateIconsComponent.cs index 74a67db694a..a63eae8e466 100644 --- a/Content.Shared/Overlays/ShowSyndicateIconsComponent.cs +++ b/Content.Shared/Overlays/ShowSyndicateIconsComponent.cs @@ -3,7 +3,7 @@ namespace Content.Shared.Overlays; /// -/// +/// This component allows you to identify members of the Syndicate faction. /// [RegisterComponent, NetworkedComponent] public sealed partial class ShowSyndicateIconsComponent : Component {} diff --git a/Content.Shared/Overlays/ShowThirstIconsComponent.cs b/Content.Shared/Overlays/ShowThirstIconsComponent.cs index 905ab07fe23..1914034e9e3 100644 --- a/Content.Shared/Overlays/ShowThirstIconsComponent.cs +++ b/Content.Shared/Overlays/ShowThirstIconsComponent.cs @@ -3,7 +3,7 @@ namespace Content.Shared.Overlays; /// -/// This component allows you to see the thirstiness of mobs. +/// This component allows you to see the thirstiness of mobs. /// [RegisterComponent, NetworkedComponent] public sealed partial class ShowThirstIconsComponent : Component { } diff --git a/Content.Shared/Physics/CollisionGroup.cs b/Content.Shared/Physics/CollisionGroup.cs index 1c10fefd5dc..775ccb7c446 100644 --- a/Content.Shared/Physics/CollisionGroup.cs +++ b/Content.Shared/Physics/CollisionGroup.cs @@ -48,6 +48,9 @@ public enum CollisionGroup MachineLayer = Opaque | MidImpassable | LowImpassable | BulletImpassable, ConveyorMask = Impassable | MidImpassable | LowImpassable | DoorPassable, + // Crates + CrateMask = Impassable | HighImpassable | LowImpassable, + // Tables that SmallMobs can go under TableMask = Impassable | MidImpassable, TableLayer = MidImpassable, diff --git a/Content.Shared/Pinpointer/NavMapComponent.cs b/Content.Shared/Pinpointer/NavMapComponent.cs index 8c9979ba25a..61315b3db14 100644 --- a/Content.Shared/Pinpointer/NavMapComponent.cs +++ b/Content.Shared/Pinpointer/NavMapComponent.cs @@ -1,9 +1,12 @@ +using Content.Shared.Atmos; using Robust.Shared.GameStates; +using Robust.Shared.Serialization; +using Robust.Shared.Timing; namespace Content.Shared.Pinpointer; /// -/// Used to store grid poly data to be used for UIs. +/// Used to store grid data to be used for UIs. /// [RegisterComponent, NetworkedComponent] public sealed partial class NavMapComponent : Component @@ -12,25 +15,57 @@ public sealed partial class NavMapComponent : Component * Don't need DataFields as this can be reconstructed */ + /// + /// Bitmasks that represent chunked tiles. + /// [ViewVariables] - public readonly Dictionary Chunks = new(); + public Dictionary<(NavMapChunkType, Vector2i), NavMapChunk> Chunks = new(); - [ViewVariables] public readonly List Beacons = new(); - - [ViewVariables] public readonly List Airlocks = new(); + /// + /// List of station beacons. + /// + [ViewVariables] + public HashSet Beacons = new(); } +[Serializable, NetSerializable] public sealed class NavMapChunk { + /// + /// The chunk origin + /// public readonly Vector2i Origin; /// - /// Bitmask for tiles, 1 for occupied and 0 for empty. + /// Bitmask for tiles, 1 for occupied and 0 for empty. There is a bitmask for each cardinal direction, + /// representing each edge of the tile, in case the entities inside it do not entirely fill it /// - public int TileData; + public Dictionary TileData; + + /// + /// The last game tick that the chunk was updated + /// + [NonSerialized] + public GameTick LastUpdate; public NavMapChunk(Vector2i origin) { Origin = origin; + + TileData = new() + { + [AtmosDirection.North] = 0, + [AtmosDirection.East] = 0, + [AtmosDirection.South] = 0, + [AtmosDirection.West] = 0, + }; } } + +public enum NavMapChunkType : byte +{ + Invalid, + Floor, + Wall, + Airlock, +} diff --git a/Content.Shared/Pinpointer/SharedNavMapSystem.cs b/Content.Shared/Pinpointer/SharedNavMapSystem.cs index 17f86ac7e68..ebc4f33f0f1 100644 --- a/Content.Shared/Pinpointer/SharedNavMapSystem.cs +++ b/Content.Shared/Pinpointer/SharedNavMapSystem.cs @@ -1,13 +1,38 @@ +using System.Diagnostics.CodeAnalysis; using System.Numerics; +using Content.Shared.Atmos; +using Content.Shared.Tag; +using Robust.Shared.GameStates; using Robust.Shared.Serialization; +using Robust.Shared.Timing; using Robust.Shared.Utility; namespace Content.Shared.Pinpointer; public abstract class SharedNavMapSystem : EntitySystem { + [Dependency] private readonly TagSystem _tagSystem = default!; + [Dependency] private readonly IGameTiming _gameTiming = default!; + public const byte ChunkSize = 4; + public readonly NavMapChunkType[] EntityChunkTypes = + { + NavMapChunkType.Invalid, + NavMapChunkType.Wall, + NavMapChunkType.Airlock, + }; + + private readonly string[] _wallTags = ["Wall", "Window"]; + + public override void Initialize() + { + base.Initialize(); + + // Data handling events + SubscribeLocalEvent(OnGetState); + } + /// /// Converts the chunk's tile into a bitflag for the slot. /// @@ -31,19 +56,236 @@ public static Vector2i GetTile(int flag) return new Vector2i(x, y); } - [Serializable, NetSerializable] - protected sealed class NavMapComponentState : ComponentState + public NavMapChunk SetAllEdgesForChunkTile(NavMapChunk chunk, Vector2i tile) + { + var relative = SharedMapSystem.GetChunkRelative(tile, ChunkSize); + var flag = (ushort) GetFlag(relative); + + foreach (var (direction, _) in chunk.TileData) + chunk.TileData[direction] |= flag; + + return chunk; + } + + public NavMapChunk UnsetAllEdgesForChunkTile(NavMapChunk chunk, Vector2i tile) + { + var relative = SharedMapSystem.GetChunkRelative(tile, ChunkSize); + var flag = (ushort) GetFlag(relative); + var invFlag = (ushort) ~flag; + + foreach (var (direction, _) in chunk.TileData) + chunk.TileData[direction] &= invFlag; + + return chunk; + } + + public ushort GetCombinedEdgesForChunk(Dictionary tile) + { + ushort combined = 0; + + foreach (var kvp in tile) + combined |= kvp.Value; + + return combined; + } + + public bool AllTileEdgesAreOccupied(Dictionary tileData, Vector2i tile) + { + var flag = (ushort) GetFlag(tile); + + foreach (var kvp in tileData) + { + if ((kvp.Value & flag) == 0) + return false; + } + + return true; + } + + public NavMapChunkType GetAssociatedEntityChunkType(EntityUid uid) + { + var category = NavMapChunkType.Invalid; + + if (HasComp(uid)) + category = NavMapChunkType.Airlock; + + else if (_tagSystem.HasAnyTag(uid, _wallTags)) + category = NavMapChunkType.Wall; + + return category; + } + + protected bool TryCreateNavMapBeaconData(EntityUid uid, NavMapBeaconComponent component, TransformComponent xform, [NotNullWhen(true)] out NavMapBeacon? beaconData) { - public Dictionary TileData = new(); + beaconData = null; - public List Beacons = new(); + if (!component.Enabled || xform.GridUid == null || !xform.Anchored) + return false; - public List Airlocks = new(); + string? name = component.Text; + var meta = MetaData(uid); + + if (string.IsNullOrEmpty(name)) + name = meta.EntityName; + + beaconData = new NavMapBeacon(meta.NetEntity, component.Color, name, xform.LocalPosition) + { + LastUpdate = _gameTiming.CurTick + }; + + return true; } + #region: Event handling + + private void OnGetState(EntityUid uid, NavMapComponent component, ref ComponentGetState args) + { + var chunks = new Dictionary<(NavMapChunkType, Vector2i), Dictionary>(); + var beacons = new HashSet(); + + // Should this be a full component state or a delta-state? + if (args.FromTick <= component.CreationTick) + { + foreach (var ((category, origin), chunk) in component.Chunks) + { + var chunkDatum = new Dictionary(chunk.TileData.Count); + + foreach (var (direction, tileData) in chunk.TileData) + chunkDatum[direction] = tileData; + + chunks.Add((category, origin), chunkDatum); + } + + var beaconQuery = AllEntityQuery(); + + while (beaconQuery.MoveNext(out var beaconUid, out var beacon, out var xform)) + { + if (xform.GridUid != uid) + continue; + + if (!TryCreateNavMapBeaconData(beaconUid, beacon, xform, out var beaconData)) + continue; + + beacons.Add(beaconData.Value); + } + + args.State = new NavMapComponentState(chunks, beacons); + return; + } + + foreach (var ((category, origin), chunk) in component.Chunks) + { + if (chunk.LastUpdate < args.FromTick) + continue; + + var chunkDatum = new Dictionary(chunk.TileData.Count); + + foreach (var (direction, tileData) in chunk.TileData) + chunkDatum[direction] = tileData; + + chunks.Add((category, origin), chunkDatum); + } + + foreach (var beacon in component.Beacons) + { + if (beacon.LastUpdate < args.FromTick) + continue; + + beacons.Add(beacon); + } + + args.State = new NavMapComponentState(chunks, beacons) + { + AllChunks = new(component.Chunks.Keys), + AllBeacons = new(component.Beacons) + }; + } + + #endregion + + #region: System messages + [Serializable, NetSerializable] - public readonly record struct NavMapBeacon(Color Color, string Text, Vector2 Position); + protected sealed class NavMapComponentState : ComponentState, IComponentDeltaState + { + public Dictionary<(NavMapChunkType, Vector2i), Dictionary> Chunks = new(); + public HashSet Beacons = new(); + + // Required to infer deleted/missing chunks for delta states + public HashSet<(NavMapChunkType, Vector2i)>? AllChunks; + public HashSet? AllBeacons; + + public NavMapComponentState(Dictionary<(NavMapChunkType, Vector2i), Dictionary> chunks, HashSet beacons) + { + Chunks = chunks; + Beacons = beacons; + } + + public bool FullState => (AllChunks == null || AllBeacons == null); + + public void ApplyToFullState(IComponentState fullState) + { + DebugTools.Assert(!FullState); + var state = (NavMapComponentState) fullState; + DebugTools.Assert(state.FullState); + + // Update chunks + foreach (var key in state.Chunks.Keys) + { + if (!AllChunks!.Contains(key)) + state.Chunks.Remove(key); + } + + foreach (var (chunk, data) in Chunks) + state.Chunks[chunk] = new(data); + + // Update beacons + foreach (var beacon in state.Beacons) + { + if (!AllBeacons!.Contains(beacon)) + state.Beacons.Remove(beacon); + } + + foreach (var beacon in Beacons) + state.Beacons.Add(beacon); + } + + public IComponentState CreateNewFullState(IComponentState fullState) + { + DebugTools.Assert(!FullState); + var state = (NavMapComponentState) fullState; + DebugTools.Assert(state.FullState); + + var chunks = new Dictionary<(NavMapChunkType, Vector2i), Dictionary>(); + var beacons = new HashSet(); + + foreach (var (chunk, data) in Chunks) + chunks[chunk] = new(data); + + foreach (var (chunk, data) in state.Chunks) + { + if (AllChunks!.Contains(chunk)) + chunks.TryAdd(chunk, new(data)); + } + + foreach (var beacon in Beacons) + beacons.Add(new NavMapBeacon(beacon.NetEnt, beacon.Color, beacon.Text, beacon.Position)); + + foreach (var beacon in state.Beacons) + { + if (AllBeacons!.Contains(beacon)) + beacons.Add(new NavMapBeacon(beacon.NetEnt, beacon.Color, beacon.Text, beacon.Position)); + } + + return new NavMapComponentState(chunks, beacons); + } + } [Serializable, NetSerializable] - public readonly record struct NavMapAirlock(Vector2 Position); + public record struct NavMapBeacon(NetEntity NetEnt, Color Color, string Text, Vector2 Position) + { + public GameTick LastUpdate; + } + + #endregion } diff --git a/Content.Shared/Plants/PottedPlantHideSystem.cs b/Content.Shared/Plants/PottedPlantHideSystem.cs index fd256fd9263..cbe052f8d5c 100644 --- a/Content.Shared/Plants/PottedPlantHideSystem.cs +++ b/Content.Shared/Plants/PottedPlantHideSystem.cs @@ -31,7 +31,7 @@ private void OnInteractUsing(EntityUid uid, PottedPlantHideComponent component, if (args.Handled) return; - Rustle(uid, component); + Rustle(uid, component, args.User); args.Handled = _stashSystem.TryHideItem(uid, args.User, args.Used); } @@ -40,24 +40,24 @@ private void OnInteractHand(EntityUid uid, PottedPlantHideComponent component, I if (args.Handled) return; - Rustle(uid, component); + Rustle(uid, component, args.User); var gotItem = _stashSystem.TryGetItem(uid, args.User); if (!gotItem) { var msg = Loc.GetString("potted-plant-hide-component-interact-hand-got-no-item-message"); - _popupSystem.PopupEntity(msg, uid, args.User); + _popupSystem.PopupClient(msg, uid, args.User); } args.Handled = gotItem; } - private void Rustle(EntityUid uid, PottedPlantHideComponent? component = null) + private void Rustle(EntityUid uid, PottedPlantHideComponent? component = null, EntityUid? user = null) { if (!Resolve(uid, ref component)) return; - _audio.PlayPvs(component.RustleSound, uid, AudioParams.Default.WithVariation(0.25f)); + _audio.PlayPredicted(component.RustleSound, uid, user, AudioParams.Default.WithVariation(0.25f)); } } } diff --git a/Content.Shared/Polymorph/Components/ChameleonDisguiseComponent.cs b/Content.Shared/Polymorph/Components/ChameleonDisguiseComponent.cs new file mode 100644 index 00000000000..2b9fba7b391 --- /dev/null +++ b/Content.Shared/Polymorph/Components/ChameleonDisguiseComponent.cs @@ -0,0 +1,25 @@ +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Polymorph.Components; + +/// +/// Component added to disguise entities. +/// Used by client to copy over appearance from the disguise's source entity. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true)] +public sealed partial class ChameleonDisguiseComponent : Component +{ + /// + /// The disguise source entity for copying the sprite. + /// + [DataField, AutoNetworkedField] + public EntityUid SourceEntity; + + /// + /// The source entity's prototype. + /// Used as a fallback if the source entity was deleted. + /// + [DataField, AutoNetworkedField] + public EntProtoId? SourceProto; +} diff --git a/Content.Shared/Polymorph/Components/ChameleonProjectorComponent.cs b/Content.Shared/Polymorph/Components/ChameleonProjectorComponent.cs new file mode 100644 index 00000000000..239b5236f27 --- /dev/null +++ b/Content.Shared/Polymorph/Components/ChameleonProjectorComponent.cs @@ -0,0 +1,68 @@ +using Content.Shared.Polymorph; +using Content.Shared.Polymorph.Systems; +using Content.Shared.Whitelist; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Polymorph.Components; + +/// +/// A chameleon projector polymorphs you into a clicked entity, then polymorphs back when clicked on or destroyed. +/// This creates a new dummy polymorph entity and copies the appearance over. +/// +[RegisterComponent, Access(typeof(SharedChameleonProjectorSystem))] +public sealed partial class ChameleonProjectorComponent : Component +{ + /// + /// If non-null, whitelist for valid entities to disguise as. + /// + [DataField(required: true)] + public EntityWhitelist? Whitelist; + + /// + /// If non-null, blacklist that prevents entities from being used even if they are in the whitelist. + /// + [DataField(required: true)] + public EntityWhitelist? Blacklist; + + /// + /// Polymorph configuration for the disguise entity. + /// + [DataField(required: true)] + public PolymorphConfiguration Polymorph = new(); + + /// + /// Action for disabling your disguise's rotation. + /// + [DataField] + public EntProtoId NoRotAction = "ActionDisguiseNoRot"; + + /// + /// Action for anchoring your disguise in place. + /// + [DataField] + public EntProtoId AnchorAction = "ActionDisguiseAnchor"; + + /// + /// Minimum health to give the disguise. + /// + [DataField] + public float MinHealth = 1f; + + /// + /// Maximum health to give the disguise, health scales with mass. + /// + [DataField] + public float MaxHealth = 100f; + + /// + /// Popup shown to the user when they try to disguise as an invalid entity. + /// + [DataField] + public LocId InvalidPopup = "chameleon-projector-invalid"; + + /// + /// Popup shown to the user when they disguise as a valid entity. + /// + [DataField] + public LocId SuccessPopup = "chameleon-projector-success"; +} diff --git a/Content.Shared/Polymorph/Systems/SharedChameleonProjectorSystem.cs b/Content.Shared/Polymorph/Systems/SharedChameleonProjectorSystem.cs new file mode 100644 index 00000000000..c1abfc526f5 --- /dev/null +++ b/Content.Shared/Polymorph/Systems/SharedChameleonProjectorSystem.cs @@ -0,0 +1,113 @@ +using Content.Shared.Actions; +using Content.Shared.Interaction; +using Content.Shared.Polymorph; +using Content.Shared.Polymorph.Components; +using Content.Shared.Popups; +using Robust.Shared.Serialization.Manager; +using Robust.Shared.Prototypes; +using System.Diagnostics.CodeAnalysis; + +namespace Content.Shared.Polymorph.Systems; + +/// +/// Handles whitelist/blacklist checking. +/// Actual polymorphing and deactivation is done serverside. +/// +public abstract class SharedChameleonProjectorSystem : EntitySystem +{ + [Dependency] private readonly IPrototypeManager _proto = default!; + [Dependency] private readonly ISerializationManager _serMan = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnInteract); + } + + private void OnInteract(Entity ent, ref AfterInteractEvent args) + { + if (!args.CanReach || args.Target is not {} target) + return; + + var user = args.User; + args.Handled = true; + + if (IsInvalid(ent.Comp, target)) + { + _popup.PopupClient(Loc.GetString(ent.Comp.InvalidPopup), target, user); + return; + } + + _popup.PopupClient(Loc.GetString(ent.Comp.SuccessPopup), target, user); + Disguise(ent.Comp, user, target); + } + + /// + /// Returns true if an entity cannot be used as a disguise. + /// + public bool IsInvalid(ChameleonProjectorComponent comp, EntityUid target) + { + return (comp.Whitelist?.IsValid(target, EntityManager) == false) + || (comp.Blacklist?.IsValid(target, EntityManager) == true); + } + + /// + /// On server, polymorphs the user into an entity and sets up the disguise. + /// + public virtual void Disguise(ChameleonProjectorComponent comp, EntityUid user, EntityUid entity) + { + } + + /// + /// Copy a component from the source entity/prototype to the disguise entity. + /// + /// + /// This would probably be a good thing to add to engine in the future. + /// + protected bool CopyComp(Entity ent) where T: Component, new() + { + if (!GetSrcComp(ent.Comp, out var src)) + return true; + + // remove then re-add to prevent a funny + RemComp(ent); + var dest = AddComp(ent); + _serMan.CopyTo(src, ref dest, notNullableOverride: true); + Dirty(ent, dest); + return false; + } + + /// + /// Try to get a single component from the source entity/prototype. + /// + private bool GetSrcComp(ChameleonDisguiseComponent comp, [NotNullWhen(true)] out T? src) where T: Component + { + src = null; + if (TryComp(comp.SourceEntity, out src)) + return true; + + if (comp.SourceProto is not {} protoId) + return false; + + if (!_proto.TryIndex(protoId, out var proto)) + return false; + + return proto.TryGetComponent(out src); + } +} + +/// +/// Action event for toggling transform NoRot on a disguise. +/// +public sealed partial class DisguiseToggleNoRotEvent : InstantActionEvent +{ +} + +/// +/// Action event for toggling transform Anchored on a disguise. +/// +public sealed partial class DisguiseToggleAnchoredEvent : InstantActionEvent +{ +} diff --git a/Content.Shared/Popups/SharedPopupSystem.cs b/Content.Shared/Popups/SharedPopupSystem.cs index b199884afb4..10e8ca9be11 100644 --- a/Content.Shared/Popups/SharedPopupSystem.cs +++ b/Content.Shared/Popups/SharedPopupSystem.cs @@ -94,6 +94,12 @@ public abstract class SharedPopupSystem : EntitySystem /// will do nothing and the server will show the message to every player in PVS range. /// public abstract void PopupPredicted(string? message, EntityUid uid, EntityUid? recipient, PopupType type = PopupType.Small); + + /// + /// Variant of that displays + /// to the recipient and to everyone else in PVS range. + /// + public abstract void PopupPredicted(string? recipientMessage, string? othersMessage, EntityUid uid, EntityUid? recipient, PopupType type = PopupType.Small); } /// diff --git a/Content.Shared/RCD/RCDPrototype.cs b/Content.Shared/RCD/RCDPrototype.cs index 1e80abfb723..58093bbe87a 100644 --- a/Content.Shared/RCD/RCDPrototype.cs +++ b/Content.Shared/RCD/RCDPrototype.cs @@ -9,7 +9,7 @@ namespace Content.Shared.RCD; /// Contains the parameters for a RCD construction / operation /// [Prototype("rcd")] -public sealed class RCDPrototype : IPrototype +public sealed partial class RCDPrototype : IPrototype { [IdDataField] public string ID { get; private set; } = default!; @@ -51,7 +51,7 @@ public sealed class RCDPrototype : IPrototype public int Cost { get; private set; } = 1; /// - /// The length of the operation + /// The length of the operation /// [DataField, ViewVariables(VVAccess.ReadOnly)] public float Delay { get; private set; } = 1f; @@ -75,7 +75,7 @@ public sealed class RCDPrototype : IPrototype public CollisionGroup CollisionMask { get; private set; } = CollisionGroup.None; /// - /// Specifies a set of custom collision bounds for determining whether the entity prototype will fit into a target tile + /// Specifies a set of custom collision bounds for determining whether the entity prototype will fit into a target tile /// /// /// Should be set assuming that the entity faces south. @@ -106,7 +106,7 @@ private set private Box2? _collisionBounds = null; /// - /// The polygon shape associated with the prototype CollisionBounds (if set) + /// The polygon shape associated with the prototype CollisionBounds (if set) /// [ViewVariables(VVAccess.ReadOnly)] public PolygonShape? CollisionPolygon { get; private set; } = null; diff --git a/Content.Shared/RCD/Systems/RCDSystem.cs b/Content.Shared/RCD/Systems/RCDSystem.cs index cd1e90dc1ff..974755f0004 100644 --- a/Content.Shared/RCD/Systems/RCDSystem.cs +++ b/Content.Shared/RCD/Systems/RCDSystem.cs @@ -98,16 +98,6 @@ private void OnRCDSystemMessage(EntityUid uid, RCDComponent component, RCDSystem component.ProtoId = args.ProtoId; UpdateCachedPrototype(uid, component); Dirty(uid, component); - - if (args.Session.AttachedEntity != null) - { - // Popup message - var msg = (component.CachedPrototype.Prototype != null) ? - Loc.GetString("rcd-component-change-build-mode", ("name", Loc.GetString(component.CachedPrototype.SetName))) : - Loc.GetString("rcd-component-change-mode", ("mode", Loc.GetString(component.CachedPrototype.SetName))); - - _popup.PopupClient(msg, uid, args.Session.AttachedEntity.Value); - } } private void OnExamine(EntityUid uid, RCDComponent component, ExaminedEvent args) @@ -118,9 +108,18 @@ private void OnExamine(EntityUid uid, RCDComponent component, ExaminedEvent args // Update cached prototype if required UpdateCachedPrototype(uid, component); - var msg = (component.CachedPrototype.Prototype != null) ? - Loc.GetString("rcd-component-examine-build-details", ("name", Loc.GetString(component.CachedPrototype.SetName))) : - Loc.GetString("rcd-component-examine-mode-details", ("mode", Loc.GetString(component.CachedPrototype.SetName))); + var msg = Loc.GetString("rcd-component-examine-mode-details", ("mode", Loc.GetString(component.CachedPrototype.SetName))); + + if (component.CachedPrototype.Mode == RcdMode.ConstructTile || component.CachedPrototype.Mode == RcdMode.ConstructObject) + { + var name = Loc.GetString(component.CachedPrototype.SetName); + + if (component.CachedPrototype.Prototype != null && + _protoManager.TryIndex(component.CachedPrototype.Prototype, out var proto)) + name = proto.Name; + + msg = Loc.GetString("rcd-component-examine-build-details", ("name", name)); + } args.PushMarkup(msg); } @@ -176,7 +175,7 @@ private void OnAfterInteract(EntityUid uid, RCDComponent component, AfterInterac else { var deconstructedTile = _mapSystem.GetTileRef(mapGridData.Value.GridUid, mapGridData.Value.Component, mapGridData.Value.Location); - var protoName = deconstructedTile.IsSpace() ? _deconstructTileProto : _deconstructLatticeProto; + var protoName = !deconstructedTile.IsSpace() ? _deconstructTileProto : _deconstructLatticeProto; if (_protoManager.TryIndex(protoName, out var deconProto)) { @@ -206,7 +205,7 @@ private void OnAfterInteract(EntityUid uid, RCDComponent component, AfterInterac // Try to start the do after var effect = Spawn(effectPrototype, mapGridData.Value.Location); - var ev = new RCDDoAfterEvent(GetNetCoordinates(mapGridData.Value.Location), component.ProtoId, cost, EntityManager.GetNetEntity(effect)); + var ev = new RCDDoAfterEvent(GetNetCoordinates(mapGridData.Value.Location), component.ConstructionDirection, component.ProtoId, cost, EntityManager.GetNetEntity(effect)); var doAfterArgs = new DoAfterArgs(EntityManager, user, delay, ev, uid, target: args.Target, used: uid) { @@ -231,13 +230,19 @@ private void OnDoAfterAttempt(EntityUid uid, RCDComponent component, DoAfterAtte // Exit if the RCD prototype has changed if (component.ProtoId != args.Event.StartingProtoId) + { + args.Cancel(); return; + } // Ensure the RCD operation is still valid var location = GetCoordinates(args.Event.Location); if (!TryGetMapGridData(location, out var mapGridData)) + { + args.Cancel(); return; + } if (!IsRCDOperationStillValid(uid, component, mapGridData.Value, args.Event.Target, args.Event.User)) args.Cancel(); @@ -263,7 +268,7 @@ private void OnDoAfter(EntityUid uid, RCDComponent component, RCDDoAfterEvent ar return; // Finalize the operation - FinalizeRCDOperation(uid, component, mapGridData.Value, args.Target, args.User); + FinalizeRCDOperation(uid, component, mapGridData.Value, args.Direction, args.Target, args.User); // Play audio and consume charges _audio.PlayPredicted(component.SuccessSound, uid, args.User); @@ -419,7 +424,7 @@ private bool IsConstructionLocationValid(EntityUid uid, RCDComponent component, foreach (var fixture in fixtures.Fixtures.Values) { // Continue if no collision is possible - if (fixture.CollisionLayer <= 0 || (fixture.CollisionLayer & (int) component.CachedPrototype.CollisionMask) == 0) + if (!fixture.Hard || fixture.CollisionLayer <= 0 || (fixture.CollisionLayer & (int) component.CachedPrototype.CollisionMask) == 0) continue; // Continue if our custom collision bounds are not intersected @@ -494,7 +499,7 @@ private bool IsDeconstructionStillValid(EntityUid uid, RCDComponent component, M #region Entity construction/deconstruction - private void FinalizeRCDOperation(EntityUid uid, RCDComponent component, MapGridData mapGridData, EntityUid? target, EntityUid user) + private void FinalizeRCDOperation(EntityUid uid, RCDComponent component, MapGridData mapGridData, Direction direction, EntityUid? target, EntityUid user) { if (!_net.IsServer) return; @@ -521,7 +526,7 @@ private void FinalizeRCDOperation(EntityUid uid, RCDComponent component, MapGrid Transform(ent).LocalRotation = Transform(uid).LocalRotation; break; case RcdRotation.User: - Transform(ent).LocalRotation = component.ConstructionDirection.ToAngle(); + Transform(ent).LocalRotation = direction.ToAngle(); break; } @@ -617,6 +622,9 @@ public sealed partial class RCDDoAfterEvent : DoAfterEvent [DataField(required: true)] public NetCoordinates Location { get; private set; } = default!; + [DataField] + public Direction Direction { get; private set; } = default!; + [DataField] public ProtoId StartingProtoId { get; private set; } = default!; @@ -628,9 +636,10 @@ public sealed partial class RCDDoAfterEvent : DoAfterEvent private RCDDoAfterEvent() { } - public RCDDoAfterEvent(NetCoordinates location, ProtoId startingProtoId, int cost, NetEntity? effect = null) + public RCDDoAfterEvent(NetCoordinates location, Direction direction, ProtoId startingProtoId, int cost, NetEntity? effect = null) { Location = location; + Direction = direction; StartingProtoId = startingProtoId; Cost = cost; Effect = effect; diff --git a/Content.Shared/Salvage/SalvageMapPrototype.cs b/Content.Shared/Salvage/SalvageMapPrototype.cs index a9814c7b0ac..9b5a37c6689 100644 --- a/Content.Shared/Salvage/SalvageMapPrototype.cs +++ b/Content.Shared/Salvage/SalvageMapPrototype.cs @@ -4,7 +4,7 @@ namespace Content.Shared.Salvage; [Prototype] -public sealed class SalvageMapPrototype : IPrototype +public sealed partial class SalvageMapPrototype : IPrototype { [ViewVariables] [IdDataField] public string ID { get; } = default!; diff --git a/Content.Shared/Silicons/Laws/SiliconLawPrototype.cs b/Content.Shared/Silicons/Laws/SiliconLawPrototype.cs index f6407be5c7b..5e5df448b33 100644 --- a/Content.Shared/Silicons/Laws/SiliconLawPrototype.cs +++ b/Content.Shared/Silicons/Laws/SiliconLawPrototype.cs @@ -58,7 +58,7 @@ public SiliconLaw ShallowClone() /// [Prototype("siliconLaw")] [Serializable, NetSerializable] -public sealed class SiliconLawPrototype : SiliconLaw, IPrototype +public sealed partial class SiliconLawPrototype : SiliconLaw, IPrototype { /// [IdDataField] diff --git a/Content.Shared/Sound/SharedEmitSoundSystem.cs b/Content.Shared/Sound/SharedEmitSoundSystem.cs index 329626964ef..a9a50698d7d 100644 --- a/Content.Shared/Sound/SharedEmitSoundSystem.cs +++ b/Content.Shared/Sound/SharedEmitSoundSystem.cs @@ -1,7 +1,10 @@ +using Content.Shared.Audio; using Content.Shared.Hands; +using Content.Shared.Hands.Components; using Content.Shared.Interaction; using Content.Shared.Interaction.Events; using Content.Shared.Maps; +using Content.Shared.Mobs; using Content.Shared.Popups; using Content.Shared.Sound.Components; using Content.Shared.Throwing; @@ -28,7 +31,8 @@ public abstract class SharedEmitSoundSystem : EntitySystem [Dependency] private readonly INetManager _netMan = default!; [Dependency] private readonly ITileDefinitionManager _tileDefMan = default!; [Dependency] protected readonly IRobustRandom Random = default!; - [Dependency] private readonly SharedAudioSystem _audioSystem = default!; + [Dependency] private readonly SharedAmbientSoundSystem _ambient = default!; + [Dependency] private readonly SharedAudioSystem _audioSystem = default!; [Dependency] protected readonly SharedPopupSystem Popup = default!; public override void Initialize() @@ -44,6 +48,20 @@ public override void Initialize() SubscribeLocalEvent(OnEmitSoundOnInteractUsing); SubscribeLocalEvent(OnEmitSoundOnCollide); + + SubscribeLocalEvent(OnMobState); + } + + private void OnMobState(Entity entity, ref MobStateChangedEvent args) + { + // Disable this component rather than removing it because it can be brought back to life. + if (TryComp(entity, out var comp)) + { + comp.Enabled = args.NewMobState == MobState.Alive; + Dirty(entity.Owner, comp); + } + + _ambient.SetAmbience(entity.Owner, args.NewMobState != MobState.Dead); } private void OnEmitSpawnOnInit(EntityUid uid, EmitSoundOnSpawnComponent component, MapInitEvent args) diff --git a/Content.Shared/SprayPainter/Prototypes/AirlockDepartmentsPrototype.cs b/Content.Shared/SprayPainter/Prototypes/AirlockDepartmentsPrototype.cs index 3553597c526..b61aa037cc9 100644 --- a/Content.Shared/SprayPainter/Prototypes/AirlockDepartmentsPrototype.cs +++ b/Content.Shared/SprayPainter/Prototypes/AirlockDepartmentsPrototype.cs @@ -7,7 +7,7 @@ namespace Content.Shared.SprayPainter.Prototypes; /// Maps airlock style names to department ids. /// [Prototype("airlockDepartments")] -public sealed class AirlockDepartmentsPrototype : IPrototype +public sealed partial class AirlockDepartmentsPrototype : IPrototype { [IdDataField] public string ID { get; private set; } = default!; diff --git a/Content.Shared/StatusIcon/StatusIconPrototype.cs b/Content.Shared/StatusIcon/StatusIconPrototype.cs index 145b443051c..2bd13b9361d 100644 --- a/Content.Shared/StatusIcon/StatusIconPrototype.cs +++ b/Content.Shared/StatusIcon/StatusIconPrototype.cs @@ -58,7 +58,7 @@ public int CompareTo(StatusIconData? other) /// but in new convenient prototype form! /// [Prototype("statusIcon")] -public sealed class StatusIconPrototype : StatusIconData, IPrototype, IInheritingPrototype +public sealed partial class StatusIconPrototype : StatusIconData, IPrototype, IInheritingPrototype { /// [ParentDataField(typeof(AbstractPrototypeIdArraySerializer))] diff --git a/Content.Shared/StepTrigger/Systems/StepTriggerSystem.cs b/Content.Shared/StepTrigger/Systems/StepTriggerSystem.cs index b4ac2cde756..d81ad754d1e 100644 --- a/Content.Shared/StepTrigger/Systems/StepTriggerSystem.cs +++ b/Content.Shared/StepTrigger/Systems/StepTriggerSystem.cs @@ -59,7 +59,7 @@ private bool Update(EntityUid uid, StepTriggerComponent component, TransformComp if (component.Blacklist != null && TryComp(transform.GridUid, out var grid)) { - var positon = _map.LocalToTile(uid, grid, transform.Coordinates); + var positon = _map.LocalToTile(transform.GridUid.Value, grid, transform.Coordinates); var anch = _map.GetAnchoredEntitiesEnumerator(uid, grid, positon); while (anch.MoveNext(out var ent)) diff --git a/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs b/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs index 3fedfe010a2..393397ca979 100644 --- a/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs +++ b/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs @@ -3,13 +3,14 @@ using System.Linq; using Content.Shared.ActionBlocker; using Content.Shared.Containers.ItemSlots; -using Content.Shared.Coordinates; using Content.Shared.Destructible; using Content.Shared.DoAfter; using Content.Shared.Hands.Components; using Content.Shared.Hands.EntitySystems; using Content.Shared.Implants.Components; +using Content.Shared.Input; using Content.Shared.Interaction; +using Content.Shared.Inventory; using Content.Shared.Item; using Content.Shared.Lock; using Content.Shared.Nyanotrasen.Item.PseudoItem; @@ -23,7 +24,9 @@ using Robust.Shared.Audio.Systems; using Robust.Shared.Containers; using Robust.Shared.GameStates; +using Robust.Shared.Input.Binding; using Robust.Shared.Map; +using Robust.Shared.Player; using Robust.Shared.Prototypes; using Robust.Shared.Random; using Robust.Shared.Serialization; @@ -42,6 +45,7 @@ public abstract class SharedStorageSystem : EntitySystem [Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!; [Dependency] protected readonly SharedEntityStorageSystem EntityStorage = default!; [Dependency] private readonly SharedInteractionSystem _interactionSystem = default!; + [Dependency] private readonly InventorySystem _inventory = default!; [Dependency] protected readonly SharedItemSystem ItemSystem = default!; [Dependency] private readonly SharedPopupSystem _popupSystem = default!; [Dependency] private readonly SharedHandsSystem _sharedHandsSystem = default!; @@ -63,9 +67,14 @@ public abstract class SharedStorageSystem : EntitySystem public bool CheckingCanInsert; + private List _entList = new(); + private HashSet _entSet = new(); + private readonly List _sortedSizes = new(); private FrozenDictionary _nextSmallest = FrozenDictionary.Empty; + protected readonly List CantFillReasons = []; + /// public override void Initialize() { @@ -102,6 +111,11 @@ public override void Initialize() SubscribeLocalEvent(OnReclaimed); + CommandBinds.Builder + .Bind(ContentKeyFunctions.OpenBackpack, InputCmdHandler.FromDelegate(HandleOpenBackpack, handle: false)) + .Bind(ContentKeyFunctions.OpenBelt, InputCmdHandler.FromDelegate(HandleOpenBelt, handle: false)) + .Register(); + UpdatePrototypeCache(); } @@ -262,36 +276,40 @@ private void OnImplantActivate(EntityUid uid, StorageComponent storageComp, Open /// private void AfterInteract(EntityUid uid, StorageComponent storageComp, AfterInteractEvent args) { - if (args.Handled || !args.CanReach) + if (args.Handled || !args.CanReach || !UseDelay.TryResetDelay(uid, checkDelayed: true)) return; // Pick up all entities in a radius around the clicked location. // The last half of the if is because carpets exist and this is terrible if (storageComp.AreaInsert && (args.Target == null || !HasComp(args.Target.Value))) { - var validStorables = new List(); + _entList.Clear(); + _entSet.Clear(); + _entityLookupSystem.GetEntitiesInRange(args.ClickLocation, storageComp.AreaInsertRadius, _entSet, LookupFlags.Dynamic | LookupFlags.Sundries); var delay = 0f; - foreach (var entity in _entityLookupSystem.GetEntitiesInRange(args.ClickLocation, storageComp.AreaInsertRadius, LookupFlags.Dynamic | LookupFlags.Sundries)) + foreach (var entity in _entSet) { if (entity == args.User - // || !_itemQuery.HasComponent(entity) - || !TryComp(entity, out var itemComp) // Need comp to get item size to get weight + || !_itemQuery.TryGetComponent(entity, out var itemComp) // Need comp to get item size to get weight || !_prototype.TryIndex(itemComp.Size, out var itemSize) - || !CanInsert(uid, entity, out _, storageComp) + || !CanInsert(uid, entity, out _, storageComp, item: itemComp) || !_interactionSystem.InRangeUnobstructed(args.User, entity)) { continue; } - validStorables.Add(entity); + _entList.Add(entity); delay += itemSize.Weight * AreaInsertDelayPerItem; + + if (_entList.Count >= StorageComponent.AreaPickupLimit) + break; } //If there's only one then let's be generous - if (validStorables.Count > 1) + if (_entList.Count > 1) { - var doAfterArgs = new DoAfterArgs(EntityManager, args.User, delay, new AreaPickupDoAfterEvent(GetNetEntityList(validStorables)), uid, target: uid) + var doAfterArgs = new DoAfterArgs(EntityManager, args.User, delay, new AreaPickupDoAfterEvent(GetNetEntityList(_entList)), uid, target: uid) { BreakOnDamage = true, BreakOnMove = true, @@ -313,7 +331,7 @@ private void AfterInteract(EntityUid uid, StorageComponent storageComp, AfterInt if (_containerSystem.IsEntityInContainer(target) || target == args.User - || !HasComp(target)) + || !_itemQuery.HasComponent(target)) { return; } @@ -331,10 +349,10 @@ private void AfterInteract(EntityUid uid, StorageComponent storageComp, AfterInt args.Handled = true; if (PlayerInsertEntityInWorld((uid, storageComp), args.User, target)) { - RaiseNetworkEvent(new AnimateInsertingEntitiesEvent(GetNetEntity(uid), + EntityManager.RaiseSharedEvent(new AnimateInsertingEntitiesEvent(GetNetEntity(uid), new List { GetNetEntity(target) }, new List { GetNetCoordinates(position) }, - new List { transformOwner.LocalRotation })); + new List { transformOwner.LocalRotation }), args.User); } } } @@ -349,20 +367,27 @@ private void OnDoAfter(EntityUid uid, StorageComponent component, AreaPickupDoAf var successfullyInserted = new List(); var successfullyInsertedPositions = new List(); var successfullyInsertedAngles = new List(); - _xformQuery.TryGetComponent(uid, out var xform); - foreach (var netEntity in args.Entities) + if (!_xformQuery.TryGetComponent(uid, out var xform)) + { + return; + } + + var entCount = Math.Min(StorageComponent.AreaPickupLimit, args.Entities.Count); + + for (var i = 0; i < entCount; i++) { - var entity = GetEntity(netEntity); + var entity = GetEntity(args.Entities[i]); // Check again, situation may have changed for some entities, but we'll still pick up any that are valid if (_containerSystem.IsEntityInContainer(entity) || entity == args.Args.User || !_itemQuery.HasComponent(entity)) + { continue; + } - if (xform == null || - !_xformQuery.TryGetComponent(entity, out var targetXform) || + if (!_xformQuery.TryGetComponent(entity, out var targetXform) || targetXform.MapID != xform.MapID) { continue; @@ -387,12 +412,12 @@ private void OnDoAfter(EntityUid uid, StorageComponent component, AreaPickupDoAf // If we picked up at least one thing, play a sound and do a cool animation! if (successfullyInserted.Count > 0) { - Audio.PlayPvs(component.StorageInsertSound, uid); - RaiseNetworkEvent(new AnimateInsertingEntitiesEvent( + Audio.PlayPredicted(component.StorageInsertSound, uid, args.User); + EntityManager.RaiseSharedEvent(new AnimateInsertingEntitiesEvent( GetNetEntity(uid), GetNetEntityList(successfullyInserted), GetNetCoordinatesList(successfullyInsertedPositions), - successfullyInsertedAngles)); + successfullyInsertedAngles), args.User); } args.Handled = true; @@ -629,8 +654,15 @@ private void OnInsertAttempt(EntityUid uid, StorageComponent component, Containe if (CheckingCanInsert) return; - if (!CanInsert(uid, args.EntityUid, out _, component, ignoreStacks: true)) + if (!CanInsert(uid, args.EntityUid, out var reason, component, ignoreStacks: true)) + { +#if DEBUG + if (reason != null) + CantFillReasons.Add(reason); +#endif + args.Cancel(); + } } public void UpdateAppearance(Entity entity) @@ -1076,7 +1108,7 @@ public void SaveItemLocation(Entity ent, Entity /// Plays a clientside pickup animation for the specified uid. /// diff --git a/Content.Shared/Storage/StorageComponent.cs b/Content.Shared/Storage/StorageComponent.cs index 2cae12f07a8..16987f1de02 100644 --- a/Content.Shared/Storage/StorageComponent.cs +++ b/Content.Shared/Storage/StorageComponent.cs @@ -60,6 +60,11 @@ public sealed partial class StorageComponent : Component [DataField] public bool ClickInsert = true; // Can insert stuff by clicking the storage entity with it + /// + /// How many entities area pickup can pickup at once. + /// + public const int AreaPickupLimit = 10; + [DataField] public bool AreaInsert; // Clicking with the storage entity causes it to insert all nearby storables after a delay diff --git a/Content.Shared/Store/ListingLocalisationHelpers.cs b/Content.Shared/Store/ListingLocalisationHelpers.cs index 3ac75cd8010..882300109ce 100644 --- a/Content.Shared/Store/ListingLocalisationHelpers.cs +++ b/Content.Shared/Store/ListingLocalisationHelpers.cs @@ -11,15 +11,14 @@ public static class ListingLocalisationHelpers /// public static string GetLocalisedNameOrEntityName(ListingData listingData, IPrototypeManager prototypeManager) { - bool wasLocalised = Loc.TryGetString(listingData.Name, out string? listingName); + var name = string.Empty; - if (!wasLocalised && listingData.ProductEntity != null) - { - var proto = prototypeManager.Index(listingData.ProductEntity); - listingName = proto.Name; - } + if (listingData.Name != null) + name = Loc.GetString(listingData.Name); + else if (listingData.ProductEntity != null) + name = prototypeManager.Index(listingData.ProductEntity.Value).Name; - return listingName ?? listingData.Name; + return name; } /// @@ -29,14 +28,13 @@ public static string GetLocalisedNameOrEntityName(ListingData listingData, IProt /// public static string GetLocalisedDescriptionOrEntityDescription(ListingData listingData, IPrototypeManager prototypeManager) { - bool wasLocalised = Loc.TryGetString(listingData.Description, out string? listingDesc); + var desc = string.Empty; - if (!wasLocalised && listingData.ProductEntity != null) - { - var proto = prototypeManager.Index(listingData.ProductEntity); - listingDesc = proto.Description; - } + if (listingData.Description != null) + desc = Loc.GetString(listingData.Description); + else if (listingData.ProductEntity != null) + desc = prototypeManager.Index(listingData.ProductEntity.Value).Description; - return listingDesc ?? listingData.Description; + return desc; } } diff --git a/Content.Shared/Store/ListingPrototype.cs b/Content.Shared/Store/ListingPrototype.cs index 25245327ce9..d3d2e13cdfd 100644 --- a/Content.Shared/Store/ListingPrototype.cs +++ b/Content.Shared/Store/ListingPrototype.cs @@ -2,10 +2,6 @@ using Content.Shared.FixedPoint; using Robust.Shared.Prototypes; using Robust.Shared.Serialization; -using Robust.Shared.Serialization.TypeSerializers.Implementations; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Dictionary; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; using Robust.Shared.Utility; namespace Content.Shared.Store; @@ -26,57 +22,57 @@ public partial class ListingData : IEquatable, ICloneable /// /// The name of the listing. If empty, uses the entity's name (if present) /// - [DataField("name")] - public string Name = string.Empty; + [DataField] + public string? Name; /// /// The description of the listing. If empty, uses the entity's description (if present) /// - [DataField("description")] - public string Description = string.Empty; + [DataField] + public string? Description; /// /// The categories that this listing applies to. Used for filtering a listing for a store. /// - [DataField("categories", required: true, customTypeSerializer: typeof(PrototypeIdListSerializer))] - public List Categories = new(); + [DataField] + public List> Categories = new(); /// /// The cost of the listing. String represents the currency type while the FixedPoint2 represents the amount of that currency. /// - [DataField("cost", customTypeSerializer: typeof(PrototypeIdDictionarySerializer))] - public Dictionary Cost = new(); + [DataField] + public Dictionary, FixedPoint2> Cost = new(); /// - /// Specific customizeable conditions that determine whether or not the listing can be purchased. + /// Specific customizable conditions that determine whether or not the listing can be purchased. /// [NonSerialized] - [DataField("conditions", serverOnly: true)] + [DataField(serverOnly: true)] public List? Conditions; /// /// The icon for the listing. If null, uses the icon for the entity or action. /// - [DataField("icon")] + [DataField] public SpriteSpecifier? Icon; /// /// The priority for what order the listings will show up in on the menu. /// - [DataField("priority")] - public int Priority = 0; + [DataField] + public int Priority; /// /// The entity that is given when the listing is purchased. /// - [DataField("productEntity", customTypeSerializer: typeof(PrototypeIdSerializer))] - public string? ProductEntity; + [DataField] + public EntProtoId? ProductEntity; /// /// The action that is given when the listing is purchased. /// - [DataField("productAction", customTypeSerializer: typeof(PrototypeIdSerializer))] - public string? ProductAction; + [DataField] + public EntProtoId? ProductAction; /// /// The listing ID of the related upgrade listing. Can be used to link a to an @@ -95,7 +91,7 @@ public partial class ListingData : IEquatable, ICloneable /// /// The event that is broadcast when the listing is purchased. /// - [DataField("productEvent")] + [DataField] public object? ProductEvent; [DataField] @@ -104,13 +100,14 @@ public partial class ListingData : IEquatable, ICloneable /// /// used internally for tracking how many times an item was purchased. /// - public int PurchaseAmount = 0; + [DataField] + public int PurchaseAmount; /// /// Used to delay purchase of some items. /// - [DataField("restockTime")] - public int RestockTime; + [DataField] + public TimeSpan RestockTime = TimeSpan.Zero; public bool Equals(ListingData? listing) { @@ -173,14 +170,10 @@ public object Clone() } } -// /// /// Defines a set item listing that is available in a store /// [Prototype("listing")] [Serializable, NetSerializable] [DataDefinition] -public sealed partial class ListingPrototype : ListingData, IPrototype -{ - -} +public sealed partial class ListingPrototype : ListingData, IPrototype; diff --git a/Content.Shared/Store/StoreUi.cs b/Content.Shared/Store/StoreUi.cs index 27a8ada1855..ee4da6991f6 100644 --- a/Content.Shared/Store/StoreUi.cs +++ b/Content.Shared/Store/StoreUi.cs @@ -1,4 +1,5 @@ using Content.Shared.FixedPoint; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization; namespace Content.Shared.Store; @@ -14,13 +15,13 @@ public sealed class StoreUpdateState : BoundUserInterfaceState { public readonly HashSet Listings; - public readonly Dictionary Balance; + public readonly Dictionary, FixedPoint2> Balance; public readonly bool ShowFooter; public readonly bool AllowRefund; - public StoreUpdateState(HashSet listings, Dictionary balance, bool showFooter, bool allowRefund) + public StoreUpdateState(HashSet listings, Dictionary, FixedPoint2> balance, bool showFooter, bool allowRefund) { Listings = listings; Balance = balance; @@ -46,9 +47,7 @@ public StoreInitializeState(string name) [Serializable, NetSerializable] public sealed class StoreRequestUpdateInterfaceMessage : BoundUserInterfaceMessage { - public StoreRequestUpdateInterfaceMessage() - { - } + } [Serializable, NetSerializable] diff --git a/Content.Shared/Strip/SharedStrippableSystem.cs b/Content.Shared/Strip/SharedStrippableSystem.cs index 7afd4f245a1..59b24ec943e 100644 --- a/Content.Shared/Strip/SharedStrippableSystem.cs +++ b/Content.Shared/Strip/SharedStrippableSystem.cs @@ -43,7 +43,8 @@ private void OnCanDropOn(EntityUid uid, StrippingComponent component, ref CanDro args.Handled = true; args.CanDrop |= uid == args.User && HasComp(args.Dragged) && - HasComp(args.User); + HasComp(args.User) && + HasComp(args.User); } private void OnCanDrop(EntityUid uid, StrippableComponent component, ref CanDropDraggedEvent args) diff --git a/Content.Shared/SubFloor/SharedTrayScannerSystem.cs b/Content.Shared/SubFloor/SharedTrayScannerSystem.cs index da56c8d1c76..6e8393036d4 100644 --- a/Content.Shared/SubFloor/SharedTrayScannerSystem.cs +++ b/Content.Shared/SubFloor/SharedTrayScannerSystem.cs @@ -48,7 +48,7 @@ private void SetScannerEnabled(EntityUid uid, bool enabled, TrayScannerComponent private void OnTrayScannerGetState(EntityUid uid, TrayScannerComponent scanner, ref ComponentGetState args) { - args.State = new TrayScannerState(scanner.Enabled); + args.State = new TrayScannerState(scanner.Enabled, scanner.Range); } private void OnTrayScannerHandleState(EntityUid uid, TrayScannerComponent scanner, ref ComponentHandleState args) @@ -56,6 +56,7 @@ private void OnTrayScannerHandleState(EntityUid uid, TrayScannerComponent scanne if (args.Current is not TrayScannerState state) return; + scanner.Range = state.Range; SetScannerEnabled(uid, state.Enabled, scanner); } } diff --git a/Content.Shared/SubFloor/TrayScannerComponent.cs b/Content.Shared/SubFloor/TrayScannerComponent.cs index 98e43246a84..acde11ff505 100644 --- a/Content.Shared/SubFloor/TrayScannerComponent.cs +++ b/Content.Shared/SubFloor/TrayScannerComponent.cs @@ -22,9 +22,11 @@ public sealed partial class TrayScannerComponent : Component public sealed class TrayScannerState : ComponentState { public bool Enabled; + public float Range; - public TrayScannerState(bool enabled) + public TrayScannerState(bool enabled, float range) { Enabled = enabled; + Range = range; } } diff --git a/Content.Shared/Tools/Components/SharedWelderComponent.cs b/Content.Shared/Tools/Components/SharedWelderComponent.cs deleted file mode 100644 index 78c1cde201b..00000000000 --- a/Content.Shared/Tools/Components/SharedWelderComponent.cs +++ /dev/null @@ -1,21 +0,0 @@ -using Robust.Shared.GameStates; -using Robust.Shared.Serialization; - -namespace Content.Shared.Tools.Components -{ - [NetworkedComponent] - public abstract partial class SharedWelderComponent : Component { } - - [NetSerializable, Serializable] - public sealed class WelderComponentState : ComponentState - { - public float FuelCapacity { get; } - public float Fuel { get; } - - public WelderComponentState(float fuelCapacity, float fuel) - { - FuelCapacity = fuelCapacity; - Fuel = fuel; - } - } -} diff --git a/Content.Shared/Tools/Components/SharedWeldable.cs b/Content.Shared/Tools/Components/WeldableComponent.cs similarity index 55% rename from Content.Shared/Tools/Components/SharedWeldable.cs rename to Content.Shared/Tools/Components/WeldableComponent.cs index 701bd4d8da5..e491b5f6a73 100644 --- a/Content.Shared/Tools/Components/SharedWeldable.cs +++ b/Content.Shared/Tools/Components/WeldableComponent.cs @@ -1,6 +1,6 @@ using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; namespace Content.Shared.Tools.Components; @@ -10,29 +10,31 @@ public sealed partial class WeldableComponent : Component /// /// Tool quality for welding. /// - [DataField("weldingQuality", customTypeSerializer: typeof(PrototypeIdSerializer))] - [ViewVariables(VVAccess.ReadWrite)] - public string WeldingQuality = "Welding"; + [DataField] + public ProtoId WeldingQuality = "Welding"; /// /// How much time does it take to weld/unweld entity. /// - [DataField("time")] - [ViewVariables(VVAccess.ReadWrite)] - [AutoNetworkedField] - public TimeSpan WeldingTime = TimeSpan.FromSeconds(1f); + [DataField, AutoNetworkedField] + public TimeSpan Time = TimeSpan.FromSeconds(1f); + + /// + /// How much fuel does it take to weld/unweld entity. + /// + [DataField] + public float Fuel = 3f; /// /// Shown when welded entity is examined. /// - [DataField("weldedExamineMessage")] - [ViewVariables(VVAccess.ReadWrite)] - public string? WeldedExamineMessage = "weldable-component-examine-is-welded"; + [DataField] + public LocId? WeldedExamineMessage = "weldable-component-examine-is-welded"; /// /// Is this entity currently welded shut? /// - [DataField("isWelded"), AutoNetworkedField] + [DataField, AutoNetworkedField] public bool IsWelded; } diff --git a/Content.Shared/Tools/Components/WelderComponent.cs b/Content.Shared/Tools/Components/WelderComponent.cs new file mode 100644 index 00000000000..3c78a03fdeb --- /dev/null +++ b/Content.Shared/Tools/Components/WelderComponent.cs @@ -0,0 +1,58 @@ +using Content.Shared.Chemistry.Components; +using Content.Shared.Chemistry.Reagent; +using Content.Shared.FixedPoint; +using Content.Shared.Tools.Systems; +using Robust.Shared.Audio; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Tools.Components; + +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true), Access(typeof(SharedToolSystem))] +public sealed partial class WelderComponent : Component +{ + [DataField, AutoNetworkedField] + public bool Enabled; + + [DataField] + public float WelderTimer; + + /// + /// Name of . + /// + [DataField] + public string FuelSolutionName = "Welder"; + + /// + /// Reagent that will be used as fuel for welding. + /// + [DataField] + public ProtoId FuelReagent = "WeldingFuel"; + + /// + /// Fuel consumption per second while the welder is active. + /// + [DataField, AutoNetworkedField] + public FixedPoint2 FuelConsumption = FixedPoint2.New(1.0f); + + /// + /// A fuel amount to be consumed when the welder goes from being unlit to being lit. + /// + [DataField, AutoNetworkedField] + public FixedPoint2 FuelLitCost = FixedPoint2.New(0.5f); + + /// + /// Sound played when refilling the welder. + /// + [DataField] + public SoundSpecifier WelderRefill = new SoundPathSpecifier("/Audio/Effects/refill.ogg"); + + /// + /// Whether the item is safe to refill while lit without exploding the tank. + /// + [DataField] + public bool TankSafe; + + [DataField] + public float WelderUpdateTimer = 1f; +} diff --git a/Content.Shared/Tools/Systems/SharedToolSystem.Welder.cs b/Content.Shared/Tools/Systems/SharedToolSystem.Welder.cs new file mode 100644 index 00000000000..e790b59cd12 --- /dev/null +++ b/Content.Shared/Tools/Systems/SharedToolSystem.Welder.cs @@ -0,0 +1,178 @@ +using Content.Shared.Chemistry.Components; +using Content.Shared.Chemistry.Components.SolutionManager; +using Content.Shared.Database; +using Content.Shared.DoAfter; +using Content.Shared.Examine; +using Content.Shared.FixedPoint; +using Content.Shared.Interaction; +using Content.Shared.Item.ItemToggle.Components; +using Content.Shared.Tools.Components; + +namespace Content.Shared.Tools.Systems; + +public abstract partial class SharedToolSystem +{ + public void InitializeWelder() + { + SubscribeLocalEvent(OnWelderExamine); + SubscribeLocalEvent(OnWelderAfterInteract); + SubscribeLocalEvent>(OnWelderToolUseAttempt); + SubscribeLocalEvent(OnWelderDoAfter); + SubscribeLocalEvent(OnToggle); + SubscribeLocalEvent(OnActivateAttempt); + } + + public virtual void TurnOn(Entity entity, EntityUid? user) + { + if (!SolutionContainerSystem.TryGetSolution(entity.Owner, entity.Comp.FuelSolutionName, out var solutionComp, out _)) + return; + + SolutionContainerSystem.RemoveReagent(solutionComp.Value, entity.Comp.FuelReagent, entity.Comp.FuelLitCost); + AdminLogger.Add(LogType.InteractActivate, LogImpact.Low, + $"{ToPrettyString(user):user} toggled {ToPrettyString(entity.Owner):welder} on"); + + entity.Comp.Enabled = true; + Dirty(entity, entity.Comp); + } + + public void TurnOff(Entity entity, EntityUid? user) + { + AdminLogger.Add(LogType.InteractActivate, LogImpact.Low, + $"{ToPrettyString(user):user} toggled {ToPrettyString(entity.Owner):welder} off"); + entity.Comp.Enabled = false; + Dirty(entity, entity.Comp); + } + + public (FixedPoint2 fuel, FixedPoint2 capacity) GetWelderFuelAndCapacity(EntityUid uid, WelderComponent? welder = null, SolutionContainerManagerComponent? solutionContainer = null) + { + if (!Resolve(uid, ref welder, ref solutionContainer)) + return default; + + if (!SolutionContainer.TryGetSolution( + (uid, solutionContainer), + welder.FuelSolutionName, + out _, + out var fuelSolution)) + { + return default; + } + + return (fuelSolution.GetTotalPrototypeQuantity(welder.FuelReagent), fuelSolution.MaxVolume); + } + + private void OnWelderExamine(Entity entity, ref ExaminedEvent args) + { + using (args.PushGroup(nameof(WelderComponent))) + { + if (ItemToggle.IsActivated(entity.Owner)) + { + args.PushMarkup(Loc.GetString("welder-component-on-examine-welder-lit-message")); + } + else + { + args.PushMarkup(Loc.GetString("welder-component-on-examine-welder-not-lit-message")); + } + + if (args.IsInDetailsRange) + { + var (fuel, capacity) = GetWelderFuelAndCapacity(entity.Owner, entity.Comp); + + args.PushMarkup(Loc.GetString("welder-component-on-examine-detailed-message", + ("colorName", fuel < capacity / FixedPoint2.New(4f) ? "darkorange" : "orange"), + ("fuelLeft", fuel), + ("fuelCapacity", capacity), + ("status", string.Empty))); // Lit status is handled above + } + } + } + + private void OnWelderAfterInteract(Entity entity, ref AfterInteractEvent args) + { + if (args.Handled) + return; + + if (args.Target is not { Valid: true } target || !args.CanReach) + return; + + if (TryComp(target, out ReagentTankComponent? tank) + && tank.TankType == ReagentTankType.Fuel + && SolutionContainerSystem.TryGetDrainableSolution(target, out var targetSoln, out var targetSolution) + && SolutionContainerSystem.TryGetSolution(entity.Owner, entity.Comp.FuelSolutionName, out var solutionComp, out var welderSolution)) + { + var trans = FixedPoint2.Min(welderSolution.AvailableVolume, targetSolution.Volume); + if (trans > 0) + { + var drained = SolutionContainerSystem.Drain(target, targetSoln.Value, trans); + SolutionContainerSystem.TryAddSolution(solutionComp.Value, drained); + _audioSystem.PlayPredicted(entity.Comp.WelderRefill, entity, user: args.User); + _popup.PopupClient(Loc.GetString("welder-component-after-interact-refueled-message"), entity, args.User); + } + else if (welderSolution.AvailableVolume <= 0) + { + _popup.PopupClient(Loc.GetString("welder-component-already-full"), entity, args.User); + } + else + { + _popup.PopupClient(Loc.GetString("welder-component-no-fuel-in-tank", ("owner", args.Target)), entity, args.User); + } + + args.Handled = true; + } + } + + private void OnWelderToolUseAttempt(Entity entity, ref DoAfterAttemptEvent args) + { + var user = args.DoAfter.Args.User; + + if (!ItemToggle.IsActivated(entity.Owner)) + { + _popup.PopupClient(Loc.GetString("welder-component-welder-not-lit-message"), entity, user); + args.Cancel(); + return; + } + + var (fuel, _) = GetWelderFuelAndCapacity(entity); + + if (args.Event.Fuel > fuel) + { + _popup.PopupClient(Loc.GetString("welder-component-cannot-weld-message"), entity, user); + args.Cancel(); + } + } + + private void OnWelderDoAfter(Entity ent, ref ToolDoAfterEvent args) + { + if (args.Cancelled) + return; + + if (!SolutionContainerSystem.TryGetSolution(ent.Owner, ent.Comp.FuelSolutionName, out var solution)) + return; + + SolutionContainerSystem.RemoveReagent(solution.Value, ent.Comp.FuelReagent, FixedPoint2.New(args.Fuel)); + } + + private void OnToggle(Entity entity, ref ItemToggledEvent args) + { + if (args.Activated) + TurnOn(entity, args.User); + else + TurnOff(entity, args.User); + } + + private void OnActivateAttempt(Entity entity, ref ItemToggleActivateAttemptEvent args) + { + if (!SolutionContainerSystem.TryGetSolution(entity.Owner, entity.Comp.FuelSolutionName, out _, out var solution)) + { + args.Cancelled = true; + args.Popup = Loc.GetString("welder-component-no-fuel-message"); + return; + } + + var fuel = solution.GetTotalPrototypeQuantity(entity.Comp.FuelReagent); + if (fuel == FixedPoint2.Zero || fuel < entity.Comp.FuelLitCost) + { + args.Popup = Loc.GetString("welder-component-no-fuel-message"); + args.Cancelled = true; + } + } +} diff --git a/Content.Shared/Tools/Systems/SharedToolSystem.cs b/Content.Shared/Tools/Systems/SharedToolSystem.cs index 4204d7547e0..9edae9b78fd 100644 --- a/Content.Shared/Tools/Systems/SharedToolSystem.cs +++ b/Content.Shared/Tools/Systems/SharedToolSystem.cs @@ -1,8 +1,12 @@ using Content.Shared.Administration.Logs; +using Content.Shared.Chemistry.EntitySystems; using Content.Shared.DoAfter; using Content.Shared.Interaction; +using Content.Shared.Item.ItemToggle; using Content.Shared.Maps; +using Content.Shared.Popups; using Content.Shared.Tools.Components; +using JetBrains.Annotations; using Robust.Shared.Audio.Systems; using Robust.Shared.Map; using Robust.Shared.Prototypes; @@ -15,20 +19,25 @@ public abstract partial class SharedToolSystem : EntitySystem { [Dependency] private readonly IMapManager _mapManager = default!; [Dependency] private readonly IPrototypeManager _protoMan = default!; - [Dependency] protected readonly ISharedAdminLogManager AdminLogger = default!; + [Dependency] protected readonly ISharedAdminLogManager AdminLogger = default!; [Dependency] private readonly ITileDefinitionManager _tileDefManager = default!; [Dependency] private readonly SharedAudioSystem _audioSystem = default!; [Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!; [Dependency] protected readonly SharedInteractionSystem InteractionSystem = default!; + [Dependency] protected readonly SharedItemToggleSystem ItemToggle = default!; [Dependency] private readonly SharedMapSystem _maps = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] protected readonly SharedSolutionContainerSystem SolutionContainerSystem = default!; [Dependency] private readonly SharedTransformSystem _transformSystem = default!; [Dependency] private readonly TileSystem _tiles = default!; [Dependency] private readonly TurfSystem _turfs = default!; + [Dependency] protected readonly SharedSolutionContainerSystem SolutionContainer = default!; public override void Initialize() { InitializeMultipleTool(); InitializeTile(); + InitializeWelder(); SubscribeLocalEvent(OnDoAfter); } @@ -66,6 +75,7 @@ public void PlayToolSound(EntityUid uid, ToolComponent tool, EntityUid? user) /// The qualities needed for this tool to work. /// The event that will be raised when the tool has finished (including cancellation). Event /// will be directed at the tool target. + /// Amount of fuel that should be taken from the tool. /// The tool component. /// Returns true if any interaction takes place. public bool UseTool( @@ -75,6 +85,7 @@ public bool UseTool( float doAfterDelay, IEnumerable toolQualitiesNeeded, DoAfterEvent doAfterEv, + float fuel = 0, ToolComponent? toolComponent = null) { return UseTool(tool, @@ -84,6 +95,7 @@ public bool UseTool( toolQualitiesNeeded, doAfterEv, out _, + fuel, toolComponent); } @@ -101,6 +113,7 @@ public bool UseTool( /// will be directed at the tool target. /// The id of the DoAfter that was created. This may be null even if the function returns true in /// the event that this tool-use cancelled an existing DoAfter + /// Amount of fuel that should be taken from the tool. /// The tool component. /// Returns true if any interaction takes place. public bool UseTool( @@ -111,31 +124,30 @@ public bool UseTool( IEnumerable toolQualitiesNeeded, DoAfterEvent doAfterEv, out DoAfterId? id, + float fuel = 0, ToolComponent? toolComponent = null) { id = null; if (!Resolve(tool, ref toolComponent, false)) return false; - if (!CanStartToolUse(tool, user, target, toolQualitiesNeeded, toolComponent)) + if (!CanStartToolUse(tool, user, target, fuel, toolQualitiesNeeded, toolComponent)) return false; - var toolEvent = new ToolDoAfterEvent(doAfterEv, GetNetEntity(target)); + var toolEvent = new ToolDoAfterEvent(fuel, doAfterEv, GetNetEntity(target)); var doAfterArgs = new DoAfterArgs(EntityManager, user, delay / toolComponent.SpeedModifier, toolEvent, tool, target: target, used: tool) { BreakOnDamage = true, BreakOnMove = true, BreakOnWeightlessMove = false, NeedHand = tool != user, - AttemptFrequency = IsWelder(tool) ? AttemptFrequency.EveryTick : AttemptFrequency.Never + AttemptFrequency = fuel > 0 ? AttemptFrequency.EveryTick : AttemptFrequency.Never }; _doAfterSystem.TryStartDoAfter(doAfterArgs, out id); return true; } - protected abstract bool IsWelder(EntityUid uid); - /// /// Attempts to use a tool on some entity, which will start a DoAfter. Returns true if an interaction occurred. /// Note that this does not mean the interaction was successful, you need to listen for the DoAfter event. @@ -148,6 +160,7 @@ public bool UseTool( /// The quality needed for this tool to work. /// The event that will be raised when the tool has finished (including cancellation). Event /// will be directed at the tool target. + /// Amount of fuel that should be taken from the tool. /// The tool component. /// Returns true if any interaction takes place. public bool UseTool( @@ -157,6 +170,7 @@ public bool UseTool( float doAfterDelay, string toolQualityNeeded, DoAfterEvent doAfterEv, + float fuel = 0, ToolComponent? toolComponent = null) { return UseTool(tool, @@ -166,6 +180,7 @@ public bool UseTool( new[] { toolQualityNeeded }, doAfterEv, out _, + fuel, toolComponent); } @@ -180,12 +195,13 @@ public bool HasQuality(EntityUid uid, string quality, ToolComponent? tool = null /// /// Whether a tool entity has all specified qualities or not. /// + [PublicAPI] public bool HasAllQualities(EntityUid uid, IEnumerable qualities, ToolComponent? tool = null) { return Resolve(uid, ref tool, false) && tool.Qualities.ContainsAll(qualities); } - private bool CanStartToolUse(EntityUid tool, EntityUid user, EntityUid? target, IEnumerable toolQualitiesNeeded, ToolComponent? toolComponent = null) + private bool CanStartToolUse(EntityUid tool, EntityUid user, EntityUid? target, float fuel, IEnumerable toolQualitiesNeeded, ToolComponent? toolComponent = null) { if (!Resolve(tool, ref toolComponent)) return false; @@ -220,6 +236,9 @@ private bool CanStartToolUse(EntityUid tool, EntityUid user, EntityUid? target, [Serializable, NetSerializable] protected sealed partial class ToolDoAfterEvent : DoAfterEvent { + [DataField] + public float Fuel; + /// /// Entity that the wrapped do after event will get directed at. If null, event will be broadcast. /// @@ -233,10 +252,11 @@ private ToolDoAfterEvent() { } - public ToolDoAfterEvent(DoAfterEvent wrappedEvent, NetEntity? originalTarget) + public ToolDoAfterEvent(float fuel, DoAfterEvent wrappedEvent, NetEntity? originalTarget) { DebugTools.Assert(wrappedEvent.GetType().HasCustomAttribute(), "Tool event is not serializable"); + Fuel = fuel; WrappedEvent = wrappedEvent; OriginalTarget = originalTarget; } @@ -249,14 +269,14 @@ public override DoAfterEvent Clone() if (evClone == WrappedEvent) return this; - return new ToolDoAfterEvent(evClone, OriginalTarget); + return new ToolDoAfterEvent(Fuel, evClone, OriginalTarget); } } [Serializable, NetSerializable] protected sealed partial class LatticeCuttingCompleteEvent : DoAfterEvent { - [DataField("coordinates", required:true)] + [DataField(required:true)] public NetCoordinates Coordinates; private LatticeCuttingCompleteEvent() @@ -273,9 +293,7 @@ public LatticeCuttingCompleteEvent(NetCoordinates coordinates) } [Serializable, NetSerializable] -public sealed partial class CableCuttingFinishedEvent : SimpleDoAfterEvent -{ -} +public sealed partial class CableCuttingFinishedEvent : SimpleDoAfterEvent; #endregion diff --git a/Content.Shared/Tools/Systems/WeldableSystem.cs b/Content.Shared/Tools/Systems/WeldableSystem.cs index b0ea68f713f..c6c47d539e0 100644 --- a/Content.Shared/Tools/Systems/WeldableSystem.cs +++ b/Content.Shared/Tools/Systems/WeldableSystem.cs @@ -69,7 +69,7 @@ private bool TryWeld(EntityUid uid, EntityUid tool, EntityUid user, WeldableComp if (!CanWeld(uid, tool, user, component)) return false; - if (!_toolSystem.UseTool(tool, user, uid, component.WeldingTime.Seconds, component.WeldingQuality, new WeldFinishedEvent())) + if (!_toolSystem.UseTool(tool, user, uid, component.Time.Seconds, component.WeldingQuality, new WeldFinishedEvent(), component.Fuel)) return false; // Log attempt @@ -140,10 +140,10 @@ public void SetWeldingTime(EntityUid uid, TimeSpan time, WeldableComponent? comp if (!_query.Resolve(uid, ref component)) return; - if (component.WeldingTime.Equals(time)) + if (component.Time.Equals(time)) return; - component.WeldingTime = time; + component.Time = time; Dirty(uid, component); } } diff --git a/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs b/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs index 85d2e4675f7..fa5e0b3a905 100644 --- a/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs +++ b/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs @@ -140,6 +140,14 @@ public sealed partial class MeleeWeaponComponent : Component [ViewVariables(VVAccess.ReadWrite)] [DataField("soundNoDamage"), AutoNetworkedField] public SoundSpecifier NoDamageSound { get; set; } = new SoundCollectionSpecifier("WeakHit"); + + /// + /// If true, the weapon must be equipped for it to be used. + /// E.g boxing gloves must be equipped to your gloves, + /// not just held in your hand to be used. + /// + [DataField, AutoNetworkedField] + public bool MustBeEquippedToUse = false; } /// diff --git a/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs b/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs index e59b4a13fed..6fa11f87d2a 100644 --- a/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs +++ b/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs @@ -277,7 +277,10 @@ public bool TryGetWeapon(EntityUid entity, out EntityUid weaponUid, [NotNullWhen if (EntityManager.TryGetComponent(entity, out HandsComponent? hands) && hands.ActiveHandEntity is { } held) { - if (EntityManager.TryGetComponent(held, out melee)) + // Make sure the entity is a weapon AND it doesn't need + // to be equipped to be used (E.g boxing gloves). + if (EntityManager.TryGetComponent(held, out melee) && + !melee.MustBeEquippedToUse) { weaponUid = held; return true; diff --git a/Content.Shared/Weapons/Ranged/Components/GunWieldBonusComponent.cs b/Content.Shared/Weapons/Ranged/Components/GunWieldBonusComponent.cs index 58c5fec2d83..ce96639e3c4 100644 --- a/Content.Shared/Weapons/Ranged/Components/GunWieldBonusComponent.cs +++ b/Content.Shared/Weapons/Ranged/Components/GunWieldBonusComponent.cs @@ -17,4 +17,20 @@ public sealed partial class GunWieldBonusComponent : Component /// [ViewVariables(VVAccess.ReadWrite), DataField("maxAngle"), AutoNetworkedField] public Angle MaxAngle = Angle.FromDegrees(-43); + + /// + /// Recoil bonuses applied upon being wielded. + /// Higher angle decay bonus, quicker recovery. + /// Lower angle increase bonus (negative numbers), slower buildup. + /// + [DataField, AutoNetworkedField] + public Angle AngleDecay = Angle.FromDegrees(0); + + /// + /// Recoil bonuses applied upon being wielded. + /// Higher angle decay bonus, quicker recovery. + /// Lower angle increase bonus (negative numbers), slower buildup. + /// + [DataField, AutoNetworkedField] + public Angle AngleIncrease = Angle.FromDegrees(0); } diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Magazine.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Magazine.cs index 57db1d2b9cf..9eb290ab65c 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Magazine.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Magazine.cs @@ -1,7 +1,6 @@ using Content.Shared.Examine; using Content.Shared.Interaction.Events; using Content.Shared.Verbs; -using Content.Shared.Weapons.Ranged.Components; using Content.Shared.Weapons.Ranged.Events; using Robust.Shared.Containers; @@ -13,6 +12,7 @@ public abstract partial class SharedGunSystem protected virtual void InitializeMagazine() { + SubscribeLocalEvent(OnMagazineMapInit); SubscribeLocalEvent(OnMagazineTakeAmmo); SubscribeLocalEvent(OnMagazineAmmoCount); SubscribeLocalEvent>(OnMagazineVerb); @@ -22,6 +22,11 @@ protected virtual void InitializeMagazine() SubscribeLocalEvent(OnMagazineExamine); } + private void OnMagazineMapInit(Entity ent, ref MapInitEvent args) + { + MagazineSlotChanged(ent); + } + private void OnMagazineExamine(EntityUid uid, MagazineAmmoProviderComponent component, ExaminedEvent args) { if (!args.IsInDetailsRange) @@ -62,16 +67,21 @@ protected virtual void OnMagazineSlotChange(EntityUid uid, MagazineAmmoProviderC if (MagazineSlot != args.Container.ID) return; - UpdateAmmoCount(uid); - if (!TryComp(uid, out var appearance)) + MagazineSlotChanged((uid, component)); + } + + private void MagazineSlotChanged(Entity ent) + { + UpdateAmmoCount(ent); + if (!TryComp(ent, out var appearance)) return; - var magEnt = GetMagazineEntity(uid); - Appearance.SetData(uid, AmmoVisuals.MagLoaded, magEnt != null, appearance); + var magEnt = GetMagazineEntity(ent); + Appearance.SetData(ent, AmmoVisuals.MagLoaded, magEnt != null, appearance); if (magEnt != null) { - UpdateMagazineAppearance(uid, component, magEnt.Value); + UpdateMagazineAppearance(ent, ent, magEnt.Value); } } diff --git a/Content.Shared/Wieldable/WieldableSystem.cs b/Content.Shared/Wieldable/WieldableSystem.cs index b7529328793..6bd406c1cad 100644 --- a/Content.Shared/Wieldable/WieldableSystem.cs +++ b/Content.Shared/Wieldable/WieldableSystem.cs @@ -34,7 +34,7 @@ public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnUseInHand); + SubscribeLocalEvent(OnUseInHand, before: [typeof(SharedGunSystem)]); SubscribeLocalEvent(OnItemUnwielded); SubscribeLocalEvent(OnItemLeaveHand); SubscribeLocalEvent(OnVirtualItemDeleted); @@ -90,6 +90,8 @@ private void OnGunRefreshModifiers(Entity bonus, ref Gun { args.MinAngle += bonus.Comp.MinAngle; args.MaxAngle += bonus.Comp.MaxAngle; + args.AngleDecay += bonus.Comp.AngleDecay; + args.AngleIncrease += bonus.Comp.AngleIncrease; } } @@ -195,8 +197,9 @@ public bool TryWield(EntityUid used, WieldableComponent component, EntityUid use && !_delay.TryResetDelay((used, useDelay), true)) return false; - _popupSystem.PopupClient(Loc.GetString("wieldable-component-successful-wield", ("item", used)), user, user); - _popupSystem.PopupEntity(Loc.GetString("wieldable-component-successful-wield-other", ("user", user), ("item", used)), user, Filter.PvsExcept(user), true); + var selfMessage = Loc.GetString("wieldable-component-successful-wield", ("item", used)); + var othersMessage = Loc.GetString("wieldable-component-successful-wield-other", ("user", user), ("item", used)); + _popupSystem.PopupPredicted(selfMessage, othersMessage, user, user); var targEv = new ItemWieldedEvent(); RaiseLocalEvent(used, ref targEv); @@ -239,10 +242,9 @@ private void OnItemUnwielded(EntityUid uid, WieldableComponent component, ItemUn if (component.UnwieldSound != null) _audioSystem.PlayPredicted(component.UnwieldSound, uid, args.User); - _popupSystem.PopupClient(Loc.GetString("wieldable-component-failed-wield", - ("item", uid)), args.User.Value, args.User.Value); - _popupSystem.PopupEntity(Loc.GetString("wieldable-component-failed-wield-other", - ("user", args.User.Value), ("item", uid)), args.User.Value, Filter.PvsExcept(args.User.Value), true); + var selfMessage = Loc.GetString("wieldable-component-failed-wield", ("item", uid)); + var othersMessage = Loc.GetString("wieldable-component-failed-wield-other", ("user", args.User.Value), ("item", uid)); + _popupSystem.PopupPredicted(selfMessage, othersMessage, args.User.Value, args.User.Value); } _appearance.SetData(uid, WieldableVisuals.Wielded, false); diff --git a/Content.Shared/Xenoarchaeology/Equipment/SharedArtifactAnalyzer.cs b/Content.Shared/Xenoarchaeology/Equipment/SharedArtifactAnalyzer.cs index cecacceda9c..07f2a60c848 100644 --- a/Content.Shared/Xenoarchaeology/Equipment/SharedArtifactAnalyzer.cs +++ b/Content.Shared/Xenoarchaeology/Equipment/SharedArtifactAnalyzer.cs @@ -30,50 +30,40 @@ public sealed class AnalysisConsoleExtractButtonPressedMessage : BoundUserInterf } [Serializable, NetSerializable] -public sealed class AnalysisConsoleScanUpdateState : BoundUserInterfaceState +public sealed class AnalysisConsoleBiasButtonPressedMessage(bool isDown) : BoundUserInterfaceMessage { - public NetEntity? Artifact; - - public bool AnalyzerConnected; - - public bool ServerConnected; - - public bool CanScan; - - public bool CanPrint; - - public FormattedMessage? ScanReport; - - public bool Scanning; - - public bool Paused; - - public TimeSpan? StartTime; - - public TimeSpan? AccumulatedRunTime; - - public TimeSpan? TotalTime; - - public int PointAmount; - - public AnalysisConsoleScanUpdateState(NetEntity? artifact, bool analyzerConnected, bool serverConnected, bool canScan, bool canPrint, - FormattedMessage? scanReport, bool scanning, bool paused, TimeSpan? startTime, TimeSpan? accumulatedRunTime, TimeSpan? totalTime, int pointAmount) - { - Artifact = artifact; - AnalyzerConnected = analyzerConnected; - ServerConnected = serverConnected; - CanScan = canScan; - CanPrint = canPrint; - - ScanReport = scanReport; - - Scanning = scanning; - Paused = paused; - - StartTime = startTime; - AccumulatedRunTime = accumulatedRunTime; - TotalTime = totalTime; + public bool IsDown = isDown; +} - PointAmount = pointAmount; - } +[Serializable, NetSerializable] +public sealed class AnalysisConsoleUpdateState( + NetEntity? artifact, + bool analyzerConnected, + bool serverConnected, + bool canScan, + bool canPrint, + FormattedMessage? scanReport, + bool scanning, + bool paused, + TimeSpan? startTime, + TimeSpan? accumulatedRunTime, + TimeSpan? totalTime, + int pointAmount, + bool isTraversalDown +) + : BoundUserInterfaceState +{ + public NetEntity? Artifact = artifact; + public bool AnalyzerConnected = analyzerConnected; + public bool ServerConnected = serverConnected; + public bool CanScan = canScan; + public bool CanPrint = canPrint; + public FormattedMessage? ScanReport = scanReport; + public bool Scanning = scanning; + public bool Paused = paused; + public TimeSpan? StartTime = startTime; + public TimeSpan? AccumulatedRunTime = accumulatedRunTime; + public TimeSpan? TotalTime = totalTime; + public int PointAmount = pointAmount; + public bool IsTraversalDown = isTraversalDown; } diff --git a/Content.Shared/Zombies/ZombieComponent.cs b/Content.Shared/Zombies/ZombieComponent.cs index be3fdbdd01a..3673a2c51d5 100644 --- a/Content.Shared/Zombies/ZombieComponent.cs +++ b/Content.Shared/Zombies/ZombieComponent.cs @@ -27,7 +27,7 @@ public sealed partial class ZombieComponent : Component, IAntagStatusIconCompone /// being invincible by bundling up. /// [ViewVariables(VVAccess.ReadWrite)] - public float MinZombieInfectionChance = 0.50f; + public float MinZombieInfectionChance = 0.25f; [ViewVariables(VVAccess.ReadWrite)] public float ZombieMovementSpeedDebuff = 0.70f; diff --git a/Content.YAMLLinter/Program.cs b/Content.YAMLLinter/Program.cs index b7b70bd1188..b23faa48fcd 100644 --- a/Content.YAMLLinter/Program.cs +++ b/Content.YAMLLinter/Program.cs @@ -1,9 +1,11 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Reflection; using System.Threading.Tasks; using Content.IntegrationTests; using Robust.Shared.Prototypes; +using Robust.Shared.Reflection; using Robust.Shared.Serialization.Markdown.Validation; using Robust.Shared.Timing; using Robust.Shared.Utility; @@ -103,9 +105,13 @@ await instance.WaitPost(() => return (yamlErrors, fieldErrors); } - public static async Task<(Dictionary> YamlErrors , List FieldErrors)> + public static async Task<(Dictionary> YamlErrors, List FieldErrors)> RunValidation() { + var (clientAssemblies, serverAssemblies) = await GetClientServerAssemblies(); + var serverTypes = serverAssemblies.SelectMany(n => n.GetTypes()).Select(t => t.Name).ToHashSet(); + var clientTypes = clientAssemblies.SelectMany(n => n.GetTypes()).Select(t => t.Name).ToHashSet(); + var yamlErrors = new Dictionary>(); var serverErrors = await ValidateServer(); @@ -117,9 +123,18 @@ await instance.WaitPost(() => var newErrors = val.Where(n => n.AlwaysRelevant).ToHashSet(); // We include sometimes-relevant errors if they exist both for the client & server - if (clientErrors.Item1.TryGetValue(key, out var clientVal)) + if (clientErrors.YamlErrors.TryGetValue(key, out var clientVal)) newErrors.UnionWith(val.Intersect(clientVal)); + // Include any errors that relate to server-only types + foreach (var errorNode in val) + { + if (errorNode is FieldNotFoundErrorNode fieldNotFoundNode && !clientTypes.Contains(fieldNotFoundNode.FieldType.Name)) + { + newErrors.Add(errorNode); + } + } + if (newErrors.Count != 0) yamlErrors[key] = newErrors; } @@ -135,6 +150,15 @@ await instance.WaitPost(() => errors.UnionWith(val.Where(n => n.AlwaysRelevant)); else yamlErrors[key] = newErrors; + + // Include any errors that relate to client-only types + foreach (var errorNode in val) + { + if (errorNode is FieldNotFoundErrorNode fieldNotFoundNode && !serverTypes.Contains(fieldNotFoundNode.FieldType.Name)) + { + newErrors.Add(errorNode); + } + } } // Finally, combine the prototype ID field errors. @@ -145,5 +169,23 @@ await instance.WaitPost(() => return (yamlErrors, fieldErrors); } + + private static async Task<(Assembly[] clientAssemblies, Assembly[] serverAssemblies)> + GetClientServerAssemblies() + { + await using var pair = await PoolManager.GetServerClient(); + + var result = (GetAssemblies(pair.Client), GetAssemblies(pair.Server)); + + await pair.CleanReturnAsync(); + + return result; + + Assembly[] GetAssemblies(RobustIntegrationTest.IntegrationInstance instance) + { + var refl = instance.ResolveDependency(); + return refl.Assemblies.ToArray(); + } + } } } diff --git a/Resources/Audio/Effects/Lightning/attributions.yml b/Resources/Audio/Effects/Lightning/attributions.yml index fa6cc9d165f..0bd92af1bbc 100644 --- a/Resources/Audio/Effects/Lightning/attributions.yml +++ b/Resources/Audio/Effects/Lightning/attributions.yml @@ -2,3 +2,13 @@ license: CC-BY-NC-SA-3.0 copyright: Citadel Station 13 source: https://github.com/Citadel-Station-13/Citadel-Station-13/commit/35a1723e98a60f375df590ca572cc90f1bb80bd5 + +- files: ["strobeepsilon.ogg"] + license: "CC-BY-SA-3.0" + copyright: "Made by dj-34 (https://github.com/dj-34). Modified by Ko4erga" + source: "https://github.com/ss220-space/Paradise/blob/05043bcfb35c2e7bcf1efbdbfbf976e1a2504bc2/sound/effects/epsilon.ogg" + +- files: ["strobe.ogg"] + source: "https://freesound.org/people/blukotek/sounds/431651/" + license: "CC0-1.0" + copyright: "Piotr Zaczek (blukotek) on freesound.org. Modified by Ko4erga" diff --git a/Resources/Audio/Effects/Lightning/strobe.ogg b/Resources/Audio/Effects/Lightning/strobe.ogg new file mode 100644 index 00000000000..0d8228c8865 Binary files /dev/null and b/Resources/Audio/Effects/Lightning/strobe.ogg differ diff --git a/Resources/Audio/Effects/Lightning/strobeepsilon.ogg b/Resources/Audio/Effects/Lightning/strobeepsilon.ogg new file mode 100644 index 00000000000..9f77e93b2dc Binary files /dev/null and b/Resources/Audio/Effects/Lightning/strobeepsilon.ogg differ diff --git a/Resources/Audio/Items/attributions.yml b/Resources/Audio/Items/attributions.yml index c6fea50bd25..675e4fff24e 100644 --- a/Resources/Audio/Items/attributions.yml +++ b/Resources/Audio/Items/attributions.yml @@ -93,6 +93,16 @@ copyright: "User Hanbaal on freesound.org. Converted to ogg by TheShuEd" source: "https://freesound.org/people/Hanbaal/sounds/178669/" +- files: ["soda_shake.ogg"] + license: "CC-BY-NC-4.0" + copyright: "User mcmast on freesound.org. Converted and edited by Tayrtahn" + source: "https://freesound.org/people/mcmast/sounds/456703/" + +- files: ["soda_spray.ogg"] + license: "CC0-1.0" + copyright: "User Hajisounds on freesound.org. Converted and edited by Tayrtahn" + source: "https://freesound.org/people/Hajisounds/sounds/709149/" + - files: ["newton_cradle.ogg"] license: "CC-BY-4.0" copyright: "User LoafDV on freesound.org. Converted to ogg end edited by lzk228" diff --git a/Resources/Audio/Items/soda_shake.ogg b/Resources/Audio/Items/soda_shake.ogg new file mode 100644 index 00000000000..a596379c93a Binary files /dev/null and b/Resources/Audio/Items/soda_shake.ogg differ diff --git a/Resources/Audio/Items/soda_spray.ogg b/Resources/Audio/Items/soda_spray.ogg new file mode 100644 index 00000000000..f4a5a3e803f Binary files /dev/null and b/Resources/Audio/Items/soda_spray.ogg differ diff --git a/Resources/Audio/Jukebox/attributions.yml b/Resources/Audio/Jukebox/attributions.yml new file mode 100644 index 00000000000..48e1458c4c0 --- /dev/null +++ b/Resources/Audio/Jukebox/attributions.yml @@ -0,0 +1,27 @@ +- files: ["sector11.ogg"] + license: "CC-BY-NC-SA-3.0" + copyright: "-Sector11 by MashedByMachines. Converted to mono OGG." + source: "https://www.newgrounds.com/audio/listen/312622" + +- files: ["mod.flip-flap.ogg"] + license: "Custom" + copyright: "Flip Flap by X-ceed is licensed under a short but clear license (see flip-flap.txt in Audio/Lobby) and is free for non-commercial use. Converted to mono OGG." + source: "http://aminet.net/package/mods/xceed/Flipflap" + +- files: ["title3.ogg"] + license: "CC-BY-NC-SA-3.0" + copyright: "Title3 by Cuboos. It is a remix of the song 'Tintin on the Moon'. Converted to mono OGG." + source: "https://www.youtube.com/watch?v=YKVmXn-Gv0M" + +- files: + - "constellations.ogg" + - "drifting.ogg" + - "starlight.ogg" + license: "CC-BY-3.0" + copyright: "Constellations by Qwertyquerty. Converted to mono OGG." + source: "https://www.youtube.com/channel/UCPYbhBUGhH7n_G4HLK2YipQ" + +- files: ["sunset.ogg"] + license: "CC-BY-SA-3.0" + copyright: "Sunset by PigeonBeans. Exported in Mono OGG." + source: "https://soundcloud.com/pigeonbeans/sunset" \ No newline at end of file diff --git a/Resources/Audio/Jukebox/constellations.ogg b/Resources/Audio/Jukebox/constellations.ogg new file mode 100644 index 00000000000..f1774894652 Binary files /dev/null and b/Resources/Audio/Jukebox/constellations.ogg differ diff --git a/Resources/Audio/Jukebox/drifting.ogg b/Resources/Audio/Jukebox/drifting.ogg new file mode 100644 index 00000000000..321c098bbdd Binary files /dev/null and b/Resources/Audio/Jukebox/drifting.ogg differ diff --git a/Resources/Audio/Jukebox/flip-flap.ogg b/Resources/Audio/Jukebox/flip-flap.ogg new file mode 100644 index 00000000000..07c47c00be9 Binary files /dev/null and b/Resources/Audio/Jukebox/flip-flap.ogg differ diff --git a/Resources/Audio/Jukebox/sector11.ogg b/Resources/Audio/Jukebox/sector11.ogg new file mode 100644 index 00000000000..f0ce993b7ea Binary files /dev/null and b/Resources/Audio/Jukebox/sector11.ogg differ diff --git a/Resources/Audio/Jukebox/starlight.ogg b/Resources/Audio/Jukebox/starlight.ogg new file mode 100644 index 00000000000..31e23416f96 Binary files /dev/null and b/Resources/Audio/Jukebox/starlight.ogg differ diff --git a/Resources/Audio/Jukebox/sunset.ogg b/Resources/Audio/Jukebox/sunset.ogg new file mode 100644 index 00000000000..3f6d909eaa1 Binary files /dev/null and b/Resources/Audio/Jukebox/sunset.ogg differ diff --git a/Resources/Audio/Jukebox/title3.ogg b/Resources/Audio/Jukebox/title3.ogg new file mode 100644 index 00000000000..5cfe80b535b Binary files /dev/null and b/Resources/Audio/Jukebox/title3.ogg differ diff --git a/Resources/Audio/Voice/Misc/silly_snore.ogg b/Resources/Audio/Voice/Misc/silly_snore.ogg index 7b3d82ce399..22b4c03808b 100644 Binary files a/Resources/Audio/Voice/Misc/silly_snore.ogg and b/Resources/Audio/Voice/Misc/silly_snore.ogg differ diff --git a/Resources/Changelog/Admin.yml b/Resources/Changelog/Admin.yml index 75a1ef7f7b3..8d997a23b7f 100644 --- a/Resources/Changelog/Admin.yml +++ b/Resources/Changelog/Admin.yml @@ -144,5 +144,29 @@ Entries: id: 19 time: '2024-03-31T02:05:44.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/26546 +- author: PJB3005 + changes: + - message: The new "grant_connect_bypass" command grants a player the ability to + connect, bypassing whitelist, player cap and panic bunker. + type: Add + id: 20 + time: '2024-04-09T15:25:21.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26771 +- author: Aexxie + changes: + - message: Removed the bartender's roundstart incendiary shells on Meta. + type: Remove + id: 21 + time: '2024-04-20T01:06:21.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27142 +- author: nikthechampiongr + changes: + - message: Banpanel default values for ban severities, whether a server ban should + be applied with hwid/ip, whether to use last available details, and whether + to erase the player on ban can now be configured through a Cvar. + type: Tweak + id: 22 + time: '2024-04-20T16:18:26.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27168 Name: Admin Order: 3 diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 7a1578a501f..d623b48d444 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,1563 +1,837 @@ Entries: -- author: mirrorcult +- author: Ubaser changes: - - message: Various annoying sounds are now a little quieter + - message: Food Service research is now roundstart. type: Tweak - id: 5819 - time: '2024-01-29T09:51:31.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24690 -- author: SpeltIncorrectyl - changes: - - message: Portable generators can now be connected to the signal network and controlled - remotely via devices like a signal transmitter. - type: Add - id: 5820 - time: '2024-01-29T14:56:29.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24157 -- author: Tayrtahn - changes: - - message: Welders properly display their lit status again. - type: Fix - id: 5821 - time: '2024-01-29T23:04:52.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24705 -- author: Tayrtahn - changes: - - message: Water bottles now display their fill level while held. - type: Add - id: 5822 - time: '2024-01-29T23:19:56.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24708 + id: 5916 + time: '2024-02-11T06:37:12.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25046 - author: SlamBamActionman changes: - - message: Arachnids slipping in water now get a cute hat! + - message: Added setting to toggle chat name color in Options. type: Add - id: 5823 - time: '2024-01-30T00:21:26.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/23822 -- author: Tayrtahn - changes: - - message: Pressing shift as a ghost no longer cancels following your target - type: Fix - id: 5824 - time: '2024-01-30T01:33:35.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24715 -- author: liltenhead + id: 5917 + time: '2024-02-11T06:38:55.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/24625 +- author: Emisse changes: - - message: Jugs are now destructible. + - message: Ambuzol now requires zombie blood type: Tweak - id: 5825 - time: '2024-01-30T08:11:43.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24719 -- author: Emisse + id: 5918 + time: '2024-02-11T20:47:58.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25119 +- author: Plykiya changes: - - message: Aspid - type: Remove - id: 5826 - time: '2024-01-30T10:26:02.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24725 -- author: mirrorcult + - message: Door remotes no longer have their 5G signals absorbed by mobs, machines, + or Ian's cute butt. + type: Fix + id: 5919 + time: '2024-02-12T02:34:13.532550+00:00' + url: null +- author: FungiFellow changes: - - message: Throwing items now scale a bit when thrown to simulate rising/falling - type: Add - id: 5827 - time: '2024-01-30T10:50:41.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24724 -- author: Emisse + - message: Lowered Reoccurence Delay for Ion Storm + type: Tweak + id: 5920 + time: '2024-02-12T02:35:10.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25135 +- author: PoorMansDreams changes: - - message: Gemini - type: Remove - id: 5828 - time: '2024-01-30T10:54:55.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24728 -- author: CrigCrag + - message: Ammo is now tipped! + type: Tweak + id: 5921 + time: '2024-02-12T03:02:52.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25103 +- author: PoorMansDreams changes: - - message: Added a new large salvage wreck. + - message: Buyable Janitorial Trolley! type: Add - id: 5829 - time: '2024-01-30T10:56:38.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24656 -- author: themias + id: 5922 + time: '2024-02-12T06:35:19.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25139 +- author: Plykiya changes: - - message: Fixed Centcom cargo gifts not being fulfilled - type: Fix - id: 5830 - time: '2024-01-30T11:05:20.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24701 -- author: Scribbles0 + - message: Stun batons and stun prods now display their hits remaining. + type: Tweak + id: 5923 + time: '2024-02-12T06:36:06.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25141 +- author: Ilya246 changes: - - message: You can now make anomaly cores orbit you. + - message: Autolathes may now make empty air tanks. type: Add - id: 5831 - time: '2024-01-30T11:12:24.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24716 -- author: MIXnikita + id: 5924 + time: '2024-02-12T06:37:28.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25130 +- author: Ubaser changes: - - message: New sound effects for some shuttle guns + - message: Resprited the CE's jetpack. type: Tweak - id: 5832 - time: '2024-01-30T13:28:17.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24714 -- author: themias - changes: - - message: Stun batons now toggle off after being drained by an EMP. - type: Fix - id: 5833 - time: '2024-01-30T23:04:26.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24706 -- author: Tayrtahn - changes: - - message: Fixed weird rotation while strapped to a bed. - type: Fix - id: 5834 - time: '2024-01-30T23:23:31.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24746 -- author: themias + id: 5925 + time: '2024-02-12T20:44:23.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25150 +- author: EdenTheLiznerd changes: - - message: Some glasses and masks can be worn together to hide your identity. + - message: Deathnettles are no longer able to bypass armor and don't do as much + damage type: Tweak - id: 5835 - time: '2024-01-31T03:49:19.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24741 -- author: mirrorcult + id: 5926 + time: '2024-02-13T01:20:02.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25068 +- author: Vasilis changes: - - message: Throwing recoil reduced further + - message: You can now inspect peoples id's and health though glass if you are within + details range. type: Tweak - id: 5836 - time: '2024-01-31T05:00:41.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24759 -- author: mirrorcult - changes: - - message: Various aspects of the station will now be varied automatically at the - start of the round. Expect more trash, some broken/oddly-functioning lights, - and spills (and more stuff in the future). - type: Add - id: 5837 - time: '2024-01-31T05:52:35.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24397 + id: 5927 + time: '2024-02-13T06:41:56.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25163 - author: metalgearsloth changes: - - message: Remove handheld crew monitors in lieu of computers. - type: Remove - id: 5838 - time: '2024-01-31T11:23:49.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24761 -- author: Hmeister-real + - message: Fix decal error spam in console due to a missing overlay. + type: Fix + id: 5928 + time: '2024-02-13T07:10:44.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25170 +- author: jamessimo changes: - - message: You can now Sob and Chortle with emotes + - message: Can now "wink" with the text emote ;) or ;] + type: Add + - message: Can now "tearfully smile" with the text emote :') and similar variants + type: Add + - message: Added more ways to "cry" with the emote :'( and similar variants type: Tweak - id: 5839 - time: '2024-01-31T11:26:46.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24585 -- author: TheShuEd + id: 5929 + time: '2024-02-13T15:43:20.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25129 +- author: icekot8 changes: - - message: Anomalies can no longer spawn entities in walls or other objects. + - message: Medical berets added to MediDrobe + type: Add + id: 5930 + time: '2024-02-13T21:37:23.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25176 +- author: PoorMansDreams + changes: + - message: Alternate ammo now has the proper appearance when spent. type: Fix - id: 5840 - time: '2024-01-31T21:05:29.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24783 -- author: EdenTheLiznerd + id: 5931 + time: '2024-02-13T21:40:15.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25167 +- author: Agoichi changes: - - message: The Syndicate has changed around their stock prices and gotten rid of - some old dusty headsets + - message: All hoods have tag "Hides Hair" type: Tweak - id: 5841 - time: '2024-02-01T00:28:42.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24765 -- author: metalgearsloth - changes: - - message: Removed vehicles pending rework (the code is bad I was told to make this - more obvious). - type: Remove - id: 5842 - time: '2024-02-01T00:33:10.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24681 -- author: Jajsha + - message: Plague Doctor's hat and Witch hat (with red hair) have tag "Hides Hair" + type: Tweak + id: 5932 + time: '2024-02-13T21:43:19.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25142 +- author: Blackern5000 changes: - - message: Emagged borgs now recieve laws recontextualizing who's a crew member - instead of recieving a completely new lawset. + - message: Advanced topical meds now cost significantly less chemicals type: Tweak - id: 5843 - time: '2024-02-01T05:02:49.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24698 -- author: PJB3005 + id: 5933 + time: '2024-02-13T22:03:13.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/24948 +- author: Tayrtahn changes: - - message: Health analyzers now show if somebody is starving. + - message: Drink bottles can now be opened and closed from the verbs menu, and some + have been given tamper-evident seals. type: Add - id: 5844 - time: '2024-02-01T06:28:17.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24789 -- author: PixelTK - changes: - - message: The arachnid plushie now has a new sprite. - type: Tweak - id: 5845 - time: '2024-02-01T06:36:43.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24747 -- author: lzk228 + id: 5934 + time: '2024-02-13T22:08:07.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/24780 +- author: TheShuEd changes: - - message: Yellow oxygen tank was removed to standardise gas tank colourings. - type: Remove - id: 5846 - time: '2024-02-01T06:53:33.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24374 -- author: koteq + - message: Darkness is coming. A new shadow anomaly added. + type: Add + id: 5935 + time: '2024-02-13T22:12:32.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/24629 +- author: jamessimo changes: - - message: Fixed indicator near SSD players + - message: Microwave UI enhancements + type: Tweak + - message: Microwaves now tell you how much time is left when cooking + type: Tweak + - message: Microwaves UI now uses prediction for user inputs. type: Fix - id: 5847 - time: '2024-02-01T08:30:07.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24589 + id: 5936 + time: '2024-02-13T22:16:00.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/24547 - author: TheShuEd changes: - - message: Anomaly generator can now only be used by a scientist. + - message: Remote signallers are now limited to a 15-tile radius type: Tweak - id: 5848 - time: '2024-02-01T08:45:24.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24464 -- author: PJB3005 - changes: - - message: Removed starvation damage - type: Remove - id: 5849 - time: '2024-02-01T09:01:52.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24790 -- author: SlamBamActionman - changes: - - message: The Visitor job can now be given to ID cards via the ID Card Console/Agent - IDs. + - message: Added an advanced remote signaler, with a range of 30 tiles. type: Add - id: 5850 - time: '2024-02-01T10:13:44.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/23972 -- author: Dygon - changes: - - message: When slipping on lube you now keep sliding until you reach a tile without - lube. + - message: the anomaly synchronizer consumes much less power, and no longer causes + the anomaly pulses when powering down. type: Tweak - id: 5851 - time: '2024-02-01T10:39:10.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24801 -- author: FungiFellow + id: 5937 + time: '2024-02-13T22:19:22.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/24461 +- author: joshepvodka changes: - - message: Added Binary Key in RD's Locker + - message: Fax machines can now print text files from your computer. type: Add - - message: 50% off Binary Key + id: 5938 + time: '2024-02-14T01:14:51.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/23262 +- author: Plykiya + changes: + - message: Holosigns can now be placed at range. No more being eaten by forcefields! type: Tweak - id: 5852 - time: '2024-02-01T10:42:12.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24778 -- author: Dygon + id: 5939 + time: '2024-02-14T05:25:59.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25120 +- author: Zadeon changes: - - message: Paraplegic entities have their legs healed when zombified. + - message: Disablers now fit inside the suit storage slot. type: Fix - id: 5853 - time: '2024-02-01T11:06:05.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24169 -- author: PJB3005 + id: 5940 + time: '2024-02-14T23:07:31.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25238 +- author: Jezithyr changes: - - message: The AME can now single-handedly power the entire station until one of - our cool coders gets their shit together and fixes engineering. + - message: Death Acidifier implants not deleting items when activated type: Fix - id: 5854 - time: '2024-02-01T11:06:52.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24806 -- author: Varen + id: 5941 + time: '2024-02-15T01:37:56.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25251 +- author: PJB3005 changes: - - message: Cutting wires will now properly electrocute if enough power is available. + - message: Fixed disposals bins not automatically flushing after an item was inserted. type: Fix - id: 5855 - time: '2024-02-01T11:54:25.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24554 -- author: SlamBamActionman + id: 5942 + time: '2024-02-15T20:52:52.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25233 +- author: liltenhead changes: - - message: Paper is now edible, even for non-moths. + - message: Reduced energy shield's hp from 150 to 100. type: Tweak - id: 5856 - time: '2024-02-01T12:40:55.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24755 -- author: mac6na6na - changes: - - message: Tiered part crates will no longer appear on salvage expeditions. - type: Remove - id: 5857 - time: '2024-02-01T12:41:03.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24810 -- author: mirrorcult + id: 5943 + time: '2024-02-15T20:54:41.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25258 +- author: PJB3005 changes: - - message: Crayon/lathe/vendor/round end/gas analyzer windows now open closer to - the sides of the screen + - message: Nuke has some more blinkenlights now. type: Tweak - id: 5858 - time: '2024-02-01T12:49:49.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24767 -- author: Tayrtahn + id: 5944 + time: '2024-02-16T00:26:45.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25297 +- author: MACMAN2003 changes: - - message: Plushies, whoopie cushions, and a few other noisemaking objects can be - used as modular grenade payloads. - type: Add - id: 5859 - time: '2024-02-01T12:59:42.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24306 -- author: Repo + - message: Thindows no longer duplicate glass when broken. + type: Fix + id: 5945 + time: '2024-02-16T04:03:51.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25304 +- author: Golinth changes: - - message: AFK admins will trigger the SOS in aHelp relay. + - message: Mindshields are no longer separate and appear as a border around job + icons on the SecHUD type: Tweak - id: 5860 - time: '2024-02-01T13:03:50.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24482 -- author: Nopey - changes: - - message: Many belts and the plant bag no longer produce an erroneous "Can't insert" - and "This doesn't go in there!" messages while inserting certain items such - as Produce (plant bag) or Smoke Grenades (security belt). - type: Fix - - message: Ammunition can once again be stored in assault belts, as was the case - before June 2022. - type: Fix - id: 5861 - time: '2024-02-01T13:33:57.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24063 -- author: Blazeror + id: 5946 + time: '2024-02-16T15:58:29.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25303 +- author: Lukasz825700516 changes: - - message: Chemical analysis goggles can now inspect solutions inside spray bottles. + - message: Damaging stacked glass sheets now gives appropriate amount of glass shards type: Fix - id: 5862 - time: '2024-02-01T22:19:01.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24838 -- author: themias + id: 5947 + time: '2024-02-16T18:42:43.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25308 +- author: Plykiya changes: - - message: Fixed dylovene overdoses not applying brute damage - type: Fix - id: 5863 - time: '2024-02-01T22:21:04.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24826 + - message: The firefighting door remote now has access to atmos doors. + type: Tweak + id: 5948 + time: '2024-02-16T18:50:51.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25097 - author: themias changes: - - message: Added sound effect for Diona salutes - type: Add - id: 5864 - time: '2024-02-01T22:34:09.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24836 -- author: Dutch-VanDerLinde - changes: - - message: Detectives are now listed under civilian instead of security. + - message: t-ray scanners can now penetrate carpets and puddles type: Tweak - id: 5865 - time: '2024-02-01T22:49:54.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24739 -- author: VasilisThePikachu - changes: - - message: The fridge's explosion resistance has been nerfed significantly, It's - no longer able to survive nukes at point blank range of the nuke. - type: Tweak - id: 5866 - time: '2024-02-01T23:41:43.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24844 -- author: Dygon - changes: - - message: You can't slip through chain link fences anymore. - type: Fix - id: 5867 - time: '2024-02-02T04:24:20.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24850 -- author: Psychpsyo + id: 5949 + time: '2024-02-16T23:37:56.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25276 +- author: Krunk changes: - - message: You can now turn down the screen shake intensity in the accessibility - settings. + - message: Sound effects have been added for writing on paper. type: Add - id: 5868 - time: '2024-02-02T12:39:13.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24749 -- author: Anzarot121 - changes: - - message: Fixed a problem in the code due to which mobs, including hamsters, slimes, - spiders, xenos, could not pull things. - type: Fix - id: 5869 - time: '2024-02-03T01:25:11.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/22485 -- author: Tayrtahn + id: 5950 + time: '2024-02-16T23:48:18.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25257 +- author: PotentiallyTom changes: - - message: 'Added a new flavor of Donk Pockets: Stonk Pockets' + - message: Added new covers for the medical, security, and science guidebooks type: Add - id: 5870 - time: '2024-02-03T01:55:03.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24876 -- author: Hmeister - changes: - - message: The guidebook entry for cargo is now up to date, and some other minor - changes to the guidebook. - type: Tweak - id: 5871 - time: '2024-02-03T02:07:21.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24828 -- author: FairlySadPanda + id: 5951 + time: '2024-02-16T23:50:49.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25232 +- author: PJB3005 changes: - - message: The round restart audio, again... + - message: Fix some rounding issues with complex chemical reactions. type: Fix - id: 5872 - time: '2024-02-03T02:11:53.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24754 -- author: Adrian16199 + id: 5952 + time: '2024-02-16T23:54:27.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25199 +- author: data_redacted changes: - - message: Added scarfs to the uniform printer. + - message: New lobby art (of an Air Alarm blueprint). type: Add - id: 5873 - time: '2024-02-03T02:12:38.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24735 -- author: Jajsha + id: 5953 + time: '2024-02-17T02:52:17.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25179 +- author: Lank changes: - - message: Emagged Cyborgs are no longer affected by Ion Storm events. - type: Fix - - message: Improved wording of cyborg laws. + - message: Diona nymphs, small cat-like creatures, several of which make up a Diona. + type: Add + - message: Diona are now able to split into three nymphs on death, and will control + one of them. The controlled nymph is able to reform into a new diona after some + time. + type: Add + - message: Diona now combust into flames upon being hit with significant heat damage. type: Tweak - id: 5874 - time: '2024-02-03T02:29:41.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24870 -- author: metalgearsloth + id: 5954 + time: '2024-02-17T02:54:45.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/24630 +- author: PolterTzi changes: - - message: Moving entities that are pulled now throws them instead of moving them - manually. + - message: Seeds from sampled plants now inherit the sampled plant's health to discourage + excessive sampling. type: Tweak - id: 5875 - time: '2024-02-03T03:36:09.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/20906 -- author: lzk228 - changes: - - message: Soapy water removed. - type: Remove - id: 5876 - time: '2024-02-03T04:23:34.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24301 -- author: Krunk - changes: - - message: Characters can properly select 'None' as a preference for their spawn - priority. - type: Fix - id: 5877 - time: '2024-02-03T08:06:44.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24897 -- author: Krunk - changes: - - message: Pointing arrows now begin at the player and smoothly animate to their - target. - type: Add - id: 5878 - time: '2024-02-03T08:09:20.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24864 + - message: Plants need to grow a bit before being sampled. + type: Tweak + id: 5955 + time: '2024-02-17T05:02:12.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25326 - author: Dygon changes: - - message: Single tile sized puddles of space lube won't let you slide extremely - far anymore. - type: Fix - id: 5879 - time: '2024-02-03T08:10:51.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24846 -- author: shampunj - changes: - - message: Fixed incorrect path to the uranium spear image in the construction menu - type: Fix - id: 5880 - time: '2024-02-03T08:11:02.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24895 -- author: nikthechampiongr - changes: - - message: End of round messages no longer loop until the heat death of the universe. + - message: Diona nymphs aren't deleted immediately after spawning anymore. type: Fix - id: 5881 - time: '2024-02-03T16:43:50.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24920 -- author: EmoGarbage404 + id: 5956 + time: '2024-02-17T16:38:21.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25344 +- author: Geekyhobo changes: - - message: Changed the colors used for chat names. - type: Tweak - id: 5882 - time: '2024-02-03T17:33:58.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24922 -- author: deltanedas + - message: Massban Flag has been added to admin ranks + type: Add + id: 5957 + time: '2024-02-17T20:32:21.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25327 +- author: Moomoobeef changes: - - message: Dissolved the biochem technology discipline into others and roundstart - availability. + - message: Detectives are now supplied with a box of evidence markers, useful for + marking evidence at a crime scene. type: Add - id: 5883 - time: '2024-02-03T18:13:30.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24871 -- author: themias + id: 5958 + time: '2024-02-17T20:49:16.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25255 +- author: Ubaser changes: - - message: EMPs temporarily disable suit sensors - type: Tweak - id: 5884 - time: '2024-02-04T00:50:24.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24869 -- author: themias + - message: New "tailed" hair. + type: Add + id: 5959 + time: '2024-02-17T20:49:48.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25216 +- author: Ubaser changes: - - message: Added face bandanas + - message: A new chest scar marking is now available to humans and dwarves. type: Add - - message: Bandanas can be switched between head and face type with an alt verb - (Fold) - type: Tweak - id: 5885 - time: '2024-02-04T00:52:44.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24597 -- author: metalgearsloth + id: 5960 + time: '2024-02-17T20:50:40.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25215 +- author: ArchPigeon changes: - - message: Moving to open lockers is now predicted. + - message: Tails now stop wagging on crit type: Fix - id: 5886 - time: '2024-02-04T02:23:16.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24937 -- author: Tayrtahn + id: 5961 + time: '2024-02-17T21:33:10.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25323 +- author: Killerqu00 changes: - - message: Added opened/closed visuals and fill levels for a variety of drinks. - type: Add - id: 5887 - time: '2024-02-04T20:13:48.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24600 -- author: deltanedas + - message: EVA and paramedic suits now play sound when putting helmet on. + type: Fix + id: 5962 + time: '2024-02-17T22:34:39.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25349 +- author: musicmanvr changes: - - message: Grilles are no longer incredibly strong. - type: Tweak - id: 5888 - time: '2024-02-04T20:48:06.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24881 -- author: Scribbles0 + - message: Toned down the newton cradle and added it to the bureaucracy crate for + bored accountants. + type: Fix + id: 5963 + time: '2024-02-17T23:55:58.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25357 +- author: genderGeometries changes: - - message: Holoparasites can now autoattack at their max attack rate when holding - down their attack button. + - message: Allicin, nutriment, and vitamin can now be centrifuged. Protein and fat + can now be electrolyzed. type: Add - id: 5889 - time: '2024-02-04T23:01:49.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24944 -- author: EdenTheLiznerd - changes: - - message: Sectech no longer says "Let's crack communist skulls!" It now says "Let's - crack syndicate skulls!" - type: Tweak - id: 5890 - time: '2024-02-05T12:24:52.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24965 -- author: Varen - changes: - - message: Rebalanced electrocution damage to ramp up slower with power levels. - type: Tweak - id: 5891 - time: '2024-02-05T18:47:52.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24829 -- author: ficcialfaint and deltanedas + id: 5964 + time: '2024-02-19T06:05:43.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25366 +- author: azurerosegarden changes: - - message: Criminal records and the console that manages them have been added to - the game. They also have a guidebook entry. - type: Add - id: 5892 - time: '2024-02-05T23:03:04.754935+00:00' - url: null -- author: themias + - message: Drinks in the Solar's Best Hot Drinks menu now show their contents + type: Fix + id: 5965 + time: '2024-02-19T15:40:43.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25301 +- author: Lank changes: - - message: Outlaw Glasses fully hide your identity again + - message: Nymphs can now open doors and chirp. type: Tweak - id: 5893 - time: '2024-02-05T23:23:44.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24971 -- author: Emisse + id: 5966 + time: '2024-02-19T17:11:20.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25363 +- author: PotentiallyTom changes: - - message: Nonstandard pens now embed again. (explosive pen good again) + - message: Gave guidebooks to the 4 learner roles type: Tweak - id: 5894 - time: '2024-02-05T23:30:06.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24849 -- author: FungiFellow + id: 5967 + time: '2024-02-19T18:54:02.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25388 +- author: jamessimo changes: - - message: Altered content of several Borg Modules for QoL + - message: vending machine UI improved type: Tweak - - message: Removed Gas Analyzer Module - type: Remove - id: 5895 - time: '2024-02-05T23:46:39.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24702 -- author: Rainfey + id: 5968 + time: '2024-02-19T22:18:27.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25377 +- author: marbow changes: - - message: Health Analysers now continuously update their UI after scanning a patient - type: Tweak - id: 5896 - time: '2024-02-06T13:20:10.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/22449 -- author: ada-please + - message: Moths can now eat plushies and with a distinctive sound! + type: Add + id: 5969 + time: '2024-02-19T22:35:35.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25382 +- author: ArchPigeon changes: - - message: A Surveillance Camera Monitor Board has been added to the Syndicate Observation - Kit. + - message: Liquid Tritium can now be used as a chem in flamethrowers type: Add - id: 5897 - time: '2024-02-06T16:25:07.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24979 -- author: snebl + id: 5970 + time: '2024-02-19T22:37:45.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25281 +- author: ElectroJr changes: - - message: Fixed the glass version of cargo airlock looking like an engineering - door when opened. + - message: Fix actions sometimes disappearing. type: Fix - id: 5898 - time: '2024-02-06T19:38:39.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/25003 -- author: Mangohydra - changes: - - message: New cargo shuttle for fland - type: Tweak - id: 5899 - time: '2024-02-07T08:49:06.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/25016 -- author: Ilya246 - changes: - - message: Atmos devices can now be built behind directional windows and on lattice. - type: Tweak - id: 5900 - time: '2024-02-08T23:07:42.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/25057 -- author: Ubaser - changes: - - message: T-Ray scanner sprite is tweaked. - type: Tweak - id: 5901 - time: '2024-02-08T23:09:00.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/25047 -- author: nikthechampiongr + id: 5971 + time: '2024-02-20T02:08:41.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25395 +- author: PJB3005 changes: - - message: Brig timers display their label properly again. + - message: Fixed timezone issues with the admin notes window. type: Fix - id: 5902 - time: '2024-02-08T23:12:05.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/25033 -- author: vero5123 + id: 5972 + time: '2024-02-20T09:13:31.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25280 +- author: PJB3005 changes: - - message: fixes mop buckets being indestructible. + - message: Fixed selection behavior for player lists such as the ban panel or ahelp + window. type: Fix - id: 5903 - time: '2024-02-08T23:15:12.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/25001 -- author: Adrian16199 - changes: - - message: Added a straw hat that can be crafted with wheat. - type: Add - id: 5904 - time: '2024-02-08T23:17:01.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24997 -- author: Sk1tch + id: 5973 + time: '2024-02-20T09:13:48.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25248 +- author: Tonydatguy changes: - - message: Guidebook entries are now alphabetically sorted + - message: Ore Crabs will now take structural damage. type: Tweak - id: 5905 - time: '2024-02-08T23:23:35.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24963 -- author: FairlySadPanda + id: 5974 + time: '2024-02-20T10:43:16.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25390 +- author: Golinth changes: - - message: Swapped out the Skelly Vs The Rev art with a new, higher-res version. + - message: The mindshield outline now flashes! type: Tweak - id: 5906 - time: '2024-02-10T02:06:02.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/25088 -- author: Potato1234_x - changes: - - message: Added laughin' peas, a new mutation for peas that can be ground into - Laughter, a chem that forces people to laugh. - type: Add - id: 5907 - time: '2024-02-10T08:21:44.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/25089 -- author: themias + id: 5975 + time: '2024-02-20T22:26:48.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25409 +- author: landwhale changes: - - message: Soft caps can be flipped backwards with an alt-verb (Flip) + - message: Resprited Nettles & Death Nettles. type: Tweak - id: 5908 - time: '2024-02-10T08:44:19.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24961 -- author: Blackern5000 + id: 5976 + time: '2024-02-20T23:58:08.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25421 +- author: takemysoult changes: - - message: Shotgun beanbag rounds now deal 40 stamina damage and stun in 3 hits. + - message: Explosive Technology changed to tier 2 arsenal and the cost has increased + to 10 000 type: Tweak - id: 5909 - time: '2024-02-10T08:49:24.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24653 -- author: metalgearsloth - changes: - - message: Fix screenspace popups e.g. inventory / access popups drawing below the - UI. - type: Fix - id: 5910 - time: '2024-02-10T08:51:11.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24987 -- author: themias + id: 5977 + time: '2024-02-21T00:56:39.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25397 +- author: Callmore changes: - - message: The ID card console now correctly updates the ID's department when you - update its job - type: Fix - - message: The Agent ID will update its department depending on the selected icon + - message: Shoving other people is now more consistent. type: Fix - id: 5911 - time: '2024-02-10T09:17:26.0000000+00:00' - url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24975 -- author: Nimfar11 + id: 5978 + time: '2024-02-21T04:01:45.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25353 +- author: Ubaser changes: - - message: Adds a glass showcase for an antique laser pistol. + - message: A new UI theme, "Ashen", is now available to select in the options menu. type: Add - id: 5912 - time: '2024-02-10T23:36:19.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25104 -- author: Jezithyr - changes: - - message: Changed gibbing to now rotate giblets randomly when they are spawned. - type: Tweak - - message: Giblets are now thrown around the body instead of spawning in a rough - pile. - type: Tweak - id: 5913 - time: '2024-02-10T23:37:06.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/24989 -- author: Jajsha + id: 5979 + time: '2024-02-21T05:26:55.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25408 +- author: Holinka4ever changes: - - message: Cyborgs can no longer Emag themselves. - type: Fix - id: 5914 - time: '2024-02-11T06:23:32.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/24748 -- author: Ubaser + - message: Sunglasses were removed from ClothesMate + type: Remove + id: 5980 + time: '2024-02-21T06:11:02.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25221 +- author: Errant changes: - - message: Grinding ectoplasm now gives Necrosol. + - message: Rotten food is now less lethal to eat, and has a high chance to induce + vomiting. type: Tweak - id: 5915 - time: '2024-02-11T06:24:35.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25053 -- author: Ubaser + id: 5981 + time: '2024-02-21T06:12:59.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25418 +- author: EdenTheLiznerd changes: - - message: Food Service research is now roundstart. + - message: Deathnettles no longer penetrate hardsuit armor type: Tweak - id: 5916 - time: '2024-02-11T06:37:12.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25046 -- author: SlamBamActionman + id: 5982 + time: '2024-02-21T06:16:25.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25286 +- author: Tayrtahn changes: - - message: Added setting to toggle chat name color in Options. + - message: Added fill level visuals to all the drinks. Cheers! type: Add - id: 5917 - time: '2024-02-11T06:38:55.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/24625 -- author: Emisse + id: 5983 + time: '2024-02-21T06:17:56.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25319 +- author: Potato1234_x changes: - - message: Ambuzol now requires zombie blood + - message: Happy Honk boxes can now hold normal sized items type: Tweak - id: 5918 - time: '2024-02-11T20:47:58.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25119 -- author: Plykiya - changes: - - message: Door remotes no longer have their 5G signals absorbed by mobs, machines, - or Ian's cute butt. - type: Fix - id: 5919 - time: '2024-02-12T02:34:13.532550+00:00' - url: null -- author: FungiFellow + id: 5984 + time: '2024-02-21T06:21:45.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25245 +- author: Hanzdegloker changes: - - message: Lowered Reoccurence Delay for Ion Storm + - message: Standardized amount of huds in vendors and added new diagnostics eyeapatch + hud type: Tweak - id: 5920 - time: '2024-02-12T02:35:10.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25135 -- author: PoorMansDreams + id: 5985 + time: '2024-02-21T06:22:30.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25208 +- author: DebugOk changes: - - message: Ammo is now tipped! + - message: Drones are now completely removed instead of just being disabled + type: Remove + id: 5986 + time: '2024-02-21T06:23:05.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25372 +- author: Hanzdegloker + changes: + - message: Dept. Heads are now guaranteed to have their respective winter coats + in their dressers type: Tweak - id: 5921 - time: '2024-02-12T03:02:52.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25103 -- author: PoorMansDreams + - message: Standardized the contents of Dept. Heads dressers and lockers + type: Tweak + id: 5987 + time: '2024-02-21T06:26:24.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25206 +- author: deltanedas changes: - - message: Buyable Janitorial Trolley! + - message: Added Conducting Gloves to the uplink, they make shocks much worse rather + than stop them. type: Add - id: 5922 - time: '2024-02-12T06:35:19.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25139 -- author: Plykiya + id: 5988 + time: '2024-02-21T06:34:47.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25227 +- author: veliebm changes: - - message: Stun batons and stun prods now display their hits remaining. - type: Tweak - id: 5923 - time: '2024-02-12T06:36:06.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25141 -- author: Ilya246 + - message: The guidebook now contains a page for the Radioisotope Thermoelectric + Generator (RTG). + type: Add + id: 5989 + time: '2024-02-21T06:38:29.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25040 +- author: PoorMansDreams changes: - - message: Autolathes may now make empty air tanks. + - message: New pirate start sound! type: Add - id: 5924 - time: '2024-02-12T06:37:28.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25130 -- author: Ubaser + id: 5990 + time: '2024-02-21T06:39:05.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25153 +- author: takemysoult changes: - - message: Resprited the CE's jetpack. + - message: Changed uplink catalog - add syndicate hud to nukeops uplink type: Tweak - id: 5925 - time: '2024-02-12T20:44:23.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25150 -- author: EdenTheLiznerd + id: 5991 + time: '2024-02-21T06:41:01.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25087 +- author: Sphiral changes: - - message: Deathnettles are no longer able to bypass armor and don't do as much - damage + - message: Took the AdminPDA from the backpack and gave it it's own slot on aghosts! + Also aghosts can smoke/wear masks now! type: Tweak - id: 5926 - time: '2024-02-13T01:20:02.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25068 -- author: Vasilis + id: 5992 + time: '2024-02-21T06:41:37.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25402 +- author: EdenTheLiznerd changes: - - message: You can now inspect peoples id's and health though glass if you are within - details range. + - message: Nettles are now weaker than their deathnettle counterparts type: Tweak - id: 5927 - time: '2024-02-13T06:41:56.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25163 -- author: metalgearsloth - changes: - - message: Fix decal error spam in console due to a missing overlay. - type: Fix - id: 5928 - time: '2024-02-13T07:10:44.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25170 -- author: jamessimo + id: 5993 + time: '2024-02-21T06:42:52.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25177 +- author: potato1234x changes: - - message: Can now "wink" with the text emote ;) or ;] + - message: Added spaceman's trumpets which come from mutated lilies and can be ground + up into Polypyrylium Oligomers which are is just slightly better bic. type: Add - - message: Can now "tearfully smile" with the text emote :') and similar variants + - message: Added lilies which are mutated from poppies and are used to create spaceman's + trumpets. type: Add - - message: Added more ways to "cry" with the emote :'( and similar variants + id: 5994 + time: '2024-02-21T06:49:39.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25090 +- author: FungiFellow + changes: + - message: Death Acidifer Price 2->4 type: Tweak - id: 5929 - time: '2024-02-13T15:43:20.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25129 -- author: icekot8 + - message: Removed Acidifier from Syndie Uplink + type: Remove + id: 5995 + time: '2024-02-21T06:51:11.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25039 +- author: Aquif changes: - - message: Medical berets added to MediDrobe + - message: Admins can now disable the bwoink sound if they don't want to scare players. type: Add - id: 5930 - time: '2024-02-13T21:37:23.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25176 -- author: PoorMansDreams + id: 5996 + time: '2024-02-21T06:52:04.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25008 +- author: Fildrance changes: - - message: Alternate ammo now has the proper appearance when spent. + - message: now cryo pod health analyzer updates atomatically! type: Fix - id: 5931 - time: '2024-02-13T21:40:15.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25167 -- author: Agoichi + id: 5997 + time: '2024-02-21T14:47:23.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25109 +- author: landwhale changes: - - message: All hoods have tag "Hides Hair" - type: Tweak - - message: Plague Doctor's hat and Witch hat (with red hair) have tag "Hides Hair" + - message: Drink jugs can no longer be used by chemistry in place of a beaker. + type: Fix + - message: Updated names of several drink jugs to differentiate them from chem-specific + variants. type: Tweak - id: 5932 - time: '2024-02-13T21:43:19.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25142 -- author: Blackern5000 + id: 5998 + time: '2024-02-21T23:26:29.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25450 +- author: Killerqu00 changes: - - message: Advanced topical meds now cost significantly less chemicals - type: Tweak - id: 5933 - time: '2024-02-13T22:03:13.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/24948 -- author: Tayrtahn + - message: EVA helmets are now quick-equippable again + type: Fix + id: 5999 + time: '2024-02-21T23:41:26.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25448 +- author: genderGeometries changes: - - message: Drink bottles can now be opened and closed from the verbs menu, and some - have been given tamper-evident seals. - type: Add - id: 5934 - time: '2024-02-13T22:08:07.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/24780 -- author: TheShuEd + - message: Crops are now harvested with decimal amounts of nutriment, vitamin, etc. + type: Fix + id: 6000 + time: '2024-02-22T00:19:50.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25453 +- author: Whisper changes: - - message: Darkness is coming. A new shadow anomaly added. + - message: Dragon ichor when eating restores the dragon's blood. type: Add - id: 5935 - time: '2024-02-13T22:12:32.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/24629 -- author: jamessimo + - message: Increased Xenomorph and Dragon blood level to 650u. + type: Tweak + id: 6001 + time: '2024-02-22T02:54:16.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25442 +- author: Beck Thompson changes: - - message: Microwave UI enhancements + - message: Radio jammer now uses 3 times less power. type: Tweak - - message: Microwaves now tell you how much time is left when cooking - type: Tweak - - message: Microwaves UI now uses prediction for user inputs. - type: Fix - id: 5936 - time: '2024-02-13T22:16:00.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/24547 -- author: TheShuEd + id: 6002 + time: '2024-02-22T07:32:43.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25432 +- author: metalgearsloth changes: - - message: Remote signallers are now limited to a 15-tile radius - type: Tweak - - message: Added an advanced remote signaler, with a range of 30 tiles. + - message: Added handheld crew monitor back just for CMO. type: Add - - message: the anomaly synchronizer consumes much less power, and no longer causes - the anomaly pulses when powering down. - type: Tweak - id: 5937 - time: '2024-02-13T22:19:22.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/24461 -- author: joshepvodka + id: 6003 + time: '2024-02-22T11:00:35.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25439 +- author: DrMelon changes: - - message: Fax machines can now print text files from your computer. - type: Add - id: 5938 - time: '2024-02-14T01:14:51.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/23262 -- author: Plykiya + - message: Fixed incorrect job-specific Uplink items being given on occasion. + type: Fix + id: 6004 + time: '2024-02-22T11:03:44.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/23179 +- author: liltenhead changes: - - message: Holosigns can now be placed at range. No more being eaten by forcefields! + - message: Changed the syndicate assault borg to have a red flashlight. type: Tweak - id: 5939 - time: '2024-02-14T05:25:59.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25120 -- author: Zadeon + id: 6005 + time: '2024-02-22T11:15:10.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25465 +- author: lzk228 changes: - - message: Disablers now fit inside the suit storage slot. + - message: Fix some items becomes bigger after turning in trash. type: Fix - id: 5940 - time: '2024-02-14T23:07:31.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25238 -- author: Jezithyr + id: 6006 + time: '2024-02-22T11:28:03.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25461 +- author: ps3moira changes: - - message: Death Acidifier implants not deleting items when activated - type: Fix - id: 5941 - time: '2024-02-15T01:37:56.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25251 -- author: PJB3005 + - message: Added Large Wooden floors + type: Add + id: 6007 + time: '2024-02-22T11:59:41.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25462 +- author: Whisper changes: - - message: Fixed disposals bins not automatically flushing after an item was inserted. + - message: Fixed reagent slime ghost role description. type: Fix - id: 5942 - time: '2024-02-15T20:52:52.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25233 -- author: liltenhead + id: 6008 + time: '2024-02-22T12:18:46.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25466 +- author: lzk228 changes: - - message: Reduced energy shield's hp from 150 to 100. + - message: Galoshes are added to the Janidrobe. type: Tweak - id: 5943 - time: '2024-02-15T20:54:41.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25258 + - message: Galoshes now make you slower. + type: Tweak + id: 6009 + time: '2024-02-23T01:05:11.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25484 - author: PJB3005 changes: - - message: Nuke has some more blinkenlights now. + - message: sorting of departments and jobs has been made consistent in various menus. type: Tweak - id: 5944 - time: '2024-02-16T00:26:45.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25297 -- author: MACMAN2003 + id: 6010 + time: '2024-02-23T04:04:44.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25486 +- author: liltenhead changes: - - message: Thindows no longer duplicate glass when broken. + - message: Changed emergency welder's fuel count from 25 -> 50 + type: Tweak + id: 6011 + time: '2024-02-23T06:53:39.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25483 +- author: Vasilis + changes: + - message: Fixed a bug where the centcom official/any job that is not supposed to + have a preference option appeared anyway. type: Fix - id: 5945 - time: '2024-02-16T04:03:51.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25304 -- author: Golinth + id: 6012 + time: '2024-02-23T13:19:52.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25496 +- author: Erisfiregamer1 changes: - - message: Mindshields are no longer separate and appear as a border around job - icons on the SecHUD - type: Tweak - id: 5946 - time: '2024-02-16T15:58:29.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25303 -- author: Lukasz825700516 + - message: Fixed a typo when forcefeeding someone. + type: Fix + id: 6013 + time: '2024-02-24T01:45:02.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25512 +- author: Beck Thompson changes: - - message: Damaging stacked glass sheets now gives appropriate amount of glass shards + - message: The Fire Extinguishers safety can now only be toggled when in range. type: Fix - id: 5947 - time: '2024-02-16T18:42:43.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25308 -- author: Plykiya + id: 6014 + time: '2024-02-25T02:29:16.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25534 +- author: ArchPigeon changes: - - message: The firefighting door remote now has access to atmos doors. - type: Tweak - id: 5948 - time: '2024-02-16T18:50:51.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25097 -- author: themias + - message: Removed the ability for command or any antag-safe role to be initial + infected in zombie mode + type: Remove + id: 6015 + time: '2024-02-25T02:40:49.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25529 +- author: PolterTzi changes: - - message: t-ray scanners can now penetrate carpets and puddles - type: Tweak - id: 5949 - time: '2024-02-16T23:37:56.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25276 + - message: Cargo ordering multiple crates in one order should work now. + type: Fix + id: 6016 + time: '2024-02-25T07:36:22.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25518 +- author: metalgearsloth + changes: + - message: Remove executions pending code rewrite. + type: Remove + id: 6017 + time: '2024-02-25T11:36:17.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25555 - author: Krunk changes: - - message: Sound effects have been added for writing on paper. + - message: Candy bowls function properly again! + type: Fix + id: 6018 + time: '2024-02-25T13:08:15.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25514 +- author: Whisper + changes: + - message: Added juice that makes you Weh! Juice a lizard plushie today! type: Add - id: 5950 - time: '2024-02-16T23:48:18.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25257 -- author: PotentiallyTom + id: 6019 + time: '2024-02-25T13:54:07.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25132 +- author: wafehling changes: - - message: Added new covers for the medical, security, and science guidebooks + - message: Secret mode has become more secret, with the 4th option Survival added + to the rotation. + type: Tweak + id: 6020 + time: '2024-02-25T21:15:35.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25568 +- author: Tayrtahn + changes: + - message: Added a live preview display to reagent dispensers. type: Add - id: 5951 - time: '2024-02-16T23:50:49.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25232 -- author: PJB3005 + id: 6021 + time: '2024-02-25T23:03:22.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25391 +- author: Krunk changes: - - message: Fix some rounding issues with complex chemical reactions. + - message: Fixed grid inventory occasionally messing with your item rotation. type: Fix - id: 5952 - time: '2024-02-16T23:54:27.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25199 -- author: data_redacted + id: 6022 + time: '2024-02-25T23:24:21.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25510 +- author: Ubaser changes: - - message: New lobby art (of an Air Alarm blueprint). - type: Add - id: 5953 - time: '2024-02-17T02:52:17.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25179 -- author: Lank + - message: Satchels no longer have darkened space representing a gap, and is instead + transparent. + type: Tweak + id: 6023 + time: '2024-02-25T23:24:59.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25147 +- author: TheShuEd changes: - - message: Diona nymphs, small cat-like creatures, several of which make up a Diona. - type: Add - - message: Diona are now able to split into three nymphs on death, and will control - one of them. The controlled nymph is able to reform into a new diona after some - time. - type: Add - - message: Diona now combust into flames upon being hit with significant heat damage. + - message: Huge flora anomaly nerf type: Tweak - id: 5954 - time: '2024-02-17T02:54:45.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/24630 -- author: PolterTzi + id: 6024 + time: '2024-02-25T23:41:24.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25499 +- author: OctoRocket changes: - - message: Seeds from sampled plants now inherit the sampled plant's health to discourage - excessive sampling. + - message: Removed the hands requirement to read paper. type: Tweak - - message: Plants need to grow a bit before being sampled. - type: Tweak - id: 5955 - time: '2024-02-17T05:02:12.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25326 -- author: Dygon - changes: - - message: Diona nymphs aren't deleted immediately after spawning anymore. - type: Fix - id: 5956 - time: '2024-02-17T16:38:21.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25344 -- author: Geekyhobo - changes: - - message: Massban Flag has been added to admin ranks - type: Add - id: 5957 - time: '2024-02-17T20:32:21.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25327 -- author: Moomoobeef - changes: - - message: Detectives are now supplied with a box of evidence markers, useful for - marking evidence at a crime scene. - type: Add - id: 5958 - time: '2024-02-17T20:49:16.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25255 -- author: Ubaser - changes: - - message: New "tailed" hair. - type: Add - id: 5959 - time: '2024-02-17T20:49:48.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25216 -- author: Ubaser - changes: - - message: A new chest scar marking is now available to humans and dwarves. - type: Add - id: 5960 - time: '2024-02-17T20:50:40.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25215 -- author: ArchPigeon - changes: - - message: Tails now stop wagging on crit - type: Fix - id: 5961 - time: '2024-02-17T21:33:10.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25323 -- author: Killerqu00 - changes: - - message: EVA and paramedic suits now play sound when putting helmet on. - type: Fix - id: 5962 - time: '2024-02-17T22:34:39.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25349 -- author: musicmanvr - changes: - - message: Toned down the newton cradle and added it to the bureaucracy crate for - bored accountants. - type: Fix - id: 5963 - time: '2024-02-17T23:55:58.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25357 -- author: genderGeometries - changes: - - message: Allicin, nutriment, and vitamin can now be centrifuged. Protein and fat - can now be electrolyzed. - type: Add - id: 5964 - time: '2024-02-19T06:05:43.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25366 -- author: azurerosegarden - changes: - - message: Drinks in the Solar's Best Hot Drinks menu now show their contents - type: Fix - id: 5965 - time: '2024-02-19T15:40:43.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25301 -- author: Lank - changes: - - message: Nymphs can now open doors and chirp. - type: Tweak - id: 5966 - time: '2024-02-19T17:11:20.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25363 -- author: PotentiallyTom - changes: - - message: Gave guidebooks to the 4 learner roles - type: Tweak - id: 5967 - time: '2024-02-19T18:54:02.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25388 -- author: jamessimo - changes: - - message: vending machine UI improved - type: Tweak - id: 5968 - time: '2024-02-19T22:18:27.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25377 -- author: marbow - changes: - - message: Moths can now eat plushies and with a distinctive sound! - type: Add - id: 5969 - time: '2024-02-19T22:35:35.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25382 -- author: ArchPigeon - changes: - - message: Liquid Tritium can now be used as a chem in flamethrowers - type: Add - id: 5970 - time: '2024-02-19T22:37:45.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25281 -- author: ElectroJr - changes: - - message: Fix actions sometimes disappearing. - type: Fix - id: 5971 - time: '2024-02-20T02:08:41.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25395 -- author: PJB3005 - changes: - - message: Fixed timezone issues with the admin notes window. - type: Fix - id: 5972 - time: '2024-02-20T09:13:31.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25280 -- author: PJB3005 - changes: - - message: Fixed selection behavior for player lists such as the ban panel or ahelp - window. - type: Fix - id: 5973 - time: '2024-02-20T09:13:48.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25248 -- author: Tonydatguy - changes: - - message: Ore Crabs will now take structural damage. - type: Tweak - id: 5974 - time: '2024-02-20T10:43:16.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25390 -- author: Golinth - changes: - - message: The mindshield outline now flashes! - type: Tweak - id: 5975 - time: '2024-02-20T22:26:48.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25409 -- author: landwhale - changes: - - message: Resprited Nettles & Death Nettles. - type: Tweak - id: 5976 - time: '2024-02-20T23:58:08.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25421 -- author: takemysoult - changes: - - message: Explosive Technology changed to tier 2 arsenal and the cost has increased - to 10 000 - type: Tweak - id: 5977 - time: '2024-02-21T00:56:39.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25397 -- author: Callmore - changes: - - message: Shoving other people is now more consistent. - type: Fix - id: 5978 - time: '2024-02-21T04:01:45.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25353 -- author: Ubaser - changes: - - message: A new UI theme, "Ashen", is now available to select in the options menu. - type: Add - id: 5979 - time: '2024-02-21T05:26:55.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25408 -- author: Holinka4ever - changes: - - message: Sunglasses were removed from ClothesMate - type: Remove - id: 5980 - time: '2024-02-21T06:11:02.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25221 -- author: Errant - changes: - - message: Rotten food is now less lethal to eat, and has a high chance to induce - vomiting. - type: Tweak - id: 5981 - time: '2024-02-21T06:12:59.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25418 -- author: EdenTheLiznerd - changes: - - message: Deathnettles no longer penetrate hardsuit armor - type: Tweak - id: 5982 - time: '2024-02-21T06:16:25.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25286 -- author: Tayrtahn - changes: - - message: Added fill level visuals to all the drinks. Cheers! - type: Add - id: 5983 - time: '2024-02-21T06:17:56.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25319 -- author: Potato1234_x - changes: - - message: Happy Honk boxes can now hold normal sized items - type: Tweak - id: 5984 - time: '2024-02-21T06:21:45.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25245 -- author: Hanzdegloker - changes: - - message: Standardized amount of huds in vendors and added new diagnostics eyeapatch - hud - type: Tweak - id: 5985 - time: '2024-02-21T06:22:30.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25208 -- author: DebugOk - changes: - - message: Drones are now completely removed instead of just being disabled - type: Remove - id: 5986 - time: '2024-02-21T06:23:05.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25372 -- author: Hanzdegloker - changes: - - message: Dept. Heads are now guaranteed to have their respective winter coats - in their dressers - type: Tweak - - message: Standardized the contents of Dept. Heads dressers and lockers - type: Tweak - id: 5987 - time: '2024-02-21T06:26:24.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25206 -- author: deltanedas - changes: - - message: Added Conducting Gloves to the uplink, they make shocks much worse rather - than stop them. - type: Add - id: 5988 - time: '2024-02-21T06:34:47.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25227 -- author: veliebm - changes: - - message: The guidebook now contains a page for the Radioisotope Thermoelectric - Generator (RTG). - type: Add - id: 5989 - time: '2024-02-21T06:38:29.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25040 -- author: PoorMansDreams - changes: - - message: New pirate start sound! - type: Add - id: 5990 - time: '2024-02-21T06:39:05.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25153 -- author: takemysoult - changes: - - message: Changed uplink catalog - add syndicate hud to nukeops uplink - type: Tweak - id: 5991 - time: '2024-02-21T06:41:01.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25087 -- author: Sphiral - changes: - - message: Took the AdminPDA from the backpack and gave it it's own slot on aghosts! - Also aghosts can smoke/wear masks now! - type: Tweak - id: 5992 - time: '2024-02-21T06:41:37.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25402 -- author: EdenTheLiznerd - changes: - - message: Nettles are now weaker than their deathnettle counterparts - type: Tweak - id: 5993 - time: '2024-02-21T06:42:52.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25177 -- author: potato1234x - changes: - - message: Added spaceman's trumpets which come from mutated lilies and can be ground - up into Polypyrylium Oligomers which are is just slightly better bic. - type: Add - - message: Added lilies which are mutated from poppies and are used to create spaceman's - trumpets. - type: Add - id: 5994 - time: '2024-02-21T06:49:39.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25090 -- author: FungiFellow - changes: - - message: Death Acidifer Price 2->4 - type: Tweak - - message: Removed Acidifier from Syndie Uplink - type: Remove - id: 5995 - time: '2024-02-21T06:51:11.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25039 -- author: Aquif - changes: - - message: Admins can now disable the bwoink sound if they don't want to scare players. - type: Add - id: 5996 - time: '2024-02-21T06:52:04.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25008 -- author: Fildrance - changes: - - message: now cryo pod health analyzer updates atomatically! - type: Fix - id: 5997 - time: '2024-02-21T14:47:23.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25109 -- author: landwhale - changes: - - message: Drink jugs can no longer be used by chemistry in place of a beaker. - type: Fix - - message: Updated names of several drink jugs to differentiate them from chem-specific - variants. - type: Tweak - id: 5998 - time: '2024-02-21T23:26:29.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25450 -- author: Killerqu00 - changes: - - message: EVA helmets are now quick-equippable again - type: Fix - id: 5999 - time: '2024-02-21T23:41:26.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25448 -- author: genderGeometries - changes: - - message: Crops are now harvested with decimal amounts of nutriment, vitamin, etc. - type: Fix - id: 6000 - time: '2024-02-22T00:19:50.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25453 -- author: Whisper - changes: - - message: Dragon ichor when eating restores the dragon's blood. - type: Add - - message: Increased Xenomorph and Dragon blood level to 650u. - type: Tweak - id: 6001 - time: '2024-02-22T02:54:16.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25442 -- author: Beck Thompson - changes: - - message: Radio jammer now uses 3 times less power. - type: Tweak - id: 6002 - time: '2024-02-22T07:32:43.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25432 -- author: metalgearsloth - changes: - - message: Added handheld crew monitor back just for CMO. - type: Add - id: 6003 - time: '2024-02-22T11:00:35.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25439 -- author: DrMelon - changes: - - message: Fixed incorrect job-specific Uplink items being given on occasion. - type: Fix - id: 6004 - time: '2024-02-22T11:03:44.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/23179 -- author: liltenhead - changes: - - message: Changed the syndicate assault borg to have a red flashlight. - type: Tweak - id: 6005 - time: '2024-02-22T11:15:10.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25465 -- author: lzk228 - changes: - - message: Fix some items becomes bigger after turning in trash. - type: Fix - id: 6006 - time: '2024-02-22T11:28:03.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25461 -- author: ps3moira - changes: - - message: Added Large Wooden floors - type: Add - id: 6007 - time: '2024-02-22T11:59:41.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25462 -- author: Whisper - changes: - - message: Fixed reagent slime ghost role description. - type: Fix - id: 6008 - time: '2024-02-22T12:18:46.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25466 -- author: lzk228 - changes: - - message: Galoshes are added to the Janidrobe. - type: Tweak - - message: Galoshes now make you slower. - type: Tweak - id: 6009 - time: '2024-02-23T01:05:11.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25484 -- author: PJB3005 - changes: - - message: sorting of departments and jobs has been made consistent in various menus. - type: Tweak - id: 6010 - time: '2024-02-23T04:04:44.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25486 -- author: liltenhead - changes: - - message: Changed emergency welder's fuel count from 25 -> 50 - type: Tweak - id: 6011 - time: '2024-02-23T06:53:39.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25483 -- author: Vasilis - changes: - - message: Fixed a bug where the centcom official/any job that is not supposed to - have a preference option appeared anyway. - type: Fix - id: 6012 - time: '2024-02-23T13:19:52.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25496 -- author: Erisfiregamer1 - changes: - - message: Fixed a typo when forcefeeding someone. - type: Fix - id: 6013 - time: '2024-02-24T01:45:02.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25512 -- author: Beck Thompson - changes: - - message: The Fire Extinguishers safety can now only be toggled when in range. - type: Fix - id: 6014 - time: '2024-02-25T02:29:16.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25534 -- author: ArchPigeon - changes: - - message: Removed the ability for command or any antag-safe role to be initial - infected in zombie mode - type: Remove - id: 6015 - time: '2024-02-25T02:40:49.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25529 -- author: PolterTzi - changes: - - message: Cargo ordering multiple crates in one order should work now. - type: Fix - id: 6016 - time: '2024-02-25T07:36:22.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25518 -- author: metalgearsloth - changes: - - message: Remove executions pending code rewrite. - type: Remove - id: 6017 - time: '2024-02-25T11:36:17.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25555 -- author: Krunk - changes: - - message: Candy bowls function properly again! - type: Fix - id: 6018 - time: '2024-02-25T13:08:15.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25514 -- author: Whisper - changes: - - message: Added juice that makes you Weh! Juice a lizard plushie today! - type: Add - id: 6019 - time: '2024-02-25T13:54:07.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25132 -- author: wafehling - changes: - - message: Secret mode has become more secret, with the 4th option Survival added - to the rotation. - type: Tweak - id: 6020 - time: '2024-02-25T21:15:35.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25568 -- author: Tayrtahn - changes: - - message: Added a live preview display to reagent dispensers. - type: Add - id: 6021 - time: '2024-02-25T23:03:22.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25391 -- author: Krunk - changes: - - message: Fixed grid inventory occasionally messing with your item rotation. - type: Fix - id: 6022 - time: '2024-02-25T23:24:21.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25510 -- author: Ubaser - changes: - - message: Satchels no longer have darkened space representing a gap, and is instead - transparent. - type: Tweak - id: 6023 - time: '2024-02-25T23:24:59.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25147 -- author: TheShuEd - changes: - - message: Huge flora anomaly nerf - type: Tweak - id: 6024 - time: '2024-02-25T23:41:24.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25499 -- author: OctoRocket - changes: - - message: Removed the hands requirement to read paper. - type: Tweak - id: 6025 - time: '2024-02-26T02:40:22.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25580 -- author: SlamBamActionman - changes: - - message: Self-uncuff damage has been removed, but attempting to self-uncuff now - has a cooldown instead. + id: 6025 + time: '2024-02-26T02:40:22.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25580 +- author: SlamBamActionman + changes: + - message: Self-uncuff damage has been removed, but attempting to self-uncuff now + has a cooldown instead. type: Tweak id: 6026 time: '2024-02-26T02:41:20.0000000+00:00' @@ -1675,2142 +949,2900 @@ type: Tweak - message: Decreased all bloodloss damage (as a result of bleeding) by 50%. type: Tweak - - message: Health analyzers will report if your patient is bleeding. + - message: Health analyzers will report if your patient is bleeding. + type: Add + id: 6040 + time: '2024-02-26T23:26:46.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25434 +- author: Velcroboy + changes: + - message: Tweaked wallmounted objects can not be interacted with through thindows + or windoors. + type: Tweak + - message: Fixed NanoMed vendor not being accessible from all directions. + type: Fix + id: 6041 + time: '2024-02-26T23:28:55.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25451 +- author: Lank + changes: + - message: Diona can no longer split or reform to cure themselves of a zombie infection. + type: Fix + id: 6042 + time: '2024-02-26T23:31:37.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25404 +- author: Zadeon + changes: + - message: Added salt as a new type of ore that can be mined from asteroids. Salt + can be ground up for its base components. + type: Add + id: 6043 + time: '2024-02-26T23:34:15.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25324 +- author: juliangiebel + changes: + - message: The mass media consoles UI got overhauled + type: Tweak + - message: Added PDA notifications in chat for new news articles. They can be turned + off in the news reader program and are only visible to you. + type: Add + id: 6044 + time: '2024-02-27T01:38:00.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/19610 +- author: rosieposieeee + changes: + - message: Added lockable wall buttons and decorative frames for differentiating + wall buttons. + type: Add + id: 6045 + time: '2024-02-27T07:57:17.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25631 +- author: metalgearsloth + changes: + - message: Fix chat bubbles. + type: Fix + id: 6046 + time: '2024-02-27T13:01:24.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25643 +- author: rosieposieeee + changes: + - message: Added grey stalagmites and made all stalagmites weaker and more fun to + break. + type: Add + id: 6047 + time: '2024-02-27T19:24:17.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25646 +- author: metalgearsloth + changes: + - message: Made NPC movement less janky. + type: Fix + id: 6048 + time: '2024-02-28T06:41:15.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25666 +- author: musicmanvr + changes: + - message: Added the Syndicate decoy bundle, a creative way to trick your foes. + type: Add + - message: Snap pops have been added to the toy crate. + type: Add + - message: Syndicate Commanders now have a trench whistle, Avanti! + type: Add + id: 6049 + time: '2024-02-28T21:53:46.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25333 +- author: Whisper + changes: + - message: Iron and copper no longer grant infinite blood! + type: Fix + id: 6050 + time: '2024-02-28T21:56:22.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25678 +- author: Cojoke-dot + changes: + - message: E-sword now lights plasma fires + type: Tweak + id: 6051 + time: '2024-02-28T21:59:35.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25665 +- author: lzk228 + changes: + - message: Engineering structures orders in cargo now supplied via flatpacks (e.g. + tesla & singulo generators, other stuff for them). + type: Tweak + - message: Thrusters and gyroscopes now supplied in crates via flatpacks. + type: Tweak + id: 6052 + time: '2024-02-28T22:02:02.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25647 +- author: c4llv07e + changes: + - message: Cryo won't remove you from the new body if you chose a new ghost role + before cryo deleted your old body. + type: Fix + id: 6053 + time: '2024-02-28T22:09:02.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/24991 +- author: Nairodian + changes: + - message: You can now remove the rust from reinforced walls with a welder. + type: Fix + id: 6054 + time: '2024-02-29T00:44:01.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25690 +- author: Ubaser + changes: + - message: Eris UI theme has been removed. + type: Remove + id: 6055 + time: '2024-02-29T05:53:48.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25673 +- author: Rainfey + changes: + - message: Disallow multiple antag roles per player + type: Fix + id: 6056 + time: '2024-02-29T06:25:10.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/23445 +- author: Kukutis96513 + changes: + - message: Changed the amount of plushies in the lizard plushie crate. + type: Tweak + id: 6057 + time: '2024-02-29T16:45:04.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25122 +- author: Aexxie + changes: + - message: Nutribricks spawn in Survival Kits in place of Tinned Meat. + type: Tweak + - message: Lizards can now eat Nutribricks. + type: Fix + - message: Moths can eat Nutribrick wrappers. + type: Add + id: 6058 + time: '2024-02-29T21:39:53.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25659 +- author: Flareguy + changes: + - message: Big O2 tanks and N2 tanks no longer spawn in any departmental locker. + Use tank dispensers to get them instead. + type: Tweak + - message: Removed all instances where N2 tanks spawned as counterparts to O2 tanks. + This includes things like lockers, suit storages, and the emergency toolbox. + type: Remove + id: 6059 + time: '2024-02-29T21:40:17.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25660 +- author: Potato1234_x + changes: + - message: Added fill levels to bowls, chefs rejoice! + type: Add + id: 6060 + time: '2024-02-29T21:41:14.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25639 +- author: Plykiya + changes: + - message: Dragging objects over gas pipes no longer slows you down. + type: Fix + id: 6061 + time: '2024-02-29T21:41:56.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25629 +- author: TheShuEd + changes: + - message: 9 new colourful curtains. Can be crafted from carpets. + type: Add + id: 6062 + time: '2024-02-29T22:25:41.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25684 +- author: Nairodian + changes: + - message: The smooth tail now has a second color layer to customize. + type: Tweak + id: 6063 + time: '2024-02-29T22:27:04.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25685 +- author: Hanzdegloker + changes: + - message: Commonly used decals should no longer washout the details of the tiles + below. + type: Tweak + id: 6064 + time: '2024-02-29T22:27:25.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25689 +- author: lzk228 + changes: + - message: Added recipe of handheld station map to autolathe. + type: Add + id: 6065 + time: '2024-02-29T22:34:11.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25719 +- author: MACMAN2003 + changes: + - message: There are now more ways to craft reinforced plasma/uranium glass. + type: Tweak + id: 6066 + time: '2024-02-29T22:57:18.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/22804 +- author: deltanedas + changes: + - message: Acidifiers and microbombs now require confirmation before gibbing you. + type: Tweak + id: 6067 + time: '2024-03-01T02:48:43.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/24609 +- author: exincore + changes: + - message: Chameleon gear now only reveals its menu button to its wearer. + type: Tweak + id: 6068 + time: '2024-03-01T12:49:49.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25746 +- author: Nairodian + changes: + - message: Fixed all command and security roles not having cryogenics access. + type: Fix + id: 6069 + time: '2024-03-01T21:21:37.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25752 +- author: IlyaElDunaev + changes: + - message: Added detective's rubber stamp. + type: Add + id: 6070 + time: '2024-03-01T22:50:17.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25676 +- author: rosieposieeee + changes: + - message: Added additional signage to help the crew navigate. + type: Add + id: 6071 + time: '2024-03-02T06:42:06.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25766 +- author: EmoGarbage404 + changes: + - message: Space heaters machine boards are now printable round start and can additionally + be ordered by cargo. + type: Tweak + id: 6072 + time: '2024-03-02T06:43:29.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25735 +- author: Krunk + changes: + - message: Picking up and dumping trash is less arduous for tiny, plentiful items, + such as bullets. + type: Tweak + id: 6073 + time: '2024-03-02T13:57:44.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/24899 +- author: Errant + changes: + - message: Breathing tritium or plasma now displays a HUD alert. type: Add - id: 6040 - time: '2024-02-26T23:26:46.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25434 -- author: Velcroboy + id: 6074 + time: '2024-03-02T14:07:05.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/24484 +- author: waylon531 changes: - - message: Tweaked wallmounted objects can not be interacted with through thindows - or windoors. + - message: Nutribrick and MRE wrappers can now be put in trash bags type: Tweak - - message: Fixed NanoMed vendor not being accessible from all directions. - type: Fix - id: 6041 - time: '2024-02-26T23:28:55.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25451 -- author: Lank + id: 6075 + time: '2024-03-02T14:23:00.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25760 +- author: Fildrance changes: - - message: Diona can no longer split or reform to cure themselves of a zombie infection. + - message: fixed lobby music restarting after volume change in options. Lobby music + is also not being looped by default - all lobby songs will play in shuffle mode. type: Fix - id: 6042 - time: '2024-02-26T23:31:37.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25404 -- author: Zadeon + id: 6076 + time: '2024-03-02T20:40:04.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25530 +- author: exincore changes: - - message: Added salt as a new type of ore that can be mined from asteroids. Salt - can be ground up for its base components. + - message: Inventories now show a secondary smart-equip star. type: Add - id: 6043 - time: '2024-02-26T23:34:15.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25324 -- author: juliangiebel + id: 6077 + time: '2024-03-02T23:57:42.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25696 +- author: Emisse changes: - - message: The mass media consoles UI got overhauled + - message: Rev's reenabled type: Tweak - - message: Added PDA notifications in chat for new news articles. They can be turned - off in the news reader program and are only visible to you. - type: Add - id: 6044 - time: '2024-02-27T01:38:00.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/19610 -- author: rosieposieeee - changes: - - message: Added lockable wall buttons and decorative frames for differentiating - wall buttons. - type: Add - id: 6045 - time: '2024-02-27T07:57:17.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25631 -- author: metalgearsloth + id: 6078 + time: '2024-03-03T00:30:22.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25704 +- author: EmoGarbage404 changes: - - message: Fix chat bubbles. + - message: Fixed issues where using the Quantum Spin Inverted would bug out the + character's physics. type: Fix - id: 6046 - time: '2024-02-27T13:01:24.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25643 -- author: rosieposieeee + id: 6079 + time: '2024-03-03T06:45:26.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25700 +- author: deltanedas changes: - - message: Added grey stalagmites and made all stalagmites weaker and more fun to - break. - type: Add - id: 6047 - time: '2024-02-27T19:24:17.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25646 + - message: No more raiding the jani vend for galoshes, which are back to normal + speed. + type: Remove + id: 6080 + time: '2024-03-03T07:07:58.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25795 - author: metalgearsloth changes: - - message: Made NPC movement less janky. - type: Fix - id: 6048 - time: '2024-02-28T06:41:15.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25666 -- author: musicmanvr + - message: 'Reworked shuttle consoles, including: manual FTL jumps, new map screen, + fixed performance issues, new docking screen.' + type: Tweak + id: 6081 + time: '2024-03-03T07:39:19.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/24430 +- author: Errant-4 changes: - - message: Added the Syndicate decoy bundle, a creative way to trick your foes. - type: Add - - message: Snap pops have been added to the toy crate. - type: Add - - message: Syndicate Commanders now have a trench whistle, Avanti! - type: Add - id: 6049 - time: '2024-02-28T21:53:46.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25333 -- author: Whisper + - message: Toggling your own internals no longer requires a delay. + type: Tweak + id: 6082 + time: '2024-03-03T08:31:47.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25781 +- author: SlamBamActionman changes: - - message: Iron and copper no longer grant infinite blood! + - message: Arachnids are no longer perma-pied and can clean it off. type: Fix - id: 6050 - time: '2024-02-28T21:56:22.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25678 -- author: Cojoke-dot + id: 6083 + time: '2024-03-03T08:54:36.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25713 +- author: Dutch-VanDerLinde changes: - - message: E-sword now lights plasma fires - type: Tweak - id: 6051 - time: '2024-02-28T21:59:35.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25665 -- author: lzk228 + - message: Monkeys and kobolds can now wear blood-red hardsuits. + type: Add + id: 6084 + time: '2024-03-04T03:56:17.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/22273 +- author: Plykiya changes: - - message: Engineering structures orders in cargo now supplied via flatpacks (e.g. - tesla & singulo generators, other stuff for them). + - message: Syringes now prevent injecting on empty and drawing on full. type: Tweak - - message: Thrusters and gyroscopes now supplied in crates via flatpacks. + - message: You can now tell if you are being drawn from or injected by a syringe. type: Tweak - id: 6052 - time: '2024-02-28T22:02:02.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25647 -- author: c4llv07e + id: 6085 + time: '2024-03-04T05:07:11.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25480 +- author: metalgearsloth changes: - - message: Cryo won't remove you from the new body if you chose a new ghost role - before cryo deleted your old body. + - message: Fix expedition FTL. type: Fix - id: 6053 - time: '2024-02-28T22:09:02.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/24991 + id: 6086 + time: '2024-03-04T06:24:24.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25823 - author: Nairodian changes: - - message: You can now remove the rust from reinforced walls with a welder. - type: Fix - id: 6054 - time: '2024-02-29T00:44:01.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25690 -- author: Ubaser + - message: Welding masks can now be made in the Autolathe. + type: Add + id: 6087 + time: '2024-03-04T22:36:06.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25842 +- author: Lawdog changes: - - message: Eris UI theme has been removed. + - message: Changed the max volume of shot glasses from 7u to 5u to better represent + drinking shots in real life + type: Tweak + id: 6088 + time: '2024-03-04T23:51:12.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25847 +- author: deltanedas + changes: + - message: Rehydrated mobs (carp) now keep their forensics data from their cube/plushie + form. + type: Tweak + id: 6089 + time: '2024-03-05T03:13:50.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25148 +- author: Brandon-Huu + changes: + - message: Removed the ability for command or any antag-safe role to be initial + infected in zombie mode type: Remove - id: 6055 - time: '2024-02-29T05:53:48.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25673 -- author: Rainfey + id: 6090 + time: '2024-03-05T04:34:18.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25785 +- author: Whisper changes: - - message: Disallow multiple antag roles per player - type: Fix - id: 6056 - time: '2024-02-29T06:25:10.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/23445 -- author: Kukutis96513 + - message: Glass shards can be added to flatcaps to create bladed flatcaps! + type: Add + id: 6091 + time: '2024-03-05T20:57:55.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25780 +- author: MACMAN2003 changes: - - message: Changed the amount of plushies in the lizard plushie crate. + - message: Added clockwork structures and brass to build them with. + type: Add + id: 6092 + time: '2024-03-06T00:25:59.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/24673 +- author: deepdarkdepths + changes: + - message: Added the paramedic's cap to the uniform printer. + type: Add + id: 6093 + time: '2024-03-06T01:17:50.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25861 +- author: lzk228 + changes: + - message: Livestock crate and artifact container now can go under plastic flaps. type: Tweak - id: 6057 - time: '2024-02-29T16:45:04.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25122 -- author: Aexxie + id: 6094 + time: '2024-03-06T01:33:20.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25862 +- author: PJB3005 + changes: + - message: Saving paper is on ctrl+enter again. Also there's a visible "save" button + now. + type: Tweak + id: 6095 + time: '2024-03-06T01:35:26.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25870 +- author: ps3moira changes: - - message: Nutribricks spawn in Survival Kits in place of Tinned Meat. + - message: Changed brick, wood, and web walls to be unable to conjoin with different + walls. type: Tweak - - message: Lizards can now eat Nutribricks. - type: Fix - - message: Moths can eat Nutribrick wrappers. + id: 6096 + time: '2024-03-06T01:36:04.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25674 +- author: Froffy + changes: + - message: Water can now be scooped from water tiles, such as planetary rivers. type: Add - id: 6058 - time: '2024-02-29T21:39:53.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25659 -- author: Flareguy + id: 6097 + time: '2024-03-06T01:37:24.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25825 +- author: Ko4erga changes: - - message: Big O2 tanks and N2 tanks no longer spawn in any departmental locker. - Use tank dispensers to get them instead. + - message: '"Post light" updated.' type: Tweak - - message: Removed all instances where N2 tanks spawned as counterparts to O2 tanks. - This includes things like lockers, suit storages, and the emergency toolbox. - type: Remove - id: 6059 - time: '2024-02-29T21:40:17.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25660 -- author: Potato1234_x + id: 6098 + time: '2024-03-06T01:39:47.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25814 +- author: Ilya246 changes: - - message: Added fill levels to bowls, chefs rejoice! + - message: Gas leak events are now 4 times as strong, and may leak water vapor. + The fog is coming. + type: Tweak + id: 6099 + time: '2024-03-06T01:41:04.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25864 +- author: Just_Art + changes: + - message: Added bob 5 hair! type: Add - id: 6060 - time: '2024-02-29T21:41:14.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25639 -- author: Plykiya + - message: Added long hair with bundles! + type: Add + id: 6100 + time: '2024-03-06T01:42:05.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25772 +- author: Errant changes: - - message: Dragging objects over gas pipes no longer slows you down. + - message: Debug coordinates are now automatically enabled on the F3 overlay upon + readmin. type: Fix - id: 6061 - time: '2024-02-29T21:41:56.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25629 -- author: TheShuEd + id: 6101 + time: '2024-03-06T01:43:51.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25063 +- author: metalgearsloth changes: - - message: 9 new colourful curtains. Can be crafted from carpets. + - message: Pod launches will now be offset slightly. type: Add - id: 6062 - time: '2024-02-29T22:25:41.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25684 -- author: Nairodian + id: 6102 + time: '2024-03-06T01:44:26.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25855 +- author: Brandon-Huu changes: - - message: The smooth tail now has a second color layer to customize. + - message: The Syndicate is now supplying barber scissors in the Hristov bundle + to make your disguises even balde- better. type: Tweak - id: 6063 - time: '2024-02-29T22:27:04.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25685 -- author: Hanzdegloker + id: 6103 + time: '2024-03-06T02:03:08.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25695 +- author: Tayrtahn changes: - - message: Commonly used decals should no longer washout the details of the tiles - below. - type: Tweak - id: 6064 - time: '2024-02-29T22:27:25.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25689 -- author: lzk228 + - message: Flasks can once again be put into dispensers. + type: Fix + id: 6104 + time: '2024-03-06T17:19:01.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25883 +- author: Doctor-Cpu changes: - - message: Added recipe of handheld station map to autolathe. + - message: Cargo palllets can no longer be ordered from cargo request terminal + type: Remove + id: 6105 + time: '2024-03-07T17:53:57.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25882 +- author: Beck Thompson + changes: + - message: Lawdrobe has some new items and new ads! type: Add - id: 6065 - time: '2024-02-29T22:34:11.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25719 -- author: MACMAN2003 + id: 6106 + time: '2024-03-07T19:18:39.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25299 +- author: Blackern5000 changes: - - message: There are now more ways to craft reinforced plasma/uranium glass. + - message: Salvagers can now pull in overgrown floral anomalies. + type: Add + id: 6107 + time: '2024-03-07T19:37:57.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/24650 +- author: Nimfar11 + changes: + - message: Slimes can now drink FourteenLoko without harming their bodies. type: Tweak - id: 6066 - time: '2024-02-29T22:57:18.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/22804 -- author: deltanedas + id: 6108 + time: '2024-03-07T20:50:10.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25889 +- author: NakataRin changes: - - message: Acidifiers and microbombs now require confirmation before gibbing you. + - message: Evacuation shuttle arrives 10 minutes on green alert now. type: Tweak - id: 6067 - time: '2024-03-01T02:48:43.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/24609 -- author: exincore + id: 6109 + time: '2024-03-07T21:01:53.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25906 +- author: Admiral-Obvious-001 changes: - - message: Chameleon gear now only reveals its menu button to its wearer. + - message: Zombies are now tougher to kill. type: Tweak - id: 6068 - time: '2024-03-01T12:49:49.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25746 -- author: Nairodian + id: 6110 + time: '2024-03-07T21:02:50.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25876 +- author: TheShuEd changes: - - message: Fixed all command and security roles not having cryogenics access. + - message: Removed Hamlet, Smile and Pun Pun from Thief objectives + type: Remove + id: 6111 + time: '2024-03-07T23:53:36.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25921 +- author: MACMAN2003 + changes: + - message: Diagonal windows no longer space you when in a pressurized environment. type: Fix - id: 6069 - time: '2024-03-01T21:21:37.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25752 -- author: IlyaElDunaev + id: 6112 + time: '2024-03-08T07:50:34.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25926 +- author: mryikes changes: - - message: Added detective's rubber stamp. + - message: New Nuke Detonation Song "Clearly Nuclear". type: Add - id: 6070 - time: '2024-03-01T22:50:17.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25676 -- author: rosieposieeee + id: 6113 + time: '2024-03-09T01:44:54.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25765 +- author: Plykiya changes: - - message: Added additional signage to help the crew navigate. - type: Add - id: 6071 - time: '2024-03-02T06:42:06.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25766 + - message: Pre-filled syringes start in inject mode now. + type: Tweak + id: 6114 + time: '2024-03-09T10:19:03.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25881 - author: EmoGarbage404 changes: - - message: Space heaters machine boards are now printable round start and can additionally - be ordered by cargo. + - message: Added a new "colorblind friendly" toggle in the accessibility menu. This + allows you to toggle between a standard and colorblind-friendly palette for + things like progress bars and the medical HUD. + type: Add + - message: The medical HUD is now bright, even in low light levels. type: Tweak - id: 6072 - time: '2024-03-02T06:43:29.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25735 -- author: Krunk + id: 6115 + time: '2024-03-09T11:43:20.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25318 +- author: metalgearsloth changes: - - message: Picking up and dumping trash is less arduous for tiny, plentiful items, - such as bullets. - type: Tweak - id: 6073 - time: '2024-03-02T13:57:44.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/24899 -- author: Errant + - message: Fix NPC mouse movement. + type: Fix + id: 6116 + time: '2024-03-10T15:41:42.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25965 +- author: DoutorWhite changes: - - message: Breathing tritium or plasma now displays a HUD alert. - type: Add - id: 6074 - time: '2024-03-02T14:07:05.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/24484 -- author: waylon531 + - message: Prevents rendering from crashing in certain scenarios + type: Fix + id: 6117 + time: '2024-03-10T17:07:24.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25960 +- author: nikthechampiongr changes: - - message: Nutribrick and MRE wrappers can now be put in trash bags + - message: Shields will no longer absorb asphyxiation damage, or any other damage + they themselves can't take. + type: Fix + id: 6118 + time: '2024-03-11T01:55:19.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25972 +- author: metalgearsloth + changes: + - message: Remove the buttons for generated debris from shuttle maps. type: Tweak - id: 6075 - time: '2024-03-02T14:23:00.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25760 -- author: Fildrance + id: 6119 + time: '2024-03-11T02:11:46.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25897 +- author: Errant changes: - - message: fixed lobby music restarting after volume change in options. Lobby music - is also not being looped by default - all lobby songs will play in shuffle mode. - type: Fix - id: 6076 - time: '2024-03-02T20:40:04.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25530 -- author: exincore + - message: Species info is now available in the Guidebook and in the character editor. + type: Add + id: 6120 + time: '2024-03-11T03:01:32.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25844 +- author: Dygon changes: - - message: Inventories now show a secondary smart-equip star. + - message: 'The following criminal record statuses have been added: Suspect, Discharged, + Paroled.' type: Add - id: 6077 - time: '2024-03-02T23:57:42.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25696 -- author: Emisse + - message: Security huds now show an icon on entities that have a visible name linked + to a criminal record. + type: Add + id: 6121 + time: '2024-03-11T03:12:52.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25192 +- author: Lank changes: - - message: Rev's reenabled + - message: The detective is no longer independent, and again works under Security. type: Tweak - id: 6078 - time: '2024-03-03T00:30:22.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25704 -- author: EmoGarbage404 - changes: - - message: Fixed issues where using the Quantum Spin Inverted would bug out the - character's physics. - type: Fix - id: 6079 - time: '2024-03-03T06:45:26.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25700 -- author: deltanedas + id: 6122 + time: '2024-03-11T03:33:08.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25986 +- author: pigeonpeas changes: - - message: No more raiding the jani vend for galoshes, which are back to normal - speed. - type: Remove - id: 6080 - time: '2024-03-03T07:07:58.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25795 -- author: metalgearsloth + - message: added new expedition ambience + type: Add + id: 6123 + time: '2024-03-11T06:56:01.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25983 +- author: Ilya246 changes: - - message: 'Reworked shuttle consoles, including: manual FTL jumps, new map screen, - fixed performance issues, new docking screen.' + - message: The biomass reclaimer may now reclaim plants, and inserting smaller entities + into it is now faster. type: Tweak - id: 6081 - time: '2024-03-03T07:39:19.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/24430 -- author: Errant-4 + id: 6124 + time: '2024-03-11T21:59:21.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/23731 +- author: SlamBamActionman changes: - - message: Toggling your own internals no longer requires a delay. + - message: Moths eating lizard plushies will now start to Weh! type: Tweak - id: 6082 - time: '2024-03-03T08:31:47.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25781 -- author: SlamBamActionman + id: 6125 + time: '2024-03-11T23:05:25.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26003 +- author: Ubaser changes: - - message: Arachnids are no longer perma-pied and can clean it off. - type: Fix - id: 6083 - time: '2024-03-03T08:54:36.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25713 -- author: Dutch-VanDerLinde + - message: Unpressurized areas now deal heat damage along with blunt. + type: Tweak + id: 6126 + time: '2024-03-12T02:38:40.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25770 +- author: nikthechampiongr changes: - - message: Monkeys and kobolds can now wear blood-red hardsuits. + - message: Recyclers now leave logs when they gib people. type: Add - id: 6084 - time: '2024-03-04T03:56:17.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/22273 -- author: Plykiya + - message: People sending a broadcast in the communications console now leave logs. + type: Add + id: 6127 + time: '2024-03-12T10:57:05.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26008 +- author: ShadowCommander changes: - - message: Syringes now prevent injecting on empty and drawing on full. - type: Tweak - - message: You can now tell if you are being drawn from or injected by a syringe. + - message: Fixed arrivals shuttle not docking with the station when it was slowly + spinning. + type: Fix + id: 6128 + time: '2024-03-12T12:57:35.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26033 +- author: liltenhead + changes: + - message: Buffed the zombie virus to do purely poison damage, and more likely to + spread the infection per bite. type: Tweak - id: 6085 - time: '2024-03-04T05:07:11.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25480 -- author: metalgearsloth + id: 6129 + time: '2024-03-12T18:44:09.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25954 +- author: UnicornOnLSD changes: - - message: Fix expedition FTL. - type: Fix - id: 6086 - time: '2024-03-04T06:24:24.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25823 -- author: Nairodian + - message: brought back the classic crew cut as an alternative to the current one + ! + type: Add + id: 6130 + time: '2024-03-12T18:47:29.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25935 +- author: FungiFellow changes: - - message: Welding masks can now be made in the Autolathe. + - message: Added Improvised Shotgun Shell Recipe type: Add - id: 6087 - time: '2024-03-04T22:36:06.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25842 -- author: Lawdog + id: 6131 + time: '2024-03-12T23:52:32.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25545 +- author: NakataRin changes: - - message: Changed the max volume of shot glasses from 7u to 5u to better represent - drinking shots in real life + - message: Skeletons can only spawn with 10 people on the server now. type: Tweak - id: 6088 - time: '2024-03-04T23:51:12.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25847 -- author: deltanedas + id: 6132 + time: '2024-03-13T01:00:15.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26050 +- author: SlamBamActionman changes: - - message: Rehydrated mobs (carp) now keep their forensics data from their cube/plushie - form. + - message: Syndicate implanters can no longer be recycled. type: Tweak - id: 6089 - time: '2024-03-05T03:13:50.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25148 -- author: Brandon-Huu + id: 6133 + time: '2024-03-13T02:02:36.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26047 +- author: Gyrandola changes: - - message: Removed the ability for command or any antag-safe role to be initial - infected in zombie mode - type: Remove - id: 6090 - time: '2024-03-05T04:34:18.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25785 -- author: Whisper + - message: Adding Sky Blue carpets to tables no longer results in red carpet ones. + type: Fix + id: 6134 + time: '2024-03-13T02:03:04.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26049 +- author: Gyrandola changes: - - message: Glass shards can be added to flatcaps to create bladed flatcaps! - type: Add - id: 6091 - time: '2024-03-05T20:57:55.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25780 -- author: MACMAN2003 + - message: Clicking yourself with a knife no longer triggers a butchering popup + type: Fix + id: 6135 + time: '2024-03-13T03:52:20.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26051 +- author: maylokana changes: - - message: Added clockwork structures and brass to build them with. - type: Add - id: 6092 - time: '2024-03-06T00:25:59.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/24673 -- author: deepdarkdepths + - message: Italicized whisper bubbles + type: Tweak + id: 6136 + time: '2024-03-13T08:03:32.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25602 +- author: Slava0135 changes: - - message: Added the paramedic's cap to the uniform printer. + - message: Fixed pie bomb not detonating when eaten or sliced (remember to keep + hungry mice away from it)! + type: Fix + - message: Pie bomb now cannot be ejected or swapped (just hope there is no bomb + inside) + type: Tweak + id: 6137 + time: '2024-03-13T08:36:08.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25928 +- author: Cojoke-dot + changes: + - message: Senior uniforms have been added to the Uniform Printer, visit your local + hop today! type: Add - id: 6093 - time: '2024-03-06T01:17:50.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25861 -- author: lzk228 + id: 6138 + time: '2024-03-13T08:45:33.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25668 +- author: Plykiya changes: - - message: Livestock crate and artifact container now can go under plastic flaps. + - message: Additional syringe doafter delay is now based on syringe contents rather + than transfer amount setting. type: Tweak - id: 6094 - time: '2024-03-06T01:33:20.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25862 -- author: PJB3005 + id: 6139 + time: '2024-03-13T09:35:48.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25890 +- author: SlamBamActionman changes: - - message: Saving paper is on ctrl+enter again. Also there's a visible "save" button - now. + - message: Renamed Uplink categories and moved items to fit new category names. type: Tweak - id: 6095 - time: '2024-03-06T01:35:26.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25870 -- author: ps3moira + id: 6140 + time: '2024-03-13T09:47:17.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25079 +- author: veprolet changes: - - message: Changed brick, wood, and web walls to be unable to conjoin with different - walls. + - message: Injectors like the syringe can now toggle their transfer amount using + alternative interactions. type: Tweak - id: 6096 - time: '2024-03-06T01:36:04.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25674 -- author: Froffy + id: 6141 + time: '2024-03-13T10:00:45.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25566 +- author: Dutch-VanDerLinde + changes: + - message: Zombies can now wideswing, similar to how a space carp would. + type: Tweak + id: 6142 + time: '2024-03-13T10:02:11.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26064 +- author: Krunk changes: - - message: Water can now be scooped from water tiles, such as planetary rivers. + - message: Clown & Jester shoes can now hold plastic knives and cap guns! All clowning, + all the time! type: Add - id: 6097 - time: '2024-03-06T01:37:24.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25825 -- author: Ko4erga + id: 6143 + time: '2024-03-13T10:03:14.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25661 +- author: 778b changes: - - message: '"Post light" updated.' - type: Tweak - id: 6098 - time: '2024-03-06T01:39:47.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25814 -- author: Ilya246 + - message: Guns which use battery as magazines now display ammo. Like Svalinn pistol. + type: Fix + id: 6144 + time: '2024-03-13T11:13:12.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26009 +- author: icekot8 changes: - - message: Gas leak events are now 4 times as strong, and may leak water vapor. - The fog is coming. + - message: Foxes are now neutral and deal 8 piercing damage type: Tweak - id: 6099 - time: '2024-03-06T01:41:04.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25864 -- author: Just_Art + id: 6145 + time: '2024-03-13T15:02:49.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25992 +- author: Mangohydra changes: - - message: Added bob 5 hair! - type: Add - - message: Added long hair with bundles! + - message: The lawyer now spawns with their own lawyer stamp for stamping very important + documents. type: Add - id: 6100 - time: '2024-03-06T01:42:05.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25772 + id: 6146 + time: '2024-03-13T15:05:39.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26012 - author: Errant changes: - - message: Debug coordinates are now automatically enabled on the F3 overlay upon - readmin. + - message: Clothes with alternate sprites for vox once again show the alternate + sprites, instead of the defaults. type: Fix - id: 6101 - time: '2024-03-06T01:43:51.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25063 -- author: metalgearsloth + id: 6147 + time: '2024-03-13T15:06:37.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25989 +- author: Gyrandola changes: - - message: Pod launches will now be offset slightly. + - message: Fireaxe and Shotgun cabinets can now be destroyed. type: Add - id: 6102 - time: '2024-03-06T01:44:26.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25855 -- author: Brandon-Huu + id: 6148 + time: '2024-03-13T15:09:06.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25962 +- author: lzk228 changes: - - message: The Syndicate is now supplying barber scissors in the Hristov bundle - to make your disguises even balde- better. + - message: Surgery tools can be placed in medical belt. type: Tweak - id: 6103 - time: '2024-03-06T02:03:08.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25695 -- author: Tayrtahn + - message: Lantern can be placed in utility belt. + type: Tweak + - message: Hand labeler can be placed in utility and botanical belt + type: Tweak + id: 6149 + time: '2024-03-13T18:55:27.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26085 +- author: wafehling changes: - - message: Flasks can once again be put into dispensers. - type: Fix - id: 6104 - time: '2024-03-06T17:19:01.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25883 -- author: Doctor-Cpu + - message: The trading outpost now has dedicated buy-only and sell-only pallets. + No more accidentally selling orders you just bought. Cargonians rejoice! + type: Tweak + id: 6150 + time: '2024-03-13T23:26:25.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25955 +- author: maylokana changes: - - message: Cargo palllets can no longer be ordered from cargo request terminal - type: Remove - id: 6105 - time: '2024-03-07T17:53:57.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25882 -- author: Beck Thompson + - message: Entities can no longer drink from closed containers + type: Fix + id: 6151 + time: '2024-03-14T04:10:14.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26103 +- author: Dutch-VanDerLinde changes: - - message: Lawdrobe has some new items and new ads! + - message: Gunpowder can now be made by chemists with 6 parts potassium, 2 parts + sulfur and charcoal. type: Add - id: 6106 - time: '2024-03-07T19:18:39.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25299 -- author: Blackern5000 - changes: - - message: Salvagers can now pull in overgrown floral anomalies. + - message: Pipebombs may now be crafted with a pipe, gunpowder and LV cable. type: Add - id: 6107 - time: '2024-03-07T19:37:57.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/24650 -- author: Nimfar11 + - message: IEDs have been reworked, they are now called "fire bombs" and generate + a weak explosion that ignites nearby objects. + type: Tweak + id: 6152 + time: '2024-03-14T04:27:08.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25705 +- author: PJB3005 changes: - - message: Slimes can now drink FourteenLoko without harming their bodies. + - message: You must now wait 30 seconds before attempting to reconnect to a full + server. type: Tweak - id: 6108 - time: '2024-03-07T20:50:10.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25889 -- author: NakataRin + id: 6153 + time: '2024-03-14T08:00:47.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/20972 +- author: Crotalus changes: - - message: Evacuation shuttle arrives 10 minutes on green alert now. + - message: Sort agents by success rate in end game summary type: Tweak - id: 6109 - time: '2024-03-07T21:01:53.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25906 -- author: Admiral-Obvious-001 + id: 6154 + time: '2024-03-14T15:52:45.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26058 +- author: nikthechampiongr changes: - - message: Zombies are now tougher to kill. + - message: The radio jammer is now able to jam the signal of suit sensors. type: Tweak - id: 6110 - time: '2024-03-07T21:02:50.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25876 + id: 6155 + time: '2024-03-14T15:55:14.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26046 +- author: deltanedas + changes: + - message: Holocarp and Magicarp plushies can now be found in maintenance. + type: Add + id: 6156 + time: '2024-03-15T02:58:17.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26081 - author: TheShuEd changes: - - message: Removed Hamlet, Smile and Pun Pun from Thief objectives - type: Remove - id: 6111 - time: '2024-03-07T23:53:36.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25921 -- author: MACMAN2003 + - message: Added random colored jumpsuits to the mixed wardrobes. Each costume is + randomly generated from parts painted in random colors, which gives a huge number + of combinations of the appearance of such costumes. + type: Add + id: 6157 + time: '2024-03-15T07:37:12.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25888 +- author: Nopey changes: - - message: Diagonal windows no longer space you when in a pressurized environment. + - message: Dead players can no longer spin on a bar stool. type: Fix - id: 6112 - time: '2024-03-08T07:50:34.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25926 -- author: mryikes + id: 6158 + time: '2024-03-15T10:03:19.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/24308 +- author: Nairodian changes: - - message: New Nuke Detonation Song "Clearly Nuclear". + - message: Added a new red neck gaiter to the AutoDrobe. type: Add - id: 6113 - time: '2024-03-09T01:44:54.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25765 -- author: Plykiya + id: 6159 + time: '2024-03-15T10:11:40.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25891 +- author: Tayrtahn changes: - - message: Pre-filled syringes start in inject mode now. + - message: Reflected tranquilizer rounds no longer inject the character who reflected + them. + type: Fix + id: 6160 + time: '2024-03-15T13:57:15.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26141 +- author: lzk228 + changes: + - message: Refill light replacer from box popup now shows properly. + type: Fix + id: 6161 + time: '2024-03-15T15:23:58.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26136 +- author: FairlySadPanda + changes: + - message: Food and drink stocks in vending machines has been reduced to encourage + people to use the kitchen and bar. type: Tweak - id: 6114 - time: '2024-03-09T10:19:03.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25881 -- author: EmoGarbage404 + id: 6162 + time: '2024-03-15T23:28:01.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25999 +- author: Plykiya changes: - - message: Added a new "colorblind friendly" toggle in the accessibility menu. This - allows you to toggle between a standard and colorblind-friendly palette for - things like progress bars and the medical HUD. - type: Add - - message: The medical HUD is now bright, even in low light levels. + - message: Ion storms now have a chance of happening from the start of shift. type: Tweak - id: 6115 - time: '2024-03-09T11:43:20.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25318 -- author: metalgearsloth + id: 6163 + time: '2024-03-16T03:47:14.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26165 +- author: Krunk changes: - - message: Fix NPC mouse movement. + - message: Zombies and animals can be stripped once again. type: Fix - id: 6116 - time: '2024-03-10T15:41:42.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25965 -- author: DoutorWhite + - message: Dead or critical mobs can no longer be stripped instantly. + type: Fix + id: 6164 + time: '2024-03-16T03:50:53.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26166 +- author: metalgearsloth changes: - - message: Prevents rendering from crashing in certain scenarios + - message: Fix store refunds. type: Fix - id: 6117 - time: '2024-03-10T17:07:24.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25960 -- author: nikthechampiongr + id: 6165 + time: '2024-03-16T14:06:17.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26173 +- author: LordCarve changes: - - message: Shields will no longer absorb asphyxiation damage, or any other damage - they themselves can't take. + - message: Decayed anomalies no longer show as having gone supercritical in logs. type: Fix - id: 6118 - time: '2024-03-11T01:55:19.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25972 -- author: metalgearsloth + id: 6166 + time: '2024-03-16T17:31:21.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26180 +- author: Velcroboy changes: - - message: Remove the buttons for generated debris from shuttle maps. + - message: Tweaked gas canisters to pass through cargo flaps. type: Tweak - id: 6119 - time: '2024-03-11T02:11:46.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25897 -- author: Errant + id: 6167 + time: '2024-03-17T00:55:32.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26193 +- author: metalgearsloth changes: - - message: Species info is now available in the Guidebook and in the character editor. - type: Add - id: 6120 - time: '2024-03-11T03:01:32.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25844 -- author: Dygon + - message: Fix ID cards sometimes not loading properly. + type: Fix + id: 6168 + time: '2024-03-17T01:10:59.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26195 +- author: 21Melkuu changes: - - message: 'The following criminal record statuses have been added: Suspect, Discharged, - Paroled.' + - message: Add new explosion-proof backpack in aplink. type: Add - - message: Security huds now show an icon on entities that have a visible name linked - to a criminal record. + id: 6169 + time: '2024-03-17T02:21:13.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26187 +- author: Ilya246 + changes: + - message: Syndicate decoy bombs may now be purchased from the uplink. type: Add - id: 6121 - time: '2024-03-11T03:12:52.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25192 -- author: Lank + - message: Syndicate bomb description no longer lies about their minimum detonation + time. + type: Fix + id: 6170 + time: '2024-03-17T02:31:41.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26034 +- author: wafehling changes: - - message: The detective is no longer independent, and again works under Security. - type: Tweak - id: 6122 - time: '2024-03-11T03:33:08.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25986 -- author: pigeonpeas + - message: Added 18 new bounties to cargo bounty system. + type: Add + id: 6171 + time: '2024-03-17T17:06:17.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26160 +- author: Ko4erga changes: - - message: added new expedition ambience + - message: Added craftable high and small wooden fences, bench. New stairs. type: Add - id: 6123 - time: '2024-03-11T06:56:01.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25983 -- author: Ilya246 + id: 6172 + time: '2024-03-17T21:18:59.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26182 +- author: potato1234_x changes: - - message: The biomass reclaimer may now reclaim plants, and inserting smaller entities - into it is now faster. + - message: Changed the puddle sprites so the smoothing is less jagged type: Tweak - id: 6124 - time: '2024-03-11T21:59:21.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/23731 -- author: SlamBamActionman + id: 6173 + time: '2024-03-17T23:15:45.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26171 +- author: FungiFellow changes: - - message: Moths eating lizard plushies will now start to Weh! + - message: Changed Monkey Reinf Price to 6TC type: Tweak - id: 6125 - time: '2024-03-11T23:05:25.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26003 -- author: Ubaser + id: 6174 + time: '2024-03-18T01:25:58.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26214 +- author: Golinth changes: - - message: Unpressurized areas now deal heat damage along with blunt. + - message: Criminal record icons now show up below job icons type: Tweak - id: 6126 - time: '2024-03-12T02:38:40.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25770 -- author: nikthechampiongr + id: 6175 + time: '2024-03-18T01:37:00.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26203 +- author: PJB3005 changes: - - message: Recyclers now leave logs when they gib people. - type: Add - - message: People sending a broadcast in the communications console now leave logs. - type: Add - id: 6127 - time: '2024-03-12T10:57:05.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26008 -- author: ShadowCommander + - message: Fixed pressure damage calculations to what they were always supposed + to be. This means pressure damage now starts happening at more extreme values + (20 kPa for low pressure damage instead of 50 kPa) and high pressure damage + is scaled different. It also fixed the HUD alerts so that the "warning" alerts + show up before you actually start taking damage. + type: Fix + - message: Air alarms now start complaining about low pressure much earlier, when + the pressure drops so much that you can't breathe oxygen tank. + type: Tweak + id: 6176 + time: '2024-03-18T05:16:31.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26217 +- author: HappyRoach changes: - - message: Fixed arrivals shuttle not docking with the station when it was slowly - spinning. + - message: The correct magazines now appear in the WT550 safe. type: Fix - id: 6128 - time: '2024-03-12T12:57:35.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26033 -- author: liltenhead + id: 6177 + time: '2024-03-18T06:10:28.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26208 +- author: vanx changes: - - message: Buffed the zombie virus to do purely poison damage, and more likely to - spread the infection per bite. + - message: You can now wear most guns in the suit slot, and see them on yourself! type: Tweak - id: 6129 - time: '2024-03-12T18:44:09.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25954 -- author: UnicornOnLSD + id: 6178 + time: '2024-03-18T06:16:09.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26152 +- author: Dutch-VanDerLinde changes: - - message: brought back the classic crew cut as an alternative to the current one - ! - type: Add - id: 6130 - time: '2024-03-12T18:47:29.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25935 -- author: FungiFellow + - message: Romerol now properly works on the dead. + type: Tweak + id: 6179 + time: '2024-03-18T06:25:36.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26222 +- author: ElectroJr changes: - - message: Added Improvised Shotgun Shell Recipe + - message: Added an option to try and ignore some errors if a replay fails to load, type: Add - id: 6131 - time: '2024-03-12T23:52:32.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25545 -- author: NakataRin + id: 6180 + time: '2024-03-18T07:31:37.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26212 +- author: Tayrtahn changes: - - message: Skeletons can only spawn with 10 people on the server now. + - message: Cyborg recharging stations are able to charge cyborgs again. + type: Fix + id: 6181 + time: '2024-03-18T13:37:49.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26230 +- author: DoutorWhite + changes: + - message: Introduce new health status icons. + type: Add + - message: Enhance the Medical HUD to display the health status of players and mobs + using the newly added icons. type: Tweak - id: 6132 - time: '2024-03-13T01:00:15.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26050 -- author: SlamBamActionman + id: 6182 + time: '2024-03-18T13:56:12.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26027 +- author: Plykiya changes: - - message: Syndicate implanters can no longer be recycled. + - message: Lone operatives now start with 60TC instead of 40TC. type: Tweak - id: 6133 - time: '2024-03-13T02:02:36.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26047 -- author: Gyrandola + id: 6183 + time: '2024-03-18T14:15:53.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26130 +- author: PJB3005 changes: - - message: Adding Sky Blue carpets to tables no longer results in red carpet ones. + - message: Fixed hardsuits in space causing high pressure damage type: Fix - id: 6134 - time: '2024-03-13T02:03:04.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26049 -- author: Gyrandola + id: 6184 + time: '2024-03-18T16:46:31.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26236 +- author: potato1234x changes: - - message: Clicking yourself with a knife no longer triggers a butchering popup + - message: Added crafting recipes for wall lockers and secure lockers + type: Add + - message: Fixed secure lockers and wall lockers not being deconstructible type: Fix - id: 6135 - time: '2024-03-13T03:52:20.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26051 -- author: maylokana - changes: - - message: Italicized whisper bubbles - type: Tweak - id: 6136 - time: '2024-03-13T08:03:32.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25602 -- author: Slava0135 + id: 6185 + time: '2024-03-18T20:53:13.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/24942 +- author: brainfood1183 changes: - - message: Fixed pie bomb not detonating when eaten or sliced (remember to keep - hungry mice away from it)! - type: Fix - - message: Pie bomb now cannot be ejected or swapped (just hope there is no bomb - inside) - type: Tweak - id: 6137 - time: '2024-03-13T08:36:08.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25928 -- author: Cojoke-dot + - message: Added Spray Paints. + type: Add + id: 6186 + time: '2024-03-18T21:29:48.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/23003 +- author: PJB3005 changes: - - message: Senior uniforms have been added to the Uniform Printer, visit your local - hop today! + - message: Bans are now shown in the "adminremarks" command. type: Add - id: 6138 - time: '2024-03-13T08:45:33.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25668 -- author: Plykiya + id: 6187 + time: '2024-03-18T21:31:34.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26240 +- author: Terraspark4941 changes: - - message: Additional syringe doafter delay is now based on syringe contents rather - than transfer amount setting. + - message: The TEG page in the guidebook has been updated with proper information! type: Tweak - id: 6139 - time: '2024-03-13T09:35:48.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25890 -- author: SlamBamActionman + id: 6188 + time: '2024-03-18T21:33:07.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26170 +- author: Plykiya changes: - - message: Renamed Uplink categories and moved items to fit new category names. - type: Tweak - id: 6140 - time: '2024-03-13T09:47:17.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25079 -- author: veprolet + - message: You can now craft ducky slippers. + type: Add + id: 6189 + time: '2024-03-18T21:34:35.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26138 +- author: Boaz1111 changes: - - message: Injectors like the syringe can now toggle their transfer amount using - alternative interactions. + - message: Lone operatives now require a minimum of 20 players to spawn type: Tweak - id: 6141 - time: '2024-03-13T10:00:45.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25566 -- author: Dutch-VanDerLinde + id: 6190 + time: '2024-03-18T21:36:24.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26244 +- author: shampunj changes: - - message: Zombies can now wideswing, similar to how a space carp would. + - message: Zombies now passively heal 1 heat/shock damage every 50 seconds type: Tweak - id: 6142 - time: '2024-03-13T10:02:11.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26064 -- author: Krunk + id: 6191 + time: '2024-03-18T21:47:39.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25925 +- author: Killerqu00 changes: - - message: Clown & Jester shoes can now hold plastic knives and cap guns! All clowning, - all the time! + - message: Initial Infected now can see each other. type: Add - id: 6143 - time: '2024-03-13T10:03:14.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25661 -- author: 778b + - message: Initial Infected can now see zombified entities. + type: Add + id: 6192 + time: '2024-03-18T21:57:36.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25934 +- author: nikthechampiongr changes: - - message: Guns which use battery as magazines now display ammo. Like Svalinn pistol. + - message: You can now use the SCRAM! implant while cuffed. type: Fix - id: 6144 - time: '2024-03-13T11:13:12.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26009 -- author: icekot8 + - message: The freedom implant can no longer be used while in crit, or dead. + type: Fix + id: 6193 + time: '2024-03-18T22:35:46.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25978 +- author: SlamBamActionman changes: - - message: Foxes are now neutral and deal 8 piercing damage - type: Tweak - id: 6145 - time: '2024-03-13T15:02:49.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25992 -- author: Mangohydra + - message: Recyclers no longer delete items stored inside of recycled entities. + type: Fix + id: 6194 + time: '2024-03-19T02:36:22.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26045 +- author: Vermidia changes: - - message: The lawyer now spawns with their own lawyer stamp for stamping very important - documents. - type: Add - id: 6146 - time: '2024-03-13T15:05:39.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26012 -- author: Errant + - message: Made the Artifact Reports page up to date with current Xenoarchaeology + type: Tweak + id: 6195 + time: '2024-03-19T03:22:21.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26252 +- author: keronshb changes: - - message: Clothes with alternate sprites for vox once again show the alternate - sprites, instead of the defaults. + - message: Fixed a bug where stores were enabling refunds after a purchase type: Fix - id: 6147 - time: '2024-03-13T15:06:37.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25989 -- author: Gyrandola - changes: - - message: Fireaxe and Shotgun cabinets can now be destroyed. - type: Add - id: 6148 - time: '2024-03-13T15:09:06.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25962 -- author: lzk228 + id: 6196 + time: '2024-03-19T03:48:52.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26251 +- author: Errant changes: - - message: Surgery tools can be placed in medical belt. + - message: Thrown objects can no longer slip while they are still in flight. type: Tweak - - message: Lantern can be placed in utility belt. + id: 6197 + time: '2024-03-20T11:57:39.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/24494 +- author: Killerqu00 + changes: + - message: Airlock wires are now different between departments. type: Tweak - - message: Hand labeler can be placed in utility and botanical belt + id: 6198 + time: '2024-03-20T16:07:38.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26247 +- author: Tayrtahn + changes: + - message: Pizza is no longer considered a fruit. type: Tweak - id: 6149 - time: '2024-03-13T18:55:27.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26085 -- author: wafehling + id: 6199 + time: '2024-03-20T19:03:53.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26293 +- author: jamessimo changes: - - message: The trading outpost now has dedicated buy-only and sell-only pallets. - No more accidentally selling orders you just bought. Cargonians rejoice! + - message: Ratkings and Rat servants eyes now glow in the dark type: Tweak - id: 6150 - time: '2024-03-13T23:26:25.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25955 -- author: maylokana + id: 6200 + time: '2024-03-21T13:16:18.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26300 +- author: nikthechampiongr changes: - - message: Entities can no longer drink from closed containers + - message: Scram! implant no longer allows for someone to keep pulling you when + it teleports you. type: Fix - id: 6151 - time: '2024-03-14T04:10:14.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26103 -- author: Dutch-VanDerLinde + id: 6201 + time: '2024-03-21T17:42:33.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26309 +- author: Plykiya changes: - - message: Gunpowder can now be made by chemists with 6 parts potassium, 2 parts - sulfur and charcoal. - type: Add - - message: Pipebombs may now be crafted with a pipe, gunpowder and LV cable. + - message: Door remote UI now shows the mode it is in. type: Add - - message: IEDs have been reworked, they are now called "fire bombs" and generate - a weak explosion that ignites nearby objects. - type: Tweak - id: 6152 - time: '2024-03-14T04:27:08.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25705 -- author: PJB3005 + id: 6202 + time: '2024-03-22T00:19:52.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26162 +- author: metalgearsloth changes: - - message: You must now wait 30 seconds before attempting to reconnect to a full - server. + - message: Fix some shuttle console stuff surrounding the Map screen. + type: Fix + id: 6203 + time: '2024-03-22T01:57:49.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26305 +- author: nikthechampiongr + changes: + - message: You can now move again if you stop being pulled while in cuffs. + type: Fix + id: 6204 + time: '2024-03-22T01:59:18.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26312 +- author: lzk228 + changes: + - message: Snoring is now a trait in character preference menu. type: Tweak - id: 6153 - time: '2024-03-14T08:00:47.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/20972 -- author: Crotalus + id: 6205 + time: '2024-03-22T07:00:57.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26322 +- author: liltenhead changes: - - message: Sort agents by success rate in end game summary + - message: reduced the odds of budget insulated gloves being insulated and increased + the damage multipliers on bad gloves. type: Tweak - id: 6154 - time: '2024-03-14T15:52:45.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26058 -- author: nikthechampiongr + id: 6206 + time: '2024-03-22T08:20:46.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26318 +- author: BlitzTheSquishy changes: - - message: The radio jammer is now able to jam the signal of suit sensors. + - message: Irish Coffee recipe adjusted to be more logical type: Tweak - id: 6155 - time: '2024-03-14T15:55:14.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26046 -- author: deltanedas + id: 6207 + time: '2024-03-22T08:23:22.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26327 +- author: SlamBamActionman changes: - - message: Holocarp and Magicarp plushies can now be found in maintenance. - type: Add - id: 6156 - time: '2024-03-15T02:58:17.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26081 -- author: TheShuEd + - message: Space glue/lube tubes can now be used through the right-click menu. + type: Tweak + id: 6208 + time: '2024-03-22T09:37:47.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26002 +- author: RenQ changes: - - message: Added random colored jumpsuits to the mixed wardrobes. Each costume is - randomly generated from parts painted in random colors, which gives a huge number - of combinations of the appearance of such costumes. - type: Add - id: 6157 - time: '2024-03-15T07:37:12.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25888 -- author: Nopey + - message: brought back the classic long bedhead as an alternative to the current + one. + type: Add + id: 6209 + time: '2024-03-22T17:35:40.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26336 +- author: metalgearsloth changes: - - message: Dead players can no longer spin on a bar stool. + - message: Fix NPCs getting stuck on railings. type: Fix - id: 6158 - time: '2024-03-15T10:03:19.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/24308 -- author: Nairodian + id: 6210 + time: '2024-03-23T01:42:51.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26351 +- author: Ubaser changes: - - message: Added a new red neck gaiter to the AutoDrobe. + - message: You can now purchase a set of 4 throwing knives in the uplink as a bundle + for 12 TC. type: Add - id: 6159 - time: '2024-03-15T10:11:40.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25891 -- author: Tayrtahn + id: 6211 + time: '2024-03-23T04:13:06.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26026 +- author: ElectroJr changes: - - message: Reflected tranquilizer rounds no longer inject the character who reflected - them. + - message: Fixed a bug where partially airtight entities (e.g., thin windows or + doors) could let air leak out into space. type: Fix - id: 6160 - time: '2024-03-15T13:57:15.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26141 -- author: lzk228 + id: 6212 + time: '2024-03-23T16:34:56.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/22521 +- author: Killerqu00 changes: - - message: Refill light replacer from box popup now shows properly. + - message: Cable Coils are now small in size, taking only 1x2 space in containers. + type: Tweak + id: 6213 + time: '2024-03-23T17:30:14.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26361 +- author: Tayrtahn + changes: + - message: Clumsy characters can no longer avoid bonking their heads by using the + Climb verb. type: Fix - id: 6161 - time: '2024-03-15T15:23:58.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26136 -- author: FairlySadPanda + - message: Clumsy characters are less likely to bonk their heads when trying to + climb. + type: Tweak + id: 6214 + time: '2024-03-23T19:29:43.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/24977 +- author: nikthechampiongr changes: - - message: Food and drink stocks in vending machines has been reduced to encourage - people to use the kitchen and bar. + - message: Door remotes can now only control doors specific to their type and do + not use the access of their user. type: Tweak - id: 6162 - time: '2024-03-15T23:28:01.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25999 -- author: Plykiya + id: 6215 + time: '2024-03-24T00:48:16.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26371 +- author: DrSmugleaf changes: - - message: Ion storms now have a chance of happening from the start of shift. + - message: Empty marking categories are now hidden in the markings picker. type: Tweak - id: 6163 - time: '2024-03-16T03:47:14.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26165 -- author: Krunk + id: 6216 + time: '2024-03-24T04:01:51.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26377 +- author: Baptr0b0t changes: - - message: Zombies and animals can be stripped once again. - type: Fix - - message: Dead or critical mobs can no longer be stripped instantly. + - message: Fix access of command door remote. The captain must control his station. type: Fix - id: 6164 - time: '2024-03-16T03:50:53.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26166 -- author: metalgearsloth + id: 6217 + time: '2024-03-24T05:19:14.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26378 +- author: ElectroJr changes: - - message: Fix store refunds. + - message: Fixed the cargo & emergency shuttle not being airtight. type: Fix - id: 6165 - time: '2024-03-16T14:06:17.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26173 -- author: LordCarve + id: 6218 + time: '2024-03-24T16:17:56.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26382 +- author: DoutorWhite changes: - - message: Decayed anomalies no longer show as having gone supercritical in logs. + - message: The icon representing the critical status has been changed + type: Tweak + - message: Medical Hud death icon animation fixed type: Fix - id: 6166 - time: '2024-03-16T17:31:21.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26180 -- author: Velcroboy + id: 6219 + time: '2024-03-24T16:38:03.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26391 +- author: ChaseFlorom changes: - - message: Tweaked gas canisters to pass through cargo flaps. + - message: removed cannabis thief objective. + type: Remove + id: 6220 + time: '2024-03-24T22:02:56.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26412 +- author: SoulFN + changes: + - message: The borg tool module now has an industrial welding tool. type: Tweak - id: 6167 - time: '2024-03-17T00:55:32.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26193 -- author: metalgearsloth + id: 6221 + time: '2024-03-24T22:35:55.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26332 +- author: IProduceWidgets changes: - - message: Fix ID cards sometimes not loading properly. + - message: Ammo techfab now accepts ingot and cloth material types. type: Fix - id: 6168 - time: '2024-03-17T01:10:59.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26195 -- author: 21Melkuu + id: 6222 + time: '2024-03-25T00:43:04.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26413 +- author: Luminight changes: - - message: Add new explosion-proof backpack in aplink. - type: Add - id: 6169 - time: '2024-03-17T02:21:13.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26187 -- author: Ilya246 + - message: Wooden fence gate sprites are no longer swapped. + type: Fix + id: 6223 + time: '2024-03-25T00:55:02.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26409 +- author: Callmore changes: - - message: Syndicate decoy bombs may now be purchased from the uplink. - type: Add - - message: Syndicate bomb description no longer lies about their minimum detonation - time. + - message: Holoprojectors no longer come with a cell when made at a lathe. + type: Tweak + id: 6224 + time: '2024-03-25T00:55:48.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26405 +- author: IProduceWidgets + changes: + - message: The captain can now return his laser to the glass display box. type: Fix - id: 6170 - time: '2024-03-17T02:31:41.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26034 -- author: wafehling + id: 6225 + time: '2024-03-25T00:58:33.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26398 +- author: IProduceWidgets changes: - - message: Added 18 new bounties to cargo bounty system. + - message: More varieties of astro-grass are now available. type: Add - id: 6171 - time: '2024-03-17T17:06:17.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26160 -- author: Ko4erga + - message: Astro-grass must now be cut instead of pried. + type: Tweak + id: 6226 + time: '2024-03-25T01:14:04.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26381 +- author: Tayrtahn changes: - - message: Added craftable high and small wooden fences, bench. New stairs. + - message: Parrots now sound more like parrots when they talk. RAWWK! type: Add - id: 6172 - time: '2024-03-17T21:18:59.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26182 -- author: potato1234_x + id: 6227 + time: '2024-03-25T01:26:41.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26340 +- author: DenisShvalov changes: - - message: Changed the puddle sprites so the smoothing is less jagged + - message: Added Cleaner Grenades that will help janitors in their work + type: Add + id: 6228 + time: '2024-03-25T06:46:21.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25444 +- author: Weax + changes: + - message: Harmonicas can now be equipped (and played) in the neck slot. type: Tweak - id: 6173 - time: '2024-03-17T23:15:45.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26171 -- author: FungiFellow + id: 6229 + time: '2024-03-25T07:05:01.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26261 +- author: nikthechampiongr changes: - - message: Changed Monkey Reinf Price to 6TC + - message: Mailing units no longer spontaneously turn into disposal units when flushed. + type: Fix + id: 6230 + time: '2024-03-25T13:20:39.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26383 +- author: Simyon + changes: + - message: All implants are now unable to be implanted more than once. type: Tweak - id: 6174 - time: '2024-03-18T01:25:58.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26214 -- author: Golinth + id: 6231 + time: '2024-03-26T00:16:19.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26250 +- author: EmoGarbage404 changes: - - message: Criminal record icons now show up below job icons + - message: Ninjas no longer wipe all technologies when using their gloves on a research + server. type: Tweak - id: 6175 - time: '2024-03-18T01:37:00.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26203 -- author: PJB3005 + id: 6232 + time: '2024-03-26T00:52:27.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26421 +- author: Dutch-VanDerLinde + changes: + - message: The chest rig is now available for purchase in the syndicate uplink. + type: Add + id: 6233 + time: '2024-03-26T04:05:35.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26427 +- author: ElectroJr + changes: + - message: Fixed an atmos bug, which was (probably) causing atmospherics on the + station to behave incorrectly. + type: Fix + id: 6234 + time: '2024-03-26T04:44:56.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26441 +- author: nikthechampiongr changes: - - message: Fixed pressure damage calculations to what they were always supposed - to be. This means pressure damage now starts happening at more extreme values - (20 kPa for low pressure damage instead of 50 kPa) and high pressure damage - is scaled different. It also fixed the HUD alerts so that the "warning" alerts - show up before you actually start taking damage. + - message: Handcuffs will no longer try to uncuff themselves when they stop being + dragged. type: Fix - - message: Air alarms now start complaining about low pressure much earlier, when - the pressure drops so much that you can't breathe oxygen tank. + id: 6235 + time: '2024-03-26T19:15:08.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26434 +- author: Nairodian + changes: + - message: Added disablers to every security officer locker. + type: Add + - message: Any way to obtain rubber bullets has been removed. + type: Remove + id: 6236 + time: '2024-03-27T15:11:13.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26470 +- author: Ghagliiarghii + changes: + - message: Removed Donk Pocket Bounty from Cargo + type: Remove + - message: Removed Box of Hugs Bounty from Cargo + type: Remove + id: 6237 + time: '2024-03-27T21:50:35.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26481 +- author: Vermidia + changes: + - message: Artifact node IDs are now only 3-digits long type: Tweak - id: 6176 - time: '2024-03-18T05:16:31.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26217 -- author: HappyRoach + id: 6238 + time: '2024-03-27T23:26:26.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26482 +- author: Jake Huxell changes: - - message: The correct magazines now appear in the WT550 safe. + - message: Fixed late join menu scrolling to the top whenever a new player joins + the round. type: Fix - id: 6177 - time: '2024-03-18T06:10:28.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26208 -- author: vanx + id: 6239 + time: '2024-03-28T01:43:55.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26483 +- author: blueDev2 changes: - - message: You can now wear most guns in the suit slot, and see them on yourself! + - message: Generalized bounties to allow selling them off-station type: Tweak - id: 6178 - time: '2024-03-18T06:16:09.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26152 -- author: Dutch-VanDerLinde + id: 6240 + time: '2024-03-28T04:06:00.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26469 +- author: Simyon changes: - - message: Romerol now properly works on the dead. + - message: The space dragon can now open doors by bumping into them! type: Tweak - id: 6179 - time: '2024-03-18T06:25:36.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26222 -- author: ElectroJr + id: 6241 + time: '2024-03-28T05:41:57.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26490 +- author: EmoGarbage404 changes: - - message: Added an option to try and ignore some errors if a replay fails to load, - type: Add - id: 6180 - time: '2024-03-18T07:31:37.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26212 + - message: Various announcements now announce location on the map (near Medical, + etc.) instead of simply displaying coordinates. + type: Tweak + id: 6242 + time: '2024-03-28T05:53:18.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26437 - author: Tayrtahn changes: - - message: Cyborg recharging stations are able to charge cyborgs again. - type: Fix - id: 6181 - time: '2024-03-18T13:37:49.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26230 -- author: DoutorWhite + - message: Arcade machines now advertise and make noise to bring in players. + type: Add + - message: Space Villain arcade machines have a new screen animation. + type: Tweak + id: 6243 + time: '2024-03-28T06:28:45.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/24200 +- author: EmoGarbage404 changes: - - message: Introduce new health status icons. + - message: The revenant essence alert now displays the exact amount of essence. type: Add - - message: Enhance the Medical HUD to display the health status of players and mobs - using the newly added icons. + id: 6244 + time: '2024-03-28T06:32:56.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25452 +- author: deltanedas + changes: + - message: Voicemasks can now mimic speech verbs, like flutters or growls. type: Tweak - id: 6182 - time: '2024-03-18T13:56:12.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26027 -- author: Plykiya + id: 6245 + time: '2024-03-28T06:36:43.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25768 +- author: EmoGarbage404 changes: - - message: Lone operatives now start with 60TC instead of 40TC. + - message: Electrocution damage is no longer based on the power supplied and is + instead based on the wire voltage (LV, MV, or HV). type: Tweak - id: 6183 - time: '2024-03-18T14:15:53.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26130 -- author: PJB3005 + id: 6246 + time: '2024-03-28T20:44:44.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26455 +- author: Jake Huxell changes: - - message: Fixed hardsuits in space causing high pressure damage + - message: Late join menu correctly respects client role restrictions. type: Fix - id: 6184 - time: '2024-03-18T16:46:31.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26236 -- author: potato1234x + id: 6247 + time: '2024-03-29T02:30:23.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26498 +- author: Jake Huxell changes: - - message: Added crafting recipes for wall lockers and secure lockers - type: Add - - message: Fixed secure lockers and wall lockers not being deconstructible + - message: Reduced game build warning count. type: Fix - id: 6185 - time: '2024-03-18T20:53:13.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/24942 -- author: brainfood1183 - changes: - - message: Added Spray Paints. - type: Add - id: 6186 - time: '2024-03-18T21:29:48.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/23003 -- author: PJB3005 + id: 6248 + time: '2024-03-29T05:28:16.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26518 +- author: wafehling changes: - - message: Bans are now shown in the "adminremarks" command. + - message: Added a chemistry recipe to make crystal shards. type: Add - id: 6187 - time: '2024-03-18T21:31:34.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26240 -- author: Terraspark4941 - changes: - - message: The TEG page in the guidebook has been updated with proper information! - type: Tweak - id: 6188 - time: '2024-03-18T21:33:07.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26170 -- author: Plykiya + id: 6249 + time: '2024-03-29T06:13:52.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26269 +- author: Crotalus changes: - - message: You can now craft ducky slippers. + - message: Reagent grinder auto-modes type: Add - id: 6189 - time: '2024-03-18T21:34:35.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26138 -- author: Boaz1111 + id: 6250 + time: '2024-03-29T06:30:51.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26290 +- author: deltanedas changes: - - message: Lone operatives now require a minimum of 20 players to spawn + - message: Multiple bombs exploding at once on a tile now combine to have a larger + explosion rather than stacking the same small explosion. type: Tweak - id: 6190 - time: '2024-03-18T21:36:24.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26244 -- author: shampunj + id: 6251 + time: '2024-03-29T23:46:06.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25664 +- author: Mephisto72 changes: - - message: Zombies now passively heal 1 heat/shock damage every 50 seconds + - message: Ion Storms are now more likely to alter a Borg's laws. type: Tweak - id: 6191 - time: '2024-03-18T21:47:39.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25925 -- author: Killerqu00 - changes: - - message: Initial Infected now can see each other. - type: Add - - message: Initial Infected can now see zombified entities. - type: Add - id: 6192 - time: '2024-03-18T21:57:36.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25934 -- author: nikthechampiongr + id: 6252 + time: '2024-03-30T00:01:39.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26539 +- author: arimah changes: - - message: You can now use the SCRAM! implant while cuffed. - type: Fix - - message: The freedom implant can no longer be used while in crit, or dead. + - message: Holoparasites, holoclowns and other guardians correctly transfer damage + to their hosts again. type: Fix - id: 6193 - time: '2024-03-18T22:35:46.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25978 -- author: SlamBamActionman + id: 6253 + time: '2024-03-30T01:25:43.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26541 +- author: Boaz1111 changes: - - message: Recyclers no longer delete items stored inside of recycled entities. - type: Fix - id: 6194 - time: '2024-03-19T02:36:22.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26045 -- author: Vermidia + - message: Added an industrial reagent grinder to the basic hydroponics research. + It grinds things into reagents like a recycler. + type: Add + id: 6254 + time: '2024-03-30T02:46:20.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25020 +- author: SonicHDC changes: - - message: Made the Artifact Reports page up to date with current Xenoarchaeology - type: Tweak - id: 6195 - time: '2024-03-19T03:22:21.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26252 -- author: keronshb + - message: Added unzipping for lab coats! + type: Add + id: 6255 + time: '2024-03-30T03:31:32.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26494 +- author: Zealith-Gamer changes: - - message: Fixed a bug where stores were enabling refunds after a purchase + - message: Items being pulled no longer spin when being thrown. type: Fix - id: 6196 - time: '2024-03-19T03:48:52.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26251 -- author: Errant + id: 6256 + time: '2024-03-30T03:35:43.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26504 +- author: Plykiya changes: - - message: Thrown objects can no longer slip while they are still in flight. + - message: Hyposprays can now be toggled to draw from solution containers like jugs + and beakers. type: Tweak - id: 6197 - time: '2024-03-20T11:57:39.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/24494 -- author: Killerqu00 + id: 6257 + time: '2024-03-30T03:59:17.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25544 +- author: EdenTheLiznerd changes: - - message: Airlock wires are now different between departments. + - message: Amanita toxin now kills you slightly slower, providing you time to seek + charcoal before it's too late type: Tweak - id: 6198 - time: '2024-03-20T16:07:38.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26247 -- author: Tayrtahn + id: 6258 + time: '2024-03-30T04:00:21.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25830 +- author: liltenhead changes: - - message: Pizza is no longer considered a fruit. + - message: Changed the syndicate hardbomb to have less of a chance to completely + destroy tiles. type: Tweak - id: 6199 - time: '2024-03-20T19:03:53.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26293 -- author: jamessimo + id: 6259 + time: '2024-03-30T04:36:33.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26548 +- author: takemysoult changes: - - message: Ratkings and Rat servants eyes now glow in the dark + - message: stimulants removes chloral hydrate from body type: Tweak - id: 6200 - time: '2024-03-21T13:16:18.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26300 -- author: nikthechampiongr - changes: - - message: Scram! implant no longer allows for someone to keep pulling you when - it teleports you. - type: Fix - id: 6201 - time: '2024-03-21T17:42:33.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26309 -- author: Plykiya - changes: - - message: Door remote UI now shows the mode it is in. - type: Add - id: 6202 - time: '2024-03-22T00:19:52.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26162 -- author: metalgearsloth - changes: - - message: Fix some shuttle console stuff surrounding the Map screen. - type: Fix - id: 6203 - time: '2024-03-22T01:57:49.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26305 -- author: nikthechampiongr + id: 6260 + time: '2024-03-30T06:52:27.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25886 +- author: Flareguy changes: - - message: You can now move again if you stop being pulled while in cuffs. - type: Fix - id: 6204 - time: '2024-03-22T01:59:18.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26312 + - message: Removed SCAF armor. + type: Remove + id: 6261 + time: '2024-03-31T02:01:28.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26566 - author: lzk228 changes: - - message: Snoring is now a trait in character preference menu. + - message: Syndicate duffelbag storage increased from 8x5 to 9x5. type: Tweak - id: 6205 - time: '2024-03-22T07:00:57.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26322 -- author: liltenhead + id: 6262 + time: '2024-03-31T02:21:31.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26565 +- author: Velcroboy changes: - - message: reduced the odds of budget insulated gloves being insulated and increased - the damage multipliers on bad gloves. + - message: Changed plastic flaps to be completely constructable/deconstructable type: Tweak - id: 6206 - time: '2024-03-22T08:20:46.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26318 -- author: BlitzTheSquishy + id: 6263 + time: '2024-03-31T02:24:39.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26341 +- author: Flareguy changes: - - message: Irish Coffee recipe adjusted to be more logical + - message: Security glasses have been moved from research to roundstart gear. All + officers now start with them instead of sunglasses by default. type: Tweak - id: 6207 - time: '2024-03-22T08:23:22.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26327 -- author: SlamBamActionman + - message: You can now craft security glasses. + type: Add + id: 6264 + time: '2024-03-31T03:00:45.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26487 +- author: brainfood1183 changes: - - message: Space glue/lube tubes can now be used through the right-click menu. + - message: Toilets can now be connected to the disposal system. + type: Add + id: 6265 + time: '2024-03-31T03:21:18.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/22133 +- author: DrMelon + changes: + - message: Syndicate Uplinks now have a searchbar to help those dirty, rotten antagonists + find appropriate equipment more easily! type: Tweak - id: 6208 - time: '2024-03-22T09:37:47.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26002 -- author: RenQ + id: 6266 + time: '2024-03-31T04:09:15.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/24287 +- author: chromiumboy changes: - - message: brought back the classic long bedhead as an alternative to the current - one. + - message: Additional construction options have been added to the Rapid Construction + Device (RCD), along with a radial style UI for fast navigation type: Add - id: 6209 - time: '2024-03-22T17:35:40.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26336 -- author: metalgearsloth - changes: - - message: Fix NPCs getting stuck on railings. - type: Fix - id: 6210 - time: '2024-03-23T01:42:51.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26351 -- author: Ubaser + - message: The number of charges and the length of time required to build a structure + with the RCD now vary depending on the complexity of the constructed fixture + type: Tweak + id: 6267 + time: '2024-03-31T04:29:47.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/22799 +- author: UBlueberry changes: - - message: You can now purchase a set of 4 throwing knives in the uplink as a bundle - for 12 TC. + - message: Nanotransen is now recruitin' personnel that speak with a Southern drawl. type: Add - id: 6211 - time: '2024-03-23T04:13:06.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26026 -- author: ElectroJr + id: 6268 + time: '2024-03-31T04:39:40.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26543 +- author: Tayrtahn changes: - - message: Fixed a bug where partially airtight entities (e.g., thin windows or - doors) could let air leak out into space. + - message: You can no longer drink out of or put liquids into buckets worn on your + head. type: Fix - id: 6212 - time: '2024-03-23T16:34:56.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/22521 -- author: Killerqu00 + id: 6269 + time: '2024-03-31T04:40:22.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/24412 +- author: DrTeaspoon changes: - - message: Cable Coils are now small in size, taking only 1x2 space in containers. + - message: Hypopen no longer shows chemical contents when examined, when not held + by the examinee. + type: Fix + id: 6270 + time: '2024-03-31T04:59:36.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26453 +- author: lzk228 + changes: + - message: Hairflower was removed. + type: Remove + - message: Now you can wear poppy (and other flowers) on your head instead of crafting + hairflower with it. type: Tweak - id: 6213 - time: '2024-03-23T17:30:14.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26361 -- author: Tayrtahn + id: 6271 + time: '2024-03-31T05:33:23.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25475 +- author: EmoGarbage404 changes: - - message: Clumsy characters can no longer avoid bonking their heads by using the - Climb verb. - type: Fix - - message: Clumsy characters are less likely to bonk their heads when trying to - climb. + - message: Borgs, Emitters, and APEs can no longer have their panels opened while + locked. APEs and Emitters additionally cannot be unanchored either. + type: Add + id: 6272 + time: '2024-03-31T06:34:17.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26600 +- author: lzk228 + changes: + - message: Flower crown and wreath were combined. Now you can wear wreath both on + head and on neck. type: Tweak - id: 6214 - time: '2024-03-23T19:29:43.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/24977 -- author: nikthechampiongr + id: 6273 + time: '2024-03-31T08:52:52.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26605 +- author: Ubaser changes: - - message: Door remotes can now only control doors specific to their type and do - not use the access of their user. + - message: Throwing knives now additionally do armour piercing damage. type: Tweak - id: 6215 - time: '2024-03-24T00:48:16.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26371 -- author: DrSmugleaf + id: 6274 + time: '2024-03-31T11:48:36.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26380 +- author: graevy changes: - - message: Empty marking categories are now hidden in the markings picker. + - message: clicking the brig timer button will now cancel its countdown type: Tweak - id: 6216 - time: '2024-03-24T04:01:51.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26377 -- author: Baptr0b0t + id: 6275 + time: '2024-03-31T20:44:02.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26557 +- author: lzk228 changes: - - message: Fix access of command door remote. The captain must control his station. - type: Fix - id: 6217 - time: '2024-03-24T05:19:14.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26378 -- author: ElectroJr + - message: Briefcases was added to CuraDrobe and LawDrobe. + type: Tweak + id: 6276 + time: '2024-03-31T20:52:49.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26527 +- author: RiceMar + changes: + - message: Added milk cartons to the BoozeOMat vendor. Got milk? + type: Add + id: 6277 + time: '2024-04-01T00:07:30.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26635 +- author: nikthechampiongr changes: - - message: Fixed the cargo & emergency shuttle not being airtight. + - message: Radio jammers now actually block suit sensors. type: Fix - id: 6218 - time: '2024-03-24T16:17:56.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26382 -- author: DoutorWhite + id: 6278 + time: '2024-04-01T02:13:52.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26632 +- author: Flareguy changes: - - message: The icon representing the critical status has been changed + - message: All wheeled objects now have lower friction. Portable items, like fuel + canisters & portable scrubbers, should now be easier to carry around. type: Tweak - - message: Medical Hud death icon animation fixed - type: Fix - id: 6219 - time: '2024-03-24T16:38:03.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26391 -- author: ChaseFlorom + - message: High-capacity reagent tanks are now much heavier. + type: Tweak + id: 6279 + time: '2024-04-01T03:23:59.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26601 +- author: Tayrtahn changes: - - message: removed cannabis thief objective. - type: Remove - id: 6220 - time: '2024-03-24T22:02:56.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26412 + - message: spears, darts, and hypodarts can inject targets again. + type: Fix + - message: arrows can no longer inject targets they don't actually hit. + type: Fix + id: 6280 + time: '2024-04-01T03:39:35.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26268 - author: SoulFN changes: - - message: The borg tool module now has an industrial welding tool. + - message: Changed textures of the assault borg modules type: Tweak - id: 6221 - time: '2024-03-24T22:35:55.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26332 -- author: IProduceWidgets + id: 6281 + time: '2024-04-01T04:21:12.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26502 +- author: Keer-Sar changes: - - message: Ammo techfab now accepts ingot and cloth material types. - type: Fix - id: 6222 - time: '2024-03-25T00:43:04.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26413 -- author: Luminight + - message: Cyborgs now have audio for some emotes. + type: Add + id: 6282 + time: '2024-04-01T04:35:21.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26594 +- author: SlamBamActionman changes: - - message: Wooden fence gate sprites are no longer swapped. - type: Fix - id: 6223 - time: '2024-03-25T00:55:02.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26409 -- author: Callmore + - message: Added Coordinates Disks to the Salvage expeditions console, which are + now a requirement for expedition FTL. + type: Add + id: 6283 + time: '2024-04-01T04:50:00.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/23240 +- author: kseandi changes: - - message: Holoprojectors no longer come with a cell when made at a lathe. - type: Tweak - id: 6224 - time: '2024-03-25T00:55:48.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26405 -- author: IProduceWidgets + - message: NT has declassified the documentation for door electronics, now anyone + can configure its access using network configurator or multitool. + type: Add + id: 6284 + time: '2024-04-01T06:06:14.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/17778 +- author: musicmanvr changes: - - message: The captain can now return his laser to the glass display box. - type: Fix - id: 6225 - time: '2024-03-25T00:58:33.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26398 -- author: IProduceWidgets + - message: Added Sol Dry, 8 new cocktails and coconut water. + type: Add + id: 6285 + time: '2024-04-01T06:41:14.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25367 +- author: f0x-n3rd changes: - - message: More varieties of astro-grass are now available. + - message: Added pages for each categories from the chemical page in the guidebook, + no more infinite scrolling when looking up certain chemicals. type: Add - - message: Astro-grass must now be cut instead of pried. - type: Tweak - id: 6226 - time: '2024-03-25T01:14:04.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26381 -- author: Tayrtahn + id: 6286 + time: '2024-04-01T07:20:38.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25831 +- author: TheShuEd changes: - - message: Parrots now sound more like parrots when they talk. RAWWK! + - message: Added new transformation particles types for APE and CHIMP type: Add - id: 6227 - time: '2024-03-25T01:26:41.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26340 -- author: DenisShvalov + - message: Added new anomaly behaviour mechanic. Different behaviors can change + the gameplay of an anomaly. Players can get random behaviors by bombarding the + anomaly with new particles + type: Add + id: 6287 + time: '2024-04-01T08:29:13.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/24683 +- author: Sk1tch changes: - - message: Added Cleaner Grenades that will help janitors in their work + - message: Added chat window opacity slider to options. type: Add - id: 6228 - time: '2024-03-25T06:46:21.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25444 -- author: Weax + id: 6288 + time: '2024-04-01T20:48:02.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/24990 +- author: TheShuEd changes: - - message: Harmonicas can now be equipped (and played) in the neck slot. + - message: added procedurally generating books to library. + type: Add + - message: full books resprite + type: Add + id: 6289 + time: '2024-04-01T21:00:10.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25840 +- author: osjarw + changes: + - message: Ambuzol plus pills now have different sprites from ambuzol pills. Now + CBURN agents and Nukies who bought the syndicate zombie bundle might realize + that they also have some ambuzol plus. type: Tweak - id: 6229 - time: '2024-03-25T07:05:01.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26261 -- author: nikthechampiongr + id: 6290 + time: '2024-04-02T00:50:43.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26651 +- author: osjarw changes: - - message: Mailing units no longer spontaneously turn into disposal units when flushed. + - message: Air injectors finally have working indicator lights while enabled. type: Fix - id: 6230 - time: '2024-03-25T13:20:39.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26383 + id: 6291 + time: '2024-04-02T05:17:26.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26654 - author: Simyon changes: - - message: All implants are now unable to be implanted more than once. + - message: The hands of cyborgs are now explosion proof. Your beakers wont ever + break again! + type: Fix + id: 6292 + time: '2024-04-02T05:18:31.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26515 +- author: lzk228 + changes: + - message: Typing indicator now can be shaded by shadows. type: Tweak - id: 6231 - time: '2024-03-26T00:16:19.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26250 + id: 6293 + time: '2024-04-03T02:12:47.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26678 - author: EmoGarbage404 changes: - - message: Ninjas no longer wipe all technologies when using their gloves on a research - server. + - message: Increased time between pulses for various anomalies. type: Tweak - id: 6232 - time: '2024-03-26T00:52:27.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26421 -- author: Dutch-VanDerLinde + id: 6294 + time: '2024-04-03T03:15:57.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26677 +- author: Plykiya changes: - - message: The chest rig is now available for purchase in the syndicate uplink. - type: Add - id: 6233 - time: '2024-03-26T04:05:35.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26427 -- author: ElectroJr + - message: Dropped items are no longer rotated to world north. + type: Fix + id: 6295 + time: '2024-04-03T05:31:57.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26662 +- author: deltanedas changes: - - message: Fixed an atmos bug, which was (probably) causing atmospherics on the - station to behave incorrectly. + - message: Disabled scooping foam due to a reagent duplication bug. type: Fix - id: 6234 - time: '2024-03-26T04:44:56.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26441 -- author: nikthechampiongr + id: 6296 + time: '2024-04-03T13:41:23.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26686 +- author: Aserovich changes: - - message: Handcuffs will no longer try to uncuff themselves when they stop being - dragged. + - message: New lobby art! + type: Add + id: 6297 + time: '2024-04-04T05:28:30.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26505 +- author: Beck Thompson + changes: + - message: Items thrown at disposals now have to be insertable to display the miss + message. type: Fix - id: 6235 - time: '2024-03-26T19:15:08.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26434 -- author: Nairodian + id: 6298 + time: '2024-04-04T06:25:47.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26716 +- author: Tayrtahn changes: - - message: Added disablers to every security officer locker. + - message: Some devices may have broken wiring at the start of each round. type: Add - - message: Any way to obtain rubber bullets has been removed. - type: Remove - id: 6236 - time: '2024-03-27T15:11:13.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26470 -- author: Ghagliiarghii + id: 6299 + time: '2024-04-04T06:28:09.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26695 +- author: lzk228 changes: - - message: Removed Donk Pocket Bounty from Cargo - type: Remove - - message: Removed Box of Hugs Bounty from Cargo - type: Remove - id: 6237 - time: '2024-03-27T21:50:35.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26481 -- author: Vermidia + - message: Turning off thrusters and gyroscopes now stop consume power. + type: Fix + id: 6300 + time: '2024-04-04T06:28:33.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26690 +- author: Aexxie changes: - - message: Artifact node IDs are now only 3-digits long - type: Tweak - id: 6238 - time: '2024-03-27T23:26:26.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26482 -- author: Jake Huxell + - message: Added the option to disable your OOC Patron name color. + type: Add + id: 6301 + time: '2024-04-04T07:20:06.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26653 +- author: DinoWattz changes: - - message: Fixed late join menu scrolling to the top whenever a new player joins - the round. + - message: Fixed pocket slots being able to hide character snout markings. type: Fix - id: 6239 - time: '2024-03-28T01:43:55.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26483 -- author: blueDev2 + id: 6302 + time: '2024-04-04T08:35:44.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26708 +- author: VasilisThePikachu changes: - - message: Generalized bounties to allow selling them off-station - type: Tweak - id: 6240 - time: '2024-03-28T04:06:00.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26469 -- author: Simyon + - message: Mop buckets and Janitorial Trolleys will not spill their contents as + soon as they are pushed. + type: Fix + - message: Mop buckets are no longer solid. So you can now walk through them. + type: Fix + id: 6303 + time: '2024-04-04T08:39:55.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26706 +- author: ZeroDayDaemon changes: - - message: The space dragon can now open doors by bumping into them! + - message: Lowered the number of ducks in the duck crate and reduced the price of + it. type: Tweak - id: 6241 - time: '2024-03-28T05:41:57.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26490 -- author: EmoGarbage404 + id: 6304 + time: '2024-04-04T19:30:13.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26729 +- author: PrPleGoo changes: - - message: Various announcements now announce location on the map (near Medical, - etc.) instead of simply displaying coordinates. + - message: The medical HUD's brightness now scales with lighting again. type: Tweak - id: 6242 - time: '2024-03-28T05:53:18.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26437 -- author: Tayrtahn + - message: Most HUD icon's brightness now scale with lighting. + type: Tweak + id: 6305 + time: '2024-04-04T23:05:01.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26726 +- author: Daemon changes: - - message: Arcade machines now advertise and make noise to bring in players. - type: Add - - message: Space Villain arcade machines have a new screen animation. + - message: Practice projectiles have been given standardized minimal damage. type: Tweak - id: 6243 - time: '2024-03-28T06:28:45.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/24200 -- author: EmoGarbage404 + - message: The practice laser gun now works with shooting targets. + type: Tweak + id: 6306 + time: '2024-04-05T03:15:02.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26731 +- author: Daemon changes: - - message: The revenant essence alert now displays the exact amount of essence. - type: Add - id: 6244 - time: '2024-03-28T06:32:56.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25452 -- author: deltanedas + - message: Shooting targets can now have their popup type changed with a left click + to show total damage, damage of a single hit, both, or just a notice that it + was hit. + type: Tweak + id: 6307 + time: '2024-04-05T07:19:41.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26734 +- author: Vermidia changes: - - message: Voicemasks can now mimic speech verbs, like flutters or growls. + - message: Baseball bats now require a knife to craft type: Tweak - id: 6245 - time: '2024-03-28T06:36:43.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25768 -- author: EmoGarbage404 + id: 6308 + time: '2024-04-05T15:41:35.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26742 +- author: deltanedas changes: - - message: Electrocution damage is no longer based on the power supplied and is - instead based on the wire voltage (LV, MV, or HV). + - message: Making fultons now requires cloth and they are faster to make. type: Tweak - id: 6246 - time: '2024-03-28T20:44:44.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26455 -- author: Jake Huxell + id: 6309 + time: '2024-04-05T15:42:12.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26747 +- author: superjj18 changes: - - message: Late join menu correctly respects client role restrictions. + - message: Broadcasting works again! type: Fix - id: 6247 - time: '2024-03-29T02:30:23.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26498 -- author: Jake Huxell + id: 6310 + time: '2024-04-05T17:29:22.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26750 +- author: Golinth changes: - - message: Reduced game build warning count. + - message: Fixed mindshield icons being glow in the dark type: Fix - id: 6248 - time: '2024-03-29T05:28:16.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26518 -- author: wafehling + id: 6311 + time: '2024-04-05T20:35:32.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26754 +- author: Blackern5000 changes: - - message: Added a chemistry recipe to make crystal shards. + - message: Added sap type: Add - id: 6249 - time: '2024-03-29T06:13:52.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26269 -- author: Crotalus - changes: - - message: Reagent grinder auto-modes + - message: Added syrup, it can be made by boiling sap. type: Add - id: 6250 - time: '2024-03-29T06:30:51.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26290 -- author: deltanedas - changes: - - message: Multiple bombs exploding at once on a tile now combine to have a larger - explosion rather than stacking the same small explosion. - type: Tweak - id: 6251 - time: '2024-03-29T23:46:06.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25664 -- author: Mephisto72 - changes: - - message: Ion Storms are now more likely to alter a Borg's laws. + - message: Dionae now bleed sap instead of water type: Tweak - id: 6252 - time: '2024-03-30T00:01:39.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26539 -- author: arimah + id: 6312 + time: '2024-04-05T21:06:12.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25748 +- author: osjarw changes: - - message: Holoparasites, holoclowns and other guardians correctly transfer damage - to their hosts again. + - message: Thin firelocks are now constructable/deconstructable type: Fix - id: 6253 - time: '2024-03-30T01:25:43.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26541 -- author: Boaz1111 - changes: - - message: Added an industrial reagent grinder to the basic hydroponics research. - It grinds things into reagents like a recycler. - type: Add - id: 6254 - time: '2024-03-30T02:46:20.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25020 -- author: SonicHDC - changes: - - message: Added unzipping for lab coats! - type: Add - id: 6255 - time: '2024-03-30T03:31:32.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26494 -- author: Zealith-Gamer + id: 6313 + time: '2024-04-06T01:55:31.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26745 +- author: BITTERLYNX changes: - - message: Items being pulled no longer spin when being thrown. + - message: Rodents are more visually pleasing to burn type: Fix - id: 6256 - time: '2024-03-30T03:35:43.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26504 + - message: mothroach and hammy also more visually pleasing to burn + type: Fix + id: 6314 + time: '2024-04-06T04:41:23.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26758 - author: Plykiya changes: - - message: Hyposprays can now be toggled to draw from solution containers like jugs - and beakers. + - message: You can now carefully walk over glass shards and D4. type: Tweak - id: 6257 - time: '2024-03-30T03:59:17.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25544 -- author: EdenTheLiznerd + id: 6315 + time: '2024-04-06T04:49:14.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26763 +- author: PursuitInAshes changes: - - message: Amanita toxin now kills you slightly slower, providing you time to seek - charcoal before it's too late + - message: Sake Bottles can now be found in the booze-o-mat. type: Tweak - id: 6258 - time: '2024-03-30T04:00:21.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25830 -- author: liltenhead + id: 6316 + time: '2024-04-06T20:16:47.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26776 +- author: osjarw changes: - - message: Changed the syndicate hardbomb to have less of a chance to completely - destroy tiles. - type: Tweak - id: 6259 - time: '2024-03-30T04:36:33.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26548 -- author: takemysoult + - message: Removed broken anom behaviour, which causes APE shots to fly through + the anom. + type: Remove + id: 6317 + time: '2024-04-06T22:27:16.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26775 +- author: Vermidia changes: - - message: stimulants removes chloral hydrate from body - type: Tweak - id: 6260 - time: '2024-03-30T06:52:27.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25886 -- author: Flareguy + - message: Water coolers show how full/what they're full of again. + type: Fix + id: 6318 + time: '2024-04-06T23:58:57.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26784 +- author: Crotalus + changes: + - message: Show missing materials in lathe tooltip + type: Add + id: 6319 + time: '2024-04-08T03:16:11.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26795 +- author: chromiumboy changes: - - message: Removed SCAF armor. - type: Remove - id: 6261 - time: '2024-03-31T02:01:28.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26566 + - message: Fixed the RCD not being able to build on top of puddles + type: Fix + - message: RCD constructions can no longer be rotated while in progress + type: Tweak + - message: The RCD now reports construction mode changes to its user + type: Add + id: 6320 + time: '2024-04-08T03:17:29.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26792 - author: lzk228 changes: - - message: Syndicate duffelbag storage increased from 8x5 to 9x5. + - message: Bombsuit and jani bombsuit are similar now. type: Tweak - id: 6262 - time: '2024-03-31T02:21:31.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26565 -- author: Velcroboy + id: 6321 + time: '2024-04-08T15:05:58.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26806 +- author: lzk228 changes: - - message: Changed plastic flaps to be completely constructable/deconstructable + - message: Clothing restock crate was splitted to clothing and autodrobe restock + crates. type: Tweak - id: 6263 - time: '2024-03-31T02:24:39.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26341 -- author: Flareguy + - message: Clothing is cheaper. + type: Tweak + id: 6322 + time: '2024-04-08T15:10:58.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26805 +- author: Hanzdegloker changes: - - message: Security glasses have been moved from research to roundstart gear. All - officers now start with them instead of sunglasses by default. + - message: Spears can now be quipped to your suit slot and cost slightly more to + make. type: Tweak - - message: You can now craft security glasses. + id: 6323 + time: '2024-04-08T15:34:35.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26724 +- author: KittenColony + changes: + - message: Added 13 new gauze wraps for moth that fit their twig bodies type: Add - id: 6264 - time: '2024-03-31T03:00:45.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26487 -- author: brainfood1183 + - message: Gauze markings have been moved to the Overlay category, allowing gauze + to not take up marking points + type: Tweak + id: 6324 + time: '2024-04-09T08:04:51.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25481 +- author: Killerqu00 changes: - - message: Toilets can now be connected to the disposal system. + - message: Quartermasters can now skip a single bounty in the list once every 15 + minutes. type: Add - id: 6265 - time: '2024-03-31T03:21:18.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/22133 -- author: DrMelon + id: 6325 + time: '2024-04-09T22:18:07.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26537 +- author: SkaldetSkaeg changes: - - message: Syndicate Uplinks now have a searchbar to help those dirty, rotten antagonists - find appropriate equipment more easily! + - message: The Flippo lighter is now quieter and has a delay on use. type: Tweak - id: 6266 - time: '2024-03-31T04:09:15.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/24287 -- author: chromiumboy + id: 6326 + time: '2024-04-09T22:20:57.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26846 +- author: notquitehadouken changes: - - message: Additional construction options have been added to the Rapid Construction - Device (RCD), along with a radial style UI for fast navigation + - message: Gave botanists droppers for easier chemical moving. type: Add - - message: The number of charges and the length of time required to build a structure - with the RCD now vary depending on the complexity of the constructed fixture - type: Tweak - id: 6267 - time: '2024-03-31T04:29:47.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/22799 -- author: UBlueberry + id: 6327 + time: '2024-04-10T17:28:03.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26839 +- author: botanySupremist changes: - - message: Nanotransen is now recruitin' personnel that speak with a Southern drawl. + - message: Clipping harvestable plants now yields undamaged seeds. type: Add - id: 6268 - time: '2024-03-31T04:39:40.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26543 -- author: Tayrtahn + id: 6328 + time: '2024-04-10T17:51:25.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25541 +- author: deltanedas changes: - - message: You can no longer drink out of or put liquids into buckets worn on your - head. + - message: Fixed some doors having no access when they should. type: Fix - id: 6269 - time: '2024-03-31T04:40:22.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/24412 -- author: DrTeaspoon + id: 6329 + time: '2024-04-10T20:06:31.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26858 +- author: Flareguy changes: - - message: Hypopen no longer shows chemical contents when examined, when not held - by the examinee. + - message: Added emergency nitrogen lockers. You can scarcely find them in public + areas, or scattered around in maintenance tunnels. + type: Add + id: 6330 + time: '2024-04-10T21:20:05.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26752 +- author: Jark255 + changes: + - message: Door electronics now require network configurators to change their access + settings, rather than doing so by hand. type: Fix - id: 6270 - time: '2024-03-31T04:59:36.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26453 -- author: lzk228 + id: 6331 + time: '2024-04-11T12:21:15.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26888 +- author: lunarcomets changes: - - message: Hairflower was removed. - type: Remove - - message: Now you can wear poppy (and other flowers) on your head instead of crafting - hairflower with it. + - message: Cryogenic sleep units now remove crew members from the manifest, and + announce when crew members go into cryogenic storage. type: Tweak - id: 6271 - time: '2024-03-31T05:33:23.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25475 -- author: EmoGarbage404 + id: 6332 + time: '2024-04-11T20:48:46.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26813 +- author: Vermidia changes: - - message: Borgs, Emitters, and APEs can no longer have their panels opened while - locked. APEs and Emitters additionally cannot be unanchored either. + - message: Salt and Pepper shakers look like shakers. + type: Fix + id: 6333 + time: '2024-04-12T06:44:47.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26899 +- author: liltenhead + changes: + - message: Reagent slimes are no longer ghost roles. + type: Remove + id: 6334 + time: '2024-04-12T06:50:46.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26840 +- author: TokenStyle + changes: + - message: Notice board can be crafted type: Add - id: 6272 - time: '2024-03-31T06:34:17.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26600 -- author: lzk228 + id: 6335 + time: '2024-04-12T06:58:02.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26847 +- author: deltanedas changes: - - message: Flower crown and wreath were combined. Now you can wear wreath both on - head and on neck. + - message: Sterile Swabs now come in dispensers making them easier to use. type: Tweak - id: 6273 - time: '2024-03-31T08:52:52.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26605 -- author: Ubaser + id: 6336 + time: '2024-04-12T07:15:04.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/24986 +- author: Ko4erga changes: - - message: Throwing knives now additionally do armour piercing damage. - type: Tweak - id: 6274 - time: '2024-03-31T11:48:36.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26380 -- author: graevy + - message: Strobes added WEE-OOO-WEE-OOO! + type: Add + id: 6337 + time: '2024-04-12T08:02:06.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26083 +- author: osjarw changes: - - message: clicking the brig timer button will now cancel its countdown - type: Tweak - id: 6275 - time: '2024-03-31T20:44:02.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26557 -- author: lzk228 + - message: Magboots no longer activate artifacts from salvage magnet ranges. + type: Fix + id: 6338 + time: '2024-04-13T01:46:00.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26912 +- author: Vasilis changes: - - message: Briefcases was added to CuraDrobe and LawDrobe. - type: Tweak - id: 6276 - time: '2024-03-31T20:52:49.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26527 -- author: RiceMar + - message: Blood (or anything containing uncooked animal proteins) can only be consumed + by animal stomach's instead of all but human. Attempting to due so will poison + you as intended. + type: Fix + id: 6339 + time: '2024-04-13T02:36:29.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26906 +- author: DrSmugleaf changes: - - message: Added milk cartons to the BoozeOMat vendor. Got milk? - type: Add - id: 6277 - time: '2024-04-01T00:07:30.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26635 -- author: nikthechampiongr + - message: Fixed incorrect "Cycled" and "Bolted" popups when wielding and unwielding + some guns. + type: Fix + id: 6340 + time: '2024-04-13T15:25:54.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26924 +- author: FungiFellow changes: - - message: Radio jammers now actually block suit sensors. + - message: Removed Crusher Dagger from Grapple Module + type: Remove + id: 6341 + time: '2024-04-13T15:35:10.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26865 +- author: ShadowCommander + changes: + - message: Fixed the pull hotkey not pulling the new entity when you are already + pulling an entity. type: Fix - id: 6278 - time: '2024-04-01T02:13:52.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26632 -- author: Flareguy + id: 6342 + time: '2024-04-13T15:36:05.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26499 +- author: Boaz1111 changes: - - message: All wheeled objects now have lower friction. Portable items, like fuel - canisters & portable scrubbers, should now be easier to carry around. - type: Tweak - - message: High-capacity reagent tanks are now much heavier. - type: Tweak - id: 6279 - time: '2024-04-01T03:23:59.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26601 + - message: The doors on the ice expedition map can now be accessed by anyone instead + of... botanists. + type: Fix + id: 6343 + time: '2024-04-13T20:49:02.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26928 - author: Tayrtahn changes: - - message: spears, darts, and hypodarts can inject targets again. + - message: Placing a player with no entry in the manifest into cryostorage no longer + removes the captain from the crew manifest. type: Fix - - message: arrows can no longer inject targets they don't actually hit. - type: Fix - id: 6280 - time: '2024-04-01T03:39:35.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26268 -- author: SoulFN + id: 6344 + time: '2024-04-14T02:19:42.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26927 +- author: superjj18 changes: - - message: Changed textures of the assault borg modules - type: Tweak - id: 6281 - time: '2024-04-01T04:21:12.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26502 -- author: Keer-Sar + - message: Honkbot's basic AI has been restored and honks have returned to being + at random intervals! + type: Fix + id: 6345 + time: '2024-04-14T02:51:24.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26939 +- author: GreaseMonk changes: - - message: Cyborgs now have audio for some emotes. + - message: Added StopsWhenEntityDead property to audio components type: Add - id: 6282 - time: '2024-04-01T04:35:21.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26594 -- author: SlamBamActionman + id: 6346 + time: '2024-04-14T03:12:38.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26905 +- author: DrSmugleaf changes: - - message: Added Coordinates Disks to the Salvage expeditions console, which are - now a requirement for expedition FTL. - type: Add - id: 6283 - time: '2024-04-01T04:50:00.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/23240 -- author: kseandi + - message: Fixed rocket launchers and laser guns looking like they have nothing + loaded. + type: Fix + id: 6347 + time: '2024-04-14T03:17:17.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26933 +- author: Vermidia changes: - - message: NT has declassified the documentation for door electronics, now anyone - can configure its access using network configurator or multitool. + - message: You can now see paper attached on crates. Color differs depending on + the paper used. type: Add - id: 6284 - time: '2024-04-01T06:06:14.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/17778 -- author: musicmanvr + - message: The labels on bodybags also have different colors depending on the paper + used. + type: Tweak + - message: Cargo Invoices are now blueish (to differentiate them from Cargo Bounties) + type: Tweak + id: 6348 + time: '2024-04-14T03:39:02.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26834 +- author: Terraspark4941 changes: - - message: Added Sol Dry, 8 new cocktails and coconut water. + - message: Autism pins have been added to maintenance loot! type: Add - id: 6285 - time: '2024-04-01T06:41:14.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25367 -- author: f0x-n3rd + id: 6349 + time: '2024-04-14T05:35:35.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25597 +- author: Flareguy changes: - - message: Added pages for each categories from the chemical page in the guidebook, - no more infinite scrolling when looking up certain chemicals. - type: Add - id: 6286 - time: '2024-04-01T07:20:38.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25831 -- author: TheShuEd + - message: Colored jumpsuits, shoes, and (most) colored gloves are now colorized + off of one set of greyscale sprites. They should now be more consistent & significantly + less ugly. + type: Tweak + id: 6350 + time: '2024-04-14T08:41:39.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26943 +- author: BramvanZijp changes: - - message: Added new transformation particles types for APE and CHIMP - type: Add - - message: Added new anomaly behaviour mechanic. Different behaviors can change - the gameplay of an anomaly. Players can get random behaviors by bombarding the - anomaly with new particles + - message: Nanotrasen's Small Arms Division has slightly improved the firerate and + drastically improved the accuracy on its WT550 SMGs. + type: Tweak + - message: The WT550 and C-20R SMGs can now fire in a 5 round burst-fire mode, making + it easier for their users to control the recoil on these weapons. type: Add - id: 6287 - time: '2024-04-01T08:29:13.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/24683 -- author: Sk1tch + id: 6351 + time: '2024-04-14T08:51:07.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26886 +- author: Dutch-VanDerLinde changes: - - message: Added chat window opacity slider to options. - type: Add - id: 6288 - time: '2024-04-01T20:48:02.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/24990 -- author: TheShuEd + - message: Holoparasites and holoclowns will now phase through projectiles such + as bullets, like a holocarp. + type: Tweak + id: 6352 + time: '2024-04-14T08:52:57.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26862 +- author: Tyzemol changes: - - message: added procedurally generating books to library. + - message: Board game crate now comes with character sheets type: Add - - message: full books resprite + id: 6353 + time: '2024-04-14T08:54:40.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26926 +- author: FairlySadPanda + changes: + - message: Clown shoes make you waddle, as God intended. type: Add - id: 6289 - time: '2024-04-01T21:00:10.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25840 -- author: osjarw + id: 6354 + time: '2024-04-14T12:12:54.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26338 +- author: beck-thompson changes: - - message: Ambuzol plus pills now have different sprites from ambuzol pills. Now - CBURN agents and Nukies who bought the syndicate zombie bundle might realize - that they also have some ambuzol plus. - type: Tweak - id: 6290 - time: '2024-04-02T00:50:43.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26651 -- author: osjarw + - message: Cybersun pen now makes a slashing noise when doing damage. + type: Fix + id: 6355 + time: '2024-04-14T20:04:06.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26951 +- author: TokenStyle changes: - - message: Air injectors finally have working indicator lights while enabled. + - message: Lockers cannot be deconstructed with a screwdriver when locked now. type: Fix - id: 6291 - time: '2024-04-02T05:17:26.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26654 -- author: Simyon + id: 6356 + time: '2024-04-14T22:26:47.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26961 +- author: pissdemon + changes: + - message: Catwalks over lava are slightly less likely to catch you on fire again. + type: Fix + id: 6357 + time: '2024-04-15T01:27:58.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26968 +- author: Velcroboy + changes: + - message: Fixed sec/lawyer and vault airlocks + type: Fix + id: 6358 + time: '2024-04-15T22:22:16.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26980 +- author: tosatur + changes: + - message: Made clown snoring quieter + type: Tweak + id: 6359 + time: '2024-04-16T18:48:38.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27012 +- author: DEATHB4DEFEAT, Dutch-VanDerLinde, metalgearsloth and musicmanvr + changes: + - message: Added loadouts + type: Add + id: 6360 + time: '2024-04-16T19:57:41.736477+00:00' + url: null +- author: Dutch-VanDerLinde + changes: + - message: Senior role ID cards now function properly. + type: Fix + id: 6361 + time: '2024-04-16T20:17:06.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27017 +- author: Dutch-VanDerLinde changes: - - message: The hands of cyborgs are now explosion proof. Your beakers wont ever - break again! + - message: Most job loadouts now have winter clothing available. + type: Tweak + id: 6362 + time: '2024-04-17T02:49:53.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27022 +- author: metalgearsloth + changes: + - message: 'Fix the following in lobby: ShowClothes button not working, Skin Color + not updating, Skin Color slider not updating upon closing and re-opening character.' type: Fix - id: 6292 - time: '2024-04-02T05:18:31.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26515 -- author: lzk228 + id: 6363 + time: '2024-04-17T02:54:54.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27033 +- author: MACMAN2003 changes: - - message: Typing indicator now can be shaded by shadows. + - message: Nuclear operatives now only need 20 players to be readied up again instead + of 35. type: Tweak - id: 6293 - time: '2024-04-03T02:12:47.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26678 -- author: EmoGarbage404 + id: 6364 + time: '2024-04-17T03:19:30.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27036 +- author: Bellwether changes: - - message: Increased time between pulses for various anomalies. + - message: The nun hood now appears in the Chaplain's loadout. type: Tweak - id: 6294 - time: '2024-04-03T03:15:57.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26677 -- author: Plykiya + id: 6365 + time: '2024-04-17T03:36:44.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27025 +- author: iNV3RT3D & metalgearsloth changes: - - message: Dropped items are no longer rotated to world north. + - message: Added a jukebox. + type: Add + id: 6366 + time: '2024-04-17T09:27:01.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26736 +- author: Vermidia + changes: + - message: Pirate Accent and Mobster accent will respect capitalization better now type: Fix - id: 6295 - time: '2024-04-03T05:31:57.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26662 -- author: deltanedas + id: 6367 + time: '2024-04-17T10:04:24.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26644 +- author: metalgearsloth changes: - - message: Disabled scooping foam due to a reagent duplication bug. + - message: Fix lobby character preview not updating upon changing characters. type: Fix - id: 6296 - time: '2024-04-03T13:41:23.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26686 -- author: Aserovich + id: 6368 + time: '2024-04-17T10:06:10.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27043 +- author: Beck Thompson changes: - - message: New lobby art! + - message: You now must equip gloved weapons (E.g boxing gloves) to use them. + type: Fix + id: 6369 + time: '2024-04-17T10:10:04.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26762 +- author: slarticodefast + changes: + - message: The gas analyzer now tells you the volume of scanned objects. Tanks inside + canisters now show up as well. type: Add - id: 6297 - time: '2024-04-04T05:28:30.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26505 -- author: Beck Thompson + - message: The gas analyzer now shows the amount of moles inside the scanned pipe + element instead of the whole pipe network. + type: Tweak + id: 6370 + time: '2024-04-17T17:42:24.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25720 +- author: deltanedas changes: - - message: Items thrown at disposals now have to be insertable to display the miss - message. + - message: The Chameleon Projector has been added to the uplink for 7 TC, it lets + you disguise as anything (within reason). + type: Add + id: 6371 + time: '2024-04-17T21:48:35.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26691 +- author: ShadowCommander + changes: + - message: Fixed PDA and ID card name, job, and access not getting set on some jobs. type: Fix - id: 6298 - time: '2024-04-04T06:25:47.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26716 + id: 6372 + time: '2024-04-17T22:16:25.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27062 +- author: Krunk + changes: + - message: Head of Security and Warden now have armored and unarmored variants of + their winter coats and the unarmored variants are available in the uniform printer. + type: Tweak + - message: Head of Security's and Warden's winter coats now provide resistances + equal to their non-winter counterparts. + type: Tweak + id: 6373 + time: '2024-04-18T00:08:06.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/24865 +- author: icekot8 + changes: + - message: "\u0421argo request console now reports when a request is approved" + type: Add + id: 6374 + time: '2024-04-18T00:32:22.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27038 +- author: Bellwether + changes: + - message: Midround zombie outbreaks are less common and spread more slowly. + type: Tweak + id: 6375 + time: '2024-04-18T01:06:33.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27060 +- author: Flareguy + changes: + - message: Updated Remote Signaller sprites. + type: Tweak + id: 6376 + time: '2024-04-18T01:16:48.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27073 +- author: Dutch-VanDerLinde + changes: + - message: Grey security jumpsuits are now available in the security officer loadout. + type: Tweak + id: 6377 + time: '2024-04-18T01:22:09.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27023 - author: Tayrtahn changes: - - message: Some devices may have broken wiring at the start of each round. + - message: Sodas and other fizzy drinks can be shaken with the verbs menu to build + up fizziness so they spray when opened. type: Add - id: 6299 - time: '2024-04-04T06:28:09.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26695 -- author: lzk228 + id: 6378 + time: '2024-04-18T01:49:58.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25574 +- author: metalgearsloth changes: - - message: Turning off thrusters and gyroscopes now stop consume power. + - message: Fix lobby UI not resetting for character changes. type: Fix - id: 6300 - time: '2024-04-04T06:28:33.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26690 -- author: Aexxie + id: 6379 + time: '2024-04-18T03:01:12.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27075 +- author: TokenStyle changes: - - message: Added the option to disable your OOC Patron name color. + - message: Benzene is no longer required for the Insuzine recipe. + type: Tweak + id: 6380 + time: '2024-04-18T03:03:39.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26829 +- author: Golinth + changes: + - message: The Nukie Agent now comes with a medihud built into their visor! type: Add - id: 6301 - time: '2024-04-04T07:20:06.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26653 -- author: DinoWattz + id: 6381 + time: '2024-04-18T03:04:14.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26218 +- author: Krunk changes: - - message: Fixed pocket slots being able to hide character snout markings. - type: Fix - id: 6302 - time: '2024-04-04T08:35:44.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26708 -- author: VasilisThePikachu + - message: Cyborgs no longer see criminal status icons. + type: Remove + id: 6382 + time: '2024-04-18T03:20:44.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26207 +- author: ArZarLordOfMango changes: - - message: Mop buckets and Janitorial Trolleys will not spill their contents as - soon as they are pushed. - type: Fix - - message: Mop buckets are no longer solid. So you can now walk through them. - type: Fix - id: 6303 - time: '2024-04-04T08:39:55.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26706 -- author: ZeroDayDaemon + - message: Added autolathe recipe for beverage jug. + type: Add + id: 6383 + time: '2024-04-18T03:24:15.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25681 +- author: superjj18 changes: - - message: Lowered the number of ducks in the duck crate and reduced the price of - it. + - message: Emergency lighting now changes based on station alert level! type: Tweak - id: 6304 - time: '2024-04-04T19:30:13.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26729 -- author: PrPleGoo + id: 6384 + time: '2024-04-18T10:50:08.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26932 +- author: Dutch-VanDerLinde changes: - - message: The medical HUD's brightness now scales with lighting again. + - message: Chemists now start with chemical analysis goggles. type: Tweak - - message: Most HUD icon's brightness now scale with lighting. + id: 6385 + time: '2024-04-18T10:52:33.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27047 +- author: TheShuEd + changes: + - message: botanist can now mutate blood tomatoes into killer tomatoes! they will + be personal pets, aggressively defending the owner from any social interactions. + type: Add + id: 6386 + time: '2024-04-18T11:21:56.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26053 +- author: TheShuEd + changes: + - message: Now winter around Europa is different every round type: Tweak - id: 6305 - time: '2024-04-04T23:05:01.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26726 -- author: Daemon + id: 6387 + time: '2024-04-18T11:27:54.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26510 +- author: Flareguy changes: - - message: Practice projectiles have been given standardized minimal damage. + - message: The Research Director's hardsuit is now 5x5 in the inventory instead + of 2x2. You'll need a duffelbag to store it now. type: Tweak - - message: The practice laser gun now works with shooting targets. + id: 6388 + time: '2024-04-18T18:05:45.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27094 +- author: Dutch-VanDerLinde + changes: + - message: Roboticist gear in now available in the scientist loadout. type: Tweak - id: 6306 - time: '2024-04-05T03:15:02.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26731 -- author: Daemon + id: 6389 + time: '2024-04-18T23:38:17.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27045 +- author: Whisper changes: - - message: Shooting targets can now have their popup type changed with a left click - to show total damage, damage of a single hit, both, or just a notice that it - was hit. + - message: Raised the difficulty class of RD hardsuit objective, it will be less + likely to get it with other hard objectives. type: Tweak - id: 6307 - time: '2024-04-05T07:19:41.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26734 -- author: Vermidia + id: 6390 + time: '2024-04-18T23:41:12.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27103 +- author: iztokbajcar changes: - - message: Baseball bats now require a knife to craft + - message: Glass textures are now less transparent. type: Tweak - id: 6308 - time: '2024-04-05T15:41:35.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26742 -- author: deltanedas + id: 6391 + time: '2024-04-18T23:43:01.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26948 +- author: SlamBamActionman changes: - - message: Making fultons now requires cloth and they are faster to make. + - message: Snouts and noses no longer disappear with toggled masks. + type: Fix + id: 6392 + time: '2024-04-19T05:39:47.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25716 +- author: shampunj + changes: + - message: 'Now for crafting stunprod you need: igniter, cable cuffs, small power + cell, metal rod.' type: Tweak - id: 6309 - time: '2024-04-05T15:42:12.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26747 + - message: Stunprod deals 35 stamina damage per hit and 5 shock damage. The battery + charge is enough for 3 hits. + type: Tweak + id: 6393 + time: '2024-04-19T05:50:10.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25922 +- author: EmoGarbage404 + changes: + - message: Halved passive fuel consumption of welding tools. + type: Tweak + - message: Completing an action with a welding tool now directly drains the fuel. + type: Tweak + id: 6394 + time: '2024-04-19T23:20:30.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27030 - author: superjj18 changes: - - message: Broadcasting works again! - type: Fix - id: 6310 - time: '2024-04-05T17:29:22.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26750 -- author: Golinth + - message: Pneumatic cannon inventory reduced in size to 2x2, item blacklist removed + type: Tweak + id: 6395 + time: '2024-04-19T23:22:37.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26878 +- author: Aquif changes: - - message: Fixed mindshield icons being glow in the dark + - message: The Communication Console will no longer cut off your messages. type: Fix - id: 6311 - time: '2024-04-05T20:35:32.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26754 -- author: Blackern5000 + id: 6396 + time: '2024-04-20T01:07:10.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27145 +- author: osjarw changes: - - message: Added sap - type: Add - - message: Added syrup, it can be made by boiling sap. + - message: Wallmount substation electronics can now be created at an autolathe. type: Add - - message: Dionae now bleed sap instead of water - type: Tweak - id: 6312 - time: '2024-04-05T21:06:12.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25748 -- author: osjarw + id: 6397 + time: '2024-04-20T01:14:58.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27138 +- author: Gyrandola changes: - - message: Thin firelocks are now constructable/deconstructable + - message: Pepper sprites are now properly centered! type: Fix - id: 6313 - time: '2024-04-06T01:55:31.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26745 -- author: BITTERLYNX + id: 6398 + time: '2024-04-20T02:06:48.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25971 +- author: ElectroJr changes: - - message: Rodents are more visually pleasing to burn - type: Fix - - message: mothroach and hammy also more visually pleasing to burn + - message: Fixed a bug causing the emergency shuttle to not spawn type: Fix - id: 6314 - time: '2024-04-06T04:41:23.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26758 -- author: Plykiya + id: 6399 + time: '2024-04-20T02:10:19.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27144 +- author: slarticodefast changes: - - message: You can now carefully walk over glass shards and D4. + - message: The internal volume of cryopods has been increased from 101.3 to 1000L. + This speeds up cooling patients inside. type: Tweak - id: 6315 - time: '2024-04-06T04:49:14.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26763 -- author: PursuitInAshes + id: 6400 + time: '2024-04-20T03:44:39.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27148 +- author: UBlueberry changes: - - message: Sake Bottles can now be found in the booze-o-mat. + - message: Changed the guidebook entry for the Space Ninja, bringing it up to the + same quality as the other antagonist entries. type: Tweak - id: 6316 - time: '2024-04-06T20:16:47.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26776 -- author: osjarw + id: 6401 + time: '2024-04-20T06:10:22.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26650 +- author: Vermidia changes: - - message: Removed broken anom behaviour, which causes APE shots to fly through - the anom. - type: Remove - id: 6317 - time: '2024-04-06T22:27:16.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26775 + - message: You can now bless many more containers with a bible. + type: Tweak + id: 6402 + time: '2024-04-20T06:16:55.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26526 +- author: SoulFN + changes: + - message: Various types of glass shards now causes diffrent damage + type: Tweak + id: 6403 + time: '2024-04-20T06:21:13.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26783 - author: Vermidia changes: - - message: Water coolers show how full/what they're full of again. + - message: Most medical roles now can choose to start with nitrile or latex gloves, + or a sterile mask in their loadout, Medical Doctors can also start with a nurse + hat. + type: Add + id: 6404 + time: '2024-04-20T06:22:48.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27029 +- author: MilenVolf + changes: + - message: Most crates can now go through plastic flaps. type: Fix - id: 6318 - time: '2024-04-06T23:58:57.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26784 + id: 6405 + time: '2024-04-20T06:23:20.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27137 +- author: MilenVolf + changes: + - message: Electronics inside windoors now has proper accesses. + type: Fix + id: 6406 + time: '2024-04-20T06:26:00.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27133 +- author: Bhijn and Myr + changes: + - message: An option to tie your viewport's scaling to your vertical screenspace + has been added, enabled by default! In laymen's terms, this means that manual + configuration is no longer necessary to avoid letterboxing on aspect ratios + tighter than 16:9, as the viewport will now default to cutting off any excess + horizontal width instead of letterboxing vertically when the screen is too tight. + type: Add + id: 6407 + time: '2024-04-20T06:46:02.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27061 +- author: Whisper + changes: + - message: All mobs should now properly burn to ash. + type: Fix + id: 6408 + time: '2024-04-20T14:44:10.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27158 +- author: IProduceWidgets + changes: + - message: New map Oasis. + type: Add + id: 6409 + time: '2024-04-21T05:59:12.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25736 +- author: KittenColony + changes: + - message: Added a new lizard snout, featuring a split muzzle and snoot that can + be coloured independently + type: Add + id: 6410 + time: '2024-04-21T06:18:33.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27143 +- author: SpeltIncorrectyl + changes: + - message: Security Officers, Head of Security, and Warden can now choose to start + with a security webbing instead of a belt in their loadout menu. + type: Add + id: 6411 + time: '2024-04-21T06:19:20.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27189 +- author: ElectroJr + changes: + - message: Fixed the nukie station not getting properly initialized. + type: Fix + id: 6412 + time: '2024-04-21T06:52:45.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27201 +- author: Blackern5000 + changes: + - message: '"Experienced" passengers can now wear a rainbow jumpsuit using loadouts.' + type: Add + id: 6413 + time: '2024-04-21T11:53:08.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27211 +- author: PJB3005 + changes: + - message: The item status menu has been moved to the side of the hands. There is + now one for each hand. + type: Add + - message: The item status menu fits with the rest of the HUD theme now. + type: Add + - message: Improved, fixed and otherwise added a bunch of item status menus. + type: Add + id: 6414 + time: '2024-04-21T13:16:23.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/22986 +- author: FairlySadPanda + changes: + - message: Xenoarchaeology Traversal Distorters have been rolled into the Artifact + Analyzers to make artifact gameplay a bit more controlled. + type: Tweak + - message: The T2 Abnormal Artifact Manipulation tech has been made cheaper to compensate + for losing an unlock. + type: Tweak + - message: The Xenoarchaeology guidebook entry has been rewritten to be more useful + and comprehensive for newbies. + type: Tweak + id: 6415 + time: '2024-04-21T16:09:26.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26545 diff --git a/Resources/Changelog/DeltaVChangelog.yml b/Resources/Changelog/DeltaVChangelog.yml index 8af0ca5bee5..ed0a5bbc033 100644 --- a/Resources/Changelog/DeltaVChangelog.yml +++ b/Resources/Changelog/DeltaVChangelog.yml @@ -2119,3 +2119,10 @@ id: 320 time: '2024-04-19T02:51:31.0000000+00:00' url: https://github.com/DeltaV-Station/Delta-v/pull/931 +- author: NullWanderer + changes: + - message: Merged upstream + type: Add + id: 321 + time: '2024-04-22T17:25:33.0000000+00:00' + url: https://github.com/DeltaV-Station/Delta-v/pull/1119 diff --git a/Resources/Locale/en-US/administration/commands/connection-commands.ftl b/Resources/Locale/en-US/administration/commands/connection-commands.ftl new file mode 100644 index 00000000000..66991042d22 --- /dev/null +++ b/Resources/Locale/en-US/administration/commands/connection-commands.ftl @@ -0,0 +1,16 @@ +## Strings for the "grant_connect_bypass" command. + +cmd-grant_connect_bypass-desc = Temporarily allow a user to bypass regular connection checks. +cmd-grant_connect_bypass-help = Usage: grant_connect_bypass [duration minutes] + Temporarily grants a user the ability to bypass regular connections restrictions. + The bypass only applies to this game server and will expire after (by default) 1 hour. + They will be able to join regardless of whitelist, panic bunker, or player cap. + +cmd-grant_connect_bypass-arg-user = +cmd-grant_connect_bypass-arg-duration = [duration minutes] + +cmd-grant_connect_bypass-invalid-args = Expected 1 or 2 arguments +cmd-grant_connect_bypass-unknown-user = Unable to find user '{$user}' +cmd-grant_connect_bypass-invalid-duration = Invalid duration '{$duration}' + +cmd-grant_connect_bypass-success = Successfully added bypass for user '{$user}' diff --git a/Resources/Locale/en-US/atmos/gas-analyzer-component.ftl b/Resources/Locale/en-US/atmos/gas-analyzer-component.ftl index 03a920cb647..652bb19cb5b 100644 --- a/Resources/Locale/en-US/atmos/gas-analyzer-component.ftl +++ b/Resources/Locale/en-US/atmos/gas-analyzer-component.ftl @@ -12,6 +12,8 @@ gas-analyzer-window-refresh-button = Refresh gas-analyzer-window-no-data = No Data gas-analyzer-window-no-gas-text = No Gases gas-analyzer-window-error-text = Error: {$errorText} +gas-analyzer-window-volume-text = Volume: +gas-analyzer-window-volume-val-text = {$volume} L gas-analyzer-window-pressure-text = Pressure: gas-analyzer-window-pressure-val-text = {$pressure} kPa gas-analyzer-window-temperature-text = Temperature: diff --git a/Resources/Locale/en-US/bed/cryostorage/cryogenic-storage.ftl b/Resources/Locale/en-US/bed/cryostorage/cryogenic-storage.ftl new file mode 100644 index 00000000000..500a5305621 --- /dev/null +++ b/Resources/Locale/en-US/bed/cryostorage/cryogenic-storage.ftl @@ -0,0 +1,6 @@ + +### Announcement + +earlyleave-cryo-job-unknown = Unknown +earlyleave-cryo-announcement = {$character} ({$job}) has entered cryogenic storage! +earlyleave-cryo-sender = Station diff --git a/Resources/Locale/en-US/burning/bodyburn.ftl b/Resources/Locale/en-US/burning/bodyburn.ftl new file mode 100644 index 00000000000..58b98c09bbb --- /dev/null +++ b/Resources/Locale/en-US/burning/bodyburn.ftl @@ -0,0 +1 @@ +bodyburn-text-others = {$name} burns to ash! diff --git a/Resources/Locale/en-US/cargo/cargo-bounty-console.ftl b/Resources/Locale/en-US/cargo/cargo-bounty-console.ftl index ec80d91f47f..bf7868e3df7 100644 --- a/Resources/Locale/en-US/cargo/cargo-bounty-console.ftl +++ b/Resources/Locale/en-US/cargo/cargo-bounty-console.ftl @@ -1,5 +1,6 @@ bounty-console-menu-title = Cargo bounty console bounty-console-label-button-text = Print label +bounty-console-skip-button-text = Skip bounty-console-time-label = Time: [color=orange]{$time}[/color] bounty-console-reward-label = Reward: [color=limegreen]${$reward}[/color] bounty-console-manifest-label = Manifest: [color=orange]{$item}[/color] diff --git a/Resources/Locale/en-US/cargo/cargo-console-component.ftl b/Resources/Locale/en-US/cargo/cargo-console-component.ftl index b56f4730ccd..532481f4a23 100644 --- a/Resources/Locale/en-US/cargo/cargo-console-component.ftl +++ b/Resources/Locale/en-US/cargo/cargo-console-component.ftl @@ -30,6 +30,7 @@ cargo-console-snip-snip = Order trimmed to capacity cargo-console-insufficient-funds = Insufficient funds (require {$cost}) cargo-console-unfulfilled = No room to fulfill order cargo-console-trade-station = Sent to {$destination} +cargo-console-unlock-approved-order-broadcast = [bold]{$productName} x{$orderAmount}[/bold], which cost [bold]{$cost}[/bold], was approved by [bold]{$approverName}, {$approverJob}[/bold] cargo-console-paper-print-name = Order #{$orderNumber} cargo-console-paper-print-text = diff --git a/Resources/Locale/en-US/chameleon-projector/chameleon-projector.ftl b/Resources/Locale/en-US/chameleon-projector/chameleon-projector.ftl new file mode 100644 index 00000000000..8a79516077d --- /dev/null +++ b/Resources/Locale/en-US/chameleon-projector/chameleon-projector.ftl @@ -0,0 +1,2 @@ +chameleon-projector-invalid = You can't disguise as that! +chameleon-projector-success = Projected new disguise. diff --git a/Resources/Locale/en-US/chat/chat-repo.ftl b/Resources/Locale/en-US/chat/chat-repo.ftl new file mode 100644 index 00000000000..a53380260b2 --- /dev/null +++ b/Resources/Locale/en-US/chat/chat-repo.ftl @@ -0,0 +1,7 @@ +command-description-deletechatmessage-id = Delete a specific chat message by message ID +command-description-nukechatmessages-usernames = Delete all of the supplied usernames' chat messages posted during this round +command-description-nukechatmessages-userids = Delete all of the supplied userIds' chat messages posted during this round + +command-error-deletechatmessage-id-notexist = The message with the supplied ID does not exist +command-error-nukechatmessages-usernames-usernamenotexist = Username {$username} does not exist +command-error-nukechatmessages-usernames-usernamenomessages = UserID {$userId} has no messages to nuke diff --git a/Resources/Locale/en-US/chemistry/components/solution-status.ftl b/Resources/Locale/en-US/chemistry/components/solution-status.ftl new file mode 100644 index 00000000000..0ec5f932e0e --- /dev/null +++ b/Resources/Locale/en-US/chemistry/components/solution-status.ftl @@ -0,0 +1,2 @@ +solution-status-volume = Volume: [color=white]{$currentVolume}/{$maxVolume}u[/color] +solution-status-transfer = Transfer: [color=white]{$volume}u[/color] diff --git a/Resources/Locale/en-US/communications/communications-console-component.ftl b/Resources/Locale/en-US/communications/communications-console-component.ftl index f7cc87cb8ba..bead43df286 100644 --- a/Resources/Locale/en-US/communications/communications-console-component.ftl +++ b/Resources/Locale/en-US/communications/communications-console-component.ftl @@ -1,4 +1,4 @@ -# User interface +# User interface comms-console-menu-title = Communications Console comms-console-menu-announcement-placeholder = Announcement text... comms-console-menu-announcement-button = Announce @@ -9,6 +9,7 @@ comms-console-menu-recall-shuttle = Recall emergency shuttle # Popup comms-console-permission-denied = Permission denied comms-console-shuttle-unavailable = Shuttle is currently unavailable +comms-console-message-too-long = Message is too long # Placeholder values comms-console-announcement-sent-by = Sent by diff --git a/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl b/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl index 86ba4462cf2..61739772852 100644 --- a/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl +++ b/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl @@ -83,6 +83,10 @@ ui-options-vp-integer-scaling-tooltip = If this option is enabled, the viewport at specific resolutions. While this results in crisp textures, it also often means that black bars appear at the top/bottom of the screen or that part of the viewport is not visible. +ui-options-vp-vertical-fit = Vertical viewport fitting +ui-options-vp-vertical-fit-tooltip = When enabled, the main viewport will ignore the horizontal axis entirely when + fitting to your screen. If your screen is smaller than the viewport, then this + will cause the viewport to be cut off on the horizontal axis. ui-options-vp-low-res = Low-resolution viewport ui-options-parallax-low-quality = Low-quality Parallax (background) ui-options-fps-counter = Show FPS counter diff --git a/Resources/Locale/en-US/jukebox/jukebox-menu.ftl b/Resources/Locale/en-US/jukebox/jukebox-menu.ftl new file mode 100644 index 00000000000..d015976cc4b --- /dev/null +++ b/Resources/Locale/en-US/jukebox/jukebox-menu.ftl @@ -0,0 +1,5 @@ +jukebox-menu-title = Jukebox +jukebox-menu-selectedsong = Selected Song: +jukebox-menu-buttonplay = Play +jukebox-menu-buttonpause = Pause +jukebox-menu-buttonstop = Stop diff --git a/Resources/Locale/en-US/lathe/ui/lathe-menu.ftl b/Resources/Locale/en-US/lathe/ui/lathe-menu.ftl index 92f313086cb..71dd50d4091 100644 --- a/Resources/Locale/en-US/lathe/ui/lathe-menu.ftl +++ b/Resources/Locale/en-US/lathe/ui/lathe-menu.ftl @@ -13,6 +13,10 @@ lathe-menu-material-amount = { $amount -> [1] {NATURALFIXED($amount, 2)} {$unit} *[other] {NATURALFIXED($amount, 2)} {MAKEPLURAL($unit)} } +lathe-menu-material-amount-missing = { $amount -> + [1] {NATURALFIXED($amount, 2)} {$unit} of {$material} ([color=red]{NATURALFIXED($missingAmount, 2)} {$unit} missing[/color]) + *[other] {NATURALFIXED($amount, 2)} {MAKEPLURAL($unit)} of {$material} ([color=red]{NATURALFIXED($missingAmount, 2)} {MAKEPLURAL($unit)} missing[/color]) +} lathe-menu-no-materials-message = No materials loaded. lathe-menu-fabricating-message = Fabricating... lathe-menu-materials-title = Materials diff --git a/Resources/Locale/en-US/markings/gauze.ftl b/Resources/Locale/en-US/markings/gauze.ftl index 9a45a0a2fa2..f8bedc31957 100644 --- a/Resources/Locale/en-US/markings/gauze.ftl +++ b/Resources/Locale/en-US/markings/gauze.ftl @@ -1,17 +1,17 @@ marking-GauzeLefteyePatch-gauze_lefteye_2 = Gauze eyepatch (Left) marking-GauzeLefteyePatch = Gauze eyepatch (Left) -marking-GauzeLefteyeTape-gauze_lefteye_1 = Gauze eyepad (Left) -marking-GauzeLefteyeTape = Gauze eyepad (Left) +marking-GauzeLefteyePad-gauze_lefteye_1 = Gauze eyepad (Left) +marking-GauzeLefteyePad = Gauze eyepad (Left) marking-GauzeRighteyePatch-gauze_righteye_2 = Gauze eyepatch (Right) marking-GauzeRighteyePatch = Gauze eyepatch (Right) -marking-GauzeRighteyeTape-gauze_righteye_1 = Gauze eyepad (Right) -marking-GauzeRighteyeTape = Gauze eyepad (Right) +marking-GauzeRighteyePad-gauze_righteye_1 = Gauze eyepad (Right) +marking-GauzeRighteyePad = Gauze eyepad (Right) -marking-GauzeShoulder-gauze_shoulder = Gauze Shoulder -marking-GauzeShoulder = Gauze Shoulder +marking-GauzeShoulder-gauze_shoulder = Gauze Shoulder Sling +marking-GauzeShoulder = Gauze Shoulder Sling marking-GauzeStomach-gauze_abdomen = Gauze Stomach Wrap marking-GauzeStomach = Gauze Stomach Wrap @@ -46,17 +46,57 @@ marking-GauzeUpperLegRight = Gauze Thigh Wrap (Right) marking-GauzeBlindfold-gauze_blindfold = Gauze Blindfold marking-GauzeBlindfold = Gauze Blindfold -marking-GauzeLizardBlindfold-gauze_lizardblindfold = Gauze Blindfold +marking-GauzeLizardBlindfold-gauze_lizard_blindfold = Gauze Blindfold marking-GauzeLizardBlindfold = Gauze Blindfold -marking-GauzeLizardFootRight-gauze_lizardfoot_r = Gauze Foot Wrap (Right) +marking-GauzeLizardFootRight-gauze_lizard_foot_r = Gauze Foot Wrap (Right) marking-GauzeLizardFootRight = Gauze Foot Wrap (Right) -marking-GauzeLizardFootLeft-gauze_lizardfoot_l = Gauze Foot Wrap (Left) +marking-GauzeLizardFootLeft-gauze_lizard_foot_l = Gauze Foot Wrap (Left) marking-GauzeLizardFootLeft = Gauze Foot Wrap (Left) -marking-GauzeLizardLefteyePatch-gauze_lizardlefteye = Adjusted Gauze eyepatch (Left) -marking-GauzeLizardLefteyePatch = Adjusted Gauze eyepatch (Left) +marking-GauzeLizardLefteyePatch-gauze_lizard_lefteye = Reptilian Gauze eyepatch (Left) +marking-GauzeLizardLefteyePatch = Reptilian Gauze eyepatch (Left) + +marking-GauzeLizardRighteyePatch-gauze_lizard_righteye = Reptilian Gauze eyepatch (Right) +marking-GauzeLizardRighteyePatch = Reptilian Gauze Eyepatch (Right) + +marking-GauzeMothStomach-gauze_moth_abdomen = Insectoid Stomach Wrap +marking-GauzeMothStomach = Insectoid Stomach Wrap + +marking-GauzeMothShoulder-gauze_moth_shoulder = Insectoid Shoulder Sling +marking-GauzeMothShoulder = Insectoid Shoulder Sling + +marking-GauzeMothBlindfold-gauze_moth_blindfold = Insectoid Blindfold +marking-GauzeMothBlindfold = Insectoid Blindfold + +marking-GauzeMothLeftEyePatch-gauze_moth_lefteye_2 = Insectoid Gauze eyepatch (Left) +marking-GauzeMothLeftEyePatch = Insectoid Gauze eyepatch (Left) + +marking-GauzeMothLeftEyePad-gauze_moth_lefteye_1 = Insectoid Gauze eyepad (Left) +marking-GauzeMothLeftEyePad = Insectoid Gauze eyepad (Left) + +marking-GauzeMothRightEyePatch-gauze_moth_righteye_2 = Insectoid Gauze eyepatch (Right) +marking-GauzeMothRightEyePatch = Insectoid Gauze eyepatch (Right) + +marking-GauzeMothRightEyePad-gauze_moth_righteye_1 = Insectoid Gauze eyepad (Right) +marking-GauzeMothRightEyePad = Insectoid Gauze eyepad (Right) + +marking-GauzeMothUpperArmRight-gauze_moth_upperarm_r = Insectoid Gauze Forearm Wrap (Right) +marking-GauzeMothUpperArmRight = Insectoid Gauze Forearm Wrap (Right) + +marking-GauzeMothUpperArmLeft-gauze_moth_upperarm_l = Insectoid Gauze Forearm Wrap (Left) +marking-GauzeMothUpperArmLeft = Insectoid Gauze Forearm Wrap (Left) + +marking-GauzeMothUpperLegRight-gauze_moth_upperleg_r = Insectoid Gauze Thigh Wrap (Right) +marking-GauzeMothUpperLegRight = Insectoid Insectoid Gauze Thigh Wrap (Right) + +marking-GauzeMothUpperLegLeft-gauze_moth_upperleg_l = Insectoid Gauze Thigh Wrap (Left) +marking-GauzeMothUpperLegLeft = Insectoid Gauze Thigh Wrap (Left) + +marking-GauzeMothLowerLegRight-gauze_moth_lowerleg_r = Insectoid Gauze Shin Wrap (Right) +marking-GauzeMothLowerLegRight = Insectoid Gauze Shin Wrap (Right) + +marking-GauzeMothLowerLegLeft-gauze_moth_lowerleg_l = Insectoid Gauze Shin Wrap (Left) +marking-GauzeMothLowerLegLeft = Insectoid Gauze Shin Wrap (Left) -marking-GauzeLizardRighteyePatch-gauze_lizardrighteye = Adjusted Gauze eyepatch (Right) -marking-GauzeLizardRighteyePatch = Adjusted Gauze Eyepatch (Right) \ No newline at end of file diff --git a/Resources/Locale/en-US/markings/reptilian.ftl b/Resources/Locale/en-US/markings/reptilian.ftl index cfc44a4ba21..ddd0eae62fe 100644 --- a/Resources/Locale/en-US/markings/reptilian.ftl +++ b/Resources/Locale/en-US/markings/reptilian.ftl @@ -100,4 +100,8 @@ marking-LizardChestUnderbelly-body_underbelly = Lizard Chest (Underbelly) marking-LizardChestUnderbelly = Lizard Chest (Underbelly) marking-LizardChestBackspikes-body_backspikes = Lizard Back spikes (Four) -marking-LizardChestBackspikes = Lizard Back spikes (Four) \ No newline at end of file +marking-LizardChestBackspikes = Lizard Back spikes (Four) + +marking-LizardSnoutSplotch = Lizard Snout (Splotch) +marking-LizardSnoutSplotch-snout_splotch_primary = Muzzle +marking-LizardSnoutSplotch-snout_splotch_secondary = Snoot \ No newline at end of file diff --git a/Resources/Locale/en-US/nutrition/components/drink-component.ftl b/Resources/Locale/en-US/nutrition/components/drink-component.ftl index 9a388744b0c..e80787c8d5b 100644 --- a/Resources/Locale/en-US/nutrition/components/drink-component.ftl +++ b/Resources/Locale/en-US/nutrition/components/drink-component.ftl @@ -1,4 +1,4 @@ -drink-component-on-use-is-empty = {$owner} is empty! +drink-component-on-use-is-empty = {CAPITALIZE(THE($owner))} is empty! drink-component-on-examine-is-empty = [color=gray]Empty[/color] drink-component-on-examine-is-opened = [color=yellow]Opened[/color] drink-component-on-examine-is-sealed = The seal is intact. @@ -10,7 +10,7 @@ drink-component-on-examine-is-half-empty = Halfway Empty drink-component-on-examine-is-mostly-empty = Mostly Empty drink-component-on-examine-exact-volume = It contains {$amount}u. drink-component-try-use-drink-not-open = Open {$owner} first! -drink-component-try-use-drink-is-empty = {$entity} is empty! +drink-component-try-use-drink-is-empty = {CAPITALIZE(THE($entity))} is empty! drink-component-try-use-drink-cannot-drink = You can't drink anything! drink-component-try-use-drink-had-enough = You can't drink more! drink-component-try-use-drink-cannot-drink-other = They can't drink anything! diff --git a/Resources/Locale/en-US/nutrition/components/pressurized-solution-component.ftl b/Resources/Locale/en-US/nutrition/components/pressurized-solution-component.ftl new file mode 100644 index 00000000000..a227d811f6e --- /dev/null +++ b/Resources/Locale/en-US/nutrition/components/pressurized-solution-component.ftl @@ -0,0 +1,3 @@ +pressurized-solution-spray-holder-self = { CAPITALIZE(THE($drink)) } sprays on you! +pressurized-solution-spray-holder-others = { CAPITALIZE(THE($drink)) } sprays on { THE($victim) }! +pressurized-solution-spray-ground = The contents of { THE($drink) } spray out! diff --git a/Resources/Locale/en-US/nutrition/components/shakeable-component.ftl b/Resources/Locale/en-US/nutrition/components/shakeable-component.ftl new file mode 100644 index 00000000000..acc1ecd8489 --- /dev/null +++ b/Resources/Locale/en-US/nutrition/components/shakeable-component.ftl @@ -0,0 +1,3 @@ +shakeable-verb = Shake +shakeable-popup-message-others = { CAPITALIZE(THE($user)) } shakes { THE($shakeable) } +shakeable-popup-message-self = You shake { THE($shakeable) } diff --git a/Resources/Locale/en-US/rcd/components/rcd-component.ftl b/Resources/Locale/en-US/rcd/components/rcd-component.ftl index bb65e76f3f7..9741bde388c 100644 --- a/Resources/Locale/en-US/rcd/components/rcd-component.ftl +++ b/Resources/Locale/en-US/rcd/components/rcd-component.ftl @@ -43,24 +43,5 @@ rcd-component-lighting = Lighting ### Prototype names (note: constructable items will be puralized) rcd-component-deconstruct = deconstruct -rcd-component-wall-solid = solid wall rcd-component-floor-steel = steel tile rcd-component-plating = hull plate -rcd-component-catwalk = catwalk -rcd-component-wall-reinforced = reinforced wall -rcd-component-grille = grille -rcd-component-window = window -rcd-component-window-directional = directional window -rcd-component-window-reinforced-directional = directional reinforced window -rcd-component-reinforced-window = reinforced window -rcd-component-airlock = standard airlock -rcd-component-airlock-glass = glass airlock -rcd-component-firelock = firelock -rcd-component-computer-frame = computer frame -rcd-component-machine-frame = machine frame -rcd-component-tube-light = light -rcd-component-window-bulb-light = small light -rcd-component-window-lv-cable = LV cable -rcd-component-window-mv-cable = MV cable -rcd-component-window-hv-cable = HV cable -rcd-component-window-cable-terminal = cable terminal diff --git a/Resources/Locale/en-US/research/technologies.ftl b/Resources/Locale/en-US/research/technologies.ftl index a68f9e80b4e..70ca8d018ac 100644 --- a/Resources/Locale/en-US/research/technologies.ftl +++ b/Resources/Locale/en-US/research/technologies.ftl @@ -44,7 +44,7 @@ research-technology-magnets-tech = Localized Magnetism research-technology-advanced-parts = Advanced Parts research-technology-anomaly-harnessing = Anomaly Core Harnessing research-technology-grappling = Grappling -research-technology-abnormal-artifact-manipulation = Abnormal Artifact Manipulation +research-technology-abnormal-artifact-manipulation = Artifact Recycling research-technology-gravity-manipulation = Gravity Manipulation research-technology-quantum-leaping = Quantum Leaping research-technology-advanced-anomaly-research = Advanced Anomaly Research diff --git a/Resources/Locale/en-US/seeds/seeds.ftl b/Resources/Locale/en-US/seeds/seeds.ftl index b3983782883..bff317a7e67 100644 --- a/Resources/Locale/en-US/seeds/seeds.ftl +++ b/Resources/Locale/en-US/seeds/seeds.ftl @@ -41,6 +41,8 @@ seeds-bluetomato-name = blue tomato seeds-bluetomato-display-name = blue tomato plant seeds-bloodtomato-name = blood tomato seeds-bloodtomato-display-name = blood tomato plant +seeds-killertomato-name = tomato killer +seeds-killertomato-display-name = tomato killer plant seeds-eggplant-name = eggplant seeds-eggplant-display-name = eggplants seeds-apple-name = apple @@ -64,7 +66,7 @@ seeds-nettle-display-name = nettles seeds-deathnettle-name = death nettle seeds-deathnettle-display-name = death nettles seeds-chili-name = chili -seeds-chili-display-name = chilis +seeds-chili-display-name = chili peppers seeds-chilly-name = chilly seeds-chilly-display-name = chilly peppers seeds-poppy-name = poppy diff --git a/Resources/Locale/en-US/speech/speech-chatsan.ftl b/Resources/Locale/en-US/speech/speech-chatsan.ftl index 6ce575e648d..25e6c6f1ea9 100644 --- a/Resources/Locale/en-US/speech/speech-chatsan.ftl +++ b/Resources/Locale/en-US/speech/speech-chatsan.ftl @@ -117,3 +117,6 @@ chatsan-replacement-42 = of course chatsan-word-43 = ig chatsan-replacement-43 = i guess + +chatsan-word-44 = tbf +chatsan-replacement-44 = to be fair diff --git a/Resources/Locale/en-US/store/store.ftl b/Resources/Locale/en-US/store/store.ftl index d663cc61f71..997afedfc06 100644 --- a/Resources/Locale/en-US/store/store.ftl +++ b/Resources/Locale/en-US/store/store.ftl @@ -6,5 +6,5 @@ store-ui-traitor-flavor = Copyright (C) NT -30643 store-ui-traitor-warning = Operatives must lock their uplinks after use to avoid detection. store-withdraw-button-ui = Withdraw {$currency} - +store-ui-button-out-of-stock = {""} (Out of Stock) store-not-account-owner = This {$store} is not bound to you! diff --git a/Resources/Locale/en-US/store/uplink-catalog.ftl b/Resources/Locale/en-US/store/uplink-catalog.ftl index 592cf59d2fe..c7e6bf2e3f6 100644 --- a/Resources/Locale/en-US/store/uplink-catalog.ftl +++ b/Resources/Locale/en-US/store/uplink-catalog.ftl @@ -367,6 +367,9 @@ uplink-slipocalypse-clustersoap-desc = Scatters arounds small pieces of syndicat uplink-mobcat-microbomb-name = SyndiCat uplink-mobcat-microbomb-desc = A hand cat equipped with a microbomb implant. Explodes when seriously injured. Can bite painfully +uplink-chameleon-projector-name = Chameleon Projector +uplink-chameleon-projector-desc = Disappear in plain sight by creating a hologram of an item around you. Do not use this to play the game "Object Search". + # Pointless uplink-revolver-cap-gun-name = Cap Gun uplink-revolver-cap-gun-desc = Looks almost like the real thing! Ages 8 and up. diff --git a/Resources/Locale/en-US/tools/components/welder-component.ftl b/Resources/Locale/en-US/tools/components/welder-component.ftl index 681975deb83..63070685215 100644 --- a/Resources/Locale/en-US/tools/components/welder-component.ftl +++ b/Resources/Locale/en-US/tools/components/welder-component.ftl @@ -4,7 +4,8 @@ welder-component-no-fuel-message = The welder has no fuel left! welder-component-no-fuel-in-tank = The {$owner} is empty. welder-component-on-examine-welder-lit-message = [color=orange]Lit[/color] welder-component-on-examine-welder-not-lit-message = Not lit -welder-component-on-examine-detailed-message = Fuel: [color={$colorName}]{$fuelLeft}/{$fuelCapacity}[/color]. {$status} +welder-component-on-examine-detailed-message = Fuel: [color={$colorName}]{$fuelLeft}/{$fuelCapacity}[/color] + {$status} welder-component-suicide-lit-others-message = {$victim} welds their every orifice closed! It looks like they are trying to commit suicide! welder-component-suicide-lit-message = You weld your every orifice closed! welder-component-suicide-unlit-others-message = {$victim} bashes themselves with the unlit welding torch! diff --git a/Resources/Locale/en-US/xenoarchaeology/artifact-analyzer.ftl b/Resources/Locale/en-US/xenoarchaeology/artifact-analyzer.ftl index 599f36ec91c..672d80ed31d 100644 --- a/Resources/Locale/en-US/xenoarchaeology/artifact-analyzer.ftl +++ b/Resources/Locale/en-US/xenoarchaeology/artifact-analyzer.ftl @@ -6,6 +6,10 @@ analysis-console-print-button = Print analysis-console-print-tooltip-info = Print out the current information about the artifact. analysis-console-extract-button = Extract analysis-console-extract-button-info = Extract points from an artifact based on the newly explored nodes. +analysis-console-bias-up = Up +analysis-console-bias-down = Down +analysis-console-bias-button-info-up = Toggles the bias an artifact has in moving between its nodes. Up heads toward zero depth. +analysis-console-bias-button-info-down = Toggles the bias an artifact has in moving between its nodes. Down heads toward ever-higher depths. analysis-console-info-no-scanner = No analyzer connected! Please connect one using a multitool. analysis-console-info-no-artifact = No artifact present! Place one on the pad then scan for information. diff --git a/Resources/Locale/en-US/xenoarchaeology/traversal-distorter.ftl b/Resources/Locale/en-US/xenoarchaeology/traversal-distorter.ftl index 5c9eac57a5d..ef2931768b9 100644 --- a/Resources/Locale/en-US/xenoarchaeology/traversal-distorter.ftl +++ b/Resources/Locale/en-US/xenoarchaeology/traversal-distorter.ftl @@ -1,5 +1,5 @@ -traversal-distorter-set-in = Traversal bias set to "in" -traversal-distorter-set-out = Traversal bias set to "out" +traversal-distorter-set-up = Traversal bias set to up, toward safer nodes +traversal-distorter-set-down = Traversal bias set to down, toward more dangerous nodes -traversal-distorter-desc-in = The affected artifact's traversal now favors moving inwards to the beginning. -traversal-distorter-desc-out = The affected artifact's traversal now favors moving outwards towards more dangerous nodes. +traversal-distorter-desc-up = The affected artifact's traversal now favors moving up the node tree toward safer nodes. +traversal-distorter-desc-down = The affected artifact's traversal now favors moving down the node tree towards more dangerous nodes. diff --git a/Resources/Maps/Dungeon/experiment.yml b/Resources/Maps/Dungeon/experiment.yml index 8449abf9328..590692a6bb9 100644 --- a/Resources/Maps/Dungeon/experiment.yml +++ b/Resources/Maps/Dungeon/experiment.yml @@ -7444,13 +7444,6 @@ entities: - type: Transform pos: 32.5,14.5 parent: 1653 -- proto: MachineTraversalDistorter - entities: - - uid: 1058 - components: - - type: Transform - pos: 34.5,22.5 - parent: 1653 - proto: MaintenanceFluffSpawner entities: - uid: 867 diff --git a/Resources/Maps/Salvage/DeltaV/DV-asteroid-mining-chemlab.yml b/Resources/Maps/Salvage/DeltaV/DV-asteroid-mining-chemlab.yml index 8cae38a6fb8..1d207871e77 100644 --- a/Resources/Maps/Salvage/DeltaV/DV-asteroid-mining-chemlab.yml +++ b/Resources/Maps/Salvage/DeltaV/DV-asteroid-mining-chemlab.yml @@ -523,7 +523,6 @@ entities: solutions: beaker: temperature: 293.15 - canMix: True canReact: True maxVol: 50 name: null @@ -540,7 +539,6 @@ entities: solutions: beaker: temperature: 293.15 - canMix: True canReact: True maxVol: 50 name: null @@ -557,7 +555,6 @@ entities: solutions: beaker: temperature: 293.15 - canMix: True canReact: True maxVol: 50 name: null @@ -2199,7 +2196,6 @@ entities: solutions: beaker: temperature: 293.15 - canMix: True canReact: True maxVol: 200 name: null @@ -2216,7 +2212,6 @@ entities: solutions: beaker: temperature: 293.15 - canMix: True canReact: True maxVol: 200 name: null @@ -2233,7 +2228,6 @@ entities: solutions: beaker: temperature: 293.15 - canMix: True canReact: True maxVol: 200 name: null @@ -2250,7 +2244,6 @@ entities: solutions: beaker: temperature: 293.15 - canMix: True canReact: True maxVol: 75 name: null @@ -2289,7 +2282,6 @@ entities: solutions: beaker: temperature: 293.15 - canMix: True canReact: True maxVol: 100 name: null @@ -2306,7 +2298,6 @@ entities: solutions: beaker: temperature: 293.15 - canMix: True canReact: True maxVol: 100 name: null diff --git a/Resources/Maps/Salvage/DeltaV/DV-laundromat-chunk.yml b/Resources/Maps/Salvage/DeltaV/DV-laundromat-chunk.yml index af4c48bb12f..b15a0bc9312 100644 --- a/Resources/Maps/Salvage/DeltaV/DV-laundromat-chunk.yml +++ b/Resources/Maps/Salvage/DeltaV/DV-laundromat-chunk.yml @@ -3471,7 +3471,6 @@ entities: solutions: beaker: temperature: 293.15 - canMix: True canReact: True maxVol: 200 name: null @@ -3492,7 +3491,6 @@ entities: solutions: beaker: temperature: 293.15 - canMix: True canReact: True maxVol: 200 name: null @@ -3513,7 +3511,6 @@ entities: solutions: beaker: temperature: 293.15 - canMix: True canReact: True maxVol: 200 name: null @@ -3534,7 +3531,6 @@ entities: solutions: beaker: temperature: 293.15 - canMix: True canReact: True maxVol: 200 name: null diff --git a/Resources/Maps/Test/dev_map.yml b/Resources/Maps/Test/dev_map.yml index f00d7049a52..910a059ee72 100644 --- a/Resources/Maps/Test/dev_map.yml +++ b/Resources/Maps/Test/dev_map.yml @@ -4358,7 +4358,6 @@ entities: solutions: absorbed: temperature: 293.15 - canMix: False canReact: True maxVol: 50 name: null diff --git a/Resources/Maps/arena.yml b/Resources/Maps/arena.yml index 99653f5a280..8114998f74c 100644 --- a/Resources/Maps/arena.yml +++ b/Resources/Maps/arena.yml @@ -18098,7 +18098,6 @@ entities: solutions: beaker: temperature: 293.15 - canMix: True canReact: True maxVol: 50 name: null @@ -71554,7 +71553,6 @@ entities: solutions: drink: temperature: 293.15 - canMix: True canReact: True maxVol: 20 name: null @@ -120193,7 +120191,6 @@ entities: solutions: beaker: temperature: 293.15 - canMix: True canReact: True maxVol: 200 name: null @@ -120650,7 +120647,6 @@ entities: solutions: beaker: temperature: 293.15 - canMix: True canReact: True maxVol: 100 name: null diff --git a/Resources/Maps/asterisk.yml b/Resources/Maps/asterisk.yml index ac06ebba4e9..7d18001c54d 100644 --- a/Resources/Maps/asterisk.yml +++ b/Resources/Maps/asterisk.yml @@ -7451,7 +7451,7 @@ entities: - type: Transform pos: -52.5,-20.5 parent: 2 -- proto: BodyBag_Folded +- proto: BodyBagFolded entities: - uid: 7103 components: @@ -29385,7 +29385,6 @@ entities: solutions: drink: temperature: 293.15 - canMix: True canReact: True maxVol: 20 name: null @@ -29404,7 +29403,6 @@ entities: solutions: drink: temperature: 293.15 - canMix: True canReact: True maxVol: 20 name: null diff --git a/Resources/Maps/edge.yml b/Resources/Maps/edge.yml index d5d897da5a5..9286b30f01f 100644 --- a/Resources/Maps/edge.yml +++ b/Resources/Maps/edge.yml @@ -10626,7 +10626,6 @@ entities: solutions: beaker: temperature: 293.15 - canMix: True canReact: True maxVol: 50 name: null @@ -46083,7 +46082,6 @@ entities: solutions: drink: temperature: 293.15 - canMix: True canReact: True maxVol: 20 name: null @@ -46102,7 +46100,6 @@ entities: solutions: drink: temperature: 293.15 - canMix: True canReact: True maxVol: 20 name: null @@ -46121,7 +46118,6 @@ entities: solutions: drink: temperature: 293.15 - canMix: True canReact: True maxVol: 20 name: null @@ -46165,7 +46161,6 @@ entities: solutions: drink: temperature: 293.15 - canMix: True canReact: True maxVol: 20 name: null @@ -46184,7 +46179,6 @@ entities: solutions: drink: temperature: 293.15 - canMix: True canReact: True maxVol: 20 name: null @@ -46206,7 +46200,6 @@ entities: solutions: drink: temperature: 293.15 - canMix: True canReact: True maxVol: 20 name: null @@ -46225,7 +46218,6 @@ entities: solutions: drink: temperature: 293.15 - canMix: True canReact: True maxVol: 20 name: null @@ -78769,7 +78761,6 @@ entities: solutions: beaker: temperature: 293.15 - canMix: True canReact: True maxVol: 200 name: null @@ -78788,7 +78779,6 @@ entities: solutions: beaker: temperature: 293.15 - canMix: True canReact: True maxVol: 200 name: null diff --git a/Resources/Maps/hammurabi.yml b/Resources/Maps/hammurabi.yml index 05cac899feb..ad27115d383 100644 --- a/Resources/Maps/hammurabi.yml +++ b/Resources/Maps/hammurabi.yml @@ -28593,7 +28593,6 @@ entities: solutions: drink: temperature: 293.15 - canMix: True canReact: True maxVol: 30 name: null @@ -28611,7 +28610,6 @@ entities: solutions: drink: temperature: 293.15 - canMix: True canReact: True maxVol: 30 name: null @@ -28664,7 +28662,6 @@ entities: solutions: beaker: temperature: 293.15 - canMix: True canReact: True maxVol: 50 name: null @@ -28680,7 +28677,6 @@ entities: solutions: beaker: temperature: 293.15 - canMix: True canReact: True maxVol: 50 name: null @@ -28696,7 +28692,6 @@ entities: solutions: beaker: temperature: 293.15 - canMix: True canReact: True maxVol: 50 name: null @@ -84460,7 +84455,6 @@ entities: solutions: drink: temperature: 293.15 - canMix: True canReact: True maxVol: 30 name: null @@ -108459,7 +108453,6 @@ entities: solutions: drink: temperature: 293.15 - canMix: True canReact: True maxVol: 20 name: null @@ -192407,7 +192400,6 @@ entities: solutions: beaker: temperature: 293.15 - canMix: True canReact: True maxVol: 200 name: null @@ -192423,7 +192415,6 @@ entities: solutions: beaker: temperature: 293.15 - canMix: True canReact: True maxVol: 200 name: null @@ -192439,7 +192430,6 @@ entities: solutions: beaker: temperature: 293.15 - canMix: True canReact: True maxVol: 200 name: null @@ -192455,7 +192445,6 @@ entities: solutions: beaker: temperature: 293.15 - canMix: True canReact: True maxVol: 200 name: null @@ -192471,7 +192460,6 @@ entities: solutions: beaker: temperature: 293.15 - canMix: True canReact: True maxVol: 200 name: null @@ -192487,7 +192475,6 @@ entities: solutions: beaker: temperature: 293.15 - canMix: True canReact: True maxVol: 200 name: null diff --git a/Resources/Maps/hive.yml b/Resources/Maps/hive.yml index f5a25ca4292..4129c472bae 100644 --- a/Resources/Maps/hive.yml +++ b/Resources/Maps/hive.yml @@ -18525,7 +18525,6 @@ entities: solutions: beaker: temperature: 293.15 - canMix: True canReact: True maxVol: 50 name: null @@ -56359,7 +56358,6 @@ entities: solutions: drink: temperature: 293.15 - canMix: True canReact: True maxVol: 30 name: null @@ -71726,7 +71724,6 @@ entities: solutions: drink: temperature: 293.15 - canMix: True canReact: True maxVol: 20 name: null @@ -71743,7 +71740,6 @@ entities: solutions: drink: temperature: 293.15 - canMix: True canReact: True maxVol: 20 name: null @@ -71760,7 +71756,6 @@ entities: solutions: drink: temperature: 293.15 - canMix: True canReact: True maxVol: 20 name: null @@ -71863,7 +71858,6 @@ entities: solutions: drink: temperature: 293.15 - canMix: True canReact: True maxVol: 10 name: null @@ -122127,7 +122121,6 @@ entities: solutions: beaker: temperature: 293.15 - canMix: True canReact: True maxVol: 200 name: null @@ -122144,7 +122137,6 @@ entities: solutions: beaker: temperature: 293.15 - canMix: True canReact: True maxVol: 200 name: null @@ -122161,7 +122153,6 @@ entities: solutions: beaker: temperature: 293.15 - canMix: True canReact: True maxVol: 200 name: null @@ -122185,7 +122176,6 @@ entities: solutions: beaker: temperature: 293.15 - canMix: True canReact: True maxVol: 200 name: null diff --git a/Resources/Maps/lighthouse.yml b/Resources/Maps/lighthouse.yml index c7e2a5bc532..2a3835ec510 100644 --- a/Resources/Maps/lighthouse.yml +++ b/Resources/Maps/lighthouse.yml @@ -50,6 +50,7 @@ tilemap: 88: FloorShuttlePurple 90: FloorShuttleWhite 94: FloorSteel + 1: FloorSteelDiagonal 101: FloorSteelDirty 105: FloorSteelMono 106: FloorSteelOffset @@ -61,6 +62,7 @@ tilemap: 118: FloorWhiteMono 119: FloorWhiteOffset 123: FloorWood + 3: FloorWoodLarge 125: FloorWoodTile 126: Lattice 127: Plating @@ -85,15 +87,15 @@ entities: version: 6 -1,0: ind: -1,0 - tiles: XgAAAAABXgAAAAABXgAAAAADXgAAAAAAXgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAANAAAAAAANAAAAAAANAAAAAAABwAAAAAAMAAAAAAAXgAAAAADXgAAAAADXgAAAAABXgAAAAACXgAAAAABXgAAAAABXgAAAAABXgAAAAADXgAAAAADXgAAAAACXgAAAAABfwAAAAAAUAAAAAAAUAAAAAAAXgAAAAAAXgAAAAABXgAAAAADXgAAAAAAXgAAAAACXgAAAAADXgAAAAABXgAAAAADXgAAAAACXgAAAAACMAAAAAACXgAAAAABXgAAAAADXgAAAAAAXgAAAAAAXgAAAAADXgAAAAACfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAXgAAAAACXgAAAAAAXgAAAAACXgAAAAADXgAAAAAAXgAAAAADXgAAAAAAXgAAAAADXgAAAAACXgAAAAACXgAAAAADXgAAAAADfwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAABUAAAAAAAXgAAAAAAfwAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAATwAAAAACXgAAAAACIAAAAAABfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAIAAAAAAATwAAAAABIAAAAAACXgAAAAADXgAAAAACXgAAAAABXgAAAAAAXgAAAAABXgAAAAADLAAAAAAALAAAAAAALAAAAAAALAAAAAAALAAAAAAAfwAAAAAATwAAAAABXgAAAAAAIAAAAAABUAAAAAAAXgAAAAACXgAAAAACXgAAAAADXgAAAAAAfwAAAAAAXgAAAAADLAAAAAAALAAAAAAALAAAAAAALAAAAAAALAAAAAAALAAAAAAAXgAAAAADIAAAAAADTwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAACfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAATwAAAAADXgAAAAADIAAAAAADDgAAAAADDgAAAAABDgAAAAACDgAAAAADDgAAAAAADgAAAAAAXgAAAAADUAAAAAAAIAAAAAABXgAAAAACIAAAAAACTwAAAAABIAAAAAABXgAAAAADIAAAAAADTwAAAAAADgAAAAADDgAAAAAADgAAAAAADgAAAAABDgAAAAADDgAAAAAAXgAAAAACXgAAAAAAXgAAAAADTwAAAAABXgAAAAADIAAAAAADXgAAAAAATwAAAAABXgAAAAADIAAAAAADDgAAAAAADgAAAAABDgAAAAACDgAAAAAADgAAAAADDgAAAAACXgAAAAADfwAAAAAAIAAAAAABXgAAAAACIAAAAAAATwAAAAAAIAAAAAACXgAAAAADIAAAAAACTwAAAAACIAAAAAACXgAAAAABIAAAAAABTwAAAAAAIAAAAAAAXgAAAAADXgAAAAAAXgAAAAAAXgAAAAAATwAAAAADXgAAAAABIAAAAAADXgAAAAABTwAAAAADXgAAAAADIAAAAAACXgAAAAABTwAAAAADXgAAAAAAIAAAAAAAXgAAAAAATwAAAAACXgAAAAAAUAAAAAAAIAAAAAAAXgAAAAABIAAAAAACTwAAAAABIAAAAAADXgAAAAABIAAAAAABTwAAAAAAIAAAAAAAXgAAAAAAIAAAAAACTwAAAAADIAAAAAAAXgAAAAABXgAAAAADfwAAAAAAfwAAAAAATwAAAAACXgAAAAACIAAAAAAAXgAAAAACTwAAAAABXgAAAAAAIAAAAAAAXgAAAAACTwAAAAADXgAAAAABIAAAAAAAXgAAAAADTwAAAAAA + tiles: XgAAAAABXgAAAAABXgAAAAADXgAAAAAAXgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAANAAAAAAANAAAAAAANAAAAAAABwAAAAAAMAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAXgAAAAABXgAAAAABXgAAAAABXgAAAAADXgAAAAADXgAAAAACXgAAAAABfwAAAAAAUAAAAAAAUAAAAAAAXgAAAAAAXgAAAAABXgAAAAADXgAAAAAAXgAAAAACAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAMAAAAAACAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAXgAAAAACXgAAAAAAXgAAAAACXgAAAAADXgAAAAAAXgAAAAADXgAAAAAAXgAAAAADXgAAAAACXgAAAAACXgAAAAADXgAAAAADfwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAABUAAAAAAAXgAAAAAAfwAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAATwAAAAACXgAAAAACIAAAAAABfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAIAAAAAAATwAAAAABIAAAAAACXgAAAAADXgAAAAACXgAAAAABXgAAAAAAXgAAAAABXgAAAAADLAAAAAAALAAAAAAALAAAAAAALAAAAAAALAAAAAAAfwAAAAAATwAAAAABXgAAAAAAIAAAAAABUAAAAAAAXgAAAAACXgAAAAACXgAAAAADXgAAAAAAfwAAAAAAXgAAAAADLAAAAAAALAAAAAAALAAAAAAALAAAAAAALAAAAAAALAAAAAAAXgAAAAADIAAAAAADTwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAACfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAATwAAAAADXgAAAAADIAAAAAADDgAAAAADDgAAAAABDgAAAAACDgAAAAADDgAAAAAADgAAAAAAXgAAAAADUAAAAAAAIAAAAAABXgAAAAACIAAAAAACTwAAAAABIAAAAAABXgAAAAADIAAAAAADTwAAAAAADgAAAAADDgAAAAAADgAAAAAADgAAAAABDgAAAAADDgAAAAAAXgAAAAACXgAAAAAAXgAAAAADTwAAAAABXgAAAAADIAAAAAADXgAAAAAATwAAAAABXgAAAAADIAAAAAADDgAAAAAADgAAAAABDgAAAAACDgAAAAAADgAAAAADDgAAAAACXgAAAAADfwAAAAAAIAAAAAABXgAAAAACIAAAAAAATwAAAAAAIAAAAAACXgAAAAADIAAAAAACTwAAAAACIAAAAAACXgAAAAABIAAAAAABTwAAAAAAIAAAAAAAXgAAAAADXgAAAAAAXgAAAAAAXgAAAAAATwAAAAADXgAAAAABIAAAAAADXgAAAAABTwAAAAADXgAAAAADIAAAAAACXgAAAAABTwAAAAADXgAAAAAAIAAAAAAAXgAAAAAATwAAAAACXgAAAAAAUAAAAAAAIAAAAAAAXgAAAAABIAAAAAACTwAAAAABIAAAAAADXgAAAAABIAAAAAABTwAAAAAAIAAAAAAAXgAAAAAAIAAAAAACTwAAAAADIAAAAAAAXgAAAAABXgAAAAADfwAAAAAAfwAAAAAATwAAAAACXgAAAAACIAAAAAAAXgAAAAACTwAAAAABXgAAAAAAIAAAAAAAXgAAAAACTwAAAAADXgAAAAABIAAAAAAAXgAAAAADTwAAAAAA version: 6 0,0: ind: 0,0 - tiles: BwAAAAAABwAAAAAANAAAAAAANAAAAAAANAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAewAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAXgAAAAACXgAAAAACXgAAAAADXgAAAAADXgAAAAACXgAAAAACXgAAAAADXgAAAAADXgAAAAAAXgAAAAAAXgAAAAADXgAAAAABXgAAAAACXgAAAAACXgAAAAABXgAAAAADXgAAAAACXgAAAAAAMAAAAAACXgAAAAACXgAAAAACXgAAAAADXgAAAAADXgAAAAABXgAAAAAAMAAAAAABXgAAAAABXgAAAAAAXgAAAAABXgAAAAADXgAAAAACXgAAAAADXgAAAAACXgAAAAABXgAAAAABXgAAAAAAXgAAAAAAXgAAAAAAXgAAAAACXgAAAAADXgAAAAACXgAAAAACXgAAAAADMgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAABXgAAAAAAXgAAAAABfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAABMAAAAAACXgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAABMAAAAAACXgAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAbQAAAAAAbQAAAAAAbQAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAADMAAAAAAAXgAAAAACDgAAAAABfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAbQAAAAAAfwAAAAAAfwAAAAAAFwAAAAAAfwAAAAAAHAAAAAAAfwAAAAAAXgAAAAADXgAAAAADXgAAAAADDgAAAAADDgAAAAACfwAAAAAAewAAAAADewAAAAABfwAAAAAAbQAAAAAAfwAAAAAAFwAAAAAAFwAAAAAAFwAAAAAAFwAAAAAAfwAAAAAAXgAAAAADXgAAAAACXgAAAAAADgAAAAABDgAAAAABDgAAAAADewAAAAAAewAAAAABfwAAAAAAbQAAAAAAfwAAAAAAFwAAAAAAFwAAAAAAFwAAAAAAFwAAAAAAfwAAAAAAXgAAAAADXgAAAAAAXgAAAAAADgAAAAADDgAAAAADfwAAAAAAewAAAAABewAAAAABfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAHAAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAXgAAAAADIAAAAAADTwAAAAACfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAfwAAAAAAfwAAAAAAXgAAAAADXgAAAAABIAAAAAAAXgAAAAAATwAAAAACXgAAAAABXgAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAUAAAAAAAXgAAAAAAIAAAAAACTwAAAAABIAAAAAABXgAAAAACIAAAAAABUAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAUAAAAAAAXgAAAAABXgAAAAABIAAAAAAAXgAAAAAATwAAAAACXgAAAAABfwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAfwAAAAAAfwAAAAAAXgAAAAAB + tiles: BwAAAAAABwAAAAAANAAAAAAANAAAAAAANAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAewAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAXgAAAAACXgAAAAACXgAAAAADXgAAAAADXgAAAAACXgAAAAACXgAAAAADXgAAAAADXgAAAAAAXgAAAAAAXgAAAAADAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAMAAAAAACAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAMAAAAAABAQAAAAAAXgAAAAAAXgAAAAABXgAAAAADXgAAAAACXgAAAAADXgAAAAACXgAAAAABXgAAAAABXgAAAAAAXgAAAAAAXgAAAAAAXgAAAAACXgAAAAADXgAAAAACAQAAAAAAXgAAAAADMgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAABAQAAAAAAXgAAAAABfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAABMAAAAAACXgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAABMAAAAAACXgAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAbQAAAAAAbQAAAAAAbQAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAADMAAAAAAAXgAAAAACDgAAAAABfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAbQAAAAAAfwAAAAAAfwAAAAAAFwAAAAAAfwAAAAAAHAAAAAAAfwAAAAAAXgAAAAADAQAAAAAAXgAAAAADDgAAAAADDgAAAAACfwAAAAAAewAAAAADewAAAAABfwAAAAAAbQAAAAAAfwAAAAAAFwAAAAAAFwAAAAAAFwAAAAAAFwAAAAAAfwAAAAAAXgAAAAADAQAAAAAAXgAAAAAADgAAAAABDgAAAAABDgAAAAADewAAAAAAewAAAAABfwAAAAAAbQAAAAAAfwAAAAAAFwAAAAAAFwAAAAAAFwAAAAAAFwAAAAAAfwAAAAAAXgAAAAADAQAAAAAAAQAAAAAADgAAAAADDgAAAAADfwAAAAAAewAAAAABewAAAAABfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAHAAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAXgAAAAADIAAAAAADTwAAAAACfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAfwAAAAAAfwAAAAAAXgAAAAADXgAAAAABIAAAAAAAXgAAAAAATwAAAAACXgAAAAABXgAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAUAAAAAAAXgAAAAAAIAAAAAACTwAAAAABIAAAAAABXgAAAAACIAAAAAABUAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAUAAAAAAAXgAAAAABXgAAAAABIAAAAAAAXgAAAAAATwAAAAACXgAAAAABfwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAfwAAAAAAfwAAAAAAXgAAAAAB version: 6 -2,-1: ind: -2,-1 - tiles: fwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAACXgAAAAADXgAAAAAAXgAAAAADfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAIAAAAAAAIAAAAAAARQAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAfwAAAAAAIAAAAAAAIAAAAAAAIAAAAAAAIAAAAAAAIAAAAAAARwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAfwAAAAAAIAAAAAAAIAAAAAAAIAAAAAAAIAAAAAAAIAAAAAAARwAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAXgAAAAAAXgAAAAADfwAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAIAAAAAAAIAAAAAAAIAAAAAACRwAAAAAAIAAAAAABIAAAAAABIAAAAAABIAAAAAAAfwAAAAAAXgAAAAABXgAAAAAAXgAAAAAAfwAAAAAAIAAAAAADIAAAAAACIAAAAAACIAAAAAACIAAAAAADIAAAAAAARwAAAAAAIAAAAAAAIAAAAAADIAAAAAAAIAAAAAAAfwAAAAAAXgAAAAABXgAAAAACXgAAAAACfwAAAAAAIAAAAAADIAAAAAADIAAAAAACIAAAAAAAIAAAAAABIAAAAAABfwAAAAAAfwAAAAAAUAAAAAAAXgAAAAABfwAAAAAAfwAAAAAAXgAAAAADXgAAAAAAXgAAAAADfwAAAAAAIAAAAAACIAAAAAACIAAAAAABIAAAAAABIAAAAAAAfwAAAAAAcQAAAAACfwAAAAAAXgAAAAACXgAAAAADXgAAAAABXgAAAAADXgAAAAADXgAAAAADXgAAAAACUAAAAAAAIAAAAAADIAAAAAAAIAAAAAACIAAAAAAAIAAAAAAAfwAAAAAAcQAAAAAAfwAAAAAAXgAAAAACXgAAAAADXgAAAAADXgAAAAADXgAAAAABMAAAAAADXgAAAAAAXgAAAAAAIAAAAAADIAAAAAADIAAAAAADIAAAAAABIAAAAAAAIAAAAAAAcQAAAAADfwAAAAAAXgAAAAAAXgAAAAABXgAAAAACXgAAAAACXgAAAAAAXgAAAAABXgAAAAACUAAAAAAAIAAAAAADIAAAAAADIAAAAAACIAAAAAADIAAAAAAAIAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAXgAAAAACXgAAAAADUAAAAAAAIAAAAAACIAAAAAACIAAAAAAAIAAAAAADIAAAAAACIAAAAAADXgAAAAACXgAAAAABXgAAAAAAXgAAAAADXgAAAAADXgAAAAACXgAAAAABXgAAAAAAXgAAAAACfwAAAAAAIAAAAAABIAAAAAACIAAAAAAAIAAAAAADIAAAAAADIAAAAAACXgAAAAACXgAAAAADXgAAAAABXgAAAAADXgAAAAABfwAAAAAAXgAAAAADXgAAAAADXgAAAAACfwAAAAAAfwAAAAAAfwAAAAAAIAAAAAADIAAAAAACIAAAAAAAIAAAAAACXgAAAAABXgAAAAADXgAAAAAAXgAAAAAAXgAAAAACfwAAAAAAXgAAAAADXgAAAAADXgAAAAAAXgAAAAADXgAAAAADfwAAAAAAIAAAAAADIAAAAAACIAAAAAAAIAAAAAACXgAAAAAAXgAAAAACXgAAAAADXgAAAAACXgAAAAABXgAAAAABXgAAAAACXgAAAAADXgAAAAADXgAAAAACXgAAAAADfwAAAAAAXgAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAACXgAAAAACXgAAAAADXgAAAAACXgAAAAADXgAAAAADXgAAAAAAXgAAAAADXgAAAAABfwAAAAAA + tiles: fwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAACXgAAAAADAQAAAAAAXgAAAAADfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAIAAAAAAAIAAAAAAARQAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAZQAAAAAAZQAAAAAAAQAAAAAAAQAAAAAAZQAAAAAAfwAAAAAAIAAAAAAAIAAAAAAAIAAAAAAAIAAAAAAAIAAAAAAARwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAZQAAAAAAZQAAAAAAAQAAAAAAZQAAAAAAZQAAAAAAfwAAAAAAIAAAAAAAIAAAAAAAIAAAAAAAIAAAAAAAIAAAAAAARwAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAAQAAAAAAXgAAAAADfwAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAIAAAAAAAIAAAAAAAIAAAAAACRwAAAAAAIAAAAAABIAAAAAABIAAAAAABIAAAAAAAfwAAAAAAXgAAAAABAQAAAAAAXgAAAAAAfwAAAAAAIAAAAAADIAAAAAACIAAAAAACIAAAAAACIAAAAAADIAAAAAAARwAAAAAAIAAAAAAAIAAAAAADIAAAAAAAIAAAAAAAfwAAAAAAXgAAAAABAQAAAAAAXgAAAAACfwAAAAAAIAAAAAADIAAAAAADIAAAAAACIAAAAAAAIAAAAAABIAAAAAABfwAAAAAAfwAAAAAAUAAAAAAAXgAAAAABfwAAAAAAfwAAAAAAXgAAAAADAQAAAAAAXgAAAAADfwAAAAAAIAAAAAACIAAAAAACIAAAAAABIAAAAAABIAAAAAAAfwAAAAAAcQAAAAACfwAAAAAAXgAAAAACXgAAAAADXgAAAAABXgAAAAADXgAAAAADAQAAAAAAXgAAAAACUAAAAAAAIAAAAAADIAAAAAAAIAAAAAACIAAAAAAAIAAAAAAAfwAAAAAAcQAAAAAAfwAAAAAAXgAAAAACXgAAAAADXgAAAAADXgAAAAADXgAAAAABMAAAAAADXgAAAAAAXgAAAAAAIAAAAAADIAAAAAADIAAAAAADIAAAAAABIAAAAAAAIAAAAAAAcQAAAAADfwAAAAAAXgAAAAAAXgAAAAABXgAAAAACXgAAAAACXgAAAAAAAQAAAAAAXgAAAAACUAAAAAAAIAAAAAADIAAAAAADIAAAAAACIAAAAAADIAAAAAAAIAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAAQAAAAAAXgAAAAADUAAAAAAAIAAAAAACIAAAAAACIAAAAAAAIAAAAAADIAAAAAACIAAAAAADXgAAAAACXgAAAAABXgAAAAAAXgAAAAADXgAAAAADXgAAAAACXgAAAAABAQAAAAAAXgAAAAACfwAAAAAAIAAAAAABIAAAAAACIAAAAAAAIAAAAAADIAAAAAADIAAAAAACXgAAAAACXgAAAAADXgAAAAABXgAAAAADXgAAAAABfwAAAAAAXgAAAAADAQAAAAAAXgAAAAACfwAAAAAAfwAAAAAAfwAAAAAAIAAAAAADIAAAAAACIAAAAAAAIAAAAAACXgAAAAABXgAAAAADXgAAAAAAXgAAAAAAXgAAAAACfwAAAAAAXgAAAAADAQAAAAAAXgAAAAAAXgAAAAADXgAAAAADfwAAAAAAIAAAAAADIAAAAAACIAAAAAAAIAAAAAACXgAAAAAAXgAAAAACXgAAAAADXgAAAAACXgAAAAABXgAAAAABXgAAAAACAQAAAAAAXgAAAAADXgAAAAACXgAAAAADfwAAAAAAXgAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAACAQAAAAAAXgAAAAADXgAAAAACXgAAAAADXgAAAAADXgAAAAAAXgAAAAADXgAAAAABfwAAAAAA version: 6 -1,-2: ind: -1,-2 @@ -101,27 +103,27 @@ entities: version: 6 0,-2: ind: 0,-2 - tiles: BwAAAAABBwAAAAABBwAAAAACBwAAAAABBwAAAAABBwAAAAAABwAAAAAABwAAAAACfwAAAAAAUAAAAAAAXgAAAAADfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAXgAAAAADCwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAABwAAAAABBwAAAAACfwAAAAAAXgAAAAADXgAAAAABXgAAAAACXgAAAAAAfwAAAAAAXgAAAAABXgAAAAABCwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAABwAAAAACfwAAAAAAXgAAAAAAXgAAAAAAMAAAAAADXgAAAAACfwAAAAAAXgAAAAADXgAAAAACCwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAABwAAAAABfwAAAAAAXgAAAAABXgAAAAADXgAAAAABXgAAAAAAXgAAAAABXgAAAAADXgAAAAABCwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAABwAAAAAAfwAAAAAAXgAAAAACXgAAAAAAXgAAAAABMgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAABwAAAAABCwAAAAAABwAAAAAABwAAAAABfwAAAAAAXgAAAAADXgAAAAAAXgAAAAAAMgAAAAAACwAAAAAACwAAAAAACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAfwAAAAAACwAAAAAABwAAAAAABwAAAAABfwAAAAAAXgAAAAADXgAAAAACXgAAAAABCwAAAAAACwAAAAAACwAAAAAACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAABXgAAAAABXgAAAAACMgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAXgAAAAADXgAAAAACMgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAXgAAAAABXgAAAAAAXgAAAAACXgAAAAABXgAAAAADQwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAADXgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAXgAAAAABXgAAAAAAXgAAAAABewAAAAACewAAAAADewAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAABXgAAAAADewAAAAACewAAAAACfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAewAAAAADfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAABXgAAAAADfwAAAAAAfwAAAAAAfwAAAAAAewAAAAAAfwAAAAAAfwAAAAAAewAAAAADewAAAAADewAAAAABewAAAAACfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAADXgAAAAABewAAAAABewAAAAACewAAAAABewAAAAACewAAAAABfwAAAAAAfwAAAAAAewAAAAAAewAAAAACewAAAAACfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAACXgAAAAAC + tiles: BwAAAAABBwAAAAABBwAAAAACBwAAAAABBwAAAAABBwAAAAAABwAAAAAABwAAAAACfwAAAAAAUAAAAAAAXgAAAAADfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAXgAAAAADCwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAABwAAAAABBwAAAAACfwAAAAAAXgAAAAADXgAAAAABXgAAAAACXgAAAAAAfwAAAAAAXgAAAAABXgAAAAABCwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAABwAAAAACfwAAAAAAXgAAAAAAXgAAAAAAMAAAAAADXgAAAAACfwAAAAAAXgAAAAADXgAAAAACCwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAABwAAAAABfwAAAAAAXgAAAAABXgAAAAADAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAABwAAAAAAfwAAAAAAXgAAAAACXgAAAAAAXgAAAAABMgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAABwAAAAABCwAAAAAABwAAAAAABwAAAAABfwAAAAAAXgAAAAADXgAAAAAAXgAAAAAAMgAAAAAACwAAAAAACwAAAAAACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAfwAAAAAACwAAAAAABwAAAAAABwAAAAABfwAAAAAAXgAAAAADXgAAAAACXgAAAAABCwAAAAAACwAAAAAACwAAAAAACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAABXgAAAAABXgAAAAACMgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAXgAAAAADXgAAAAACMgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAXgAAAAABXgAAAAAAXgAAAAACXgAAAAABXgAAAAADQwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAADXgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAXgAAAAABXgAAAAAAXgAAAAABewAAAAACewAAAAADewAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAABXgAAAAADewAAAAACewAAAAACfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAewAAAAADfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAABXgAAAAADfwAAAAAAfwAAAAAAfwAAAAAAewAAAAAAfwAAAAAAfwAAAAAAewAAAAADewAAAAADewAAAAABewAAAAACfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAADXgAAAAABewAAAAABewAAAAACewAAAAABewAAAAACewAAAAABfwAAAAAAfwAAAAAAewAAAAAAewAAAAACewAAAAACfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAACXgAAAAAC version: 6 -2,-2: ind: -2,-2 - tiles: MgAAAAAAMAAAAAAAXgAAAAADfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAcQAAAAABcQAAAAAAMgAAAAAAMAAAAAACXgAAAAADXgAAAAACXgAAAAADXgAAAAACXgAAAAACXgAAAAACfwAAAAAAcQAAAAABcQAAAAAAcQAAAAADcQAAAAAAfwAAAAAAcQAAAAABUAAAAAAAMgAAAAAAMAAAAAAAXgAAAAABXgAAAAABXgAAAAAAMAAAAAAAXgAAAAAAXgAAAAACfwAAAAAAcQAAAAADcQAAAAACcQAAAAADcQAAAAACcQAAAAADcQAAAAAAcQAAAAACMgAAAAAAMAAAAAACXgAAAAAAXgAAAAAAXgAAAAACXgAAAAAAXgAAAAAAXgAAAAABfwAAAAAAcQAAAAAAcQAAAAACcQAAAAADcQAAAAABcQAAAAABcQAAAAACNQAAAAADMAAAAAADMAAAAAADXgAAAAACXgAAAAACXgAAAAABXgAAAAADXgAAAAAAXgAAAAABfwAAAAAAcQAAAAAAcQAAAAAAcQAAAAABcQAAAAABcQAAAAACcQAAAAABNQAAAAAAXgAAAAAAXgAAAAABXgAAAAACUAAAAAAAXgAAAAADXgAAAAAAXgAAAAACUAAAAAAAfwAAAAAAUAAAAAAAXgAAAAABXgAAAAABUAAAAAAAfwAAAAAAfwAAAAAAIAAAAAADXgAAAAACXgAAAAADXgAAAAACfwAAAAAAXgAAAAAAXgAAAAADXgAAAAABXgAAAAACXgAAAAABXgAAAAAAXgAAAAADXgAAAAABXgAAAAADIAAAAAACIAAAAAACIAAAAAACMAAAAAACXgAAAAAAXgAAAAACfwAAAAAAXgAAAAACMAAAAAADXgAAAAABXgAAAAABMAAAAAACXgAAAAACXgAAAAADXgAAAAAAXgAAAAADIAAAAAABIAAAAAABIAAAAAADXgAAAAAAXgAAAAABXgAAAAAAfwAAAAAAXgAAAAACXgAAAAADXgAAAAABXgAAAAACXgAAAAABXgAAAAADXgAAAAACXgAAAAADXgAAAAAAUAAAAAAAIAAAAAAAIAAAAAABfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAADXgAAAAAAXgAAAAABXgAAAAAAXgAAAAACXgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAXgAAAAAAXgAAAAACXgAAAAADXgAAAAACXgAAAAABfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAACXgAAAAABXgAAAAABfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAbQAAAAAAbQAAAAAAbQAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAMAAAAAACXgAAAAACfwAAAAAAIAAAAAAAIAAAAAAAIAAAAAAAIAAAAAADIAAAAAABfwAAAAAAbQAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAABXgAAAAAAXgAAAAADfwAAAAAAIAAAAAAAIAAAAAAAIAAAAAAAIAAAAAACIAAAAAABfwAAAAAAbQAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAXgAAAAACXgAAAAADfwAAAAAAIAAAAAAAIAAAAAAAIAAAAAAAIAAAAAAAIAAAAAADfwAAAAAAbQAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAXgAAAAACXgAAAAADXgAAAAABXgAAAAAAfwAAAAAAIAAAAAAAIAAAAAAAIAAAAAAAIAAAAAAAIAAAAAAA + tiles: MgAAAAAAMAAAAAAAXgAAAAADfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAcQAAAAABcQAAAAAAMgAAAAAAMAAAAAACXgAAAAADXgAAAAACXgAAAAADXgAAAAACXgAAAAACXgAAAAACfwAAAAAAcQAAAAABcQAAAAAAcQAAAAADcQAAAAAAfwAAAAAAcQAAAAABUAAAAAAAMgAAAAAAMAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAMAAAAAAAXgAAAAAAXgAAAAACfwAAAAAAcQAAAAADcQAAAAACcQAAAAADcQAAAAACcQAAAAADcQAAAAAAcQAAAAACMgAAAAAAMAAAAAACXgAAAAAAXgAAAAAAXgAAAAACAQAAAAAAXgAAAAAAXgAAAAABfwAAAAAAcQAAAAAAcQAAAAACcQAAAAADcQAAAAABcQAAAAABcQAAAAACNQAAAAADMAAAAAADMAAAAAADXgAAAAACXgAAAAACXgAAAAABAQAAAAAAXgAAAAAAXgAAAAABfwAAAAAAcQAAAAAAcQAAAAAAcQAAAAABcQAAAAABcQAAAAACcQAAAAABNQAAAAAAAQAAAAAAXgAAAAABXgAAAAACUAAAAAAAXgAAAAADAQAAAAAAXgAAAAACUAAAAAAAfwAAAAAAUAAAAAAAXgAAAAABXgAAAAABUAAAAAAAfwAAAAAAfwAAAAAAIAAAAAADAQAAAAAAXgAAAAADXgAAAAACfwAAAAAAXgAAAAAAAQAAAAAAXgAAAAABXgAAAAACXgAAAAABXgAAAAAAXgAAAAADXgAAAAABXgAAAAADIAAAAAACIAAAAAACIAAAAAACMAAAAAACXgAAAAAAXgAAAAACfwAAAAAAXgAAAAACMAAAAAADAQAAAAAAAQAAAAAAMAAAAAACXgAAAAACXgAAAAADXgAAAAAAXgAAAAADIAAAAAABIAAAAAABIAAAAAADXgAAAAAAXgAAAAABXgAAAAAAfwAAAAAAXgAAAAACXgAAAAADXgAAAAABXgAAAAACAQAAAAAAXgAAAAADXgAAAAACXgAAAAADXgAAAAAAUAAAAAAAIAAAAAAAIAAAAAABfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAADAQAAAAAAXgAAAAABXgAAAAAAXgAAAAACXgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAAQAAAAAAXgAAAAACXgAAAAADXgAAAAACXgAAAAABfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAACAQAAAAAAXgAAAAABfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAbQAAAAAAbQAAAAAAbQAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAMAAAAAACXgAAAAACfwAAAAAAIAAAAAAAIAAAAAAAIAAAAAAAIAAAAAADIAAAAAABfwAAAAAAbQAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAABAQAAAAAAXgAAAAADfwAAAAAAIAAAAAAAIAAAAAAAIAAAAAAAIAAAAAACIAAAAAABfwAAAAAAbQAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAAQAAAAAAXgAAAAADfwAAAAAAIAAAAAAAIAAAAAAAIAAAAAAAIAAAAAAAIAAAAAADfwAAAAAAbQAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAXgAAAAACXgAAAAADAQAAAAAAXgAAAAAAfwAAAAAAIAAAAAAAIAAAAAAAIAAAAAAAIAAAAAAAIAAAAAAA version: 6 1,-1: ind: 1,-1 - tiles: XgAAAAABXgAAAAABUAAAAAAAXgAAAAACMAAAAAABMAAAAAADXgAAAAABfwAAAAAAfwAAAAAAfwAAAAAAewAAAAABewAAAAACewAAAAABewAAAAADfwAAAAAAfwAAAAAAXgAAAAABUAAAAAAAfwAAAAAAXgAAAAADXgAAAAADXgAAAAADXgAAAAACfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAewAAAAACfwAAAAAAfwAAAAAAewAAAAACfwAAAAAAXgAAAAAAXgAAAAADfwAAAAAAfwAAAAAAXgAAAAACXgAAAAACXgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAABXgAAAAACXgAAAAAAfwAAAAAAfwAAAAAAXgAAAAABMAAAAAACfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfgAAAAAAXgAAAAADXgAAAAADXgAAAAACXgAAAAAAfwAAAAAAUAAAAAAAMAAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfgAAAAAAXgAAAAADXgAAAAADMAAAAAADXgAAAAACUAAAAAAAMgAAAAAACwAAAAAAMgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfgAAAAAAfwAAAAAAXgAAAAABXgAAAAAAXgAAAAABUAAAAAAAMgAAAAAACwAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfgAAAAAAfwAAAAAAXgAAAAAAXgAAAAAAXgAAAAABUAAAAAAAMgAAAAAACwAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAfgAAAAAAXgAAAAACXgAAAAABXgAAAAACXgAAAAAAXgAAAAADCwAAAAAACwAAAAAACwAAAAAACwAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAAAAAAAAAfwAAAAAAXgAAAAABXgAAAAAAXgAAAAAAXgAAAAADCwAAAAAACwAAAAAACwAAAAAACwAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAUAAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAXgAAAAABXgAAAAABXgAAAAAAUAAAAAAAMgAAAAAACwAAAAAAMgAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAAbQAAAAAAbQAAAAAAbQAAAAAAbQAAAAAAUAAAAAAAXgAAAAADXgAAAAABXgAAAAABUAAAAAAAMgAAAAAACwAAAAAAMgAAAAAAMgAAAAAAMgAAAAAACwAAAAAAMgAAAAAAbQAAAAAAbQAAAAAAbQAAAAAAbQAAAAAAUAAAAAAAXgAAAAABXgAAAAACXgAAAAAAUAAAAAAAMgAAAAAACwAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAUAAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAXgAAAAADMAAAAAAAXgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAfgAAAAAAfwAAAAAAXgAAAAADXgAAAAACXgAAAAACfwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAfgAAAAAAfwAAAAAAXgAAAAADXgAAAAABXgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfgAAAAAA + tiles: AQAAAAAAXgAAAAABUAAAAAAAXgAAAAACMAAAAAABMAAAAAADXgAAAAABfwAAAAAAfwAAAAAAfwAAAAAAewAAAAABewAAAAACewAAAAABewAAAAADfwAAAAAAfwAAAAAAAQAAAAAAUAAAAAAAfwAAAAAAXgAAAAADXgAAAAADXgAAAAADXgAAAAACfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAewAAAAACfwAAAAAAfwAAAAAAewAAAAACfwAAAAAAAQAAAAAAXgAAAAADfwAAAAAAfwAAAAAAXgAAAAACXgAAAAACXgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAAQAAAAAAXgAAAAACXgAAAAAAfwAAAAAAfwAAAAAAXgAAAAABMAAAAAACfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAXgAAAAAAfwAAAAAAUAAAAAAAMAAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfgAAAAAAXgAAAAADXgAAAAADMAAAAAADXgAAAAACUAAAAAAAMgAAAAAACwAAAAAAMgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfgAAAAAAfwAAAAAAXgAAAAABAQAAAAAAXgAAAAABUAAAAAAAMgAAAAAACwAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfgAAAAAAfwAAAAAAXgAAAAAAAQAAAAAAXgAAAAABUAAAAAAAMgAAAAAACwAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAfgAAAAAAXgAAAAACXgAAAAABAQAAAAAAXgAAAAAAXgAAAAADCwAAAAAACwAAAAAACwAAAAAACwAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAAAAAAAAAfwAAAAAAXgAAAAABAQAAAAAAXgAAAAAAXgAAAAADCwAAAAAACwAAAAAACwAAAAAACwAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAUAAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAXgAAAAABAQAAAAAAXgAAAAAAUAAAAAAAMgAAAAAACwAAAAAAMgAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAAbQAAAAAAbQAAAAAAbQAAAAAAbQAAAAAAUAAAAAAAXgAAAAADAQAAAAAAXgAAAAABUAAAAAAAMgAAAAAACwAAAAAAMgAAAAAAMgAAAAAAMgAAAAAACwAAAAAAMgAAAAAAbQAAAAAAbQAAAAAAbQAAAAAAbQAAAAAAUAAAAAAAXgAAAAABAQAAAAAAXgAAAAAAUAAAAAAAMgAAAAAACwAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAUAAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAXgAAAAADMAAAAAAAXgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAfgAAAAAAfwAAAAAAXgAAAAADAQAAAAAAXgAAAAACfwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAfgAAAAAAfwAAAAAAXgAAAAADAQAAAAAAXgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfgAAAAAA version: 6 1,-2: ind: 1,-2 - tiles: MAAAAAADXgAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAVwAAAAAAfwAAAAAAWgAAAAAAWgAAAAAAWgAAAAAAWgAAAAAAVQAAAAAAVQAAAAAAWAAAAAAAXgAAAAAAXgAAAAABfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAVwAAAAAAfwAAAAAAWgAAAAAAWgAAAAAAWgAAAAAAWgAAAAAAVQAAAAAAWgAAAAAAWgAAAAAAXgAAAAABXgAAAAACXgAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAVwAAAAAAVwAAAAAAVwAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAXgAAAAACXgAAAAAAXgAAAAAAfwAAAAAAAAAAAAAAfgAAAAAAfwAAAAAAVwAAAAAAfwAAAAAAWgAAAAAAWgAAAAAAWgAAAAAAWgAAAAAAVQAAAAAAWgAAAAAAWgAAAAAAMgAAAAAAXgAAAAABXgAAAAADfwAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAWgAAAAAAfwAAAAAAfwAAAAAAMgAAAAAAXgAAAAACXgAAAAABfwAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAXgAAAAAAUAAAAAAAUAAAAAAACwAAAAAAXgAAAAAAXgAAAAACXgAAAAAAXgAAAAABXgAAAAADXgAAAAADXgAAAAABXgAAAAABXgAAAAADXgAAAAADXgAAAAADXgAAAAADXgAAAAABXgAAAAADXgAAAAABMgAAAAAAXgAAAAADXgAAAAAAXgAAAAAAXgAAAAACXgAAAAAAXgAAAAABXgAAAAADMAAAAAACMAAAAAABMAAAAAAAMAAAAAADMAAAAAAAXgAAAAACXgAAAAABXgAAAAADMgAAAAAAXgAAAAADXgAAAAABUAAAAAAAXgAAAAADXgAAAAACXgAAAAAAXgAAAAAAXgAAAAACXgAAAAADXgAAAAABXgAAAAACXgAAAAACXgAAAAACXgAAAAACXgAAAAADXgAAAAADMAAAAAABXgAAAAACXgAAAAACfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAACXgAAAAACXgAAAAADXgAAAAAAXgAAAAABfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAbQAAAAAAbQAAAAAAbQAAAAAAbQAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAACXgAAAAAAXgAAAAADXgAAAAACXgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAXgAAAAABfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAewAAAAABfwAAAAAAewAAAAABfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAABXgAAAAABUAAAAAAAXgAAAAAAXgAAAAAAXgAAAAAAXgAAAAADfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAewAAAAACewAAAAAAXgAAAAADXgAAAAAAUAAAAAAAXgAAAAACXgAAAAACXgAAAAABXgAAAAABXgAAAAADfwAAAAAAfwAAAAAAewAAAAADfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAMAAAAAAAXgAAAAADXgAAAAAAXgAAAAAAMAAAAAABMAAAAAADXgAAAAADfwAAAAAAfwAAAAAAfwAAAAAAewAAAAABewAAAAADewAAAAABewAAAAADewAAAAABewAAAAAA + tiles: MAAAAAADXgAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAVwAAAAAAfwAAAAAAWgAAAAAAWgAAAAAAWgAAAAAAWgAAAAAAVQAAAAAAVQAAAAAAWAAAAAAAAQAAAAAAXgAAAAABfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAVwAAAAAAfwAAAAAAWgAAAAAAWgAAAAAAWgAAAAAAWgAAAAAAVQAAAAAAWgAAAAAAWgAAAAAAAQAAAAAAXgAAAAACXgAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAVwAAAAAAVwAAAAAAVwAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAAQAAAAAAAQAAAAAAXgAAAAAAfwAAAAAAAAAAAAAAfgAAAAAAfwAAAAAAVwAAAAAAfwAAAAAAWgAAAAAAWgAAAAAAWgAAAAAAWgAAAAAAVQAAAAAAWgAAAAAAWgAAAAAAMgAAAAAAAQAAAAAAXgAAAAADfwAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAWgAAAAAAfwAAAAAAfwAAAAAAMgAAAAAAAQAAAAAAXgAAAAABfwAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAXgAAAAAAUAAAAAAAUAAAAAAACwAAAAAAAQAAAAAAXgAAAAACXgAAAAAAXgAAAAABXgAAAAADXgAAAAADXgAAAAABXgAAAAABXgAAAAADXgAAAAADXgAAAAADXgAAAAADXgAAAAABXgAAAAADXgAAAAABMgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAMAAAAAACMAAAAAABMAAAAAAAMAAAAAADMAAAAAAAXgAAAAACXgAAAAABXgAAAAADMgAAAAAAAQAAAAAAXgAAAAABUAAAAAAAXgAAAAADXgAAAAACXgAAAAAAXgAAAAAAXgAAAAACXgAAAAADXgAAAAABXgAAAAACXgAAAAACXgAAAAACXgAAAAACXgAAAAADAQAAAAAAMAAAAAABXgAAAAACXgAAAAACfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAACAQAAAAAAXgAAAAADXgAAAAAAXgAAAAABfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAbQAAAAAAbQAAAAAAbQAAAAAAbQAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAACAQAAAAAAXgAAAAADXgAAAAACXgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAAQAAAAAAXgAAAAABfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAewAAAAABfwAAAAAAewAAAAABfwAAAAAAfwAAAAAAfwAAAAAAAQAAAAAAXgAAAAABUAAAAAAAXgAAAAAAXgAAAAAAXgAAAAAAXgAAAAADfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAewAAAAACewAAAAAAAQAAAAAAXgAAAAAAUAAAAAAAXgAAAAACXgAAAAACXgAAAAABXgAAAAABXgAAAAADfwAAAAAAfwAAAAAAewAAAAADfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAMAAAAAAAXgAAAAADXgAAAAAAXgAAAAAAMAAAAAABMAAAAAADXgAAAAADfwAAAAAAfwAAAAAAfwAAAAAAewAAAAABewAAAAADewAAAAABewAAAAADewAAAAABewAAAAAA version: 6 -2,0: ind: -2,0 - tiles: XgAAAAADXgAAAAACXgAAAAAAXgAAAAAAXgAAAAABXgAAAAABXgAAAAACXgAAAAACXgAAAAACXgAAAAABXgAAAAABXgAAAAAAXgAAAAABXgAAAAABXgAAAAAAXgAAAAABXgAAAAAAXgAAAAADXgAAAAABXgAAAAABXgAAAAACXgAAAAACXgAAAAADMAAAAAACXgAAAAACXgAAAAABXgAAAAAAXgAAAAACXgAAAAACXgAAAAADXgAAAAACXgAAAAACXgAAAAAAXgAAAAACXgAAAAADXgAAAAADXgAAAAABXgAAAAABXgAAAAADXgAAAAACXgAAAAAAXgAAAAACXgAAAAACXgAAAAACXgAAAAAAXgAAAAAAXgAAAAAAXgAAAAAAXgAAAAADfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAfwAAAAAAXgAAAAACfwAAAAAAXgAAAAABfwAAAAAAbQAAAAAAbQAAAAAAbQAAAAAAbQAAAAAAbQAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAACXgAAAAACXgAAAAACXgAAAAAAXgAAAAADfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAbQAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAACMAAAAAACXgAAAAADMAAAAAABXgAAAAACfwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAXgAAAAACXgAAAAAAXgAAAAACXgAAAAACXgAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAXgAAAAABXgAAAAACXgAAAAACXgAAAAABXgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAXgAAAAAAXgAAAAABMgAAAAAAMgAAAAAAXgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAfwAAAAAAQAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAABXgAAAAACMgAAAAAAMgAAAAAAXgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAZQAAAAAAfwAAAAAAMAAAAAACQAAAAAAAMAAAAAAAQAAAAAAAMAAAAAACfwAAAAAAXgAAAAAAXgAAAAADMgAAAAAAMgAAAAAAXgAAAAABXgAAAAACfwAAAAAAZQAAAAAAZQAAAAAAfwAAAAAAQAAAAAAAMAAAAAACQAAAAAAAMAAAAAABQAAAAAAAfwAAAAAAXgAAAAADMAAAAAABMgAAAAAAMgAAAAAAMAAAAAACXgAAAAABfwAAAAAAZQAAAAAAZQAAAAAAfwAAAAAAMAAAAAABQAAAAAAAMAAAAAADQAAAAAAAMAAAAAAAQAAAAAAAXgAAAAAAMAAAAAAAMgAAAAAAMgAAAAAAMAAAAAABfwAAAAAAfwAAAAAAfwAAAAAAZQAAAAAAfwAAAAAAQAAAAAAAMAAAAAABQAAAAAAAMAAAAAADQAAAAAAAfwAAAAAAXgAAAAAAMAAAAAADMgAAAAAAMgAAAAAAMAAAAAADXgAAAAABXgAAAAABfwAAAAAAZQAAAAAAfwAAAAAAfwAAAAAAQAAAAAAAMAAAAAAAQAAAAAAAMAAAAAACfwAAAAAAXgAAAAAAXgAAAAAAMgAAAAAAMgAAAAAAXgAAAAACXgAAAAABXgAAAAABXgAAAAABXgAAAAABXgAAAAAAfwAAAAAAMAAAAAADQAAAAAAAMAAAAAAAQAAAAAAAfwAAAAAAXgAAAAACXgAAAAACMgAAAAAAMgAAAAAAXgAAAAAC + tiles: XgAAAAADXgAAAAACXgAAAAAAXgAAAAAAXgAAAAABXgAAAAABXgAAAAACAQAAAAAAXgAAAAACXgAAAAABXgAAAAABXgAAAAAAXgAAAAABXgAAAAABXgAAAAAAXgAAAAABAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAMAAAAAACAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAXgAAAAAAXgAAAAACXgAAAAADXgAAAAADXgAAAAABXgAAAAABXgAAAAADXgAAAAACXgAAAAAAXgAAAAACXgAAAAACXgAAAAACAQAAAAAAXgAAAAAAAQAAAAAAXgAAAAAAXgAAAAADfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAAQAAAAAAfwAAAAAAAQAAAAAAfwAAAAAAXgAAAAABfwAAAAAAbQAAAAAAbQAAAAAAbQAAAAAAbQAAAAAAbQAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAACAQAAAAAAXgAAAAACAQAAAAAAXgAAAAADfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAbQAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAACMAAAAAACAQAAAAAAMAAAAAABXgAAAAACfwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAXgAAAAACAQAAAAAAXgAAAAACAQAAAAAAXgAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAXgAAAAABAQAAAAAAXgAAAAACAQAAAAAAAQAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAXgAAAAAAAQAAAAAAMgAAAAAAMgAAAAAAAQAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAfwAAAAAAQAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAABAQAAAAAAMgAAAAAAMgAAAAAAAQAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAZQAAAAAAfwAAAAAAMAAAAAACQAAAAAAAMAAAAAAAQAAAAAAAMAAAAAACfwAAAAAAXgAAAAAAAQAAAAAAMgAAAAAAMgAAAAAAAQAAAAAAXgAAAAACfwAAAAAAZQAAAAAAZQAAAAAAfwAAAAAAQAAAAAAAMAAAAAACQAAAAAAAMAAAAAABQAAAAAAAfwAAAAAAXgAAAAADMAAAAAABMgAAAAAAMgAAAAAAMAAAAAACXgAAAAABfwAAAAAAZQAAAAAAZQAAAAAAfwAAAAAAMAAAAAABQAAAAAAAMAAAAAADQAAAAAAAMAAAAAAAQAAAAAAAXgAAAAAAMAAAAAAAMgAAAAAAMgAAAAAAMAAAAAABfwAAAAAAfwAAAAAAfwAAAAAAZQAAAAAAfwAAAAAAQAAAAAAAMAAAAAABQAAAAAAAMAAAAAADQAAAAAAAfwAAAAAAXgAAAAAAMAAAAAADMgAAAAAAMgAAAAAAMAAAAAADXgAAAAABXgAAAAABfwAAAAAAZQAAAAAAfwAAAAAAfwAAAAAAQAAAAAAAMAAAAAAAQAAAAAAAMAAAAAACfwAAAAAAXgAAAAAAXgAAAAAAMgAAAAAAMgAAAAAAAQAAAAAAXgAAAAABXgAAAAABXgAAAAABXgAAAAABXgAAAAAAfwAAAAAAMAAAAAADQAAAAAAAMAAAAAAAQAAAAAAAfwAAAAAAXgAAAAACXgAAAAACMgAAAAAAMgAAAAAAAQAAAAAA version: 6 1,0: ind: 1,0 - tiles: XgAAAAADXgAAAAACXgAAAAADXgAAAAADIAAAAAADIAAAAAADfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfgAAAAAAXgAAAAADXgAAAAABXgAAAAADXgAAAAAAIAAAAAADIAAAAAABfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAfgAAAAAAXgAAAAAAXgAAAAACXgAAAAAAXgAAAAACIAAAAAADIAAAAAADfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfgAAAAAAIAAAAAADIAAAAAABfwAAAAAAfwAAAAAAUAAAAAAAIAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfgAAAAAAfgAAAAAAUAAAAAAAIAAAAAAAfwAAAAAAIAAAAAACIAAAAAADIAAAAAACIAAAAAADewAAAAAAewAAAAAAIAAAAAADfwAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAIAAAAAACUAAAAAAAIAAAAAAAIAAAAAADIAAAAAADIAAAAAAAIAAAAAAAIAAAAAACIAAAAAACfwAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAIAAAAAADUAAAAAAAIAAAAAAAIAAAAAADewAAAAABewAAAAAAewAAAAAAewAAAAACewAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAIAAAAAADUAAAAAAAIAAAAAABIAAAAAAAewAAAAABewAAAAAAewAAAAABewAAAAACewAAAAADfwAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAIAAAAAADIAAAAAADIAAAAAABIAAAAAAAewAAAAADewAAAAACewAAAAACewAAAAACewAAAAADfwAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAfgAAAAAAfgAAAAAAXgAAAAABIAAAAAACfwAAAAAAIAAAAAAAIAAAAAACewAAAAAAewAAAAABewAAAAACewAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAXgAAAAADfwAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAXgAAAAABXgAAAAAAXgAAAAAATwAAAAAATwAAAAABTwAAAAACTwAAAAADTwAAAAABfwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAXgAAAAABXgAAAAADXgAAAAAAUAAAAAAAXgAAAAADXgAAAAAAXgAAAAABXgAAAAADTwAAAAACTwAAAAACfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAMAAAAAAAMAAAAAADXgAAAAAAfwAAAAAAXgAAAAAATwAAAAADTwAAAAABTwAAAAABTwAAAAADXgAAAAACfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAMAAAAAAAMAAAAAACXgAAAAADfwAAAAAAXgAAAAAATwAAAAADTwAAAAACTwAAAAAATwAAAAADXgAAAAADfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAACXgAAAAADXgAAAAADUAAAAAAAXgAAAAAAXgAAAAABXgAAAAAAXgAAAAADTwAAAAADTwAAAAADfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAA + tiles: XgAAAAADAQAAAAAAAQAAAAAAXgAAAAADIAAAAAADIAAAAAADfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfgAAAAAAXgAAAAADAQAAAAAAXgAAAAADXgAAAAAAIAAAAAADIAAAAAABfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAfgAAAAAAAQAAAAAAAQAAAAAAXgAAAAAAXgAAAAACIAAAAAADIAAAAAADfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfgAAAAAAIAAAAAADIAAAAAABfwAAAAAAfwAAAAAAUAAAAAAAIAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfgAAAAAAfgAAAAAAUAAAAAAAIAAAAAAAfwAAAAAAIAAAAAACIAAAAAADIAAAAAACIAAAAAADewAAAAAAewAAAAAAIAAAAAADfwAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAIAAAAAACUAAAAAAAIAAAAAAAIAAAAAADIAAAAAADIAAAAAAAIAAAAAAAIAAAAAACIAAAAAACfwAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAIAAAAAADUAAAAAAAIAAAAAAAIAAAAAADewAAAAABewAAAAAAewAAAAAAewAAAAACewAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAIAAAAAADUAAAAAAAIAAAAAABIAAAAAAAewAAAAABewAAAAAAewAAAAABewAAAAACewAAAAADfwAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAIAAAAAADIAAAAAADIAAAAAABIAAAAAAAewAAAAADewAAAAACewAAAAACewAAAAACewAAAAADfwAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAfgAAAAAAfgAAAAAAXgAAAAABIAAAAAACfwAAAAAAIAAAAAAAIAAAAAACewAAAAAAewAAAAABewAAAAACewAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAAQAAAAAAXgAAAAADfwAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAAQAAAAAAXgAAAAABXgAAAAAAXgAAAAAATwAAAAAATwAAAAABTwAAAAACTwAAAAADTwAAAAABfwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAAQAAAAAAXgAAAAADXgAAAAAAUAAAAAAAXgAAAAADXgAAAAAAXgAAAAABXgAAAAADTwAAAAACTwAAAAACfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAMAAAAAAAMAAAAAADXgAAAAAAfwAAAAAAXgAAAAAATwAAAAADTwAAAAABTwAAAAABTwAAAAADXgAAAAACfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAMAAAAAAAMAAAAAACXgAAAAADfwAAAAAAXgAAAAAATwAAAAADTwAAAAACTwAAAAAATwAAAAADXgAAAAADfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAAQAAAAAAXgAAAAADXgAAAAADUAAAAAAAXgAAAAAAXgAAAAABXgAAAAAAXgAAAAADTwAAAAADTwAAAAADfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAA version: 6 -1,-3: ind: -1,-3 @@ -133,23 +135,23 @@ entities: version: 6 0,1: ind: 0,1 - tiles: fwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAXgAAAAACXgAAAAABUAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAUgAAAAAAXgAAAAADXgAAAAADXgAAAAACXgAAAAABXgAAAAABXgAAAAAAXgAAAAAAXgAAAAADXgAAAAAAXgAAAAADXgAAAAADXgAAAAAAXgAAAAACUAAAAAAAXgAAAAACXgAAAAAAXgAAAAACXgAAAAACMAAAAAADXgAAAAABXgAAAAACXgAAAAAAXgAAAAABXgAAAAACMAAAAAAAXgAAAAADXgAAAAABXgAAAAACXgAAAAACXgAAAAADXgAAAAABMAAAAAACXgAAAAADXgAAAAABXgAAAAAAXgAAAAACXgAAAAABXgAAAAADXgAAAAAAXgAAAAACXgAAAAAAXgAAAAADXgAAAAABXgAAAAAAXgAAAAADfwAAAAAAXgAAAAADXgAAAAAAXgAAAAADXgAAAAACXgAAAAAAXgAAAAADfwAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAQQAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAIAAAAAACIAAAAAABXgAAAAABUAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAUwAAAAAAUwAAAAAAUwAAAAAAUwAAAAAAQQAAAAAAQQAAAAAAQQAAAAAAQQAAAAAAfwAAAAAAIAAAAAACIAAAAAACIAAAAAAAXgAAAAABXgAAAAADXgAAAAADXgAAAAADUwAAAAAAUwAAAAAAUwAAAAAAUwAAAAAAfwAAAAAAQQAAAAAAQQAAAAAAQQAAAAAAfwAAAAAAIAAAAAACIAAAAAABIAAAAAACXgAAAAACXgAAAAABXgAAAAAAXgAAAAADUwAAAAAAUwAAAAAAUwAAAAAAUwAAAAAAfwAAAAAAQQAAAAAAQQAAAAAAQQAAAAAAfwAAAAAAIAAAAAABIAAAAAACXgAAAAADUwAAAAAAUwAAAAAAUwAAAAAAUwAAAAAAUwAAAAAAUwAAAAAAUwAAAAAAUwAAAAAAfwAAAAAAQQAAAAAAQQAAAAAAQQAAAAAAfwAAAAAAIAAAAAAAIAAAAAABfwAAAAAAUwAAAAAAUwAAAAAAUwAAAAAAUwAAAAAAUwAAAAAAUwAAAAAAUwAAAAAAUwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAIAAAAAACIAAAAAACIAAAAAADXgAAAAADXgAAAAAAXgAAAAAAXgAAAAABUwAAAAAAUwAAAAAAUwAAAAAAUwAAAAAAIAAAAAAAIAAAAAAAIAAAAAAAIAAAAAABIAAAAAADIAAAAAABIAAAAAACIAAAAAADXgAAAAABXgAAAAABXgAAAAACXgAAAAAAUwAAAAAAUwAAAAAAUwAAAAAAUwAAAAAAfwAAAAAAIAAAAAAAIAAAAAAAIAAAAAACIAAAAAADIAAAAAAAIAAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAIAAAAAAAIAAAAAAAIAAAAAACIAAAAAABIAAAAAACIAAAAAACUAAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAIAAAAAABIAAAAAAAIAAAAAABIAAAAAACIAAAAAAAIAAAAAAAIAAAAAAAIAAAAAABIAAAAAACIAAAAAADIAAAAAACfwAAAAAAZQAAAAAAfwAAAAAAZQAAAAAAZQAAAAAAUAAAAAAAIAAAAAABIAAAAAADIAAAAAACfwAAAAAAfwAAAAAAfwAAAAAAIAAAAAADIAAAAAAAIAAAAAABIAAAAAADfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAIAAAAAADIAAAAAACIAAAAAACIAAAAAABIAAAAAABIAAAAAADIAAAAAABIAAAAAACIAAAAAADIAAAAAABIAAAAAADfwAAAAAA + tiles: fwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAXgAAAAACXgAAAAABUAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAUgAAAAAAXgAAAAADXgAAAAADXgAAAAACXgAAAAABXgAAAAABXgAAAAAAXgAAAAAAXgAAAAADXgAAAAAAXgAAAAADXgAAAAADXgAAAAAAXgAAAAACUAAAAAAAXgAAAAACXgAAAAAAXgAAAAACAQAAAAAAMAAAAAADAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAMAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAMAAAAAACAQAAAAAAXgAAAAABXgAAAAAAXgAAAAACXgAAAAABXgAAAAADXgAAAAAAXgAAAAACXgAAAAAAXgAAAAADXgAAAAABXgAAAAAAXgAAAAADfwAAAAAAXgAAAAADXgAAAAAAXgAAAAADXgAAAAACXgAAAAAAXgAAAAADfwAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAQQAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAIAAAAAACIAAAAAABXgAAAAABUAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAUwAAAAAAUwAAAAAAUwAAAAAAUwAAAAAAQQAAAAAAQQAAAAAAQQAAAAAAQQAAAAAAfwAAAAAAIAAAAAACIAAAAAACIAAAAAAAXgAAAAABXgAAAAADXgAAAAADXgAAAAADUwAAAAAAUwAAAAAAUwAAAAAAUwAAAAAAfwAAAAAAQQAAAAAAQQAAAAAAQQAAAAAAfwAAAAAAIAAAAAACIAAAAAABIAAAAAACXgAAAAACXgAAAAABXgAAAAAAXgAAAAADUwAAAAAAUwAAAAAAUwAAAAAAUwAAAAAAfwAAAAAAQQAAAAAAQQAAAAAAQQAAAAAAfwAAAAAAIAAAAAABIAAAAAACXgAAAAADUwAAAAAAUwAAAAAAUwAAAAAAUwAAAAAAUwAAAAAAUwAAAAAAUwAAAAAAUwAAAAAAfwAAAAAAQQAAAAAAQQAAAAAAQQAAAAAAfwAAAAAAIAAAAAAAIAAAAAABfwAAAAAAUwAAAAAAUwAAAAAAUwAAAAAAUwAAAAAAUwAAAAAAUwAAAAAAUwAAAAAAUwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAIAAAAAACIAAAAAACIAAAAAADXgAAAAADXgAAAAAAXgAAAAAAXgAAAAABUwAAAAAAUwAAAAAAUwAAAAAAUwAAAAAAIAAAAAAAIAAAAAAAIAAAAAAAIAAAAAABIAAAAAADIAAAAAABIAAAAAACIAAAAAADXgAAAAABXgAAAAABXgAAAAACXgAAAAAAUwAAAAAAUwAAAAAAUwAAAAAAUwAAAAAAfwAAAAAAIAAAAAAAIAAAAAAAIAAAAAACIAAAAAADIAAAAAAAIAAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAIAAAAAAAIAAAAAAAIAAAAAACIAAAAAABIAAAAAACIAAAAAACUAAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAIAAAAAABIAAAAAAAIAAAAAABIAAAAAACIAAAAAAAIAAAAAAAIAAAAAAAIAAAAAABIAAAAAACIAAAAAADIAAAAAACfwAAAAAAZQAAAAAAfwAAAAAAZQAAAAAAZQAAAAAAUAAAAAAAIAAAAAABIAAAAAADIAAAAAACfwAAAAAAfwAAAAAAfwAAAAAAIAAAAAADIAAAAAAAIAAAAAABIAAAAAADfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAIAAAAAADIAAAAAACIAAAAAACIAAAAAABIAAAAAABIAAAAAADIAAAAAABIAAAAAACIAAAAAADIAAAAAABIAAAAAADfwAAAAAA version: 6 -1,1: ind: -1,1 - tiles: XgAAAAADXgAAAAACfwAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAXgAAAAACfwAAAAAAXgAAAAACUAAAAAAAXgAAAAAAXgAAAAACXgAAAAAAXgAAAAABXgAAAAACXgAAAAADXgAAAAADXgAAAAACXgAAAAADXgAAAAADXgAAAAACXgAAAAACXgAAAAABXgAAAAACXgAAAAAAXgAAAAADXgAAAAAAXgAAAAACXgAAAAADMAAAAAAAXgAAAAADXgAAAAADXgAAAAADXgAAAAADXgAAAAAAXgAAAAAAXgAAAAABXgAAAAADXgAAAAACXgAAAAABMAAAAAAAXgAAAAABfwAAAAAAXgAAAAAAXgAAAAABXgAAAAACXgAAAAACMAAAAAADUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAMAAAAAABXgAAAAABXgAAAAADXgAAAAAAfwAAAAAAXgAAAAADXgAAAAABXgAAAAACXgAAAAACXgAAAAABUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAXgAAAAACXgAAAAABXgAAAAAAXgAAAAAAfwAAAAAAXgAAAAABfwAAAAAAfwAAAAAAXgAAAAADXgAAAAADUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAXgAAAAABXgAAAAADfwAAAAAAfwAAAAAAXgAAAAADXgAAAAADXgAAAAAAfwAAAAAAXgAAAAAAXgAAAAADUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAXgAAAAADXgAAAAAAfwAAAAAAXgAAAAADUAAAAAAAXgAAAAADXgAAAAACUAAAAAAAXgAAAAABXgAAAAAAXgAAAAAAMwAAAAABMwAAAAACMwAAAAABMwAAAAACXgAAAAAAXgAAAAABXgAAAAACUAAAAAAAXgAAAAADOgAAAAACXgAAAAACXgAAAAADUAAAAAAAXgAAAAAAMAAAAAABXgAAAAAAMwAAAAADMwAAAAACMwAAAAABMwAAAAAAXgAAAAADMAAAAAADXgAAAAADUwAAAAAAUwAAAAAAOgAAAAACXgAAAAACXgAAAAADXgAAAAABXgAAAAAAXgAAAAACXgAAAAACMwAAAAABMwAAAAADMwAAAAADMwAAAAABXgAAAAABXgAAAAAAXgAAAAAAUwAAAAAAUwAAAAAAOgAAAAABXgAAAAABXgAAAAACXgAAAAABXgAAAAACMAAAAAAAXgAAAAADXgAAAAAAXgAAAAADXgAAAAABXgAAAAADXgAAAAADMAAAAAACXgAAAAAAUAAAAAAAXgAAAAACOgAAAAABXgAAAAACXgAAAAABUAAAAAAAXgAAAAABXgAAAAABXgAAAAABMAAAAAAAXgAAAAABXgAAAAACMAAAAAABXgAAAAAAXgAAAAAAXgAAAAADfwAAAAAAXgAAAAABOgAAAAACXgAAAAAAXgAAAAADUAAAAAAAXgAAAAACXgAAAAABXgAAAAACfwAAAAAAXgAAAAACXgAAAAADfwAAAAAAXgAAAAADXgAAAAABXgAAAAABfwAAAAAAfwAAAAAAXgAAAAABXgAAAAACXgAAAAACfwAAAAAAXgAAAAADXgAAAAACXgAAAAABfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAABXgAAAAABXgAAAAADXgAAAAAAfwAAAAAAXgAAAAADXgAAAAABXgAAAAAAfwAAAAAAXgAAAAADXgAAAAADXgAAAAADXgAAAAAAXgAAAAADXgAAAAADXgAAAAACXgAAAAABXgAAAAAAXgAAAAACXgAAAAACfwAAAAAAXgAAAAABXgAAAAADXgAAAAADfwAAAAAAXgAAAAABXgAAAAADXgAAAAAAXgAAAAABXgAAAAAAXgAAAAABXgAAAAAAXgAAAAACXgAAAAABXgAAAAABXgAAAAAAfwAAAAAA + tiles: XgAAAAADXgAAAAACfwAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAXgAAAAACfwAAAAAAXgAAAAACUAAAAAAAXgAAAAAAXgAAAAACXgAAAAAAXgAAAAABXgAAAAACXgAAAAADXgAAAAADXgAAAAACXgAAAAADXgAAAAADXgAAAAACXgAAAAACXgAAAAABXgAAAAACXgAAAAAAXgAAAAADAQAAAAAAAQAAAAAAAQAAAAAAMAAAAAAAAQAAAAAAAQAAAAAAXgAAAAADXgAAAAADXgAAAAAAXgAAAAAAXgAAAAABXgAAAAADAQAAAAAAAQAAAAAAMAAAAAAAAQAAAAAAfwAAAAAAXgAAAAAAXgAAAAABXgAAAAACXgAAAAACMAAAAAADUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAMAAAAAABXgAAAAABXgAAAAADXgAAAAAAfwAAAAAAXgAAAAADXgAAAAABXgAAAAACXgAAAAACAQAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAQAAAAAAXgAAAAABXgAAAAAAXgAAAAAAfwAAAAAAXgAAAAABfwAAAAAAfwAAAAAAXgAAAAADAQAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAQAAAAAAXgAAAAADfwAAAAAAfwAAAAAAXgAAAAADXgAAAAADXgAAAAAAfwAAAAAAXgAAAAAAAQAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAAQAAAAAAXgAAAAAAfwAAAAAAXgAAAAADUAAAAAAAXgAAAAADXgAAAAACUAAAAAAAXgAAAAABAQAAAAAAXgAAAAAAMwAAAAABMwAAAAACMwAAAAABMwAAAAACXgAAAAAAAQAAAAAAXgAAAAACUAAAAAAAXgAAAAADOgAAAAACXgAAAAACXgAAAAADUAAAAAAAXgAAAAAAMAAAAAABXgAAAAAAMwAAAAADMwAAAAACMwAAAAABMwAAAAAAXgAAAAADMAAAAAADXgAAAAADUwAAAAAAUwAAAAAAOgAAAAACXgAAAAACXgAAAAADXgAAAAABXgAAAAAAAQAAAAAAXgAAAAACMwAAAAABMwAAAAADMwAAAAADMwAAAAABXgAAAAABAQAAAAAAXgAAAAAAUwAAAAAAUwAAAAAAOgAAAAABXgAAAAABXgAAAAACXgAAAAABXgAAAAACMAAAAAAAXgAAAAADXgAAAAAAXgAAAAADXgAAAAABXgAAAAADXgAAAAADMAAAAAACXgAAAAAAUAAAAAAAXgAAAAACOgAAAAABXgAAAAACXgAAAAABUAAAAAAAXgAAAAABXgAAAAABXgAAAAABMAAAAAAAXgAAAAABXgAAAAACMAAAAAABXgAAAAAAXgAAAAAAXgAAAAADfwAAAAAAXgAAAAABOgAAAAACXgAAAAAAXgAAAAADUAAAAAAAXgAAAAACXgAAAAABXgAAAAACfwAAAAAAXgAAAAACXgAAAAADfwAAAAAAXgAAAAADXgAAAAABXgAAAAABfwAAAAAAfwAAAAAAXgAAAAABXgAAAAACXgAAAAACfwAAAAAAXgAAAAADXgAAAAACXgAAAAABfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAABXgAAAAABXgAAAAADXgAAAAAAfwAAAAAAXgAAAAADXgAAAAABXgAAAAAAfwAAAAAAXgAAAAADXgAAAAADXgAAAAADXgAAAAAAXgAAAAADXgAAAAADXgAAAAACXgAAAAABXgAAAAAAXgAAAAACXgAAAAACfwAAAAAAXgAAAAABXgAAAAADXgAAAAADfwAAAAAAXgAAAAABXgAAAAADXgAAAAAAXgAAAAABXgAAAAAAXgAAAAABXgAAAAAAXgAAAAACXgAAAAABXgAAAAABXgAAAAAAfwAAAAAA version: 6 -2,1: ind: -2,1 - tiles: XgAAAAACXgAAAAABMAAAAAADXgAAAAACXgAAAAAAfwAAAAAAQAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAACXgAAAAABMgAAAAAAMgAAAAAAXgAAAAACXgAAAAAAXgAAAAABXgAAAAACXgAAAAAAXgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAXgAAAAAAXgAAAAAAXgAAAAADXgAAAAABXgAAAAACXgAAAAAAXgAAAAABXgAAAAADXgAAAAACXgAAAAACXgAAAAACXgAAAAACXgAAAAACXgAAAAACXgAAAAACXgAAAAADXgAAAAAAXgAAAAABXgAAAAADXgAAAAABXgAAAAACXgAAAAADXgAAAAAAXgAAAAAAXgAAAAABMAAAAAAAXgAAAAADXgAAAAAAXgAAAAAAMAAAAAADXgAAAAACXgAAAAACXgAAAAADfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAABXgAAAAAAXgAAAAAAXgAAAAAAXgAAAAADXgAAAAADXgAAAAACXgAAAAACXgAAAAADXgAAAAABIAAAAAADIAAAAAADIAAAAAACIAAAAAABIAAAAAADIAAAAAADXgAAAAABXgAAAAAAXgAAAAACXgAAAAAAXgAAAAAAXgAAAAACXgAAAAADXgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAIAAAAAACIAAAAAACIAAAAAABIAAAAAACPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAfwAAAAAAPwAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAXgAAAAADXgAAAAACXgAAAAACIAAAAAADIAAAAAABIAAAAAAAIAAAAAABPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAfwAAAAAAXgAAAAABXgAAAAACXgAAAAADUAAAAAAAIAAAAAACIAAAAAAAIAAAAAACIAAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAfwAAAAAAXgAAAAABXgAAAAAAXgAAAAACXgAAAAADOgAAAAADOgAAAAABOgAAAAADOgAAAAADPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAfwAAAAAAXgAAAAADXgAAAAAAXgAAAAACXgAAAAAAOgAAAAABOgAAAAADOgAAAAAAOgAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAXgAAAAABXgAAAAADXgAAAAACOgAAAAACOgAAAAAAOgAAAAADOgAAAAABPwAAAAAAPwAAAAAAfwAAAAAALwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAADXgAAAAABXgAAAAAAXgAAAAABXgAAAAACOgAAAAABOgAAAAACOgAAAAABOgAAAAADPwAAAAAAPwAAAAAAfwAAAAAALwAAAAAALwAAAAAALwAAAAAAfwAAAAAAfwAAAAAAXgAAAAADfwAAAAAAXgAAAAADXgAAAAACOgAAAAACOgAAAAADOgAAAAABOgAAAAAAPQAAAAAAPwAAAAAAfwAAAAAALwAAAAAALwAAAAAALwAAAAAALwAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAXgAAAAAAXgAAAAADXgAAAAAAXgAAAAABXgAAAAACXgAAAAABPQAAAAAAPQAAAAAAfwAAAAAAfwAAAAAALwAAAAAALwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAXgAAAAADXgAAAAAAXgAAAAAAXgAAAAAAXgAAAAACXgAAAAADPQAAAAAAPQAAAAAAPQAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAXgAAAAABXgAAAAACXgAAAAACXgAAAAADXgAAAAABXgAAAAACXgAAAAAA + tiles: XgAAAAACXgAAAAABMAAAAAADXgAAAAACXgAAAAAAfwAAAAAAQAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAACXgAAAAABMgAAAAAAMgAAAAAAAQAAAAAAXgAAAAAAXgAAAAABXgAAAAACXgAAAAAAXgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAXgAAAAAAXgAAAAAAXgAAAAADXgAAAAABXgAAAAACXgAAAAAAAQAAAAAAXgAAAAADXgAAAAACXgAAAAACXgAAAAACXgAAAAACXgAAAAACXgAAAAACXgAAAAACXgAAAAADXgAAAAAAXgAAAAABXgAAAAADXgAAAAABXgAAAAACXgAAAAADAQAAAAAAXgAAAAAAXgAAAAABMAAAAAAAXgAAAAADXgAAAAAAXgAAAAAAMAAAAAADXgAAAAACXgAAAAACXgAAAAADfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAABXgAAAAAAXgAAAAAAXgAAAAAAXgAAAAADXgAAAAADXgAAAAACXgAAAAACXgAAAAADXgAAAAABIAAAAAADIAAAAAADIAAAAAACIAAAAAABIAAAAAADIAAAAAADXgAAAAABXgAAAAAAXgAAAAACXgAAAAAAXgAAAAAAXgAAAAACXgAAAAADXgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAIAAAAAACIAAAAAACIAAAAAABIAAAAAACPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAfwAAAAAAPwAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAXgAAAAADXgAAAAACXgAAAAACIAAAAAADIAAAAAABIAAAAAAAIAAAAAABPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAfwAAAAAAXgAAAAABXgAAAAACXgAAAAADUAAAAAAAIAAAAAACIAAAAAAAIAAAAAACIAAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAfwAAAAAAXgAAAAABXgAAAAAAXgAAAAACXgAAAAADOgAAAAADOgAAAAABOgAAAAADOgAAAAADPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAfwAAAAAAXgAAAAADXgAAAAAAXgAAAAACXgAAAAAAOgAAAAABOgAAAAADOgAAAAAAOgAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAXgAAAAABXgAAAAADXgAAAAACOgAAAAACOgAAAAAAOgAAAAADOgAAAAABPwAAAAAAPwAAAAAAfwAAAAAALwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAADXgAAAAABXgAAAAAAXgAAAAABXgAAAAACOgAAAAABOgAAAAACOgAAAAABOgAAAAADPwAAAAAAPwAAAAAAfwAAAAAALwAAAAAALwAAAAAALwAAAAAAfwAAAAAAfwAAAAAAXgAAAAADfwAAAAAAXgAAAAADXgAAAAACOgAAAAACOgAAAAADOgAAAAABOgAAAAAAPQAAAAAAPwAAAAAAfwAAAAAALwAAAAAALwAAAAAALwAAAAAALwAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAXgAAAAAAXgAAAAADXgAAAAAAXgAAAAABXgAAAAACXgAAAAABPQAAAAAAPQAAAAAAfwAAAAAAfwAAAAAALwAAAAAALwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAXgAAAAADXgAAAAAAXgAAAAAAXgAAAAAAXgAAAAACXgAAAAADPQAAAAAAPQAAAAAAPQAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAXgAAAAABXgAAAAACXgAAAAACXgAAAAADXgAAAAABXgAAAAACXgAAAAAA version: 6 1,1: ind: 1,1 - tiles: XgAAAAADXgAAAAAAXgAAAAACXgAAAAADTwAAAAAATwAAAAACTwAAAAABTwAAAAADTwAAAAABXgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAXgAAAAAAXgAAAAACfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAABXgAAAAADXgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAABXgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAZQAAAAAAZQAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAfwAAAAAAZQAAAAAAfwAAAAAAfwAAAAAAIAAAAAABIAAAAAADfwAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAfwAAAAAAZQAAAAAAZQAAAAAAfwAAAAAAIAAAAAADIAAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAfwAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAIAAAAAAAIAAAAAACfwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAfwAAAAAAZQAAAAAAZQAAAAAAfwAAAAAAfwAAAAAAIAAAAAACfwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAfwAAAAAAfwAAAAAAZQAAAAAAZQAAAAAAfwAAAAAAIAAAAAAAIAAAAAADIAAAAAACIAAAAAACfwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAIAAAAAACIAAAAAABIAAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAIAAAAAABfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAIAAAAAAAIAAAAAABIAAAAAAAfwAAAAAAbQAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAIAAAAAABIAAAAAADIAAAAAABfwAAAAAAbQAAAAAAbQAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAbQAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAIAAAAAAAIAAAAAADIAAAAAAAfwAAAAAAbQAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAA + tiles: AQAAAAAAXgAAAAAAXgAAAAACXgAAAAADTwAAAAAATwAAAAACTwAAAAABTwAAAAADTwAAAAABXgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAAQAAAAAAXgAAAAAAXgAAAAACfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAAQAAAAAAXgAAAAADXgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAABXgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAZQAAAAAAZQAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAfwAAAAAAZQAAAAAAfwAAAAAAfwAAAAAAIAAAAAABIAAAAAADfwAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAfwAAAAAAZQAAAAAAZQAAAAAAfwAAAAAAIAAAAAADIAAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAfwAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAIAAAAAAAIAAAAAACfwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAfwAAAAAAZQAAAAAAZQAAAAAAfwAAAAAAfwAAAAAAIAAAAAACfwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAfwAAAAAAfwAAAAAAZQAAAAAAZQAAAAAAfwAAAAAAIAAAAAAAIAAAAAADIAAAAAACIAAAAAACfwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAIAAAAAACIAAAAAABIAAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAIAAAAAABfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAIAAAAAAAIAAAAAABIAAAAAAAfwAAAAAAbQAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAIAAAAAABIAAAAAADIAAAAAABfwAAAAAAbQAAAAAAbQAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAbQAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAIAAAAAAAIAAAAAADIAAAAAAAfwAAAAAAbQAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAA version: 6 -1,2: ind: -1,2 - tiles: fwAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAcQAAAAADcQAAAAADUAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAXgAAAAABMAAAAAADXgAAAAADfwAAAAAAfwAAAAAAcQAAAAAAcQAAAAABcQAAAAADcQAAAAADcQAAAAACcQAAAAABcQAAAAACcQAAAAADcQAAAAABcQAAAAABfwAAAAAAXgAAAAACXgAAAAADXgAAAAAAfwAAAAAAfwAAAAAAcQAAAAAAcQAAAAABcQAAAAACcQAAAAAAcQAAAAADcQAAAAADcQAAAAADcQAAAAADcQAAAAACcQAAAAAAUAAAAAAAXgAAAAADXgAAAAAAXgAAAAADfwAAAAAAfwAAAAAAcQAAAAADcQAAAAADcQAAAAAAcQAAAAABcQAAAAACcQAAAAAAcQAAAAABcQAAAAAAcQAAAAACcQAAAAADcQAAAAAAXgAAAAAAXgAAAAADXgAAAAADfwAAAAAAcQAAAAABcQAAAAAAcQAAAAABcQAAAAAAcQAAAAACcQAAAAAAcQAAAAAAcQAAAAACcQAAAAAAcQAAAAACcQAAAAACcQAAAAABXgAAAAADXgAAAAAAXgAAAAACfwAAAAAAUAAAAAAAcQAAAAACcQAAAAABcQAAAAADcQAAAAABcQAAAAABcQAAAAABcQAAAAABcQAAAAABcQAAAAABcQAAAAACcQAAAAABXgAAAAACXgAAAAADXgAAAAADfwAAAAAAfwAAAAAAcQAAAAAAcQAAAAABcQAAAAABcQAAAAAAcQAAAAABcQAAAAAAcQAAAAADcQAAAAAAcQAAAAADcQAAAAABcQAAAAAAXgAAAAABXgAAAAACXgAAAAACIAAAAAACfwAAAAAAcQAAAAADcQAAAAABfwAAAAAAcQAAAAACcQAAAAAAfwAAAAAAcQAAAAACUAAAAAAAcQAAAAADfwAAAAAAfwAAAAAAXgAAAAABXgAAAAADXgAAAAAAIAAAAAACcQAAAAADcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAABfwAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAUAAAAAAAXgAAAAABXgAAAAABXgAAAAADfwAAAAAAcQAAAAABcQAAAAABcQAAAAABcQAAAAACcQAAAAACfwAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAUAAAAAAAXgAAAAAAMAAAAAAAXgAAAAADfwAAAAAAcQAAAAADcQAAAAADcQAAAAAAcQAAAAAAcQAAAAAAfwAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAfwAAAAAAXgAAAAACXgAAAAADXgAAAAABfwAAAAAAcQAAAAACcQAAAAAAcQAAAAADcQAAAAACfwAAAAAAfwAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAfwAAAAAAXgAAAAACXgAAAAADUAAAAAAAfwAAAAAAcQAAAAADcQAAAAACcQAAAAADcQAAAAADdwAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAfwAAAAAAXgAAAAAAXgAAAAACXgAAAAAAUAAAAAAAcQAAAAACcQAAAAADcQAAAAAAcQAAAAABdwAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAfwAAAAAAXgAAAAAAXgAAAAABXgAAAAAAcQAAAAAAcQAAAAABcQAAAAABcQAAAAADfwAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAfwAAAAAAXgAAAAABXgAAAAAAXgAAAAAAUAAAAAAAcQAAAAACcQAAAAABUAAAAAAAUAAAAAAAcQAAAAADcQAAAAADcQAAAAACcQAAAAADcQAAAAACcQAAAAABfwAAAAAAfwAAAAAAXgAAAAABXgAAAAACXgAAAAABfwAAAAAA + tiles: fwAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAcQAAAAADcQAAAAADUAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAXgAAAAABMAAAAAADXgAAAAADfwAAAAAAfwAAAAAAcQAAAAAAcQAAAAABcQAAAAADcQAAAAADcQAAAAACcQAAAAABcQAAAAACcQAAAAADcQAAAAABcQAAAAABfwAAAAAAXgAAAAACAQAAAAAAXgAAAAAAfwAAAAAAfwAAAAAAcQAAAAAAcQAAAAABcQAAAAACcQAAAAAAcQAAAAADcQAAAAADcQAAAAADcQAAAAADcQAAAAACcQAAAAAAUAAAAAAAXgAAAAADAQAAAAAAXgAAAAADfwAAAAAAfwAAAAAAcQAAAAADcQAAAAADcQAAAAAAcQAAAAABcQAAAAACcQAAAAAAcQAAAAABcQAAAAAAcQAAAAACcQAAAAADcQAAAAAAXgAAAAAAAQAAAAAAXgAAAAADfwAAAAAAcQAAAAABcQAAAAAAcQAAAAABcQAAAAAAcQAAAAACcQAAAAAAcQAAAAAAcQAAAAACcQAAAAAAcQAAAAACcQAAAAACcQAAAAABXgAAAAADAQAAAAAAXgAAAAACfwAAAAAAUAAAAAAAcQAAAAACcQAAAAABcQAAAAADcQAAAAABcQAAAAABcQAAAAABcQAAAAABcQAAAAABcQAAAAABcQAAAAACcQAAAAABXgAAAAACAQAAAAAAXgAAAAADfwAAAAAAfwAAAAAAcQAAAAAAcQAAAAABcQAAAAABcQAAAAAAcQAAAAABcQAAAAAAcQAAAAADcQAAAAAAcQAAAAADcQAAAAABcQAAAAAAXgAAAAABAQAAAAAAXgAAAAACIAAAAAACfwAAAAAAcQAAAAADcQAAAAABfwAAAAAAcQAAAAACcQAAAAAAfwAAAAAAcQAAAAACUAAAAAAAcQAAAAADfwAAAAAAfwAAAAAAXgAAAAABAQAAAAAAXgAAAAAAIAAAAAACcQAAAAADcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAABfwAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAUAAAAAAAXgAAAAABAQAAAAAAXgAAAAADfwAAAAAAcQAAAAABcQAAAAABcQAAAAABcQAAAAACcQAAAAACfwAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAUAAAAAAAXgAAAAAAMAAAAAAAXgAAAAADfwAAAAAAcQAAAAADcQAAAAADcQAAAAAAcQAAAAAAcQAAAAAAfwAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAfwAAAAAAXgAAAAACAQAAAAAAXgAAAAABfwAAAAAAcQAAAAACcQAAAAAAcQAAAAADcQAAAAACfwAAAAAAfwAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAfwAAAAAAXgAAAAACAQAAAAAAUAAAAAAAfwAAAAAAcQAAAAADcQAAAAACcQAAAAADcQAAAAADdwAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAfwAAAAAAXgAAAAAAAQAAAAAAXgAAAAAAUAAAAAAAcQAAAAACcQAAAAADcQAAAAAAcQAAAAABdwAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAfwAAAAAAXgAAAAAAAQAAAAAAXgAAAAAAcQAAAAAAcQAAAAABcQAAAAABcQAAAAADfwAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAfwAAAAAAXgAAAAABAQAAAAAAXgAAAAAAUAAAAAAAcQAAAAACcQAAAAABUAAAAAAAUAAAAAAAcQAAAAADcQAAAAADcQAAAAACcQAAAAADcQAAAAACcQAAAAABfwAAAAAAfwAAAAAAAQAAAAAAAQAAAAAAXgAAAAABfwAAAAAA version: 6 0,2: ind: 0,2 @@ -161,15 +163,15 @@ entities: version: 6 -3,0: ind: -3,0 - tiles: fwAAAAAAfwAAAAAAfwAAAAAAXgAAAAADXgAAAAACXgAAAAADXgAAAAADXgAAAAAAXgAAAAADXgAAAAAAXgAAAAAAXgAAAAACXgAAAAABXgAAAAADXgAAAAACXgAAAAACbQAAAAAAbQAAAAAAfwAAAAAAXgAAAAAAXgAAAAAAMAAAAAAAXgAAAAABXgAAAAACXgAAAAACMAAAAAAAMAAAAAACXgAAAAACXgAAAAACXgAAAAACMAAAAAADXgAAAAABfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAACXgAAAAAAXgAAAAADXgAAAAADXgAAAAAAXgAAAAACXgAAAAABXgAAAAABXgAAAAACXgAAAAADXgAAAAADXgAAAAABXgAAAAACXgAAAAADXgAAAAABfwAAAAAAXgAAAAACXgAAAAABXgAAAAAAXgAAAAACXgAAAAADXgAAAAABXgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAXgAAAAACXgAAAAABXgAAAAADXgAAAAAAXgAAAAACfwAAAAAAXgAAAAABXgAAAAADMAAAAAACXgAAAAADfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAABMAAAAAADXgAAAAADXgAAAAADXgAAAAADXgAAAAADXgAAAAAAXgAAAAACXgAAAAABXgAAAAAALwAAAAAALwAAAAAALwAAAAAALwAAAAAALwAAAAAAfwAAAAAAXgAAAAADXgAAAAACXgAAAAADXgAAAAABXgAAAAABfwAAAAAAfwAAAAAAXgAAAAABXgAAAAADXgAAAAADLwAAAAAALwAAAAAALwAAAAAALwAAAAAALwAAAAAAfwAAAAAAXgAAAAABXgAAAAACXgAAAAACXgAAAAACXgAAAAADXgAAAAABXgAAAAABXgAAAAABXgAAAAADXgAAAAAAfwAAAAAALwAAAAAALwAAAAAALwAAAAAALwAAAAAAfwAAAAAAXgAAAAADXgAAAAABXgAAAAADfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAACXgAAAAAAXgAAAAACfwAAAAAALwAAAAAALwAAAAAALwAAAAAALwAAAAAAfwAAAAAAXgAAAAADXgAAAAAAXgAAAAAAXgAAAAACXgAAAAABXgAAAAADfwAAAAAAXgAAAAAAXgAAAAACXgAAAAABfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAMAAAAAADXgAAAAABXgAAAAADXgAAAAAAXgAAAAADfwAAAAAAXgAAAAABXgAAAAAAXgAAAAABfwAAAAAAXgAAAAACXgAAAAAAXgAAAAACXgAAAAABfwAAAAAAXgAAAAADXgAAAAABXgAAAAAAXgAAAAACXgAAAAAAXgAAAAAAXgAAAAABXgAAAAACXgAAAAAAXgAAAAACXgAAAAACXgAAAAAAXgAAAAABXgAAAAADXgAAAAACfwAAAAAAXgAAAAAAXgAAAAACXgAAAAACfwAAAAAAfwAAAAAAXgAAAAADXgAAAAAAXgAAAAACXgAAAAAAXgAAAAABXgAAAAAAXgAAAAADfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAADXgAAAAAAXgAAAAADfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAADXgAAAAADXgAAAAACfwAAAAAAfwAAAAAAfwAAAAAAGAAAAAAAfwAAAAAAXgAAAAAAXgAAAAADXgAAAAABfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAADXgAAAAADXgAAAAADXgAAAAACXgAAAAAAXgAAAAADGAAAAAAAGAAAAAAAGAAAAAAAfwAAAAAAXgAAAAAAXgAAAAADXgAAAAADfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAADXgAAAAAAXgAAAAAAMAAAAAABXgAAAAADXgAAAAACGAAAAAAAGAAAAAAAGAAAAAAAfwAAAAAAXgAAAAABMAAAAAADXgAAAAAAfwAAAAAA + tiles: fwAAAAAAfwAAAAAAfwAAAAAAXgAAAAADXgAAAAACXgAAAAADXgAAAAADXgAAAAAAXgAAAAADXgAAAAAAXgAAAAAAXgAAAAACXgAAAAABXgAAAAADXgAAAAACXgAAAAACbQAAAAAAbQAAAAAAfwAAAAAAXgAAAAAAXgAAAAAAMAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAMAAAAAACAQAAAAAAAQAAAAAAAQAAAAAAMAAAAAADAQAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAACXgAAAAAAAQAAAAAAXgAAAAADXgAAAAAAXgAAAAACXgAAAAABXgAAAAABXgAAAAACXgAAAAADXgAAAAADAQAAAAAAXgAAAAACXgAAAAADXgAAAAABfwAAAAAAXgAAAAACXgAAAAABAQAAAAAAXgAAAAACXgAAAAADXgAAAAABXgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAXgAAAAACAQAAAAAAXgAAAAADXgAAAAAAXgAAAAACfwAAAAAAXgAAAAABXgAAAAADMAAAAAACXgAAAAADfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAABMAAAAAADXgAAAAADXgAAAAADXgAAAAADXgAAAAADXgAAAAAAXgAAAAACAQAAAAAAXgAAAAAALwAAAAAALwAAAAAALwAAAAAALwAAAAAALwAAAAAAfwAAAAAAXgAAAAADAQAAAAAAXgAAAAADXgAAAAABXgAAAAABfwAAAAAAfwAAAAAAXgAAAAABAQAAAAAAXgAAAAADLwAAAAAALwAAAAAALwAAAAAALwAAAAAALwAAAAAAfwAAAAAAXgAAAAABAQAAAAAAXgAAAAACXgAAAAACXgAAAAADXgAAAAABXgAAAAABXgAAAAABAQAAAAAAXgAAAAAAfwAAAAAALwAAAAAALwAAAAAALwAAAAAALwAAAAAAfwAAAAAAXgAAAAADAQAAAAAAXgAAAAADfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAACAQAAAAAAXgAAAAACfwAAAAAALwAAAAAALwAAAAAALwAAAAAALwAAAAAAfwAAAAAAXgAAAAADAQAAAAAAXgAAAAAAXgAAAAACXgAAAAABXgAAAAADfwAAAAAAXgAAAAAAAQAAAAAAXgAAAAABfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAMAAAAAADXgAAAAABXgAAAAADXgAAAAAAXgAAAAADfwAAAAAAXgAAAAABAQAAAAAAXgAAAAABfwAAAAAAXgAAAAACXgAAAAAAXgAAAAACXgAAAAABfwAAAAAAXgAAAAADAQAAAAAAXgAAAAAAXgAAAAACXgAAAAAAXgAAAAAAXgAAAAABXgAAAAACAQAAAAAAXgAAAAACXgAAAAACXgAAAAAAXgAAAAABXgAAAAADXgAAAAACfwAAAAAAXgAAAAAAAQAAAAAAXgAAAAACfwAAAAAAfwAAAAAAXgAAAAADXgAAAAAAXgAAAAACAQAAAAAAXgAAAAABXgAAAAAAXgAAAAADfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAAQAAAAAAAQAAAAAAXgAAAAADfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAADAQAAAAAAXgAAAAACfwAAAAAAfwAAAAAAfwAAAAAAGAAAAAAAfwAAAAAAXgAAAAAAAQAAAAAAXgAAAAABfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAADXgAAAAADXgAAAAADAQAAAAAAXgAAAAAAXgAAAAADGAAAAAAAGAAAAAAAGAAAAAAAfwAAAAAAXgAAAAAAAQAAAAAAXgAAAAADfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAADXgAAAAAAXgAAAAAAMAAAAAABXgAAAAADXgAAAAACGAAAAAAAGAAAAAAAGAAAAAAAfwAAAAAAXgAAAAABMAAAAAADXgAAAAAAfwAAAAAA version: 6 -3,1: ind: -3,1 - tiles: fwAAAAAAfwAAAAAAXgAAAAACXgAAAAAAXgAAAAAAXgAAAAABXgAAAAACXgAAAAACGAAAAAAAGAAAAAAAGAAAAAAAfwAAAAAAXgAAAAACXgAAAAABXgAAAAABfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAACXgAAAAAAXgAAAAABXgAAAAABXgAAAAADfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAABXgAAAAAAXgAAAAACfwAAAAAAXgAAAAABXgAAAAAAXgAAAAACXgAAAAADXgAAAAADXgAAAAACXgAAAAADXgAAAAACXgAAAAACXgAAAAABXgAAAAABXgAAAAACXgAAAAAAXgAAAAADXgAAAAAAXgAAAAAAXgAAAAAAXgAAAAABXgAAAAACXgAAAAABXgAAAAAAMAAAAAADXgAAAAABXgAAAAABXgAAAAACXgAAAAABXgAAAAACMAAAAAAAXgAAAAAAMAAAAAABXgAAAAABXgAAAAABXgAAAAABXgAAAAABXgAAAAABXgAAAAACXgAAAAADXgAAAAAAXgAAAAACXgAAAAABXgAAAAADXgAAAAADXgAAAAACXgAAAAABXgAAAAACXgAAAAACXgAAAAAAXgAAAAADfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAACXgAAAAADXgAAAAACMgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAXgAAAAAAXgAAAAAAXgAAAAABUAAAAAAAfwAAAAAAXgAAAAAAXgAAAAADfwAAAAAAXgAAAAADXgAAAAAAXgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAXgAAAAADXgAAAAAAXgAAAAADfwAAAAAAfwAAAAAAXgAAAAAAXgAAAAAAXgAAAAABXgAAAAADXgAAAAACXgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAXgAAAAABXgAAAAABXgAAAAABfwAAAAAAfwAAAAAAXgAAAAADXgAAAAABXgAAAAADXgAAAAADMAAAAAAAXgAAAAABfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAADMAAAAAAAXgAAAAADfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAACXgAAAAABXgAAAAACfwAAAAAAcQAAAAADcQAAAAACcQAAAAAAfwAAAAAAXgAAAAADXgAAAAABXgAAAAAAfwAAAAAAfwAAAAAAXgAAAAABXgAAAAACXgAAAAADXgAAAAAAXgAAAAABXgAAAAADfwAAAAAAcQAAAAACcQAAAAABcQAAAAAAfwAAAAAAXgAAAAACXgAAAAADXgAAAAAAfwAAAAAAfwAAAAAAXgAAAAACXgAAAAAAXgAAAAACXgAAAAADXgAAAAADXgAAAAABXgAAAAACcQAAAAADfwAAAAAAcQAAAAADfwAAAAAAXgAAAAABXgAAAAACXgAAAAADPwAAAAAAfwAAAAAAXgAAAAAAXgAAAAADfwAAAAAAXgAAAAABXgAAAAABXgAAAAABfwAAAAAAfwAAAAAAfwAAAAAAcQAAAAABfwAAAAAAXgAAAAAAXgAAAAAAXgAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAXgAAAAADfwAAAAAAXgAAAAACXgAAAAAAXgAAAAAAXgAAAAADXgAAAAABfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAADXgAAAAAAXgAAAAACfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAMAAAAAABXgAAAAABXgAAAAAAXgAAAAADXgAAAAABXgAAAAADfwAAAAAAXgAAAAABMAAAAAAAXgAAAAABfwAAAAAAbQAAAAAAfwAAAAAAGAAAAAAAfwAAAAAAXgAAAAADXgAAAAACXgAAAAADfwAAAAAAXgAAAAABXgAAAAACfwAAAAAAfwAAAAAAXgAAAAACXgAAAAABXgAAAAADPQAAAAAA + tiles: fwAAAAAAfwAAAAAAXgAAAAACXgAAAAAAXgAAAAAAAQAAAAAAXgAAAAACXgAAAAACGAAAAAAAGAAAAAAAGAAAAAAAfwAAAAAAXgAAAAACAQAAAAAAXgAAAAABfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAACXgAAAAAAXgAAAAABAQAAAAAAXgAAAAADfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAABAQAAAAAAXgAAAAACfwAAAAAAXgAAAAABXgAAAAAAXgAAAAACXgAAAAADXgAAAAADAQAAAAAAXgAAAAADXgAAAAACXgAAAAACXgAAAAABXgAAAAABXgAAAAACXgAAAAAAAQAAAAAAXgAAAAAAXgAAAAAAXgAAAAAAXgAAAAABXgAAAAACXgAAAAABXgAAAAAAMAAAAAADAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAMAAAAAAAAQAAAAAAMAAAAAABXgAAAAABXgAAAAABXgAAAAABXgAAAAABXgAAAAABXgAAAAACXgAAAAADAQAAAAAAXgAAAAACXgAAAAABXgAAAAADXgAAAAADXgAAAAACXgAAAAABXgAAAAACAQAAAAAAXgAAAAAAXgAAAAADfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAACAQAAAAAAXgAAAAACMgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAXgAAAAAAAQAAAAAAXgAAAAABUAAAAAAAfwAAAAAAXgAAAAAAXgAAAAADfwAAAAAAXgAAAAADAQAAAAAAXgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAXgAAAAADAQAAAAAAXgAAAAADfwAAAAAAfwAAAAAAXgAAAAAAXgAAAAAAXgAAAAABXgAAAAADAQAAAAAAXgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAXgAAAAABAQAAAAAAXgAAAAABfwAAAAAAfwAAAAAAXgAAAAADXgAAAAABXgAAAAADXgAAAAADMAAAAAAAXgAAAAABfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAADMAAAAAAAXgAAAAADfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAACAQAAAAAAXgAAAAACfwAAAAAAcQAAAAADcQAAAAACcQAAAAAAfwAAAAAAXgAAAAADAQAAAAAAXgAAAAAAfwAAAAAAfwAAAAAAXgAAAAABXgAAAAACXgAAAAADXgAAAAAAAQAAAAAAXgAAAAADfwAAAAAAcQAAAAACcQAAAAABcQAAAAAAfwAAAAAAXgAAAAACAQAAAAAAXgAAAAAAfwAAAAAAfwAAAAAAXgAAAAACXgAAAAAAXgAAAAACXgAAAAADAQAAAAAAXgAAAAABXgAAAAACcQAAAAADfwAAAAAAcQAAAAADfwAAAAAAXgAAAAABAQAAAAAAXgAAAAADPwAAAAAAfwAAAAAAXgAAAAAAXgAAAAADfwAAAAAAXgAAAAABAQAAAAAAXgAAAAABfwAAAAAAfwAAAAAAfwAAAAAAcQAAAAABfwAAAAAAXgAAAAAAAQAAAAAAXgAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAXgAAAAADfwAAAAAAXgAAAAACAQAAAAAAXgAAAAAAXgAAAAADXgAAAAABfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAADAQAAAAAAXgAAAAACfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAMAAAAAABXgAAAAABXgAAAAAAXgAAAAADXgAAAAABXgAAAAADfwAAAAAAXgAAAAABMAAAAAAAXgAAAAABfwAAAAAAbQAAAAAAfwAAAAAAGAAAAAAAfwAAAAAAXgAAAAADAQAAAAAAXgAAAAADfwAAAAAAXgAAAAABXgAAAAACfwAAAAAAfwAAAAAAXgAAAAACAQAAAAAAXgAAAAADPQAAAAAA version: 6 -3,2: ind: -3,2 - tiles: fwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAADXgAAAAACXgAAAAABfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAXgAAAAADXgAAAAAAXgAAAAAAfwAAAAAAXgAAAAADXgAAAAACXgAAAAADXgAAAAAAXgAAAAADXgAAAAAAXgAAAAADXgAAAAABXgAAAAACXgAAAAACXgAAAAADXgAAAAAAXgAAAAABXgAAAAAAXgAAAAABfwAAAAAAXgAAAAACXgAAAAAAXgAAAAABXgAAAAADXgAAAAABMgAAAAAAXgAAAAACXgAAAAADXgAAAAACXgAAAAACXgAAAAAAXgAAAAADXgAAAAADMAAAAAABXgAAAAACUAAAAAAAXgAAAAAAXgAAAAAAXgAAAAADXgAAAAACXgAAAAAAXgAAAAABXgAAAAADXgAAAAACXgAAAAAAXgAAAAABXgAAAAABXgAAAAABXgAAAAACXgAAAAAAXgAAAAABUAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAABXgAAAAABXgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAXgAAAAACXgAAAAAAUAAAAAAAXgAAAAAAXgAAAAADXgAAAAAAXgAAAAAAXgAAAAADXgAAAAADXgAAAAABXgAAAAABXgAAAAACXgAAAAABXgAAAAABfwAAAAAAXgAAAAACXgAAAAAAXgAAAAABfwAAAAAAXgAAAAABXgAAAAAAXgAAAAACfwAAAAAAXgAAAAACXgAAAAAAXgAAAAACXgAAAAACXgAAAAACXgAAAAAAXgAAAAADfwAAAAAAXgAAAAAAXgAAAAABXgAAAAABfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAACXgAAAAACXgAAAAADXgAAAAACXgAAAAACfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAABXgAAAAABXgAAAAAAXgAAAAADfwAAAAAAXgAAAAACfwAAAAAAXgAAAAACMAAAAAADXgAAAAABXgAAAAACXgAAAAABXgAAAAAAXgAAAAABXgAAAAAAfwAAAAAAXgAAAAABMAAAAAACXgAAAAADXgAAAAABXgAAAAABXgAAAAAAXgAAAAADXgAAAAACXgAAAAACXgAAAAADXgAAAAABXgAAAAACXgAAAAAAXgAAAAAAXgAAAAADfwAAAAAAXgAAAAAAXgAAAAAAXgAAAAACXgAAAAABXgAAAAABXgAAAAACfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAXgAAAAABXgAAAAABfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAADXgAAAAAAXgAAAAADfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAXgAAAAADXgAAAAABXgAAAAACfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAXgAAAAACMAAAAAAAXgAAAAACAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAXgAAAAAAXgAAAAABXgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAACXgAAAAAA + tiles: fwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAADAQAAAAAAXgAAAAABfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAXgAAAAADAQAAAAAAXgAAAAAAfwAAAAAAXgAAAAADXgAAAAACXgAAAAADXgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAXgAAAAABXgAAAAACXgAAAAACXgAAAAADXgAAAAAAXgAAAAABAQAAAAAAXgAAAAABfwAAAAAAXgAAAAACXgAAAAAAXgAAAAABXgAAAAADAQAAAAAAMgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAMAAAAAABXgAAAAACUAAAAAAAXgAAAAAAXgAAAAAAXgAAAAADXgAAAAACAQAAAAAAAQAAAAAAAQAAAAAAXgAAAAACXgAAAAAAXgAAAAABXgAAAAABXgAAAAABXgAAAAACAQAAAAAAXgAAAAABUAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAABAQAAAAAAXgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAAQAAAAAAXgAAAAAAUAAAAAAAXgAAAAAAXgAAAAADXgAAAAAAXgAAAAAAXgAAAAADAQAAAAAAXgAAAAABXgAAAAABXgAAAAACXgAAAAABXgAAAAABfwAAAAAAXgAAAAACAQAAAAAAXgAAAAABfwAAAAAAXgAAAAABXgAAAAAAXgAAAAACfwAAAAAAXgAAAAACAQAAAAAAXgAAAAACXgAAAAACXgAAAAACXgAAAAAAXgAAAAADfwAAAAAAXgAAAAAAAQAAAAAAAQAAAAAAXgAAAAAAfwAAAAAAfwAAAAAAXgAAAAACXgAAAAACXgAAAAADAQAAAAAAXgAAAAACfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAABAQAAAAAAXgAAAAAAXgAAAAADfwAAAAAAXgAAAAACfwAAAAAAXgAAAAACMAAAAAADXgAAAAABXgAAAAACXgAAAAABXgAAAAAAXgAAAAABXgAAAAAAfwAAAAAAXgAAAAABMAAAAAACXgAAAAADXgAAAAABXgAAAAABXgAAAAAAXgAAAAADXgAAAAACXgAAAAACXgAAAAADXgAAAAABXgAAAAACXgAAAAAAXgAAAAAAXgAAAAADfwAAAAAAXgAAAAAAAQAAAAAAXgAAAAACXgAAAAABXgAAAAABXgAAAAACfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAAQAAAAAAXgAAAAABfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAADAQAAAAAAXgAAAAADfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAXgAAAAADAQAAAAAAXgAAAAACfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAXgAAAAACMAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAXgAAAAAAXgAAAAABAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAACAQAAAAAA version: 6 -3,-1: ind: -3,-1 @@ -177,15 +179,15 @@ entities: version: 6 -1,3: ind: -1,3 - tiles: cQAAAAADcQAAAAAAcQAAAAACfwAAAAAAcQAAAAADcQAAAAAAcQAAAAABcQAAAAACcQAAAAADfwAAAAAAXgAAAAABXgAAAAABXgAAAAADXgAAAAADXgAAAAADfwAAAAAAcQAAAAAAcQAAAAADcQAAAAADcQAAAAABcQAAAAAAcQAAAAADcQAAAAABcQAAAAABcQAAAAADfwAAAAAAXgAAAAACXgAAAAADMAAAAAABXgAAAAADXgAAAAABfwAAAAAAcQAAAAABcQAAAAADcQAAAAACfwAAAAAAcQAAAAACcQAAAAABcQAAAAAAcQAAAAACcQAAAAABfwAAAAAAXgAAAAAAXgAAAAADXgAAAAAAXgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAcQAAAAAAfwAAAAAAfwAAAAAAXgAAAAACXgAAAAAAXgAAAAAAfwAAAAAAfwAAAAAAMgAAAAAAXgAAAAABXgAAAAACXgAAAAADXgAAAAAAXgAAAAACXgAAAAABXgAAAAAAXgAAAAACXgAAAAADXgAAAAAAXgAAAAAAXgAAAAACXgAAAAABMgAAAAAAMgAAAAAAMgAAAAAAMAAAAAADXgAAAAADXgAAAAAAXgAAAAAAXgAAAAABXgAAAAAAMAAAAAAAXgAAAAAAXgAAAAADXgAAAAAAMAAAAAACXgAAAAACXgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAXgAAAAACXgAAAAABXgAAAAADXgAAAAADXgAAAAABXgAAAAACXgAAAAACXgAAAAACXgAAAAACXgAAAAABXgAAAAABXgAAAAAAXgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAXgAAAAACXgAAAAADfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAIAAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAXgAAAAAAfwAAAAAAIAAAAAAAIAAAAAABIAAAAAACIAAAAAACIAAAAAABfwAAAAAAIAAAAAACIAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAXgAAAAABXgAAAAAAUAAAAAAAIAAAAAAAIAAAAAAAIAAAAAAAIAAAAAACIAAAAAADfwAAAAAAIAAAAAADIAAAAAACfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAATwAAAAABXgAAAAABUAAAAAAAIAAAAAADIAAAAAABIAAAAAAAIAAAAAAAIAAAAAABfwAAAAAAIAAAAAADIAAAAAACfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAXgAAAAADXgAAAAACXgAAAAADIAAAAAAAIAAAAAAAIAAAAAABIAAAAAADIAAAAAADfwAAAAAAIAAAAAABIAAAAAABfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAATwAAAAADXgAAAAADUAAAAAAAIAAAAAADIAAAAAAAIAAAAAADIAAAAAACIAAAAAADfwAAAAAAIAAAAAACIAAAAAADUAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAXgAAAAADXgAAAAABUAAAAAAAIAAAAAABIAAAAAAAIAAAAAACIAAAAAADIAAAAAACfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAXgAAAAABXgAAAAAAUAAAAAAAIAAAAAACIAAAAAADIAAAAAACIAAAAAAAIAAAAAABfwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAUAAAAAAAXgAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAA + tiles: cQAAAAADcQAAAAAAcQAAAAACfwAAAAAAcQAAAAADcQAAAAAAcQAAAAABcQAAAAACcQAAAAADfwAAAAAAXgAAAAABXgAAAAABAQAAAAAAXgAAAAADXgAAAAADfwAAAAAAcQAAAAAAcQAAAAADcQAAAAADcQAAAAABcQAAAAAAcQAAAAADcQAAAAABcQAAAAABcQAAAAADfwAAAAAAXgAAAAACAQAAAAAAMAAAAAABXgAAAAADXgAAAAABfwAAAAAAcQAAAAABcQAAAAADcQAAAAACfwAAAAAAcQAAAAACcQAAAAABcQAAAAAAcQAAAAACcQAAAAABfwAAAAAAXgAAAAAAAQAAAAAAXgAAAAAAXgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAcQAAAAAAfwAAAAAAfwAAAAAAXgAAAAACAQAAAAAAXgAAAAAAfwAAAAAAfwAAAAAAMgAAAAAAXgAAAAABXgAAAAACXgAAAAADXgAAAAAAXgAAAAACXgAAAAABXgAAAAAAXgAAAAACXgAAAAADXgAAAAAAXgAAAAAAAQAAAAAAXgAAAAABMgAAAAAAMgAAAAAAMgAAAAAAMAAAAAADAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAMAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAMAAAAAACAQAAAAAAXgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAAQAAAAAAXgAAAAABXgAAAAADXgAAAAADXgAAAAABXgAAAAACXgAAAAACXgAAAAACXgAAAAACXgAAAAABXgAAAAABXgAAAAAAXgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAAQAAAAAAXgAAAAADfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAIAAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAAQAAAAAAXgAAAAAAfwAAAAAAIAAAAAAAIAAAAAABIAAAAAACIAAAAAACIAAAAAABfwAAAAAAIAAAAAACIAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAAQAAAAAAXgAAAAAAUAAAAAAAIAAAAAAAIAAAAAAAIAAAAAAAIAAAAAACIAAAAAADfwAAAAAAIAAAAAADIAAAAAACfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAATwAAAAABXgAAAAABUAAAAAAAIAAAAAADIAAAAAABIAAAAAAAIAAAAAAAIAAAAAABfwAAAAAAIAAAAAADIAAAAAACfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAAQAAAAAAXgAAAAACXgAAAAADIAAAAAAAIAAAAAAAIAAAAAABIAAAAAADIAAAAAADfwAAAAAAIAAAAAABIAAAAAABfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAAQAAAAAAXgAAAAADUAAAAAAAIAAAAAADIAAAAAAAIAAAAAADIAAAAAACIAAAAAADfwAAAAAAIAAAAAACIAAAAAADUAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAAQAAAAAAXgAAAAABUAAAAAAAIAAAAAABIAAAAAAAIAAAAAACIAAAAAADIAAAAAACfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAAQAAAAAAXgAAAAAAUAAAAAAAIAAAAAACIAAAAAADIAAAAAACIAAAAAAAIAAAAAABfwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAUAAAAAAAXgAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAA version: 6 -2,3: ind: -2,3 - tiles: XgAAAAADfwAAAAAAcQAAAAABcQAAAAAAcQAAAAADfwAAAAAAcQAAAAADcQAAAAABcQAAAAABcQAAAAAAcQAAAAABcQAAAAAAcQAAAAACcQAAAAABcQAAAAACcQAAAAAAXgAAAAABfwAAAAAAcQAAAAADcQAAAAAAcQAAAAABcQAAAAAAcQAAAAABcQAAAAABcQAAAAABcQAAAAAAcQAAAAACcQAAAAADcQAAAAACcQAAAAAAcQAAAAAAcQAAAAADXgAAAAAAfwAAAAAAfwAAAAAAcQAAAAACcQAAAAABcQAAAAAAcQAAAAADcQAAAAAAcQAAAAABcQAAAAACcQAAAAACcQAAAAAAcQAAAAAAcQAAAAACcQAAAAAAcQAAAAACXgAAAAADXgAAAAABfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAcQAAAAAAXgAAAAADXgAAAAADXgAAAAADXgAAAAACXgAAAAAAXgAAAAACXgAAAAAAXgAAAAABXgAAAAABXgAAAAACXgAAAAABXgAAAAAAXgAAAAADXgAAAAAAXgAAAAABXgAAAAAAXgAAAAABXgAAAAACXgAAAAAAXgAAAAADXgAAAAAAMAAAAAAAXgAAAAAAXgAAAAADXgAAAAADMAAAAAACXgAAAAABXgAAAAABXgAAAAACXgAAAAADXgAAAAADXgAAAAACXgAAAAACXgAAAAAAXgAAAAADXgAAAAABXgAAAAACXgAAAAACXgAAAAADXgAAAAADXgAAAAABXgAAAAACXgAAAAABXgAAAAACXgAAAAADXgAAAAAAXgAAAAADXgAAAAABfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAABXgAAAAABfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAXgAAAAADIAAAAAAAIAAAAAADfwAAAAAAIAAAAAABIAAAAAABfwAAAAAAIAAAAAAAIAAAAAAAIAAAAAABfwAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAfwAAAAAAXgAAAAAAIAAAAAACIAAAAAACfwAAAAAAIAAAAAACIAAAAAAAfwAAAAAAIAAAAAACIAAAAAAAIAAAAAADUAAAAAAANAAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAUAAAAAAAXgAAAAADIAAAAAADIAAAAAACfwAAAAAATwAAAAAATwAAAAAAIAAAAAACIAAAAAAAIAAAAAADIAAAAAADUAAAAAAANAAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAUAAAAAAAXgAAAAABfwAAAAAAIAAAAAAAfwAAAAAAIAAAAAABIAAAAAADIAAAAAACIAAAAAABIAAAAAADIAAAAAADfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAXgAAAAADIAAAAAAAIAAAAAAATwAAAAABIAAAAAACIAAAAAABIAAAAAABIAAAAAADIAAAAAACIAAAAAABfwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAXgAAAAADIAAAAAAAIAAAAAADTwAAAAADIAAAAAADIAAAAAABIAAAAAABIAAAAAADIAAAAAACIAAAAAADUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAXgAAAAADUAAAAAAAfwAAAAAAfwAAAAAAIAAAAAACIAAAAAACIAAAAAACIAAAAAABIAAAAAACIAAAAAACUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAXgAAAAACKQAAAAADfwAAAAAAfwAAAAAAfwAAAAAAbgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAXgAAAAAD + tiles: XgAAAAADfwAAAAAAcQAAAAABcQAAAAAAcQAAAAADfwAAAAAAcQAAAAADcQAAAAABcQAAAAABcQAAAAAAcQAAAAABcQAAAAAAcQAAAAACcQAAAAABcQAAAAACcQAAAAAAXgAAAAABfwAAAAAAcQAAAAADcQAAAAAAcQAAAAABcQAAAAAAcQAAAAABcQAAAAABcQAAAAABcQAAAAAAcQAAAAACcQAAAAADcQAAAAACcQAAAAAAcQAAAAAAcQAAAAADXgAAAAAAfwAAAAAAfwAAAAAAcQAAAAACcQAAAAABcQAAAAAAcQAAAAADcQAAAAAAcQAAAAABcQAAAAACcQAAAAACcQAAAAAAcQAAAAAAcQAAAAACcQAAAAAAcQAAAAACXgAAAAADXgAAAAABfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAcQAAAAAAXgAAAAADXgAAAAADXgAAAAADXgAAAAACXgAAAAAAXgAAAAACXgAAAAAAXgAAAAABXgAAAAABXgAAAAACXgAAAAABXgAAAAAAXgAAAAADXgAAAAAAXgAAAAABXgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAMAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAMAAAAAACAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAXgAAAAACXgAAAAAAXgAAAAADXgAAAAABXgAAAAACXgAAAAACXgAAAAADXgAAAAADXgAAAAABXgAAAAACXgAAAAABXgAAAAACXgAAAAADXgAAAAAAXgAAAAADXgAAAAABfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAABXgAAAAABfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAXgAAAAADIAAAAAAAIAAAAAADfwAAAAAAIAAAAAABIAAAAAABfwAAAAAAIAAAAAAAIAAAAAAAIAAAAAABfwAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAfwAAAAAAXgAAAAAAIAAAAAACIAAAAAACfwAAAAAAIAAAAAACIAAAAAAAfwAAAAAAIAAAAAACIAAAAAAAIAAAAAADUAAAAAAANAAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAUAAAAAAAXgAAAAADIAAAAAADIAAAAAACfwAAAAAATwAAAAAATwAAAAAAIAAAAAACIAAAAAAAIAAAAAADIAAAAAADUAAAAAAANAAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAUAAAAAAAXgAAAAABfwAAAAAAIAAAAAAAfwAAAAAAIAAAAAABIAAAAAADIAAAAAACIAAAAAABIAAAAAADIAAAAAADfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAXgAAAAADIAAAAAAAIAAAAAAATwAAAAABIAAAAAACIAAAAAABIAAAAAABIAAAAAADIAAAAAACIAAAAAABfwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAXgAAAAADIAAAAAAAIAAAAAADTwAAAAADIAAAAAADIAAAAAABIAAAAAABIAAAAAADIAAAAAACIAAAAAADUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAXgAAAAADUAAAAAAAfwAAAAAAfwAAAAAAIAAAAAACIAAAAAACIAAAAAACIAAAAAABIAAAAAACIAAAAAACUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAXgAAAAACKQAAAAADfwAAAAAAfwAAAAAAfwAAAAAAbgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAXgAAAAAD version: 6 -3,3: ind: -3,3 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAXgAAAAACMAAAAAADfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAXgAAAAADXgAAAAADNAAAAAAANAAAAAAANAAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAQQAAAAAAQQAAAAAAQQAAAAAAQQAAAAAAXgAAAAADXgAAAAACNAAAAAAANAAAAAAANAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAQQAAAAAAQQAAAAAAQQAAAAAAfwAAAAAAXgAAAAAAXgAAAAACfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAGAAAAAAAfwAAAAAAbQAAAAAAbQAAAAAAbQAAAAAAewAAAAAAQQAAAAAAQQAAAAAAQQAAAAAAfwAAAAAAXgAAAAACXgAAAAADcQAAAAADfwAAAAAAcQAAAAADfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAbQAAAAAAfwAAAAAAfwAAAAAAQQAAAAAAQQAAAAAAQQAAAAAAfwAAAAAAXgAAAAADMAAAAAABcQAAAAAAfwAAAAAAcQAAAAAAfwAAAAAAfwAAAAAAewAAAAAAewAAAAAAewAAAAAAewAAAAAAfQAAAAAAewAAAAAAewAAAAAAewAAAAAAfwAAAAAAXgAAAAACXgAAAAAAcQAAAAADcQAAAAABcQAAAAABcQAAAAABfwAAAAAAewAAAAAAewAAAAAAewAAAAAAewAAAAAAfQAAAAAAewAAAAAAewAAAAAAewAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAcQAAAAACcQAAAAAAcQAAAAACcQAAAAADfwAAAAAAewAAAAAAewAAAAAAewAAAAAAewAAAAAAfQAAAAAAewAAAAAAewAAAAAAfwAAAAAAfwAAAAAAIAAAAAACIAAAAAAAfwAAAAAAcQAAAAACcQAAAAAAcQAAAAAAfwAAAAAAewAAAAAAewAAAAAAewAAAAAAewAAAAAAfQAAAAAAewAAAAAAewAAAAAAfwAAAAAAJgAAAAAAIAAAAAABIAAAAAABfwAAAAAAcQAAAAADcQAAAAAAcQAAAAAAfwAAAAAAewAAAAAAewAAAAAAewAAAAAAewAAAAAAfQAAAAAAewAAAAAAewAAAAAAfwAAAAAAJgAAAAAAIAAAAAADIAAAAAADfwAAAAAAcQAAAAACcQAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAcQAAAAAAcQAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAIAAAAAACIAAAAAAAIAAAAAAATwAAAAADIAAAAAAAIAAAAAADIAAAAAABIAAAAAAATwAAAAADIAAAAAACIAAAAAABIAAAAAACIAAAAAACTwAAAAAAIAAAAAADIAAAAAADIAAAAAADIAAAAAABIAAAAAADTwAAAAACIAAAAAADIAAAAAABIAAAAAAAIAAAAAADTwAAAAACIAAAAAAAIAAAAAACIAAAAAADIAAAAAADTwAAAAACIAAAAAACIAAAAAABfwAAAAAAIAAAAAABIAAAAAABIAAAAAABIAAAAAADIAAAAAACfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAKQAAAAACKQAAAAABfwAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAIAAAAAADIAAAAAAAIAAAAAADIAAAAAAAIAAAAAADfwAAAAAAKQAAAAADKQAAAAAAKQAAAAADKQAAAAACKQAAAAACKQAAAAADKQAAAAABKQAAAAABKQAAAAAC + tiles: AAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAXgAAAAACMAAAAAADfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAXgAAAAADAQAAAAAANAAAAAAANAAAAAAANAAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAQQAAAAAAQQAAAAAAQQAAAAAAQQAAAAAAQQAAAAAAAQAAAAAANAAAAAAANAAAAAAANAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAQQAAAAAAQQAAAAAAQQAAAAAAfwAAAAAAXgAAAAAAAQAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAGAAAAAAAfwAAAAAAbQAAAAAAbQAAAAAAbQAAAAAAewAAAAAAQQAAAAAAQQAAAAAAQQAAAAAAfwAAAAAAXgAAAAACAQAAAAAAcQAAAAADfwAAAAAAcQAAAAADfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAbQAAAAAAfwAAAAAAfwAAAAAAQQAAAAAAQQAAAAAAQQAAAAAAfwAAAAAAXgAAAAADMAAAAAABcQAAAAAAfwAAAAAAcQAAAAAAfwAAAAAAfwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAfQAAAAAAewAAAAAAewAAAAAAewAAAAAAfwAAAAAAXgAAAAACXgAAAAAAcQAAAAADcQAAAAABcQAAAAABcQAAAAABfwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAfQAAAAAAewAAAAAAewAAAAAAewAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAcQAAAAACcQAAAAAAcQAAAAACcQAAAAADfwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAfQAAAAAAewAAAAAAewAAAAAAfwAAAAAAfwAAAAAAIAAAAAACIAAAAAAAfwAAAAAAcQAAAAACcQAAAAAAcQAAAAAAfwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAfQAAAAAAewAAAAAAewAAAAAAfwAAAAAAJgAAAAAAIAAAAAABIAAAAAABfwAAAAAAcQAAAAADcQAAAAAAcQAAAAAAfwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAfQAAAAAAewAAAAAAewAAAAAAfwAAAAAAJgAAAAAAIAAAAAADIAAAAAADfwAAAAAAcQAAAAACcQAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAcQAAAAAAcQAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAIAAAAAACIAAAAAAAIAAAAAAATwAAAAADIAAAAAAAIAAAAAADIAAAAAABIAAAAAAATwAAAAADIAAAAAACIAAAAAABIAAAAAACIAAAAAACTwAAAAAAIAAAAAADIAAAAAADIAAAAAADIAAAAAABIAAAAAADTwAAAAACIAAAAAADIAAAAAABIAAAAAAAIAAAAAADTwAAAAACIAAAAAAAIAAAAAACIAAAAAADIAAAAAADTwAAAAACIAAAAAACIAAAAAABfwAAAAAAIAAAAAABIAAAAAABIAAAAAABIAAAAAADIAAAAAACfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAKQAAAAACKQAAAAABfwAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAIAAAAAADIAAAAAAAIAAAAAADIAAAAAAAIAAAAAADfwAAAAAAKQAAAAADKQAAAAAAKQAAAAADKQAAAAACKQAAAAACKQAAAAADKQAAAAABKQAAAAABKQAAAAAC version: 6 0,3: ind: 0,3 @@ -201,7 +203,7 @@ entities: version: 6 1,-3: ind: 1,-3 - tiles: fwAAAAAAfwAAAAAAfwAAAAAABwAAAAABBwAAAAABBwAAAAABBwAAAAABBwAAAAACBwAAAAACBwAAAAACBwAAAAAABwAAAAAABwAAAAABBwAAAAACBwAAAAAABwAAAAABfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAABwAAAAACBwAAAAABBwAAAAABBwAAAAACBwAAAAAABwAAAAACBwAAAAABBwAAAAAABwAAAAACBwAAAAABfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAABwAAAAABBwAAAAABfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAABwAAAAAABwAAAAABBwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAABwAAAAAAfwAAAAAAagAAAAAAagAAAAAAagAAAAAAfwAAAAAABwAAAAAABwAAAAACfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAABwAAAAAAfwAAAAAAagAAAAAAagAAAAAAagAAAAAAagAAAAAAagAAAAAAagAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAABwAAAAACBwAAAAAABwAAAAAABwAAAAACfwAAAAAAaQAAAAABaQAAAAACagAAAAAAagAAAAAAagAAAAAAagAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAABwAAAAACBwAAAAAABwAAAAABBwAAAAABfwAAAAAAagAAAAAAagAAAAAAagAAAAAAEwAAAAACEwAAAAAAEwAAAAACUAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAACAAAAAAABwAAAAABBwAAAAACBwAAAAABfwAAAAAAagAAAAAAagAAAAAAagAAAAAAEwAAAAACEwAAAAABEwAAAAABUAAAAAAABwAAAAABfwAAAAAAfwAAAAAAfwAAAAAABwAAAAACBwAAAAAABwAAAAABBwAAAAACfwAAAAAAagAAAAAAagAAAAAAagAAAAAAEwAAAAADEwAAAAACEwAAAAABUAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAABwAAAAAABwAAAAAABwAAAAACBwAAAAABfwAAAAAAXgAAAAACXgAAAAABfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAXgAAAAABXgAAAAADXgAAAAABXgAAAAADXgAAAAADXgAAAAACXgAAAAACXgAAAAAAXgAAAAACXgAAAAABXgAAAAAAXgAAAAAAXgAAAAACXgAAAAACXgAAAAADXgAAAAACXgAAAAACXgAAAAACXgAAAAACXgAAAAABXgAAAAACXgAAAAAAXgAAAAABXgAAAAADMAAAAAACMAAAAAACMAAAAAACMAAAAAADMAAAAAADXgAAAAAAXgAAAAACXgAAAAAAMAAAAAABXgAAAAACXgAAAAADXgAAAAABXgAAAAABXgAAAAADXgAAAAAAXgAAAAAAXgAAAAACXgAAAAACXgAAAAABXgAAAAABXgAAAAACXgAAAAACXgAAAAAAXgAAAAACXgAAAAADXgAAAAACXgAAAAACfwAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAXgAAAAADXgAAAAAAfwAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAVQAAAAAAfwAAAAAAfwAAAAAAXgAAAAADXgAAAAADfwAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfwAAAAAAVwAAAAAAfwAAAAAAWgAAAAAAWgAAAAAAWgAAAAAAWgAAAAAAVQAAAAAAWgAAAAAAWgAAAAAA + tiles: fwAAAAAAfwAAAAAAfwAAAAAABwAAAAABBwAAAAABBwAAAAABBwAAAAABBwAAAAACBwAAAAACBwAAAAACBwAAAAAABwAAAAAABwAAAAABBwAAAAACBwAAAAAABwAAAAABfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAABwAAAAACBwAAAAABBwAAAAABBwAAAAACBwAAAAAABwAAAAACBwAAAAABBwAAAAAABwAAAAACBwAAAAABfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAABwAAAAABBwAAAAABfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAABwAAAAAABwAAAAABBwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAABwAAAAAAfwAAAAAAagAAAAAAagAAAAAAagAAAAAAfwAAAAAABwAAAAAABwAAAAACfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAABwAAAAAAfwAAAAAAagAAAAAAagAAAAAAagAAAAAAagAAAAAAagAAAAAAagAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAABwAAAAACBwAAAAAABwAAAAAABwAAAAACfwAAAAAAaQAAAAABaQAAAAACagAAAAAAagAAAAAAagAAAAAAagAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAABwAAAAACBwAAAAAABwAAAAABBwAAAAABfwAAAAAAagAAAAAAagAAAAAAagAAAAAAEwAAAAACEwAAAAAAEwAAAAACUAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAACAAAAAAABwAAAAABBwAAAAACBwAAAAABfwAAAAAAagAAAAAAagAAAAAAagAAAAAAEwAAAAACEwAAAAABEwAAAAABUAAAAAAABwAAAAABfwAAAAAAfwAAAAAAfwAAAAAABwAAAAACBwAAAAAABwAAAAABBwAAAAACfwAAAAAAagAAAAAAagAAAAAAagAAAAAAEwAAAAADEwAAAAACEwAAAAABUAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAABwAAAAAABwAAAAAABwAAAAACBwAAAAABfwAAAAAAXgAAAAACXgAAAAABfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAXgAAAAABXgAAAAADXgAAAAABXgAAAAADXgAAAAADXgAAAAACXgAAAAACXgAAAAAAXgAAAAACXgAAAAABXgAAAAAAXgAAAAAAXgAAAAACXgAAAAACXgAAAAADXgAAAAACXgAAAAACAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAMAAAAAACMAAAAAACMAAAAAACMAAAAAADMAAAAAADAQAAAAAAAQAAAAAAAQAAAAAAMAAAAAABAQAAAAAAXgAAAAADXgAAAAABXgAAAAABXgAAAAADXgAAAAAAXgAAAAAAXgAAAAACXgAAAAACXgAAAAABXgAAAAABXgAAAAACXgAAAAACXgAAAAAAXgAAAAACAQAAAAAAXgAAAAACXgAAAAACfwAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAAQAAAAAAXgAAAAAAfwAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAVQAAAAAAfwAAAAAAfwAAAAAAAQAAAAAAXgAAAAADfwAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfwAAAAAAVwAAAAAAfwAAAAAAWgAAAAAAWgAAAAAAWgAAAAAAWgAAAAAAVQAAAAAAWgAAAAAAWgAAAAAA version: 6 2,-2: ind: 2,-2 @@ -209,7 +211,7 @@ entities: version: 6 2,-3: ind: 2,-3 - tiles: BwAAAAABBwAAAAACBwAAAAABBwAAAAABBwAAAAAABwAAAAACBwAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAACBwAAAAACBwAAAAABBwAAAAACBwAAAAACBwAAAAACBwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAAABwAAAAABBwAAAAABBwAAAAABBwAAAAACBwAAAAACBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXgAAAAADXgAAAAADXgAAAAADXgAAAAABUAAAAAAAUAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXgAAAAADXgAAAAACXgAAAAAAXgAAAAADUAAAAAAAUAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXgAAAAACXgAAAAADXgAAAAACXgAAAAADUAAAAAAAUAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXgAAAAAAXgAAAAAAXgAAAAABMgAAAAAAMgAAAAAAUAAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXgAAAAABXgAAAAACXgAAAAAAMgAAAAAAMgAAAAAAUAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXgAAAAACXgAAAAADXgAAAAAAMgAAAAAAMgAAAAAAUAAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXgAAAAAAXgAAAAAAXgAAAAABXgAAAAACUAAAAAAAUAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXgAAAAACXgAAAAABXgAAAAACXgAAAAADUAAAAAAAUAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXgAAAAACXgAAAAABXgAAAAABXgAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: BwAAAAABBwAAAAACBwAAAAABBwAAAAABBwAAAAAABwAAAAACBwAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAACBwAAAAACBwAAAAABBwAAAAACBwAAAAACBwAAAAACBwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAAABwAAAAABBwAAAAABBwAAAAABBwAAAAACBwAAAAACBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXgAAAAADXgAAAAADXgAAAAADXgAAAAABUAAAAAAAUAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXgAAAAADMAAAAAAAXgAAAAAAXgAAAAADUAAAAAAAUAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXgAAAAACAQAAAAAAXgAAAAACXgAAAAADUAAAAAAAUAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXgAAAAAAAQAAAAAAXgAAAAABMgAAAAAAMgAAAAAAUAAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXgAAAAABAQAAAAAAXgAAAAAAMgAAAAAAMgAAAAAAUAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXgAAAAACAQAAAAAAXgAAAAAAMgAAAAAAMgAAAAAAUAAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXgAAAAAAAQAAAAAAXgAAAAABXgAAAAACUAAAAAAAUAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAMAAAAAAAXgAAAAACXgAAAAADUAAAAAAAUAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXgAAAAACXgAAAAABXgAAAAABXgAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 2,-1: ind: 2,-1 @@ -217,7 +219,7 @@ entities: version: 6 -3,-2: ind: -3,-2 - tiles: fwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAMAAAAAACMgAAAAAAMgAAAAAAMgAAAAAAUAAAAAAAMgAAAAAAMgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAADMAAAAAABMgAAAAAAMgAAAAAAMgAAAAAACwAAAAAAMgAAAAAAMgAAAAAAUAAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAMAAAAAADMgAAAAAAMgAAAAAAMgAAAAAAUAAAAAAAMgAAAAAAMgAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAADXgAAAAACMAAAAAABMgAAAAAAMgAAAAAAMgAAAAAAUAAAAAAAMgAAAAAAMgAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAABXgAAAAACMAAAAAACMAAAAAACMAAAAAAAMAAAAAACfwAAAAAAMAAAAAABMAAAAAADfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAACXgAAAAACXgAAAAACXgAAAAAAXgAAAAADXgAAAAADXgAAAAABfwAAAAAAXgAAAAADXgAAAAADBwAAAAABfwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAXgAAAAADXgAAAAADXgAAAAAAXgAAAAAAXgAAAAAAXgAAAAADXgAAAAABXgAAAAAAXgAAAAACXgAAAAAABwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAMAAAAAAAXgAAAAACXgAAAAAAXgAAAAABMAAAAAABXgAAAAACXgAAAAACXgAAAAACXgAAAAADXgAAAAAAAAAAAAAAfgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAXgAAAAADXgAAAAADXgAAAAADXgAAAAADXgAAAAACXgAAAAADXgAAAAABXgAAAAAAXgAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAIAAAAAAAIAAAAAADIAAAAAACIAAAAAADfwAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAIAAAAAAAIAAAAAAAIAAAAAABIAAAAAACIAAAAAABfwAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAIAAAAAADIAAAAAABIAAAAAACIAAAAAACfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAA + tiles: fwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAMAAAAAACMgAAAAAAMgAAAAAAMgAAAAAAUAAAAAAAMgAAAAAAMgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAADMAAAAAABMgAAAAAAMgAAAAAAMgAAAAAACwAAAAAAMgAAAAAAMgAAAAAAUAAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAMAAAAAADMgAAAAAAMgAAAAAAMgAAAAAAUAAAAAAAMgAAAAAAMgAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAADXgAAAAACMAAAAAABMgAAAAAAMgAAAAAAMgAAAAAAUAAAAAAAMgAAAAAAMgAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAABXgAAAAACMAAAAAACMAAAAAACMAAAAAAAMAAAAAACfwAAAAAAMAAAAAABMAAAAAADfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAACXgAAAAACXgAAAAACXgAAAAAAAQAAAAAAXgAAAAADXgAAAAAAfwAAAAAAXgAAAAAAXgAAAAADBwAAAAABfwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAXgAAAAADXgAAAAADXgAAAAAAXgAAAAAAAQAAAAAAXgAAAAADXgAAAAABXgAAAAAAXgAAAAAAXgAAAAAABwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAMAAAAAAAXgAAAAACXgAAAAAAXgAAAAABMAAAAAABAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAfgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAXgAAAAADXgAAAAADXgAAAAADXgAAAAADXgAAAAACXgAAAAADXgAAAAABXgAAAAAAXgAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAIAAAAAAAIAAAAAADIAAAAAACIAAAAAADfwAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAIAAAAAAAIAAAAAAAIAAAAAABIAAAAAACIAAAAAABfwAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAIAAAAAADIAAAAAABIAAAAAACIAAAAAACfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAA version: 6 -2,-3: ind: -2,-3 @@ -237,11 +239,11 @@ entities: version: 6 -3,-3: ind: -3,-3 - tiles: CwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAAfwAAAAAABwAAAAAABwAAAAAABwAAAAAABwAAAAABBwAAAAACBwAAAAABBwAAAAABBwAAAAABBwAAAAAAfwAAAAAACwAAAAAAfwAAAAAAfwAAAAAACwAAAAAACwAAAAAAUAAAAAAABwAAAAAABwAAAAABBwAAAAAABwAAAAACBwAAAAAABwAAAAABBwAAAAACBwAAAAAABwAAAAABUAAAAAAACwAAAAAAfwAAAAAAfwAAAAAACwAAAAAACwAAAAAAUAAAAAAABwAAAAABBwAAAAAABwAAAAABBwAAAAABBwAAAAAABwAAAAAABwAAAAAABwAAAAAABwAAAAACUAAAAAAAXgAAAAADTwAAAAACXgAAAAACTwAAAAABfwAAAAAAfwAAAAAABwAAAAACBwAAAAABBwAAAAACBwAAAAABBwAAAAACBwAAAAABBwAAAAAABwAAAAABBwAAAAACfwAAAAAAXgAAAAADTwAAAAABXgAAAAADfwAAAAAAfwAAAAAABwAAAAABBwAAAAACBwAAAAACBwAAAAAABwAAAAACBwAAAAABBwAAAAACBwAAAAACBwAAAAAABwAAAAAABwAAAAACXgAAAAACXgAAAAAAXgAAAAABXgAAAAAAXgAAAAABfwAAAAAABwAAAAABBwAAAAABBwAAAAAABwAAAAACBwAAAAABBwAAAAACBwAAAAACBwAAAAACBwAAAAACfwAAAAAAXgAAAAABXgAAAAADXgAAAAADXgAAAAACXgAAAAAAfwAAAAAAfwAAAAAABwAAAAABBwAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAXgAAAAADXgAAAAABXgAAAAAAXgAAAAAAXgAAAAAAXgAAAAABXgAAAAAAXgAAAAABXgAAAAABXgAAAAADXgAAAAAAXgAAAAAAXgAAAAADXgAAAAACXgAAAAADXgAAAAADXgAAAAACXgAAAAABXgAAAAADXgAAAAABXgAAAAADMAAAAAADMAAAAAAAXgAAAAAAXgAAAAADXgAAAAAAXgAAAAACXgAAAAADXgAAAAADXgAAAAADMAAAAAACMAAAAAAAXgAAAAACXgAAAAACXgAAAAAAXgAAAAAAXgAAAAABXgAAAAACXgAAAAACXgAAAAACXgAAAAABXgAAAAABXgAAAAABXgAAAAADXgAAAAAAXgAAAAAAXgAAAAACXgAAAAACXgAAAAAAXgAAAAABXgAAAAABfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAXgAAAAABXgAAAAAAXgAAAAADXgAAAAADXgAAAAABfwAAAAAAXgAAAAADXgAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAXgAAAAAAXgAAAAABMAAAAAAAMAAAAAABMAAAAAAAMAAAAAACfwAAAAAAMAAAAAAAMAAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAADMAAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAUAAAAAAAMgAAAAAAMgAAAAAA + tiles: CwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAAfwAAAAAABwAAAAAABwAAAAAABwAAAAAABwAAAAABBwAAAAACBwAAAAABBwAAAAABBwAAAAABBwAAAAAAfwAAAAAACwAAAAAAfwAAAAAAfwAAAAAACwAAAAAACwAAAAAAUAAAAAAABwAAAAAABwAAAAABBwAAAAAABwAAAAACBwAAAAAABwAAAAABBwAAAAACBwAAAAAABwAAAAABUAAAAAAACwAAAAAAfwAAAAAAfwAAAAAACwAAAAAACwAAAAAAUAAAAAAABwAAAAABBwAAAAAABwAAAAABBwAAAAABBwAAAAAABwAAAAAABwAAAAAABwAAAAAABwAAAAACUAAAAAAAXgAAAAADTwAAAAACXgAAAAACTwAAAAABfwAAAAAAfwAAAAAABwAAAAACBwAAAAABBwAAAAACBwAAAAABBwAAAAACBwAAAAABBwAAAAAABwAAAAABBwAAAAACfwAAAAAAXgAAAAADTwAAAAABXgAAAAADfwAAAAAAfwAAAAAABwAAAAABBwAAAAACBwAAAAACBwAAAAAABwAAAAACBwAAAAABBwAAAAACBwAAAAACBwAAAAAABwAAAAAABwAAAAACXgAAAAACAQAAAAAAXgAAAAABAQAAAAAAXgAAAAABfwAAAAAABwAAAAABBwAAAAABBwAAAAAABwAAAAACBwAAAAABBwAAAAACBwAAAAACBwAAAAACBwAAAAACfwAAAAAAXgAAAAABAQAAAAAAXgAAAAADAQAAAAAAXgAAAAAAfwAAAAAAfwAAAAAABwAAAAABBwAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAXgAAAAADAQAAAAAAXgAAAAAAAQAAAAAAXgAAAAAAXgAAAAABXgAAAAAAXgAAAAABXgAAAAABXgAAAAADXgAAAAAAXgAAAAAAXgAAAAADXgAAAAACXgAAAAADXgAAAAADXgAAAAACAQAAAAAAXgAAAAADAQAAAAAAAQAAAAAAMAAAAAADMAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAMAAAAAACMAAAAAAAAQAAAAAAAQAAAAAAXgAAAAAAXgAAAAAAXgAAAAABXgAAAAACXgAAAAACXgAAAAACXgAAAAABXgAAAAABXgAAAAABXgAAAAADXgAAAAAAXgAAAAAAXgAAAAACXgAAAAACXgAAAAAAXgAAAAABXgAAAAABfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAAAXgAAAAABXgAAAAAAXgAAAAADXgAAAAADXgAAAAABfwAAAAAAXgAAAAADXgAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAfwAAAAAAXgAAAAAAXgAAAAABMAAAAAAAMAAAAAABMAAAAAAAMAAAAAACfwAAAAAAMAAAAAAAMAAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAXgAAAAADMAAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAUAAAAAAAMgAAAAAAMgAAAAAA version: 6 -4,-3: ind: -4,-3 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAAUAAAAAAACwAAAAAACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAAABwAAAAAABwAAAAABBwAAAAABBwAAAAAABwAAAAAABwAAAAABBwAAAAACBwAAAAABBwAAAAABfwAAAAAACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAACBwAAAAABBwAAAAAABwAAAAAABwAAAAAABwAAAAABBwAAAAAABwAAAAAABwAAAAABfwAAAAAACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAABBwAAAAACBwAAAAABBwAAAAAABwAAAAAABwAAAAABBwAAAAAABwAAAAACBwAAAAABUAAAAAAACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAAABwAAAAACBwAAAAAABwAAAAAACAAAAAAABwAAAAACBwAAAAABBwAAAAAABwAAAAABUAAAAAAACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAAABwAAAAAABwAAAAAABwAAAAACBwAAAAAABwAAAAABBwAAAAAABwAAAAABBwAAAAABfwAAAAAACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAACBwAAAAABBwAAAAACBwAAAAABBwAAAAABBwAAAAACBwAAAAAABwAAAAAABwAAAAACBwAAAAACBwAAAAABXgAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAABwAAAAACBwAAAAABUAAAAAAAXgAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAXgAAAAABXgAAAAABXgAAAAACXgAAAAACfwAAAAAAXgAAAAADXgAAAAAAXgAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAXgAAAAABTwAAAAAATwAAAAABXgAAAAAAXgAAAAADMAAAAAADMAAAAAACXgAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAXgAAAAADXgAAAAADXgAAAAADXgAAAAADXgAAAAADXgAAAAACXgAAAAADXgAAAAACXgAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAACBwAAAAAABwAAAAABBwAAAAABBwAAAAABBwAAAAAABwAAAAABBwAAAAABBwAAAAACBwAAAAACBwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAACBwAAAAACBwAAAAACBwAAAAABBwAAAAABBwAAAAAABwAAAAACBwAAAAAABwAAAAAABwAAAAAB + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAACwAAAAAAUAAAAAAACwAAAAAACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAAABwAAAAAABwAAAAABBwAAAAABBwAAAAAABwAAAAAABwAAAAABBwAAAAACBwAAAAABBwAAAAABfwAAAAAACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAACBwAAAAABBwAAAAAABwAAAAAABwAAAAAABwAAAAABBwAAAAAABwAAAAAABwAAAAABfwAAAAAACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAABBwAAAAACBwAAAAABBwAAAAAABwAAAAAABwAAAAABBwAAAAAABwAAAAACBwAAAAABUAAAAAAACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAAABwAAAAACBwAAAAAABwAAAAAACAAAAAAABwAAAAACBwAAAAABBwAAAAAABwAAAAABUAAAAAAACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAAABwAAAAAABwAAAAAABwAAAAACBwAAAAAABwAAAAABBwAAAAAABwAAAAABBwAAAAABfwAAAAAACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAACBwAAAAABBwAAAAACBwAAAAABBwAAAAABBwAAAAACBwAAAAAABwAAAAAABwAAAAACBwAAAAACBwAAAAABXgAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAABwAAAAACBwAAAAABUAAAAAAAXgAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAXgAAAAABXgAAAAABXgAAAAACXgAAAAACfwAAAAAAXgAAAAADXgAAAAAAXgAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAXgAAAAABTwAAAAAATwAAAAABAQAAAAAAAQAAAAAAMAAAAAADMAAAAAACAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAXgAAAAADXgAAAAADXgAAAAADXgAAAAADXgAAAAADXgAAAAACXgAAAAADXgAAAAACXgAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAACBwAAAAAABwAAAAABBwAAAAABBwAAAAABBwAAAAAABwAAAAABBwAAAAABBwAAAAACBwAAAAACBwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAACBwAAAAACBwAAAAACBwAAAAABBwAAAAABBwAAAAAABwAAAAACBwAAAAAABwAAAAAABwAAAAAB version: 6 -4,1: ind: -4,1 @@ -253,7 +255,7 @@ entities: version: 6 -1,4: ind: -1,4 - tiles: XgAAAAADXgAAAAADUAAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAATwAAAAABXgAAAAABUAAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfgAAAAAAXgAAAAACXgAAAAACfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfgAAAAAATwAAAAABXgAAAAADXgAAAAACTwAAAAAAXgAAAAABTwAAAAABXgAAAAACTwAAAAABXgAAAAACfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfgAAAAAAXgAAAAAAXgAAAAAAXgAAAAACXgAAAAABXgAAAAACXgAAAAABXgAAAAACXgAAAAADfwAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAbQAAAAAAbQAAAAAAfwAAAAAAAAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAXgAAAAAATwAAAAADTwAAAAAATwAAAAABXgAAAAADfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAbQAAAAAAfwAAAAAAAAAAAAAAMgAAAAAAMgAAAAAAfwAAAAAAXgAAAAADXgAAAAACXgAAAAAAXgAAAAABXgAAAAABfwAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAfwAAAAAAbQAAAAAAfwAAAAAAfgAAAAAAMgAAAAAAMgAAAAAAfwAAAAAATwAAAAADXgAAAAAATwAAAAAAXgAAAAADTwAAAAACfwAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAfwAAAAAAbQAAAAAAfwAAAAAAfgAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAXgAAAAACUAAAAAAAUAAAAAAAUAAAAAAAXgAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfgAAAAAAIAAAAAABIAAAAAABXgAAAAAAXgAAAAABXgAAAAACXgAAAAABXgAAAAADXgAAAAABXgAAAAACIAAAAAADIAAAAAAAIAAAAAABIAAAAAADIAAAAAADfwAAAAAAfgAAAAAAIAAAAAABIAAAAAACcQAAAAACcQAAAAACcQAAAAADcQAAAAADcQAAAAACcQAAAAABcQAAAAAAIAAAAAADIAAAAAABIAAAAAAAIAAAAAACIAAAAAADfwAAAAAAfgAAAAAAIAAAAAAAIAAAAAACcQAAAAADcQAAAAADcQAAAAADcQAAAAADcQAAAAAAcQAAAAADcQAAAAADIAAAAAABIAAAAAABIAAAAAACIAAAAAABIAAAAAADfwAAAAAAfgAAAAAAIAAAAAADIAAAAAABcQAAAAACcQAAAAAAcQAAAAABcQAAAAAAcQAAAAADcQAAAAABcQAAAAADIAAAAAABIAAAAAABIAAAAAADIAAAAAAAIAAAAAABUAAAAAAAfgAAAAAAIAAAAAADIAAAAAACcQAAAAABcQAAAAABcQAAAAADcQAAAAAAcQAAAAAAcQAAAAACcQAAAAADIAAAAAADIAAAAAACIAAAAAAAIAAAAAADIAAAAAACUAAAAAAAfgAAAAAAIAAAAAADIAAAAAABIAAAAAAAcQAAAAAAcQAAAAACcQAAAAADcQAAAAADcQAAAAACIAAAAAADIAAAAAAAIAAAAAABIAAAAAABIAAAAAAAIAAAAAAAUAAAAAAAfgAAAAAAIAAAAAACIAAAAAADIAAAAAACIAAAAAADIAAAAAACIAAAAAACIAAAAAABIAAAAAADIAAAAAADIAAAAAAAIAAAAAADIAAAAAABIAAAAAACIAAAAAADUAAAAAAAfgAAAAAA + tiles: AQAAAAAAXgAAAAADUAAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAATwAAAAABXgAAAAABUAAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAfwAAAAAAQwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfgAAAAAAAQAAAAAAXgAAAAACfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfgAAAAAATwAAAAABAQAAAAAAAQAAAAAATwAAAAAAXgAAAAABTwAAAAABXgAAAAACTwAAAAABXgAAAAACfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfgAAAAAAXgAAAAAAXgAAAAAAXgAAAAACXgAAAAABXgAAAAACXgAAAAABXgAAAAACXgAAAAADfwAAAAAAQwAAAAAAQwAAAAAAQwAAAAAAbQAAAAAAbQAAAAAAfwAAAAAAAAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAXgAAAAAATwAAAAADTwAAAAAATwAAAAABXgAAAAADfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAbQAAAAAAfwAAAAAAAAAAAAAAMgAAAAAAMgAAAAAAfwAAAAAAXgAAAAADXgAAAAACXgAAAAAAXgAAAAABXgAAAAABfwAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAfwAAAAAAbQAAAAAAfwAAAAAAfgAAAAAAMgAAAAAAMgAAAAAAfwAAAAAATwAAAAADXgAAAAAATwAAAAAAXgAAAAADTwAAAAACfwAAAAAAMgAAAAAAMgAAAAAAMgAAAAAAfwAAAAAAbQAAAAAAfwAAAAAAfgAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAXgAAAAACUAAAAAAAUAAAAAAAUAAAAAAAXgAAAAAAfwAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfgAAAAAAIAAAAAABIAAAAAABXgAAAAAAXgAAAAABXgAAAAACXgAAAAABXgAAAAADXgAAAAABXgAAAAACIAAAAAADIAAAAAAAIAAAAAABIAAAAAADIAAAAAADfwAAAAAAfgAAAAAAIAAAAAABIAAAAAACcQAAAAACcgAAAAAAcgAAAAAAcQAAAAADcgAAAAAAcgAAAAAAcQAAAAAAIAAAAAADIAAAAAABIAAAAAAAIAAAAAACIAAAAAADfwAAAAAAfgAAAAAAIAAAAAAAIAAAAAACcQAAAAADcgAAAAAAcQAAAAADcQAAAAADcQAAAAAAcgAAAAAAcQAAAAADIAAAAAABIAAAAAABIAAAAAACIAAAAAABIAAAAAADfwAAAAAAfgAAAAAAIAAAAAADIAAAAAABcQAAAAACcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcQAAAAADIAAAAAABIAAAAAABIAAAAAADIAAAAAAAIAAAAAABUAAAAAAAfgAAAAAAIAAAAAADIAAAAAACcQAAAAABcQAAAAABcgAAAAAAcQAAAAAAcgAAAAAAcQAAAAACcQAAAAADIAAAAAADIAAAAAACIAAAAAAAIAAAAAADIAAAAAACUAAAAAAAfgAAAAAAIAAAAAADIAAAAAABIAAAAAAAcQAAAAAAcQAAAAACcQAAAAADcQAAAAADcQAAAAACIAAAAAADIAAAAAAAIAAAAAABIAAAAAABIAAAAAAAIAAAAAAAUAAAAAAAfgAAAAAAIAAAAAACIAAAAAADIAAAAAACIAAAAAADIAAAAAACIAAAAAACIAAAAAABIAAAAAADIAAAAAADIAAAAAAAIAAAAAADIAAAAAABIAAAAAACIAAAAAADUAAAAAAAfgAAAAAA version: 6 -2,4: ind: -2,4 @@ -309,11 +311,11 @@ entities: version: 6 3,1: ind: 3,1 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAMAAAAAACfgAAAAAAMAAAAAACAAAAAAAAMAAAAAAAfgAAAAAAMAAAAAACAAAAAAAAMAAAAAAAfgAAAAAAMAAAAAACAAAAAAAAMAAAAAABfgAAAAAAMAAAAAACAAAAAAAAMAAAAAADfgAAAAAAMAAAAAACAAAAAAAAMAAAAAABfgAAAAAAMAAAAAACAAAAAAAAMAAAAAABfgAAAAAAMAAAAAADAAAAAAAAMAAAAAADfgAAAAAAMAAAAAACfgAAAAAAMAAAAAACfgAAAAAAMAAAAAACfgAAAAAAMAAAAAABfgAAAAAAMAAAAAAAfgAAAAAAMAAAAAABfgAAAAAAMAAAAAAAfgAAAAAAMAAAAAAAfgAAAAAAMAAAAAACAAAAAAAAMAAAAAADfgAAAAAAMAAAAAACAAAAAAAAMAAAAAADfgAAAAAAMAAAAAADAAAAAAAAMAAAAAABfgAAAAAAMAAAAAADAAAAAAAAMAAAAAABfgAAAAAAMAAAAAACAAAAAAAAMAAAAAACfgAAAAAAMAAAAAAAAAAAAAAAMAAAAAACfgAAAAAAMAAAAAADAAAAAAAAMAAAAAACfgAAAAAAMAAAAAABAAAAAAAAMAAAAAADfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAMAAAAAACAAAAAAAAMAAAAAACfgAAAAAAMAAAAAACAAAAAAAAMAAAAAAAfgAAAAAAMAAAAAACAAAAAAAAMAAAAAAAfgAAAAAAMAAAAAACAAAAAAAAMAAAAAAAfgAAAAAAMAAAAAADAAAAAAAAMAAAAAABfgAAAAAAMAAAAAABAAAAAAAAMAAAAAABfgAAAAAAMAAAAAADAAAAAAAAMAAAAAAAfgAAAAAAMAAAAAADAAAAAAAAMAAAAAADfgAAAAAAMAAAAAADfgAAAAAAMAAAAAAAfgAAAAAAMAAAAAAAfgAAAAAAMAAAAAACfgAAAAAAMAAAAAADfgAAAAAAMAAAAAACfgAAAAAAMAAAAAADfgAAAAAAMAAAAAACfgAAAAAAMAAAAAAAAAAAAAAAMAAAAAAAfgAAAAAAMAAAAAADAAAAAAAAMAAAAAAAfgAAAAAAMAAAAAABAAAAAAAAMAAAAAADfgAAAAAAMAAAAAAAAAAAAAAAMAAAAAABfgAAAAAAMAAAAAAAAAAAAAAAMAAAAAADfgAAAAAAMAAAAAAAAAAAAAAAMAAAAAAAfgAAAAAAMAAAAAAAAAAAAAAAMAAAAAABfgAAAAAAMAAAAAABAAAAAAAAMAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAMAAAAAACfgAAAAAAMAAAAAACAAAAAAAAMAAAAAAAfgAAAAAAMAAAAAACAAAAAAAAMAAAAAAAfgAAAAAAMAAAAAACAAAAAAAAMAAAAAABfgAAAAAAMAAAAAACAAAAAAAAMAAAAAADfgAAAAAAMAAAAAACAAAAAAAAMAAAAAABfgAAAAAAMAAAAAACAAAAAAAAMAAAAAABfgAAAAAAMAAAAAADAAAAAAAAMAAAAAADfgAAAAAAMAAAAAACfgAAAAAAMAAAAAACfgAAAAAAMAAAAAACfgAAAAAAMAAAAAABfgAAAAAAMAAAAAAAfgAAAAAAMAAAAAABfgAAAAAAMAAAAAAAfgAAAAAAMAAAAAAAfgAAAAAAMAAAAAACAAAAAAAAMAAAAAADfgAAAAAAMAAAAAACAAAAAAAAMAAAAAADfgAAAAAAMAAAAAADAAAAAAAAMAAAAAABfgAAAAAAMAAAAAADAAAAAAAAMAAAAAABfgAAAAAAMAAAAAACAAAAAAAAMAAAAAACfgAAAAAAMAAAAAAAAAAAAAAAMAAAAAACfgAAAAAAMAAAAAADAAAAAAAAMAAAAAACfgAAAAAAMAAAAAABAAAAAAAAMAAAAAADfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAMAAAAAACAAAAAAAAMAAAAAACfgAAAAAAMAAAAAACAAAAAAAAMAAAAAAAfgAAAAAAMAAAAAACAAAAAAAAMAAAAAAAfgAAAAAAMAAAAAACAAAAAAAAMAAAAAAAfgAAAAAAMAAAAAADAAAAAAAAMAAAAAABfgAAAAAAMAAAAAABAAAAAAAAMAAAAAABfgAAAAAAMAAAAAADAAAAAAAAMAAAAAAAfgAAAAAAMAAAAAADAAAAAAAAMAAAAAADfgAAAAAAMAAAAAADfgAAAAAAMAAAAAAAfgAAAAAAMAAAAAAAfgAAAAAAMAAAAAACfgAAAAAAMAAAAAADfgAAAAAAMAAAAAACfgAAAAAAMAAAAAADfgAAAAAAMAAAAAACfgAAAAAAMAAAAAAAAAAAAAAAMAAAAAAAfgAAAAAAMAAAAAADAAAAAAAAMAAAAAAAfgAAAAAAMAAAAAABAAAAAAAAMAAAAAADfgAAAAAAMAAAAAAAAAAAAAAAMAAAAAABfgAAAAAAMAAAAAAAAAAAAAAAMAAAAAADfgAAAAAAMAAAAAAAAAAAAAAAMAAAAAAAfgAAAAAAMAAAAAAAAAAAAAAAMAAAAAABfgAAAAAAMAAAAAABAAAAAAAAMAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 3,2: ind: 3,2 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAIQAAAAABfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAfwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAABfwAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbwAAAAACbwAAAAABfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXgAAAAACXgAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXgAAAAABXgAAAAADfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXgAAAAADXgAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXgAAAAACXgAAAAABfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAIQAAAAABfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAfwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAABfwAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbwAAAAACbwAAAAABfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXgAAAAACXgAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXgAAAAABXgAAAAADfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXgAAAAADXgAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXgAAAAACXgAAAAABfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 -3,-4: ind: -3,-4 @@ -409,7 +411,7 @@ entities: version: 6 3,0: ind: 3,0 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfwAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfwAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 -7,2: ind: -7,2 @@ -511,6 +513,10 @@ entities: id: Arrows decals: 2490: -15.470485,-51.95348 + 2517: -15,-59 + 2518: -15,-57 + 2519: -15,-55 + 2520: -15,-53 - node: angle: 3.141592653589793 rad color: '#FFFFFFFF' @@ -7032,6 +7038,15 @@ entities: - 12411 - 12370 - 17291 + - uid: 15884 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -20.5,-59.5 + parent: 100 + - type: DeviceList + devices: + - 15881 - uid: 16764 components: - type: Transform @@ -9000,6 +9015,24 @@ entities: - type: Transform pos: -62.5,74.5 parent: 100 +- proto: AirlockCorpsmanGlassLocked + entities: + - uid: 1363 + components: + - type: MetaData + name: Brig Med + - type: Transform + pos: -0.5,45.5 + parent: 100 +- proto: AirlockCorpsmanLocked + entities: + - uid: 1272 + components: + - type: MetaData + name: Brig Med + - type: Transform + pos: 1.5,41.5 + parent: 100 - proto: AirlockDetectiveGlassLocked entities: - uid: 13859 @@ -10054,20 +10087,6 @@ entities: - type: Transform pos: -21.5,17.5 parent: 100 - - uid: 1266 - components: - - type: MetaData - name: Reporter's Office - - type: Transform - pos: -20.5,22.5 - parent: 100 - - uid: 1272 - components: - - type: MetaData - name: Reporter's Office - - type: Transform - pos: -21.5,20.5 - parent: 100 - uid: 1279 components: - type: MetaData @@ -10672,22 +10691,6 @@ entities: rot: -1.5707963267948966 rad pos: -63.5,-5.5 parent: 100 - - uid: 17224 - components: - - type: MetaData - name: Salvage Dock - - type: Transform - rot: -1.5707963267948966 rad - pos: -58.5,-19.5 - parent: 100 - - uid: 17225 - components: - - type: MetaData - name: Salvage Dock - - type: Transform - rot: -1.5707963267948966 rad - pos: -58.5,-18.5 - parent: 100 - proto: AirlockHeadOfPersonnelGlassLocked entities: - uid: 2334 @@ -11219,7 +11222,7 @@ entities: - uid: 106 components: - type: MetaData - name: Bar Maintenance + name: Service Closet - type: Transform pos: -0.5,6.5 parent: 100 @@ -11477,6 +11480,22 @@ entities: - type: Transform pos: -49.5,-8.5 parent: 100 +- proto: AirlockReporterGlassLocked + entities: + - uid: 1234 + components: + - type: MetaData + name: Reporter's Room + - type: Transform + pos: -21.5,20.5 + parent: 100 + - uid: 1266 + components: + - type: MetaData + name: Reporter's Room + - type: Transform + pos: -20.5,22.5 + parent: 100 - proto: AirlockResearchDirectorGlassLocked entities: - uid: 2981 @@ -11782,13 +11801,6 @@ entities: - type: Transform pos: 17.5,27.5 parent: 100 - - uid: 2116 - components: - - type: MetaData - name: Brig Med - - type: Transform - pos: -0.5,45.5 - parent: 100 - uid: 2190 components: - type: MetaData @@ -11945,13 +11957,6 @@ entities: - type: Transform pos: 4.5,29.5 parent: 100 - - uid: 11717 - components: - - type: MetaData - name: Brig Med - - type: Transform - pos: 1.5,41.5 - parent: 100 - uid: 13692 components: - type: MetaData @@ -12044,6 +12049,14 @@ entities: rot: -1.5707963267948966 rad pos: -49.5,26.5 parent: 100 + - uid: 15881 + components: + - type: Transform + pos: -23.5,-56.5 + parent: 100 + - type: DeviceNetwork + deviceLists: + - 15884 - uid: 17128 components: - type: Transform @@ -12371,7 +12384,7 @@ entities: - uid: 14681 components: - type: MetaData - name: Grav Gen APC + name: Gravity APC - type: Transform rot: 3.141592653589793 rad pos: -36.5,47.5 @@ -12421,6 +12434,20 @@ entities: rot: -1.5707963267948966 rad pos: 15.5,30.5 parent: 100 + - uid: 15913 + components: + - type: MetaData + name: Engi Lockers APC + - type: Transform + pos: 9.5,-40.5 + parent: 100 + - uid: 16101 + components: + - type: MetaData + name: AME Room APC + - type: Transform + pos: -2.5,-44.5 + parent: 100 - uid: 16866 components: - type: MetaData @@ -12459,6 +12486,13 @@ entities: - type: Transform pos: -8.5,-7.5 parent: 100 + - uid: 19158 + components: + - type: MetaData + name: Theatre APC + - type: Transform + pos: -37.5,59.5 + parent: 100 - uid: 20077 components: - type: MetaData @@ -13627,7 +13661,7 @@ entities: parent: 100 - type: DeviceLinkSink links: - - 14551 + - 18872 - uid: 3199 components: - type: MetaData @@ -13675,7 +13709,7 @@ entities: parent: 100 - type: DeviceLinkSink links: - - 14551 + - 18872 - uid: 10750 components: - type: Transform @@ -13707,7 +13741,7 @@ entities: parent: 100 - type: DeviceLinkSink links: - - 14551 + - 18872 - uid: 14600 components: - type: Transform @@ -14389,6 +14423,11 @@ entities: - type: Transform pos: -20.2501,-51.66512 parent: 100 + - uid: 20816 + components: + - type: Transform + pos: -26.408981,24.978746 + parent: 100 - proto: ButtonFrameCaution entities: - uid: 15853 @@ -14396,6 +14435,20 @@ entities: - type: Transform pos: 2.5,31.5 parent: 100 + - uid: 20812 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -20.5,-57.5 + parent: 100 +- proto: ButtonFrameCautionSecurity + entities: + - uid: 15525 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -20.5,-58.5 + parent: 100 - proto: ButtonFrameExit entities: - uid: 11405 @@ -14853,6 +14906,26 @@ entities: - type: Transform pos: -11.5,-3.5 parent: 100 + - uid: 1918 + components: + - type: Transform + pos: -41.5,63.5 + parent: 100 + - uid: 1920 + components: + - type: Transform + pos: -40.5,63.5 + parent: 100 + - uid: 2023 + components: + - type: Transform + pos: -34.5,64.5 + parent: 100 + - uid: 2024 + components: + - type: Transform + pos: -35.5,64.5 + parent: 100 - uid: 2101 components: - type: Transform @@ -15018,6 +15091,11 @@ entities: - type: Transform pos: -0.5,44.5 parent: 100 + - uid: 3709 + components: + - type: Transform + pos: -36.5,64.5 + parent: 100 - uid: 3729 components: - type: Transform @@ -15118,6 +15196,11 @@ entities: - type: Transform pos: -41.5,-12.5 parent: 100 + - uid: 5710 + components: + - type: Transform + pos: -33.5,64.5 + parent: 100 - uid: 5715 components: - type: Transform @@ -20338,11 +20421,6 @@ entities: - type: Transform pos: -33.5,50.5 parent: 100 - - uid: 9698 - components: - - type: Transform - pos: -34.5,50.5 - parent: 100 - uid: 9699 components: - type: Transform @@ -23438,6 +23516,11 @@ entities: - type: Transform pos: -35.5,20.5 parent: 100 + - uid: 14615 + components: + - type: Transform + pos: -38.5,64.5 + parent: 100 - uid: 14695 components: - type: Transform @@ -23808,6 +23891,11 @@ entities: - type: Transform pos: -18.5,-47.5 parent: 100 + - uid: 14801 + components: + - type: Transform + pos: -37.5,64.5 + parent: 100 - uid: 14802 components: - type: Transform @@ -24058,11 +24146,6 @@ entities: - type: Transform pos: 38.5,-8.5 parent: 100 - - uid: 14933 - components: - - type: Transform - pos: 6.5,-38.5 - parent: 100 - uid: 14934 components: - type: Transform @@ -24178,11 +24261,6 @@ entities: - type: Transform pos: 3.5,-38.5 parent: 100 - - uid: 14958 - components: - - type: Transform - pos: 3.5,-39.5 - parent: 100 - uid: 14959 components: - type: Transform @@ -24748,6 +24826,11 @@ entities: - type: Transform pos: -4.5,65.5 parent: 100 + - uid: 15467 + components: + - type: Transform + pos: -16.5,-59.5 + parent: 100 - uid: 15512 components: - type: Transform @@ -24808,26 +24891,6 @@ entities: - type: Transform pos: -17.5,-32.5 parent: 100 - - uid: 15525 - components: - - type: Transform - pos: -18.5,-32.5 - parent: 100 - - uid: 15526 - components: - - type: Transform - pos: -19.5,-32.5 - parent: 100 - - uid: 15527 - components: - - type: Transform - pos: -20.5,-32.5 - parent: 100 - - uid: 15528 - components: - - type: Transform - pos: -21.5,-32.5 - parent: 100 - uid: 15863 components: - type: Transform @@ -25773,6 +25836,21 @@ entities: - type: Transform pos: -19.5,72.5 parent: 100 + - uid: 18877 + components: + - type: Transform + pos: -17.5,-33.5 + parent: 100 + - uid: 18878 + components: + - type: Transform + pos: -18.5,-33.5 + parent: 100 + - uid: 18879 + components: + - type: Transform + pos: -19.5,-33.5 + parent: 100 - uid: 18917 components: - type: Transform @@ -26086,7 +26164,7 @@ entities: - uid: 18990 components: - type: Transform - pos: -32.5,62.5 + pos: -20.5,-33.5 parent: 100 - uid: 18991 components: @@ -26166,7 +26244,7 @@ entities: - uid: 19006 components: - type: Transform - pos: -39.5,62.5 + pos: -21.5,-33.5 parent: 100 - uid: 19007 components: @@ -26728,6 +26806,11 @@ entities: - type: Transform pos: 8.5,-50.5 parent: 100 + - uid: 19702 + components: + - type: Transform + pos: -37.5,58.5 + parent: 100 - uid: 19745 components: - type: Transform @@ -26878,6 +26961,11 @@ entities: - type: Transform pos: -51.5,83.5 parent: 100 + - uid: 19795 + components: + - type: Transform + pos: -37.5,59.5 + parent: 100 - uid: 19807 components: - type: Transform @@ -27458,6 +27546,46 @@ entities: - type: Transform pos: -61.5,-3.5 parent: 100 + - uid: 20844 + components: + - type: Transform + pos: -2.5,-44.5 + parent: 100 + - uid: 20845 + components: + - type: Transform + pos: -2.5,-45.5 + parent: 100 + - uid: 20846 + components: + - type: Transform + pos: -1.5,-45.5 + parent: 100 + - uid: 20847 + components: + - type: Transform + pos: -0.5,-45.5 + parent: 100 + - uid: 20848 + components: + - type: Transform + pos: 0.5,-45.5 + parent: 100 + - uid: 20849 + components: + - type: Transform + pos: 1.5,-45.5 + parent: 100 + - uid: 20850 + components: + - type: Transform + pos: 2.5,-45.5 + parent: 100 + - uid: 20857 + components: + - type: Transform + pos: 9.5,-40.5 + parent: 100 - proto: CableApcStack entities: - uid: 10832 @@ -33393,6 +33521,16 @@ entities: - type: Transform pos: -15.5,-13.5 parent: 100 + - uid: 1400 + components: + - type: Transform + pos: -50.5,60.5 + parent: 100 + - uid: 1401 + components: + - type: Transform + pos: -50.5,61.5 + parent: 100 - uid: 1410 components: - type: Transform @@ -33403,6 +33541,16 @@ entities: - type: Transform pos: -21.5,33.5 parent: 100 + - uid: 1905 + components: + - type: Transform + pos: -49.5,61.5 + parent: 100 + - uid: 1907 + components: + - type: Transform + pos: -48.5,61.5 + parent: 100 - uid: 2104 components: - type: Transform @@ -35073,6 +35221,11 @@ entities: - type: Transform pos: -6.5,-38.5 parent: 100 + - uid: 14958 + components: + - type: Transform + pos: 4.5,-41.5 + parent: 100 - uid: 15086 components: - type: Transform @@ -35193,6 +35346,16 @@ entities: - type: Transform pos: -35.5,-2.5 parent: 100 + - uid: 16414 + components: + - type: Transform + pos: -5.5,-37.5 + parent: 100 + - uid: 16431 + components: + - type: Transform + pos: -4.5,-37.5 + parent: 100 - uid: 16566 components: - type: Transform @@ -35233,6 +35396,16 @@ entities: - type: Transform pos: 27.5,38.5 parent: 100 + - uid: 17224 + components: + - type: Transform + pos: -3.5,-37.5 + parent: 100 + - uid: 17225 + components: + - type: Transform + pos: -2.5,-37.5 + parent: 100 - uid: 17433 components: - type: Transform @@ -35373,6 +35546,56 @@ entities: - type: Transform pos: -14.5,-5.5 parent: 100 + - uid: 19028 + components: + - type: Transform + pos: -47.5,61.5 + parent: 100 + - uid: 19075 + components: + - type: Transform + pos: -46.5,61.5 + parent: 100 + - uid: 19077 + components: + - type: Transform + pos: -45.5,61.5 + parent: 100 + - uid: 19078 + components: + - type: Transform + pos: -44.5,61.5 + parent: 100 + - uid: 19079 + components: + - type: Transform + pos: -43.5,61.5 + parent: 100 + - uid: 19080 + components: + - type: Transform + pos: -42.5,61.5 + parent: 100 + - uid: 19148 + components: + - type: Transform + pos: -42.5,62.5 + parent: 100 + - uid: 19155 + components: + - type: Transform + pos: -42.5,63.5 + parent: 100 + - uid: 19156 + components: + - type: Transform + pos: -41.5,63.5 + parent: 100 + - uid: 19159 + components: + - type: Transform + pos: -41.5,61.5 + parent: 100 - uid: 19183 components: - type: Transform @@ -35383,6 +35606,11 @@ entities: - type: Transform pos: -16.5,-5.5 parent: 100 + - uid: 19242 + components: + - type: Transform + pos: -40.5,61.5 + parent: 100 - uid: 19252 components: - type: Transform @@ -35468,6 +35696,16 @@ entities: - type: Transform pos: -58.5,43.5 parent: 100 + - uid: 19544 + components: + - type: Transform + pos: -39.5,61.5 + parent: 100 + - uid: 19545 + components: + - type: Transform + pos: -38.5,61.5 + parent: 100 - uid: 19555 components: - type: Transform @@ -35483,16 +35721,36 @@ entities: - type: Transform pos: -18.5,-10.5 parent: 100 + - uid: 19647 + components: + - type: Transform + pos: -37.5,61.5 + parent: 100 - uid: 19648 components: - type: Transform pos: -18.5,-11.5 parent: 100 + - uid: 19649 + components: + - type: Transform + pos: -37.5,60.5 + parent: 100 - uid: 19700 components: - type: Transform pos: -18.5,-12.5 parent: 100 + - uid: 19701 + components: + - type: Transform + pos: -37.5,59.5 + parent: 100 + - uid: 19788 + components: + - type: Transform + pos: -1.5,-37.5 + parent: 100 - uid: 19800 components: - type: Transform @@ -36438,6 +36696,136 @@ entities: - type: Transform pos: -24.5,29.5 parent: 100 + - uid: 20824 + components: + - type: Transform + pos: -0.5,-37.5 + parent: 100 + - uid: 20825 + components: + - type: Transform + pos: 0.5,-37.5 + parent: 100 + - uid: 20826 + components: + - type: Transform + pos: 1.5,-37.5 + parent: 100 + - uid: 20827 + components: + - type: Transform + pos: 2.5,-37.5 + parent: 100 + - uid: 20828 + components: + - type: Transform + pos: 3.5,-37.5 + parent: 100 + - uid: 20829 + components: + - type: Transform + pos: 3.5,-38.5 + parent: 100 + - uid: 20830 + components: + - type: Transform + pos: 3.5,-39.5 + parent: 100 + - uid: 20831 + components: + - type: Transform + pos: 3.5,-40.5 + parent: 100 + - uid: 20832 + components: + - type: Transform + pos: 3.5,-41.5 + parent: 100 + - uid: 20833 + components: + - type: Transform + pos: 3.5,-42.5 + parent: 100 + - uid: 20834 + components: + - type: Transform + pos: 3.5,-43.5 + parent: 100 + - uid: 20835 + components: + - type: Transform + pos: 3.5,-44.5 + parent: 100 + - uid: 20836 + components: + - type: Transform + pos: 3.5,-45.5 + parent: 100 + - uid: 20837 + components: + - type: Transform + pos: 2.5,-45.5 + parent: 100 + - uid: 20838 + components: + - type: Transform + pos: 1.5,-45.5 + parent: 100 + - uid: 20839 + components: + - type: Transform + pos: 0.5,-45.5 + parent: 100 + - uid: 20840 + components: + - type: Transform + pos: -0.5,-45.5 + parent: 100 + - uid: 20841 + components: + - type: Transform + pos: -1.5,-45.5 + parent: 100 + - uid: 20842 + components: + - type: Transform + pos: -2.5,-45.5 + parent: 100 + - uid: 20843 + components: + - type: Transform + pos: -2.5,-44.5 + parent: 100 + - uid: 20851 + components: + - type: Transform + pos: 5.5,-41.5 + parent: 100 + - uid: 20852 + components: + - type: Transform + pos: 6.5,-41.5 + parent: 100 + - uid: 20853 + components: + - type: Transform + pos: 7.5,-41.5 + parent: 100 + - uid: 20854 + components: + - type: Transform + pos: 8.5,-41.5 + parent: 100 + - uid: 20855 + components: + - type: Transform + pos: 9.5,-41.5 + parent: 100 + - uid: 20856 + components: + - type: Transform + pos: 9.5,-40.5 + parent: 100 - proto: CableTerminal entities: - uid: 10857 @@ -39772,11 +40160,6 @@ entities: - type: Transform pos: -17.5,-56.5 parent: 100 - - uid: 15897 - components: - - type: Transform - pos: -17.5,-57.5 - parent: 100 - uid: 15898 components: - type: Transform @@ -40281,6 +40664,11 @@ entities: - type: Transform pos: -65.5,79.5 parent: 100 + - uid: 20813 + components: + - type: Transform + pos: -17.5,-57.5 + parent: 100 - proto: Chair entities: - uid: 629 @@ -42139,6 +42527,20 @@ entities: - type: Transform pos: -21.5,-9.5 parent: 100 +- proto: CleanerDispenser + entities: + - uid: 20809 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -26.5,65.5 + parent: 100 + - uid: 20810 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -27.5,11.5 + parent: 100 - proto: ClosetBombFilled entities: - uid: 3390 @@ -43933,26 +44335,6 @@ entities: parent: 100 - proto: ClothingHeadHelmetEVA entities: - - uid: 1918 - components: - - type: Transform - pos: 21.288757,12.731072 - parent: 100 - - uid: 1920 - components: - - type: Transform - pos: 22.351257,12.652947 - parent: 100 - - uid: 1921 - components: - - type: Transform - pos: 22.351257,15.668572 - parent: 100 - - uid: 2025 - components: - - type: Transform - pos: 21.320007,15.684197 - parent: 100 - uid: 17518 components: - type: Transform @@ -44143,26 +44525,6 @@ entities: parent: 100 - proto: ClothingOuterHardsuitEVA entities: - - uid: 1905 - components: - - type: Transform - pos: 22.632507,12.590447 - parent: 100 - - uid: 1907 - components: - - type: Transform - pos: 21.601257,12.668572 - parent: 100 - - uid: 2023 - components: - - type: Transform - pos: 22.679382,15.590447 - parent: 100 - - uid: 2024 - components: - - type: Transform - pos: 21.570007,15.606072 - parent: 100 - uid: 17517 components: - type: Transform @@ -45719,13 +46081,6 @@ entities: - type: Transform pos: -6.5,-0.5 parent: 100 -- proto: CrateNPCCow - entities: - - uid: 11180 - components: - - type: Transform - pos: -25.5,25.5 - parent: 100 - proto: CrateNPCHamlet entities: - uid: 2939 @@ -45946,6 +46301,40 @@ entities: - type: Transform pos: 23.5,20.5 parent: 100 +- proto: CurtainsBlackOpen + entities: + - uid: 1364 + components: + - type: Transform + pos: -40.5,53.5 + parent: 100 +- proto: CurtainsRedOpen + entities: + - uid: 15526 + components: + - type: Transform + pos: -39.5,56.5 + parent: 100 + - uid: 15527 + components: + - type: Transform + pos: -39.5,55.5 + parent: 100 + - uid: 15528 + components: + - type: Transform + pos: -39.5,58.5 + parent: 100 + - uid: 15897 + components: + - type: Transform + pos: -39.5,57.5 + parent: 100 + - uid: 16709 + components: + - type: Transform + pos: -39.5,54.5 + parent: 100 - proto: CyborgEndoskeleton entities: - uid: 13536 @@ -46531,12 +46920,6 @@ entities: parent: 100 - proto: DefibrillatorCabinetFilled entities: - - uid: 11303 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -8.5,47.5 - parent: 100 - uid: 11371 components: - type: Transform @@ -46548,6 +46931,11 @@ entities: rot: -1.5707963267948966 rad pos: -4.5,42.5 parent: 100 + - uid: 11717 + components: + - type: Transform + pos: -8.5,47.5 + parent: 100 - uid: 12998 components: - type: Transform @@ -51036,7 +51424,7 @@ entities: - uid: 18882 components: - type: Transform - pos: 29.558083,49.894676 + pos: 28.718836,49.72606 parent: 100 - proto: DrinkShotGlass entities: @@ -56058,6 +56446,14 @@ entities: - type: Transform pos: 35.65315,-2.2439122 parent: 100 +- proto: FuelDispenser + entities: + - uid: 20683 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -17.5,40.5 + parent: 100 - proto: GasAnalyzer entities: - uid: 12143 @@ -68939,6 +69335,12 @@ entities: parent: 100 - type: AtmosPipeColor color: '#990000FF' + - uid: 12104 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -6.5,-62.5 + parent: 100 - uid: 12119 components: - type: Transform @@ -78191,12 +78593,6 @@ entities: parent: 100 - type: GasPressurePump targetPressure: 4500 - - uid: 19980 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -6.5,-62.5 - parent: 100 - uid: 19981 components: - type: Transform @@ -78212,14 +78608,6 @@ entities: parent: 100 - type: GasPressurePump targetPressure: 4500 - - uid: 20005 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -21.5,-60.5 - parent: 100 - - type: GasPressurePump - targetPressure: 4500 - uid: 20046 components: - type: Transform @@ -81422,6 +81810,12 @@ entities: parent: 100 - type: GasVolumePump transferRate: 40 + - uid: 13723 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -21.5,-60.5 + parent: 100 - uid: 19989 components: - type: Transform @@ -85088,26 +85482,6 @@ entities: - type: Transform pos: -20.5,-54.5 parent: 100 - - uid: 15881 - components: - - type: Transform - pos: -21.5,-53.5 - parent: 100 - - uid: 15882 - components: - - type: Transform - pos: -23.5,-53.5 - parent: 100 - - uid: 15884 - components: - - type: Transform - pos: -20.5,-53.5 - parent: 100 - - uid: 15885 - components: - - type: Transform - pos: -22.5,-53.5 - parent: 100 - uid: 15901 components: - type: Transform @@ -85123,31 +85497,11 @@ entities: - type: Transform pos: -20.5,-56.5 parent: 100 - - uid: 15904 - components: - - type: Transform - pos: -20.5,-59.5 - parent: 100 - uid: 15905 components: - type: Transform pos: -20.5,-58.5 parent: 100 - - uid: 15906 - components: - - type: Transform - pos: -21.5,-59.5 - parent: 100 - - uid: 15907 - components: - - type: Transform - pos: -22.5,-59.5 - parent: 100 - - uid: 15913 - components: - - type: Transform - pos: -23.5,-59.5 - parent: 100 - uid: 15934 components: - type: Transform @@ -88637,7 +88991,7 @@ entities: parent: 100 - type: DeviceLinkSink links: - - 14801 + - 20811 - proto: InflatableDoor entities: - uid: 2499 @@ -88897,6 +89251,16 @@ entities: - type: Transform pos: 29.5,47.5 parent: 100 + - uid: 20822 + components: + - type: Transform + pos: 29.5,49.5 + parent: 100 + - uid: 20823 + components: + - type: Transform + pos: -7.5,-3.5 + parent: 100 - proto: KitchenSpike entities: - uid: 6347 @@ -89232,6 +89596,36 @@ entities: 15854: - Pressed: DoorBolt - Pressed: Toggle +- proto: LockableButtonAtmospherics + entities: + - uid: 18872 + components: + - type: MetaData + name: blast doors button + - type: Transform + rot: 1.5707963267948966 rad + pos: -20.5,-57.5 + parent: 100 + - type: DeviceLinkSource + linkedPorts: + 3861: + - Pressed: Toggle + 2020: + - Pressed: Toggle + 14545: + - Pressed: Toggle + - uid: 20811 + components: + - type: MetaData + name: igniter button + - type: Transform + rot: 1.5707963267948966 rad + pos: -20.5,-58.5 + parent: 100 + - type: DeviceLinkSource + linkedPorts: + 14749: + - Pressed: Trigger - proto: LockerAtmosphericsFilled entities: - uid: 14840 @@ -90343,10 +90737,10 @@ entities: parent: 100 - proto: MedkitCombatFilled entities: - - uid: 12104 + - uid: 14551 components: - type: Transform - pos: 31.3018,-10.5771055 + pos: 2.1643336,45.352997 parent: 100 - proto: MedkitFilled entities: @@ -91003,6 +91397,13 @@ entities: - type: Transform pos: -11.344836,-12.266871 parent: 100 +- proto: NoticeBoard + entities: + - uid: 1921 + components: + - type: Transform + pos: -27.5,22.5 + parent: 100 - proto: NuclearBomb entities: - uid: 4024 @@ -91717,6 +92118,16 @@ entities: - type: Transform pos: -21.647715,-11.539142 parent: 100 + - uid: 20814 + components: + - type: Transform + pos: -28.725134,23.293703 + parent: 100 + - uid: 20815 + components: + - type: Transform + pos: -28.506384,23.168703 + parent: 100 - proto: PaperBin10 entities: - uid: 12584 @@ -92225,6 +92636,13 @@ entities: - type: Transform pos: -72.53555,76.567604 parent: 100 +- proto: PlushieRGBee + entities: + - uid: 20818 + components: + - type: Transform + pos: 31.712395,-11.2003565 + parent: 100 - proto: PlushieRouny entities: - uid: 3580 @@ -92481,6 +92899,13 @@ entities: - type: Transform pos: -23.5,14.5 parent: 100 +- proto: PosterContrabandClown + entities: + - uid: 19796 + components: + - type: Transform + pos: -34.5,52.5 + parent: 100 - proto: PosterContrabandCommunistState entities: - uid: 12338 @@ -92578,6 +93003,11 @@ entities: - type: Transform pos: 12.5,-21.5 parent: 100 + - uid: 15882 + components: + - type: Transform + pos: -30.5,-22.5 + parent: 100 - proto: PosterContrabandSpaceUp entities: - uid: 14314 @@ -92868,15 +93298,15 @@ entities: - type: Transform pos: 29.5,-22.5 parent: 100 - - uid: 17453 + - uid: 14933 components: - type: Transform - pos: 9.5,-65.5 + pos: 17.5,-38.5 parent: 100 - - uid: 19788 + - uid: 17453 components: - type: Transform - pos: 9.5,-40.5 + pos: 9.5,-65.5 parent: 100 - proto: PottedPlant20 entities: @@ -94803,6 +95233,12 @@ entities: parent: 100 - type: ApcPowerReceiver powerLoad: 0 + - uid: 2116 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -14.5,-11.5 + parent: 100 - uid: 2196 components: - type: Transform @@ -96085,26 +96521,6 @@ entities: - type: Transform pos: 25.5,14.5 parent: 100 - - uid: 1363 - components: - - type: Transform - pos: 22.5,15.5 - parent: 100 - - uid: 1364 - components: - - type: Transform - pos: 21.5,15.5 - parent: 100 - - uid: 1400 - components: - - type: Transform - pos: 21.5,12.5 - parent: 100 - - uid: 1401 - components: - - type: Transform - pos: 22.5,12.5 - parent: 100 - uid: 1939 components: - type: Transform @@ -96541,6 +96957,24 @@ entities: rot: 1.5707963267948966 rad pos: 30.5,53.5 parent: 100 + - uid: 19840 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -32.5,49.5 + parent: 100 + - uid: 19980 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -32.5,50.5 + parent: 100 + - uid: 20005 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -32.5,51.5 + parent: 100 - uid: 20711 components: - type: Transform @@ -96631,6 +97065,17 @@ entities: rot: 3.141592653589793 rad pos: 30.5,50.5 parent: 100 + - uid: 20368 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -32.5,52.5 + parent: 100 + - uid: 20421 + components: + - type: Transform + pos: -32.5,48.5 + parent: 100 - proto: RailingRound entities: - uid: 12770 @@ -101276,6 +101721,11 @@ entities: parent: 100 - proto: RandomVending entities: + - uid: 14975 + components: + - type: Transform + pos: -35.5,38.5 + parent: 100 - uid: 15185 components: - type: Transform @@ -101303,11 +101753,6 @@ entities: - type: Transform pos: -7.5,28.5 parent: 100 - - uid: 16709 - components: - - type: Transform - pos: -32.5,39.5 - parent: 100 - proto: RandomVendingSnacks entities: - uid: 16768 @@ -101797,31 +102242,11 @@ entities: - type: Transform pos: -23.5,-63.5 parent: 100 - - uid: 15467 - components: - - type: Transform - pos: -20.5,-53.5 - parent: 100 - - uid: 15946 - components: - - type: Transform - pos: -22.5,-53.5 - parent: 100 - uid: 15947 components: - type: Transform pos: -20.5,-56.5 parent: 100 - - uid: 15963 - components: - - type: Transform - pos: -21.5,-53.5 - parent: 100 - - uid: 15965 - components: - - type: Transform - pos: -23.5,-53.5 - parent: 100 - uid: 16002 components: - type: Transform @@ -101832,16 +102257,6 @@ entities: - type: Transform pos: -20.5,-57.5 parent: 100 - - uid: 16100 - components: - - type: Transform - pos: -20.5,-59.5 - parent: 100 - - uid: 16101 - components: - - type: Transform - pos: -21.5,-59.5 - parent: 100 - uid: 16178 components: - type: Transform @@ -101907,16 +102322,6 @@ entities: - type: Transform pos: -20.5,-55.5 parent: 100 - - uid: 16414 - components: - - type: Transform - pos: -23.5,-59.5 - parent: 100 - - uid: 16431 - components: - - type: Transform - pos: -22.5,-59.5 - parent: 100 - uid: 19629 components: - type: Transform @@ -105265,17 +105670,6 @@ entities: parent: 100 - proto: RemoteSignaller entities: - - uid: 14801 - components: - - type: MetaData - name: igniter remote - - type: Transform - pos: -19.657108,-58.005615 - parent: 100 - - type: DeviceLinkSource - linkedPorts: - 14749: - - Pressed: Trigger - uid: 19342 components: - type: Transform @@ -105473,6 +105867,11 @@ entities: - type: Transform pos: -48.5,62.5 parent: 100 + - uid: 20670 + components: + - type: Transform + pos: -30.5,55.5 + parent: 100 - uid: 20695 components: - type: Transform @@ -106069,46 +106468,6 @@ entities: - type: DeviceLinkSink links: - 12197 - - uid: 13723 - components: - - type: Transform - pos: -39.5,56.5 - parent: 100 - - type: DeviceLinkSink - links: - - 5710 - - uid: 14602 - components: - - type: Transform - pos: -39.5,57.5 - parent: 100 - - type: DeviceLinkSink - links: - - 5710 - - uid: 14614 - components: - - type: Transform - pos: -39.5,54.5 - parent: 100 - - type: DeviceLinkSink - links: - - 5710 - - uid: 14615 - components: - - type: Transform - pos: -39.5,55.5 - parent: 100 - - type: DeviceLinkSink - links: - - 5710 - - uid: 14975 - components: - - type: Transform - pos: -39.5,58.5 - parent: 100 - - type: DeviceLinkSink - links: - - 5710 - uid: 16447 components: - type: Transform @@ -106384,25 +106743,6 @@ entities: - Pressed: Toggle 13448: - Pressed: Toggle - - uid: 5710 - components: - - type: MetaData - name: shutters button - - type: Transform - pos: -39.5,53.5 - parent: 100 - - type: DeviceLinkSource - linkedPorts: - 14614: - - Pressed: Toggle - 14615: - - Pressed: Toggle - 13723: - - Pressed: Toggle - 14602: - - Pressed: Toggle - 14975: - - Pressed: Toggle - uid: 8928 components: - type: MetaData @@ -106498,22 +106838,6 @@ entities: - Pressed: Toggle 3200: - Pressed: Toggle - - uid: 14551 - components: - - type: MetaData - name: space button - - type: Transform - rot: 1.5707963267948966 rad - pos: -20.5,-57.5 - parent: 100 - - type: DeviceLinkSource - linkedPorts: - 3861: - - Pressed: Toggle - 2020: - - Pressed: Toggle - 14545: - - Pressed: Toggle - uid: 16450 components: - type: MetaData @@ -108742,6 +109066,13 @@ entities: - type: Transform pos: 19.5,7.5 parent: 100 +- proto: SpawnMobCow + entities: + - uid: 11303 + components: + - type: Transform + pos: -25.5,25.5 + parent: 100 - proto: SpawnMobCrabAtmos entities: - uid: 20499 @@ -109786,6 +110117,19 @@ entities: - type: Transform pos: 35.253117,42.681236 parent: 100 +- proto: Stairs + entities: + - uid: 19837 + components: + - type: Transform + pos: -33.5,49.5 + parent: 100 + - uid: 19838 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -33.5,51.5 + parent: 100 - proto: StairStage entities: - uid: 14858 @@ -110137,6 +110481,8 @@ entities: parent: 100 - uid: 14673 components: + - type: MetaData + name: gravity substation - type: Transform pos: -40.5,45.5 parent: 100 @@ -110254,6 +110600,28 @@ entities: - type: Transform pos: 26.5,29.5 parent: 100 +- proto: SuitStorageEVA + entities: + - uid: 2025 + components: + - type: Transform + pos: 22.5,15.5 + parent: 100 + - uid: 9698 + components: + - type: Transform + pos: 22.5,12.5 + parent: 100 + - uid: 14602 + components: + - type: Transform + pos: 21.5,15.5 + parent: 100 + - uid: 14614 + components: + - type: Transform + pos: 21.5,12.5 + parent: 100 - proto: SuitStorageEVAPrisoner entities: - uid: 4971 @@ -113824,6 +114192,31 @@ entities: - type: Transform pos: 14.5,16.5 parent: 100 + - uid: 18871 + components: + - type: Transform + pos: -39.5,54.5 + parent: 100 + - uid: 20679 + components: + - type: Transform + pos: -39.5,55.5 + parent: 100 + - uid: 20680 + components: + - type: Transform + pos: -39.5,56.5 + parent: 100 + - uid: 20681 + components: + - type: Transform + pos: -39.5,57.5 + parent: 100 + - uid: 20682 + components: + - type: Transform + pos: -39.5,58.5 + parent: 100 - proto: TegCenter entities: - uid: 19974 @@ -115033,6 +115426,11 @@ entities: rot: 3.141592653589793 rad pos: 2.5,41.5 parent: 100 + - uid: 11180 + components: + - type: Transform + pos: -6.5,47.5 + parent: 100 - uid: 11258 components: - type: Transform @@ -122106,6 +122504,26 @@ entities: - type: Transform pos: -7.5,-20.5 parent: 100 + - uid: 15885 + components: + - type: Transform + pos: -20.5,-59.5 + parent: 100 + - uid: 15904 + components: + - type: Transform + pos: -20.5,-53.5 + parent: 100 + - uid: 15906 + components: + - type: Transform + pos: -21.5,-53.5 + parent: 100 + - uid: 15907 + components: + - type: Transform + pos: -23.5,-53.5 + parent: 100 - uid: 15909 components: - type: Transform @@ -122116,6 +122534,11 @@ entities: - type: Transform pos: -15.5,-7.5 parent: 100 + - uid: 15946 + components: + - type: Transform + pos: -21.5,-59.5 + parent: 100 - uid: 15951 components: - type: Transform @@ -122126,6 +122549,21 @@ entities: - type: Transform pos: -14.5,-63.5 parent: 100 + - uid: 15963 + components: + - type: Transform + pos: -22.5,-59.5 + parent: 100 + - uid: 15965 + components: + - type: Transform + pos: -22.5,-53.5 + parent: 100 + - uid: 16100 + components: + - type: Transform + pos: -23.5,-59.5 + parent: 100 - uid: 16107 components: - type: Transform @@ -123247,6 +123685,12 @@ entities: - type: Transform pos: 31.5,25.5 parent: 100 + - uid: 18873 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -16.5,-12.5 + parent: 100 - uid: 19271 components: - type: Transform @@ -124155,12 +124599,6 @@ entities: parent: 100 - proto: WallReinforcedDiagonal entities: - - uid: 3709 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -16.5,-12.5 - parent: 100 - uid: 5573 components: - type: Transform @@ -125987,11 +126425,6 @@ entities: - type: Transform pos: -26.5,33.5 parent: 100 - - uid: 1234 - components: - - type: Transform - pos: -32.5,38.5 - parent: 100 - uid: 1237 components: - type: Transform @@ -129463,6 +129896,11 @@ entities: rot: 3.141592653589793 rad pos: -12.5,3.5 parent: 100 + - uid: 18876 + components: + - type: Transform + pos: -32.5,38.5 + parent: 100 - proto: WallSolidRust entities: - uid: 1623 @@ -130051,6 +130489,13 @@ entities: parent: 100 - type: WarpPoint location: laser tag arena + - uid: 20817 + components: + - type: Transform + pos: -44.5,61.5 + parent: 100 + - type: WarpPoint + location: Broadway - proto: WarpPointArrivals entities: - uid: 20806 @@ -131934,6 +132379,21 @@ entities: - type: Transform pos: 14.5,17.5 parent: 100 + - uid: 20819 + components: + - type: Transform + pos: 6.5,53.5 + parent: 100 + - uid: 20820 + components: + - type: Transform + pos: 7.5,53.5 + parent: 100 + - uid: 20821 + components: + - type: Transform + pos: 8.5,53.5 + parent: 100 - proto: WindowTintedDirectional entities: - uid: 1428 diff --git a/Resources/Maps/shoukou.yml b/Resources/Maps/shoukou.yml index 8929313a710..aae6d1c316e 100644 --- a/Resources/Maps/shoukou.yml +++ b/Resources/Maps/shoukou.yml @@ -7122,7 +7122,6 @@ entities: solutions: beaker: temperature: 293.15 - canMix: True canReact: True maxVol: 50 name: null diff --git a/Resources/Maps/submarine.yml b/Resources/Maps/submarine.yml index b9c988e81cf..88ff54134a9 100644 --- a/Resources/Maps/submarine.yml +++ b/Resources/Maps/submarine.yml @@ -447,11 +447,11 @@ entities: version: 6 -3,3: ind: -3,3 - tiles: PAAAAAAAfwAAAAAAPAAAAAAAfwAAAAAAPAAAAAAAfwAAAAAAPAAAAAAAfwAAAAAAPAAAAAAAfwAAAAAAfgAAAAAAfwAAAAAAfgAAAAAAfwAAAAAATwAAAAADTwAAAAACPAAAAAAAfwAAAAAAPAAAAAAAfwAAAAAAPAAAAAAAfwAAAAAAPAAAAAAAfwAAAAAAPAAAAAAAfwAAAAAAfgAAAAAAfwAAAAAAfgAAAAAAfwAAAAAATwAAAAADTwAAAAAAPAAAAAAAfwAAAAAAPAAAAAAAfwAAAAAAPAAAAAAAfwAAAAAAPAAAAAAAfwAAAAAAPAAAAAAAfwAAAAAAfgAAAAAAfwAAAAAAfgAAAAAAfwAAAAAATwAAAAABTwAAAAACPAAAAAAAfwAAAAAAPAAAAAAAfwAAAAAAPAAAAAAAfwAAAAAAPAAAAAAAfwAAAAAAPAAAAAAAfwAAAAAAfgAAAAAAfwAAAAAAfgAAAAAAfwAAAAAAVAAAAAACVAAAAAAAUAAAAAAAfwAAAAAAUAAAAAAAfwAAAAAAUAAAAAAAfwAAAAAAUAAAAAAAfwAAAAAAUAAAAAAAfwAAAAAAfgAAAAAAfwAAAAAAfgAAAAAAfwAAAAAAVAAAAAAAVAAAAAACfgAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfwAAAAAAbgAAAAAAfwAAAAAAbgAAAAAAbgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAKwAAAAADKwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAcgAAAAAAcgAAAAADcgAAAAACcgAAAAADfwAAAAAAewAAAAABewAAAAAAewAAAAAAewAAAAABewAAAAAATwAAAAACKwAAAAADKwAAAAACfwAAAAAAfwAAAAAAfwAAAAAAcgAAAAAAcgAAAAAAcgAAAAADcgAAAAAATwAAAAABewAAAAAAewAAAAADewAAAAABewAAAAADewAAAAAATwAAAAABKwAAAAAAKwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAcgAAAAACcgAAAAADcgAAAAACcgAAAAABfwAAAAAAewAAAAACewAAAAAAewAAAAADewAAAAABewAAAAAAfwAAAAAAKwAAAAAAKwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAewAAAAADewAAAAAAewAAAAACewAAAAABewAAAAAAUAAAAAAAKwAAAAABKwAAAAACfwAAAAAAfwAAAAAAfwAAAAAAewAAAAAAewAAAAACewAAAAAAewAAAAAAewAAAAACewAAAAAAewAAAAAAewAAAAAAewAAAAACewAAAAADUAAAAAAAKwAAAAADKwAAAAABUAAAAAAAfwAAAAAAfwAAAAAAewAAAAAAewAAAAABewAAAAACewAAAAADewAAAAACewAAAAACewAAAAACewAAAAAAewAAAAABewAAAAABfwAAAAAAUAAAAAAAUAAAAAAA + tiles: PAAAAAAAfwAAAAAAPAAAAAAAfwAAAAAAPAAAAAAAfwAAAAAAPAAAAAAAfwAAAAAAPAAAAAAAfwAAAAAAfgAAAAAAfwAAAAAAfgAAAAAAfwAAAAAATwAAAAADTwAAAAACPAAAAAAAfwAAAAAAPAAAAAAAfwAAAAAAPAAAAAAAfwAAAAAAPAAAAAAAfwAAAAAAPAAAAAAAfwAAAAAAfgAAAAAAfwAAAAAAfgAAAAAAfwAAAAAATwAAAAADTwAAAAAAPAAAAAAAfwAAAAAAPAAAAAAAfwAAAAAAPAAAAAAAfwAAAAAAPAAAAAAAfwAAAAAAPAAAAAAAfwAAAAAAfgAAAAAAfwAAAAAAfgAAAAAAfwAAAAAAVAAAAAAAVAAAAAAAPAAAAAAAfwAAAAAAPAAAAAAAfwAAAAAAPAAAAAAAfwAAAAAAPAAAAAAAfwAAAAAAPAAAAAAAfwAAAAAAfgAAAAAAfwAAAAAAfgAAAAAAfwAAAAAAVAAAAAACVAAAAAAAUAAAAAAAfwAAAAAAUAAAAAAAfwAAAAAAUAAAAAAAfwAAAAAAUAAAAAAAfwAAAAAAUAAAAAAAfwAAAAAAfgAAAAAAfwAAAAAAfgAAAAAAfwAAAAAAVAAAAAAAVAAAAAACfgAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfwAAAAAAbgAAAAAAfwAAAAAAbgAAAAAAbgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAKwAAAAADKwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAcgAAAAAAcgAAAAADcgAAAAACcgAAAAADfwAAAAAAewAAAAABewAAAAAAewAAAAAAewAAAAABewAAAAAATwAAAAACKwAAAAADKwAAAAACfwAAAAAAfwAAAAAAfwAAAAAAcgAAAAAAcgAAAAAAcgAAAAADcgAAAAAATwAAAAABewAAAAAAewAAAAADewAAAAABewAAAAADewAAAAAATwAAAAABKwAAAAAAKwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAcgAAAAACcgAAAAADcgAAAAACcgAAAAABfwAAAAAAewAAAAACewAAAAAAewAAAAADewAAAAABewAAAAAAfwAAAAAAKwAAAAAAKwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAewAAAAADewAAAAAAewAAAAACewAAAAABewAAAAAAUAAAAAAAKwAAAAABKwAAAAACfwAAAAAAfwAAAAAAfwAAAAAAewAAAAAAewAAAAACewAAAAAAewAAAAAAewAAAAACewAAAAAAewAAAAAAewAAAAAAewAAAAACewAAAAADUAAAAAAAKwAAAAADKwAAAAABUAAAAAAAfwAAAAAAfwAAAAAAewAAAAAAewAAAAABewAAAAACewAAAAADewAAAAACewAAAAACewAAAAACewAAAAAAewAAAAABewAAAAABfwAAAAAAUAAAAAAAUAAAAAAA version: 6 -2,3: ind: -2,3 - tiles: TwAAAAADTwAAAAAATwAAAAAATwAAAAABVAAAAAADIAAAAAABIAAAAAACUAAAAAAAQwAAAAAAQwAAAAAATwAAAAADIQAAAAAAIQAAAAACIQAAAAADIQAAAAABIQAAAAAATwAAAAAATwAAAAACTwAAAAAATwAAAAAAVAAAAAACIAAAAAADIAAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAIAAAAAADIQAAAAACIQAAAAABIQAAAAACIQAAAAACIQAAAAABTwAAAAADTwAAAAADTwAAAAAATwAAAAACVAAAAAACIAAAAAADIAAAAAACfwAAAAAAQwAAAAAAQwAAAAAATwAAAAAAIQAAAAABIQAAAAACIQAAAAAAIQAAAAADIQAAAAABVAAAAAAAVAAAAAABVAAAAAABTwAAAAADVAAAAAAAIAAAAAAAIAAAAAAAfwAAAAAAQwAAAAAAQwAAAAAATwAAAAADIQAAAAADIQAAAAABIQAAAAABIQAAAAADIQAAAAABVAAAAAADVAAAAAADVAAAAAAAfwAAAAAATwAAAAABTwAAAAAATwAAAAAAfwAAAAAAfwAAAAAATwAAAAAATwAAAAABTwAAAAAATwAAAAABfwAAAAAAfwAAAAAAfwAAAAAATwAAAAADfwAAAAAAfwAAAAAAfwAAAAAAeAAAAAADeAAAAAABeAAAAAAAfwAAAAAAcgAAAAAAcgAAAAADcgAAAAADcgAAAAABcgAAAAABcgAAAAABfwAAAAAAMgAAAAAAbgAAAAAAbgAAAAAAbgAAAAAAfwAAAAAAeAAAAAAAeAAAAAABeAAAAAABfwAAAAAAcgAAAAADcgAAAAAAcgAAAAABcgAAAAACcgAAAAADcgAAAAACTwAAAAAAMgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAeAAAAAACeAAAAAADeAAAAAADTwAAAAADcgAAAAABcgAAAAADTwAAAAACTwAAAAACcgAAAAABcgAAAAAATwAAAAAAMgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAeAAAAAADeAAAAAACeAAAAAADfwAAAAAAcgAAAAADcgAAAAABTwAAAAACTwAAAAADcgAAAAABcgAAAAADTwAAAAADMgAAAAAAcQAAAAAAcQAAAAAAcQAAAAABUAAAAAAAeAAAAAACeAAAAAACeAAAAAABUAAAAAAAcgAAAAABcgAAAAAAcgAAAAACcgAAAAAAcgAAAAAAcgAAAAABTwAAAAACMgAAAAAAcQAAAAAAcQAAAAACcQAAAAADUAAAAAAAeAAAAAACeAAAAAADeAAAAAACUAAAAAAAcgAAAAACcgAAAAACcgAAAAAAcgAAAAACcgAAAAAAcgAAAAAATwAAAAADMgAAAAAAcQAAAAAAcQAAAAACcQAAAAABTwAAAAACeAAAAAAAeAAAAAAAeAAAAAAATwAAAAACTwAAAAACTwAAAAAATwAAAAABTwAAAAADTwAAAAACTwAAAAADfwAAAAAAMgAAAAAAcQAAAAAAcQAAAAAAcQAAAAABTwAAAAADeAAAAAAAeAAAAAAAeAAAAAADTwAAAAADVAAAAAADVAAAAAAAVAAAAAABVAAAAAACVAAAAAADTwAAAAACfwAAAAAAfwAAAAAAcQAAAAACcQAAAAACcQAAAAABUAAAAAAAeAAAAAAAeAAAAAAAeAAAAAACTwAAAAAAVAAAAAABVAAAAAAAVAAAAAABVAAAAAABVAAAAAABTwAAAAABeAAAAAACeAAAAAABcQAAAAAAcQAAAAACcQAAAAAAUAAAAAAAeAAAAAABTwAAAAACeAAAAAAATwAAAAABTwAAAAABTwAAAAADTwAAAAAATwAAAAAATwAAAAACTwAAAAAAeAAAAAADeAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAeAAAAAADTwAAAAABeAAAAAACeAAAAAACeAAAAAADeAAAAAABeAAAAAABeAAAAAADeAAAAAACeAAAAAABeAAAAAADeAAAAAAB + tiles: TwAAAAADTwAAAAAATwAAAAAATwAAAAABVAAAAAADIAAAAAABIAAAAAACUAAAAAAAQwAAAAAAQwAAAAAATwAAAAADIQAAAAAAIQAAAAACIQAAAAADIQAAAAABIQAAAAAATwAAAAAATwAAAAACTwAAAAAATwAAAAAAVAAAAAACIAAAAAADIAAAAAAAfwAAAAAAQwAAAAAAQwAAAAAAIAAAAAADIQAAAAACIQAAAAABIQAAAAACIQAAAAACIQAAAAABVAAAAAAAVAAAAAAAVAAAAAAATwAAAAACVAAAAAACIAAAAAADIAAAAAACfwAAAAAAQwAAAAAAQwAAAAAATwAAAAAAIQAAAAABIQAAAAACIQAAAAAAIQAAAAADIQAAAAABVAAAAAAAVAAAAAABVAAAAAABTwAAAAADVAAAAAAAIAAAAAAAIAAAAAAAfwAAAAAAQwAAAAAAQwAAAAAATwAAAAADIQAAAAADIQAAAAABIQAAAAABIQAAAAADIQAAAAABVAAAAAADVAAAAAADVAAAAAAAfwAAAAAATwAAAAABTwAAAAAATwAAAAAAfwAAAAAAfwAAAAAATwAAAAAATwAAAAABTwAAAAAATwAAAAABfwAAAAAAfwAAAAAAfwAAAAAATwAAAAADfwAAAAAAfwAAAAAAfwAAAAAAeAAAAAADeAAAAAABeAAAAAAAfwAAAAAAcgAAAAAAcgAAAAADcgAAAAADcgAAAAABcgAAAAABcgAAAAABfwAAAAAAMgAAAAAAbgAAAAAAbgAAAAAAbgAAAAAAfwAAAAAAeAAAAAAAeAAAAAABeAAAAAABfwAAAAAAcgAAAAADcgAAAAAAcgAAAAABcgAAAAACcgAAAAADcgAAAAACTwAAAAAAMgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAeAAAAAACeAAAAAADeAAAAAADTwAAAAADcgAAAAABcgAAAAADTwAAAAACTwAAAAACcgAAAAABcgAAAAAATwAAAAAAMgAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAeAAAAAADeAAAAAACeAAAAAADfwAAAAAAcgAAAAADcgAAAAABTwAAAAACTwAAAAADcgAAAAABcgAAAAADTwAAAAADMgAAAAAAcQAAAAAAcQAAAAAAcQAAAAABUAAAAAAAeAAAAAACeAAAAAACeAAAAAABUAAAAAAAcgAAAAABcgAAAAAAcgAAAAACcgAAAAAAcgAAAAAAcgAAAAABTwAAAAACMgAAAAAAcQAAAAAAcQAAAAACcQAAAAADUAAAAAAAeAAAAAACeAAAAAADeAAAAAACUAAAAAAAcgAAAAACcgAAAAACcgAAAAAAcgAAAAACcgAAAAAAcgAAAAAATwAAAAADMgAAAAAAcQAAAAAAcQAAAAACcQAAAAABTwAAAAACeAAAAAAAeAAAAAAAeAAAAAAATwAAAAACTwAAAAACTwAAAAAATwAAAAABTwAAAAADTwAAAAACTwAAAAADfwAAAAAAMgAAAAAAcQAAAAAAcQAAAAAAcQAAAAABTwAAAAADeAAAAAAAeAAAAAAAeAAAAAADTwAAAAADVAAAAAADVAAAAAAAVAAAAAABVAAAAAACVAAAAAADTwAAAAACfwAAAAAAfwAAAAAAcQAAAAACcQAAAAACcQAAAAABUAAAAAAAeAAAAAAAeAAAAAAAeAAAAAACTwAAAAAAVAAAAAABVAAAAAAAVAAAAAABVAAAAAABVAAAAAABTwAAAAABeAAAAAACeAAAAAABcQAAAAAAcQAAAAACcQAAAAAAUAAAAAAAeAAAAAABTwAAAAACeAAAAAAATwAAAAABTwAAAAABTwAAAAADTwAAAAAATwAAAAAATwAAAAACTwAAAAAAeAAAAAADeAAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAfwAAAAAAeAAAAAADTwAAAAABeAAAAAACeAAAAAACeAAAAAADeAAAAAABeAAAAAABeAAAAAADeAAAAAACeAAAAAABeAAAAAADeAAAAAAB version: 6 -5,3: ind: -5,3 @@ -11018,7 +11018,8 @@ entities: 1,-7: 0: 65535 1,-6: - 0: 65535 + 0: 32767 + 1: 32768 1,-5: 0: 65535 2,-8: @@ -11650,7 +11651,8 @@ entities: -11,8: 0: 65535 -11,9: - 0: 65535 + 0: 65527 + 1: 8 -11,10: 0: 65535 -11,11: @@ -11668,7 +11670,8 @@ entities: -9,9: 0: 65535 -9,10: - 0: 65535 + 0: 49151 + 2: 16384 -9,11: 0: 65535 -15,-8: @@ -12031,19 +12034,19 @@ entities: 0: 65535 -16,-3: 0: 4607 - 1: 60928 + 3: 60928 -16,-2: 0: 65297 - 1: 238 + 3: 238 -16,-1: 0: 65535 -15,-4: 0: 65535 -15,-3: 0: 35071 - 1: 30464 + 3: 30464 -15,-2: - 1: 119 + 3: 119 0: 65416 -15,-1: 0: 65535 @@ -12519,43 +12522,43 @@ entities: 0: 65535 -15,13: 0: 16383 - 2: 49152 + 4: 49152 -15,14: 0: 13107 - 2: 52428 + 4: 52428 -14,12: 0: 65535 -14,13: 0: 53247 - 2: 12288 + 4: 12288 -14,14: - 2: 13107 + 4: 13107 0: 52428 -13,12: 0: 48059 - 3: 17476 + 5: 17476 -13,13: 0: 63487 -13,14: 0: 48063 -12,12: - 4: 4369 - 2: 17476 + 6: 4369 + 4: 17476 0: 43690 -12,13: 0: 65439 -12,14: 0: 65535 -11,12: - 2: 4369 - 5: 17476 + 4: 4369 + 7: 17476 0: 43690 -11,13: 0: 65487 -11,14: 0: 65535 -10,12: - 2: 4369 + 4: 4369 0: 61166 -10,13: 0: 65535 @@ -12852,7 +12855,8 @@ entities: -10,1: 0: 65535 -9,15: - 0: 65535 + 0: 61439 + 8: 4096 0,17: 0: 65535 0,18: @@ -13087,9 +13091,9 @@ entities: 0: 65535 -15,15: 0: 65523 - 2: 12 + 4: 12 -14,15: - 2: 3 + 4: 3 0: 65532 -13,15: 0: 65535 @@ -14457,6 +14461,36 @@ entities: - 0 - 0 - 0 + - volume: 2500 + temperature: 293.14975 + moles: + - 20.078888 + - 75.53487 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - volume: 2500 + temperature: 293.1495 + moles: + - 20.078888 + - 75.53487 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 - volume: 2500 temperature: 235 moles: @@ -14532,6 +14566,21 @@ entities: - 0 - 0 - 0 + - volume: 2500 + temperature: 293.14975 + moles: + - 21.824879 + - 82.10312 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 chunkSize: 4 - type: GasTileOverlay - type: BecomesStation @@ -34604,6 +34653,7 @@ entities: - type: DeviceLinkSink links: - 9223 + - 40522 - uid: 9257 components: - type: Transform @@ -34612,6 +34662,7 @@ entities: - type: DeviceLinkSink links: - 2512 + - 40523 - uid: 9351 components: - type: Transform @@ -36223,7 +36274,7 @@ entities: rot: 3.141592653589793 rad pos: -17.5,-9.5 parent: 2 -- proto: BodyBag_Folded +- proto: BodyBagFolded entities: - uid: 1410 components: @@ -37021,13 +37072,17 @@ entities: - uid: 9690 components: - type: Transform - pos: -33.704086,43.897106 - parent: 2 + parent: 40544 + - type: Physics + canCollide: False + - type: InsideEntityStorage - uid: 17014 components: - type: Transform - pos: -33.683586,43.79884 - parent: 2 + parent: 40544 + - type: Physics + canCollide: False + - type: InsideEntityStorage - proto: BoxSyringe entities: - uid: 1571 @@ -37584,6 +37639,18 @@ entities: rot: -1.5707963267948966 rad pos: 89.5,-13.5 parent: 2 + - uid: 40524 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 36.5,53.5 + parent: 2 + - uid: 40525 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 48.5,53.5 + parent: 2 - proto: ButtonFrameCautionSecurity entities: - uid: 28381 @@ -55456,6 +55523,11 @@ entities: - type: Transform pos: 58.5,41.5 parent: 2 + - uid: 28461 + components: + - type: Transform + pos: 76.5,-3.5 + parent: 2 - uid: 28467 components: - type: Transform @@ -59186,6 +59258,11 @@ entities: - type: Transform pos: 102.5,15.5 parent: 2 + - uid: 33677 + components: + - type: Transform + pos: 78.5,-3.5 + parent: 2 - uid: 33692 components: - type: Transform @@ -64561,6 +64638,11 @@ entities: - type: Transform pos: 63.5,-30.5 parent: 2 + - uid: 40512 + components: + - type: Transform + pos: 77.5,-3.5 + parent: 2 - proto: CableApcStack entities: - uid: 37500 @@ -64568,6 +64650,11 @@ entities: - type: Transform pos: -58.407085,43.545338 parent: 2 + - uid: 40527 + components: + - type: Transform + pos: 20.484457,-18.316412 + parent: 2 - proto: CableApcStack1 entities: - uid: 12431 @@ -80250,6 +80337,11 @@ entities: - type: Transform pos: -59.164898,43.537525 parent: 2 + - uid: 40526 + components: + - type: Transform + pos: 20.375082,-18.417974 + parent: 2 - proto: CableHVStack1 entities: - uid: 9835 @@ -86384,6 +86476,11 @@ entities: - type: Transform pos: -58.782085,43.529713 parent: 2 + - uid: 40528 + components: + - type: Transform + pos: 20.726645,-18.4961 + parent: 2 - proto: CableTerminal entities: - uid: 1439 @@ -99703,13 +99800,6 @@ entities: - type: Transform pos: 17.5,-1.5 parent: 2 -- proto: ChemicalPayload - entities: - - uid: 36047 - components: - - type: Transform - pos: 31.597778,16.540527 - parent: 2 - proto: ChemistryEmptyBottle01 entities: - uid: 26714 @@ -100544,13 +100634,6 @@ entities: - type: Transform pos: 86.5,-10.5 parent: 2 -- proto: ClosetSteelBase - entities: - - uid: 33677 - components: - - type: Transform - pos: -35.5,63.5 - parent: 2 - proto: ClosetToolFilled entities: - uid: 26253 @@ -102274,11 +102357,6 @@ entities: parent: 2 - proto: CombatKnife entities: - - uid: 36046 - components: - - type: Transform - pos: 31.519653,16.720215 - parent: 2 - uid: 40436 components: - type: Transform @@ -102946,6 +103024,18 @@ entities: rot: 3.141592653589793 rad pos: 15.5,52.5 parent: 2 + - uid: 17013 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -34.5,-56.5 + parent: 2 + - uid: 40521 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -36.5,-56.5 + parent: 2 - proto: ComputerResearchAndDevelopment entities: - uid: 4157 @@ -103478,6 +103568,15 @@ entities: - type: DeviceLinkSink links: - 28204 + - uid: 9505 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -33.5,52.5 + parent: 2 + - type: DeviceLinkSink + links: + - 10478 - uid: 9598 components: - type: Transform @@ -103812,6 +103911,33 @@ entities: - type: DeviceLinkSink links: - 28204 + - uid: 36047 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -32.5,52.5 + parent: 2 + - type: DeviceLinkSink + links: + - 10478 + - uid: 36048 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -32.5,51.5 + parent: 2 + - type: DeviceLinkSink + links: + - 10478 + - uid: 36049 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -31.5,51.5 + parent: 2 + - type: DeviceLinkSink + links: + - 10478 - uid: 39813 components: - type: Transform @@ -103902,6 +104028,59 @@ entities: - type: DeviceLinkSink links: - 39827 + - uid: 40407 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -30.5,51.5 + parent: 2 + - type: DeviceLinkSink + links: + - 10478 + - uid: 40499 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -30.5,52.5 + parent: 2 + - type: DeviceLinkSink + links: + - 10478 + - uid: 40500 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -33.5,51.5 + parent: 2 + - type: DeviceLinkSink + links: + - 10478 + - uid: 40501 + components: + - type: Transform + pos: -29.5,52.5 + parent: 2 + - type: DeviceLinkSink + links: + - 10478 + - uid: 40511 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -31.5,52.5 + parent: 2 + - type: DeviceLinkSink + links: + - 10478 + - uid: 40513 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -29.5,51.5 + parent: 2 + - type: DeviceLinkSink + links: + - 10478 - proto: CourierBag entities: - uid: 22394 @@ -104221,6 +104400,11 @@ entities: - type: Transform pos: -49.5,-11.5 parent: 2 + - uid: 40507 + components: + - type: Transform + pos: -22.5,58.5 + parent: 2 - proto: CrateFreezer entities: - uid: 23538 @@ -104235,6 +104419,11 @@ entities: - type: Transform pos: 74.5,-11.5 parent: 2 + - uid: 40510 + components: + - type: Transform + pos: -35.5,58.5 + parent: 2 - proto: CrateFunPlushie entities: - uid: 34039 @@ -106368,12 +106557,6 @@ entities: - type: Transform pos: -20.5,55.5 parent: 2 - - uid: 18238 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -26.5,55.5 - parent: 2 - uid: 18713 components: - type: Transform @@ -106502,6 +106685,18 @@ entities: rot: 3.141592653589793 rad pos: 57.5,60.5 parent: 2 + - uid: 40541 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -29.5,44.5 + parent: 2 + - uid: 40542 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -26.5,44.5 + parent: 2 - proto: DisposalJunction entities: - uid: 2908 @@ -106733,6 +106928,12 @@ entities: rot: -1.5707963267948966 rad pos: -33.5,64.5 parent: 2 + - uid: 25990 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -26.5,55.5 + parent: 2 - uid: 36000 components: - type: Transform @@ -111398,6 +111599,12 @@ entities: rot: -1.5707963267948966 rad pos: -31.5,-27.5 parent: 2 + - uid: 18238 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -26.5,54.5 + parent: 2 - uid: 18243 components: - type: Transform @@ -112506,6 +112713,72 @@ entities: rot: 3.141592653589793 rad pos: -33.5,66.5 parent: 2 + - uid: 40529 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -26.5,53.5 + parent: 2 + - uid: 40531 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -26.5,52.5 + parent: 2 + - uid: 40532 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -26.5,51.5 + parent: 2 + - uid: 40533 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -26.5,50.5 + parent: 2 + - uid: 40534 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -26.5,49.5 + parent: 2 + - uid: 40535 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -26.5,48.5 + parent: 2 + - uid: 40536 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -26.5,47.5 + parent: 2 + - uid: 40537 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -26.5,46.5 + parent: 2 + - uid: 40538 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -26.5,45.5 + parent: 2 + - uid: 40539 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -27.5,44.5 + parent: 2 + - uid: 40540 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -28.5,44.5 + parent: 2 - proto: DisposalPipeBroken entities: - uid: 2523 @@ -113105,6 +113378,12 @@ entities: - type: Transform pos: -29.5,67.5 parent: 2 + - uid: 40518 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -29.5,43.5 + parent: 2 - proto: DisposalUnit entities: - uid: 712 @@ -113447,6 +113726,11 @@ entities: - type: Transform pos: -35.5,65.5 parent: 2 + - uid: 40509 + components: + - type: Transform + pos: -29.5,43.5 + parent: 2 - proto: DisposalYJunction entities: - uid: 16695 @@ -176790,8 +177074,10 @@ entities: - uid: 12055 components: - type: Transform - pos: 6.5493526,-20.872643 - parent: 2 + parent: 28451 + - type: Physics + canCollide: False + - type: InsideEntityStorage - uid: 15379 components: - type: Transform @@ -176845,6 +177131,14 @@ entities: - type: Transform pos: -44.588486,60.89263 parent: 2 +- proto: HandHeldMassScanner + entities: + - uid: 40506 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -8.739797,-45.467434 + parent: 2 - proto: HandLabeler entities: - uid: 1084 @@ -176918,6 +177212,11 @@ entities: - type: Transform pos: 70.5,-6.5 parent: 2 + - uid: 26498 + components: + - type: Transform + pos: -35.5,62.5 + parent: 2 - proto: HatSpawner entities: - uid: 21090 @@ -179969,6 +180268,36 @@ entities: - type: Transform pos: -40.5,36.5 parent: 2 + - 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: + - 26511 + - 26513 + paper_label: !type:ContainerSlot + showEnts: False + occludes: True + ent: null - proto: LockerElectricalSuppliesFilled entities: - uid: 50 @@ -180345,6 +180674,62 @@ entities: - type: Transform pos: 39.5,26.5 parent: 2 +- proto: LockerSecurity + entities: + - uid: 40544 + components: + - type: Transform + pos: -33.5,43.5 + parent: 2 + - type: EntityStorage + air: + volume: 200 + immutable: False + temperature: 293.1465 + 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: + - 39530 + - 39531 + - 10347 + - 39534 + - 39523 + - 21843 + - 10566 + - 39527 + - 39522 + - 9690 + - 39537 + - 17014 + - 39535 + - 39525 + - 39528 + - 39529 + - 39536 + - 39521 + - 39526 + - 39533 + - 39524 + paper_label: !type:ContainerSlot + showEnts: False + occludes: True + ent: null - proto: LockerSecurityFilled entities: - uid: 3737 @@ -180377,6 +180762,44 @@ entities: - type: Transform pos: -6.5,42.5 parent: 2 + - uid: 28451 + components: + - type: Transform + pos: 7.5,-20.5 + parent: 2 + - 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: + - 12055 + - 4676 + - 17385 + - 17723 + - 12057 + paper_label: !type:ContainerSlot + showEnts: False + occludes: True + ent: null - proto: LockerWallMedicalFilled entities: - uid: 3509 @@ -180400,11 +180823,11 @@ entities: - type: Transform pos: 13.5,44.5 parent: 2 - - uid: 20601 + - uid: 40530 components: - type: Transform - rot: 3.141592653589793 rad - pos: -34.5,31.5 + rot: 1.5707963267948966 rad + pos: -36.5,35.5 parent: 2 - proto: LockerWardenFilled entities: @@ -180689,22 +181112,28 @@ entities: - uid: 39533 components: - type: Transform - pos: -30.032213,46.53773 - parent: 2 + parent: 40544 + - type: Physics + canCollide: False + - type: InsideEntityStorage - proto: MagazineBoxMagnumPractice entities: - uid: 39535 components: - type: Transform - pos: -29.704088,46.858044 - parent: 2 + parent: 40544 + - type: Physics + canCollide: False + - type: InsideEntityStorage - proto: MagazineBoxPistolPractice entities: - uid: 39536 components: - type: Transform - pos: -30.266588,46.71742 - parent: 2 + parent: 40544 + - type: Physics + canCollide: False + - type: InsideEntityStorage - proto: MagazineBoxPistolRubber entities: - uid: 13387 @@ -180717,44 +181146,73 @@ entities: - uid: 39537 components: - type: Transform - pos: -29.477526,46.522106 - parent: 2 + parent: 40544 + - type: Physics + canCollide: False + - type: InsideEntityStorage - proto: MagazineBoxSpecialPractice entities: - uid: 39534 components: - type: Transform - pos: -30.602526,46.72523 - parent: 2 + parent: 40544 + - type: Physics + canCollide: False + - type: InsideEntityStorage - proto: MagazineLightRiflePractice entities: - uid: 39530 components: - type: Transform - pos: -33.43846,43.47523 - parent: 2 + parent: 40544 + - type: Physics + canCollide: False + - type: InsideEntityStorage - uid: 39531 components: - type: Transform - pos: -33.24315,43.522106 - parent: 2 + parent: 40544 + - type: Physics + canCollide: False + - type: InsideEntityStorage - proto: MagazinePistolPractice entities: - uid: 10347 components: - type: Transform - pos: -33.547836,46.63148 + parent: 40544 + - type: Physics + canCollide: False + - type: InsideEntityStorage + - uid: 15703 + components: + - type: Transform + pos: -32.8151,46.561256 parent: 2 - uid: 21843 components: - type: Transform - pos: -33.59471,46.66273 + parent: 40544 + - type: Physics + canCollide: False + - type: InsideEntityStorage + - uid: 28462 + components: + - type: Transform + pos: -32.549477,46.47532 parent: 2 - uid: 39522 components: - type: Transform - rot: 3.141592653589793 rad - pos: -33.50096,46.56898 + parent: 40544 + - type: Physics + canCollide: False + - type: InsideEntityStorage + - uid: 40503 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -30.190104,46.592506 parent: 2 - proto: MagazinePistolRubber entities: @@ -180773,30 +181231,40 @@ entities: - uid: 10566 components: - type: Transform - pos: -29.665026,43.490856 - parent: 2 + parent: 40544 + - type: Physics + canCollide: False + - type: InsideEntityStorage - uid: 39521 components: - type: Transform - pos: -29.563463,43.545544 - parent: 2 + parent: 40544 + - type: Physics + canCollide: False + - type: InsideEntityStorage - uid: 39525 components: - type: Transform - pos: -29.383776,43.63148 - parent: 2 + parent: 40544 + - type: Physics + canCollide: False + - type: InsideEntityStorage - proto: MagazineRiflePractice entities: - uid: 39528 components: - type: Transform - pos: -32.9619,46.50648 - parent: 2 + parent: 40544 + - type: Physics + canCollide: False + - type: InsideEntityStorage - uid: 39529 components: - type: Transform - pos: -33.15721,46.576794 - parent: 2 + parent: 40544 + - type: Physics + canCollide: False + - type: InsideEntityStorage - proto: MailBag entities: - uid: 6695 @@ -181461,6 +181929,11 @@ entities: - type: Transform pos: 39.5,6.5 parent: 2 + - uid: 20601 + components: + - type: Transform + pos: 31.5,16.5 + parent: 2 - uid: 20963 components: - type: Transform @@ -181547,6 +182020,16 @@ entities: - type: Transform pos: -45.5,70.5 parent: 2 + - uid: 40502 + components: + - type: Transform + pos: 34.5,16.5 + parent: 2 + - uid: 40504 + components: + - type: Transform + pos: 31.5,15.5 + parent: 2 - proto: Matchbox entities: - uid: 30063 @@ -182114,13 +182597,6 @@ entities: - type: Transform pos: 24.5,-0.5 parent: 2 -- proto: ModularGrenade - entities: - - uid: 36048 - components: - - type: Transform - pos: 31.316528,16.04834 - parent: 2 - proto: MopBucketFull entities: - uid: 10261 @@ -188406,12 +188882,6 @@ entities: rot: 3.141592653589793 rad pos: -25.5,-39.5 parent: 2 - - uid: 10478 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -34.5,45.5 - parent: 2 - uid: 23429 components: - type: Transform @@ -188433,6 +188903,12 @@ entities: - type: Transform pos: -35.5,7.5 parent: 2 + - uid: 40516 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -34.5,43.5 + parent: 2 - proto: PosterContrabandSpaceCola entities: - uid: 7627 @@ -191127,11 +191603,6 @@ entities: - type: Transform pos: -0.5,50.5 parent: 2 - - uid: 40407 - components: - - type: Transform - pos: -22.5,58.5 - parent: 2 - proto: PottedPlantRD entities: - uid: 28745 @@ -195668,12 +196139,6 @@ entities: rot: 1.5707963267948966 rad pos: -23.5,42.5 parent: 2 - - uid: 25990 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -33.5,43.5 - parent: 2 - uid: 25992 components: - type: Transform @@ -195686,12 +196151,6 @@ entities: rot: 3.141592653589793 rad pos: -30.5,43.5 parent: 2 - - uid: 26498 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -29.5,43.5 - parent: 2 - uid: 26598 components: - type: Transform @@ -200696,6 +201155,16 @@ entities: - type: Transform pos: -71.5,2.5 parent: 2 + - uid: 40515 + components: + - type: Transform + pos: -38.5,60.5 + parent: 2 + - uid: 40519 + components: + - type: Transform + pos: -36.5,59.5 + parent: 2 - proto: RandomMedicCorpseSpawner entities: - uid: 5338 @@ -209202,9 +209671,10 @@ entities: - uid: 17385 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 7.927308,-20.399904 - parent: 2 + parent: 28451 + - type: Physics + canCollide: False + - type: InsideEntityStorage - uid: 22670 components: - type: Transform @@ -209679,7 +210149,7 @@ entities: - uid: 2722 components: - type: Transform - pos: 21.019302,-18.386 + pos: 21.726645,-18.40235 parent: 2 - uid: 4951 components: @@ -209852,7 +210322,7 @@ entities: - uid: 12315 components: - type: Transform - pos: 20.54274,-18.35475 + pos: 21.30477,-18.386724 parent: 2 - uid: 16504 components: @@ -210564,6 +211034,26 @@ entities: - Pressed: Open 30311: - Pressed: Open + - uid: 40522 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 36.5,53.5 + parent: 2 + - type: DeviceLinkSource + linkedPorts: + 9253: + - Pressed: Toggle + - uid: 40523 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 48.5,53.5 + parent: 2 + - type: DeviceLinkSource + linkedPorts: + 9257: + - Pressed: Toggle - proto: SignalSwitchDirectional entities: - uid: 3283 @@ -210601,6 +211091,44 @@ entities: 28201: - On: Forward - Off: Off + - uid: 10478 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -34.5,45.5 + parent: 2 + - type: DeviceLinkSource + linkedPorts: + 40513: + - On: Forward + - Off: Off + 40407: + - On: Forward + - Off: Off + 36049: + - On: Forward + - Off: Off + 36048: + - On: Forward + - Off: Off + 40500: + - On: Forward + - Off: Off + 9505: + - On: Forward + - Off: Off + 36047: + - On: Forward + - Off: Off + 40511: + - On: Forward + - Off: Off + 40499: + - On: Forward + - Off: Off + 40501: + - On: Forward + - Off: Off - uid: 11344 components: - type: Transform @@ -217326,25 +217854,49 @@ entities: - uid: 39523 components: - type: Transform - pos: -32.7119,46.522106 - parent: 2 + parent: 40544 + - type: Physics + canCollide: False + - type: InsideEntityStorage - uid: 39524 components: - type: Transform - pos: -32.415024,46.428356 - parent: 2 + parent: 40544 + - type: Physics + canCollide: False + - type: InsideEntityStorage +- proto: SpeedLoaderMagnumRubber + entities: + - uid: 26511 + components: + - type: Transform + parent: 22421 + - type: Physics + canCollide: False + - type: InsideEntityStorage + - uid: 26513 + components: + - type: Transform + parent: 22421 + - type: Physics + canCollide: False + - type: InsideEntityStorage - proto: SpeedLoaderSpecialPractice entities: - uid: 39526 components: - type: Transform - pos: -32.3994,46.69398 - parent: 2 + parent: 40544 + - type: Physics + canCollide: False + - type: InsideEntityStorage - uid: 39527 components: - type: Transform - pos: -32.61815,46.81898 - parent: 2 + parent: 40544 + - type: Physics + canCollide: False + - type: InsideEntityStorage - proto: SprayBottle entities: - uid: 37373 @@ -218526,13 +219078,17 @@ entities: - uid: 4676 components: - type: Transform - pos: 8.432165,-20.89608 - parent: 2 + parent: 28451 + - type: Physics + canCollide: False + - type: InsideEntityStorage - uid: 12057 components: - type: Transform - pos: 8.619665,-21.05233 - parent: 2 + parent: 28451 + - type: Physics + canCollide: False + - type: InsideEntityStorage - uid: 13368 components: - type: Transform @@ -224376,25 +224932,27 @@ entities: parent: 2 - proto: TargetSyndicate entities: - - uid: 26511 + - uid: 26528 components: - type: Transform - pos: -30.5,52.5 + pos: -33.5,52.5 parent: 2 - - uid: 26513 + - uid: 26529 components: - type: Transform - pos: -32.5,52.5 + pos: -29.5,52.5 parent: 2 - - uid: 26528 + - uid: 36046 components: - type: Transform - pos: -33.5,52.5 + rot: 1.5707963267948966 rad + pos: -32.5,51.5 parent: 2 - - uid: 26529 + - uid: 40517 components: - type: Transform - pos: -29.5,52.5 + rot: 1.5707963267948966 rad + pos: -30.5,51.5 parent: 2 - proto: tatamimat entities: @@ -224652,13 +225210,6 @@ entities: showEnts: False occludes: True ents: [] -- proto: TimerTrigger - entities: - - uid: 36049 - components: - - type: Transform - pos: 31.629028,15.79834 - parent: 2 - proto: ToiletDirtyWater entities: - uid: 19706 @@ -225310,6 +225861,11 @@ entities: rot: 1.5707963267948966 rad pos: -34.744827,10.731756 parent: 2 + - uid: 40543 + components: + - type: Transform + pos: -29.875687,43.410027 + parent: 2 - proto: TrashBananaPeel entities: - uid: 943 @@ -232728,12 +233284,6 @@ entities: - type: Transform pos: -19.5,41.5 parent: 2 - - uid: 15703 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -29.5,42.5 - parent: 2 - uid: 15704 components: - type: Transform @@ -237262,6 +237812,11 @@ entities: - type: Transform pos: 72.5,-27.5 parent: 2 + - uid: 40514 + components: + - type: Transform + pos: -29.5,42.5 + parent: 2 - proto: WallReinforcedDiagonal entities: - uid: 22062 @@ -247594,19 +248149,23 @@ entities: - uid: 17723 components: - type: Transform - pos: 6.3726206,-20.212404 - parent: 2 + parent: 28451 + - type: Physics + canCollide: False + - type: InsideEntityStorage - proto: WeaponDisablerPractice entities: - - uid: 9505 + - uid: 40508 components: - type: Transform - pos: -32.3164,43.572277 + rot: -1.5707963267948966 rad + pos: -32.656937,43.57409 parent: 2 - - uid: 17013 + - uid: 40520 components: - type: Transform - pos: -32.582024,43.751965 + rot: -1.5707963267948966 rad + pos: -32.2585,43.60534 parent: 2 - proto: WeaponFlareGun entities: @@ -247637,6 +248196,14 @@ entities: - type: Transform pos: -22.514536,51.356438 parent: 2 +- proto: WeaponPistolMk58Nonlethal + entities: + - uid: 40505 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -33.331062,46.564983 + parent: 2 - proto: WeaponShotgunKammererNonLethal entities: - uid: 37918 diff --git a/Resources/Maps/tortuga.yml b/Resources/Maps/tortuga.yml index 017606312bd..20c295fa7c7 100644 --- a/Resources/Maps/tortuga.yml +++ b/Resources/Maps/tortuga.yml @@ -76275,7 +76275,6 @@ entities: solutions: drink: temperature: 293.15 - canMix: True canReact: True maxVol: 20 name: null @@ -76292,7 +76291,6 @@ entities: solutions: drink: temperature: 293.15 - canMix: True canReact: True maxVol: 20 name: null @@ -134062,7 +134060,6 @@ entities: solutions: beaker: temperature: 293.15 - canMix: True canReact: True maxVol: 200 name: null @@ -134781,7 +134778,6 @@ entities: solutions: beaker: temperature: 293.15 - canMix: True canReact: True maxVol: 100 name: null @@ -134789,6 +134785,8 @@ entities: - data: null ReagentId: Acetone Quantity: 15 + - type: MixableSolution + solution: beaker - proto: LeavesCannabisDried entities: - uid: 7129 diff --git a/Resources/Migrations/deltaMigrations.yml b/Resources/Migrations/deltaMigrations.yml index 5844eb06c13..b7b310b135d 100644 --- a/Resources/Migrations/deltaMigrations.yml +++ b/Resources/Migrations/deltaMigrations.yml @@ -105,4 +105,7 @@ ComputerAlert: PrinterDoc # 2024-03-29 #Remove whenever holoparasite isn't broken I suppose -MagicalLamp: Lamp \ No newline at end of file +MagicalLamp: Lamp + +# 2024-04-21 +ClothingEyesHudSyndicateMed: ClothingEyesHudSyndicateAgent \ No newline at end of file diff --git a/Resources/Migrations/migration.yml b/Resources/Migrations/migration.yml index 162dc8442b8..01fea95c031 100644 --- a/Resources/Migrations/migration.yml +++ b/Resources/Migrations/migration.yml @@ -235,6 +235,8 @@ AirlockShuttleEasyPryLocked: AirlockExternalShuttleLocked #ClothingBackpackFilledDetective: ClothingBackpackSecurityFilledDetective #ClothingBackpackDuffelFilledDetective: ClothingBackpackDuffelSecurityFilledDetective #ClothingBackpackSatchelFilledDetective: ClothingBackpackSatchelSecurityFilledDetective +FoodChili: FoodChiliPepper +FoodChilly: FoodChillyPepper # 2024-03-11 ImprovisedExplosive: FireBomb @@ -248,6 +250,8 @@ ClothingHeadHatHairflower: FoodPoppy RPED: null # 2024-03-30 +TraversalDistorterMachineCircuitboard: null +MachineTraversalDistorter: null # These are technically not equivalent, but it probably makes more sense to replace any existing SCAF stuff with SOME kind of armor, instead of just deleting it outright. ClothingHeadHelmetScaf: ClothingHeadHelmetBasic ClothingOuterArmorScaf: ClothingOuterArmorBasic @@ -256,3 +260,7 @@ ClothingOuterArmorScaf: ClothingOuterArmorBasic ClothingNeckFlowerWreath: ClothingHeadHatFlowerWreath ClothingHeadHatFlowerCrown: ClothingHeadHatFlowerWreath BriefcaseSyndieBase: null + +# 2024-04-08 +BodyBag_Container: BodyBag +BodyBag_Folded: BodyBagFolded diff --git a/Resources/Prototypes/Accents/word_replacements.yml b/Resources/Prototypes/Accents/word_replacements.yml index 45a1ffa3af0..a938f3aaa26 100644 --- a/Resources/Prototypes/Accents/word_replacements.yml +++ b/Resources/Prototypes/Accents/word_replacements.yml @@ -424,3 +424,4 @@ # chatsan-word-41: chatsan-replacement-41 # chatsan-word-42: chatsan-replacement-42 chatsan-word-43: chatsan-replacement-43 + chatsan-word-44: chatsan-replacement-44 diff --git a/Resources/Prototypes/Body/Organs/Animal/slimes.yml b/Resources/Prototypes/Body/Organs/Animal/slimes.yml index 3bdb1aef8f1..f1a3d47e667 100644 --- a/Resources/Prototypes/Body/Organs/Animal/slimes.yml +++ b/Resources/Prototypes/Body/Organs/Animal/slimes.yml @@ -37,7 +37,7 @@ - state: lung-l-slime - state: lung-r-slime - type: Lung - Alert: LowNitrogen + alert: LowNitrogen - type: Metabolizer removeEmpty: true solutionOnBody: false diff --git a/Resources/Prototypes/Body/Organs/arachnid.yml b/Resources/Prototypes/Body/Organs/arachnid.yml index 976fd679fdc..c1e199e1121 100644 --- a/Resources/Prototypes/Body/Organs/arachnid.yml +++ b/Resources/Prototypes/Body/Organs/arachnid.yml @@ -46,7 +46,7 @@ - ReagentId: UncookedAnimalProteins Quantity: 5 - type: Metabolizer - updateFrequency: 1.5 + updateInterval: 1.5 - type: entity id: OrganArachnidLungs @@ -60,7 +60,7 @@ - state: lung-r - type: Lung - type: Metabolizer - updateFrequency: 1.5 + updateInterval: 1.5 removeEmpty: true solutionOnBody: false solution: "Lung" @@ -92,7 +92,7 @@ - type: Sprite state: heart-on - type: Metabolizer - updateFrequency: 1.5 + updateInterval: 1.5 maxReagents: 2 metabolizerTypes: [Arachnid] groups: @@ -110,7 +110,7 @@ - type: Sprite state: liver - type: Metabolizer # The liver metabolizes certain chemicals only, like alcohol. - updateFrequency: 1.5 + updateInterval: 1.5 maxReagents: 1 metabolizerTypes: [Animal] groups: @@ -130,7 +130,7 @@ - state: kidney-r # The kidneys just remove anything that doesn't currently have any metabolisms, as a stopgap. - type: Metabolizer - updateFrequency: 1.5 + updateInterval: 1.5 maxReagents: 5 metabolizerTypes: [Animal] removeEmpty: true diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_emergency.yml b/Resources/Prototypes/Catalog/Cargo/cargo_emergency.yml index 2715e0c3501..c04e49f413c 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_emergency.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_emergency.yml @@ -4,7 +4,7 @@ sprite: Clothing/Head/Helmets/bombsuit.rsi state: icon product: CrateEmergencyExplosive - cost: 650 + cost: 1000 category: cargoproduct-category-name-emergency group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml b/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml index d77bef37579..4fbd8f89a5e 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml @@ -33,7 +33,17 @@ sprite: Objects/Specific/Service/vending_machine_restock.rsi state: base product: CrateVendingMachineRestockClothesFilled - cost: 8000 #DeltaV + cost: 3500 # DeltaV + category: cargoproduct-category-name-service + group: market + +- type: cargoProduct + id: CrateVendingMachineRestockAutoDrobe + icon: + sprite: Objects/Specific/Service/vending_machine_restock.rsi + state: base + product: CrateVendingMachineRestockAutoDrobeFilled + cost: 1700 # DeltaV category: cargoproduct-category-name-service group: market diff --git a/Resources/Prototypes/Catalog/Fills/Boxes/medical.yml b/Resources/Prototypes/Catalog/Fills/Boxes/medical.yml index aba61ce332d..d9beb724356 100644 --- a/Resources/Prototypes/Catalog/Fills/Boxes/medical.yml +++ b/Resources/Prototypes/Catalog/Fills/Boxes/medical.yml @@ -88,27 +88,6 @@ - state: box - state: nitrile -- type: entity - name: sterile swab box - parent: BoxCardboard - id: BoxMouthSwab - components: - - type: Storage - grid: - - 0,0,4,3 - - type: StorageFill - contents: - - id: DiseaseSwab - amount: 10 - - type: Sprite - layers: - - state: box - - state: swab - - type: GuideHelp - guides: - # - Virology (when it's back) - - Botany - - type: entity name: body bag box parent: BoxCardboard @@ -117,7 +96,7 @@ components: - type: StorageFill contents: - - id: BodyBag_Folded + - id: BodyBagFolded amount: 4 - type: Sprite layers: diff --git a/Resources/Prototypes/Catalog/Fills/Crates/botany.yml b/Resources/Prototypes/Catalog/Fills/Crates/botany.yml index f10fd010f64..c0d8a422f27 100644 --- a/Resources/Prototypes/Catalog/Fills/Crates/botany.yml +++ b/Resources/Prototypes/Catalog/Fills/Crates/botany.yml @@ -6,8 +6,6 @@ components: - type: StorageFill contents: - - id: BananaSeeds - amount: 2 - id: EggySeeds amount: 2 - id: TowercapSeeds @@ -20,8 +18,6 @@ amount: 2 - id: FlyAmanitaSeeds amount: 2 - - id: PineappleSeeds - amount: 2 - id: BungoSeeds amount: 2 diff --git a/Resources/Prototypes/Catalog/Fills/Crates/fun.yml b/Resources/Prototypes/Catalog/Fills/Crates/fun.yml index 1db0c3121ed..ea1e05359ac 100644 --- a/Resources/Prototypes/Catalog/Fills/Crates/fun.yml +++ b/Resources/Prototypes/Catalog/Fills/Crates/fun.yml @@ -182,6 +182,8 @@ - id: GrassBattlemap - id: DiceBag amount: 6 + - id: PaperCNCSheet + amount: 6 - type: entity id: CrateFunSadTromboneImplants diff --git a/Resources/Prototypes/Catalog/Fills/Crates/vending.yml b/Resources/Prototypes/Catalog/Fills/Crates/vending.yml index 5a6b5ca089f..d54e103a70f 100644 --- a/Resources/Prototypes/Catalog/Fills/Crates/vending.yml +++ b/Resources/Prototypes/Catalog/Fills/Crates/vending.yml @@ -22,11 +22,20 @@ id: CrateVendingMachineRestockClothesFilled parent: CratePlastic name: clothing restock crate - description: Contains a pair of restock boxes, one for the ClothesMate and one for the AutoDrobe. + description: Contains a restock box for the clothes vending machines. components: - type: StorageFill contents: - id: VendingMachineRestockClothes + +- type: entity + id: CrateVendingMachineRestockAutoDrobeFilled + parent: CratePlastic + name: AutoDrobe restock crate + description: Contains a restock box for the AutoDrobe. + components: + - type: StorageFill + contents: - id: VendingMachineRestockCostumes - type: entity diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/engineer.yml b/Resources/Prototypes/Catalog/Fills/Lockers/engineer.yml index e4d995e52ee..b3efb6ec1d2 100644 --- a/Resources/Prototypes/Catalog/Fills/Lockers/engineer.yml +++ b/Resources/Prototypes/Catalog/Fills/Lockers/engineer.yml @@ -65,13 +65,20 @@ components: - type: StorageFill contents: + - id: ClothingHeadHatWelding + - id: ClothingHeadHatWelding + - id: ClothingHeadHatWelding + prob: 0.5 + - id: Welder + - id: Welder - id: WelderMini + orGroup: thirdWelder - id: Welder - prob: 0.7 + prob: 0.33 + orGroup: thirdWelder - id: WelderIndustrial - prob: 0.5 - - id: ClothingHeadHatWelding - prob: 0.5 + prob: 0.33 + orGroup: thirdWelder - type: entity id: LockerAtmosphericsFilledHardsuit diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/misc.yml b/Resources/Prototypes/Catalog/Fills/Lockers/misc.yml index fd7152b2296..34eb2a608ed 100644 --- a/Resources/Prototypes/Catalog/Fills/Lockers/misc.yml +++ b/Resources/Prototypes/Catalog/Fills/Lockers/misc.yml @@ -61,6 +61,21 @@ - id: BoxMRE prob: 0.1 +- type: entity + id: ClosetEmergencyN2FilledRandom + parent: ClosetEmergencyN2 + suffix: Filled, Random + components: + - type: StorageFill + contents: + - id: ClothingMaskBreath + - id: EmergencyNitrogenTankFilled + prob: 0.80 + orGroup: EmergencyTankOrRegularTank + - id: NitrogenTankFilled + prob: 0.20 + orGroup: EmergencyTankOrRegularTank + - type: entity id: ClosetFireFilled parent: ClosetFire diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/service.yml b/Resources/Prototypes/Catalog/Fills/Lockers/service.yml index 110d62f62aa..bfa46a6135c 100644 --- a/Resources/Prototypes/Catalog/Fills/Lockers/service.yml +++ b/Resources/Prototypes/Catalog/Fills/Lockers/service.yml @@ -105,14 +105,12 @@ - id: ClothingHandsGlovesLeather - id: ClothingOuterApronBotanist - id: ClothingHeadBandBotany - - id: HydroponicsToolClippers - - id: HydroponicsToolSpade - - id: HydroponicsToolMiniHoe - id: RobustHarvestChemistryBottle prob: 0.3 - id: ClothingBeltPlant - id: PlantBag ##Some maps don't have nutrivend - id: BoxMouthSwab + - id: Dropper - id: HandLabeler - id: ClothingUniformOveralls - id: ClothingHeadHatTrucker diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/wardrobe_colors.yml b/Resources/Prototypes/Catalog/Fills/Lockers/wardrobe_colors.yml index 2038ef00139..4e885a08b29 100644 --- a/Resources/Prototypes/Catalog/Fills/Lockers/wardrobe_colors.yml +++ b/Resources/Prototypes/Catalog/Fills/Lockers/wardrobe_colors.yml @@ -38,7 +38,7 @@ amount: 3 - id: ClothingUniformRandomArmless amount: 5 - - id: ClothingUniformRandomStandart + - id: ClothingUniformRandomStandard amount: 5 - id: ClothingUniformRandomBra amount: 5 diff --git a/Resources/Prototypes/Catalog/Jukebox/Standard.yml b/Resources/Prototypes/Catalog/Jukebox/Standard.yml new file mode 100644 index 00000000000..7440428bd49 --- /dev/null +++ b/Resources/Prototypes/Catalog/Jukebox/Standard.yml @@ -0,0 +1,41 @@ +- type: jukebox + id: FlipFlap + name: X-CEED - Flip Flap + path: + path: /Audio/Jukebox/flip-flap.ogg + +- type: jukebox + id: Tintin + name: Jeroen Tel - Tintin on the Moon + path: + path: /Audio/Jukebox/title3.ogg + +- type: jukebox + id: Thunderdome + name: MashedByMachines - Sector 11 + path: + path: /Audio/Jukebox/sector11.ogg + +- type: jukebox + id: Constellations + name: Qwertyquerty - Constellations + path: + path: /Audio/Jukebox/constellations.ogg + +- type: jukebox + id: Drifting + name: Qwertyquerty - Drifting + path: + path: /Audio/Jukebox/drifting.ogg + +- type: jukebox + id: starlight + name: Qwertyquerty - Starlight + path: + path: /Audio/Jukebox/starlight.ogg + +- type: jukebox + id: sunset + name: PigeonBeans - Sunset + path: + path: /Audio/Jukebox/sunset.ogg diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/nutri.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/nutri.yml index 31011057370..29b3cb8aee7 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/nutri.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/nutri.yml @@ -1,11 +1,12 @@ - type: vendingMachineInventory id: NutriMaxInventory startingInventory: - HydroponicsToolSpade: 3 - HydroponicsToolMiniHoe: 3 - HydroponicsToolClippers: 3 - HydroponicsToolScythe: 3 - HydroponicsToolHatchet: 3 + HydroponicsToolSpade: 4 + HydroponicsToolMiniHoe: 4 + HydroponicsToolClippers: 4 + HydroponicsToolScythe: 4 + HydroponicsToolHatchet: 4 + Dropper: 4 PlantBag: 3 PlantBGoneSpray: 20 WeedSpray: 20 diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/seeds.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/seeds.yml index 05e3ae0eb0e..25e41702af3 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/seeds.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/seeds.yml @@ -17,6 +17,7 @@ GrapeSeeds: 5 LemonSeeds: 5 LimeSeeds: 5 + PineappleSeeds: 4 LingzhiSeeds: 3 OatSeeds: 5 OnionSeeds: 5 diff --git a/Resources/Prototypes/Catalog/uplink_catalog.yml b/Resources/Prototypes/Catalog/uplink_catalog.yml index 1c833fa62d6..0e04ca9d7b5 100644 --- a/Resources/Prototypes/Catalog/uplink_catalog.yml +++ b/Resources/Prototypes/Catalog/uplink_catalog.yml @@ -314,7 +314,7 @@ Telecrystal: 11 categories: - UplinkExplosives - restockTime: 30 + restockTime: 1800 conditions: - !type:StoreWhitelistCondition blacklist: @@ -622,6 +622,16 @@ categories: - UplinkDeception +- type: listing + id: UplinkChameleonProjector + name: uplink-chameleon-projector-name + description: uplink-chameleon-projector-desc + productEntity: ChameleonProjector + cost: + Telecrystal: 7 + categories: + - UplinkDeception + - type: listing id: UplinkHeadsetEncryptionKey name: uplink-encryption-key-name diff --git a/Resources/Prototypes/DeltaV/Body/Organs/harpy.yml b/Resources/Prototypes/DeltaV/Body/Organs/harpy.yml index 2d47ecd352d..adc626bc114 100644 --- a/Resources/Prototypes/DeltaV/Body/Organs/harpy.yml +++ b/Resources/Prototypes/DeltaV/Body/Organs/harpy.yml @@ -10,7 +10,7 @@ - state: lung-r - type: Lung - type: Metabolizer - updateFrequency: 2.0 + updateInterval: 2.0 removeEmpty: true solutionOnBody: false solution: "Lung" diff --git a/Resources/Prototypes/DeltaV/Catalog/Fills/Backpacks/StarterGear/backpack.yml b/Resources/Prototypes/DeltaV/Catalog/Fills/Backpacks/StarterGear/backpack.yml index 2e551702a99..93538d6f725 100644 --- a/Resources/Prototypes/DeltaV/Catalog/Fills/Backpacks/StarterGear/backpack.yml +++ b/Resources/Prototypes/DeltaV/Catalog/Fills/Backpacks/StarterGear/backpack.yml @@ -20,7 +20,7 @@ contents: - id: BoxSurvivalMedical - id: EmergencyRollerBedSpawnFolded - - id: BodyBag_Folded + - id: BodyBagFolded - id: Portafib - type: entity diff --git a/Resources/Prototypes/DeltaV/Catalog/Fills/Backpacks/StarterGear/duffelbag.yml b/Resources/Prototypes/DeltaV/Catalog/Fills/Backpacks/StarterGear/duffelbag.yml index 03128291b58..fbd4d7d934d 100644 --- a/Resources/Prototypes/DeltaV/Catalog/Fills/Backpacks/StarterGear/duffelbag.yml +++ b/Resources/Prototypes/DeltaV/Catalog/Fills/Backpacks/StarterGear/duffelbag.yml @@ -7,7 +7,7 @@ contents: - id: BoxSurvivalMedical - id: EmergencyRollerBedSpawnFolded - - id: BodyBag_Folded + - id: BodyBagFolded - id: Portafib - type: entity diff --git a/Resources/Prototypes/DeltaV/Catalog/Fills/Backpacks/StarterGear/satchel.yml b/Resources/Prototypes/DeltaV/Catalog/Fills/Backpacks/StarterGear/satchel.yml index b6ae3c2a9cb..ced9275d7f5 100644 --- a/Resources/Prototypes/DeltaV/Catalog/Fills/Backpacks/StarterGear/satchel.yml +++ b/Resources/Prototypes/DeltaV/Catalog/Fills/Backpacks/StarterGear/satchel.yml @@ -7,7 +7,7 @@ contents: - id: BoxSurvivalMedical - id: EmergencyRollerBedSpawnFolded - - id: BodyBag_Folded + - id: BodyBagFolded - id: Portafib - type: entity diff --git a/Resources/Prototypes/DeltaV/Entities/Clothing/Back/backpacks.yml/backpacks.yml b/Resources/Prototypes/DeltaV/Entities/Clothing/Back/backpacks.yml/backpacks.yml index 37b4a65d98d..38bbd956868 100644 --- a/Resources/Prototypes/DeltaV/Entities/Clothing/Back/backpacks.yml/backpacks.yml +++ b/Resources/Prototypes/DeltaV/Entities/Clothing/Back/backpacks.yml/backpacks.yml @@ -7,7 +7,7 @@ contents: - id: BoxSurvivalSecurity - id: EmergencyRollerBedSpawnFolded - - id: BodyBag_Folded + - id: BodyBagFolded - id: Portafib # - id: Flash - id: BruteAutoInjector diff --git a/Resources/Prototypes/DeltaV/Entities/Clothing/Back/backpacks.yml/duffelbag.yml b/Resources/Prototypes/DeltaV/Entities/Clothing/Back/backpacks.yml/duffelbag.yml index 2ab94da0a4b..caf5aa3515b 100644 --- a/Resources/Prototypes/DeltaV/Entities/Clothing/Back/backpacks.yml/duffelbag.yml +++ b/Resources/Prototypes/DeltaV/Entities/Clothing/Back/backpacks.yml/duffelbag.yml @@ -7,7 +7,7 @@ contents: - id: BoxSurvivalSecurity - id: EmergencyRollerBedSpawnFolded - - id: BodyBag_Folded + - id: BodyBagFolded - id: Portafib # - id: Flash - id: BruteAutoInjector diff --git a/Resources/Prototypes/DeltaV/Entities/Clothing/Back/backpacks.yml/satchel.yml b/Resources/Prototypes/DeltaV/Entities/Clothing/Back/backpacks.yml/satchel.yml index d2d081da462..9c27500a1f7 100644 --- a/Resources/Prototypes/DeltaV/Entities/Clothing/Back/backpacks.yml/satchel.yml +++ b/Resources/Prototypes/DeltaV/Entities/Clothing/Back/backpacks.yml/satchel.yml @@ -7,7 +7,7 @@ contents: - id: BoxSurvivalSecurity - id: EmergencyRollerBedSpawnFolded - - id: BodyBag_Folded + - id: BodyBagFolded - id: Portafib # - id: Flash - id: BruteAutoInjector diff --git a/Resources/Prototypes/DeltaV/Entities/Clothing/Eyes/hud.yml b/Resources/Prototypes/DeltaV/Entities/Clothing/Eyes/hud.yml index c482da6188d..96efcf6ddfc 100644 --- a/Resources/Prototypes/DeltaV/Entities/Clothing/Eyes/hud.yml +++ b/Resources/Prototypes/DeltaV/Entities/Clothing/Eyes/hud.yml @@ -23,7 +23,7 @@ - GlassesNearsight - type: entity - parent: ClothingEyesBase + parent: [ClothingEyesBase, ShowSecurityIcons] id: ClothingEyesPrescriptionHudSecurity name: prescription security hud description: A poorly done and rushed mix between half of a pair of prescription glasses and a security HUD allowing you to see clearly out of one eye and inspect the employee's ID and warning status in the other! @@ -32,7 +32,6 @@ sprite: DeltaV/Clothing/Eyes/Hud/prescsechud.rsi - type: Clothing sprite: DeltaV/Clothing/Eyes/Hud/prescsechud.rsi - - type: ShowSecurityIcons - type: Construction graph: PrescriptionSecHud node: prescsechud @@ -40,19 +39,3 @@ tags: - HudSecurity - GlassesNearsight - -- type: entity - parent: ClothingEyesBase - id: ClothingEyesHudSyndicateMed - name: syndicate medical visor - description: An upgraded syndicate visor with automatic health readings, designed for better detection of humanoids and their subsequent elimination. - components: - - type: Sprite - sprite: DeltaV/Clothing/Eyes/Hud/syndmed.rsi - - type: Clothing - sprite: DeltaV/Clothing/Eyes/Hud/syndmed.rsi - - type: ShowSyndicateIcons - - type: ShowSecurityIcons - - type: ShowHealthBars - damageContainers: - - Biological diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/familiars.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/familiars.yml index 57aa38c3749..ab8c41f2f27 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/familiars.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/familiars.yml @@ -127,10 +127,6 @@ - type: Welder fuelReagent: Phlogiston tankSafe: true - litMeleeDamageBonus: - types: # When lit, negate standard melee damage and replace with heat - Heat: 10 - Blunt: -10 # welderOnSounds: # collection: WelderIfritHandOn # welderOffSounds: diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/nukiemouse.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/nukiemouse.yml index 96950317c1f..9e3eb961af3 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/nukiemouse.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/nukiemouse.yml @@ -143,7 +143,7 @@ - type: Bloodstream bloodMaxVolume: 60 - type: CanEscapeInventory - BaseResistTime: 3 + baseResistTime: 3 - type: MobPrice price: 250 # Their suits, while tiny, go for quite a bit on the market - type: IntrinsicRadioReceiver @@ -163,4 +163,4 @@ interactFailureString: petting-failure-nukie-mouse interactSuccessSpawn: EffectHearts interactSuccessSound: - path: /Audio/Animals/mouse_squeak.ogg \ No newline at end of file + path: /Audio/Animals/mouse_squeak.ogg diff --git a/Resources/Prototypes/DeltaV/Entities/Structures/Doors/Windoors/windoor.yml b/Resources/Prototypes/DeltaV/Entities/Structures/Doors/Windoors/windoor.yml index d27a8d8e70e..759f97a80bb 100644 --- a/Resources/Prototypes/DeltaV/Entities/Structures/Doors/Windoors/windoor.yml +++ b/Resources/Prototypes/DeltaV/Entities/Structures/Doors/Windoors/windoor.yml @@ -3,21 +3,24 @@ id: WindoorMailLocked suffix: Mail, Locked components: - - type: AccessReader - access: [["Mail"]] + - type: ContainerFill + containers: + board: [ DoorElectronicsMail ] - type: entity parent: WindoorSecure id: WindoorSecureMailLocked suffix: Mail, Locked components: - - type: AccessReader - access: [["Mail"]] + - type: ContainerFill + containers: + board: [ DoorElectronicsMail ] - type: entity parent: WindoorSecure id: WindoorSecureParamedicLocked suffix: Paramedic, Locked components: - - type: AccessReader - access: [["Paramedic"]] + - type: ContainerFill + containers: + board: [ DoorElectronicsParamedic ] diff --git a/Resources/Prototypes/DeltaV/Entities/Structures/Machines/syndicate_monitor_server.yml b/Resources/Prototypes/DeltaV/Entities/Structures/Machines/syndicate_monitor_server.yml index b4a1f8808eb..517f94700e1 100644 --- a/Resources/Prototypes/DeltaV/Entities/Structures/Machines/syndicate_monitor_server.yml +++ b/Resources/Prototypes/DeltaV/Entities/Structures/Machines/syndicate_monitor_server.yml @@ -27,7 +27,6 @@ machine_parts: !type:Container - type: CrewMonitoringServer - type: SingletonDeviceNetServer - ServerType: CrewMonitoringServer - type: DeviceNetwork deviceNetId: Wireless transmitFrequencyId: CrewMonitor @@ -37,7 +36,6 @@ range: 10000 # Mega range for Listening Post - type: ApcPowerReceiver powerLoad: 200 - priority: Low - type: ExtensionCableReceiver - type: Destructible thresholds: diff --git a/Resources/Prototypes/DeltaV/GameRules/events.yml b/Resources/Prototypes/DeltaV/GameRules/events.yml index cbed17625ba..b7199374eae 100644 --- a/Resources/Prototypes/DeltaV/GameRules/events.yml +++ b/Resources/Prototypes/DeltaV/GameRules/events.yml @@ -36,7 +36,6 @@ noSpawn: true components: - type: StationEvent - id: VentCritters earliestStart: 15 minimumPlayers: 15 weight: 4 diff --git a/Resources/Prototypes/Entities/Clothing/Belt/base_clothingbelt.yml b/Resources/Prototypes/Entities/Clothing/Belt/base_clothingbelt.yml index 2f904d3438c..703730daf38 100644 --- a/Resources/Prototypes/Entities/Clothing/Belt/base_clothingbelt.yml +++ b/Resources/Prototypes/Entities/Clothing/Belt/base_clothingbelt.yml @@ -9,12 +9,14 @@ size: Normal - type: Clothing slots: [belt] + equipSound: + path: /Audio/Items/belt_equip.ogg quickEquip: false - type: PhysicalComposition materialComposition: Cloth: 50 - type: StaticPrice - price: 25 + price: 20 - type: entity abstract: true diff --git a/Resources/Prototypes/Entities/Clothing/Eyes/glasses.yml b/Resources/Prototypes/Entities/Clothing/Eyes/glasses.yml index 7a43d96a241..45860c93c06 100644 --- a/Resources/Prototypes/Entities/Clothing/Eyes/glasses.yml +++ b/Resources/Prototypes/Entities/Clothing/Eyes/glasses.yml @@ -161,7 +161,7 @@ - WhitelistChameleon - type: entity - parent: ClothingEyesBase + parent: [ClothingEyesBase, ShowSecurityIcons] id: ClothingEyesGlassesSecurity name: security glasses description: Upgraded sunglasses that provide flash immunity and a security HUD. @@ -184,7 +184,6 @@ - type: GuideHelp guides: - Security - - type: ShowSecurityIcons - type: IdentityBlocker coverage: EYES diff --git a/Resources/Prototypes/Entities/Clothing/Eyes/hud.yml b/Resources/Prototypes/Entities/Clothing/Eyes/hud.yml index fabb7bc6429..c919f9173b4 100644 --- a/Resources/Prototypes/Entities/Clothing/Eyes/hud.yml +++ b/Resources/Prototypes/Entities/Clothing/Eyes/hud.yml @@ -1,3 +1,13 @@ +- type: entity + id: ShowSecurityIcons + abstract: true + noSpawn: true + components: + - type: ShowJobIcons + - type: ShowMindShieldIcons + - type: ShowCriminalRecordIcons + + - type: entity parent: ClothingEyesBase id: ClothingEyesHudDiagnostic @@ -17,7 +27,7 @@ parent: ClothingEyesBase id: ClothingEyesHudMedical name: medical hud - description: A heads-up display that scans the humanoids in view and provides accurate data about their health status. + description: A heads-up display that scans the humanoids in view and provides accurate data about their health status. components: - type: Sprite sprite: Clothing/Eyes/Hud/med.rsi @@ -34,7 +44,7 @@ - HudMedical - type: entity - parent: ClothingEyesBase + parent: [ClothingEyesBase, ShowSecurityIcons] id: ClothingEyesHudSecurity name: security hud description: A heads-up display that scans the humanoids in view and provides accurate data about their ID status and security records. @@ -43,7 +53,6 @@ sprite: Clothing/Eyes/Hud/sec.rsi - type: Clothing sprite: Clothing/Eyes/Hud/sec.rsi - - type: ShowSecurityIcons - type: Tag tags: - HudSecurity @@ -138,7 +147,7 @@ - type: ShowThirstIcons - type: entity - parent: ClothingEyesBase + parent: [ClothingEyesBase, ShowSecurityIcons] id: ClothingEyesHudMedSec name: medsec hud description: An eye display that looks like a mixture of medical and security huds. @@ -150,13 +159,12 @@ - type: Construction graph: HudMedSec node: medsecHud - - type: ShowSecurityIcons - type: ShowHealthBars damageContainers: - Biological - type: entity - parent: ClothingEyesBase + parent: [ClothingEyesBase, ShowSecurityIcons] id: ClothingEyesHudMultiversal name: multiversal hud description: Filler @@ -165,7 +173,6 @@ sprite: Clothing/Eyes/Hud/medsecengi.rsi - type: Clothing sprite: Clothing/Eyes/Hud/medsecengi.rsi - - type: ShowSecurityIcons - type: ShowHealthBars damageContainers: - Biological @@ -176,7 +183,7 @@ - type: ShowSyndicateIcons - type: entity - parent: ClothingEyesBase + parent: [ClothingEyesBase, ShowSecurityIcons] id: ClothingEyesHudOmni name: omni hud description: Filler @@ -185,7 +192,6 @@ sprite: Clothing/Eyes/Hud/omni.rsi - type: Clothing sprite: Clothing/Eyes/Hud/omni.rsi - - type: ShowSecurityIcons - type: ShowHealthBars damageContainers: - Biological @@ -198,7 +204,7 @@ - type: ShowSyndicateIcons - type: entity - parent: ClothingEyesBase + parent: [ClothingEyesBase, ShowSecurityIcons] id: ClothingEyesHudSyndicate name: syndicate visor description: The syndicate's professional head-up display, designed for better detection of humanoids and their subsequent elimination. @@ -208,14 +214,26 @@ - type: Clothing sprite: Clothing/Eyes/Hud/synd.rsi - type: ShowSyndicateIcons - - type: ShowSecurityIcons - type: entity - parent: ClothingEyesGlassesSunglasses + parent: [ClothingEyesBase, ShowSecurityIcons] + id: ClothingEyesHudSyndicateAgent + name: syndicate agent visor + description: The Syndicate Agent's professional heads-up display, designed for quick diagnosis of their team's status. + components: + - type: Sprite + sprite: Clothing/Eyes/Hud/syndagent.rsi + - type: Clothing + sprite: Clothing/Eyes/Hud/syndagent.rsi + - type: ShowSyndicateIcons + - type: ShowHealthBars + damageContainers: + - Biological + +- type: entity + parent: [ClothingEyesGlassesSunglasses, ShowSecurityIcons] id: ClothingEyesGlassesHiddenSecurity suffix: Syndicate - components: - - type: ShowSecurityIcons - type: entity parent: ClothingEyesHudMedical diff --git a/Resources/Prototypes/Entities/Clothing/Hands/base_clothinghands.yml b/Resources/Prototypes/Entities/Clothing/Hands/base_clothinghands.yml index 38472e3901d..02cf0ab6f67 100644 --- a/Resources/Prototypes/Entities/Clothing/Hands/base_clothinghands.yml +++ b/Resources/Prototypes/Entities/Clothing/Hands/base_clothinghands.yml @@ -34,3 +34,13 @@ spawned: - id: MaterialCloth1 amount: 1 + +# gloves that cover the fingertips and have synthetic fibers +- type: entity + abstract: true + parent: ClothingHandsButcherable + id: ClothingHandsGlovesSyntheticBase + components: + - type: Fiber + fiberMaterial: fibers-synthetic + - type: FingerprintMask diff --git a/Resources/Prototypes/Entities/Clothing/Hands/colored.yml b/Resources/Prototypes/Entities/Clothing/Hands/colored.yml index 4a78bd0a993..0fa298b648b 100644 --- a/Resources/Prototypes/Entities/Clothing/Hands/colored.yml +++ b/Resources/Prototypes/Entities/Clothing/Hands/colored.yml @@ -1,13 +1,8 @@ -# gloves that cover the fingertips and have synthetic fibers -- type: entity - abstract: true - parent: ClothingHandsButcherable - id: ClothingHandsGlovesSyntheticBase - components: - - type: Fiber - fiberMaterial: fibers-synthetic - - type: FingerprintMask +#DO NOT MAKE THESE THE SAME COLOR AS THE JUMPSUIT. It is going to cause contrast issues for those wearing the full set of color clothing and is almost definitely going to look worse. +#If you want to make it similar to the jumpsuit color, it should be slightly off. +#P.S: Most of these just use the shoe colors, so they end up having a nice "secondary" color when wearing the full set of color clothing. +# Purple Gloves - type: entity parent: ClothingHandsGlovesSyntheticBase id: ClothingHandsGlovesColorPurple @@ -15,12 +10,28 @@ description: Regular purple gloves that do not keep you from frying. components: - type: Sprite - sprite: Clothing/Hands/Gloves/Color/purple.rsi + sprite: Clothing/Hands/Gloves/Color/color.rsi + layers: + - state: icon + color: "#9C0DE1" + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#9C0DE1" + right: + - state: inhand-right + color: "#9C0DE1" - type: Clothing - sprite: Clothing/Hands/Gloves/Color/purple.rsi + sprite: Clothing/Hands/Gloves/Color/color.rsi + clothingVisuals: + gloves: + - state: equipped-HAND + color: "#9C0DE1" - type: Fiber fiberColor: fibers-purple +# Red Gloves - type: entity parent: ClothingHandsGlovesSyntheticBase id: ClothingHandsGlovesColorRed @@ -28,31 +39,28 @@ description: Regular red gloves that do not keep you from frying. components: - type: Sprite - sprite: Clothing/Hands/Gloves/Color/red.rsi + sprite: Clothing/Hands/Gloves/Color/color.rsi + layers: + - state: icon + color: "#940000" + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#940000" + right: + - state: inhand-right + color: "#940000" - type: Clothing - sprite: Clothing/Hands/Gloves/Color/red.rsi + sprite: Clothing/Hands/Gloves/Color/color.rsi + clothingVisuals: + gloves: + - state: equipped-HAND + color: "#940000" - type: Fiber fiberColor: fibers-red -- type: entity - parent: ClothingHandsGlovesSyntheticBase - id: ClothingHandsGlovesColorBlack - name: black gloves - description: Regular black gloves that do not keep you from frying. - components: - - type: Sprite - sprite: Clothing/Hands/Gloves/Color/black.rsi - - type: Clothing - sprite: Clothing/Hands/Gloves/Color/black.rsi - - type: GloveHeatResistance - heatResistance: 1400 - - type: Butcherable - butcheringType: Knife - spawned: - - id: ClothingHandsGlovesFingerless - - type: Fiber - fiberColor: fibers-black - +# Blue Gloves - type: entity parent: ClothingHandsGlovesSyntheticBase id: ClothingHandsGlovesColorBlue @@ -60,12 +68,28 @@ description: Regular blue gloves that do not keep you from frying. components: - type: Sprite - sprite: Clothing/Hands/Gloves/Color/blue.rsi + sprite: Clothing/Hands/Gloves/Color/color.rsi + layers: + - state: icon + color: "#0089EF" + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#0089EF" + right: + - state: inhand-right + color: "#0089EF" - type: Clothing - sprite: Clothing/Hands/Gloves/Color/blue.rsi + sprite: Clothing/Hands/Gloves/Color/color.rsi + clothingVisuals: + gloves: + - state: equipped-HAND + color: "#0089EF" - type: Fiber fiberColor: fibers-blue +# Brown Gloves - type: entity parent: ClothingHandsGlovesSyntheticBase id: ClothingHandsGlovesColorBrown @@ -73,12 +97,28 @@ description: Regular brown gloves that do not keep you from frying. components: - type: Sprite - sprite: Clothing/Hands/Gloves/Color/brown.rsi + sprite: Clothing/Hands/Gloves/Color/color.rsi + layers: + - state: icon + color: "#723A02" + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#723A02" + right: + - state: inhand-right + color: "#723A02" - type: Clothing - sprite: Clothing/Hands/Gloves/Color/brown.rsi + sprite: Clothing/Hands/Gloves/Color/color.rsi + clothingVisuals: + gloves: + - state: equipped-HAND + color: "#723A02" - type: Fiber fiberColor: fibers-brown +# Grey Gloves - type: entity parent: ClothingHandsGlovesSyntheticBase id: ClothingHandsGlovesColorGray @@ -86,12 +126,28 @@ description: Regular grey gloves that do not keep you from frying. components: - type: Sprite - sprite: Clothing/Hands/Gloves/Color/gray.rsi + sprite: Clothing/Hands/Gloves/Color/color.rsi + layers: + - state: icon + color: "#999999" + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#999999" + right: + - state: inhand-right + color: "#999999" - type: Clothing - sprite: Clothing/Hands/Gloves/Color/gray.rsi + sprite: Clothing/Hands/Gloves/Color/color.rsi + clothingVisuals: + gloves: + - state: equipped-HAND + color: "#999999" - type: Fiber fiberColor: fibers-grey +# Green Gloves - type: entity parent: ClothingHandsGlovesSyntheticBase id: ClothingHandsGlovesColorGreen @@ -99,12 +155,28 @@ description: Regular green gloves that do not keep you from frying. components: - type: Sprite - sprite: Clothing/Hands/Gloves/Color/green.rsi + sprite: Clothing/Hands/Gloves/Color/color.rsi + layers: + - state: icon + color: "#5ABF2F" + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#5ABF2F" + right: + - state: inhand-right + color: "#5ABF2F" - type: Clothing - sprite: Clothing/Hands/Gloves/Color/green.rsi + sprite: Clothing/Hands/Gloves/Color/color.rsi + clothingVisuals: + gloves: + - state: equipped-HAND + color: "#5ABF2F" - type: Fiber fiberColor: fibers-green +# Light Brown Gloves - type: entity parent: ClothingHandsGlovesSyntheticBase id: ClothingHandsGlovesColorLightBrown @@ -112,12 +184,28 @@ description: Regular light brown gloves that do not keep you from frying. components: - type: Sprite - sprite: Clothing/Hands/Gloves/Color/lightbrown.rsi + sprite: Clothing/Hands/Gloves/Color/color.rsi + layers: + - state: icon + color: "#C09F72" + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#C09F72" + right: + - state: inhand-right + color: "#C09F72" - type: Clothing - sprite: Clothing/Hands/Gloves/Color/lightbrown.rsi + sprite: Clothing/Hands/Gloves/Color/color.rsi + clothingVisuals: + gloves: + - state: equipped-HAND + color: "#C09F72" - type: Fiber fiberColor: fibers-brown +# Orange Gloves - type: entity parent: ClothingHandsGlovesSyntheticBase id: ClothingHandsGlovesColorOrange @@ -125,25 +213,87 @@ description: Regular orange gloves that do not keep you from frying. components: - type: Sprite - sprite: Clothing/Hands/Gloves/Color/orange.rsi + sprite: Clothing/Hands/Gloves/Color/color.rsi + layers: + - state: icon + color: "#EF8100" + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#EF8100" + right: + - state: inhand-right + color: "#EF8100" - type: Clothing - sprite: Clothing/Hands/Gloves/Color/orange.rsi + sprite: Clothing/Hands/Gloves/Color/color.rsi + clothingVisuals: + gloves: + - state: equipped-HAND + color: "#EF8100" - type: Fiber fiberColor: fibers-orange +# White Gloves - type: entity parent: ClothingHandsGlovesSyntheticBase id: ClothingHandsGlovesColorWhite name: white gloves - description: Those gloves look fancy. + description: Regular white gloves that do not keep you from frying. components: - type: Sprite - sprite: Clothing/Hands/Gloves/Color/white.rsi + sprite: Clothing/Hands/Gloves/Color/color.rsi + layers: + - state: icon + color: "#EAE8E8" + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#EAE8E8" + right: + - state: inhand-right + color: "#EAE8E8" - type: Clothing - sprite: Clothing/Hands/Gloves/Color/white.rsi + sprite: Clothing/Hands/Gloves/Color/color.rsi + clothingVisuals: + gloves: + - state: equipped-HAND + color: "#EAE8E8" - type: Fiber fiberColor: fibers-white +# Black Gloves +# TECHNICALLY, if you ported the worn state to the RSI, this could be greyscaled, but I do not really feel like doing that. +- type: entity + parent: ClothingHandsGlovesSyntheticBase + id: ClothingHandsGlovesColorBlack + name: black gloves + description: Regular black gloves that do not keep you from frying. + components: + - type: Sprite + sprite: Clothing/Hands/Gloves/Color/black.rsi + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#535353" + right: + - state: inhand-right + color: "#535353" + - type: Clothing + sprite: Clothing/Hands/Gloves/Color/black.rsi + - type: GloveHeatResistance + heatResistance: 1400 + - type: Butcherable + butcheringType: Knife + spawned: + - id: ClothingHandsGlovesFingerless + - type: Fiber + fiberColor: fibers-black + +# Insulated Gloves (Yellow Gloves) +# Currently can not be greyscaled without looking like shit. - type: entity parent: ClothingHandsBase id: ClothingHandsGlovesColorYellow @@ -166,6 +316,7 @@ fiberMaterial: fibers-insulative fiberColor: fibers-yellow +# Budget Insulated Gloves - type: entity parent: ClothingHandsGlovesColorYellow id: ClothingHandsGlovesColorYellowBudget @@ -192,6 +343,7 @@ - 3.5 - 4 +# Conductive Insulated Gloves - type: entity parent: ClothingHandsGlovesColorYellow id: ClothingHandsGlovesConducting diff --git a/Resources/Prototypes/Entities/Clothing/Hands/gloves.yml b/Resources/Prototypes/Entities/Clothing/Hands/gloves.yml index bf08db78f71..96bdd61f94e 100644 --- a/Resources/Prototypes/Entities/Clothing/Hands/gloves.yml +++ b/Resources/Prototypes/Entities/Clothing/Hands/gloves.yml @@ -20,6 +20,7 @@ soundHit: collection: BoxingHit animation: WeaponArcFist + mustBeEquippedToUse: true - type: Fiber fiberMaterial: fibers-leather fiberColor: fibers-red @@ -90,6 +91,7 @@ types: Blunt: 8 bluntStaminaDamageFactor: 0.0 # so blunt doesn't deal stamina damage at all + mustBeEquippedToUse: true - type: entity parent: ClothingHandsBase @@ -362,6 +364,7 @@ soundHit: collection: Punch animation: WeaponArcFist + mustBeEquippedToUse: true - type: Fiber fiberMaterial: fibers-leather fiberColor: fibers-blue diff --git a/Resources/Prototypes/Entities/Clothing/Head/base_clothinghead.yml b/Resources/Prototypes/Entities/Clothing/Head/base_clothinghead.yml index d13b284ff29..e1e5ddc11fa 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/base_clothinghead.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/base_clothinghead.yml @@ -133,11 +133,13 @@ unequipSound: /Audio/Mecha/mechmove03.ogg - type: Tag tags: - - HidesHair - WhitelistChameleon - HelmetEVA - - HidesNose - type: IdentityBlocker + - type: HideLayerClothing + slots: + - Hair + - Snout - type: entity abstract: true @@ -173,10 +175,12 @@ - type: IngestionBlocker - type: Tag tags: - - HidesHair - WhitelistChameleon - - HidesNose - type: IdentityBlocker + - type: HideLayerClothing + slots: + - Hair + - Snout - type: entity abstract: true @@ -248,6 +252,6 @@ - type: TemperatureProtection coefficient: 0.7 - type: GroupExamine - - type: Tag - tags: - - HidesHair + - type: HideLayerClothing + slots: + - Hair diff --git a/Resources/Prototypes/Entities/Clothing/Head/hardsuit-helmets.yml b/Resources/Prototypes/Entities/Clothing/Head/hardsuit-helmets.yml index 5dfbb9ba0ac..ca581ee20ac 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/hardsuit-helmets.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/hardsuit-helmets.yml @@ -17,9 +17,9 @@ sprite: Clothing/Head/Hardsuits/basic.rsi - type: Clothing sprite: Clothing/Head/Hardsuits/basic.rsi - - type: Tag - tags: - - HidesNose + - type: HideLayerClothing + slots: + - Snout #Atmospherics Hardsuit - type: entity diff --git a/Resources/Prototypes/Entities/Clothing/Head/hats.yml b/Resources/Prototypes/Entities/Clothing/Head/hats.yml index 30907f70b5b..2417ef4c9dd 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/hats.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/hats.yml @@ -384,9 +384,12 @@ sprite: Clothing/Head/Hats/plaguedoctor.rsi - type: Tag tags: - - HidesHair - WhitelistChameleon - ClothMade + - type: HideLayerClothing + slots: + - Hair + - Snout - type: entity parent: ClothingHeadBase @@ -549,9 +552,11 @@ sprite: Clothing/Head/Hats/witch.rsi - type: Tag tags: - - HidesHair - WhitelistChameleon - ClothMade + - type: HideLayerClothing + slots: + - Hair - type: entity parent: ClothingHeadBase diff --git a/Resources/Prototypes/Entities/Clothing/Head/helmets.yml b/Resources/Prototypes/Entities/Clothing/Head/helmets.yml index 83d15eb2427..3bf8b527f16 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/helmets.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/helmets.yml @@ -110,10 +110,14 @@ Blunt: 0.95 Slash: 0.95 Piercing: 0.95 + - type: HideLayerClothing + slots: + - Hair + - Snout #Janitorial Bombsuit Helmet - type: entity - parent: ClothingHeadBase + parent: ClothingHeadHelmetBombSuit id: ClothingHeadHelmetJanitorBombSuit name: janitorial bombsuit helmet description: A heavy helmet designed to withstand explosions formed from reactions between chemicals. @@ -123,9 +127,6 @@ sprite: Clothing/Head/Helmets/janitor_bombsuit.rsi - type: Clothing sprite: Clothing/Head/Helmets/janitor_bombsuit.rsi - - type: IngestionBlocker - - type: ExplosionResistance - damageCoefficient: 0.9 #Cult Helmet - type: entity @@ -160,10 +161,13 @@ sprite: Clothing/Head/Helmets/spaceninja.rsi - type: Tag tags: - - HidesHair - WhitelistChameleon - type: IngestionBlocker - type: IdentityBlocker + - type: HideLayerClothing + slots: + - Hair + - Snout #Templar Helmet - type: entity @@ -223,8 +227,11 @@ - type: IdentityBlocker - type: Tag tags: - - HidesHair - WhitelistChameleon + - type: HideLayerClothing + slots: + - Hair + - Snout #Atmos Fire Helmet - type: entity @@ -247,8 +254,11 @@ - type: IdentityBlocker - type: Tag tags: - - HidesHair - WhitelistChameleon + - type: HideLayerClothing + slots: + - Hair + - Snout #Chitinous Helmet - type: entity diff --git a/Resources/Prototypes/Entities/Clothing/Head/hoods.yml b/Resources/Prototypes/Entities/Clothing/Head/hoods.yml index 9ab528581af..0bca209d51e 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/hoods.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/hoods.yml @@ -13,8 +13,11 @@ - type: IngestionBlocker - type: Tag tags: - - HidesHair - WhitelistChameleon + - type: HideLayerClothing + slots: + - Hair + - Snout - type: entity parent: ClothingHeadHatHoodBioGeneral @@ -94,9 +97,11 @@ sprite: Clothing/Head/Hoods/chaplain.rsi - type: Tag tags: - - HidesHair - HamsterWearable - WhitelistChameleon + - type: HideLayerClothing + slots: + - Hair - type: entity parent: ClothingHeadBase @@ -110,8 +115,10 @@ sprite: Clothing/Head/Hoods/cult.rsi - type: Tag tags: - - HidesHair - WhitelistChameleon + - type: HideLayerClothing + slots: + - Hair - type: entity parent: ClothingHeadBase @@ -125,9 +132,11 @@ sprite: Clothing/Head/Hoods/nun.rsi - type: Tag tags: - - HidesHair - HamsterWearable - WhitelistChameleon + - type: HideLayerClothing + slots: + - Hair - type: entity parent: ClothingHeadBase @@ -145,9 +154,10 @@ Heat: 0.95 Radiation: 0.65 - type: BreathMask - - type: Tag - tags: - - HidesHair + - type: HideLayerClothing + slots: + - Hair + - Snout - type: entity parent: ClothingHeadBase @@ -161,8 +171,10 @@ sprite: Clothing/Head/Hoods/goliathcloak.rsi - type: Tag tags: - - HidesHair - WhitelistChameleon + - type: HideLayerClothing + slots: + - Hair - type: entity parent: ClothingHeadBase @@ -175,9 +187,9 @@ sprite: Clothing/Head/Hoods/iansuit.rsi - type: Clothing sprite: Clothing/Head/Hoods/iansuit.rsi - - type: Tag - tags: - - HidesHair + - type: HideLayerClothing + slots: + - Hair - type: entity parent: ClothingHeadBase @@ -190,9 +202,9 @@ sprite: Clothing/Head/Hoods/carpsuit.rsi - type: Clothing sprite: Clothing/Head/Hoods/carpsuit.rsi - - type: Tag - tags: - - HidesHair + - type: HideLayerClothing + slots: + - Hair - type: entity parent: ClothingHeadBase @@ -207,8 +219,11 @@ - type: IdentityBlocker - type: Tag tags: - - HidesHair - WhitelistChameleon + - type: HideLayerClothing + slots: + - Hair + - Snout #Winter Coat Hoods - type: entity diff --git a/Resources/Prototypes/Entities/Clothing/Head/welding.yml b/Resources/Prototypes/Entities/Clothing/Head/welding.yml index 93d9b1e084f..cd5c63d7ec7 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/welding.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/welding.yml @@ -19,6 +19,9 @@ - type: Tag tags: - WhitelistChameleon + - type: HideLayerClothing + slots: + - Snout - type: entity parent: WeldingMaskBase diff --git a/Resources/Prototypes/Entities/Clothing/Masks/bandanas.yml b/Resources/Prototypes/Entities/Clothing/Masks/bandanas.yml index 246b47b8003..f5ad2fb6c83 100644 --- a/Resources/Prototypes/Entities/Clothing/Masks/bandanas.yml +++ b/Resources/Prototypes/Entities/Clothing/Masks/bandanas.yml @@ -25,7 +25,10 @@ - type: Tag tags: - Bandana - - HidesNose + - type: HideLayerClothing + slots: + - Snout + hideOnToggle: true - type: entity parent: ClothingMaskBandanaBase diff --git a/Resources/Prototypes/Entities/Clothing/Masks/specific.yml b/Resources/Prototypes/Entities/Clothing/Masks/specific.yml index 1e85073da9b..0a0fc68469a 100644 --- a/Resources/Prototypes/Entities/Clothing/Masks/specific.yml +++ b/Resources/Prototypes/Entities/Clothing/Masks/specific.yml @@ -6,8 +6,7 @@ suffix: Chameleon components: - type: Tag - tags: # ignore "WhitelistChameleon" tag - - HidesNose + tags: [] # ignore "WhitelistChameleon" tag - type: Sprite sprite: Clothing/Mask/gas.rsi - type: Clothing @@ -21,6 +20,9 @@ interfaces: - key: enum.ChameleonUiKey.Key type: ChameleonBoundUserInterface + - type: HideLayerClothing + slots: + - Snout - type: entity parent: ClothingMaskGasChameleon @@ -28,4 +30,6 @@ suffix: Voice Mask, Chameleon components: - type: VoiceMasker - default: ClothingMaskGas + - type: HideLayerClothing + slots: + - Snout diff --git a/Resources/Prototypes/Entities/Clothing/Neck/pins.yml b/Resources/Prototypes/Entities/Clothing/Neck/pins.yml index 0d22a653dbf..0054a3645c7 100644 --- a/Resources/Prototypes/Entities/Clothing/Neck/pins.yml +++ b/Resources/Prototypes/Entities/Clothing/Neck/pins.yml @@ -151,3 +151,35 @@ clothingVisuals: neck: - state: trans-equipped + +- type: entity + parent: ClothingNeckPinBase + id: ClothingNeckAutismPin + name: autism pin + description: be autism do crime + components: + - type: Sprite + sprite: Clothing/Neck/Misc/autismpin.rsi + layers: + - state: autism + - type: Clothing + sprite: Clothing/Neck/Misc/autismpin.rsi + clothingVisuals: + neck: + - state: autism-equipped + +- type: entity + parent: ClothingNeckPinBase + id: ClothingNeckGoldAutismPin + name: golden autism pin + description: be autism do warcrime + components: + - type: Sprite + sprite: Clothing/Neck/Misc/goldautismpin.rsi + layers: + - state: goldautism + - type: Clothing + sprite: Clothing/Neck/Misc/goldautismpin.rsi + clothingVisuals: + neck: + - state: goldautism-equipped diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml index 65f7c4f1134..6dccd594025 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml @@ -41,7 +41,7 @@ - key: enum.StorageUiKey.Key type: StorageBoundUserInterface - type: StaticPrice - price: 80 + price: 70 - type: entity abstract: true diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/coats.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/coats.yml index bb918dacca0..473abe4be06 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/coats.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/coats.yml @@ -43,7 +43,36 @@ sprite: Clothing/OuterClothing/Coats/gentlecoat.rsi - type: entity - parent: ClothingOuterStorageBase + abstract: true + id: ClothingOuterArmorHoS + components: + - type: Armor + modifiers: + coefficients: + Blunt: 0.7 + Slash: 0.7 + Piercing: 0.7 + Heat: 0.7 + Caustic: 0.75 # not the full 90% from ss13 because of the head + - type: ExplosionResistance + damageCoefficient: 0.9 + +- type: entity + abstract: true + id: ClothingOuterArmorWarden + components: + - type: Armor + modifiers: + coefficients: + Blunt: 0.7 + Slash: 0.7 + Piercing: 0.7 + Heat: 0.7 + - type: ExplosionResistance + damageCoefficient: 0.9 + +- type: entity + parent: [ClothingOuterArmorHoS, ClothingOuterStorageBase] id: ClothingOuterCoatHoSTrench name: head of security's armored trenchcoat description: A greatcoat enhanced with a special alloy for some extra protection and style for those with a commanding presence. @@ -51,17 +80,7 @@ - type: Sprite sprite: DeltaV/Clothing/OuterClothing/Coats/hos_trenchcoat.rsi # DeltaV - resprite - type: Clothing - sprite: DeltaV/Clothing/OuterClothing/Coats/hos_trenchcoat.rsi # DeltaV - resprite - - type: Armor - modifiers: - coefficients: - Blunt: 0.70 - Slash: 0.70 - Piercing: 0.70 - Heat: 0.70 - Caustic: 0.75 #not the full 90% from ss13 because of the head - - type: ExplosionResistance - damageCoefficient: 0.90 + sprite: DeltaV/Clothing/OuterClothing/Coats/hos_trenchcoat.rsi - type: entity parent: ClothingOuterStorageBase @@ -286,7 +305,7 @@ sprite: Clothing/OuterClothing/Coats/pirate.rsi - type: entity - parent: ClothingOuterStorageBase + parent: [ClothingOuterArmorWarden, ClothingOuterStorageBase] id: ClothingOuterCoatWarden name: warden's armored jacket description: A sturdy, utilitarian jacket designed to protect a warden from any brig-bound threats. @@ -295,15 +314,6 @@ sprite: Clothing/OuterClothing/Coats/warden.rsi - type: Clothing sprite: Clothing/OuterClothing/Coats/warden.rsi - - type: Armor - modifiers: - coefficients: - Blunt: 0.70 - Slash: 0.70 - Piercing: 0.70 - Heat: 0.70 - - type: ExplosionResistance - damageCoefficient: 0.90 - type: entity parent: ClothingOuterStorageBase diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml index 94ac09999c4..b0e22d3b46f 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml @@ -373,7 +373,7 @@ parent: ClothingOuterHardsuitBase id: ClothingOuterHardsuitRd name: experimental research hardsuit - description: A special suit that protects against hazardous, low pressure environments. Has an additional layer of armor. Able to be compressed to small sizes. + description: A special suit that protects against hazardous, low pressure environments. Has an additional layer of armor. components: - type: Sprite sprite: Clothing/OuterClothing/Hardsuits/rd.rsi @@ -398,7 +398,9 @@ sprintModifier: 0.75 - type: HeldSpeedModifier - type: Item - size: Normal + size: Huge + shape: + - 0,0,4,4 #5X5, can fit in a duffel bag but nothing smaller. - type: Tag tags: - WhitelistChameleon diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/suits.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/suits.yml index 96a97be87ec..5e82959c4e2 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/suits.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/suits.yml @@ -8,6 +8,9 @@ sprite: Clothing/OuterClothing/Suits/bombsuit.rsi - type: Clothing sprite: Clothing/OuterClothing/Suits/bombsuit.rsi + - type: ClothingSpeedModifier + walkModifier: 0.8 + sprintModifier: 0.8 - type: Armor modifiers: coefficients: @@ -24,7 +27,7 @@ - WhitelistChameleon - type: entity - parent: ClothingOuterBaseLarge + parent: ClothingOuterSuitBomb id: ClothingOuterSuitJanitorBomb name: janitorial bomb suit description: A heavy helmet designed to withstand explosions formed from reactions between chemicals. @@ -34,16 +37,6 @@ sprite: Clothing/OuterClothing/Suits/janitor_bombsuit.rsi - type: Clothing sprite: Clothing/OuterClothing/Suits/janitor_bombsuit.rsi - - type: ClothingSpeedModifier - walkModifier: 0.8 - sprintModifier: 0.8 - - type: ExplosionResistance - damageCoefficient: 0.15 - - type: GroupExamine - - type: Tag - tags: - - Hardsuit - - WhitelistChameleon - type: entity parent: ClothingOuterBaseLarge diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/wintercoats.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/wintercoats.yml index f8b54ad8350..cd502a8f781 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/wintercoats.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/wintercoats.yml @@ -32,7 +32,7 @@ - ClothMade - WhitelistChameleon - type: StaticPrice - price: 70 + price: 50 - type: entity parent: ClothingOuterWinterCoat @@ -231,9 +231,23 @@ clothingPrototype: ClothingHeadHatHoodWinterHOP - type: entity - parent: ClothingOuterWinterCoatToggleable + parent: [ClothingOuterArmorHoS, ClothingOuterWinterCoatToggleable] id: ClothingOuterWinterHoS + name: head of security's armored winter coat + description: A sturdy, utilitarian winter coat designed to protect a head of security from any brig-bound threats and hypothermic events. + components: + - type: Sprite + sprite: Clothing/OuterClothing/WinterCoats/coathosarmored.rsi + - type: Clothing + sprite: Clothing/OuterClothing/WinterCoats/coathosarmored.rsi + - type: ToggleableClothing + clothingPrototype: ClothingHeadHatHoodWinterHOS + +- type: entity + parent: ClothingOuterWinterCoatToggleable + id: ClothingOuterWinterHoSUnarmored name: head of security's winter coat + description: A sturdy coat, a warm coat, but not an armored coat. components: - type: Sprite sprite: Clothing/OuterClothing/WinterCoats/coathos.rsi @@ -445,22 +459,28 @@ clothingPrototype: ClothingHeadHatHoodWinterSci - type: entity - parent: ClothingOuterWinterCoatToggleable + parent: [ClothingOuterArmorWarden, ClothingOuterWinterCoatToggleable] id: ClothingOuterWinterWarden name: warden's armored winter coat description: A sturdy, utilitarian winter coat designed to protect a warden from any brig-bound threats and hypothermic events. components: + - type: Sprite + sprite: Clothing/OuterClothing/WinterCoats/coatwardenarmored.rsi + - type: Clothing + sprite: Clothing/OuterClothing/WinterCoats/coatwardenarmored.rsi + - type: ToggleableClothing + clothingPrototype: ClothingHeadHatHoodWinterWarden + +- type: entity + parent: ClothingOuterWinterCoatToggleable + id: ClothingOuterWinterWardenUnarmored + name: warden's winter coat + description: A sturdy coat, a warm coat, but not an armored coat. + components: - type: Sprite sprite: Clothing/OuterClothing/WinterCoats/coatwarden.rsi - type: Clothing sprite: Clothing/OuterClothing/WinterCoats/coatwarden.rsi - - type: Armor - modifiers: - coefficients: - Blunt: 0.70 - Slash: 0.70 - Piercing: 0.8 #slightly less bulletproof then warden's normal coat - Heat: 0.70 - type: ToggleableClothing clothingPrototype: ClothingHeadHatHoodWinterWarden diff --git a/Resources/Prototypes/Entities/Clothing/Shoes/color.yml b/Resources/Prototypes/Entities/Clothing/Shoes/color.yml index 0bfe153b59d..16608aacc99 100644 --- a/Resources/Prototypes/Entities/Clothing/Shoes/color.yml +++ b/Resources/Prototypes/Entities/Clothing/Shoes/color.yml @@ -1,3 +1,6 @@ +# DO NOT ARBITRARILY CHANGE THESE TO MAKE THEM "CONSISTENT" WITH THE COLOR JUMPSUITS. You are probably just going to make them look worse. + +# Black Shoes - type: entity parent: ClothingShoesBaseButcherable id: ClothingShoesColorBlack @@ -5,10 +8,59 @@ description: Stylish black shoes. components: - type: Sprite - sprite: Clothing/Shoes/Color/black.rsi + sprite: Clothing/Shoes/color.rsi + layers: + - state: icon + color: "#3f3f3f" #Different from the worn state for contrast reasons. + - state: soles-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#3f3f3f" + - state: soles-inhand-left + right: + - state: inhand-right + color: "#3f3f3f" + - state: soles-inhand-right + - type: Clothing + sprite: Clothing/Shoes/color.rsi + clothingVisuals: + shoes: + - state: equipped-FEET + color: "#1d1d1d" + - state: soles-equipped-FEET + +# White Shoes +- type: entity + parent: ClothingShoesBaseButcherable + id: ClothingShoesColorWhite + name: white shoes + description: Don't take them off at your office Christmas party. + components: + - type: Sprite + sprite: Clothing/Shoes/color.rsi + layers: + - state: icon + color: "#EAE8E8" #Deliberately NOT pure white + - state: soles-icon + - type: Item + inhandVisuals: #We don't want the sole icons. Since this is white, it's just going to look weird (white on white doesn't really contrast.) + left: + - state: inhand-left + color: "#EAE8E8" + right: + - state: inhand-right + color: "#EAE8E8" - type: Clothing - sprite: Clothing/Shoes/Color/black.rsi + sprite: Clothing/Shoes/color.rsi + clothingVisuals: + shoes: + - state: equipped-FEET + color: "#EAE8E8" + - state: contrastedsoles-equipped-FEET +# Blue Shoes - type: entity parent: ClothingShoesBaseButcherable id: ClothingShoesColorBlue @@ -16,10 +68,30 @@ description: Stylish blue shoes. components: - type: Sprite - sprite: Clothing/Shoes/Color/blue.rsi + sprite: Clothing/Shoes/color.rsi + layers: + - state: icon + color: "#0089EF" + - state: soles-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#0089EF" + - state: soles-inhand-left + right: + - state: inhand-right + color: "#0089EF" + - state: soles-inhand-right - type: Clothing - sprite: Clothing/Shoes/Color/blue.rsi + sprite: Clothing/Shoes/color.rsi + clothingVisuals: + shoes: + - state: equipped-FEET + color: "#0089EF" + - state: soles-equipped-FEET +# Brown Shoes - type: entity parent: ClothingShoesBaseButcherable id: ClothingShoesColorBrown @@ -27,10 +99,30 @@ description: A pair of brown shoes. components: - type: Sprite - sprite: Clothing/Shoes/Color/brown.rsi + sprite: Clothing/Shoes/color.rsi + layers: + - state: icon + color: "#723A02" + - state: soles-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#723A02" + - state: soles-inhand-left + right: + - state: inhand-right + color: "#723A02" + - state: soles-inhand-right - type: Clothing - sprite: Clothing/Shoes/Color/brown.rsi + sprite: Clothing/Shoes/color.rsi + clothingVisuals: + shoes: + - state: equipped-FEET + color: "#592D01" + - state: soles-equipped-FEET +# Green Shoes - type: entity parent: ClothingShoesBaseButcherable id: ClothingShoesColorGreen @@ -38,10 +130,30 @@ description: Stylish green shoes. components: - type: Sprite - sprite: Clothing/Shoes/Color/green.rsi + sprite: Clothing/Shoes/color.rsi + layers: + - state: icon + color: "#5ABF2F" + - state: soles-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#5ABF2F" + - state: soles-inhand-left + right: + - state: inhand-right + color: "#5ABF2F" + - state: soles-inhand-right - type: Clothing - sprite: Clothing/Shoes/Color/green.rsi + sprite: Clothing/Shoes/color.rsi + clothingVisuals: + shoes: + - state: equipped-FEET + color: "#5ABF2F" + - state: soles-equipped-FEET +# Orange Shoes - type: entity parent: ClothingShoesBaseButcherable id: ClothingShoesColorOrange @@ -49,21 +161,30 @@ description: Stylish orange shoes. components: - type: Sprite - sprite: Clothing/Shoes/Color/orange.rsi + sprite: Clothing/Shoes/color.rsi + layers: + - state: icon + color: "#EF8100" + - state: soles-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#EF8100" + - state: soles-inhand-left + right: + - state: inhand-right + color: "#EF8100" + - state: soles-inhand-right - type: Clothing - sprite: Clothing/Shoes/Color/orange.rsi - -- type: entity - parent: ClothingShoesBaseButcherable - id: ClothingShoesColorPurple - name: purple shoes - description: Stylish purple shoes. - components: - - type: Sprite - sprite: Clothing/Shoes/Color/purple.rsi - - type: Clothing - sprite: Clothing/Shoes/Color/purple.rsi + sprite: Clothing/Shoes/color.rsi + clothingVisuals: + shoes: + - state: equipped-FEET + color: "#EF8100" + - state: soles-equipped-FEET +# Red Shoes - type: entity parent: ClothingShoesBaseButcherable id: ClothingShoesColorRed @@ -71,28 +192,87 @@ description: Stylish red shoes. components: - type: Sprite - sprite: Clothing/Shoes/Color/red.rsi + sprite: Clothing/Shoes/color.rsi + layers: + - state: icon + color: "#940000" + - state: soles-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#940000" + - state: soles-inhand-left + right: + - state: inhand-right + color: "#940000" + - state: soles-inhand-right - type: Clothing - sprite: Clothing/Shoes/Color/red.rsi + sprite: Clothing/Shoes/color.rsi + clothingVisuals: + shoes: + - state: equipped-FEET + color: "#940000" + - state: soles-equipped-FEET +# Yellow Shoes - type: entity parent: ClothingShoesBaseButcherable - id: ClothingShoesColorWhite - name: white shoes - description: Don't take them off at your office Christmas party. + id: ClothingShoesColorYellow + name: yellow shoes + description: Stylish yellow shoes. components: - type: Sprite - sprite: Clothing/Shoes/Color/white.rsi + sprite: Clothing/Shoes/color.rsi + layers: + - state: icon + color: "#EBE216" + - state: soles-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#EBE216" + - state: soles-inhand-left + right: + - state: inhand-right + color: "#EBE216" + - state: soles-inhand-right - type: Clothing - sprite: Clothing/Shoes/Color/white.rsi + sprite: Clothing/Shoes/color.rsi + clothingVisuals: + shoes: + - state: equipped-FEET + color: "#EBE216" + - state: soles-equipped-FEET +# Purple Shoes - type: entity parent: ClothingShoesBaseButcherable - id: ClothingShoesColorYellow - name: yellow shoes - description: Stylish yellow shoes. + id: ClothingShoesColorPurple + name: purple shoes + description: Stylish purple shoes. components: - type: Sprite - sprite: Clothing/Shoes/Color/yellow.rsi + sprite: Clothing/Shoes/color.rsi + layers: + - state: icon + color: "#9C0DE1" + - state: soles-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#9C0DE1" + - state: soles-inhand-left + right: + - state: inhand-right + color: "#9C0DE1" + - state: soles-inhand-right - type: Clothing - sprite: Clothing/Shoes/Color/yellow.rsi + sprite: Clothing/Shoes/color.rsi + clothingVisuals: + shoes: + - state: equipped-FEET + color: "#9C0DE1" + - state: soles-equipped-FEET \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Clothing/Shoes/specific.yml b/Resources/Prototypes/Entities/Clothing/Shoes/specific.yml index fac03b30da9..22885784bb1 100644 --- a/Resources/Prototypes/Entities/Clothing/Shoes/specific.yml +++ b/Resources/Prototypes/Entities/Clothing/Shoes/specific.yml @@ -15,6 +15,7 @@ parent: [ClothingShoesBaseButcherable, ClothingSlotBase] id: ClothingShoesClownBase components: + - type: WaddleWhenWorn - type: ItemSlots slots: item: @@ -158,9 +159,28 @@ - type: Tag tags: [] # ignore "WhitelistChameleon" tag - type: Sprite - sprite: Clothing/Shoes/Color/black.rsi + sprite: Clothing/Shoes/color.rsi + layers: + - state: icon + color: "#3f3f3f" + - state: soles-icon - type: Clothing - sprite: Clothing/Shoes/Color/black.rsi + sprite: Clothing/Shoes/color.rsi + clothingVisuals: + shoes: + - state: equipped-FEET + color: "#1d1d1d" + - state: soles-equipped-FEET + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#3f3f3f" + - state: soles-inhand-left + right: + - state: inhand-right + color: "#3f3f3f" + - state: soles-inhand-right - type: ChameleonClothing slot: [FEET] default: ClothingShoesColorBlack diff --git a/Resources/Prototypes/Entities/Clothing/Uniforms/color_jumpskirts.yml b/Resources/Prototypes/Entities/Clothing/Uniforms/color_jumpskirts.yml new file mode 100644 index 00000000000..1f77059841b --- /dev/null +++ b/Resources/Prototypes/Entities/Clothing/Uniforms/color_jumpskirts.yml @@ -0,0 +1,491 @@ +# White Jumpskirt +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpskirtColorWhite + name: white jumpskirt + description: A generic white jumpskirt with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpskirt/color.rsi + layers: + - state: icon + - state: trinkets-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + - state: trinkets-inhand-left + right: + - state: inhand-right + - state: trinkets-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpskirt/color.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + - state: trinkets-equipped-INNERCLOTHING + +# Grey Jumpskirt +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpskirtColorGrey + name: grey jumpskirt + description: A tasteful grey jumpskirt that reminds you of the good old days. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpskirt/color.rsi + layers: + - state: icon + color: "#b3b3b3" + - state: trinkets-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#b3b3b3" + - state: trinkets-inhand-left + right: + - state: inhand-right + color: "#b3b3b3" + - state: trinkets-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpskirt/color.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#b3b3b3" + - state: trinkets-equipped-INNERCLOTHING + +# Black Jumpskirt +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpskirtColorBlack + name: black jumpskirt + description: A generic black jumpskirt with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpskirt/color.rsi + layers: + - state: icon + color: "#3f3f3f" + - state: trinkets-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#3f3f3f" + - state: trinkets-inhand-left + right: + - state: inhand-right + color: "#3f3f3f" + - state: trinkets-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpskirt/color.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#3f3f3f" + - state: trinkets-equipped-INNERCLOTHING + +# Blue Jumpskirt +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpskirtColorBlue + name: blue jumpskirt + description: A generic blue jumpskirt with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpskirt/color.rsi + layers: + - state: icon + color: "#52aecc" + - state: trinkets-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#52aecc" + - state: trinkets-inhand-left + right: + - state: inhand-right + color: "#52aecc" + - state: trinkets-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpskirt/color.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#52aecc" + - state: trinkets-equipped-INNERCLOTHING + +# Dark Blue Jumpskirt +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpskirtColorDarkBlue + name: dark blue jumpskirt + description: A generic dark blue jumpskirt with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpskirt/color.rsi + layers: + - state: icon + color: "#3285ba" + - state: trinkets-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#3285ba" + - state: trinkets-inhand-left + right: + - state: inhand-right + color: "#3285ba" + - state: trinkets-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpskirt/color.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#3285ba" + - state: trinkets-equipped-INNERCLOTHING + +# Teal Jumpskirt +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpskirtColorTeal + name: teal jumpskirt + description: A generic teal jumpskirt with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpskirt/color.rsi + layers: + - state: icon + color: "#77f3b7" + - state: trinkets-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#77f3b7" + - state: trinkets-inhand-left + right: + - state: inhand-right + color: "#77f3b7" + - state: trinkets-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpskirt/color.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#77f3b7" + - state: trinkets-equipped-INNERCLOTHING + +# Green Jumpskirt +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpskirtColorGreen + name: green jumpskirt + description: A generic green jumpskirt with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpskirt/color.rsi + layers: + - state: icon + color: "#9ed63a" + - state: trinkets-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#9ed63a" + - state: trinkets-inhand-left + right: + - state: inhand-right + color: "#9ed63a" + - state: trinkets-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpskirt/color.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#9ed63a" + - state: trinkets-equipped-INNERCLOTHING + + # Dark Green Jumpskirt +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpskirtColorDarkGreen + name: dark green jumpskirt + description: A generic dark green jumpskirt with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpskirt/color.rsi + layers: + - state: icon + color: "#79CC26" + - state: trinkets-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#79CC26" + - state: trinkets-inhand-left + right: + - state: inhand-right + color: "#79CC26" + - state: trinkets-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpskirt/color.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#79CC26" + - state: trinkets-equipped-INNERCLOTHING + +# Orange Jumpskirt +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpskirtColorOrange + name: orange jumpskirt + description: Don't wear this near paranoid security officers. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpskirt/color.rsi + layers: + - state: icon + color: "#ff8c19" + - state: trinkets-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#ff8c19" + - state: trinkets-inhand-left + right: + - state: inhand-right + color: "#ff8c19" + - state: trinkets-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpskirt/color.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#ff8c19" + - state: trinkets-equipped-INNERCLOTHING + +# Pink Jumpskirt +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpskirtColorPink + name: pink jumpskirt + description: Just looking at this makes you feel fabulous. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpskirt/color.rsi + layers: + - state: icon + color: "#ffa69b" + - state: trinkets-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#ffa69b" + - state: trinkets-inhand-left + right: + - state: inhand-right + color: "#ffa69b" + - state: trinkets-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpskirt/color.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#ffa69b" + - state: trinkets-equipped-INNERCLOTHING + +# Red Jumpskirt +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpskirtColorRed + name: red jumpskirt + description: A generic red jumpskirt with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpskirt/color.rsi + layers: + - state: icon + color: "#eb0c07" + - state: trinkets-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#eb0c07" + - state: trinkets-inhand-left + right: + - state: inhand-right + color: "#eb0c07" + - state: trinkets-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpskirt/color.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#eb0c07" + - state: trinkets-equipped-INNERCLOTHING + +# Yellow Jumpskirt +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpskirtColorYellow + name: yellow jumpskirt + description: A generic yellow jumpskirt with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpskirt/color.rsi + layers: + - state: icon + color: "#ffe14d" + - state: trinkets-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#ffe14d" + - state: trinkets-inhand-left + right: + - state: inhand-right + color: "#ffe14d" + - state: trinkets-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpskirt/color.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#ffe14d" + - state: trinkets-equipped-INNERCLOTHING + +# Purple Jumpskirt +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpskirtColorPurple + name: purple jumpskirt + description: A generic light purple jumpskirt with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpskirt/color.rsi + layers: + - state: icon + color: "#9f70cc" + - state: trinkets-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#9f70cc" + - state: trinkets-inhand-left + right: + - state: inhand-right + color: "#9f70cc" + - state: trinkets-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpskirt/color.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#9f70cc" + - state: trinkets-equipped-INNERCLOTHING + +# Light Brown Jumpskirt +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpskirtColorLightBrown + name: light brown jumpskirt + description: A generic light brown jumpskirt with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpskirt/color.rsi + layers: + - state: icon + color: "#c59431" + - state: trinkets-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#c59431" + - state: trinkets-inhand-left + right: + - state: inhand-right + color: "#c59431" + - state: trinkets-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpskirt/color.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#c59431" + - state: trinkets-equipped-INNERCLOTHING + +# Brown Jumpskirt +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpskirtColorBrown + name: brown jumpskirt + description: A generic brown jumpskirt with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpskirt/color.rsi + layers: + - state: icon + color: "#a17229" + - state: trinkets-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#a17229" + - state: trinkets-inhand-left + right: + - state: inhand-right + color: "#a17229" + - state: trinkets-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpskirt/color.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#a17229" + - state: trinkets-equipped-INNERCLOTHING + +# Maroon Jumpskirt +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpskirtColorMaroon + name: maroon jumpskirt + description: A generic maroon jumpskirt with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpskirt/color.rsi + layers: + - state: icon + color: "#cc295f" + - state: trinkets-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#cc295f" + - state: trinkets-inhand-left + right: + - state: inhand-right + color: "#cc295f" + - state: trinkets-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpskirt/color.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#cc295f" + - state: trinkets-equipped-INNERCLOTHING diff --git a/Resources/Prototypes/Entities/Clothing/Uniforms/color_jumpsuits.yml b/Resources/Prototypes/Entities/Clothing/Uniforms/color_jumpsuits.yml new file mode 100644 index 00000000000..f56afabeac1 --- /dev/null +++ b/Resources/Prototypes/Entities/Clothing/Uniforms/color_jumpsuits.yml @@ -0,0 +1,503 @@ +# White Jumpsuit +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpsuitColorWhite + name: white jumpsuit + description: A generic white jumpsuit with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpsuit/color.rsi + layers: + - state: icon + - state: trinkets-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + - state: trinkets-inhand-left + right: + - state: inhand-right + - state: trinkets-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpsuit/color.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + - state: trinkets-equipped-INNERCLOTHING + +# Grey Jumpsuit +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpsuitColorGrey + name: grey jumpsuit + description: A tasteful grey jumpsuit that reminds you of the good old days. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpsuit/color.rsi + layers: + - state: icon + color: "#b3b3b3" + - state: trinkets-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#b3b3b3" + - state: trinkets-inhand-left + right: + - state: inhand-right + color: "#b3b3b3" + - state: trinkets-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpsuit/color.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#b3b3b3" + - state: trinkets-equipped-INNERCLOTHING + +# Black Jumpsuit +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpsuitColorBlack + name: black jumpsuit + description: A generic black jumpsuit with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpsuit/color.rsi + layers: + - state: icon + color: "#3f3f3f" + - state: trinkets-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#3f3f3f" + - state: trinkets-inhand-left + right: + - state: inhand-right + color: "#3f3f3f" + - state: trinkets-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpsuit/color.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#3f3f3f" + - state: trinkets-equipped-INNERCLOTHING + +# Blue Jumpsuit +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpsuitColorBlue + name: blue jumpsuit + description: A generic blue jumpsuit with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpsuit/color.rsi + layers: + - state: icon + color: "#52aecc" + - state: trinkets-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#52aecc" + - state: trinkets-inhand-left + right: + - state: inhand-right + color: "#52aecc" + - state: trinkets-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpsuit/color.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#52aecc" + - state: trinkets-equipped-INNERCLOTHING + +# Dark Blue Jumpsuit +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpsuitColorDarkBlue + name: dark blue jumpsuit + description: A generic dark blue jumpsuit with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpsuit/color.rsi + layers: + - state: icon + color: "#3285ba" + - state: trinkets-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#3285ba" + - state: trinkets-inhand-left + right: + - state: inhand-right + color: "#3285ba" + - state: trinkets-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpsuit/color.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#3285ba" + - state: trinkets-equipped-INNERCLOTHING + +# Teal Jumpsuit +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpsuitColorTeal + name: teal jumpsuit + description: A generic teal jumpsuit with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpsuit/color.rsi + layers: + - state: icon + color: "#77f3b7" + - state: trinkets-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#77f3b7" + - state: trinkets-inhand-left + right: + - state: inhand-right + color: "#77f3b7" + - state: trinkets-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpsuit/color.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#77f3b7" + - state: trinkets-equipped-INNERCLOTHING + +# Green Jumpsuit +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpsuitColorGreen + name: green jumpsuit + description: A generic green jumpsuit with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpsuit/color.rsi + layers: + - state: icon + color: "#9ed63a" + - state: trinkets-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#9ed63a" + - state: trinkets-inhand-left + right: + - state: inhand-right + color: "#9ed63a" + - state: trinkets-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpsuit/color.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#9ed63a" + - state: trinkets-equipped-INNERCLOTHING + + # Dark Green Jumpsuit +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpsuitColorDarkGreen + name: dark green jumpsuit + description: A generic dark green jumpsuit with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpsuit/color.rsi + layers: + - state: icon + color: "#79CC26" + - state: trinkets-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#79CC26" + - state: trinkets-inhand-left + right: + - state: inhand-right + color: "#79CC26" + - state: trinkets-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpsuit/color.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#79CC26" + - state: trinkets-equipped-INNERCLOTHING + +# Orange Jumpsuit +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpsuitColorOrange + name: orange jumpsuit + description: Don't wear this near paranoid security officers. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpsuit/color.rsi + layers: + - state: icon + color: "#ff8c19" + - state: trinkets-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#ff8c19" + - state: trinkets-inhand-left + right: + - state: inhand-right + color: "#ff8c19" + - state: trinkets-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpsuit/color.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#ff8c19" + - state: trinkets-equipped-INNERCLOTHING + +# Pink Jumpsuit +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpsuitColorPink + name: pink jumpsuit + description: Just looking at this makes you feel fabulous. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpsuit/color.rsi + layers: + - state: icon + color: "#ffa69b" + - state: trinkets-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#ffa69b" + - state: trinkets-inhand-left + right: + - state: inhand-right + color: "#ffa69b" + - state: trinkets-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpsuit/color.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#ffa69b" + - state: trinkets-equipped-INNERCLOTHING + +# Red Jumpsuit +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpsuitColorRed + name: red jumpsuit + description: A generic red jumpsuit with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpsuit/color.rsi + layers: + - state: icon + color: "#eb0c07" + - state: trinkets-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#eb0c07" + - state: trinkets-inhand-left + right: + - state: inhand-right + color: "#eb0c07" + - state: trinkets-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpsuit/color.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#eb0c07" + - state: trinkets-equipped-INNERCLOTHING + +# Yellow Jumpsuit +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpsuitColorYellow + name: yellow jumpsuit + description: A generic yellow jumpsuit with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpsuit/color.rsi + layers: + - state: icon + color: "#ffe14d" + - state: trinkets-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#ffe14d" + - state: trinkets-inhand-left + right: + - state: inhand-right + color: "#ffe14d" + - state: trinkets-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpsuit/color.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#ffe14d" + - state: trinkets-equipped-INNERCLOTHING + +# Purple Jumpsuit +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpsuitColorPurple + name: purple jumpsuit + description: A generic light purple jumpsuit with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpsuit/color.rsi + layers: + - state: icon + color: "#9f70cc" + - state: trinkets-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#9f70cc" + - state: trinkets-inhand-left + right: + - state: inhand-right + color: "#9f70cc" + - state: trinkets-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpsuit/color.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#9f70cc" + - state: trinkets-equipped-INNERCLOTHING + +# Light Brown Jumpsuit +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpsuitColorLightBrown + name: light brown jumpsuit + description: A generic light brown jumpsuit with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpsuit/color.rsi + layers: + - state: icon + color: "#c59431" + - state: trinkets-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#c59431" + - state: trinkets-inhand-left + right: + - state: inhand-right + color: "#c59431" + - state: trinkets-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpsuit/color.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#c59431" + - state: trinkets-equipped-INNERCLOTHING + +# Brown Jumpsuit +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpsuitColorBrown + name: brown jumpsuit + description: A generic brown jumpsuit with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpsuit/color.rsi + layers: + - state: icon + color: "#a17229" + - state: trinkets-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#a17229" + - state: trinkets-inhand-left + right: + - state: inhand-right + color: "#a17229" + - state: trinkets-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpsuit/color.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#a17229" + - state: trinkets-equipped-INNERCLOTHING + +# Maroon Jumpsuit +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpsuitColorMaroon + name: maroon jumpsuit + description: A generic maroon jumpsuit with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpsuit/color.rsi + layers: + - state: icon + color: "#cc295f" + - state: trinkets-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#cc295f" + - state: trinkets-inhand-left + right: + - state: inhand-right + color: "#cc295f" + - state: trinkets-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpsuit/color.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#cc295f" + - state: trinkets-equipped-INNERCLOTHING + +# Rainbow Jumpsuit +- type: entity + parent: ClothingUniformBase + id: ClothingUniformColorRainbow + name: rainbow jumpsuit + description: A multi-colored jumpsuit! + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpsuit/rainbow.rsi + - type: Clothing + sprite: Clothing/Uniforms/Jumpsuit/rainbow.rsi diff --git a/Resources/Prototypes/Entities/Clothing/Uniforms/jumpskirts.yml b/Resources/Prototypes/Entities/Clothing/Uniforms/jumpskirts.yml index 23c35fbc8a7..d6363120ea5 100644 --- a/Resources/Prototypes/Entities/Clothing/Uniforms/jumpskirts.yml +++ b/Resources/Prototypes/Entities/Clothing/Uniforms/jumpskirts.yml @@ -35,7 +35,7 @@ parent: ClothingUniformSkirtBase id: ClothingUniformJumpskirtChiefEngineer name: chief engineer's jumpskirt - description: It's a high visibility jumpskirt given to those engineers insane enough to achieve the rank of Chief Engineer. It has minor radiation shielding. + description: It's a high visibility jumpskirt given to those engineers insane enough to achieve the rank of Chief Engineer. components: - type: Sprite sprite: Clothing/Uniforms/Jumpskirt/ce.rsi @@ -178,7 +178,7 @@ parent: ClothingUniformSkirtBase id: ClothingUniformJumpskirtHoSAlt name: head of security's turtleneck - description: It's a turtleneck worn by those strong and disciplined enough to achieve the position of Head of Security. Its sturdy fabric provides minor protection from slash and pierce damage. + description: It's a turtleneck worn by those strong and disciplined enough to achieve the position of Head of Security. components: - type: Sprite sprite: Clothing/Uniforms/Jumpskirt/hos_alt.rsi @@ -263,15 +263,34 @@ sprite: DeltaV/Clothing/Uniforms/Jumpskirt/brigmedic.rsi # DeltaV - resprite - type: entity - parent: ClothingUniformSkirtBase + parent: ClothingUniformBase id: ClothingUniformJumpskirtPrisoner name: prisoner jumpskirt description: Busted. components: - type: Sprite - sprite: Clothing/Uniforms/Jumpskirt/prisoner.rsi + sprite: Clothing/Uniforms/Jumpskirt/color.rsi + layers: + - state: icon + color: "#ff8300" + - state: prisoner-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#ff8300" + - state: prisoner-inhand-left + right: + - state: inhand-right + color: "#ff8300" + - state: prisoner-inhand-right - type: Clothing - sprite: Clothing/Uniforms/Jumpskirt/prisoner.rsi + sprite: Clothing/Uniforms/Jumpskirt/color.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#ff8300" + - state: prisoner-equipped-INNERCLOTHING - type: SuitSensor controlsLocked: true randomMode: false @@ -279,8 +298,8 @@ - type: Tag tags: - ClothMade - - WhitelistChameleon - PrisonUniform + - WhitelistChameleon - Skirt # Delta-V - Skirt Tag so Harpies can wear it. - type: entity @@ -320,7 +339,7 @@ parent: ClothingUniformSkirtBase id: ClothingUniformJumpskirtScientist name: scientist jumpskirt - description: It's made of a special fiber that provides minor protection against explosives. It has markings that denote the wearer as a scientist. + description: It's made of a special fiber that increases perceived intelligence and decreases personal ethics. It has markings that denote the wearer as a scientist. components: - type: Sprite sprite: Clothing/Uniforms/Jumpskirt/scientist.rsi @@ -360,184 +379,6 @@ - type: Clothing sprite: DeltaV/Clothing/Uniforms/Jumpskirt/warden.rsi # DeltaV - resprite -# COLORS - -- type: entity - parent: ClothingUniformSkirtBase - id: ClothingUniformJumpskirtColorGrey - description: A tasteful grey jumpskirt that reminds you of the good old days. - name: grey jumpskirt - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpskirt/Color/grey.rsi - - type: Clothing - sprite: Clothing/Uniforms/Jumpskirt/Color/grey.rsi - -- type: entity - parent: ClothingUniformSkirtBase - id: ClothingUniformJumpskirtColorBlack - name: black jumpskirt - description: A generic black jumpskirt with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpskirt/Color/black.rsi - - type: Clothing - sprite: Clothing/Uniforms/Jumpskirt/Color/black.rsi - -- type: entity - parent: ClothingUniformSkirtBase - id: ClothingUniformJumpskirtColorBlue - name: blue jumpskirt - description: A generic blue jumpskirt with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpskirt/Color/blue.rsi - - type: Clothing - sprite: Clothing/Uniforms/Jumpskirt/Color/blue.rsi - -- type: entity - parent: ClothingUniformSkirtBase - id: ClothingUniformJumpskirtColorGreen - name: green jumpskirt - description: A generic green jumpskirt with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpskirt/Color/green.rsi - - type: Clothing - sprite: Clothing/Uniforms/Jumpskirt/Color/green.rsi - -- type: entity - parent: ClothingUniformSkirtBase - id: ClothingUniformJumpskirtColorOrange - name: orange jumpskirt - description: "Don't wear this near paranoid security officers." - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpskirt/Color/orange.rsi - - type: Clothing - sprite: Clothing/Uniforms/Jumpskirt/Color/orange.rsi - -- type: entity - parent: ClothingUniformSkirtBase - id: ClothingUniformJumpskirtColorPink - name: pink jumpskirt - description: "Just looking at this makes you feel fabulous." - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpskirt/Color/pink.rsi - - type: Clothing - sprite: Clothing/Uniforms/Jumpskirt/Color/pink.rsi - -- type: entity - parent: ClothingUniformSkirtBase - id: ClothingUniformJumpskirtColorRed - name: red jumpskirt - description: A generic red jumpskirt with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpskirt/Color/red.rsi - - type: Clothing - sprite: Clothing/Uniforms/Jumpskirt/Color/red.rsi - -- type: entity - parent: ClothingUniformSkirtBase - id: ClothingUniformJumpskirtColorWhite - name: white jumpskirt - description: A generic white jumpskirt with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpskirt/Color/white.rsi - - type: Clothing - sprite: Clothing/Uniforms/Jumpskirt/Color/white.rsi - -- type: entity - parent: ClothingUniformSkirtBase - id: ClothingUniformJumpskirtColorYellow - name: yellow jumpskirt - description: A generic yellow jumpskirt with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpskirt/Color/yellow.rsi - - type: Clothing - sprite: Clothing/Uniforms/Jumpskirt/Color/yellow.rsi - -- type: entity - parent: ClothingUniformSkirtBase - id: ClothingUniformJumpskirtColorDarkBlue - name: dark blue jumpskirt - description: A generic dark blue jumpskirt with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpskirt/Color/darkblue.rsi - - type: Clothing - sprite: Clothing/Uniforms/Jumpskirt/Color/darkblue.rsi - -- type: entity - parent: ClothingUniformSkirtBase - id: ClothingUniformJumpskirtColorTeal - name: teal jumpskirt - description: A generic teal jumpskirt with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpskirt/Color/teal.rsi - - type: Clothing - sprite: Clothing/Uniforms/Jumpskirt/Color/teal.rsi - -- type: entity - parent: ClothingUniformSkirtBase - id: ClothingUniformJumpskirtColorPurple - name: purple jumpskirt - description: A generic purple jumpskirt with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpskirt/Color/lightpurple.rsi - - type: Clothing - sprite: Clothing/Uniforms/Jumpskirt/Color/lightpurple.rsi - -- type: entity - parent: ClothingUniformSkirtBase - id: ClothingUniformJumpskirtColorDarkGreen - name: dark green jumpskirt - description: A generic dark green jumpskirt with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpskirt/Color/darkgreen.rsi - - type: Clothing - sprite: Clothing/Uniforms/Jumpskirt/Color/darkgreen.rsi - -- type: entity - parent: ClothingUniformSkirtBase - id: ClothingUniformJumpskirtColorLightBrown - name: light brown jumpskirt - description: A generic light brown jumpskirt with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpskirt/Color/lightbrown.rsi - - type: Clothing - sprite: Clothing/Uniforms/Jumpskirt/Color/lightbrown.rsi - -- type: entity - parent: ClothingUniformSkirtBase - id: ClothingUniformJumpskirtColorBrown - name: brown jumpskirt - description: A generic brown jumpskirt with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpskirt/Color/brown.rsi - - type: Clothing - sprite: Clothing/Uniforms/Jumpskirt/Color/brown.rsi - -- type: entity - parent: ClothingUniformSkirtBase - id: ClothingUniformJumpskirtColorMaroon - name: maroon jumpskirt - description: A generic maroon jumpskirt with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpskirt/Color/maroon.rsi - - type: Clothing - sprite: Clothing/Uniforms/Jumpskirt/Color/maroon.rsi - - type: entity parent: ClothingUniformSkirtBase id: ClothingUniformJumpskirtLibrarian diff --git a/Resources/Prototypes/Entities/Clothing/Uniforms/jumpsuits.yml b/Resources/Prototypes/Entities/Clothing/Uniforms/jumpsuits.yml index c3e8da706d3..0ba26d4eabf 100644 --- a/Resources/Prototypes/Entities/Clothing/Uniforms/jumpsuits.yml +++ b/Resources/Prototypes/Entities/Clothing/Uniforms/jumpsuits.yml @@ -94,7 +94,7 @@ parent: ClothingUniformBase id: ClothingUniformJumpsuitChiefEngineer name: chief engineer's jumpsuit - description: It's a high visibility jumpsuit given to those engineers insane enough to achieve the rank of Chief Engineer. It has minor radiation shielding. + description: It's a high visibility jumpsuit given to those engineers insane enough to achieve the rank of Chief Engineer. components: - type: Sprite sprite: Clothing/Uniforms/Jumpsuit/ce.rsi @@ -458,9 +458,28 @@ description: Busted. components: - type: Sprite - sprite: Clothing/Uniforms/Jumpsuit/prisoner.rsi + sprite: Clothing/Uniforms/Jumpsuit/color.rsi + layers: + - state: icon + color: "#ff8300" + - state: prisoner-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#ff8300" + - state: prisoner-inhand-left + right: + - state: inhand-right + color: "#ff8300" + - state: prisoner-inhand-right - type: Clothing - sprite: Clothing/Uniforms/Jumpsuit/prisoner.rsi + sprite: Clothing/Uniforms/Jumpsuit/color.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#ff8300" + - state: prisoner-equipped-INNERCLOTHING - type: SuitSensor controlsLocked: true randomMode: false @@ -521,7 +540,7 @@ parent: ClothingUniformBase id: ClothingUniformJumpsuitScientist name: scientist jumpsuit - description: It's made of a special fiber that provides minor protection against explosives. It has markings that denote the wearer as a scientist. + description: It's made of a special fiber that increases perceived intelligence and decreases personal ethics. It has markings that denote the wearer as a scientist. components: - type: Sprite sprite: Clothing/Uniforms/Jumpsuit/scientist.rsi @@ -594,195 +613,6 @@ - type: Clothing sprite: DeltaV/Clothing/Uniforms/Jumpsuit/warden.rsi # DeltaV - resprite -# COLORS - -- type: entity - parent: ClothingUniformBase - id: ClothingUniformJumpsuitColorGrey - description: A tasteful grey jumpsuit that reminds you of the good old days. - name: grey jumpsuit - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpsuit/Color/grey.rsi - - type: Clothing - sprite: Clothing/Uniforms/Jumpsuit/Color/grey.rsi - -- type: entity - parent: ClothingUniformBase - id: ClothingUniformJumpsuitColorBlack - name: black jumpsuit - description: A generic black jumpsuit with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpsuit/Color/black.rsi - - type: Clothing - sprite: Clothing/Uniforms/Jumpsuit/Color/black.rsi - -- type: entity - parent: ClothingUniformBase - id: ClothingUniformJumpsuitColorBlue - name: blue jumpsuit - description: A generic blue jumpsuit with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpsuit/Color/blue.rsi - - type: Clothing - sprite: Clothing/Uniforms/Jumpsuit/Color/blue.rsi - -- type: entity - parent: ClothingUniformBase - id: ClothingUniformJumpsuitColorGreen - name: green jumpsuit - description: A generic green jumpsuit with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpsuit/Color/green.rsi - - type: Clothing - sprite: Clothing/Uniforms/Jumpsuit/Color/green.rsi - -- type: entity - parent: ClothingUniformBase - id: ClothingUniformJumpsuitColorOrange - name: orange jumpsuit - description: "Don't wear this near paranoid security officers." - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpsuit/Color/orange.rsi - - type: Clothing - sprite: Clothing/Uniforms/Jumpsuit/Color/orange.rsi - -- type: entity - parent: ClothingUniformBase - id: ClothingUniformJumpsuitColorPink - name: pink jumpsuit - description: "Just looking at this makes you feel fabulous." - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpsuit/Color/pink.rsi - - type: Clothing - sprite: Clothing/Uniforms/Jumpsuit/Color/pink.rsi - -- type: entity - parent: ClothingUniformBase - id: ClothingUniformJumpsuitColorRed - name: red jumpsuit - description: A generic red jumpsuit with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpsuit/Color/red.rsi - - type: Clothing - sprite: Clothing/Uniforms/Jumpsuit/Color/red.rsi - -- type: entity - parent: ClothingUniformBase - id: ClothingUniformJumpsuitColorWhite - name: white jumpsuit - description: A generic white jumpsuit with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpsuit/Color/white.rsi - - type: Clothing - sprite: Clothing/Uniforms/Jumpsuit/Color/white.rsi - -- type: entity - parent: ClothingUniformBase - id: ClothingUniformJumpsuitColorYellow - name: yellow jumpsuit - description: A generic yellow jumpsuit with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpsuit/Color/yellow.rsi - - type: Clothing - sprite: Clothing/Uniforms/Jumpsuit/Color/yellow.rsi - -- type: entity - parent: ClothingUniformBase - id: ClothingUniformJumpsuitColorDarkBlue - name: dark blue jumpsuit - description: A generic dark blue jumpsuit with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpsuit/Color/darkblue.rsi - - type: Clothing - sprite: Clothing/Uniforms/Jumpsuit/Color/darkblue.rsi - -- type: entity - parent: ClothingUniformBase - id: ClothingUniformJumpsuitColorTeal - name: teal jumpsuit - description: A generic teal jumpsuit with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpsuit/Color/teal.rsi - - type: Clothing - sprite: Clothing/Uniforms/Jumpsuit/Color/teal.rsi - -- type: entity - parent: ClothingUniformBase - id: ClothingUniformJumpsuitColorPurple - name: purple jumpsuit - description: A generic purple jumpsuit with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpsuit/Color/lightpurple.rsi - - type: Clothing - sprite: Clothing/Uniforms/Jumpsuit/Color/lightpurple.rsi - -- type: entity - parent: ClothingUniformBase - id: ClothingUniformJumpsuitColorDarkGreen - name: dark green jumpsuit - description: A generic dark green jumpsuit with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpsuit/Color/darkgreen.rsi - - type: Clothing - sprite: Clothing/Uniforms/Jumpsuit/Color/darkgreen.rsi - -- type: entity - parent: ClothingUniformBase - id: ClothingUniformJumpsuitColorLightBrown - name: light brown jumpsuit - description: A generic light brown jumpsuit with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpsuit/Color/lightbrown.rsi - - type: Clothing - sprite: Clothing/Uniforms/Jumpsuit/Color/lightbrown.rsi - -- type: entity - parent: ClothingUniformBase - id: ClothingUniformJumpsuitColorBrown - name: brown jumpsuit - description: A generic brown jumpsuit with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpsuit/Color/brown.rsi - - type: Clothing - sprite: Clothing/Uniforms/Jumpsuit/Color/brown.rsi - -- type: entity - parent: ClothingUniformBase - id: ClothingUniformJumpsuitColorMaroon - name: maroon jumpsuit - description: A generic maroon jumpsuit with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpsuit/Color/maroon.rsi - - type: Clothing - sprite: Clothing/Uniforms/Jumpsuit/Color/maroon.rsi - -- type: entity - parent: ClothingUniformBase - id: ClothingUniformColorRainbow - name: rainbow jumpsuit - description: A multi-colored jumpsuit! - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpsuit/rainbow.rsi - - type: Clothing - sprite: Clothing/Uniforms/Jumpsuit/rainbow.rsi - - type: entity parent: ClothingUniformBase id: ClothingUniformOveralls diff --git a/Resources/Prototypes/Entities/Clothing/Uniforms/random_suit.yml b/Resources/Prototypes/Entities/Clothing/Uniforms/random_suit.yml index 88278077b5c..e113f0ffc76 100644 --- a/Resources/Prototypes/Entities/Clothing/Uniforms/random_suit.yml +++ b/Resources/Prototypes/Entities/Clothing/Uniforms/random_suit.yml @@ -10,9 +10,9 @@ - type: Sprite sprite: Clothing/Uniforms/procedural.rsi layers: - - state: base_torso_standart + - state: base_torso_standard map: [ "torso" ] - - state: base_leg_standart + - state: base_leg_standard map: [ "leg" ] - state: mask_null map: [ "decor" ] @@ -24,9 +24,9 @@ sprite: Clothing/Uniforms/procedural.rsi clothingVisuals: jumpsuit: - - state: base_torso_standart + - state: base_torso_standard map: [ "torso" ] - - state: base_leg_standart + - state: base_leg_standard map: [ "leg" ] - state: mask_null map: [ "decor" ] @@ -42,7 +42,7 @@ offset: 0 prototypes: - ClothingUniformRandomArmless - - ClothingUniformRandomStandart + - ClothingUniformRandomStandard - ClothingUniformRandomBra - ClothingUniformRandomShorts - ClothingUniformRandomShirt @@ -57,7 +57,7 @@ - torso: base_torso_armless: Sixteen leg: - base_leg_standart: Sixteen + base_leg_standard: Sixteen base_leg_short: Sixteen base_leg_skirt: Sixteen base_leg_skirt_long: Sixteen @@ -76,16 +76,16 @@ - type: entity parent: ClothingUniformRandom - id: ClothingUniformRandomStandart + id: ClothingUniformRandomStandard name: colorful costume components: - type: RandomSprite available: - torso: - base_torso_standart: Sixteen - base_torso_standart2: Sixteen + base_torso_standard: Sixteen + base_torso_standard2: Sixteen leg: - base_leg_standart: Sixteen + base_leg_standard: Sixteen base_leg_short: Sixteen base_leg_skirt: Sixteen base_leg_skirt_long: Sixteen @@ -100,15 +100,15 @@ decor_torso_armless8: Sixteen decor_torso_armless9: Sixteen decor_torso_armless10: Sixteen - decor_torso_standart1: Sixteen - decor_torso_standart2: Sixteen - decor_torso_standart3: Sixteen - decor_torso_standart4: Sixteen - decor_torso_standart5: Sixteen - decor_torso_standart6: Sixteen - decor_torso_standart7: Sixteen - decor_torso_standart8: Sixteen - decor_torso_standart9: Sixteen + decor_torso_standard1: Sixteen + decor_torso_standard2: Sixteen + decor_torso_standard3: Sixteen + decor_torso_standard4: Sixteen + decor_torso_standard5: Sixteen + decor_torso_standard6: Sixteen + decor_torso_standard7: Sixteen + decor_torso_standard8: Sixteen + decor_torso_standard9: Sixteen mask_null: "" - type: entity @@ -121,7 +121,7 @@ - torso: base_torso_bra: Sixteen leg: - base_leg_standart: Sixteen + base_leg_standard: Sixteen base_leg_short: Sixteen base_leg_skirt: Sixteen base_leg_skirt_long: Sixteen @@ -143,7 +143,7 @@ - torso: mask_null: "" leg: - base_leg_standart: Sixteen + base_leg_standard: Sixteen base_leg_short: Sixteen base_leg_skirt: Sixteen base_leg_skirt_long: Sixteen @@ -159,11 +159,11 @@ base_torso_armless: Sixteen mask_null: "" leg: - base_leg_standart: Sixteen + base_leg_standard: Sixteen base_leg_short: Sixteen decor: base_torso_shirt: Sixteen overlay: decor_torso_shirt1: Sixteen decor_torso_shirt2: Sixteen - decor_torso_shirt3: Sixteen \ No newline at end of file + decor_torso_shirt3: Sixteen diff --git a/Resources/Prototypes/Entities/Clothing/Uniforms/specific.yml b/Resources/Prototypes/Entities/Clothing/Uniforms/specific.yml index d7a5e2b787d..ad02f4aa676 100644 --- a/Resources/Prototypes/Entities/Clothing/Uniforms/specific.yml +++ b/Resources/Prototypes/Entities/Clothing/Uniforms/specific.yml @@ -8,9 +8,28 @@ - type: Tag tags: [] # ignore "WhitelistChameleon" tag - type: Sprite - sprite: Clothing/Uniforms/Jumpsuit/Color/black.rsi + sprite: Clothing/Uniforms/Jumpsuit/color.rsi + layers: + - state: icon + color: "#3f3f3f" + - state: trinkets-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#3f3f3f" + - state: trinkets-inhand-left + right: + - state: inhand-right + color: "#3f3f3f" + - state: trinkets-inhand-right - type: Clothing - sprite: Clothing/Uniforms/Jumpsuit/Color/black.rsi + sprite: Clothing/Shoes/color.rsi + clothingVisuals: + shoes: + - state: equipped-FEET + color: "#1d1d1d" + - state: soles-equipped-FEET - type: SuitSensor randomMode: false mode: SensorOff diff --git a/Resources/Prototypes/Entities/Clothing/base_clothing.yml b/Resources/Prototypes/Entities/Clothing/base_clothing.yml index 92a698dd301..44613e042f8 100644 --- a/Resources/Prototypes/Entities/Clothing/base_clothing.yml +++ b/Resources/Prototypes/Entities/Clothing/base_clothing.yml @@ -10,7 +10,7 @@ tags: - WhitelistChameleon - type: StaticPrice - price: 15 + price: 10 - type: entity abstract: true diff --git a/Resources/Prototypes/Entities/Effects/puddle.yml b/Resources/Prototypes/Entities/Effects/puddle.yml index 2c845e1d0f0..fecf9f19a47 100644 --- a/Resources/Prototypes/Entities/Effects/puddle.yml +++ b/Resources/Prototypes/Entities/Effects/puddle.yml @@ -142,8 +142,11 @@ mode: CardinalFlags - type: SolutionContainerManager solutions: - puddle: { maxVol: 1000 } + puddle: + maxVol: 1000 - type: Puddle + - type: MixableSolution + solution: puddle - type: Appearance - type: ActiveEdgeSpreader - type: EdgeSpreader diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/Food_Drinks/food_produce.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/Food_Drinks/food_produce.yml index 6edf341e108..a889b939bde 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/Random/Food_Drinks/food_produce.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/Food_Drinks/food_produce.yml @@ -33,8 +33,8 @@ - FoodOnion - FoodOnionRed - FoodMushroom - - FoodChili - - FoodChilly + - FoodChiliPepper + - FoodChillyPepper - FoodAloe - FoodPoppy - FoodLingzhi diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml index f641fbec39e..4c820998ea2 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml @@ -66,6 +66,8 @@ - ClothingUniformJumpsuitPirate - ClothingShoesBootsCowboyFancy - ClothingHeadHatCowboyBountyHunter + - ClothingNeckAutismPin + - ClothingNeckGoldAutismPin rareChance: 0.01 prototypes: - Lighter diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/gauze.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/gauze.yml index c68075dc508..3ca7a78b398 100644 --- a/Resources/Prototypes/Entities/Mobs/Customization/Markings/gauze.yml +++ b/Resources/Prototypes/Entities/Mobs/Customization/Markings/gauze.yml @@ -1,8 +1,8 @@ - type: marking id: GauzeLefteyePatch bodyPart: Eyes - markingCategory: Head - speciesRestriction: [Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin] # Delta V - Felinid, Oni, Vulpkanin + markingCategory: Overlay + speciesRestriction: [Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin] # Delta V - Felinid, Oni, Vulpkanin coloring: default: type: @@ -13,10 +13,10 @@ state: gauze_lefteye_2 - type: marking - id: GauzeLefteyeTape + id: GauzeLefteyePad bodyPart: Eyes - markingCategory: Head - speciesRestriction: [Moth, Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin] # Delta V - Felinid, Oni, Vulpkanin + markingCategory: Overlay + speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin] # Delta V - Felinid, Oni, Vulpkanin coloring: default: type: @@ -29,8 +29,8 @@ - type: marking id: GauzeRighteyePatch bodyPart: Eyes - markingCategory: Head - speciesRestriction: [Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin] # Delta V - Felinid, Oni, Vulpkanin + markingCategory: Overlay + speciesRestriction: [Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin] # Delta V - Felinid, Oni, Vulpkanin coloring: default: type: @@ -41,10 +41,10 @@ state: gauze_righteye_2 - type: marking - id: GauzeRighteyeTape + id: GauzeRighteyePad bodyPart: Eyes - markingCategory: Head - speciesRestriction: [Moth, Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin] # Delta V - Felinid, Oni, Vulpkanin + markingCategory: Overlay + speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin] # Delta V - Felinid, Oni, Vulpkanin coloring: default: type: @@ -57,8 +57,8 @@ - type: marking id: GauzeBlindfold bodyPart: Eyes - markingCategory: Head - speciesRestriction: [Moth, Dwarf, Human, Arachnid, Felinid, Oni, Harpy, Vulpkanin] # Delta V - Felinid, Oni, Harpy, Vulpkanin + markingCategory: Overlay + speciesRestriction: [Dwarf, Human, Arachnid, Felinid, Oni, Harpy, Vulpkanin] # Delta V - Felinid, Oni, Harpy, Vulpkanin coloring: default: type: @@ -71,8 +71,8 @@ - type: marking id: GauzeShoulder bodyPart: Chest - markingCategory: Chest - speciesRestriction: [Moth, Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin] # Delta V - Felinid, Oni, Vulpkanin + markingCategory: Overlay + speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin] # Delta V - Felinid, Oni, Vulpkanin coloring: default: type: @@ -85,8 +85,8 @@ - type: marking id: GauzeStomach bodyPart: Chest - markingCategory: Chest - speciesRestriction: [Moth, Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin] # Delta V - Felinid, Oni, Vulpkanin + markingCategory: Overlay + speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin] # Delta V - Felinid, Oni, Vulpkanin coloring: default: type: @@ -99,8 +99,8 @@ - type: marking id: GauzeUpperArmRight bodyPart: RArm - markingCategory: Arms - speciesRestriction: [Moth, Dwarf, Human, Reptilian, Arachnid, SlimePerson, Felinid, Oni, Vulpkanin] # Delta V - Felinid, Oni, Vulpkanin + markingCategory: Overlay + speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, SlimePerson, Felinid, Oni, Vulpkanin] # Delta V - Felinid, Oni, Vulpkanin coloring: default: type: @@ -113,8 +113,8 @@ - type: marking id: GauzeLowerArmRight bodyPart: RArm, RHand - markingCategory: Arms - speciesRestriction: [Moth, Dwarf, Human, Reptilian, Arachnid, SlimePerson, Felinid, Oni, Vulpkanin] # Delta V - Felinid, Oni, Vulpkanin + markingCategory: Overlay + speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, SlimePerson, Felinid, Oni, Vulpkanin] # Delta V - Felinid, Oni, Vulpkanin coloring: default: type: @@ -127,8 +127,8 @@ - type: marking id: GauzeLeftArm bodyPart: LArm, LHand - markingCategory: Arms - speciesRestriction: [Moth, Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin] # Delta V - Felinid, Oni, Vulpkanin + markingCategory: Overlay + speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin] # Delta V - Felinid, Oni, Vulpkanin coloring: default: type: @@ -141,8 +141,8 @@ - type: marking id: GauzeLowerLegLeft bodyPart: LFoot - markingCategory: Legs - speciesRestriction: [Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin] # Delta V - Felinid, Oni, Vulpkanin + markingCategory: Overlay + speciesRestriction: [Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin] # Delta V - Felinid, Oni, Vulpkanin coloring: default: type: @@ -155,8 +155,8 @@ - type: marking id: GauzeUpperLegLeft bodyPart: LLeg - markingCategory: Legs - speciesRestriction: [Moth, Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin] # Delta V - Felinid, Oni, Vulpkanin + markingCategory: Overlay + speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin] # Delta V - Felinid, Oni, Vulpkanin coloring: default: type: @@ -169,8 +169,8 @@ - type: marking id: GauzeUpperLegRight bodyPart: RLeg - markingCategory: Legs - speciesRestriction: [Moth, Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin] # Delta V - Felinid, Oni, Vulpkanin + markingCategory: Overlay + speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin] # Delta V - Felinid, Oni, Vulpkanin coloring: default: type: @@ -183,8 +183,8 @@ - type: marking id: GauzeLowerLegRight bodyPart: RFoot - markingCategory: Legs - speciesRestriction: [Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin] # Delta V - Felinid, Oni, Vulpkanin + markingCategory: Overlay + speciesRestriction: [Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin] # Delta V - Felinid, Oni, Vulpkanin coloring: default: type: @@ -197,8 +197,8 @@ - type: marking id: GauzeBoxerWrapRight bodyPart: RHand - markingCategory: Arms - speciesRestriction: [Moth, Dwarf, Human, Reptilian, Arachnid, SlimePerson, Felinid, Oni, Vulpkanin] # Delta V - Felinid, Oni, Vulpkanin + markingCategory: Overlay + speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, SlimePerson, Felinid, Oni, Vulpkanin] # Delta V - Felinid, Oni, Vulpkanin coloring: default: type: @@ -211,8 +211,8 @@ - type: marking id: GauzeBoxerWrapLeft bodyPart: LHand - markingCategory: Arms - speciesRestriction: [Moth, Dwarf, Human, Reptilian, Arachnid, SlimePerson, Felinid, Oni, Vulpkanin] # Delta V - Felinid, Oni, Vulpkanin + markingCategory: Overlay + speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, SlimePerson, Felinid, Oni, Vulpkanin] # Delta V - Felinid, Oni, Vulpkanin coloring: default: type: @@ -226,7 +226,7 @@ - type: marking id: GauzeLizardLefteyePatch bodyPart: Eyes - markingCategory: Head + markingCategory: Overlay speciesRestriction: [Reptilian] coloring: default: @@ -235,12 +235,12 @@ color: "#FFFFFF" sprites: - sprite: Mobs/Customization/gauze.rsi - state: gauze_lizardlefteye + state: gauze_lizard_lefteye - type: marking id: GauzeLizardRighteyePatch bodyPart: Eyes - markingCategory: Head + markingCategory: Overlay speciesRestriction: [Reptilian] coloring: default: @@ -249,12 +249,12 @@ color: "#FFFFFF" sprites: - sprite: Mobs/Customization/gauze.rsi - state: gauze_lizardrighteye + state: gauze_lizard_righteye - type: marking id: GauzeLizardFootRight bodyPart: RFoot - markingCategory: Legs + markingCategory: Overlay speciesRestriction: [Reptilian] coloring: default: @@ -263,12 +263,12 @@ color: "#FFFFFF" sprites: - sprite: Mobs/Customization/gauze.rsi - state: gauze_lizardfoot_r + state: gauze_lizard_foot_r - type: marking id: GauzeLizardFootLeft bodyPart: LFoot - markingCategory: Legs + markingCategory: Overlay speciesRestriction: [Reptilian] coloring: default: @@ -277,12 +277,12 @@ color: "#FFFFFF" sprites: - sprite: Mobs/Customization/gauze.rsi - state: gauze_lizardfoot_l + state: gauze_lizard_foot_l - type: marking id: GauzeLizardBlindfold bodyPart: Eyes - markingCategory: Head + markingCategory: Overlay speciesRestriction: [Reptilian] coloring: default: @@ -291,4 +291,187 @@ color: "#FFFFFF" sprites: - sprite: Mobs/Customization/gauze.rsi - state: gauze_lizardblindfold + state: gauze_lizard_blindfold + +# Moth Specific Markings +- type: marking + id: GauzeMothBlindfold + bodyPart: Eyes + markingCategory: Overlay + speciesRestriction: [Moth] + coloring: + default: + type: + !type:SimpleColoring + color: "#FFFFFF" + sprites: + - sprite: Mobs/Customization/gauze.rsi + state: gauze_moth_blindfold + +- type: marking + id: GauzeMothShoulder + bodyPart: Chest + markingCategory: Overlay + speciesRestriction: [Moth] + coloring: + default: + type: + !type:SimpleColoring + color: "#FFFFFF" + sprites: + - sprite: Mobs/Customization/gauze.rsi + state: gauze_moth_shoulder + +- type: marking + id: GauzeMothStomach + bodyPart: Chest + markingCategory: Overlay + speciesRestriction: [Moth] + coloring: + default: + type: + !type:SimpleColoring + color: "#FFFFFF" + sprites: + - sprite: Mobs/Customization/gauze.rsi + state: gauze_moth_abdomen + +- type: marking + id: GauzeMothLeftEyePatch + bodyPart: Eyes + markingCategory: Overlay + speciesRestriction: [Moth] + coloring: + default: + type: + !type:SimpleColoring + color: "#FFFFFF" + sprites: + - sprite: Mobs/Customization/gauze.rsi + state: gauze_moth_lefteye_2 + +- type: marking + id: GauzeMothLeftEyePad + bodyPart: Eyes + markingCategory: Overlay + speciesRestriction: [Moth] + coloring: + default: + type: + !type:SimpleColoring + color: "#FFFFFF" + sprites: + - sprite: Mobs/Customization/gauze.rsi + state: gauze_moth_lefteye_1 + +- type: marking + id: GauzeMothRightEyePatch + bodyPart: Eyes + markingCategory: Overlay + speciesRestriction: [Moth] + coloring: + default: + type: + !type:SimpleColoring + color: "#FFFFFF" + sprites: + - sprite: Mobs/Customization/gauze.rsi + state: gauze_moth_righteye_2 + +- type: marking + id: GauzeMothRightEyePad + bodyPart: Eyes + markingCategory: Overlay + speciesRestriction: [Moth] + coloring: + default: + type: + !type:SimpleColoring + color: "#FFFFFF" + sprites: + - sprite: Mobs/Customization/gauze.rsi + state: gauze_moth_righteye_1 + +- type: marking + id: GauzeMothUpperArmRight + bodyPart: RArm + markingCategory: Overlay + speciesRestriction: [Moth] + coloring: + default: + type: + !type:SimpleColoring + color: "#FFFFFF" + sprites: + - sprite: Mobs/Customization/gauze.rsi + state: gauze_moth_upperarm_r + +- type: marking + id: GauzeMothUpperArmLeft + bodyPart: LArm + markingCategory: Overlay + speciesRestriction: [Moth] + coloring: + default: + type: + !type:SimpleColoring + color: "#FFFFFF" + sprites: + - sprite: Mobs/Customization/gauze.rsi + state: gauze_moth_upperarm_l + +- type: marking + id: GauzeMothUpperLegRight + bodyPart: RLeg + markingCategory: Overlay + speciesRestriction: [Moth] + coloring: + default: + type: + !type:SimpleColoring + color: "#FFFFFF" + sprites: + - sprite: Mobs/Customization/gauze.rsi + state: gauze_moth_upperleg_r + +- type: marking + id: GauzeMothUpperLegLeft + bodyPart: LLeg + markingCategory: Overlay + speciesRestriction: [Moth] + coloring: + default: + type: + !type:SimpleColoring + color: "#FFFFFF" + sprites: + - sprite: Mobs/Customization/gauze.rsi + state: gauze_moth_upperleg_l + +- type: marking + id: GauzeMothLowerLegRight + bodyPart: RFoot + markingCategory: Overlay + speciesRestriction: [Moth] + coloring: + default: + type: + !type:SimpleColoring + color: "#FFFFFF" + sprites: + - sprite: Mobs/Customization/gauze.rsi + state: gauze_moth_lowerleg_r + +- type: marking + id: GauzeMothLowerLegLeft + bodyPart: LFoot + markingCategory: Overlay + speciesRestriction: [Moth] + coloring: + default: + type: + !type:SimpleColoring + color: "#FFFFFF" + sprites: + - sprite: Mobs/Customization/gauze.rsi + state: gauze_moth_lowerleg_l diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/reptilian.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/reptilian.yml index d1ed51013a2..b7d9266327d 100644 --- a/Resources/Prototypes/Entities/Mobs/Customization/Markings/reptilian.yml +++ b/Resources/Prototypes/Entities/Mobs/Customization/Markings/reptilian.yml @@ -184,6 +184,17 @@ - sprite: Mobs/Customization/reptilian_parts.rsi state: snout_sharp +- type: marking + id: LizardSnoutSplotch + bodyPart: Snout + markingCategory: Snout + speciesRestriction: [Reptilian] + sprites: + - sprite: Mobs/Customization/reptilian_parts.rsi + state: snout_splotch_primary + - sprite: Mobs/Customization/reptilian_parts.rsi + state: snout_splotch_secondary + - type: marking id: LizardChestTiger bodyPart: Chest diff --git a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml index a39510f6c47..18bdf93a502 100644 --- a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml +++ b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml @@ -231,7 +231,8 @@ - AllAccessBorg - type: AccessReader access: [["Command"], ["Research"]] - - type: ShowSecurityIcons + - type: ShowJobIcons + - type: ShowMindShieldIcons - type: entity id: BaseBorgChassisSyndicate diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index 6393bdc41a7..118dd6ede4d 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -914,9 +914,8 @@ maxVol: 250 - type: Udder reagentId: MilkGoat - targetSolution: udder - quantity: 25 - updateRate: 20 + quantityPerUpdate: 25 + growthDelay: 20 - type: Wooly - type: Food solution: wool diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/behonker.yml b/Resources/Prototypes/Entities/Mobs/NPCs/behonker.yml index bc63deeac36..8a10337c946 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/behonker.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/behonker.yml @@ -84,7 +84,7 @@ 500: Dead - type: Metabolizer solutionOnBody: false - updateFrequency: 0.25 + updateInterval: 0.25 metabolizerTypes: [ Dragon ] groups: - id: Medicine @@ -165,7 +165,6 @@ explosionMaxTileIntensity: 10 - type: ProjectileAnomaly projectilePrototype: ProjectileIcicle - targetNonSentientChance: 0.1 - type: TempAffectingAnomaly tempChangePerSecond: -25 hotspotExposeTemperature: -1000 diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/elemental.yml b/Resources/Prototypes/Entities/Mobs/NPCs/elemental.yml index 01fce382e37..c2380c40278 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/elemental.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/elemental.yml @@ -229,6 +229,7 @@ description: It consists of a liquid, and it wants to dissolve you in itself. components: - type: GhostRole + prob: 0 description: ghost-role-information-angry-slimes-description - type: NpcFactionMember factions: diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/miscellaneous.yml b/Resources/Prototypes/Entities/Mobs/NPCs/miscellaneous.yml index 633a4ff3cac..6fca4e6a63e 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/miscellaneous.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/miscellaneous.yml @@ -66,3 +66,98 @@ interactFailureString: petting-failure-generic interactSuccessSound: path: /Audio/Animals/lizard_happy.ogg + +- type: entity + id: MobTomatoKiller + parent: + - BaseSimpleMob + - MobDamageable + - MobBloodstream + - MobFlammable + - MobCombat + name: tomato killer + description: it seems today it's not you eating tomatoes, it's the tomatoes eating you. + components: + - type: Item + size: Huge + - type: NpcFactionMember + factions: + - SimpleHostile + - type: HTN + rootTask: + task: KillerTomatoCompound + - type: NPCImprintingOnSpawnBehaviour + whitelist: + components: + - HumanoidAppearance + - type: Sprite + sprite: Mobs/Demons/tomatokiller.rsi + noRot: true + layers: + - map: [ "enum.DamageStateVisualLayers.Base" ] + state: alive + - type: Bloodstream + bloodReagent: JuiceTomato + bloodMaxVolume: 50 + chemicalMaxVolume: 30 + - type: DamageStateVisuals + states: + Alive: + Base: alive + Dead: + Base: dead + - type: Butcherable + spawned: + - id: FoodMeatTomato + amount: 2 + - type: Destructible + thresholds: + - trigger: + !type:DamageTypeTrigger + damageType: Blunt + damage: 100 + behaviors: + - !type:GibBehavior { } + - type: MobThresholds + thresholds: + 0: Alive + 24: Dead + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeCircle + radius: 0.30 + density: 80 + mask: + - MobMask + layer: + - MobLayer + - type: MeleeWeapon + hidden: true + damage: + groups: + Brute: 4 + animation: WeaponArcBite + - type: Climbing + - type: NameIdentifier + group: GenericNumber + - type: SlowOnDamage + speedModifierThresholds: + 60: 0.7 + 80: 0.5 + - type: FootstepModifier + footstepSoundCollection: + path: /Audio/Effects/Footsteps/slime1.ogg + params: + volume: 3 + - type: Tag + tags: + - FootstepSound + - Fruit + - type: Extractable + grindableSolutionName: bloodstream + - type: PotencyVisuals + - type: Appearance + - type: Produce + seedId: killerTomato diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml b/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml index 42b7ff9e211..9a4d4ec3aae 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml @@ -60,8 +60,8 @@ - type: NameIdentifier group: GenericNumber - type: Repairable - fuelcost: 15 doAfterDelay: 8 + fuelCost: 15 - type: Pullable - type: Tag tags: @@ -115,11 +115,16 @@ description: Horrifying. components: - type: SpamEmitSound + minInterval: 2 + maxInterval: 12 sound: collection: BikeHorn - type: Sprite sprite: Mobs/Silicon/Bots/honkbot.rsi state: honkbot + - type: HTN + rootTask: + task: HonkbotCompound - type: Slippery launchForwardsMultiplier: 2 - type: Speech diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml b/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml index c64479369a6..2edcdaac851 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml @@ -86,7 +86,7 @@ methods: [ Touch ] effects: - !type:HealthChange - scaled: true + scaleByQuantity: true damage: types: Heat: 3 diff --git a/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml b/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml index 2d6274d0fab..8279214c3d2 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml @@ -83,8 +83,6 @@ followEntity: true - type: CargoOrderConsole - type: CrewMonitoringConsole - snap: false - precision: 3 - type: GeneralStationRecordConsole - type: DeviceNetwork deviceNetId: Wireless diff --git a/Resources/Prototypes/Entities/Mobs/Player/dragon.yml b/Resources/Prototypes/Entities/Mobs/Player/dragon.yml index 025b8d917c7..0eda8ae9d76 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/dragon.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/dragon.yml @@ -85,9 +85,13 @@ 0: Alive 450: Critical 500: Dead + - type: SlowOnDamage + speedModifierThresholds: + 250: 0.7 + 400: 0.5 - type: Metabolizer solutionOnBody: false - updateFrequency: 0.25 + updateInterval: 0.25 metabolizerTypes: [ Dragon ] groups: - id: Medicine @@ -132,8 +136,6 @@ id: MobDragon components: - type: Dragon - spawnsLeft: 2 - spawnsProto: MobCarpDragon spawnRiftAction: ActionSpawnRift - type: GenericAntag rule: Dragon diff --git a/Resources/Prototypes/Entities/Mobs/Player/guardian.yml b/Resources/Prototypes/Entities/Mobs/Player/guardian.yml index c7cd40988d4..ae4a370f9d1 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/guardian.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/guardian.yml @@ -66,7 +66,7 @@ mask: - FlyingMobMask layer: - - FlyingMobLayer + - Opaque - type: Damageable damageContainer: Biological - type: MobState @@ -86,6 +86,8 @@ animation: WeaponArcFist attackRate: 1.8 autoAttack: true + soundHit: + collection: Punch damage: types: Blunt: 20 @@ -227,6 +229,8 @@ angle: 30 animation: WeaponArcFist attackRate: 1.8 + soundHit: + collection: BikeHorn damage: types: Blunt: 5 diff --git a/Resources/Prototypes/Entities/Mobs/Species/diona.yml b/Resources/Prototypes/Entities/Mobs/Species/diona.yml index d99b796fc26..93a1ba2932a 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/diona.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/diona.yml @@ -47,7 +47,7 @@ methods: [ Touch ] effects: - !type:HealthChange - scaled: true + scaleByQuantity: true damage: types: Blunt: 2 @@ -62,7 +62,7 @@ methods: [ Touch ] effects: - !type:HealthChange - scaled: true + scaleByQuantity: true damage: types: Poison: 5 diff --git a/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml b/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml index 622c8710639..daca9543c70 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml @@ -51,6 +51,11 @@ accent: dwarf - type: Speech speechSounds: Bass + - type: HumanoidAppearance + species: Human + hideLayersOnEquip: + - Hair + - Snout - type: entity parent: BaseSpeciesDummy diff --git a/Resources/Prototypes/Entities/Mobs/Species/human.yml b/Resources/Prototypes/Entities/Mobs/Species/human.yml index 7bf96efe2cc..f1464c977ae 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/human.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/human.yml @@ -16,6 +16,11 @@ spawned: - id: FoodMeatHuman amount: 5 + - type: HumanoidAppearance + species: Human + hideLayersOnEquip: + - Hair + - Snout - type: PotentialPsionic #Nyano - Summary: makes potentially psionic. - type: entity diff --git a/Resources/Prototypes/Entities/Mobs/Species/slime.yml b/Resources/Prototypes/Entities/Mobs/Species/slime.yml index b2dbedb642d..e46f522d153 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/slime.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/slime.yml @@ -53,7 +53,7 @@ methods: [ Touch ] effects: - !type:HealthChange - scaled: true + scaleByQuantity: true damage: types: Heat: 2 diff --git a/Resources/Prototypes/Entities/Mobs/base.yml b/Resources/Prototypes/Entities/Mobs/base.yml index ac9aabbeadb..065d62c748d 100644 --- a/Resources/Prototypes/Entities/Mobs/base.yml +++ b/Resources/Prototypes/Entities/Mobs/base.yml @@ -60,6 +60,21 @@ damage: 400 behaviors: - !type:GibBehavior { } + - 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: RadiationReceiver - type: Stamina - type: MobState diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks-cartons.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks-cartons.yml index 84639c9af0f..aef0c5a8f5a 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks-cartons.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks-cartons.yml @@ -2,6 +2,7 @@ parent: DrinkBase id: DrinkCartonBaseFull abstract: true + suffix: Full components: - type: Openable sound: @@ -14,6 +15,9 @@ solutions: drink: maxVol: 50 + - type: PressurizedSolution + solution: drink + - type: Shakeable - type: Sprite state: icon - type: Item diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml index 4dbfa464a50..b9c0ba6e9d6 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml @@ -10,6 +10,8 @@ solutions: drink: maxVol: 30 + - type: MixableSolution + solution: drink - type: SolutionTransfer canChangeTransferAmount: true - type: Drink diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_bottles.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_bottles.yml index b6455735cc1..73b1e06f9bb 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_bottles.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_bottles.yml @@ -3,6 +3,7 @@ parent: DrinkBase id: DrinkBottlePlasticBaseFull abstract: true + suffix: Full components: - type: Tag tags: @@ -38,6 +39,9 @@ - type: PhysicalComposition materialComposition: Plastic: 100 + - type: PressurizedSolution + solution: drink + - type: Shakeable - type: entity parent: DrinkBottlePlasticBaseFull @@ -744,7 +748,7 @@ parent: DrinkBottlePlasticBaseFull id: DrinkSugarJug name: sugar jug - suffix: for drinks + suffix: For Drinks, Full description: some people put this in their coffee... components: - type: SolutionContainerManager diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cans.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cans.yml index 585e5ed14d9..ca67e51792e 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cans.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cans.yml @@ -6,7 +6,7 @@ components: - type: Drink - type: Openable - - type: PressurizedDrink + - type: Shakeable - type: SolutionContainerManager solutions: drink: @@ -14,6 +14,8 @@ - ReagentId: Cola Quantity: 30 maxVol: 30 + - type: MixableSolution + solution: drink - type: SolutionTransfer canChangeTransferAmount: true maxTransferAmount: 15 @@ -34,6 +36,8 @@ solution: drink - type: DrainableSolution solution: drink + - type: PressurizedSolution + solution: drink - type: Appearance - type: GenericVisualizer visuals: diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cups.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cups.yml index 4fc2e170d5b..9e2322019ea 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cups.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cups.yml @@ -10,7 +10,8 @@ solutions: drink: maxVol: 20 - canMix: true + - type: MixableSolution + solution: drink - type: FitsInDispenser solution: drink - type: DrawableSolution diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_fun.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_fun.yml index 2fd2331f91e..ef6208b69d4 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_fun.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_fun.yml @@ -146,6 +146,9 @@ - type: RandomFillSolution solution: drink weightedRandomId: RandomFillMopwata + - type: PressurizedSolution + solution: drink + - type: Shakeable - type: Appearance - type: GenericVisualizer visuals: diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_special.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_special.yml index c80398e3496..829d68279d4 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_special.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_special.yml @@ -8,7 +8,10 @@ solutions: drink: maxVol: 100 + - type: MixableSolution + solution: drink - type: Drink + - type: Shakeable # Doesn't do anything, but I mean... - type: FitsInDispenser solution: drink - type: DrawableSolution diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/trash_drinks.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/trash_drinks.yml index 86bc34f3c8b..67154963d1f 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/trash_drinks.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/trash_drinks.yml @@ -5,6 +5,7 @@ parent: BaseItem abstract: true description: An empty bottle. + suffix: Empty components: - type: Sprite state: icon @@ -24,6 +25,8 @@ damage: types: Blunt: 0 + - type: MixableSolution + solution: drink - type: Spillable solution: drink - type: FitsInDispenser @@ -93,6 +96,7 @@ parent: BaseItem abstract: true description: An empty carton. + suffix: Empty components: - type: Sprite state: icon @@ -100,6 +104,8 @@ solutions: drink: maxVol: 50 + - type: MixableSolution + solution: drink - type: SolutionTransfer canChangeTransferAmount: true maxTransferAmount: 5 diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/cake.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/cake.yml index 07d07e370be..71b38959ce3 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/cake.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/cake.yml @@ -711,7 +711,7 @@ state: suppermatter - type: SliceableFood slice: FoodCakeSuppermatterSlice - TotalCount: 8 + count: 8 - type: SolutionContainerManager solutions: food: diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/bowl.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/bowl.yml index 45953296351..70303cfdff4 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/bowl.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/bowl.yml @@ -19,6 +19,8 @@ - map: ["enum.SolutionContainerLayers.Fill"] state: fill-1 visible: false + - type: MixableSolution + solution: food - type: DamageOnLand damage: types: diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/condiments.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/condiments.yml index 58fe2a34154..bbe5cf244b2 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/condiments.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/condiments.yml @@ -32,7 +32,6 @@ size: Tiny - type: Drink solution: food - refillable: false - type: Openable sound: collection: packetOpenSounds @@ -523,7 +522,7 @@ # Shakers - type: entity - parent: BaseFoodCondimentBottle + parent: BaseFoodCondiment id: BaseFoodShaker abstract: true name: empty shaker @@ -561,6 +560,8 @@ acts: [ "Destruction" ] - type: Sprite state: shaker-empty + - type: RefillableSolution + solution: food - type: entity parent: BaseFoodShaker diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/produce.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/produce.yml index 3f0277e1bc3..302c0d98b66 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/produce.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/produce.yml @@ -1133,9 +1133,9 @@ Quantity: 1 - type: entity - name: chili + name: chili pepper parent: FoodProduceBase - id: FoodChili + id: FoodChiliPepper description: Spicy, best not touch your eyes. components: - type: FlavorProfile @@ -1163,7 +1163,7 @@ - type: entity name: chilly pepper parent: FoodProduceBase - id: FoodChilly + id: FoodChillyPepper description: Icy hot. components: - type: FlavorProfile diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Smokeables/Vapes/vape.yml b/Resources/Prototypes/Entities/Objects/Consumable/Smokeables/Vapes/vape.yml index 374a396a5a6..0049c389b5b 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Smokeables/Vapes/vape.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Smokeables/Vapes/vape.yml @@ -6,5 +6,5 @@ description: "Like a cigar, but for tough teens. (WARNING:Pour only water into the vape)" components: - type: Sprite - sprite: Objects/Consumable/Smokeables/Vapes/vape-standart.rsi + sprite: Objects/Consumable/Smokeables/Vapes/vape-standard.rsi state: icon diff --git a/Resources/Prototypes/Entities/Objects/Decoration/ashtray.yml b/Resources/Prototypes/Entities/Objects/Decoration/ashtray.yml index e4cd6ba0dea..61554d0621b 100644 --- a/Resources/Prototypes/Entities/Objects/Decoration/ashtray.yml +++ b/Resources/Prototypes/Entities/Objects/Decoration/ashtray.yml @@ -17,6 +17,8 @@ whitelist: tags: - Burnt + - Cigarette + - Cigar maxItemSize: Tiny grid: - 0,0,9,0 diff --git a/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml b/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml index 1fcd85562b2..377ffb16a5c 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml @@ -277,27 +277,6 @@ recipes: - ArtifactAnalyzerMachineCircuitboard -- type: entity - id: TraversalDistorterMachineCircuitboard - parent: BaseMachineCircuitboard - name: traversal distorter machine board - description: A machine printed circuit board for a traversal distorter. - components: - - type: Sprite - state: science - - type: MachineBoard - prototype: MachineTraversalDistorter - requirements: - Manipulator: 1 - Capacitor: 2 - materialRequirements: - Steel: 5 - Cable: 1 - - type: ReverseEngineering # Nyano - difficulty: 2 - recipes: - - TraversalDistorterMachineCircuitboard - - type: entity id: ArtifactCrusherMachineCircuitboard parent: BaseMachineCircuitboard @@ -1517,4 +1496,18 @@ MatterBin: 1 Manipulator: 3 materialRequirements: - Glass: 1 \ No newline at end of file + Glass: 1 + +- type: entity + parent: BaseMachineCircuitboard + id: JukeboxCircuitBoard + name: jukebox machine board + description: A machine printed circuit board for a jukebox. + components: + - type: MachineBoard + prototype: Jukebox + materialRequirements: + WoodPlank: 5 + Steel: 2 + Glass: 5 + Cable: 2 diff --git a/Resources/Prototypes/Entities/Objects/Devices/Electronics/door.yml b/Resources/Prototypes/Entities/Objects/Devices/Electronics/door.yml index f520c2d4bd1..380525bdd18 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/Electronics/door.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/Electronics/door.yml @@ -21,7 +21,7 @@ key: enum.DoorElectronicsConfigurationUiKey.Key allowedItems: tags: - - Multitool + - DoorElectronicsConfigurator - type: UserInterface interfaces: - key: enum.DoorElectronicsConfigurationUiKey.Key diff --git a/Resources/Prototypes/Entities/Objects/Devices/Electronics/door_access.yml b/Resources/Prototypes/Entities/Objects/Devices/Electronics/door_access.yml index e3944296ea7..495d91cd2df 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/Electronics/door_access.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/Electronics/door_access.yml @@ -1,51 +1,44 @@ - +# Command - type: entity parent: DoorElectronics - id: DoorElectronicsService - suffix: Service, Locked - components: - - type: AccessReader - access: [["Service"]] - -- type: entity - parent: DoorElectronics - id: DoorElectronicsTheatre - suffix: Theatre, Locked + id: DoorElectronicsCaptain + suffix: Captain, Locked components: - type: AccessReader - access: [["Theatre"]] + access: [["Captain"]] - type: entity parent: DoorElectronics - id: DoorElectronicsChapel - suffix: Chapel, Locked + id: DoorElectronicsHeadOfPersonnel + suffix: HeadOfPersonnel, Locked components: - type: AccessReader - access: [["Chapel"]] + access: [["HeadOfPersonnel"]] - type: entity parent: DoorElectronics - id: DoorElectronicsJanitor - suffix: Janitor, Locked + id: DoorElectronicsCommand + suffix: Command, Locked components: - type: AccessReader - access: [["Janitor"]] + access: [["Command"]] +# Service - type: entity parent: DoorElectronics - id: DoorElectronicsKitchen - suffix: Kitchen, Locked + id: DoorElectronicsBar + suffix: Bar, Locked components: - type: AccessReader - access: [["Kitchen"]] + access: [["Bar"]] - type: entity parent: DoorElectronics - id: DoorElectronicsBar + id: DoorElectronicsBarKitchen suffix: Bar, Locked components: - type: AccessReader - access: [["Bar"]] + access: [["Bar"], ["Kitchen"]] - type: entity parent: DoorElectronics @@ -57,132 +50,136 @@ - type: entity parent: DoorElectronics - id: DoorElectronicsLawyer - suffix: Lawyer, Locked + id: DoorElectronicsChapel + suffix: Chapel, Locked components: - type: AccessReader - access: [["Lawyer"]] + access: [["Chapel"]] - type: entity parent: DoorElectronics - id: DoorElectronicsCaptain - suffix: Captain, Locked + id: DoorElectronicsTheatre + suffix: Theatre, Locked components: - type: AccessReader - access: [["Captain"]] + access: [["Theatre"]] - type: entity parent: DoorElectronics - id: DoorElectronicsExternal - suffix: External, Locked + id: DoorElectronicsKitchen + suffix: Kitchen, Locked components: - type: AccessReader - access: [["External"]] + access: [["Kitchen"]] - type: entity parent: DoorElectronics - id: DoorElectronicsCargo - suffix: Cargo, Locked + id: DoorElectronicsKitchenHydroponics + suffix: Kitchen/Hydroponics, Locked components: - type: AccessReader - access: [["Cargo"]] + access: [["Kitchen"], ["Hydroponics"]] - type: entity parent: DoorElectronics - id: DoorElectronicsEngineering - suffix: Engineering, Locked + id: DoorElectronicsJanitor + suffix: Janitor, Locked components: - type: AccessReader - access: [["Engineering"]] + access: [["Janitor"]] - type: entity parent: DoorElectronics - id: DoorElectronicsAtmospherics - suffix: Atmospherics, Locked + id: DoorElectronicsLawyer + suffix: Lawyer, Locked components: - type: AccessReader - access: [["Atmospherics"]] + access: [["Lawyer"]] - type: entity parent: DoorElectronics - id: DoorElectronicsFreezer - suffix: Freezer, Locked + id: DoorElectronicsService + suffix: Service, Locked components: - type: AccessReader - access: [["Kitchen"], ["Hydroponics"]] + access: [["Service"]] +# Cargo - type: entity parent: DoorElectronics - id: DoorElectronicsSalvage - suffix: Salvage, Locked + id: DoorElectronicsQuartermaster + suffix: Quartermaster, Locked components: - type: AccessReader - access: [["Salvage"]] + access: [["Quartermaster"]] - type: entity parent: DoorElectronics - id: DoorElectronicsMedical - suffix: Medical, Locked + id: DoorElectronicsSalvage + suffix: Salvage, Locked components: - type: AccessReader - access: [["Medical"]] + access: [["Salvage"]] - type: entity parent: DoorElectronics - id: DoorElectronicsChemistry - suffix: Chemistry, Locked + id: DoorElectronicsCargo + suffix: Cargo, Locked components: - type: AccessReader - access: [["Chemistry"]] + access: [["Cargo"]] +# Engineering - type: entity parent: DoorElectronics - id: DoorElectronicsResearch - suffix: Research, Locked + id: DoorElectronicsChiefEngineer + suffix: ChiefEngineer, Locked components: - type: AccessReader - access: [["Research"]] + access: [["ChiefEngineer"]] - type: entity parent: DoorElectronics - id: DoorElectronicsScience - suffix: Science, Locked + id: DoorElectronicsAtmospherics + suffix: Atmospherics, Locked components: - type: AccessReader - access: [["Research"], ["Medical"]] + access: [["Atmospherics"]] - type: entity parent: DoorElectronics - id: DoorElectronicsCommand - suffix: Command, Locked + id: DoorElectronicsEngineering + suffix: Engineering, Locked components: - type: AccessReader - access: [["Command"]] + access: [["Engineering"]] +# Science - type: entity parent: DoorElectronics - id: DoorElectronicsCentralCommand - suffix: CentralCommand, Locked + id: DoorElectronicsResearchDirector + suffix: ResearchDirector, Locked components: - type: AccessReader - access: [["CentralCommand"]] + access: [["ResearchDirector"]] - type: entity parent: DoorElectronics - id: DoorElectronicsChiefMedicalOfficer - suffix: ChiefMedicalOfficer, Locked + id: DoorElectronicsMedicalResearch + suffix: Medical/Science, Locked components: - type: AccessReader - access: [["ChiefMedicalOfficer"]] + access: [["Research"], ["Medical"]] - type: entity parent: DoorElectronics - id: DoorElectronicsChiefEngineer - suffix: ChiefEngineer, Locked + id: DoorElectronicsResearch + suffix: Research, Locked components: - type: AccessReader - access: [["ChiefEngineer"]] + access: [["Research"]] +# Security - type: entity parent: DoorElectronics id: DoorElectronicsHeadOfSecurity @@ -193,27 +190,19 @@ - type: entity parent: DoorElectronics - id: DoorElectronicsResearchDirector - suffix: ResearchDirector, Locked - components: - - type: AccessReader - access: [["ResearchDirector"]] - -- type: entity - parent: DoorElectronics - id: DoorElectronicsHeadOfPersonnel - suffix: HeadOfPersonnel, Locked + id: DoorElectronicsArmory + suffix: Armory, Locked components: - type: AccessReader - access: [["HeadOfPersonnel"]] + access: [["Armory"]] - type: entity parent: DoorElectronics - id: DoorElectronicsQuartermaster - suffix: Quartermaster, Locked + id: DoorElectronicsDetective + suffix: Detective, Locked components: - type: AccessReader - access: [["Quartermaster"]] + access: [["Detective"]] - type: entity parent: DoorElectronics @@ -231,14 +220,6 @@ - type: AccessReader access: [["Security"], ["Lawyer"]] -- type: entity - parent: DoorElectronics - id: DoorElectronicsDetective - suffix: Detective, Locked - components: - - type: AccessReader - access: [["Detective"]] - #- type: entity # parent: DoorElectronics # id: DoorElectronicsBrig @@ -247,29 +228,39 @@ # - type: AccessReader # access: [["Brig"]] +# Medical - type: entity parent: DoorElectronics - id: DoorElectronicsArmory - suffix: Armory, Locked + id: DoorElectronicsChiefMedicalOfficer + suffix: ChiefMedicalOfficer, Locked components: - type: AccessReader - access: [["Armory"]] + access: [["ChiefMedicalOfficer"]] - type: entity parent: DoorElectronics - id: DoorElectronicsVault - suffix: Vault, Locked + id: DoorElectronicsChemistry + suffix: Chemistry, Locked components: - type: AccessReader - access: [["Security"], ["Command"]] + access: [["Chemistry"]] - type: entity parent: DoorElectronics - id: DoorElectronicsMaintenance - suffix: Maintenance, Locked + id: DoorElectronicsMedical + suffix: Medical, Locked components: - type: AccessReader - access: [["Maintenance"]] + access: [["Medical"]] + +# Syndicate +- type: entity + parent: DoorElectronics + id: DoorElectronicsNukeop + suffix: Nukeop, Locked + components: + - type: AccessReader + access: [["NuclearOperative"]] - type: entity parent: DoorElectronics @@ -279,18 +270,35 @@ - type: AccessReader access: [["SyndicateAgent"]] +# Misc - type: entity parent: DoorElectronics - id: DoorElectronicsNukeop - suffix: Nukeop, Locked + id: DoorElectronicsCentralCommand + suffix: CentralCommand, Locked components: - type: AccessReader - access: [["NuclearOperative"]] + access: [["CentralCommand"]] - type: entity parent: DoorElectronics - id: DoorElectronicsRnDMed - suffix: Medical/Science, Locked + id: DoorElectronicsExternal + suffix: External, Locked components: - type: AccessReader - access: [["Research"], ["Medical"]] + access: [["External"]] + +- type: entity + parent: DoorElectronics + id: DoorElectronicsMaintenance + suffix: Maintenance, Locked + components: + - type: AccessReader + access: [["Maintenance"]] + +- type: entity + parent: DoorElectronics + id: DoorElectronicsVault + suffix: Vault, Locked + components: + - type: AccessReader + access: [["Security"], ["Command"]] diff --git a/Resources/Prototypes/Entities/Objects/Devices/Electronics/signaller.yml b/Resources/Prototypes/Entities/Objects/Devices/Electronics/signaller.yml index aa889341b1b..db4406905a6 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/Electronics/signaller.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/Electronics/signaller.yml @@ -32,7 +32,13 @@ description: A handheld device used for remotely sending signals to objects within a small radius of about 50 meters. components: - type: Sprite - state: signaller2 + state: advanced + - type: Item + inhandVisuals: + left: + - state: advanced-inhand-left + right: + - state: advanced-inhand-right - type: WirelessNetworkConnection range: 50 - type: StaticPrice diff --git a/Resources/Prototypes/Entities/Objects/Devices/Syndicate_Gadgets/singularity_beacon.yml b/Resources/Prototypes/Entities/Objects/Devices/Syndicate_Gadgets/singularity_beacon.yml index 372b6891130..b2f159f4636 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/Syndicate_Gadgets/singularity_beacon.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/Syndicate_Gadgets/singularity_beacon.yml @@ -35,6 +35,5 @@ acts: [ "Destruction" ] - type: ApcPowerReceiver powerLoad: 15000 - priority: High - type: StaticPrice price: 1500 diff --git a/Resources/Prototypes/Entities/Objects/Devices/cartridges.yml b/Resources/Prototypes/Entities/Objects/Devices/cartridges.yml index e523bbe16ec..0563826a570 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/cartridges.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/cartridges.yml @@ -90,5 +90,6 @@ sprite: Structures/Doors/Airlocks/Standard/security.rsi state: closed - type: LogProbeCartridge + - type: GuideHelp guides: - Forensics diff --git a/Resources/Prototypes/Entities/Objects/Devices/chameleon_projector.yml b/Resources/Prototypes/Entities/Objects/Devices/chameleon_projector.yml new file mode 100644 index 00000000000..e0212810210 --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Devices/chameleon_projector.yml @@ -0,0 +1,71 @@ +- type: entity + parent: BaseItem + id: ChameleonProjector + name: chameleon projector + description: Holoparasite technology used to create a hard-light replica of any object around you. Disguise is destroyed when picked up or deactivated. + components: + - type: Sprite + sprite: /Textures/Objects/Devices/chameleon_projector.rsi + state: icon + - type: ChameleonProjector + whitelist: + components: + - Anchorable + - Item + blacklist: + components: + - ChameleonDisguise # no becoming kleiner + - InsideEntityStorage # no clark kent going in phone booth and becoming superman + - MindContainer # no + - Pda # PDAs currently make you invisible /!\ + polymorph: + entity: ChameleonDisguise + +- type: entity + noSpawn: true + parent: BaseMob + id: ChameleonDisguise + name: Urist McKleiner + components: + # this and the name/desc get replaced, this is just placeholder incase something goes wrong + - type: Sprite + sprite: /Textures/Mobs/Species/Human/parts.rsi + state: full + # so people can attempt to pick it up + - type: Item + # so it can take damage + # projector system sets health to be proportional to mass + - type: Damageable + - type: MobState + - type: MobThresholds + thresholds: + 0: Alive + 1: Critical + 200: Dead + - type: MovementSpeedModifier + baseWalkSpeed: 1 # precise movement for the perfect spot + baseSprintSpeed: 5 # the jig is up + - type: ChameleonDisguise + +# actions +- type: entity + noSpawn: true + id: ActionDisguiseNoRot + name: Toggle Rotation + description: Use this to prevent your disguise from rotating, making it easier to hide in some scenarios. + components: + - type: InstantAction + icon: Interface/VerbIcons/refresh.svg.192dpi.png + event: !type:DisguiseToggleNoRotEvent + +- type: entity + noSpawn: true + id: ActionDisguiseAnchor + name: Toggle Anchored + description: For many objects you will want to be anchored to not be completely obvious. + components: + - type: InstantAction + icon: + sprite: Objects/Tools/wrench.rsi + state: icon + event: !type:DisguiseToggleAnchoredEvent diff --git a/Resources/Prototypes/Entities/Objects/Devices/payload.yml b/Resources/Prototypes/Entities/Objects/Devices/payload.yml index 019f19e7118..160f0c58e79 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/payload.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/payload.yml @@ -33,7 +33,6 @@ maxIntensity: 10 intensitySlope: 3 totalIntensity: 120 # about a ~4 tile radius - flashRange: 7 - type: ExplodeOnTrigger - type: Destructible thresholds: diff --git a/Resources/Prototypes/Entities/Objects/Fun/figurines.yml b/Resources/Prototypes/Entities/Objects/Fun/figurines.yml index 6a5d3c36f55..d8932bc0e5d 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/figurines.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/figurines.yml @@ -322,7 +322,7 @@ parent: BaseFigurine id: ToyFigurineNukieElite name: elite syndicate operative figure - description: A figurine depicting someone in an elite blood-red hardsuit, similar to what the medic of a nuclear operative team might wear. + description: A figurine depicting someone in an elite blood-red hardsuit, similar to what someone on a nuclear operative team might wear. components: - type: Sprite state: nukie_elite diff --git a/Resources/Prototypes/Entities/Objects/Fun/immovable_rod.yml b/Resources/Prototypes/Entities/Objects/Fun/immovable_rod.yml index f46abe8a5af..e52f66d39b1 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/immovable_rod.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/immovable_rod.yml @@ -11,8 +11,6 @@ state: icon noRot: false - type: ImmovableRod - - type: TimedDespawn - lifetime: 30.0 - type: Physics bodyType: Dynamic linearDamping: 0 @@ -36,8 +34,16 @@ location: immovable rod - type: entity + id: ImmovableRodDespawn + suffix: Despawn parent: ImmovableRod + components: + - type: TimedDespawn + lifetime: 30.0 + +- type: entity id: ImmovableRodSlow + parent: ImmovableRodDespawn suffix: Slow components: - type: ImmovableRod @@ -45,7 +51,7 @@ maxSpeed: 5 - type: entity - parent: ImmovableRod + parent: ImmovableRodDespawn id: ImmovableRodKeepTiles suffix: Keep Tiles components: @@ -53,6 +59,33 @@ destroyTiles: false hitSoundProbability: 1.0 +# For Wizard Polymorph +- type: entity + parent: ImmovableRod + id: ImmovableRodWizard + suffix: Wizard + components: + - type: ImmovableRod + minSpeed: 35 + destroyTiles: false + randomizeVelocity: false + shouldGib: false + damage: + types: + Blunt: 200 + - type: MovementIgnoreGravity + gravityState: true + - type: InputMover + - type: MovementSpeedModifier + weightlessAcceleration: 5 + weightlessModifier: 2 + weightlessFriction: 0 + friction: 0 + frictionNoInput: 0 + - type: CanMoveInAir + - type: MovementAlwaysTouching + - type: NoSlip + - type: entity parent: ImmovableRodKeepTiles id: ImmovableRodKeepTilesStill diff --git a/Resources/Prototypes/Entities/Objects/Fun/toys.yml b/Resources/Prototypes/Entities/Objects/Fun/toys.yml index 901b52b21b1..6341316ecfa 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/toys.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/toys.yml @@ -1184,7 +1184,6 @@ description: New Sandy-Cat plastic sword! Comes with realistic sound and full color! Looks almost like the real thing! components: - type: EnergySword - isSharp: false colorOptions: - DodgerBlue - type: ItemToggle @@ -1318,9 +1317,7 @@ components: - type: Sprite sprite: Objects/Fun/rubber_hammer.rsi - layers: - - state: icon - shader: unshaded + state: icon - type: WeaponRandom damageBonus: types: diff --git a/Resources/Prototypes/Entities/Objects/Materials/shards.yml b/Resources/Prototypes/Entities/Objects/Materials/shards.yml index 621a3b1c389..834a2e7ff0a 100644 --- a/Resources/Prototypes/Entities/Objects/Materials/shards.yml +++ b/Resources/Prototypes/Entities/Objects/Materials/shards.yml @@ -17,7 +17,7 @@ shard2: "" shard3: "" - type: MeleeWeapon - attackRate: 1.5 + attackRate: 1 damage: types: Slash: 3.5 @@ -91,7 +91,7 @@ - type: DamageUserOnTrigger damage: types: - Piercing: 5 + Piercing: 4.5 - type: Tag tags: - GlassShard @@ -116,6 +116,10 @@ components: - type: Sprite color: "#96cdef" + - type: MeleeWeapon + damage: + types: + Slash: 4.5 - type: WelderRefinable refineResult: - SheetGlass1 @@ -123,7 +127,7 @@ - type: DamageUserOnTrigger damage: types: - Piercing: 5 + Piercing: 5.5 - type: Tag tags: - ReinforcedGlassShard @@ -148,6 +152,10 @@ components: - type: Sprite color: "#FF72E7" + - type: MeleeWeapon + damage: + types: + Slash: 5.5 - type: WelderRefinable refineResult: - SheetGlass1 @@ -155,7 +163,7 @@ - type: DamageUserOnTrigger damage: types: - Piercing: 5 + Piercing: 6.5 - type: Tag tags: - PlasmaGlassShard @@ -182,6 +190,11 @@ components: - type: Sprite color: "#8eff7a" + - type: MeleeWeapon + damage: + types: + Slash: 4.5 + Radiation: 2 - type: WelderRefinable refineResult: - SheetGlass1 @@ -189,8 +202,8 @@ - type: DamageUserOnTrigger damage: types: - Piercing: 3 - Radiation: 2 + Piercing: 5 + Radiation: 2.5 - type: Tag tags: - UraniumGlassShard diff --git a/Resources/Prototypes/Entities/Objects/Misc/desk_bell.yml b/Resources/Prototypes/Entities/Objects/Misc/desk_bell.yml index 1fe3b8a271c..f170aa899e6 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/desk_bell.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/desk_bell.yml @@ -14,9 +14,9 @@ successChance: 1 interactSuccessSound: collection: DeskBell - params: - variation: 0.03 - volume: 3 + params: + variation: 0.03 + volume: 3 onActivate: true - type: EmitSoundOnUse sound: diff --git a/Resources/Prototypes/Entities/Objects/Misc/ice_crust.yml b/Resources/Prototypes/Entities/Objects/Misc/ice_crust.yml index bc3488aaf43..43c4568e70a 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/ice_crust.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/ice_crust.yml @@ -48,6 +48,5 @@ types: Heat: 5 coldDamage: {} - ColdDamageThreshold: 0 + coldDamageThreshold: 0 - type: FrictionContacts - \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Objects/Misc/kudzu.yml b/Resources/Prototypes/Entities/Objects/Misc/kudzu.yml index 657201912e8..a1005004946 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/kudzu.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/kudzu.yml @@ -58,11 +58,9 @@ types: Heat: 5 coldDamage: {} - ColdDamageThreshold: 0 + coldDamageThreshold: 0 - type: Flammable fireSpread: true #If you walk into incredibly dense, flaming vines, you can expect to burn. - cold: - types: {} damage: types: Heat: 3 @@ -75,11 +73,12 @@ methods: [Touch] effects: - !type:HealthChange - scaled: true + scaleByQuantity: true damage: types: Heat: 10 - type: AtmosExposed + - type: Kudzu growthTickChance: 0.3 spreadChance: 0.4 - type: SpeedModifierContacts @@ -235,7 +234,6 @@ damage: types: Heat: 3 - growthTickChance: 0.3 - type: AtmosExposed - type: SpeedModifierContacts walkSpeedModifier: 0.3 diff --git a/Resources/Prototypes/Entities/Objects/Misc/paper.yml b/Resources/Prototypes/Entities/Objects/Misc/paper.yml index 58457ebb7fa..0c52b2381cd 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/paper.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/paper.yml @@ -15,6 +15,7 @@ map: ["enum.PaperVisualLayers.Stamp"] visible: false - type: Paper + - type: PaperLabelType - type: ActivatableUI key: enum.PaperUiKey.Key closeOnHandDeselect: false @@ -143,6 +144,8 @@ - state: paper_stamp-generic map: ["enum.PaperVisualLayers.Stamp"] visible: false + - type: PaperLabelType + paperType: CaptainsPaper - type: PaperVisuals headerImagePath: "/Textures/Interface/Paper/paper_heading_captains_thoughts.svg.96dpi.png" backgroundImagePath: "/Textures/Interface/Paper/paper_background_default.svg.96dpi.png" @@ -160,19 +163,21 @@ sprite: Objects/Misc/bureaucracy.rsi layers: - state: paper - color: "#f7e574" + color: "#9ef5ff" - state: paper_words map: ["enum.PaperVisualLayers.Writing"] - color: "#f7e574" + color: "#9ef5ff" visible: false - state: paper_stamp-generic map: ["enum.PaperVisualLayers.Stamp"] visible: false + - type: PaperLabelType + paperType: Invoice - type: PaperVisuals backgroundImagePath: "/Textures/Interface/Paper/paper_background_default.svg.96dpi.png" contentImagePath: "/Textures/Interface/Paper/paper_content_lined.svg.96dpi.png" - backgroundModulate: "#f7e574" - contentImageModulate: "#f7e574" + backgroundModulate: "#9ef5ff" + contentImageModulate: "#9ef5ff" backgroundPatchMargin: 16.0, 16.0, 16.0, 16.0 contentMargin: 16.0, 16.0, 16.0, 16.0 headerImagePath: "/Textures/Interface/Paper/paper_heading_cargo_invoice.svg.96dpi.png" @@ -184,6 +189,29 @@ name: bounty manifest description: A paper label designating a crate as containing a bounty. Selling a crate with this label will fulfill the bounty. components: + - type: Sprite + sprite: Objects/Misc/bureaucracy.rsi + layers: + - state: paper + color: "#f7e574" + - state: paper_words + map: ["enum.PaperVisualLayers.Writing"] + color: "#f7e574" + visible: false + - state: paper_stamp-generic + map: ["enum.PaperVisualLayers.Stamp"] + visible: false + - type: PaperLabelType + paperType: Bounty + - type: PaperVisuals + backgroundImagePath: "/Textures/Interface/Paper/paper_background_default.svg.96dpi.png" + contentImagePath: "/Textures/Interface/Paper/paper_content_lined.svg.96dpi.png" + backgroundModulate: "#f7e574" + contentImageModulate: "#f7e574" + backgroundPatchMargin: 16.0, 16.0, 16.0, 16.0 + contentMargin: 16.0, 16.0, 16.0, 16.0 + headerImagePath: "/Textures/Interface/Paper/paper_heading_cargo_invoice.svg.96dpi.png" + headerMargin: 0.0, 12.0, 0.0, 0.0 - type: CargoBountyLabel - type: StaticPrice price: 0 @@ -323,6 +351,8 @@ damage: types: Piercing: 15 + soundHit: + path: /Audio/Weapons/bladeslice.ogg - type: Tool qualities: - Screwing diff --git a/Resources/Prototypes/Entities/Objects/Misc/pet_carrier.yml b/Resources/Prototypes/Entities/Objects/Misc/pet_carrier.yml index 84c9c7c7520..b7f296cbac7 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/pet_carrier.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/pet_carrier.yml @@ -30,7 +30,7 @@ radius: 0.45 density: 25 mask: - - SmallMobMask + - ItemMask layer: - MachineLayer - type: EntityStorage diff --git a/Resources/Prototypes/Entities/Objects/Misc/spider_web.yml b/Resources/Prototypes/Entities/Objects/Misc/spider_web.yml index e1f4d086d45..9561fa3538f 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/spider_web.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/spider_web.yml @@ -59,11 +59,9 @@ types: Heat: 5 coldDamage: {} - ColdDamageThreshold: 0 + coldDamageThreshold: 0 - type: Flammable fireSpread: true - cold: - types: {} damage: types: Heat: 5 @@ -146,11 +144,9 @@ types: Heat: 5 coldDamage: {} - ColdDamageThreshold: 0 + coldDamageThreshold: 0 - type: Flammable fireSpread: true - cold: - types: {} damage: types: Heat: 5 diff --git a/Resources/Prototypes/Entities/Objects/Misc/subdermal_implants.yml b/Resources/Prototypes/Entities/Objects/Misc/subdermal_implants.yml index dcdb316b7ec..2336945f171 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/subdermal_implants.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/subdermal_implants.yml @@ -189,7 +189,6 @@ implantAction: ActionActivateScramImplant - type: TriggerImplantAction - type: ScramImplant - teleportAttempts: 10 # small amount of risk of being teleported into space and lets you teleport off shuttles - type: entity parent: BaseSubdermalImplant diff --git a/Resources/Prototypes/Entities/Objects/Specific/Cargo/cargo_pallet.yml b/Resources/Prototypes/Entities/Objects/Specific/Cargo/cargo_pallet.yml index c628d199a90..07bdee63cfc 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Cargo/cargo_pallet.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Cargo/cargo_pallet.yml @@ -1,7 +1,7 @@ - type: entity id: CargoPallet name: cargo pallet - description: Designates valid items to sell to CentCom when a shuttle is recalled. + description: Common fixture of logistics and cargo. Subtle reminder where crates go during transport to avoid bruised shins. parent: BaseStructure components: - type: InteractionOutline @@ -58,17 +58,20 @@ - type: entity id: CargoPalletSell name: cargo selling pallet - description: Designates valid items to sell with a selling computer, or to CentCom when a shuttle is recalled. + description: Designates valid items to sell. parent: CargoPallet components: - type: CargoPallet palletType: sell - type: Sprite drawdepth: FloorTiles - layers: - - sprite: Structures/cargo_pallets.rsi - state: cargo_pallet_sell - + sprite: Structures/cargo_pallets.rsi + - type: Icon + sprite: Structures/cargo_pallets.rsi + state: cargo_pallet_sell + - type: IconSmooth + key: cargo_pallet_sell + base: cargo_pallet_sell_ - type: entity id: CargoPalletBuy @@ -80,7 +83,10 @@ palletType: buy - type: Sprite drawdepth: FloorTiles - layers: - - sprite: Structures/cargo_pallets.rsi - state: cargo_pallet_buy - + sprite: Structures/cargo_pallets.rsi + - type: Icon + sprite: Structures/cargo_pallets.rsi + state: cargo_pallet_buy + - type: IconSmooth + key: cargo_pallet_buy + base: cargo_pallet_buy_ diff --git a/Resources/Prototypes/Entities/Objects/Specific/Chapel/bibles.yml b/Resources/Prototypes/Entities/Objects/Specific/Chapel/bibles.yml index 748ab123185..3d547cef6f0 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Chapel/bibles.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Chapel/bibles.yml @@ -73,7 +73,6 @@ failChance: 0 locPrefix: "necro" healSound: "/Audio/Effects/lightburn.ogg" - cooldownTime: 1.3 - type: Summonable specialItem: SpawnPointGhostCerberus respawnTime: 300 diff --git a/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/seeds.yml b/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/seeds.yml index 2b232d643d3..0a084dc2463 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/seeds.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/seeds.yml @@ -213,6 +213,16 @@ - type: Sprite sprite: Objects/Specific/Hydroponics/blood_tomato.rsi +- type: entity + parent: SeedBase + name: packet of killer tomato seeds + id: KillerTomatoSeeds + components: + - type: Seed + seedId: killerTomato + - type: Sprite + sprite: Objects/Specific/Hydroponics/tomatokiller.rsi + - type: entity parent: SeedBase name: packet of eggplant seeds diff --git a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/spray.yml b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/spray.yml index 0e19c03deef..64b3568adf5 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/spray.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/spray.yml @@ -24,6 +24,8 @@ solution: spray - type: SolutionTransfer canChangeTransferAmount: true + - type: SolutionItemStatus + solution: spray - type: UseDelay - type: Spray transferAmount: 10 diff --git a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/trashbag.yml b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/trashbag.yml index f802ae1c5c3..9927d836baa 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/trashbag.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/trashbag.yml @@ -22,6 +22,8 @@ tags: - Cartridge - Trash + - type: UseDelay + delay: 0.5 - type: Tag tags: - TrashBag diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/disease.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/disease.yml index 0f03c6d8ea6..ab6cdfc4e3b 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/disease.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/disease.yml @@ -19,6 +19,27 @@ # - Virology (when it's back) - Botany +- type: entity + parent: BaseAmmoProvider # this is for cycling swabs out and not spawning 30 entities, trust + id: BoxMouthSwab + name: sterile swab dispenser + description: Dispenses 30 sterile swabs, extremely useful for botany. + components: + - type: Sprite + layers: + - state: boxwide + - state: swab + - type: BallisticAmmoProvider + whitelist: + components: + - BotanySwab + proto: DiseaseSwab + capacity: 30 + - type: GuideHelp + guides: + # - Virology (when it's back) + - Botany + - type: entity parent: BaseItem id: Vaccine diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/morgue.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/morgue.yml index ce51a642dda..9eae5fbce1c 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/morgue.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/morgue.yml @@ -1,5 +1,5 @@ - type: entity - id: BodyBag_Container + id: BodyBag parent: BaseFoldable name: body bag description: A plastic bag designed for the storage and transportation of cadavers to stop body decomposition. @@ -17,8 +17,8 @@ visible: false - state: open_overlay map: ["enum.StorageVisualLayers.Door"] - - state: label_overlay - map: ["enum.BodyBagVisualLayers.Label"] + - state: paper + map: ["enum.PaperLabelVisuals.Layer"] - type: Icon sprite: Objects/Specific/Medical/Morgue/bodybags.rsi state: bag @@ -62,9 +62,15 @@ - type: GenericVisualizer visuals: enum.PaperLabelVisuals.HasLabel: - enum.BodyBagVisualLayers.Label: + enum.PaperLabelVisuals.Layer: True: {visible: true} False: {visible: false} + enum.PaperLabelVisuals.LabelType: + enum.PaperLabelVisuals.Layer: + Paper: { state: paper } + Bounty: { state: bounty } + CaptainsPaper: { state: captains_paper } + Invoice: { state: invoice } enum.FoldedVisuals.State: foldedLayer: True: {visible: true} @@ -83,10 +89,10 @@ price: 50 - type: entity - id: BodyBag_Folded + id: BodyBagFolded name: body bag description: A plastic bag designed for the storage and transportation of cadavers to stop body decomposition. - parent: BodyBag_Container + parent: BodyBag suffix: folded components: - type: Foldable diff --git a/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml b/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml index 7741289f535..11c27da1ee0 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml @@ -238,7 +238,6 @@ - type: ItemBorgModule items: - WeaponGrapplingGun - - WeaponCrusherDagger - HandheldGPSBasic # engineering modules diff --git a/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/artifact_equipment.yml b/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/artifact_equipment.yml index 4abeea38128..e1716f08439 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/artifact_equipment.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/artifact_equipment.yml @@ -1,4 +1,4 @@ -- type: entity +- type: entity id: CrateArtifactContainer parent: BaseStructureDynamic name: artifact container @@ -24,6 +24,8 @@ - state: locked map: ["enum.LockVisualLayers.Lock"] shader: unshaded + - state: paper + map: ["enum.PaperLabelVisuals.Layer"] - type: InteractionOutline - type: Physics - type: Fixtures @@ -34,7 +36,7 @@ radius: 0.45 density: 50 mask: - - SmallMobMask #this is so they can go under plastic flaps + - CrateMask #this is so they can go under plastic flaps layer: - MachineLayer - type: Icon @@ -73,6 +75,23 @@ - type: EntityStorageVisuals stateDoorOpen: artifact_container_open stateDoorClosed: artifact_container_door + - type: GenericVisualizer + visuals: + enum.PaperLabelVisuals.HasLabel: + enum.PaperLabelVisuals.Layer: + True: { visible: true } + False: { visible: false } + enum.PaperLabelVisuals.LabelType: + enum.PaperLabelVisuals.Layer: + Paper: { state: paper } + Bounty: { state: bounty } + CaptainsPaper: { state: captains_paper } + Invoice: { state: invoice } + enum.StorageVisuals.Open: + enum.PaperLabelVisuals.Layer: + True: { offset: "0.0,0.3125" } + False: { offset: "0.0,0.0" } + - type: LockVisuals - type: ItemSlots - type: ContainerContainer diff --git a/Resources/Prototypes/Entities/Objects/Specific/chemical-containers.yml b/Resources/Prototypes/Entities/Objects/Specific/chemical-containers.yml index 027ff206f8d..8034844a82b 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/chemical-containers.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/chemical-containers.yml @@ -8,7 +8,6 @@ solutions: beaker: maxVol: 200 - canMix: true - type: Sprite sprite: Objects/Specific/Chemistry/jug.rsi layers: @@ -19,6 +18,8 @@ - type: Item size: Normal sprite: Objects/Specific/Chemistry/jug.rsi + - type: MixableSolution + solution: beaker - type: RefillableSolution solution: beaker - type: DrainableSolution @@ -31,6 +32,8 @@ solution: beaker - type: SolutionTransfer canChangeTransferAmount: true + - type: SolutionItemStatus + solution: beaker - type: UserInterface interfaces: - key: enum.TransferAmountUiKey.Key diff --git a/Resources/Prototypes/Entities/Objects/Specific/chemistry-bottles.yml b/Resources/Prototypes/Entities/Objects/Specific/chemistry-bottles.yml index acfb65aa54f..6c81fa94665 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/chemistry-bottles.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/chemistry-bottles.yml @@ -29,7 +29,8 @@ solutions: drink: # This solution name and target volume is hard-coded in ChemMasterComponent maxVol: 30 - canMix: true + - type: MixableSolution + solution: drink - type: RefillableSolution solution: drink - type: DrainableSolution diff --git a/Resources/Prototypes/Entities/Objects/Specific/chemistry-vials.yml b/Resources/Prototypes/Entities/Objects/Specific/chemistry-vials.yml index c5de88d690d..65f5fbb5d06 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/chemistry-vials.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/chemistry-vials.yml @@ -35,7 +35,8 @@ solutions: beaker: maxVol: 30 - canMix: true + - type: MixableSolution + solution: beaker - type: RefillableSolution solution: beaker - type: DrainableSolution diff --git a/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml b/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml index ae4aaed7d21..fdf58dc4841 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml @@ -25,7 +25,8 @@ solutions: beaker: maxVol: 50 - canMix: true + - type: MixableSolution + solution: beaker - type: FitsInDispenser solution: beaker - type: RefillableSolution @@ -40,6 +41,8 @@ solution: beaker - type: SolutionTransfer canChangeTransferAmount: true + - type: SolutionItemStatus + solution: beaker - type: UserInterface interfaces: - key: enum.TransferAmountUiKey.Key @@ -117,7 +120,8 @@ solutions: beaker: maxVol: 50 - canMix: true + - type: MixableSolution + solution: beaker - type: FitsInDispenser solution: beaker - type: RefillableSolution @@ -200,7 +204,6 @@ solutions: beaker: maxVol: 100 - canMix: true - type: Appearance - type: SolutionContainerVisuals maxFillLevels: 6 @@ -244,7 +247,6 @@ solutions: beaker: maxVol: 1000 - canMix: true - type: entity name: dropper @@ -475,7 +477,6 @@ behaviors: - !type:SpillBehavior solution: food - transferForensics: true - !type:DoActsBehavior acts: [ "Destruction" ] - type: Tag diff --git a/Resources/Prototypes/Entities/Objects/Tools/bucket.yml b/Resources/Prototypes/Entities/Objects/Tools/bucket.yml index 496fd231b82..77803a13ec6 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/bucket.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/bucket.yml @@ -26,6 +26,8 @@ solutions: bucket: maxVol: 250 + - type: MixableSolution + solution: bucket - type: SolutionTransfer transferAmount: 100 maxTransferAmount: 100 @@ -49,6 +51,8 @@ solution: bucket - type: DrainableSolution solution: bucket + - type: SolutionItemStatus + solution: bucket - type: Appearance - type: SolutionContainerVisuals maxFillLevels: 3 diff --git a/Resources/Prototypes/Entities/Objects/Tools/cowtools.yml b/Resources/Prototypes/Entities/Objects/Tools/cowtools.yml index 977a8a931b5..295412debc8 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/cowtools.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/cowtools.yml @@ -128,11 +128,6 @@ sprite: Objects/Tools/Cowtools/cowelder.rsi - type: Tool speed: 0.05 - - type: Welder - litMeleeDamageBonus: - types: # When lit, negate standard melee damage and replace with heat - Heat: 0.5 - Blunt: -5 - type: entity name: milkalyzer diff --git a/Resources/Prototypes/Entities/Objects/Tools/lighters.yml b/Resources/Prototypes/Entities/Objects/Tools/lighters.yml index 631e2a247ea..d03cc725efe 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/lighters.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/lighters.yml @@ -142,8 +142,12 @@ predictable: false soundActivate: path: /Audio/Items/Lighters/zippo_open.ogg + params: + volume: -5 soundDeactivate: path: /Audio/Items/Lighters/zippo_close.ogg + params: + volume: -5 - type: ItemToggleMeleeWeapon activatedDamage: types: @@ -201,6 +205,9 @@ netsync: false radius: 1.2 #slightly stronger than the other lighters color: orange + - type: UseDelay + - type: IgnitionSource + ignited: false - type: entity name: flippo engraved lighter diff --git a/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml b/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml index 667d8559971..695725140ff 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml @@ -154,7 +154,6 @@ sprite: Objects/Tools/Toolboxes/toolbox_thief.rsi state: icon - type: ThiefUndeterminedBackpack - transformAfterSelect: AlwaysPoweredWallLight possibleSets: # - TO DO Thief pinpointer needed - ChemistrySet diff --git a/Resources/Prototypes/Entities/Objects/Tools/tools.yml b/Resources/Prototypes/Entities/Objects/Tools/tools.yml index 41c0ccc4a3d..ad62426bb0f 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/tools.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/tools.yml @@ -225,6 +225,7 @@ - type: Tag tags: - Multitool + - DoorElectronicsConfigurator - type: PhysicalComposition materialComposition: Steel: 100 @@ -266,6 +267,9 @@ - type: ActivatableUI key: enum.NetworkConfiguratorUiKey.List inHandsOnly: true + - type: Tag + tags: + - DoorElectronicsConfigurator - type: UserInterface interfaces: - key: enum.NetworkConfiguratorUiKey.List @@ -349,13 +353,13 @@ description: The rapid construction device can be used to quickly place and remove various station structures and fixtures. Requires compressed matter to function. components: - type: RCD - availablePrototypes: + availablePrototypes: - WallSolid - FloorSteel - Plating - Catwalk - Grille - - Window + - Window - WindowDirectional - WindowReinforcedDirectional - ReinforcedWindow @@ -404,7 +408,7 @@ - type: LimitedCharges charges: 0 - type: RCD - availablePrototypes: + availablePrototypes: - WallSolid - FloorSteel - Plating diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/grenade.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/grenade.yml index 7f0507d686d..36d41e391ac 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/grenade.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/grenade.yml @@ -50,7 +50,7 @@ Blunt: 1 Heat: 2 - type: IgniteOnCollide - fireStacks: 3 + fireStacks: 1 count: 10 - type: TimedDespawn lifetime: 0.25 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/arrows.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/arrows.yml index 52c5dc8a9db..6f925139fb1 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/arrows.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/arrows.yml @@ -1,4 +1,4 @@ -- type: entity +- type: entity parent: BaseItem id: BaseArrow abstract: true @@ -35,7 +35,6 @@ - type: Tag tags: - Arrow - - CannonRestrict - type: Projectile deleteOnCollide: false onlyCollideWhenShot: true diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml index b693bdba370..7398374e86c 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml @@ -20,7 +20,7 @@ maxAngle: 16 fireRate: 8 angleIncrease: 3 - angleDecay: 16 + angleDecay: 16 selectedMode: FullAuto availableModes: - SemiAuto @@ -94,6 +94,11 @@ - type: Clothing sprite: Objects/Weapons/Guns/SMGs/c20r.rsi - type: Gun + shotsPerBurst: 5 + availableModes: + - SemiAuto + - Burst + - FullAuto soundGunshot: path: /Audio/Weapons/Guns/Gunshots/c-20r.ogg - type: ChamberMagazineAmmoProvider @@ -221,9 +226,16 @@ - type: ChamberMagazineAmmoProvider boltClosed: null - type: Gun - fireRate: 5 + fireRate: 5.5 + minAngle: 1 + maxAngle: 6 + angleIncrease: 1.5 + angleDecay: 6 selectedMode: FullAuto + shotsPerBurst: 5 availableModes: + - SemiAuto + - Burst - FullAuto - type: ItemSlots slots: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/pneumatic_cannon.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/pneumatic_cannon.yml index ae1f5df3c15..12511729460 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/pneumatic_cannon.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/pneumatic_cannon.yml @@ -22,7 +22,6 @@ selectedMode: SemiAuto availableModes: - SemiAuto - - FullAuto soundGunshot: path: /Audio/Effects/thunk.ogg soundEmpty: @@ -34,10 +33,7 @@ - type: Storage maxItemSize: Normal grid: - - 0,0,3,3 - blacklist: - tags: - - CannonRestrict + - 0,0,1,1 - type: Appearance - type: ItemMapper containerWhitelist: [gas_tank] diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml index 9cd1bb29408..afe4644517c 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml @@ -263,7 +263,6 @@ tags: - CombatKnife - Knife - - CannonRestrict - type: Sprite sprite: Objects/Weapons/Melee/throwing_knife.rsi state: icon diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/spear.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/spear.yml index 3758487bd43..0def916ddc7 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/spear.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/spear.yml @@ -52,6 +52,7 @@ quickEquip: false slots: - back + - suitStorage - type: Construction graph: Spear node: spear diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/stunprod.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/stunprod.yml index b0b166f6ce8..9e187651ec5 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/stunprod.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/stunprod.yml @@ -25,9 +25,9 @@ - type: ItemToggleMeleeWeapon activatedDamage: types: - Blunt: 0 + Shock: 5 - type: Stunbaton - energyPerUse: 70 + energyPerUse: 120 - type: MeleeWeapon wideAnimationRotation: -135 damage: @@ -36,10 +36,10 @@ angle: 60 animation: WeaponArcThrust - type: StaminaDamageOnHit - damage: 20 + damage: 35 sound: /Audio/Weapons/egloves.ogg - type: StaminaDamageOnCollide - damage: 20 + damage: 35 sound: /Audio/Weapons/egloves.ogg - type: Battery maxCharge: 360 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/sword.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/sword.yml index 97dc94cf74b..a5d8e32b597 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/sword.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/sword.yml @@ -18,7 +18,7 @@ path: /Audio/Weapons/bladeslice.ogg - type: Reflect enabled: true - reflectProb: .5 + reflectProb: .1 spread: 90 reflects: - Energy #DeltaV: Energy Reflection but no ballistics. diff --git a/Resources/Prototypes/Entities/Stations/base.yml b/Resources/Prototypes/Entities/Stations/base.yml index 23286a77192..6c99a28762d 100644 --- a/Resources/Prototypes/Entities/Stations/base.yml +++ b/Resources/Prototypes/Entities/Stations/base.yml @@ -4,6 +4,12 @@ components: - type: StationData +- type: entity + id: BaseRandomStation + abstract: true + components: + - type: StationRandomTransform + - type: entity id: BaseStationCargo abstract: true @@ -146,4 +152,4 @@ id: BaseStationAllEventsEligible abstract: true components: - - type: StationEventEligible # For when someone makes this more granular in the future. \ No newline at end of file + - type: StationEventEligible # For when someone makes this more granular in the future. diff --git a/Resources/Prototypes/Entities/Stations/nanotrasen.yml b/Resources/Prototypes/Entities/Stations/nanotrasen.yml index 6adbeae529c..16af75d629c 100644 --- a/Resources/Prototypes/Entities/Stations/nanotrasen.yml +++ b/Resources/Prototypes/Entities/Stations/nanotrasen.yml @@ -36,6 +36,7 @@ - BaseStation - BaseStationAlertLevels - BaseStationNanotrasen + - BaseRandomStation noSpawn: true components: - type: Transform diff --git a/Resources/Prototypes/Entities/Structures/Decoration/bonfire.yml b/Resources/Prototypes/Entities/Structures/Decoration/bonfire.yml index 7777153bbac..cc69a6304d1 100644 --- a/Resources/Prototypes/Entities/Structures/Decoration/bonfire.yml +++ b/Resources/Prototypes/Entities/Structures/Decoration/bonfire.yml @@ -23,8 +23,8 @@ !type:DamageTrigger damage: 50 behaviors: - - !type:DoActsBehavior - acts: [ "Destruction" ] + - !type:DoActsBehavior + acts: [ "Destruction" ] - type: AmbientSound volume: -5 range: 5 diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml index a389325f88d..7f54fbb5785 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml @@ -152,7 +152,7 @@ components: - type: ContainerFill containers: - board: [ DoorElectronicsFreezer ] + board: [ DoorElectronicsKitchenHydroponics ] - type: entity parent: AirlockFreezer @@ -251,7 +251,7 @@ components: - type: ContainerFill containers: - board: [ DoorElectronicsScience ] + board: [ DoorElectronicsMedicalResearch ] - type: entity parent: AirlockCentralCommand @@ -617,7 +617,7 @@ components: - type: ContainerFill containers: - board: [ DoorElectronicsScience ] + board: [ DoorElectronicsMedicalResearch ] - type: entity parent: AirlockCentralCommandGlass @@ -967,7 +967,7 @@ components: - type: ContainerFill containers: - board: [ DoorElectronicsRnDMed ] + board: [ DoorElectronicsMedicalResearch ] - type: entity parent: AirlockMaint @@ -1043,6 +1043,15 @@ containers: board: [ DoorElectronicsResearchDirector ] +- type: entity + parent: AirlockMaintCommandLocked + id: AirlockMaintQuartermasterLocked + suffix: Logistics Officer, Locked # DeltaV - Logistics Department replacing Cargo + components: + - type: ContainerFill + containers: + board: [ DoorElectronicsQuartermaster ] + - type: entity parent: AirlockMaint id: AirlockMaintArmoryLocked diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml index 778631439c5..d1e22a06b2d 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml @@ -64,6 +64,7 @@ containers: board: !type:Container - type: Weldable + fuel: 5 time: 3 - type: Airlock openUnlitVisible: true # Corvax-Resprite-Airlocks @@ -117,7 +118,7 @@ - type: RCDDeconstructable cost: 6 delay: 8 - fx: EffectRCDDeconstruct8 + fx: EffectRCDDeconstruct8 - type: Destructible thresholds: - trigger: @@ -155,7 +156,7 @@ - type: BlockWeather placement: mode: SnapgridCenter - + - type: entity id: AirlockRCDResistant parent: Airlock @@ -204,4 +205,4 @@ - type: Tag tags: - GlassAirlock - # This tag is used to nagivate the Airlock construction graph. It's needed because the construction graph is shared between Airlock, AirlockGlass, and HighSecDoor \ No newline at end of file + # This tag is used to nagivate the Airlock construction graph. It's needed because the construction graph is shared between Airlock, AirlockGlass, and HighSecDoor diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/highsec.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/highsec.yml index e9ea05a1c3f..2a8cc0c5261 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/highsec.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/highsec.yml @@ -55,6 +55,7 @@ denySound: path: /Audio/Machines/airlock_deny.ogg - type: Weldable + fuel: 10 time: 10 - type: Airlock - type: NavMapDoor diff --git a/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml b/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml index 1ba867773bc..a5b8a8dc74d 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml @@ -82,6 +82,7 @@ openingAnimationTime: 0.6 closingAnimationTime: 0.6 - type: Weldable + fuel: 5 time: 3 - type: Firelock - type: Appearance diff --git a/Resources/Prototypes/Entities/Structures/Doors/Windoors/base_structurewindoors.yml b/Resources/Prototypes/Entities/Structures/Doors/Windoors/base_structurewindoors.yml index d58273edcc9..a6515b52c64 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Windoors/base_structurewindoors.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Windoors/base_structurewindoors.yml @@ -93,10 +93,11 @@ max: 4 - !type:DoActsBehavior acts: [ "Destruction" ] - - type: AccessReader - type: ContainerFill containers: board: [ DoorElectronics ] + - type: AccessReader + containerAccessProvider: board - type: ContainerContainer containers: board: !type:Container diff --git a/Resources/Prototypes/Entities/Structures/Doors/Windoors/windoor.yml b/Resources/Prototypes/Entities/Structures/Doors/Windoors/windoor.yml index 6768c0cbfb2..ae8bd9c1cde 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Windoors/windoor.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Windoors/windoor.yml @@ -48,88 +48,99 @@ id: WindoorBarLocked suffix: Bar, Locked components: - - type: AccessReader - access: [["Bar"]] + - type: ContainerFill + containers: + board: [ DoorElectronicsBar ] - type: entity parent: Windoor id: WindoorBarKitchenLocked suffix: Bar&Kitchen, Locked components: - - type: AccessReader - access: [["Bar"], ["Kitchen"]] + - type: ContainerFill + containers: + board: [ DoorElectronicsBarKitchen ] - type: entity parent: Windoor id: WindoorCargoLocked suffix: Cargo, Locked components: - - type: AccessReader - access: [["Cargo"]] + - type: ContainerFill + containers: + board: [ DoorElectronicsCargo ] - type: entity parent: Windoor id: WindoorChapelLocked suffix: Chapel, Locked components: - - type: AccessReader - access: [["Chapel"]] + - type: ContainerFill + containers: + board: [ DoorElectronicsChapel ] - type: entity parent: Windoor id: WindoorHydroponicsLocked suffix: Hydroponics, Locked components: - - type: AccessReader - access: [["Hydroponics"]] + - type: ContainerFill + containers: + board: [ DoorElectronicsHydroponics ] - type: entity parent: Windoor id: WindoorJanitorLocked suffix: Janitor, Locked components: - - type: AccessReader - access: [["Janitor"]] + - type: ContainerFill + containers: + board: [ DoorElectronicsJanitor ] - type: entity parent: WindoorPlasma id: PlasmaWindoorJanitorLocked suffix: Janitor, Locked, Plasma components: - - type: AccessReader - access: [["Janitor"]] + - type: ContainerFill + containers: + board: [ DoorElectronicsJanitor ] - type: entity parent: Windoor id: WindoorKitchenLocked suffix: Kitchen, Locked components: - - type: AccessReader - access: [["Kitchen"]] + - type: ContainerFill + containers: + board: [ DoorElectronicsKitchen ] - type: entity parent: Windoor id: WindoorKitchenHydroponicsLocked suffix: Kitchen&Hydroponics, Locked components: - - type: AccessReader - access: [["Kitchen"], ["Hydroponics"]] + - type: ContainerFill + containers: + board: [ DoorElectronicsKitchenHydroponics ] - type: entity parent: Windoor id: WindoorServiceLocked suffix: Service, Locked components: - - type: AccessReader - access: [["Service"]] + - type: ContainerFill + containers: + board: [ DoorElectronicsService ] - type: entity parent: Windoor id: WindoorTheatreLocked suffix: Theatre, Locked components: - - type: AccessReader - access: [["Theatre"]] + - type: ContainerFill + containers: + board: [ DoorElectronicsTheatre ] # Secure @@ -138,24 +149,45 @@ id: WindoorSecureArmoryLocked suffix: Armory, Locked components: - - type: AccessReader - access: [["Armory"]] + - type: ContainerFill + containers: + board: [ DoorElectronicsArmory ] + +- type: entity + parent: WindoorSecurePlasma + id: PlasmaWindoorSecureArmoryLocked + suffix: Armory, Locked, Plasma + components: + - type: ContainerFill + containers: + board: [ DoorElectronicsArmory ] - type: entity parent: WindoorSecure id: WindoorSecureAtmosphericsLocked suffix: Atmospherics, Locked components: - - type: AccessReader - access: [["Atmospherics"]] + - type: ContainerFill + containers: + board: [ DoorElectronicsAtmospherics ] + +- type: entity + parent: WindoorSecurePlasma + id: PlasmaWindoorSecureAtmosphericsLocked + suffix: Atmospherics, Locked, Plasma + components: + - type: ContainerFill + containers: + board: [ DoorElectronicsAtmospherics ] - type: entity parent: WindoorSecure id: WindoorSecureBarLocked suffix: Bar, Locked components: - - type: AccessReader - access: [["Bar"]] + - type: ContainerFill + containers: + board: [ DoorElectronicsBar ] #Delta V: Removed Brig Access #- type: entity @@ -163,197 +195,240 @@ # id: WindoorSecureBrigLocked # suffix: Brig, Locked # components: -# - type: AccessReader -# access: [["Brig"]] +# - type: ContainerFill +# containers: +# board: [ DoorElectronicsBrig ] - type: entity parent: WindoorSecure id: WindoorSecureCargoLocked suffix: Cargo, Locked components: - - type: AccessReader - access: [["Cargo"]] + - type: ContainerFill + containers: + board: [ DoorElectronicsCargo ] - type: entity parent: WindoorSecure id: WindoorSecureChapelLocked suffix: Chapel, Locked components: - - type: AccessReader - access: [["Chapel"]] + - type: ContainerFill + containers: + board: [ DoorElectronicsChapel ] - type: entity parent: WindoorSecure id: WindoorSecureChemistryLocked suffix: Chemistry, Locked components: - - type: AccessReader - access: [["Chemistry"]] + - type: ContainerFill + containers: + board: [ DoorElectronicsChemistry ] - type: entity parent: WindoorSecurePlasma id: PlasmaWindoorSecureChemistryLocked suffix: Chemistry, Locked, Plasma components: - - type: AccessReader - access: [["Chemistry"]] + - type: ContainerFill + containers: + board: [ DoorElectronicsChemistry ] - type: entity parent: WindoorSecure id: WindoorSecureCentralCommandLocked suffix: Central Command, Locked components: - - type: AccessReader - access: [["CentralCommand"]] + - type: ContainerFill + containers: + board: [ DoorElectronicsCentralCommand ] - type: entity parent: WindoorSecurePlasma id: PlasmaWindoorSecureCentralCommandLocked suffix: Central Command, Locked, Plasma components: - - type: AccessReader - access: [["CentralCommand"]] + - type: ContainerFill + containers: + board: [ DoorElectronicsCentralCommand ] - type: entity parent: WindoorSecureUranium id: UraniumWindoorSecureCentralCommandLocked suffix: Central Command, Locked, Uranium components: - - type: AccessReader - access: [["CentralCommand"]] + - type: ContainerFill + containers: + board: [ DoorElectronicsCentralCommand ] - type: entity parent: WindoorSecure id: WindoorSecureCommandLocked suffix: Command, Locked components: - - type: AccessReader - access: [["Command"]] + - type: ContainerFill + containers: + board: [ DoorElectronicsCommand ] + +- type: entity + parent: WindoorSecurePlasma + id: PlasmaWindoorSecureCommandLocked + suffix: Command, Locked, Plasma + components: + - type: ContainerFill + containers: + board: [ DoorElectronicsCommand ] - type: entity parent: WindoorSecure id: WindoorSecureDetectiveLocked suffix: Detective, Locked components: - - type: AccessReader - access: [["Detective"]] + - type: ContainerFill + containers: + board: [ DoorElectronicsDetective ] - type: entity parent: WindoorSecure id: WindoorSecureEngineeringLocked suffix: Engineering, Locked components: - - type: AccessReader - access: [["Engineering"]] + - type: ContainerFill + containers: + board: [ DoorElectronicsEngineering ] - type: entity parent: WindoorSecurePlasma id: PlasmaWindoorSecureEngineeringLocked suffix: Engineering, Locked, Plasma components: - - type: AccessReader - access: [["Engineering"]] + - type: ContainerFill + containers: + board: [ DoorElectronicsEngineering ] - type: entity parent: WindoorSecureUranium id: UraniumWindoorSecureEngineeringLocked suffix: Engineering, Locked, Uranium components: - - type: AccessReader - access: [["Engineering"]] + - type: ContainerFill + containers: + board: [ DoorElectronicsEngineering ] - type: entity parent: WindoorSecure id: WindoorSecureExternalLocked suffix: External, Locked components: - - type: AccessReader - access: [["External"]] + - type: ContainerFill + containers: + board: [ DoorElectronicsExternal ] - type: entity parent: WindoorSecure id: WindoorSecureJanitorLocked suffix: Janitor, Locked components: - - type: AccessReader - access: [["Janitor"]] + - type: ContainerFill + containers: + board: [ DoorElectronicsJanitor ] - type: entity parent: WindoorSecurePlasma id: PlasmaWindoorSecureJanitorLocked suffix: Janitor, Locked, Plasma components: - - type: AccessReader - access: [["Janitor"]] + - type: ContainerFill + containers: + board: [ DoorElectronicsJanitor ] - type: entity parent: WindoorSecure id: WindoorSecureKitchenLocked suffix: Kitchen, Locked components: - - type: AccessReader - access: [["Kitchen"]] + - type: ContainerFill + containers: + board: [ DoorElectronicsKitchen ] - type: entity parent: WindoorSecureSecurityLocked id: WindoorSecureSecurityLawyerLocked suffix: Security/Lawyer, Locked components: - - type: AccessReader - access: [["Security"], ["Lawyer"]] + - type: ContainerFill + containers: + board: [ DoorElectronicsSecurityLawyer ] - type: entity parent: WindoorSecure id: WindoorSecureMedicalLocked suffix: Medical, Locked components: - - type: AccessReader - access: [["Medical"]] + - type: ContainerFill + containers: + board: [ DoorElectronicsMedical ] - type: entity parent: WindoorSecure id: WindoorSecureSalvageLocked suffix: Salvage, Locked components: - - type: AccessReader - access: [["Salvage"]] + - type: ContainerFill + containers: + board: [ DoorElectronicsSalvage ] - type: entity parent: WindoorSecure id: WindoorSecureSecurityLocked suffix: Security, Locked components: - - type: AccessReader - access: [["Security"]] + - type: ContainerFill + containers: + board: [ DoorElectronicsSecurity ] + +- type: entity + parent: WindoorSecurePlasma + id: PlasmaWindoorSecureSecurityLocked + suffix: Security, Locked, Plasma + components: + - type: ContainerFill + containers: + board: [ DoorElectronicsSecurity ] - type: entity parent: WindoorSecure id: WindoorSecureScienceLocked suffix: Science, Locked components: - - type: AccessReader - access: [["Research"]] + - type: ContainerFill + containers: + board: [ DoorElectronicsResearch ] - type: entity parent: WindoorSecurePlasma id: PlasmaWindoorSecureScienceLocked suffix: Science, Locked, Plasma components: - - type: AccessReader - access: [["Research"]] + - type: ContainerFill + containers: + board: [ DoorElectronicsResearch ] - type: entity parent: WindoorSecure id: WindoorSecureServiceLocked suffix: Service, Locked components: - - type: AccessReader - access: [["Service"]] + - type: ContainerFill + containers: + board: [ DoorElectronicsService ] - type: entity parent: WindoorSecure id: WindoorSecureHeadOfPersonnelLocked suffix: HeadOfPersonnel, Locked components: - - type: AccessReader - access: [["HeadOfPersonnel"]] + - type: ContainerFill + containers: + board: [ DoorElectronicsHeadOfPersonnel ] diff --git a/Resources/Prototypes/Entities/Structures/Furniture/chairs.yml b/Resources/Prototypes/Entities/Structures/Furniture/chairs.yml index 0b3c291af25..0fb69b4fdbd 100644 --- a/Resources/Prototypes/Entities/Structures/Furniture/chairs.yml +++ b/Resources/Prototypes/Entities/Structures/Furniture/chairs.yml @@ -282,6 +282,7 @@ MaterialWoodPlank: min: 1 max: 1 + - type: Construction graph: RitualSeat node: chairCursed diff --git a/Resources/Prototypes/Entities/Structures/Furniture/dresser.yml b/Resources/Prototypes/Entities/Structures/Furniture/dresser.yml index fa029c035ae..2caa4010ca0 100644 --- a/Resources/Prototypes/Entities/Structures/Furniture/dresser.yml +++ b/Resources/Prototypes/Entities/Structures/Furniture/dresser.yml @@ -53,18 +53,6 @@ components: - type: StorageFill contents: - - id: ClothingUniformRandomArmless - prob: 0.05 - orGroup: dressermainloot - - id: ClothingUniformRandomStandart - prob: 0.05 - orGroup: dressermainloot - - id: ClothingUniformRandomBra - prob: 0.05 - orGroup: dressermainloot - - id: ClothingUniformRandomShorts - prob: 0.05 - orGroup: dressermainloot - id: ClothingNeckLGBTPin prob: 0.06 orGroup: dressermainloot diff --git a/Resources/Prototypes/Entities/Structures/Lighting/base_lighting.yml b/Resources/Prototypes/Entities/Structures/Lighting/base_lighting.yml index 22bbdb7b9f9..0c6f48f7cf3 100644 --- a/Resources/Prototypes/Entities/Structures/Lighting/base_lighting.yml +++ b/Resources/Prototypes/Entities/Structures/Lighting/base_lighting.yml @@ -361,7 +361,7 @@ radius: 5 energy: 0.6 offset: "0, 0.4" - color: "#FF4020" + color: "#7CFC00" mask: /Textures/Effects/LightMasks/double_cone.png - type: ApcPowerReceiver - type: ExtensionCableReceiver @@ -378,10 +378,10 @@ map: [ "enum.EmergencyLightVisualLayers.Base" ] - state: emergency_light_off map: [ "enum.EmergencyLightVisualLayers.LightOff" ] - color: "#FF4020" + color: "#7CFC00" - state: emergency_light_on map: [ "enum.EmergencyLightVisualLayers.LightOn" ] - color: "#FF4020" + color: "#7CFC00" shader: "unshaded" visible: false - type: Appearance diff --git a/Resources/Prototypes/Entities/Structures/Lighting/strobe_lighting.yml b/Resources/Prototypes/Entities/Structures/Lighting/strobe_lighting.yml new file mode 100644 index 00000000000..8eceb76b639 --- /dev/null +++ b/Resources/Prototypes/Entities/Structures/Lighting/strobe_lighting.yml @@ -0,0 +1,148 @@ +- type: entity + id: AlwaysPoweredStrobeLight + name: strobe + description: "UH?! Sorry, all I can hear is WEE-OOO-WEE-OOO!" + suffix: Always powered + components: + - type: AmbientSound + volume: -15 + range: 2 + sound: + path: /Audio/Ambience/Objects/light_hum.ogg + - type: MeleeSound + soundGroups: + Brute: + collection: GlassSmash + - type: Transform + anchored: true + - type: Clickable + - type: InteractionOutline + - type: Construction + graph: LightFixture + node: bulbLight + - type: Sprite + sprite: Structures/Wallmounts/Lighting/strobe_light.rsi + drawdepth: WallMountedItems + layers: + - map: ["enum.PoweredLightLayers.Base"] + state: base + - map: ["enum.PoweredLightLayers.Glow"] + state: glow + shader: unshaded + state: base + - type: PointLight + mask: /Textures/Effects/LightMasks/double_cone.png + color: "#FFE4CE" + energy: 5 + radius: 10 + softness: 1 + offset: "0, 0.35" + - type: RotatingLight + - type: Damageable + damageContainer: Inorganic + damageModifierSet: Metallic + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 100 + behaviors: #excess damage, don't spawn entities. + - !type:DoActsBehavior + acts: [ "Destruction" ] + - trigger: + !type:DamageTrigger + damage: 25 + behaviors: + - !type:EmptyAllContainersBehaviour + - !type:SpawnEntitiesBehavior + spawn: + SheetSteel1: + min: 1 + max: 1 + - !type:DoActsBehavior + acts: ["Destruction"] + placement: + mode: SnapgridCenter + snap: + - Wallmount + +- type: entity + name: strobe + description: "UH?! Sorry, all I can hear is WEE-OOO-WEE-OOO!" + id: PoweredStrobeLightEmpty + suffix: Empty + parent: AlwaysPoweredStrobeLight + components: + - type: Sprite + sprite: Structures/Wallmounts/Lighting/strobe_light.rsi + state: empty + - type: AmbientSound + enabled: false + - type: PointLight + enabled: false + offset: "0, 0.35" + - type: ContainerContainer + containers: + light_bulb: !type:ContainerSlot + - type: PoweredLight + bulb: Bulb + on: false + damage: + types: + Heat: 5 + - type: ApcPowerReceiver + - type: ExtensionCableReceiver + - type: DeviceNetwork + deviceNetId: Wireless + receiveFrequencyId: SmartLight + - type: WirelessNetworkConnection + range: 200 + - type: Appearance + - type: PoweredLightVisuals + spriteStateMap: + empty: empty + broken: broken + burned: broken + off: base + on: base + - type: DeviceLinkSink + ports: + - On + - Off + - Toggle + - type: Construction + graph: LightFixture + node: strobeLight + +- type: entity + id: PoweredStrobeLightPolice + suffix: "Empty, police" + parent: PoweredStrobeLightEmpty + components: + - type: AmbientSound + volume: 0 + range: 10 + sound: + path: "/Audio/Effects/Lightning/strobe.ogg" + +- type: entity + id: PoweredStrobeLightSiren + suffix: "Empty, siren" + parent: PoweredStrobeLightEmpty + components: + - type: AmbientSound + volume: 0 + range: 10 + sound: + path: "/Audio/Misc/siren.ogg" + +- type: entity + id: PoweredStrobeLightEpsilon + suffix: "Empty, epsilon" + parent: PoweredStrobeLightEmpty + components: + - type: AmbientSound + volume: 0 + range: 10 + sound: + path: "/Audio/Effects/Lightning/strobeepsilon.ogg" \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Structures/Machines/Computers/arcades.yml b/Resources/Prototypes/Entities/Structures/Machines/Computers/arcades.yml index 67436a4cbbc..98f4a9afb0c 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/Computers/arcades.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/Computers/arcades.yml @@ -7,7 +7,6 @@ components: - type: ApcPowerReceiver powerLoad: 350 - priority: Low - type: ExtensionCableReceiver - type: PointLight radius: 1.8 @@ -70,7 +69,8 @@ - type: PointLight color: "#e3a136" - type: SpaceVillainArcade - rewardAmount: 0 + rewardMinAmount: 0 + rewardMaxAmount: 0 possibleRewards: - ToyMouse - ToyAi @@ -148,8 +148,8 @@ board: SpaceVillainArcadeComputerCircuitboard - type: Advertise pack: SpaceVillainAds - minWait: 60 # Arcades are noisy - maxWait: 240 + minimumWait: 60 # Arcades are noisy + maximumWait: 240 - type: SpeakOnUIClosed pack: SpaceVillainGoodbyes @@ -192,7 +192,7 @@ board: BlockGameArcadeComputerCircuitboard - type: Advertise pack: BlockGameAds - minWait: 60 # Arcades are noisy - maxWait: 240 + minimumWait: 60 # Arcades are noisy + maximumWait: 240 - type: SpeakOnUIClosed pack: BlockGameGoodbyes diff --git a/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml b/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml index ab3a8c25ac2..0dfc4847672 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml @@ -422,7 +422,6 @@ type: ResearchClientBoundUserInterface - type: ApcPowerReceiver powerLoad: 1000 - priority: Low - type: Computer board: ResearchComputerCircuitboard - type: AccessReader @@ -471,7 +470,6 @@ type: ResearchClientBoundUserInterface - type: ApcPowerReceiver powerLoad: 1000 - priority: Low - type: Computer board: AnalysisComputerCircuitboard - type: PointLight @@ -737,6 +735,9 @@ - map: ["computerLayerKeys"] state: tech_key - type: CargoOrderConsole + - type: ActiveRadio + channels: + - Supply - type: ActivatableUI key: enum.CargoConsoleUiKey.Orders - type: UserInterface @@ -793,6 +794,8 @@ radius: 1.5 energy: 1.6 color: "#b89f25" + - type: AccessReader + access: [["Quartermaster"]] - type: GuideHelp guides: - CargoBounties @@ -955,7 +958,6 @@ speechVerb: Robotic - type: SurveillanceCameraSpeaker - type: SurveillanceCameraMonitor - speechEnabled: true - type: ActivatableUI key: enum.SurveillanceCameraMonitorUiKey.Key - type: ActivatableUIRequiresVision diff --git a/Resources/Prototypes/Entities/Structures/Machines/artifact_analyzer.yml b/Resources/Prototypes/Entities/Structures/Machines/artifact_analyzer.yml index b00d6d89862..8b0c5787631 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/artifact_analyzer.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/artifact_analyzer.yml @@ -43,6 +43,7 @@ powerLoad: 12000 needsPower: false #only turns on when scanning - type: ArtifactAnalyzer + - type: TraversalDistorter - type: ItemPlacer whitelist: components: @@ -72,62 +73,6 @@ True: { visible: true } False: { visible: false } -- type: entity - id: MachineTraversalDistorter - parent: [ BaseMachinePowered, ConstructibleMachine ] - name: traversal distorter - description: A machine capable of distorting the traversal of artifact nodes. - components: - - type: Sprite - noRot: true - sprite: Structures/Machines/traversal_distorter.rsi - drawdepth: FloorObjects - layers: - - state: icon - - state: unshaded - shader: unshaded - map: ["enum.PowerDeviceVisualLayers.Powered"] - - type: Physics - bodyType: Static - canCollide: true - - type: Fixtures - fixtures: - fix1: - shape: - !type:PhysShapeAabb - bounds: "-0.35,-0.35,0.35,0.35" - density: 190 - mask: - - MachineMask - layer: - - Impassable - - MidImpassable - - LowImpassable - hard: False - - type: Transform - noRot: false - - type: TraversalDistorter - - type: ItemPlacer - # don't limit the number of artifacts that can be biased - maxEntities: 0 - whitelist: - components: - - Artifact - - type: PlaceableSurface - placeCentered: true - - type: Machine - board: TraversalDistorterMachineCircuitboard - - type: Appearance - - type: GuideHelp - guides: - - TraversalDistorter - - type: GenericVisualizer - visuals: - enum.PowerDeviceVisuals.Powered: - enum.PowerDeviceVisualLayers.Powered: - True: { visible: true } - False: { visible: false } - - type: entity id: MachineArtifactCrusher parent: [ ConstructibleMachine, BaseMachinePowered ] diff --git a/Resources/Prototypes/Entities/Structures/Machines/crew_monitor_server.yml b/Resources/Prototypes/Entities/Structures/Machines/crew_monitor_server.yml index 72027d2243e..0f8286af862 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/crew_monitor_server.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/crew_monitor_server.yml @@ -23,7 +23,6 @@ machine_parts: !type:Container - type: CrewMonitoringServer - type: SingletonDeviceNetServer - ServerType: CrewMonitoringServer - type: DeviceNetwork deviceNetId: Wireless transmitFrequencyId: CrewMonitor @@ -34,7 +33,6 @@ - type: StationLimitedNetwork - type: ApcPowerReceiver powerLoad: 200 - priority: Low - type: ExtensionCableReceiver - type: Destructible thresholds: diff --git a/Resources/Prototypes/Entities/Structures/Machines/gravity_generator.yml b/Resources/Prototypes/Entities/Structures/Machines/gravity_generator.yml index aebc4b03def..618538dccb7 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/gravity_generator.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/gravity_generator.yml @@ -55,7 +55,7 @@ activePower: 2500 lightRadiusMin: 0.75 lightRadiusMax: 2.5 - spritemap: + spriteMap: broken: "broken" unpowered: "off" off: "off" diff --git a/Resources/Prototypes/Entities/Structures/Machines/jukebox.yml b/Resources/Prototypes/Entities/Structures/Machines/jukebox.yml new file mode 100644 index 00000000000..76b8ddd36ba --- /dev/null +++ b/Resources/Prototypes/Entities/Structures/Machines/jukebox.yml @@ -0,0 +1,59 @@ +- type: entity + id: Jukebox + name: jukebox + parent: [ BaseMachinePowered, ConstructibleMachine ] + description: A machine capable of playing a wide variety of tunes. Enjoyment not guaranteed. + components: + - type: Sprite + sprite: Structures/Machines/jukebox.rsi + layers: + - state: "off" + map: ["enum.JukeboxVisualLayers.Base"] + - type: Transform + anchored: true + - type: Jukebox + onState: on + offState: off + selectState: select + - type: Machine + board: JukeboxCircuitBoard + - type: Appearance + - type: ApcPowerReceiver + powerLoad: 100 + - type: ExtensionCableReceiver + - type: ActivatableUI + key: enum.JukeboxUiKey.Key + - type: ActivatableUIRequiresPower + - type: UserInterface + interfaces: + - key: enum.JukeboxUiKey.Key + type: JukeboxBoundUserInterface + - type: Damageable + damageContainer: Inorganic + damageModifierSet: Metallic + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 75 + behaviors: + - !type:DoActsBehavior + acts: ["Destruction"] + - !type:SpawnEntitiesBehavior + spawn: + SheetSteel1: + min: 1 + max: 2 + - type: Physics + bodyType: Static + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.25,-0.45,0.25,0.45" + mask: + - MachineMask + layer: + - MachineLayer + density: 200 diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml index 7cde8dd2da9..d0819bdce0c 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml @@ -121,6 +121,7 @@ - DrinkGlass - DrinkShotGlass - DrinkGlassCoupeShaped + - CustomDrinkJug - FoodPlate - FoodPlateSmall - FoodPlatePlastic @@ -154,6 +155,7 @@ - APCElectronics - SMESMachineCircuitboard - SubstationMachineCircuitboard + - WallmountSubstationElectronics - CellRechargerCircuitboard - BorgChargerCircuitboard - WeaponCapacitorRechargerCircuitboard @@ -470,11 +472,11 @@ - AnomalySynchronizerCircuitboard - APECircuitboard - ArtifactAnalyzerMachineCircuitboard - - TraversalDistorterMachineCircuitboard - ArtifactCrusherMachineCircuitboard - TelecomServerCircuitboard - MassMediaCircuitboard - ReagentGrinderIndustrialMachineCircuitboard + - JukeboxCircuitBoard # Begin Nyano additions - ReverseEngineeringMachineCircuitboard - CrewMonitoringComputerCircuitboard @@ -1077,7 +1079,8 @@ - ClothingOuterWinterCE - ClothingOuterWinterCMO - ClothingOuterWinterHoP - - ClothingOuterWinterHoS + - ClothingOuterWinterHoSUnarmored + - ClothingOuterWinterWardenUnarmored - ClothingOuterWinterQM - ClothingOuterWinterRD - ClothingNeckMantleCap diff --git a/Resources/Prototypes/Entities/Structures/Machines/research.yml b/Resources/Prototypes/Entities/Structures/Machines/research.yml index 83525a0510c..948b3f84b26 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/research.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/research.yml @@ -20,7 +20,6 @@ - CivilianServices - type: ApcPowerReceiver powerLoad: 200 - priority: Low - type: ExtensionCableReceiver - type: WiresPanel - type: WiresVisuals diff --git a/Resources/Prototypes/Entities/Structures/Machines/salvage.yml b/Resources/Prototypes/Entities/Structures/Machines/salvage.yml index 2bf3ce082d8..859dc85ff1d 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/salvage.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/salvage.yml @@ -52,7 +52,6 @@ description: Locates salvage. components: - type: SalvageMagnet - offsetRadiusMax: 32 - type: ApcPowerReceiver powerLoad: 1000 diff --git a/Resources/Prototypes/Entities/Structures/Machines/stasisbed.yml b/Resources/Prototypes/Entities/Structures/Machines/stasisbed.yml index c523e7d68d3..ba9d7be88b0 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/stasisbed.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/stasisbed.yml @@ -5,7 +5,6 @@ description: A bed that massively slows down the patient's metabolism and prevents bodily decay, allowing more time to administer a proper treatment for stabilization. components: - type: StasisBed - baseMultiplier: 10 - type: AntiRotOnBuckle - type: HealOnBuckle damage: diff --git a/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml b/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml index 495ba06e939..efec2392d4c 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml @@ -93,7 +93,6 @@ - type: LitOnPowered - type: ApcPowerReceiver powerLoad: 200 - priority: Low - type: Actions - type: SentienceTarget flavorKind: station-event-random-sentience-flavor-mechanical diff --git a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/trinary.yml b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/trinary.yml index a6f831e1a52..d0f239b338b 100644 --- a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/trinary.yml +++ b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/trinary.yml @@ -64,9 +64,6 @@ - type: Construction graph: GasTrinary node: filter - conditions: - - !type:TileNotBlocked - - !type:NoUnstackableInTile - type: AmbientSound enabled: false volume: -9 diff --git a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/unary.yml b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/unary.yml index 4ee78f1213f..e046fb831a0 100644 --- a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/unary.yml +++ b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/unary.yml @@ -304,7 +304,6 @@ suffix: Enabled components: - type: GasThermoMachine - enabled: true - type: ApcPowerReceiver powerDisabled: false @@ -349,7 +348,6 @@ suffix: Enabled components: - type: GasThermoMachine - enabled: true - type: ApcPowerReceiver powerDisabled: false @@ -459,7 +457,8 @@ solutions: tank: maxVol: 400 - canMix: true + - type: MixableSolution + solution: tank - type: DrainableSolution solution: tank - type: ExaminableSolution diff --git a/Resources/Prototypes/Entities/Structures/Power/Generation/Tesla/coil.yml b/Resources/Prototypes/Entities/Structures/Power/Generation/Tesla/coil.yml index f236bb8a41e..48994ac7d84 100644 --- a/Resources/Prototypes/Entities/Structures/Power/Generation/Tesla/coil.yml +++ b/Resources/Prototypes/Entities/Structures/Power/Generation/Tesla/coil.yml @@ -59,7 +59,6 @@ maxCharge: 1000000 startingCharge: 0 - type: BatteryDischarger - activeSupplyRate: 15000 - type: TeslaCoil chargeFromLightning: 500000 - type: LightningTarget diff --git a/Resources/Prototypes/Entities/Structures/Power/Generation/Tesla/energyball.yml b/Resources/Prototypes/Entities/Structures/Power/Generation/Tesla/energyball.yml index 4567c6d0440..ea41ba3a20d 100644 --- a/Resources/Prototypes/Entities/Structures/Power/Generation/Tesla/energyball.yml +++ b/Resources/Prototypes/Entities/Structures/Power/Generation/Tesla/energyball.yml @@ -85,7 +85,6 @@ - type: ChaoticJump jumpMinInterval: 8 jumpMaxInterval: 15 - offset: 1 - type: WarpPoint follow: true location: tesla ball diff --git a/Resources/Prototypes/Entities/Structures/Power/cable_terminal.yml b/Resources/Prototypes/Entities/Structures/Power/cable_terminal.yml index 2e8f047c214..cc337911742 100644 --- a/Resources/Prototypes/Entities/Structures/Power/cable_terminal.yml +++ b/Resources/Prototypes/Entities/Structures/Power/cable_terminal.yml @@ -19,8 +19,8 @@ damageModifierSet: Metallic - type: RCDDeconstructable cost: 2 - delay: 2 - fx: EffectRCDDeconstruct2 + delay: 0 + fx: EffectRCDConstruct0 - type: Destructible thresholds: - trigger: diff --git a/Resources/Prototypes/Entities/Structures/Power/cables.yml b/Resources/Prototypes/Entities/Structures/Power/cables.yml index a81c89de0fb..d064cc187c4 100644 --- a/Resources/Prototypes/Entities/Structures/Power/cables.yml +++ b/Resources/Prototypes/Entities/Structures/Power/cables.yml @@ -45,8 +45,8 @@ node: power - type: RCDDeconstructable cost: 2 - delay: 2 - fx: EffectRCDDeconstruct2 + delay: 0 + fx: EffectRCDConstruct0 - type: entity parent: CableBase diff --git a/Resources/Prototypes/Entities/Structures/Power/substation.yml b/Resources/Prototypes/Entities/Structures/Power/substation.yml index 4bd0bec5ea0..347b18ecaee 100644 --- a/Resources/Prototypes/Entities/Structures/Power/substation.yml +++ b/Resources/Prototypes/Entities/Structures/Power/substation.yml @@ -241,6 +241,16 @@ - type: Battery maxCharge: 2000000 startingCharge: 2000000 + - type: ContainerFill + containers: + board: [ WallmountSubstationElectronics ] + capacitor: [ CapacitorStockPart ] + powercell: [ PowerCellSmall ] + - type: ContainerContainer + containers: + board: !type:Container + capacitor: !type:Container + powercell: !type:Container # Construction Frame - type: entity diff --git a/Resources/Prototypes/Entities/Structures/Specific/Anomaly/anomalies.yml b/Resources/Prototypes/Entities/Structures/Specific/Anomaly/anomalies.yml index a5c2800e175..2792a0ef325 100644 --- a/Resources/Prototypes/Entities/Structures/Specific/Anomaly/anomalies.yml +++ b/Resources/Prototypes/Entities/Structures/Specific/Anomaly/anomalies.yml @@ -93,7 +93,6 @@ tempChange: 420 - type: ProjectileAnomaly projectilePrototype: ProjectileAnomalyFireball - targetNonSentientChance: 0.6 projectileSpeed: 0.5 minProjectiles: 3 maxProjectiles: 6 @@ -333,7 +332,6 @@ explosionMaxTileIntensity: 20 - type: ProjectileAnomaly projectilePrototype: ProjectileIcicle - targetNonSentientChance: 0.1 - type: EntitySpawnAnomaly entries: - settings: diff --git a/Resources/Prototypes/Entities/Structures/Storage/Closets/closets.yml b/Resources/Prototypes/Entities/Structures/Storage/Closets/closets.yml index 5fda0ddbe2e..fb00db7aa6b 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Closets/closets.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Closets/closets.yml @@ -37,6 +37,19 @@ stateDoorOpen: emergency_open stateDoorClosed: emergency_door +# Emergency N2 closet +- type: entity + id: ClosetEmergencyN2 + name: emergency nitrogen closet + parent: ClosetSteelBase + description: It's full of life-saving equipment. Assuming, that is, that you breathe nitrogen. + components: + - type: Appearance + - type: EntityStorageVisuals + stateBaseClosed: fire + stateDoorOpen: fire_open + stateDoorClosed: n2_door + # Fire safety closet - type: entity id: ClosetFire diff --git a/Resources/Prototypes/Entities/Structures/Storage/Crates/base_structurecrates.yml b/Resources/Prototypes/Entities/Structures/Storage/Crates/base_structurecrates.yml index 403e20b43c7..2d84541231e 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Crates/base_structurecrates.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Crates/base_structurecrates.yml @@ -21,6 +21,9 @@ - state: welded visible: false map: ["enum.WeldableLayers.BaseWelded"] + - state: paper + sprite: Structures/Storage/Crates/labels.rsi + map: ["enum.PaperLabelVisuals.Layer"] - type: InteractionOutline - type: Physics - type: Fixtures @@ -31,7 +34,7 @@ bounds: "-0.4,-0.4,0.4,0.29" density: 50 mask: - - SmallMobMask #this is so they can go under plastic flaps + - CrateMask #this is so they can go under plastic flaps layer: - MachineLayer - type: EntityStorage @@ -55,6 +58,18 @@ - type: EntityStorageVisuals stateDoorOpen: open stateDoorClosed: closed + - type: GenericVisualizer + visuals: + enum.PaperLabelVisuals.HasLabel: + enum.PaperLabelVisuals.Layer: + True: { visible: true } + False: { visible: false } + enum.PaperLabelVisuals.LabelType: + enum.PaperLabelVisuals.Layer: + Paper: { state: paper } + Bounty: { state: bounty } + CaptainsPaper: { state: captains_paper } + Invoice: { state: invoice } - type: PaperLabel labelSlot: insertVerbText: Attach Label @@ -106,6 +121,9 @@ - state: locked map: ["enum.LockVisualLayers.Lock"] shader: unshaded + - state: paper + sprite: Structures/Storage/Crates/labels.rsi + map: ["enum.PaperLabelVisuals.Layer"] - type: Damageable damageContainer: StructuralInorganic damageModifierSet: StructuralMetallic diff --git a/Resources/Prototypes/Entities/Structures/Storage/Crates/crates.yml b/Resources/Prototypes/Entities/Structures/Storage/Crates/crates.yml index 285dd741b5d..11c963ed228 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Crates/crates.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Crates/crates.yml @@ -138,6 +138,9 @@ map: ["enum.StorageVisualLayers.Base"] - state: closed map: ["enum.StorageVisualLayers.Door"] + - state: paper + sprite: Structures/Storage/Crates/labels.rsi + map: ["enum.PaperLabelVisuals.Layer"] - type: Construction graph: WebStructures node: crate @@ -320,6 +323,10 @@ - state: base - state: closed map: ["enum.StorageVisualLayers.Door"] + - state: paper + sprite: Structures/Storage/Crates/labels.rsi + offset: "-0.25,0.625" + map: ["enum.PaperLabelVisuals.Layer"] - type: Icon sprite: Structures/Storage/Crates/livestock.rsi state: base @@ -349,7 +356,7 @@ bounds: "-0.4,-0.4,0.4,0.29" density: 135 mask: - - SmallMobMask #this is so they can go under plastic flaps + - CrateMask #this is so they can go under plastic flaps layer: - LargeMobLayer - type: Construction @@ -371,6 +378,10 @@ - state: base - state: closed map: ["enum.StorageVisualLayers.Door"] + - state: paper + sprite: Structures/Storage/Crates/labels.rsi + offset: "0.0,0.125" + map: ["enum.PaperLabelVisuals.Layer"] - type: Icon sprite: Structures/Storage/Crates/cage.rsi - type: Destructible @@ -402,7 +413,7 @@ bounds: "-0.4,-0.4,0.4,0.29" density: 80 mask: - - LargeMobMask + - CrateMask layer: - LargeMobLayer - type: StaticPrice @@ -424,6 +435,10 @@ - state: welded visible: false map: ["enum.WeldableLayers.BaseWelded"] + - state: paper + sprite: Structures/Storage/Crates/labels.rsi + offset: "0.0,-0.09375" + map: ["enum.PaperLabelVisuals.Layer"] - type: Icon sprite: Structures/Storage/Crates/piratechest.rsi state: crate_icon @@ -449,6 +464,8 @@ - state: welded visible: false map: ["enum.WeldableLayers.BaseWelded"] + - state: paper + map: ["enum.PaperLabelVisuals.Layer"] - type: Icon sprite: Structures/Storage/Crates/toybox.rsi state: crate_icon @@ -465,6 +482,8 @@ - state: base - state: closed map: ["enum.StorageVisualLayers.Door"] + - state: paper + map: ["enum.PaperLabelVisuals.Layer"] - type: Icon sprite: Structures/Storage/Crates/coffin.rsi state: base @@ -503,6 +522,10 @@ - state: base - state: closed map: ["enum.StorageVisualLayers.Door"] + - state: paper + sprite: Structures/Storage/Crates/labels.rsi + offset: "-0.28125,0.625" + map: ["enum.PaperLabelVisuals.Layer"] - type: Icon sprite: Structures/Storage/Crates/wooden_grave.rsi state: base @@ -547,6 +570,10 @@ - state: base - state: closed map: ["enum.StorageVisualLayers.Door"] + - state: paper + sprite: Structures/Storage/Crates/labels.rsi + offset: "-0.3125,0.5625" + map: ["enum.PaperLabelVisuals.Layer"] - type: Icon sprite: Structures/Storage/Crates/stone_grave.rsi state: base @@ -571,6 +598,17 @@ sprite: Structures/Storage/Crates/trashcart.rsi - type: Sprite sprite: Structures/Storage/Crates/trashcart.rsi + layers: + - state: base + - state: closed + map: ["enum.StorageVisualLayers.Door"] + - state: welded + visible: false + map: ["enum.WeldableLayers.BaseWelded"] + - state: paper + sprite: Structures/Storage/Crates/labels.rsi + offset: "0.0,0.03125" + map: ["enum.PaperLabelVisuals.Layer"] - type: entity parent: CrateBaseSecure @@ -581,6 +619,20 @@ sprite: Structures/Storage/Crates/trashcart_jani.rsi - type: Sprite sprite: Structures/Storage/Crates/trashcart_jani.rsi + layers: + - state: base + - state: closed + map: ["enum.StorageVisualLayers.Door"] + - state: welded + visible: false + map: ["enum.WeldableLayers.BaseWelded"] + - state: locked + map: ["enum.LockVisualLayers.Lock"] + shader: unshaded + - state: paper + sprite: Structures/Storage/Crates/labels.rsi + offset: "0.0,0.03125" + map: ["enum.PaperLabelVisuals.Layer"] - type: AccessReader access: [["Janitor"]] diff --git a/Resources/Prototypes/Entities/Structures/Wallmounts/noticeboard.yml b/Resources/Prototypes/Entities/Structures/Wallmounts/noticeboard.yml index 4a442d0542f..421ab93be97 100644 --- a/Resources/Prototypes/Entities/Structures/Wallmounts/noticeboard.yml +++ b/Resources/Prototypes/Entities/Structures/Wallmounts/noticeboard.yml @@ -2,6 +2,8 @@ id: NoticeBoard name: notice board description: Is there a job for a witcher? + placement: + mode: SnapgridCenter components: - type: WallMount - type: Sprite @@ -53,3 +55,9 @@ - type: ContainerContainer containers: storagebase: !type:Container + - type: Tag + tags: + - Wooden + - type: Construction + graph: NoticeBoard + node: noticeBoard diff --git a/Resources/Prototypes/Entities/Structures/Wallmounts/station_map.yml b/Resources/Prototypes/Entities/Structures/Wallmounts/station_map.yml index 94bc33a210a..d1df619b7a4 100644 --- a/Resources/Prototypes/Entities/Structures/Wallmounts/station_map.yml +++ b/Resources/Prototypes/Entities/Structures/Wallmounts/station_map.yml @@ -59,7 +59,6 @@ board: !type:Container - type: ApcPowerReceiver powerLoad: 200 - priority: Low - type: WallMount arc: 360 - type: ExtensionCableReceiver diff --git a/Resources/Prototypes/Entities/Structures/Walls/walls.yml b/Resources/Prototypes/Entities/Structures/Walls/walls.yml index ff9a7ef9ae2..1b105e9cae5 100644 --- a/Resources/Prototypes/Entities/Structures/Walls/walls.yml +++ b/Resources/Prototypes/Entities/Structures/Walls/walls.yml @@ -169,7 +169,7 @@ sprite: Structures/Walls/meat.rsi - type: Construction graph: Girder - node: bananiumWall + node: meatWall - type: Destructible thresholds: - trigger: @@ -546,8 +546,9 @@ node: girder - !type:DoActsBehavior acts: ["Destruction"] - destroySound: - collection: MetalBreak + - !type:PlaySoundBehavior + sound: + collection: MetalBreak - type: IconSmooth key: walls base: reinf_over @@ -797,8 +798,9 @@ collection: MetalSlam - !type:DoActsBehavior acts: ["Destruction"] - destroySound: - collection: MetalBreak + - !type:PlaySoundBehavior + sound: + collection: MetalBreak - type: Construction graph: Girder node: diagonalshuttleWall diff --git a/Resources/Prototypes/Entities/Structures/plastic_flaps.yml b/Resources/Prototypes/Entities/Structures/plastic_flaps.yml index c4ee507395f..4439c11d689 100644 --- a/Resources/Prototypes/Entities/Structures/plastic_flaps.yml +++ b/Resources/Prototypes/Entities/Structures/plastic_flaps.yml @@ -23,7 +23,7 @@ bounds: "-0.49,-0.49,0.49,0.49" density: 100 mask: - - TabletopMachineMask + - Impassable layer: - MidImpassable - type: Damageable @@ -61,7 +61,7 @@ bounds: "-0.49,-0.49,0.49,0.49" density: 100 mask: - - TabletopMachineMask + - Impassable layer: - Opaque - MidImpassable diff --git a/Resources/Prototypes/Guidebook/science.yml b/Resources/Prototypes/Guidebook/science.yml index a21be1678ce..9a89961b458 100644 --- a/Resources/Prototypes/Guidebook/science.yml +++ b/Resources/Prototypes/Guidebook/science.yml @@ -41,7 +41,6 @@ text: "/ServerInfo/Guidebook/Science/Xenoarchaeology.xml" children: - ArtifactReports - - TraversalDistorter - type: guideEntry id: Robotics @@ -55,11 +54,6 @@ name: guide-entry-artifact-reports text: "/ServerInfo/Guidebook/Science/ArtifactReports.xml" -- type: guideEntry - id: TraversalDistorter - name: guide-entry-traversal-distorter - text: "/ServerInfo/Guidebook/Science/TraversalDistorter.xml" - - type: guideEntry id: Cyborgs name: guide-entry-cyborgs diff --git a/Resources/Prototypes/Hydroponics/seeds.yml b/Resources/Prototypes/Hydroponics/seeds.yml index f076a235380..053300b9863 100644 --- a/Resources/Prototypes/Hydroponics/seeds.yml +++ b/Resources/Prototypes/Hydroponics/seeds.yml @@ -421,7 +421,6 @@ nutrientConsumption: 0.40 idealLight: 8 idealHeat: 298 - juicy: true splatPrototype: PuddleSplatter chemicals: Nutriment: @@ -456,7 +455,6 @@ nutrientConsumption: 0.70 idealLight: 8 idealHeat: 298 - juicy: true splatPrototype: PuddleSplatter chemicals: Nutriment: @@ -481,8 +479,10 @@ packetPrototype: BloodTomatoSeeds productPrototypes: - FoodBloodTomato + mutationPrototypes: + - killerTomato harvestRepeat: Repeat - lifespan: 25 + lifespan: 60 maturation: 8 production: 6 yield: 2 @@ -491,7 +491,6 @@ nutrientConsumption: 0.70 idealLight: 8 idealHeat: 298 - juicy: true splatPrototype: PuddleSplatter chemicals: Blood: @@ -503,6 +502,37 @@ Max: 4 PotencyDivisor: 25 +- type: seed + id: killerTomato + name: seeds-killertomato-name + noun: seeds-noun-seeds + displayName: seeds-killertomato-display-name + plantRsi: Objects/Specific/Hydroponics/tomatokiller.rsi + packetPrototype: KillerTomatoSeeds + productPrototypes: + - MobTomatoKiller + harvestRepeat: Repeat + lifespan: 25 + maturation: 15 + production: 6 + yield: 2 + potency: 10 + waterConsumption: 0.60 + nutrientConsumption: 0.70 + idealLight: 8 + idealHeat: 298 + growthStages: 2 + splatPrototype: PuddleSplatter + chemicals: + Blood: + Min: 1 + Max: 10 + PotencyDivisor: 10 + JuiceTomato: + Min: 1 + Max: 4 + PotencyDivisor: 25 + - type: seed id: eggplant name: seeds-eggplant-name @@ -868,7 +898,7 @@ plantRsi: Objects/Specific/Hydroponics/chili.rsi packetPrototype: ChiliSeeds productPrototypes: - - FoodChili + - FoodChiliPepper mutationPrototypes: - chilly harvestRepeat: Repeat @@ -901,7 +931,7 @@ plantRsi: Objects/Specific/Hydroponics/chilly.rsi packetPrototype: ChillySeeds productPrototypes: - - FoodChilly + - FoodChillyPepper harvestRepeat: Repeat lifespan: 25 maturation: 6 diff --git a/Resources/Prototypes/InventoryTemplates/aghost_inventory_template.yml b/Resources/Prototypes/InventoryTemplates/aghost_inventory_template.yml index 6252ad8e993..84806a051a7 100644 --- a/Resources/Prototypes/InventoryTemplates/aghost_inventory_template.yml +++ b/Resources/Prototypes/InventoryTemplates/aghost_inventory_template.yml @@ -11,6 +11,7 @@ displayName: ID - name: id slotTexture: id + fullTextureName: template_small slotFlags: IDCARD slotGroup: SecondHotbar stripTime: 6 diff --git a/Resources/Prototypes/InventoryTemplates/arachnid_inventory_template.yml b/Resources/Prototypes/InventoryTemplates/arachnid_inventory_template.yml index a0c62b04cb1..d96331c9f5b 100644 --- a/Resources/Prototypes/InventoryTemplates/arachnid_inventory_template.yml +++ b/Resources/Prototypes/InventoryTemplates/arachnid_inventory_template.yml @@ -63,6 +63,7 @@ displayName: Suit Storage - name: id slotTexture: id + fullTextureName: template_small slotFlags: IDCARD slotGroup: SecondHotbar stripTime: 6 @@ -72,6 +73,7 @@ displayName: ID - name: belt slotTexture: belt + fullTextureName: template_small slotFlags: BELT slotGroup: SecondHotbar stripTime: 6 @@ -80,6 +82,7 @@ displayName: Belt - name: back slotTexture: back + fullTextureName: template_small slotFlags: BACK slotGroup: SecondHotbar stripTime: 6 @@ -89,6 +92,7 @@ - name: pocket4 slotTexture: web + fullTextureName: template_small slotFlags: POCKET slotGroup: MainHotbar stripTime: 3 @@ -97,6 +101,7 @@ displayName: Pocket 4 - name: pocket3 slotTexture: web + fullTextureName: template_small slotFlags: POCKET slotGroup: MainHotbar stripTime: 3 @@ -112,6 +117,7 @@ displayName: Suit - name: pocket1 slotTexture: pocket + fullTextureName: template_small slotFlags: POCKET slotGroup: MainHotbar stripTime: 3 @@ -122,6 +128,7 @@ stripHidden: true - name: pocket2 slotTexture: pocket + fullTextureName: template_small slotFlags: POCKET slotGroup: MainHotbar stripTime: 3 diff --git a/Resources/Prototypes/InventoryTemplates/corpse_inventory_template.yml b/Resources/Prototypes/InventoryTemplates/corpse_inventory_template.yml index 41fa7dc375f..a672e403b3a 100644 --- a/Resources/Prototypes/InventoryTemplates/corpse_inventory_template.yml +++ b/Resources/Prototypes/InventoryTemplates/corpse_inventory_template.yml @@ -55,6 +55,7 @@ displayName: Head - name: pocket1 slotTexture: pocket + fullTextureName: template_small slotFlags: POCKET slotGroup: MainHotbar stripTime: 3 @@ -65,6 +66,7 @@ stripHidden: true - name: pocket2 slotTexture: pocket + fullTextureName: template_small slotFlags: POCKET slotGroup: MainHotbar stripTime: 3 @@ -84,6 +86,7 @@ displayName: Suit Storage - name: belt slotTexture: belt + fullTextureName: template_small slotFlags: BELT slotGroup: SecondHotbar stripTime: 6 diff --git a/Resources/Prototypes/InventoryTemplates/diona_inventory_template.yml b/Resources/Prototypes/InventoryTemplates/diona_inventory_template.yml index 4bbd18b1364..5d909264fe4 100644 --- a/Resources/Prototypes/InventoryTemplates/diona_inventory_template.yml +++ b/Resources/Prototypes/InventoryTemplates/diona_inventory_template.yml @@ -56,6 +56,7 @@ displayName: Head - name: pocket1 slotTexture: pocket + fullTextureName: template_small slotFlags: POCKET slotGroup: MainHotbar stripTime: 3 @@ -66,6 +67,7 @@ stripHidden: true - name: pocket2 slotTexture: pocket + fullTextureName: template_small slotFlags: POCKET slotGroup: MainHotbar stripTime: 3 @@ -85,6 +87,7 @@ displayName: Suit Storage - name: id slotTexture: id + fullTextureName: template_small slotFlags: IDCARD slotGroup: SecondHotbar stripTime: 6 @@ -94,6 +97,7 @@ displayName: ID - name: belt slotTexture: belt + fullTextureName: template_small slotFlags: BELT slotGroup: SecondHotbar stripTime: 6 @@ -102,6 +106,7 @@ displayName: Belt - name: back slotTexture: back + fullTextureName: template_small slotFlags: BACK slotGroup: SecondHotbar stripTime: 6 diff --git a/Resources/Prototypes/InventoryTemplates/holoclown_inventory_template.yml b/Resources/Prototypes/InventoryTemplates/holoclown_inventory_template.yml index 57dce506eaf..7be9c75015b 100644 --- a/Resources/Prototypes/InventoryTemplates/holoclown_inventory_template.yml +++ b/Resources/Prototypes/InventoryTemplates/holoclown_inventory_template.yml @@ -3,6 +3,7 @@ slots: - name: pocket1 slotTexture: pocket + fullTextureName: template_small slotFlags: POCKET slotGroup: MainHotbar stripTime: 3 @@ -12,6 +13,7 @@ stripHidden: true - name: pocket2 slotTexture: pocket + fullTextureName: template_small slotFlags: POCKET slotGroup: MainHotbar stripTime: 3 diff --git a/Resources/Prototypes/InventoryTemplates/human_inventory_template.yml b/Resources/Prototypes/InventoryTemplates/human_inventory_template.yml index 574ecca35f4..2070f646b79 100644 --- a/Resources/Prototypes/InventoryTemplates/human_inventory_template.yml +++ b/Resources/Prototypes/InventoryTemplates/human_inventory_template.yml @@ -62,6 +62,7 @@ displayName: Head - name: pocket1 slotTexture: pocket + fullTextureName: template_small slotFlags: POCKET slotGroup: MainHotbar stripTime: 3 @@ -72,6 +73,7 @@ stripHidden: true - name: pocket2 slotTexture: pocket + fullTextureName: template_small slotFlags: POCKET slotGroup: MainHotbar stripTime: 3 @@ -91,6 +93,7 @@ displayName: Suit Storage - name: id slotTexture: id + fullTextureName: template_small slotFlags: IDCARD slotGroup: SecondHotbar stripTime: 6 @@ -100,6 +103,7 @@ displayName: ID - name: belt slotTexture: belt + fullTextureName: template_small slotFlags: BELT slotGroup: SecondHotbar stripTime: 6 @@ -108,6 +112,7 @@ displayName: Belt - name: back slotTexture: back + fullTextureName: template_small slotFlags: BACK slotGroup: SecondHotbar stripTime: 6 diff --git a/Resources/Prototypes/InventoryTemplates/kangaroo_inventory_template.yml b/Resources/Prototypes/InventoryTemplates/kangaroo_inventory_template.yml index fb7dee1ec2b..5f81cdebc6c 100644 --- a/Resources/Prototypes/InventoryTemplates/kangaroo_inventory_template.yml +++ b/Resources/Prototypes/InventoryTemplates/kangaroo_inventory_template.yml @@ -35,6 +35,7 @@ - name: belt slotTexture: belt + fullTextureName: template_small slotFlags: BELT slotGroup: SecondHotbar stripTime: 6 @@ -47,6 +48,7 @@ - name: pocket1 slotTexture: pocket + fullTextureName: template_small slotFlags: POCKET slotGroup: MainHotbar stripTime: 3 @@ -60,6 +62,7 @@ slots: - name: pocket1 slotTexture: pocket + fullTextureName: template_small slotFlags: POCKET slotGroup: MainHotbar stripTime: 3 diff --git a/Resources/Prototypes/InventoryTemplates/monkey_inventory_template.yml b/Resources/Prototypes/InventoryTemplates/monkey_inventory_template.yml index 5af23dabac2..bdd51000844 100644 --- a/Resources/Prototypes/InventoryTemplates/monkey_inventory_template.yml +++ b/Resources/Prototypes/InventoryTemplates/monkey_inventory_template.yml @@ -29,6 +29,7 @@ displayName: Jumpsuit - name: id slotTexture: id + fullTextureName: template_small slotFlags: IDCARD slotGroup: SecondHotbar stripTime: 6 diff --git a/Resources/Prototypes/NPCs/Combat/melee.yml b/Resources/Prototypes/NPCs/Combat/melee.yml index 2facfaa5427..122875ed97a 100644 --- a/Resources/Prototypes/NPCs/Combat/melee.yml +++ b/Resources/Prototypes/NPCs/Combat/melee.yml @@ -70,12 +70,11 @@ # Tries to melee attack our target. - type: htnCompound id: MeleeAttackTargetCompound - preconditions: - - !type:KeyExistsPrecondition - key: Target branches: - # Move to melee range and hit them - - tasks: + - preconditions: + - !type:KeyExistsPrecondition + key: Target + tasks: - !type:HTNPrimitiveTask operator: !type:MoveToOperator shutdownState: PlanFinished @@ -104,11 +103,11 @@ - type: htnCompound id: MeleeAttackOrderedTargetCompound - preconditions: - - !type:KeyExistsPrecondition - key: Target branches: - - tasks: + - preconditions: + - !type:KeyExistsPrecondition + key: Target + tasks: - !type:HTNPrimitiveTask operator: !type:MoveToOperator shutdownState: PlanFinished diff --git a/Resources/Prototypes/NPCs/honkbot.yml b/Resources/Prototypes/NPCs/honkbot.yml new file mode 100644 index 00000000000..c9c925ac49d --- /dev/null +++ b/Resources/Prototypes/NPCs/honkbot.yml @@ -0,0 +1,6 @@ +- type: htnCompound + id: HonkbotCompound + branches: + - tasks: + - !type:HTNCompoundTask + task: IdleCompound diff --git a/Resources/Prototypes/NPCs/mob.yml b/Resources/Prototypes/NPCs/mob.yml index 740f7ca5767..b0e1c8ae9b9 100644 --- a/Resources/Prototypes/NPCs/mob.yml +++ b/Resources/Prototypes/NPCs/mob.yml @@ -77,3 +77,16 @@ - tasks: - !type:HTNCompoundTask task: IdleCompound + +- type: htnCompound + id: KillerTomatoCompound + branches: + - tasks: + - !type:HTNCompoundTask + task: MeleeCombatCompound + - tasks: + - !type:HTNCompoundTask + task: FollowCompound + - tasks: + - !type:HTNCompoundTask + task: IdleCompound diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/devices.yml b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/devices.yml index abd4d86a1ef..6838a3d3d09 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/devices.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/devices.yml @@ -83,7 +83,6 @@ - HandheldStationMap chance: 0.8 rarePrototypes: - - TraversalDistorterMachineCircuitboard - CloningPodMachineCircuitboard - MetempsychoticMachineCircuitboard - ReverseEngineeringMachineCircuitboard diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/randomitems.yml b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/randomitems.yml index 55400a0defb..142c1919599 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/randomitems.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/randomitems.yml @@ -85,7 +85,7 @@ - BaseChemistryEmptyVial - Syringe - Dropper - - BodyBag_Folded + - BodyBagFolded - SprayBottle - SprayBottleWater - SprayBottleSpaceCleaner diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/NPCs/mutants.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/NPCs/mutants.yml index 5daf2e15e56..045af4d82fc 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/NPCs/mutants.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/NPCs/mutants.yml @@ -1,75 +1,3 @@ -- type: entity - name: killer tomato - id: MobTomatoKiller - parent: SimpleSpaceMobBase - description: This is really going to let you own some vegans in your next online debate. - components: - - type: InputMover - - type: MobMover - - type: HTN - rootTask: - task: SimpleHostileCompound - - type: NpcFactionMember - factions: - - SimpleHostile - - type: Sprite - drawdepth: Mobs - layers: - - map: [ "enum.DamageStateVisualLayers.Base" ] - state: produce - sprite: Nyanotrasen/Mobs/Mutants/killer_tomato.rsi - - type: Fixtures - fixtures: - fix1: - shape: - !type:PhysShapeCircle - radius: 0.5 - density: 63 - mask: - - MobMask - layer: - - MobLayer - - type: MobState - - type: MobThresholds - thresholds: - 0: Alive - 60: Dead - - type: Appearance - - type: DamageStateVisuals - states: - Alive: - Base: produce - Critical: - Base: produce_dead - Dead: - Base: produce_dead - - type: Butcherable - spawned: - - id: FoodMeatTomato - amount: 3 - - id: KillerTomatoSeeds - amount: 1 - - type: Bloodstream - bloodReagent: DemonsBlood - bloodMaxVolume: 100 - - type: CombatMode - - type: Temperature - heatDamageThreshold: 500 - coldDamageThreshold: 200 - - type: MeleeWeapon - hidden: true - animation: WeaponArcBite - soundHit: - path: /Audio/Effects/bite.ogg - damage: - types: - Piercing: 3 - Slash: 5 - - type: ReplacementAccent - accent: genericAggressive - - type: Produce - - type: NoSlip - # - type: entity # name: oneirophage # parent: SimpleMobBase @@ -309,9 +237,10 @@ - type: Puller needsHands: false - type: Vocal - # mice are gender neutral who cares - maleScream: /Audio/Animals/mouse_squeak.ogg - femaleScream: /Audio/Animals/mouse_squeak.ogg + sounds: + Male: Mouse + Female: Mouse + Unsexed: Mouse wilhelmProbability: 0.001 - type: Tag tags: @@ -346,8 +275,6 @@ proper: true gender: male - type: IntrinsicRadioReceiver - channels: - - Common - type: IntrinsicRadioTransmitter channels: - Common diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/NPCs/xeno.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/NPCs/xeno.yml index 9dbe9f95f70..e12b14d4906 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/NPCs/xeno.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/NPCs/xeno.yml @@ -6,6 +6,7 @@ id: MobPurpleSnakeGhost components: - type: GhostTakeoverAvailable + - type: GhostRole allowMovement: true allowSpeech: false makeSentient: true @@ -19,6 +20,7 @@ id: MobSmallPurpleSnakeGhost components: - type: GhostTakeoverAvailable + - type: GhostRole allowMovement: true allowSpeech: false makeSentient: true diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Chapel/amphorae.yml b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Chapel/amphorae.yml index 10f5d631aa5..413304dca40 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Chapel/amphorae.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Chapel/amphorae.yml @@ -17,7 +17,6 @@ jar: maxVol: 120 - type: Drink - isOpen: true solution: jar - type: Spillable solution: jar diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Hydroponics/seeds.yml b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Hydroponics/seeds.yml deleted file mode 100644 index 870a0861456..00000000000 --- a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Hydroponics/seeds.yml +++ /dev/null @@ -1,9 +0,0 @@ -- type: entity - parent: SeedBase - name: packet of killer tomato seeds - id: KillerTomatoSeeds - components: - - type: Seed - seedId: killertomato - - type: Sprite - sprite: Nyanotrasen/Mobs/Mutants/killer_tomato.rsi diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Mail/base_mail.yml b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Mail/base_mail.yml index c1ca2cd60b1..8904b6991be 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Mail/base_mail.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Specific/Mail/base_mail.yml @@ -77,7 +77,7 @@ - trigger: !type:DamageTrigger damage: 5 - triggersOnce: true + #triggersOnce: true behaviors: - !type:DoActsBehavior acts: [ "Breakage" ] diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Structures/Machines/deep_fryer.yml b/Resources/Prototypes/Nyanotrasen/Entities/Structures/Machines/deep_fryer.yml index fa3e0537dbb..4a57369a14f 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Structures/Machines/deep_fryer.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Structures/Machines/deep_fryer.yml @@ -124,7 +124,6 @@ - type: RefillableSolution solution: vat_oil - type: Drink - isOpen: true solution: vat_oil - type: Appearance - type: ActivatableUI diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Structures/Research/oracle.yml b/Resources/Prototypes/Nyanotrasen/Entities/Structures/Research/oracle.yml index f7481abf1ed..5d9b0e308dd 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Structures/Research/oracle.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Structures/Research/oracle.yml @@ -22,7 +22,6 @@ fountain: maxVol: 200 - type: Drink - isOpen: true solution: fountain - type: DrawableSolution solution: fountain diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Structures/Research/sophicscribe.yml b/Resources/Prototypes/Nyanotrasen/Entities/Structures/Research/sophicscribe.yml index ae85cd25e03..deaf5581aa9 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Structures/Research/sophicscribe.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Structures/Research/sophicscribe.yml @@ -16,9 +16,6 @@ - type: Speech speechSounds: Tenor - type: IntrinsicRadioReceiver - channels: - - Common - - Science - type: IntrinsicRadioTransmitter channels: - Common diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Structures/Walls/walls.yml b/Resources/Prototypes/Nyanotrasen/Entities/Structures/Walls/walls.yml index 0d398128af5..b0b92899502 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Structures/Walls/walls.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Structures/Walls/walls.yml @@ -30,8 +30,9 @@ node: girder - !type:DoActsBehavior acts: ["Destruction"] - destroySound: - collection: MetalBreak + - !type:PlaySoundBehavior + sound: + collection: MetalBreak - type: IconSmooth key: walls base: paperwall diff --git a/Resources/Prototypes/Nyanotrasen/Hydroponics/seeds.yml b/Resources/Prototypes/Nyanotrasen/Hydroponics/seeds.yml deleted file mode 100644 index 688af9fc50c..00000000000 --- a/Resources/Prototypes/Nyanotrasen/Hydroponics/seeds.yml +++ /dev/null @@ -1,30 +0,0 @@ -- type: seed - id: killertomato - name: seeds-killertomato-name - noun: seeds-noun-seeds - displayName: seeds-killertomato-display-name - plantRsi: Nyanotrasen/Mobs/Mutants/killer_tomato.rsi - packetPrototype: KillerTomatoSeeds - productPrototypes: - - MobTomatoKiller - lifespan: 25 - maturation: 8 - production: 6 - yield: 2 - potency: 10 - waterConsumption: 6 - growthStages: 2 - nutrientConsumption: 0.25 - idealLight: 8 - idealHeat: 298 - juicy: true - splatPrototype: PuddleSplatter - chemicals: - Nutriment: - Min: 1 - Max: 10 - PotencyDivisor: 10 - DemonsBlood: - Min: 1 - Max: 4 - PotencyDivisor: 25 diff --git a/Resources/Prototypes/Nyanotrasen/Recipes/Cooking/meal_recipes.yml b/Resources/Prototypes/Nyanotrasen/Recipes/Cooking/meal_recipes.yml index 51777e2f594..b61e99ba920 100644 --- a/Resources/Prototypes/Nyanotrasen/Recipes/Cooking/meal_recipes.yml +++ b/Resources/Prototypes/Nyanotrasen/Recipes/Cooking/meal_recipes.yml @@ -26,7 +26,7 @@ solids: FoodSnackBoritos: 1 FoodCheeseSlice: 1 - FoodChili: 1 + FoodChiliPepper: 1 FoodMeatMeatball: 1 # Base ingredients: Should be moved out of microwave as soon as possible. @@ -62,7 +62,7 @@ solids: FoodTofuSlice: 2 FoodOnionSlice: 1 - FoodChili: 1 + FoodChiliPepper: 1 FoodCarrot: 1 FoodCheeseCurds: 1 @@ -97,7 +97,7 @@ solids: FoodCheeseSlice: 1 FoodCabbage: 1 - FoodChili: 1 + FoodChiliPepper: 1 FoodPotato: 1 FoodOnionSlice: 2 @@ -111,7 +111,7 @@ solids: FoodCheeseSlice: 1 #Grilled cheese slice FoodMothSaladBase: 1 - FoodChili: 1 + FoodChiliPepper: 1 FoodCabbage: 1 - type: microwaveMealRecipe @@ -142,7 +142,7 @@ FoodRiceBoiled: 1 FoodPotato: 2 FoodCabbage: 1 - FoodChili: 1 + FoodChiliPepper: 1 #Herbs: 1 - type: microwaveMealRecipe @@ -307,7 +307,7 @@ solids: FoodBowlBig: 1 FoodTofuSlice: 1 - FoodChili: 1 + FoodChiliPepper: 1 #FoodYogurt: 1 #Milk and Cream placeholder - type: microwaveMealRecipe @@ -368,7 +368,7 @@ solids: FoodBowlBig: 1 FoodTomato: 1 - FoodChili: 1 + FoodChiliPepper: 1 # Salads: These should be moved out of the microwave as soon as possible @@ -421,7 +421,7 @@ solids: FoodBowlBig: 1 FoodMothSaladBase: 1 - FoodChili: 1 + FoodChiliPepper: 1 FoodOnionRed: 1 FoodAmbrosiaVulgaris: 1 #Herbs @@ -438,7 +438,7 @@ FoodDoughFlat: 1 FoodCheeseSlice: 1 FoodMothBakedCorn: 1 - FoodChili: 1 + FoodChiliPepper: 1 - type: microwaveMealRecipe id: RecipeMothFiveCheesePizza diff --git a/Resources/Prototypes/Objectives/traitor.yml b/Resources/Prototypes/Objectives/traitor.yml index ffeba32546d..80fb2d5b9e1 100644 --- a/Resources/Prototypes/Objectives/traitor.yml +++ b/Resources/Prototypes/Objectives/traitor.yml @@ -191,6 +191,9 @@ components: - type: StealCondition stealGroup: ClothingOuterHardsuitRd + - type: Objective + # This item must be worn or stored in a slowing duffelbag, very hard to hide. + difficulty: 3 - type: entity noSpawn: true diff --git a/Resources/Prototypes/Procedural/dungeon_configs.yml b/Resources/Prototypes/Procedural/dungeon_configs.yml index 9e8d3a44095..3614e4e787f 100644 --- a/Resources/Prototypes/Procedural/dungeon_configs.yml +++ b/Resources/Prototypes/Procedural/dungeon_configs.yml @@ -292,11 +292,11 @@ - !type:JunctionPostGen width: 1 entities: - - AirlockHydroGlassLocked + - AirlockGlass - !type:JunctionPostGen entities: - - AirlockHydroGlassLocked + - AirlockGlass - !type:AutoCablingPostGen diff --git a/Resources/Prototypes/RCD/rcd.yml b/Resources/Prototypes/RCD/rcd.yml index cb2c9ed2341..500b5f59bf9 100644 --- a/Resources/Prototypes/RCD/rcd.yml +++ b/Resources/Prototypes/RCD/rcd.yml @@ -14,14 +14,16 @@ - type: rcd id: DeconstructLattice # Hidden prototype - do not add to RCDs + name: rcd-component-deconstruct mode: Deconstruct cost: 2 - delay: 1 + delay: 0 rotation: Camera - fx: EffectRCDDeconstruct2 + fx: EffectRCDConstruct0 - type: rcd id: DeconstructTile # Hidden prototype - do not add to RCDs + name: rcd-component-deconstruct mode: Deconstruct cost: 4 delay: 4 @@ -59,7 +61,6 @@ - type: rcd id: Catwalk - name: rcd-component-catwalk category: WallsAndFlooring sprite: /Textures/Interface/Radial/RCD/catwalk.png mode: ConstructObject @@ -76,7 +77,6 @@ # Walls - type: rcd id: WallSolid - name: rcd-component-wall-solid category: WallsAndFlooring sprite: /Textures/Interface/Radial/RCD/solid_wall.png mode: ConstructObject @@ -89,7 +89,6 @@ - type: rcd id: Grille - name: rcd-component-grille category: WindowsAndGrilles sprite: /Textures/Interface/Radial/RCD/grille.png mode: ConstructObject @@ -103,7 +102,6 @@ # Windows - type: rcd id: Window - name: rcd-component-window category: WindowsAndGrilles sprite: /Textures/Interface/Radial/RCD/window.png mode: ConstructObject @@ -118,7 +116,6 @@ - type: rcd id: WindowDirectional - name: rcd-component-window-directional category: WindowsAndGrilles sprite: /Textures/Interface/Radial/RCD/directional.png mode: ConstructObject @@ -134,7 +131,6 @@ - type: rcd id: ReinforcedWindow - name: rcd-component-reinforced-window category: WindowsAndGrilles sprite: /Textures/Interface/Radial/RCD/window_reinforced.png mode: ConstructObject @@ -149,7 +145,6 @@ - type: rcd id: WindowReinforcedDirectional - name: rcd-component-window-reinforced-directional category: WindowsAndGrilles sprite: /Textures/Interface/Radial/RCD/directional_reinforced.png mode: ConstructObject @@ -166,7 +161,6 @@ # Airlocks - type: rcd id: Airlock - name: rcd-component-airlock category: Airlocks sprite: /Textures/Interface/Radial/RCD/airlock.png mode: ConstructObject @@ -179,7 +173,6 @@ - type: rcd id: AirlockGlass - name: rcd-component-airlock-glass category: Airlocks sprite: /Textures/Interface/Radial/RCD/glass_airlock.png mode: ConstructObject @@ -192,7 +185,6 @@ - type: rcd id: Firelock - name: rcd-component-firelock category: Airlocks sprite: /Textures/Interface/Radial/RCD/firelock.png mode: ConstructObject @@ -206,7 +198,6 @@ # Lighting - type: rcd id: TubeLight - name: rcd-component-tube-light category: Lighting sprite: /Textures/Interface/Radial/RCD/tube_light.png mode: ConstructObject @@ -220,7 +211,6 @@ - type: rcd id: BulbLight - name: rcd-component-window-bulb-light category: Lighting sprite: /Textures/Interface/Radial/RCD/bulb_light.png mode: ConstructObject @@ -235,7 +225,6 @@ # Electrical - type: rcd id: LVCable - name: rcd-component-window-lv-cable category: Electrical sprite: /Textures/Interface/Radial/RCD/lv_coil.png mode: ConstructObject @@ -250,7 +239,6 @@ - type: rcd id: MVCable - name: rcd-component-window-mv-cable category: Electrical sprite: /Textures/Interface/Radial/RCD/mv_coil.png mode: ConstructObject @@ -265,7 +253,6 @@ - type: rcd id: HVCable - name: rcd-component-window-hv-cable category: Electrical sprite: /Textures/Interface/Radial/RCD/hv_coil.png mode: ConstructObject @@ -280,7 +267,6 @@ - type: rcd id: CableTerminal - name: rcd-component-window-cable-terminal category: Electrical sprite: /Textures/Interface/Radial/RCD/cable_terminal.png mode: ConstructObject diff --git a/Resources/Prototypes/Reagents/Materials/Consumable/Drink/alcohol.yml b/Resources/Prototypes/Reagents/Materials/Consumable/Drink/alcohol.yml index 12f5a80185a..79eec1186ca 100644 --- a/Resources/Prototypes/Reagents/Materials/Consumable/Drink/alcohol.yml +++ b/Resources/Prototypes/Reagents/Materials/Consumable/Drink/alcohol.yml @@ -39,6 +39,7 @@ metamorphicMaxFillLevels: 5 metamorphicFillBaseName: fill- metamorphicChangeColor: false + fizziness: 0.6 - type: reagent id: Beer @@ -55,6 +56,7 @@ metamorphicMaxFillLevels: 6 metamorphicFillBaseName: fill- metamorphicChangeColor: true + fizziness: 0.6 - type: reagent id: BlueCuracao @@ -459,6 +461,7 @@ - !type:AdjustReagent reagent: Ethanol amount: 0.3 + fizziness: 0.8 # Mixed Alcohol @@ -676,6 +679,7 @@ - !type:AdjustReagent reagent: Ethanol amount: 0.15 + fizziness: 0.3 - type: reagent id: BlackRussian @@ -815,6 +819,7 @@ - !type:AdjustReagent reagent: Ethanol amount: 0.07 + fizziness: 0.2 - type: reagent id: DemonsBlood @@ -830,6 +835,7 @@ metamorphicMaxFillLevels: 4 metamorphicFillBaseName: fill- metamorphicChangeColor: true + fizziness: 0.3 - type: reagent id: DevilsKiss @@ -917,6 +923,7 @@ metamorphicMaxFillLevels: 5 metamorphicFillBaseName: fill- metamorphicChangeColor: true + fizziness: 0.15 - type: reagent id: GargleBlaster @@ -963,6 +970,7 @@ - !type:AdjustReagent reagent: Ethanol amount: 0.07 + fizziness: 0.4 # A little high, but it has fizz in the name - type: reagent id: GinTonic @@ -986,6 +994,7 @@ - !type:AdjustReagent reagent: Ethanol amount: 0.07 + fizziness: 0.4 - type: reagent id: Gildlager @@ -1063,6 +1072,7 @@ metamorphicMaxFillLevels: 6 metamorphicFillBaseName: fill- metamorphicChangeColor: false + fizziness: 0.6 - type: reagent id: IrishCarBomb @@ -1200,6 +1210,7 @@ metamorphicMaxFillLevels: 2 metamorphicFillBaseName: fill- metamorphicChangeColor: false + fizziness: 0.7 - type: reagent id: Margarita @@ -1253,6 +1264,7 @@ metamorphicMaxFillLevels: 5 metamorphicFillBaseName: fill- metamorphicChangeColor: true + fizziness: 0.4 - type: reagent id: Mojito @@ -1268,6 +1280,7 @@ metamorphicMaxFillLevels: 6 metamorphicFillBaseName: fill- metamorphicChangeColor: false + fizziness: 0.3 - type: reagent id: Moonshine @@ -1372,6 +1385,7 @@ metamorphicMaxFillLevels: 5 metamorphicFillBaseName: fill- metamorphicChangeColor: true + fizziness: 0.4 - type: reagent id: PinaColada @@ -1501,6 +1515,7 @@ metamorphicMaxFillLevels: 6 metamorphicFillBaseName: fill- metamorphicChangeColor: true + fizziness: 0.3 - type: reagent id: SuiDream @@ -1516,6 +1531,7 @@ metamorphicMaxFillLevels: 5 metamorphicFillBaseName: fill- metamorphicChangeColor: false + fizziness: 0.2 - type: reagent id: SyndicateBomb @@ -1531,6 +1547,7 @@ metamorphicMaxFillLevels: 6 metamorphicFillBaseName: fill- metamorphicChangeColor: true + fizziness: 0.6 - type: reagent id: TequilaSunrise @@ -1569,6 +1586,7 @@ metamorphicMaxFillLevels: 3 metamorphicFillBaseName: fill- metamorphicChangeColor: false + fizziness: 0.2 - type: reagent id: ThreeMileIsland @@ -1656,6 +1674,7 @@ - !type:AdjustReagent reagent: Ethanol amount: 0.07 + fizziness: 0.4 - type: reagent id: WhiskeyCola @@ -1679,6 +1698,7 @@ - !type:AdjustReagent reagent: Ethanol amount: 0.07 + fizziness: 0.3 - type: reagent id: WhiskeySoda @@ -1702,6 +1722,7 @@ - !type:AdjustReagent reagent: Ethanol amount: 0.07 + fizziness: 0.4 - type: reagent id: WhiteGilgamesh @@ -1719,6 +1740,7 @@ - !type:AdjustReagent reagent: Ethanol amount: 0.15 + fizziness: 0.5 - type: reagent id: WhiteRussian diff --git a/Resources/Prototypes/Reagents/Materials/Consumable/Drink/base_drink.yml b/Resources/Prototypes/Reagents/Materials/Consumable/Drink/base_drink.yml index 9984b4c0cf6..19a5e1bf8f1 100644 --- a/Resources/Prototypes/Reagents/Materials/Consumable/Drink/base_drink.yml +++ b/Resources/Prototypes/Reagents/Materials/Consumable/Drink/base_drink.yml @@ -40,6 +40,7 @@ collection: FootstepSticky params: volume: 6 + fizziness: 0.5 - type: reagent id: BaseAlcohol @@ -75,4 +76,4 @@ footstepSound: collection: FootstepSticky params: - volume: 6 \ No newline at end of file + volume: 6 diff --git a/Resources/Prototypes/Reagents/Materials/Consumable/Drink/drinks.yml b/Resources/Prototypes/Reagents/Materials/Consumable/Drink/drinks.yml index 5c09b3c909b..71de67adb99 100644 --- a/Resources/Prototypes/Reagents/Materials/Consumable/Drink/drinks.yml +++ b/Resources/Prototypes/Reagents/Materials/Consumable/Drink/drinks.yml @@ -322,6 +322,7 @@ damage: types: Poison: 1 + fizziness: 0.5 - type: reagent id: SodaWater @@ -331,6 +332,7 @@ physicalDesc: reagent-physical-desc-fizzy flavor: fizzy color: "#619494" + fizziness: 0.8 - type: reagent id: SoyLatte @@ -373,6 +375,7 @@ physicalDesc: reagent-physical-desc-fizzy flavor: tonicwater color: "#0064C8" + fizziness: 0.4 - type: reagent id: Water @@ -467,6 +470,7 @@ effects: - !type:SatiateThirst factor: 1 + fizziness: 0.3 - type: reagent id: Posca @@ -491,6 +495,7 @@ metamorphicMaxFillLevels: 3 metamorphicFillBaseName: fill- metamorphicChangeColor: false + fizziness: 0.3 - type: reagent id: Rewriter @@ -506,6 +511,7 @@ metamorphicMaxFillLevels: 5 metamorphicFillBaseName: fill- metamorphicChangeColor: true + fizziness: 0.3 - type: reagent id: Mopwata diff --git a/Resources/Prototypes/Reagents/Materials/Consumable/Drink/soda.yml b/Resources/Prototypes/Reagents/Materials/Consumable/Drink/soda.yml index ba5adc4f2ae..3dda5b5329a 100644 --- a/Resources/Prototypes/Reagents/Materials/Consumable/Drink/soda.yml +++ b/Resources/Prototypes/Reagents/Materials/Consumable/Drink/soda.yml @@ -59,6 +59,7 @@ - !type:AdjustReagent reagent: Theobromine amount: 0.05 + fizziness: 0.4 - type: reagent id: GrapeSoda @@ -84,6 +85,7 @@ metamorphicMaxFillLevels: 5 metamorphicFillBaseName: fill- metamorphicChangeColor: true + fizziness: 0 - type: reagent id: LemonLime @@ -102,6 +104,7 @@ physicalDesc: reagent-physical-desc-fizzy flavor: pwrgamesoda color: "#9385bf" + fizziness: 0.9 # gamers crave the fizz - type: reagent id: RootBeer @@ -132,6 +135,7 @@ metamorphicMaxFillLevels: 7 metamorphicFillBaseName: fill- metamorphicChangeColor: false + fizziness: 0.4 - type: reagent id: SolDry diff --git a/Resources/Prototypes/Reagents/elements.yml b/Resources/Prototypes/Reagents/elements.yml index b3a7fe1bb0a..e47335b1b4a 100644 --- a/Resources/Prototypes/Reagents/elements.yml +++ b/Resources/Prototypes/Reagents/elements.yml @@ -72,7 +72,7 @@ Medicine: effects: - !type:ModifyBloodLevel - condition: + conditions: - !type:OrganType type: Arachnid shouldHave: true @@ -163,7 +163,7 @@ Medicine: effects: - !type:ModifyBloodLevel - condition: + conditions: - !type:OrganType type: Arachnid shouldHave: false diff --git a/Resources/Prototypes/Reagents/medicine.yml b/Resources/Prototypes/Reagents/medicine.yml index b3b5bcebb31..dfe96359e68 100644 --- a/Resources/Prototypes/Reagents/medicine.yml +++ b/Resources/Prototypes/Reagents/medicine.yml @@ -243,7 +243,7 @@ types: Asphyxiation: 1 Cold: 2 - groups: + groups: Brute: 0.5 - !type:Jitter conditions: diff --git a/Resources/Prototypes/Reagents/toxins.yml b/Resources/Prototypes/Reagents/toxins.yml index d6c645be4c8..27f16b85100 100644 --- a/Resources/Prototypes/Reagents/toxins.yml +++ b/Resources/Prototypes/Reagents/toxins.yml @@ -484,8 +484,8 @@ - !type:PopupMessage conditions: - !type:OrganType - type: Human - reagent: Protein + type: Animal + shouldHave: false type: Local visualType: MediumCaution messages: [ "generic-reagent-effect-sick" ] @@ -494,19 +494,21 @@ probability: 0.1 conditions: - !type:OrganType - type: Human + type: Animal + shouldHave: false - !type:HealthChange conditions: - !type:OrganType - type: Human + type: Animal + shouldHave: false damage: types: Poison: 1 - !type:AdjustReagent conditions: - !type:OrganType - type: Human - shouldHave: false + type: Animal + shouldHave: true reagent: Protein amount: 0.5 diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/furniture/noticeboard.yml b/Resources/Prototypes/Recipes/Construction/Graphs/furniture/noticeboard.yml new file mode 100644 index 00000000000..324745cbb9d --- /dev/null +++ b/Resources/Prototypes/Recipes/Construction/Graphs/furniture/noticeboard.yml @@ -0,0 +1,26 @@ +- type: constructionGraph + id: NoticeBoard + start: start + graph: + - node: start + actions: + - !type:DestroyEntity {} + edges: + - to: noticeBoard + completed: + - !type:SnapToGrid { } + steps: + - material: WoodPlank + amount: 3 + doAfter: 2 + - node: noticeBoard + entity: NoticeBoard + edges: + - to: start + completed: + - !type:SpawnPrototype + prototype: MaterialWoodPlank + amount: 3 + steps: + - tool: Prying + doAfter: 3 diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/structures/airlock.yml b/Resources/Prototypes/Recipes/Construction/Graphs/structures/airlock.yml index 5529514fdcb..0bb6b4b1ce4 100644 --- a/Resources/Prototypes/Recipes/Construction/Graphs/structures/airlock.yml +++ b/Resources/Prototypes/Recipes/Construction/Graphs/structures/airlock.yml @@ -121,7 +121,6 @@ actions: - !type:SetWiresPanelSecurity wiresAccessible: true - weldingAllowed: true edges: - to: glassElectronics conditions: @@ -162,7 +161,6 @@ actions: - !type:SetWiresPanelSecurity wiresAccessible: true - weldingAllowed: true edges: - to: wired conditions: @@ -201,7 +199,6 @@ actions: - !type:SetWiresPanelSecurity wiresAccessible: true - weldingAllowed: true edges: - to: medSecurityUnfinished conditions: @@ -225,7 +222,6 @@ - !type:SetWiresPanelSecurity examine: wires-panel-component-on-examine-security-level1 wiresAccessible: false - weldingAllowed: false edges: - to: glassAirlock completed: @@ -278,7 +274,6 @@ - !type:SetWiresPanelSecurity examine: wires-panel-component-on-examine-security-level2 wiresAccessible: false - weldingAllowed: false edges: - to: medSecurityUnfinished conditions: @@ -293,7 +288,6 @@ - !type:SetWiresPanelSecurity examine: wires-panel-component-on-examine-security-level3 wiresAccessible: false - weldingAllowed: false edges: - to: glassAirlock completed: @@ -346,7 +340,6 @@ - !type:SetWiresPanelSecurity examine: wires-panel-component-on-examine-security-level4 wiresAccessible: false - weldingAllowed: false edges: - to: highSecurityUnfinished conditions: @@ -369,7 +362,6 @@ - !type:SetWiresPanelSecurity examine: wires-panel-component-on-examine-security-level5 wiresAccessible: false - weldingAllowed: true edges: - to: highSecurity completed: @@ -397,7 +389,6 @@ - !type:SetWiresPanelSecurity examine: wires-panel-component-on-examine-security-level6 wiresAccessible: false - weldingAllowed: false edges: - to: maxSecurity completed: @@ -422,7 +413,6 @@ - !type:SetWiresPanelSecurity examine: wires-panel-component-on-examine-security-level7 wiresAccessible: false - weldingAllowed: false edges: - to: superMaxSecurityUnfinished conditions: diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/structures/airlock_clockwork.yml b/Resources/Prototypes/Recipes/Construction/Graphs/structures/airlock_clockwork.yml index b0cfe30eb01..76b641a06d9 100644 --- a/Resources/Prototypes/Recipes/Construction/Graphs/structures/airlock_clockwork.yml +++ b/Resources/Prototypes/Recipes/Construction/Graphs/structures/airlock_clockwork.yml @@ -121,7 +121,6 @@ actions: - !type:SetWiresPanelSecurity wiresAccessible: true - weldingAllowed: true edges: - to: glassElectronics conditions: @@ -146,7 +145,6 @@ actions: - !type:SetWiresPanelSecurity wiresAccessible: true - weldingAllowed: true edges: - to: wired conditions: diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/structures/conveyor.yml b/Resources/Prototypes/Recipes/Construction/Graphs/structures/conveyor.yml index ff0ecbc4ed1..43d2484bbd2 100644 --- a/Resources/Prototypes/Recipes/Construction/Graphs/structures/conveyor.yml +++ b/Resources/Prototypes/Recipes/Construction/Graphs/structures/conveyor.yml @@ -23,7 +23,6 @@ - !type:SetAnchor value: true - !type:SnapToGrid - offset: Center edges: - to: item steps: @@ -31,4 +30,4 @@ doAfter: 3 completed: - !type:SetAnchor - value: false \ No newline at end of file + value: false diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/structures/lighting.yml b/Resources/Prototypes/Recipes/Construction/Graphs/structures/lighting.yml index 111d8ebcd72..f70a44efe3c 100644 --- a/Resources/Prototypes/Recipes/Construction/Graphs/structures/lighting.yml +++ b/Resources/Prototypes/Recipes/Construction/Graphs/structures/lighting.yml @@ -19,6 +19,11 @@ - material: Steel amount: 5 doAfter: 2.0 + - to: strobeLight + steps: + - material: Steel + amount: 1 + doAfter: 2.0 - node: tubeLight entity: PoweredlightEmpty edges: @@ -63,4 +68,19 @@ - !type:SpawnPrototype prototype: SheetSteel1 amount: 5 + - !type:DeleteEntity {} + - node: strobeLight + entity: PoweredStrobeLightEmpty + edges: + - to: start + conditions: + - !type:ContainerEmpty + container: "light_bulb" + steps: + - tool: Screwing + doAfter: 2.0 + completed: + - !type:SpawnPrototype + prototype: SheetSteel1 + amount: 1 - !type:DeleteEntity {} \ No newline at end of file diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/utilities/solarpanel.yml b/Resources/Prototypes/Recipes/Construction/Graphs/utilities/solarpanel.yml index 0914ae46e56..922e8857c92 100644 --- a/Resources/Prototypes/Recipes/Construction/Graphs/utilities/solarpanel.yml +++ b/Resources/Prototypes/Recipes/Construction/Graphs/utilities/solarpanel.yml @@ -28,18 +28,15 @@ - to: solarpanel conditions: - !type:EntityAnchored - value: true steps: - material: Glass amount: 2 doAfter: 0.5 completed: - !type:SnapToGrid - offset: Center - to: solartracker conditions: - !type:EntityAnchored - value: true steps: - tag: SolarTrackerElectronics name: Solar Tracker Electronics @@ -52,7 +49,6 @@ doAfter: 2 completed: - !type:SnapToGrid - offset: Center - node: solarpanel entity: SolarPanel diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/utilities/wallmount_substation.yml b/Resources/Prototypes/Recipes/Construction/Graphs/utilities/wallmount_substation.yml index 381871f94af..7e4087b20a2 100644 --- a/Resources/Prototypes/Recipes/Construction/Graphs/utilities/wallmount_substation.yml +++ b/Resources/Prototypes/Recipes/Construction/Graphs/utilities/wallmount_substation.yml @@ -26,7 +26,13 @@ steps: - material: Cable amount: 5 - doAfter: 2 + doAfter: 0.5 + - material: CableMV + amount: 5 + doAfter: 0.5 + - material: CableHV + amount: 5 + doAfter: 0.5 - tool: Screwing doAfter: 2 @@ -41,12 +47,34 @@ icon: sprite: "Objects/Misc/module.rsi" state: "charger_APC" - doAfter: 1 + doAfter: 0.5 + - anyTags: + - PowerCell + - PowerCellSmall + store: powercell + name: a powercell + icon: + sprite: "Objects/Power/power_cells.rsi" + state: "medium" + doAfter: 0.5 + - tag: CapacitorStockPart + name: a capacitor + store: capacitor + icon: + sprite: "Objects/Misc/stock_parts.rsi" + state: "capacitor" + doAfter: 0.5 - to: frame completed: - !type:GivePrototype prototype: CableApcStack1 amount: 5 + - !type:GivePrototype + prototype: CableMVStack1 + amount: 5 + - !type:GivePrototype + prototype: CableHVStack1 + amount: 5 steps: - tool: Cutting doAfter: 1 diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/weapons/spear.yml b/Resources/Prototypes/Recipes/Construction/Graphs/weapons/spear.yml index 6e1c682f475..f1efe63ff50 100644 --- a/Resources/Prototypes/Recipes/Construction/Graphs/weapons/spear.yml +++ b/Resources/Prototypes/Recipes/Construction/Graphs/weapons/spear.yml @@ -10,7 +10,7 @@ amount: 2 doAfter: 2 - material: Cable - amount: 2 + amount: 3 doAfter: 1 - tag: GlassShard name: Glass Shard @@ -33,7 +33,7 @@ amount: 2 doAfter: 2 - material: Cable - amount: 2 + amount: 3 doAfter: 1 - tag: ReinforcedGlassShard name: Reinforced Glass Shard @@ -56,7 +56,7 @@ amount: 2 doAfter: 2 - material: Cable - amount: 2 + amount: 3 doAfter: 1 - tag: PlasmaGlassShard name: Plasma Glass Shard @@ -79,7 +79,7 @@ amount: 2 doAfter: 2 - material: Cable - amount: 2 + amount: 3 doAfter: 1 - tag: UraniumGlassShard name: Uranium Glass Shard diff --git a/Resources/Prototypes/Recipes/Construction/furniture.yml b/Resources/Prototypes/Recipes/Construction/furniture.yml index a5cf53107db..5f7ec9c92d8 100644 --- a/Resources/Prototypes/Recipes/Construction/furniture.yml +++ b/Resources/Prototypes/Recipes/Construction/furniture.yml @@ -884,3 +884,21 @@ canBuildInImpassable: false conditions: - !type:TileNotBlocked + +- type: construction + id: NoticeBoard + name: notice board + description: Wooden notice board, can store paper inside itself. + graph: NoticeBoard + startNode: start + targetNode: noticeBoard + category: construction-category-furniture + icon: + sprite: Structures/Wallmounts/noticeboard.rsi + state: noticeboard + objectType: Structure + placementMode: SnapgridCenter + canRotate: true + canBuildInImpassable: false + conditions: + - !type:TileNotBlocked diff --git a/Resources/Prototypes/Recipes/Construction/structures.yml b/Resources/Prototypes/Recipes/Construction/structures.yml index a1f370cc1bd..46f61807f3f 100644 --- a/Resources/Prototypes/Recipes/Construction/structures.yml +++ b/Resources/Prototypes/Recipes/Construction/structures.yml @@ -1472,6 +1472,24 @@ conditions: - !type:TileNotBlocked +- type: construction + name: strobe light + id: LightStrobeFixture + graph: LightFixture + startNode: start + targetNode: strobeLight + category: construction-category-structures + description: A wall light fixture. Use light bulbs. + icon: + sprite: Structures/Wallmounts/Lighting/strobe_light.rsi + state: base + objectType: Structure + placementMode: SnapgridCenter + canRotate: true + canBuildInImpassable: false + conditions: + - !type:TileNotBlocked + #conveyor - type: construction name: conveyor belt diff --git a/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml b/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml index a5620fd8efe..47a2841b6da 100644 --- a/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml +++ b/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml @@ -135,7 +135,7 @@ FoodBreadBun: 1 FoodMeat: 2 FoodCheeseSlice: 2 - FoodChili: 1 + FoodChiliPepper: 1 FoodCabbage: 1 CrayonGreen: 1 Flare: 1 @@ -177,7 +177,7 @@ solids: FoodBreadBun: 1 FoodMeat: 1 - FoodChili: 3 + FoodChiliPepper: 3 - type: microwaveMealRecipe id: RecipeGhostBurger @@ -675,7 +675,7 @@ solids: FoodRiceBoiled: 1 FoodMeatCutlet: 3 - FoodChili: 2 + FoodChiliPepper: 2 - type: microwaveMealRecipe id: RecipeEggRice @@ -894,7 +894,7 @@ solids: FoodBowlBig: 1 FoodBungo: 2 - FoodChili: 1 + FoodChiliPepper: 1 #Pies @@ -965,7 +965,7 @@ time: 15 solids: FoodDoughPie: 1 - FoodChilly: 3 + FoodChillyPepper: 3 FoodPlateTin: 1 - type: microwaveMealRecipe @@ -1063,7 +1063,7 @@ solids: FoodDough: 1 FoodCheeseSlice: 2 - FoodChili: 1 + FoodChiliPepper: 1 FoodMeatFish: 2 - type: microwaveMealRecipe @@ -1504,7 +1504,7 @@ time: 20 solids: FoodBowlBig: 1 - FoodChili: 1 + FoodChiliPepper: 1 FoodMeatCutlet: 1 FoodOnionSlice: 1 FoodTomato: 1 @@ -1537,7 +1537,7 @@ time: 30 solids: FoodBowlBig: 1 - FoodChili: 1 + FoodChiliPepper: 1 FoodMeatCutlet: 1 FoodOnionSlice: 1 FoodTomato: 1 @@ -1552,7 +1552,7 @@ #reagents: #blackpepper: 5 solids: - FoodChili: 1 + FoodChiliPepper: 1 FoodCheeseSlice: 2 - type: microwaveMealRecipe @@ -1572,7 +1572,7 @@ result: FoodMealEnchiladas time: 20 solids: - FoodChili: 2 + FoodChiliPepper: 2 FoodMeatCutlet: 1 FoodCorn: 1 @@ -1740,7 +1740,7 @@ result: FoodMeatHawaiianKebab time: 5 solids: - FoodChili: 1 + FoodChiliPepper: 1 FoodMeatCutlet: 1 FoodPineappleSlice: 1 FoodKebabSkewer: 1 @@ -1751,7 +1751,7 @@ result: FoodMeatFiestaKebab time: 5 solids: - FoodChili: 1 + FoodChiliPepper: 1 FoodCorn: 1 FoodMeatCutlet: 1 FoodTomato: 1 diff --git a/Resources/Prototypes/Recipes/Crafting/Graphs/improvised/makeshiftstunprod.yml b/Resources/Prototypes/Recipes/Crafting/Graphs/improvised/makeshiftstunprod.yml index fa006a938bd..024a7c58763 100644 --- a/Resources/Prototypes/Recipes/Crafting/Graphs/improvised/makeshiftstunprod.yml +++ b/Resources/Prototypes/Recipes/Crafting/Graphs/improvised/makeshiftstunprod.yml @@ -8,24 +8,23 @@ steps: - material: MetalRod amount: 1 - - material: Cable - amount: 15 - - tag: DrinkSpaceGlue - name: Drink Space Glue - icon: - sprite: Objects/Consumable/Drinks/glue-tube.rsi - state: icon - tag: PowerCellSmall name: Power Cell Small icon: sprite: Objects/Power/power_cells.rsi state: small - - tag: CapacitorStockPart - name: Capacitor Stock Part + - tag: Handcuffs icon: - sprite: Objects/Misc/stock_parts.rsi - state: capacitor - doAfter: 20 + sprite: Objects/Misc/cablecuffs.rsi + state: cuff + color: red + name: cuffs + - tag: Igniter + name: Igniter + icon: + sprite: Objects/Devices/igniter.rsi + state: icon + doAfter: 15 - node: msstunprod entity: Stunprod diff --git a/Resources/Prototypes/Recipes/Crafting/Graphs/storage/tallbox.yml b/Resources/Prototypes/Recipes/Crafting/Graphs/storage/tallbox.yml index e72c56ff44c..7e450513afe 100644 --- a/Resources/Prototypes/Recipes/Crafting/Graphs/storage/tallbox.yml +++ b/Resources/Prototypes/Recipes/Crafting/Graphs/storage/tallbox.yml @@ -19,6 +19,8 @@ conditions: - !type:StorageWelded welded: false + - !type:Locked + locked: false completed: - !type:SpawnPrototype prototype: SheetSteel1 diff --git a/Resources/Prototypes/Recipes/Lathes/chemistry.yml b/Resources/Prototypes/Recipes/Lathes/chemistry.yml index 3a54bfe1b33..7ee8f1ed499 100644 --- a/Resources/Prototypes/Recipes/Lathes/chemistry.yml +++ b/Resources/Prototypes/Recipes/Lathes/chemistry.yml @@ -84,7 +84,7 @@ # - type: latheRecipe # DeltaV - Disable the Vape # id: Vape # icon: -# sprite: Objects/Consumable/Smokeables/Vapes/vape-standart.rsi +# sprite: Objects/Consumable/Smokeables/Vapes/vape-standard.rsi # state: icon # result: Vape # completetime: 2 diff --git a/Resources/Prototypes/Recipes/Lathes/clothing.yml b/Resources/Prototypes/Recipes/Lathes/clothing.yml index 19b2fbb883c..729f20e9795 100644 --- a/Resources/Prototypes/Recipes/Lathes/clothing.yml +++ b/Resources/Prototypes/Recipes/Lathes/clothing.yml @@ -706,8 +706,16 @@ Durathread: 300 - type: latheRecipe - id: ClothingOuterWinterHoS - result: ClothingOuterWinterHoS + id: ClothingOuterWinterHoSUnarmored + result: ClothingOuterWinterHoSUnarmored + completetime: 3.2 + materials: + Cloth: 500 + Durathread: 300 + +- type: latheRecipe + id: ClothingOuterWinterWardenUnarmored + result: ClothingOuterWinterWardenUnarmored completetime: 3.2 materials: Cloth: 500 diff --git a/Resources/Prototypes/Recipes/Lathes/cooking.yml b/Resources/Prototypes/Recipes/Lathes/cooking.yml index a8836ff3926..577d8299dab 100644 --- a/Resources/Prototypes/Recipes/Lathes/cooking.yml +++ b/Resources/Prototypes/Recipes/Lathes/cooking.yml @@ -49,6 +49,13 @@ materials: Glass: 100 +- type: latheRecipe + id: CustomDrinkJug + result: CustomDrinkJug + completetime: 2 + materials: + Plastic: 200 + - type: latheRecipe id: FoodPlate result: FoodPlate diff --git a/Resources/Prototypes/Recipes/Lathes/electronics.yml b/Resources/Prototypes/Recipes/Lathes/electronics.yml index c4417f868b5..a6f3e6cece6 100644 --- a/Resources/Prototypes/Recipes/Lathes/electronics.yml +++ b/Resources/Prototypes/Recipes/Lathes/electronics.yml @@ -328,16 +328,6 @@ Glass: 900 Gold: 100 -- type: latheRecipe - id: TraversalDistorterMachineCircuitboard - result: TraversalDistorterMachineCircuitboard - category: Circuitry - completetime: 4 - materials: - Steel: 100 - Glass: 900 - Gold: 100 - - type: latheRecipe id: ArtifactCrusherMachineCircuitboard result: ArtifactCrusherMachineCircuitboard @@ -604,7 +594,7 @@ completetime: 4 materials: Steel: 50 - Glass: 350 + Glass: 450 - type: latheRecipe id: SMESMachineCircuitboard @@ -921,7 +911,7 @@ materials: Steel: 100 Glass: 900 - + - type: latheRecipe id: ShuttleGunPerforatorCircuitboard result: ShuttleGunPerforatorCircuitboard @@ -930,7 +920,7 @@ Steel: 100 Glass: 900 Gold: 100 - + - type: latheRecipe id: ShuttleGunKineticCircuitboard result: ShuttleGunKineticCircuitboard @@ -938,7 +928,7 @@ materials: Steel: 100 Glass: 900 - + - type: latheRecipe id: ShuttleGunFriendshipCircuitboard result: ShuttleGunFriendshipCircuitboard @@ -947,7 +937,7 @@ Steel: 100 Glass: 900 Gold: 50 - + - type: latheRecipe id: ShuttleGunDusterCircuitboard result: ShuttleGunDusterCircuitboard @@ -965,3 +955,11 @@ Steel: 100 Glass: 900 Gold: 100 + +- type: latheRecipe + id: JukeboxCircuitBoard + result: JukeboxCircuitBoard + completetime: 4 + materials: + Steel: 100 + Glass: 900 diff --git a/Resources/Prototypes/Recipes/Lathes/medical.yml b/Resources/Prototypes/Recipes/Lathes/medical.yml index 342654c46d1..631829ed53b 100644 --- a/Resources/Prototypes/Recipes/Lathes/medical.yml +++ b/Resources/Prototypes/Recipes/Lathes/medical.yml @@ -49,7 +49,7 @@ - type: latheRecipe id: BodyBag - result: BodyBag_Folded + result: BodyBagFolded completetime: 2 materials: Plastic: 300 diff --git a/Resources/Prototypes/Recipes/Reactions/medicine.yml b/Resources/Prototypes/Recipes/Reactions/medicine.yml index a1ca3ea38e2..60cb8a21f35 100644 --- a/Resources/Prototypes/Recipes/Reactions/medicine.yml +++ b/Resources/Prototypes/Recipes/Reactions/medicine.yml @@ -542,11 +542,8 @@ amount: 1 Silicon: amount: 1 - Benzene: - amount: 1 products: Insuzine: 3 - Ash: 1 - type: reaction id: Necrosol @@ -573,4 +570,4 @@ Sigynate: amount: 2 products: - Aloxadone: 4 + Aloxadone: 4 diff --git a/Resources/Prototypes/Research/civilianservices.yml b/Resources/Prototypes/Research/civilianservices.yml index 79dac275101..afb1f0ff503 100644 --- a/Resources/Prototypes/Research/civilianservices.yml +++ b/Resources/Prototypes/Research/civilianservices.yml @@ -70,6 +70,7 @@ - BorgModuleClowning - DawInstrumentMachineCircuitboard - MassMediaCircuitboard + - JukeboxCircuitBoard - type: technology id: RoboticCleanliness diff --git a/Resources/Prototypes/Research/experimental.yml b/Resources/Prototypes/Research/experimental.yml index e2a4b6d7848..ba410a86d43 100644 --- a/Resources/Prototypes/Research/experimental.yml +++ b/Resources/Prototypes/Research/experimental.yml @@ -87,13 +87,12 @@ id: AbnormalArtifactManipulation name: research-technology-abnormal-artifact-manipulation icon: - sprite: Structures/Machines/traversal_distorter.rsi - state: display + sprite: Structures/Machines/artifact_crusher.rsi + state: icon discipline: Experimental tier: 2 cost: 5000 recipeUnlocks: - - TraversalDistorterMachineCircuitboard - ArtifactCrusherMachineCircuitboard - type: technology diff --git a/Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml b/Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml index 1df9233c1ba..c955d97f0da 100644 --- a/Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml +++ b/Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml @@ -144,7 +144,7 @@ jumpsuit: ClothingUniformJumpsuitOperative back: ClothingBackpackDuffelSyndicateOperativeMedic mask: ClothingMaskGasSyndicate - eyes: ClothingEyesHudSyndicateMed # - Delta-V + eyes: ClothingEyesHudSyndicateAgent ears: ClothingHeadsetAltSyndicate gloves: ClothingHandsGlovesCombat outerClothing: ClothingOuterHardsuitSyndieMedic diff --git a/Resources/Prototypes/Roles/Jobs/Medical/chemist.yml b/Resources/Prototypes/Roles/Jobs/Medical/chemist.yml index b4ec0be432d..e10b6a950c6 100644 --- a/Resources/Prototypes/Roles/Jobs/Medical/chemist.yml +++ b/Resources/Prototypes/Roles/Jobs/Medical/chemist.yml @@ -25,7 +25,7 @@ ears: ClothingHeadsetMedical belt: ChemBag pocket1: HandLabeler - # the purple glasses? - innerClothingSkirt: ClothingUniformJumpskirtChemistry - satchel: ClothingBackpackSatchelChemistryFilled - duffelbag: ClothingBackpackDuffelChemistryFilled + eyes: ClothingEyesGlassesChemical + innerClothingSkirt: ClothingUniformJumpskirtChemistry + satchel: ClothingBackpackSatchelChemistryFilled + duffelbag: ClothingBackpackDuffelChemistryFilled diff --git a/Resources/Prototypes/StatusEffects/health.yml b/Resources/Prototypes/StatusEffects/health.yml index 562dbb336d8..6456ac6dc20 100644 --- a/Resources/Prototypes/StatusEffects/health.yml +++ b/Resources/Prototypes/StatusEffects/health.yml @@ -1,7 +1,7 @@ - type: statusIcon id: HealthIcon abstract: true - priority: 1 + priority: 3 locationPreference: Right isShaded: true diff --git a/Resources/Prototypes/StatusEffects/security.yml b/Resources/Prototypes/StatusEffects/security.yml index ca25f746f25..00119fb44d2 100644 --- a/Resources/Prototypes/StatusEffects/security.yml +++ b/Resources/Prototypes/StatusEffects/security.yml @@ -1,7 +1,7 @@ - type: statusIcon id: SecurityIcon abstract: true - priority: 2 + priority: 3 offset: 1 locationPreference: Right isShaded: true diff --git a/Resources/Prototypes/StatusIcon/antag.yml b/Resources/Prototypes/StatusIcon/antag.yml index da530a86d86..0dbdfce4f97 100644 --- a/Resources/Prototypes/StatusIcon/antag.yml +++ b/Resources/Prototypes/StatusIcon/antag.yml @@ -28,7 +28,7 @@ - type: statusIcon id: MindShieldIcon - priority: 1 + priority: 2 locationPreference: Right layer: Mod isShaded: true diff --git a/Resources/Prototypes/XenoArch/Effects/utility_effects.yml b/Resources/Prototypes/XenoArch/Effects/utility_effects.yml index 18f3acfae30..911c1c2e88e 100644 --- a/Resources/Prototypes/XenoArch/Effects/utility_effects.yml +++ b/Resources/Prototypes/XenoArch/Effects/utility_effects.yml @@ -106,7 +106,6 @@ - type: SolutionTransfer canChangeTransferAmount: true - type: Drink - isOpen: true solution: beaker - type: artifactEffect diff --git a/Resources/Prototypes/floor_trap.yml b/Resources/Prototypes/floor_trap.yml new file mode 100644 index 00000000000..217dd9fca2d --- /dev/null +++ b/Resources/Prototypes/floor_trap.yml @@ -0,0 +1,116 @@ +- type: entity + id: CollideFloorTrap + abstract: true + placement: + mode: SnapgridCenter + components: + - type: Sprite + sprite: Tiles/Misc/floortrap.rsi + state: floortrap + - type: Fixtures + fixtures: + floortrap: + shape: + !type:PhysShapeAabb + bounds: "-0.4,-0.4,0.4,0.4" + hard: false + mask: + - ItemMask + layer: + - SlipLayer + - type: Physics + - type: Tag + tags: + - HideContextMenu + +- type: entity + parent: CollideFloorTrap + id: CollideFloorTrapSpawn + name: floor trap spawn + abstract: true + components: + - type: Sprite + sprite: Tiles/Misc/floortrap.rsi + state: floortrapspawn + +- type: entity + parent: CollideFloorTrap + id: FloorTrapExplosion + name: explosion floor trap + components: + - type: TriggerOnCollide + fixtureID: floortrap + - type: ExplodeOnTrigger + - type: Explosive + explosionType: Default + totalIntensity: 20.0 + intensitySlope: 5 + maxIntensity: 4 + - type: DeleteOnTrigger + +- type: entity + parent: CollideFloorTrap + id: FloorTrapEMP + name: EMP floor trap + components: + - type: TriggerOnCollide + fixtureID: floortrap + - type: EmpOnTrigger + range: 2 + energyConsumption: 5000 + - type: DeleteOnTrigger + +- type: entity + parent: CollideFloorTrapSpawn + id: SpawnFloorTrapCarp + suffix: Carp + components: + - type: TriggerOnCollide + fixtureID: floortrap + - type: SpawnOnTrigger + proto: MobCarp + - type: DeleteOnTrigger + +- type: entity + parent: CollideFloorTrapSpawn + id: SpawnFloorTrapBear + suffix: Bear + components: + - type: TriggerOnCollide + fixtureID: floortrap + - type: SpawnOnTrigger + proto: MobBearSpace + - type: DeleteOnTrigger + +- type: entity + parent: CollideFloorTrapSpawn + id: SpawnFloorTrapKangaroo + suffix: Kangaroo + components: + - type: TriggerOnCollide + fixtureID: floortrap + - type: SpawnOnTrigger + proto: MobKangarooSpace + - type: DeleteOnTrigger + +- type: entity + parent: CollideFloorTrapSpawn + id: SpawnFloorTrapXenoDrone + suffix: Xeno. Drone + components: + - type: TriggerOnCollide + fixtureID: floortrap + - type: SpawnOnTrigger + proto: MobXenoDrone + - type: DeleteOnTrigger + +- type: entity + parent: CollideFloorTrapSpawn + id: SpawnFloorTrapXenoBurrower + suffix: Xeno. Burrower + components: + - type: TriggerOnCollide + fixtureID: floortrap + - type: SpawnOnTrigger + proto: MobXeno + - type: DeleteOnTrigger diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml index bc30b016162..3dd56fe68a5 100644 --- a/Resources/Prototypes/tags.yml +++ b/Resources/Prototypes/tags.yml @@ -261,9 +261,6 @@ - type: Tag id: CannonBall -- type: Tag - id: CannonRestrict - - type: Tag id: CannotSuicide @@ -523,6 +520,9 @@ - type: Tag id: DoorElectronics +- type: Tag + id: DoorElectronicsConfigurator + - type: Tag id: DrinkBottle @@ -1177,7 +1177,7 @@ - type: Tag id: SuitEVA - + - type: Tag id: Sunglasses diff --git a/Resources/Prototypes/themes.yml b/Resources/Prototypes/themes.yml index edd2681a624..3952687255a 100644 --- a/Resources/Prototypes/themes.yml +++ b/Resources/Prototypes/themes.yml @@ -12,6 +12,8 @@ concerningOrangeFore: "#A5762F" dangerousRedFore: "#BB3232" disabledFore: "#5A5A5A" + _itemstatus_content_margin_right: "#06060404" + _itemstatus_content_margin_left: "#04060604" - type: uiTheme id: SS14PlasmafireTheme path: /Textures/Interface/Plasmafire/ @@ -26,6 +28,8 @@ concerningOrangeFore: "#FFF5EE" dangerousRedFore: "#FFF5EE" disabledFore: "#FFF5EE" + _itemstatus_content_margin_right: "#06060404" + _itemstatus_content_margin_left: "#04060604" - type: uiTheme id: SS14SlimecoreTheme path: /Textures/Interface/Slimecore/ @@ -40,6 +44,8 @@ concerningOrangeFore: "#FFF5EE" dangerousRedFore: "#FFF5EE" disabledFore: "#FFF5EE" + _itemstatus_content_margin_right: "#06060404" + _itemstatus_content_margin_left: "#04060604" - type: uiTheme id: SS14ClockworkTheme path: /Textures/Interface/Clockwork/ @@ -54,6 +60,8 @@ concerningOrangeFore: "#FFF5EE" dangerousRedFore: "#FFF5EE" disabledFore: "#FFF5EE" + _itemstatus_content_margin_right: "#06060404" + _itemstatus_content_margin_left: "#04060604" - type: uiTheme id: SS14RetroTheme path: /Textures/Interface/Retro/ @@ -68,6 +76,8 @@ concerningOrangeFore: "#FFF5EE" dangerousRedFore: "#FFF5EE" disabledFore: "#FFF5EE" + _itemstatus_content_margin_right: "#06060404" + _itemstatus_content_margin_left: "#04060604" - type: uiTheme id: SS14MinimalistTheme path: /Textures/Interface/Minimalist/ @@ -82,6 +92,8 @@ concerningOrangeFore: "#A5762F" dangerousRedFore: "#BB3232" disabledFore: "#5A5A5A" + _itemstatus_content_margin_right: "#06060604" + _itemstatus_content_margin_left: "#06060604" - type: uiTheme id: SS14AshenTheme path: /Textures/Interface/Ashen/ @@ -96,3 +108,5 @@ concerningOrangeFore: "#FFF5EE" dangerousRedFore: "#FFF5EE" disabledFore: "#FFF5EE" + _itemstatus_content_margin_right: "#06060604" + _itemstatus_content_margin_left: "#06060604" diff --git a/Resources/ServerInfo/Guidebook/Medical/Cryogenics.xml b/Resources/ServerInfo/Guidebook/Medical/Cryogenics.xml index a109c4ee907..8326c61cf09 100644 --- a/Resources/ServerInfo/Guidebook/Medical/Cryogenics.xml +++ b/Resources/ServerInfo/Guidebook/Medical/Cryogenics.xml @@ -12,7 +12,7 @@ - + diff --git a/Resources/Textures/DeltaV/Clothing/Eyes/Hud/syndmed.rsi/equipped-EYES.png b/Resources/Textures/Clothing/Eyes/Hud/syndagent.rsi/equipped-EYES.png similarity index 76% rename from Resources/Textures/DeltaV/Clothing/Eyes/Hud/syndmed.rsi/equipped-EYES.png rename to Resources/Textures/Clothing/Eyes/Hud/syndagent.rsi/equipped-EYES.png index 2c77698051d..84979d10972 100644 Binary files a/Resources/Textures/DeltaV/Clothing/Eyes/Hud/syndmed.rsi/equipped-EYES.png and b/Resources/Textures/Clothing/Eyes/Hud/syndagent.rsi/equipped-EYES.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Eyes/Hud/syndmed.rsi/icon.png b/Resources/Textures/Clothing/Eyes/Hud/syndagent.rsi/icon.png similarity index 77% rename from Resources/Textures/DeltaV/Clothing/Eyes/Hud/syndmed.rsi/icon.png rename to Resources/Textures/Clothing/Eyes/Hud/syndagent.rsi/icon.png index e4f902d2b6c..900b438c7e2 100644 Binary files a/Resources/Textures/DeltaV/Clothing/Eyes/Hud/syndmed.rsi/icon.png and b/Resources/Textures/Clothing/Eyes/Hud/syndagent.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Eyes/Hud/syndmed.rsi/inhand-left.png b/Resources/Textures/Clothing/Eyes/Hud/syndagent.rsi/inhand-left.png similarity index 62% rename from Resources/Textures/DeltaV/Clothing/Eyes/Hud/syndmed.rsi/inhand-left.png rename to Resources/Textures/Clothing/Eyes/Hud/syndagent.rsi/inhand-left.png index 863c127f6a2..b888ce227ab 100644 Binary files a/Resources/Textures/DeltaV/Clothing/Eyes/Hud/syndmed.rsi/inhand-left.png and b/Resources/Textures/Clothing/Eyes/Hud/syndagent.rsi/inhand-left.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Eyes/Hud/syndmed.rsi/inhand-right.png b/Resources/Textures/Clothing/Eyes/Hud/syndagent.rsi/inhand-right.png similarity index 61% rename from Resources/Textures/DeltaV/Clothing/Eyes/Hud/syndmed.rsi/inhand-right.png rename to Resources/Textures/Clothing/Eyes/Hud/syndagent.rsi/inhand-right.png index fbffadd8e8b..0e248905fbf 100644 Binary files a/Resources/Textures/DeltaV/Clothing/Eyes/Hud/syndmed.rsi/inhand-right.png and b/Resources/Textures/Clothing/Eyes/Hud/syndagent.rsi/inhand-right.png differ diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/blue.rsi/meta.json b/Resources/Textures/Clothing/Eyes/Hud/syndagent.rsi/meta.json similarity index 100% rename from Resources/Textures/Clothing/Hands/Gloves/Color/blue.rsi/meta.json rename to Resources/Textures/Clothing/Eyes/Hud/syndagent.rsi/meta.json diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/blue.rsi/equipped-HAND.png b/Resources/Textures/Clothing/Hands/Gloves/Color/blue.rsi/equipped-HAND.png deleted file mode 100644 index 61a4591b67f..00000000000 Binary files a/Resources/Textures/Clothing/Hands/Gloves/Color/blue.rsi/equipped-HAND.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/blue.rsi/icon.png b/Resources/Textures/Clothing/Hands/Gloves/Color/blue.rsi/icon.png deleted file mode 100644 index 5904f18aff2..00000000000 Binary files a/Resources/Textures/Clothing/Hands/Gloves/Color/blue.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/blue.rsi/inhand-left.png b/Resources/Textures/Clothing/Hands/Gloves/Color/blue.rsi/inhand-left.png deleted file mode 100644 index 8766de228f0..00000000000 Binary files a/Resources/Textures/Clothing/Hands/Gloves/Color/blue.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/blue.rsi/inhand-right.png b/Resources/Textures/Clothing/Hands/Gloves/Color/blue.rsi/inhand-right.png deleted file mode 100644 index f7d00092fc6..00000000000 Binary files a/Resources/Textures/Clothing/Hands/Gloves/Color/blue.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/brown.rsi/equipped-HAND.png b/Resources/Textures/Clothing/Hands/Gloves/Color/brown.rsi/equipped-HAND.png deleted file mode 100644 index 56cb86d5723..00000000000 Binary files a/Resources/Textures/Clothing/Hands/Gloves/Color/brown.rsi/equipped-HAND.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/brown.rsi/icon.png b/Resources/Textures/Clothing/Hands/Gloves/Color/brown.rsi/icon.png deleted file mode 100644 index 1ea9708eb81..00000000000 Binary files a/Resources/Textures/Clothing/Hands/Gloves/Color/brown.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/brown.rsi/inhand-left.png b/Resources/Textures/Clothing/Hands/Gloves/Color/brown.rsi/inhand-left.png deleted file mode 100644 index a09bfc6a39c..00000000000 Binary files a/Resources/Textures/Clothing/Hands/Gloves/Color/brown.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/brown.rsi/inhand-right.png b/Resources/Textures/Clothing/Hands/Gloves/Color/brown.rsi/inhand-right.png deleted file mode 100644 index 023b8c058e9..00000000000 Binary files a/Resources/Textures/Clothing/Hands/Gloves/Color/brown.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/white.rsi/equipped-HAND.png b/Resources/Textures/Clothing/Hands/Gloves/Color/color.rsi/equipped-HAND.png similarity index 100% rename from Resources/Textures/Clothing/Hands/Gloves/Color/white.rsi/equipped-HAND.png rename to Resources/Textures/Clothing/Hands/Gloves/Color/color.rsi/equipped-HAND.png diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/color.rsi/icon.png b/Resources/Textures/Clothing/Hands/Gloves/Color/color.rsi/icon.png new file mode 100644 index 00000000000..d01ea7d9129 Binary files /dev/null and b/Resources/Textures/Clothing/Hands/Gloves/Color/color.rsi/icon.png differ diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/white.rsi/inhand-left.png b/Resources/Textures/Clothing/Hands/Gloves/Color/color.rsi/inhand-left.png similarity index 100% rename from Resources/Textures/Clothing/Hands/Gloves/Color/white.rsi/inhand-left.png rename to Resources/Textures/Clothing/Hands/Gloves/Color/color.rsi/inhand-left.png diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/white.rsi/inhand-right.png b/Resources/Textures/Clothing/Hands/Gloves/Color/color.rsi/inhand-right.png similarity index 100% rename from Resources/Textures/Clothing/Hands/Gloves/Color/white.rsi/inhand-right.png rename to Resources/Textures/Clothing/Hands/Gloves/Color/color.rsi/inhand-right.png diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/brown.rsi/meta.json b/Resources/Textures/Clothing/Hands/Gloves/Color/color.rsi/meta.json similarity index 100% rename from Resources/Textures/Clothing/Hands/Gloves/Color/brown.rsi/meta.json rename to Resources/Textures/Clothing/Hands/Gloves/Color/color.rsi/meta.json diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/gray.rsi/equipped-HAND.png b/Resources/Textures/Clothing/Hands/Gloves/Color/gray.rsi/equipped-HAND.png deleted file mode 100644 index 92fd0f3d729..00000000000 Binary files a/Resources/Textures/Clothing/Hands/Gloves/Color/gray.rsi/equipped-HAND.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/gray.rsi/icon.png b/Resources/Textures/Clothing/Hands/Gloves/Color/gray.rsi/icon.png deleted file mode 100644 index 9eac8c492d2..00000000000 Binary files a/Resources/Textures/Clothing/Hands/Gloves/Color/gray.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/gray.rsi/inhand-left.png b/Resources/Textures/Clothing/Hands/Gloves/Color/gray.rsi/inhand-left.png deleted file mode 100644 index 0d15a17996f..00000000000 Binary files a/Resources/Textures/Clothing/Hands/Gloves/Color/gray.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/gray.rsi/inhand-right.png b/Resources/Textures/Clothing/Hands/Gloves/Color/gray.rsi/inhand-right.png deleted file mode 100644 index db03a62cc8f..00000000000 Binary files a/Resources/Textures/Clothing/Hands/Gloves/Color/gray.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/green.rsi/equipped-HAND.png b/Resources/Textures/Clothing/Hands/Gloves/Color/green.rsi/equipped-HAND.png deleted file mode 100644 index 798ff044b60..00000000000 Binary files a/Resources/Textures/Clothing/Hands/Gloves/Color/green.rsi/equipped-HAND.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/green.rsi/icon.png b/Resources/Textures/Clothing/Hands/Gloves/Color/green.rsi/icon.png deleted file mode 100644 index 7fdfd0cf493..00000000000 Binary files a/Resources/Textures/Clothing/Hands/Gloves/Color/green.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/green.rsi/inhand-left.png b/Resources/Textures/Clothing/Hands/Gloves/Color/green.rsi/inhand-left.png deleted file mode 100644 index 64a1ce54ca9..00000000000 Binary files a/Resources/Textures/Clothing/Hands/Gloves/Color/green.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/green.rsi/inhand-right.png b/Resources/Textures/Clothing/Hands/Gloves/Color/green.rsi/inhand-right.png deleted file mode 100644 index 1405a9195d6..00000000000 Binary files a/Resources/Textures/Clothing/Hands/Gloves/Color/green.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/lightbrown.rsi/equipped-HAND.png b/Resources/Textures/Clothing/Hands/Gloves/Color/lightbrown.rsi/equipped-HAND.png deleted file mode 100644 index e1a9bf6860e..00000000000 Binary files a/Resources/Textures/Clothing/Hands/Gloves/Color/lightbrown.rsi/equipped-HAND.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/lightbrown.rsi/icon.png b/Resources/Textures/Clothing/Hands/Gloves/Color/lightbrown.rsi/icon.png deleted file mode 100644 index d2f5dc5376f..00000000000 Binary files a/Resources/Textures/Clothing/Hands/Gloves/Color/lightbrown.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/lightbrown.rsi/inhand-left.png b/Resources/Textures/Clothing/Hands/Gloves/Color/lightbrown.rsi/inhand-left.png deleted file mode 100644 index f5ad027b826..00000000000 Binary files a/Resources/Textures/Clothing/Hands/Gloves/Color/lightbrown.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/lightbrown.rsi/inhand-right.png b/Resources/Textures/Clothing/Hands/Gloves/Color/lightbrown.rsi/inhand-right.png deleted file mode 100644 index c407cc34038..00000000000 Binary files a/Resources/Textures/Clothing/Hands/Gloves/Color/lightbrown.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/orange.rsi/equipped-HAND.png b/Resources/Textures/Clothing/Hands/Gloves/Color/orange.rsi/equipped-HAND.png deleted file mode 100644 index d777b5d946f..00000000000 Binary files a/Resources/Textures/Clothing/Hands/Gloves/Color/orange.rsi/equipped-HAND.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/orange.rsi/icon.png b/Resources/Textures/Clothing/Hands/Gloves/Color/orange.rsi/icon.png deleted file mode 100644 index aac05be2a20..00000000000 Binary files a/Resources/Textures/Clothing/Hands/Gloves/Color/orange.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/orange.rsi/inhand-left.png b/Resources/Textures/Clothing/Hands/Gloves/Color/orange.rsi/inhand-left.png deleted file mode 100644 index 60557673567..00000000000 Binary files a/Resources/Textures/Clothing/Hands/Gloves/Color/orange.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/orange.rsi/inhand-right.png b/Resources/Textures/Clothing/Hands/Gloves/Color/orange.rsi/inhand-right.png deleted file mode 100644 index 2ac1579d17e..00000000000 Binary files a/Resources/Textures/Clothing/Hands/Gloves/Color/orange.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/orange.rsi/meta.json b/Resources/Textures/Clothing/Hands/Gloves/Color/orange.rsi/meta.json deleted file mode 100644 index 3b5d02aff6a..00000000000 --- a/Resources/Textures/Clothing/Hands/Gloves/Color/orange.rsi/meta.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/2fea0a59470c476cf3f927833d3918d89cbe6af8", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-HAND", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/purple.rsi/equipped-HAND.png b/Resources/Textures/Clothing/Hands/Gloves/Color/purple.rsi/equipped-HAND.png deleted file mode 100644 index 15234109ef5..00000000000 Binary files a/Resources/Textures/Clothing/Hands/Gloves/Color/purple.rsi/equipped-HAND.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/purple.rsi/icon.png b/Resources/Textures/Clothing/Hands/Gloves/Color/purple.rsi/icon.png deleted file mode 100644 index aa625512c3b..00000000000 Binary files a/Resources/Textures/Clothing/Hands/Gloves/Color/purple.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/purple.rsi/inhand-left.png b/Resources/Textures/Clothing/Hands/Gloves/Color/purple.rsi/inhand-left.png deleted file mode 100644 index c3c16b519ff..00000000000 Binary files a/Resources/Textures/Clothing/Hands/Gloves/Color/purple.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/purple.rsi/inhand-right.png b/Resources/Textures/Clothing/Hands/Gloves/Color/purple.rsi/inhand-right.png deleted file mode 100644 index 9eb1e1e3a0d..00000000000 Binary files a/Resources/Textures/Clothing/Hands/Gloves/Color/purple.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/purple.rsi/meta.json b/Resources/Textures/Clothing/Hands/Gloves/Color/purple.rsi/meta.json deleted file mode 100644 index 3b5d02aff6a..00000000000 --- a/Resources/Textures/Clothing/Hands/Gloves/Color/purple.rsi/meta.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/2fea0a59470c476cf3f927833d3918d89cbe6af8", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-HAND", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/red.rsi/equipped-HAND.png b/Resources/Textures/Clothing/Hands/Gloves/Color/red.rsi/equipped-HAND.png deleted file mode 100644 index 5f2f4906ae5..00000000000 Binary files a/Resources/Textures/Clothing/Hands/Gloves/Color/red.rsi/equipped-HAND.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/red.rsi/icon.png b/Resources/Textures/Clothing/Hands/Gloves/Color/red.rsi/icon.png deleted file mode 100644 index aae9ea81c42..00000000000 Binary files a/Resources/Textures/Clothing/Hands/Gloves/Color/red.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/red.rsi/inhand-left.png b/Resources/Textures/Clothing/Hands/Gloves/Color/red.rsi/inhand-left.png deleted file mode 100644 index b80c48d9f23..00000000000 Binary files a/Resources/Textures/Clothing/Hands/Gloves/Color/red.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/red.rsi/inhand-right.png b/Resources/Textures/Clothing/Hands/Gloves/Color/red.rsi/inhand-right.png deleted file mode 100644 index 8ef0a23c294..00000000000 Binary files a/Resources/Textures/Clothing/Hands/Gloves/Color/red.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/red.rsi/meta.json b/Resources/Textures/Clothing/Hands/Gloves/Color/red.rsi/meta.json deleted file mode 100644 index 3b5d02aff6a..00000000000 --- a/Resources/Textures/Clothing/Hands/Gloves/Color/red.rsi/meta.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/2fea0a59470c476cf3f927833d3918d89cbe6af8", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-HAND", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/white.rsi/icon.png b/Resources/Textures/Clothing/Hands/Gloves/Color/white.rsi/icon.png deleted file mode 100644 index 3b111e35b8b..00000000000 Binary files a/Resources/Textures/Clothing/Hands/Gloves/Color/white.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/white.rsi/meta.json b/Resources/Textures/Clothing/Hands/Gloves/Color/white.rsi/meta.json deleted file mode 100644 index 3b5d02aff6a..00000000000 --- a/Resources/Textures/Clothing/Hands/Gloves/Color/white.rsi/meta.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/2fea0a59470c476cf3f927833d3918d89cbe6af8", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-HAND", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} diff --git a/Resources/Textures/Clothing/Hands/Gloves/ihscombat.rsi/equipped-HAND.png b/Resources/Textures/Clothing/Hands/Gloves/ihscombat.rsi/equipped-HAND.png deleted file mode 100644 index 6d366273974..00000000000 Binary files a/Resources/Textures/Clothing/Hands/Gloves/ihscombat.rsi/equipped-HAND.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Hands/Gloves/ihscombat.rsi/icon.png b/Resources/Textures/Clothing/Hands/Gloves/ihscombat.rsi/icon.png deleted file mode 100644 index 1eca25df500..00000000000 Binary files a/Resources/Textures/Clothing/Hands/Gloves/ihscombat.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Hands/Gloves/ihscombat.rsi/inhand-left.png b/Resources/Textures/Clothing/Hands/Gloves/ihscombat.rsi/inhand-left.png deleted file mode 100644 index 5a4586c2f9d..00000000000 Binary files a/Resources/Textures/Clothing/Hands/Gloves/ihscombat.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Hands/Gloves/ihscombat.rsi/inhand-right.png b/Resources/Textures/Clothing/Hands/Gloves/ihscombat.rsi/inhand-right.png deleted file mode 100644 index c993e20080e..00000000000 Binary files a/Resources/Textures/Clothing/Hands/Gloves/ihscombat.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Hands/Gloves/ihscombat.rsi/meta.json b/Resources/Textures/Clothing/Hands/Gloves/ihscombat.rsi/meta.json deleted file mode 100644 index dd95d954465..00000000000 --- a/Resources/Textures/Clothing/Hands/Gloves/ihscombat.rsi/meta.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from cev-eris at commit https://github.com/discordia-space/CEV-Eris/commit/55d823b97dda098a1b2ee9edfca7155c753e456e", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-HAND", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} diff --git a/Resources/Textures/Clothing/Neck/Misc/autismpin.rsi/autism-equipped.png b/Resources/Textures/Clothing/Neck/Misc/autismpin.rsi/autism-equipped.png new file mode 100644 index 00000000000..49e264e16ec Binary files /dev/null and b/Resources/Textures/Clothing/Neck/Misc/autismpin.rsi/autism-equipped.png differ diff --git a/Resources/Textures/Clothing/Neck/Misc/autismpin.rsi/autism.png b/Resources/Textures/Clothing/Neck/Misc/autismpin.rsi/autism.png new file mode 100644 index 00000000000..16a2ce09cd0 Binary files /dev/null and b/Resources/Textures/Clothing/Neck/Misc/autismpin.rsi/autism.png differ diff --git a/Resources/Textures/Clothing/Neck/Misc/autismpin.rsi/meta.json b/Resources/Textures/Clothing/Neck/Misc/autismpin.rsi/meta.json new file mode 100644 index 00000000000..e82672f071c --- /dev/null +++ b/Resources/Textures/Clothing/Neck/Misc/autismpin.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-NC-4.0", + "copyright": "Terraspark's work", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "autism" + }, + { + "name": "autism-equipped", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Clothing/Neck/Misc/goldautismpin.rsi/goldautism-equipped.png b/Resources/Textures/Clothing/Neck/Misc/goldautismpin.rsi/goldautism-equipped.png new file mode 100644 index 00000000000..39560cafa61 Binary files /dev/null and b/Resources/Textures/Clothing/Neck/Misc/goldautismpin.rsi/goldautism-equipped.png differ diff --git a/Resources/Textures/Clothing/Neck/Misc/goldautismpin.rsi/goldautism.png b/Resources/Textures/Clothing/Neck/Misc/goldautismpin.rsi/goldautism.png new file mode 100644 index 00000000000..22e9102e2ba Binary files /dev/null and b/Resources/Textures/Clothing/Neck/Misc/goldautismpin.rsi/goldautism.png differ diff --git a/Resources/Textures/Clothing/Neck/Misc/goldautismpin.rsi/meta.json b/Resources/Textures/Clothing/Neck/Misc/goldautismpin.rsi/meta.json new file mode 100644 index 00000000000..6848744ab8a --- /dev/null +++ b/Resources/Textures/Clothing/Neck/Misc/goldautismpin.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-NC-4.0", + "copyright": "Terraspark's work", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "goldautism" + }, + { + "name": "goldautism-equipped", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Clothing/Neck/Misc/pins.rsi/meta.json b/Resources/Textures/Clothing/Neck/Misc/pins.rsi/meta.json index 57fab6a8ba5..46b04963997 100644 --- a/Resources/Textures/Clothing/Neck/Misc/pins.rsi/meta.json +++ b/Resources/Textures/Clothing/Neck/Misc/pins.rsi/meta.json @@ -6,69 +6,70 @@ "x": 32, "y": 32 }, - "states": [ - { - "name": "aro" - }, - { - "name": "aro-equipped", - "directions": 4 - }, - { - "name": "asex" - }, - { - "name": "asex-equipped", - "directions": 4 - }, - { - "name": "bi" - }, - { - "name": "bi-equipped", - "directions": 4 - }, - { - "name": "inter" - }, - { - "name": "inter-equipped", - "directions": 4 - }, - { - "name": "les" - }, - { - "name": "les-equipped", - "directions": 4 - }, - { - "name": "lgbt" - }, - { - "name": "lgbt-equipped", - "directions": 4 - }, - { - "name": "non" - }, - { - "name": "non-equipped", - "directions": 4 - }, - { - "name": "pan" - }, - { - "name": "pan-equipped", - "directions": 4 - }, - { - "name": "trans" - }, - { - "name": "trans-equipped", - "directions": 4 - } - ] + "states": [ + { + "name": "aro" + }, + { + "name": "aro-equipped", + "directions": 4 + }, + { + "name": "asex" + }, + { + "name": "asex-equipped", + "directions": 4 + }, + { + "name": "bi" + }, + { + "name": "bi-equipped", + "directions": 4 + }, + { + "name": "inter" + }, + { + "name": "inter-equipped", + "directions": 4 + }, + { + "name": "les" + }, + { + "name": "les-equipped", + "directions": 4 + }, + { + "name": "lgbt" + }, + { + "name": "lgbt-equipped", + "directions": 4 + }, + { + "name": "non" + }, + { + "name": "non-equipped", + "directions": 4 + }, + { + "name": "pan" + }, + { + "name": "pan-equipped", + "directions": 4 + }, + { + "name": "trans" + }, + { + "name": "trans-equipped", + "directions": 4 + } + ] } + diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/coathosarmored.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/coathosarmored.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 00000000000..d279e92da28 Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/WinterCoats/coathosarmored.rsi/equipped-OUTERCLOTHING.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/coathosarmored.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/coathosarmored.rsi/icon.png new file mode 100644 index 00000000000..6f7573420d0 Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/WinterCoats/coathosarmored.rsi/icon.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/coathosarmored.rsi/inhand-left.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/coathosarmored.rsi/inhand-left.png new file mode 100644 index 00000000000..85a0b83457b Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/WinterCoats/coathosarmored.rsi/inhand-left.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/coathosarmored.rsi/inhand-right.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/coathosarmored.rsi/inhand-right.png new file mode 100644 index 00000000000..70ade34a8d1 Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/WinterCoats/coathosarmored.rsi/inhand-right.png differ diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/gray.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/WinterCoats/coathosarmored.rsi/meta.json similarity index 100% rename from Resources/Textures/Clothing/Hands/Gloves/Color/gray.rsi/meta.json rename to Resources/Textures/Clothing/OuterClothing/WinterCoats/coathosarmored.rsi/meta.json diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/coatwardenarmored.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/coatwardenarmored.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 00000000000..28cf03f49cc Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/WinterCoats/coatwardenarmored.rsi/equipped-OUTERCLOTHING.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/coatwardenarmored.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/coatwardenarmored.rsi/icon.png new file mode 100644 index 00000000000..eaf984f4378 Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/WinterCoats/coatwardenarmored.rsi/icon.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/coatwardenarmored.rsi/inhand-left.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/coatwardenarmored.rsi/inhand-left.png new file mode 100644 index 00000000000..df033631e9d Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/WinterCoats/coatwardenarmored.rsi/inhand-left.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/coatwardenarmored.rsi/inhand-right.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/coatwardenarmored.rsi/inhand-right.png new file mode 100644 index 00000000000..77baaca885f Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/WinterCoats/coatwardenarmored.rsi/inhand-right.png differ diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/green.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/WinterCoats/coatwardenarmored.rsi/meta.json similarity index 100% rename from Resources/Textures/Clothing/Hands/Gloves/Color/green.rsi/meta.json rename to Resources/Textures/Clothing/OuterClothing/WinterCoats/coatwardenarmored.rsi/meta.json diff --git a/Resources/Textures/Clothing/Shoes/Color/black.rsi/equipped-FEET-vox.png b/Resources/Textures/Clothing/Shoes/Color/black.rsi/equipped-FEET-vox.png deleted file mode 100644 index 583a818e53c..00000000000 Binary files a/Resources/Textures/Clothing/Shoes/Color/black.rsi/equipped-FEET-vox.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Shoes/Color/black.rsi/equipped-FEET.png b/Resources/Textures/Clothing/Shoes/Color/black.rsi/equipped-FEET.png deleted file mode 100644 index 92f069be244..00000000000 Binary files a/Resources/Textures/Clothing/Shoes/Color/black.rsi/equipped-FEET.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Shoes/Color/black.rsi/icon.png b/Resources/Textures/Clothing/Shoes/Color/black.rsi/icon.png deleted file mode 100644 index bf2a91927bb..00000000000 Binary files a/Resources/Textures/Clothing/Shoes/Color/black.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Shoes/Color/black.rsi/inhand-left.png b/Resources/Textures/Clothing/Shoes/Color/black.rsi/inhand-left.png deleted file mode 100644 index 0913bfe4dd6..00000000000 Binary files a/Resources/Textures/Clothing/Shoes/Color/black.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Shoes/Color/black.rsi/inhand-right.png b/Resources/Textures/Clothing/Shoes/Color/black.rsi/inhand-right.png deleted file mode 100644 index d854fb1dc21..00000000000 Binary files a/Resources/Textures/Clothing/Shoes/Color/black.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Shoes/Color/black.rsi/meta.json b/Resources/Textures/Clothing/Shoes/Color/black.rsi/meta.json deleted file mode 100644 index 2083eec0d9c..00000000000 --- a/Resources/Textures/Clothing/Shoes/Color/black.rsi/meta.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/7e4e9d432d88981fb9bb463970c5b98ce85c0abe, reptilian made by kuro(388673708753027083)", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-FEET", - "directions": 4 - }, - { - "name": "equipped-FEET-reptilian", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - }, - { - "name": "equipped-FEET-vox", - "directions": 4 - } - ] -} diff --git a/Resources/Textures/Clothing/Shoes/Color/blue.rsi/equipped-FEET.png b/Resources/Textures/Clothing/Shoes/Color/blue.rsi/equipped-FEET.png deleted file mode 100644 index fdfd845fc96..00000000000 Binary files a/Resources/Textures/Clothing/Shoes/Color/blue.rsi/equipped-FEET.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Shoes/Color/blue.rsi/icon.png b/Resources/Textures/Clothing/Shoes/Color/blue.rsi/icon.png deleted file mode 100644 index 5c9abb0963e..00000000000 Binary files a/Resources/Textures/Clothing/Shoes/Color/blue.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Shoes/Color/blue.rsi/inhand-left.png b/Resources/Textures/Clothing/Shoes/Color/blue.rsi/inhand-left.png deleted file mode 100644 index 5d844ce09e2..00000000000 Binary files a/Resources/Textures/Clothing/Shoes/Color/blue.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Shoes/Color/blue.rsi/inhand-right.png b/Resources/Textures/Clothing/Shoes/Color/blue.rsi/inhand-right.png deleted file mode 100644 index 4669e8771c5..00000000000 Binary files a/Resources/Textures/Clothing/Shoes/Color/blue.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Shoes/Color/blue.rsi/meta.json b/Resources/Textures/Clothing/Shoes/Color/blue.rsi/meta.json deleted file mode 100644 index 210c90fb8a0..00000000000 --- a/Resources/Textures/Clothing/Shoes/Color/blue.rsi/meta.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/7e4e9d432d88981fb9bb463970c5b98ce85c0abe, reptilian made by kuro(388673708753027083)", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-FEET", - "directions": 4 - }, - { - "name": "equipped-FEET-reptilian", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} diff --git a/Resources/Textures/Clothing/Shoes/Color/brown.rsi/equipped-FEET.png b/Resources/Textures/Clothing/Shoes/Color/brown.rsi/equipped-FEET.png deleted file mode 100644 index 6bf8932f146..00000000000 Binary files a/Resources/Textures/Clothing/Shoes/Color/brown.rsi/equipped-FEET.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Shoes/Color/brown.rsi/icon.png b/Resources/Textures/Clothing/Shoes/Color/brown.rsi/icon.png deleted file mode 100644 index b2fb1eb6858..00000000000 Binary files a/Resources/Textures/Clothing/Shoes/Color/brown.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Shoes/Color/brown.rsi/inhand-left.png b/Resources/Textures/Clothing/Shoes/Color/brown.rsi/inhand-left.png deleted file mode 100644 index 9b18d407419..00000000000 Binary files a/Resources/Textures/Clothing/Shoes/Color/brown.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Shoes/Color/brown.rsi/inhand-right.png b/Resources/Textures/Clothing/Shoes/Color/brown.rsi/inhand-right.png deleted file mode 100644 index d1236d63068..00000000000 Binary files a/Resources/Textures/Clothing/Shoes/Color/brown.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Shoes/Color/brown.rsi/meta.json b/Resources/Textures/Clothing/Shoes/Color/brown.rsi/meta.json deleted file mode 100644 index 210c90fb8a0..00000000000 --- a/Resources/Textures/Clothing/Shoes/Color/brown.rsi/meta.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/7e4e9d432d88981fb9bb463970c5b98ce85c0abe, reptilian made by kuro(388673708753027083)", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-FEET", - "directions": 4 - }, - { - "name": "equipped-FEET-reptilian", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} diff --git a/Resources/Textures/Clothing/Shoes/Color/green.rsi/equipped-FEET.png b/Resources/Textures/Clothing/Shoes/Color/green.rsi/equipped-FEET.png deleted file mode 100644 index 95a66438695..00000000000 Binary files a/Resources/Textures/Clothing/Shoes/Color/green.rsi/equipped-FEET.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Shoes/Color/green.rsi/icon.png b/Resources/Textures/Clothing/Shoes/Color/green.rsi/icon.png deleted file mode 100644 index 6e2bb8cde48..00000000000 Binary files a/Resources/Textures/Clothing/Shoes/Color/green.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Shoes/Color/green.rsi/inhand-left.png b/Resources/Textures/Clothing/Shoes/Color/green.rsi/inhand-left.png deleted file mode 100644 index 5d4b837a924..00000000000 Binary files a/Resources/Textures/Clothing/Shoes/Color/green.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Shoes/Color/green.rsi/inhand-right.png b/Resources/Textures/Clothing/Shoes/Color/green.rsi/inhand-right.png deleted file mode 100644 index 15799306e80..00000000000 Binary files a/Resources/Textures/Clothing/Shoes/Color/green.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Shoes/Color/green.rsi/meta.json b/Resources/Textures/Clothing/Shoes/Color/green.rsi/meta.json deleted file mode 100644 index 210c90fb8a0..00000000000 --- a/Resources/Textures/Clothing/Shoes/Color/green.rsi/meta.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/7e4e9d432d88981fb9bb463970c5b98ce85c0abe, reptilian made by kuro(388673708753027083)", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-FEET", - "directions": 4 - }, - { - "name": "equipped-FEET-reptilian", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} diff --git a/Resources/Textures/Clothing/Shoes/Color/orange.rsi/equipped-FEET.png b/Resources/Textures/Clothing/Shoes/Color/orange.rsi/equipped-FEET.png deleted file mode 100644 index 6e5b72b88d7..00000000000 Binary files a/Resources/Textures/Clothing/Shoes/Color/orange.rsi/equipped-FEET.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Shoes/Color/orange.rsi/icon.png b/Resources/Textures/Clothing/Shoes/Color/orange.rsi/icon.png deleted file mode 100644 index 5adb5f2d6af..00000000000 Binary files a/Resources/Textures/Clothing/Shoes/Color/orange.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Shoes/Color/orange.rsi/inhand-left.png b/Resources/Textures/Clothing/Shoes/Color/orange.rsi/inhand-left.png deleted file mode 100644 index e509ec0c4f7..00000000000 Binary files a/Resources/Textures/Clothing/Shoes/Color/orange.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Shoes/Color/orange.rsi/inhand-right.png b/Resources/Textures/Clothing/Shoes/Color/orange.rsi/inhand-right.png deleted file mode 100644 index 3516a60cd88..00000000000 Binary files a/Resources/Textures/Clothing/Shoes/Color/orange.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Shoes/Color/orange.rsi/meta.json b/Resources/Textures/Clothing/Shoes/Color/orange.rsi/meta.json deleted file mode 100644 index 210c90fb8a0..00000000000 --- a/Resources/Textures/Clothing/Shoes/Color/orange.rsi/meta.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/7e4e9d432d88981fb9bb463970c5b98ce85c0abe, reptilian made by kuro(388673708753027083)", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-FEET", - "directions": 4 - }, - { - "name": "equipped-FEET-reptilian", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} diff --git a/Resources/Textures/Clothing/Shoes/Color/purple.rsi/equipped-FEET.png b/Resources/Textures/Clothing/Shoes/Color/purple.rsi/equipped-FEET.png deleted file mode 100644 index 9e52d381b4e..00000000000 Binary files a/Resources/Textures/Clothing/Shoes/Color/purple.rsi/equipped-FEET.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Shoes/Color/purple.rsi/icon.png b/Resources/Textures/Clothing/Shoes/Color/purple.rsi/icon.png deleted file mode 100644 index a21acc31b7c..00000000000 Binary files a/Resources/Textures/Clothing/Shoes/Color/purple.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Shoes/Color/purple.rsi/inhand-left.png b/Resources/Textures/Clothing/Shoes/Color/purple.rsi/inhand-left.png deleted file mode 100644 index 056e73d94d4..00000000000 Binary files a/Resources/Textures/Clothing/Shoes/Color/purple.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Shoes/Color/purple.rsi/inhand-right.png b/Resources/Textures/Clothing/Shoes/Color/purple.rsi/inhand-right.png deleted file mode 100644 index 01230871716..00000000000 Binary files a/Resources/Textures/Clothing/Shoes/Color/purple.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Shoes/Color/purple.rsi/meta.json b/Resources/Textures/Clothing/Shoes/Color/purple.rsi/meta.json deleted file mode 100644 index 210c90fb8a0..00000000000 --- a/Resources/Textures/Clothing/Shoes/Color/purple.rsi/meta.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/7e4e9d432d88981fb9bb463970c5b98ce85c0abe, reptilian made by kuro(388673708753027083)", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-FEET", - "directions": 4 - }, - { - "name": "equipped-FEET-reptilian", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} diff --git a/Resources/Textures/Clothing/Shoes/Color/red.rsi/equipped-FEET.png b/Resources/Textures/Clothing/Shoes/Color/red.rsi/equipped-FEET.png deleted file mode 100644 index 61d3dd5026c..00000000000 Binary files a/Resources/Textures/Clothing/Shoes/Color/red.rsi/equipped-FEET.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Shoes/Color/red.rsi/icon.png b/Resources/Textures/Clothing/Shoes/Color/red.rsi/icon.png deleted file mode 100644 index b139627d8d4..00000000000 Binary files a/Resources/Textures/Clothing/Shoes/Color/red.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Shoes/Color/red.rsi/inhand-left.png b/Resources/Textures/Clothing/Shoes/Color/red.rsi/inhand-left.png deleted file mode 100644 index 4ae9c7e5359..00000000000 Binary files a/Resources/Textures/Clothing/Shoes/Color/red.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Shoes/Color/red.rsi/inhand-right.png b/Resources/Textures/Clothing/Shoes/Color/red.rsi/inhand-right.png deleted file mode 100644 index 73fbec68f5b..00000000000 Binary files a/Resources/Textures/Clothing/Shoes/Color/red.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Shoes/Color/red.rsi/meta.json b/Resources/Textures/Clothing/Shoes/Color/red.rsi/meta.json deleted file mode 100644 index 210c90fb8a0..00000000000 --- a/Resources/Textures/Clothing/Shoes/Color/red.rsi/meta.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/7e4e9d432d88981fb9bb463970c5b98ce85c0abe, reptilian made by kuro(388673708753027083)", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-FEET", - "directions": 4 - }, - { - "name": "equipped-FEET-reptilian", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} diff --git a/Resources/Textures/Clothing/Shoes/Color/white.rsi/equipped-FEET.png b/Resources/Textures/Clothing/Shoes/Color/white.rsi/equipped-FEET.png deleted file mode 100644 index db8ec2d0bb1..00000000000 Binary files a/Resources/Textures/Clothing/Shoes/Color/white.rsi/equipped-FEET.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Shoes/Color/white.rsi/icon.png b/Resources/Textures/Clothing/Shoes/Color/white.rsi/icon.png deleted file mode 100644 index ac148524570..00000000000 Binary files a/Resources/Textures/Clothing/Shoes/Color/white.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Shoes/Color/white.rsi/inhand-left.png b/Resources/Textures/Clothing/Shoes/Color/white.rsi/inhand-left.png deleted file mode 100644 index a47cde63313..00000000000 Binary files a/Resources/Textures/Clothing/Shoes/Color/white.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Shoes/Color/white.rsi/inhand-right.png b/Resources/Textures/Clothing/Shoes/Color/white.rsi/inhand-right.png deleted file mode 100644 index 47119de2233..00000000000 Binary files a/Resources/Textures/Clothing/Shoes/Color/white.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Shoes/Color/white.rsi/meta.json b/Resources/Textures/Clothing/Shoes/Color/white.rsi/meta.json deleted file mode 100644 index 210c90fb8a0..00000000000 --- a/Resources/Textures/Clothing/Shoes/Color/white.rsi/meta.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/7e4e9d432d88981fb9bb463970c5b98ce85c0abe, reptilian made by kuro(388673708753027083)", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-FEET", - "directions": 4 - }, - { - "name": "equipped-FEET-reptilian", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} diff --git a/Resources/Textures/Clothing/Shoes/Color/yellow.rsi/equipped-FEET.png b/Resources/Textures/Clothing/Shoes/Color/yellow.rsi/equipped-FEET.png deleted file mode 100644 index 083a41ec47a..00000000000 Binary files a/Resources/Textures/Clothing/Shoes/Color/yellow.rsi/equipped-FEET.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Shoes/Color/yellow.rsi/icon.png b/Resources/Textures/Clothing/Shoes/Color/yellow.rsi/icon.png deleted file mode 100644 index 2398b7f04a5..00000000000 Binary files a/Resources/Textures/Clothing/Shoes/Color/yellow.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Shoes/Color/yellow.rsi/inhand-left.png b/Resources/Textures/Clothing/Shoes/Color/yellow.rsi/inhand-left.png deleted file mode 100644 index 082235b69c7..00000000000 Binary files a/Resources/Textures/Clothing/Shoes/Color/yellow.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Shoes/Color/yellow.rsi/inhand-right.png b/Resources/Textures/Clothing/Shoes/Color/yellow.rsi/inhand-right.png deleted file mode 100644 index f95c6619390..00000000000 Binary files a/Resources/Textures/Clothing/Shoes/Color/yellow.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Shoes/Color/yellow.rsi/meta.json b/Resources/Textures/Clothing/Shoes/Color/yellow.rsi/meta.json deleted file mode 100644 index 210c90fb8a0..00000000000 --- a/Resources/Textures/Clothing/Shoes/Color/yellow.rsi/meta.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/7e4e9d432d88981fb9bb463970c5b98ce85c0abe, reptilian made by kuro(388673708753027083)", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-FEET", - "directions": 4 - }, - { - "name": "equipped-FEET-reptilian", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} diff --git a/Resources/Textures/Clothing/Shoes/color.rsi/contrastedsoles-equipped-FEET-vox.png b/Resources/Textures/Clothing/Shoes/color.rsi/contrastedsoles-equipped-FEET-vox.png new file mode 100644 index 00000000000..a7ebf25671f Binary files /dev/null and b/Resources/Textures/Clothing/Shoes/color.rsi/contrastedsoles-equipped-FEET-vox.png differ diff --git a/Resources/Textures/Clothing/Shoes/color.rsi/contrastedsoles-equipped-FEET.png b/Resources/Textures/Clothing/Shoes/color.rsi/contrastedsoles-equipped-FEET.png new file mode 100644 index 00000000000..0baedaa9c0c Binary files /dev/null and b/Resources/Textures/Clothing/Shoes/color.rsi/contrastedsoles-equipped-FEET.png differ diff --git a/Resources/Textures/Clothing/Shoes/color.rsi/equipped-FEET-vox.png b/Resources/Textures/Clothing/Shoes/color.rsi/equipped-FEET-vox.png new file mode 100644 index 00000000000..d81e2314b68 Binary files /dev/null and b/Resources/Textures/Clothing/Shoes/color.rsi/equipped-FEET-vox.png differ diff --git a/Resources/Textures/Clothing/Shoes/color.rsi/equipped-FEET.png b/Resources/Textures/Clothing/Shoes/color.rsi/equipped-FEET.png new file mode 100644 index 00000000000..dd4df4b601c Binary files /dev/null and b/Resources/Textures/Clothing/Shoes/color.rsi/equipped-FEET.png differ diff --git a/Resources/Textures/Clothing/Shoes/color.rsi/icon.png b/Resources/Textures/Clothing/Shoes/color.rsi/icon.png new file mode 100644 index 00000000000..8e42e5c5ce8 Binary files /dev/null and b/Resources/Textures/Clothing/Shoes/color.rsi/icon.png differ diff --git a/Resources/Textures/Clothing/Shoes/color.rsi/inhand-left.png b/Resources/Textures/Clothing/Shoes/color.rsi/inhand-left.png new file mode 100644 index 00000000000..d3741e6b7b3 Binary files /dev/null and b/Resources/Textures/Clothing/Shoes/color.rsi/inhand-left.png differ diff --git a/Resources/Textures/Clothing/Shoes/color.rsi/inhand-right.png b/Resources/Textures/Clothing/Shoes/color.rsi/inhand-right.png new file mode 100644 index 00000000000..5a4e04ca31f Binary files /dev/null and b/Resources/Textures/Clothing/Shoes/color.rsi/inhand-right.png differ diff --git a/Resources/Textures/Clothing/Shoes/color.rsi/meta.json b/Resources/Textures/Clothing/Shoes/color.rsi/meta.json new file mode 100644 index 00000000000..5e43acc0863 --- /dev/null +++ b/Resources/Textures/Clothing/Shoes/color.rsi/meta.json @@ -0,0 +1,57 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c838ba21dae97db345e0113f99596decd1d66039 and modified by Flareguy for Space Station 14", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-FEET", + "directions": 4 + }, + { + "name": "equipped-FEET-vox", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "soles-icon" + }, + { + "name": "soles-equipped-FEET", + "directions": 4 + }, + { + "name": "soles-equipped-FEET-vox", + "directions": 4 + }, + { + "name": "soles-inhand-left", + "directions": 4 + }, + { + "name": "soles-inhand-right", + "directions": 4 + }, + { + "name": "contrastedsoles-equipped-FEET", + "directions": 4 + }, + { + "name": "contrastedsoles-equipped-FEET-vox", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Clothing/Shoes/color.rsi/soles-equipped-FEET-vox.png b/Resources/Textures/Clothing/Shoes/color.rsi/soles-equipped-FEET-vox.png new file mode 100644 index 00000000000..0255ed7b786 Binary files /dev/null and b/Resources/Textures/Clothing/Shoes/color.rsi/soles-equipped-FEET-vox.png differ diff --git a/Resources/Textures/Clothing/Shoes/color.rsi/soles-equipped-FEET.png b/Resources/Textures/Clothing/Shoes/color.rsi/soles-equipped-FEET.png new file mode 100644 index 00000000000..6d643f6f3be Binary files /dev/null and b/Resources/Textures/Clothing/Shoes/color.rsi/soles-equipped-FEET.png differ diff --git a/Resources/Textures/Clothing/Shoes/color.rsi/soles-icon.png b/Resources/Textures/Clothing/Shoes/color.rsi/soles-icon.png new file mode 100644 index 00000000000..ba918d282df Binary files /dev/null and b/Resources/Textures/Clothing/Shoes/color.rsi/soles-icon.png differ diff --git a/Resources/Textures/Clothing/Shoes/color.rsi/soles-inhand-left.png b/Resources/Textures/Clothing/Shoes/color.rsi/soles-inhand-left.png new file mode 100644 index 00000000000..19945c1a590 Binary files /dev/null and b/Resources/Textures/Clothing/Shoes/color.rsi/soles-inhand-left.png differ diff --git a/Resources/Textures/Clothing/Shoes/color.rsi/soles-inhand-right.png b/Resources/Textures/Clothing/Shoes/color.rsi/soles-inhand-right.png new file mode 100644 index 00000000000..a33bc4d825d Binary files /dev/null and b/Resources/Textures/Clothing/Shoes/color.rsi/soles-inhand-right.png differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/black.rsi/equipped-INNERCLOTHING-monkey.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/black.rsi/equipped-INNERCLOTHING-monkey.png deleted file mode 100644 index 6a76cd35eff..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/black.rsi/equipped-INNERCLOTHING-monkey.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/black.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/black.rsi/equipped-INNERCLOTHING.png deleted file mode 100644 index 8bf8b8906f0..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/black.rsi/equipped-INNERCLOTHING.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/black.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/black.rsi/icon.png deleted file mode 100644 index d39607e94dd..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/black.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/black.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/black.rsi/inhand-left.png deleted file mode 100644 index 8ca0193cb17..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/black.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/black.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/black.rsi/inhand-right.png deleted file mode 100644 index f2a18bc4ebb..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/black.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/black.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/black.rsi/meta.json deleted file mode 100644 index 1fb9cf1b666..00000000000 --- a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/black.rsi/meta.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c838ba21dae97db345e0113f99596decd1d66039, monkey made by brainfood1183 (github) for ss14", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-INNERCLOTHING", - "directions": 4 - }, - { - "name": "equipped-INNERCLOTHING-monkey", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/blue.rsi/equipped-INNERCLOTHING-monkey.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/blue.rsi/equipped-INNERCLOTHING-monkey.png deleted file mode 100644 index 4df69fee458..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/blue.rsi/equipped-INNERCLOTHING-monkey.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/blue.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/blue.rsi/equipped-INNERCLOTHING.png deleted file mode 100644 index f453ae0427a..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/blue.rsi/equipped-INNERCLOTHING.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/blue.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/blue.rsi/icon.png deleted file mode 100644 index 0420b506db0..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/blue.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/blue.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/blue.rsi/inhand-left.png deleted file mode 100644 index 6aad4575267..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/blue.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/blue.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/blue.rsi/inhand-right.png deleted file mode 100644 index b185b623967..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/blue.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/blue.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/blue.rsi/meta.json deleted file mode 100644 index 1fb9cf1b666..00000000000 --- a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/blue.rsi/meta.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c838ba21dae97db345e0113f99596decd1d66039, monkey made by brainfood1183 (github) for ss14", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-INNERCLOTHING", - "directions": 4 - }, - { - "name": "equipped-INNERCLOTHING-monkey", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/brown.rsi/equipped-INNERCLOTHING-monkey.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/brown.rsi/equipped-INNERCLOTHING-monkey.png deleted file mode 100644 index a16b8908c21..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/brown.rsi/equipped-INNERCLOTHING-monkey.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/brown.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/brown.rsi/equipped-INNERCLOTHING.png deleted file mode 100644 index fc7582154f9..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/brown.rsi/equipped-INNERCLOTHING.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/brown.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/brown.rsi/icon.png deleted file mode 100644 index 0c2d3ece6b6..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/brown.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/brown.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/brown.rsi/inhand-left.png deleted file mode 100644 index d316b0400e1..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/brown.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/brown.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/brown.rsi/inhand-right.png deleted file mode 100644 index 6523d6ef6de..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/brown.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/brown.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/brown.rsi/meta.json deleted file mode 100644 index 1fb9cf1b666..00000000000 --- a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/brown.rsi/meta.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c838ba21dae97db345e0113f99596decd1d66039, monkey made by brainfood1183 (github) for ss14", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-INNERCLOTHING", - "directions": 4 - }, - { - "name": "equipped-INNERCLOTHING-monkey", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/darkblue.rsi/equipped-INNERCLOTHING-monkey.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/darkblue.rsi/equipped-INNERCLOTHING-monkey.png deleted file mode 100644 index 21e3f5f76c2..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/darkblue.rsi/equipped-INNERCLOTHING-monkey.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/darkblue.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/darkblue.rsi/equipped-INNERCLOTHING.png deleted file mode 100644 index 3f010030040..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/darkblue.rsi/equipped-INNERCLOTHING.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/darkblue.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/darkblue.rsi/icon.png deleted file mode 100644 index 97bd52cfe97..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/darkblue.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/darkblue.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/darkblue.rsi/inhand-left.png deleted file mode 100644 index ea01f616e46..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/darkblue.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/darkblue.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/darkblue.rsi/inhand-right.png deleted file mode 100644 index 2ef7181ab07..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/darkblue.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/darkblue.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/darkblue.rsi/meta.json deleted file mode 100644 index 1fb9cf1b666..00000000000 --- a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/darkblue.rsi/meta.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c838ba21dae97db345e0113f99596decd1d66039, monkey made by brainfood1183 (github) for ss14", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-INNERCLOTHING", - "directions": 4 - }, - { - "name": "equipped-INNERCLOTHING-monkey", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/darkgreen.rsi/equipped-INNERCLOTHING-monkey.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/darkgreen.rsi/equipped-INNERCLOTHING-monkey.png deleted file mode 100644 index 11a28280d7d..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/darkgreen.rsi/equipped-INNERCLOTHING-monkey.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/darkgreen.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/darkgreen.rsi/equipped-INNERCLOTHING.png deleted file mode 100644 index ae2631d0da8..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/darkgreen.rsi/equipped-INNERCLOTHING.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/darkgreen.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/darkgreen.rsi/icon.png deleted file mode 100644 index 5077680c75a..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/darkgreen.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/darkgreen.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/darkgreen.rsi/inhand-left.png deleted file mode 100644 index 5456486c258..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/darkgreen.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/darkgreen.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/darkgreen.rsi/inhand-right.png deleted file mode 100644 index 23855a8759e..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/darkgreen.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/darkgreen.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/darkgreen.rsi/meta.json deleted file mode 100644 index 1fb9cf1b666..00000000000 --- a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/darkgreen.rsi/meta.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c838ba21dae97db345e0113f99596decd1d66039, monkey made by brainfood1183 (github) for ss14", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-INNERCLOTHING", - "directions": 4 - }, - { - "name": "equipped-INNERCLOTHING-monkey", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/green.rsi/equipped-INNERCLOTHING-monkey.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/green.rsi/equipped-INNERCLOTHING-monkey.png deleted file mode 100644 index 161af53da25..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/green.rsi/equipped-INNERCLOTHING-monkey.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/green.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/green.rsi/equipped-INNERCLOTHING.png deleted file mode 100644 index c5b151b4934..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/green.rsi/equipped-INNERCLOTHING.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/green.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/green.rsi/icon.png deleted file mode 100644 index 1407b79d7a3..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/green.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/green.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/green.rsi/inhand-left.png deleted file mode 100644 index 5456486c258..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/green.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/green.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/green.rsi/inhand-right.png deleted file mode 100644 index 23855a8759e..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/green.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/green.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/green.rsi/meta.json deleted file mode 100644 index 1fb9cf1b666..00000000000 --- a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/green.rsi/meta.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c838ba21dae97db345e0113f99596decd1d66039, monkey made by brainfood1183 (github) for ss14", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-INNERCLOTHING", - "directions": 4 - }, - { - "name": "equipped-INNERCLOTHING-monkey", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/grey.rsi/equipped-INNERCLOTHING-monkey.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/grey.rsi/equipped-INNERCLOTHING-monkey.png deleted file mode 100644 index 7edf356ec60..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/grey.rsi/equipped-INNERCLOTHING-monkey.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/grey.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/grey.rsi/equipped-INNERCLOTHING.png deleted file mode 100644 index 5074896bfbe..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/grey.rsi/equipped-INNERCLOTHING.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/grey.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/grey.rsi/icon.png deleted file mode 100644 index 3c0c3e0f9a4..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/grey.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/grey.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/grey.rsi/inhand-left.png deleted file mode 100644 index ae15d262d7a..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/grey.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/grey.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/grey.rsi/inhand-right.png deleted file mode 100644 index 60bea1b51ac..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/grey.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/grey.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/grey.rsi/meta.json deleted file mode 100644 index 1fb9cf1b666..00000000000 --- a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/grey.rsi/meta.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c838ba21dae97db345e0113f99596decd1d66039, monkey made by brainfood1183 (github) for ss14", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-INNERCLOTHING", - "directions": 4 - }, - { - "name": "equipped-INNERCLOTHING-monkey", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/lightbrown.rsi/equipped-INNERCLOTHING-monkey.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/lightbrown.rsi/equipped-INNERCLOTHING-monkey.png deleted file mode 100644 index 4d274a22827..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/lightbrown.rsi/equipped-INNERCLOTHING-monkey.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/lightbrown.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/lightbrown.rsi/equipped-INNERCLOTHING.png deleted file mode 100644 index d3fb22d4be0..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/lightbrown.rsi/equipped-INNERCLOTHING.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/lightbrown.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/lightbrown.rsi/icon.png deleted file mode 100644 index a240bfd7d7a..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/lightbrown.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/lightbrown.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/lightbrown.rsi/inhand-left.png deleted file mode 100644 index d316b0400e1..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/lightbrown.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/lightbrown.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/lightbrown.rsi/inhand-right.png deleted file mode 100644 index 6523d6ef6de..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/lightbrown.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/lightbrown.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/lightbrown.rsi/meta.json deleted file mode 100644 index 1fb9cf1b666..00000000000 --- a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/lightbrown.rsi/meta.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c838ba21dae97db345e0113f99596decd1d66039, monkey made by brainfood1183 (github) for ss14", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-INNERCLOTHING", - "directions": 4 - }, - { - "name": "equipped-INNERCLOTHING-monkey", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/lightpurple.rsi/equipped-INNERCLOTHING-monkey.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/lightpurple.rsi/equipped-INNERCLOTHING-monkey.png deleted file mode 100644 index 80854928bf1..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/lightpurple.rsi/equipped-INNERCLOTHING-monkey.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/lightpurple.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/lightpurple.rsi/equipped-INNERCLOTHING.png deleted file mode 100644 index 7dc954dd906..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/lightpurple.rsi/equipped-INNERCLOTHING.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/lightpurple.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/lightpurple.rsi/icon.png deleted file mode 100644 index 61fc966e588..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/lightpurple.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/lightpurple.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/lightpurple.rsi/inhand-left.png deleted file mode 100644 index 46be5288e60..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/lightpurple.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/lightpurple.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/lightpurple.rsi/inhand-right.png deleted file mode 100644 index f1911c7ec0b..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/lightpurple.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/lightpurple.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/lightpurple.rsi/meta.json deleted file mode 100644 index 1fb9cf1b666..00000000000 --- a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/lightpurple.rsi/meta.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c838ba21dae97db345e0113f99596decd1d66039, monkey made by brainfood1183 (github) for ss14", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-INNERCLOTHING", - "directions": 4 - }, - { - "name": "equipped-INNERCLOTHING-monkey", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/maroon.rsi/equipped-INNERCLOTHING-monkey.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/maroon.rsi/equipped-INNERCLOTHING-monkey.png deleted file mode 100644 index 3df6ea0d92c..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/maroon.rsi/equipped-INNERCLOTHING-monkey.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/maroon.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/maroon.rsi/equipped-INNERCLOTHING.png deleted file mode 100644 index 6d92e3e4504..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/maroon.rsi/equipped-INNERCLOTHING.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/maroon.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/maroon.rsi/icon.png deleted file mode 100644 index 9be9ecf9d68..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/maroon.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/maroon.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/maroon.rsi/inhand-left.png deleted file mode 100644 index a703128c963..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/maroon.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/maroon.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/maroon.rsi/inhand-right.png deleted file mode 100644 index 8c73e1c7ce2..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/maroon.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/maroon.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/maroon.rsi/meta.json deleted file mode 100644 index 1fb9cf1b666..00000000000 --- a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/maroon.rsi/meta.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c838ba21dae97db345e0113f99596decd1d66039, monkey made by brainfood1183 (github) for ss14", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-INNERCLOTHING", - "directions": 4 - }, - { - "name": "equipped-INNERCLOTHING-monkey", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/orange.rsi/equipped-INNERCLOTHING-monkey.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/orange.rsi/equipped-INNERCLOTHING-monkey.png deleted file mode 100644 index fe4dcbe7f75..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/orange.rsi/equipped-INNERCLOTHING-monkey.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/orange.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/orange.rsi/equipped-INNERCLOTHING.png deleted file mode 100644 index cef8a7c5f87..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/orange.rsi/equipped-INNERCLOTHING.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/orange.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/orange.rsi/icon.png deleted file mode 100644 index 3f876a8b2a7..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/orange.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/orange.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/orange.rsi/inhand-left.png deleted file mode 100644 index 5e5c42697c3..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/orange.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/orange.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/orange.rsi/inhand-right.png deleted file mode 100644 index fee1dd85cd2..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/orange.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/orange.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/orange.rsi/meta.json deleted file mode 100644 index 1fb9cf1b666..00000000000 --- a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/orange.rsi/meta.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c838ba21dae97db345e0113f99596decd1d66039, monkey made by brainfood1183 (github) for ss14", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-INNERCLOTHING", - "directions": 4 - }, - { - "name": "equipped-INNERCLOTHING-monkey", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/pink.rsi/equipped-INNERCLOTHING-monkey.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/pink.rsi/equipped-INNERCLOTHING-monkey.png deleted file mode 100644 index 00e7198cc4c..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/pink.rsi/equipped-INNERCLOTHING-monkey.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/pink.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/pink.rsi/equipped-INNERCLOTHING.png deleted file mode 100644 index 6698c719ff1..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/pink.rsi/equipped-INNERCLOTHING.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/pink.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/pink.rsi/icon.png deleted file mode 100644 index bef1f6a308f..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/pink.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/pink.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/pink.rsi/inhand-left.png deleted file mode 100644 index 9112f9b9802..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/pink.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/pink.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/pink.rsi/inhand-right.png deleted file mode 100644 index d3df7bcb6b7..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/pink.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/pink.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/pink.rsi/meta.json deleted file mode 100644 index 1fb9cf1b666..00000000000 --- a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/pink.rsi/meta.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c838ba21dae97db345e0113f99596decd1d66039, monkey made by brainfood1183 (github) for ss14", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-INNERCLOTHING", - "directions": 4 - }, - { - "name": "equipped-INNERCLOTHING-monkey", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/red.rsi/equipped-INNERCLOTHING-monkey.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/red.rsi/equipped-INNERCLOTHING-monkey.png deleted file mode 100644 index 0e1f28b34f8..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/red.rsi/equipped-INNERCLOTHING-monkey.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/red.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/red.rsi/equipped-INNERCLOTHING.png deleted file mode 100644 index 31cb581211a..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/red.rsi/equipped-INNERCLOTHING.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/red.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/red.rsi/icon.png deleted file mode 100644 index 52ac071c077..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/red.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/red.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/red.rsi/inhand-left.png deleted file mode 100644 index 4cd9c955ae1..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/red.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/red.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/red.rsi/inhand-right.png deleted file mode 100644 index ae5a124c663..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/red.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/red.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/red.rsi/meta.json deleted file mode 100644 index 1fb9cf1b666..00000000000 --- a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/red.rsi/meta.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c838ba21dae97db345e0113f99596decd1d66039, monkey made by brainfood1183 (github) for ss14", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-INNERCLOTHING", - "directions": 4 - }, - { - "name": "equipped-INNERCLOTHING-monkey", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/teal.rsi/equipped-INNERCLOTHING-monkey.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/teal.rsi/equipped-INNERCLOTHING-monkey.png deleted file mode 100644 index 04ea2792e8f..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/teal.rsi/equipped-INNERCLOTHING-monkey.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/teal.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/teal.rsi/equipped-INNERCLOTHING.png deleted file mode 100644 index f37256fe848..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/teal.rsi/equipped-INNERCLOTHING.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/teal.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/teal.rsi/icon.png deleted file mode 100644 index b2757bc0905..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/teal.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/teal.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/teal.rsi/inhand-left.png deleted file mode 100644 index 748bfb2e972..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/teal.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/teal.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/teal.rsi/inhand-right.png deleted file mode 100644 index 4944e6fc0ba..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/teal.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/teal.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/teal.rsi/meta.json deleted file mode 100644 index 1fb9cf1b666..00000000000 --- a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/teal.rsi/meta.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c838ba21dae97db345e0113f99596decd1d66039, monkey made by brainfood1183 (github) for ss14", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-INNERCLOTHING", - "directions": 4 - }, - { - "name": "equipped-INNERCLOTHING-monkey", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/white.rsi/equipped-INNERCLOTHING-monkey.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/white.rsi/equipped-INNERCLOTHING-monkey.png deleted file mode 100644 index 6c3ea56b531..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/white.rsi/equipped-INNERCLOTHING-monkey.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/white.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/white.rsi/equipped-INNERCLOTHING.png deleted file mode 100644 index 8c7d6e406ce..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/white.rsi/equipped-INNERCLOTHING.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/white.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/white.rsi/icon.png deleted file mode 100644 index 0d2bf73ca83..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/white.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/white.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/white.rsi/inhand-left.png deleted file mode 100644 index 592cd94079c..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/white.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/white.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/white.rsi/inhand-right.png deleted file mode 100644 index 3d3dd56f27e..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/white.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/white.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/white.rsi/meta.json deleted file mode 100644 index 1fb9cf1b666..00000000000 --- a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/white.rsi/meta.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c838ba21dae97db345e0113f99596decd1d66039, monkey made by brainfood1183 (github) for ss14", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-INNERCLOTHING", - "directions": 4 - }, - { - "name": "equipped-INNERCLOTHING-monkey", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/yellow.rsi/equipped-INNERCLOTHING-monkey.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/yellow.rsi/equipped-INNERCLOTHING-monkey.png deleted file mode 100644 index 07673c8fa64..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/yellow.rsi/equipped-INNERCLOTHING-monkey.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/yellow.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/yellow.rsi/equipped-INNERCLOTHING.png deleted file mode 100644 index d5575580811..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/yellow.rsi/equipped-INNERCLOTHING.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/yellow.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/yellow.rsi/icon.png deleted file mode 100644 index 15670841c25..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/yellow.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/yellow.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/yellow.rsi/inhand-left.png deleted file mode 100644 index 6959537bcea..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/yellow.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/yellow.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/yellow.rsi/inhand-right.png deleted file mode 100644 index 148b9812320..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/yellow.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/yellow.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/yellow.rsi/meta.json deleted file mode 100644 index 1fb9cf1b666..00000000000 --- a/Resources/Textures/Clothing/Uniforms/Jumpskirt/Color/yellow.rsi/meta.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c838ba21dae97db345e0113f99596decd1d66039, monkey made by brainfood1183 (github) for ss14", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-INNERCLOTHING", - "directions": 4 - }, - { - "name": "equipped-INNERCLOTHING-monkey", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/equipped-INNERCLOTHING.png new file mode 100644 index 00000000000..3faba7285ff Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/equipped-INNERCLOTHING.png differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/icon.png new file mode 100644 index 00000000000..64642a11589 Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/icon.png differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/inhand-left.png new file mode 100644 index 00000000000..0b131234865 Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/inhand-left.png differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/inhand-right.png new file mode 100644 index 00000000000..ba6769d59d5 Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/inhand-right.png differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/grey.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/meta.json similarity index 53% rename from Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/grey.rsi/meta.json rename to Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/meta.json index 26030c4b32a..7e6832bd12c 100644 --- a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/grey.rsi/meta.json +++ b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c838ba21dae97db345e0113f99596decd1d66039, monkey made by brainfood1183 (github) for ss14, reptilian made by kuro(388673708753027083)", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c838ba21dae97db345e0113f99596decd1d66039 and modified by Flareguy for Space Station 14", "size": { "x": 32, "y": 32 @@ -15,23 +15,41 @@ "directions": 4 }, { - "name": "equipped-INNERCLOTHING-monkey", + "name": "inhand-left", "directions": 4 }, { - "name": "equipped-INNERCLOTHING-vox", + "name": "inhand-right", "directions": 4 }, { - "name": "equipped-INNERCLOTHING-reptilian", + "name": "trinkets-icon" + }, + { + "name": "trinkets-equipped-INNERCLOTHING", "directions": 4 }, { - "name": "inhand-left", + "name": "trinkets-inhand-left", "directions": 4 }, { - "name": "inhand-right", + "name": "trinkets-inhand-right", + "directions": 4 + }, + { + "name": "prisoner-icon" + }, + { + "name": "prisoner-inhand-left", + "directions": 4 + }, + { + "name": "prisoner-inhand-right", + "directions": 4 + }, + { + "name": "prisoner-equipped-INNERCLOTHING", "directions": 4 } ] diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/prisoner-equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/prisoner-equipped-INNERCLOTHING.png new file mode 100644 index 00000000000..f5230c64000 Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/prisoner-equipped-INNERCLOTHING.png differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/prisoner-icon.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/prisoner-icon.png new file mode 100644 index 00000000000..0cea666be50 Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/prisoner-icon.png differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/prisoner-inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/prisoner-inhand-left.png new file mode 100644 index 00000000000..f6ff6866ffc Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/prisoner-inhand-left.png differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/prisoner-inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/prisoner-inhand-right.png new file mode 100644 index 00000000000..45393e81a66 Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/prisoner-inhand-right.png differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/trinkets-equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/trinkets-equipped-INNERCLOTHING.png new file mode 100644 index 00000000000..cee5a50d2ca Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/trinkets-equipped-INNERCLOTHING.png differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/trinkets-icon.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/trinkets-icon.png new file mode 100644 index 00000000000..effb2ada73a Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/trinkets-icon.png differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/trinkets-inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/trinkets-inhand-left.png new file mode 100644 index 00000000000..9bbcac8268a Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/trinkets-inhand-left.png differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/trinkets-inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/trinkets-inhand-right.png new file mode 100644 index 00000000000..cfd72583152 Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/trinkets-inhand-right.png differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/prisoner.rsi/equipped-INNERCLOTHING-monkey.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/prisoner.rsi/equipped-INNERCLOTHING-monkey.png deleted file mode 100644 index cf66060dca3..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/prisoner.rsi/equipped-INNERCLOTHING-monkey.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/prisoner.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/prisoner.rsi/equipped-INNERCLOTHING.png deleted file mode 100644 index 1492d76a1d4..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/prisoner.rsi/equipped-INNERCLOTHING.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/prisoner.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/prisoner.rsi/icon.png deleted file mode 100644 index e2cb52fdec7..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/prisoner.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/prisoner.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/prisoner.rsi/inhand-left.png deleted file mode 100644 index 0e029596526..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/prisoner.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/prisoner.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/prisoner.rsi/inhand-right.png deleted file mode 100644 index cfbe848c3b2..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpskirt/prisoner.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/prisoner.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpskirt/prisoner.rsi/meta.json deleted file mode 100644 index 36ab573091a..00000000000 --- a/Resources/Textures/Clothing/Uniforms/Jumpskirt/prisoner.rsi/meta.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c838ba21dae97db345e0113f99596decd1d66039, monkey derivative made by brainfood1183 (github) for ss14", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-INNERCLOTHING", - "directions": 4 - }, - { - "name": "equipped-INNERCLOTHING-monkey", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/black.rsi/equipped-INNERCLOTHING-monkey.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/black.rsi/equipped-INNERCLOTHING-monkey.png deleted file mode 100644 index cb1a5eece64..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/black.rsi/equipped-INNERCLOTHING-monkey.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/black.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/black.rsi/equipped-INNERCLOTHING.png deleted file mode 100644 index 445e8d01df4..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/black.rsi/equipped-INNERCLOTHING.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/black.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/black.rsi/icon.png deleted file mode 100644 index 8cf3cc9e901..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/black.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/black.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/black.rsi/inhand-left.png deleted file mode 100644 index 8ca0193cb17..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/black.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/black.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/black.rsi/inhand-right.png deleted file mode 100644 index f2a18bc4ebb..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/black.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/black.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/black.rsi/meta.json deleted file mode 100644 index d87d092d3cf..00000000000 --- a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/black.rsi/meta.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c838ba21dae97db345e0113f99596decd1d66039, monkey made by brainfood1183 (github) for ss14, reptilian made by kuro(388673708753027083)", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-INNERCLOTHING", - "directions": 4 - }, - { - "name": "equipped-INNERCLOTHING-monkey", - "directions": 4 - }, - { - "name": "equipped-INNERCLOTHING-reptilian", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/blue.rsi/equipped-INNERCLOTHING-monkey.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/blue.rsi/equipped-INNERCLOTHING-monkey.png deleted file mode 100644 index 93c02f4b754..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/blue.rsi/equipped-INNERCLOTHING-monkey.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/blue.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/blue.rsi/equipped-INNERCLOTHING.png deleted file mode 100644 index ce33a56ae74..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/blue.rsi/equipped-INNERCLOTHING.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/blue.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/blue.rsi/icon.png deleted file mode 100644 index 54266e7972d..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/blue.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/blue.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/blue.rsi/inhand-left.png deleted file mode 100644 index 6aad4575267..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/blue.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/blue.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/blue.rsi/inhand-right.png deleted file mode 100644 index b185b623967..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/blue.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/brown.rsi/equipped-INNERCLOTHING-monkey.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/brown.rsi/equipped-INNERCLOTHING-monkey.png deleted file mode 100644 index 38766b03b56..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/brown.rsi/equipped-INNERCLOTHING-monkey.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/brown.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/brown.rsi/equipped-INNERCLOTHING.png deleted file mode 100644 index 95090dd7525..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/brown.rsi/equipped-INNERCLOTHING.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/brown.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/brown.rsi/icon.png deleted file mode 100644 index 9dcfac02b71..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/brown.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/brown.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/brown.rsi/inhand-left.png deleted file mode 100644 index d316b0400e1..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/brown.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/brown.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/brown.rsi/inhand-right.png deleted file mode 100644 index 6523d6ef6de..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/brown.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/brown.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/brown.rsi/meta.json deleted file mode 100644 index d87d092d3cf..00000000000 --- a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/brown.rsi/meta.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c838ba21dae97db345e0113f99596decd1d66039, monkey made by brainfood1183 (github) for ss14, reptilian made by kuro(388673708753027083)", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-INNERCLOTHING", - "directions": 4 - }, - { - "name": "equipped-INNERCLOTHING-monkey", - "directions": 4 - }, - { - "name": "equipped-INNERCLOTHING-reptilian", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/darkblue.rsi/equipped-INNERCLOTHING-monkey.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/darkblue.rsi/equipped-INNERCLOTHING-monkey.png deleted file mode 100644 index a5bff74a25c..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/darkblue.rsi/equipped-INNERCLOTHING-monkey.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/darkblue.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/darkblue.rsi/equipped-INNERCLOTHING.png deleted file mode 100644 index 74bab00422a..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/darkblue.rsi/equipped-INNERCLOTHING.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/darkblue.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/darkblue.rsi/icon.png deleted file mode 100644 index a054d2a82ef..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/darkblue.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/darkblue.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/darkblue.rsi/inhand-left.png deleted file mode 100644 index ea01f616e46..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/darkblue.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/darkblue.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/darkblue.rsi/inhand-right.png deleted file mode 100644 index 2ef7181ab07..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/darkblue.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/darkblue.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/darkblue.rsi/meta.json deleted file mode 100644 index d87d092d3cf..00000000000 --- a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/darkblue.rsi/meta.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c838ba21dae97db345e0113f99596decd1d66039, monkey made by brainfood1183 (github) for ss14, reptilian made by kuro(388673708753027083)", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-INNERCLOTHING", - "directions": 4 - }, - { - "name": "equipped-INNERCLOTHING-monkey", - "directions": 4 - }, - { - "name": "equipped-INNERCLOTHING-reptilian", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/darkgreen.rsi/equipped-INNERCLOTHING-monkey.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/darkgreen.rsi/equipped-INNERCLOTHING-monkey.png deleted file mode 100644 index a48109bfba1..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/darkgreen.rsi/equipped-INNERCLOTHING-monkey.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/darkgreen.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/darkgreen.rsi/equipped-INNERCLOTHING.png deleted file mode 100644 index 4ae08467c95..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/darkgreen.rsi/equipped-INNERCLOTHING.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/darkgreen.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/darkgreen.rsi/icon.png deleted file mode 100644 index 5f9834bf8e2..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/darkgreen.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/darkgreen.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/darkgreen.rsi/inhand-left.png deleted file mode 100644 index 5456486c258..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/darkgreen.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/darkgreen.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/darkgreen.rsi/inhand-right.png deleted file mode 100644 index 23855a8759e..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/darkgreen.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/darkgreen.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/darkgreen.rsi/meta.json deleted file mode 100644 index d87d092d3cf..00000000000 --- a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/darkgreen.rsi/meta.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c838ba21dae97db345e0113f99596decd1d66039, monkey made by brainfood1183 (github) for ss14, reptilian made by kuro(388673708753027083)", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-INNERCLOTHING", - "directions": 4 - }, - { - "name": "equipped-INNERCLOTHING-monkey", - "directions": 4 - }, - { - "name": "equipped-INNERCLOTHING-reptilian", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/green.rsi/equipped-INNERCLOTHING-monkey.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/green.rsi/equipped-INNERCLOTHING-monkey.png deleted file mode 100644 index 947d515970f..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/green.rsi/equipped-INNERCLOTHING-monkey.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/green.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/green.rsi/equipped-INNERCLOTHING.png deleted file mode 100644 index 029f91d0d48..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/green.rsi/equipped-INNERCLOTHING.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/green.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/green.rsi/icon.png deleted file mode 100644 index c8b62b63ff1..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/green.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/green.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/green.rsi/inhand-left.png deleted file mode 100644 index 5456486c258..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/green.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/green.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/green.rsi/inhand-right.png deleted file mode 100644 index 23855a8759e..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/green.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/green.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/green.rsi/meta.json deleted file mode 100644 index d87d092d3cf..00000000000 --- a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/green.rsi/meta.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c838ba21dae97db345e0113f99596decd1d66039, monkey made by brainfood1183 (github) for ss14, reptilian made by kuro(388673708753027083)", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-INNERCLOTHING", - "directions": 4 - }, - { - "name": "equipped-INNERCLOTHING-monkey", - "directions": 4 - }, - { - "name": "equipped-INNERCLOTHING-reptilian", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/grey.rsi/equipped-INNERCLOTHING-monkey.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/grey.rsi/equipped-INNERCLOTHING-monkey.png deleted file mode 100644 index a1e1573d24b..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/grey.rsi/equipped-INNERCLOTHING-monkey.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/grey.rsi/equipped-INNERCLOTHING-vox.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/grey.rsi/equipped-INNERCLOTHING-vox.png deleted file mode 100644 index f312aac2977..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/grey.rsi/equipped-INNERCLOTHING-vox.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/grey.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/grey.rsi/equipped-INNERCLOTHING.png deleted file mode 100644 index 56c385790ea..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/grey.rsi/equipped-INNERCLOTHING.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/grey.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/grey.rsi/icon.png deleted file mode 100644 index 4b976a5ede7..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/grey.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/grey.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/grey.rsi/inhand-left.png deleted file mode 100644 index ae15d262d7a..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/grey.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/grey.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/grey.rsi/inhand-right.png deleted file mode 100644 index 60bea1b51ac..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/grey.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/lightbrown.rsi/equipped-INNERCLOTHING-monkey.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/lightbrown.rsi/equipped-INNERCLOTHING-monkey.png deleted file mode 100644 index 5989aa1d079..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/lightbrown.rsi/equipped-INNERCLOTHING-monkey.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/lightbrown.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/lightbrown.rsi/equipped-INNERCLOTHING.png deleted file mode 100644 index d77f8e18e13..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/lightbrown.rsi/equipped-INNERCLOTHING.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/lightbrown.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/lightbrown.rsi/icon.png deleted file mode 100644 index db1bf71e11d..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/lightbrown.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/lightbrown.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/lightbrown.rsi/inhand-left.png deleted file mode 100644 index d316b0400e1..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/lightbrown.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/lightbrown.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/lightbrown.rsi/inhand-right.png deleted file mode 100644 index 6523d6ef6de..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/lightbrown.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/lightbrown.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/lightbrown.rsi/meta.json deleted file mode 100644 index d87d092d3cf..00000000000 --- a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/lightbrown.rsi/meta.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c838ba21dae97db345e0113f99596decd1d66039, monkey made by brainfood1183 (github) for ss14, reptilian made by kuro(388673708753027083)", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-INNERCLOTHING", - "directions": 4 - }, - { - "name": "equipped-INNERCLOTHING-monkey", - "directions": 4 - }, - { - "name": "equipped-INNERCLOTHING-reptilian", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/lightpurple.rsi/equipped-INNERCLOTHING-monkey.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/lightpurple.rsi/equipped-INNERCLOTHING-monkey.png deleted file mode 100644 index 06d66a9b1ae..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/lightpurple.rsi/equipped-INNERCLOTHING-monkey.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/lightpurple.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/lightpurple.rsi/equipped-INNERCLOTHING.png deleted file mode 100644 index a7784172f72..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/lightpurple.rsi/equipped-INNERCLOTHING.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/lightpurple.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/lightpurple.rsi/icon.png deleted file mode 100644 index e3825ee3d11..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/lightpurple.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/lightpurple.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/lightpurple.rsi/inhand-left.png deleted file mode 100644 index 46be5288e60..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/lightpurple.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/lightpurple.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/lightpurple.rsi/inhand-right.png deleted file mode 100644 index f1911c7ec0b..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/lightpurple.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/lightpurple.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/lightpurple.rsi/meta.json deleted file mode 100644 index d87d092d3cf..00000000000 --- a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/lightpurple.rsi/meta.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c838ba21dae97db345e0113f99596decd1d66039, monkey made by brainfood1183 (github) for ss14, reptilian made by kuro(388673708753027083)", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-INNERCLOTHING", - "directions": 4 - }, - { - "name": "equipped-INNERCLOTHING-monkey", - "directions": 4 - }, - { - "name": "equipped-INNERCLOTHING-reptilian", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/maroon.rsi/equipped-INNERCLOTHING-monkey.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/maroon.rsi/equipped-INNERCLOTHING-monkey.png deleted file mode 100644 index 543da4f4e4f..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/maroon.rsi/equipped-INNERCLOTHING-monkey.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/maroon.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/maroon.rsi/equipped-INNERCLOTHING.png deleted file mode 100644 index ddab094d22b..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/maroon.rsi/equipped-INNERCLOTHING.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/maroon.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/maroon.rsi/icon.png deleted file mode 100644 index 459de73286b..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/maroon.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/maroon.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/maroon.rsi/inhand-left.png deleted file mode 100644 index a703128c963..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/maroon.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/maroon.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/maroon.rsi/inhand-right.png deleted file mode 100644 index 8c73e1c7ce2..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/maroon.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/maroon.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/maroon.rsi/meta.json deleted file mode 100644 index d87d092d3cf..00000000000 --- a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/maroon.rsi/meta.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c838ba21dae97db345e0113f99596decd1d66039, monkey made by brainfood1183 (github) for ss14, reptilian made by kuro(388673708753027083)", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-INNERCLOTHING", - "directions": 4 - }, - { - "name": "equipped-INNERCLOTHING-monkey", - "directions": 4 - }, - { - "name": "equipped-INNERCLOTHING-reptilian", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/orange.rsi/equipped-INNERCLOTHING-monkey.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/orange.rsi/equipped-INNERCLOTHING-monkey.png deleted file mode 100644 index 3ac7ea5d022..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/orange.rsi/equipped-INNERCLOTHING-monkey.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/orange.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/orange.rsi/equipped-INNERCLOTHING.png deleted file mode 100644 index 71e32fc8ea6..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/orange.rsi/equipped-INNERCLOTHING.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/orange.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/orange.rsi/icon.png deleted file mode 100644 index c443437f6ac..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/orange.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/orange.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/orange.rsi/inhand-left.png deleted file mode 100644 index 5e5c42697c3..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/orange.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/orange.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/orange.rsi/inhand-right.png deleted file mode 100644 index fee1dd85cd2..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/orange.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/orange.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/orange.rsi/meta.json deleted file mode 100644 index d87d092d3cf..00000000000 --- a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/orange.rsi/meta.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c838ba21dae97db345e0113f99596decd1d66039, monkey made by brainfood1183 (github) for ss14, reptilian made by kuro(388673708753027083)", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-INNERCLOTHING", - "directions": 4 - }, - { - "name": "equipped-INNERCLOTHING-monkey", - "directions": 4 - }, - { - "name": "equipped-INNERCLOTHING-reptilian", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/pink.rsi/equipped-INNERCLOTHING-monkey.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/pink.rsi/equipped-INNERCLOTHING-monkey.png deleted file mode 100644 index d69c0924ea7..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/pink.rsi/equipped-INNERCLOTHING-monkey.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/pink.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/pink.rsi/equipped-INNERCLOTHING.png deleted file mode 100644 index bb3294245a5..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/pink.rsi/equipped-INNERCLOTHING.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/pink.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/pink.rsi/icon.png deleted file mode 100644 index db1cba5d7ef..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/pink.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/pink.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/pink.rsi/inhand-left.png deleted file mode 100644 index 9112f9b9802..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/pink.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/pink.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/pink.rsi/inhand-right.png deleted file mode 100644 index d3df7bcb6b7..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/pink.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/pink.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/pink.rsi/meta.json deleted file mode 100644 index d87d092d3cf..00000000000 --- a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/pink.rsi/meta.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c838ba21dae97db345e0113f99596decd1d66039, monkey made by brainfood1183 (github) for ss14, reptilian made by kuro(388673708753027083)", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-INNERCLOTHING", - "directions": 4 - }, - { - "name": "equipped-INNERCLOTHING-monkey", - "directions": 4 - }, - { - "name": "equipped-INNERCLOTHING-reptilian", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/red.rsi/equipped-INNERCLOTHING-monkey.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/red.rsi/equipped-INNERCLOTHING-monkey.png deleted file mode 100644 index d1274a497a1..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/red.rsi/equipped-INNERCLOTHING-monkey.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/red.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/red.rsi/equipped-INNERCLOTHING.png deleted file mode 100644 index 27edb0b73ed..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/red.rsi/equipped-INNERCLOTHING.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/red.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/red.rsi/icon.png deleted file mode 100644 index 871e9e5e4ea..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/red.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/red.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/red.rsi/inhand-left.png deleted file mode 100644 index 4cd9c955ae1..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/red.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/red.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/red.rsi/inhand-right.png deleted file mode 100644 index ae5a124c663..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/red.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/red.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/red.rsi/meta.json deleted file mode 100644 index d87d092d3cf..00000000000 --- a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/red.rsi/meta.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c838ba21dae97db345e0113f99596decd1d66039, monkey made by brainfood1183 (github) for ss14, reptilian made by kuro(388673708753027083)", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-INNERCLOTHING", - "directions": 4 - }, - { - "name": "equipped-INNERCLOTHING-monkey", - "directions": 4 - }, - { - "name": "equipped-INNERCLOTHING-reptilian", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/teal.rsi/equipped-INNERCLOTHING-monkey.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/teal.rsi/equipped-INNERCLOTHING-monkey.png deleted file mode 100644 index 77710536580..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/teal.rsi/equipped-INNERCLOTHING-monkey.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/teal.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/teal.rsi/equipped-INNERCLOTHING.png deleted file mode 100644 index 2c8be92e08e..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/teal.rsi/equipped-INNERCLOTHING.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/teal.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/teal.rsi/icon.png deleted file mode 100644 index d2156294af5..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/teal.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/teal.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/teal.rsi/inhand-left.png deleted file mode 100644 index 748bfb2e972..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/teal.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/teal.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/teal.rsi/inhand-right.png deleted file mode 100644 index 4944e6fc0ba..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/teal.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/teal.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/teal.rsi/meta.json deleted file mode 100644 index d87d092d3cf..00000000000 --- a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/teal.rsi/meta.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c838ba21dae97db345e0113f99596decd1d66039, monkey made by brainfood1183 (github) for ss14, reptilian made by kuro(388673708753027083)", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-INNERCLOTHING", - "directions": 4 - }, - { - "name": "equipped-INNERCLOTHING-monkey", - "directions": 4 - }, - { - "name": "equipped-INNERCLOTHING-reptilian", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/white.rsi/equipped-INNERCLOTHING-monkey.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/white.rsi/equipped-INNERCLOTHING-monkey.png deleted file mode 100644 index c99223c4672..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/white.rsi/equipped-INNERCLOTHING-monkey.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/white.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/white.rsi/equipped-INNERCLOTHING.png deleted file mode 100644 index 1196f82db6e..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/white.rsi/equipped-INNERCLOTHING.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/white.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/white.rsi/icon.png deleted file mode 100644 index 3cf289d5ac5..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/white.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/white.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/white.rsi/inhand-left.png deleted file mode 100644 index 592cd94079c..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/white.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/white.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/white.rsi/inhand-right.png deleted file mode 100644 index 3d3dd56f27e..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/white.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/white.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/white.rsi/meta.json deleted file mode 100644 index d87d092d3cf..00000000000 --- a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/white.rsi/meta.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c838ba21dae97db345e0113f99596decd1d66039, monkey made by brainfood1183 (github) for ss14, reptilian made by kuro(388673708753027083)", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-INNERCLOTHING", - "directions": 4 - }, - { - "name": "equipped-INNERCLOTHING-monkey", - "directions": 4 - }, - { - "name": "equipped-INNERCLOTHING-reptilian", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/yellow.rsi/equipped-INNERCLOTHING-monkey.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/yellow.rsi/equipped-INNERCLOTHING-monkey.png deleted file mode 100644 index 69166ef2e52..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/yellow.rsi/equipped-INNERCLOTHING-monkey.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/yellow.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/yellow.rsi/equipped-INNERCLOTHING.png deleted file mode 100644 index e884390be20..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/yellow.rsi/equipped-INNERCLOTHING.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/yellow.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/yellow.rsi/icon.png deleted file mode 100644 index 74cc6a4f8cc..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/yellow.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/yellow.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/yellow.rsi/inhand-left.png deleted file mode 100644 index 6959537bcea..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/yellow.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/yellow.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/yellow.rsi/inhand-right.png deleted file mode 100644 index 148b9812320..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/yellow.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/yellow.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/yellow.rsi/meta.json deleted file mode 100644 index d87d092d3cf..00000000000 --- a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/yellow.rsi/meta.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c838ba21dae97db345e0113f99596decd1d66039, monkey made by brainfood1183 (github) for ss14, reptilian made by kuro(388673708753027083)", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-INNERCLOTHING", - "directions": 4 - }, - { - "name": "equipped-INNERCLOTHING-monkey", - "directions": 4 - }, - { - "name": "equipped-INNERCLOTHING-reptilian", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/grey.rsi/equipped-INNERCLOTHING-reptilian.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/equipped-INNERCLOTHING-reptilian.png similarity index 100% rename from Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/grey.rsi/equipped-INNERCLOTHING-reptilian.png rename to Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/equipped-INNERCLOTHING-reptilian.png diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/equipped-INNERCLOTHING.png new file mode 100644 index 00000000000..5c333dfc118 Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/equipped-INNERCLOTHING.png differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/icon.png new file mode 100644 index 00000000000..c0087d4d250 Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/icon.png differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/inhand-left.png new file mode 100644 index 00000000000..0b131234865 Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/inhand-left.png differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/inhand-right.png new file mode 100644 index 00000000000..ba6769d59d5 Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/inhand-right.png differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/blue.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/meta.json similarity index 50% rename from Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/blue.rsi/meta.json rename to Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/meta.json index d87d092d3cf..7e6832bd12c 100644 --- a/Resources/Textures/Clothing/Uniforms/Jumpsuit/Color/blue.rsi/meta.json +++ b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c838ba21dae97db345e0113f99596decd1d66039, monkey made by brainfood1183 (github) for ss14, reptilian made by kuro(388673708753027083)", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c838ba21dae97db345e0113f99596decd1d66039 and modified by Flareguy for Space Station 14", "size": { "x": 32, "y": 32 @@ -15,19 +15,41 @@ "directions": 4 }, { - "name": "equipped-INNERCLOTHING-monkey", + "name": "inhand-left", "directions": 4 }, { - "name": "equipped-INNERCLOTHING-reptilian", + "name": "inhand-right", "directions": 4 }, { - "name": "inhand-left", + "name": "trinkets-icon" + }, + { + "name": "trinkets-equipped-INNERCLOTHING", "directions": 4 }, { - "name": "inhand-right", + "name": "trinkets-inhand-left", + "directions": 4 + }, + { + "name": "trinkets-inhand-right", + "directions": 4 + }, + { + "name": "prisoner-icon" + }, + { + "name": "prisoner-inhand-left", + "directions": 4 + }, + { + "name": "prisoner-inhand-right", + "directions": 4 + }, + { + "name": "prisoner-equipped-INNERCLOTHING", "directions": 4 } ] diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/prisoner-equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/prisoner-equipped-INNERCLOTHING.png new file mode 100644 index 00000000000..320db64b579 Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/prisoner-equipped-INNERCLOTHING.png differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/prisoner-icon.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/prisoner-icon.png new file mode 100644 index 00000000000..faebe0e0550 Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/prisoner-icon.png differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/prisoner-inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/prisoner-inhand-left.png new file mode 100644 index 00000000000..f6ff6866ffc Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/prisoner-inhand-left.png differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/prisoner-inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/prisoner-inhand-right.png new file mode 100644 index 00000000000..45393e81a66 Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/prisoner-inhand-right.png differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/trinkets-equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/trinkets-equipped-INNERCLOTHING.png new file mode 100644 index 00000000000..e21afe8d4eb Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/trinkets-equipped-INNERCLOTHING.png differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/trinkets-icon.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/trinkets-icon.png new file mode 100644 index 00000000000..c9e8398b47d Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/trinkets-icon.png differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/trinkets-inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/trinkets-inhand-left.png new file mode 100644 index 00000000000..9bbcac8268a Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/trinkets-inhand-left.png differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/trinkets-inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/trinkets-inhand-right.png new file mode 100644 index 00000000000..cfd72583152 Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/trinkets-inhand-right.png differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/prisoner.rsi/equipped-INNERCLOTHING-monkey.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/prisoner.rsi/equipped-INNERCLOTHING-monkey.png deleted file mode 100644 index 6c1672bd7f4..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/prisoner.rsi/equipped-INNERCLOTHING-monkey.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/prisoner.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/prisoner.rsi/equipped-INNERCLOTHING.png deleted file mode 100644 index a4ec7058a13..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/prisoner.rsi/equipped-INNERCLOTHING.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/prisoner.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/prisoner.rsi/icon.png deleted file mode 100644 index 69109945802..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/prisoner.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/prisoner.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/prisoner.rsi/inhand-left.png deleted file mode 100644 index 0e029596526..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/prisoner.rsi/inhand-left.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/prisoner.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/prisoner.rsi/inhand-right.png deleted file mode 100644 index cfbe848c3b2..00000000000 Binary files a/Resources/Textures/Clothing/Uniforms/Jumpsuit/prisoner.rsi/inhand-right.png and /dev/null differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/prisoner.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpsuit/prisoner.rsi/meta.json deleted file mode 100644 index 749b7110217..00000000000 --- a/Resources/Textures/Clothing/Uniforms/Jumpsuit/prisoner.rsi/meta.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c838ba21dae97db345e0113f99596decd1d66039, monkey made by brainfood1183 (github) for ss14, reptilian made by github:Morb0", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-INNERCLOTHING", - "directions": 4 - }, - { - "name": "equipped-INNERCLOTHING-monkey", - "directions": 4 - }, - { - "name": "equipped-INNERCLOTHING-reptilian", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/base_leg_standart.png b/Resources/Textures/Clothing/Uniforms/procedural.rsi/base_leg_standard.png similarity index 100% rename from Resources/Textures/Clothing/Uniforms/procedural.rsi/base_leg_standart.png rename to Resources/Textures/Clothing/Uniforms/procedural.rsi/base_leg_standard.png diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/base_torso_standart.png b/Resources/Textures/Clothing/Uniforms/procedural.rsi/base_torso_standard.png similarity index 100% rename from Resources/Textures/Clothing/Uniforms/procedural.rsi/base_torso_standart.png rename to Resources/Textures/Clothing/Uniforms/procedural.rsi/base_torso_standard.png diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/base_torso_standart2.png b/Resources/Textures/Clothing/Uniforms/procedural.rsi/base_torso_standard2.png similarity index 100% rename from Resources/Textures/Clothing/Uniforms/procedural.rsi/base_torso_standart2.png rename to Resources/Textures/Clothing/Uniforms/procedural.rsi/base_torso_standard2.png diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standart1.png b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standard1.png similarity index 100% rename from Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standart1.png rename to Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standard1.png diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standart2.png b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standard2.png similarity index 100% rename from Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standart2.png rename to Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standard2.png diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standart3.png b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standard3.png similarity index 100% rename from Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standart3.png rename to Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standard3.png diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standart4.png b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standard4.png similarity index 100% rename from Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standart4.png rename to Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standard4.png diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standart5.png b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standard5.png similarity index 100% rename from Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standart5.png rename to Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standard5.png diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standart6.png b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standard6.png similarity index 100% rename from Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standart6.png rename to Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standard6.png diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standart7.png b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standard7.png similarity index 100% rename from Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standart7.png rename to Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standard7.png diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standart8.png b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standard8.png similarity index 100% rename from Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standart8.png rename to Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standard8.png diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standart9.png b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standard9.png similarity index 100% rename from Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standart9.png rename to Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standard9.png diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/procedural.rsi/meta.json index 08133fc00b0..545f209db9b 100644 --- a/Resources/Textures/Clothing/Uniforms/procedural.rsi/meta.json +++ b/Resources/Textures/Clothing/Uniforms/procedural.rsi/meta.json @@ -20,7 +20,7 @@ "directions": 4 }, { - "name": "base_leg_standart", + "name": "base_leg_standard", "directions": 4 }, { @@ -36,11 +36,11 @@ "directions": 4 }, { - "name": "base_torso_standart", + "name": "base_torso_standard", "directions": 4 }, { - "name": "base_torso_standart2", + "name": "base_torso_standard2", "directions": 4 }, { @@ -116,39 +116,39 @@ "directions": 4 }, { - "name": "decor_torso_standart1", + "name": "decor_torso_standard1", "directions": 4 }, { - "name": "decor_torso_standart2", + "name": "decor_torso_standard2", "directions": 4 }, { - "name": "decor_torso_standart3", + "name": "decor_torso_standard3", "directions": 4 }, { - "name": "decor_torso_standart4", + "name": "decor_torso_standard4", "directions": 4 }, { - "name": "decor_torso_standart5", + "name": "decor_torso_standard5", "directions": 4 }, { - "name": "decor_torso_standart6", + "name": "decor_torso_standard6", "directions": 4 }, { - "name": "decor_torso_standart7", + "name": "decor_torso_standard7", "directions": 4 }, { - "name": "decor_torso_standart8", + "name": "decor_torso_standard8", "directions": 4 }, { - "name": "decor_torso_standart9", + "name": "decor_torso_standard9", "directions": 4 }, { diff --git a/Resources/Textures/Interface/Ashen/item_status_left.png b/Resources/Textures/Interface/Ashen/item_status_left.png new file mode 100644 index 00000000000..fb2bf2b9b4a Binary files /dev/null and b/Resources/Textures/Interface/Ashen/item_status_left.png differ diff --git a/Resources/Textures/Interface/Ashen/item_status_left_highlight.png b/Resources/Textures/Interface/Ashen/item_status_left_highlight.png new file mode 100644 index 00000000000..91cd15dd4cf Binary files /dev/null and b/Resources/Textures/Interface/Ashen/item_status_left_highlight.png differ diff --git a/Resources/Textures/Interface/Ashen/item_status_right.png b/Resources/Textures/Interface/Ashen/item_status_right.png new file mode 100644 index 00000000000..53f4f362d0a Binary files /dev/null and b/Resources/Textures/Interface/Ashen/item_status_right.png differ diff --git a/Resources/Textures/Interface/Ashen/item_status_right_highlight.png b/Resources/Textures/Interface/Ashen/item_status_right_highlight.png new file mode 100644 index 00000000000..ad16bab6d10 Binary files /dev/null and b/Resources/Textures/Interface/Ashen/item_status_right_highlight.png differ diff --git a/Resources/Textures/Interface/Ashen/template_small.png b/Resources/Textures/Interface/Ashen/template_small.png new file mode 100644 index 00000000000..f3a4379f76c Binary files /dev/null and b/Resources/Textures/Interface/Ashen/template_small.png differ diff --git a/Resources/Textures/Interface/Clockwork/item_status_left.png b/Resources/Textures/Interface/Clockwork/item_status_left.png new file mode 100644 index 00000000000..1ce950362d2 Binary files /dev/null and b/Resources/Textures/Interface/Clockwork/item_status_left.png differ diff --git a/Resources/Textures/Interface/Clockwork/item_status_left_highlight.png b/Resources/Textures/Interface/Clockwork/item_status_left_highlight.png new file mode 100644 index 00000000000..f715e062765 Binary files /dev/null and b/Resources/Textures/Interface/Clockwork/item_status_left_highlight.png differ diff --git a/Resources/Textures/Interface/Clockwork/item_status_right.png b/Resources/Textures/Interface/Clockwork/item_status_right.png new file mode 100644 index 00000000000..5ea5ffcffad Binary files /dev/null and b/Resources/Textures/Interface/Clockwork/item_status_right.png differ diff --git a/Resources/Textures/Interface/Clockwork/item_status_right_highlight.png b/Resources/Textures/Interface/Clockwork/item_status_right_highlight.png new file mode 100644 index 00000000000..315d595c925 Binary files /dev/null and b/Resources/Textures/Interface/Clockwork/item_status_right_highlight.png differ diff --git a/Resources/Textures/Interface/Default/item_status_left.png b/Resources/Textures/Interface/Default/item_status_left.png new file mode 100644 index 00000000000..6c980f226ec Binary files /dev/null and b/Resources/Textures/Interface/Default/item_status_left.png differ diff --git a/Resources/Textures/Interface/Default/item_status_left_highlight.png b/Resources/Textures/Interface/Default/item_status_left_highlight.png new file mode 100644 index 00000000000..87dea5cf100 Binary files /dev/null and b/Resources/Textures/Interface/Default/item_status_left_highlight.png differ diff --git a/Resources/Textures/Interface/Default/item_status_right.png b/Resources/Textures/Interface/Default/item_status_right.png new file mode 100644 index 00000000000..82ad44b48c1 Binary files /dev/null and b/Resources/Textures/Interface/Default/item_status_right.png differ diff --git a/Resources/Textures/Interface/Default/item_status_right_highlight.png b/Resources/Textures/Interface/Default/item_status_right_highlight.png new file mode 100644 index 00000000000..0c1c3448486 Binary files /dev/null and b/Resources/Textures/Interface/Default/item_status_right_highlight.png differ diff --git a/Resources/Textures/Interface/Minimalist/item_status_left.png b/Resources/Textures/Interface/Minimalist/item_status_left.png new file mode 100644 index 00000000000..d70eca2fe92 Binary files /dev/null and b/Resources/Textures/Interface/Minimalist/item_status_left.png differ diff --git a/Resources/Textures/Interface/Minimalist/item_status_left_highlight.png b/Resources/Textures/Interface/Minimalist/item_status_left_highlight.png new file mode 100644 index 00000000000..b69872cd89c Binary files /dev/null and b/Resources/Textures/Interface/Minimalist/item_status_left_highlight.png differ diff --git a/Resources/Textures/Interface/Minimalist/item_status_right.png b/Resources/Textures/Interface/Minimalist/item_status_right.png new file mode 100644 index 00000000000..89171b9b478 Binary files /dev/null and b/Resources/Textures/Interface/Minimalist/item_status_right.png differ diff --git a/Resources/Textures/Interface/Minimalist/item_status_right_highlight.png b/Resources/Textures/Interface/Minimalist/item_status_right_highlight.png new file mode 100644 index 00000000000..d1474cee120 Binary files /dev/null and b/Resources/Textures/Interface/Minimalist/item_status_right_highlight.png differ diff --git a/Resources/Textures/Interface/Minimalist/template_small.png b/Resources/Textures/Interface/Minimalist/template_small.png new file mode 100644 index 00000000000..eb0ee037fd5 Binary files /dev/null and b/Resources/Textures/Interface/Minimalist/template_small.png differ diff --git a/Resources/Textures/Interface/Nano/item_status_left.svg b/Resources/Textures/Interface/Nano/item_status_left.svg deleted file mode 100644 index c97f8de0167..00000000000 --- a/Resources/Textures/Interface/Nano/item_status_left.svg +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - - diff --git a/Resources/Textures/Interface/Nano/item_status_left.svg.96dpi.png b/Resources/Textures/Interface/Nano/item_status_left.svg.96dpi.png deleted file mode 100644 index e058fa73747..00000000000 Binary files a/Resources/Textures/Interface/Nano/item_status_left.svg.96dpi.png and /dev/null differ diff --git a/Resources/Textures/Interface/Nano/item_status_middle.svg b/Resources/Textures/Interface/Nano/item_status_middle.svg deleted file mode 100644 index a913981db11..00000000000 --- a/Resources/Textures/Interface/Nano/item_status_middle.svg +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - - diff --git a/Resources/Textures/Interface/Nano/item_status_middle.svg.96dpi.png b/Resources/Textures/Interface/Nano/item_status_middle.svg.96dpi.png deleted file mode 100644 index ce41106b20c..00000000000 Binary files a/Resources/Textures/Interface/Nano/item_status_middle.svg.96dpi.png and /dev/null differ diff --git a/Resources/Textures/Interface/Nano/item_status_right.svg b/Resources/Textures/Interface/Nano/item_status_right.svg deleted file mode 100644 index d898bb2ce09..00000000000 --- a/Resources/Textures/Interface/Nano/item_status_right.svg +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - - diff --git a/Resources/Textures/Interface/Nano/item_status_right.svg.96dpi.png b/Resources/Textures/Interface/Nano/item_status_right.svg.96dpi.png deleted file mode 100644 index fb7c4a9e6e6..00000000000 Binary files a/Resources/Textures/Interface/Nano/item_status_right.svg.96dpi.png and /dev/null differ diff --git a/Resources/Textures/Interface/Plasmafire/item_status_left.png b/Resources/Textures/Interface/Plasmafire/item_status_left.png new file mode 100644 index 00000000000..d5d25c98091 Binary files /dev/null and b/Resources/Textures/Interface/Plasmafire/item_status_left.png differ diff --git a/Resources/Textures/Interface/Plasmafire/item_status_left_highlight.png b/Resources/Textures/Interface/Plasmafire/item_status_left_highlight.png new file mode 100644 index 00000000000..afe37513fd5 Binary files /dev/null and b/Resources/Textures/Interface/Plasmafire/item_status_left_highlight.png differ diff --git a/Resources/Textures/Interface/Plasmafire/item_status_right.png b/Resources/Textures/Interface/Plasmafire/item_status_right.png new file mode 100644 index 00000000000..ca97f81c8f5 Binary files /dev/null and b/Resources/Textures/Interface/Plasmafire/item_status_right.png differ diff --git a/Resources/Textures/Interface/Plasmafire/item_status_right_highlight.png b/Resources/Textures/Interface/Plasmafire/item_status_right_highlight.png new file mode 100644 index 00000000000..b95822b7373 Binary files /dev/null and b/Resources/Textures/Interface/Plasmafire/item_status_right_highlight.png differ diff --git a/Resources/Textures/Interface/Retro/item_status_left.png b/Resources/Textures/Interface/Retro/item_status_left.png new file mode 100644 index 00000000000..21b107b84df Binary files /dev/null and b/Resources/Textures/Interface/Retro/item_status_left.png differ diff --git a/Resources/Textures/Interface/Retro/item_status_left_highlight.png b/Resources/Textures/Interface/Retro/item_status_left_highlight.png new file mode 100644 index 00000000000..fdd5a4fe7d6 Binary files /dev/null and b/Resources/Textures/Interface/Retro/item_status_left_highlight.png differ diff --git a/Resources/Textures/Interface/Retro/item_status_right.png b/Resources/Textures/Interface/Retro/item_status_right.png new file mode 100644 index 00000000000..5e7d54618d2 Binary files /dev/null and b/Resources/Textures/Interface/Retro/item_status_right.png differ diff --git a/Resources/Textures/Interface/Retro/item_status_right_highlight.png b/Resources/Textures/Interface/Retro/item_status_right_highlight.png new file mode 100644 index 00000000000..c6e12c41e69 Binary files /dev/null and b/Resources/Textures/Interface/Retro/item_status_right_highlight.png differ diff --git a/Resources/Textures/Interface/Retro/template_small.png b/Resources/Textures/Interface/Retro/template_small.png new file mode 100644 index 00000000000..7244b37f5c7 Binary files /dev/null and b/Resources/Textures/Interface/Retro/template_small.png differ diff --git a/Resources/Textures/Interface/Slimecore/item_status_left.png b/Resources/Textures/Interface/Slimecore/item_status_left.png new file mode 100644 index 00000000000..a7d940f401f Binary files /dev/null and b/Resources/Textures/Interface/Slimecore/item_status_left.png differ diff --git a/Resources/Textures/Interface/Slimecore/item_status_left_highlight.png b/Resources/Textures/Interface/Slimecore/item_status_left_highlight.png new file mode 100644 index 00000000000..322355b1358 Binary files /dev/null and b/Resources/Textures/Interface/Slimecore/item_status_left_highlight.png differ diff --git a/Resources/Textures/Interface/Slimecore/item_status_right.png b/Resources/Textures/Interface/Slimecore/item_status_right.png new file mode 100644 index 00000000000..77b53340a63 Binary files /dev/null and b/Resources/Textures/Interface/Slimecore/item_status_right.png differ diff --git a/Resources/Textures/Interface/Slimecore/item_status_right_highlight.png b/Resources/Textures/Interface/Slimecore/item_status_right_highlight.png new file mode 100644 index 00000000000..1e1a631db4b Binary files /dev/null and b/Resources/Textures/Interface/Slimecore/item_status_right_highlight.png differ diff --git a/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_lizardblindfold.png b/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_lizard_blindfold.png similarity index 100% rename from Resources/Textures/Mobs/Customization/gauze.rsi/gauze_lizardblindfold.png rename to Resources/Textures/Mobs/Customization/gauze.rsi/gauze_lizard_blindfold.png diff --git a/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_lizardfoot_l.png b/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_lizard_foot_l.png similarity index 100% rename from Resources/Textures/Mobs/Customization/gauze.rsi/gauze_lizardfoot_l.png rename to Resources/Textures/Mobs/Customization/gauze.rsi/gauze_lizard_foot_l.png diff --git a/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_lizardfoot_r.png b/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_lizard_foot_r.png similarity index 100% rename from Resources/Textures/Mobs/Customization/gauze.rsi/gauze_lizardfoot_r.png rename to Resources/Textures/Mobs/Customization/gauze.rsi/gauze_lizard_foot_r.png diff --git a/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_lizardlefteye.png b/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_lizard_lefteye.png similarity index 100% rename from Resources/Textures/Mobs/Customization/gauze.rsi/gauze_lizardlefteye.png rename to Resources/Textures/Mobs/Customization/gauze.rsi/gauze_lizard_lefteye.png diff --git a/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_lizardrighteye.png b/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_lizard_righteye.png similarity index 100% rename from Resources/Textures/Mobs/Customization/gauze.rsi/gauze_lizardrighteye.png rename to Resources/Textures/Mobs/Customization/gauze.rsi/gauze_lizard_righteye.png diff --git a/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_moth_abdomen.png b/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_moth_abdomen.png new file mode 100644 index 00000000000..e8b42aca5ca Binary files /dev/null and b/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_moth_abdomen.png differ diff --git a/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_moth_blindfold.png b/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_moth_blindfold.png new file mode 100644 index 00000000000..499a3cb29d1 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_moth_blindfold.png differ diff --git a/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_moth_lefteye_1.png b/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_moth_lefteye_1.png new file mode 100644 index 00000000000..73ba4b1c50f Binary files /dev/null and b/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_moth_lefteye_1.png differ diff --git a/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_moth_lefteye_2.png b/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_moth_lefteye_2.png new file mode 100644 index 00000000000..a1c9a8f0922 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_moth_lefteye_2.png differ diff --git a/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_moth_lowerleg_l.png b/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_moth_lowerleg_l.png new file mode 100644 index 00000000000..df750d98199 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_moth_lowerleg_l.png differ diff --git a/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_moth_lowerleg_r.png b/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_moth_lowerleg_r.png new file mode 100644 index 00000000000..f6504f8ca78 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_moth_lowerleg_r.png differ diff --git a/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_moth_righteye_1.png b/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_moth_righteye_1.png new file mode 100644 index 00000000000..4c5ab639bb3 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_moth_righteye_1.png differ diff --git a/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_moth_righteye_2.png b/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_moth_righteye_2.png new file mode 100644 index 00000000000..563e692b8b2 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_moth_righteye_2.png differ diff --git a/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_moth_shoulder.png b/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_moth_shoulder.png new file mode 100644 index 00000000000..ba2c0f6032e Binary files /dev/null and b/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_moth_shoulder.png differ diff --git a/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_moth_upperarm_l.png b/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_moth_upperarm_l.png new file mode 100644 index 00000000000..1587a75b99b Binary files /dev/null and b/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_moth_upperarm_l.png differ diff --git a/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_moth_upperarm_r.png b/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_moth_upperarm_r.png new file mode 100644 index 00000000000..19750a09d02 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_moth_upperarm_r.png differ diff --git a/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_moth_upperleg_l.png b/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_moth_upperleg_l.png new file mode 100644 index 00000000000..7252c235156 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_moth_upperleg_l.png differ diff --git a/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_moth_upperleg_r.png b/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_moth_upperleg_r.png new file mode 100644 index 00000000000..2f09a4de3e6 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/gauze.rsi/gauze_moth_upperleg_r.png differ diff --git a/Resources/Textures/Mobs/Customization/gauze.rsi/meta.json b/Resources/Textures/Mobs/Customization/gauze.rsi/meta.json index 232e7b0b22d..8d82ccab517 100644 --- a/Resources/Textures/Mobs/Customization/gauze.rsi/meta.json +++ b/Resources/Textures/Mobs/Customization/gauze.rsi/meta.json @@ -72,23 +72,75 @@ "directions": 4 }, { - "name": "gauze_lizardblindfold", + "name": "gauze_lizard_blindfold", "directions": 4 }, { - "name": "gauze_lizardrighteye", + "name": "gauze_lizard_righteye", "directions": 4 }, { - "name": "gauze_lizardlefteye", + "name": "gauze_lizard_lefteye", "directions": 4 }, { - "name": "gauze_lizardfoot_r", + "name": "gauze_lizard_foot_r", "directions": 4 }, { - "name": "gauze_lizardfoot_l", + "name": "gauze_lizard_foot_l", + "directions": 4 + }, + { + "name": "gauze_moth_abdomen", + "directions": 4 + }, + { + "name": "gauze_moth_shoulder", + "directions": 4 + }, + { + "name": "gauze_moth_blindfold", + "directions": 4 + }, + { + "name": "gauze_moth_righteye_1", + "directions": 4 + }, + { + "name": "gauze_moth_righteye_2", + "directions": 4 + }, + { + "name": "gauze_moth_lefteye_1", + "directions": 4 + }, + { + "name": "gauze_moth_lefteye_2", + "directions": 4 + }, + { + "name": "gauze_moth_upperarm_r", + "directions": 4 + }, + { + "name": "gauze_moth_upperarm_l", + "directions": 4 + }, + { + "name": "gauze_moth_upperleg_r", + "directions": 4 + }, + { + "name": "gauze_moth_upperleg_l", + "directions": 4 + }, + { + "name": "gauze_moth_lowerleg_r", + "directions": 4 + }, + { + "name": "gauze_moth_lowerleg_l", "directions": 4 } ] diff --git a/Resources/Textures/Mobs/Customization/reptilian_parts.rsi/frills_axolotl.png b/Resources/Textures/Mobs/Customization/reptilian_parts.rsi/frills_axolotl.png index f7f54acdaed..d61b60824c9 100644 Binary files a/Resources/Textures/Mobs/Customization/reptilian_parts.rsi/frills_axolotl.png and b/Resources/Textures/Mobs/Customization/reptilian_parts.rsi/frills_axolotl.png differ diff --git a/Resources/Textures/Mobs/Customization/reptilian_parts.rsi/meta.json b/Resources/Textures/Mobs/Customization/reptilian_parts.rsi/meta.json index 8eaac10cd94..de7b26ad6c9 100644 --- a/Resources/Textures/Mobs/Customization/reptilian_parts.rsi/meta.json +++ b/Resources/Textures/Mobs/Customization/reptilian_parts.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "https://github.com/Skyrat-SS13/Skyrat-tg/tree/40e3cdbb15b8bc0d5ef2fb46133adf805bda5297, while Argali, Ayrshire, Myrsore and Bighorn are drawn by Ubaser, and Kobold Ears are drawn by Pigeonpeas. Body_underbelly made by Nairod(github) for SS14. Large drawn by Ubaser. Wagging tail by SonicDC.", + "copyright": "https://github.com/Skyrat-SS13/Skyrat-tg/tree/40e3cdbb15b8bc0d5ef2fb46133adf805bda5297, while Argali, Ayrshire, Myrsore and Bighorn are drawn by Ubaser, and Kobold Ears are drawn by Pigeonpeas. Body_underbelly made by Nairod(github) for SS14. Large drawn by Ubaser. Wagging tail by SonicDC. Splotch modified from Sharp by KittenColony(github)", "size": { "x": 32, "y": 32 @@ -600,6 +600,14 @@ { "name": "body_backspikes", "directions": 4 - } + }, + { + "name": "snout_splotch_primary", + "directions": 4 + }, + { + "name": "snout_splotch_secondary", + "directions": 4 + } ] } diff --git a/Resources/Textures/Mobs/Customization/reptilian_parts.rsi/snout_splotch_primary.png b/Resources/Textures/Mobs/Customization/reptilian_parts.rsi/snout_splotch_primary.png new file mode 100644 index 00000000000..0098822db90 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/reptilian_parts.rsi/snout_splotch_primary.png differ diff --git a/Resources/Textures/Mobs/Customization/reptilian_parts.rsi/snout_splotch_secondary.png b/Resources/Textures/Mobs/Customization/reptilian_parts.rsi/snout_splotch_secondary.png new file mode 100644 index 00000000000..5a982ed3546 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/reptilian_parts.rsi/snout_splotch_secondary.png differ diff --git a/Resources/Textures/Mobs/Demons/tomatokiller.rsi/alive.png b/Resources/Textures/Mobs/Demons/tomatokiller.rsi/alive.png new file mode 100644 index 00000000000..5f459d518b5 Binary files /dev/null and b/Resources/Textures/Mobs/Demons/tomatokiller.rsi/alive.png differ diff --git a/Resources/Textures/Mobs/Demons/tomatokiller.rsi/dead.png b/Resources/Textures/Mobs/Demons/tomatokiller.rsi/dead.png new file mode 100644 index 00000000000..4b3ee970a0c Binary files /dev/null and b/Resources/Textures/Mobs/Demons/tomatokiller.rsi/dead.png differ diff --git a/Resources/Textures/Mobs/Demons/tomatokiller.rsi/meta.json b/Resources/Textures/Mobs/Demons/tomatokiller.rsi/meta.json new file mode 100644 index 00000000000..57e4c7351f8 --- /dev/null +++ b/Resources/Textures/Mobs/Demons/tomatokiller.rsi/meta.json @@ -0,0 +1,40 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": " taken from TG on commit https://github.com/tgstation/tgstation/commit/7e5f13f558253e76865e81c9641b7ec68e57754b", + "states": [ + { + "name": "alive", + "directions": 4, + "delays": [ + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "dead" + } + ] +} diff --git a/Resources/Textures/Objects/Consumable/Smokeables/Cigarettes/cigarette.rsi/lit-inhand-left.png b/Resources/Textures/Objects/Consumable/Smokeables/Cigarettes/cigarette.rsi/lit-inhand-left.png index 294f3267803..dd6bc0b0f2f 100644 Binary files a/Resources/Textures/Objects/Consumable/Smokeables/Cigarettes/cigarette.rsi/lit-inhand-left.png and b/Resources/Textures/Objects/Consumable/Smokeables/Cigarettes/cigarette.rsi/lit-inhand-left.png differ diff --git a/Resources/Textures/Objects/Consumable/Smokeables/Cigarettes/cigarette.rsi/lit-inhand-right.png b/Resources/Textures/Objects/Consumable/Smokeables/Cigarettes/cigarette.rsi/lit-inhand-right.png index 3a4e9e8f9d2..7f00423dc37 100644 Binary files a/Resources/Textures/Objects/Consumable/Smokeables/Cigarettes/cigarette.rsi/lit-inhand-right.png and b/Resources/Textures/Objects/Consumable/Smokeables/Cigarettes/cigarette.rsi/lit-inhand-right.png differ diff --git a/Resources/Textures/Objects/Consumable/Smokeables/Cigarettes/cigarette.rsi/unlit-inhand-left.png b/Resources/Textures/Objects/Consumable/Smokeables/Cigarettes/cigarette.rsi/unlit-inhand-left.png index e8bfce8645c..2cb9f2bbfc2 100644 Binary files a/Resources/Textures/Objects/Consumable/Smokeables/Cigarettes/cigarette.rsi/unlit-inhand-left.png and b/Resources/Textures/Objects/Consumable/Smokeables/Cigarettes/cigarette.rsi/unlit-inhand-left.png differ diff --git a/Resources/Textures/Objects/Consumable/Smokeables/Cigarettes/cigarette.rsi/unlit-inhand-right.png b/Resources/Textures/Objects/Consumable/Smokeables/Cigarettes/cigarette.rsi/unlit-inhand-right.png index 4635cb206cd..a0645041abf 100644 Binary files a/Resources/Textures/Objects/Consumable/Smokeables/Cigarettes/cigarette.rsi/unlit-inhand-right.png and b/Resources/Textures/Objects/Consumable/Smokeables/Cigarettes/cigarette.rsi/unlit-inhand-right.png differ diff --git a/Resources/Textures/Objects/Consumable/Smokeables/Vapes/vape-standart.rsi/icon.png b/Resources/Textures/Objects/Consumable/Smokeables/Vapes/vape-standard.rsi/icon.png similarity index 100% rename from Resources/Textures/Objects/Consumable/Smokeables/Vapes/vape-standart.rsi/icon.png rename to Resources/Textures/Objects/Consumable/Smokeables/Vapes/vape-standard.rsi/icon.png diff --git a/Resources/Textures/Objects/Consumable/Smokeables/Vapes/vape-standart.rsi/meta.json b/Resources/Textures/Objects/Consumable/Smokeables/Vapes/vape-standard.rsi/meta.json similarity index 100% rename from Resources/Textures/Objects/Consumable/Smokeables/Vapes/vape-standart.rsi/meta.json rename to Resources/Textures/Objects/Consumable/Smokeables/Vapes/vape-standard.rsi/meta.json diff --git a/Resources/Textures/Objects/Devices/chameleon_projector.rsi/icon.png b/Resources/Textures/Objects/Devices/chameleon_projector.rsi/icon.png new file mode 100644 index 00000000000..ce20b5eeeed Binary files /dev/null and b/Resources/Textures/Objects/Devices/chameleon_projector.rsi/icon.png differ diff --git a/Resources/Textures/Objects/Devices/chameleon_projector.rsi/inhand-left.png b/Resources/Textures/Objects/Devices/chameleon_projector.rsi/inhand-left.png new file mode 100644 index 00000000000..2d3863145b9 Binary files /dev/null and b/Resources/Textures/Objects/Devices/chameleon_projector.rsi/inhand-left.png differ diff --git a/Resources/Textures/Objects/Devices/chameleon_projector.rsi/inhand-right.png b/Resources/Textures/Objects/Devices/chameleon_projector.rsi/inhand-right.png new file mode 100644 index 00000000000..1704b9c3c11 Binary files /dev/null and b/Resources/Textures/Objects/Devices/chameleon_projector.rsi/inhand-right.png differ diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/lightbrown.rsi/meta.json b/Resources/Textures/Objects/Devices/chameleon_projector.rsi/meta.json similarity index 100% rename from Resources/Textures/Clothing/Hands/Gloves/Color/lightbrown.rsi/meta.json rename to Resources/Textures/Objects/Devices/chameleon_projector.rsi/meta.json diff --git a/Resources/Textures/Objects/Devices/signaller.rsi/advanced-inhand-left.png b/Resources/Textures/Objects/Devices/signaller.rsi/advanced-inhand-left.png new file mode 100644 index 00000000000..e04554ef299 Binary files /dev/null and b/Resources/Textures/Objects/Devices/signaller.rsi/advanced-inhand-left.png differ diff --git a/Resources/Textures/Objects/Devices/signaller.rsi/advanced-inhand-right.png b/Resources/Textures/Objects/Devices/signaller.rsi/advanced-inhand-right.png new file mode 100644 index 00000000000..a3a7a186080 Binary files /dev/null and b/Resources/Textures/Objects/Devices/signaller.rsi/advanced-inhand-right.png differ diff --git a/Resources/Textures/Objects/Devices/signaller.rsi/advanced.png b/Resources/Textures/Objects/Devices/signaller.rsi/advanced.png new file mode 100644 index 00000000000..2383bf5e213 Binary files /dev/null and b/Resources/Textures/Objects/Devices/signaller.rsi/advanced.png differ diff --git a/Resources/Textures/Objects/Devices/signaller.rsi/inhand-left.png b/Resources/Textures/Objects/Devices/signaller.rsi/inhand-left.png new file mode 100644 index 00000000000..011508c4d1c Binary files /dev/null and b/Resources/Textures/Objects/Devices/signaller.rsi/inhand-left.png differ diff --git a/Resources/Textures/Objects/Devices/signaller.rsi/inhand-right.png b/Resources/Textures/Objects/Devices/signaller.rsi/inhand-right.png new file mode 100644 index 00000000000..751ae9080b7 Binary files /dev/null and b/Resources/Textures/Objects/Devices/signaller.rsi/inhand-right.png differ diff --git a/Resources/Textures/Objects/Devices/signaller.rsi/meta.json b/Resources/Textures/Objects/Devices/signaller.rsi/meta.json index cefaeebebfd..97bbc401624 100644 --- a/Resources/Textures/Objects/Devices/signaller.rsi/meta.json +++ b/Resources/Textures/Objects/Devices/signaller.rsi/meta.json @@ -1,21 +1,33 @@ { - "version": 1, - - "license": "CC-BY-SA-3.0", - "copyright": "Taken from Goonstation at commit https://github.com/goonstation/goonstation/commit/354d9635460c296dc7dce23ab39481dc4de6dc00, signaller2 created by TheShuEd", - - "size": { - "x": 32, - "y": 32 + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "signaller state taken from /vg/station at commit https://github.com/vgstation-coders/vgstation13/commit/2c980a1f423f26e990a578bae057d1eca19675ec. inhands & advanced made by Flaregy for Space Station 14. advanced is modified from signaller", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "signaller" }, - "states": [ - { - "name": "signaller", - "directions": 1 - }, - { - "name": "signaller2", - "directions": 1 - } - ] -} \ No newline at end of file + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "advanced" + }, + { + "name": "advanced-inhand-left", + "directions": 4 + }, + { + "name": "advanced-inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Objects/Devices/signaller.rsi/signaller.png b/Resources/Textures/Objects/Devices/signaller.rsi/signaller.png index 37a47342a6a..68ff28ad161 100644 Binary files a/Resources/Textures/Objects/Devices/signaller.rsi/signaller.png and b/Resources/Textures/Objects/Devices/signaller.rsi/signaller.png differ diff --git a/Resources/Textures/Objects/Devices/signaller.rsi/signaller2.png b/Resources/Textures/Objects/Devices/signaller.rsi/signaller2.png deleted file mode 100644 index 799a7be6ea9..00000000000 Binary files a/Resources/Textures/Objects/Devices/signaller.rsi/signaller2.png and /dev/null differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/chilly.rsi/produce.png b/Resources/Textures/Objects/Specific/Hydroponics/chilly.rsi/produce.png index 45ea8a32f5b..b2c59dc31a1 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/chilly.rsi/produce.png and b/Resources/Textures/Objects/Specific/Hydroponics/chilly.rsi/produce.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/tomatokiller.rsi/dead.png b/Resources/Textures/Objects/Specific/Hydroponics/tomatokiller.rsi/dead.png new file mode 100644 index 00000000000..0051c4dc737 Binary files /dev/null and b/Resources/Textures/Objects/Specific/Hydroponics/tomatokiller.rsi/dead.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/tomatokiller.rsi/harvest.png b/Resources/Textures/Objects/Specific/Hydroponics/tomatokiller.rsi/harvest.png new file mode 100644 index 00000000000..46a3b389827 Binary files /dev/null and b/Resources/Textures/Objects/Specific/Hydroponics/tomatokiller.rsi/harvest.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/tomatokiller.rsi/meta.json b/Resources/Textures/Objects/Specific/Hydroponics/tomatokiller.rsi/meta.json new file mode 100644 index 00000000000..84a4237a603 --- /dev/null +++ b/Resources/Textures/Objects/Specific/Hydroponics/tomatokiller.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/vgstation-coders/vgstation13 at 1dbcf389b0ec6b2c51b002df5fef8dd1519f8068", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "dead" + }, + { + "name": "harvest" + }, + { + "name": "seed" + }, + { + "name": "stage-1" + }, + { + "name": "stage-2" + } + ] +} diff --git a/Resources/Textures/Objects/Specific/Hydroponics/tomatokiller.rsi/seed.png b/Resources/Textures/Objects/Specific/Hydroponics/tomatokiller.rsi/seed.png new file mode 100644 index 00000000000..110dc64a4f7 Binary files /dev/null and b/Resources/Textures/Objects/Specific/Hydroponics/tomatokiller.rsi/seed.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/tomatokiller.rsi/stage-1.png b/Resources/Textures/Objects/Specific/Hydroponics/tomatokiller.rsi/stage-1.png new file mode 100644 index 00000000000..0b1d58de9de Binary files /dev/null and b/Resources/Textures/Objects/Specific/Hydroponics/tomatokiller.rsi/stage-1.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/tomatokiller.rsi/stage-2.png b/Resources/Textures/Objects/Specific/Hydroponics/tomatokiller.rsi/stage-2.png new file mode 100644 index 00000000000..6225f0c62d3 Binary files /dev/null and b/Resources/Textures/Objects/Specific/Hydroponics/tomatokiller.rsi/stage-2.png differ diff --git a/Resources/Textures/Objects/Specific/Medical/Morgue/bodybags.rsi/bounty.png b/Resources/Textures/Objects/Specific/Medical/Morgue/bodybags.rsi/bounty.png new file mode 100644 index 00000000000..5db87e61825 Binary files /dev/null and b/Resources/Textures/Objects/Specific/Medical/Morgue/bodybags.rsi/bounty.png differ diff --git a/Resources/Textures/Objects/Specific/Medical/Morgue/bodybags.rsi/captains_paper.png b/Resources/Textures/Objects/Specific/Medical/Morgue/bodybags.rsi/captains_paper.png new file mode 100644 index 00000000000..87ee739fa2f Binary files /dev/null and b/Resources/Textures/Objects/Specific/Medical/Morgue/bodybags.rsi/captains_paper.png differ diff --git a/Resources/Textures/Objects/Specific/Medical/Morgue/bodybags.rsi/invoice.png b/Resources/Textures/Objects/Specific/Medical/Morgue/bodybags.rsi/invoice.png new file mode 100644 index 00000000000..508a6b12e6f Binary files /dev/null and b/Resources/Textures/Objects/Specific/Medical/Morgue/bodybags.rsi/invoice.png differ diff --git a/Resources/Textures/Objects/Specific/Medical/Morgue/bodybags.rsi/meta.json b/Resources/Textures/Objects/Specific/Medical/Morgue/bodybags.rsi/meta.json index b6feb49959f..e8727873146 100644 --- a/Resources/Textures/Objects/Specific/Medical/Morgue/bodybags.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Medical/Morgue/bodybags.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/39659000f380583c35fb814ee2fadab24c2f8076", + "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/39659000f380583c35fb814ee2fadab24c2f8076, additional label sprites by Vermidia", "size": { "x": 32, "y": 32 @@ -14,10 +14,19 @@ "name": "bag_folded" }, { - "name": "label_overlay" + "name": "paper" }, { "name": "open_overlay" + }, + { + "name": "bounty" + }, + { + "name": "captains_paper" + }, + { + "name": "invoice" } ] -} +} \ No newline at end of file diff --git a/Resources/Textures/Objects/Specific/Medical/Morgue/bodybags.rsi/label_overlay.png b/Resources/Textures/Objects/Specific/Medical/Morgue/bodybags.rsi/paper.png similarity index 100% rename from Resources/Textures/Objects/Specific/Medical/Morgue/bodybags.rsi/label_overlay.png rename to Resources/Textures/Objects/Specific/Medical/Morgue/bodybags.rsi/paper.png diff --git a/Resources/Textures/Objects/Weapons/Melee/bone_spear.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/Objects/Weapons/Melee/bone_spear.rsi/equipped-SUITSTORAGE.png new file mode 100644 index 00000000000..585f2279403 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Melee/bone_spear.rsi/equipped-SUITSTORAGE.png differ diff --git a/Resources/Textures/Objects/Weapons/Melee/bone_spear.rsi/meta.json b/Resources/Textures/Objects/Weapons/Melee/bone_spear.rsi/meta.json index 49209bf2dcd..421037eac37 100644 --- a/Resources/Textures/Objects/Weapons/Melee/bone_spear.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Melee/bone_spear.rsi/meta.json @@ -32,6 +32,10 @@ { "name": "equipped-BACKPACK", "directions": 4 + }, + { + "name": "equipped-SUITSTORAGE", + "directions": 4 } ] } diff --git a/Resources/Textures/Objects/Weapons/Melee/plasma_spear.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/Objects/Weapons/Melee/plasma_spear.rsi/equipped-SUITSTORAGE.png new file mode 100644 index 00000000000..648fff08e4c Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Melee/plasma_spear.rsi/equipped-SUITSTORAGE.png differ diff --git a/Resources/Textures/Objects/Weapons/Melee/plasma_spear.rsi/meta.json b/Resources/Textures/Objects/Weapons/Melee/plasma_spear.rsi/meta.json index 383ea777d27..5a18552d2e0 100644 --- a/Resources/Textures/Objects/Weapons/Melee/plasma_spear.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Melee/plasma_spear.rsi/meta.json @@ -32,6 +32,10 @@ { "name": "equipped-BACKPACK", "directions": 4 + }, + { + "name": "equipped-SUITSTORAGE", + "directions": 4 } ] } diff --git a/Resources/Textures/Objects/Weapons/Melee/reinforced_spear.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/Objects/Weapons/Melee/reinforced_spear.rsi/equipped-SUITSTORAGE.png new file mode 100644 index 00000000000..e194aff0a62 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Melee/reinforced_spear.rsi/equipped-SUITSTORAGE.png differ diff --git a/Resources/Textures/Objects/Weapons/Melee/reinforced_spear.rsi/meta.json b/Resources/Textures/Objects/Weapons/Melee/reinforced_spear.rsi/meta.json index 383ea777d27..5a18552d2e0 100644 --- a/Resources/Textures/Objects/Weapons/Melee/reinforced_spear.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Melee/reinforced_spear.rsi/meta.json @@ -32,6 +32,10 @@ { "name": "equipped-BACKPACK", "directions": 4 + }, + { + "name": "equipped-SUITSTORAGE", + "directions": 4 } ] } diff --git a/Resources/Textures/Objects/Weapons/Melee/spear.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/Objects/Weapons/Melee/spear.rsi/equipped-SUITSTORAGE.png new file mode 100644 index 00000000000..cb8ff3d7441 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Melee/spear.rsi/equipped-SUITSTORAGE.png differ diff --git a/Resources/Textures/Objects/Weapons/Melee/spear.rsi/meta.json b/Resources/Textures/Objects/Weapons/Melee/spear.rsi/meta.json index 95f2736de14..31cf2a800c2 100644 --- a/Resources/Textures/Objects/Weapons/Melee/spear.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Melee/spear.rsi/meta.json @@ -32,6 +32,10 @@ { "name": "equipped-BACKPACK", "directions": 4 + }, + { + "name": "equipped-SUITSTORAGE", + "directions": 4 } ] } diff --git a/Resources/Textures/Objects/Weapons/Melee/uranium_spear.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/Objects/Weapons/Melee/uranium_spear.rsi/equipped-SUITSTORAGE.png new file mode 100644 index 00000000000..fc03f154a4a Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Melee/uranium_spear.rsi/equipped-SUITSTORAGE.png differ diff --git a/Resources/Textures/Objects/Weapons/Melee/uranium_spear.rsi/meta.json b/Resources/Textures/Objects/Weapons/Melee/uranium_spear.rsi/meta.json index 383ea777d27..5a18552d2e0 100644 --- a/Resources/Textures/Objects/Weapons/Melee/uranium_spear.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Melee/uranium_spear.rsi/meta.json @@ -32,6 +32,10 @@ { "name": "equipped-BACKPACK", "directions": 4 + }, + { + "name": "equipped-SUITSTORAGE", + "directions": 4 } ] } diff --git a/Resources/Textures/Structures/Machines/artifact_crusher.rsi/icon.png b/Resources/Textures/Structures/Machines/artifact_crusher.rsi/icon.png new file mode 100644 index 00000000000..af5f78e3683 Binary files /dev/null and b/Resources/Textures/Structures/Machines/artifact_crusher.rsi/icon.png differ diff --git a/Resources/Textures/Structures/Machines/artifact_crusher.rsi/meta.json b/Resources/Textures/Structures/Machines/artifact_crusher.rsi/meta.json index dc0d23c539e..279bc73ec72 100644 --- a/Resources/Textures/Structures/Machines/artifact_crusher.rsi/meta.json +++ b/Resources/Textures/Structures/Machines/artifact_crusher.rsi/meta.json @@ -7,6 +7,9 @@ "y": 64 }, "states": [ + { + "name": "icon" + }, { "name": "glass" }, diff --git a/Resources/Textures/Structures/Machines/jukebox.rsi/meta.json b/Resources/Textures/Structures/Machines/jukebox.rsi/meta.json new file mode 100644 index 00000000000..f447b26ddf5 --- /dev/null +++ b/Resources/Textures/Structures/Machines/jukebox.rsi/meta.json @@ -0,0 +1,31 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/tgstation/tgstation at f349b842c84f500399bd5673e5e34a6bc45b001a, direct dmi link https://github.com/tgstation/tgstation/blob/f349b842c84f500399bd5673e5e34a6bc45b001a/icons/obj/stationobjs.dmi", + "states": [ + { + "name": "on" + }, + { + "name": "off" + }, + { + "name": "select", + "delays": [ + [ + 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/Structures/Machines/jukebox.rsi/off.png b/Resources/Textures/Structures/Machines/jukebox.rsi/off.png new file mode 100644 index 00000000000..f3c24b1c569 Binary files /dev/null and b/Resources/Textures/Structures/Machines/jukebox.rsi/off.png differ diff --git a/Resources/Textures/Structures/Machines/jukebox.rsi/on.png b/Resources/Textures/Structures/Machines/jukebox.rsi/on.png new file mode 100644 index 00000000000..b397adc16ae Binary files /dev/null and b/Resources/Textures/Structures/Machines/jukebox.rsi/on.png differ diff --git a/Resources/Textures/Structures/Machines/jukebox.rsi/select.png b/Resources/Textures/Structures/Machines/jukebox.rsi/select.png new file mode 100644 index 00000000000..0dd6d813734 Binary files /dev/null and b/Resources/Textures/Structures/Machines/jukebox.rsi/select.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/artifact.rsi/bounty.png b/Resources/Textures/Structures/Storage/Crates/artifact.rsi/bounty.png new file mode 100644 index 00000000000..ee32a8211ea Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/artifact.rsi/bounty.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/artifact.rsi/captains_paper.png b/Resources/Textures/Structures/Storage/Crates/artifact.rsi/captains_paper.png new file mode 100644 index 00000000000..57f9a909507 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/artifact.rsi/captains_paper.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/artifact.rsi/invoice.png b/Resources/Textures/Structures/Storage/Crates/artifact.rsi/invoice.png new file mode 100644 index 00000000000..ed4951d12a8 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/artifact.rsi/invoice.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/artifact.rsi/meta.json b/Resources/Textures/Structures/Storage/Crates/artifact.rsi/meta.json index 7a17f38fa5c..1a535ab97c4 100644 --- a/Resources/Textures/Structures/Storage/Crates/artifact.rsi/meta.json +++ b/Resources/Textures/Structures/Storage/Crates/artifact.rsi/meta.json @@ -1,32 +1,44 @@ { - "version": 1, - "size": { - "x": 32, - "y": 32 - }, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from baystation at commit https://github.com/Baystation12/Baystation12/commit/a929584d9db319eb7484113221be25cfa1d5dc09", - "states": [ - { - "name": "artifact_container" - }, - { - "name": "artifact_container_door" - }, - { - "name": "artifact_container_open" - }, - { - "name": "artifact_container_icon" - }, - { - "name": "locked" - }, - { - "name": "unlocked" - }, - { - "name": "welded" - } - ] + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from baystation at commit https://github.com/Baystation12/Baystation12/commit/a929584d9db319eb7484113221be25cfa1d5dc09. Label sprites by Vermidia.", + "states": [ + { + "name": "artifact_container" + }, + { + "name": "artifact_container_door" + }, + { + "name": "artifact_container_open" + }, + { + "name": "artifact_container_icon" + }, + { + "name": "locked" + }, + { + "name": "unlocked" + }, + { + "name": "welded" + }, + { + "name": "paper" + }, + { + "name": "bounty" + }, + { + "name": "captains_paper" + }, + { + "name": "invoice" + } + ] } \ No newline at end of file diff --git a/Resources/Textures/Structures/Storage/Crates/artifact.rsi/paper.png b/Resources/Textures/Structures/Storage/Crates/artifact.rsi/paper.png new file mode 100644 index 00000000000..6cf41f02c8b Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/artifact.rsi/paper.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/coffin.rsi/bounty.png b/Resources/Textures/Structures/Storage/Crates/coffin.rsi/bounty.png new file mode 100644 index 00000000000..54a2f0fbd03 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/coffin.rsi/bounty.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/coffin.rsi/captains_paper.png b/Resources/Textures/Structures/Storage/Crates/coffin.rsi/captains_paper.png new file mode 100644 index 00000000000..7265057446c Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/coffin.rsi/captains_paper.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/coffin.rsi/invoice.png b/Resources/Textures/Structures/Storage/Crates/coffin.rsi/invoice.png new file mode 100644 index 00000000000..e0efa6e950d Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/coffin.rsi/invoice.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/coffin.rsi/meta.json b/Resources/Textures/Structures/Storage/Crates/coffin.rsi/meta.json index 610ea0183c0..7908408cd3f 100644 --- a/Resources/Textures/Structures/Storage/Crates/coffin.rsi/meta.json +++ b/Resources/Textures/Structures/Storage/Crates/coffin.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/32c8d0abc573d7370eb145d8ce74176d59b7eea3", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/32c8d0abc573d7370eb145d8ce74176d59b7eea3. Label sprites by Vermidia.", "size": { "x": 32, "y": 32 @@ -15,6 +15,18 @@ }, { "name": "closed" + }, + { + "name": "paper" + }, + { + "name": "bounty" + }, + { + "name": "captains_paper" + }, + { + "name": "invoice" } ] } diff --git a/Resources/Textures/Structures/Storage/Crates/coffin.rsi/paper.png b/Resources/Textures/Structures/Storage/Crates/coffin.rsi/paper.png new file mode 100644 index 00000000000..630ffe8e10c Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/coffin.rsi/paper.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/labels.rsi/bounty.png b/Resources/Textures/Structures/Storage/Crates/labels.rsi/bounty.png new file mode 100644 index 00000000000..52e515e39b8 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/labels.rsi/bounty.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/labels.rsi/captains_paper.png b/Resources/Textures/Structures/Storage/Crates/labels.rsi/captains_paper.png new file mode 100644 index 00000000000..961991bf349 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/labels.rsi/captains_paper.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/labels.rsi/invoice.png b/Resources/Textures/Structures/Storage/Crates/labels.rsi/invoice.png new file mode 100644 index 00000000000..3e00e7d8068 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/labels.rsi/invoice.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/labels.rsi/meta.json b/Resources/Textures/Structures/Storage/Crates/labels.rsi/meta.json new file mode 100644 index 00000000000..c180604984c --- /dev/null +++ b/Resources/Textures/Structures/Storage/Crates/labels.rsi/meta.json @@ -0,0 +1,23 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Sprites by Vermidia.", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "paper" + }, + { + "name": "bounty" + }, + { + "name": "captains_paper" + }, + { + "name": "invoice" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Storage/Crates/labels.rsi/paper.png b/Resources/Textures/Structures/Storage/Crates/labels.rsi/paper.png new file mode 100644 index 00000000000..8daf7770832 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/labels.rsi/paper.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/toybox.rsi/bounty.png b/Resources/Textures/Structures/Storage/Crates/toybox.rsi/bounty.png new file mode 100644 index 00000000000..d7bd7f29eef Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/toybox.rsi/bounty.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/toybox.rsi/captains_paper.png b/Resources/Textures/Structures/Storage/Crates/toybox.rsi/captains_paper.png new file mode 100644 index 00000000000..4fd4bf0503f Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/toybox.rsi/captains_paper.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/toybox.rsi/invoice.png b/Resources/Textures/Structures/Storage/Crates/toybox.rsi/invoice.png new file mode 100644 index 00000000000..aacd2ca7681 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/toybox.rsi/invoice.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/toybox.rsi/meta.json b/Resources/Textures/Structures/Storage/Crates/toybox.rsi/meta.json index 082564ccfb0..9c0d876c501 100644 --- a/Resources/Textures/Structures/Storage/Crates/toybox.rsi/meta.json +++ b/Resources/Textures/Structures/Storage/Crates/toybox.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Made by brainfood118 (github) for ss14", + "copyright": "Made by brainfood118 (github) for ss14. Label Sprites by Vermidia.", "size": { "x": 32, "y": 32 @@ -20,21 +20,33 @@ "name": "crate_icon" }, { - "name": "sparking", - "directions": 1, - "delays": [ - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ] + "name": "sparking", + "directions": 1, + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 ] + ] }, { "name": "crate_open" + }, + { + "name": "paper" + }, + { + "name": "bounty" + }, + { + "name": "captains_paper" + }, + { + "name": "invoice" } ] -} +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Storage/Crates/toybox.rsi/paper.png b/Resources/Textures/Structures/Storage/Crates/toybox.rsi/paper.png new file mode 100644 index 00000000000..f0c91659d3e Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/toybox.rsi/paper.png differ diff --git a/Resources/Textures/Structures/Storage/closet.rsi/meta.json b/Resources/Textures/Structures/Storage/closet.rsi/meta.json index cf0c204447b..c52bc13540e 100644 --- a/Resources/Textures/Structures/Storage/closet.rsi/meta.json +++ b/Resources/Textures/Structures/Storage/closet.rsi/meta.json @@ -4,7 +4,7 @@ "x": 32, "y": 32 }, - "copyright": "Taken from tgstation, brigmedic locker is a resprited CMO locker by PuroSlavKing (Github)", + "copyright": "Taken from tgstation, brigmedic locker is a resprited CMO locker by PuroSlavKing (Github), n2_door state modified by Flareguy from fire_door, using sprites from /vg/station at https://github.com/vgstation-coders/vgstation13/commit/02b9f6894af4419c9f7e699a22c402b086d8067e", "license": "CC-BY-SA-3.0", "states": [ { @@ -398,6 +398,9 @@ { "name": "mixed_door" }, + { + "name": "n2_door" + }, { "name": "oldcloset" }, diff --git a/Resources/Textures/Structures/Storage/closet.rsi/n2_door.png b/Resources/Textures/Structures/Storage/closet.rsi/n2_door.png new file mode 100644 index 00000000000..f6d9499f10a Binary files /dev/null and b/Resources/Textures/Structures/Storage/closet.rsi/n2_door.png differ diff --git a/Resources/Textures/Structures/Wallmounts/Lighting/strobe_light.rsi/base.png b/Resources/Textures/Structures/Wallmounts/Lighting/strobe_light.rsi/base.png new file mode 100644 index 00000000000..a68dfc9d877 Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/Lighting/strobe_light.rsi/base.png differ diff --git a/Resources/Textures/Structures/Wallmounts/Lighting/strobe_light.rsi/broken.png b/Resources/Textures/Structures/Wallmounts/Lighting/strobe_light.rsi/broken.png new file mode 100644 index 00000000000..e2a4ab462c2 Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/Lighting/strobe_light.rsi/broken.png differ diff --git a/Resources/Textures/Structures/Wallmounts/Lighting/strobe_light.rsi/empty.png b/Resources/Textures/Structures/Wallmounts/Lighting/strobe_light.rsi/empty.png new file mode 100644 index 00000000000..b48cc5ab9e0 Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/Lighting/strobe_light.rsi/empty.png differ diff --git a/Resources/Textures/Structures/Wallmounts/Lighting/strobe_light.rsi/glow.png b/Resources/Textures/Structures/Wallmounts/Lighting/strobe_light.rsi/glow.png new file mode 100644 index 00000000000..0e8645bd9aa Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/Lighting/strobe_light.rsi/glow.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Eyes/Hud/syndmed.rsi/meta.json b/Resources/Textures/Structures/Wallmounts/Lighting/strobe_light.rsi/meta.json similarity index 52% rename from Resources/Textures/DeltaV/Clothing/Eyes/Hud/syndmed.rsi/meta.json rename to Resources/Textures/Structures/Wallmounts/Lighting/strobe_light.rsi/meta.json index 1d01bc88809..865473f5450 100644 --- a/Resources/Textures/DeltaV/Clothing/Eyes/Hud/syndmed.rsi/meta.json +++ b/Resources/Textures/Structures/Wallmounts/Lighting/strobe_light.rsi/meta.json @@ -1,25 +1,26 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Made by IntegerTempest, medicalised by JoeHammad1844 (github)", + "copyright": "by Ko4erga (discord)", "size": { "x": 32, "y": 32 }, "states": [ { - "name": "icon" + "name": "base", + "directions": 4 }, { - "name": "equipped-EYES", + "name": "empty", "directions": 4 }, - { - "name": "inhand-left", + { + "name": "glow", "directions": 4 }, { - "name": "inhand-right", + "name": "broken", "directions": 4 } ] diff --git a/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_buy_0.png b/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_buy_0.png new file mode 100644 index 00000000000..1505c892b8e Binary files /dev/null and b/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_buy_0.png differ diff --git a/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_buy_1.png b/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_buy_1.png new file mode 100644 index 00000000000..e0d5a4d39ea Binary files /dev/null and b/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_buy_1.png differ diff --git a/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_buy_2.png b/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_buy_2.png new file mode 100644 index 00000000000..1505c892b8e Binary files /dev/null and b/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_buy_2.png differ diff --git a/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_buy_3.png b/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_buy_3.png new file mode 100644 index 00000000000..e0d5a4d39ea Binary files /dev/null and b/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_buy_3.png differ diff --git a/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_buy_4.png b/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_buy_4.png new file mode 100644 index 00000000000..38cb4115083 Binary files /dev/null and b/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_buy_4.png differ diff --git a/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_buy_5.png b/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_buy_5.png new file mode 100644 index 00000000000..b863e36b8ce Binary files /dev/null and b/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_buy_5.png differ diff --git a/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_buy_6.png b/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_buy_6.png new file mode 100644 index 00000000000..38cb4115083 Binary files /dev/null and b/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_buy_6.png differ diff --git a/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_buy_7.png b/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_buy_7.png new file mode 100644 index 00000000000..88ffa378d2a Binary files /dev/null and b/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_buy_7.png differ diff --git a/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_sell_0.png b/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_sell_0.png new file mode 100644 index 00000000000..136a48087b5 Binary files /dev/null and b/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_sell_0.png differ diff --git a/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_sell_1.png b/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_sell_1.png new file mode 100644 index 00000000000..06fb688c5bd Binary files /dev/null and b/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_sell_1.png differ diff --git a/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_sell_2.png b/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_sell_2.png new file mode 100644 index 00000000000..136a48087b5 Binary files /dev/null and b/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_sell_2.png differ diff --git a/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_sell_3.png b/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_sell_3.png new file mode 100644 index 00000000000..06fb688c5bd Binary files /dev/null and b/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_sell_3.png differ diff --git a/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_sell_4.png b/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_sell_4.png new file mode 100644 index 00000000000..80a85ef2383 Binary files /dev/null and b/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_sell_4.png differ diff --git a/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_sell_5.png b/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_sell_5.png new file mode 100644 index 00000000000..4a194d7fb1f Binary files /dev/null and b/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_sell_5.png differ diff --git a/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_sell_6.png b/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_sell_6.png new file mode 100644 index 00000000000..80a85ef2383 Binary files /dev/null and b/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_sell_6.png differ diff --git a/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_sell_7.png b/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_sell_7.png new file mode 100644 index 00000000000..88ffa378d2a Binary files /dev/null and b/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_sell_7.png differ diff --git a/Resources/Textures/Structures/cargo_pallets.rsi/meta.json b/Resources/Textures/Structures/cargo_pallets.rsi/meta.json index 4751d95b9b5..c32fcfefd05 100644 --- a/Resources/Textures/Structures/cargo_pallets.rsi/meta.json +++ b/Resources/Textures/Structures/cargo_pallets.rsi/meta.json @@ -10,8 +10,72 @@ { "name": "cargo_pallet_buy" }, + { + "name": "cargo_pallet_buy_0", + "directions": 4 + }, + { + "name": "cargo_pallet_buy_1", + "directions": 4 + }, + { + "name": "cargo_pallet_buy_2", + "directions": 4 + }, + { + "name": "cargo_pallet_buy_3", + "directions": 4 + }, + { + "name": "cargo_pallet_buy_4", + "directions": 4 + }, + { + "name": "cargo_pallet_buy_5", + "directions": 4 + }, + { + "name": "cargo_pallet_buy_6", + "directions": 4 + }, + { + "name": "cargo_pallet_buy_7", + "directions": 4 + }, { "name": "cargo_pallet_sell" + }, + { + "name": "cargo_pallet_sell_0", + "directions": 4 + }, + { + "name": "cargo_pallet_sell_1", + "directions": 4 + }, + { + "name": "cargo_pallet_sell_2", + "directions": 4 + }, + { + "name": "cargo_pallet_sell_3", + "directions": 4 + }, + { + "name": "cargo_pallet_sell_4", + "directions": 4 + }, + { + "name": "cargo_pallet_sell_5", + "directions": 4 + }, + { + "name": "cargo_pallet_sell_6", + "directions": 4 + }, + { + "name": "cargo_pallet_sell_7", + "directions": 4 } ] } diff --git a/Resources/Textures/Tiles/Misc/floortrap.rsi/floortrap.png b/Resources/Textures/Tiles/Misc/floortrap.rsi/floortrap.png new file mode 100644 index 00000000000..391437064e5 Binary files /dev/null and b/Resources/Textures/Tiles/Misc/floortrap.rsi/floortrap.png differ diff --git a/Resources/Textures/Tiles/Misc/floortrap.rsi/floortrapspawn.png b/Resources/Textures/Tiles/Misc/floortrap.rsi/floortrapspawn.png new file mode 100644 index 00000000000..764a0fed152 Binary files /dev/null and b/Resources/Textures/Tiles/Misc/floortrap.rsi/floortrapspawn.png differ diff --git a/Resources/Textures/Tiles/Misc/floortrap.rsi/meta.json b/Resources/Textures/Tiles/Misc/floortrap.rsi/meta.json new file mode 100644 index 00000000000..586fad6d231 --- /dev/null +++ b/Resources/Textures/Tiles/Misc/floortrap.rsi/meta.json @@ -0,0 +1,17 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Made by Nimfar11 (github) for ss14", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "floortrap" + }, + { + "name": "floortrapspawn" + } + ] +} diff --git a/Resources/Textures/Tiles/glass.png b/Resources/Textures/Tiles/glass.png index 37adc67679e..bc782a9c6c3 100644 Binary files a/Resources/Textures/Tiles/glass.png and b/Resources/Textures/Tiles/glass.png differ diff --git a/Resources/Textures/Tiles/rglass.png b/Resources/Textures/Tiles/rglass.png index bae2908132b..6dd3bb59172 100644 Binary files a/Resources/Textures/Tiles/rglass.png and b/Resources/Textures/Tiles/rglass.png differ diff --git a/RobustToolbox b/RobustToolbox index 6764ed56b06..73da147b881 160000 --- a/RobustToolbox +++ b/RobustToolbox @@ -1 +1 @@ -Subproject commit 6764ed56b06309b56bd35c8ebffdf64882d4c4c1 +Subproject commit 73da147b8811c8d032e0f119ef507a1c11ff4073