From 6e0ffe81bc2a1be3e9d0453b8597a8f92df41dc1 Mon Sep 17 00:00:00 2001 From: SimpleStation14 <130339894+SimpleStation14@users.noreply.github.com> Date: Sun, 19 May 2024 23:33:00 -0700 Subject: [PATCH 001/155] Mirror: Partial atmos refactor (#312) ## Mirror of PR #22521: [Partial atmos refactor](https://github.com/space-wizards/space-station-14/pull/22521) from space-wizards [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `18a35e7e83b2b71ee84b054d44d9ed5e595dd618` PR opened by ElectroJr at 2023-12-15 03:45:42 UTC --- PR changed 43 files with 891 additions and 635 deletions. The PR had the following labels: - Status: Needs Review ---

Original Body

> This PR reworks how some parts of atmos code work. Originally it was just meant to be a performance and bugfix PR, but it has ballooned in scope. I'm not sure about some of my changes largely because I'm not sure if some things were an oversight or an intentional decision for some reason. > > List of changes: > - The `MolesArchived float[]` field is now read-only > - It simply gets zeroed whenever the `GasMixture` is set to null instead of constantly reallocating > - Airtight query information is now cached in `TileAtmosphere` > - This means that it should only iterate over anchored entities once per update. > - Previously an invalidated atmos tile would cause `ProcessRevalidate()` to query airtight entities on the same tile six times by calling a combination of `GridIsTileAirBlocked()`, `NeedsVacuumFixing()`, and `GridIsTileAirBlocked()`. So this should help significantly reduce component lookups & entity enumeration. > - This does change some behaviour. In particular blocked directions are now only updated if the tile was invalidated prior to the current atmos-update, and will only ever be updated once per atmos-update. > - AFAIK this only has an effect if the invalid tile processing is deferred over multiple ticks, and I don't think it should cause any issues? > - Fixes a potential bug, where tiles might not dispose of their excited group if their direction flags changed. > - `MapAtmosphereComponent.Mixture` is now always immutable and no longer nullable > - I'm not sure why the mixture was nullable before? AFAICT the component is meaningless if its null? > - Space "gas" was always immutable, but there was nothing that required planet atmospheres to be immutable. Requiring that it be immutable gets rid of the constant gas mixture cloning. > - I don't know if there was a reason for why they weren't immutable to begin with. > - Fixes lungs removing too much air from a gas mixture, resulting in negative moles. > - `GasMixture.Moles` is now `[Access]` restricted to the atmosphere system. > - This is to prevent people from improperly modifying the gas mixtures (e.g., lungs), or accidentally modifying immutable mixtures. > - Fixes an issue where non-grid atmosphere tiles would fail to update their adjacent tiles, resulting in null reference exception spam > - Fixes #21732 > - Fixes #21210 (probably) > - Disconnected atmosphere tiles, i.e., tiles that aren't on or adjacent to a grid tile, will now get removed from the tile set. Previously the tile set would just always increase, with tiles never getting removed. > - Removes various redundant component and tile-definition queries. > - Removes some method events in favour of just using methods. > - Map-exposded tiles now get updated when a map's atmosphere changes (or the grid moves across maps). > - Adds a `setmapatmos` command for adding map-wide atmospheres. > - Fixed (non-planet) map atmospheres rendering over grids. > > ## Media > > This PR also includes changes to the atmos debug overlay, though I've also split that off into a separate PR to make reviewing easier (#22520). > > Below is a video showing that atmos still seems to work, and that trimming of disconnected tiles works: > > https://github.com/space-wizards/space-station-14/assets/60421075/4da46992-19e6-4354-8ecd-3cd67be4d0ed > > For comparison, here is a video showing how current master works (disconnected tiles never get removed): > > https://github.com/space-wizards/space-station-14/assets/60421075/54590777-e11c-41dc-b49d-fd7e53bfeed7 > > :cl: > - fix: Fixed a bug where partially airtight entities (e.g., thin windows or doors) could let air leak out into space. >
Co-authored-by: SimpleStation14 --- .../Atmos/Overlays/GasTileOverlay.cs | 70 ++-- Content.Client/Mapping/MappingSystem.cs | 2 +- .../Tests/Body/LungTest.cs | 2 +- .../Interaction/InteractionTest.Helpers.cs | 7 +- .../Atmos/Commands/SetMapAtmosCommand.cs | 94 +++++ .../Atmos/Components/AirtightComponent.cs | 4 +- .../Components/GridAtmosphereComponent.cs | 8 +- .../Components/MapAtmosphereComponent.cs | 8 +- .../Atmos/EntitySystems/AirtightSystem.cs | 18 +- .../EntitySystems/AtmosDebugOverlaySystem.cs | 11 +- .../AtmosObstructionEnumerator.cs | 37 -- .../EntitySystems/AtmosphereSystem.API.cs | 45 +-- .../AtmosphereSystem.ExcitedGroup.cs | 28 +- .../AtmosphereSystem.GridAtmosphere.cs | 247 +++++--------- .../AtmosphereSystem.HighPressureDelta.cs | 2 - .../EntitySystems/AtmosphereSystem.LINDA.cs | 18 +- .../EntitySystems/AtmosphereSystem.Map.cs | 108 +++++- .../AtmosphereSystem.Monstermos.cs | 110 +++--- .../AtmosphereSystem.Processing.cs | 323 ++++++++++++------ .../AtmosphereSystem.Superconductivity.cs | 8 +- .../EntitySystems/AtmosphereSystem.Utils.cs | 62 ++-- .../Atmos/EntitySystems/AtmosphereSystem.cs | 7 + .../EntitySystems/AutomaticAtmosSystem.cs | 8 +- .../Atmos/EntitySystems/GasAnalyzerSystem.cs | 4 +- .../EntitySystems/GasTileOverlaySystem.cs | 6 +- Content.Server/Atmos/GasMixture.cs | 57 +++- .../Unary/EntitySystems/GasCanisterSystem.cs | 2 +- .../Unary/EntitySystems/GasCondenserSystem.cs | 2 +- .../TileAtmosCollectionSerializer.cs | 8 +- Content.Server/Atmos/TileAtmosphere.cs | 53 ++- Content.Server/Body/Systems/LungSystem.cs | 2 +- .../Chemistry/ReagentEffects/ModifyLungGas.cs | 13 +- .../Conditions/ComponentInTile.cs | 11 +- .../ExplosionSystem.Processing.cs | 4 +- Content.Server/Parallax/BiomeSystem.cs | 11 +- .../Power/Generator/GasPowerReceiverSystem.cs | 2 +- .../Salvage/SpawnSalvageMissionJob.cs | 6 +- Content.Server/Spreader/SpreaderSystem.cs | 69 ++-- Content.Shared/Atmos/Atmospherics.cs | 7 +- .../SharedGasTileOverlaySystem.cs | 3 + Content.Shared/Maps/ContentTileDefinition.cs | 6 +- Content.Shared/Maps/TurfHelpers.cs | 27 +- Resources/Locale/en-US/atmos/commands.ftl | 8 + 43 files changed, 892 insertions(+), 636 deletions(-) create mode 100644 Content.Server/Atmos/Commands/SetMapAtmosCommand.cs delete mode 100644 Content.Server/Atmos/EntitySystems/AtmosObstructionEnumerator.cs create mode 100644 Resources/Locale/en-US/atmos/commands.ftl diff --git a/Content.Client/Atmos/Overlays/GasTileOverlay.cs b/Content.Client/Atmos/Overlays/GasTileOverlay.cs index ef65d43fe85..f4dc274a4e5 100644 --- a/Content.Client/Atmos/Overlays/GasTileOverlay.cs +++ b/Content.Client/Atmos/Overlays/GasTileOverlay.cs @@ -8,7 +8,6 @@ using Robust.Client.Graphics; using Robust.Client.ResourceManagement; using Robust.Shared.Enums; -using Robust.Shared.Graphics; using Robust.Shared.Graphics.RSI; using Robust.Shared.Map; using Robust.Shared.Map.Components; @@ -23,7 +22,7 @@ public sealed class GasTileOverlay : Overlay private readonly IEntityManager _entManager; private readonly IMapManager _mapManager; - public override OverlaySpace Space => OverlaySpace.WorldSpaceEntities; + public override OverlaySpace Space => OverlaySpace.WorldSpaceEntities | OverlaySpace.WorldSpaceBelowWorld; private readonly ShaderInstance _shader; // Gas overlays @@ -79,7 +78,8 @@ public GasTileOverlay(GasTileOverlaySystem system, IEntityManager entManager, IR var rsi = resourceCache.GetResource(animated.RsiPath).RSI; var stateId = animated.RsiState; - if (!rsi.TryGetState(stateId, out var state)) continue; + if (!rsi.TryGetState(stateId, out var state)) + continue; _frames[i] = state.GetFrames(RsiDirection.South); _frameDelays[i] = state.GetDelays(); @@ -111,7 +111,8 @@ protected override void FrameUpdate(FrameEventArgs args) for (var i = 0; i < _gasCount; i++) { var delays = _frameDelays[i]; - if (delays.Length == 0) continue; + if (delays.Length == 0) + continue; var frameCount = _frameCounter[i]; _timer[i] += args.DeltaSeconds; @@ -127,7 +128,8 @@ protected override void FrameUpdate(FrameEventArgs args) for (var i = 0; i < FireStates; i++) { var delays = _fireFrameDelays[i]; - if (delays.Length == 0) continue; + if (delays.Length == 0) + continue; var frameCount = _fireFrameCounter[i]; _fireTimer[i] += args.DeltaSeconds; @@ -161,26 +163,10 @@ protected override void Draw(in OverlayDrawArgs args) var mapUid = _mapManager.GetMapEntityId(args.MapId); if (_entManager.TryGetComponent(mapUid, out var atmos)) - { - var bottomLeft = args.WorldAABB.BottomLeft.Floored(); - var topRight = args.WorldAABB.TopRight.Ceiled(); - - for (var x = bottomLeft.X; x <= topRight.X; x++) - { - for (var y = bottomLeft.Y; y <= topRight.Y; y++) - { - var tilePosition = new Vector2(x, y); - - for (var i = 0; i < atmos.OverlayData.Opacity.Length; i++) - { - var opacity = atmos.OverlayData.Opacity[i]; + DrawMapOverlay(drawHandle, args, mapUid, atmos); - if (opacity > 0) - args.WorldHandle.DrawTexture(_frames[i][_frameCounter[i]], tilePosition, Color.White.WithAlpha(opacity)); - } - } - } - } + if (args.Space != OverlaySpace.WorldSpaceEntities) + return; // TODO: WorldBounds callback. _mapManager.FindGridsIntersecting(args.MapId, args.WorldAABB, ref gridState, @@ -265,5 +251,41 @@ protected override void Draw(in OverlayDrawArgs args) drawHandle.UseShader(null); drawHandle.SetTransform(Matrix3.Identity); } + + private void DrawMapOverlay( + DrawingHandleWorld handle, + OverlayDrawArgs args, + EntityUid map, + MapAtmosphereComponent atmos) + { + var mapGrid = _entManager.HasComponent(map); + + // map-grid atmospheres get drawn above grids + if (mapGrid && args.Space != OverlaySpace.WorldSpaceEntities) + return; + + // Normal map atmospheres get drawn below grids + if (!mapGrid && args.Space != OverlaySpace.WorldSpaceBelowWorld) + return; + + var bottomLeft = args.WorldAABB.BottomLeft.Floored(); + var topRight = args.WorldAABB.TopRight.Ceiled(); + + for (var x = bottomLeft.X; x <= topRight.X; x++) + { + for (var y = bottomLeft.Y; y <= topRight.Y; y++) + { + var tilePosition = new Vector2(x, y); + + for (var i = 0; i < atmos.OverlayData.Opacity.Length; i++) + { + var opacity = atmos.OverlayData.Opacity[i]; + + if (opacity > 0) + handle.DrawTexture(_frames[i][_frameCounter[i]], tilePosition, Color.White.WithAlpha(opacity)); + } + } + } + } } } diff --git a/Content.Client/Mapping/MappingSystem.cs b/Content.Client/Mapping/MappingSystem.cs index 4456be36a65..8daf193dfeb 100644 --- a/Content.Client/Mapping/MappingSystem.cs +++ b/Content.Client/Mapping/MappingSystem.cs @@ -83,7 +83,7 @@ private void OnFillActionSlot(FillActionSlotEvent ev) if (tileDef is not ContentTileDefinition contentTileDef) return; - var tileIcon = contentTileDef.IsSpace + var tileIcon = contentTileDef.MapAtmosphere ? _spaceIcon : new Texture(contentTileDef.Sprite!.Value); diff --git a/Content.IntegrationTests/Tests/Body/LungTest.cs b/Content.IntegrationTests/Tests/Body/LungTest.cs index d0325480acd..f2e19849b00 100644 --- a/Content.IntegrationTests/Tests/Body/LungTest.cs +++ b/Content.IntegrationTests/Tests/Body/LungTest.cs @@ -128,7 +128,7 @@ await server.WaitAssertion(() => metaSys.Update(1.0f); metaSys.Update(1.0f); respSys.Update(2.0f); - Assert.That(GetMapMoles(), Is.EqualTo(startingMoles).Within(0.0001)); + Assert.That(GetMapMoles(), Is.EqualTo(startingMoles).Within(0.0002)); }); } diff --git a/Content.IntegrationTests/Tests/Interaction/InteractionTest.Helpers.cs b/Content.IntegrationTests/Tests/Interaction/InteractionTest.Helpers.cs index 84e1afaf45c..88448e7b800 100644 --- a/Content.IntegrationTests/Tests/Interaction/InteractionTest.Helpers.cs +++ b/Content.IntegrationTests/Tests/Interaction/InteractionTest.Helpers.cs @@ -1006,15 +1006,10 @@ protected async Task AddAtmosphere(EntityUid? uid = null) await Server.WaitPost(() => { var atmosSystem = SEntMan.System(); - var atmos = SEntMan.EnsureComponent(target); var moles = new float[Atmospherics.AdjustedNumberOfGases]; moles[(int) Gas.Oxygen] = 21.824779f; moles[(int) Gas.Nitrogen] = 82.10312f; - atmosSystem.SetMapAtmosphere(target, false, new GasMixture(2500) - { - Temperature = 293.15f, - Moles = moles, - }, atmos); + atmosSystem.SetMapAtmosphere(target, false, new GasMixture(moles, Atmospherics.T20C)); }); } diff --git a/Content.Server/Atmos/Commands/SetMapAtmosCommand.cs b/Content.Server/Atmos/Commands/SetMapAtmosCommand.cs new file mode 100644 index 00000000000..6f04cfb2da6 --- /dev/null +++ b/Content.Server/Atmos/Commands/SetMapAtmosCommand.cs @@ -0,0 +1,94 @@ +using Content.Server.Administration; +using Content.Server.Atmos.Components; +using Content.Server.Atmos.EntitySystems; +using Content.Shared.Administration; +using Content.Shared.Atmos; +using Robust.Shared.Console; +using Robust.Shared.Map; + +namespace Content.Server.Atmos.Commands; + +[AdminCommand(AdminFlags.Admin)] +public sealed class AddMapAtmosCommand : LocalizedCommands +{ + [Dependency] private readonly IEntityManager _entities = default!; + [Dependency] private readonly IMapManager _map = default!; + + private const string _cmd = "cmd-set-map-atmos"; + public override string Command => "setmapatmos"; + public override string Description => Loc.GetString($"{_cmd}-desc"); + public override string Help => Loc.GetString($"{_cmd}-help"); + + public override void Execute(IConsoleShell shell, string argStr, string[] args) + { + if (args.Length < 2) + { + shell.WriteLine(Help); + return; + } + + int.TryParse(args[0], out var id); + var map = _map.GetMapEntityId(new MapId(id)); + if (!map.IsValid()) + { + shell.WriteError(Loc.GetString("cmd-parse-failure-mapid", ("arg", args[0]))); + return; + } + + if (!bool.TryParse(args[1], out var space)) + { + shell.WriteError(Loc.GetString("cmd-parse-failure-bool", ("arg", args[1]))); + return; + } + + if (space || args.Length < 4) + { + _entities.RemoveComponent(map); + shell.WriteLine(Loc.GetString($"{_cmd}-removed", ("map", id))); + return; + } + + if (!float.TryParse(args[2], out var temp)) + { + shell.WriteError(Loc.GetString("cmd-parse-failure-float", ("arg", args[2]))); + return; + } + + var mix = new GasMixture(Atmospherics.CellVolume) {Temperature = Math.Min(temp, Atmospherics.TCMB)}; + for (var i = 0; i < Atmospherics.TotalNumberOfGases; i++) + { + if (args.Length == 3 + i) + break; + + if (!float.TryParse(args[3+i], out var moles)) + { + shell.WriteError(Loc.GetString("cmd-parse-failure-float", ("arg", args[3+i]))); + return; + } + + mix.AdjustMoles(i, moles); + } + + var atmos = _entities.EntitySysManager.GetEntitySystem(); + atmos.SetMapAtmosphere(map, space, mix); + shell.WriteLine(Loc.GetString($"{_cmd}-updated", ("map", id))); + } + + public override CompletionResult GetCompletion(IConsoleShell shell, string[] args) + { + if (args.Length == 1) + return CompletionResult.FromHintOptions(CompletionHelper.MapIds(_entities), Loc.GetString($"{_cmd}-hint-map")); + + if (args.Length == 2) + return CompletionResult.FromHintOptions(new[]{ "false", "true"}, Loc.GetString($"{_cmd}-hint-space")); + + if (!bool.TryParse(args[1], out var space) || space) + return CompletionResult.Empty; + + if (args.Length == 3) + return CompletionResult.FromHint(Loc.GetString($"{_cmd}-hint-temp")); + + var gas = (Gas) args.Length - 4; + return CompletionResult.FromHint(Loc.GetString($"{_cmd}-hint-gas" , ("gas", gas.ToString()))); + } +} diff --git a/Content.Server/Atmos/Components/AirtightComponent.cs b/Content.Server/Atmos/Components/AirtightComponent.cs index 897981724c9..ca107eafbe8 100644 --- a/Content.Server/Atmos/Components/AirtightComponent.cs +++ b/Content.Server/Atmos/Components/AirtightComponent.cs @@ -1,9 +1,10 @@ +using Content.Server.Atmos.EntitySystems; using Content.Shared.Atmos; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; namespace Content.Server.Atmos.Components { - [RegisterComponent] + [RegisterComponent, Access(typeof(AirtightSystem))] public sealed partial class AirtightComponent : Component { public (EntityUid Grid, Vector2i Tile) LastPosition { get; set; } @@ -29,6 +30,7 @@ public sealed partial class AirtightComponent : Component [DataField("noAirWhenFullyAirBlocked")] public bool NoAirWhenFullyAirBlocked { get; set; } = true; + [Access(Other = AccessPermissions.ReadWriteExecute)] public AtmosDirection AirBlockedDirection => (AtmosDirection)CurrentAirBlockedDirection; } } diff --git a/Content.Server/Atmos/Components/GridAtmosphereComponent.cs b/Content.Server/Atmos/Components/GridAtmosphereComponent.cs index 7fcd63bc5d8..e682fd09644 100644 --- a/Content.Server/Atmos/Components/GridAtmosphereComponent.cs +++ b/Content.Server/Atmos/Components/GridAtmosphereComponent.cs @@ -28,6 +28,9 @@ public sealed partial class GridAtmosphereComponent : Component [IncludeDataField(customTypeSerializer:typeof(TileAtmosCollectionSerializer))] public Dictionary Tiles = new(1000); + [ViewVariables] + public HashSet MapTiles = new(1000); + [ViewVariables] public readonly HashSet ActiveTiles = new(1000); @@ -80,7 +83,10 @@ public sealed partial class GridAtmosphereComponent : Component public readonly HashSet InvalidatedCoords = new(1000); [ViewVariables] - public readonly Queue CurrentRunInvalidatedCoordinates = new(); + public readonly Queue CurrentRunInvalidatedTiles = new(); + + [ViewVariables] + public readonly List PossiblyDisconnectedTiles = new(100); [ViewVariables] public int InvalidatedCoordsCount => InvalidatedCoords.Count; diff --git a/Content.Server/Atmos/Components/MapAtmosphereComponent.cs b/Content.Server/Atmos/Components/MapAtmosphereComponent.cs index bbf5ea6403e..6bdef901d44 100644 --- a/Content.Server/Atmos/Components/MapAtmosphereComponent.cs +++ b/Content.Server/Atmos/Components/MapAtmosphereComponent.cs @@ -12,12 +12,14 @@ public sealed partial class MapAtmosphereComponent : SharedMapAtmosphereComponen /// /// The default GasMixture a map will have. Space mixture by default. /// - [DataField("mixture"), ViewVariables(VVAccess.ReadWrite)] - public GasMixture? Mixture = GasMixture.SpaceGas; + [DataField, ViewVariables(VVAccess.ReadWrite)] + public GasMixture Mixture = GasMixture.SpaceGas; /// /// Whether empty tiles will be considered space or not. /// - [DataField("space"), ViewVariables(VVAccess.ReadWrite)] + [DataField, ViewVariables(VVAccess.ReadWrite)] public bool Space = true; + + public SharedGasTileOverlaySystem.GasOverlayData Overlay; } diff --git a/Content.Server/Atmos/EntitySystems/AirtightSystem.cs b/Content.Server/Atmos/EntitySystems/AirtightSystem.cs index 97dccbaabb7..548d6a36926 100644 --- a/Content.Server/Atmos/EntitySystems/AirtightSystem.cs +++ b/Content.Server/Atmos/EntitySystems/AirtightSystem.cs @@ -2,7 +2,6 @@ using Content.Server.Explosion.EntitySystems; using Content.Shared.Atmos; using JetBrains.Annotations; -using Robust.Shared.Map; using Robust.Shared.Map.Components; namespace Content.Server.Atmos.EntitySystems @@ -10,7 +9,7 @@ namespace Content.Server.Atmos.EntitySystems [UsedImplicitly] public sealed class AirtightSystem : EntitySystem { - [Dependency] private readonly IMapManager _mapManager = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly AtmosphereSystem _atmosphereSystem = default!; [Dependency] private readonly ExplosionSystem _explosionSystem = default!; @@ -121,19 +120,16 @@ public void UpdatePosition(Entity ent, TransformComponent? xf if (!xform.Anchored || !TryComp(xform.GridUid, out MapGridComponent? grid)) return; - airtight.LastPosition = (xform.GridUid.Value, grid.TileIndicesFor(xform.Coordinates)); - InvalidatePosition(airtight.LastPosition.Item1, airtight.LastPosition.Item2, airtight.FixVacuum && !airtight.AirBlocked); + var indices = _transform.GetGridTilePositionOrDefault((ent, xform), grid); + airtight.LastPosition = (xform.GridUid.Value, indices); + InvalidatePosition((xform.GridUid.Value, grid), indices); } - public void InvalidatePosition(EntityUid gridId, Vector2i pos, bool fixVacuum = false) + public void InvalidatePosition(Entity grid, Vector2i pos) { - if (!TryComp(gridId, out MapGridComponent? grid)) - return; - var query = EntityManager.GetEntityQuery(); - _explosionSystem.UpdateAirtightMap(gridId, pos, grid, query); - // TODO make atmos system use query - _atmosphereSystem.InvalidateTile(gridId, pos); + _explosionSystem.UpdateAirtightMap(grid, pos, grid, query); + _atmosphereSystem.InvalidateTile(grid.Owner, pos); } private AtmosDirection Rotate(AtmosDirection myDirection, Angle myAngle) diff --git a/Content.Server/Atmos/EntitySystems/AtmosDebugOverlaySystem.cs b/Content.Server/Atmos/EntitySystems/AtmosDebugOverlaySystem.cs index 4af32fce58f..c0284f26c90 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosDebugOverlaySystem.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosDebugOverlaySystem.cs @@ -97,22 +97,19 @@ private void OnPlayerStatusChanged(object? sender, SessionStatusEventArgs e) } } - private AtmosDebugOverlayData ConvertTileToData(TileAtmosphere? tile) + private AtmosDebugOverlayData? ConvertTileToData(TileAtmosphere tile) { - if (tile == null) - return default; - return new AtmosDebugOverlayData( tile.GridIndices, tile.Air?.Temperature ?? default, tile.Air?.Moles, tile.PressureDirection, tile.LastPressureDirection, - tile.BlockedAirflow, + tile.AirtightData.BlockedDirections, tile.ExcitedGroup?.GetHashCode(), tile.Space, - false, - false); + tile.MapAtmosphere, + tile.NoGridTile); } public override void Update(float frameTime) diff --git a/Content.Server/Atmos/EntitySystems/AtmosObstructionEnumerator.cs b/Content.Server/Atmos/EntitySystems/AtmosObstructionEnumerator.cs deleted file mode 100644 index aed009e9a12..00000000000 --- a/Content.Server/Atmos/EntitySystems/AtmosObstructionEnumerator.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System.Diagnostics.CodeAnalysis; -using Content.Server.Atmos.Components; -using Robust.Shared.Map; -using Robust.Shared.Map.Enumerators; - -namespace Content.Server.Atmos.EntitySystems; - -public struct AtmosObstructionEnumerator -{ - private AnchoredEntitiesEnumerator _enumerator; - private EntityQuery _query; - - public AtmosObstructionEnumerator(AnchoredEntitiesEnumerator enumerator, EntityQuery query) - { - _enumerator = enumerator; - _query = query; - } - - public bool MoveNext([NotNullWhen(true)] out AirtightComponent? airtight) - { - if (!_enumerator.MoveNext(out var uid)) - { - airtight = null; - return false; - } - - // No rider, it makes it uglier. - // ReSharper disable once ConvertIfStatementToReturnStatement - if (!_query.TryGetComponent(uid.Value, out airtight)) - { - // ReSharper disable once TailRecursiveCall - return MoveNext(out airtight); - } - - return true; - } -} diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.API.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.API.cs index 310e602336a..cece99cacf6 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.API.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.API.cs @@ -85,10 +85,10 @@ public IEnumerable GetAllMixtures(EntityUid gridUid, bool excite = f return ev.Mixtures!; } - public void InvalidateTile(EntityUid gridUid, Vector2i tile) + public void InvalidateTile(Entity entity, Vector2i tile) { - var ev = new InvalidateTileMethodEvent(gridUid, tile); - RaiseLocalEvent(gridUid, ref ev); + if (_atmosQuery.Resolve(entity.Owner, ref entity.Comp, false)) + entity.Comp.InvalidatedCoords.Add(tile); } public GasMixture?[]? GetTileMixtures(EntityUid? gridUid, EntityUid? mapUid, List tiles, bool excite = false) @@ -176,11 +176,11 @@ public ReactionResult ReactTile(EntityUid gridId, Vector2i tile) public bool IsTileAirBlocked(EntityUid gridUid, Vector2i tile, AtmosDirection directions = AtmosDirection.All, MapGridComponent? mapGridComp = null) { - var ev = new IsTileAirBlockedMethodEvent(gridUid, tile, directions, mapGridComp); - RaiseLocalEvent(gridUid, ref ev); + if (!Resolve(gridUid, ref mapGridComp)) + return false; - // If nothing handled the event, it'll default to true. - return ev.Result; + var data = GetAirtightData(gridUid, mapGridComp, tile); + return data.BlockedDirections.IsFlagSet(directions); } public bool IsTileSpace(EntityUid? gridUid, EntityUid? mapUid, Vector2i tile, MapGridComponent? mapGridComp = null) @@ -231,12 +231,6 @@ public IEnumerable GetAdjacentTileMixtures(EntityUid gridUid, Vector return ev.Result ?? Enumerable.Empty(); } - public void UpdateAdjacent(EntityUid gridUid, Vector2i tile, MapGridComponent? mapGridComp = null) - { - var ev = new UpdateAdjacentMethodEvent(gridUid, tile, mapGridComp); - RaiseLocalEvent(gridUid, ref ev); - } - public void HotspotExpose(EntityUid gridUid, Vector2i tile, float exposedTemperature, float exposedVolume, EntityUid? sparkSourceUid = null, bool soh = false) { @@ -259,12 +253,6 @@ public bool IsHotspotActive(EntityUid gridUid, Vector2i tile) return ev.Result; } - public void FixTileVacuum(EntityUid gridUid, Vector2i tile) - { - var ev = new FixTileVacuumMethodEvent(gridUid, tile); - RaiseLocalEvent(gridUid, ref ev); - } - public void AddPipeNet(EntityUid gridUid, PipeNet pipeNet) { var ev = new AddPipeNetMethodEvent(gridUid, pipeNet); @@ -307,9 +295,6 @@ [ByRefEvent] private record struct IsSimulatedGridMethodEvent [ByRefEvent] private record struct GetAllMixturesMethodEvent (EntityUid Grid, bool Excite = false, IEnumerable? Mixtures = null, bool Handled = false); - [ByRefEvent] private record struct InvalidateTileMethodEvent - (EntityUid Grid, Vector2i Tile, bool Handled = false); - [ByRefEvent] private record struct GetTileMixturesMethodEvent (EntityUid? GridUid, EntityUid? MapUid, List Tiles, bool Excite = false, GasMixture?[]? Mixtures = null, bool Handled = false); @@ -319,16 +304,6 @@ [ByRefEvent] private record struct GetTileMixtureMethodEvent [ByRefEvent] private record struct ReactTileMethodEvent (EntityUid GridId, Vector2i Tile, ReactionResult Result = default, bool Handled = false); - [ByRefEvent] private record struct IsTileAirBlockedMethodEvent - (EntityUid Grid, Vector2i Tile, AtmosDirection Direction = AtmosDirection.All, MapGridComponent? MapGridComponent = null, bool Result = false, bool Handled = false) - { - /// - /// True if one of the enabled blockers has . Note - /// that this does not actually check if all directions are blocked. - /// - public bool NoAir = false; - } - [ByRefEvent] private record struct IsTileSpaceMethodEvent (EntityUid? Grid, EntityUid? Map, Vector2i Tile, MapGridComponent? MapGridComponent = null, bool Result = true, bool Handled = false); @@ -339,9 +314,6 @@ [ByRefEvent] private record struct GetAdjacentTileMixturesMethodEvent (EntityUid Grid, Vector2i Tile, bool IncludeBlocked, bool Excite, IEnumerable? Result = null, bool Handled = false); - [ByRefEvent] private record struct UpdateAdjacentMethodEvent - (EntityUid Grid, Vector2i Tile, MapGridComponent? MapGridComponent = null, bool Handled = false); - [ByRefEvent] private record struct HotspotExposeMethodEvent (EntityUid Grid, EntityUid? SparkSourceUid, Vector2i Tile, float ExposedTemperature, float ExposedVolume, bool soh, bool Handled = false); @@ -351,9 +323,6 @@ [ByRefEvent] private record struct HotspotExtinguishMethodEvent [ByRefEvent] private record struct IsHotspotActiveMethodEvent (EntityUid Grid, Vector2i Tile, bool Result = false, bool Handled = false); - [ByRefEvent] private record struct FixTileVacuumMethodEvent - (EntityUid Grid, Vector2i Tile, bool Handled = false); - [ByRefEvent] private record struct AddPipeNetMethodEvent (EntityUid Grid, PipeNet PipeNet, bool Handled = false); diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.ExcitedGroup.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.ExcitedGroup.cs index 1d809dcd032..de4c9199cf7 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.ExcitedGroup.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.ExcitedGroup.cs @@ -72,7 +72,8 @@ private void ExcitedGroupSelfBreakdown(GridAtmosphereComponent gridAtmosphere, E var tileSize = excitedGroup.Tiles.Count; - if (excitedGroup.Disposed) return; + if (excitedGroup.Disposed) + return; if (tileSize == 0) { @@ -98,7 +99,9 @@ private void ExcitedGroupSelfBreakdown(GridAtmosphereComponent gridAtmosphere, E foreach (var tile in excitedGroup.Tiles) { - if (tile?.Air == null) continue; + if (tile?.Air == null) + continue; + tile.Air.CopyFromMutable(combined); InvalidateVisuals(tile.GridIndex, tile.GridIndices); } @@ -106,21 +109,23 @@ private void ExcitedGroupSelfBreakdown(GridAtmosphereComponent gridAtmosphere, E excitedGroup.BreakdownCooldown = 0; } - private void ExcitedGroupDismantle(GridAtmosphereComponent gridAtmosphere, ExcitedGroup excitedGroup, bool unexcite = true) + /// + /// This de-activates and removes all tiles in an excited group. + /// + private void DeactivateGroupTiles(GridAtmosphereComponent gridAtmosphere, ExcitedGroup excitedGroup) { foreach (var tile in excitedGroup.Tiles) { tile.ExcitedGroup = null; - - if (!unexcite) - continue; - RemoveActiveTile(gridAtmosphere, tile); } excitedGroup.Tiles.Clear(); } + /// + /// This removes an excited group without de-activating its tiles. + /// private void ExcitedGroupDispose(GridAtmosphereComponent gridAtmosphere, ExcitedGroup excitedGroup) { if (excitedGroup.Disposed) @@ -129,9 +134,14 @@ private void ExcitedGroupDispose(GridAtmosphereComponent gridAtmosphere, Excited DebugTools.Assert(gridAtmosphere.ExcitedGroups.Contains(excitedGroup), "Grid Atmosphere does not contain Excited Group!"); excitedGroup.Disposed = true; - gridAtmosphere.ExcitedGroups.Remove(excitedGroup); - ExcitedGroupDismantle(gridAtmosphere, excitedGroup, false); + + foreach (var tile in excitedGroup.Tiles) + { + tile.ExcitedGroup = null; + } + + excitedGroup.Tiles.Clear(); } } } diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.GridAtmosphere.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.GridAtmosphere.cs index 1f1a208b24b..d43cc81b0f8 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.GridAtmosphere.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.GridAtmosphere.cs @@ -14,6 +14,7 @@ public sealed partial class AtmosphereSystem private void InitializeGridAtmosphere() { SubscribeLocalEvent(OnGridAtmosphereInit); + SubscribeLocalEvent(OnGridAtmosphereStartup); SubscribeLocalEvent(OnAtmosphereRemove); SubscribeLocalEvent(OnGridSplit); @@ -22,19 +23,15 @@ private void InitializeGridAtmosphere() SubscribeLocalEvent(GridHasAtmosphere); SubscribeLocalEvent(GridIsSimulated); SubscribeLocalEvent(GridGetAllMixtures); - SubscribeLocalEvent(GridInvalidateTile); SubscribeLocalEvent(GridGetTileMixture); SubscribeLocalEvent(GridGetTileMixtures); SubscribeLocalEvent(GridReactTile); - SubscribeLocalEvent(GridIsTileAirBlocked); SubscribeLocalEvent(GridIsTileSpace); SubscribeLocalEvent(GridGetAdjacentTiles); SubscribeLocalEvent(GridGetAdjacentTileMixtures); - SubscribeLocalEvent(GridUpdateAdjacent); SubscribeLocalEvent(GridHotspotExpose); SubscribeLocalEvent(GridHotspotExtinguish); SubscribeLocalEvent(GridIsHotspotActive); - SubscribeLocalEvent(GridFixTileVacuum); SubscribeLocalEvent(GridAddPipeNet); SubscribeLocalEvent(GridRemovePipeNet); SubscribeLocalEvent(GridAddAtmosDevice); @@ -56,22 +53,23 @@ private void OnAtmosphereRemove(EntityUid uid, GridAtmosphereComponent component } } - private void OnGridAtmosphereInit(EntityUid uid, GridAtmosphereComponent gridAtmosphere, ComponentInit args) + private void OnGridAtmosphereInit(EntityUid uid, GridAtmosphereComponent component, ComponentInit args) { base.Initialize(); - if (!TryComp(uid, out MapGridComponent? mapGrid)) - return; - EnsureComp(uid); - - foreach (var (indices, tile) in gridAtmosphere.Tiles) + foreach (var tile in component.Tiles.Values) { - gridAtmosphere.InvalidatedCoords.Add(indices); tile.GridIndex = uid; } + } + + private void OnGridAtmosphereStartup(EntityUid uid, GridAtmosphereComponent component, ComponentStartup args) + { + if (!TryComp(uid, out MapGridComponent? mapGrid)) + return; - GridRepopulateTiles((uid, mapGrid, gridAtmosphere)); + InvalidateAllTiles((uid, mapGrid, component)); } private void OnGridSplit(EntityUid uid, GridAtmosphereComponent originalGridAtmos, ref GridSplitEvent args) @@ -104,8 +102,7 @@ private void OnGridSplit(EntityUid uid, GridAtmosphereComponent originalGridAtmo continue; // Copy a bunch of data over... Not great, maybe put this in TileAtmosphere? - newTileAtmosphere.Air = tileAtmosphere.Air?.Clone() ?? null; - newTileAtmosphere.MolesArchived = newTileAtmosphere.Air == null ? null : new float[Atmospherics.AdjustedNumberOfGases]; + newTileAtmosphere.Air = tileAtmosphere.Air?.Clone(); newTileAtmosphere.Hotspot = tileAtmosphere.Hotspot; newTileAtmosphere.HeatCapacity = tileAtmosphere.HeatCapacity; newTileAtmosphere.Temperature = tileAtmosphere.Temperature; @@ -170,15 +167,6 @@ IEnumerable EnumerateMixtures(EntityUid gridUid, GridAtmosphereCompo args.Handled = true; } - private void GridInvalidateTile(EntityUid uid, GridAtmosphereComponent component, ref InvalidateTileMethodEvent args) - { - if (args.Handled) - return; - - component.InvalidatedCoords.Add(args.Tile); - args.Handled = true; - } - private void GridGetTileMixture(EntityUid uid, GridAtmosphereComponent component, ref GetTileMixtureMethodEvent args) { @@ -233,43 +221,6 @@ private void GridReactTile(EntityUid uid, GridAtmosphereComponent component, ref args.Handled = true; } - private void GridIsTileAirBlocked(EntityUid uid, GridAtmosphereComponent component, - ref IsTileAirBlockedMethodEvent args) - { - if (args.Handled) - return; - - var mapGridComp = args.MapGridComponent; - - if (!Resolve(uid, ref mapGridComp)) - return; - - var directions = AtmosDirection.Invalid; - - var enumerator = GetObstructingComponentsEnumerator(mapGridComp, args.Tile); - - while (enumerator.MoveNext(out var obstructingComponent)) - { - if (!obstructingComponent.AirBlocked) - continue; - - // We set the directions that are air-blocked so far, - // as you could have a full obstruction with only 4 directional air blockers. - directions |= obstructingComponent.AirBlockedDirection; - args.NoAir |= obstructingComponent.NoAirWhenFullyAirBlocked; - - if (directions.IsFlagSet(args.Direction)) - { - args.Result = true; - args.Handled = true; - return; - } - } - - args.Result = false; - args.Handled = true; - } - private void GridIsTileSpace(EntityUid uid, GridAtmosphereComponent component, ref IsTileSpaceMethodEvent args) { if (args.Handled) @@ -331,71 +282,58 @@ IEnumerable EnumerateAdjacent(GridAtmosphereComponent grid, TileAtmo args.Handled = true; } - private void GridUpdateAdjacent(EntityUid uid, GridAtmosphereComponent component, - ref UpdateAdjacentMethodEvent args) + /// + /// Update array of adjacent tiles and the adjacency flags. Optionally activates all tiles with modified adjacencies. + /// + private void UpdateAdjacentTiles( + Entity ent, + TileAtmosphere tile, + bool activate = false) { - if (args.Handled) - return; - - var mapGridComp = args.MapGridComponent; - - if (!Resolve(uid, ref mapGridComp)) - return; - - var xform = Transform(uid); - EntityUid? mapUid = _mapManager.MapExists(xform.MapID) ? _mapManager.GetMapEntityId(xform.MapID) : null; - - if (!component.Tiles.TryGetValue(args.Tile, out var tile)) - return; + var uid = ent.Owner; + var atmos = ent.Comp1; + var blockedDirs = tile.AirtightData.BlockedDirections; + if (activate) + AddActiveTile(atmos, tile); tile.AdjacentBits = AtmosDirection.Invalid; - tile.BlockedAirflow = GetBlockedDirections(mapGridComp, tile.GridIndices); - for (var i = 0; i < Atmospherics.Directions; i++) { var direction = (AtmosDirection) (1 << i); + var adjacentIndices = tile.GridIndices.Offset(direction); - var otherIndices = tile.GridIndices.Offset(direction); - - if (!component.Tiles.TryGetValue(otherIndices, out var adjacent)) + TileAtmosphere? adjacent; + if (!tile.NoGridTile) { - adjacent = new TileAtmosphere(tile.GridIndex, otherIndices, - GetTileMixture(null, mapUid, otherIndices), - space: IsTileSpace(null, mapUid, otherIndices, mapGridComp)); + adjacent = GetOrNewTile(uid, atmos, adjacentIndices); } - - var oppositeDirection = direction.GetOpposite(); - - adjacent.BlockedAirflow = GetBlockedDirections(mapGridComp, adjacent.GridIndices); - - // Pass in MapGridComponent so we don't have to resolve it for every adjacent direction. - var tileBlockedEv = new IsTileAirBlockedMethodEvent(uid, tile.GridIndices, direction, mapGridComp); - GridIsTileAirBlocked(uid, component, ref tileBlockedEv); - - var adjacentBlockedEv = - new IsTileAirBlockedMethodEvent(uid, adjacent.GridIndices, oppositeDirection, mapGridComp); - GridIsTileAirBlocked(uid, component, ref adjacentBlockedEv); - - if (!adjacent.BlockedAirflow.IsFlagSet(oppositeDirection) && !tileBlockedEv.Result) + else if (!atmos.Tiles.TryGetValue(adjacentIndices, out adjacent)) { - adjacent.AdjacentBits |= oppositeDirection; - adjacent.AdjacentTiles[oppositeDirection.ToIndex()] = tile; + tile.AdjacentBits &= ~direction; + tile.AdjacentTiles[i] = null; + continue; } - else + + var adjBlockDirs = adjacent.AirtightData.BlockedDirections; + if (activate) + AddActiveTile(atmos, adjacent); + + var oppositeDirection = direction.GetOpposite(); + if (adjBlockDirs.IsFlagSet(oppositeDirection) || blockedDirs.IsFlagSet(direction)) { + // Adjacency is blocked by some airtight entity. + tile.AdjacentBits &= ~direction; adjacent.AdjacentBits &= ~oppositeDirection; + tile.AdjacentTiles[i] = null; adjacent.AdjacentTiles[oppositeDirection.ToIndex()] = null; } - - if (!tile.BlockedAirflow.IsFlagSet(direction) && !adjacentBlockedEv.Result) - { - tile.AdjacentBits |= direction; - tile.AdjacentTiles[direction.ToIndex()] = adjacent; - } else { - tile.AdjacentBits &= ~direction; - tile.AdjacentTiles[direction.ToIndex()] = null; + // No airtight entity in the way. + tile.AdjacentBits |= direction; + adjacent.AdjacentBits |= oppositeDirection; + tile.AdjacentTiles[i] = adjacent; + adjacent.AdjacentTiles[oppositeDirection.ToIndex()] = tile; } DebugTools.Assert(!(tile.AdjacentBits.IsFlagSet(direction) ^ @@ -409,6 +347,16 @@ private void GridUpdateAdjacent(EntityUid uid, GridAtmosphereComponent component tile.MonstermosInfo.CurrentTransferDirection = AtmosDirection.Invalid; } + private (GasMixture Air, bool IsSpace) GetDefaultMapAtmosphere(MapAtmosphereComponent? map) + { + if (map == null) + return (GasMixture.SpaceGas, true); + + var air = map.Mixture; + DebugTools.Assert(air.Immutable); + return (air, map.Space); + } + private void GridHotspotExpose(EntityUid uid, GridAtmosphereComponent component, ref HotspotExposeMethodEvent args) { if (args.Handled) @@ -451,54 +399,50 @@ private void GridIsHotspotActive(EntityUid uid, GridAtmosphereComponent componen args.Handled = true; } - private void GridFixTileVacuum(EntityUid uid, GridAtmosphereComponent component, ref FixTileVacuumMethodEvent args) + private void GridFixTileVacuum( + Entity ent, + TileAtmosphere tile, + float volume) { - if (args.Handled) - return; - - var adjEv = new GetAdjacentTileMixturesMethodEvent(uid, args.Tile, false, true); - GridGetAdjacentTileMixtures(uid, component, ref adjEv); - - if (!adjEv.Handled || !component.Tiles.TryGetValue(args.Tile, out var tile)) - return; - - if (!TryComp(uid, out var mapGridComp)) - return; - - var adjacent = adjEv.Result!.ToArray(); - - // Return early, let's not cause any funny NaNs or needless vacuums. - if (adjacent.Length == 0) - return; + DebugTools.AssertNotNull(tile.Air); + DebugTools.Assert(tile.Air?.Immutable == false ); + Array.Clear(tile.MolesArchived); + tile.ArchivedCycle = 0; - tile.Air = new GasMixture + var count = 0; + foreach (var adj in tile.AdjacentTiles) { - Volume = GetVolumeForTiles(mapGridComp, 1), - Temperature = Atmospherics.T20C - }; - - tile.MolesArchived = new float[Atmospherics.AdjustedNumberOfGases]; - tile.ArchivedCycle = 0; + if (adj?.Air != null) + count++; + } - var ratio = 1f / adjacent.Length; + var ratio = 1f / count; var totalTemperature = 0f; - foreach (var adj in adjacent) + foreach (var adj in tile.AdjacentTiles) { + if (adj?.Air == null) + continue; + totalTemperature += adj.Temperature; + // TODO ATMOS. Why is this removing and then re-adding air to the neighbouring tiles? + // Is it some rounding issue to do with Atmospherics.GasMinMoles? because otherwise this is just unnecessary. + // if we get rid of this, then this could also just add moles and then multiply by ratio at the end, rather + // than having to iterate over adjacent tiles twice. + // Remove a bit of gas from the adjacent ratio... - var mix = adj.RemoveRatio(ratio); + var mix = adj.Air.RemoveRatio(ratio); // And merge it to the new tile air. Merge(tile.Air, mix); // Return removed gas to its original mixture. - Merge(adj, mix); + Merge(adj.Air, mix); } // New temperature is the arithmetic mean of the sum of the adjacent temperatures... - tile.Air.Temperature = totalTemperature / adjacent.Length; + tile.Air.Temperature = totalTemperature / count; } private void GridAddPipeNet(EntityUid uid, GridAtmosphereComponent component, ref AddPipeNetMethodEvent args) @@ -547,30 +491,21 @@ private void GridRemoveAtmosDevice(EntityUid uid, GridAtmosphereComponent compon /// /// Repopulates all tiles on a grid atmosphere. /// - /// The grid where to get all valid tiles from. - /// The grid atmosphere where the tiles will be repopulated. - private void GridRepopulateTiles(Entity grid) + public void InvalidateAllTiles(Entity entity) { - var (uid, mapGrid, gridAtmosphere) = grid; - var volume = GetVolumeForTiles(mapGrid, 1); + var (uid, grid, atmos) = entity; + if (!Resolve(uid, ref grid, ref atmos)) + return; - foreach (var tile in mapGrid.GetAllTiles()) + foreach (var indices in atmos.Tiles.Keys) { - if (!gridAtmosphere.Tiles.ContainsKey(tile.GridIndices)) - gridAtmosphere.Tiles[tile.GridIndices] = new TileAtmosphere(tile.GridUid, tile.GridIndices, - new GasMixture(volume) { Temperature = Atmospherics.T20C }); - - gridAtmosphere.InvalidatedCoords.Add(tile.GridIndices); + atmos.InvalidatedCoords.Add(indices); } - TryComp(uid, out GasTileOverlayComponent? overlay); - - // Gotta do this afterwards so we can properly update adjacent tiles. - foreach (var (position, _) in gridAtmosphere.Tiles.ToArray()) + var enumerator = _map.GetAllTilesEnumerator(uid, grid); + while (enumerator.MoveNext(out var tile)) { - var ev = new UpdateAdjacentMethodEvent(uid, position); - GridUpdateAdjacent(uid, gridAtmosphere, ref ev); - InvalidateVisuals(uid, position, overlay); + atmos.InvalidatedCoords.Add(tile.Value.GridIndices); } } diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.HighPressureDelta.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.HighPressureDelta.cs index 53035e1ed3c..b0c823426d6 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.HighPressureDelta.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.HighPressureDelta.cs @@ -1,13 +1,11 @@ using Content.Server.Atmos.Components; using Content.Shared.Atmos; -using Content.Shared.Audio; using Content.Shared.Mobs.Components; using Content.Shared.Physics; using Robust.Shared.Audio; using Robust.Shared.Map; using Robust.Shared.Physics; using Robust.Shared.Physics.Components; -using Robust.Shared.Player; using Robust.Shared.Random; using Robust.Shared.Utility; diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.LINDA.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.LINDA.cs index 795c6e0547e..c27e18b55b0 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.LINDA.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.LINDA.cs @@ -1,12 +1,13 @@ using Content.Server.Atmos.Components; using Content.Shared.Atmos; using Content.Shared.Atmos.Components; +using Robust.Shared.Utility; namespace Content.Server.Atmos.EntitySystems { public sealed partial class AtmosphereSystem { - private void ProcessCell(GridAtmosphereComponent gridAtmosphere, TileAtmosphere tile, int fireCount, GasTileOverlayComponent? visuals) + private void ProcessCell(GridAtmosphereComponent gridAtmosphere, TileAtmosphere tile, int fireCount, GasTileOverlayComponent visuals) { // Can't process a tile without air if (tile.Air == null) @@ -116,15 +117,9 @@ private void ProcessCell(GridAtmosphereComponent gridAtmosphere, TileAtmosphere private void Archive(TileAtmosphere tile, int fireCount) { if (tile.Air != null) - { tile.Air.Moles.AsSpan().CopyTo(tile.MolesArchived.AsSpan()); - tile.TemperatureArchived = tile.Air.Temperature; - } - else - { - tile.TemperatureArchived = tile.Temperature; - } + tile.TemperatureArchived = tile.Temperature; tile.ArchivedCycle = fireCount; } @@ -166,6 +161,12 @@ private void AddActiveTile(GridAtmosphereComponent gridAtmosphere, TileAtmospher /// Whether to dispose of the tile's private void RemoveActiveTile(GridAtmosphereComponent gridAtmosphere, TileAtmosphere tile, bool disposeExcitedGroup = true) { + DebugTools.Assert(tile.Excited == gridAtmosphere.ActiveTiles.Contains(tile)); + DebugTools.Assert(tile.Excited || tile.ExcitedGroup == null); + + if (!tile.Excited) + return; + tile.Excited = false; gridAtmosphere.ActiveTiles.Remove(tile); @@ -186,7 +187,6 @@ public float GetHeatCapacityArchived(TileAtmosphere tile) if (tile.Air == null) return tile.HeatCapacity; - // Moles archived is not null if air is not null. return GetHeatCapacityCalculation(tile.MolesArchived!, tile.Space); } diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Map.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Map.cs index 916191cb050..ed105c8d33f 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Map.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Map.cs @@ -1,6 +1,8 @@ using Content.Server.Atmos.Components; using Content.Shared.Atmos.Components; using Robust.Shared.GameStates; +using Robust.Shared.Map.Components; +using Robust.Shared.Utility; namespace Content.Server.Atmos.EntitySystems; @@ -8,10 +10,25 @@ public partial class AtmosphereSystem { private void InitializeMap() { + SubscribeLocalEvent(OnMapStartup); + SubscribeLocalEvent(OnMapRemove); SubscribeLocalEvent(MapIsTileSpace); SubscribeLocalEvent(MapGetTileMixture); SubscribeLocalEvent(MapGetTileMixtures); SubscribeLocalEvent(OnMapGetState); + SubscribeLocalEvent(OnGridParentChanged); + } + + private void OnMapStartup(EntityUid uid, MapAtmosphereComponent component, ComponentInit args) + { + component.Mixture.MarkImmutable(); + component.Overlay = _gasTileOverlaySystem.GetOverlayData(component.Mixture); + } + + private void OnMapRemove(EntityUid uid, MapAtmosphereComponent component, ComponentRemove args) + { + if (!TerminatingOrDeleted(uid)) + RefreshAllGridMapAtmospheres(uid); } private void MapIsTileSpace(EntityUid uid, MapAtmosphereComponent component, ref IsTileSpaceMethodEvent args) @@ -28,54 +45,115 @@ private void MapGetTileMixture(EntityUid uid, MapAtmosphereComponent component, if (args.Handled) return; - // Clone the mixture, if possible. - args.Mixture = component.Mixture?.Clone(); + args.Mixture = component.Mixture; args.Handled = true; } private void MapGetTileMixtures(EntityUid uid, MapAtmosphereComponent component, ref GetTileMixturesMethodEvent args) { - if (args.Handled || component.Mixture == null) + if (args.Handled) return; args.Handled = true; args.Mixtures ??= new GasMixture?[args.Tiles.Count]; for (var i = 0; i < args.Tiles.Count; i++) { - args.Mixtures[i] ??= component.Mixture.Clone(); + args.Mixtures[i] ??= component.Mixture; } } private void OnMapGetState(EntityUid uid, MapAtmosphereComponent component, ref ComponentGetState args) { - args.State = new MapAtmosphereComponentState(_gasTileOverlaySystem.GetOverlayData(component.Mixture)); + args.State = new MapAtmosphereComponentState(component.Overlay); + } + + public void SetMapAtmosphere(EntityUid uid, bool space, GasMixture mixture) + { + DebugTools.Assert(HasComp(uid)); + var component = EnsureComp(uid); + SetMapGasMixture(uid, mixture, component, false); + SetMapSpace(uid, space, component, false); + RefreshAllGridMapAtmospheres(uid); } - public void SetMapAtmosphere(EntityUid uid, bool space, GasMixture mixture, MapAtmosphereComponent? component = null) + public void SetMapGasMixture(EntityUid uid, GasMixture mixture, MapAtmosphereComponent? component = null, bool updateTiles = true) { if (!Resolve(uid, ref component)) return; - component.Space = space; + if (!mixture.Immutable) + { + mixture = mixture.Clone(); + mixture.MarkImmutable(); + } + component.Mixture = mixture; - Dirty(component); + component.Overlay = _gasTileOverlaySystem.GetOverlayData(component.Mixture); + Dirty(uid, component); + if (updateTiles) + RefreshAllGridMapAtmospheres(uid); } - public void SetMapGasMixture(EntityUid uid, GasMixture? mixture, MapAtmosphereComponent? component = null) + public void SetMapSpace(EntityUid uid, bool space, MapAtmosphereComponent? component = null, bool updateTiles = true) { if (!Resolve(uid, ref component)) return; - component.Mixture = mixture; - Dirty(component); + if (component.Space == space) + return; + + component.Space = space; + + if (updateTiles) + RefreshAllGridMapAtmospheres(uid); } - public void SetMapSpace(EntityUid uid, bool space, MapAtmosphereComponent? component = null) + /// + /// Forces a refresh of all MapAtmosphere tiles on every grid on a map. + /// + public void RefreshAllGridMapAtmospheres(EntityUid map) { - if (!Resolve(uid, ref component)) + DebugTools.Assert(HasComp(map)); + var enumerator = AllEntityQuery(); + while (enumerator.MoveNext(out var grid, out var atmos, out var xform)) + { + if (xform.MapUid == map) + RefreshMapAtmosphereTiles((grid, atmos)); + } + } + + /// + /// Forces a refresh of all MapAtmosphere tiles on a given grid. + /// + private void RefreshMapAtmosphereTiles(Entity grid) + { + if (!Resolve(grid.Owner, ref grid.Comp)) return; - component.Space = space; - Dirty(component); + var atmos = grid.Comp; + foreach (var tile in atmos.MapTiles) + { + RemoveMapAtmos(atmos, tile); + atmos.InvalidatedCoords.Add(tile.GridIndices); + } + atmos.MapTiles.Clear(); + } + + /// + /// Handles updating map-atmospheres when grids move across maps. + /// + private void OnGridParentChanged(Entity grid, ref EntParentChangedMessage args) + { + // Do nothing if detaching to nullspace + if (!args.Transform.ParentUid.IsValid()) + return; + + // Avoid doing work if moving from a space-map to another space-map. + if (args.OldParent == null + || HasComp(args.OldParent) + || HasComp(args.Transform.ParentUid)) + { + RefreshMapAtmosphereTiles((grid, grid)); + } } } diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Monstermos.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Monstermos.cs index aceda3cd332..f156125b0ff 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Monstermos.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Monstermos.cs @@ -5,7 +5,6 @@ using Content.Shared.Atmos; using Content.Shared.Atmos.Components; using Content.Shared.Database; -using Content.Shared.Doors.Components; using Robust.Shared.Map.Components; using Robust.Shared.Physics.Components; using Robust.Shared.Random; @@ -27,7 +26,10 @@ public sealed partial class AtmosphereSystem private readonly TileAtmosphere[] _depressurizeSpaceTiles = new TileAtmosphere[Atmospherics.MonstermosHardTileLimit]; private readonly TileAtmosphere[] _depressurizeProgressionOrder = new TileAtmosphere[Atmospherics.MonstermosHardTileLimit * 2]; - private void EqualizePressureInZone(Entity ent, TileAtmosphere tile, int cycleNum, GasTileOverlayComponent? visuals) + private void EqualizePressureInZone( + Entity ent, + TileAtmosphere tile, + int cycleNum) { if (tile.Air == null || (tile.MonstermosInfo.LastCycle >= cycleNum)) return; // Already done. @@ -56,7 +58,7 @@ private void EqualizePressureInZone(Entity ent, TileAtmosphere tile, int cycleNum, GasTileOverlayComponent? visuals) + private void ExplosivelyDepressurize( + Entity ent, + TileAtmosphere tile, + int cycleNum) { // Check if explosive depressurization is enabled and if the tile is valid. if (!MonstermosDepressurization || tile.Air == null) @@ -368,7 +382,7 @@ private void ExplosivelyDepressurize(Entity= limit) break; + if (tileCount >= limit) + break; } } else @@ -437,13 +458,21 @@ private void ExplosivelyDepressurize(Entity 10 && (totalMolesRemoved / tileCount) > 10) + if (tileCount > 10 && (totalMolesRemoved / tileCount) > 10) _adminLog.Add(LogType.ExplosiveDepressurization, LogImpact.High, $"Explosive depressurization removed {totalMolesRemoved} moles from {tileCount} tiles starting from position {tile.GridIndices:position} on grid ID {tile.GridIndex:grid}"); @@ -544,36 +573,33 @@ private void ExplosivelyDepressurize(Entity ent, TileAtmosphere tile, TileAtmosphere other, GasTileOverlayComponent? visuals, MapGridComponent mapGrid) + private void ConsiderFirelocks( + Entity ent, + TileAtmosphere tile, + TileAtmosphere other) { var reconsiderAdjacent = false; - foreach (var entity in mapGrid.GetAnchoredEntities(tile.GridIndices)) + var mapGrid = ent.Comp3; + foreach (var entity in _map.GetAnchoredEntities(ent.Owner, mapGrid, tile.GridIndices)) { - if (!TryComp(entity, out FirelockComponent? firelock)) - continue; - - reconsiderAdjacent |= _firelockSystem.EmergencyPressureStop(entity, firelock); + if (_firelockQuery.TryGetComponent(entity, out var firelock)) + reconsiderAdjacent |= _firelockSystem.EmergencyPressureStop(entity, firelock); } - foreach (var entity in mapGrid.GetAnchoredEntities(other.GridIndices)) + foreach (var entity in _map.GetAnchoredEntities(ent.Owner, mapGrid, other.GridIndices)) { - if (!TryComp(entity, out FirelockComponent? firelock)) - continue; - - reconsiderAdjacent |= _firelockSystem.EmergencyPressureStop(entity, firelock); + if (_firelockQuery.TryGetComponent(entity, out var firelock)) + reconsiderAdjacent |= _firelockSystem.EmergencyPressureStop(entity, firelock); } if (!reconsiderAdjacent) return; - var (owner, gridAtmosphere) = ent; - var tileEv = new UpdateAdjacentMethodEvent(owner, tile.GridIndices); - var otherEv = new UpdateAdjacentMethodEvent(owner, other.GridIndices); - GridUpdateAdjacent(owner, gridAtmosphere, ref tileEv); - GridUpdateAdjacent(owner, gridAtmosphere, ref otherEv); - InvalidateVisuals(tile.GridIndex, tile.GridIndices, visuals); - InvalidateVisuals(other.GridIndex, other.GridIndices, visuals); + UpdateAdjacentTiles(ent, tile); + UpdateAdjacentTiles(ent, other); + InvalidateVisuals(tile.GridIndex, tile.GridIndices, ent); + InvalidateVisuals(other.GridIndex, other.GridIndices, ent); } private void FinalizeEq(GridAtmosphereComponent gridAtmosphere, TileAtmosphere tile, GasTileOverlayComponent? visuals) @@ -642,7 +668,7 @@ private void AdjustEqMovement(TileAtmosphere tile, AtmosDirection direction, flo if (adj == null) { var nonNull = tile.AdjacentTiles.Where(x => x != null).Count(); - Logger.Error($"Encountered null adjacent tile in {nameof(AdjustEqMovement)}. Dir: {direction}, Tile: {tile.Tile}, non-null adj count: {nonNull}, Trace: {Environment.StackTrace}"); + Log.Error($"Encountered null adjacent tile in {nameof(AdjustEqMovement)}. Dir: {direction}, Tile: ({tile.GridIndex}, {tile.GridIndices}), non-null adj count: {nonNull}, Trace: {Environment.StackTrace}"); return; } diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Processing.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Processing.cs index 4f8df0af670..1f3ca2145b9 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Processing.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Processing.cs @@ -1,6 +1,5 @@ using Content.Server.Atmos.Components; using Content.Server.Atmos.Piping.Components; -using Content.Server.NodeContainer.NodeGroups; using Content.Shared.Atmos; using Content.Shared.Atmos.Components; using Content.Shared.Maps; @@ -8,6 +7,7 @@ using Robust.Shared.Map.Components; using Robust.Shared.Physics.Components; using Robust.Shared.Timing; +using Robust.Shared.Utility; namespace Content.Server.Atmos.EntitySystems { @@ -30,131 +30,249 @@ public sealed partial class AtmosphereSystem private int _currentRunAtmosphereIndex; private bool _simulationPaused; - private readonly List> _currentRunAtmosphere = new(); + private TileAtmosphere GetOrNewTile(EntityUid owner, GridAtmosphereComponent atmosphere, Vector2i index) + { + var tile = atmosphere.Tiles.GetOrNew(index, out var existing); + if (existing) + return tile; + + atmosphere.InvalidatedCoords.Add(index); + tile.GridIndex = owner; + tile.GridIndices = index; + return tile; + } + + private readonly List> _currentRunAtmosphere = new(); /// /// Revalidates all invalid coordinates in a grid atmosphere. + /// I.e., process any tiles that have had their airtight blockers modified. /// /// The grid atmosphere in question. /// Whether the process succeeded or got paused due to time constrains. - private bool ProcessRevalidate(Entity ent, GasTileOverlayComponent? visuals) + private bool ProcessRevalidate(Entity ent) { - var (owner, atmosphere) = ent; + if (ent.Comp4.MapUid == null) + { + Log.Error($"Attempted to process atmosphere on a map-less grid? Grid: {ToPrettyString(ent)}"); + return true; + } + + var (uid, atmosphere, visuals, grid, xform) = ent; + var volume = GetVolumeForTiles(grid); + TryComp(xform.MapUid, out MapAtmosphereComponent? mapAtmos); + if (!atmosphere.ProcessingPaused) { - atmosphere.CurrentRunInvalidatedCoordinates.Clear(); - atmosphere.CurrentRunInvalidatedCoordinates.EnsureCapacity(atmosphere.InvalidatedCoords.Count); - foreach (var tile in atmosphere.InvalidatedCoords) + atmosphere.CurrentRunInvalidatedTiles.Clear(); + atmosphere.CurrentRunInvalidatedTiles.EnsureCapacity(atmosphere.InvalidatedCoords.Count); + foreach (var indices in atmosphere.InvalidatedCoords) { - atmosphere.CurrentRunInvalidatedCoordinates.Enqueue(tile); + var tile = GetOrNewTile(uid, atmosphere, indices); + atmosphere.CurrentRunInvalidatedTiles.Enqueue(tile); + + // Update tile.IsSpace and tile.MapAtmosphere, and tile.AirtightData. + UpdateTileData(ent, mapAtmos, tile); } atmosphere.InvalidatedCoords.Clear(); + + if (_simulationStopwatch.Elapsed.TotalMilliseconds >= AtmosMaxProcessTime) + return false; } - if (!TryComp(owner, out MapGridComponent? mapGridComp)) - return true; + var number = 0; + while (atmosphere.CurrentRunInvalidatedTiles.TryDequeue(out var tile)) + { + DebugTools.Assert(atmosphere.Tiles.GetValueOrDefault(tile.GridIndices) == tile); + UpdateAdjacentTiles(ent, tile, activate: true); + UpdateTileAir(ent, tile, volume); + InvalidateVisuals(uid, tile.GridIndices, visuals); - var mapUid = _mapManager.GetMapEntityIdOrThrow(Transform(owner).MapID); + if (number++ < InvalidCoordinatesLagCheckIterations) + continue; - var volume = GetVolumeForTiles(mapGridComp); + number = 0; + // Process the rest next time. + if (_simulationStopwatch.Elapsed.TotalMilliseconds >= AtmosMaxProcessTime) + return false; + } - var number = 0; - while (atmosphere.CurrentRunInvalidatedCoordinates.TryDequeue(out var indices)) + TrimDisconnectedMapTiles(ent); + return true; + } + + /// + /// This method queued a tile and all of its neighbours up for processing by . + /// + public void QueueTileTrim(GridAtmosphereComponent atmos, TileAtmosphere tile) + { + if (!tile.TrimQueued) { - if (!atmosphere.Tiles.TryGetValue(indices, out var tile)) + tile.TrimQueued = true; + atmos.PossiblyDisconnectedTiles.Add(tile); + } + + for (var i = 0; i < Atmospherics.Directions; i++) + { + var direction = (AtmosDirection) (1 << i); + var indices = tile.GridIndices.Offset(direction); + if (atmos.Tiles.TryGetValue(indices, out var adj) + && adj.NoGridTile + && !adj.TrimQueued) { - tile = new TileAtmosphere(owner, indices, - new GasMixture(volume) { Temperature = Atmospherics.T20C }); - atmosphere.Tiles[indices] = tile; + adj.TrimQueued = true; + atmos.PossiblyDisconnectedTiles.Add(adj); } + } + } - var airBlockedEv = new IsTileAirBlockedMethodEvent(owner, indices, MapGridComponent:mapGridComp); - GridIsTileAirBlocked(owner, atmosphere, ref airBlockedEv); - var isAirBlocked = airBlockedEv.Result; + /// + /// Tiles in a are either grid-tiles, or they they should be are tiles + /// adjacent to grid-tiles that represent the map's atmosphere. This method trims any map-tiles that are no longer + /// adjacent to any grid-tiles. + /// + private void TrimDisconnectedMapTiles( + Entity ent) + { + var atmos = ent.Comp1; - var oldBlocked = tile.BlockedAirflow; - var updateAdjacentEv = new UpdateAdjacentMethodEvent(owner, indices, mapGridComp); - GridUpdateAdjacent(owner, atmosphere, ref updateAdjacentEv); + foreach (var tile in atmos.PossiblyDisconnectedTiles) + { + tile.TrimQueued = false; + if (!tile.NoGridTile) + continue; - // Blocked airflow changed, rebuild excited groups! - if (tile.Excited && tile.BlockedAirflow != oldBlocked) + var connected = false; + for (var i = 0; i < Atmospherics.Directions; i++) { - RemoveActiveTile(atmosphere, tile); + var indices = tile.GridIndices.Offset((AtmosDirection) (1 << i)); + if (_map.TryGetTile(ent.Comp3, indices, out var gridTile) && !gridTile.IsEmpty) + { + connected = true; + break; + } } - // Call this instead of the grid method as the map has a say on whether the tile is space or not. - if ((!mapGridComp.TryGetTileRef(indices, out var t) || t.IsSpace(_tileDefinitionManager)) && !isAirBlocked) + if (!connected) { - tile.Air = GetTileMixture(null, mapUid, indices); - tile.MolesArchived = tile.Air != null ? new float[Atmospherics.AdjustedNumberOfGases] : null; - tile.Space = IsTileSpace(null, mapUid, indices, mapGridComp); + RemoveActiveTile(atmos, tile); + atmos.Tiles.Remove(tile.GridIndices); } - else if (isAirBlocked) + } + + atmos.PossiblyDisconnectedTiles.Clear(); + } + + /// + /// Checks whether a tile has a corresponding grid-tile, or whether it is a "map" tile. Also checks whether the + /// tile should be considered "space" + /// + private void UpdateTileData( + Entity ent, + MapAtmosphereComponent? mapAtmos, + TileAtmosphere tile) + { + var idx = tile.GridIndices; + bool mapAtmosphere; + if (_map.TryGetTile(ent.Comp3, idx, out var gTile) && !gTile.IsEmpty) + { + var contentDef = (ContentTileDefinition) _tileDefinitionManager[gTile.TypeId]; + mapAtmosphere = contentDef.MapAtmosphere; + tile.ThermalConductivity = contentDef.ThermalConductivity; + tile.HeatCapacity = contentDef.HeatCapacity; + tile.NoGridTile = false; + } + else + { + mapAtmosphere = true; + tile.ThermalConductivity = 0.5f; + tile.HeatCapacity = float.PositiveInfinity; + + if (!tile.NoGridTile) { - if (airBlockedEv.NoAir) - { - tile.Air = null; - tile.MolesArchived = null; - tile.ArchivedCycle = 0; - tile.LastShare = 0f; - tile.Hotspot = new Hotspot(); - } + tile.NoGridTile = true; + + // This tile just became a non-grid atmos tile. + // It, or one of its neighbours, might now be completely disconnected from the grid. + QueueTileTrim(ent.Comp1, tile); } - else - { - if (tile.Air == null && NeedsVacuumFixing(mapGridComp, indices)) - { - var vacuumEv = new FixTileVacuumMethodEvent(owner, indices); - GridFixTileVacuum(owner, atmosphere, ref vacuumEv); - } + } - // Tile used to be space, but isn't anymore. - if (tile.Space || (tile.Air?.Immutable ?? false)) - { - tile.Air = null; - tile.MolesArchived = null; - tile.ArchivedCycle = 0; - tile.LastShare = 0f; - tile.Space = false; - } + UpdateAirtightData(ent.Owner, ent.Comp1, ent.Comp3, tile); - tile.Air ??= new GasMixture(volume){Temperature = Atmospherics.T20C}; - tile.MolesArchived ??= new float[Atmospherics.AdjustedNumberOfGases]; + if (mapAtmosphere) + { + if (!tile.MapAtmosphere) + { + (tile.Air, tile.Space) = GetDefaultMapAtmosphere(mapAtmos); + tile.MapAtmosphere = true; + ent.Comp1.MapTiles.Add(tile); } - // We activate the tile. - AddActiveTile(atmosphere, tile); + DebugTools.AssertNotNull(tile.Air); + DebugTools.Assert(tile.Air?.Immutable ?? false); + return; + } - // TODO ATMOS: Query all the contents of this tile (like walls) and calculate the correct thermal conductivity and heat capacity - var tileDef = mapGridComp.TryGetTileRef(indices, out var tileRef) - ? tileRef.GetContentTileDefinition(_tileDefinitionManager) - : null; + if (!tile.MapAtmosphere) + return; - tile.ThermalConductivity = tileDef?.ThermalConductivity ?? 0.5f; - tile.HeatCapacity = tileDef?.HeatCapacity ?? float.PositiveInfinity; - InvalidateVisuals(owner, indices, visuals); + // Tile used to be exposed to the map's atmosphere, but isn't anymore. + RemoveMapAtmos(ent.Comp1, tile); + } - for (var i = 0; i < Atmospherics.Directions; i++) - { - var direction = (AtmosDirection) (1 << i); - var otherIndices = indices.Offset(direction); + private void RemoveMapAtmos(GridAtmosphereComponent atmos, TileAtmosphere tile) + { + DebugTools.Assert(tile.MapAtmosphere); + DebugTools.AssertNotNull(tile.Air); + DebugTools.Assert(tile.Air?.Immutable ?? false); + tile.MapAtmosphere = false; + atmos.MapTiles.Remove(tile); + tile.Air = null; + Array.Clear(tile.MolesArchived); + tile.ArchivedCycle = 0; + tile.LastShare = 0f; + tile.Space = false; + } - if (atmosphere.Tiles.TryGetValue(otherIndices, out var otherTile)) - AddActiveTile(atmosphere, otherTile); - } + /// + /// Check whether a grid-tile should have an air mixture, and give it one if it doesn't already have one. + /// + private void UpdateTileAir( + Entity ent, + TileAtmosphere tile, + float volume) + { + if (tile.MapAtmosphere) + { + DebugTools.AssertNotNull(tile.Air); + DebugTools.Assert(tile.Air?.Immutable ?? false); + return; + } - if (number++ < InvalidCoordinatesLagCheckIterations) - continue; + var data = tile.AirtightData; + var fullyBlocked = data.BlockedDirections == AtmosDirection.All; - number = 0; - // Process the rest next time. - if (_simulationStopwatch.Elapsed.TotalMilliseconds >= AtmosMaxProcessTime) - { - return false; - } + if (fullyBlocked && data.NoAirWhenBlocked) + { + if (tile.Air == null) + return; + + tile.Air = null; + Array.Clear(tile.MolesArchived); + tile.ArchivedCycle = 0; + tile.LastShare = 0f; + tile.Hotspot = new Hotspot(); + return; } - return true; + if (tile.Air != null) + return; + + tile.Air = new GasMixture(volume){Temperature = Atmospherics.T20C}; + + if (data.FixVacuum) + GridFixTileVacuum(ent, tile, volume); } private void QueueRunTiles( @@ -170,19 +288,16 @@ private void QueueRunTiles( } } - private bool ProcessTileEqualize(Entity ent, GasTileOverlayComponent? visuals) + private bool ProcessTileEqualize(Entity ent) { - var (uid, atmosphere) = ent; + var atmosphere = ent.Comp1; if (!atmosphere.ProcessingPaused) QueueRunTiles(atmosphere.CurrentRunTiles, atmosphere.ActiveTiles); - if (!TryComp(uid, out MapGridComponent? mapGridComp)) - throw new Exception("Tried to process a grid atmosphere on an entity that isn't a grid!"); - var number = 0; while (atmosphere.CurrentRunTiles.TryDequeue(out var tile)) { - EqualizePressureInZone((uid, mapGridComp, atmosphere), tile, atmosphere.UpdateCounter, visuals); + EqualizePressureInZone(ent, tile, atmosphere.UpdateCounter); if (number++ < LagCheckIterations) continue; @@ -198,7 +313,7 @@ private bool ProcessTileEqualize(Entity ent, GasTileOve return true; } - private bool ProcessActiveTiles(GridAtmosphereComponent atmosphere, GasTileOverlayComponent? visuals) + private bool ProcessActiveTiles(GridAtmosphereComponent atmosphere, GasTileOverlayComponent visuals) { if(!atmosphere.ProcessingPaused) QueueRunTiles(atmosphere.CurrentRunTiles, atmosphere.ActiveTiles); @@ -240,11 +355,11 @@ private bool ProcessExcitedGroups(GridAtmosphereComponent gridAtmosphere) excitedGroup.BreakdownCooldown++; excitedGroup.DismantleCooldown++; - if(excitedGroup.BreakdownCooldown > Atmospherics.ExcitedGroupBreakdownCycles) + if (excitedGroup.BreakdownCooldown > Atmospherics.ExcitedGroupBreakdownCycles) ExcitedGroupSelfBreakdown(gridAtmosphere, excitedGroup); - - else if(excitedGroup.DismantleCooldown > Atmospherics.ExcitedGroupsDismantleCycles) - ExcitedGroupDismantle(gridAtmosphere, excitedGroup); + else if (excitedGroup.DismantleCooldown > Atmospherics.ExcitedGroupsDismantleCycles) + DeactivateGroupTiles(gridAtmosphere, excitedGroup); + // TODO ATMOS. What is the point of this? why is this only de-exciting the group? Shouldn't it also dismantle it? if (number++ < LagCheckIterations) continue; @@ -435,10 +550,10 @@ private void UpdateProcessing(float frameTime) _currentRunAtmosphereIndex = 0; _currentRunAtmosphere.Clear(); - var query = EntityQueryEnumerator(); - while (query.MoveNext(out var uid, out var grid)) + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var atmos, out var overlay, out var grid, out var xform )) { - _currentRunAtmosphere.Add((uid, grid)); + _currentRunAtmosphere.Add((uid, atmos, overlay, grid, xform)); } } @@ -448,8 +563,7 @@ private void UpdateProcessing(float frameTime) for (; _currentRunAtmosphereIndex < _currentRunAtmosphere.Count; _currentRunAtmosphereIndex++) { var ent = _currentRunAtmosphere[_currentRunAtmosphereIndex]; - var (owner, atmosphere) = ent; - TryComp(owner, out GasTileOverlayComponent? visuals); + var (owner, atmosphere, visuals, grid, xform) = ent; if (!TryComp(owner, out TransformComponent? x) || x.MapUid == null @@ -474,13 +588,14 @@ private void UpdateProcessing(float frameTime) switch (atmosphere.State) { case AtmosphereProcessingState.Revalidate: - if (!ProcessRevalidate(ent, visuals)) + if (!ProcessRevalidate(ent)) { atmosphere.ProcessingPaused = true; return; } atmosphere.ProcessingPaused = false; + // Next state depends on whether monstermos equalization is enabled or not. // Note: We do this here instead of on the tile equalization step to prevent ending it early. // Therefore, a change to this CVar might only be applied after that step is over. @@ -489,7 +604,7 @@ private void UpdateProcessing(float frameTime) : AtmosphereProcessingState.ActiveTiles; continue; case AtmosphereProcessingState.TileEqualize: - if (!ProcessTileEqualize(ent, visuals)) + if (!ProcessTileEqualize(ent)) { atmosphere.ProcessingPaused = true; return; @@ -499,7 +614,7 @@ private void UpdateProcessing(float frameTime) atmosphere.State = AtmosphereProcessingState.ActiveTiles; continue; case AtmosphereProcessingState.ActiveTiles: - if (!ProcessActiveTiles(atmosphere, visuals)) + if (!ProcessActiveTiles(ent, ent)) { atmosphere.ProcessingPaused = true; return; @@ -520,7 +635,7 @@ private void UpdateProcessing(float frameTime) atmosphere.State = AtmosphereProcessingState.HighPressureDelta; continue; case AtmosphereProcessingState.HighPressureDelta: - if (!ProcessHighPressureDelta(ent)) + if (!ProcessHighPressureDelta((ent, ent))) { atmosphere.ProcessingPaused = true; return; diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Superconductivity.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Superconductivity.cs index 33fa16a6c68..5c73cf11246 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Superconductivity.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Superconductivity.cs @@ -1,5 +1,6 @@ using Content.Server.Atmos.Components; using Content.Shared.Atmos; +using Robust.Shared.Map.Components; namespace Content.Server.Atmos.EntitySystems { @@ -12,7 +13,8 @@ private void Superconduct(GridAtmosphereComponent gridAtmosphere, TileAtmosphere for(var i = 0; i < Atmospherics.Directions; i++) { var direction = (AtmosDirection) (1 << i); - if (!directions.IsFlagSet(direction)) continue; + if (!directions.IsFlagSet(direction)) + continue; var adjacent = tile.AdjacentTiles[direction.ToIndex()]; @@ -92,7 +94,9 @@ public void NeighborConductWithSource(GridAtmosphereComponent gridAtmosphere, Ti { if (tile.Air == null) { - if (other.Tile != null) + // TODO ATMOS: why does this need to check if a tile exists if it doesn't use the tile? + if (TryComp(other.GridIndex, out var grid) + && _mapSystem.TryGetTileRef(other.GridIndex, grid, other.GridIndices, out var _)) { TemperatureShareOpenToSolid(other, tile); } diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Utils.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Utils.cs index 699c2a70aef..9b0d0d9670d 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Utils.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Utils.cs @@ -41,20 +41,6 @@ public void InvalidateVisuals(EntityUid gridUid, Vector2i tile, GasTileOverlayCo _gasTileOverlaySystem.Invalidate(gridUid, tile, comp); } - public bool NeedsVacuumFixing(MapGridComponent mapGrid, Vector2i indices) - { - var value = false; - - var enumerator = GetObstructingComponentsEnumerator(mapGrid, indices); - - while (enumerator.MoveNext(out var airtight)) - { - value |= airtight.FixVacuum; - } - - return value; - } - /// /// Gets the volume in liters for a number of tiles, on a specific grid. /// @@ -66,34 +52,44 @@ private float GetVolumeForTiles(MapGridComponent mapGrid, int tiles = 1) return Atmospherics.CellVolume * mapGrid.TileSize * tiles; } - /// - /// Gets all obstructing instances in a specific tile. - /// - /// The grid where to get the tile. - /// The indices of the tile. - /// The enumerator for the airtight components. - public AtmosObstructionEnumerator GetObstructingComponentsEnumerator(MapGridComponent mapGrid, Vector2i tile) + public readonly record struct AirtightData(AtmosDirection BlockedDirections, bool NoAirWhenBlocked, + bool FixVacuum); + + private void UpdateAirtightData(EntityUid uid, GridAtmosphereComponent atmos, MapGridComponent grid, TileAtmosphere tile) { - var ancEnumerator = mapGrid.GetAnchoredEntitiesEnumerator(tile); - var airQuery = GetEntityQuery(); + var oldBlocked = tile.AirtightData.BlockedDirections; + + tile.AirtightData = tile.NoGridTile + ? default + : GetAirtightData(uid, grid, tile.GridIndices); - var enumerator = new AtmosObstructionEnumerator(ancEnumerator, airQuery); - return enumerator; + if (tile.AirtightData.BlockedDirections != oldBlocked && tile.ExcitedGroup != null) + ExcitedGroupDispose(atmos, tile.ExcitedGroup); } - private AtmosDirection GetBlockedDirections(MapGridComponent mapGrid, Vector2i indices) + private AirtightData GetAirtightData(EntityUid uid, MapGridComponent grid, Vector2i tile) { - var value = AtmosDirection.Invalid; + var blockedDirs = AtmosDirection.Invalid; + var noAirWhenBlocked = false; + var fixVacuum = false; - var enumerator = GetObstructingComponentsEnumerator(mapGrid, indices); - - while (enumerator.MoveNext(out var airtight)) + foreach (var ent in _map.GetAnchoredEntities(uid, grid, tile)) { - if(airtight.AirBlocked) - value |= airtight.AirBlockedDirection; + if (!_airtightQuery.TryGetComponent(ent, out var airtight)) + continue; + + if(!airtight.AirBlocked) + continue; + + blockedDirs |= airtight.AirBlockedDirection; + noAirWhenBlocked |= airtight.NoAirWhenFullyAirBlocked; + fixVacuum |= airtight.FixVacuum; + + if (blockedDirs == AtmosDirection.All && noAirWhenBlocked && fixVacuum) + break; } - return value; + return new AirtightData(blockedDirs, noAirWhenBlocked, fixVacuum); } /// diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.cs index dd2a9675591..d2f40e77169 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.cs @@ -4,6 +4,7 @@ using Content.Server.Fluids.EntitySystems; using Content.Server.NodeContainer.EntitySystems; using Content.Shared.Atmos.EntitySystems; +using Content.Shared.Doors.Components; using Content.Shared.Maps; using JetBrains.Annotations; using Robust.Server.GameObjects; @@ -40,6 +41,9 @@ public sealed partial class AtmosphereSystem : SharedAtmosphereSystem private const float ExposedUpdateDelay = 1f; private float _exposedTimer = 0f; + private EntityQuery _atmosQuery; + private EntityQuery _airtightQuery; + private EntityQuery _firelockQuery; private HashSet _entSet = new(); public override void Initialize() @@ -55,6 +59,9 @@ public override void Initialize() InitializeGridAtmosphere(); InitializeMap(); + _atmosQuery = GetEntityQuery(); + _airtightQuery = GetEntityQuery(); + _firelockQuery = GetEntityQuery(); SubscribeLocalEvent(OnTileChanged); diff --git a/Content.Server/Atmos/EntitySystems/AutomaticAtmosSystem.cs b/Content.Server/Atmos/EntitySystems/AutomaticAtmosSystem.cs index 203c747e29e..70e3eef3c44 100644 --- a/Content.Server/Atmos/EntitySystems/AutomaticAtmosSystem.cs +++ b/Content.Server/Atmos/EntitySystems/AutomaticAtmosSystem.cs @@ -27,8 +27,12 @@ private void OnTileChanged(ref TileChangedEvent ev) // Also, these calls are surprisingly slow. // TODO: Make tiledefmanager cache the IsSpace property, and turn this lookup-through-two-interfaces into // TODO: a simple array lookup, as tile IDs are likely contiguous, and there's at most 2^16 possibilities anyway. - if (!((ev.OldTile.IsSpace(_tileDefinitionManager) && !ev.NewTile.IsSpace(_tileDefinitionManager)) || - (!ev.OldTile.IsSpace(_tileDefinitionManager) && ev.NewTile.IsSpace(_tileDefinitionManager))) || + + var oldSpace = ev.OldTile.IsSpace(_tileDefinitionManager); + var newSpace = ev.NewTile.IsSpace(_tileDefinitionManager); + + if (!(oldSpace && !newSpace || + !oldSpace && newSpace) || _atmosphereSystem.HasAtmosphere(ev.Entity)) return; diff --git a/Content.Server/Atmos/EntitySystems/GasAnalyzerSystem.cs b/Content.Server/Atmos/EntitySystems/GasAnalyzerSystem.cs index 6a2c8f0a7e5..552ee142329 100644 --- a/Content.Server/Atmos/EntitySystems/GasAnalyzerSystem.cs +++ b/Content.Server/Atmos/EntitySystems/GasAnalyzerSystem.cs @@ -260,13 +260,13 @@ private GasEntry[] GenerateGasEntryArray(GasMixture? mixture) { var gas = _atmo.GetGas(i); - if (mixture?.Moles[i] <= UIMinMoles) + if (mixture?[i] <= UIMinMoles) continue; if (mixture != null) { var gasName = Loc.GetString(gas.Name); - gases.Add(new GasEntry(gasName, mixture.Moles[i], gas.Color)); + gases.Add(new GasEntry(gasName, mixture[i], gas.Color)); } } diff --git a/Content.Server/Atmos/EntitySystems/GasTileOverlaySystem.cs b/Content.Server/Atmos/EntitySystems/GasTileOverlaySystem.cs index 8ae9517379e..397f0167a9b 100644 --- a/Content.Server/Atmos/EntitySystems/GasTileOverlaySystem.cs +++ b/Content.Server/Atmos/EntitySystems/GasTileOverlaySystem.cs @@ -171,7 +171,7 @@ public GasOverlayData GetOverlayData(GasMixture? mixture) { var id = VisibleGasId[i]; var gas = _atmosphereSystem.GetGas(id); - var moles = mixture?.Moles[id] ?? 0f; + var moles = mixture?[id] ?? 0f; ref var opacity = ref data.Opacity[i]; if (moles < gas.GasMolesVisible) @@ -216,13 +216,13 @@ private bool UpdateChunkTile(GridAtmosphereComponent gridAtmosphere, GasOverlayC oldData = new GasOverlayData(tile.Hotspot.State, oldData.Opacity); } - if (tile.Air != null) + if (tile is {Air: not null, NoGridTile: false}) { for (var i = 0; i < VisibleGasId.Length; i++) { var id = VisibleGasId[i]; var gas = _atmosphereSystem.GetGas(id); - var moles = tile.Air.Moles[id]; + var moles = tile.Air[id]; ref var oldOpacity = ref oldData.Opacity[i]; if (moles < gas.GasMolesVisible) diff --git a/Content.Server/Atmos/GasMixture.cs b/Content.Server/Atmos/GasMixture.cs index 0a2ef235a71..77fd7018333 100644 --- a/Content.Server/Atmos/GasMixture.cs +++ b/Content.Server/Atmos/GasMixture.cs @@ -3,6 +3,7 @@ using System.Runtime.CompilerServices; using Content.Server.Atmos.Reactions; using Content.Shared.Atmos; +using Content.Shared.Atmos.EntitySystems; using Robust.Shared.Serialization; using Robust.Shared.Utility; @@ -17,11 +18,13 @@ public sealed partial class GasMixture : IEquatable, ISerializationH { public static GasMixture SpaceGas => new() {Volume = Atmospherics.CellVolume, Temperature = Atmospherics.TCMB, Immutable = true}; - // This must always have a length that is a multiple of 4 for SIMD acceleration. - [DataField("moles")] - [ViewVariables(VVAccess.ReadWrite)] + // No access, to ensure immutable mixtures are never accidentally mutated. + [Access(typeof(SharedAtmosphereSystem), typeof(SharedAtmosDebugOverlaySystem), Other = AccessPermissions.None)] + [DataField] public float[] Moles = new float[Atmospherics.AdjustedNumberOfGases]; + public float this[int gas] => Moles[gas]; + [DataField("temperature")] [ViewVariables(VVAccess.ReadWrite)] private float _temperature = Atmospherics.TCMB; @@ -80,6 +83,19 @@ public GasMixture(float volume = 0f) Volume = volume; } + public GasMixture(float[] moles, float temp, float volume = Atmospherics.CellVolume) + { + if (moles.Length != Atmospherics.AdjustedNumberOfGases) + throw new InvalidOperationException($"Invalid mole array length"); + + if (volume < 0) + volume = 0; + + _temperature = temp; + Moles = moles; + Volume = volume; + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] public void MarkImmutable() { @@ -117,15 +133,16 @@ public void SetMoles(Gas gas, float quantity) [MethodImpl(MethodImplOptions.AggressiveInlining)] public void AdjustMoles(int gasId, float quantity) { - if (!Immutable) - { - if (!float.IsFinite(quantity)) - throw new ArgumentException($"Invalid quantity \"{quantity}\" specified!", nameof(quantity)); + if (Immutable) + return; - // Clamping is needed because x - x can be negative with floating point numbers. If we don't - // clamp here, the caller always has to call GetMoles(), clamp, then SetMoles(). - Moles[gasId] = MathF.Max(Moles[gasId] + quantity, 0); - } + if (!float.IsFinite(quantity)) + throw new ArgumentException($"Invalid quantity \"{quantity}\" specified!", nameof(quantity)); + + // Clamping is needed because x - x can be negative with floating point numbers. If we don't + // clamp here, the caller always has to call GetMoles(), clamp, then SetMoles(). + ref var moles = ref Moles[gasId]; + moles = MathF.Max(moles + quantity, 0); } [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -163,7 +180,8 @@ public GasMixture RemoveRatio(float ratio) { var moles = Moles[i]; var otherMoles = removed.Moles[i]; - if (moles < Atmospherics.GasMinMoles || float.IsNaN(moles)) + + if ((moles < Atmospherics.GasMinMoles || float.IsNaN(moles)) && !Immutable) Moles[i] = 0; if (otherMoles < Atmospherics.GasMinMoles || float.IsNaN(otherMoles)) @@ -202,6 +220,9 @@ public void Multiply(float multiplier) void ISerializationHooks.AfterDeserialization() { + // ISerializationHooks is obsolete. + // TODO add fixed-length-array serializer + // The arrays MUST have a specific length. Array.Resize(ref Moles, Atmospherics.AdjustedNumberOfGases); } @@ -229,8 +250,12 @@ public override bool Equals(object? obj) public bool Equals(GasMixture? other) { - if (ReferenceEquals(null, other)) return false; - if (ReferenceEquals(this, other)) return true; + if (ReferenceEquals(this, other)) + return true; + + if (ReferenceEquals(null, other)) + return false; + return Moles.SequenceEqual(other.Moles) && _temperature.Equals(other._temperature) && ReactionResults.SequenceEqual(other.ReactionResults) @@ -258,11 +283,13 @@ public override int GetHashCode() public GasMixture Clone() { + if (Immutable) + return this; + var newMixture = new GasMixture() { Moles = (float[])Moles.Clone(), _temperature = _temperature, - Immutable = Immutable, Volume = Volume, }; return newMixture; diff --git a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCanisterSystem.cs b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCanisterSystem.cs index 64d02d793bc..ad647fad1b8 100644 --- a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCanisterSystem.cs +++ b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCanisterSystem.cs @@ -136,7 +136,7 @@ private void OnCanisterChangeReleaseValve(EntityUid uid, GasCanisterComponent ca for (int i = 0; i < containedGasArray.Length; i++) { - containedGasDict.Add((Gas)i, canister.Air.Moles[i]); + containedGasDict.Add((Gas)i, canister.Air[i]); } _adminLogger.Add(LogType.CanisterValve, impact, $"{ToPrettyString(args.Session.AttachedEntity.GetValueOrDefault()):player} set the valve on {ToPrettyString(uid):canister} to {args.Valve:valveState} while it contained [{string.Join(", ", containedGasDict)}]"); diff --git a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCondenserSystem.cs b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCondenserSystem.cs index 491bf600627..852542ec6cd 100644 --- a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCondenserSystem.cs +++ b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCondenserSystem.cs @@ -45,7 +45,7 @@ private void OnCondenserUpdated(Entity entity, ref AtmosD var removed = inlet.Air.Remove(molesToConvert); for (var i = 0; i < Atmospherics.TotalNumberOfGases; i++) { - var moles = removed.Moles[i]; + var moles = removed[i]; if (moles <= 0) continue; diff --git a/Content.Server/Atmos/Serialization/TileAtmosCollectionSerializer.cs b/Content.Server/Atmos/Serialization/TileAtmosCollectionSerializer.cs index 7d385c530a9..71e4c2d0def 100644 --- a/Content.Server/Atmos/Serialization/TileAtmosCollectionSerializer.cs +++ b/Content.Server/Atmos/Serialization/TileAtmosCollectionSerializer.cs @@ -183,13 +183,7 @@ public void CopyTo(ISerializationManager serializationManager, Dictionary + /// Neighbouring tiles to which air can flow. This is a combination of this tile's unblocked direction, and the + /// unblocked directions on adjacent tiles. + /// [ViewVariables] public AtmosDirection AdjacentBits = AtmosDirection.Invalid; @@ -72,10 +77,7 @@ public sealed class TileAtmosphere : IGasMixtureHolder public EntityUid GridIndex { get; set; } [ViewVariables] - public TileRef? Tile => GridIndices.GetTileRef(GridIndex); - - [ViewVariables] - public Vector2i GridIndices { get; } + public Vector2i GridIndices; [ViewVariables] public ExcitedGroup? ExcitedGroup { get; set; } @@ -92,7 +94,7 @@ public sealed class TileAtmosphere : IGasMixtureHolder public float LastShare; [ViewVariables] - public float[]? MolesArchived; + public readonly float[] MolesArchived = new float[Atmospherics.AdjustedNumberOfGases]; GasMixture IGasMixtureHolder.Air { @@ -103,8 +105,31 @@ GasMixture IGasMixtureHolder.Air [ViewVariables] public float MaxFireTemperatureSustained { get; set; } + /// + /// If true, then this tile is directly exposed to the map's atmosphere, either because the grid has no tile at + /// this position, or because the tile type is not airtight. + /// + [ViewVariables] + public bool MapAtmosphere; + + /// + /// If true, this tile does not actually exist on the grid, it only exists to represent the map's atmosphere for + /// adjacent grid tiles. + /// [ViewVariables] - public AtmosDirection BlockedAirflow { get; set; } = AtmosDirection.Invalid; + public bool NoGridTile; + + /// + /// If true, this tile is queued for processing in + /// + [ViewVariables] + public bool TrimQueued; + + /// + /// Cached information about airtight entities on this tile. This gets updated anytime a tile gets invalidated + /// (i.e., gets added to ). + /// + public AtmosphereSystem.AirtightData AirtightData; public TileAtmosphere(EntityUid gridIndex, Vector2i gridIndices, GasMixture? mixture = null, bool immutable = false, bool space = false) { @@ -112,10 +137,24 @@ public TileAtmosphere(EntityUid gridIndex, Vector2i gridIndices, GasMixture? mix GridIndices = gridIndices; Air = mixture; Space = space; - MolesArchived = Air != null ? new float[Atmospherics.AdjustedNumberOfGases] : null; if(immutable) Air?.MarkImmutable(); } + + public TileAtmosphere(TileAtmosphere other) + { + GridIndex = other.GridIndex; + GridIndices = other.GridIndices; + Space = other.Space; + NoGridTile = other.NoGridTile; + MapAtmosphere = other.MapAtmosphere; + Air = other.Air?.Clone(); + Array.Copy(other.MolesArchived, MolesArchived, MolesArchived.Length); + } + + public TileAtmosphere() + { + } } } diff --git a/Content.Server/Body/Systems/LungSystem.cs b/Content.Server/Body/Systems/LungSystem.cs index b5bac507391..4b60f8814b5 100644 --- a/Content.Server/Body/Systems/LungSystem.cs +++ b/Content.Server/Body/Systems/LungSystem.cs @@ -77,7 +77,7 @@ public void GasToReagent(EntityUid uid, LungComponent lung) foreach (var gas in Enum.GetValues()) { var i = (int) gas; - var moles = lung.Air.Moles[i]; + var moles = lung.Air[i]; if (moles <= 0) continue; var reagent = _atmosphereSystem.GasReagents[i]; diff --git a/Content.Server/Chemistry/ReagentEffects/ModifyLungGas.cs b/Content.Server/Chemistry/ReagentEffects/ModifyLungGas.cs index e12cab80a91..e7466fbc85d 100644 --- a/Content.Server/Chemistry/ReagentEffects/ModifyLungGas.cs +++ b/Content.Server/Chemistry/ReagentEffects/ModifyLungGas.cs @@ -16,12 +16,15 @@ public sealed partial class ModifyLungGas : ReagentEffect public override void Effect(ReagentEffectArgs args) { - if (args.EntityManager.TryGetComponent(args.OrganEntity, out var lung)) + if (!args.EntityManager.TryGetComponent(args.OrganEntity, out var lung)) + return; + + foreach (var (gas, ratio) in _ratios) { - foreach (var (gas, ratio) in _ratios) - { - lung.Air.Moles[(int) gas] += (ratio * args.Quantity.Float()) / Atmospherics.BreathMolesToReagentMultiplier; - } + var quantity = ratio * args.Quantity.Float() / Atmospherics.BreathMolesToReagentMultiplier; + if (quantity < 0) + quantity = Math.Max(quantity, -lung.Air[(int)gas]); + lung.Air.AdjustMoles(gas, quantity); } } } diff --git a/Content.Server/Construction/Conditions/ComponentInTile.cs b/Content.Server/Construction/Conditions/ComponentInTile.cs index 8ab4046a721..36705e4c0ee 100644 --- a/Content.Server/Construction/Conditions/ComponentInTile.cs +++ b/Content.Server/Construction/Conditions/ComponentInTile.cs @@ -3,6 +3,7 @@ using Content.Shared.Maps; using JetBrains.Annotations; using Robust.Shared.Map; +using Robust.Shared.Map.Components; using Robust.Shared.Utility; namespace Content.Server.Construction.Conditions @@ -48,7 +49,15 @@ public bool Condition(EntityUid uid, IEntityManager entityManager) var indices = transform.Coordinates.ToVector2i(entityManager, IoCManager.Resolve()); var lookup = entityManager.EntitySysManager.GetEntitySystem(); - var entities = indices.GetEntitiesInTile(transform.GridUid.Value, LookupFlags.Approximate | LookupFlags.Static, lookup); + + + if (!entityManager.TryGetComponent(transform.GridUid.Value, out var grid)) + return !HasEntity; + + if (!entityManager.System().TryGetTileRef(transform.GridUid.Value, grid, indices, out var tile)) + return !HasEntity; + + var entities = tile.GetEntitiesInTile(LookupFlags.Approximate | LookupFlags.Static, lookup); foreach (var ent in entities) { diff --git a/Content.Server/Explosion/EntitySystems/ExplosionSystem.Processing.cs b/Content.Server/Explosion/EntitySystems/ExplosionSystem.Processing.cs index 31451c425f5..4a9477e7443 100644 --- a/Content.Server/Explosion/EntitySystems/ExplosionSystem.Processing.cs +++ b/Content.Server/Explosion/EntitySystems/ExplosionSystem.Processing.cs @@ -475,7 +475,7 @@ public void DamageFloorTile(TileRef tileRef, if (_tileDefinitionManager[tileRef.Tile.TypeId] is not ContentTileDefinition tileDef) return; - if (tileDef.IsSpace) + if (tileDef.MapAtmosphere) canCreateVacuum = true; // is already a vacuum. int tileBreakages = 0; @@ -491,7 +491,7 @@ public void DamageFloorTile(TileRef tileRef, if (_tileDefinitionManager[tileDef.BaseTurf] is not ContentTileDefinition newDef) break; - if (newDef.IsSpace && !canCreateVacuum) + if (newDef.MapAtmosphere && !canCreateVacuum) break; tileDef = newDef; diff --git a/Content.Server/Parallax/BiomeSystem.cs b/Content.Server/Parallax/BiomeSystem.cs index c4c2300870d..83cf9b9cb2d 100644 --- a/Content.Server/Parallax/BiomeSystem.cs +++ b/Content.Server/Parallax/BiomeSystem.cs @@ -1001,20 +1001,13 @@ public void EnsurePlanet(EntityUid mapUid, BiomeTemplatePrototype biomeTemplate, light.AmbientLightColor = Color.FromHex("#D8B059"); Dirty(mapUid, light, metadata); - // Atmos - var atmos = EnsureComp(mapUid); - var moles = new float[Atmospherics.AdjustedNumberOfGases]; moles[(int) Gas.Oxygen] = 21.824779f; moles[(int) Gas.Nitrogen] = 82.10312f; - var mixture = new GasMixture(2500) - { - Temperature = 293.15f, - Moles = moles, - }; + var mixture = new GasMixture(moles, Atmospherics.T20C); - _atmos.SetMapAtmosphere(mapUid, false, mixture, atmos); + _atmos.SetMapAtmosphere(mapUid, false, mixture); } /// diff --git a/Content.Server/Power/Generator/GasPowerReceiverSystem.cs b/Content.Server/Power/Generator/GasPowerReceiverSystem.cs index c61599edfc9..76cf90c3693 100644 --- a/Content.Server/Power/Generator/GasPowerReceiverSystem.cs +++ b/Content.Server/Power/Generator/GasPowerReceiverSystem.cs @@ -37,7 +37,7 @@ private void OnDeviceUpdated(EntityUid uid, GasPowerReceiverComponent component, if (pipe.Air.Temperature <= component.MaxTemperature) { // we have enough gas, so we consume it and are powered - if (pipe.Air.Moles[(int) component.TargetGas] > component.MolesConsumedSec * timeDelta) + if (pipe.Air[(int) component.TargetGas] > component.MolesConsumedSec * timeDelta) { pipe.Air.AdjustMoles(component.TargetGas, -component.MolesConsumedSec * timeDelta); SetPowered(uid, component, true); diff --git a/Content.Server/Salvage/SpawnSalvageMissionJob.cs b/Content.Server/Salvage/SpawnSalvageMissionJob.cs index 2776db2283a..e2b17b58724 100644 --- a/Content.Server/Salvage/SpawnSalvageMissionJob.cs +++ b/Content.Server/Salvage/SpawnSalvageMissionJob.cs @@ -125,11 +125,7 @@ protected override async Task Process() air.Gases.CopyTo(moles, 0); var atmos = _entManager.EnsureComponent(mapUid); _entManager.System().SetMapSpace(mapUid, air.Space, atmos); - _entManager.System().SetMapGasMixture(mapUid, new GasMixture(2500) - { - Temperature = mission.Temperature, - Moles = moles, - }, atmos); + _entManager.System().SetMapGasMixture(mapUid, new GasMixture(moles, mission.Temperature), atmos); if (mission.Color != null) { diff --git a/Content.Server/Spreader/SpreaderSystem.cs b/Content.Server/Spreader/SpreaderSystem.cs index 89951718236..5b2f3298a2b 100644 --- a/Content.Server/Spreader/SpreaderSystem.cs +++ b/Content.Server/Spreader/SpreaderSystem.cs @@ -18,6 +18,7 @@ namespace Content.Server.Spreader; /// public sealed class SpreaderSystem : EntitySystem { + [Dependency] private readonly IMapManager _mapManager = default!; [Dependency] private readonly IPrototypeManager _prototype = default!; [Dependency] private readonly IRobustRandom _robustRandom = default!; [Dependency] private readonly SharedMapSystem _map = default!; @@ -33,6 +34,8 @@ public sealed class SpreaderSystem : EntitySystem // TODO PERFORMANCE Assign each prototype to an index and convert dictionary to array private readonly Dictionary> _gridUpdates = []; + private EntityQuery _query; + public const float SpreadCooldownSeconds = 1; [ValidatePrototypeId] @@ -47,6 +50,8 @@ public override void Initialize() SubscribeLocalEvent(OnTerminating); SetupPrototypes(); + + _query = GetEntityQuery(); } private void OnPrototypeReload(PrototypesReloadedEventArgs obj) @@ -66,13 +71,7 @@ private void SetupPrototypes() private void OnAirtightChanged(ref AirtightChanged ev) { - var neighbors = GetSpreadableNeighbors(ev.Entity, ev.Airtight, ev.Position); - - foreach (var neighbor in neighbors) - { - if (!TerminatingOrDeleted(neighbor)) - EnsureComp(neighbor); - } + ActivateSpreadableNeighbors(ev.Entity, ev.Position); } private void OnGridInit(GridInitializeEvent ev) @@ -82,13 +81,7 @@ private void OnGridInit(GridInitializeEvent ev) private void OnTerminating(Entity entity, ref EntityTerminatingEvent args) { - var neighbors = GetSpreadableNeighbors(entity); - - foreach (var neighbor in neighbors) - { - if (!TerminatingOrDeleted(neighbor)) - EnsureComp(neighbor); - } + ActivateSpreadableNeighbors(entity); } /// @@ -254,8 +247,7 @@ public void GetNeighbors(EntityUid uid, TransformComponent comp, ProtoId - /// Given an entity, this returns a list of all adjacent entities with a . + /// This function activates all spreaders that are adjacent to a given entity. This also activates other spreaders + /// on the same tile as the current entity (for thin airtight entities like windoors). /// - public List GetSpreadableNeighbors(EntityUid uid, AirtightComponent? comp = null, - (EntityUid Grid, Vector2i Tile)? position = null) + public void ActivateSpreadableNeighbors(EntityUid uid, (EntityUid Grid, Vector2i Tile)? position = null) { - Resolve(uid, ref comp, false); - var neighbors = new List(); - Vector2i tile; EntityUid ent; MapGridComponent? grid; @@ -315,37 +303,40 @@ public List GetSpreadableNeighbors(EntityUid uid, AirtightComponent? { var transform = Transform(uid); if (!TryComp(transform.GridUid, out grid) || TerminatingOrDeleted(transform.GridUid.Value)) - return neighbors; + return; + tile = _map.TileIndicesFor(transform.GridUid.Value, grid, transform.Coordinates); ent = transform.GridUid.Value; } else { if (!TryComp(position.Value.Grid, out grid)) - return neighbors; - tile = position.Value.Tile; - ent = position.Value.Grid; + return; + (ent, tile) = position.Value; } - var spreaderQuery = GetEntityQuery(); + var anchored = _map.GetAnchoredEntitiesEnumerator(ent, grid, tile); + while (anchored.MoveNext(out var entity)) + { + if (entity == ent) + continue; + DebugTools.Assert(Transform(entity.Value).Anchored); + if (_query.HasComponent(ent) && !TerminatingOrDeleted(entity.Value)) + EnsureComp(entity.Value); + } for (var i = 0; i < Atmospherics.Directions; i++) { var direction = (AtmosDirection) (1 << i); - if (comp != null && !comp.AirBlockedDirection.IsFlagSet(direction)) - continue; + var adjacentTile = SharedMapSystem.GetDirection(tile, direction.ToDirection()); + anchored = _map.GetAnchoredEntitiesEnumerator(ent, grid, adjacentTile); - var directionEnumerator = - _map.GetAnchoredEntitiesEnumerator(ent, grid, SharedMapSystem.GetDirection(tile, direction.ToDirection())); - - while (directionEnumerator.MoveNext(out var entity)) + while (anchored.MoveNext(out var entity)) { DebugTools.Assert(Transform(entity.Value).Anchored); - if (spreaderQuery.HasComponent(entity) && !TerminatingOrDeleted(entity.Value)) - neighbors.Add(entity.Value); + if (_query.HasComponent(ent) && !TerminatingOrDeleted(entity.Value)) + EnsureComp(entity.Value); } } - - return neighbors; } } diff --git a/Content.Shared/Atmos/Atmospherics.cs b/Content.Shared/Atmos/Atmospherics.cs index 7460e08e46f..6a8587ca239 100644 --- a/Content.Shared/Atmos/Atmospherics.cs +++ b/Content.Shared/Atmos/Atmospherics.cs @@ -8,11 +8,6 @@ namespace Content.Shared.Atmos /// public static class Atmospherics { - static Atmospherics() - { - AdjustedNumberOfGases = MathHelper.NextMultipleOf(TotalNumberOfGases, 4); - } - #region ATMOS /// /// The universal gas constant, in kPa*L/(K*mol) @@ -183,7 +178,7 @@ static Atmospherics() /// This is the actual length of the gases arrays in mixtures. /// Set to the closest multiple of 4 relative to for SIMD reasons. /// - public static readonly int AdjustedNumberOfGases; + public const int AdjustedNumberOfGases = ((TotalNumberOfGases + 3) / 4) * 4; /// /// Amount of heat released per mole of burnt hydrogen or tritium (hydrogen isotope) diff --git a/Content.Shared/Atmos/EntitySystems/SharedGasTileOverlaySystem.cs b/Content.Shared/Atmos/EntitySystems/SharedGasTileOverlaySystem.cs index eb0079eb358..f468724db33 100644 --- a/Content.Shared/Atmos/EntitySystems/SharedGasTileOverlaySystem.cs +++ b/Content.Shared/Atmos/EntitySystems/SharedGasTileOverlaySystem.cs @@ -66,7 +66,10 @@ public static Vector2i GetGasChunkIndices(Vector2i indices) [Serializable, NetSerializable] public readonly struct GasOverlayData : IEquatable { + [ViewVariables] public readonly byte FireState; + + [ViewVariables] public readonly byte[] Opacity; // TODO change fire color based on temps diff --git a/Content.Shared/Maps/ContentTileDefinition.cs b/Content.Shared/Maps/ContentTileDefinition.cs index ce7980509eb..32f5db0e821 100644 --- a/Content.Shared/Maps/ContentTileDefinition.cs +++ b/Content.Shared/Maps/ContentTileDefinition.cs @@ -81,7 +81,11 @@ public sealed partial class ContentTileDefinition : IPrototype, IInheritingProto [DataField("itemDrop", customTypeSerializer:typeof(PrototypeIdSerializer))] public string ItemDropPrototypeName { get; private set; } = "FloorTileItemSteel"; - [DataField("isSpace")] public bool IsSpace { get; private set; } + // TODO rename data-field in yaml + /// + /// Whether or not the tile is exposed to the map's atmosphere. + /// + [DataField("isSpace")] public bool MapAtmosphere { get; private set; } /// /// Friction override for mob mover in diff --git a/Content.Shared/Maps/TurfHelpers.cs b/Content.Shared/Maps/TurfHelpers.cs index a87b8c97d15..58a5d133b55 100644 --- a/Content.Shared/Maps/TurfHelpers.cs +++ b/Content.Shared/Maps/TurfHelpers.cs @@ -11,22 +11,6 @@ namespace Content.Shared.Maps // That, or make the interface arguments non-optional so people stop failing to pass them in. public static class TurfHelpers { - /// - /// Attempts to get the turf at map indices with grid id or null if no such turf is found. - /// - public static TileRef GetTileRef(this Vector2i vector2i, EntityUid gridId, IMapManager? mapManager = null) - { - mapManager ??= IoCManager.Resolve(); - - if (!mapManager.TryGetGrid(gridId, out var grid)) - return default; - - if (!grid.TryGetTileRef(vector2i, out var tile)) - return default; - - return tile; - } - /// /// Attempts to get the turf at a certain coordinates or null if no such turf is found. /// @@ -67,7 +51,7 @@ public static ContentTileDefinition GetContentTileDefinition(this Tile tile, ITi /// public static bool IsSpace(this Tile tile, ITileDefinitionManager? tileDefinitionManager = null) { - return tile.GetContentTileDefinition(tileDefinitionManager).IsSpace; + return tile.GetContentTileDefinition(tileDefinitionManager).MapAtmosphere; } /// @@ -115,15 +99,6 @@ public static IEnumerable GetEntitiesInTile(this EntityCoordinates co return GetEntitiesInTile(turf.Value, flags, lookupSystem); } - /// - /// Helper that returns all entities in a turf. - /// - [Obsolete("Use the lookup system")] - public static IEnumerable GetEntitiesInTile(this Vector2i indices, EntityUid gridId, LookupFlags flags = LookupFlags.Static, EntityLookupSystem? lookupSystem = null) - { - return GetEntitiesInTile(indices.GetTileRef(gridId), flags, lookupSystem); - } - /// /// Checks if a turf has something dense on it. /// diff --git a/Resources/Locale/en-US/atmos/commands.ftl b/Resources/Locale/en-US/atmos/commands.ftl new file mode 100644 index 00000000000..692908d42ad --- /dev/null +++ b/Resources/Locale/en-US/atmos/commands.ftl @@ -0,0 +1,8 @@ +cmd-set-map-atmos-desc = Sets a map's atmosphere +cmd-set-map-atmos-help = setmapatmos [ [moles...]] +cmd-set-map-atmos-removed = Atmosphere removed from map {$map} +cmd-set-map-atmos-updated = Atmosphere set for map {$map} +cmd-set-map-atmos-hint-map = +cmd-set-map-atmos-hint-space = +cmd-set-map-atmos-hint-temp = (float) +cmd-set-map-atmos-hint-gas = <{$gas} moles> (float) From eb7a08980e85c492789d899b2e18520002233f27 Mon Sep 17 00:00:00 2001 From: SimpleStation14 <130339894+SimpleStation14@users.noreply.github.com> Date: Mon, 20 May 2024 15:56:20 -0700 Subject: [PATCH 002/155] Mirror: Store keybind priority (#365) ## Mirror of PR #26356: [Store keybind priority](https://github.com/space-wizards/space-station-14/pull/26356) from space-wizards [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `f7a1ffd0aab25d70ac185753d596469fc1e87480` PR opened by wrexbe at 2024-03-23 02:49:07 UTC --- PR changed 2 files with 2 additions and 1 deletions. The PR had the following labels: - Changes: UI ---

Original Body

> Changed it so the priority isn't lost when you set a binding in the UI. > Also added a priority to MoveStoredItem so it doesn't conflict with Use. > Fixes https://github.com/space-wizards/space-station-14/issues/26142 > Does not fix old keybinds files, so they will need to reset it, and rebind it. > > A better solution might be to change it so the keybinds are always in the order they appear in the default keybinds folder, to prevent the ordering from changing unpredictably based on what the user overrides.
Co-authored-by: SimpleStation14 --- Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs | 2 +- Resources/keybinds.yml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs b/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs index ce5cf421aef..f0537079b97 100644 --- a/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs +++ b/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs @@ -403,7 +403,7 @@ private void InputManagerOnFirstChanceOnKeyEvent(KeyEventArgs keyEvent, KeyEvent Mod1 = mods[0], Mod2 = mods[1], Mod3 = mods[2], - Priority = 0, + Priority = _currentlyRebinding.Binding?.Priority ?? 0, Type = bindType, CanFocus = key == Keyboard.Key.MouseLeft || key == Keyboard.Key.MouseRight diff --git a/Resources/keybinds.yml b/Resources/keybinds.yml index b8cfc40c1c4..346156159a7 100644 --- a/Resources/keybinds.yml +++ b/Resources/keybinds.yml @@ -167,6 +167,7 @@ binds: type: State key: MouseLeft canFocus: true + priority: 10 - function: RotateStoredItem type: State key: MouseRight From e5314b25a1042b431323d46f21e10302da5de19a Mon Sep 17 00:00:00 2001 From: SimpleStation14 <130339894+SimpleStation14@users.noreply.github.com> Date: Mon, 20 May 2024 15:56:51 -0700 Subject: [PATCH 003/155] Mirror: Removed Cannabis from thief objectives (#369) ## Mirror of PR #26412: [Removed Cannabis from thief objectives](https://github.com/space-wizards/space-station-14/pull/26412) from space-wizards [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `b44015bd554eb97a2d4762d7b585c71e43865571` PR opened by ChaseFlorom at 2024-03-24 21:40:14 UTC --- PR changed 3 files with 4 additions and 26 deletions. The PR had the following labels: - No C# - Status: Needs Review ---

Original Body

> > > > ## About the PR > > > Removed the cannabis objective from the thief objectives. > > ## Why / Balance > > > 20-30 cannabis leaves is neither fun for the thief, or for the botanist that they're asking to grow it. It doesn't fit with the heart of the thief objective system, as the only real way to accomplish it is to ask the botanist to grow it for you, or grow it yourself. Neither of which is stealing. > > Resolve [#26321] > > ## Technical details > > Removed the proper .yml code. > ## Media > > > - [x] I have added screenshots/videos to this PR showcasing its changes ingame, **or** this PR does not require an ingame showcase > > ## Breaking changes > > > **Changelog** > > :cl: > - remove: removed cannabis thief objective.
Co-authored-by: SimpleStation14 --- .../Objects/Specific/Hydroponics/leaves.yml | 8 ++------ .../Prototypes/Objectives/stealTargetGroups.yml | 7 +------ Resources/Prototypes/Objectives/thief.yml | 15 +-------------- 3 files changed, 4 insertions(+), 26 deletions(-) diff --git a/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/leaves.yml b/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/leaves.yml index e87fec22acc..b847416211d 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/leaves.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/leaves.yml @@ -17,8 +17,7 @@ reagents: - ReagentId: THC Quantity: 15 - - type: StealTarget - stealGroup: Cannabis + - type: entity name: dried cannabis leaves @@ -38,8 +37,6 @@ - type: Sprite sprite: Objects/Specific/Hydroponics/tobacco.rsi state: dried - - type: StealTarget - stealGroup: Cannabis - type: entity name: ground cannabis @@ -68,8 +65,7 @@ - Smokable - type: Item size: Tiny - - type: StealTarget - stealGroup: Cannabis + - type: entity name: tobacco leaves diff --git a/Resources/Prototypes/Objectives/stealTargetGroups.yml b/Resources/Prototypes/Objectives/stealTargetGroups.yml index fb1e5e76fc0..006c061666b 100644 --- a/Resources/Prototypes/Objectives/stealTargetGroups.yml +++ b/Resources/Prototypes/Objectives/stealTargetGroups.yml @@ -142,12 +142,7 @@ sprite: Objects/Misc/id_cards.rsi state: default -- type: stealTargetGroup - id: Cannabis - name: cannabis - sprite: - sprite: Objects/Specific/Hydroponics/cannabis.rsi - state: produce + - type: stealTargetGroup id: LAMP diff --git a/Resources/Prototypes/Objectives/thief.yml b/Resources/Prototypes/Objectives/thief.yml index 66258870d61..18154850973 100644 --- a/Resources/Prototypes/Objectives/thief.yml +++ b/Resources/Prototypes/Objectives/thief.yml @@ -142,20 +142,7 @@ - type: Objective difficulty: 0.7 -- type: entity - noSpawn: true - parent: BaseThiefStealCollectionObjective - id: CannabisStealCollectionObjective - components: - - type: NotJobRequirement - job: Botanist - - type: StealCondition - stealGroup: Cannabis - minCollectionSize: 20 - maxCollectionSize: 30 - verifyMapExistence: false - - type: Objective - difficulty: 0.5 + - type: entity noSpawn: true From feb7db5db8edad714fcf89a0555ac2a0bd622bb9 Mon Sep 17 00:00:00 2001 From: SimpleStation14 <130339894+SimpleStation14@users.noreply.github.com> Date: Mon, 20 May 2024 15:57:19 -0700 Subject: [PATCH 004/155] Mirror: Gives borg industrial welder (#370) ## Mirror of PR #26332: [Gives borg industrial welder](https://github.com/space-wizards/space-station-14/pull/26332) from space-wizards [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `1dff97901d5c4ea3f23cf29a9e6f1c2edebdbc27` PR opened by SoulFN at 2024-03-22 09:48:46 UTC --- PR changed 1 files with 1 additions and 1 deletions. The PR had the following labels: - No C# ---

Original Body

> > > > ## About the PR > Changes basic welder in borg tool module to industrial welder > > > ## Why / Balance > Basic welder sucks > > > ## Technical details > No > > > ## Media > > > - This PR does not require an ingame showcase > > ## Breaking changes > No > > > **Changelog** > :cl: > - tweak: The borg tool module now has an industrial welding tool. > > > >
Co-authored-by: SimpleStation14 --- .../Entities/Objects/Specific/Robotics/borg_modules.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml b/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml index 8d195a25bea..e14f29746dc 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml @@ -177,7 +177,7 @@ - Screwdriver - Wirecutter - Multitool - - Welder + - WelderIndustrial # cargo modules - type: entity From 156dfb61a88293d99024b784d580fec1ef5a3225 Mon Sep 17 00:00:00 2001 From: SimpleStation14 <130339894+SimpleStation14@users.noreply.github.com> Date: Mon, 20 May 2024 15:57:56 -0700 Subject: [PATCH 005/155] Mirror: Code cleanup: Purge obsoleted SharedPhysicsSystem methods (#384) ## Mirror of PR #26287: [Code cleanup: Purge obsoleted SharedPhysicsSystem methods](https://github.com/space-wizards/space-station-14/pull/26287) from space-wizards [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `964c6d54caae45b205a326143f56d6458a1bbc8a` PR opened by Tayrtahn at 2024-03-20 13:37:25 UTC --- PR changed 16 files with 43 additions and 43 deletions. The PR had the following labels: - Status: Needs Review ---

Original Body

> > > > Requires https://github.com/space-wizards/RobustToolbox/pull/4979 > > ## About the PR > > Cleans up some obsolete method calls. > > ## Why / Balance / Technical > > Cleaning up obsolete Dirty calls in RT required changing the signatures of some public methods in SharedPhysicsSystem. This updates the calls to those methods here in Content to use the new signatures passing in UIDs. > >
Co-authored-by: SimpleStation14 --- .../Administration/Systems/AdminVerbSystem.Smites.cs | 12 ++++++------ .../AtmosphereSystem.HighPressureDelta.cs | 8 ++++---- .../Chemistry/EntitySystems/VaporSystem.cs | 4 ++-- Content.Server/ImmovableRod/ImmovableRodSystem.cs | 6 +++--- .../ParticleAcceleratorSystem.Emitter.cs | 2 +- .../Physics/Controllers/ChasingWalkSystem.cs | 2 +- .../Systems/ShuttleSystem.FasterThanLight.cs | 8 ++++---- Content.Server/Shuttles/Systems/ShuttleSystem.cs | 8 ++++---- .../StationEvents/Events/MeteorSwarmRule.cs | 6 +++--- Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs | 2 +- .../Movement/Systems/SharedJetpackSystem.cs | 4 ++-- Content.Shared/Throwing/ThrowingSystem.cs | 6 +++--- Content.Shared/Throwing/ThrownItemSystem.cs | 2 +- .../Weapons/Melee/MeleeThrowOnHitSystem.cs | 4 ++-- Content.Shared/Weapons/Misc/SharedTetherGunSystem.cs | 10 +++++----- .../Weapons/Ranged/Systems/SharedGunSystem.cs | 2 +- 16 files changed, 43 insertions(+), 43 deletions(-) diff --git a/Content.Server/Administration/Systems/AdminVerbSystem.Smites.cs b/Content.Server/Administration/Systems/AdminVerbSystem.Smites.cs index 8a819f59420..8ee52ad03e7 100644 --- a/Content.Server/Administration/Systems/AdminVerbSystem.Smites.cs +++ b/Content.Server/Administration/Systems/AdminVerbSystem.Smites.cs @@ -409,7 +409,7 @@ private void AddSmiteVerbs(GetVerbsEvent args) var fixtures = Comp(args.Target); xform.Anchored = false; // Just in case. _physics.SetBodyType(args.Target, BodyType.Dynamic, manager: fixtures, body: physics); - _physics.SetBodyStatus(physics, BodyStatus.InAir); + _physics.SetBodyStatus(args.Target, physics, BodyStatus.InAir); _physics.WakeBody(args.Target, manager: fixtures, body: physics); foreach (var fixture in fixtures.Fixtures.Values) @@ -424,8 +424,8 @@ private void AddSmiteVerbs(GetVerbsEvent args) _physics.SetLinearVelocity(args.Target, _random.NextVector2(1.5f, 1.5f), manager: fixtures, body: physics); _physics.SetAngularVelocity(args.Target, MathF.PI * 12, manager: fixtures, body: physics); - _physics.SetLinearDamping(physics, 0f); - _physics.SetAngularDamping(physics, 0f); + _physics.SetLinearDamping(args.Target, physics, 0f); + _physics.SetAngularDamping(args.Target, physics, 0f); }, Impact = LogImpact.Extreme, Message = Loc.GetString("admin-smite-pinball-description") @@ -444,7 +444,7 @@ private void AddSmiteVerbs(GetVerbsEvent args) xform.Anchored = false; // Just in case. _physics.SetBodyType(args.Target, BodyType.Dynamic, body: physics); - _physics.SetBodyStatus(physics, BodyStatus.InAir); + _physics.SetBodyStatus(args.Target, physics, BodyStatus.InAir); _physics.WakeBody(args.Target, manager: fixtures, body: physics); foreach (var fixture in fixtures.Fixtures.Values) @@ -454,8 +454,8 @@ private void AddSmiteVerbs(GetVerbsEvent args) _physics.SetLinearVelocity(args.Target, _random.NextVector2(8.0f, 8.0f), manager: fixtures, body: physics); _physics.SetAngularVelocity(args.Target, MathF.PI * 12, manager: fixtures, body: physics); - _physics.SetLinearDamping(physics, 0f); - _physics.SetAngularDamping(physics, 0f); + _physics.SetLinearDamping(args.Target, physics, 0f); + _physics.SetAngularDamping(args.Target, physics, 0f); }, Impact = LogImpact.Extreme, Message = Loc.GetString("admin-smite-yeet-description") diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.HighPressureDelta.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.HighPressureDelta.cs index b0c823426d6..77b5bf18af2 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.HighPressureDelta.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.HighPressureDelta.cs @@ -52,7 +52,7 @@ private void UpdateHighPressure(float frameTime) if (HasComp(uid) && TryComp(uid, out var body)) { - _physics.SetBodyStatus(body, BodyStatus.OnGround); + _physics.SetBodyStatus(uid, body, BodyStatus.OnGround); } if (TryComp(uid, out var fixtures)) @@ -75,7 +75,7 @@ private void AddMobMovedByPressure(EntityUid uid, MovedByPressureComponent compo if (!TryComp(uid, out var fixtures)) return; - _physics.SetBodyStatus(body, BodyStatus.InAir); + _physics.SetBodyStatus(uid, body, BodyStatus.InAir); foreach (var (id, fixture) in fixtures.Fixtures) { @@ -94,9 +94,9 @@ private void HighPressureMovements(Entity gridAtmospher // TODO ATMOS finish this // Don't play the space wind sound on tiles that are on fire... - if(tile.PressureDifference > 15 && !tile.Hotspot.Valid) + if (tile.PressureDifference > 15 && !tile.Hotspot.Valid) { - if(_spaceWindSoundCooldown == 0 && !string.IsNullOrEmpty(SpaceWindSound)) + if (_spaceWindSoundCooldown == 0 && !string.IsNullOrEmpty(SpaceWindSound)) { var coordinates = _mapSystem.ToCenterCoordinates(tile.GridIndex, tile.GridIndices); _audio.PlayPvs(SpaceWindSound, coordinates, AudioParams.Default.WithVariation(0.125f).WithVolume(MathHelper.Clamp(tile.PressureDifference / 10, 10, 100))); diff --git a/Content.Server/Chemistry/EntitySystems/VaporSystem.cs b/Content.Server/Chemistry/EntitySystems/VaporSystem.cs index d945c1f818b..7d3f70bc0d8 100644 --- a/Content.Server/Chemistry/EntitySystems/VaporSystem.cs +++ b/Content.Server/Chemistry/EntitySystems/VaporSystem.cs @@ -64,8 +64,8 @@ public void Start(Entity vapor, TransformComponent vaporXform, V // Set Move if (EntityManager.TryGetComponent(vapor, out PhysicsComponent? physics)) { - _physics.SetLinearDamping(physics, 0f); - _physics.SetAngularDamping(physics, 0f); + _physics.SetLinearDamping(vapor, physics, 0f); + _physics.SetAngularDamping(vapor, physics, 0f); _throwing.TryThrow(vapor, dir, speed, user: user); diff --git a/Content.Server/ImmovableRod/ImmovableRodSystem.cs b/Content.Server/ImmovableRod/ImmovableRodSystem.cs index 0fa8f7d292f..31aa39cf03a 100644 --- a/Content.Server/ImmovableRod/ImmovableRodSystem.cs +++ b/Content.Server/ImmovableRod/ImmovableRodSystem.cs @@ -53,9 +53,9 @@ private void OnMapInit(EntityUid uid, ImmovableRodComponent component, MapInitEv { if (EntityManager.TryGetComponent(uid, out PhysicsComponent? phys)) { - _physics.SetLinearDamping(phys, 0f); - _physics.SetFriction(phys, 0f); - _physics.SetBodyStatus(phys, BodyStatus.InAir); + _physics.SetLinearDamping(uid, phys, 0f); + _physics.SetFriction(uid, phys, 0f); + _physics.SetBodyStatus(uid, phys, BodyStatus.InAir); if (!component.RandomizeVelocity) return; diff --git a/Content.Server/ParticleAccelerator/EntitySystems/ParticleAcceleratorSystem.Emitter.cs b/Content.Server/ParticleAccelerator/EntitySystems/ParticleAcceleratorSystem.Emitter.cs index 46b25163cc0..06f1b6b154c 100644 --- a/Content.Server/ParticleAccelerator/EntitySystems/ParticleAcceleratorSystem.Emitter.cs +++ b/Content.Server/ParticleAccelerator/EntitySystems/ParticleAcceleratorSystem.Emitter.cs @@ -28,7 +28,7 @@ private void FireEmitter(EntityUid uid, ParticleAcceleratorPowerState strength, if (TryComp(emitted, out var particlePhys)) { var angle = _transformSystem.GetWorldRotation(uid, xformQuery); - _physicsSystem.SetBodyStatus(particlePhys, BodyStatus.InAir); + _physicsSystem.SetBodyStatus(emitted, particlePhys, BodyStatus.InAir); var velocity = angle.ToWorldVec() * 20f; if (TryComp(uid, out var phys)) diff --git a/Content.Server/Physics/Controllers/ChasingWalkSystem.cs b/Content.Server/Physics/Controllers/ChasingWalkSystem.cs index 215e7e3124e..618dd4156fc 100644 --- a/Content.Server/Physics/Controllers/ChasingWalkSystem.cs +++ b/Content.Server/Physics/Controllers/ChasingWalkSystem.cs @@ -97,6 +97,6 @@ private void ForceImpulse(EntityUid uid, ChasingWalkComponent component) var speed = delta.Length() > 0 ? delta.Normalized() * component.Speed : Vector2.Zero; _physics.SetLinearVelocity(uid, speed); - _physics.SetBodyStatus(physics, BodyStatus.InAir); //If this is not done, from the explosion up close, the tesla will "Fall" to the ground, and almost stop moving. + _physics.SetBodyStatus(uid, physics, BodyStatus.InAir); //If this is not done, from the explosion up close, the tesla will "Fall" to the ground, and almost stop moving. } } diff --git a/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs b/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs index f9ceab8f7b1..e4e4534b0c5 100644 --- a/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs +++ b/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs @@ -371,8 +371,8 @@ private void UpdateFTLStarting(Entity entity) Enable(uid, component: body); _physics.SetLinearVelocity(uid, new Vector2(0f, 20f), body: body); _physics.SetAngularVelocity(uid, 0f, body: body); - _physics.SetLinearDamping(body, 0f); - _physics.SetAngularDamping(body, 0f); + _physics.SetLinearDamping(uid, body, 0f); + _physics.SetAngularDamping(uid, body, 0f); _dockSystem.SetDockBolts(uid, true); _console.RefreshShuttleConsoles(uid); @@ -426,8 +426,8 @@ private void UpdateFTLArriving(Entity entity) _physics.SetLinearVelocity(uid, Vector2.Zero, body: body); _physics.SetAngularVelocity(uid, 0f, body: body); - _physics.SetLinearDamping(body, entity.Comp2.LinearDamping); - _physics.SetAngularDamping(body, entity.Comp2.AngularDamping); + _physics.SetLinearDamping(uid, body, entity.Comp2.LinearDamping); + _physics.SetAngularDamping(uid, body, entity.Comp2.AngularDamping); var target = entity.Comp1.TargetCoordinates; diff --git a/Content.Server/Shuttles/Systems/ShuttleSystem.cs b/Content.Server/Shuttles/Systems/ShuttleSystem.cs index 8d44dae4b2e..7c42753a7de 100644 --- a/Content.Server/Shuttles/Systems/ShuttleSystem.cs +++ b/Content.Server/Shuttles/Systems/ShuttleSystem.cs @@ -129,10 +129,10 @@ public void Enable(EntityUid uid, FixturesComponent? manager = null, PhysicsComp return; _physics.SetBodyType(uid, BodyType.Dynamic, manager: manager, body: component); - _physics.SetBodyStatus(component, BodyStatus.InAir); + _physics.SetBodyStatus(uid, component, BodyStatus.InAir); _physics.SetFixedRotation(uid, false, manager: manager, body: component); - _physics.SetLinearDamping(component, shuttle.LinearDamping); - _physics.SetAngularDamping(component, shuttle.AngularDamping); + _physics.SetLinearDamping(uid, component, shuttle.LinearDamping); + _physics.SetAngularDamping(uid, component, shuttle.AngularDamping); } public void Disable(EntityUid uid, FixturesComponent? manager = null, PhysicsComponent? component = null) @@ -141,7 +141,7 @@ public void Disable(EntityUid uid, FixturesComponent? manager = null, PhysicsCom return; _physics.SetBodyType(uid, BodyType.Static, manager: manager, body: component); - _physics.SetBodyStatus(component, BodyStatus.OnGround); + _physics.SetBodyStatus(uid, component, BodyStatus.OnGround); _physics.SetFixedRotation(uid, true, manager: manager, body: component); } diff --git a/Content.Server/StationEvents/Events/MeteorSwarmRule.cs b/Content.Server/StationEvents/Events/MeteorSwarmRule.cs index 192a620c9fc..ad56479b379 100644 --- a/Content.Server/StationEvents/Events/MeteorSwarmRule.cs +++ b/Content.Server/StationEvents/Events/MeteorSwarmRule.cs @@ -68,9 +68,9 @@ protected override void ActiveTick(EntityUid uid, MeteorSwarmRuleComponent compo var spawnPosition = new MapCoordinates(center + offset, mapId); var meteor = Spawn("MeteorLarge", spawnPosition); var physics = EntityManager.GetComponent(meteor); - _physics.SetBodyStatus(physics, BodyStatus.InAir); - _physics.SetLinearDamping(physics, 0f); - _physics.SetAngularDamping(physics, 0f); + _physics.SetBodyStatus(meteor, physics, BodyStatus.InAir); + _physics.SetLinearDamping(meteor, physics, 0f); + _physics.SetAngularDamping(meteor, physics, 0f); _physics.ApplyLinearImpulse(meteor, -offset.Normalized() * component.MeteorVelocity * physics.Mass, body: physics); _physics.ApplyAngularImpulse( meteor, diff --git a/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs b/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs index b58bdf83e49..8172947a039 100644 --- a/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs +++ b/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs @@ -358,7 +358,7 @@ public bool TryBuckle(EntityUid buckleUid, EntityUid userUid, EntityUid strapUid if (TryComp(buckleUid, out var physics)) { - _physics.ResetDynamics(physics); + _physics.ResetDynamics(buckleUid, physics); } if (!buckleComp.PullStrap && TryComp(strapUid, out var toPullable)) diff --git a/Content.Shared/Movement/Systems/SharedJetpackSystem.cs b/Content.Shared/Movement/Systems/SharedJetpackSystem.cs index abe12b79d1a..8c42511f846 100644 --- a/Content.Shared/Movement/Systems/SharedJetpackSystem.cs +++ b/Content.Shared/Movement/Systems/SharedJetpackSystem.cs @@ -92,7 +92,7 @@ private void SetupUser(EntityUid user, EntityUid jetpackUid) _mover.SetRelay(user, jetpackUid); if (TryComp(user, out var physics)) - _physics.SetBodyStatus(physics, BodyStatus.InAir); + _physics.SetBodyStatus(user, physics, BodyStatus.InAir); userComp.Jetpack = jetpackUid; } @@ -103,7 +103,7 @@ private void RemoveUser(EntityUid uid) return; if (TryComp(uid, out var physics)) - _physics.SetBodyStatus(physics, BodyStatus.OnGround); + _physics.SetBodyStatus(uid, physics, BodyStatus.OnGround); RemComp(uid); } diff --git a/Content.Shared/Throwing/ThrowingSystem.cs b/Content.Shared/Throwing/ThrowingSystem.cs index 54294318315..01682863389 100644 --- a/Content.Shared/Throwing/ThrowingSystem.cs +++ b/Content.Shared/Throwing/ThrowingSystem.cs @@ -160,7 +160,7 @@ public void TryThrow(EntityUid uid, } else { - _physics.SetBodyStatus(physics, BodyStatus.InAir); + _physics.SetBodyStatus(uid, physics, BodyStatus.InAir); } if (user == null) @@ -176,10 +176,10 @@ public void TryThrow(EntityUid uid, { var msg = new ThrowPushbackAttemptEvent(); RaiseLocalEvent(uid, msg); - const float MassLimit = 5f; + const float massLimit = 5f; if (!msg.Cancelled) - _physics.ApplyLinearImpulse(user.Value, -impulseVector / physics.Mass * pushbackRatio * MathF.Min(MassLimit, physics.Mass), body: userPhysics); + _physics.ApplyLinearImpulse(user.Value, -impulseVector / physics.Mass * pushbackRatio * MathF.Min(massLimit, physics.Mass), body: userPhysics); } } } diff --git a/Content.Shared/Throwing/ThrownItemSystem.cs b/Content.Shared/Throwing/ThrownItemSystem.cs index b3b5bcf7870..cc50094e3dd 100644 --- a/Content.Shared/Throwing/ThrownItemSystem.cs +++ b/Content.Shared/Throwing/ThrownItemSystem.cs @@ -93,7 +93,7 @@ public void StopThrow(EntityUid uid, ThrownItemComponent thrownItemComponent) { if (TryComp(uid, out var physics)) { - _physics.SetBodyStatus(physics, BodyStatus.OnGround); + _physics.SetBodyStatus(uid, physics, BodyStatus.OnGround); if (physics.Awake) _broadphase.RegenerateContacts(uid, physics); diff --git a/Content.Shared/Weapons/Melee/MeleeThrowOnHitSystem.cs b/Content.Shared/Weapons/Melee/MeleeThrowOnHitSystem.cs index e840bd1ddd5..e0696022606 100644 --- a/Content.Shared/Weapons/Melee/MeleeThrowOnHitSystem.cs +++ b/Content.Shared/Weapons/Melee/MeleeThrowOnHitSystem.cs @@ -74,7 +74,7 @@ private void OnThrownStartup(Entity ent, ref ComponentStar comp.PreviousStatus = body.BodyStatus; comp.ThrownEndTime = _timing.CurTime + TimeSpan.FromSeconds(comp.Lifetime); comp.MinLifetimeTime = _timing.CurTime + TimeSpan.FromSeconds(comp.MinLifetime); - _physics.SetBodyStatus(body, BodyStatus.InAir); + _physics.SetBodyStatus(ent, body, BodyStatus.InAir); _physics.SetLinearVelocity(ent, Vector2.Zero, body: body); _physics.ApplyLinearImpulse(ent, comp.Velocity * body.Mass, body: body); Dirty(ent, ent.Comp); @@ -83,7 +83,7 @@ private void OnThrownStartup(Entity ent, ref ComponentStar private void OnThrownShutdown(Entity ent, ref ComponentShutdown args) { if (TryComp(ent, out var body)) - _physics.SetBodyStatus(body,ent.Comp.PreviousStatus); + _physics.SetBodyStatus(ent, body, ent.Comp.PreviousStatus); var ev = new MeleeThrowOnHitEndEvent(); RaiseLocalEvent(ent, ref ev); } diff --git a/Content.Shared/Weapons/Misc/SharedTetherGunSystem.cs b/Content.Shared/Weapons/Misc/SharedTetherGunSystem.cs index 177cb310d18..3a950bcd29e 100644 --- a/Content.Shared/Weapons/Misc/SharedTetherGunSystem.cs +++ b/Content.Shared/Weapons/Misc/SharedTetherGunSystem.cs @@ -207,12 +207,12 @@ protected virtual void StartTether(EntityUid gunUid, BaseForceGunComponent compo TransformSystem.Unanchor(target, targetXform); component.Tethered = target; var tethered = EnsureComp(target); - _physics.SetBodyStatus(targetPhysics, BodyStatus.InAir, false); + _physics.SetBodyStatus(target, targetPhysics, BodyStatus.InAir, false); _physics.SetSleepingAllowed(target, targetPhysics, false); tethered.Tetherer = gunUid; tethered.OriginalAngularDamping = targetPhysics.AngularDamping; - _physics.SetAngularDamping(targetPhysics, 0f); - _physics.SetLinearDamping(targetPhysics, 0f); + _physics.SetAngularDamping(target, targetPhysics, 0f); + _physics.SetLinearDamping(target, targetPhysics, 0f); _physics.SetAngularVelocity(target, SpinVelocity, body: targetPhysics); _physics.WakeBody(target, body: targetPhysics); var thrown = EnsureComp(component.Tethered.Value); @@ -264,9 +264,9 @@ protected virtual void StopTether(EntityUid gunUid, BaseForceGunComponent compon _thrown.StopThrow(component.Tethered.Value, thrown); } - _physics.SetBodyStatus(targetPhysics, BodyStatus.OnGround); + _physics.SetBodyStatus(component.Tethered.Value, targetPhysics, BodyStatus.OnGround); _physics.SetSleepingAllowed(component.Tethered.Value, targetPhysics, true); - _physics.SetAngularDamping(targetPhysics, Comp(component.Tethered.Value).OriginalAngularDamping); + _physics.SetAngularDamping(component.Tethered.Value, targetPhysics, Comp(component.Tethered.Value).OriginalAngularDamping); } if (!transfer) diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs index 36b5bbd1927..d3aee5a48e9 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs @@ -388,7 +388,7 @@ public abstract void Shoot( public void ShootProjectile(EntityUid uid, Vector2 direction, Vector2 gunVelocity, EntityUid gunUid, EntityUid? user = null, float speed = 20f) { var physics = EnsureComp(uid); - Physics.SetBodyStatus(physics, BodyStatus.InAir); + Physics.SetBodyStatus(uid, physics, BodyStatus.InAir); var targetMapVelocity = gunVelocity + direction.Normalized() * speed; var currentMapVelocity = Physics.GetMapLinearVelocity(uid, physics); From 8d6c536d27fe2fc8c283c89cf343a0f6674fcfb3 Mon Sep 17 00:00:00 2001 From: LovelyLophi <111106265+LovelyLophi@users.noreply.github.com> Date: Tue, 21 May 2024 23:35:11 -0400 Subject: [PATCH 006/155] Alternate Corporate Coats Wave 1 (#392) # Description Edited the corporate coat by Leonardo DaBepis, Thought we could have some more options for assistant gang colors. /j ---

Media

![image](https://github.com/Simple-Station/Einstein-Engines/assets/111106265/2403c399-27ec-42d5-8f3a-2785741cb045) WAOW THEY LOOK SO COOOL RIGHT?

--- # Changelog :cl: - add: Added a number of new corporate coats to the Clothesmate. --------- Co-authored-by: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com> Co-authored-by: VMSolidus Co-authored-by: Danger Revolution! <142105406+DangerRevolution@users.noreply.github.com> --- .../Catalog/Cargo/cargo_vending.yml | 2 +- .../Inventories/clothesmate.yml | 5 ++ .../Clothing/OuterClothing/wintercoats.yml | 55 ++++++++++++++++++ .../equipped-OUTERCLOTHING.png | Bin 0 -> 8610 bytes .../WinterCoats/cs_corpo_jacket.rsi/icon.png | Bin 0 -> 5930 bytes .../WinterCoats/cs_corpo_jacket.rsi/meta.json | 18 ++++++ .../equipped-OUTERCLOTHING.png | Bin 0 -> 8514 bytes .../WinterCoats/ee_corpo_jacket.rsi/icon.png | Bin 0 -> 6063 bytes .../WinterCoats/ee_corpo_jacket.rsi/meta.json | 18 ++++++ .../equipped-OUTERCLOTHING.png | Bin 0 -> 8310 bytes .../WinterCoats/hi_corpo_jacket.rsi/icon.png | Bin 0 -> 5980 bytes .../WinterCoats/hi_corpo_jacket.rsi/meta.json | 18 ++++++ .../equipped-OUTERCLOTHING.png | Bin 0 -> 9341 bytes .../WinterCoats/hm_corpo_jacket.rsi/icon.png | Bin 0 -> 6169 bytes .../WinterCoats/hm_corpo_jacket.rsi/meta.json | 18 ++++++ .../equipped-OUTERCLOTHING.png | Bin 0 -> 9025 bytes .../WinterCoats/id_corpo_jacket.rsi/icon.png | Bin 0 -> 5955 bytes .../WinterCoats/id_corpo_jacket.rsi/meta.json | 18 ++++++ 18 files changed, 151 insertions(+), 1 deletion(-) create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi/equipped-OUTERCLOTHING.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi/icon.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi/meta.json create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi/equipped-OUTERCLOTHING.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi/icon.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi/meta.json create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/hi_corpo_jacket.rsi/equipped-OUTERCLOTHING.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/hi_corpo_jacket.rsi/icon.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/hi_corpo_jacket.rsi/meta.json create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/hm_corpo_jacket.rsi/equipped-OUTERCLOTHING.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/hm_corpo_jacket.rsi/icon.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/hm_corpo_jacket.rsi/meta.json create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/id_corpo_jacket.rsi/equipped-OUTERCLOTHING.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/id_corpo_jacket.rsi/icon.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/id_corpo_jacket.rsi/meta.json diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml b/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml index 2165fb4e585..d0ae444bf77 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml @@ -33,7 +33,7 @@ sprite: Objects/Specific/Service/vending_machine_restock.rsi state: base product: CrateVendingMachineRestockClothesFilled - cost: 7245 + cost: 8050 category: cargoproduct-category-name-service group: market diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml index 1dbc412a9c8..04cc2e3e19d 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml @@ -85,6 +85,11 @@ ClothingOuterCoatLettermanRed: 2 # Nyano - Clothing addition ClothingOuterDenimJacket: 2 # DeltaV - Clothing addition ClothingOuterCorporateJacket: 2 # DeltaV - Clothing addition + ClothingOuterCsCorporateJacket: 2 # Einstein Engines - Clothing addition + ClothingOuterEECorporateJacket: 2 # Einstein Engines - Clothing addition + ClothingOuterHICorporateJacket: 2 # Einstein Engines - Clothing addition + ClothingOuterHMCorporateJacket: 2 # Einstein Engines - Clothing addition + ClothingOuterIdCorporateJacket: 2 # Einstein Engines - Clothing addition ClothingShoesBootsFishing: 2 # Nyano - Clothing addition ClothingHeadTinfoil: 2 # Nyano - Clothing addition ClothingHeadFishCap: 2 diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/wintercoats.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/wintercoats.yml index 4f0a0d0aafa..d45e8c3f3c2 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/wintercoats.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/wintercoats.yml @@ -541,3 +541,58 @@ Quantity: 20 - type: ToggleableClothing clothingPrototype: ClothingHeadHatHoodWinterWeb + +- type: entity + parent: ClothingOuterWinterCoat + id: ClothingOuterCsCorporateJacket + name: Cybersun Corporate Jacket + description: A cozy jacket with the Cybersun logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. + components: + - type: Sprite + sprite: Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi + - type: Clothing + sprite: Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi + +- type: entity + parent: ClothingOuterWinterCoat + id: ClothingOuterEECorporateJacket + name: Einstein Engines Corporate Jacket + description: A cozy jacket with the Einstein Engines logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. + components: + - type: Sprite + sprite: Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi + - type: Clothing + sprite: Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi + +- type: entity + parent: ClothingOuterWinterCoat + id: ClothingOuterHICorporateJacket + name: Hephaestus Industries Corporate Jacket + description: A cozy jacket with the Hephaestus Industries logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. + components: + - type: Sprite + sprite: Clothing/OuterClothing/WinterCoats/hi_corpo_jacket.rsi + - type: Clothing + sprite: Clothing/OuterClothing/WinterCoats/hi_corpo_jacket.rsi + +- type: entity + parent: ClothingOuterWinterCoat + id: ClothingOuterHMCorporateJacket + name: Hawkmoon Acquisitions Corporate Jacket + description: A cozy jacket with the Hawkmoon Acquisitions logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. + components: + - type: Sprite + sprite: Clothing/OuterClothing/WinterCoats/hm_corpo_jacket.rsi + - type: Clothing + sprite: Clothing/OuterClothing/WinterCoats/hm_corpo_jacket.rsi + +- type: entity + parent: ClothingOuterWinterCoat + id: ClothingOuterIdCorporateJacket + name: Interdyne Corporate Jacket + description: A cozy jacket with the Interdyne logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. + components: + - type: Sprite + sprite: Clothing/OuterClothing/WinterCoats/id_corpo_jacket.rsi + - type: Clothing + sprite: Clothing/OuterClothing/WinterCoats/id_corpo_jacket.rsi diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..73e230e8a5f2088cbea061e045059ab6e5c52140 GIT binary patch literal 8610 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f78a89945c3732976cfac3674fea17d416a0bbe7 GIT binary patch literal 5930 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 Y6YmP{KCGw>f(VDXJ9|4FUK=U<7ye`^m;e9( literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi/meta.json new file mode 100644 index 00000000000..42d21c3d8ab --- /dev/null +++ b/Resources/Textures/Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "leonardo_dabepis on discord / @leonardo-dabepis on Tumblr, Edited by heartparkyheart on Discord", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..983c2534f4ceffdb575394b6b2077e250a9a07e1 GIT binary patch literal 8514 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 C=v7$& literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ba72253098481f5f357ad1a0fd752a9c1b23a2d5 GIT binary patch literal 6063 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 NoE=>4&)9BC_#YSooM`|6 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi/meta.json new file mode 100644 index 00000000000..42d21c3d8ab --- /dev/null +++ b/Resources/Textures/Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "leonardo_dabepis on discord / @leonardo-dabepis on Tumblr, Edited by heartparkyheart on Discord", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/hi_corpo_jacket.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/hi_corpo_jacket.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..f18a64ab9c0c4012305f51ab70dc2710c1131824 GIT binary patch literal 8310 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 B7?S`1 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/hm_corpo_jacket.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/hm_corpo_jacket.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d80b56558a23c7c523173d543ae370b835f48ac8 GIT binary patch literal 6169 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 G68{IREn~+3 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/id_corpo_jacket.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/WinterCoats/id_corpo_jacket.rsi/meta.json new file mode 100644 index 00000000000..42d21c3d8ab --- /dev/null +++ b/Resources/Textures/Clothing/OuterClothing/WinterCoats/id_corpo_jacket.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "leonardo_dabepis on discord / @leonardo-dabepis on Tumblr, Edited by heartparkyheart on Discord", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + } + ] +} From 9d84bbed2d276af7c5a7804dfbbd01078d91003c Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Wed, 22 May 2024 03:35:32 +0000 Subject: [PATCH 007/155] Automatic Changelog Update (#392) --- Resources/Changelog/Changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 954f86aa044..60f2d8f14c4 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4080,3 +4080,9 @@ Entries: you join when someone leaves. id: 6110 time: '2024-05-13T04:58:39.0000000+00:00' +- author: LovelyLophi + changes: + - type: Add + message: Added a number of new corporate coats to the Clothesmate. + id: 6111 + time: '2024-05-22T03:35:11.0000000+00:00' From f74e16ca39ff59c96d20a143115606a4fe100e6b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 25 May 2024 18:25:02 -0700 Subject: [PATCH 008/155] Update Credits (#419) --- Resources/Credits/GitHub.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Credits/GitHub.txt b/Resources/Credits/GitHub.txt index 3aea674fd94..db58663a2b2 100644 --- a/Resources/Credits/GitHub.txt +++ b/Resources/Credits/GitHub.txt @@ -1 +1 @@ -0x6273, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 4dplanner, 612git, 778b, Ablankmann, Acruid, actioninja, adamsong, Admiral-Obvious-001, Adrian16199, Aerocrux, Aexxie, africalimedrop, Agoichi, Ahion, AJCM-git, AjexRose, Alekshhh, AlexMorgan3817, AlmondFlour, AlphaQwerty, Altoids1, amylizzle, ancientpower, ArchPigeon, Arendian, arimah, Arteben, AruMoon, as334, AsikKEsel, asperger-sind, aspiringLich, avghdev, AzzyIsNotHere, BananaFlambe, BasedUser, BGare, BingoJohnson-zz, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, Boaz1111, BobdaBiscuit, brainfood1183, Brandon-Huu, Bribrooo, Bright0, brndd, BubblegumBlue, BYONDFuckery, c4llv07e, CakeQ, CaptainSqrBeard, Carbonhell, Carolyn3114, casperr04, CatTheSystem, Centronias, chairbender, Charlese2, Cheackraze, cheesePizza2, Chief-Engineer, chromiumboy, Chronophylos, clement-or, Clyybber, ColdAutumnRain, Colin-Tel, collinlunn, ComicIronic, coolmankid12345, corentt, crazybrain23, creadth, CrigCrag, Crotalus, CrudeWax, CrzyPotato, Cyberboss, d34d10cc, Daemon, daerSeebaer, dahnte, dakamakat, dakimasu, DamianX, DangerRevolution, daniel-cr, Darkenson, DawBla, dch-GH, Deahaka, DEATHB4DEFEAT, DeathCamel58, deathride58, DebugOk, Decappi, deepdarkdepths, Delete69, deltanedas, DeltaV-Bot, DerbyX, DoctorBeard, DogZeroX, dontbetank, Doru991, DoubleRiceEddiedd, DrMelon, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, Duddino, Dutch-VanDerLinde, Easypoller, eclips_e, EdenTheLiznerd, EEASAS, Efruit, ElectroSR, elthundercloud, Emisse, EmoGarbage404, Endecc, enumerate0, eoineoineoin, ERORR404V1, Errant-4, estacaoespacialpirata, exincore, exp111, Fahasor, FairlySadPanda, ficcialfaint, Fildrance, FillerVK, Fishfish458, Flareguy, FluffiestFloof, FluidRock, FoLoKe, fooberticus, Fortune117, freeman2651, Fromoriss, FungiFellow, GalacticChimp, gbasood, Geekyhobo, Genkail, Git-Nivrak, github-actions[bot], gituhabu, GNF54, Golinth, GoodWheatley, Gotimanga, graevy, GreyMario, Guess-My-Name, gusxyz, h3half, Hanzdegloker, Hardly3D, harikattar, Hebiman, Henry12116, HerCoyote23, Hmeister-real, HoofedEar, hord-brayden, hubismal, Hugal31, Hyenh, iacore, IamVelcroboy, icekot8, igorsaux, ike709, Illiux, Ilya246, IlyaElDunaev, Injazz, Insineer, IntegerTempest, Interrobang01, IProduceWidgets, ItsMeThom, j-giebel, Jackal298, Jackrost, jamessimo, janekvap, JerryImMouse, Jessetriesagain, jessicamaybe, Jezithyr, jicksaw, JiimBob, JoeHammad1844, joelhed, JohnGinnane, johnku1, joshepvodka, jproads, Jrpl, juliangiebel, JustArt1m, JustCone14, JustinTether, JustinTrotter, KaiShibaa, kalane15, kalanosh, KEEYNy, Keikiru, Kelrak, kerisargit, keronshb, KIBORG04, Killerqu00, KingFroozy, kira-er, Kit0vras, KittenColony, Kmc2000, Ko4ergaPunk, komunre, koteq, Krunklehorn, Kukutis96513, kxvvv, Lamrr, LankLTE, lapatison, Leander-0, leonardo-dabepis, LetterN, Level10Cybermancer, lever1209, LightVillet, liltenhead, LittleBuilderJane, Lomcastar, LordCarve, LordEclipse, LudwigVonChesterfield, Lukasz825700516, lunarcomets, luringens, lvvova1, lzimann, lzk228, M3739, MACMAN2003, Macoron, MagnusCrowe, ManelNavola, matthst, Matz05, MehimoNemo, MeltedPixel, MemeProof, Menshin, Mervill, metalgearsloth, mhamsterr, MilenVolf, Minty642, Mirino97, mirrorcult, MishaUnity, MisterMecky, Mith-randalf, Moneyl, Moomoobeef, moony, Morb0, Mr0maks, musicmanvr, Myakot, Myctai, N3X15, Nairodian, Naive817, namespace-Memory, NickPowers43, nikthechampiongr, Nimfar11, Nirnael, nmajask, nok-ko, Nopey, notafet, notquitehadouken, noudoit, noverd, nuke-haus, NULL882, OCOtheOmega, OctoRocket, OldDanceJacket, onoira, Owai-Seek, pali6, Pangogie, patrikturi, PaulRitter, Peptide90, peptron1, Phantom-Lily, PHCodes, PixelTheKermit, PJB3005, Plykiya, pofitlo, pointer-to-null, PolterTzi, PoorMansDreams, potato1234x, ProfanedBane, PrPleGoo, ps3moira, Psychpsyo, psykzz, PuroSlavKing, quatre, QuietlyWhisper, qwerltaz, Radosvik, Radrark, Rainbeon, Rainfey, Rane, ravage123321, rbertoche, Redict, RedlineTriad, RednoWCirabrab, RemberBM, RemieRichards, RemTim, rene-descartes2021, RiceMar1244, RieBi, Rinkashikachi, Rockdtben, rolfero, rosieposieeee, Saakra, Samsterious, SaphireLattice, ScalyChimp, scrato, Scribbles0, Serkket, SethLafuente, ShadowCommander, Shadowtheprotogen546, SignalWalker, SimpleStation14, Simyon264, SirDragooon, Sirionaut, siyengar04, Skarletto, Skrauz, Skyedra, SlamBamActionman, Slava0135, Snowni, snowsignal, SonicHDC, SoulSloth, SpaceManiac, SpeltIncorrectyl, spoogemonster, ssdaniel24, Stealthbomber16, stellar-novas, StrawberryMoses, Subversionary, SweptWasTaken, Szunti, TadJohnson00, takemysoult, TaralGit, Tayrtahn, tday93, TekuNut, TemporalOroboros, tentekal, tgrkzus, thatrandomcanadianguy, TheArturZh, theashtronaut, thedraccx, themias, Theomund, theOperand, TheShuEd, TimrodDX, Titian3, tkdrg, tmtmtl30, tom-leys, tomasalves8, Tomeno, tosatur, Tryded, TsjipTsjip, Tunguso4ka, TurboTrackerss14, Tyler-IN, Tyzemol, UbaserB, UKNOWH, UnicornOnLSD, Uriende, UristMcDorf, Vaaankas, Varen, VasilisThePikachu, veliebm, Veritius, Verslebas, VigersRay, Visne, VMSolidus, volundr-, Voomra, Vordenburg, vulppine, waylon531, weaversam8, Willhelm53, wixoaGit, WlarusFromDaSpace, wrexbe, xRiriq, yathxyz, Ygg01, YotaXP, YuriyKiss, zach-hill, Zandario, Zap527, ZelteHonor, zerorulez, zionnBE, zlodo, ZNixian, ZoldorfTheWizard, Zumorica, Zymem +0x6273, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 4dplanner, 612git, 778b, Ablankmann, Acruid, actioninja, adamsong, Admiral-Obvious-001, Adrian16199, Aerocrux, Aexxie, africalimedrop, Agoichi, Ahion, AJCM-git, AjexRose, Alekshhh, AlexMorgan3817, AlmondFlour, AlphaQwerty, Altoids1, amylizzle, ancientpower, ArchPigeon, Arendian, arimah, Arteben, AruMoon, as334, AsikKEsel, asperger-sind, aspiringLich, avghdev, AzzyIsNotHere, BananaFlambe, BasedUser, BGare, BingoJohnson-zz, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, Boaz1111, BobdaBiscuit, brainfood1183, Brandon-Huu, Bribrooo, Bright0, brndd, BubblegumBlue, BYONDFuckery, c4llv07e, CakeQ, CaptainSqrBeard, Carbonhell, Carolyn3114, casperr04, CatTheSystem, Centronias, chairbender, Charlese2, Cheackraze, cheesePizza2, Chief-Engineer, chromiumboy, Chronophylos, clement-or, Clyybber, ColdAutumnRain, Colin-Tel, collinlunn, ComicIronic, coolmankid12345, corentt, crazybrain23, creadth, CrigCrag, Crotalus, CrudeWax, CrzyPotato, Cyberboss, d34d10cc, Daemon, daerSeebaer, dahnte, dakamakat, dakimasu, DamianX, DangerRevolution, daniel-cr, Darkenson, DawBla, dch-GH, Deahaka, DEATHB4DEFEAT, DeathCamel58, deathride58, DebugOk, Decappi, deepdarkdepths, Delete69, deltanedas, DeltaV-Bot, DerbyX, DoctorBeard, DogZeroX, dontbetank, Doru991, DoubleRiceEddiedd, DrMelon, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, Duddino, Dutch-VanDerLinde, Easypoller, eclips_e, EdenTheLiznerd, EEASAS, Efruit, ElectroSR, elthundercloud, Emisse, EmoGarbage404, Endecc, enumerate0, eoineoineoin, ERORR404V1, Errant-4, estacaoespacialpirata, exincore, exp111, Fahasor, FairlySadPanda, ficcialfaint, Fildrance, FillerVK, Fishfish458, Flareguy, FluffiestFloof, FluidRock, FoLoKe, fooberticus, Fortune117, freeman2651, Fromoriss, FungiFellow, GalacticChimp, gbasood, Geekyhobo, Genkail, Git-Nivrak, github-actions[bot], gituhabu, GNF54, Golinth, GoodWheatley, Gotimanga, graevy, GreyMario, Guess-My-Name, gusxyz, h3half, Hanzdegloker, Hardly3D, harikattar, Hebiman, Henry12116, HerCoyote23, Hmeister-real, HoofedEar, hord-brayden, hubismal, Hugal31, Hyenh, iacore, IamVelcroboy, icekot8, igorsaux, ike709, Illiux, Ilya246, IlyaElDunaev, Injazz, Insineer, IntegerTempest, Interrobang01, IProduceWidgets, ItsMeThom, j-giebel, Jackal298, Jackrost, jamessimo, janekvap, JerryImMouse, Jessetriesagain, jessicamaybe, Jezithyr, jicksaw, JiimBob, JoeHammad1844, joelhed, JohnGinnane, johnku1, joshepvodka, jproads, Jrpl, juliangiebel, JustArt1m, JustCone14, JustinTether, JustinTrotter, KaiShibaa, kalane15, kalanosh, KEEYNy, Keikiru, Kelrak, kerisargit, keronshb, KIBORG04, Killerqu00, KingFroozy, kira-er, Kit0vras, KittenColony, Kmc2000, Ko4ergaPunk, komunre, koteq, Krunklehorn, Kukutis96513, kxvvv, Lamrr, LankLTE, lapatison, Leander-0, leonardo-dabepis, LetterN, Level10Cybermancer, lever1209, LightVillet, liltenhead, LittleBuilderJane, Lomcastar, LordCarve, LordEclipse, LovelyLophi, LudwigVonChesterfield, Lukasz825700516, lunarcomets, luringens, lvvova1, lzimann, lzk228, M3739, MACMAN2003, Macoron, MagnusCrowe, ManelNavola, matthst, Matz05, MehimoNemo, MeltedPixel, MemeProof, Menshin, Mervill, metalgearsloth, mhamsterr, MilenVolf, Minty642, Mirino97, mirrorcult, MishaUnity, MisterMecky, Mith-randalf, Moneyl, Moomoobeef, moony, Morb0, Mr0maks, musicmanvr, Myakot, Myctai, N3X15, Nairodian, Naive817, namespace-Memory, NickPowers43, nikthechampiongr, Nimfar11, Nirnael, nmajask, nok-ko, Nopey, notafet, notquitehadouken, noudoit, noverd, nuke-haus, NULL882, OCOtheOmega, OctoRocket, OldDanceJacket, onoira, Owai-Seek, pali6, Pangogie, patrikturi, PaulRitter, Peptide90, peptron1, Phantom-Lily, PHCodes, PixelTheKermit, PJB3005, Plykiya, pofitlo, pointer-to-null, PolterTzi, PoorMansDreams, potato1234x, ProfanedBane, PrPleGoo, ps3moira, Psychpsyo, psykzz, PuroSlavKing, quatre, QuietlyWhisper, qwerltaz, Radosvik, Radrark, Rainbeon, Rainfey, Rane, ravage123321, rbertoche, Redict, RedlineTriad, RednoWCirabrab, RemberBM, RemieRichards, RemTim, rene-descartes2021, RiceMar1244, RieBi, Rinkashikachi, Rockdtben, rolfero, rosieposieeee, Saakra, Samsterious, SaphireLattice, ScalyChimp, scrato, Scribbles0, Serkket, SethLafuente, ShadowCommander, Shadowtheprotogen546, SignalWalker, SimpleStation14, Simyon264, SirDragooon, Sirionaut, siyengar04, Skarletto, Skrauz, Skyedra, SlamBamActionman, Slava0135, Snowni, snowsignal, SonicHDC, SoulSloth, SpaceManiac, SpeltIncorrectyl, spoogemonster, ssdaniel24, Stealthbomber16, stellar-novas, StrawberryMoses, Subversionary, SweptWasTaken, Szunti, TadJohnson00, takemysoult, TaralGit, Tayrtahn, tday93, TekuNut, TemporalOroboros, tentekal, tgrkzus, thatrandomcanadianguy, TheArturZh, theashtronaut, thedraccx, themias, theomund, theOperand, TheShuEd, TimrodDX, Titian3, tkdrg, tmtmtl30, tom-leys, tomasalves8, Tomeno, tosatur, Tryded, TsjipTsjip, Tunguso4ka, TurboTrackerss14, Tyler-IN, Tyzemol, UbaserB, UKNOWH, UnicornOnLSD, Uriende, UristMcDorf, Vaaankas, Varen, VasilisThePikachu, veliebm, Veritius, Verslebas, VigersRay, Visne, VMSolidus, volundr-, Voomra, Vordenburg, vulppine, waylon531, weaversam8, Willhelm53, wixoaGit, WlarusFromDaSpace, wrexbe, xRiriq, yathxyz, Ygg01, YotaXP, YuriyKiss, zach-hill, Zandario, Zap527, ZelteHonor, zerorulez, zionnBE, zlodo, ZNixian, ZoldorfTheWizard, Zumorica, Zymem From d041011584f8d1497e4e464bd2535f0f60b50e8c Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Tue, 28 May 2024 19:38:27 -0400 Subject: [PATCH 009/155] 1984'ing GlobalRollforward (#423) GIVE ME BACK THE TESTS. --- .github/workflows/build-docfx.yml | 2 +- global.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-docfx.yml b/.github/workflows/build-docfx.yml index ca1a6f0af12..d37e37026d7 100644 --- a/.github/workflows/build-docfx.yml +++ b/.github/workflows/build-docfx.yml @@ -21,7 +21,7 @@ jobs: - name: Setup .NET Core uses: actions/setup-dotnet@v3.2.0 with: - dotnet-version: 8.0.x + dotnet-version: 8.0.100 - name: Install dependencies run: dotnet restore diff --git a/global.json b/global.json index 391ba3c2a30..2244195a209 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "sdk": { "version": "8.0.100", - "rollForward": "latestFeature" + "rollForward": "disable" } } From 7876728a5ec15c96666d4379270d3a41829fa293 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Tue, 28 May 2024 19:44:39 -0400 Subject: [PATCH 010/155] Listening Post Earlier Start (#409) # Description This was something that always annoyed me back when I made this for DeltaV. One key feature of the Listening Post was that it would have acted to encourage traitors to actually buy the encryption key bundle, since it had the possibility of letting them get radio support from a listening post. At the time Debug insisted it should only ever spawn extremely late in the around, giving it a sufficiently low weight that it would only appear usually an hour into the round. By this point all of the traitors had either been caught or had already done their thing, thus defeating the entire point of it. It also had an absurdly high minimum player count relative to the actual threat the outpost serves, ensuring that it would never appear on lowpop servers. Seriously not even stationwide lethal threats such as Xenos Ventcritters had as high of a minimum player count. # Changelog :cl: - tweak: Syndicate Listening Posts can now appear any time in a round, and can appear on low-pop servers. --- Resources/Prototypes/DeltaV/GameRules/events.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Resources/Prototypes/DeltaV/GameRules/events.yml b/Resources/Prototypes/DeltaV/GameRules/events.yml index 73b0ca6549c..9391756492b 100644 --- a/Resources/Prototypes/DeltaV/GameRules/events.yml +++ b/Resources/Prototypes/DeltaV/GameRules/events.yml @@ -52,9 +52,8 @@ noSpawn: true components: - type: StationEvent - earliestStart: 15 - weight: 5 - minimumPlayers: 25 + weight: 7.5 + minimumPlayers: 10 maxOccurrences: 1 duration: 1 - type: PirateRadioSpawnRule From 68c8a5e9bd8b82ae373ab38c06590ed0f16400c5 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Tue, 28 May 2024 23:45:02 +0000 Subject: [PATCH 011/155] Automatic Changelog Update (#409) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 60f2d8f14c4..ba49523cfde 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4086,3 +4086,11 @@ Entries: message: Added a number of new corporate coats to the Clothesmate. id: 6111 time: '2024-05-22T03:35:11.0000000+00:00' +- author: VMSolidus + changes: + - type: Tweak + message: >- + Syndicate Listening Posts can now appear any time in a round, and can + appear on low-pop servers. + id: 6112 + time: '2024-05-28T23:44:39.0000000+00:00' From 412323652c0e8f3268918c31407e682becd5c66f Mon Sep 17 00:00:00 2001 From: SimpleStation14 <130339894+SimpleStation14@users.noreply.github.com> Date: Tue, 28 May 2024 19:48:38 -0400 Subject: [PATCH 012/155] Mirror: Add Prometheus stats for admin count (#323) ## Mirror of PR #26284: [Add Prometheus stats for admin count](https://github.com/space-wizards/space-station-14/pull/26284) from space-wizards [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `a1817a12dbb385275f4273c1abf48fac0a989ddd` PR opened by PJB3005 at 2024-03-20 10:12:29 UTC --- PR changed 2 files with 106 additions and 1 deletions. The PR had the following labels: - Status: Needs Review ---

Original Body

> Fixes #20828 > > Reports time series for admin count. Counts are separated by state (active, AFK, or deadminned) and admin rank. > > Requires engine master
Co-authored-by: SimpleStation14 --- .../Managers/AdminManager.Metrics.cs | 98 +++++++++++++++++++ .../Administration/Managers/AdminManager.cs | 9 +- 2 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 Content.Server/Administration/Managers/AdminManager.Metrics.cs diff --git a/Content.Server/Administration/Managers/AdminManager.Metrics.cs b/Content.Server/Administration/Managers/AdminManager.Metrics.cs new file mode 100644 index 00000000000..2fea931f1b9 --- /dev/null +++ b/Content.Server/Administration/Managers/AdminManager.Metrics.cs @@ -0,0 +1,98 @@ +using System.Diagnostics.Metrics; +using System.Runtime.InteropServices; +using Content.Server.Afk; +using Robust.Server.DataMetrics; + +namespace Content.Server.Administration.Managers; + +// Handles metrics reporting for active admin count and such. + +public sealed partial class AdminManager +{ + private Dictionary? _adminOnlineCounts; + + private const int SentinelRankId = -1; + + [Dependency] private readonly IMetricsManager _metrics = default!; + [Dependency] private readonly IAfkManager _afkManager = default!; + [Dependency] private readonly IMeterFactory _meterFactory = default!; + + private void InitializeMetrics() + { + _metrics.UpdateMetrics += MetricsOnUpdateMetrics; + + var meter = _meterFactory.Create("SS14.AdminManager"); + + meter.CreateObservableGauge( + "admins_online_count", + MeasureAdminCount, + null, + "The count of online admins"); + } + + private void MetricsOnUpdateMetrics() + { + _sawmill.Verbose("Updating metrics"); + + var dict = new Dictionary(); + + foreach (var (session, reg) in _admins) + { + var rankId = reg.RankId ?? SentinelRankId; + + ref var counts = ref CollectionsMarshal.GetValueRefOrAddDefault(dict, rankId, out _); + + if (reg.Data.Active) + { + if (_afkManager.IsAfk(session)) + counts.afk += 1; + else + counts.active += 1; + } + else + { + counts.deadminned += 1; + } + } + + // Neither prometheus-net nor dotnet-counters seem to handle stuff well if we STOP returning measurements. + // i.e. if the last admin with a rank disconnects. + // So if we have EVER reported a rank, always keep reporting it. + if (_adminOnlineCounts != null) + { + foreach (var rank in _adminOnlineCounts.Keys) + { + CollectionsMarshal.GetValueRefOrAddDefault(dict, rank, out _); + } + } + + // Make sure "no rank" is always available. Avoid "no data". + CollectionsMarshal.GetValueRefOrAddDefault(dict, SentinelRankId, out _); + + _adminOnlineCounts = dict; + } + + private IEnumerable> MeasureAdminCount() + { + if (_adminOnlineCounts == null) + yield break; + + foreach (var (rank, (active, afk, deadminned)) in _adminOnlineCounts) + { + yield return new Measurement( + active, + new KeyValuePair("state", "active"), + new KeyValuePair("rank", rank == SentinelRankId ? "none" : rank.ToString())); + + yield return new Measurement( + afk, + new KeyValuePair("state", "afk"), + new KeyValuePair("rank", rank == SentinelRankId ? "none" : rank.ToString())); + + yield return new Measurement( + deadminned, + new KeyValuePair("state", "deadminned"), + new KeyValuePair("rank", rank == SentinelRankId ? "none" : rank.ToString())); + } + } +} diff --git a/Content.Server/Administration/Managers/AdminManager.cs b/Content.Server/Administration/Managers/AdminManager.cs index 4eaa08fe9dd..b1cca46e63f 100644 --- a/Content.Server/Administration/Managers/AdminManager.cs +++ b/Content.Server/Administration/Managers/AdminManager.cs @@ -23,7 +23,7 @@ namespace Content.Server.Administration.Managers { - public sealed class AdminManager : IAdminManager, IPostInjectInit, IConGroupControllerImplementation + public sealed partial class AdminManager : IAdminManager, IPostInjectInit, IConGroupControllerImplementation { [Dependency] private readonly IPlayerManager _playerManager = default!; [Dependency] private readonly IServerDbManager _dbManager = default!; @@ -34,6 +34,7 @@ public sealed class AdminManager : IAdminManager, IPostInjectInit, IConGroupCont [Dependency] private readonly IServerConsoleHost _consoleHost = default!; [Dependency] private readonly IChatManager _chat = default!; [Dependency] private readonly ToolshedManager _toolshed = default!; + [Dependency] private readonly ILogManager _logManager = default!; private readonly Dictionary _admins = new(); private readonly HashSet _promotedPlayers = new(); @@ -49,6 +50,8 @@ public sealed class AdminManager : IAdminManager, IPostInjectInit, IConGroupCont private readonly AdminCommandPermissions _commandPermissions = new(); private readonly AdminCommandPermissions _toolshedCommandPermissions = new(); + private ISawmill _sawmill = default!; + public bool IsAdmin(ICommonSession session, bool includeDeAdmin = false) { return GetAdminData(session, includeDeAdmin) != null; @@ -181,6 +184,8 @@ public void ReloadAdminsWithRank(int rankId) public void Initialize() { + _sawmill = _logManager.GetSawmill("admin"); + _netMgr.RegisterNetMessage(); // Cache permissions for loaded console commands with the requisite attributes. @@ -234,6 +239,8 @@ public void Initialize() } _toolshed.ActivePermissionController = this; + + InitializeMetrics(); } public void PromoteHost(ICommonSession player) From 16fa1cac9e79d3f4f2e393a1b4a931bc1e29611e Mon Sep 17 00:00:00 2001 From: FoxxoTrystan <45297731+FoxxoTrystan@users.noreply.github.com> Date: Wed, 29 May 2024 01:59:19 +0200 Subject: [PATCH 013/155] Walls/Windows Resprites! (#402) # Walls/Windows Resprites! Import the changes that i provided to frontier in PR: https://github.com/new-frontiers-14/frontier-station-14/pull/418 to EE, including part of this PR: https://github.com/new-frontiers-14/frontier-station-14/pull/757 Those Walls/Windows LOOK EXTREMLY MORE BETTER then the old TG walls/windows, Common its 2024! We need DRIP IN ALL WALLS! .yml changes are needed for connection to walls/window and prevent connected from doors, shutters, ect... --- # TODO - [x] Import Sprites. - [x] yml changes ---

Media

![image](https://github.com/Simple-Station/Einstein-Engines/assets/45297731/28221333-4c14-44d4-8557-697462d676f2)

--- # Changelog :cl: - tweak: Better wall sprites. - tweak: Better window sprites. --- .../Doors/Airlocks/base_structureairlocks.yml | 3 - .../Doors/MaterialDoors/material_doors.yml | 3 - .../Structures/Doors/Shutter/shutters.yml | 3 - .../Entities/Structures/Windows/window.yml | 4 +- .../Doors/secret_door.rsi/assembly.png | Bin 305 -> 178 bytes .../Doors/secret_door.rsi/closed.png | Bin 171 -> 117 bytes .../Doors/secret_door.rsi/closing.png | Bin 516 -> 563 bytes .../Doors/secret_door.rsi/meta.json | 24 ++--- .../Structures/Doors/secret_door.rsi/open.png | Bin 219 -> 170 bytes .../Doors/secret_door.rsi/opening.png | Bin 530 -> 582 bytes .../Walls/reinforced_diagonal.rsi/meta.json | 2 +- .../Walls/reinforced_diagonal.rsi/state0.png | Bin 666 -> 5943 bytes .../Walls/reinforced_diagonal.rsi/state1.png | Bin 639 -> 5829 bytes .../Structures/Walls/shuttle.rsi/meta.json | 20 +++- .../Walls/shuttle.rsi/shuttle_construct-0.png | Bin 0 -> 632 bytes .../Walls/shuttle.rsi/shuttle_construct-1.png | Bin 0 -> 652 bytes .../Walls/shuttle.rsi/shuttle_construct-2.png | Bin 0 -> 689 bytes .../Walls/shuttle.rsi/shuttle_construct-3.png | Bin 0 -> 690 bytes .../Walls/shuttle.rsi/shuttle_construct-4.png | Bin 0 -> 675 bytes .../Walls/shuttle.rsi/shuttle_construct-5.png | Bin 0 -> 671 bytes .../Structures/Walls/solid.rsi/full.png | Bin 547 -> 168 bytes .../Structures/Walls/solid.rsi/meta.json | 2 +- .../Walls/solid.rsi/reinf_construct-0.png | Bin 891 -> 225 bytes .../Walls/solid.rsi/reinf_construct-1.png | Bin 863 -> 266 bytes .../Walls/solid.rsi/reinf_construct-2.png | Bin 956 -> 264 bytes .../Walls/solid.rsi/reinf_construct-3.png | Bin 956 -> 262 bytes .../Walls/solid.rsi/reinf_construct-4.png | Bin 963 -> 265 bytes .../Walls/solid.rsi/reinf_construct-5.png | Bin 1016 -> 258 bytes .../Walls/solid.rsi/reinf_over0.png | Bin 1128 -> 481 bytes .../Walls/solid.rsi/reinf_over1.png | Bin 994 -> 395 bytes .../Walls/solid.rsi/reinf_over2.png | Bin 1128 -> 481 bytes .../Walls/solid.rsi/reinf_over3.png | Bin 994 -> 395 bytes .../Walls/solid.rsi/reinf_over4.png | Bin 991 -> 393 bytes .../Walls/solid.rsi/reinf_over5.png | Bin 880 -> 352 bytes .../Walls/solid.rsi/reinf_over6.png | Bin 991 -> 393 bytes .../Walls/solid.rsi/reinf_over7.png | Bin 763 -> 204 bytes .../Structures/Walls/solid.rsi/rgeneric.png | Bin 864 -> 225 bytes .../Structures/Walls/solid.rsi/solid0.png | Bin 782 -> 391 bytes .../Structures/Walls/solid.rsi/solid1.png | Bin 415 -> 274 bytes .../Structures/Walls/solid.rsi/solid2.png | Bin 782 -> 391 bytes .../Structures/Walls/solid.rsi/solid3.png | Bin 415 -> 274 bytes .../Structures/Walls/solid.rsi/solid4.png | Bin 423 -> 280 bytes .../Structures/Walls/solid.rsi/solid5.png | Bin 448 -> 352 bytes .../Structures/Walls/solid.rsi/solid6.png | Bin 423 -> 280 bytes .../Structures/Walls/solid.rsi/solid7.png | Bin 261 -> 204 bytes .../Walls/solid_diagonal.rsi/state0.png | Bin 316 -> 316 bytes .../Walls/solid_diagonal.rsi/state1.png | Bin 297 -> 292 bytes .../Windows/plasma_diagonal.rsi/state0.png | Bin 15748 -> 729 bytes .../Windows/plasma_diagonal.rsi/state1.png | Bin 15665 -> 704 bytes .../Windows/plasma_window.rsi/full.png | Bin 1597 -> 430 bytes .../Windows/plasma_window.rsi/meta.json | 2 +- .../Windows/plasma_window.rsi/pwindow0.png | Bin 2063 -> 762 bytes .../Windows/plasma_window.rsi/pwindow1.png | Bin 1099 -> 735 bytes .../Windows/plasma_window.rsi/pwindow2.png | Bin 2063 -> 762 bytes .../Windows/plasma_window.rsi/pwindow3.png | Bin 1099 -> 735 bytes .../Windows/plasma_window.rsi/pwindow4.png | Bin 1161 -> 734 bytes .../Windows/plasma_window.rsi/pwindow5.png | Bin 1064 -> 680 bytes .../Windows/plasma_window.rsi/pwindow6.png | Bin 1161 -> 734 bytes .../Windows/plasma_window.rsi/pwindow7.png | Bin 247 -> 270 bytes .../reinforced_plasma_diagonal.rsi/state0.png | Bin 15911 -> 764 bytes .../reinforced_plasma_diagonal.rsi/state1.png | Bin 15885 -> 737 bytes .../reinforced_plasma_window.rsi/full.png | Bin 2495 -> 443 bytes .../reinforced_plasma_window.rsi/meta.json | 2 +- .../rpwindow0.png | Bin 2930 -> 776 bytes .../rpwindow1.png | Bin 1696 -> 877 bytes .../rpwindow2.png | Bin 2930 -> 776 bytes .../rpwindow3.png | Bin 1696 -> 877 bytes .../rpwindow4.png | Bin 1745 -> 874 bytes .../rpwindow5.png | Bin 1695 -> 721 bytes .../rpwindow6.png | Bin 1745 -> 874 bytes .../rpwindow7.png | Bin 910 -> 270 bytes .../state0.png | Bin 15734 -> 765 bytes .../state1.png | Bin 15695 -> 739 bytes .../reinforced_uranium_window.rsi/full.png | Bin 2067 -> 452 bytes .../reinforced_uranium_window.rsi/meta.json | 90 +++++++++--------- .../ruwindow0.png | Bin 2366 -> 750 bytes .../ruwindow1.png | Bin 1169 -> 872 bytes .../ruwindow2.png | Bin 2342 -> 750 bytes .../ruwindow3.png | Bin 1138 -> 872 bytes .../ruwindow4.png | Bin 1133 -> 874 bytes .../ruwindow5.png | Bin 1088 -> 704 bytes .../ruwindow6.png | Bin 1129 -> 874 bytes .../ruwindow7.png | Bin 267 -> 270 bytes .../Windows/reinforced_window.rsi/full.png | Bin 2063 -> 437 bytes .../Windows/reinforced_window.rsi/meta.json | 2 +- .../reinforced_window.rsi/rwindow0.png | Bin 2229 -> 758 bytes .../reinforced_window.rsi/rwindow1.png | Bin 1148 -> 620 bytes .../reinforced_window.rsi/rwindow2.png | Bin 2229 -> 758 bytes .../reinforced_window.rsi/rwindow3.png | Bin 1148 -> 620 bytes .../reinforced_window.rsi/rwindow4.png | Bin 1130 -> 615 bytes .../reinforced_window.rsi/rwindow5.png | Bin 1025 -> 706 bytes .../reinforced_window.rsi/rwindow6.png | Bin 1130 -> 615 bytes .../reinforced_window.rsi/rwindow7.png | Bin 272 -> 268 bytes .../reinforced_window_diagonal.rsi/state0.png | Bin 16179 -> 768 bytes .../reinforced_window_diagonal.rsi/state1.png | Bin 16152 -> 741 bytes .../Windows/tinted_window.rsi/full.png | Bin 9436 -> 387 bytes .../Windows/tinted_window.rsi/meta.json | 2 +- .../Windows/tinted_window.rsi/twindow0.png | Bin 10814 -> 2397 bytes .../Windows/tinted_window.rsi/twindow1.png | Bin 8214 -> 2230 bytes .../Windows/tinted_window.rsi/twindow2.png | Bin 10815 -> 2397 bytes .../Windows/tinted_window.rsi/twindow3.png | Bin 8477 -> 2230 bytes .../Windows/tinted_window.rsi/twindow4.png | Bin 8217 -> 2236 bytes .../Windows/tinted_window.rsi/twindow5.png | Bin 6896 -> 2336 bytes .../Windows/tinted_window.rsi/twindow6.png | Bin 8464 -> 2236 bytes .../Windows/tinted_window.rsi/twindow7.png | Bin 4882 -> 1915 bytes .../Windows/uranium_window.rsi/full.png | Bin 1321 -> 432 bytes .../Windows/uranium_window.rsi/meta.json | 90 +++++++++--------- .../Windows/uranium_window.rsi/uwindow0.png | Bin 1688 -> 773 bytes .../Windows/uranium_window.rsi/uwindow1.png | Bin 1225 -> 739 bytes .../Windows/uranium_window.rsi/uwindow2.png | Bin 1688 -> 773 bytes .../Windows/uranium_window.rsi/uwindow3.png | Bin 1225 -> 739 bytes .../Windows/uranium_window.rsi/uwindow4.png | Bin 1216 -> 739 bytes .../Windows/uranium_window.rsi/uwindow5.png | Bin 795 -> 664 bytes .../Windows/uranium_window.rsi/uwindow6.png | Bin 1229 -> 739 bytes .../Windows/uranium_window.rsi/uwindow7.png | Bin 297 -> 270 bytes .../uranium_window_diagonal.rsi/state0.png | Bin 15629 -> 729 bytes .../uranium_window_diagonal.rsi/state1.png | Bin 15604 -> 703 bytes .../Structures/Windows/window.rsi/full.png | Bin 1224 -> 427 bytes .../Structures/Windows/window.rsi/meta.json | 2 +- .../Structures/Windows/window.rsi/window0.png | Bin 1632 -> 714 bytes .../Structures/Windows/window.rsi/window1.png | Bin 1183 -> 518 bytes .../Structures/Windows/window.rsi/window2.png | Bin 1632 -> 714 bytes .../Structures/Windows/window.rsi/window3.png | Bin 1183 -> 518 bytes .../Structures/Windows/window.rsi/window4.png | Bin 1187 -> 523 bytes .../Structures/Windows/window.rsi/window5.png | Bin 800 -> 666 bytes .../Structures/Windows/window.rsi/window6.png | Bin 1187 -> 523 bytes .../Structures/Windows/window.rsi/window7.png | Bin 301 -> 268 bytes .../Windows/window_diagonal.rsi/state0.png | Bin 15988 -> 735 bytes .../Windows/window_diagonal.rsi/state1.png | Bin 15966 -> 702 bytes 129 files changed, 130 insertions(+), 121 deletions(-) create mode 100644 Resources/Textures/Structures/Walls/shuttle.rsi/shuttle_construct-0.png create mode 100644 Resources/Textures/Structures/Walls/shuttle.rsi/shuttle_construct-1.png create mode 100644 Resources/Textures/Structures/Walls/shuttle.rsi/shuttle_construct-2.png create mode 100644 Resources/Textures/Structures/Walls/shuttle.rsi/shuttle_construct-3.png create mode 100644 Resources/Textures/Structures/Walls/shuttle.rsi/shuttle_construct-4.png create mode 100644 Resources/Textures/Structures/Walls/shuttle.rsi/shuttle_construct-5.png diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml index 5fca0819984..4bc43b5559e 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml @@ -131,9 +131,6 @@ - board - type: PlacementReplacement key: walls - - type: IconSmooth - key: walls - mode: NoSprite - type: PaintableAirlock group: Standard department: Civilian diff --git a/Resources/Prototypes/Entities/Structures/Doors/MaterialDoors/material_doors.yml b/Resources/Prototypes/Entities/Structures/Doors/MaterialDoors/material_doors.yml index 4b6f72de934..644976eb9c4 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/MaterialDoors/material_doors.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/MaterialDoors/material_doors.yml @@ -52,9 +52,6 @@ behaviors: - !type:DoActsBehavior acts: ["Destruction"] - - type: IconSmooth - key: walls - mode: NoSprite - type: Occluder - type: BlockWeather diff --git a/Resources/Prototypes/Entities/Structures/Doors/Shutter/shutters.yml b/Resources/Prototypes/Entities/Structures/Doors/Shutter/shutters.yml index e38ba1fd667..7d3af93a64d 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Shutter/shutters.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Shutter/shutters.yml @@ -73,9 +73,6 @@ behaviors: - !type:DoActsBehavior acts: ["Destruction"] - - type: IconSmooth - key: walls - mode: NoSprite - type: DoorSignalControl - type: DeviceNetwork deviceNetId: Wireless diff --git a/Resources/Prototypes/Entities/Structures/Windows/window.yml b/Resources/Prototypes/Entities/Structures/Windows/window.yml index fca0b975e98..ee2ad6bc28f 100644 --- a/Resources/Prototypes/Entities/Structures/Windows/window.yml +++ b/Resources/Prototypes/Entities/Structures/Windows/window.yml @@ -69,7 +69,7 @@ acts: [ "Destruction" ] - type: Airtight - type: IconSmooth - key: windows + key: walls base: window - type: InteractionPopup interactSuccessString: comp-window-knock @@ -242,4 +242,4 @@ sprite: Structures/Windows/cracks_diagonal.rsi - type: Construction graph: WindowDiagonal - node: windowDiagonal \ No newline at end of file + node: windowDiagonal diff --git a/Resources/Textures/Structures/Doors/secret_door.rsi/assembly.png b/Resources/Textures/Structures/Doors/secret_door.rsi/assembly.png index 6518b7245c721677990edb252828d4ce34c776f5..1a84e526a4a780111960391cd8356bf513b5f17f 100644 GIT binary patch delta 162 zcmdnUw25(oL_G^L0|P^2NcwRg#UJ1k;(Fk~0RsaAXJ=;%3kzRgUmiKR%Rni{k|4ie z28U-i(tw;mPZ!4!jfu$uEsSg$0Zk04&NCQ7;yCmYco@67Rxr7>WiXw}U~)Ug!6>d! z5acGraC2po-hwAKlUM@w^b0yjICj`hFkH;2xyWFVv`~1;;mOPl@A`Git&-N=1e(s^ M>FVdQ&MBb@0K5S)Jpcdz delta 290 zcmV+-0p0$x0kHy*7=H)`0001UdV2H#0004VQb$4nuFf3k0002%NklmWi2xfq_qCQaX_03GfMVH83!6c6PR~u<-Tu)m`y&Ay8b!)5S4FVrp_i zLt}tO1GmANCZ?L6{{amb>^vk2+65nT-)UrEI59QLQE#eD4NyIUr>mdKI;Vst07cCm A)&Kwi delta 154 zcmXS2%{W1#o`a2nfuXpn>I;x!EDmyaVpw-h<|UAm>gnPb64Cnh`bJ&`MFHl6yN^qn zDg?6ro!;cao1(C<$M+3eS#`a=(`^UCv)SO8ZadN?voT!dC=Kv&z0gDHJ zP*SPRDM0R76tH?EKu>7SF+gllz~-p|S^}M^bmW;U0e@5*il+r&l4v2f^E0N#!a%j5 zczOU@j@-`SJ!L1MFE?q1}Ocza|%E$3|Ku9p!TP84tQhZwSZI}Nmw75JmJ=nW7WZZofA8$SVG)Q<`o&VHXi(4;R@40u;x@yn28awv$nd*l(uDafL z{PB_CG9#JQRk^pF>YlAmu?YKm>t)HTic@}V$)W4_-hbb@{0&I(pYI-LlLZV0Tnvke zB$CsnDb9QsaW#AW_3THQ){=dpd%yi{JE#6%6=bp9{PR$Y-`3cP+wZxXC-_|^t53}B z{f8>|_b)!)di+tsX8By6>uX>B0a2 diff --git a/Resources/Textures/Structures/Doors/secret_door.rsi/meta.json b/Resources/Textures/Structures/Doors/secret_door.rsi/meta.json index 7e8135f2168..c1f0d5e09ec 100644 --- a/Resources/Textures/Structures/Doors/secret_door.rsi/meta.json +++ b/Resources/Textures/Structures/Doors/secret_door.rsi/meta.json @@ -24,12 +24,12 @@ "directions": 1, "delays": [ [ - 0.2, - 0.2, - 0.2, - 0.2, - 0.2, - 0.2 + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 ] ] }, @@ -47,12 +47,12 @@ "directions": 1, "delays": [ [ - 0.2, - 0.2, - 0.2, - 0.2, - 0.2, - 0.2 + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 ] ] } diff --git a/Resources/Textures/Structures/Doors/secret_door.rsi/open.png b/Resources/Textures/Structures/Doors/secret_door.rsi/open.png index 81862e1eade5b452853842c8baaa21f5413914aa..5f78166d8cf2fe85d2e0d67e1e230415c0af7893 100644 GIT binary patch delta 154 zcmcc3xQcOtL_G^L0|P^2NcwRg#UJ1k;(Fk~0RsaAXJ=;%3kzRgUmiKR%Rni{k|4ie z28U-i(tsRKPZ!4!jfu$uEKH1SDhrk@N$F8y2wBjhl#r97(xSGYM=c?x2ShCZQV&}6 z78q?}H8{kq%wfnZsVsFtnM+w~qpO)$5d%Y^aIwf*Y4I3yps5U=u6{1-oD!MU}oXkrgXR4=*V@O2n+lz)=&58mofxVY2 z+vIIpzrSy>ZG9m5M&$A_&!Bf<)^nBi@b_%JCTypsWT??+J0)lxyV9bU?B5KI1+Z4W zQCylLbwDmD&Sa>L$eziz;k(h*`ZLTn2bgVKfEbJz4oK}eU+j08;akDE zpPxh0-z2`z1!|r5e5YPi_A16V3%{@9`gEh3S>&(Ynl|UXZ9o??c)I$ztaD0e0sx}N51jYoA8Gi!+007eJf;<2K00DDSM?wIu&K&6g000DMK}|sb0I`n?{9y$E z000kAOjJcMFfcecI7352O-)Sz005htS1JGi00neXPE-H?|Nj8{whmJO000SaNLh0L z01mF{QA$e1}c8~hLdECMYJCvWn1Jp(KsU)bdI0Gwt$pvL7X@{BNcRyZ}XjkoU$!Q zGtOg+b9~MB3cmf|rO-uZ)IllRf~-(E;{y-Bw_sZk9DhInVS=az=hzFLkJf%Ri0#-@ z-}&o6Y%h5C`hwVwJq0?0puo3dp9}0e^a}zz_NhPgu8Qu>}+l)8z_?Bq}HscpWcI-d&*rJ)J z;L(FuK{01RR1@0^UjGLPeUC&nu^sz-0vVzj+|9@LZTkYbqCGG~gOK_F0000b=ZN&^=a>}IR_^M|M)jI(J%3XaQkgp6o;ec)3?=6WWL@`mnpgbeX^Bdhe7*MNB!yD&8I4q&LkFI z$o%#FxsI&hvkew6zE+h6Ncy)}>hM*`v_s{86n;?PHDHinV>rx^Ai==H+>pp%z{AkS zcmTKH;#FN`FPy;U?7uG?a!fdpue;f9zGk@de*rL4j-P$%N0%9gA1(N7W4+?X=5?=c ze?MXQYWsPM7u#~xOOrsV4qw@H`Cq2~zGdIn{oDTj+qVt-Za=zMBL4wR=wXq(Kw@~j zN_+e1T8Ea{+KDo9dfyoZ%f7l6RqVLK?sDU*_{oQGMeP51S&8=tSY;0}=DJ_5J+OT5 qk6HJ2|GK~L_U*&J^12c3(Vtkmw&2XHnTvsu%;4$j=d#Wzp$P!4QQz+X diff --git a/Resources/Textures/Structures/Walls/reinforced_diagonal.rsi/meta.json b/Resources/Textures/Structures/Walls/reinforced_diagonal.rsi/meta.json index 351d5688e44..8bbfa474bf0 100644 --- a/Resources/Textures/Structures/Walls/reinforced_diagonal.rsi/meta.json +++ b/Resources/Textures/Structures/Walls/reinforced_diagonal.rsi/meta.json @@ -5,7 +5,7 @@ "y": 32 }, "license": "CC-BY-SA-3.0", - "copyright": "Sprited by SonicHDC (Github) for Space Station 14", + "copyright": "Sprited by erhardsteinhauer (discord) for Space Station 14 New Frontier server", "states": [ { "name": "state0" diff --git a/Resources/Textures/Structures/Walls/reinforced_diagonal.rsi/state0.png b/Resources/Textures/Structures/Walls/reinforced_diagonal.rsi/state0.png index 10fb9cd49d667800c7d9bc347b4b72a6978307dc..d437ad8b738db68616d680dd195f849583138cf5 100644 GIT binary patch literal 5943 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 HMVbEwwkFzU delta 642 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 B8B+iN diff --git a/Resources/Textures/Structures/Walls/shuttle.rsi/meta.json b/Resources/Textures/Structures/Walls/shuttle.rsi/meta.json index 97ca2aa3b00..9aff20a66c8 100644 --- a/Resources/Textures/Structures/Walls/shuttle.rsi/meta.json +++ b/Resources/Textures/Structures/Walls/shuttle.rsi/meta.json @@ -41,6 +41,24 @@ { "name": "state7", "directions": 4 + }, + { + "name": "shuttle_construct-0" + }, + { + "name": "shuttle_construct-1" + }, + { + "name": "shuttle_construct-2" + }, + { + "name": "shuttle_construct-3" + }, + { + "name": "shuttle_construct-4" + }, + { + "name": "shuttle_construct-5" } ] -} \ No newline at end of file +} diff --git a/Resources/Textures/Structures/Walls/shuttle.rsi/shuttle_construct-0.png b/Resources/Textures/Structures/Walls/shuttle.rsi/shuttle_construct-0.png new file mode 100644 index 0000000000000000000000000000000000000000..dde7f67085c33178ecb82b20793d7e242ce38b19 GIT binary patch literal 632 zcmV-;0*C#HP)9K}pVm;=nMt*LGqJ_Ao4JqnfvI{;?+{d@NqCQh9MmXMYb z$EpA6vzJ)qh|!auoyVZ4qy*Lvas=D~Aj@+L3mC3my2PNZrw67%0K~=yVDd0ILh4{< zg6PTp6TprDJHXV!@jr-DP+Y*Uaoq;E$PtuS4s$Wg5wNISxnU23y`3dt2iVyAknMBy-~u_~ z$iXdO;i2Pz*hFA~p{M}&j3ls#77`U@c=!4>LHapbaeM#%1BS)(Aq5=KA%N}xPyqt6 zoDcvx61|Wj$^oE)2viQh5+Sw_09g*Q00clG0s}A~!yHH`1hAF^u#ymz4M6}`2*9EN z*%I{V!50FcY>2ZY1Qo@&902n%C@S{s+{xhL?hX$D7$0Uaz7QbW0kAYc$N_}X0ND

2xG!1~VA9K}pVm;=nMt*LGqJ_Ao4JqnfvI{;?+{d@NqCQh9MmXMYb z$EpA6vzJ)qh|!auoyVZ4qy*Lvas=D~Aj@+L3mC3my2PNZrw67%0K~=yVDd0ILh4{< zg6PTp6TprDJHXV!@jr-DP+Y*Uaoq;E$PtuS4s$Wg5wNISxnU23y`3dt2iVyAknMBy-~u_~ z$iXdO;i2Pz*hFA~p{M}&%+iIk7@jKfMM}`NC8K52%tNl zv$d9?ytM2Ig0+Ipuj?Af^!ZikDzJ401* z4$crlcL3IM09F!$vLOhdI{+jGN=%^Q`rYf-49}5jHA!F%DkLfjE@H7|S!4%*vLVir z5L6Tsa)73mCIiSqbO(U=*RNe4bpT}{fG-hJD-D3MA9K}pVm;=nMt*LGqJ_Ao4JqnfvI{;?+{d@NqCQh9MmXMYb z$EpA6vzJ)qh|!auoyVZ4qy*Lvas=D~Aj@+L3mC3my2PNZrw67%0K~=yVDd0ILh4{< zg6PTp6TprDJHXV!@jr-DP+Y*Uaoq;E$PtuS4s$Wg5wNISxnU23y`3dt2iVyAknMBy-~u_~ z$iXdO;i2Pz*hFA~p{M}&%+iIk7@jKfMM}`NC8K52%tNl zv$d9?ytM2IT{Kn5>bxe;Dcg7~1)EiT+2 zY$vu5LU#bxasXBmg0dk9pgRC021-nz;u>VxmD`UQ&Ye5QU}R*(pra}ab`+?H#g=7} z9RSLPI7>oMQB24IAPZs>62O*rPME<^UXTHH%;E(Lzz(E~13*Fk99XY|EC)G464-_S z72$Mq0L?-GUm~Pd8USTOoRtxBQB2ERKvYpo_i_MK8zP4QdR;(CNjNm?f&rk^x&qAOLGlW7I@w0%SGGV3pB;HA)ApSq|$N4OquyP;|{eX=p$@r^tzz-raKm X_sHm<;lFx500000NkvXXu0mjf_TU|m literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Walls/shuttle.rsi/shuttle_construct-3.png b/Resources/Textures/Structures/Walls/shuttle.rsi/shuttle_construct-3.png new file mode 100644 index 0000000000000000000000000000000000000000..7098ec309a42368ab631fc9bca706b12cd0010e4 GIT binary patch literal 690 zcmV;j0!{siP)9K}pVm;=nMt*LGqJ_Ao4JqnfvI{;?+{d@NqCQh9MmXMYb z$EpA6vzJ)qh|!auoyVZ4qy*Lvas=D~Aj@+L3mC3my2PNZrw67%0K~=yVDd0ILh4{< zg6PTp6TprDJHXV!@jr-DP+Y*Uaoq;E$PtuS4s$Wg5wNISxnU23y`3dt2iVyA5cGLxYb`^0 zbu+=x0XgEx!7X5QRC55#a$+1omIGoFfdz)50^D~?7tUgM^5ij`kL+`hBVa&AMwTHu zJ`E*Q?%#jFuy{VCfFn8t&>ev6V_?~V5$vZ=><32&wh$r80ic2iR1UxrAvOoVYz0{a z3RYO|0I@+1K$b^#A-V&wmIJVo5R?r;0Gk6qK1a3`oegscdcs6@04N*cED1qHF*XOl zf)!)|GC+0!OdKSJ9t{*Z0NF6)V8@pCkmZr}QRD!SMaUt5uT+FNfb0+;lnBvNKei}< z0S9K}pVm;=nMt*LGqJ_Ao4JqnfvI{;?+{d@NqCQh9MmXMYb z$EpA6vzJ)qh|!auoyVZ4qy*Lvas=D~Aj@+L3mC3my2PNZrw67%0K~=yVDd0ILh4{< zg6PTp6TprDJHXV!@jr-DP+Y*Uaoq;E$PtuS4s$Wg5wNISxnU23y`3dt2iVyA5cGLxYb`^0 zbu+=x0XgEx!7X5QRC55#a$+1omIGoFfdz)50^D~?7tUgM^5ij`kL+`hBVa&AMwTHu zJ`E*Q?%#jFuy{VCfFn8t&>ev6Q;?6)0W6_n3lX9m04j(; zaRAnG09F!$vLOgya{#c^#A+$b0U-MHiTxM}6FCGx*$`(*2r7!PIRNG>^q@x$0a%oP z#Lz>5A_t(yJ-$K-S5#2s0Fcj+Lx30ukR1Yq5+NuJAOmbsKqw7>vLVjO2)QVxWiBA9 zD5iTk0ICgk^x&qAOLGl z6KVjE)g*&eMg!I;9k6COtY9K}pVm;=nMt*LGqJ_Ao4JqnfvI{;?+{d@NqCQh9MmXMYb z$EpA6vzJ)qh|!auoyVZ4qy*Lvas=D~Aj@+L3mC3my2PNZrw67%0K~=yVDd0ILh4{< zg6PTp6TprDJHXV!@jr-DP+Y*Uaoq;E$PtuS4s$Wg5wNISxnU23y`3dt2iVyA5cGLxYb`^0 zbu+=x0XgEx!7X5QRC55#a$+1omIGoFfdz)50^D~?7tUgM^5ij`kL+`hBVa&AMwTHu zJ`E*Q?%#jFuy{VCfFn8t&>ev6Q;?6)0W6_n3lX9m04j(; zaRAnG09F!$vLOgya{#c^#A+$b0U-MHiTxM}6FCGx*$`(*2r7!PIRNG>Y(bALD$qlL zA_t(yJ+@#+4gqXwfg%The25$Z#5jQL5FnHYL1};xAe06`*$`)Cgj^KUG8Yh46w|#N z0M&-bA%I>NP*M_-RTLAdjA&jL5K|o!TM>a8CPY=opw`NOHb`(b$$+gQ5P&tO31vmH znq;ubXuuk!1J*2u^^69rV=^eZW}rkhpq*3XR88;hIRKrH<)7+nnU|+kc>VxTlL_h{V+7 zga*cqp$P`9j!cKb69c$doB7y|u2ir()9h#{dZdHJNXfA$L_s;{KM*Wyl2{+MHi|c? zrMYLPRRGTp;|F}r)}rq!W|TjWYpIr$<1k=gIJh}S&|aRg? BGI{_2 delta 534 zcmV+x0_pvz0iy(v7=H)`0001UdV2H#00HVrL_t(|ob8uOj;cTuhQ9(->hcJTn6dzS z>i+l8E}#+@009((JnrC13AYvKj_K}!e^P;PUVl!(Uk9<vNx(1+>blm~N3bkQ`?qa7&N0RMS(wW8kid80 zMc_r?_Ye?5=zj&wiqL1!b=|1OYPHffEkv&C-dGt1m&;{VUYDY}T#!N~zlxWLbt~Sr~?a z5CSRX^E$9vQI;iL*U`2uP16tr0q|XC!9*v2&u91|@P8ukKb|VZ6SfaCVcWKtritJ- z%RNF>Rjk)*eSL)fBfKZYqY7z~5QHIrq+B$XODQSKlFeqramL?u9P*+dO_I@AuD77b zbKbUF(j*}-3c9YFT|>Hwv=0lZN&o-=07*qoM6N<$f)tJY#sB~S diff --git a/Resources/Textures/Structures/Walls/solid.rsi/meta.json b/Resources/Textures/Structures/Walls/solid.rsi/meta.json index 85b809570de..246ebe31b94 100644 --- a/Resources/Textures/Structures/Walls/solid.rsi/meta.json +++ b/Resources/Textures/Structures/Walls/solid.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/discordia-space/CEV-Eris/blob/c34c1b30abf18aa552e19294523924c39e5ea127/icons/turf/wall_masks.dmi and modified.", + "copyright": "Taken from https://github.com/ParadiseSS13/Paradise/ and modified by FoxxoTrystan", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Structures/Walls/solid.rsi/reinf_construct-0.png b/Resources/Textures/Structures/Walls/solid.rsi/reinf_construct-0.png index 828730d9f3d82e3f4e25ee4b0e4f0dd50970d037..1e2da3352b75d4ada2d78b93cfa36e15d6fefaf6 100644 GIT binary patch delta 209 zcmV;?051Rg2H^pa7=Hu<0001iRAaWak4ml12lVI9d_X*1v<=D| zToX_p2aKM+K!H1;?kfuX>kZMm8t!9!wII1dwPYEC3`#|*!j`%L;+izORVftD00000 LNkvXXu0mjf(}+h4XG$mU_Z$^w`bp7&Ua^@G8_&wd?K`b zLMeT5F=Gsr(iiD#z!=*YKq*BShFHWgEJ9j0QA#l$kKy}%D}N2c@L9#Vj@)3i$QTR; zSi~_@Rc#y>=jU)7rJAlq^>i1>b!ick49( z;LFZVjoP-2D2k9}^{^tA1ppY0MkOz6#YMZe{pgJ(0kJGp#jKx{f1?yx16{AzFio?j zTzQh2>kvXT8-D-*s`_{;8Gwg}hnleWK+`lSyQmz%CI+fd{)+0CWwjdcQTRU%I5;?{ z{io|XZfW_=jQ-`Zns-=S^i~&5EzC5!!R~qm!<#!&N+f0z~SLx z&A_Y6OIb&bPfnxVdDW3q{#vaNF5d(d2=<`}?_B;mKJis}} z&97gL9%#*iBuPql!JlM-wzUP*vKq5M)&bx5aXXn{yW2&YB(?gT=Q-yblgXquIOnZ( zKv5K=NrLTe7q^p%R1Oqk;QIO+w&Ng*A{Y%Nq|*!E`!prAPgK>s}#5Nkn+avq?ljR49>ckxdGOFbsubboRdD0n(y-!3(H(fT1w=zsjW54yBowMZ*XAX&zCl z&V@>Tq)wEseF{x@BxV3CDKrrw?mXap3Vp`}955Xz0G|OorgMGRhXW2baPyUQ`U1{- z=3Ky3wm33aYtSp;`3fQJ9Kv4VpU;txy%4xSt632YMy)9HA?*Yeg z3Ke+QZhxaFFEb79A0D`zOrBqXmzsn}M@KJPfh0*vJ+KRRcXxdI`t{E$kbUPt5YXv# zN~A#$5QZVH>y{ev&Ees%SKx!=ki>Cmey@M$K@gOla@QPC6on*?c~h(5d0wFc%3v@^ zg%Dg_U2$-5fU2tbBz&l-!0$}LLrp`k*YSNHDSstWN={BrRu#xpX7GIr^P({6Wbtdz3Ak)g05*@wSz eI8|Qzc>V*Yqj)Xq?1mr!0000X&{1 diff --git a/Resources/Textures/Structures/Walls/solid.rsi/reinf_construct-2.png b/Resources/Textures/Structures/Walls/solid.rsi/reinf_construct-2.png index cf8936fdcee3e3571a19b1105186d7052b6edef5..23367ae824af90f4e119191de1f31c1aa39b52d7 100644 GIT binary patch delta 248 zcmVn+au}MThR49>ckxdGOFbsubboRc|1Ej^-3tm8_2N;C8|5YZfR-~Et77ZVy`6Fu8 zx%f~RsS~AhpRECp#0-EXTLTf|E&wiM>pN!P0Ka7ep#TK_n}}dDFqM delta 946 zcmV;j15Nyh0=x&17=H)`0001UdV2H#00Ve%>&x{ul}aVkPA8MhwW_KfaYTqefo>R#$74$6G9|-cv)vvk zR}_U$mc{*k55R{)Az{nqGPk$4gkiF*3|$9cJRToqId}L_sa*b%4bQ{SbxyJjIMSf*?p20HCTrzDfu@K0YRby#={kE{=Uj4m{VuDU@GA{d%lS z0ly3HE+A0@0QGtu|EXvqj7B3|*TpnV+U<5?&1?R8z0Q0-PZtnPu<2yNMYc+%rG@8xC5QF2Af*E4W_ex4c7_x+fBFc`c@4sdaC@#`|M+wB+(2K0J8G);>?hi%)L z0`Bha`1{+p)C?${PA5F0=QPg#O&*S@U z$8x!h3o(&_PnL!6d5QUb*yq#fH1$oh=76Fo_@2if`8-m}^bFkG+;DbwhN`OZBz#E8 zz*{Eac`k=mEHax19%2uC%rUajK$Fbt0_ zfNHf0JfCV#ZRAf|o5pb@z}s$VwOXuKE7qG$B1jMf{N*@&-|YZW?N=!Yf*`Rr3`5qN z4eQk^aWIJmLn+auSrBfR49>ckzEdiAPj_S@c<6-0EM{kBwhfGCotLjUu6r5F?44hXuhQMkEqw+ z<4a+pL6jy}tN~BN41lFr0}Lw_i9N^|U9KWp(ek+^nXyFeb#NL-}+eQen*S-g~ZEph*LNK4tS$}yRC0)-QB!plxnP8e` zuAR^4JBdS%Fkm&>(Q36=c^;~&WCcxJ{`wNwX5)|O7(i3r^iRC)oO|yz;#`^-L51#KYu@$k6{=9bi3VHkWoCW*Ho)j zo*o~m*XvRVRoE(=UM};z*>IS#lmIR+E&!<4>i{$w4H}I`sy_>d#Ujs}4SKoEWHOPG zEi+)6ChqMmwrw+;PBWbthC#dCmR}sj+1XiUdx+U|if!Atx3`$4nVkXS_!uDsjb<}8 z*s?4+=YRA0oXgA06hYWF7z{ECv(aoKgupmHj%7fLX5h#5H2{S|fm*F5$@~5O)=?zo z$+p>S20*{xXEYko>-Az82$l5v$;tiEXc~^=d@KV|xUP%qy0qKv+<(42trT?kjld&qa;Q`_-p$suPql%3kn z?tfo`oeb-YUGXDG*3-@aeBY<6>+%r!U!3KQS$ZC2U1u3Nj)#cVz;dyWzk?u%Jpk2e z71-Wtk~Zv5j*YIcC`T-S^=d_{)nd6=u=Ko?6W{mwdotni=?Ngy{$tztzMmQ!1OZFW zW4TzQE+#U7@M2QZbtx9f=ljVC_xJa?wky$W=8pA!KgJOvwi)fi|8Y50e)skKUr6y> UQ2<)w+5i9m07*qoM6N<$f*;z|)c^nh diff --git a/Resources/Textures/Structures/Walls/solid.rsi/reinf_construct-4.png b/Resources/Textures/Structures/Walls/solid.rsi/reinf_construct-4.png index bf9dad0013f7c80f7cd856b24f31a2ff7e92741b..515b40760d8e7146dccd850215a3937cfaa29631 100644 GIT binary patch delta 249 zcmVn+avPnciR49>ckzEdiAPj_S@c<6-0Htx?NxXm>Phhh5zseSrje^q$nlI_lAEH{F z*PFsXofwTSg(W-?GXRzpmWU8{0q`M(y+Z;X7}pd)$N&N3(sD2T3Xc=`Y0uh10o(cK zRKQreSTl%s;0*AztEQe+_f0M!vy1a_fr#FK>Ch#YWI!%b0Zqxf$Gzk<{T%btgXQ6& zUz7els@9v~UdC@0RIjjEa(#ySP|YcuW7qltZ6P+1f5Ab700000NkvXXu0mjf277AT delta 953 zcmV;q14jIb0>cN87=H)`0001UdV2H#00W9iL_t(|oW+;VZsJG~#(%b$v1S7XgdA}| z(+5}|2vWo$Z-8>*&NFi7Xyp}9B$5M*4@`Wp(n8^1cI0ei?_tsgW1D1>8OovNrXFj(#H&m zS#LH8&oxcsZ`M7gm4QMpq25smE@vsB{H zOz=YfRS2RC8Gi%;#bPlTMp%B~NCkJ*pa0u;} zP`_>~*MYadah#8+f6M{Lap?E^A9f;@0|51UoyV7?QMkUoMoJm~9}EVu91e%^d&{yo zKR?g3>HB`R1FD0$vl(B7NRb0bDY?A7L`sS0d0bsxC4Wezlv=mjjmG0~=1d>ATWYl$ z-{y0gtybI#b=Y+{vs~sW2sp_oCFO)=Su`3A48x$=Y|?BtF${xlw;NfOm8l1CQY`Wm z1eoPA)9EyB*>MDH+vfJ>1^~k_sMqT$BdX25%s4S-Sr&P-2XJSzxR12Y&axw5ot`3u zpxJ6Alz$z^iPv08$?ffJia@;^3!0L(qlLzKNbN^9Y}-_sR;bH*NPp-!Llq2!${3sQ@@I_Y>8#dk%BIO`?>MfI$br>z8UK!= zDDeQ)YBgYYt2vZv{7`ql!uB~54s16YI-L%y<&xEUoiY-JA^%LL{QLboK&JdQpA&{* zN;irkR_isZn+at4TybR49>ck?ReGAPj{oIDm&Z05lFj;sQXNz{LGmxdr9MP|x{6^Cc~P5RIA~ zzZ4dlywGT?B`^ya1Hkxd3A`sW1;B-Bd6xz3NYKjTzh6dihqFLZQRcXM9cz2C#ROu0NF?#sFd#-?-W(^vj$%x{?`~< sSHpdbuNE|}P%U{p!+0olN_Ff}KWq;+kt06!Pyhe`07*qoM6N<$f+Ip+rvLx| delta 1006 zcmVXWQ7tY_Zr z?9A-0(Cv0J{6k3eg%EP`W6$$I2stS~0?+ey4iG}%`##oD1b;@a5v7AZxW6=JPqSte94+q5uFUlSwYh(*8%)TJ1d=aST;aaA+pk zl7A%x8Am2bf`3Y-QXm($HYrD%rhEqgKos9sB?IvG_Es?VJCG!a+1@7yu*-o%2!Dk7 zw5?JHJ_5&a&QU+l0mpIB@AuDkqL2ds&}cNU*(MFe{rx?{Fl4_6g8`GaZL|M%UB}JM z4cBH61bhc*2YYl~d?lnn4gg^o;_mJaVHm>qeT+t<9DivThC-*)$;RU`ccz;-M!jCg zH_wC7YOziz0=o{UR;zeT5?pdhi8`U{I-1QUWLbt~S+Fb%vMi(1>14XDbM*k=vQoio zl0dCiF`La;%VrTUO%v0H2LOO9%V;zj1tYZ0ZfBeu({&wXvj>1j*JXXgy1r%+5W3xN zMkAnU8h^fAT;Q@&!6uIJW7`KD$H8DQz-TmrEX$=NNs{39_7=8nqu1-P|366*v-$ny z1&hT3rfKf>0vdtv`5B();n8)OGR<}h!!TeN2KSwUR~?V83(xZqK0h;Z;2;O|t1A#f zV6RevrA1bQGLgcNe%$6hOT90$6tpIm}4 z3=8C+Bnd$faC6{f1ojbzp`hzJEX#VI)!q_VmW5`sS?XL_1PVFuS(dShV{ZSZr8XXq zkt7MG(FEhIO~ZUX=XS!wGNYXk0BqZ4Wm)FLWu<~3 z2!Bx1H2A*HPDHE~3&L*BK@dPWXhw(a)wXT)`+aW0@xW`tz}{xWJH;FWt&We7AH!MO z@wwzc$!^F7rK7`t1Vt{9E?KW1+C00>XFp{Pz{-4e8{pAG!xbmCl zAx+bQZkAuEdT%j07*qoM6N<$f~?Qn#sB~S diff --git a/Resources/Textures/Structures/Walls/solid.rsi/reinf_over0.png b/Resources/Textures/Structures/Walls/solid.rsi/reinf_over0.png index 8141637bd69025bf356c13441bf9d5b704d9f3b7..f6b33bcb1896a6421fb770b714c9f611c4ea85ea 100644 GIT binary patch delta 466 zcmaFC@sN3fWIZzj1H;_yjcNS%G}f0G|+7 z0|NsK3kzpwXLWUTUteD%BO{>9flrG5K#IL2$S?Rm7%)hAGrIwWI14-?iy0XB4uLSE zsD@Vq&=Mz47srqY_p8&p`I;4Y>Rl_({{R1E>lZJP1uh~c%iZ2 zail=9RZ~H-!-Nm_BjaYSP-qp=R_yFrq2S4z=JDwyXM%?7Jr46@ENL35EMW>y#hD)- z+pyrm<%}lV`GP5?6)Z;ojmnhQ}Ybs|o3VO_%x}METVRn0|p`iiO-F+qE ztCx6$6sQO>{rTP(UGQ_?^GuG-4m@ANac?etk30vjG9OyC0tj z{w&+BclvpM?TPEW?Uoh0`u9csVr-E<-^AB)aNA!-&f|WuI_X?_z))uJboFyt=akR{ E0L$CGF#rGn delta 1118 zcmV-k1fl!k1Lz2l8Gi-<0063Kaozv`1TRTMK~#90?OWSUB0&%>$RfDFFvKkJMTuFL z#Kl+RPx!h1gyB{8!MHJq4+cU|F3X^aY)&slniddK&CmmTl1||;0##GfbvZRLS~Jeh z&PI}7P^nZzI(%8T0T{(%@xya!wVFClmr^)k04VeD@Ic*8hkvr3xA451n;R;XN)uVB zR7Bq$7yY+IK>5?tQzhf^_{{aITBUqGKP9Db#sIkT*VosS^L@&B9>rp@sRaZ4D3$2z z?yfqYr4-KW0RWT-y1gEG+3eJN=}d?u17&ZNRfa(>_5 z(qXYkFT)|-*X!@jJvus~ySuxoW7TRk`l&Eyc(~$F9wF}J=54(;%4pgP(Gbbt7QXDdBC?qL4Rd<@BkWzJ~BK2fb#u*-^zDK z&I4>iya`@hT#Rr<8jXfp=jZ2>_kzJd$(PqxC6UVh84Rf1ZYzbMxU`;^LhJ#iJF=Ua zfID;Q`mkAIKp?d@&uV)A1V{S`LEdjRM3ESDiU zN$c@P-T(2{=So#crD-e5t z&e!|CPpww#T`EjkI=pdVQ0MDW4}jL{*mAAlJENPTAU43Nc>A!hlBOuy<79M&u}Pv?;u^%XRJmN9#JpMjJ%f3H z`&vy^jhqBUo*F9@3QB?*g7P0RLtZYoSpUh#slj0 zx|$t8KLI5*Hp*EZV9p~*;moKk9*STfWzJ?Y)Y3|6POojlnQCxW7by%xrW{_?9D2@ct(No;p+nbt4*vLm_6p5P2C^i}U0xukIHk;}=@>d0x zQaELRb<7SpV}M?_t4I?VVcsOkQ@c%xL_*CYu$02N2PYxt%@^<-f-a?SCKX=x;c0Uo kK?-N0z_Q9%okJj^zuW-DBb&$^4*&oF07*qoM6N<$g7GUA2mk;8 diff --git a/Resources/Textures/Structures/Walls/solid.rsi/reinf_over1.png b/Resources/Textures/Structures/Walls/solid.rsi/reinf_over1.png index 6f2bcb665a352d0023c9ef17c2fc5fb6c7cb60d9..a7800d9dcc3075ae1afa8be8f379d8627587d222 100644 GIT binary patch delta 379 zcmaFF-pxEgvYwfNfno0U#y3EUu{g-xiDBJ2nU_EgOS+@4BLl<6e(pbstU$g*fKQ04 zk&%&sfq|2gle4q4y1KfBg@v!LFHrL2()T_H%&Z+J4{$blSa2D>4IJX_mstQ4?(A)eM#Lg1F=4FMenJDLn60i$b(gN!7B} znqJR>tKTR6Vqvhps+<=zpCMuOeEWlS%ol%7Z7N|FN@GcTDK(vIS@e&Ik{MsuuUT^W zP|(2=?s}W%NlzNyawZuma8w(6vtHJ{V_Z-dWpMKlJB#>?#@pB5Y-hRsjp57wgsm2j Su4n>%&EVSqHAKuN_~d)9HxwRp!ET0q*bb9e+B{NCqOhB72dwv>#hBk&*!ODtBKE&xiC%u#Ce3cVzIbp0qArj z5}~*fI-AVNkZ}Sa)FHkj#BK8O=sc_hhYlDg0OtF!0NUUKq}hvMGMQ+(pYJR{H`x0D z<#Kt6C(`ft#c_9cxB6{9n+bk?c@YffCTDdL)oPX127mjSVOOv%z;2Eod1sh2p6b`j zOYSYTf-L}^IxrfI1n+7AUPGGzWQ)^w=w7 zYytj^Mt_t{r3CvCTAX0WTC^Oc0OrwL#SAd?k#J{kcMiNw}(FfaH!9*fU%cx1C#Bg8sQg$-zfr#K0~ zy#U7duZIW0y0)tK3AO-gz8*;pnbtZQ0Z7TyZ+}W>nGUu9YQCP7WX915;CHYEa4T=W zFSxRGlgs4ktmAMo6^)l*GeX;%{~fkn;>g8(lEQ0(!lk$S@5C1IlDF!clIr0DC4iW diff --git a/Resources/Textures/Structures/Walls/solid.rsi/reinf_over2.png b/Resources/Textures/Structures/Walls/solid.rsi/reinf_over2.png index 8141637bd69025bf356c13441bf9d5b704d9f3b7..f6b33bcb1896a6421fb770b714c9f611c4ea85ea 100644 GIT binary patch delta 466 zcmaFC@sN3fWIZzj1H;_yjcNS%G}f0G|+7 z0|NsK3kzpwXLWUTUteD%BO{>9flrG5K#IL2$S?Rm7%)hAGrIwWI14-?iy0XB4uLSE zsD@Vq&=Mz47srqY_p8&p`I;4Y>Rl_({{R1E>lZJP1uh~c%iZ2 zail=9RZ~H-!-Nm_BjaYSP-qp=R_yFrq2S4z=JDwyXM%?7Jr46@ENL35EMW>y#hD)- z+pyrm<%}lV`GP5?6)Z;ojmnhQ}Ybs|o3VO_%x}METVRn0|p`iiO-F+qE ztCx6$6sQO>{rTP(UGQ_?^GuG-4m@ANac?etk30vjG9OyC0tj z{w&+BclvpM?TPEW?Uoh0`u9csVr-E<-^AB)aNA!-&f|WuI_X?_z))uJboFyt=akR{ E0L$CGF#rGn delta 1118 zcmV-k1fl!k1Lz2l8Gi-<0063Kaozv`1TRTMK~#90?OWSUB0&%>$RfDFFvKkJMTuFL z#Kl+RPx!h1gyB{8!MHJq4+cU|F3X^aY)&slniddK&CmmTl1||;0##GfbvZRLS~Jeh z&PI}7P^nZzI(%8T0T{(%@xya!wVFClmr^)k04VeD@Ic*8hkvr3xA451n;R;XN)uVB zR7Bq$7yY+IK>5?tQzhf^_{{aITBUqGKP9Db#sIkT*VosS^L@&B9>rp@sRaZ4D3$2z z?yfqYr4-KW0RWT-y1gEG+3eJN=}d?u17&ZNRfa(>_5 z(qXYkFT)|-*X!@jJvus~ySuxoW7TRk`l&Eyc(~$F9wF}J=54(;%4pgP(Gbbt7QXDdBC?qL4Rd<@BkWzJ~BK2fb#u*-^zDK z&I4>iya`@hT#Rr<8jXfp=jZ2>_kzJd$(PqxC6UVh84Rf1ZYzbMxU`;^LhJ#iJF=Ua zfID;Q`mkAIKp?d@&uV)A1V{S`LEdjRM3ESDiU zN$c@P-T(2{=So#crD-e5t z&e!|CPpww#T`EjkI=pdVQ0MDW4}jL{*mAAlJENPTAU43Nc>A!hlBOuy<79M&u}Pv?;u^%XRJmN9#JpMjJ%f3H z`&vy^jhqBUo*F9@3QB?*g7P0RLtZYoSpUh#slj0 zx|$t8KLI5*Hp*EZV9p~*;moKk9*STfWzJ?Y)Y3|6POojlnQCxW7by%xrW{_?9D2@ct(No;p+nbt4*vLm_6p5P2C^i}U0xukIHk;}=@>d0x zQaELRb<7SpV}M?_t4I?VVcsOkQ@c%xL_*CYu$02N2PYxt%@^<-f-a?SCKX=x;c0Uo kK?-N0z_Q9%okJj^zuW-DBb&$^4*&oF07*qoM6N<$g7GUA2mk;8 diff --git a/Resources/Textures/Structures/Walls/solid.rsi/reinf_over3.png b/Resources/Textures/Structures/Walls/solid.rsi/reinf_over3.png index 6f2bcb665a352d0023c9ef17c2fc5fb6c7cb60d9..a7800d9dcc3075ae1afa8be8f379d8627587d222 100644 GIT binary patch delta 379 zcmaFF-pxEgvYwfNfno0U#y3EUu{g-xiDBJ2nU_EgOS+@4BLl<6e(pbstU$g*fKQ04 zk&%&sfq|2gle4q4y1KfBg@v!LFHrL2()T_H%&Z+J4{$blSa2D>4IJX_mstQ4?(A)eM#Lg1F=4FMenJDLn60i$b(gN!7B} znqJR>tKTR6Vqvhps+<=zpCMuOeEWlS%ol%7Z7N|FN@GcTDK(vIS@e&Ik{MsuuUT^W zP|(2=?s}W%NlzNyawZuma8w(6vtHJ{V_Z-dWpMKlJB#>?#@pB5Y-hRsjp57wgsm2j Su4n>%&EVSqHAKuN_~d)9HxwRp!ET0q*bb9e+B{NCqOhB72dwv>#hBk&*!ODtBKE&xiC%u#Ce3cVzIbp0qArj z5}~*fI-AVNkZ}Sa)FHkj#BK8O=sc_hhYlDg0OtF!0NUUKq}hvMGMQ+(pYJR{H`x0D z<#Kt6C(`ft#c_9cxB6{9n+bk?c@YffCTDdL)oPX127mjSVOOv%z;2Eod1sh2p6b`j zOYSYTf-L}^IxrfI1n+7AUPGGzWQ)^w=w7 zYytj^Mt_t{r3CvCTAX0WTC^Oc0OrwL#SAd?k#J{kcMiNw}(FfaH!9*fU%cx1C#Bg8sQg$-zfr#K0~ zy#U7duZIW0y0)tK3AO-gz8*;pnbtZQ0Z7TyZ+}W>nGUu9YQCP7WX915;CHYEa4T=W zFSxRGlgs4ktmAMo6^)l*GeX;%{~fkn;>g8(lEQ0(!lk$S@5C1IlDF!clIr0DC4iW diff --git a/Resources/Textures/Structures/Walls/solid.rsi/reinf_over4.png b/Resources/Textures/Structures/Walls/solid.rsi/reinf_over4.png index 3fe7b22905750d1d114672b453d087f53cd4a22c..9e8e9dd40ad31ec3840a47e52400f19a1171c665 100644 GIT binary patch delta 377 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 u19YwcN5_cW1HcpDIg-i% diff --git a/Resources/Textures/Structures/Walls/solid.rsi/reinf_over6.png b/Resources/Textures/Structures/Walls/solid.rsi/reinf_over6.png index 3fe7b22905750d1d114672b453d087f53cd4a22c..9e8e9dd40ad31ec3840a47e52400f19a1171c665 100644 GIT binary patch delta 377 zcmcc5-pM>cvYwfNfno0U#y3EUu{g-xiDBJ2nU_EgOS+@4BLl<6e(pbstU$g*fKQ04 zk&%&;laqyog|Dx#v$M0hy1IdZ0Z@|nAH!cD#ZeOE7yKUr816OijRcBu7I;J!GcfQS z24TkI`72U@g3ml%977`9-%h(&&vjUV$JI3J*Z=xGQ{r+~u>_uOIm=vm@|N=?$DneP zf_oDMlpL%+^ExIe%@Zu>QPdIj*}kEQO=dakWZgXqH;iB8F`kcof8w^s>>Ev+KWqsx zxO-?GBg?*DdzV~16m+nJ`*nK3ypWx1JZA6FPk6v^NiB_4P9Zlae1gz@!yv}fd}oRr zTef)WDs*Z6Vm11^Aj#o?%sUA|5ulRu3m7sd>;CX{AIp{5k zDzs6m(7CDD829h{)#>2w7rQg?KSx zxx+8u#?SSpe*o_6!MHJ^ZVbc#E(nN$&Fj#UVVsrOt;Xpd=OvSu;Cyt|yy>p4DkH?i zYPDkBpjNA`%H=ZM-Q7_%8WjidC6l4W>+9C*FD@=vHbglW2Y&&f12h2#W6 zdwcZj{@!9PjB!9Nm!p^YoYI*L#p7{{xiCrrH#awe=kxgnb6|`E_G2-MM5Aw*i*ORu zU<{s+NG8Q;PUd1yM`I5T4g^EyMCy!ngBGDM7~$~Gt1Bv%%VM_g-rl}B_vGY+uCK2* ze(Q8PEE}{?0Dp|Xyu74*K5s2`l}hD}0$QyWB@zkBX0z6{olb}KY%Lss5@d$`;sDM@q_*yJdDwz}tAeT7+3ZQjFIGIe8Jli-0s0MoyY&M%Kypdk7 zCysi(ZvAaGoeF+gECf%+V|t!WX)qWFgJF2P-DZs;5`W>Dz*c}$j#8#hK+ZCB{a&qF zVXfa_I{_q|i-lYNp;{aN((|=Py>G+uT<8fhhpcH^N4x{ZX;Z(rG!vp2= zd6ECa%pV8^xS`waZv2Ym#qaTW7ms2i+zoPXAZ6}kQxGbEdjmPaIoT8_QGkruvDBFc zwgV8{Ab-LGW1Sxkheo-8y$qs$_wDddu$Nk%ZU`qq4aVRrKD`6jbHHdc`mgH(vl)_` z8atZ=wgcqeUNUxipUMG9Wh0k|geLO($y7?s$UX>c2c*^+TQEx4kB^V8#S(4-Wmn+m z1a0+tM1v@6O*Gy6yFp1pL?$~?&O$}Uq==9m2Y=Y>^<>)^nSxIr2(cZotGfM1VJAt^ zQmG`^nHAP?tIRHqRjXBNeRHedOUSx_v#5D~er|SYtXM1xMr8=bZ>tRH1|<%VZ*?}C zZLJL=d7=~84uJ9Y0_ipd=oTX=p9D=)fbUIGjYebR1}LMw*CB#W&i>h*ot>HABxMJ3 z3V+)=MC50u0@^tM36=L0Ao~yk)gxqwh!w_Tp#-M_WSoK3MisPk0NyO}3TUEmQ-HG{ zfeS5LW!*w%8D6VKxEs`944$y7J_O%C0j&F8fM^mMDlp~-$z1sEfYEwcbAx@ShaRIs zp|DYn4*b8&Aj*`-a=D~_zb_ny6ue|E!c9p~gE4rNS%G}E0G|+7 zXJ=<1b62E@JCI^33Gxg6&+v4+ffta+S>O>_%)r2R7=#&*=dVZs3OahaIEF;Hzdd8f z#o)lhbnwal`F1QDIa*#H&eJryIzQ`)r3oX0M#Joe`jelf7#f%u0vH&$9;g{?o@}Ge fz`$C-@S<+&dmcuqW!?5b(-=Hm{an^LB{Ts5HSak) delta 750 zcmVVi|K~#90?OVZa;xG^$5HwU&h!cmc3gXD- z1NZ`Nd@eWm0X~2;f~tGqgb=8tRATk4I&w|6OEpe2CVo;hNQA`m{NfpBh6*upKA%|^ z7>!1(3(RISmJe0Vk8c5i00Cnt6kZX~Y&NN0tI?mAm(+6M4SxaccAMUkgqjZz6h%>L zx$sH>tJO-`BuPG54!j}Yu3o1~wR&N>2#cVAFN*8SlmwU@1K4@olaR}s8o0^uoYm-@n5Smu> zDxhdMBY>G3hXe5#0Kdtth6NO8iYkqz!(Ze zAV9zv3Pm75z!(ZeAb@)TvtIA&RrODTO@LXiM^QtUwMs((8TIVu{e&?R#(&omdj=4dAcrO7d5>vjdeO5Wl^YT z8x$~xtB_Y8LQsH!FaWak4ml12lVI9d_X*1v<=D| zToX_p2aKM+K!H1;?kfuX>kZMm8t!9!wII1dwPYEC3`#|*!j`%L;+izORVftD00000 LNkvXXu0mjfy?s#@ delta 853 zcmV-b1FHPt0pJFZ7=H)`0001UdV2H#00SpUL_t(|oW+;TZ{j)>#ebxQ&`Ai1sv;I` zqiXuHXxSqE|7G`d7QBus4=f_8DiD%a0#Z7Q)&}wcnR(OBk*t&4*uGaM*VlHf-|xTj z7jY~fT-QC=SqOpax(B%mgbe=auqgGTG}``j7!@ z+aG$p9*ZzU)3n0&?fxFeaZ367!$av4RttdPaJZxL@ph-SZNI4zMQVVAVVcBIgkhTKx?ad} z6w&Q=iK8el{eQcyZQG=2s_a^}qo!?4%Op_^Hi?tGzi0W!c$^z2$7bg)4WJB-dYzi4 z?Pb~TS5P^Ck3!`Dn(xV0m8;^o$k^?60dO4WwJ?wgLcg6!G873qcUzc^*QDT?M|~-vglQI!TgH zD_Az2P6xvvRq(0ALsfaU843x8JKM zAomR+#D7}=LI^z1tE9jo$RIydfqnQC1>!i)<-n&Y5Wa7v+fD&x|5XKYt3YnKLWrCK zf1(cjI~wgMpz6SQJm%==2u;&eB`i{4Fc=)+T z^1QW`%JNzTSrwYPuFeBlD2biPft=C*$T(DZNY1He5 zEWdA$`(FWUA50ff#OdiNaTJjxNg+3M9pCqJzcYKj+#5iernD`K`PR`H-g4yW=?Q?d zPKS9Ia@Oe(%w~$q5X@#cww;?3GC45cGs&Mq)`topS}f@Gddz3D!bkyTK|sA;=V>}s ztWN8?;$*ojy_C$ukojzuyO^i|kBs#fR__ fm($wczMlUCaU6w_?t%9p00000NkvXXu0mjf@qezW diff --git a/Resources/Textures/Structures/Walls/solid.rsi/solid0.png b/Resources/Textures/Structures/Walls/solid.rsi/solid0.png index fe570c054fac195b1de49c70d9a0856eb79ebc8f..3849504b6ff74b96092fbd1ca668480707dba2e7 100644 GIT binary patch delta 375 zcmeBUYiFJySC^ma`xE7FNEeY}q{tpBUzqj!P0|ht>JR*x382Ao@Fyrz36)8Z$ z51uZLArbCxr@!TEHsEmm{q^5@8;$b%9uvdV4Jos}{Mj=xd1_bGv9?VO5jVNBa>b5x zIbSHqW8An&e9NU(j2j;bhGaXe*}-zHA>t!v50EbspuVdiqL904N3T-Fb$Q0dh@A@= zj&D7e8nV~=u;87@3(q+^ISkCBA`X-an=N6NU1Zt+Xg1$K76c%X8{?TXRO-YIuaU2NCS_WPHh6Z$L{O@pKmvRWpw;?eY$mm!{H{nil{7 delta 769 zcmV+c1OEJn1C9oe8Gi-<0063Kaozv`0@X=GK~#90?VDe2qc9N0KN|vgfe4=R$^p{X zoFK=}33%Ne04WCu0umy^pMA)ZW>?!luxoo8eiBk!*_q+%I36HM&5Prh%dQpzL{WtOevdrM;4hb>=lQ7{;he z1lkDTFPHfF{*E9F;d>qkA%m9)v{(W?K^Ou6PGt$tbuskqSXC9bO|1j~07|bx*#W5Q zdem4hd)%M!MTiOTVYC%M7PA1V9Z=0IfNBR+GYg>Ffu6rJJgy_+6KInNd7gLsnNo_& zP@bYFzip5)hN`OI{=UI~L2#}4 z1J@paF@HIOEVu=z>l&2OhqZjuyqckuYIh!x^Gr~Nk%_!~9xw}_+5y$f0;qOCHM0OR zjPzCEzW%>hEM%A+g_PoGb-92srd<*QXpp1y?+Y--Zhs?$z;T?xPEi2Z?RNkF`vOrE zAx+cU?=m|?v=9IQvMhsXnxK?|5CX>7s0iRi+j?DK?iH5AEP!eUR5J^p+5y#QE5OUO z%J#Hv3&Su#@bN71GrrwRQ|aM=APn(?F%$#+2Ed=`^Hj810!5zVZM{Z%I3O>I!G44L zzGEJ=iGcgw0hx6JEd)rCL|OB+76Jh3s>Qzm*(C^1fyPf~00000NkvXXu0mjfg`Q$I diff --git a/Resources/Textures/Structures/Walls/solid.rsi/solid1.png b/Resources/Textures/Structures/Walls/solid.rsi/solid1.png index 4374ed1e1011027c4388033aad7d9985000188ba..9ac2271692b8f0116025dbc2b68c5e44b53d8e06 100644 GIT binary patch delta 257 zcmbQwJc((7WIZzj1H;_yjcNS%G~10G|+7 z0|NtRXJ-ow3twMfpjd%duQ-rmEeY}q{tpBUzqj!P0|ht>JR*x382Ao@Fyrz36)8Z$ zYEKu(kO=p;R}HxiCZ=!HT&UYt2 z#VWSt;<;yZ(yZ+(CUO19%Jm4;nl<6rffj*HDK$MCC-!WgbTItEUh&?3!>(hG8Moy+ zKR?b~65D>RpFKnBqP7kj|Ap_iR`zlaEci1WWu29u(+NvgHejtf%`%RLsWy? zA7#6~#TmBtzQVgCcKj7yfFj9!fyv~Ntz-7bTvx%Q-?jJGe>fn(ej;*<$N@oi56#$z zjf#8^<_P!Be;&C?!AT||avHaZ#SzA~#2=q$wQqg)_^Xj+dhxvFo|=-+V?;mZ{g(%u zUJtTcgfrmt{-lWvZxmyE#j&+um&(4*h)t$Cfb zX6v%t{qH>g*Ub8E?>Euwy!f4eoELx^e5W#c)#C^ma`xE7FNEeY}q{tpBUzqj!P0|ht>JR*x382Ao@Fyrz36)8Z$ z51uZLArbCxr@!TEHsEmm{q^5@8;$b%9uvdV4Jos}{Mj=xd1_bGv9?VO5jVNBa>b5x zIbSHqW8An&e9NU(j2j;bhGaXe*}-zHA>t!v50EbspuVdiqL904N3T-Fb$Q0dh@A@= zj&D7e8nV~=u;87@3(q+^ISkCBA`X-an=N6NU1Zt+Xg1$K76c%X8{?TXRO-YIuaU2NCS_WPHh6Z$L{O@pKmvRWpw;?eY$mm!{H{nil{7 delta 769 zcmV+c1OEJn1C9oe8Gi-<0063Kaozv`0@X=GK~#90?VDe2qc9N0KN|vgfe4=R$^p{X zoFK=}33%Ne04WCu0umy^pMA)ZW>?!luxoo8eiBk!*_q+%I36HM&5Prh%dQpzL{WtOevdrM;4hb>=lQ7{;he z1lkDTFPHfF{*E9F;d>qkA%m9)v{(W?K^Ou6PGt$tbuskqSXC9bO|1j~07|bx*#W5Q zdem4hd)%M!MTiOTVYC%M7PA1V9Z=0IfNBR+GYg>Ffu6rJJgy_+6KInNd7gLsnNo_& zP@bYFzip5)hN`OI{=UI~L2#}4 z1J@paF@HIOEVu=z>l&2OhqZjuyqckuYIh!x^Gr~Nk%_!~9xw}_+5y$f0;qOCHM0OR zjPzCEzW%>hEM%A+g_PoGb-92srd<*QXpp1y?+Y--Zhs?$z;T?xPEi2Z?RNkF`vOrE zAx+cU?=m|?v=9IQvMhsXnxK?|5CX>7s0iRi+j?DK?iH5AEP!eUR5J^p+5y#QE5OUO z%J#Hv3&Su#@bN71GrrwRQ|aM=APn(?F%$#+2Ed=`^Hj810!5zVZM{Z%I3O>I!G44L zzGEJ=iGcgw0hx6JEd)rCL|OB+76Jh3s>Qzm*(C^1fyPf~00000NkvXXu0mjfg`Q$I diff --git a/Resources/Textures/Structures/Walls/solid.rsi/solid3.png b/Resources/Textures/Structures/Walls/solid.rsi/solid3.png index 4374ed1e1011027c4388033aad7d9985000188ba..9ac2271692b8f0116025dbc2b68c5e44b53d8e06 100644 GIT binary patch delta 257 zcmbQwJc((7WIZzj1H;_yjcNS%G~10G|+7 z0|NtRXJ-ow3twMfpjd%duQ-rmEeY}q{tpBUzqj!P0|ht>JR*x382Ao@Fyrz36)8Z$ zYEKu(kO=p;R}HxiCZ=!HT&UYt2 z#VWSt;<;yZ(yZ+(CUO19%Jm4;nl<6rffj*HDK$MCC-!WgbTItEUh&?3!>(hG8Moy+ zKR?b~65D>RpFKnBqP7kj|Ap_iR`zlaEci1WWu29u(+NvgHejtf%`%RLsWy? zA7#6~#TmBtzQVgCcKj7yfFj9!fyv~Ntz-7bTvx%Q-?jJGe>fn(ej;*<$N@oi56#$z zjf#8^<_P!Be;&C?!AT||avHaZ#SzA~#2=q$wQqg)_^Xj+dhxvFo|=-+V?;mZ{g(%u zUJtTcgfrmt{-lWvZxmyE#j&+um&(4*h)t$Cfb zX6v%t{qH>g*Ub8E?>Euwy!f4eoELx^e5W#c)#NS%G~10G|+7 z0|NtRXJ-ow3twMfpjd%duQ-rmEeY}q{tpBUzqj!P0|ht>JR*x382Ao>Fr%o3R|8P6 z(bL5-B*OjeRY$G{10I))SHAsAzjmO$e1g{tr|`^sMHl>C1EjgHz1i`FEp4R(YYb}< z+m3am``_-GZ5h(YwS(&k&y5yKk$De}$^81y^6!QJnT0)#c8Pp@nfBNw@`Wm-C%C!K zSjtq*@?#yxW*z35n=O%L93R?+(<0d_st@VN`x_kNJXvJQ7%IJ^8R!}YPgg&ebxsM4 FO#r~nUo8Lt delta 408 zcmbQiw48Z@WIY=L1H-D!!g~x1jCr0ejv*Cu-p=;UI&2`qFkibov4*YD|Do`Y8~4~t zxEk{k3N~*n2wxW9WmoIA*ew6sDQPt&vCc~zXDs@D8}LjD5_&$z;<<~2133TFEdd|lF(lMRc zgB91>1-5W$U16*b@=C8rSivk49`#S_6@zbc-O}Z5vJ2k-HnuUi!YH@%WT>%zJ>Lef z(GX8KB!e9MN8$g8zfI9M{D?=Ne|tq!NP9xz@jb$$Mr@x|%M6%BKY tt>pP1>7V?sTyq!PdPL6pGB6GpJYD@<);T3K0RWGKt~USx diff --git a/Resources/Textures/Structures/Walls/solid.rsi/solid5.png b/Resources/Textures/Structures/Walls/solid.rsi/solid5.png index d4f50d419fb8f69add5073a70b824eeec4e1212c..3c0b42ddbf73d53c54c8da7192a85975e452677a 100644 GIT binary patch delta 336 zcmX@W{D5hKWIZzj1H;_yjcNS%G~10G|+7 z0|NtRXJ-ow3twMfpjd%duQ-rmEeY}q{tpBUzqj!P0|ht>JR*x382Ao@Fyrz36)8Z$ zlb$Y)ArbCxr$_TO8}P8aRrzjT{5GXNb!&*4R(H#kG&}J!mkO51TP%T^ZlMhpGq^&! zC9bnRs(r?_=Dcnq#}vVuFY7t){o2pHs(Dj0Q2GM50DJU?Wem?*JA$_*R65@G7Fa%q zW0lzL^8(ACFugZ!x|q&#EuHnB|8J{074aYXTLtv}`k zB_-V3B3QLgY>MQWtuUGCor0Ih)=V$g-+n6hB;B08zdG?O+1k+{_WIOqxu!hLNjmkNB3{?q}CCb}dPixKI=0&?9*EIBU!^n`!;ayt8Jp z0XaU}@4o!!{3o)Ykgt28V6IN!=6vGhPaE$c=YX+R* zbB*QY)cfu;Or?)s)Or;@gOlUopHusFx4 zPiAnjcrKkYo%dPgH_d`ZJ86Z+>gMwXe^i|rmri-Tc!Hg9LHEz<1Dp4X&f2>0JY!9J zXM^eTy&7fzOG`z>;30v)7^ds6o-SoQq%eE=|QcHN28SV5^Uz~ z`y=Lb;q}9WN&VbEYT_2G%1Kw%d+;s4_{cKOI^i>x+RuBQ0!{V3#J^F=Exq`bBrh;# O7(8A5T-G@yGywqjI>0*s diff --git a/Resources/Textures/Structures/Walls/solid.rsi/solid6.png b/Resources/Textures/Structures/Walls/solid.rsi/solid6.png index 95e408947910600e79ff7adc7072d615c27f7b37..a5a6dd285664fb8a9cf14cf963f055b368a6b75c 100644 GIT binary patch delta 264 zcmZ3^JcDV1WIZzj1H;_yjcNS%G~10G|+7 z0|NtRXJ-ow3twMfpjd%duQ-rmEeY}q{tpBUzqj!P0|ht>JR*x382Ao>Fr%o3R|8P6 z(bL5-B*OjeRY$G{10I))SHAsAzjmO$e1g{tr|`^sMHl>C1EjgHz1i`FEp4R(YYb}< z+m3am``_-GZ5h(YwS(&k&y5yKk$De}$^81y^6!QJnT0)#c8Pp@nfBNw@`Wm-C%C!K zSjtq*@?#yxW*z35n=O%L93R?+(<0d_st@VN`x_kNJXvJQ7%IJ^8R!}YPgg&ebxsM4 FO#r~nUo8Lt delta 408 zcmbQiw48Z@WIY=L1H-D!!g~x1jCr0ejv*Cu-p=;UI&2`qFkibov4*YD|Do`Y8~4~t zxEk{k3N~*n2wxW9WmoIA*ew6sDQPt&vCc~zXDs@D8}LjD5_&$z;<<~2133TFEdd|lF(lMRc zgB91>1-5W$U16*b@=C8rSivk49`#S_6@zbc-O}Z5vJ2k-HnuUi!YH@%WT>%zJ>Lef z(GX8KB!e9MN8$g8zfI9M{D?=Ne|tq!NP9xz@jb$$Mr@x|%M6%BKY tt>pP1>7V?sTyq!PdPL6pGB6GpJYD@<);T3K0RWGKt~USx diff --git a/Resources/Textures/Structures/Walls/solid.rsi/solid7.png b/Resources/Textures/Structures/Walls/solid.rsi/solid7.png index a880e87e0e001365eb01e4fbc7bcacb119635fcf..b4bc95f4f0d177ba63d815287f9152514b148456 100644 GIT binary patch delta 187 zcmZo=I>R_YvYwfNfno0U#y3EUu{g-xiDBJ2nU_EgOS+@4BLl<6e(pbstUx|nfKQ04 zv$Hdhxhqn{9Y`^i1o;L3XL!2ZzzfLZEbxddW?S0SpXW57Z1cPqtBK eU|=m^cu_a?JrASQvTl2zX$+pOelF{r5}E+rfH=Yc literal 261 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=XFOdTLn`LHopq46*+AgHy3qF1 zCvvXy6?$yz`pa*4t(K|s?4;sz-vsZUee`-)*!vInbpEk(DHJ$pHXLAF%D}`vg^5EZ z07c+D@9g#GJ{xcTr?&CoN8td5MrJQY7CsGD0gDA94i6fFNE5hIXrJ)AUVd-BdHi-m-=zuCEe#l;%t)I3q2aD>@YnDx{W%%*Ncl9!C?|(X8u;i$cXMXPd;4XXf?u0LP4EI=1 z+-9f}PWaz+;QoW%@#f_h?yQ&QK2`VT+ml6~ufATaoEpdU>etsD@00qP9{nz4v|KJL T)$qsD3*=-^S3j3^P6f zoe?>4DJ8N5EciH%=>s;n5NQMUcv+U|0&F;dGyz9A09-f$S_5EQ!Gb^g z{t#yiSmTej#iW!K2Y`b5Q@nrdlTx@hjTI*kaM}5O$W{=7lLdt0BmpsabU-W~6+nRp z2T yq{e~OJCFm{S|xu2a^X@+h_jyt%CX_YFyI5HZw?UUZBdH3sBPRm&{)v#ZeOE7yKUr816Oijhv_`QQzq4;uvD# z-+Iwe=zszTi=)q!KmU(AZd6jr`DPUxvw*$7jzN@XMT~&Qe!&-enGCELZWS-syOrn6 zxj774q18-FPFM9GEVpOe=AQ7H@y2h?82g6zax!-tH@{bSA>FZyHPKw*9kYoyg$n>gTe~DWM4fZKYy6 delta 281 zcmV+!0p|Xs0;vL!8Gi-<0047(dh`GQ010qNS#tmY3ljhU3ljkVnw%H_007%bL_t(o zg~iv+4TCTYhT)H-S9&T7WC2u({fD3%WPorlhxA0%M1khVcD%sz3QJfSy!Yre%d&XY z6F0`7OTd9!Yvlt1Tq)Ur7}r|M1*C8QG682e0Ni@v_i^M8xPQXm`woC{1qc3G*HfG= z;1_?+GdAavH~>Ndj8%=73hbDS!g64xqxT z0x0p~0BXD_fCJAC;KH*4IPt#$xhIt+pyZ^sO!69*o>bBR?w!XItUwwM0(#)zfL=HN fsH;bV#C!lqTN3j#Z6XfW00000NkvXXu0mjf9&&e` diff --git a/Resources/Textures/Structures/Windows/plasma_diagonal.rsi/state0.png b/Resources/Textures/Structures/Windows/plasma_diagonal.rsi/state0.png index 60d1c0421b3fecf74c453715810e8e5ffcf32774..84f71e4833af719f7573047e0912d80edf61c378 100644 GIT binary patch delta 687 zcmV;g0#N;gd)Wn$BYy#eX+uL$Nkc;*aB^>EX>4Tx04R}tkv&MmKpe$iQ$>+VQ9BfI z$WWauh>AE$6^me@v=v%)FuC*#nlvOSE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JW zDYS_3;J6>}?mh0_0Yam~RI_UWP&La)#baVNw<`9$B7iW07=OT^#7sSrUd+IAeBHyx z*Sjds@;>+H=vVS41AHR!9McVpc!PLm)6zNb6NgwyQi#uq#|^q5@gvt|m)|%S9Ts?I z$jGGTi9^ITl3X&m%3$PJKou$^#}EDozq>UHQ{5*!IUL z(6b9P>$d%UY}?Hf!2b+fX>EVC0nC1qUT4l)$$E+a0rYQDSO@H-6Or7z5RQp)!z?k5pttbR*U}t z000JJOGiWi8UPvq8b846fRP~=e*gz`Nliru=L{GV2?-KDxy0M>y?nqYewZA0MicipAZQ{^9p)f5#UPgNG2# zMiXaQK?+X3f>fL|AO|N4$i+zlO7P-@#Fw%JSl(!j}G9%qXIZ_ ztgGJv+_<%N{6{2#&lc0+3rOLY)9pJz68BBp{}D;!y%lKS?-gj_+s9^aG;u_P7i^Cp V9h$cs_jFzd0QSnQR(GoVYcXnbs zFV0i6R@y)BB>Vh*-}n7~-}`*u_v`!Tp0BN0a!=6@iU@+Zr@G2h2kr*_Q&<4L)y~cv z;5Ic<)ua+c@l5?Qg?P2MlpweRa($!L==}*NC?OLsDn7{+4@JOif^aQ}M|h!C(hNQ+ zAcxD0SKr-dG{|C^v4Qo{-blIBB3E@rrKO!U^+IQ>;1rDu+(oW92ONYXjW@(Y!LZ83 z%Zy3C9QdsdQ$|B_iq=|YT%-pyG&PsDu#xQaj-9_M+D=PZAI#1B^sd2PN$Qi8H!;@ zFoRS(!WthZ!|L3WlTkk&Nfn}UM3a@ULHEo1ls2u*Xw(CxuaSL)BI!V3b%Y(DNX7XG zWj4`NE+bJ$+eF%;!Q|3Jfs%q!ND6Bzuruehi?k@3qP8d#giNa^3=DGO^`>LzTyH3p zGqkEzv;zbqNOM}M^&Jt3s*_ZuEh=4)Fnrii86$Dl?chGkvPKawVul!LlT`#YN>B&S~XQgf{(H zFA58i3X-8_B?+V|S-6Y&z}V4IMNoF9+J>kIvdCqEI;?(&)hYQ&J1sg$vssczr@-1s ziFJs))9-NF^jzr03tVK@rTa~ej*XbT9n^aDW8n32)nQfR!FH-WZZKey!O8@QcKFRs zmUPgdM~P0Wll0jvHqvT!SRGD*w$cofJR4)pGbY`beI&SnRy$V`*L*-AfKP z<3d%*dfq#rH0ZfmDyJ8aiRG@T8s+8F? z9W@5tJH5+)|8DTkszIo#^AbeoJc4-US%SDV4DJ^RqKzhqubRQ@uCEZpY-RJ$4pkCF z-XqnXMfLH)gUg<7Jylz}@~r*niGjbo$cXc2iYJ%9>%4R*(!K0jN&I4W>8cz3-roMc zf|MVvDkM7AyO#`~XA)QL+hJ;O&_Akde&<+l)0TXycj5KleRlTr zf`W!EwkN+_ecv45Vv^LhTup{}U7yZ21~K=Gf0;_f-B_x#4^+xPT;@Jajk z_BXZM-dr00+pjG<*DPllbK}r&?W^7%e1Ds^=aDy;B^sXbUs=egU)MgpYtGi*!~2Ri z%;q+BCDiQ&#MJZu>Mz{9^|PAGiO*lJyt`ts?{MAh!W&hW?#+|WZ(Z`>+$qB**P6BW z@7;Lkf!eynVPad^ild%l;^5(hhSMFtfB#VaqruzppWohjqJyzB91x_`0>zZhF=aZ|^e=T{wGR;a|V**|lMK8ZrOGfdb#NbU!$9M0G`t Kr*Cods{aE2tbMlt diff --git a/Resources/Textures/Structures/Windows/plasma_diagonal.rsi/state1.png b/Resources/Textures/Structures/Windows/plasma_diagonal.rsi/state1.png index 1ae08dba8877a734110a8725e09d327a12edf277..3655b4b9d1598142be19b4db57ba0aaeb3fed4ff 100644 GIT binary patch delta 661 zcmV;G0&4xSdcXycBYy#eX+uL$Nkc;*aB^>EX>4Tx04R}tkv&MmKpe$iQ$>+VQ9BfI z$WWauh>AE$6^me@v=v%)FuC*#nlvOSE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JW zDYS_3;J6>}?mh0_0Yam~RI_UWP&La)#baVNw<`9$B7iW07=OT^#7sSrUd+IAeBHyx z*Sjds@;>+H=vVS41AHR!9McVpc!PLm)6zNb6NgwyQi#uq#|^q5@gvt|m)|%S9Ts?I z$jGGTi9^ITl3X&m%3$PJKou$^#}EDozq>UHQ{5*!IUL z(6b9P>$d%UY}?Hf!2b+fX>EVC0nC1qUT4l)$$E+a0rYQDSO@H-6Or7z5RQp)!z?k5pttbR*U}t z000JJOGiWi8UPvq8b846fRP~=e*gz`Nliru=L{GV3IPN_*4_XB0KG{>K~z}7#na0P z0znXj;c75}Wdu)pGJuKCB#gtf+@lOKw*?P+6UAM39^GA?!1q(o0P$jsPhsLA1PBvP zDftI{;^)ofBuqSwcfSSZZ~#65OL*812Vvs7;g*goby$fXSm51)Zpr0 zP>ZVuwBTw1t++}+58fTni+2TR;LQPAcvFBTULBx~R|Qz$#Q|1$QGg}B8eon84e-Dh v1HACr08jiUz#IPxVBqfn77hTy!~x(14wUkwK{{2*00000NkvXXu0mjfpVcXg literal 15665 zcmeI3eQ;FO6~J$>WNa{$wsfS-w5|&bvGwJB?Dy;LhL8Klv-{q5 z-`nga2B8(FRw{msbnt^@94gNALpwreXsHb|L9MnFN-Y)BYAA}ph|-ZMR;%>B{m#wi zPNq8JKljb-zCHKcbI!fLbI;lL&--C}+qY|L7S;d&YFk@E9q4YeK37(wZ)0%qBD#G( z(b8=IFz3tGrwTms*a85=F}1VH>fMaYxji?b8ICe zMK0PTQps3$X^PCk7>q;BG>{!%(Jm3yP2Gs<(}XOlrwxp95)Kz*S6pvAUNN*`Huob0 zd88FBjn07tWILdtr;;*k?nhf$RB8978Yv}bk|#?u?b=~RoyN@46K0zz9;Q}$HZ>ei~7qNk1P{48!#%6G{d3`r&o3Y_3zI5#6WJ9)S0 z^oqRmn;b84T$z*HOw31ESJcQr$p?=Pw9v^rM3-B1xXXQ%&BT46`cWiPnvs|Cxn+J7 zS&Zn(xMT*^xYP^Tgx2e4OM_)Ii>FF#(qnoOEei%6ezwwZMXQi5r>tY$sL9Yk$uP>2 zgi@6)+~rd5A!K~A%gsQSSCM=Xug`7e z!YW?mqO>l{Z+3KY#PaQs)@vPua9C{B3{yheX$=L@K)s4q=J0V5UQv9E!1r(r^f=v2 zk6ZRKG7kk9k$HjVmF(G=Y+hPf-gO~5a$R}jZja*RdjzkwacSC(=hj)~Y)YV;k}7KF zQmkx_wHF2LMRF<;xrcKxPM1qy+|cP{Bw2Pc5!vT-IG`kWojrxURB$sTREuimeE>^? zm77)YyOT#tdCxZ9gp@R()m8%bLSHF%YBaTY`Lpdwlw_-A2W6}3A;LXrw6rYTOr4s} znIXveFEgJ$Mmh>LQrF12%FdeJiJ?c#w3LL6y{MjM($I2VC!68!D_03(l&#E|`Uw(Y zNd2EI4Ku5%|0@lZ8}DbA1`BvDx*V0XUZ@1w!T~M}%q(-cd`_;cLbXn%k!RueAz2!@{83<#M?EEIy1|w5u5y>k6spU(2xii33H-+TeCIHAq1RE<=)KeV?CJlacUEn3 zOGg-h!6g7}xf6i@Tt@e^0Hino&fSV$cijoV)%t@QpIZSy)tS~%V`t{oLu>xfHok0r z;L`S`&u%u6X9L&Z~JR%s0IxFx;s7BCb!*x?v>H* zKkZ&LuXS#neV#abLfHJfn{T@Ea}O?<1-`f|U41Yzd}zhMqLWWPb7#v-59|j=@15m- z?~TK6|MQxEtnB~#(RVL)zayMKcW7hc_cw1{e)~NSFR49$@)uY9a`e4_-8Z47zBcmA zPfnhOr_L^w?>_VQO;5V!ymagx;q_y$tFxEw*thw8yZl1mpN)rqeASIN{6#yqZ@g*U z-h*(%>VK~R`-lJbz(=E1^HT?I5mvXwfj0J)9V>U7aw*#vyYFc_zV5^(Ft+~0oY=&k z+PCiAx^azgg1hw7zQ*1A-rD+9fAzvAo>ii6UiHfG&*aN{_9+V=TR;1@^zF6Bp8&BV zFYKK-c?6nA_q=@k diff --git a/Resources/Textures/Structures/Windows/plasma_window.rsi/full.png b/Resources/Textures/Structures/Windows/plasma_window.rsi/full.png index b20d5ebd5efacbed1185a649c410e9eee61d80c5..41d24e9d2c47761eb99532452d5d92a59c25810a 100644 GIT binary patch delta 405 zcmV;G0c!re46Xx^BYyw^b5ch_0Itp)=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi z!vFvd!vV){sAK>D0YgbdK~z{r?U%ud!Y~kqtGH0;p-9-HK0_bFH}JkEuU>tCy?XWJ z-8b-gy2m9*4~4=Cnt!%aZNxUQE%A^ahS+v8^JOArGD?!<5`Q=p0fb>l4^b4+IJELS zr?DuC8vv3^De1$|5<(C}1%MYwz8A+`mSyls$+LgW<2Vk!}%OWgHY)J_YzqhgVhAYw z{GicR#qS@DoPQj@bpU+}9)#ow^op5)Hv({SwF3M%tjz?XwE`?`jg6Vg7+@%Q01w~+ zJb(u<2EZ|DW2R~Z;L}X?1?UZ|jZf1iwN`*3Ua_|1(EGJy%D+mE3I8FwNn23b)ROg{ z96~I_L~Ny6w_U4%vx|xItC{o5DLpw+5L^KS;%bH*st!1P00000NkvXXu0mjf?ijG! delta 1581 zcmV+|2GaSi1HBB8BYy@2NklZ@qG_2qqxZnY} z;0bvJZV(TExaStMf*lEI(b^t%);pe4Rb@tSkyYJ2?HO~3R;#FbPyg^c z9udbK(0r+b+cFHtF>JXPkL=~({#G);&wlvxw~`9bK?JBv$A9KNIiTv36J>iw2kIXjGv zWO!Gm;k-^;TYu-@)r-^t4Ci%Py-3~aW$pmd#&X_R0vO(u{_4wNjWq-Ee1w4f5%z8s(U zZTOafh~~T5@;)8w65_SGz>-#==H*#@Xt9(xdy6f?LVv^v5U!Oh1_%Om%948v!g}jT zozhl;yf$07z=J@i^)k+YQ^JRtq%H^(I*epLxXwfrV0o@5d`zFEp6cWN#>@I%+3`AE z`dvEKDnGFtjgB)SUL!d$sKX#8HCKHsfueG>y`FUdw*L7nN|U(NM}U6NKezB0W9hGL2%mx27HL#NAJdq+UR&_P`oyQ07Vs&i z37}HC{k=-9Iw?oYEX>|9Ofs!r=8hme3jBz_>updz)Gb& zq5p%`hv19l(5T-B58nk|I%+WaX-WV$^-7sQfGbD3dsANiFW}=vnV{2w zRex6Aivf>V!b^s4(uwDpvyW&Gu~JYE*L{e-Tvy76dJi0SKJT^4htB~-#g(95*MdYxV9NyVt~UV)Y_*B;63Lf-bpl07tL#J49_YT@fV` za5saWj2C4*1P3TFl}~{085rKWXl&PZRDa2Qe)1#h$BS~}LySIpe+d35%ahs7ZVh4D zwQ$odurb3}=x9}HQMPrp{|DTpX&)R~8bX^Hly-_(vsoFByn2~Cd~u68k1xJeVzxcfE*1d^$&Py1scJRAgs4m`1({9)a4{~&y$XRlvn+W^iknie4b=S zhu~$ZclW@h5kN_|`?QM~eQH6Ij#aE{ie?~`6y?$dFnwQdtg{W$*F>D=r|FA4w}$|w zM$1xOr~WuC9WJ*1o@uuuJBnc`a(_BgjxKL3`4pj~Z7-0uiJ+EiFZ~aaK@3E^7K~{3 zF)2*?O46BNY_oa$SZ6DlzL7|RPSC{=|5&nVW<~jl zYKeKOwNBnVf~#Y)tWs_RWgo(MmX6Fo1yDXQx0S|vQ_rD|eby;OVK@?vsxHr{rdPj~FiFZyo3kgZSq?I^drlmLw9b!{t#Iv483z!ao4L?!<9 z$Lr6d1eipdp!z7xlMKPb(|^+C-J8;U?NOCfhx2OI>069v)&c1I`F-Mqx!GO%d&@xd z&vG5#m#TzGlC6vY#TfVyV>k|Ys}0dvpYX8)st}{33J{f|q%i{0N{SkulD)T;6jPWo zPooe%x~H{uC-%&9Z!7-#_rILXmfUMZK4;bZ8Xmy0Ve(yd-Li4xS0=W$&31k;cCBYyw^b5ch_0Itp)=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi z!vFvd!vV){sAK>D0*^^VK~#8N?VB-612GiGPf;jzC~}IEodnko4zAM04P#3DrzAo)h4fo3y#ev9&mizovWJ#9j~vC^b#Gew#KxT|9(OcH&~8F2;x z(*$UJb2U?3M1LA!Qd?V&MlbJ~;v(7roxJJ|=n+=YN1YMh12pEyZ;DH4444(c0E*rc z44~*O>|*F<{r-fSW2jXc7BNjsW&NjDjM(Xvh3m&32WPqf;#PB9!XrS@TY>=;y(Jhx z(HV^DHkAdo0hsEtq^mi}unjkr%PL@=?{(rsEsUC~D?D0(t+W@TaCP}gh zYyGFMuitc?0?>Fx2HA$$%9H5Q1tOO zm$?jrk_nFhMQ6Mp1n;&Vty^Llphk!elf9$LY>BBwPA)0ZjhL z^rp%J+kmnY44~*O!2pWhQfMIp%$KDvmab3r41yIT7E_o?F{NhBEc^YP>bxvn1i=7` z-VzL;=q;r&K+OtPaS?5Rt|l9ncMr7aqt1x$0bJUIEO8NOfa=<~yXj66WPA5Oi;Fk| z%;eST@7KEqKSf`2Mw$U*$!J2002ovPDHLkV1mglQS$%* delta 2050 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 diff --git a/Resources/Textures/Structures/Windows/plasma_window.rsi/pwindow2.png b/Resources/Textures/Structures/Windows/plasma_window.rsi/pwindow2.png index fe379e2fef50ab07c64a4f9ff75b663ada0ee10f..a4adc74bb5e0771858117099462f9ab51715dd47 100644 GIT binary patch delta 739 zcmV<90v!F15c&m>BYyw^b5ch_0Itp)=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi z!vFvd!vV){sAK>D0*^^VK~#8N?VB-612GiGPf;jzC~}IEodnko4zAM04P#3DrzAo)h4fo3y#ev9&mizovWJ#9j~vC^b#Gew#KxT|9(OcH&~8F2;x z(*$UJb2U?3M1LA!Qd?V&MlbJ~;v(7roxJJ|=n+=YN1YMh12pEyZ;DH4444(c0E*rc z44~*O>|*F<{r-fSW2jXc7BNjsW&NjDjM(Xvh3m&32WPqf;#PB9!XrS@TY>=;y(Jhx z(HV^DHkAdo0hsEtq^mi}unjkr%PL@=?{(rsEsUC~D?D0(t+W@TaCP}gh zYyGFMuitc?0?>Fx2HA$$%9H5Q1tOO zm$?jrk_nFhMQ6Mp1n;&Vty^Llphk!elf9$LY>BBwPA)0ZjhL z^rp%J+kmnY44~*O!2pWhQfMIp%$KDvmab3r41yIT7E_o?F{NhBEc^YP>bxvn1i=7` z-VzL;=q;r&K+OtPaS?5Rt|l9ncMr7aqt1x$0bJUIEO8NOfa=<~yXj66WPA5Oi;Fk| z%;eST@7KEqKSf`2Mw$U*$!J2002ovPDHLkV1mglQS$%* delta 2050 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 diff --git a/Resources/Textures/Structures/Windows/plasma_window.rsi/pwindow4.png b/Resources/Textures/Structures/Windows/plasma_window.rsi/pwindow4.png index 051ddb5681d8fd7b09d02ae046234981b17298eb..06f42755835f65ce3e62fe4024c3599f4a5ad172 100644 GIT binary patch delta 711 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 O0000!lvI6;>1s;*b3=DjSL74G) z{)!X^2Bu<97srr_xVN*n-OQUOXRFRjS{9=9(rMuWtGRu<=I-Bqq4NLN>t7EYyeoXvx%$fYvhbsYdkpvd zQ{Nn|o_`=}VzX5@3qz?GC&McpA%-iFDhw+&doTo~Ph?ndPKnWBZflL)hLD(s8zC)z$|_+V3~qQ@61^udsscLe|!Z^C~Hv4s%_Z8nByJXva{bAE!6n z{*ct<;GJd0S;&T#En~wqmbZT2>5!9kJIZ9)@O0(# z?hVIYg#4dTTl`DQ3#jCdeEi?nGwUDhU$FJvHT%%~g(;2uxGS=blvUKGw%ITrdi6^- zB6*YQ2HU?ypNv2n_N?9h9%!lB%WoUok9uoFD(E-n-SJ*?e0yBe?G29e82$U!$2OX( z`Idh7Dfy!2C6*%I5HhSf zm|fd&zG1^Izgdh2yOozn9*{fG%)GidGC1cipT+NoEH7mb>|@yy*13pB>CfH+S2kDr zSMCmw3a+osV!X!njUj95%&k7h9N4B>_J;Sby)R#TgPEgg!T-{mznC*6+Lojz@Gl5j n=@Ru?$t!u0hE)4jhn4e>om6P>`JQD8OqdLwu6{1-oD!M6!xN<~_!~=u~VJS$!X05Q<$oOMEx;WUzGwZM2?V0r8_7P$7qp%aa7U99Hhks0S-3M2%fBa+b8yEe? z<>C^dn!@B|Iu#>Eq4%~F*Mk6yQMI$N2vJd}&0M8hw(5Ei0HLN5W<#5rP!N!%XvGCe zC7~_^G$hnudY&dWQB}~Ts9*uGW*=}tJqR!u5hKm}VT2MCg#`=fQnCevW!~(zFp*q$ zAxd3+sDTAoY=34Gy_AsA@uSAEs*VNv%N{E(uy=caur&;>xWEADl%?D|0V6vMw}-(3 z7ExeWmVWO9v`xpdH4GM9pu@gJfsq{=wuZri3$)n7Jzz%|T)}=>0PG5b1s5oF1B5yd zpa@_kRGFNmYdREM07~2dp$-H9sO~cR1xn8ZWp|hD_Q&AI%QMIb67zs5MF;+s*6thX@8_q*$+>2fU9DO*u)$}|~ zn)kyf=$H`T=p=0Z^ILqrNybyx5xBvbfOwFe&VOeOLY7=)Vp9brQL9!&PB+P1^}E8E z0Dp6AROd9Pc( z+U5@>T0nj>yUPA2zQ8;00%fHlx%?l1F|$L=?iJa(vR9O80r{^t@{_;%bXc3oLpcQG zC!Mb^&hiIq+G~TV_kdE*@~gl*zX^JOFMq$``+{p@U;Z!P4F>{z55PC-LO^%TZ}$fB zTca)nKrwL|vzkQhlHUq7cq_MdrCThI*LKOBPy-9dAD^u&?~=Qr4i4kRh;3-m?qF9 z8nYpUk%uRD`n@|(+IK%${?Yh((c7N&H{N|ss5#oRRfHj1li^wr!@Z;)KA6 z=1CK0C@U{b;Y~~A5chA|eJ_6bQ(> diff --git a/Resources/Textures/Structures/Windows/reinforced_plasma_diagonal.rsi/state0.png b/Resources/Textures/Structures/Windows/reinforced_plasma_diagonal.rsi/state0.png index 8ad1f325b352c75d7f7b998f9cb704bbdf06410a..3e5ebf50361addbf92ffd0ae571791fd467800b6 100644 GIT binary patch delta 722 zcmV;@0xkWgeEbEFBYy#eX+uL$Nkc;*aB^>EX>4Tx04R}tkv&MmKpe$iQ$>+VQ9BfI z$WWauh>AE$6^me@v=v%)FuC*#nlvOSE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JW zDYS_3;J6>}?mh0_0Yam~RI_UWP&La)#baVNw<`9$B7iW07=OT^#7sSrUd+IAeBHyx z*Sjds@;>+H=vVS41AHR!9McVpc!PLm)6zNb6NgwyQi#uq#|^q5@gvt|m)|%S9Ts?I z$jGGTi9^ITl3X&m%3$PJKou$^#}EDozq>UHQ{5*!IUL z(6b9P>$d%UY}?Hf!2b+fX>EVC0nC1qUT4l)$$E+a0rYQDSO@H-6Or7z5RQp)!z?k5pttbR*U}t z000JJOGiWi8UPvq8b846fRP~=e*gz`Nliru=L{GV6*!h3P)Gm(0QpHoK~z}7#n&+k z!Y~+y;V%WDG?RpkdWKFtj;o8i(9xmj5nLQRPLJUlic`8c)IpSrEjCU5{22q`c?k(5 z0OQE>yc3+bQVN0-x7H%z!keanlrnBWA5YU10OAGo@$Is#-}4Cv-rW`ee-P&kjNt&F zwWhrVWB65{3avHTwxtW0f*+boDL8SG9dN+`gbi@Tg9gmOg9XgRg9P~C-T}V2S3n4S zc0ee6RzOJHIUqFd6hMJb4xqv(1yJID1E}%iYF7zPJj=4-9f*Y+V}1i-;v2KC1t

z2wCv;;}tOUW9dJgsqpi?Bq~JzqbQ~PEV9;;<4P$!0TpTkfuT94W&i*H07*qoM6N<$ Eg5tSH8UO$Q literal 15911 zcmeI3Yj6|S6@V9#0(KH=T&Bh)xT;LjB(U0tp1UK77@O245g1!Brh_S~-Icv#Nh`E# zTbP!RKu9U2G$BC8JQAL1fTV*lPAI`JlaOX`ikZMbdC$-~G^NH6nt%tp^sZ!E^0j=2 zNix$vyQ9}R=bm%!{m#8d`)5}a&-mFR=|4)xFzk_{!h#a;ZP4DMMu1PHzWzVpD=l0& zN5Qa%exSXFVGSF{VHo?N=RAVU>JMXNU#^A%%^)jIp>Z z_^qi4qaij#t#%pnw1kFoPq86ij)(@U$%gZ!&2F$WCdz8JTkMk!G)Y+r(oC31oHnx- zlC{u=-plAt2fv&V!OxZyJky&FNG@ZQs)kvDsH>|p)tOClq>`W*h9O9rplKY8z?Fp| zm5bsbB{v?VFHV7|@DVAjN^;1c#pQf*jp{NQwM6|_@4ABF{zM_AmmQ!;M7c0QnMfj) zlfd`;gli&!*wh4`5CdXR45^yf}F-(WChYDJw^ z3lQ`oP3ft47luWmL{#LO2ro{n1xv|IwR%Fy^hKp8*z%hOY zW7BG(9bOP3F)uA{Ogk`R@^Vn~)wY4h!xn`Ul>^HuDsTgZNdhzDL?0;%JcIlElm+K3 z76;DQd_LUg^U)47=MZS#AKM!P-4iqG4c(U=gigJ18)K&^#=(Gvi^7l#kIyqH*q}r+ zBNAxmTp($TwiW@bg(9sMlJVJbJ0n;FU6akQ>m0OevKe+wcs?JJ zR5#t54N@n0X*UM(f2~q*4=cKDR;$_SBw#h{Q7lEpKzV@#{XZFl?7RGtSkZSG6^f-NfqbM{vXi>+7<^x%ETo4ensN+KOfvh?%2nbr#aiRG@Rvi}v1TE^g(0m}P zjtc^U7Ij=`K9E(%1pz^eIxaLH$g1OlfS^Sk7n%=b)p0>U(4vkD%?GmTxF8^CQOAYm z16g%k5D>Je<3jU+tU4|T2wK!}q4_{o9Tx-yE$XaHx?DW?RYOhL>MUcI^KjK`D?i+A%U<4b zrR>ed*2b$FR%Kx6^1R;zZS&Pdr}yoD`kZ_AmQ7tfzS9>+Pu(Bs%E|sA7~7ru-^m%Z z+YU8~ul)JW5&Mmdj;vQ^cf5HFFWYK8aJ_5uv=PC(b6?*1*=TG}L3Q5RtR3%{);0(y znp-#TZra`1m>G<=R5Hz_<3}yq)v>l>UCnz-Pkb`2Vo{FwK>O>P{Kf63*Vs?2tZlnJ zxnkqlrZnu+oqs)Y_2qlZZ|rS)_C_X__VF9e?;Wa|x%bc~)0s=*h_O6r11ILD4__U>=XTqHi$bIyy3vPD@F1Gu@Yd9CUOE2kk zHTHCFoV4Wa`P7Eyv6ze*(vME8XkF2|X2!&eE-?M&8CyF8otd!&M1nQ3!>e0FiCbLIlWnDto|t!Z^_ZM%xcXFqUx@#5gUZ0wFt;;I+! Sxvf3QT{LY*!MjuEzw|%x_1DV) diff --git a/Resources/Textures/Structures/Windows/reinforced_plasma_diagonal.rsi/state1.png b/Resources/Textures/Structures/Windows/reinforced_plasma_diagonal.rsi/state1.png index e724d3b9f78d115d79ca3ded3230db216cfe4056..7bd92db59f70ce83df278ad44857a3797ff47877 100644 GIT binary patch delta 695 zcmV;o0!aOheBlLEX>4Tx04R}tkv&MmKpe$iQ$>+VQ9BfI z$WWauh>AE$6^me@v=v%)FuC*#nlvOSE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JW zDYS_3;J6>}?mh0_0Yam~RI_UWP&La)#baVNw<`9$B7iW07=OT^#7sSrUd+IAeBHyx z*Sjds@;>+H=vVS41AHR!9McVpc!PLm)6zNb6NgwyQi#uq#|^q5@gvt|m)|%S9Ts?I z$jGGTi9^ITl3X&m%3$PJKou$^#}EDozq>UHQ{5*!IUL z(6b9P>$d%UY}?Hf!2b+fX>EVC0nC1qUT4l)$$E+a0rYQDSO@H-6Or7z5RQp)!z?k5pttbR*U}t z000JJOGiWi8UPvq8b846fRP~=e*gz`Nliru=L{GV6gZCrVF>^L0NzPNK~z}7#n&+o z!XOlY;h!cZO_)r>Jvwo7I(5CTmt+!Lagl%=JUbv4&kB&hcLzw}y8?k&PDHLkV1m#LJ~99R literal 15885 zcmeI3Yj6|S6@V8?c^Gi0)ABMTvJ#v$j8*CC8V>@7I3tsQ8?2RR@(5@}n zF2s;93~5s!#A!_3m}wJ+S4;<}sY3`!!(&K!wFxD`h6Fl=g6nu1V!+Tq?@G2LU(0ux zBs2Z9JEN7(J@=e*?|1Gw+CRItAb-yIgsBM_hK(BveXzAU~%$gTDBMYZ|GY;7fLc*!Zga?$FXW7U$i(hxf`7up{Hz`6@(Nlq$p_LPpd>1_n8CIwP^;uGiy<8(NZc zssVyNq;V~!;u;^17xI!=k!VYARt2xrI+ z_DW~@c}5of#iHnTgil#PKSE7bR_Ih|9$zSUIWZvp*p9;{(R@d}@!5>bJ1BxO=m@ip zG8U6&+GwRoV;Vuy1QFvTJQMQa6gk0F6ZJuY15GJDNRp<^u|8sE!ahL#aE#2{mzUVN zF@89fc8PuuBRd2SQ_kZ)Z@C?h4#v!koGLm?bc=qlEZ$+T$T4jrDm2#{zy(}+* zWJobd0;viW?kuK!;Ap?XEjYq$gA-YSqoYBsMwiuS<6Sxn!C7@A$@4lJYclJ2la*s^ zF00L~3Gs;(3M#kQb$<%GJ?0d7!&6TosEI!(UtYN?vD;!$KN<*;fyX9TLw1Hb3<-Cyv`VB zg96R-3!t4d?wC2sUO2E9lhtA%ZDvMCxR^4X(FXQn1$|v-;!I^^nTw)Wi>-ezaoh|F zl`ANDuYuB_cJYL5nIbG#^N-;(~ynMHLsC z52RIbK|s)=iVMvL(yF*1AZSs=h2{fkRa_7dw5Z}j^MSM~E(i!(RB@sCKw1?S1OzRr zxX^qct%?f*f)-U=Xg-iu#RUODiz+TOA4sd>f`Fh!6&IQhq*ZZ2K+vL!3(W`8s<$5<^yR}To4ensNzENfwU?v2nbqKaiRG@S``-r1TCt#(0m}RiVFgQ7Lm9TqHm`1 zUhq0<0K9jax?s#P@Xo4+%`J3dSnUi9tA8HDdhdbns~A>AVA!=%@Ve`37&b|KdFkQV z7&iP+UUp`2@Z6z>ne*B+CLejYxqiYM6O*Pc`}L7$x$?xM=>>1<8ww`PKB9NePrFf_ z)m2`4@%dNUl8e$dG)fh-xD zx;Dp@y*4|O`~@%+fjKc$9c|stOwi!7c%g3 zZAU#tO}39mVV4V*2C2Hr(c;|w!|{>pOTRo>bov)JMzmiCj`HqlZ)WaK$zQa=Tzsl~ z@34*4Kic(Tban+;k4d?%}bxQiA*PEEcuMY=m zPU_n3zGU9)-u2wXtN-j;eX>e=XwB2cE0;%N8EZe=`u*D*60nDxm#5S{)A&Vd%jKrJ zj{KxauODxlaTeTrnpUmYbAFoXK;euQzoz!&%b9%LG-~mg+BdfZe>mIePd<0TJ;~H) zd9G#ctv_%4)Z6*S!q&9UTaMk>VO#fv^IyH=q>7@Y-6Jl(@OIv+uBR?<+j8@r&ZapH zoAw&k%*DFej!JWYRsMwhpEfPIbm^<4rJWb#aSV4SseWGi?ytL>D(kP7l55N+tbP8O z2ZnuKdav}^>dSxauD#yA_qWUa+-l~NKx<%3W9x#pu2)<98DpAF_{ooN-@STsS~5Ou y7&iaCo(*01ny!pVJaj4V?5V%6E18Df9fxt$((UVe$6r!j*v`wz&u*Djy6S)8Ho|uR diff --git a/Resources/Textures/Structures/Windows/reinforced_plasma_window.rsi/full.png b/Resources/Textures/Structures/Windows/reinforced_plasma_window.rsi/full.png index 4cfc4c45da5178cb9fb00132bd47b9570301ad6b..a1c5c2115fc19c9b01bc5e8eb039ffff5e143553 100644 GIT binary patch delta 418 zcmV;T0bTyT6T1VDBYyw^b5ch_0Itp)=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi z!vFvd!vV){sAK>D0Z>UqK~z{r?U%o5!!QuWmC}N1PsMocGkD75B#@=(Joq$9(|`1+96|zuAfQPUMKlgg zQ4};*RrM_Z$@4s?jiHI-m_(cfU;)W_V|qW|>a)G_v40)&MLB0p09OJcCfTA_5u4W0R<~Axr-$YC_<2`z=mS~R(c?kA?bc&s1sELUO2CpN z>16EB$#wV|Mt=d4Fbq{$mYoc~P2B3y2q$0V?@PVZif1)jBgVB)*;oPQ@^(#Ti?x8E z@B+L5FTe}%0;~n#r_#o3F*YQCn-T8{tL)vL%CMS=Pze zAF+PxF@H29GI?K}@kV{c#5h$~no<{S`TuyBIDeWse;b_A%n3@J09E5*n6`{(^8f$< M07*qoM6N<$g2jQit^fc4 delta 2486 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 delta 2924 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 delta 2924 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 Yzrx(A<|rn?4FCWD07*qoM6N<$g7_;%tN;K2 diff --git a/Resources/Textures/Structures/Windows/reinforced_plasma_window.rsi/rpwindow5.png b/Resources/Textures/Structures/Windows/reinforced_plasma_window.rsi/rpwindow5.png index 8ebeed21a9fceba5d6cd550f7ab6d33888cecb9d..f16d149ec46e25f3824cdb7562a002cdee1321cc 100644 GIT binary patch delta 698 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 Yzrx(A<|rn?4FCWD07*qoM6N<$g7_;%tN;K2 diff --git a/Resources/Textures/Structures/Windows/reinforced_plasma_window.rsi/rpwindow7.png b/Resources/Textures/Structures/Windows/reinforced_plasma_window.rsi/rpwindow7.png index 4d0ff4bf7318bde3f96e034058039551ad57141a..4ad14d62d1dfd47f73faee41599f42863653e457 100644 GIT binary patch literal 270 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!Nr~~jv*CsZ)Y3wHaG|zkUKI#fhADGLBz=; z;BXMDfx(v8s^ZD=?c)RZTeYZ)dZ(?Lz5ns{gQWkdhbxhwD2J_$Zi z($2FJaBeCy5`siYk)439sXV!X0rn)s@_8TG2>`+*XsZ@~f1||X$Vc&cAAKOe0Dud8 zw{(*-fJ=p2cYiNB3E2s7DGzRx8?WsU@aW=1X{#2}{<9N6qZ;z>Gdf`2*8V@pP5>Dn zn%ZY{00|}$vJ>F>_tBIdg%03wQ+okC`uE^4~&FvZ8D0{}OrnSUqK z0XNbwVDUk-$%z&=kpBga;IDd)Ao`I!z(X>92zPS*C0OQ~A z#EtRVPW(J4!~`($VgMK#U9ewvC~!GqvK!4ICcqajzJXOyH+}MXA5nrJ7cZf9$_5*= zik`=%h(Z7tFQIlC`H;5HjVLjI2Q{ArXRzV2mPm+E&r1;{27skGw_vdZP;Sg>c~{=A z0l>*x0Dr*q=?m-L-AVhG;z@M?8PDM_enjYBgjhPj&-J7OI&1ksxWFYk03C}T(*C7L zq67M>0f0n0;Hhf)7)YW6fcC|Y82w8SZ3e)lKsbMAe*yNJKK5~9?%o@A8f4}00YgoL zM`$aDuW9g_2K$F=8jSHJ=hC40^Xuhc)8HlLaDO>{_8s2RHuh1Bl*9aaz9&H1 zzZA*KVcy<{z?ifg4zy1-Pml{(*@Lmeo!`S|Wy!%1!_W zjd3inSBsjt=|41Z4p- zURyP1BR~8D6CD1c$r&9mi~|#d(4xsG4ou*BaPoR^@_KNxZP6r!4)_Po4zi-ku!6Aw O0000%&aN^ diff --git a/Resources/Textures/Structures/Windows/reinforced_uranium_diagonal.rsi/state0.png b/Resources/Textures/Structures/Windows/reinforced_uranium_diagonal.rsi/state0.png index facbfda3ade6a6c2884f9a596e976a4b6da0a329..fa6f83797c15f9e0a8fa44c37e4c6406d1f6d8be 100644 GIT binary patch delta 723 zcmV;^0xbRZdi@2EBYy#fX+uL$Nkc;*aB^>EX>4Tx04R}tkv&MmKp2MKrbE=X9p)m7b)?( zq|hS9JC1vJ?|WbFz5|3tg{fxOB%o@Rk&4H}Y;IKyyh1=f&3|zS5;OHgdNBjf@pTU$ z-|r$k%e(H+(Wm512KYqcDANs#c!PL$)6zNb6NgwyQi#uqCk(nE@gvt|m)|%S9Ts?I z$jGGTi9^ITl3X&m%3$PJKou$^#}EDozk6#Irl;JbU<~MfvF(ph zAg~KG>$d%UY}?Hf!2b+fX>EVC0nB}pUT@*Z%x0}MUsk|8;gpO#Q4 z0Pkn?O*vrj7U*4b`_?+g=>w3VUM=4M2Zz8|k+Ro4-Xz`A*|&ddTK)S0Md5Ol8b}Lg z00006VoOIv0RI600RN!9r<0K(7k>Z;bV*G`2j~J04mlGnc=mDt008+(L_t(o!^PJz z3c@fH#_=zrP@73Yz{$x2bn1b;gwO*Nyo3kp8JwJiQk+r;1sz1GXr)cw%gY!Dzds>? z1P~lqmfe*kZj6DF#GP}PNa0P>Kx-X0po=F-0s!#>y7;LQ8R)|S zz*@_D3;OWe&gRxyv~9~5Fa)3Pn?gzAEITj;2S6Jz7AFnx!N~%Aagu-#JUAc}4+@~b zy#uIluK-GXbO1FzDu4qY9KeMS3gE=kH2ojIjbApVRFZh_4#dLiy8aG`iBGq6r6lo> zTOffiud8RkuOCbI>CA;6$|Q5Hx*tWY^?RXnjvY6~-~k(D`iq@-gqZ*U002ovPDHLk FV1h0lLiPXv literal 15734 zcmeI3eQ*=U6~NCpfnwt_3yf`I(?Z~Ux3bTcbc*hT zWQV$rDGf~^VUo1O5QjExr!aJgo5l@=I8KUj5~dv}g@#Gfw59DhCQcp7M-r1X-IHud zUdub4CNuqKZ$>)3ef!?q{k?rp_s@N=a`oMLIk)9d6qQ$A=Ba{ro%Z>{O!%#|wqAj^ z*`c!a3Pt7KtbMYmy-&@jDDJpaQ>WH>D>y+86!D^54~k-e5S&d>&gHQXFEj&HR}UJb zpi4h;tWU3#M3=tS;x&3hrJzwNYYl_y*3~saYqQ`G^~>Ek&KL(B1c1uxVgY|p;bJa* z+%E@zYs0i&7oVawyYwYmKwX`;QdcU6fzDE7H3&wlO=oiyF&3N6Y+I&djf{mhnrM^J zz?wL-ku$Tpu}kmHfxnz#(Z^MJ?ivdRC6~TYRYM$2N2AfAsHsQ}H_(j3;h>Ey&9VkK z!=SVTRX%12Dg_BA<9<9q5yDbPmE@pK^UK%E5!I#FYk`v2*uDaxWT2oj#tu@XV|<8a zii~t7BT-1&gd$;od}*RU13w6WpsGMSCZk=bQC4N8QJx}XQaxp0m=muz89U>81A&a8 z6?N4Xh+qt9MoXopB?RaypvaN109I{*TPeu2dsXtKk~6`RrkQf>ASO*=rfCvp@uQH) zkQ45eD-8o)mBTf%>~|+lS>-rFU1@3jROyz~NE=l4#8qI0E=DZ z9X`9ms^vl}Ug#pVF3oRzbYjHx?cmm{9RshID-S9v54Th9al?Tk39ig;wVUe&J1__g z58D?oTMfKPG#OaYWOdkhqmOq$Xp_uSD;sk?9v!;Qym7NwZ?*wmfE)LLDL0-7l;&(w zpfzC$wsYQ}Hb>iw2=`*H7X_05Sc9E0I}G)#*>2!%5HKT{M8@i1MOF~T_maWQq)=s& zmiHDU4O(uh!F>})Q+ba!-Vh&FfYw%A`tiP!?9^~-@^Z%86UPf$%XSM|)dSH$Gb0N8JAfL9_%H0t7D-TzEc+mf%8w;6;K9&j-;G zTnG@nNO0l#AX4T@FKy5=YwboE(8c(#Nx_Hy_pJv@O9KEeD8Fy z|Csjjt4=7Z@={dmS1GD}8%2HeDZCF+RK!S87dOM#U7w_=eEG3WC+?!C8HRFCNlom{ z{yl5HzOZEe!2XtBemMBV!09EUSvkdn*1Smml{3{N9q-n5@9B8(p4?l1G%I)AJB#1R zpSOMZk6+q;x})LJ+7NcTO5wy#|_Fn{=; zAGI5w0raU^Jw4p{?%A((z2V-FO*Jkm-n97TJAbqP6NfWoHw(t`{9$FwigTj`t;2eeVu=L{QT0zOIK`rwl{je?ex7GgN`Ki~6zWbKa(eUikBiSp0tgY?+f6EJ~4RtLu4CuYc(e6+0H%UUm)k6&4)o zh5jz~@4BsW?ZcMNSWk5H(F!g8r9$D`z3<)`Ty$g3G2OD;E1G}&gU$y$XWzQa-f;E# z%V+P_{i62Ie}DDB)g7*$tc`J}yS6UBkiFpa#)I7t9dRGs`o=-GI%Ywymr z**D$4MBmg`HS5+9$BjAH&)@RYCug1=@D>a&ZaO$;(KFXZ*DMgKyKVc*mj34-^U8+L zojCOB0oP{RSKdC?e)!GOdB3mj?cE=_e(6f?)z+Wx*y&D?qT!d$i7 z_QDHucONY;{C;fb;jfi!ZCBg+D%UQ2{&?j07fU{fM4p>b_~pE#S!dK&UcdK3{+5xU soEfjzHeIKr4I8S@Zv9#3r#9;1kq362+?{((do#Lx)oRb-m76>M3mj%}1^@s6 diff --git a/Resources/Textures/Structures/Windows/reinforced_uranium_diagonal.rsi/state1.png b/Resources/Textures/Structures/Windows/reinforced_uranium_diagonal.rsi/state1.png index 3799df51bf9225b991de796f1ca3d2d663373420..c40b161092bf1688a7c328fd6fab6c2df6b94fdf 100644 GIT binary patch delta 697 zcmV;q0!IDMdgBFEX>4Tx04R}tkv&MmKp2MKrbE=X9p)m7b)?( zq|hS9JC1vJ?|WbFz5|3tg{fxOB%o@Rk&4H}Y;IKyyh1=f&3|zS5;OHgdNBjf@pTU$ z-|r$k%e(H+(Wm512KYqcDANs#c!PL$)6zNb6NgwyQi#uqCk(nE@gvt|m)|%S9Ts?I z$jGGTi9^ITl3X&m%3$PJKou$^#}EDozk6#Irl;JbU<~MfvF(ph zAg~KG>$d%UY}?Hf!2b+fX>EVC0nB}pUT@*Z%x0}MUsk|8;gpO#Q4 z0Pkn?O*vrj7U*4b`_?+g=>w3VUM=4M2Zz8|k+Ro4-Xz`A*|&ddTK)S0Md5Ol8b}Lg z00006VoOIv0RI600RN!9r<0K(7k>Z;bV*G`2j~J04mljW$Lr$&007@fL_t(o!^PJz z4#FT5fZ?AeCN)f^;RYU{lZWdKyo3kx7)~yXbTZM&24kx&ya$Xhe18Ze02N2y_fJz3 z@460C6AvNK)WW^@SZm7$#CY4b0ObN={5Tx0@A;+%e&5{y%AA2E9KboJdw&a-@W& z#y16M;Hv|)@Kpht_}>6+{AWN3d@-ODJ{wRH{|YFLe+1OPr+~R1OZ;@!!U0VDQMA@h f3n2t`9N-1PCdA8BN8=m-015yANkvXXu0mjfL83K% literal 15695 zcmeI3eQ*=U6~NcVb*U+Cnx+$I1}fx+gtVtSeM=Wv*s(}#il{KAwn<4i-L2#UNhfq? zOLn1nNJ49zvefQB}Iz|f#1puui(Fe2x08k}yE+3s}OoZm56IJ2GQtgMw| zELPse@ivPgdl|h|=$9uUh4^OQ?b&chsx@|KTAXLuWHM<=T1`qK%$nV9H_KUAi-kcm z7_~d52`MI~)?}Pa`tdO-uMku^wOXT550tyI`-;YMfnsWw9iqslgg9$9 zacnUoNzB>AI}?%g(j<|E5g3IrO+|L*qIU5PMN`xcr9{Y_x@2IK6Td$fyXbnO(W0SM zZCMvWkVRV5Qf=vuL$(>JN@qfZ%ev53YKrY%lSBFBO!1^^O0FHIo#KYny`F!WSL7$*OuZ6Q%8P362 zY%OL7Z*%cx+qXG0&v6A#GBYtBenpZ)-FY8obf7IQX5_%mn_Y!I3TEOyQ2j`PCd|l7 z;oJg0lE{aYL{!kca#RRIHXaLm*!*C@%-pHs8Zvvc%_ux@;kr%?(40lapMG*$g4$7VQoO+Fg?1 z4!PV8Jr{cMA{Y5}>3-9rQzI5`hqPY(82J5sQ%uzaw4ElO7Y&$Xv@(}N3ZnP|Bbqro znw0KEztK8 zGHT~Sq+pJ|7YXgf4Mm&if)WEQPBRlU+Z>FGa|D@CP!Qa1Xbn0Y&h$A)dnw{(TBt@@ z&wDqP20b^c;ijph`MjqaZ(K;IP;V=>#>u{t>(pp!?((GD6EBE*%l3+T)kDd{P8rQF z3pbOer*mcqGX4w9OUFodz!<4(WL%|Zm3E>kAuTB+V0{?X(@Yv##_Low+TPY%p1bD4Zjt*psvonDC^ z{XbW)VsxT}boH1$?6k3bG@6zhc4Eve`ZY!)wpRp*|boNo8~Ro#AMBD z$wtG53#{}TgUr9yYIF|^y$-wGYWJ}CFm4f$Q!vuzlhMDHs`nEsij=m&6-5o(OBog@ zvWA&d72Iv6n_*@Y-OHleXf}5rJ*`jXy4dIWBfq21(<|nS2El-kMT(2e2h&nq7!a~Z zagq68T8aw;LKZ15G9OG!abZBnBE?1KgJ~%)3Vor!L$??281k9Tx33&mg2&IkVT4%%m>p_To@3tNO6(*U|Na`140%lE;1iXOL1X9 z$Rfo>=7VV|E({1+q`1g@FfGM}0U?VN7nu*HrMNI4WRc<`^TD(f7Y2kZQe0#{n3m$g zfRIIsi_8bpQd}4ivPf}}`CwX#3j;zHDK0V}OiOWLK*%ByS5^MWR2V~#qbAXFrw<)D zg`R5#2C=c(4?xe20QBAiz=v1S_uBw;asa%u9zE{*3jnTHcHaHx+W{!AZ1UB&q)tD- z=fv`(b=TeZ(u#(mp|$;ME|uLYJwEbkh4#j=BkMPR;mqvVmG<4+`m1jFZ^fT}a`W(0 zru+7tT^so7-_|s}a4@!a-q_n$zjfm9KR2uAYm?_63_abqY4g3;>>q3I53cyt;lYtx zzUXLtwfe%Y)`=k${^z^CxvH*dpKa@cg8ER^Isc#S3TmhDVOXyUH3OD?bvespx-^&`Sf zKX@HndD*bm0G)gPP;uqq(}(M}FRBJhXMwAOt4@6~zwdSZk>{pmD}7Jgwtn0H04k+k A9{>OV diff --git a/Resources/Textures/Structures/Windows/reinforced_uranium_window.rsi/full.png b/Resources/Textures/Structures/Windows/reinforced_uranium_window.rsi/full.png index 10342c5705897d15d15cec6e6e15d43900b21769..a1c44f239f04f38430c1b7d52c090dca8a4f54e1 100644 GIT binary patch delta 426 zcmV;b0agB!5X1wJB!2;OQb$4nuFf3k00004XF*Lt006O%3;baP00009a7bBm000ic z000ic0Tn1pfB*miSxH1eR9HvtmrIJmKoExGFhWdL5&|w{R&#)?JkT7$jgSKb+;{{J z?j#0bwAe;W6=%gQ2e^oEKdlW^{#eW$P65zTn{rJ95ZQta1 zPHkD1cL4~VWf=|hO%Mbm;wAtc2+jlZcF)^G}dKM4G0}E5KB6gFjB`Zx9^k3h<$b U03mOCK>z>%07*qoM6N<$f~`xgk^lez delta 2053 zcmV+g2>SQL1CtPtB!3BTNLh0L01FcU01FcV0GgZ_000NYNkl^G~7zLDP_ay*ecJtI=*Ya~` zz?BX`%tTL%A z3Z>(CwrV-PpE1>G_bUL1Y_Fi*|G5a38%IOm-;_1$lOpYMMSP^Xc~a>3;;a1-X$Qj3 zF`@@XtEDshSc!XZf*=sNTIAehePEG*N9x2Qbuw1&sDH}te9f3(I7CXg_b?v6pI9zI zWq~8?5|fGJGsZ~e?tt0rk*GRcs=Ag9)7>%IPaMA<}1%Qx1Y1yWc{iR|(t!KxZFR6n|FJDDW z`5+tvJcmM3hO|QDRLFCA_J{)j`Z1l2+$ZJjp2#`OwUTRsGzd{oJAF>k_J9k7O~PA~BvKYA>|t!ZC4#Tt!TevrxSz)m~_)xkXNMizuoH zauc-fP)K{K;R$Eb!63mkLIHpTRzx=W%Y5ovPgjwrgHPHu$Ja>g@?l-wTNEMZJ>3a( z#cthjCqo*a6;$P0bKC&1E4l{&Q2cg*JAdo^JAJMkM?*Am#RPz&ckED{!-UBimNeoe~~`$lZ42&0Ap#=x~D6^d*Y`_ZAXv~t%;fXkv^I!LD#}7*5hwH zOU^gOtZb9tL`UtQ*xb6s)loaBZnk9vP|Aqc?Z!QhpMVhOtGmb!9`;n-+#|*XP=88F zcKftfR{aWj-FaD=dS6DB9$-}m3;6matF4R2Ml*(_RwOL-k93X(DN6NX+&`~W7QgPx zx(U5II5!)W2>U0J(HcXPZ4J7uNLW&D_b@RYF>CtDxdQOD~0I9Wx z;q4wKnc-%HDgc=1F25@!V1y_DAb&Tm>bj;h0HCSr2}=J!*8m_PQUHMJU1dDm0?1Lu z0A$=hyS3OOYKu(jYL8Om5yN)cpq+`IQ|~wL&GX6916tNaL|Y85<}0UZ(sGSG$c1ko)y%oYDzgqmNm7Npg#dt? zX*QdPFEgx$K)IVU%0{{1$$v%C=AU0DUzqc0VZor*UGu?BTq9A=|A^c#x{hvpA0RA-c(f zscn9ooY;e@oq_cEMMC_xZ;QY`{SI&=JPfUgnE=a-*wmc``uV1~(0>3qV{fUaYsp2+ zBMUPNSm^pUPoprjOVFklRKz zyYWWsGGIx^Q7Wc{yMHWCCo>NecrVWwvrm?d@j(4qHm=xEy&fMHceKq(N_J=|qpD7d8FJJ9N-l+s_UTxYwXxuzFXx}F6f71W9F=l1WKU-l(zNnTp} zOxg{NRpwW^2qEO2A3S`k)$*oy zCT{4@eL3B_T&89$L z<4=C@CKLKmtAEv4F^I|l1Jd7Q0<2Idgc=u-0@!4;S+Cu0hZ+}=LjYhHpobCU#Bp=q zf7pfd+4=!BV{0Uvn7`k)^A-3;qw&4A zpL(D1?klfLX6oba=D4^aKwd3Q0P<>a0+5dl-tyfnDSxo1pmMn!TGoaT*s$0ouGCF~ z!JfD6H+E~ohAjXVIbnvL|LYpxps>?#C|r*1nOJg>J6f!o2;zlee@fPGRM zG}Hv7!%n~T$70um5uoB=q+8F!l7jlBuoHm1TATpn)$*@X5QzGjT-eNVv3RHBGr3{m z1R$>#Cjfc1Bt`)H)Y&#JqNhRB5)fps%@z07m{0f&K=8p{w~dQP0qhzgEco4lZCu0+ z0aH4UT1HFNt+7Fa{|!WC06cPkWUIuvH7m2jOV07*qo IM6N<$f>@(TkpKVy delta 2355 zcmV-33C#BH1-=rHB!3BTNLh0L01FcU01FcV0GgZ_000Q^Nkl1YitzP75?VV z&g{-U@MCSW_WBWnv7t41Yp`q5#DK9VEh)i3N{K2cAW9T9Mg7qzB1!>8u}~tlAw(?} zB?Qzap)r^$IBG0oj1x6m8(bUQ0>-hi!S)6}@MG7rJC8g40e|LEA(M8T87q80M?3qS z`^~xM+TkA0S zvgP8-diX7RUY-mHPv`GU{#FbkZ^fxyN@oxNd=)9~rr(ZTfkhRdu#vPk?a7@-V+R2M zL}3BI`+?Kh{eLoKz5GP)ALxb9(2XlwyQQ=fP8OOqlyf{QrfF%Q2O=d1MFTft<2#>K zBff^mY>*rrL=RtZX`WMh#)fz)PPhH0djJ3zSVj7DRXd7K&YtUE_JZ84Z4iG)(F+1a z9e~A2KnaVmhJs5;woYH41ORVVSFpRkQyvC@8w*eBqBeaB002f+_FP2|4s0k57t~}# zBPwEni`rm^15RpB_d5jtf`Ha*QAw{wC2je`n)8gx_HjW*FSY3&Kzv@zc-w*O?Qx7O zM>zk?i+>dFxR`Bud5(&gDhU9D03`hJ{`c-YYtzSXz5tg8wDvc+a64MCi;uQ$OI@s# zt*uil)>m4;|F>nQzjpqwo8W%{VF}BWjh&^2k{U_&AdF_awbXK_6#!0MI|Bgl{3+II z6u;>L2o2q&YjsG@txMtOCT1hEE=dS%9#xFuH-BA#aWocQlQtfFg=t;dFB!=@WdtCE zW$acfGF2A?hEWaUHHv6L5W=KZPviEjdl9kCF^1Y?x&TssG8HNWi(DitNkSs>7ka4Y zp!3lQg7ypjjJQUW0U+8I1pqKI2r_!>0UO$$U-7Wte6qZ1$&F*N;xFw>NNL(GYgXG@ zxqq7kX~I+8{FiNQzt&}dP8j9^o_Aap02m4n0|10$0yj1{&fIDY3=|-+B^asyJV1KH zUT`&>MJy2&zW%!DQ_xTY26JxG7mmJ;uHq3Hl$!qa0V4&_G`5u;)y5(bP^wOe!2xS+r5HCBm;38JdsE=Y26_zF{EG;8=9Ospv-(9aqVk){GIph} zbOZnpC69m(M}Qb1r+T`lx#a2>PoBs~`t(QtmH?Q(9?(4n`uKjze;9^;_W2-$fCN4y zH|1Ror@hBokucZ?#}FV8>O190YF>T$CYXq$b5&5Cb->GudEQAFfxHSiG4ZeUX3_(gj5K&S zO7{NQNxEN}c59PlHk%k)E-k;Ln>$BIo#QF39_?KBvFCk?J^7<>1lk7w4bYNdc;#T3W_ zla>af{>hS1ZZHf0rB#R6m9t+PfsFwORiOkaEUbWN(C^7J$aC5g?093h;H#YBS1hkwg7;nW zwrPvmXg-=dgccFoRevO`957u0L)QUiV`nK#SjK4HiC|nw?Dm=ecn?5oxzjqD?KZtQ zYFtTd^Qe+pmn6(h%tmfq3g5LlBnu7Qrh9^+2DC2imo^@Jg=s9jW@rz|6IDQmdzNAY@92U|bM9=(Of9^ncJKArW$stOyl?MaoY$ zy*g}Y5Crb_0ElZu*?ytlbT80d5Ydb285wWfIO&zV)JZO9lyf^ecSYVBJ53YT3<_Um zk#!{F_mz71O;1B(bK^AOn7{#ddk4mQ35q`bnqu!2W~(diMXobO8VWE>@jilEiL3vcu;8 zL3u zZ~9Jok{}QY#}JS(*q8PmYi-KA8U`PdAp|7<>@4#^{=+c(_32wxgW$ zfy4KAt}xF1c=dSBnSwYI4u^G&@dR{jqwD%BsARdobECGH+p&Lprmt(pI?gB!g zP{rsPe$UASU< z+TQ`mWU^v~zu&V@CX->h2kru9=M!aX5T~GPn^#X(jzdWWcL8&y=>?4NICO3EGF(bQ zNdv)F z#kJA?2+Yh*+x`wPO^lk`JDStstZwKVqb(pFk5kP8z3nUoRr9(0XbT{Rn^4+EMKyh0 z4?>R%%mV(mAK>wLQ0taAO|n+2!PP$Pb{l!UUVl_?)Y0bqP3AGMa43r*a>Kijy47m+ zYHLN%OP(Bx0GG>!oOfzP($1t#6y0t&yuu&39EKDYDF9MfqyR`^kpduvMGAlv7AXKy zScDhAeLWfs1~J(iXfzs#tQ5a$UwYR&_k9tc&xe}LCUQS$q)7gY?9|q1|CbnVqyR`^ zkxBv}g+&U06c#A}Qdpz_NMVrzAcbXU1ds#M&*>i#vI-<^?}6$;GBg6nfhjpe-DPim ba3J&-iPJcFc2Y^e00000NkvXXu0mjfk!^nm delta 1148 zcmV-?1cUqN29XJnB!3BTNLh0L01FcU01FcV0GgZ_000C-Nkl5TNpusmge|4ggN=!8IvaOeXXnqG=b=WE!>+=M^M4jHpX2`K@%znpe*4~+ z_a5P#LngaZd(WDW#(3h}-<6HOul4QpjfE-!fO_%U#T#ct@~a|)w*oVN$iWxCX_ete z9OkpXzedaFrnY*fxe5T7GWEJ~0hE7#~)d+(mUWi`)gkvTT#7d z+il=3z&OQYimi^VM7-n8cFw)T)bUcyxM+Uq9k4sK_kV4X@wbaNUKSZIy#xBsXTOn| zU-~K_n@|AR1;{28Kz0GL2?dZ{fNZwC0K!J-g`eIyCNln`hhMuWT7wANz5_x5WEUWt zPypEl$R-p(b^)^4_5uiRiOJs55=Gbvnjfd_e>OD%a83b09a~Y?H!aoil3p(^6JY^f z)Spmr5`X^m;+(!|+xnUNEC3{{_bSnov6^x5R}e$^FYrgz9w}8VELBVlP7LF&Z6SZ} z-~yWtHfqF^iG?s zdj&CsSAn8($1i^QGcEVT-CL~6na{A8W=`|uEq{%{^BFwUi*LnCh_Dr_fYjq{QG_SK z{`1*O0DxC&KQr-M?s4_0o3u54ggw&J;J(Y2mB&N&C z>QTe(C?L|+-i2g=$Gj75UQqd^3$V_WZa4$^)5OZe0`&+DBY;6PvO|wyA8R5Ygmnd# zw;=?e3MJmGsg3rJfL^l$tx387YlnCFZ0e@kc5siEj2r0d?D5qL%iCuXH0CXWBZhsI zR6NF*U*(n`O2A3S`k)$*oy zCT{4@eL3B_T&89$L z<4=C@CKLKmtAEv4F^I|l1Jd7Q0<2Idgc=u-0@!4;S+Cu0hZ+}=LjYhHpobCU#Bp=q zf7pfd+4=!BV{0Uvn7`k)^A-3;qw&4A zpL(D1?klfLX6oba=D4^aKwd3Q0P<>a0+5dl-tyfnDSxo1pmMn!TGoaT*s$0ouGCF~ z!JfD6H+E~ohAjXVIbnvL|LYpxps>?#C|r*1nOJg>J6f!o2;zlee@fPGRM zG}Hv7!%n~T$70um5uoB=q+8F!l7jlBuoHm1TATpn)$*@X5QzGjT-eNVv3RHBGr3{m z1R$>#Cjfc1Bt`)H)Y&#JqNhRB5)fps%@z07m{0f&K=8p{w~dQP0qhzgEco4lZCu0+ z0aH4UT1HFNt+7Fa{|!WC06cPkWUIuvH7m2jOV07*qo IM6N<$f)tZUc>n+a delta 2331 zcmV+$3FP+f1*Q^^B!3BTNLh0L01FcU01FcV0GgZ_000QsNkl1YitzP75?VV z%+Ab?7q9UPdu^|fU9eIc7Gj$fm78Fr#1)SimxLBoph8lpqVS_q)c{gy)CQwgO)E!f zjffK&wKPy_r~nBNHX)YKf(e+|N`NjxYkU2`I9{{f*F5g@2Y;AAMIq|Y87q80ujbBo z=bLlSx%ZxP8N)DOCm4o-^itIhsVn?dJZb98R;`ZdeP7q}|3XG@+mhGD=k z3=G3Sho>{O^JELh5<=EK_o7yvyO^IXc}$Z}2LS*olYh<3Vzx&eFxDsDp%?;zrjCJ| zK|l$MqyhhxJTc_Er2xPm+7GhZ7am9gz_|aIDQerN001DWvY#FbW6!$Aq`#xsjr0@; z7eqKABaJ$}=bTcYV#FBYbTY*0Bv=(S($DB@go`m|sqMFb1^Fm^Pe$36Y(`O1e4zLW z#RoF8xqrehw{1N_03ZP%XU~J(?zIKY(c3NncV*1z|E(kWA$svE!7XemdS2VT`V+nF zhew1LkJp|4fAdd|DR2jbB`mW$et}v_Y9-mj5G~6xiVmg;0MOq52>@W$Uor%%_-z+J z>I##-hM4N>EO3NK*HfqFEDNw3Ui;o8^wt$k3Oh@a+ zw+&xsfx}APN5N7j7_1&j^bGZ)yLvz=YJZdYM5V{lo!`S?ofG`gcnSb&3%?5h=vzIR za`oOaeWGI)mQI09&I+R6ng6!``6-w_5js(Ke97aUX=q$Qn-2!~-Ag~lPu)M!e~dEe zRMY21tTfYh3otFf&5sHb-gc3MYLgHARd2gULd#+d0NQMvRxywA{?pGejtW8TJ%2gM z^}qflX4Z|Fr8f=JQ^2js#>8{1UUJ^W$rOnJ)3MTd>#%~&?1%D{K^l}maO0T6OP&%3blG-ni{h3|q`}J)AK)QY# zbRq?0Nb^tS%(}cPbiMj;aen8DFBAZ_uLn#|fe1fFWMG@sfs3)2>mvwnh)%mvMU`G0o${q185 z`B?7qL=gb!$rRH!zh9gAP9z-wCK18ikAKT7zggJ28%zB2yq)v_oKT|&W2I712$WM`7o$vlGrOE z{8!4;kj!;Jaq_+{uNYdZrhjnLosF0qNKn#UJ2E)GZB7OZA?7_Sv%y!x$^%s)HsOhe zLH5jXmrg0&wrrzTQ&63LHw`;ev?t6zA_KcJEo&nEdom7>M4f^|2e~!{874rAOxP0W>tOa5P^C zsDY(dpeQN6?1gM*xM|dgEwJqP|G&bt0ADAE-&S{I3H~-i-8AEQHbZdpAEGybEjn^m zj)`XZ&BD@k!0z}3%6}4;v6}Z$uclSmy*=WWn#xr}@$>=u0$>J1lZa)zg$0xSR8zs(%5{8j`BB$Ns#4>G}Y( z$So=U-OZx~iif6=t0f2dZK1bPP4Nzz^ZhaD>nyVNmb_=GSlIS36fe&*xHgdozN#IV zswJ=jwhQ1mA0}FTQe#hZ++boDfxsXc-WW?+#c#U+002sjf!e70#{ON1%!@o-rLt3? zR5#+O6t1yR1Am5L*;aYl2;l21aI|iG+bHSCwDgq7b^#KV9$M5U^WD`0O3zR)g4IKb zr^*SsdT%j(t0y0*9hj;mumZLVa382nbz_sW!qPF>eq%%{&14FjcyZ~LXPEI+MBUx@ zF~KQ`G&HWDZFNT;TYG>YOf7_L7XX(A(chSf-jkz-V}HG%`mdL=feoJ<&C2N*4(Ia# zi1(OmJhcAcKid8m*e?J8xOn~9RUY=Wy<5e=_il_LBFNCxBseIbgbgi9h<4PQ)JrJs=nIhAy_ptNUFK9EF&A2aO(Y~Kz$>lXolZP(}j4HP9zx)x2KNm~E_002ovPDHLkV1l!9 BU^f5& diff --git a/Resources/Textures/Structures/Windows/reinforced_uranium_window.rsi/ruwindow3.png b/Resources/Textures/Structures/Windows/reinforced_uranium_window.rsi/ruwindow3.png index e10cff828eaca524427883090f88e0a16bbc1ae8..7977b29f0cc6fdce99b0fa912ebe23b2a3fe692a 100644 GIT binary patch delta 849 zcmV-X1Frn?232wxgW$ zfy4KAt}xF1c=dSBnSwYI4u^G&@dR{jqwD%BsARdobECGH+p&Lprmt(pI?gB!g zP{rsPe$UASU< z+TQ`mWU^v~zu&V@CX->h2kru9=M!aX5T~GPn^#X(jzdWWcL8&y=>?4NICO3EGF(bQ zNdv)F z#kJA?2+Yh*+x`wPO^lk`JDStstZwKVqb(pFk5kP8z3nUoRr9(0XbT{Rn^4+EMKyh0 z4?>R%%mV(mAK>wLQ0taAO|n+2!PP$Pb{l!UUVl_?)Y0bqP3AGMa43r*a>Kijy47m+ zYHLN%OP(Bx0GG>!oOfzP($1t#6y0t&yuu&39EKDYDF9MfqyR`^kpduvMGAlv7AXKy zScDhAeLWfs1~J(iXfzs#tQ5a$UwYR&_k9tc&xe}LCUQS$q)7gY?9|q1|CbnVqyR`^ zkxBv}g+&U06c#A}Qdpz_NMVrzAcbXU1ds#M&*>i#vI-<^?}6$;GBg6nfhjpe-DPim ba3J&-iPJcFc2Y^e00000NkvXXu0mjf$CiNq delta 1117 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 a*Z&1WAAozTG^8U=G(fAZq3j za5#w7z+g*kRqAzPCHhZ-yrUl@PsgY{#|1s$tkh+4{1mvGRt5$Ie7Pgg&ebxsLQ E06wu-kpKVy literal 267 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wkP;jrO zi(^Q|oVT|(@*XmfU`=eg(NZ|0(N6hddRxz7owSbqKU9jY+rKU;dVJ`1)N8fM`tR3M z>TT?wr_|5y`QONt!RX7lrC}LEltVCs?gGsQu?r#&+!gTe~DWM4fngUnA diff --git a/Resources/Textures/Structures/Windows/reinforced_window.rsi/full.png b/Resources/Textures/Structures/Windows/reinforced_window.rsi/full.png index 34c51d7c3d6a3b995f8df92ed1176e988a2ad8cb..73b05e9b2a0e57f6bbbf74c2203f6a234ab05f53 100644 GIT binary patch delta 412 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 diff --git a/Resources/Textures/Structures/Windows/reinforced_window.rsi/rwindow1.png b/Resources/Textures/Structures/Windows/reinforced_window.rsi/rwindow1.png index ba95fde9e59c54dacd0eda155231ef640db07f41..defff91bc0186ab4955ad1c16e520e2a4d9e1945 100644 GIT binary patch delta 596 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 diff --git a/Resources/Textures/Structures/Windows/reinforced_window.rsi/rwindow3.png b/Resources/Textures/Structures/Windows/reinforced_window.rsi/rwindow3.png index ba95fde9e59c54dacd0eda155231ef640db07f41..defff91bc0186ab4955ad1c16e520e2a4d9e1945 100644 GIT binary patch delta 596 zcmeyv@rGrBaylaqHE8@!#WJ5w=>1Icja#Hr@s53SCOm&p$Vu)N{t3ajI9Uja2WQWA6&ZojZ4| zlFwOmT1k{`!n!Ht5o~wjuDPF<@(iNW-R&wKFCvnH~6E7}ix$bf1$~^U=x2OVWZKnanU*s_JU< zGe!M|qq*SvyT6TA<}>T?INfCF_Fm)Wt-#wMZ=Y9atk>@89UWAEWb$hM=6$Dc2OXLG ze=7fi(tqD7ip5wOUw{8C@wf3>{lb8P=7R@zGa7d?UDmgGb@`V+x3OV^nN7&wrEaMO z?_wMNANU4z56DgEc!l|a*O7A;w0O;tUNAZ7$H#xRevyxpHoiDyP;&bA@8utVgOMhtD2Tdy13hj@jttp$flx3}@yVSk+ zoO@;_ezz@r$eZx9nG>Gx%ei-cXU^|;e#|hR`Q>M>vi^E z_UiAJ?ZEhFL%8RYDv1&{X-NqW-@Rd(rb!uNgm$!q(uzuB%pi;zge0h5d`d^U)2Y*iz$8pHd6`N&yS2tNaJDYIMrC}IsFnea&*w1?kR9?8b8?K#Ax0pF) zx^M`Uk-JSHb7p=7+NY(DWwv3k!R*Jktk{Y1uYC%%Jna*;C#qR^a<=oI5V0utB>ifh z^Q7*4$ce?|pO1QZB0JW{?rZibDGo(5)Z= zK8Qi9f&};=2CWJb;DZ>nYQ!f1O@cemG_At)|7FdB-!T0t#l6Ca9|1uEd=P_H1qtv$ z3|bW=zy~pC)re038ic0Kn2joFb+xykN?KSDLYKsfw(fVH)t)ocOV`9VF{G3RT%j#( z$;x=!i+}px?L>B+LQjFbi7BjP<2Pc|qfUDaV^)%3QhD#Tol*R?Yg-nbHF>;|$gVp9 z=m1_v9Mr}}M(P;c#s+c6tCnS*_>mRG(SOrkq+gmMs+AmlkNztr~F z?GHy~gmWo8p?&y+lqCRI0IpYCJLBK`uGiS(GIG(In^-AJz?UVfJ+G}fIVUTVz$%ck zXn%R^pRU{5QCw*N$#V+aU#kw&0ZXKIDN6vQl-op7+qMZ~OgjO-lhP63{rwmFzI+3D z)!bDNC@&RCogfE9oll=)TVD3Rdhfng1R z5r7qx`c~=eLjo26CIB`7MgUd-W>Do{djg;)0JQ z6*;7$Tg*BaI4*U}(9bY!pSJu$z`S4bDIzcS-l(iP$6i1E{|~m-`Q`6-exLK2hja4D zlzYJ|MM|w?y;OuMez{uBU1q?OSy=qspr-QJWk)^#)5kgH&S>qr{I+c6_16!Dd5=6+ zF=JDi>=||YUcO%HcDv)}wge#c zZ1#^9aohd-txmd`HiWHKjhehclOeQQ5-XO~zVo6cCoaA6gXaY4g@q5}d4Ak`@ni;& zdGNQ+xxck7ejeAE_te|WKVK~wu==XnZHDXS4c8gxaS8utdlPz2n!~+G+&PZ_)z@Ds z(gF24p>ud1^c>L2ZTMB&u>JSWm~)xD5B44m@o98g_+TpQs;jS3q!-xne%pLteec9X zOYQenu_a$p`Cgs*bn4Zy=pSC|9xp5`ZeK5S(62dQ>kP(#tvCDxw2sAp=Wa{Q`lqkZ z3iCsS*aSPDPHBbOIb!AxyA~+rF-*U*=+g`j?tQ9TBP0$;-BppD`p>UGcA@YzwuOs6 zh&-@9qIX#QqvnCNTUYo#Ys$~|y~FS|Gho|Zzb}j$k5BD?a^q7pFo7_5y85}Sb4q9e E0C52bHvj+t delta 1110 zcmV-c1gZPy1nLNoBYy-jNklVH1q?ZSg zxV(@Mad{wdOC(hAfCsmdNIZD(fJP$W#Vz8Y)sQOEHk6_&w1iTWmT=D5%go4MsgO8Z zOf$36{a*HD|FiqeerM-=|34Ru1i?8MxWA;2I)=C3E;Hft z%?C}L=RQ97vO#KU6MGhz~PVYg)-CAklRofKe%wdD~n&b0A0XiCfR#Sj^X%; zxwcGR-v~em!GES{A`@|pF{aXZWf6G+9{x*RwXt#S66C&kDz#0@1sIeunYC3_=tT7NsnC<{V2Fzi<8npe>rF;b*O%m{d}k zWWPg@2LyS*cLaGrkOu^LfRa2wcsyX|xth7%eW!Hm%70liHXpVMGSl?Mc_WSDv(($@0#xXBIdyK9MxT39zf`*ij!iXph(3H2vk>Ny`!ykbY<2|Bk4#A*rlyft@zOO#JB1!V z^?#UP{hM}He(EF%56iGVGv-98%klUe>vhG&kmWf1(aSdK6&K|fMNhauiOBWMjrGMM z*DH5{KUvD=XZUG)TnPdJe9#7^2n6s!8g$*Z|Ed zF3PXG76?aep^25WPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi z!vFvd!vV){sAK>D0#`{yK~#8N?V2G>LopDBAE;$^%#wgcOpsZ`+$55O1c5*iEQpB- zumpubkdPpea}(GFiG~C_W?$w;{>OEB>)K^uxx0?`OD@+ucYojddfToWnKF$=V^XWt zve9UiRVo#F`b)iD&+FG48N7ZL>31vE$kC`U^YKsj1g zZi7eXU2hv(hE?0xs-#zda?&LI|)5m`->d5<(HdCctcQmxOX?!@2`p z670}MWPdQS=!efk=j8tnMz9lnp^b=ukVyh4M@tewIa<`O$!Xs&NUs3pXh{MnM@tew zSq=P9@`VKIZLrm9O=vm8ve)I;z73jt0_6bH$ujd!P#0kC377zq5`s7c&CmpEp9C&~ z>Ho%u1u&^3=eq(D9|DXksyy!sBIbSbjBPK zH-@5S$hl)?zGai?f99Wib7$`T4?|=kNs_ETXt>gRC$HvMbbo3-AfCuI6~6uyn#fDH zu&o#C`Nn(C`u}wOtuy7Fa`ag_7w-u6l8s^aJBIKfHsYUO-ldCjd*T0d)f!Za;R>)Th4;QbsdC0X0xXGe7|~ zP(?F90X0xX^#;h^54icV@06VDou|uWea|zDyjxKH2!GHFP(Te-(F{;P4OGz#P(Te- zQN00ZJ3?)j>dSur4fg(>r$=PH2+0M-0J!;+H}10=te(kEHB~IEg*{7yJ$y<|0gs`- z9Vk-(o^*0BkZcqLLo6mH@V-fsw9g)sIFr0{wH*L$3fM9;QoMaV!LW}EG&R;qp>3axg5{s*kNW?dkh@rn7+Is+o2&@9* z(=%+UDT#p$0O1*S*geJ=?Ijx+`rCmv0^rOa&VT+P0{~e7$OJ$(082j}Xsdu@f8lO# zUw5$iV|Spbv5t(-F6#2K(y-*?f@T1m`5WyA1dG*N+48h=NJzEuZ>Lv8RV;(B3c#5^ zoc%)v0I~p(34m+>hW>V-?Fz^H82UUpa!roD++AU`DS#Dt_*Yc_9-tYZfEuWx8K8g~ zsDGjvpnw{vqIv_U_X{{X`eo${{{Maf%4h~Cpa!aF1}LBgs%Qo%pa!a_-T>+yBkkAE z)o#@vq?(qQqZgd~+Vo_it+bL$OEEfTRzkgrq9DN@B8CanrvPLGAS(cw0mu$Oh5)hz zSe>KPN5J`72e;WcnN<;MX?s2Zo5dOBm1Sl^RMI%<@-B$W!H6{2`-Z)G`K+bQ?OpPW zj-lKpmdHB aLVg18pkNYXZ|aHw0000 z6*;7$Tg*BaI4*U}(9bY!pSJu$z`S4bDIzcS-l(iP$6i1E{|~m-`Q`6-exLK2hja4D zlzYJ|MM|w?y;OuMez{uBU1q?OSy=qspr-QJWk)^#)5kgH&S>qr{I+c6_16!Dd5=6+ zF=JDi>=||YUcO%HcDv)}wge#c zZ1#^9aohd-txmd`HiWHKjhehclOeQQ5-XO~zVo6cCoaA6gXaY4g@q5}d4Ak`@ni;& zdGNQ+xxck7ejeAE_te|WKVK~wu==XnZHDXS4c8gxaS8utdlPz2n!~+G+&PZ_)z@Ds z(gF24p>ud1^c>L2ZTMB&u>JSWm~)xD5B44m@o98g_+TpQs;jS3q!-xne%pLteec9X zOYQenu_a$p`Cgs*bn4Zy=pSC|9xp5`ZeK5S(62dQ>kP(#tvCDxw2sAp=Wa{Q`lqkZ z3iCsS*aSPDPHBbOIb!AxyA~+rF-*U*=+g`j?tQ9TBP0$;-BppD`p>UGcA@YzwuOs6 zh&-@9qIX#QqvnCNTUYo#Ys$~|y~FS|Gho|Zzb}j$k5BD?a^q7pFo7_5y85}Sb4q9e E0C52bHvj+t delta 1110 zcmV-c1gZPy1nLNoBYy-jNklVH1q?ZSg zxV(@Mad{wdOC(hAfCsmdNIZD(fJP$W#Vz8Y)sQOEHk6_&w1iTWmT=D5%go4MsgO8Z zOf$36{a*HD|FiqeerM-=|34Ru1i?8MxWA;2I)=C3E;Hft z%?C}L=RQ97vO#KU6MGhz~PVYg)-CAklRofKe%wdD~n&b0A0XiCfR#Sj^X%; zxwcGR-v~em!GES{A`@|pF{aXZWf6G+9{x*RwXt#S66C&kDz#0@1sIeunYC3_=tT7NsnC<{V2Fzi<8npe>rF;b*O%m{d}k zWWPg@2LyS*cLaGrkOu^LfRa2wcsyX|xth7%eW!Hm%70liHXpVMGSl?Mc_WSDv(($@0#xXBIdyK9MxT39zf`*ij!iXph(3H2vk>Ny`!ykbY<2|Bk4#A*rlyft@zOO#JB1!V z^?#UP{hM}He(EF%56iGVGv-98%klUe>vhG&kmWf1(aSdK6&K|fMNhauiOBWMjrGMM z*DH5{KUvD=XZUG)TnPdJe9#7^2n6s!8g$*Z|Ed zF3PXG76?aep^25WQx{jql1nxza8-i#ZjF(v4-9*E*<*eb%1t;ulh z(@(h%-|hZSoyTx3hyjNhED|r6zr=&}W6CY<`N)v;l&3B*C{zLHSO!m5KbLh*2~7YR Cu2;wa literal 272 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=*F9YvLn`LHoxPEl$xz_HznPrN z7BqHNs5P}|CM-|y(9UVR8~-FCQ%Li*QOf=A7nyEt{{3SSad^-W#L&p>#mK^^!75;} ofJA}6;xl;uGvU>Ee3MSRaj8(EX>4Tx04R}tkv&MmKp2MKrb<;R4t5Z6 z$WWbH5EbbtRV;#q(pG5I!Q|3EXws0RxHt-~1qXi?s}3&Cx;nTDg5VE`tBaGOiPeENGIZAF25=UUJ*n;&3_1D5;OH=W-$xT@pTU$ z-|wP4%e(H+F{l(w2KYqcIi?#H@dokirloV> zj5;c)!a|gGjeisqX*!R4_(vUoid-_eDq!STKn*G+#}EDozk6#Ir>EScU>xXuvF(p> zAg~Lx8n*p?Y}>69!2b+fX&ry93B*20Z*;Wq5iqn3TwHfFc@MbU0Y;v5$&eh$PfI8k zf%h}|raUlw3ke?Z;bV*G`2j>h42`(Cj+33gs008_+L_t(o!^PJz z4uUWg#__LAgg4gN!P$Yqa0o|F;pprEoV|m)qq{5d44SY4V_9{AU<5l#E9HlUBkaSQN2aN|}1KJdu_zVJx_KJjF+{2$;Of88%9C5b0VGQ0z!@Ukp_1481f zY?~`d{A&s%@NNo*ZY=$yvnMb7aXn|Me^Df&?!$KN6W3bf1FKOJy7*C8<^TWy07*qo IM6N<$f+QD8Hvj+t literal 16179 zcmeI3e{37o9l$TG=pa?9($F^Q2C-a~Qql9B&pz9Cb=;+Kx@6!Gl5}wjqnz)a?MrN* z>pM4g*0HKlSK0vsRsjh`8e4||X<6HK6x6b@t=-lFRXPfzzlkC}#@_k2 zU+lMR@W(VgONsq`-}n7~-}`*O_kDMN+@9W^&onizXrw5rsk_VH2fr=m-{lM7e|>E1 z&+zMtWY>^RQ45>RzXob@e+xxq-Y^v%fyp#Hq@=pBqezS7?u!- zsEIb~JI8)twWvy)b&wCRfn*1Ws$F9#&_C8QAdij6f?{3oYxHJB=pYUZ$&!i361tda zv*!GY@V7b4SS`6J#z>pB-3(|626`67eZ`ZdKncCT4pL+?Qj)RT zSf-YdBA0BE=~OJYG(~1W48%dg(4n2Zrd=|s8JZr|>Vzz*>js872?R>9YpypQuNhi5 zI=4Xt1*A1C^?_^>FnvJR(kU5qZi8D{S!?%(8ZIZN%9E+7yLOOK>zJ9EyjiXk@)`2N zy^0+vAQ@U}K+|Hre3kVU5n4Jra#dxyZct4q+Ni$9%b+IZe3!iezhnR($8rvub6Y&wy6g8YJ`>?};whwTe$nv6tuk=wd6ZHYFA4M{xIeDp^ zTj58M#juu&ONLL4OA){%6A>>{9;}#Isw%NVi)ksiEZ}o^nOeg&t^AstHp{v_Ap;#I zL$62@OjYi}-5^D(M~jM>>dUtcMUz!UEC+S7f=h9+EbV5UPTFn1iKW91w@31XSVi&hxw5M^FK@cwx)>e0uDx-=p@hP6 z*bO(%^L00#UuT80S%Gd!sqmzbVij}Dy(n-m0Pw&Wb^uxe9vC77b0^t3xEG%11ljHa zA-Aizml|$nh3ZnxlFC+RI9F2rU~BbgxukMEJt?JhV0NrFYq4dO4uO1?6lx{c`9w)J zPXnK9HWZ+EnX1w9vPzcT`~-D&I_HL9mU;acqfwB+HKe?&+^qUebS-R*N-5ADftTuB zdS%{gwHfOE-(7$oArZQ??W3h3q_7^AlX#kycn{4hPB$$miVQ1Jv4`CbmqYMK#WYuB z5#6F$RTY49=R%>Uvm)<=w<^V+UNNh_lWLxGII`xFhVmNasFa8R#m5wPRvbWA^uL_B zx%I<5nEx(w$Z7n4khy$5t9xRx&(7|lUh_swg#8!x0x8$`>|SQpSh;5M^Mhs|jiqz* z-5d))jNSZSFs)RhrbBqsN;PU)w%n9Z4IfvCh74C&nRko%TbX|NU;}(Eo_E0W6CFk^ zdesbw1^p_#mC?y;nW^#d9aS4}N|6-7oL$SaZR$ z)Ohm9qfZ~%x9q)z2i8xYI<#-m8Ee;9j2o_YTv)QZ&+&?-Cw+MQ-e-F6U$T759{YC! zUweOY-L;JH{{Am4a_HXR^r_>oy#3Wd*UnqN_1e50k=0K>@kGn6liR1K*4 z+;UsnJSsWzoNXQT>9ze`OU@q(?)zE##KP_CZt0UJHvH+$schF&^ZBuI2ezxk%+9hd%C)ATnUyZ-ROJF~yJa`ErZJf6L;Ejd4N%iRxL>|FZZ^V>r$UwUr$ zX6Ez5#sTo_-9i70=LWpY@Qo{iM_#@(cB;Sec#KapWqvt)$HMH^V-J4&C$}~no%rx{ zYj9hi_Va%To3EX@_|#-;@)xbm+{Haou;=LC@1FeRUl;u9gMZF6Y(5ulZEk<4`L2mi zL~nlm)i+Lmm)n2!8<)0kd3fU9W#4N*cFz#E`tW?p-@Il%MV)JhO$=$4&3$9 l_=#(Lr@p^<=lc27*_POjMO!!SGGA-&?(FeTZMc2szW}LG%sl`A diff --git a/Resources/Textures/Structures/Windows/reinforced_window_diagonal.rsi/state1.png b/Resources/Textures/Structures/Windows/reinforced_window_diagonal.rsi/state1.png index 65254207165b957f648e77219eb234caf994a8b2..4130608cea1b0074f870bd6a0abf28dfa6bec2fb 100644 GIT binary patch delta 699 zcmV;s0!00oe&q#_BYy#fX+uL$Nkc;*aB^>EX>4Tx04R}tkv&MmKp2MKrb<;R4t5Z6 z$WWbH5EbbtRV;#q(pG5I!Q|3EXws0RxHt-~1qXi?s}3&Cx;nTDg5VE`tBaGOiPeENGIZAF25=UUJ*n;&3_1D5;OH=W-$xT@pTU$ z-|wP4%e(H+F{l(w2KYqcIi?#H@dokirloV> zj5;c)!a|gGjeisqX*!R4_(vUoid-_eDq!STKn*G+#}EDozk6#Ir>EScU>xXuvF(p> zAg~Lx8n*p?Y}>69!2b+fX&ry93B*20Z*;Wq5iqn3TwHfFc@MbU0Y;v5$&eh$PfI8k zf%h}|raUlw3ke?Z;bV*G`2j>h42`(`zWf6z~007}hL_t(o!^PJz z4#FT5fZ?A`P2SjRICL-`!qHPWI(sk=(L*?NZb!Q6)COa#1s>3iGJJmsBmf1!wryXg zB;GU)rX+5yr7DGw*oJe349uQfINF(3kML9w11~y3x9Tx zlZargO&72SKb)_3QxczsUVjCAa6mV}7gr4k!PNpnag~4=JUSp2j|$Mhg9Ehipa4zW zJ3t%v3P^$P4oHRX3P_3n4M>gu49J0R2IRt519IYD0lD#yfD-r;u=Zkcug1uH-#$QX2umL1PlNG002ovPDHLkV1nsgG$jB4 literal 16152 zcmeI3e{2)i9l$R@3r&^^sZ5_|c-2|(qg|*c-I&~UrrLrQ%Cic$f zALke6EgSt~nx3V^{=V<~e!uU1zTf-4yFYGgU+?PH=9`)+ifZlYj`qWEm-V;kTKL~6 z7B9fB>$2TL21T{pVEr{wJ0?CwQQ_aH1B2#Z>`qbE(jH0C;=of#XW?w9TT#eL@+dG} zagbCq?e6!F9e2A_rQN+jh_SJ3Cm2?{i#k|e>>ZGcqjE@buZT2<3nFxo2BzdHq*EC~ zEVR2zent4(8fM(C(iC&F-Mz{R=o*amxjHo+xCD=%mRWzm6$p7aArSBdZg=r4Cors+ z@v=1U6@9Ge<6Y&CJJJk)g>@w%_DAn1hl5hPd)PFyBE#hKc~9Q!(exz4g+d{QRrRcaVNPPPYV3yVO{W`% zHq5Ruh@gzLp`|e}o&`)lFtnU5gRU{SmF10gZ>ot}a_T%;npxKl3hFFomc}+Km4cn2 zFx;!ysRPN>^Z`vvMeHi;s~~iBc9yEjb=w9tqiA{Kb72NGspY%o4MZgqM0l3>(yX86 zeFL0d^aVxE*T!-p%Q~FcGZ7y#O;Ho$H6I)-Xl{V#MK&n%oYRM6Ch7xTKZ;~ZbMoSx z>+qwDyqpjtE^XLWMIH# z7>*>tRFy8=4k=kbT2Z9bh}||6O;#1L7Bs+y{EDAt=>Y5V(HsW=9g+n<4TPW~g%ZIK z)P))A;)O11>nhhqdAzY}$(M*HSOr+F4=2&}C;9dX_fG^<%v;=|z&BbBvB#vk4gdp%Cne&5qz+c%*12;25b*olM zjn`+mR8s4~m+D7rB~|L_SxGm5)v?;$m6laK1nep)*Gj4LiIQxc1`*k6C_o7_b)&Uq zRV~Bz1a)RQ=Z0X0`Rp(t_d(&>=;UVI?YDBH;CVLqVyMW=9s$Em~FO09-m3$~~PG z1s}Xssq}Qmtl6E^^PIzxHJ3Eh)+i54nIupmOl4=40dz(G%bA;7KeWO8cbP*@D6s!`J+ zys1--n$|4u&ZuUDFGoX$9ah%eqJ1l~9zNKBh+h!A@ccxFQHwsc08)cd72e7i)=A)n zkxDkGqM_l?Y=#a++0agv;}N8EjM<~`0S7)?G1Z5w87Exz{P{S4)OPf7dPRJZAP5k= zNO0l#AX4T@FKy5=YwboE(8c(B)IT=5G}!l0Ktm{7oHEICAbhE zc#+`3^Fg!(7Xkz?5?pvbh?d|&fZ#=f3(p795?lxnyhw22`5;#*YSW_>b?FNHevhJZEJgi!BSnc%QPhpvcOHE0 z4vK2}QBQQ$K;gHq-hF)Z#L6WPFZ(O_2oZTMyqJHV&A74Co?xDB0 z>|OJd^I!hsL3iJ1{?z7?KeT}BuBSE~T=1FP=f@9eAFMxD?0Q)^dH?(AYfnsB-}|mP zJeL0irAgU04zN>ej<&xi@Ac*O&_8(PcbES1MDe+ax6iiEr@EJ~oW7pw+wEWT>KIh( z-%`Hv{reB^?Kr%ySX}zn6Gr?C|Jtr+eEjE^T?~$(Ef>_nf(B?XmqIExRyzdC#I3 zpLzEe$=8DC_T0Df$%X5Vx&9PB^1`i)5C3{F^!N`SeQxS_VCRGHtWB=Vv_Aj$M~-ia zMt^SH{*Mi3zP9+W>5-n~*0yWH_r-2%dTZadLyO-ywB^}tZ;pB9ojG**+1{>QSI&nY znH*Tq5!xV}d}!i%*zhmQ9{{^4i$?5zlCjnr09MUc0end*r-fcs%-p8{Zh>#{`ISVVuV*Rc z;=_vu2-bSB3bC)P_}AZG2t#S`7r5M>)f_fsy0m?|4?)lkDzFxvbLb}O4s17Q zj0pjl8A_??X!Ze8K{5BVQ;iC-%Jx~F~s2(i5p#iblP00000NkvXX Hu0mjfh8dyu literal 9436 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 nXYAxZ&0s4b(PK|I`T=@cMw+$i_EG->@F4?q diff --git a/Resources/Textures/Structures/Windows/tinted_window.rsi/meta.json b/Resources/Textures/Structures/Windows/tinted_window.rsi/meta.json index 30517fd0ac6..cdbfb466b44 100644 --- a/Resources/Textures/Structures/Windows/tinted_window.rsi/meta.json +++ b/Resources/Textures/Structures/Windows/tinted_window.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/ f141c349e063f7318d8c8a2417d840f0b2d06600, modified", + "copyright": "Taken from https://github.com/ParadiseSS13/Paradise/ and modified by FoxxoTrystan", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Structures/Windows/tinted_window.rsi/twindow0.png b/Resources/Textures/Structures/Windows/tinted_window.rsi/twindow0.png index 414ffd9f3ee92a394adcaab92ef34f74bbb1afd5..5539fa6154e17c821e8867ca5f77bccaacec935b 100644 GIT binary patch delta 1468 zcmdlNa#v`AvN2;@rn7T^r?ay{Kv8~LW=<*tgU0!(6Ky>X2Z*%#2QLlMY7!GEJP|Ng zr=zQ5vfDxqQLo9F@>=yP9<(0+ZSj8Y;o9$vPHT^ttWM^+P;%Snn2O=tNKxkX9~R0x zo>>r{HqCIl$B~QM_Pu*)b~ScN`osFGYtwYuez-h}Oq*f$k?rG^Ww{0S)cH0ytr40p z+&}Az!bj!nqW$+Rp2vz+q}}jQecpNaNYcL6sbXoY!OHVg`c};H`{{Hmd20P&7_qq0s#aH12|9N6w`quAc^QoT{mzy4y?>WA_xAkqJ3k$NF*XSnt<^s=p_ze!fwRCPvY3H^TNs2H8D`CqU|?W* zGg(N;pOJTRqL2$SFPFmPWkOCYKw4q)OCkBmJi>aD?S$wV{EYk%f{%NoHD_m48uYYF0REKV#-O;LghCTAq(rKhIY zD(Ndt))RA>Tq341d6AfUy@EcHNjCcErrYRaa|lG8OKNd)QDyE=aCEi0!a<8;s>x;OD-ZN2N+5Ee&;F2`1er$v@I;j6D+c<;3S`ssECjyj{60r^Em6B)Ng z>GH_cSfK%4D>_(8!?8hzn<*d<;7?*)$8c&vuPXET%U?C z%wUs9Wce9sQO#j}{lmv!e_YOntT@l$T=JyX(^8Ug(;-fWdr@;3>YuE2-NR#c>uz<{ zKjzoppT2r7SZ5>GK3n>WK9}oy6KV6am(*>~dKLyZ?AdC;cp|!6xS=NN!<6{+orsi@qGIO8%wlkJ(vGVy``Q=;J2y!?0`prpv!XNwiwrJt6pXPJRvyL6guFw8j2{BLllB1Z=lm)1p?v=xmtW33KWpl~Xe#{s=zBUrhC}X&Q-g`* zfx_btl^-u-_<1Gbzd+8G-O=VwY;PDh@FX!$ncXX}fA#$owTj9AqAX508|)HYmM7YA zdHvO_+*-C74>qbETW1iS-uR-{)|};B^YZ$@)(D2WU}@7UEL)WQ_OHIZd#ku|{eiCT ziKWW?)}nlyxH67G0_Dltrz^Y#JbulJxpT_s)&3hFXT^j;J-=t`oF0Zh*JjQZxq4b5 zi<6`1@vfkeUEISxHUHx3vIVCg! E0BoaL-~a#s literal 10814 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 ZYxlTu#$ZI33;lct)RncBDiy54{s+=SrBna_ diff --git a/Resources/Textures/Structures/Windows/tinted_window.rsi/twindow1.png b/Resources/Textures/Structures/Windows/tinted_window.rsi/twindow1.png index 90131a48bf96cc8117ce389ac97229626c1ca243..a7a0cad53aff9f936f9dc456b55d44b57fc39e4f 100644 GIT binary patch delta 1282 zcmbQ{uuX7+vN2;@rn7T^r?ay{Kv8~LW=<*tgU0!(6Ky>X2Z*%#2QLlMY7!GEJP|Ng zr=zQ5vfDxqQLo7wQd;#Z9<(0+ZSj8Y;o9$vPHT^ttWM^+P;%Snn2O=tNKxkX9~R0x zo>>r{HqCIl$B~QM_Pu*)b~ScN`osFGYtwYuez-h}Oq*f$k?rG^Ww{0S)cH0ytr40p z+&}Az!bj!nqW$+Rp2vz+q}}jQecpNaNYcL6sbXoY!OHVg`c};H`{{Hmd20P&7_qq0s#aH12|9N6w`quAc^QoT{mzy4y?>WA_xAkqJ3k$NF*XSnt<^s=p_ze!fwRCPvY3H^TNs2H8D`CqU|?W* zGx;KqKO^sC1zs0sUM_{nsk}}sKw4q)3SRlir+M`z|K+ux?7*ipxqwe?@+>~>$tU?V zCx7MhnC!ssFu9rEWAZtEF;xY3Pu~D5#{f@TB_llpB?vblC$S_gzbMyM$tN?fv_fgJ zkbsgnL@F$`s5mn}52V`AK+niRX>y=|=;TZR*%Xk~AYfCGTj1+!<&jxjl3!G52NMQL z6s4qDIVGke2|)#OG8KwTT+2$V5|c~7h8HK6rKTuB1(P!p^U_mOY?bttCchPMm~1Sl zF*#9Cy1+|e?Xi8Du=wXHE<)0gXgN6*@s>TCa#F}OOEROvL!WL7+;eDY*dE*Z z^XGv&7(`WhoXywl-@`WDPeQ>n-Kk+7ll-*Psr&CUUVb@cDr?&2$o;$l^V!a?%gZzT z`snM+kBq_kN8+1Y12?dVe~moA)3E9&5Vy`{^VeS=nfWH&_^?-Uj1J3!EJJ26zULBn zMC#Ip%L~4gP2;XEeA&b%{_Ro7r9)flMSUfEqAxu<6lb&ZM4UmcYec=D$5P%6It*Xa zqzw z@x0A9JERLH=xq3XXtCwd`f!U5#xDnhS>3gzuCRT#<^CXlqnsf`Hw_7w!8osY1@3kW zhXiD1F>eXZIrl&4szu-9`;!yiAN+WCpK#)x&#Yoh0b6G4w}Cm3!PC{xWt~$(69BuH0%QOH literal 8214 zcmeHsc{G%5`2P&DFNqLhOb9h*F_szoRt6K1ElXy@#0+MJv1AD;kzJ9Ulx)cw6-8O1 zv`A$Qy`(HH)`aiy_HO6*{pUUB_x-yZ+eV@6{#91FZD!?nr3jhEF zFlHt;tf#^D#m&jOmy!KP0RaAjkQ0s!8ypklNAvX{`;b74U_TOw6h!s_0D=bZXHjUw zXhG90`rcZOuh}kwm`JvUS4^Uw8>fR$$9JEEwL_54bm$+4>SHykTCzsp;Q zkE%NT2Toc#g%ixo)d(+IVvQ+RW07W8Ko(iSGr> z(tFQ-_T9Rha zv@~=r&55Zt(h+yAC_EpKY`MIo-T$`u5oaFX+XD{mJz^1;=ibmf>pPxI?32_q!=^V4lGtaHu*>IU zbxH8GA8N=C4@jK>UHtO2!$e2+LZG8EY2wE9Bm9@7=}%BsT~32^#k^y`ymbev_q8*10hnni`?WXw~)EY6+KRGK@S-nT?tqRzuGfoZ8mA(oku=F zSnp8fy(eYml`XLxacmK0DJs}z{v~rI^2-X-a*a8(Mqxwo5P8})aD=j=>sG2;9sVPn zU45%SOwdN7y2X0(bfvFtP;r`1CeYEZJ32_6oBN}Crt8xiqWq}#*-tRHUf_XRoZ{$i z_J`N>KFp0()5nkWC$AqEcEK+A@okBsJfDY&H1*xt;8(wms1w99#je`kGF$dPHN;JE zyuHp~v^Ia8FRiS4OtVpRdzrP8V3&F4Vz1Mo<+~~695tgKQ=_k$$j6iqW~4s7eP2WN z$~>$wHg!lPz?*6Zo)X%{d&-=t!+fl_UaH=$QbXvE^1kX~T*SNHfE6cEvV^_s&g*)_ zh4*>%RMwUbu^+we=v?-;rzrEO27Y)@yLjKwncUQN5MGg!bH9aH`xG^-vp&?}9o1|f z`rS{}b6LxH14vna3Q}WNrgehp8z=3`C(At-mv8Osu))w>UA+TzhfIq?_Ex-oa7*hr zZO;%|4k(P3TGNzbwvMg6(VP!&`CeUP^=|t0;e)g3IU92?Hbx@*jwZFYx$Qej*jknw z&zR%>8tlTn6!l77?BT*}`BH7u>GiCGUR^3W68CE0AKT^wvw4$#n?W~*yt_jz(cAbc z)NM9%3YR#j*>tB4wvzmGSdVShe4m8)fyf)u{3DCe{UQRC&R~O4WxO{IbQ8AR8*Gwy zDATzEOI%zE5w*$b`Qg|go>ZY#GdKkSG@RIT9oFqYE<;tEDq*5SanIKu~im2wK=rD zs#m_MJk_1-0k7p%_5L#8Pw)9aZN6ddoRc5Jf7bhM>|RI+MMBxQKQT+C&s#lnv*}l!rFwEj4_2RtJ4K}Ii8&pa6pBa?tMIvYO}Q;U!rZ4-{$68y$+QC)jo`Y0K zh(bnMn4I(5J*fxRyA#_Nt(Bzxzh8c(4w7{2H8+-Pv}#Lq5mQgE>)stP%NJe?w&=Z* zM^aGt-{akVMC5YV^;)ibMbS%4q3^eO<_-FEW-vdPfua%xrmxb?Bim?a`JCo#F$e4ZqaN zt4RlYv8XxwcNz!CXQ)$!FZI+#29I{RdJ_6kW(J{o>2KAr=i|gqln$AfFJ{J`E)col zUXfDS(6q{T2Jv$Fxz*zLsTrb9CDK>NKUd+XnwZ5KK6TTNH@V=al0xg*ZC;usu&mdJ_p>~?Ce=cWhVduX!! zI^&Qz_l$}JoS4N&~MNf(7^V^?t+-ydhq_Q)= zJ1ONoN_;ebabOL$Z-bo0R~C3=c$7iZ6dcS2UMo{Ss_6p%_(AZxa$#7l;`7v)N&-R#>9C(_DWQvn$~0h#@#>d#^>|{vrK#U>Pt4@hej!i z3GH8Z0eN^J`s4zWgblefC0wgt@9+fK?9XF_ygC}dFG zL-tA}+WU34^qltGl}Z_XlD`;V^TP}<(vX=%0a*wtF=wjFjFTKghv^TfJ&x~e_f_Jn zxR)wLKi0?{Pqos?&@$F#2Uh>=`94`L!yG&J@kXAI?MUcYic)82z0;&$Xw(m@itkd( z*LV%IxNq-m%S9tLitsn1AM!VLKy+v_G4YsP(#e(frZwk5myi;b;0GT$4!w5AG{lAo zN^p}7ROz(M962j9xW|1cA!IZ(=&F>K&~JvVrX|Hg{V}rTV&&HE9aMwf6a#O;RF9lv zBY6tBS==lB`Q)rraV`ddQ%)& z72-D8|4c29C=pdOBM|vPc-GWXzqp8pPe#GzQoTPLTY;-pS%s|p-t~J2)+NWLilHLT zF`6b|$Kj2Z^O^5sRaWjQ|15HQwtiDZUZl&3WVvi^@YV^LCGs^zLSHt_x8C)h@@tQm z+%kjkSC5Ye!=0}tJwaJVQb!NE&mp-|2zL3(xZY#-+j+GgUJWVa4-a+c%jC!L4tfa^ zC#pGhauPX34^Ldg^pTVazCH(QIA$$-7Qs@0k9To*iF!u7<4o^`_p7=Uz%fSdb$rsx zkY*?1p$aH+%-*CvbM|zxrHK;5^w40Xhjrvk%LO6Z8nH)pTGi`$4!a(yv#VGQ2vnkbgxH8)zQw1cb~iA+fF|;^htc;Ceg5nTMU>fgsf=S{O~T( zh#rmrmi5w+X!4Re>kK1FW}Q_Wv6g6pFGUqc^u?1@gD8HivkU;BqaWmlBY2Y-AUw&F zOw|Q1+-(Je$V6SRgE|(5^)n`UkJ%FU=DQN1;$q7y^nwKv)(KdN7rN3xZJT2eu)8$1ow$2{f`F zgX~KMZDZo_z5xtfFqowW{gEHV4~zX1o=X440*eo55Y7(@SA{_-6zJbQ=nT_97RaxJ z{#OtB3D%JhYD1#?2G9s3(?AlHap3O|M8co`egQO}opOi-D9MLJVVTldQQ`jxc@%@S z{?lWd0#7oh)5((6QY425g#>4Aema2g0r2p*w9RQG@(G_;6+hp?iNSzU?q z`FmE|P(&7#23!qEAZe*XwBR@r1c}1qAX+2@3PMET5t<$-7*dNs*vW=SKp*j?QE;s3 zBvWvnB&Z+Nb4RgFINHz}qYFl;!v2z2``{QJEC*e%C7Bu!^q1lUnL@H<;I`R>YakIQ zH4PX722gy0Aka?RqH%=ZgV1q- zB;rmWmf!Cxf)|eJNn)+To~b6 z{Y<)kbw44p%;|`VusGtKo!ly~><{5K{tyL^PxPY97|*Z~Tg}(537)|#8%`tU&xny$ zpgdADPS|(173Cy)I&6abkU8&H)Yno&ary8M&9mR6rlZ=!^Y+1C-VC1LzHRMAXu9O| z!aD9?T=B)S<1PA=HEqH1wI{1;rgYc%+EElz*5|s|fc2ssWw`IjFz{{ov_`*yCl_zHuW0jI(T*m zaaPq`ZnfdMu8+A@U-wb?d98qpOCvH^=*}>ZGmp`oEUj$Nli$a_;JJu(Dp(NXu56-v z=S?mG&0bZcYCd=<2eT=d4M<`#>-*-$@}_=<1EPd!m0yfE&ae)roOp|)CIHXvuca(% zTf*aK=0pbo_(ZlZAmD0_1WU-pz+g?erhwvnT!2k*$7;88j){yR@jV;y>Xr`PNhkWf$Fl%V7P4#O!w-E1Z-lU0f6zMqK}(q) zEb~0axqRStt$?8~U_B`!gP0%;sHSusTy9o0eTD2`D+c?&QGq1s3h+X{X6X3yjok4s{f~j~U%X_KOWR!X?vs8xv*+U(a{fMmj`sbF5f41wDub!P zrdyGHXGj9NL(2huk?kX4ouzSQRjGSkR`))V{b;gD+43@b!O*VCqIM5t%n(#pCC zz>Bh^*rTcKh%sz2kuX%e-&}D=?S|U>+|m3Za&nxzfzon+hf)0T@#o;K&!;QPZYv;AjP91pdEWuOsTsfrKW8CB8-s19=nYGY zIV-@Jo0ztK;%XnrWceesmKlhI1k_4 z49~v+`OzBe`i89}``ZOMV3+2Ra|8Civ;lo8LOOD)K~Qx5ZI+7au-W0g^Cy<7?x%nq zqCL0)Qr{|&_jeE4e}J(+Sgq$%&cWUKJwdC3R&Pcq&p>TiCq zz>mDhyR;6Cxv8S=4wri~21%NRRJ39`!$sC&Ent diff --git a/Resources/Textures/Structures/Windows/tinted_window.rsi/twindow2.png b/Resources/Textures/Structures/Windows/tinted_window.rsi/twindow2.png index ae12f39860f52ffc274a700f9d45e285625ff1f8..5539fa6154e17c821e8867ca5f77bccaacec935b 100644 GIT binary patch delta 1728 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 diff --git a/Resources/Textures/Structures/Windows/tinted_window.rsi/twindow4.png b/Resources/Textures/Structures/Windows/tinted_window.rsi/twindow4.png index b79db5f7893ce7908127d271a29bd3d13c6e8fb8..ea4706b1911f1825e785f39c9bfe83f1f3defead 100644 GIT binary patch delta 1570 zcmZuxYfuwc7~PbIA_tN#C!$W4cm9K#tEP!>Pn~$b{p>z~LP2pP#s#G9UY}a(+?y0DHpcnn%%X z;e&LRk+>f3_h46hhrHEN$|4++eJXtSR+lGCNBx17nx3$fH7V$xuxaP$)B^m#-}O7( z+QG8o!nqC}%vI(+OCO1su}Tbq4HK@-ukD+dI*+!l6NNl}SM8#guG@OAc1yq68n@VK zBtQ3H5z4M}9yq%9Nx_)#>HKqV=<7zMrY6UDQ_1?A%zZvpO0UL7b!NA>w#kkj;(2me zOG#x}al%E~xN=JBSvAg@Tf14Gb@1*KEw=C2u;5(VVz}hU*i&Tuai;ZV<)&NHk^j=n z?z$RINAXtx061x5Q}qDgJl_TyP=0U$0N9U_gY-ligA8Cu>=^UdWG*Ahhgzu-qEirJ z39iR1KQL}9^D%Wf@gn}S>jS)yXxrCGPE&*h|%M$Xii~l^fF(+HC7aMc5STh%XEhKq!pLAq0_&FfNSA6+wKEjCb|&gN1Ur zkcYq!EW+dvpFm*8&O;Qz1k6K(3W{0e>XU(RgZLOO42FbU6o>dCISL7Jo(NKi z%{cOK2#J7%&;k`+`G z!ZF$&NDgj5ZBe*Ui(*;0fsLybp(aoVhKKdfQ?~*D?OvQDGR3(5(f5}U&db~^n$+SX z>AK=pdw-Ur(^^GbzIOpo;N70ovYH>*Jn6TPwIppJ>ngosi5xy}9bzh5@7<>l@{acL!CPdec`ipZ~RH zI6cYBF0H0)tz-go|2UxY*^N5?OstSe04dP>FqR*ogvBcxqnI&|tMkwJUOL&+$0(}c zn0I8|Pd(mE`$4t5oUHQ$R)6jJUJNcv8KGZ1?QLQ-J0&fy4}7_c_NB9xnM`f##)ngG zuN<)$!U|ta-qCjP*l{JVkaL?HFNZ~Zj*cs-!doI5J?cICx53tg7)FN1d}(qp>*eY> zU7G4QE*Xhux1Aktm=kc8ky&SdowKN@^H_2Q@4(n;+QXu@yT6}mu{Q>4C$YRZ|<&ZULj) zcQ?}ZCmrp_!nDbm4RB%oL*K!&sW4IGh{gJWY}E!Qnd^z(A+XiHx_(XRh5Vtis~rrP giQZjy&H4gxSv#WnG=1xS+Xn^2#Uw~-qcY6@0o+YhW&i*H literal 8217 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 Dt^%_Y diff --git a/Resources/Textures/Structures/Windows/tinted_window.rsi/twindow5.png b/Resources/Textures/Structures/Windows/tinted_window.rsi/twindow5.png index 83797163f225f940ae731ded308e1418c5611567..b26c7be0b2da6c07fc5f962d1858683c3a6cd74f 100644 GIT binary patch delta 1449 zcmZuxdsLEV82<=jaxt$^*~-t)dnMo{;~;pKutX_c&Xpx0AO%Q3MyrHTnpPV6m6h{? z?vkgxO}nVwbn0emQ=6`xoRzjp3pL8NoVEtq+3D=;J?A~|d49L&dH#7{tkK)*oP80Q zqOdSdWLOx;k*5koVm<(P^qk6Luv$6x88NZnY+9)$+VAe*6tB)YnguhBg*&dz)hKw;4m06-bw35ytnCCtEtBQ3EYti^<)OfLwxV;td83<-9?2EmEg)o>2h z4Zeb11wX-h!nQaToQMmC^*B}ln9QRwQ{@t_k^zY%Tp^z(EL0Y! z5vWi`q$z1!-h3|wH;tbRy$5+IT&a+s%z(%cjI|7gIhG!9x~01sB!3V^C;vB|PX511 z=5^tG1y3%LnVZdJ%%hvanWoC*qnVr%zLIOMf>bgtZx>$)@};H`*$tbT5A4Qj|Vj7%H< zCLX!D!>Zl^EKv;w6!}f3FQ&HVHX&-&FRfqI6;9n-_)}+@6cF#^@UL^|mie zP0oJgq|icI3}vO4p0rAq2^&Q5t#64X5=R4y?66 z<;6F9dopqA&ZUIKc|Tc(ZVU~?Py!8h>i7>^BHFlakJFVu6aFA=hzRp9Y0i& zHM$%?FaRpyuG$9F+u|R~p5c0#Q;V91@1U-_GLbgOic!&*)(Z@1PIebR)S}iQDPG04 z3-#9C25iTDTJVxj_iDOO0T*pNk5|qNKN=gJc(<6jbyZARP8Pxm#y5ZLbqnb3E5Gk{ zZfLvi{i<`Du6cMYpX|a>qt|`4@mMRtpDQ{2U|QIFV`w#QDM|l7M literal 6896 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 UmuXw}IWH(c7MmcgiB7lv3lLLlQUCw| literal 8464 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 K>J(`?NB$R18wZsD diff --git a/Resources/Textures/Structures/Windows/tinted_window.rsi/twindow7.png b/Resources/Textures/Structures/Windows/tinted_window.rsi/twindow7.png index 17304ce1044032ee392be2dcc63be90d6580eef0..a422e8c1526371137e017ed0c42b0ec483f2f93f 100644 GIT binary patch delta 966 zcmbQF_M2~lvN2;@rn7T^r?ay{Kv8~LW=<*tgU0!(6Ky>X2Z*%#2QLlMY7!GEJP|Ng zr=zQ5vfDxqQLo8&1+?l{JZL@s+v5G)!?oWToz@;PS)I&tq2#vDF%`qPk)q7&KP;4Y zJhLD?ZJOb9k0Tei?R)pq>}u?k^oR9V*QV*R{cw2{nKr}hBiqL-%W@0usq<}aS|c=H zxPR6ag^$YDMf>ktJdYKtNW0;q`n>b-k)(aCQ^nF)gO%s0^sSiX_tWWC^3?jzV(Du` z5_|1_ayv)Xrp|o5rA^?l(zFQ;9IT=ufla*{Z>==NCY9)I{m8%TAInaWBGH2^YCWFnU~E^T_+-H?i1H{>q{=S(R07vOlZ#ucqaSzMA|RA~nj21*pAq**y7rXvYK1#>bd=d+6nDHNBumX%l~XC&sOr>58{ z=_^fM#O^Tp1-r&%F%I>51$`u)Hu~tM+2~`l7^2Q4wK%ybvjF5?uo)21AQv|v52()y zs53XUBoV~3uP8`N&Q2{+NX-K}p-9Qz?%iYEaA2g=FZOhC45^5FJKK=A!9n1F+!KXH z*+2~k5o@6fhl5xR47S8p6;GCbH);N{^E$7$8Si_v?_BdoQR8bt3~QD$M0hi9n8uW# z%X%P+t6{4ML-x-a{vXxz|9kl}WNR|uP=g|23DNz9@s~c>02E2ET+p!!hF4-dbuSO~ R*8v^O;OXk;vd$@?2>>aBXYBw0 literal 4882 zcmeHLX;c$g77i)|*%W0}gfh5-*%PufkzENIhyfK`W~fvup_D9UAwfV91x0Z~2Nh{V zdk|$56|iM#+-Mg@)OKra8(hFfToKz5RKR`-h-tv*m{di@>kH@oQ-T&c)cWdpO+Cxyz%XwIWy#snkj-7LP*OL=_65226^> z8ScK=u~_}c%O?GP%(-c2vPX`(bSAd=rQOTdk5d~PpX}jZZ}+v^ZZ^~jpOO}S_U*@& zysp5e5b?St`RXuhQ9V@?P`iWokC^MDWSmIfj8`jedz1{#A_WjX{HqA*DcniQZ&h;Bz)@_$EW3&t3>HPUR)R( zw7RmiKHRyvUYDKa87bQ~P2lG1ebjpSyW;eg(!_&sNlSF4{eIdRm&=fWzEIR5Xikui(Rhv^K7Zd+|GlvHQVeUdQx;xOXQ0|z?j zp+DOVRoUmvTQ}a!Oz1f$tlXu{{>)Z8fAi}xgd>oDaRZe7UFeXpkB>2?Q*$F@TpP{0 zE9(6NCuXh^4SXE&=%refs-l@nXam(2HoUE}C+sBLWWiwX0Sf1Y){mtS# z=Jzt~)I}BM8}tpGMUT$m*mdga}>djnj*3 zeycg&Wc8tTJ8o6k@U~?1HuRN)^^)PSK?yOh(Hw`x3!V7*~A77nX^>OS& zpz3t*IdPVeccb04$HRSxD*VFh1h*7dcVK_Yai)hhqpV#sY17}{d*^N3)6v{&t#}yU zmCV|7GNoosgihO~qxD?wvORaS&b3r9PYnid3c7DCHzrq7i zGpJx>DXN9Us0>r^2yNA;2oNUW5#}=m6oD!Tjl)8htI^2i;Zex)r3gnt@SASsYv2L^ zIjV&rgFIfL;Tm`Z6D}8A8^vS-WHQk%q&Y#NvW2RsT>Z6Oreo!G$ODdY7!M%*g#ZhJdF^&7{RCp zQDZ7Crc^*iOjxYcX?X+!&_kc%ldA-Ret3nZj|IR7*#N7^R1$?Omy-v2XtW^-0HiOV zKlRW=fqjZBLN!XA8bL!6P=(fWAcO?z_gCrE@uqYn2pNq><-k+}R;7NiZDjgklO)*h9^-F7g z9BSl=0%n^+CDQ0oG#Z!6;LvQ^vmJ|Kh~gWH4YG0DiqPu)ToY zirl|l^>JpT@h?33YVjAY0H6mK`6_+~=^CW#s~Gqy}O9Ocv+_TL7T$E*ONp|Dg3=5 zSu{u1HcNpnS9nwpWgfkT2jqPHD3A4zp_Kv>ym?p0MIk)$`Y5AE(u>$ake) zKbY8Lc}y6GRBnv9Cd{0i`Q7^BIVb&^OV1{5C|gic+QNHhUCWW9yPlP2Y&lKHfdW&r zyuzl`24*E}bQnFAyE&;7Kkig0Y1g8O6!o-%A&%M2_>Zgamoa}I-K-F??X)NFyuCmf z*pG?-cBYwNbSP4&OD z=jzZl*&9JjL7S81;Y!WY{N^`ip*Id?vreBGPZ1S7*KOA8k6(RpKfk4G1uo5AefU*S zcQSZ5wGhvm8H|$|KeIhJM#*qhXp9DjvmR~yn&EQuT!0X-PO~y4UtJG}3=g$!^GN=doN@d&_xGEFC9o$>`{w_{e-%6G2Y8UwEZ{^S%6C z@4Uyk1J3~m`&j3PmG^81NdCv=^bL*pqvQv}zf`CGR&yc8W(9WV1?Vmujvo>pToM?Y F_6HOSG7bO$ diff --git a/Resources/Textures/Structures/Windows/uranium_window.rsi/full.png b/Resources/Textures/Structures/Windows/uranium_window.rsi/full.png index f7b6e10f869a9ba3ee1d2f09f066f153b5e21e5e..5695bc0c26c731ad7753c4817a372db5d7479cbb 100644 GIT binary patch delta 406 zcmV;H0crlJ3a|r^B!2;OQb$4nuFf3k00004XF*Lt006O%3;baP00009a7bBm000ic z000ic0Tn1pfB*miMM*?KR9HvtmtTs)Fc8M;qEP5V(Xvmny@AkUcmuEC89abz@Cx2w z@8J!)?9@CSsfP57~!&FvPZ#nO`PCCZi-t&VQao5rFUe^biCAjYF#_ z3L49@yaOP4mSyx|Xhl&(5ETGkAo=1m+U0o;pOifNR~&|+cUWd?&M5)J`|%DAfcXCV z>J?%>{h;KCovuz5z}xLRD}@6bG2!;EvmTQRNefdeun{X)Cv?_hRYh!6VEbwd2moRT zXf}DL(Nw?3AAcG-Iex1E>J~f+$q}fH>44V)aB{H%{5OnE2coe8ENqR5=}H@5C^-NJ z-~b$e1JDM*F=}GEss-TFO!Nil4UCOX(>gU)fFasgQ*!A4wPeD-N{$KF5Z$CKD6MPB zdQT1^7Gff{kkoBU6|in+a delta 1302 zcmV+x1?l>*1E~s-B!3BTNLh0L01FcU01FcV0GgZ_000ErNklm1cWW=*sk>-1S_6Ke zxx6sKg~{ImcyRMxB1E|()eV579Io5fm?)0(TKYI?-(rChkO~2?c*g1Cp6M;TnEL=6 z1-?KE3tt0DkTro!@bs5+7h!H~2wd8&B(vJ%ld1DSgn#&yzZ?t-+5=1Qp8EoC@f8?B zUjX14V8Y|~KEb;)XCdW-4;!P2;188(5O2Na-lBwyB{g@efOJ%p0Vq@yL|n3qQFd?H z$!y^Zm=~)6A~EnmDFsCjauHs>d>>~9h8sBkZxvVqAQ#?0cj$gT?7c$4bMRCZW_@T+ z13Cn7ZGXPDCV0h6av*yrC%MjT0NbIH7@Jyd0|PotqbUF> zDad^nBsSk(`mQOCmsQX{zy9?bRDWtIyaEsrL0mTaQC!g|?bcCocMX6L zwCN~MZr?{$ug&lE(JmuFR!H`A@2ay005Wizwz52GbyD=I>kc4=z%VS*kqq5#%Nl@C z2_snfnl%XlI-{F{hH2FUgc~PqR$EgXOCjqG;Xl?{ZS4S%ud1d%G*TVFtUb+Db)#t^ zP=Cr}#-3^nkdbk|`QsD-DG{d`>NZ;V{>l$53dM5uWG;6W{R*Oq`JZs(!L?eX<|7zyLw}$h@bOnVp6=hziKC~Ft%t*BUwVp<=7!jo z?4sb6u$QV3Sq~=|)D9-N{B0@T-*AG%GY9G0 z{s=iMsA&~2UcSbHTj1h9mjQTe+rt?E93k)daka&Bi@NXlD8)@O_N{7 ze&OSeK`PP%e-X$cdiwi@MqXb6t$#U`cz}WV3t+~{xltUWRvVObk=v$pG7 z4r4P5+FP-ix=PuEj4v6*f#@_{bTP&l06lMK!x0FJkb&~g!5PsmGh^7S96rL!b>?aw zYtdQJB{dF0fK0MkCm3TMv?i}5#Fjvrj2UB~b0B5_g8KMY9?$;;gjcr_8V_4L!Ty+<)xbo%zAz4P%15|Gt@d zGqYJqN~YWGK5)~E!C)YYL4^Q~M#Hq5&8G2-(C_!_Apn9O4u{-3Kefn!cDrqY-@Ry` zjz%MNr{<4yaK3YO%uO%euvY)m#)Nl__)%lg~*$>0CKb4`kB0c`M;4akU0 zqc(tkW2 zCzHvf^dTVr=e=HUVF3_4sD%JN8Q>DP!zB}k0DEtOp9H_&etNMGaxewa&6nY~+7v?W zEzNUAxPR548kRB%QXw=`3Y$(Pyv7hX;bty2c*=wnRbj360$F$V))2TGJby(MVgc+u zeU{-&Ks#aq=;_Yf*Sl5)5ei!cs=`uM0nJ1K*au4#fPJu(T7`kEH$?%;XB1OdO0lHo ztt{7{f7Rz@=`x4{un(3f0Q+F6i~#nA>8VLkEoOk-O|~-LJ+Q_f^+tULSP}9}ib??} zwefV#NfIpU-2-b<)K!AiH4UDszZZ|u>Q)IZ6#Q$TN&p)?VNQ?dF)1pBK=41E4gSZ| f-1I`00ZH-*6;1wq5j@1C00000NkvXXu0mjfL?cvp delta 1672 zcmV;326y>|2AB%TZkN08pnU9 zE`9ImPG+VvSuc}TNYsuuWK~#W6c;g|E&&ly9~bsb6hs(sciAWkqO!10`XC5KU0e-b zgUhmB5@862WMd{VF49O9c0^Ri1XoI;F8i!9QeB~rhX7{V0&JgG3lEaZ zXBn_cghF5f0e^6;@i`wK{S+w#S6#H8i}Phx8~w`E@eqInw|m2Em@0G6;6K0(AQTwF zCX_&6P_!fzquQ@m_hZjR7BEwKM~OKe0(chKaLZ+zcxHANkPrj`)O{F8@TVh}vwO#Z&TY4=QO837&*2?=ihqZ!99xQIb~4WH9S5+V?ElOE zn|e9h>KP1Su+y8=%c+&^r;vyyv@hn5X{U~d0FKKLDSne50uu%;ecg(O0KgOu?~i?` zoi{cDBt+!#tqIe3?cX{O4*`T=wM_E+OK!l|9Gt~N03*8TKD)>!yF|U!9Vcf+)Y_O< zfQ*>|^nXr*LUldhnv-|k8g{rwYoxl(ezKpF(++Q~`y2O<|CO)9X)4d=l;e3-C`;Yx z=Hm{nLm&uT=A3DrlpUc}fU?=ge?H$0_&{1G^-n@uFjRHVvWSTx1PdD9^PQm00{YD8 ziC2a<=%QQ^vs05?Ki;GFd#p~~DHC=1Yd)aHa4J<&4RW$V1s{Df-K=e5QGZd-K& z!)Au#K}fXg(OalnKt0V`pe8(~&N1zxj2>}KcqF9-i;zu9Mvv@;43Kt!q$<5Klm+A1@56M`@z}+XK zDPSU;=Fueax8wII?9C=Y?L z2O8&;&W-SzV79lgrG!kIDy&CGqdSH-@4M34twJ0JMb7cU!qBe6kV_ zHC;#tu&@UD90*$cB3^^<4nIa9B!}k@@!8~I0DgPHl_W_roGSz11}@{y2_|Z%cz?L> zHTpuEc~R#VA;2A9M*Ej7;ZU-3oRK~+PVK>#DJ&7CvowL4bio!pg(O#8cp23*ufpkg%)iP43_jlc(SHrx=v=$J zb?X&8S2;qhn!tm@Eg;t5_iI z^@MggXcM4fr6~%7t1hnSqFfQQ31A3;X(lNq3Y5KgOn}gXAuyC&8~w22;eQJ&FNmmO z<9#=cjy=4{I;+G#haTg(nU{Fm+D~a)up%dG--WOLTZKO!4tX1nj9lnhKh(wv` z3||DNew}%O1tZD3pM3;CPUy=Wh>ZaC&_(nhZy*)|2qOo;T~}|>&K(N@q&N$JiA7H8 z&ESuP00fdr;gUD?J4o>mpnnaYfCZs9cOV{LjFWY^JsREr)sAtfu# zOk>F+)`~2r%aIZg~{}xv!5na%s SNQM9a002ovPDHLkU;%<4c>$>a diff --git a/Resources/Textures/Structures/Windows/uranium_window.rsi/uwindow1.png b/Resources/Textures/Structures/Windows/uranium_window.rsi/uwindow1.png index 9979f28e945787ba4ffab8d70010c70209c7f274..e395832e8e39f6a7f69e6c36c189a1f45bfbbdef 100644 GIT binary patch delta 715 zcmX@f`IvQrNGZx^prw85kH?(j9#r85lP9bN@+X1@buyJR*x382Ao>Fr%o3 zR|5kBQ-!CCV@O5Z+gS&*g&jqXsh_Oc9Gj&hdYz4BtK8)^GaBT+Jx~>2Sn=VByn

8g6oNhQZu{wxx-Ib-us)7V~O z-+SGZn>A-{CzhEj&)__4FfGV$;T5&M#|+mvzA-G)c%@-!v*ydnt659_ACPlcDz#42 z(geuYH?56OzQMd=-`u(3;f8HNvzHpnizW0X@GrQ-u}<@*{hBY4mUnk@XS;}<@=%+u z$TR1N#5YNU?Q#3+7a!TtKYwn-POfa0YKHJ#;_oyK`5s(+a{2TIw+-75e0SXBEosqf z_{R9bpIa+md-dcu>8FL|AC`I;#;76PT;d=V@~<&JVD`+}8*X{b{1!j2=Y9R+lt!5YOV1Yb zCvNq;T=Kl|!!tH7u@kxm?|xcdHhk8*`8z`;+nKe~&!#u{l+QcACw(sC69%nbFRtu&H)7W5)=Te~_$xhuS!1eKb$JU{+?t$y+5y^Q|8?fQITpMUOo@wIBv)vSr@8=G$PI6^!L3WFGifb2p> zsIQ@cQmVhtePhIw#p%qg>i3+|s~=zgn2@xq;L8KUk8AI{h%6PtjZlOq~p#u6{1-oD!M&HWrgUS7B7#0x#fMTMv@iNrAN&)<7a>@oC4wOMN0_(xpirp@Emn{O zf?%jkXdW6i*f#g1+1q4xX2*xwT)b_hXE|pi`+1o&yXWlpw}0Q6Gkf^`&Wa!i(8=)C z3o|m~?@#{pn#}l^%-~iq|B(|m>H>~l47(HD#(S0>wk;2E!8gIofd5olU%LVQvEGCB zme|7$0{XF82^{F?1Yj%}fDRylo7Pg;t^syNT3@>X-}FsT@hj}scDViEE&vzvZ}X(| zgtO@vs0VebUVjC{G`X|zBj?ESR{jl=BGnRoq5BzdW$uF+fS=tJVnVQL?1gXm;o%)? zfLl8cA=7aqL?H}Qa;#`ReD>Hys0cQ|7KE|d&N)uECA z0R;Wh`q~ZXxlyABIJo5dum7#5dE~eUbce@DIeqO0*nbnf*L3O|I>n{yJ~hh8NfqLt#G1JHyU%PHk^io(W z^KEv5_aA-2Qhk;Dmx-q1R3N<&I_}Fy9i=Nl->&XX{@N~%jBgzcu+JYf5$WCn+r+fkp*i7#+Ri2|NN@UGA_}X{p04k@zwn@?y zOfSxc=W$1wbTiZ$kbcZ^vWVk(6s!^$(SJxsDvZKn%*}B*e`Y?BJAC zT0I&Q@fm4FE+SF}Y&fgDI0}O+LRl@N+mXk$D zKUOELOsN@-+`#4hCC1zwU@4Q1hAsh?4Qv99{|5Vh^ZqR)8U`HA4b%v82a5Ou_vlqc T5^UWA00000NkvXXu0mjf8ooA= diff --git a/Resources/Textures/Structures/Windows/uranium_window.rsi/uwindow2.png b/Resources/Textures/Structures/Windows/uranium_window.rsi/uwindow2.png index 7be507678d49517ac92392e78b96843349952311..31bfc29cf0acfbe6522db842e91025891a0ce052 100644 GIT binary patch delta 749 zcmVy+<)xbo%zAz4P%15|Gt@d zGqYJqN~YWGK5)~E!C)YYL4^Q~M#Hq5&8G2-(C_!_Apn9O4u{-3Kefn!cDrqY-@Ry` zjz%MNr{<4yaK3YO%uO%euvY)m#)Nl__)%lg~*$>0CKb4`kB0c`M;4akU0 zqc(tkW2 zCzHvf^dTVr=e=HUVF3_4sD%JN8Q>DP!zB}k0DEtOp9H_&etNMGaxewa&6nY~+7v?W zEzNUAxPR548kRB%QXw=`3Y$(Pyv7hX;bty2c*=wnRbj360$F$V))2TGJby(MVgc+u zeU{-&Ks#aq=;_Yf*Sl5)5ei!cs=`uM0nJ1K*au4#fPJu(T7`kEH$?%;XB1OdO0lHo ztt{7{f7Rz@=`x4{un(3f0Q+F6i~#nA>8VLkEoOk-O|~-LJ+Q_f^+tULSP}9}ib??} zwefV#NfIpU-2-b<)K!AiH4UDszZZ|u>Q)IZ6#Q$TN&p)?VNQ?dF)1pBK=41E4gSZ| f-1I`00ZH-*6;1wq5j@1C00000NkvXXu0mjfL?cvp delta 1672 zcmV;326y>|2AB%TZkN08pnU9 zE`9ImPG+VvSuc}TNYsuuWK~#W6c;g|E&&ly9~bsb6hs(sciAWkqO!10`XC5KU0e-b zgUhmB5@862WMd{VF49O9c0^Ri1XoI;F8i!9QeB~rhX7{V0&JgG3lEaZ zXBn_cghF5f0e^6;@i`wK{S+w#S6#H8i}Phx8~w`E@eqInw|m2Em@0G6;6K0(AQTwF zCX_&6P_!fzquQ@m_hZjR7BEwKM~OKe0(chKaLZ+zcxHANkPrj`)O{F8@TVh}vwO#Z&TY4=QO837&*2?=ihqZ!99xQIb~4WH9S5+V?ElOE zn|e9h>KP1Su+y8=%c+&^r;vyyv@hn5X{U~d0FKKLDSne50uu%;ecg(O0KgOu?~i?` zoi{cDBt+!#tqIe3?cX{O4*`T=wM_E+OK!l|9Gt~N03*8TKD)>!yF|U!9Vcf+)Y_O< zfQ*>|^nXr*LUldhnv-|k8g{rwYoxl(ezKpF(++Q~`y2O<|CO)9X)4d=l;e3-C`;Yx z=Hm{nLm&uT=A3DrlpUc}fU?=ge?H$0_&{1G^-n@uFjRHVvWSTx1PdD9^PQm00{YD8 ziC2a<=%QQ^vs05?Ki;GFd#p~~DHC=1Yd)aHa4J<&4RW$V1s{Df-K=e5QGZd-K& z!)Au#K}fXg(OalnKt0V`pe8(~&N1zxj2>}KcqF9-i;zu9Mvv@;43Kt!q$<5Klm+A1@56M`@z}+XK zDPSU;=Fueax8wII?9C=Y?L z2O8&;&W-SzV79lgrG!kIDy&CGqdSH-@4M34twJ0JMb7cU!qBe6kV_ zHC;#tu&@UD90*$cB3^^<4nIa9B!}k@@!8~I0DgPHl_W_roGSz11}@{y2_|Z%cz?L> zHTpuEc~R#VA;2A9M*Ej7;ZU-3oRK~+PVK>#DJ&7CvowL4bio!pg(O#8cp23*ufpkg%)iP43_jlc(SHrx=v=$J zb?X&8S2;qhn!tm@Eg;t5_iI z^@MggXcM4fr6~%7t1hnSqFfQQ31A3;X(lNq3Y5KgOn}gXAuyC&8~w22;eQJ&FNmmO z<9#=cjy=4{I;+G#haTg(nU{Fm+D~a)up%dG--WOLTZKO!4tX1nj9lnhKh(wv` z3||DNew}%O1tZD3pM3;CPUy=Wh>ZaC&_(nhZy*)|2qOo;T~}|>&K(N@q&N$JiA7H8 z&ESuP00fdr;gUD?J4o>mpnnaYfCZs9cOV{LjFWY^JsREr)sAtfu# zOk>F+)`~2r%aIZg~{}xv!5na%s SNQM9a002ovPDHLkU;%<4c>$>a diff --git a/Resources/Textures/Structures/Windows/uranium_window.rsi/uwindow3.png b/Resources/Textures/Structures/Windows/uranium_window.rsi/uwindow3.png index 9979f28e945787ba4ffab8d70010c70209c7f274..e395832e8e39f6a7f69e6c36c189a1f45bfbbdef 100644 GIT binary patch delta 715 zcmX@f`IvQrNGZx^prw85kH?(j9#r85lP9bN@+X1@buyJR*x382Ao>Fr%o3 zR|5kBQ-!CCV@O5Z+gS&*g&jqXsh_Oc9Gj&hdYz4BtK8)^GaBT+Jx~>2Sn=VByn
8g6oNhQZu{wxx-Ib-us)7V~O z-+SGZn>A-{CzhEj&)__4FfGV$;T5&M#|+mvzA-G)c%@-!v*ydnt659_ACPlcDz#42 z(geuYH?56OzQMd=-`u(3;f8HNvzHpnizW0X@GrQ-u}<@*{hBY4mUnk@XS;}<@=%+u z$TR1N#5YNU?Q#3+7a!TtKYwn-POfa0YKHJ#;_oyK`5s(+a{2TIw+-75e0SXBEosqf z_{R9bpIa+md-dcu>8FL|AC`I;#;76PT;d=V@~<&JVD`+}8*X{b{1!j2=Y9R+lt!5YOV1Yb zCvNq;T=Kl|!!tH7u@kxm?|xcdHhk8*`8z`;+nKe~&!#u{l+QcACw(sC69%nbFRtu&H)7W5)=Te~_$xhuS!1eKb$JU{+?t$y+5y^Q|8?fQITpMUOo@wIBv)vSr@8=G$PI6^!L3WFGifb2p> zsIQ@cQmVhtePhIw#p%qg>i3+|s~=zgn2@xq;L8KUk8AI{h%6PtjZlOq~p#u6{1-oD!M&HWrgUS7B7#0x#fMTMv@iNrAN&)<7a>@oC4wOMN0_(xpirp@Emn{O zf?%jkXdW6i*f#g1+1q4xX2*xwT)b_hXE|pi`+1o&yXWlpw}0Q6Gkf^`&Wa!i(8=)C z3o|m~?@#{pn#}l^%-~iq|B(|m>H>~l47(HD#(S0>wk;2E!8gIofd5olU%LVQvEGCB zme|7$0{XF82^{F?1Yj%}fDRylo7Pg;t^syNT3@>X-}FsT@hj}scDViEE&vzvZ}X(| zgtO@vs0VebUVjC{G`X|zBj?ESR{jl=BGnRoq5BzdW$uF+fS=tJVnVQL?1gXm;o%)? zfLl8cA=7aqL?H}Qa;#`ReD>Hys0cQ|7KE|d&N)uECA z0R;Wh`q~ZXxlyABIJo5dum7#5dE~eUbce@DIeqO0*nbnf*L3O|I>n{yJ~hh8NfqLt#G1JHyU%PHk^io(W z^KEv5_aA-2Qhk;Dmx-q1R3N<&I_}Fy9i=Nl->&XX{@N~%jBgzcu+JYf5$WCn+r+fkp*i7#+Ri2|NN@UGA_}X{p04k@zwn@?y zOfSxc=W$1wbTiZ$kbcZ^vWVk(6s!^$(SJxsDvZKn%*}B*e`Y?BJAC zT0I&Q@fm4FE+SF}Y&fgDI0}O+LRl@N+mXk$D zKUOELOsN@-+`#4hCC1zwU@4Q1hAsh?4Qv99{|5Vh^ZqR)8U`HA4b%v82a5Ou_vlqc T5^UWA00000NkvXXu0mjf8ooA= diff --git a/Resources/Textures/Structures/Windows/uranium_window.rsi/uwindow4.png b/Resources/Textures/Structures/Windows/uranium_window.rsi/uwindow4.png index 9fa452a61bf19f4082c9fbc34586322836957de0..4097d024fc29b07a3490bafc6219ed5d0ca86404 100644 GIT binary patch delta 715 zcmX@W`IvQrNGZx^prw85kH?(j9#r85lP9bN@+X1@buyJR*x382Ao>Fr%o3 zR|5kBQ-!CCV@O5Z+u8fOg&jqXtM9zAvfHgwikIV6eiW8^WWFU>c6)Lu-x%_!Vjw#ofdt&7r(CG zbmd10^R*6}D^W2F0ojF&4r`CHGHewSXFwD9RM{XuZCPTy^V{dG&nu_SjV|jhkFUSS zwRQgczIEm2)iy6SZtz=vxJvEeGIXsdX8mF~QT;J$?KZB}{&8Ox9bM7Y$6CbTDBuy1 zyJSK(_uAIlj7SCc3mLx**VtM9w5$=5bvw>v+3>8pGcqFAXy)IFs!wM_x9Ch@Ua|dj zy=}elAMqtqn#=w^)&+`%H_kcHJ9FBvEn0CWloN`U+Oe0e>^_c?KIGk&wGux zCvNrJT=LlO{)Hl1hKE?EQ$8=&)7Gl<&j#D;7tz45aC@jrcsBarZ#((AO(K}+k+>V{iBzM6({ zta82jam}VpwhhJE%hzdtY@2IW{@rdjLpIBAksEOzj%l>smN;z3q!#{aiD1G16W*6N z68IO~yJx?2U&}{h1)G13UwD4-Pjj5<<@8YP*oOXwXP-MWzv^yVcs1?ck=K$D$~TxZ zOkDn^s#XIHe)wn7$Ir>a-x!({Zq)3~`O~!JYSzR$=4yt0@7;q=2}R{D($G3ArEtW* YeX?HTk(G*Wz|_g$>FVdQ&MBb@0K&LFeE1vt zk;bE2R44HT7c2y+L*yE_lt8;^TDmYPm}JxJ(nWtl>84=XLV_2CLVrZPa~Cb7q!bdG zLb1UVYSP%mix`O}@!gJf8;@o*UCj7GFZSYybEa7DMn}>dy?>t`owqdce9oXJI!6}+9?FEncZW$HcvxT$s0-VqEV1mw+n0=qz%E$ z(p>O7tO4kjIsn;cl+zV#*QI1uAr_51Okorz<4%EV#jC;7>S+Vuc|ooZz-Cwj&@XiW zj9ifG@9Ss{K%=DV0mC=1%*xEyT@R2x7cG1e9)HbS0*=D8y1)tFGp%53x_|?o5v&OB zg{-}_qyhBDdk@B2Vh_jn>BnNlw;|C5z_>pE3BV6)ehGrz!BSWH`Y%ZX_^xk~x>skn zxfAC4Fjjnz=hf$2$i70$Z_#k;#0-P`i$8ObJnt6YCM`13!M8)w$AIheAI$>%>Z}kK zf`8Rm*wqOOyYHI=+}(Ksxy0e5qz8>10Q}b;{=bg_Ggg^(w?!^#-~v4%&vmy2z+L`? z^CsW~=l)C!>M0O_-!E$~EolHfx100;2S54#>;Kr&IP$m$bO(=9vJuEh8o)`nvPE6d zxE|H04glQ&=vD`S?f`VF13-5Gx^?OSNPp)7vU;QR!I;ea-}2v{-v0}Q59y8rmf9(JOuyTw$1@4&340a``RpQ)8kFsQ!0hq6E^EAB4%Ex2bt6&&mnSVVm zXRRH;{j*;lj4v$wh!v0X*3e~=eukG4X8>^h7LQ&$T8R?_GC!> zJ`y%p&jFBkf{sziYhb10WQddXpehc_?niI4d-D1ZQjHbuD*y-@B#sT47A0d78Wxx? zcGJNIHvYExdK>>&s2xD@tFS?WASGy;7z9n0<8G%-9S$WMD}Mn_dR{s7?CW~~0000< KMNUMnLSTZLmN?S@ diff --git a/Resources/Textures/Structures/Windows/uranium_window.rsi/uwindow5.png b/Resources/Textures/Structures/Windows/uranium_window.rsi/uwindow5.png index bd46092739e6b3d5f5e7e3eb3806b5feaa456145..5245aa4de55bbd9220be129782e2d81efda2353d 100644 GIT binary patch delta 639 zcmV-_0)YLS2ABnqB!2;OQb$4nuFf3k00004XF*Lt006O%3;baP00009a7bBm000ic z000ic0Tn1pfB*mjElET{RCr$Pnn6kfK@dep(RGMXTm%Dx2MD6RK-c#<04Y^Te=?<)iblIH$B}6)f)|&@qc*yIT#F@*=*K~Znm!F zcHnULsCj*VZszm(Wcv0fcUQSPdAgF}T5L+Df#O@B&=7KM4qX7=yuAI3uD5InT>z$i zT>P+qFp{A;bO9h$JidPqvJjxe#bW`qCJO;5ysLQZ0AXMRT>uJh2Z)QeTpZ~FP;4B) zqj*3UfI?G&XMY~sBK?=(@$LS(4Ay1(o9uhGX&@LW%XM68QurU*mDjqz%+^+;1(;1K|9!#B^ zAHQL~2BeA)gG?|N08+*0umb=W0U$1Za{6((h%>oG!+%YHqQ#>r8Z|~KxCvMkuFa3- z-jAjz8}}KI8?I}BtOLunpr}tkSx5+H0rXq|8`m{JhD!-J8z8r6xCqduXDlHH%mrw( zGbJGhOa*9@GbJGx5oQ8(il-#BgN^A7NJ)r;jrkhTmXM0@kVx$eNiLQuKytBE0g{WQ zo)VK>EO=Fb1Jtv?6JSAkY z2u{D7CY=(j$U=b9CBc#`1hl7kEWsMO0Gts(yF4Yq1G)e`ClE{Uf-WFxkcNf{LavQz ZnlFM&P>D2+`?3H4002ovPDHLkV1ld#2S)$^ delta 771 zcmV+e1N{7$1)BztB!3BTNLh0L01FcU01FcV0GgZ_0008bNkl1vl z`_r@qQ%WM8EOjXcIypJ1i!OC?=_0tblPE5QK!-rVMXGL{?ciW1Gr5R3=+a4O=~TK% zF-4lvmh}EQoJd7;tB~@2ft+W$+;Dlny!kliz)QvS3t~!n?1vEfFywMv zIEIn7sJwayyqj9Waa}%aeq?TV1tQs!)D2i|y*3vUog01(jEU*18_;leA#6hsLli>d zf?E>PS2v*g%zpuf|GNJ_Gr&clZh+Jm%|m|{P{tadU4S;$0PO;_=_>;~g>w4JfEc+y zLBHrL12pJ)A#{EB{+(W)@AdzDuMB(#h#R0W(4B{PH5vomdGy!Mp@20&y8vyh0ony< zBlbq9U2E36ez1n>LP*4bcCA_8T+AS8ftvsUgdPM%34i%>k$opvG;e!n!%6S~-Ca3A z(t!8?D1#p}y*I_}>P@mF5tGkDwgdc_HIQlk7n~T}mp()M|O;u~nx`YYp z2Fzw>S%F5dYpx?Xef2S5zVv{F@rO+BO_>{!*U1vdpxy!ZcIr^_p@PW{9Iiktr?1`t zlmn9$I897;;6!$_MBRY-tr!n002ovPDHLkV1iYX BW&i*H diff --git a/Resources/Textures/Structures/Windows/uranium_window.rsi/uwindow6.png b/Resources/Textures/Structures/Windows/uranium_window.rsi/uwindow6.png index eabc47c84b865b76a0c4cadd8a6c043917b318bf..4097d024fc29b07a3490bafc6219ed5d0ca86404 100644 GIT binary patch delta 715 zcmX@h`IvQrNGZx^prw85kH?(j9#r85lP9bN@+X1@buyJR*x382Ao>Fr%o3 zR|5kBQ-!CCV@O5Z+u8fOg&jqXtM9zAvfHgwikIV6eiW8^WWFU>c6)Lu-x%_!Vjw#ofdt&7r(CG zbmd10^R*6}D^W2F0ojF&4r`CHGHewSXFwD9RM{XuZCPTy^V{dG&nu_SjV|jhkFUSS zwRQgczIEm2)iy6SZtz=vxJvEeGIXsdX8mF~QT;J$?KZB}{&8Ox9bM7Y$6CbTDBuy1 zyJSK(_uAIlj7SCc3mLx**VtM9w5$=5bvw>v+3>8pGcqFAXy)IFs!wM_x9Ch@Ua|dj zy=}elAMqtqn#=w^)&+`%H_kcHJ9FBvEn0CWloN`U+Oe0e>^_c?KIGk&wGux zCvNrJT=LlO{)Hl1hKE?EQ$8=&)7Gl<&j#D;7tz45aC@jrcsBarZ#((AO(K}+k+>V{iBzM6({ zta82jam}VpwhhJE%hzdtY@2IW{@rdjLpIBAksEOzj%l>smN;z3q!#{aiD1G16W*6N z68IO~yJx?2U&}{h1)G13UwD4-Pjj5<<@8YP*oOXwXP-MWzv^yVcs1?ck=K$D$~TxZ zOkDn^s#XIHe)wn7$Ir>a-x!({Zq)3~`O~!JYSzR$=4yt0@7;q=2}R{D($G3ArEtW* YeX?HTk(G*Wz|_g$>FVdQ&MBb@0OtojiU0rr delta 1209 zcmV;q1V;Pg1A#8 zKZf~YhDbj~QfUZQ8ipFHnk)*VYr_z?m(w%hnPdoxdwilIWxKU{@!`!%zwS_`<{D67>4N7$o0|L z`HyxOFka@1b2quRa*IO2#+|HS-|o55XHo<~lRZ%k%Dq}Tf|0+2IP$~Cm1x+ zG(?S=`W&TPLz#6v0HmTXJiGLmgcV|K*~+Zr0l+X=?%HP0^;peR@p5bGtd%)+QY{MO z>c|-5&H#{5W*rXzi6l@4;BI0Cd|#P$JOGH&v#|@9d4F}*vi*R!e!Vt!SXt^$R;KLR zJ(Nl=cLr|p!P+OR1bKz>H+ANvYfNLw~LE~5Q3Tzs%#IHvKg>nPmye>F4a9uO3wkq znH-id*nctgw&L5RB@xn9`~RDi0q8AT3~`=qw@R}fpWHzifKsl(Onr`qs4-}y!BjO}3^#Jrs9RM@Wb63Ci9)Lzk_X9?*kAKd}?612YAYBa2e_W3Sfq-_H$u4l3 z(KwNe#t9E_z&E2A;cv^@OG_F+!8&^|-V#lmFr+|=Qn(9t7Xag7AJ{iOA3e}|;H z*4K+94dBbd6b-*Y)vdH@eR!|xFL^;yk0px5EMq- z(tqcGi6ynuY# z1mJXw=Y|*M`}bIb(>CBl*Zyn(jWh@#EXdkROB%qLsem)U!B4*b`9HR7&;32%RP;J6 z8-bjp0UUNKTig|od{m=O0O$@tw@v`)4u3$mP5|f*K(~%P0O?vlR+m>N#$@*YzJKQU zJ}+<-Isu?N0NpwPpgREFIsu?N0NpzF0JJ|eVQY2j3DCNh^;YW@PiLVvwV z85giH5iAEal18h^+An9V9l*ohPY=cyp5CX+wzx9%Ch0Is-i{ui^1^_H$~-@;E)s?z zH!i-zspQ!g9r8a(dod)QTxu<@_5v`t7cG}92Mv-LgDf`PzMv+aEiJd-X7|(OucQ`M zw9fz_S|D+nkPTQi|AgH%BpjM9G%|tBziqz3(LGnF9YFE3)&j|Mp#*det!-UVa$)5! Xp#Wu4&1DdR00000NkvXXu0mjfVJ$+& diff --git a/Resources/Textures/Structures/Windows/uranium_window.rsi/uwindow7.png b/Resources/Textures/Structures/Windows/uranium_window.rsi/uwindow7.png index f75790a41878a5b5e9df599eb3004fc19dc29d2f..f2aec98846cb982515e94d2f3e994d085109e69b 100644 GIT binary patch literal 270 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBufiR<}hF1enaIvS0V@O5Z+u4S^4GsbaAzPCHhZ-yrUl@PsgY{#|1s$tkuz1Q-Cn$6WL%vq2R#lSzZQkYDkJCQ+V6G~_nfO; zeWw1}_rRI+wGaPqV9a2YV!ps+!nT0*-Hhn4!XFIb`xm|DmsjXTlF69%is?(`zEh9? zGeFg5@Ce*jsF}B3XuJ3P=c{}ER@Nb#l)>Y`eLz y`@}0OkOX!d{?4>d{6rE%RKqcbEes&rXX%$%%2g+2GNk~$$>8bg=d#Wzp$PyK^Ji!P diff --git a/Resources/Textures/Structures/Windows/uranium_window_diagonal.rsi/state0.png b/Resources/Textures/Structures/Windows/uranium_window_diagonal.rsi/state0.png index 45b3c99189ff93d8928aae08e938c39e47de6c8c..dc5081de2ed0b1a9aa0e4cb968f41085f3ab7ab3 100644 GIT binary patch delta 686 zcmV;f0#W^qdf5e#BYy#fX+uL$Nkc;*aB^>EX>4Tx04R}tkv&MmKp2MKrbE=X9p)m7b)?( zq|hS9JC1vJ?|WbFz5|3tg{fxOB%o@Rk&4H}Y;IKyyh1=f&3|zS5;OHgdNBjf@pTU$ z-|r$k%e(H+(Wm512KYqcDANs#c!PL$)6zNb6NgwyQi#uqCk(nE@gvt|m)|%S9Ts?I z$jGGTi9^ITl3X&m%3$PJKou$^#}EDozk6#Irl;JbU<~MfvF(ph zAg~KG>$d%UY}?Hf!2b+fX>EVC0nB}pUT@*Z%x0}MUsk|8;gpO#Q4 z0Pkn?O*vrj7U*4b`_?+g=>w3VUM=4M2Zz8|k+Ro4-Xz`A*|&ddTK)S0Md5Ol8b}Lg z00006VoOIv0RI600RN!9r<0K(7k>Z;bV*G`2j~J04+ag7Yl|8H007lVL_t(o!^PH3 z3c@fDhT#e5I@HlsX+iJ+y^VMA0N%wr2|`O(8cWs+x)Y_XZIb!P1)i6I4+5b0s;YV! zO&k%yXyVQ}`G9Y{JS`4J6K}gl?gB$N0LTQ4;dxe+Mibwzcf1#v!takOUw^JUW01j|!l~g9E7Xpa2ehb^sTiXT@{? zCvL6%{~_VVSIf=#1tjpx?K~VHg|}VP|By)Hy%k8~KLHx}XNFpMy?-8!CXR^k2EB0_ UzWfgt^#A|>07*qoM6N<$f<`MZ(f|Me literal 15629 zcmeI3e{2)i9l#%j(KLv{G)-mGR6Iw?0`z=$w$Eo@9fu?a5>}HeBqC7<%lYm(xnkd4 zedojpYn3rd2d%bJRzf?3s_x<|*xjkK*HY~0EaxDO0X-9js8{J*br)Dwww#LT( zfo`{%?fn)2OTOTI7J#P?tpGqer}gyNeX)Ba#YlN%)rdn+Hf5sO0EC;frmSp-wkr+? zHNDAwV{*#v($psR79qyP%r-crwU4FY=CMsZ%Gh=#q`I3Uwc)IU9HgKvyRxaIZb{iD zch0Ybemldg+m)MQZ*Ow9I00RKu`XAek%lh86JQiBAiBhmhZjWAFW%+ya=gHDKGw%E zUZ3RWB)`{HxZIIi^edcJ6H<3{eIXo@n%qOSZAvUVGBV;B@p+8&Aj^kBA(r#9UN3`Y zFxIGU%UMRZ>heyCexlG)(wb>&hVF9w%5fuOH@V$Tpwd;?SIR5}(yanJM3K$PCd+#` zwwjTulx)mQI+3FB-Ow^JX$7tuMq8nwZv%I2agW4w}%%c!7B-TrH_i4xDQl6s%*>i@=`gs z!jGy*2_v17?TD6=2O(?fgJHHjSTVD7s-!j}X{6DzV8j<@s|{DRiW*ABIo2(@0xgsb zt0GA#Rk^}#l?P{z78OY?l5ZQTp=hd94jS|)g8mRpFe0Z08J>rb2`NH=fkIG~Ly2H0 z;N-$7UgV;@F2`?fbY{fL?U2^%9D`U)>d-A)M%(F#M$mvqLo18>MVaG#Jd@zPkWo25 zWa2O`Fk-;#<3%Bm;QfKz*_dfwURl9)F*m1Na^7=|*Ob#1blOUjyVzGsof=IoUEy4Nl4Qkc*%8I5dZ>ok8KdQ8;bz+G zbj}Y!-hYMp+%ZOmpib%2eB)wpRt*|buPo0ctmbIQ z3M=QqApftm89l?oNI(#LLYT#eaf>c33zL0O4gG6bPCxOXNI4r^QPr@2F2f2%!7!hy zil@z7Gt7^oXIb=7VV|E({1+q`1g@FfGM}0U?VN7nu*HrMNI4WRc<`^TD(f7Y2kZQe0#{ zn3m$gfRIIsi_8bpQd}4ivPf}}`CwX#3j;zHDK0V}OiOWLK*%D+MdpKPDJ~2MS){ng zd@wD=g#jUp6c?Efrlq(rAY_r^BJ;tt6c+}BEK*!#KA4u`!hn!Pii^w#(^6a*5VA;d zk@;X+iVFim7AY<=A52SeVL-?t#YN_WX(=uY2w5cJsx7~n3U%~4>Ii!8w2n7^hu&Fr zDec`c0LJP882>H+|M~>ouL6+a0QmC&dfoLP0CyOVf9uut04zA)5pC(ozH@#ew&|B^ zSL}Z8$>l%$$>R2!zb#V7b~c#b_l&Q(^xCe6uCyvwc7E=u>@8b<@$hqpp5DM^TF&;y zmYWxbTW{TclVi5F{oXiy)U#4`ta#<_3dvjdS?IROU-CS z2loGEIp&|358w!sf>p8((p|DDq-ekg+1&or3N8{E{6KOR5(r%e3fuTMr^ zXc*}H(Utl?Tx9Qi<;^=54y=1++fDPscfbAgLpQ?b_0fACd11q4u($5)sgsSzM!){k z505SbukGladf9k4I`u5PsEb=yKJoFk>{l1QkrcOyJ1%d$_0rcSE~g@}sLqUVZTK zUH=}v^T4COJ-Fz_m5oofE`IE7&*X2OIDYBiwb66FrLHq?KDX*i^=mHOz3kMzcP>eG ze#5)5<}dG{g}$|Y#|H~;&rBZg{7=o~-oHM(=8frV{U_eL`^LWKuYYvcEX>4Tx04R}tkv&MmKp2MKrbE=X9p)m7b)?( zq|hS9JC1vJ?|WbFz5|3tg{fxOB%o@Rk&4H}Y;IKyyh1=f&3|zS5;OHgdNBjf@pTU$ z-|r$k%e(H+(Wm512KYqcDANs#c!PL$)6zNb6NgwyQi#uqCk(nE@gvt|m)|%S9Ts?I z$jGGTi9^ITl3X&m%3$PJKou$^#}EDozk6#Irl;JbU<~MfvF(ph zAg~KG>$d%UY}?Hf!2b+fX>EVC0nB}pUT@*Z%x0}MUsk|8;gpO#Q4 z0Pkn?O*vrj7U*4b`_?+g=>w3VUM=4M2Zz8|k+Ro4-Xz`A*|&ddTK)S0Md5Ol8b}Lg z00006VoOIv0RI600RN!9r<0K(7k>Z;bV*G`2j~J04-N;XXXp$7006s5L_t(o!^P9f z2|_^(h2ayh0U3AV1;GNQK0C54#g&XQYZtl`#rv2?l9L9$p92Ai7h`-06AvLkn0QLb zKj0f5POGCZ@$2K_x4;+!FqF!BB7V7tH)et+KV0!r|l^I4d<$z>PR;Obvc zi>n5-;A#P_xJp0|-W|}3cLiwR%>i0?Q-CI39iWX@1z6z40akcXfF-^dV2#fPc;J%( uUifH$C;k`UjsFBN@J|2>2LNH>0PqH@&E+BUD&+_O00006X1i!6;fzRP> zvDv!CqNwYZI-eTq>1P`#N`6!C?6SL}>t)qQxfRWb0e3cK!r2rRT%9!)bqBEN80gm1 zA=jl7e{|8h7IJO&M!Bfj3=(?lKn8RSZ0J-6cBqo(S{<$pW@YFg1#E@Rrjlt(&W2n$ zzcT#o46`meH^tr&ay2;t>8|KTy4lD8+Uxc)D(Cale#y;y{eIE^Q(EA7FUxsY561`| zS>$9qeS({34jTaQEm6O9xo?nnkPpy>)Jt9pT*445ilnWzs~Kbm4IbMjI-x5AI6 z%5fu;QtYsvQn~?arn`e|d9Y$;=~T(hM$*W@Wr46K$W|M!Y85fm9_Ls$rBz_TWLOnR zf~m?C?i!_g`e;#+)Wi9K$>pE{F&+>l5NG_H7GQWD07g>1J_dLLnj*ymlF!M7 zQ@qecd0md*-01X(mD|Cs*Et5!sN9yeYz1zoEfR(UZXK>n;T1ms0teUQ_(##JRC24J9gY}SqE*ID6gMxc8#I&9}k zvSN<27Y**k&x@j@`eTfsae(nFVw{mgPmBTnSOAEUPt-h8aW7Te%m~%0J9+O%(%|H# z13WN&w4C=`<299x1)R1LauxeZsZ+zLr7M_gPqLyqEjz3_RSzKUX`|(3p=SEbbj}Sy z-hYMp>@oThAdTx9c~`kvvpcbjxZS5@KvOrYr@1t=yw~YwsQc2eB)u`zfylJHxH7#5IJgwVdp%4ujuCQ_* z4D$b49q<_zgneGG#~WnPVbo%yo(0LShz|d?ET^A%V5FQ4s;FwXWj4bKMZqwis*0!0 zTr1wZ z^1=Gn`!+?Qdp}ux+MIV|=$h-ksO>%XR`kZ zg^w+HcKn?yi|E~dYN*=^)l^_Y`s)`jovaB=GP}+V?78fD*;x2?!W^3T?=AE1n>Ts< z=r7jn`}*bO2M0qn^J*vmv*($AzQ1?V$fmqwy>8Lz(TVK%@{zlj4?Q1zbF$;3_T{f>JI_xYPL4nN zcXnj{kn7m^gG*j{{MDx$t~T!ey8X2qb{)TXe%)qu{2xc3xN~b_==jCnt7qPMWLxW+ zZ$cj&*n95aU1QI$ddl$|`ZRQ4Y}gt*P{)dmS8jjwx7tgu3|$)BKXLEq>B(g)SBx~C zbrw20R)5Qfoqrg=@W%e%ow;`PiQ&-+_xi@;<0FfIWC*`r+2Mo`)*X7c_Uzc1RZneQ xuw?a-J@uzu_y7Lvg23c^3rF{v)K|AsQ@>n$^3rn&uk&7VTg!&Xt82Co{}0}mEfxR( diff --git a/Resources/Textures/Structures/Windows/window.rsi/full.png b/Resources/Textures/Structures/Windows/window.rsi/full.png index 5ed08bac4204e8a98d150333a24925dca8310739..897534dd8f6ad77a7169b021cb316555639cc403 100644 GIT binary patch delta 402 zcmV;D0d4-s39AE;BYyw^b5ch_0Itp)=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi z!vFvd!vV){sAK>D0YFJaK~z{r?Uy|gf-n$9qZK2KiZutYqOkT5oWj!D16W&f3Jzgy z?E$DoZE)x`-%f%76~fsDESIHnn||Bnh=?n!W{4 zJdR_!(Kn9ckVGbc0Tf^P+u(7D*ks{GVs5AK+%C_}PT^rAYvu%&Yd^pQNN~EApyJ4V zK8BgVSllG=%f$+yOP7wwilc@YBXRgf7|wePINQfDtePMnGEtkI_1z zOR0eJG|L?@bVGTX{-kmRq(qabDh_^~h}2_LYm{6OK3AQHif6difm~u=&_yLDz$ca- wAX|`0poSPD{^P}D@K>|JUrwnv2#mb|4AL%YCpANW01E&B07*qoM6N<$f?46LSpWb4 delta 1205 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 cv(pcTpp*;28=@nPgg&ebxsLQ08%5>{r~^~ delta 1168 zcmV;B1aJF`1fvO%BYy;HNkl!EKN>NIr{=f(gEf&#I zP(f6D(HDyZB=irk?>_im3%(RYgdqA*d=W)KL8(ZsVk$;#DJ`Lh+G=XrWV83~&b@a= z&fMLyDUudvof+Bv0=WZwXV1Cc&Y79-oVg5|kWy-W!M^7XoPWIQ>6fu33h~PR2k`di zi>PnA6$|r+F*AGUwaxl6#_+}qyFSyg@9A{54PEk`BjB%Qf?O0vZ8||f$QTMpe0S<+ z#9?66wpnYNfYBdg$O;M3=@_%?R0vE>-J`CN?;Eq}3<2cGy?1U?ZC(hYcHIE;;Q0)V zv6@kLoFTy6Z-2fK&Jd8L3Dy&i+iDSt=BhEfP7vS;fhh2i2#KXXu0mAIg@F?U6j4Q8 z7Z=Zf`94Hz&6sT`_5q&ffy)3nZzHQT(30kU7bix5OcQn8xA$R8`U0M|M7w!7K|mBm zXm!{AmBNE4%;^Cq2w3ae_z0dM4$MWS_F#MUgHuo4NPm_t%pZPzX7&(TmzOd3L85oQa(9`%m&F>0~5zy24r1@RS!Wi|1v_5Hm(*CZ%iYKyzfsQh#@rLSqDw#wV>$nxC{k5*S@k#5G=0{%+z&6Z#cGbe01mb|LDVO~8$gvbm1`^)b0YU_^ieK3K(w00(@q ziV*=0_+S-7Pk{CJ1?YT%PX8k>&J6GS0)Kd7tP`-~`8ib}p|m*_P3k;_S09JhN#KudxprUVd*DTZYGq?t{i~1P*Rt=# zad|3`Q0174CLt4$odi2>pTM6I&8gn0svMTKo7nKYt>q z2bi9|A2pAmQ7bD;qL4WE`(>Oze?e)FJ-Z*oE!~%^-qN&hoq#vLC{K*kRgIvEsGVc! z>oeeafiSL>v$Pc5gH`22fB5}{f!TK=1gJnl#ZxMpB+P@)I}m<=qFY?O9@zj7Xj>=X i(kJs}fy4#?{0&-Fd}{Oz diff --git a/Resources/Textures/Structures/Windows/window.rsi/window5.png b/Resources/Textures/Structures/Windows/window.rsi/window5.png index df8dd36cf54e1eeb9e03f2c59d16196a74347996..df4ef650886770bca3ae09bcd7cc067227552802 100644 GIT binary patch delta 642 zcmV-|0)73U2ATzsBYyw^b5ch_0Itp)=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi z!vFvd!vV){sAK>D0xwBKK~#8N?VF)e12GVW4`db4D#SSq>I9mHsN@My3>E|e0hU4W z1js%F8iB&#PM}&q)k62!y~(ACX=nG(O!Cd_?9I9VyCe)rx_?uFX`1GDJRVnz#iBYs zoj&pFj>Ds-`uYB%$96eyyLUd%k2m-HxDmVDVNiHsG^r`2lnHPF^yR5erkB^TudE4N z01f*<_?o*qZ~;UpJk5U#k`Ul92+s?kDyayd;IZ(k3j%Z~+w7FGf8) zk-`+9grQOoPk+D#P{>$Wkjf$mqX^)hEkywLY}tB0;Oye|iXS&(+yCdcrAz_t*-`{> z&z2&9yDFne9W6BK0-TVt>ERa?RRLc3YH$Bwtam) zKqP!Js0$!M;ZyhvK$r+%2H{_44|ne`vvYn0!%{$pgny?)QTJdJg{1%*^YwDx_G6z8 zMbVg#fYh*F1KQOT=+}bWra%Yn_tSB>+zUWsy#{oM1pi750uupp=(%DbAqCV0$YEzl zLJDXL=st5qLJ}g>1UN%{O@do!R7XHaf?sIV*8opKsGz6|AV@;2(3l8FnIeFDwiE%} zvjzTp0ekfQf-(iTXG;;lJzI(Z?l9<_AXXNnFal(A#4i&GZ~<~pz%9l^0$hOH6ObY- zC8V+l_M0Oy30kBgK!{0DBMAZC5Fbd;1}=c^2+(nPNP-1$0dh|uAi)H<0QZ1&`G0pn c%7Ci+18Fi5jjyEM0ssI207*qoM6N<$f@qr%%K!iX delta 778 zcmV+l1NHox1)v6yBYy(tNkl?6Jd8u8Y^* zcX+h;2~Lu*#updh+0y5&Oh$kd$UF~iZ8xv{4dMcP3sXct1(Z zp?kvS`Rg-BtlsAx$F2#L?*Z%rNKAD7U>87QqU%RJ1WJ&DD7643$U&6K3&3_F)SbU} zHTQ>^dsZ7ETUZ33#_vBnhmelEl?&wnP8_4zY;uI}3xDgG;9%P~pQElW!*Qg6EsG$I zF{~VO?!PBl!*u5mbeeL7FNAdxq{g3~n!tyikNYp*WB$ck&hWXg3ZOPN&{jYiMbNGX zfA1(~`23vMBIy(fGK>wjkZBEM8e_kf*}@l5`F#MN0LnGBfARp37l1qg#v33E>smy$ zfARp37k>b0f^h9;wFIErKY0KSw8H8wgY8DcEQ7=kZv;;km$$tEg0S|0^&m8JL0Gk| zFqOayUxwz6a->iQTMv--0Tfa114@vCD7643$U&4^0PcWwX^cDI4pe>!h~F2u_~4C| zzu>>WFCa~Ak`jnnNNti5pcbG6IfzmVP=Xvp5q~ey79EvU=E@BD2J$XVkuV%0hzqdK zcL9IXH?W#+jz}HFZ1KhCfa3?padK+Xcm}XlJRvUu7vepDJOZtuVE{hPOi!4~5qc3@ zeDNMY9s%+SkY|9r1LPs#L|g#l5y-Uh43Kw#JOnfmvH;*Wtb^T!`Dp6<00000NkvXX It^-0~g57m!n*aa+ diff --git a/Resources/Textures/Structures/Windows/window.rsi/window6.png b/Resources/Textures/Structures/Windows/window.rsi/window6.png index 13aaa2107eb3d7196a96e5530e1996c6cbe0b650..30629fcac2aec115a9940cbd378b6039b439491d 100644 GIT binary patch delta 498 zcmZ3?+08ORxt@WsILO_JVcj{ImkbOHEa{HEjtmSN`?>!lvI6;>1s;*b3=DjSK$uZf z!>fUTfpLMSi(^Pd+}qi@9xQ<(t@CgByqdvtnWfvH8153}2Cw#kqEZzcuImpRxfTK1f){K*`Cx%&I5Vr36Lq}@MLyIJ|*Or6vB zCaZ9!Mz$TD`Zn$R#%6yfE92R%)1NPoD6f-w|M1U>t^J#X78~etF)VXsJg`NBVTKqh z!{tQ`2~i>pKHW?WnTFq)!?xertx+v8-*54y&XX%Y6vQ9-^}5kcZvS43JHOvCinu=T=p z_!(n`eaF)!@BKNdDqwD-b69jO6WGdZkT-VNb-LD7?@tK$QqQOi_1cd0O!suRTAgXA z^PQB~#`#_H!QFtBhkGYzHk_AM3}z_Z!Sc)0vrSTM3)g|XiuFwI7%TGE?qq+kcc+&f cv(pcTpp*;28=@nPgg&ebxsLQ08%5>{r~^~ delta 1168 zcmV;B1aJF`1fvO%BYy;HNkl!EKN>NIr{=f(gEf&#I zP(f6D(HDyZB=irk?>_im3%(RYgdqA*d=W)KL8(ZsVk$;#DJ`Lh+G=XrWV83~&b@a= z&fMLyDUudvof+Bv0=WZwXV1Cc&Y79-oVg5|kWy-W!M^7XoPWIQ>6fu33h~PR2k`di zi>PnA6$|r+F*AGUwaxl6#_+}qyFSyg@9A{54PEk`BjB%Qf?O0vZ8||f$QTMpe0S<+ z#9?66wpnYNfYBdg$O;M3=@_%?R0vE>-J`CN?;Eq}3<2cGy?1U?ZC(hYcHIE;;Q0)V zv6@kLoFTy6Z-2fK&Jd8L3Dy&i+iDSt=BhEfP7vS;fhh2i2#KXXu0mAIg@F?U6j4Q8 z7Z=Zf`94Hz&6sT`_5q&ffy)3nZzHQT(30kU7bix5OcQn8xA$R8`U0M|M7w!7K|mBm zXm!{AmBNE4%;^Cq2w3ae_z0dM4$MWS_F#MUgHuo4NPm_t%pZPzX7&(TmzOd3L85oQa(9`%m&F>0~5zy24r1@RS!Wi|1v_5Hm(*CZ%iYKyzfsQh#@rLSqDw#wV>$nxC{k5*S@k#5G=0{%+z&6Z#cGbe01mb|LDVO~8$gvbm1`^)b0YU_^ieK3K(w00(@q ziV*=0_+S-7Pk{CJ1?YT%PX8k>&J6GS0)Kd7tP`-~`8ib}p|m*_P3k;_S09JhN#KudxprUVd*DTZYGq?t{i~1P*Rt=# zad|3`Q0174CLt4$odi2>pTM6I&8gn0svMTKo7nKYt>q z2bi9|A2pAmQ7bD;qL4WE`(>Oze?e)FJ-Z*oE!~%^-qN&hoq#vLC{K*kRgIvEsGVc! z>oeeafiSL>v$Pc5gH`22fB5}{f!TK=1gJnl#ZxMpB+P@)I}m<=qFY?O9@zj7Xj>=X i(kJs}fy4#?{0&-Fd}{Oz diff --git a/Resources/Textures/Structures/Windows/window.rsi/window7.png b/Resources/Textures/Structures/Windows/window.rsi/window7.png index 1a2e65fad78efe662cf60742e0d6afd2088f1e6b..0e02c2e8de00c8cbba348e75dd3a5b8dbce1d31b 100644 GIT binary patch literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!G)eKjv*CsZ)Y#$ZEz4cAa^WQx{jql1nxza8-i#ZjF(v4-9*E*<*eb%1t;ulh z(@(h%-|hZSoyTx3hyjNhED|r6zr=&}W6CY<`N)v;l&3B*C{zLHSO!m5KbLh*2~7YR Cu2;wa literal 301 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Up!qLLn`LHogK(~$bf;>T&0m+ zq(MM{$;p9H?!cu21G~6c<%#A0WA&$-W=}7f=QJ&~Q?8)4uJ7cJ-#n|^vw}0-p ziOeY`I9{^be)tM;zp1UGGK?m6&+hv)*nAU!itCLw)Z4C53gQu&X J%Q~loCIB+RX~6&h diff --git a/Resources/Textures/Structures/Windows/window_diagonal.rsi/state0.png b/Resources/Textures/Structures/Windows/window_diagonal.rsi/state0.png index df5805957d6b0d0b891e10d01cb5a46e4c36e95a..39ffd5be1fd6a117d57e55f02f9ac0cc33eb5ef5 100644 GIT binary patch delta 693 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 T+&>K!JMPxP$~!+ZV$;QnZ1 From 84163c9a17929cb91a0530d4ab75daf65f7544b2 Mon Sep 17 00:00:00 2001 From: FoxxoTrystan <45297731+FoxxoTrystan@users.noreply.github.com> Date: Wed, 29 May 2024 02:00:50 +0200 Subject: [PATCH 014/155] Radio Resprites! (#404) # Radio Resprites! Radio Respsrites madness changes all the Headset sprites, Radio, Talkwalkies, Beacon and signaller. This also removed the "radio" sprite... well its replace it with the "old-radio". --- # TODO - [x] Sprite Import ---

Media

![image](https://github.com/Simple-Station/Einstein-Engines/assets/45297731/b90d8de8-4ac8-403d-bee4-348175544f59)

--- # Changelog :cl: - tweak: Radio Resprites, Talkwalkies, Beacon, Headset... - tweak: Radio and uplink radio looks the same, make sure to check what freq the radio is on! --- Resources/Prototypes/Actions/types.yml | 2 +- .../Prototypes/Catalog/uplink_catalog.yml | 10 ++--- .../reinforcement_teleporter.yml | 2 +- .../Entities/Objects/Specific/syndicate.yml | 4 +- .../Clothing/Ears/Headsets/base.rsi/icon.png | Bin 309 -> 387 bytes .../Clothing/Ears/Headsets/base.rsi/meta.json | 2 +- .../Ears/Headsets/base_syndicate.rsi/icon.png | Bin 288 -> 332 bytes .../Headsets/base_syndicate.rsi/meta.json | 2 +- .../Clothing/Ears/Headsets/cargo.rsi/icon.png | Bin 326 -> 402 bytes .../Ears/Headsets/cargo.rsi/icon_alt.png | Bin 516 -> 366 bytes .../Ears/Headsets/cargo.rsi/meta.json | 2 +- .../Ears/Headsets/centcom.rsi/icon.png | Bin 315 -> 307 bytes .../Ears/Headsets/centcom.rsi/icon_alt.png | Bin 469 -> 371 bytes .../Ears/Headsets/centcom.rsi/meta.json | 2 +- .../Ears/Headsets/command.rsi/icon.png | Bin 325 -> 396 bytes .../Ears/Headsets/command.rsi/icon_alt.png | Bin 504 -> 576 bytes .../Ears/Headsets/command.rsi/meta.json | 2 +- .../Ears/Headsets/engineering.rsi/icon.png | Bin 282 -> 405 bytes .../Headsets/engineering.rsi/icon_alt.png | Bin 490 -> 366 bytes .../Ears/Headsets/engineering.rsi/meta.json | 2 +- .../Ears/Headsets/freelance.rsi/icon.png | Bin 799 -> 402 bytes .../Ears/Headsets/freelance.rsi/icon_alt.png | Bin 991 -> 366 bytes .../Ears/Headsets/freelance.rsi/meta.json | 2 +- .../Ears/Headsets/medical.rsi/icon.png | Bin 287 -> 392 bytes .../Ears/Headsets/medical.rsi/icon_alt.png | Bin 469 -> 453 bytes .../Ears/Headsets/medical.rsi/meta.json | 2 +- .../Ears/Headsets/medicalscience.rsi/icon.png | Bin 316 -> 418 bytes .../Headsets/medicalscience.rsi/meta.json | 2 +- .../Ears/Headsets/mining.rsi/icon.png | Bin 396 -> 469 bytes .../Ears/Headsets/mining.rsi/meta.json | 2 +- .../Ears/Headsets/robotics.rsi/icon.png | Bin 296 -> 324 bytes .../Ears/Headsets/robotics.rsi/meta.json | 2 +- .../Ears/Headsets/science.rsi/icon.png | Bin 311 -> 396 bytes .../Ears/Headsets/science.rsi/icon_alt.png | Bin 498 -> 361 bytes .../Ears/Headsets/science.rsi/meta.json | 2 +- .../Ears/Headsets/security.rsi/icon.png | Bin 283 -> 408 bytes .../Ears/Headsets/security.rsi/icon_alt.png | Bin 455 -> 570 bytes .../Ears/Headsets/security.rsi/meta.json | 2 +- .../Ears/Headsets/service.rsi/icon.png | Bin 311 -> 418 bytes .../Ears/Headsets/service.rsi/meta.json | 2 +- .../Headsets/servicesecurity.rsi/icon.png | Bin 294 -> 418 bytes .../Headsets/servicesecurity.rsi/meta.json | 2 +- .../Ears/Headsets/syndicate.rsi/icon_alt.png | Bin 485 -> 515 bytes .../Ears/Headsets/syndicate.rsi/meta.json | 2 +- .../Ears/Headsets/prisoner.rsi/icon.png | Bin 390 -> 317 bytes .../Ears/Headsets/prisoner.rsi/meta.json | 2 +- .../Headsets/securitymedical.rsi/icon.png | Bin 371 -> 408 bytes .../Headsets/securitymedical.rsi/meta.json | 2 +- .../Ears/Headsets/service.rsi/icon_alt.png | Bin 915 -> 576 bytes .../Ears/Headsets/service.rsi/meta.json | 2 +- .../syndicate_listening.rsi/icon_alt.png | Bin 531 -> 515 bytes .../syndicate_listening.rsi/meta.json | 2 +- .../Devices/communication.rsi/beacon.png | Bin 317 -> 447 bytes .../Devices/communication.rsi/beacon_dead.png | Bin 253 -> 274 bytes .../Devices/communication.rsi/meta.json | 36 +++++++++++------- .../old-radio-inhand-left.png | Bin 215 -> 0 bytes .../old-radio-inhand-right.png | Bin 243 -> 0 bytes .../Devices/communication.rsi/old-radio.png | Bin 401 -> 0 bytes .../communication.rsi/radio-inhand-left.png | Bin 311 -> 215 bytes .../communication.rsi/radio-inhand-right.png | Bin 263 -> 243 bytes .../Devices/communication.rsi/radio.png | Bin 536 -> 1365 bytes .../Devices/communication.rsi/signaller.png | Bin 369 -> 456 bytes .../communication.rsi/walkietalkie-off.png | Bin 290 -> 348 bytes .../communication.rsi/walkietalkie-on.png | Bin 116 -> 207 bytes .../communication.rsi/walkietalkie.png | Bin 299 -> 509 bytes .../Objects/Devices/jammer.rsi/jammer-on.png | Bin 0 -> 537 bytes .../Objects/Devices/jammer.rsi/jammer.png | Bin 495 -> 329 bytes .../Objects/Devices/jammer.rsi/meta.json | 16 ++++++-- .../Objects/Devices/signaller.rsi/meta.json | 4 +- .../Devices/signaller.rsi/signaller.png | Bin 280 -> 456 bytes .../Devices/station_beacon.rsi/blink.png | Bin 373 -> 447 bytes .../Devices/station_beacon.rsi/icon.png | Bin 302 -> 274 bytes .../Devices/station_beacon.rsi/meta.json | 2 +- 73 files changed, 67 insertions(+), 49 deletions(-) delete mode 100644 Resources/Textures/Objects/Devices/communication.rsi/old-radio-inhand-left.png delete mode 100644 Resources/Textures/Objects/Devices/communication.rsi/old-radio-inhand-right.png delete mode 100644 Resources/Textures/Objects/Devices/communication.rsi/old-radio.png create mode 100644 Resources/Textures/Objects/Devices/jammer.rsi/jammer-on.png diff --git a/Resources/Prototypes/Actions/types.yml b/Resources/Prototypes/Actions/types.yml index b91b26e3570..22f16bd9568 100644 --- a/Resources/Prototypes/Actions/types.yml +++ b/Resources/Prototypes/Actions/types.yml @@ -120,7 +120,7 @@ priority: -20 icon: sprite: Objects/Devices/communication.rsi - state: old-radio + state: radio event: !type:OpenUplinkImplantEvent - type: entity diff --git a/Resources/Prototypes/Catalog/uplink_catalog.yml b/Resources/Prototypes/Catalog/uplink_catalog.yml index 7f64ebbd23c..90d2a0e53e7 100644 --- a/Resources/Prototypes/Catalog/uplink_catalog.yml +++ b/Resources/Prototypes/Catalog/uplink_catalog.yml @@ -428,7 +428,7 @@ name: uplink-reinforcement-radio-name description: uplink-reinforcement-radio-desc productEntity: ReinforcementRadioSyndicate - icon: { sprite: Objects/Devices/communication.rsi, state: old-radio } + icon: { sprite: Objects/Devices/communication.rsi, state: radio } cost: Telecrystal: 16 categories: @@ -444,7 +444,7 @@ name: uplink-reinforcement-radio-name description: uplink-reinforcement-radio-desc productEntity: ReinforcementRadioSyndicateNukeops - icon: { sprite: Objects/Devices/communication.rsi, state: old-radio } + icon: { sprite: Objects/Devices/communication.rsi, state: radio } cost: Telecrystal: 16 categories: @@ -476,7 +476,7 @@ name: uplink-reinforcement-radio-monkey-name description: uplink-reinforcement-radio-monkey-desc productEntity: ReinforcementRadioSyndicateMonkey - icon: { sprite: Objects/Devices/communication.rsi, state: old-radio } + icon: { sprite: Objects/Devices/communication.rsi, state: radio } cost: Telecrystal: 8 categories: @@ -492,7 +492,7 @@ name: uplink-reinforcement-radio-monkey-name description: uplink-reinforcement-radio-monkey-desc productEntity: ReinforcementRadioSyndicateMonkeyNukeops - icon: { sprite: Objects/Devices/communication.rsi, state: old-radio } + icon: { sprite: Objects/Devices/communication.rsi, state: radio } cost: Telecrystal: 8 categories: @@ -724,7 +724,7 @@ id: UplinkUplinkImplanter # uplink uplink real name: uplink-uplink-implanter-name description: uplink-uplink-implanter-desc - icon: { sprite: /Textures/Objects/Devices/communication.rsi, state: old-radio } + icon: { sprite: /Textures/Objects/Devices/communication.rsi, state: radio } productEntity: UplinkImplanter cost: Telecrystal: 2 diff --git a/Resources/Prototypes/Entities/Objects/Devices/Syndicate_Gadgets/reinforcement_teleporter.yml b/Resources/Prototypes/Entities/Objects/Devices/Syndicate_Gadgets/reinforcement_teleporter.yml index f6d57f53a50..a8489866fc7 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/Syndicate_Gadgets/reinforcement_teleporter.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/Syndicate_Gadgets/reinforcement_teleporter.yml @@ -7,7 +7,7 @@ - type: Sprite sprite: Objects/Devices/communication.rsi layers: - - state: old-radio + - state: radio - type: GhostRole name: ghost-role-information-syndicate-reinforcement-name description: ghost-role-information-syndicate-reinforcement-description diff --git a/Resources/Prototypes/Entities/Objects/Specific/syndicate.yml b/Resources/Prototypes/Entities/Objects/Specific/syndicate.yml index 2b5762aaef2..883f66816de 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/syndicate.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/syndicate.yml @@ -57,10 +57,10 @@ - type: Sprite sprite: Objects/Devices/communication.rsi layers: - - state: old-radio + - state: radio - type: Item sprite: Objects/Devices/communication.rsi - heldPrefix: old-radio + heldPrefix: radio - type: UserInterface interfaces: - key: enum.StoreUiKey.Key diff --git a/Resources/Textures/Clothing/Ears/Headsets/base.rsi/icon.png b/Resources/Textures/Clothing/Ears/Headsets/base.rsi/icon.png index 44e093f26ad03f1554ba2c82804912058ee2d74b..76cf88f02e7da24dc4e0c870d0f97c23a378dec1 100644 GIT binary patch delta 360 zcmV-u0hj)@0)qpPB!3BTNLh0L01m_e01m_fl`9S#0003sNklKP6n_}ZAjqfBaOluhu$-iX zB#0u*5md3W+k0tX%N*+gApVWeiB60pf$iVHOjcE=YC&)ZqW1YzK7&+)>Y8 zJSRCpk`)3lN8k`A36Nb7QIhqj;s9!aQ3s4VVAKHv?f?L_T728mW+AZv0000B!B!#L_t(|ob8l7io-AvM!#%2gIozT7f4vL2^iGn7Os32pTHN$ zjRs88smL~)PL~50j)JYH!EnZ0RX8G(+OB>A*Do;B#=_VT8nen^%i(~kC%&u|5~rF=kMbYKc~}O zyi)4AmTlV(@=@JEL_W`R|7ib}QvO!r8G>dY6#{i#|M~W#RDR2&3PUR&RH9Gvm)kY^ gz(pdF$W&Yae-qJPl&6RcZ9f@RAy%7ocSy3GfOt5R29e05fPQr*4AtF3A>w_tgCBm zVQ!Zc5b0y-E3cr&z`)R{tneO436=!;1^-6_4618qCIKZm3p^r=85sDEfH31!Z9ZwB zV5_H#V~B~+I)TxIG^i9L3_v-{Zr2-X>E~x;dy!b zgqnWNhKMhkb3O}Z=qTO!W6Lbj^mVuId!-j9o4&qbUo$u1%5Uzu|7_&yI^B5dflgxZ MboFyt=akR{06h$KCjbBd delta 231 zcmX@Zw18=XW4%g%Pl&68goK)^YJPtH{Q2{ZjEwFsn5&_oaW^wLIyyQqFi>1voPmKM zQAYJLkm4x`@(cct01QI+&z%E`a~60+7BevL9R^{>VQ!P zj5=V{0VF#>UeMq_GXLTG3ygGg0Lb#b0%17+)TuWND~=ibr^FFNI{;?6yom{t=oz2` z-ZD@ENREP@Wu{=dBPfYztOm+*Kwf|qgeqrF|=3xNQ#DomViSR4S zD+U!M6^7?8UvV%zd~gfJa!GLshLntKFu$U#kSO!W$^~D)ePsYy1_bcX0P#WMFpG&z z7bH6XYVdzhwu3qX?x^Q4o|Bv)$qE6OBXEe51jsIkD9L(MaR9Zzr~^hFFzSE-cK`sL Wa(=4DC}uVQ0000}HVG^<>yGDV{+>LgGJN8~_7p9lIII%E}nL zql+lDmpli2`}U1t&6+g~-@bht7zfY-3@r!bx(YH}xpIXe*MC)zfq{X6fsdD$Vh6Ag ztMKIELktokTnt=XKN%!MxEM|zKE&|p^Jj`3Ky*G5)%LGqjdh`%Kzfx;{TByK@1=%4e;^uGR)Zf8gJaw#OKHW ymk&wxIaM7&i6!M^2N%r~+$b0YqhJ)!3jhFIX;GoKhVf|t0000Op#WBRf|Ln!re1{b{SQ7#+Y`t6a|M=aDH$~sP zeO@+6&9r8t$cj5p_!$MiZ#R_-;7AnUyYj1|mEBN?{}5B3pm+>(l3?K>hSZV;U2bb` zG^jE7RSLu}c*#7=f-Q1}>ilLMewR-rjL()beqYX~^O^U>d<(|lV?6=x{LA(=s=2MW zc3!9;h!d-uLy-@Cg4ks?Ly9I;c5Qb^OFim@-`q9d}S5*`y z3IYJ2)9s>BDSy~=C)bY<1;JM(JS*TPtNc#$%e!an9~`4mDZnsIUwKvru*_c`u59yC zsf5$>TL3_#QUD>uvlXELtQJh^7?e^}t5r}+1LX(>005uwZwq5nI^G-rN%5f|LIboq zBajr2VlDwq(@@MM0!rFZ6mn&tvErAW4$F zll%St()f%lv$LaJsOcnHoe`cseggj!JRzJQ%R~ra_ZNrE&(U+rH>D&=Y)=%IewlUk rejA2sl|lpjHFIjM<&G37(x&wb&nUgko0fn-00000NkvXXu0mjfMLO2r diff --git a/Resources/Textures/Clothing/Ears/Headsets/cargo.rsi/meta.json b/Resources/Textures/Clothing/Ears/Headsets/cargo.rsi/meta.json index 1e84b43d94d..84f02032366 100644 --- a/Resources/Textures/Clothing/Ears/Headsets/cargo.rsi/meta.json +++ b/Resources/Textures/Clothing/Ears/Headsets/cargo.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/f8f4aeda930fcd0805ca4cc76d9bc9412a5b3428", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/f8f4aeda930fcd0805ca4cc76d9bc9412a5b3428 // Icon edited by FoxxoTrystan and Taken from Paradise at https://github.com/Henri215/Paradise/blob/27087670280de99e2fceb47194aad29a7b99b280/icons/obj/radio.dmi", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Clothing/Ears/Headsets/centcom.rsi/icon.png b/Resources/Textures/Clothing/Ears/Headsets/centcom.rsi/icon.png index 4ee60687d09860657556e171f9ae70c31a1d19a7..070bbfd16a652c755399db14a4928134b3ee8f80 100644 GIT binary patch delta 291 zcmdnZw3%swWIZzj1B1(wu46!ou{g-xiDBJ2nU_EgOS+@4BLl<6e(pbstU$hcfKQ04 zh^UnDOa=>cJBBmHUY>y_MqUj6jpYRmbajoD;+W(W)aJ}z2~;aRyJ9Pl;w=gC3;vG; z7;IlCwE-nK3p^r=85sDEFfi2f9bufR%_j{Mt?_hm46*Qkdm&n=L4kucU`LwN&i`NA z`lU9kG`sLO;Ns&G9#56+UlcZ&Bv&5I6EHU54i;_~m=-RuxXCj@;QEmTZ;r|;^zS-u zJ8@CdOI~iXG_m?O4PCx*2Y&`SwN)})4BYVEU%}aBLhgLN5Jp@1&~Em%-7jU%&5-}x cJS&K=d96K0x=MVf0wHk3|Jf)u#;oa z)`$qci>2@3W9)lea}OX~VO}8k0NF}dF@=a@rD&mS-0Z?}`MN+R^Gz}tAQFlEcRD_s ziHJqFi*mn*wbm=PHblfK2df;6jbb9=5a%XUllNB^0KoYeOMeB}?><6ER1&zt`50Pj zY*diq{RNzJ=wJfp9F*4W3pBys5;#r`hNAO>_%)r10RLFOPajG_-G*HI|PZ!4!3;(khU-LB^ zaIhw1I9iv!{=NUL-)^gg_v-T04L3gYc3n_2*`CGa&b@0D4vH;)76GsRipm}FxWmb9 z;TBWC+u?eIlX=R;MlGq0Nz7IZ9}LPKahLpP(CRy=amHv~vkJe_FWj7tCj delta 454 zcmV;%0XhEj0@VYM8Gi-<0047(dh`GQ0h~!hK~#90?Uk`g!$26v|8YqxB%%~^P;fFu zAyjCz50Igg&(ZhrF?^3s9lE*o7U>{up_7o5U@^g~Ey6jJ3u$f0C8@gPw}eaXzVDas zyGwwQl9GQ$$-1Cnnj8Qssv6yU9*r``$tBRVEFK?!u2!h1YJYUiBO<+^VVYbd8&4)m zl8|_IPyvxBDM8b+c)S`}BvL1K9EY>z5_8|*>N~LAdm#ZJlfY5hg#KWl99OG9lIxm= zj^jivnEO70FhmfB(MFXa_wH?47S}Zm05F}+P=9biZ5seU?q8v6np7oHE0BaJzeo-M ztu9B`2Haj9L4O!Z#mOzOo18zkKqLdz@))?qet*gz&Em4**bG-C=z*1OTx9 zIb7FGjh{NfFpQ|ip6BhI-!M)7b~=s5XN$|s|AbVDxIf4~2qC=IR=CX3iz97m7zRJl w^}TNVQ!P zj5=V{0VF#>UeMq_GXLTG3ygGg0LXHWoLo5n_St(3496M%Q{o7s9RRaj#zGNA{O)lE ziU7$`VAh`xrcV`4go}xYO8tNH`WacFK#~K3j!$4PsZeF8kAJ_-@cYDlNE85pq=Y1h zBFhm}$pze8++arl9YC^Pk{qzkvVdW8`~(JHO&}Xd{LZ~Q4CDfm8~_S()uaLx%RzwL z_$SE$;H(DBatsXK4AcZ9g#f}4Xkt(xub}q->(?&~+}u12AexwvAvqC#WqHM*qNKv` z{N)RVhYxO{SZgjRF2RtJkqzcolob+X9$C5I>$k5AAj^ON9vUD%NE~J{vFUN5CER{Ka#U6C_z70CNNmagqSp1ra4#k17tJ78rHFr~^hFFyIaV01k3`k;tpE Qi~s-t07*qoM6N<$f>a=vmjD0& delta 299 zcmV+`0o4AC1H}T6BYy!5Nkl1Ka)7S2 zH-koDA%m{9HvK=4 z)-4qM;^N})Z29u#OX`;q5)u;sJwlRj=6`W<@&Cw2Ke~+7|tKwiZ||Q;&Wtx x%ZH@;oT`qX#3XXEgNx<~ZWN4yQ7{VV1pxH%RrLglhgbjr002ovPDHLkV1gqYlHC9R diff --git a/Resources/Textures/Clothing/Ears/Headsets/command.rsi/icon_alt.png b/Resources/Textures/Clothing/Ears/Headsets/command.rsi/icon_alt.png index a01e0c6c13e9e939597ff9f756a3fcaa3073a6d2..51a87cef7994958a1e61f7f23301d9c5201d84ef 100644 GIT binary patch delta 552 zcmV+@0@wZc1Hc53BYyx1a7bBm000ie000ie0hKEb8vp=JZ}D6A|=ODoFO zj<#=bY$d~)RrBH(mf4*-d_QmA+j(O~kJSh00~iJf2B)huet(q9$lhI<{uO}C6^p{& zYh%?YgfxKOoTOG%v?D`1;B*eN@gaB5Qed~);2rlF+65^9G8y%ZvG>>47j!~~i;%XS zqF2>V_HaPiT@VKF4ozuQUulf|-2w#`*gXT#)rAy<5CEA+Qd`(ti`M5T`ba8?-03Zj zceVkK${^e$E`KSAmH^!RFL^=}m`AJuLPo+Vphzj#`KJQ=rgxenfOaGVKt_kjIA%iO zhIyI`BZ2F)o9+VWwf=R2!1g3oHeA2fs4lt=K;{>*OJLB2PDmPnMcyHEVF1c;IGSKN z*Nf)#`KKdUwmY^2$iAJMkcM^$E!H92E;nYESL^1P^nVdl^D|JkqAMpMhsdP0_Uo{+ zf1UmJ`gKjEBBUi;1Kh;x@Ue>s9ly=Co7y$+kRs`jE<)CPDnBQlz5(&O!ra0V0)9Ud zn{l*~G(f5NNM=>40}jEjXY@^Q2m8BF6tQ|R)Q+1$kjOk=$g_3PdN6z+;1CpP9Y9M@ qZC+SyT_MY5BJB!5C)5Y%Ilwm%yYQoVR*XFW0000f+?$q%IC31;IZ-S{%A`?ocTXZLyB6ElLweD-O@0T&UWbOQX2tTaLTj-TQLy z-2ovXA^(ixcR|!J2mq#3)g8MpmwoRumO#ujX|UgWd&88fx_|9BBGL<@hCw1&rCL=+ z35jpNDj))l3J^0*8axd@5}p&2i3B;_E}q-%Pk9GE=Uzwv@Fg(eHQ_FwSEeJ8Z^3m< zLo$(YQ}Enw!?JByw(S%li`D=Wk~ zr~UIQN?%-4JbxZ15D~Ij;+#vJf@cbTqE@eC`|ub5P`Erru~N-2x5{ z`mGNF2~?_8#j0)rX8-T4EK0tNS%Wi?Qio5Ap$ftrA%5P&%XT@1#SS5W)^_3IY~Zf+h15KTBo4Ef z*mOa%1E2=~2W2~`BjApD{^B{w36iW3fH?w(I7xu)f{2o=M->N93yeBo)B&Ro7;pyw Y09Yn{%O~)p!vFvP07*qoM6N<$f~V4+{Qv*} delta 254 zcmV)Yu~@d^1_r`e2H1rglmGw#07*qoM6N<$ Ef-{zO?EnA( diff --git a/Resources/Textures/Clothing/Ears/Headsets/engineering.rsi/icon_alt.png b/Resources/Textures/Clothing/Ears/Headsets/engineering.rsi/icon_alt.png index f1559927e0c2fbfda565987acf5bcf246f14b74e..98259eb0700d261983bb1064ac563b845e8e7af4 100644 GIT binary patch delta 336 zcmaFG{ElgYWIZzj1B1(wu46!ou{g-xiDBJ2nU_EgOS+@4BLl<6e(pbstU$hQfKQ04 zuCB4Xf|`Z7otI~zh^UmjpuyYw36FQXdHUvVFVda#@cW7tD~ie*=FDFS)M01)Zx@i_ zFA4Gs{*M9}uH2ci5Gci2;4x8Mu%2PPr;B5Vh5y-$ulWuuaIhu>T-bWI=Kt}#7jKHb zdHcLDyz<1?WMJv0Z5dR^jK0)yq<|M(wLky`U3%cCa z+-Oi^@T(MvU+|K7mIYhn4AuF~I{Yr5N*JFlW&FOJPvQbcRxoK#ty?AOaM13?wep1N_nU+6 YRo~TDe>w4bJkSpep00i_>zopr0Oin(B>(^b delta 475 zcmV<10VMwJ0_p>h8Gi-<0047(dh`GQ010qNS#tmY4#WTe4#WYKD-Ig~00EpyL_t(o zh3%9vPr^VH$N$JsC}~Yd%pD(~Obr7}h;it^#J4aZeijEE^&>Da>f*rQ%w#%&k;w?y zMH-47$aBD6K*9DX=+ghv^zPmLfA`+I0}>@l^v_DkE+`rX0e?V7QN-AzZAU_fwmIg1Man1V)<-N~TH6*^q$<4Xj%hd9xYDjivp>vrO+($XL%=*y%d=zY`yZK-F-C{FzV>9n)B8S|Y|K(@fbV9@+WV86C{dz)>JuxN!21^- R>ka?_002ovPDHLkV1ks9*^~eP diff --git a/Resources/Textures/Clothing/Ears/Headsets/engineering.rsi/meta.json b/Resources/Textures/Clothing/Ears/Headsets/engineering.rsi/meta.json index 1e84b43d94d..84f02032366 100644 --- a/Resources/Textures/Clothing/Ears/Headsets/engineering.rsi/meta.json +++ b/Resources/Textures/Clothing/Ears/Headsets/engineering.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/f8f4aeda930fcd0805ca4cc76d9bc9412a5b3428", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/f8f4aeda930fcd0805ca4cc76d9bc9412a5b3428 // Icon edited by FoxxoTrystan and Taken from Paradise at https://github.com/Henri215/Paradise/blob/27087670280de99e2fceb47194aad29a7b99b280/icons/obj/radio.dmi", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Clothing/Ears/Headsets/freelance.rsi/icon.png b/Resources/Textures/Clothing/Ears/Headsets/freelance.rsi/icon.png index 0ff3f2c989362d67e30f45835f939895d8ce6e62..fa790f7e9908db0be117835f39c7dcf37e749983 100644 GIT binary patch delta 376 zcmV-;0f+vd29g7iBYyx1a7bBm000ie000ie0hKEb8vpVQ!P zj5=V{0VF#>UeMq_GXLTG3ygGg0Lb#b0%17+)TuWND~=ibr^FFNI{;?6yom{t=oz2` z-ZD@ENREP@Wu{=dBPfYztOm+*Kwf|qgeqrF|=3xNQ#DomViSR4S zD+U!M6^7?8UvV%zd~gfJa!GLshLntKFu$U#kSO!W$^~D)ePsYy1_bcX0P#WMFpG&z z7bH6XYVdzhwu3qX?x^Q4o|Bv)$qE6OBXEe51jsIkD9L(MaR9Zzr~^hFFzSE-cK`sL Wa(=4DC}uVQ0000(VDLS delta 777 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 JPDHLkV1m(#b}|3} diff --git a/Resources/Textures/Clothing/Ears/Headsets/medical.rsi/icon_alt.png b/Resources/Textures/Clothing/Ears/Headsets/medical.rsi/icon_alt.png index 1087400c3caa26d484116ed669440cb2ba91cbaf..e68f78e061f33d0ee8d933defe0b6cba6aeb102b 100644 GIT binary patch delta 428 zcmV;d0aO0f1H}W7BYyx1a7bBm000ie000ie0hKEb8vpVTo; z0C_=!{~-F|`wNT%;s8-aDF#t#Wrl~FFHp;V(j4&m{xb$@gQ1lM2HXL#G{A6f02~0y z0iZMh!m!)`0+i+mq8wmi^UzOtlGR876k?~T)QR# zjsg%cHnn3od-@Prj-X05l$TQk)7!SLAXzU-4oFRrU?>OrUPUtrMSR`bg$(2Zk{kdE z^3L8W3~_SfpMN9=fU+7W%hmQ(GEftc6ap|upo_uS+S+>m-@JaqAR;Ql0HTQr8Ilv> z57t)L(=$bEbnVR&x{wy$;tU=3c4Gr zmPG(iDi+n)$7G^?&P4(>+ot{ZuiXx%Vo^OW5lOwFYFQKq^M9t(!a1RM?y3TDpmPCg zwoUul(2+=7*lx8bj3O*otAn}&hqaF-0B8x^B`tUz4hxlX`6#$)7-+Xzsszi`3Y+Z~ zo9$LLY8o!?-kNQbX&3;2&)E#)@mS5(>vfohq1_MKJTw}_IVUM4Nh!&39Ezfdq?E)t zPo0H};hdA_d4DSS^V^yn$5BFQBocezH{ucmL4Ys}F&d2!hN0FOnFIh}Fc=(-1wrt4 z0z!yP5}5^j--i$auIu9cYHe*e060Aq~yMNYvvr*5~a{Wbrmwq%Uay=k8OviRyut%+>&qQ6VQ*LWGm7D0000vHul4>cW2iy=LN|7Z{ZLE%~lh-VgcOy4>-R#`sM5P zp9MgxcCvjYkAE)@k)>D_P!K;o^<11TOCdgBS)-scNoCkWC~{A5OD=+L2W`LcEx9vk z!`s-5;)A`dME7ZJf%p`lWTE0}P)xo`oOCYO0KJPPtz8cyh6*|XdmyzcpdkM6S^3I0kx?hJi%FP z?a2#{^?eNtrf2ZgByA01#o9q!xNxEey|!!E&;7|x{!h#-kVqu{I~PM96OkyT;JruN zwu5H-xEfNvSv31_4LspSrjWQCTE3Mf?pA`$q5%;}6oGHHvVX+G%Pa18w_|(H69^%o zsw#vK;tPCy%E>&tz~ftUGS4mm0M=T(Kd)h}1pp|e;t4qCV2nYQWiZCTIS23kXn{Z9 zF*8e^=Z9RDCF;69n%7z%7NhIBNj|D0h)9Z}kiPrZTFXy~$zf*ES_?Dx3d~miTS=7i ozOpgpXD`a^3mcb6BoeXs0x@t}GjErB1ONa407*qoM6N<$f{v_)_W%F@ diff --git a/Resources/Textures/Clothing/Ears/Headsets/medicalscience.rsi/meta.json b/Resources/Textures/Clothing/Ears/Headsets/medicalscience.rsi/meta.json index 3d37ed54346..37ee397b98f 100644 --- a/Resources/Textures/Clothing/Ears/Headsets/medicalscience.rsi/meta.json +++ b/Resources/Textures/Clothing/Ears/Headsets/medicalscience.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/f8f4aeda930fcd0805ca4cc76d9bc9412a5b3428", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/f8f4aeda930fcd0805ca4cc76d9bc9412a5b3428 // Icon Taken from Paradise at https://github.com/Henri215/Paradise/blob/27087670280de99e2fceb47194aad29a7b99b280/icons/obj/radio.dmi", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Clothing/Ears/Headsets/mining.rsi/icon.png b/Resources/Textures/Clothing/Ears/Headsets/mining.rsi/icon.png index cdb552f140ec9f1a86c9333d6d16dc47859f7d61..498a0af6885eaf70bafea8842a6431adcecd420b 100644 GIT binary patch delta 444 zcmV;t0YmVTo; z0C_=!{~-F|`wNT%;s8-aDF#t#Wrl~FFHp;V(j4&m{xb$@gQ1lM2HXL#G{A6f02~0y z0iZMh!m!)`0+i+mq8wmi20S&o5W9|JW3Ng;r61gaQ}Ew7;V z|LfN;4BXs23?Q1AkRdq{er0*ZprWM0@ciWqhKCPsp;#^{F2RtJkqzcolob+X9$C5I z>$k5AAj^ON9vUD%NE~J{vFUN5CER{58dMk`p9ZApmm(4sntI*#!|L mS&u3XpcWW)z^DU89RL7+LYE1kW>c;J0000>ucb1jw2+SqM1{G#knKWBq~Y$6a%G@AK}xy8;z4 zD72J9OBJ>McHD&HBMs-qUQzMm1%wb_jQyWL(NqFEX(khq(tkO}-1p&m-c~6BQc5t! zKtyUd=!DLzR4WCDK)f&i9fAqawU1m501a%r@U1}8Z= z38=0?(-xq*hHI%a!QA&V3nZ>_v(Zo&hd)21uTMNYFYq#(t*jS9gx69^nScKfk-ELy zSL^P-5JD|WBq3E3>YU?l{2E#NLNZ@wU505h&s8Ez@QshF@P@0XsHiB5ZxOg<)UVlL Qz5oCK07*qoM6N<$g7S;1RR910 diff --git a/Resources/Textures/Clothing/Ears/Headsets/mining.rsi/meta.json b/Resources/Textures/Clothing/Ears/Headsets/mining.rsi/meta.json index df6ee47d086..9c2f13fda0b 100644 --- a/Resources/Textures/Clothing/Ears/Headsets/mining.rsi/meta.json +++ b/Resources/Textures/Clothing/Ears/Headsets/mining.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/f8f4aeda930fcd0805ca4cc76d9bc9412a5b3428", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/f8f4aeda930fcd0805ca4cc76d9bc9412a5b3428 // Icon Taken from Paradise at https://github.com/Henri215/Paradise/blob/27087670280de99e2fceb47194aad29a7b99b280/icons/obj/radio.dmi", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Clothing/Ears/Headsets/robotics.rsi/icon.png b/Resources/Textures/Clothing/Ears/Headsets/robotics.rsi/icon.png index 3d247f05be59b6337a3999eb81040920379ee608..4a67c2aa6e97c830fe27dea40f863cbba9df8282 100644 GIT binary patch delta 308 zcmZ3%bcAVwWIZzj1B1(wu46!ou{g-xiDBJ2nU_EgOS+@4BLl<6e(pbstU$hQfKQ04 zyr4lxM~A1U=l?Sd5z%WzM5P$c{5LW3THENXt7~jwZddNDFR!3BXZ}i{4imQBtAG@L zNswRge-yxQ<<5+SKq<}wkNU`B1_r((Aj~*bn@<`j+Un`z7-Hf7c0#n!VFeD?kB-eA zcm5Z7E9ENATq1qqXTgpNHkrgf4+Yg68IGRP-^ZxAw8kW+EyT-nyVF`#<|var0rA|a z85b?M@96mNaqtdhT(4fD^lIJ4$Hpa3{eIL;S@7o?3uELLk+|#H3peU^6nuW)qkT1D q@AfUit&P%Q{(OgKy5Ep^%zN{wNyVqb8!dq@V(@hJb6Mw<&;$Tw(Rl*^ delta 280 zcmV+z0q6e20;mFz8Gi-<0047(dh`GQ0PjgeK~#90?UcU`f-n$=e;OwUtapne#Fdnp z$H5h!#2Md)U3~)F%L)nWIjF?M5cyMC?3Xm{aP99Kt_N5wmVak8rkI(<_dL{11FiL_ zyR%_tk+XU(2s4X`ch^J1qbLFZs8n!KIkGH+35h`hFH|bHo_{V#RX#U&nn2sO-Ch*M z@&W*W_+%t_x`1Iu2^R7XW`#M776bQn-e~{QGVWV e7K_EQ6nDZmQxRt|$z0!a=y#&n*+s?D2WQGZ}C!!30~a1?-mq=Y1h zBFhm}$pze8++arl9YC^Pk{n?5&k*c;70o0DhJOh0JNND|kPAq104T`g)F-1@4g%!H zKS>S%Wi?QiV=(Mype7(G1mKQ96N9nk71aKJ{rZK0o12FLL=zJ-BqzeJEUy?;lvEg= zzkI>)@WCw<%W5UXB^XjNvcdd{vO=QFBP$nt{q~gsWEl{^Lj%MIiNh==HeHbH0I0$L zLD>%K2)Lu3zj#h^f+Q;hV2;2cP7)xyAfhDeQN;n&0;3KXb-<_t2HXJvQigqU&FZ8y P00000NkvXXu0mjfY~7m2 delta 284 zcmV+%0ptFR1GfT@B!B)%L_t(|ob8mMZo@DThW|}Pk!I?f$_(xWy5YUUkQKDI7!7S$ zu~|T#WGIgiTqy||FfhG>Y1InSElpxFf9#ih`af`IAdyJ?ckZSbX36vX zoa?$q+qM_;TI=&-48yRiBdjRHmCgN iMOl5}5{X1278NIywOTV4Lxu|g0000RJo2OT9xiv>M=As0Ku zr7v(cs7oIafANLUSB6C)#?o>>Yu>v}m>9q?K@KZ`A31OKFVdQ&MBb@0KzAXEdT%j delta 464 zcmV;>0WbdP0`dcp83+ad0047(di0Tw7k>eyNkl#H4*dX(rc*I=srDtLiI7kmhjY3MwI#eYy6`N7 zyZ_zuW3S_J=6!MjGz^1A@4vQNR78%pnj#EC*tU%@ z3^VOf2mk=S?;iHXX6w{vus8rAq!2`50M~Uv2!Ul;==FNAEGyIcLI4xT5&Hc;hma(R zC-Ss8$6~Qad<_!|R8{3!E|<%L^>tmRx2+ZkA#hz6&% z^`c5msj4bHRg{BI#y-8Dz8{-XVSwLeQ5`kzQl(1$wSE9vn7)JLv0%CY0000Nklt+19Tw>f(u2T!H3X=g6P7X52Ho=0jEXBl^HA)VsF|^?LwHF z4DBXoleu?D&NnwVnF3}k58wejfCpd$ECn_7H~##1pPL#0nSb9d?&#;!(vL|i7l_ON z#(a5u7++!@2R#8iwc#T67VN$br(Cb}C*W+Wzydfb7I1eZ&}=;7Eh*!x6zhCg4Qa4~ z$mJA>qRPOwI!+#G5+4 z5fSnbs{$zmNp_BN=Kbp0mXh)tLM(vBES0fp!um#Cm;dGYVZuDDRMFbo*YU~mVWzdL z0AwOTW&@?yGR2fP###G<4KP|*(Xksrq)<^OVmG8!1q{SLd6uj%BGui$OO8+rgeK()JB zmAa-wQFO2v|DZI_k^~ao=gS{pu~_~c$7C`QX^$~9ZHv0Djn>X_F$oXD5WbX1k_1Gg zPZQ|F0YE8*D2jHISiA#$c%C~*({yX@I)Se10O!+YS$4j_5qSKTfDi)r+Y3Sn0D#BX zxdH&-y6(_#+IF+R;?Lw71lpH!7(c5DkFuPs=bR7EQYp2|M>T diff --git a/Resources/Textures/Clothing/Ears/Headsets/security.rsi/icon_alt.png b/Resources/Textures/Clothing/Ears/Headsets/security.rsi/icon_alt.png index 219918544cc972b58236a8a32cea039364ec37df..b47392ea071f0362afaf541887ac19cad27d8b0a 100644 GIT binary patch delta 546 zcmV+-0^R+`1G)r|BYyx1a7bBm000ie000ie0hKEb8vp`6pHRCt{2mcL5^VHn3B zNie!p^1u|%bV)K4gvN%3XeelCXt$}qp`jrf+S_U=8g*}TYm{Bh5=%+tv;^roqrA#3whhW0-$kWNg&U| zwQm%H8$fRyrF0cABSR7Jcto<6$}c1ZE~gWMp|GJSZ~>r^fV4)QTP+!;A;U$8p-1l( z<%9evAa4|y0fH-Wwd%WLJ@@f?f#2tbYhrGLN%z&&_JAb7-_0`wGfU8z;cJ3iwc0+ns+X0R%H#{G;f1P1nSPp>dowZGQZ3^J#X*!0v0MOf%7$rH^3-|Pq zz?RHA9VY@5-!ir&HX+%qL15##{uDLi$*(pjcJ(vtEPsO~osdE#Yiie%23;?auaBJL z+H3%~m}`I<3A)2%9J{22vEjyXO(!HvI=G9F44>{#$I}lWdRN%nKZMOl1THVmC;lHd zK(q0R#`^jJM6YM~j&Kimw;%{?^h2m1I!%Y8)Jdt5vZpBW&I!4>Z+{hViOwY$g`v$?ql!df z;N5g;w`t1jW^>ecIPSfZ04fP|iUR)L-+R5QtN)VwLU1>oW-WN#Y)FhDF(x~xWvG36 zM`37vApm$@F40&*!XGtHS*Y1EiGMNnWqlC*ub}VE^3Q0MO}l zc!}f6|Aaz`yvQk(QdVni%e;DdN?S@P?X~Zpd@}dxeJ4wjvsG#=@Ncp_-&*dLmX@F9 Y1IM;U>K17H9QfB|3wxOQ3m^!=z=_x(r2PBVGj=z3 zL@yAT0c7!oN*Q^IJ%aVM+tluzEUMV>NKt&ehgw}=0h}EMnAl&zO?4S}o|BG%RB}pW zv>>#vV5x8kcs|_ZZ4X%~L;}Fh!veUdH&Ce_V{Wzv4-FM>Jv~5IybfIZ@DAp?ij#Eb z&jO%RbI&1sEe!Db^4L{;wCG^9 zR!{xyt&L3iw5}lfib2H^scw)@aalO)Ua$c=i3Ocq2SP!$gEo61wK^an{)n@r{SozY mdbt4PB?Djp3_#xjz5#i+fJ79`{QCd^002ovPDHLkU;%>a!mXeH delta 284 zcmV+%0ptFn1GfT@B!B)%L_t(|ob8l5j>0eyhJPp{Ih7?(l@7!Ts<_MrD3c>_0F(=G z6U23L0=8MYsgf;;a7t4kMNoh+d2F%%BugG?tog<-z~k}!cP1{$L}WuDaIR~VW$CoG zGel&WxgA7g|D<>v$F^yj-Xx|j$!VHmvp*n7lCE_>6EMbL`+r-)7&E>=p64&)!3Cly zx=nWL$9OCO0MJ@varuJQ8UPRqF`fW3LrRGt2q2{dGvi#>odw?hOy;whU9MJb{Czy) z=X82luas(^WmQ%Ee^f+dvn+f1{*_YpUg8~`?m#F6ilTUV_JeeO&$A9)JMUGZOYx7l iYw!!_@pwFAaTNvIA7Z2|dw$jc0000;U>K17H9QfB|3wxOQ3m^!=z=_x(r2PBVGj=z3 zL@yAT0c7!oN*Q^IJ%aVM+tluzEUMV>NKt&ehgw}=0h}EMnAl&zO?4S}o|BG%RB}pW zv>>#vV5x8kcs|_ZZ4X%~L;}Fh!veUdH&Ce_V{Wzv4-FM>Jv~5IybfIZ@DAp?ij#Eb z&jO%RbI&1sEe!Db^4L{;wCG^9 zR!{xyt&L3iw5}lfib2H^scw)@aalO)Ua$c=i3Ocq2SP!$gEo61wK^an{)n@r{SozY mdbt4PB?Djp3_#xjz5#i+fJ79`{QCd^002ovPDHLkU;%>Ax~-1@ delta 267 zcmV+m0rdW&1EvCyB!BHmL_t(|ob8l74}vfdhF=^>%G9Jcv1v3q(UCs^zl49u=BA5o zH^B-K#=01y1BA+lgME^wx#XIAu3vz|;rMqvn`9y~fe@(b8bwi9t(^=J8D{PV5t*M9 zkD|!5Z9AL9#wIyQ5}eN-;y9jK_d9{6X#npvuPu;e*E z8UPRov7P`kLrMwX_aUVOGoz~O$pWK4lihY}j;B)>UoRKj?)Q)NN~!KymSs8rM@2*? zP1D}@uaq+H5@WEs1A!38^L+5^7wP<+z7B0WpH*T?@vpaQ@eAj0I2>#71p4-0q*qZX RE&u=k07*qoL0I&vVHg_Y8AAR02$okp_&-?uzWg+V#MCjpt7=H32fTmH<23TIH za@D7K?p9n<>cR*@3joIV_YSCi+fLTteWTuBpw4|KfpAwVMi65G#P}$oAia20Axxy5 z0(gpC2d`az$A27avLkGz1t4K|oCUg?tMOWkd|re10+k!UU$wsd)OFNF?f@{3D2#&0 z9Y9i$m9zkmV{gmjoS%d@$vW25{NqSA?T%vs-rrv0pH(9jLbjW_BOsgBtQ7%)P>o~$ z`#VN5mUaz@k$5X|I|fLa$7t8mA$1~RT!h?w;zlGVo@3g8MGyU5N}J@pAMYh8P*G9w$5=%dG#d>G z0H?OCzdbG%h2xYGXuGb=zJDYMPHkI1%ZL~+Xf_&BC3{*ft$#y8YV1b^RH8!(+O8|J z)hHs7JF(a8%J(?Ndb8Q-JFwe(B>|w2KrL^={lkNGes=aPxkCtg-L7uIdb2?oMF^uv zZ&VXX@7}iSN{0{tz_agzbFRl`vl$#hj4F{^fkUYBKl?s9oettS)?=J=gi&M^r?fye zxgw5Z3`Qd@!G9RbZN*Un4k1X>6lt0Q0B&w?F&+*J#W+d;0Fv#_A9x z5ah-`$(uka)jN5$T73%`1cBucA}{N82qBOp30_}bj75?gLn)P6k$o`6BR{fNNVWLb*-f-5R2{uQ5fOvV4I5VPU{0000R>BeEE%;0OpaPSxg< z1`0NLx;Tbd_`f|L$ah$QqapFgBH>ei*ITbinOr+_7x$O?4AsAj#J>3RORzF9oSZ&C zjiF;l2Pea`IfdMPhZ%mp@Lg~v{OF`85$y-hK4-8+STDFO8?yfcoYiDiy%p`gqHw=!0-ZfbR-yN=0>h`qgyi4 zuAQQv`Fl;e`>(evcs!oJrzcelLP#D20c2SQoO7eIO=y1vli!zIMgYStablt`^?xU7 z@_0vuVvPGDut3W|0VZD`j-?3~7#ToTk8c}Xpl#rMl?zEdZi}{o$yhEnQz2z+iBSvo zBL?&t3q=NDDAWd{78F&ZV*E`Az_~xo zAa9y~G@zQ$!RQ~rXLx>zgf`Jhhf8f8 sQ-PZR000hUSV?A0O#mtY000O800000007cclK=n!07*qoM6N<$f~e4lZU6uP diff --git a/Resources/Textures/DeltaV/Clothing/Ears/Headsets/prisoner.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/Ears/Headsets/prisoner.rsi/meta.json index 33e08c9522f..d2bd34f4835 100644 --- a/Resources/Textures/DeltaV/Clothing/Ears/Headsets/prisoner.rsi/meta.json +++ b/Resources/Textures/DeltaV/Clothing/Ears/Headsets/prisoner.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Resprited by DangerRevolution from tgstation at commit https://github.com/tgstation/tgstation/commit/f8f4aeda930fcd0805ca4cc76d9bc9412a5b3428", + "copyright": "Resprited by DangerRevolution from tgstation at commit https://github.com/tgstation/tgstation/commit/f8f4aeda930fcd0805ca4cc76d9bc9412a5b3428 // Icon Edited by FoxxoTrystan and Taken from Paradise at https://github.com/Henri215/Paradise/blob/27087670280de99e2fceb47194aad29a7b99b280/icons/obj/radio.dmi", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/DeltaV/Clothing/Ears/Headsets/securitymedical.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/Ears/Headsets/securitymedical.rsi/icon.png index 0e1840978dafa6f2c7f52dcaebcc6cc4f1e4b7c4..195117997db22a6b1c73cab9c4749c2bb21e1da8 100644 GIT binary patch delta 381 zcmV-@0fPSX0+<7kB!3BTNLh0L01m_e01m_fl`9S#0003>Nklt+19Tw>f(u2T!H3X=g6P7X52Ho=0jEXBl^HA)VsF|^?LwHF z4DBXoleu?D&NnwVnF3}k58wejfCpd$ECn_7H~##1pPL#0nSb9d?&#;!(vL|i7l_ON z#(a5u7++!@2R#8iwc#T67VN$br(Cb}C*W+Wzydfb7I1eZ&}=;7Eh*!x6zhCg4Qa4~ z$mJA>qRPOwI!+#G5+4 z5fSnbs{$zmNp_BN=Kbp0mXh)tLM(vBES0fp!um#Cm;dGYVZuDDRMFbo*YU~mVWzdL z0AwOTW&@?yGR2fP###G<4KP|*(Xksrq)<^OVmG8!1q{SLd6uj%BGoqB!3xnMObuGZ)S9NVRB^vL1b@YWgtmyVP|DhWnpA_ami&o0003M zNklY2nSUm{stSstz`l35{=!y( zk_SNmYtMr?j^*`aN6;jvD9aMUFdPj+sRk(d_HcnDNv1Et)AIL+a_;d8R5}9{1%74jyU$fX8K5g!7ZewOU4(rQ qU9xlA5cO}l2G9T+U~Yi700RI8zZHRui_7r<0000=JZ}D6A|=ODoFO zj<#=bY$d~)RrBH(mf4*-d_QmA+j(O~kJSh00~iJf2B)huet(q9$lhI<{uO}C6^p{& zYh%?YgfxKOoTOG%v?D`1;B*eN@gaB5Qed~);2rlF+65^9G8y%ZvG>>47j!~~i;%XS zqF2>V_HaPiT@VKF4ozuQUulf|-2w#`*gXT#)rAy<5CEA+Qd`(ti`M5T`ba8?-03Zj zceVkK${^e$E`KSAmH^!RFL^=}m`AJuLPo+Vphzj#`KJQ=rgxenfOaGVKt_kjIA%iO zhIyI`BZ2F)o9+VWwf=R2!1g3oHeA2fs4lt=K;{>*OJLB2PDmPnMcyHEVF1c;IGSKN z*Nf)#`KKdUwmY^2$iAJMkcM^$E!H92E;nYESL^1P^nVdl^D|JkqAMpMhsdP0_Uo{+ zf1UmJ`gKjEBBUi;1Kh;x@Ue>s9ly=Co7y$+kRs`jE<)CPDnBQlz5(&O!ra0V0)9Ud zn{l*~G(f5NNM=>40}jEjXY@^Q2m8BF6tQ|R)Q+1$kjOk=$g_3PdN6z+;1CpP9Y9M@ qZC+SyT_MY5BJB!5C)5Y%Ilwm%yYQoVR*XFW0000-rJANMF6ZIh}diCGe za}1YMn*qKd;#p>Khj^YiyX9Dd_lU<>MJ^Ga5GObtkoZ>UipOt)%N~CT=7rn>;1@lm zau+LI%qrXU zjJ_7?;N&QyLVw-_sWs}VQq@RTY3itp-2dlkYctbc_i!2*e0AN=Ng%inG#jq_d+NH) zGa&E+T$>$#m2#T6jWNfgIywO;=?cPt`XP9pGK$Au#R^2Wn-+Bj*oevupPHiJ0ALSVSr@P~d> zn#+rY4rGC`V~D_bTQ1prJ{P6^exG4Z#|Z(}Nq?>fgTyq=#PdA<^m@G{j$@wVyUtpr zYC$p@jRg7q<5L0=BuGU>;Xjb43^rSq#m3_?i=v3#t$ZHyF#B_r1khp-QFc@o@NM^w zdvd$W6|>3$zylGEu zNOrBq#dB%fV$(0Kd)PYwB4ib!QKcHqzsd;!33!ID2?rX&CW01jnXNoGw=04e|g00;m800000 T0Mb*F00000NkvXXu0mjfu5^_h diff --git a/Resources/Textures/DeltaV/Clothing/Ears/Headsets/service.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/Ears/Headsets/service.rsi/meta.json index 5dd6839da5b..b62adfa1f3e 100644 --- a/Resources/Textures/DeltaV/Clothing/Ears/Headsets/service.rsi/meta.json +++ b/Resources/Textures/DeltaV/Clothing/Ears/Headsets/service.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/f8f4aeda930fcd0805ca4cc76d9bc9412a5b3428. Modified by TJohnson.", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/f8f4aeda930fcd0805ca4cc76d9bc9412a5b3428. Modified by TJohnson. // Icon Taken from Paradise at https://github.com/Henri215/Paradise/blob/27087670280de99e2fceb47194aad29a7b99b280/icons/obj/radio.dmi", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/DeltaV/Clothing/Ears/Headsets/syndicate_listening.rsi/icon_alt.png b/Resources/Textures/DeltaV/Clothing/Ears/Headsets/syndicate_listening.rsi/icon_alt.png index 0354a3ad03e1d08370756b4ce6cdc5a866d57846..892f6d12f0e391ba8a708a1639f624d60de62ad1 100644 GIT binary patch delta 489 zcmVDiryi^hqBIBy#)EFa-*xN3`aU2K@H7F4(<8N_tBJ1VCZ6U3 fkcA3>sRR4~DJ}D_3S&RE00000NkvXXu0mjfWXR_b delta 505 zcmVpGs7XXYR9Hvtl`(6=Kp2M4TdW1sG1lF>NXM*#LlG3A&|lcqLP0D@ z2f=?J#i^O+{GMupZm_ch<}unl)vI$NWz%xgZ8AI~r*u7q}tZfZ6EYqb&|^ZDMo19j~o$xE_WE`^oP@5x4?t-y1? zpE=Lv4#E)txqsl61QE>Ppin4itD!ZF0yE~Ix5-3Qt5xcQ!C*iVkeSV9M>AsW0u?Sl z!X3vEtKBj&kU_W!Ckp@$XCTpNx2dmI>tn=QlbX z3P-ChhmOPo01}V&I)y*ATJ)Q#L}G!>W<%F)uSXKR9CD_dybT%b^>VpPeJQ2L2Is|a zIMi-IpdDb__RnGBx^C!r9KV;vBK0BhKAjq!g2q5X6$t~C*lj)Es(Ea{at7j^j|V_vPv8cl7foDVn=TiUVzBXyAHK zl&BT6>h3cm<|)y+uZ#ab*DaXy(%_$c1@ErxefN#_@g8Hy4AGhP>zd8?IaS%mIFt{# zB&zNDbZ-0Ct6O{bojLs1H_0XG!1Jl=1wOMr{oL9pnYQSu>&X(K_bpeA3yzvz(t5o; z;rHF;H}{@=SNQlvUtjy&FN~YM&XacWw+)UIyY~3KeSPYTV1^T`)uQ)rj{a$=E_rel z^O9MmVJ9OP=f%$}+RK(WX^z!_ZH-nAyFo67fDneauMeM{`19{(ABIbF?!CJDVtS51 zJ)6hnQ`cg?KDcr^jeUvV9rxG8hVlkXJ-vPWe>6JJv#TV3dYfP&ukqJPUchI{!5Rfw mhG)z(_-~j5uxEfn;{bbL<^G@f$87F_Z1HsUb6Mw<&;$VXyS-!p literal 317 zcmV-D0mA-?P)F)n?n`R1vLw1LN;PQ>vMY>q!((6a8 zzTbLxdC9vw2tY(cM0BQNyk6$4zsP-oo7+juea5jqKmIYdge+B6jaC2vJU?wl%^$sh z-2Ch-aPIzn0h6H%y!YQ8xwdTwKX2^(%c0>S0sy$0ejJ(-ElaS-A5?&<0sxw(!D2qc z{oQImwtm>|$E{f8C%5IjkE)8gt^ok=efMR~%j+A8qA+oKjKTG!89e+_{puG&9u6{1-oD!M<{Fqr2 delta 236 zcmVW`mv2M5cL85{RdDgsbpCnMgFbw10S+0xxRe`#$-x3&o zO2hF9hT3+280s3t zw%+^9%xIbh0MMs+lR2KwD9ci{3eg0dbD4+`LO=-NX_kn<%sIv=k`S*TrG%=gL^%!O mQ90+tKc2LE!!QivC%6JIdp+WT|L-;c0000yx^~S{`^VmO?PqT7 za$)zoJmpi={yX=6YZ{p^W!(OJt4mtf8n%?wO5pWdm=~oB~#qq=_go#`WYA& z%$oSu;g(&3zw+tkko)+uPHG3uZsRYhO2c z^3|9F%EvaD$X1*JIS&jr)XU|w1)W*F(H}&2aZk86JAz;Oar`Q-4<*JI&MZ_vaQW;3 i^HA0e?d%K;4e|PtD|HXgzpeHHq}kKe&t;ucLK6U7i(c{o diff --git a/Resources/Textures/Objects/Devices/communication.rsi/old-radio.png b/Resources/Textures/Objects/Devices/communication.rsi/old-radio.png deleted file mode 100644 index 23315c58a2c7b98d3587c7696fd24ef507461066..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 401 zcmV;C0dD?@P)vTFwg z6_IF42&F1$9ZG}9%gZB0>hQklcz5saOgla~JrC`xEYKP5xejB=6acBr94Upr zvJLdB3WzpPEtja4OVSwra0By8t3f_2jzUSG+3+!~GytZRrrGcTsNGxvkX={~jiZnr vqRt&K#w}Ty6tC{!xlZUY>iH$qXf&E{dy$VBeQ!MQ00000NkvXXu0mjfVjZ)E diff --git a/Resources/Textures/Objects/Devices/communication.rsi/radio-inhand-left.png b/Resources/Textures/Objects/Devices/communication.rsi/radio-inhand-left.png index ddd9d320f9dea2333626c80bd1963fb726f77038..e1cb184a79c41bc605c32bdce52bfbcf245ce02a 100644 GIT binary patch delta 187 zcmV;s07U<{0@neMB!8YsL_t(|obB4N4Z<)G1yF-ngbi3ALxgcsuowk}$00jFMUxWW zMLFrc0lqBzcmAyb0000{?(_UPV%F93Gx97D) zW{Ru^WM!u`;IS;>2hGTAE$ISYy_d)Y000000HB(Y{Xp72U^Gu7`+@L%z@8$0i_15l p%x)lq2DI_rK=})>8vp>{KVOAWEDy%&U1k6P002ovPDHLkV1oSMQ)B=D delta 284 zcmV+%0ptGH0k;B>B!B)%L_t(|obB2%3IZ_@K+(zS5$tU&1-IJL188AwYbEgjf(P*= zdJ79rB7(4$FtVOtC1c32|G~CdGMOYW836zQ001COj8UyZsH(lbRF&nLw{2@VTo%Fd zC-Y-#u)bGkeOI`QyK zPXC-t1Ms-1Y*wq{C;d0GU8R#Im|TUqwm`9|>hc!wXz&3500000000KYv?}~dnL4$a zYi007QP%;m=tpoJ0E>PE*Jpr5KZ5HFD6Su&?}Mhrqox@3Be=f>Qu`5H2cWoqgxp)e ivL68e004s`A{8IGP~iJo-Tf*60000@0{lu2Lqd!C(ZW}ctcKkszV^kvN1&kp`NEO1E6)9_eu;lTLx!c>*gbQXrziVGNdGghm1IouXnFPpIoZ N-_zC4Wt~$(69Cc*TqOVi delta 235 zcmey&*v>RTrT(0!i(^Q|oVT|OxeghK9Q%0vmhz6>J8rLB%)X*|^Xkb<%wIU#G<1t! zh%WiS73a|6q-OX?Z_>6YlcxXA=Tq5JlX6m>0R;Y}_Y~f8n^G2;vsU)Kitx#rZFlb& zmD}%MI&tzY#tPL3lh&u)l}p+9T13KjAE!Y0?nf5gpLusYTc2_yA zdUrAWm@VEJ{qAxH#8{Bgi^Qwa6F!vZznIIozV3j2loj({VTW`F&-4Y~zh=JV;W?#0 im(hwDsE}iFM-9Wl-L~6zy0`U%bb7k_xvX4nJ@ErkR#;MwT(hLl& z?4B-;Ar*7p&fS}LIY6SV_sFfK_6n&BSdTDFW#GKAXv2mnOw2ktdwKO5t6v;B#^lW^ z%pGd(z_er=GgDNX*M<4gD*{ebCuR_x<}BlEU+^X8%nd1MBjm{0dx*|8n+6GHly! z*0ex?!?yIDO;JjRqXG&br!YtGroLX{d{Rq z|NUe0B^jn~y1mx=;bT%X+q8E01BhuiY1BP%rl^ynOWbRr86n+xnV+ zOU_dYR;a74zt3ZE+wy(MIqA8Yi@&qWwC}yU_fY@Q{MYX}8>%0C>wo|8FSq>l#lNRp zH}5hNeSiDk7WuU~ZWp(|{`}F-{DFyi-quIAFB@O}m-hSl`nh+)m;QMBx7CiL=#tHz zJDztKf2_Uzp8cVH>#f_dy{8H+F7}mO<7@hvE~d8lyZ?Tc&*7DSY#9q)e#n=$F`pmv z>i4p#OYgCVqI0r$(N-E1WGf4$syczNN4pX(>oZ?2cx z@@4t_%4`3$`sx!H>g;z+|9|vI_tYgi-A3$v;P9^3J5^O`sg=qnw|}mEIh)4pTZN7H zkDXUdd?dh7h!O9K4Cumj42AZ886MUBVm$Kq3vWkzV>P!FK`p%rvs~BSMps`=sl5J&OLt^rVH|!iQ&r3Il*)#mxh++thobrWv4#WS4 zF1vra^2J13&w(q+=^v-X4qh65gp?}`|HM_^UVE&u@0=wobbWeVx5A+M$#O;1} zvugLuXLR~1ta4o7(0p^Y$#o4sB&TomyPH${r|6qh<>tDEIfgU738(Zl)-n9~!u&x0 zJt)qI4sLf~Tz;DPlD#1(Q`f}%pth@XSSA$R2F>F}8?Jq+D^YoTZU@?Rm+UMj0^L`eYx;{Ms QEGHQ}UHx3vIVCg!04W4|3jhEB literal 536 zcmV+z0_XjSP)Px$(n&-?R9J=WR=rOGF&uqYhzcwOS#DyGgaL5i%Y@zK28oM_D}$qn6N`(6zraD` zVjPW&VPSDq5(z;J#KZ_L4wZmNBoZZrI^gl)SFQyyQQp#P@7MQxef{0Fz!+ov1vs5f zCOVf4LxA7!7oIy50Y;;7^a6Tquh;9s0`wx2ToJ;2ML&wBOJ;USKnt)2Bvwu`iIqBML0Dyi-ktI5??6gsVe3|^+c z*CSzj#6yOmd|gMQ(Ez0slu|rRlrT9h;rR}zoU;wByqX=z&Q$yQ7K;T2g8{W#O)JHx z5c&@Qz~XTf2h9vj0H!V~D6VY+;4ebW0%i*Z$sQ)m5hS?TZ;vHS#r8uGu)f6+&Lwe$ zTYTNm`)Gb0)|ZnHF+b+Odnk$m_pQ6rKTPci@eFhth7_f*t)v+D76=RQxZQ}w;|M7V zV)3{rjkthxHrq+AIxtcJUpY|C@g0cV0!oQ?f?so>_dHNnK1dC4-(c)v!oIUv}f9BYyx1a7bBm000ie000ie0hKEb8vpVQ!P zkmUd`?}-1~wyt0tFb6z*aE*alU}#3cpmTs_jNN|_eSFCwlG6pr4p5CZ`Ok3X7u-@1 zaBxwFG5?e52$CECvedy*onhYgtqguH=5TReV_h(PV9!kkQhxziQIOQ-jl$o2_A&#x zfFuXlc(XG2>geK>|HFO{m=0*@fFoOfGd#Su9jE-``@b1T1w=dGu$}Jz*mGYQWEHs? zo;`G8Fi-G+%bi@XgF#AuAH#E?Jk1<%@;(y-122UA^3G+Tr3g6?UrL^VEI_maN*-Ti zRM0X8XT6X#c7Gsw3nA&m&T#iGjU502l1AKM`tIE)IOR#LCWcN?tgWs0ADj63N3R(S z)B&Ro Z001=ZcCSkjr3wH5002ovPDHLkV1lbQyT$+j delta 343 zcmV-d0jU1S1MvcoBYy!nNkl1t&6U1T%w^Az9NvM+rp@NfxE)K5J zC5w}P!AblFE{+BNKnI85;G_=XAR=xRTExvEjcG`{I|rvq1@8!oa_{&Z-+K@5-F*jE zR#tyeK@g~-yxgLUepJfo zp=#c^(I96w_q740bO8WV&Es`HAFGuPJm|rR>#DYt--a*(a0dCuhM#KS^Pu!bgb_e{ zXKP};+X*>TO6v%Wo?#NFbUPt&ln_S=XXn=>aZ0qHKOl_~kW#X~y#~P5%{@u~g$wQ| z_Z^0sUPcLwrcfhpk52(;H5<&#&(Uf&j1n*c@JA(oG&CqGDt30x(Kj#yDld#U_76z$l?3?( z|3?N4t_SX%0LpL{ctjR6Fx2xM0jfH}I8~cZ8YsHZ)5S5w!hi3CgF=TCcwC%?S{MEK z|9;oP>W07<2QQX4=G@l_$Q1wMG~vkEle-rbfBD`vql{NAZCR3x_2LA*ck3Q4Hst1P zTGHzvcIfQ;BQseRPbfU`h z@<`CMad|8t@w)AYp7+C(Y!yCDne}FGSbEd-^ecb*{LwtL(U^1okFboltSjehm$L5+ RT@Q3EgQu&X%Q~loCII{0gVO*2 delta 274 zcmV+t0qy?W0-^$t8Gi-<0047(dh`GQ0O?6YK~#90?UXT&!axi~|E#!xPccm*QTiC0 zBWxPZFx854P;dnbE`daW6qFNew}mAd%D)973LWu86zn`{3Xk;duNm7wp-`BC7$d#f zk2#GL1OLZBjFCBwH)fF|R#gIkna$zl`Jz06whzPM5xkq3N`IIt=(d4XO{`C!!`=6C zhjSNDe{pg?_ZM93>Xqi9s_eFbs>;6aIgUN~++&zhLff`TDS1=)P*vLg@dfU&C!eba zetvJG*EG!#d&$~_B9bHb8Q822sA@t)U}g{zR5h_#9kR_l#oUX?ZDKrrFD+gu6yA*8o|0J>k`J4qFk;M!Qe1}1p@p%4< z6rf;=r;B4qgnP0C>*55Fo~A$pF1LdY%x)UKLMQD0zuMo;CO(Cou{y6Nc}A9o+onpN zfLSUZwmlcP;grH7q|81+lBXCP)ttWfmlPw3cYyTs=Zqe*(%_W;u6#3tiv|~p{GJ=%7=$`~8At_WrGd9ShZy#h z*kOnXkzp2D4u5!lYZC)Q52l!^GMyYy7z9jc3=>cVb%5o;MH)Nc{DWrWtatM&q`=P1>s0{|( Z0RZRCzZ#?z%#r{A002ovPDHLkV1gl*$^ZZW delta 272 zcmV+r0q_3(1FHg%B!BWrL_t(|ob8k`4#F@DMSp<{_yEjV=7DA zt~~$}8>klmF~E?G1%w$;t9EOhiUIPZ3_p^cpTss02m}Ve7$e%)(U3-hf&VdJj1iy0 zYclZ(W@Z5Z=iCrpx*sZgh|8mT$sSUf=}Xi%;E+Xfnols_ynpJwVm-pNcp_d(?|iB+ zSX>{t+{Z0_?0**>%q)j25@wdNETyS6`P6M_twoxqu-0l*=wN1XdHV$_t;wgVf%EOt zdP$PhT8q~tBqE=1oq_FYhgmEjA~@$jM3}{b?P}+3rV~RCBDINT`+fEBKp^mQyaC~7 Wcnq&YI#>Vz00{s|MNUMnLSTX_8hg+H diff --git a/Resources/Textures/Objects/Devices/jammer.rsi/jammer-on.png b/Resources/Textures/Objects/Devices/jammer.rsi/jammer-on.png new file mode 100644 index 0000000000000000000000000000000000000000..987e571b263f8b1a1c863755865ddbb5f496cfbb GIT binary patch literal 537 zcmV+!0_OdRP)5+Iv#X1vlY<|@&)`S! zGYHPzoE%+>n}Z;fT1C;N2el0}Q3@%fXY$I0APU|k*E4W`NZ;KBdcT*;y(IqvD3%7$ z09*j=_8uLNr{FkGh7tf7(g67axH=ue-OUh=FBAd%B(^h{cy~x@fKquqZYM#c034n* z!`~*@_LQ=*muC{67pV_i0Lg5>E6RS~-bS#l^YCYo)Jw2y)}gm}$9BUqfcO-6lp26d zE~-rHK!^0@-UBj}Ux4JEuhlAe0JNyoLUiOf81H8Rbi#?)wrhBwI8I;JEOWTu=I|@du*GPpnNi_usHzD~4BO&i5aw0HVyJ$)hMLVSqVZIw3v{;<1(c z0}KK|7GhT+UzLz4$~^gX)U0nnsag(OTU2Tx`qdwBKX9B-6A17rpG%+&K>GvQACMsp bpd8=}cvi=k6xZ2A00000NkvXXu0mjfjHTr1 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/jammer.rsi/jammer.png b/Resources/Textures/Objects/Devices/jammer.rsi/jammer.png index 6de27ba924f109e4b6bcf08e517a0ec822575e90..99e0246bfb1acdddf9df6c748233bfd2b808c0bf 100644 GIT binary patch delta 282 zcmV+#0pZEqh?^5kDm)JkL(bdIKZbv8c0e*E&70ADXG3E*#XGDMF-^g zo@57L13FA%3|IcWB3nPj4xq$xsyF}{*b8g^2hj)LUMD&&P=D0{QtXTj&wl%mgsHgxK?*fX^v>*z4`xZ=J{Pve&InW|loJ)QB0v3P9z|3%vfiy65qhLTBuufPQ zOn+ke#vuGt?f(^qzhM4LJ^?UI^SS^TfD#=w07(w`^zj>*Cb!(D*a0_goFcilqpAaF g0Y)7#;0^!)$P*M&!Hni>ga7~l07*qoM6N<$g7i9kt^fc4 delta 449 zcmV;y0Y3i80`CKmIDY}5Nkl6vkf-K{idOLjAg~(YO|O zcmb~<8!d*Vn=aY8GU*vum9SPC5@~{93W-+UglPr?GBs@oreD&`zjnUgn|U*7%rFet zq++mPMF0^%1hBmT2i~0_G^}6tLtX8YJSS}k21OUx%o_|gup98q6R$Z;p@QkQA zt*?Xd4Sh#@!^&v8Jj2NQi*FDe4PR` z-AkoN-5v~9zK7Y5iMTESeF0#WtBOMQ{G?ETR;x8z6-~Ify!N7Ik0L_QzCZv_G~v3P zj@L(*e;GtzHzAGweLRM2Ham}AUpYCCu`d7=8$C_LAUebaAPC$6g#&P}Y2*lsqDb1! rW-~A%U-tlnpzZx3i2x#ie*^Fhk4m}f98Gi-<0047(dh`GQ010qNS#tmY4#WTe4#WYKD-Ig~00DYQL_t(| zoMT}aU@+={Q3sIa059)||J$~%U>q<9JbZACfm&c_M!}$SfMtx`e-M3q$sv-{1<4Lj zjW_wvaOM}>QV?)(QHL@Alj;bP900P^!BL%I-uA5welF&4aerT9T`+xM&rJqW0a;Oy z)a8xB-+cBm1G#`C2iSPCGWhD~;*|fxeh-)qXy||=TYob=ytW;u{Nww-8At_0JK(UL z?*G_xUm0W-xfz~4bYd`1@PNymT(E;dN`4>1bD%uU9B}eJ69WS;g#Gf)WuT=9IS^k; zo`Ebtv;#^WUw>p&&@u*Ry^u6^AbATR>BP=(_b!bc00NRm++h0d-6uHZNv$S^PEo9_ zt@j_B`1wb#84Tq_Y43nHuir56F$jR!W(%G%oJx=aTmEVLGluh?3}ickXa~G}^^8%8 zK?NKN`m(CI{*Path7KUt j5~@0Y+F;ZHqYeN7H12kO>_%)r2R z7=#&*=dVZs3YL1hIEGmGU!CAx&)1;928{u)8H0aHR=D5Vkpy%BgQu&X%Q~k7#wGyW CcVF!Q diff --git a/Resources/Textures/Objects/Devices/station_beacon.rsi/blink.png b/Resources/Textures/Objects/Devices/station_beacon.rsi/blink.png index 53fabd17147d2c566dd0d0980241aeb7f1d65d4e..cd94b9738a05ffbf12b4527479336fabaf91a047 100644 GIT binary patch literal 447 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!3HF&`%2dVDb50q$YKTtz9S&aI8~cZnt_3_ z(9^{+q+-t78}{CZ69m{kXmivtI38RXG^gp2f}WH5NB+Ad#Vck%Ps(Ea{at7j^j|V_vPv8cl7foDVn=TiUVzBXyAHK zl&BT6>h3cm<|)y+uZ#ab*DaXy(%_$c1@ErxefN#_@g8Hy4AGhP>zd8?IaS%mIFt{# zB&zNDbZ-0Ct6O{bojLs1H_0XG!1Jl=1wOMr{oL9pnYQSu>&X(K_bpeA3yzvz(t5o; z;rHF;H}{@=SNQlvUtjy&FN~YM&XacWw+)UIyY~3KeSPYTV1^T`)uQ)rj{a$=E_rel z^O9MmVJ9OP=f%$}+RK(WX^z!_ZH-nAyFo67fDneauMeM{`19{(ABIbF?!CJDVtS51 zJ)6hnQ`cg?KDcr^jeUvV9rxG8hVlkXJ-vPWe>6JJv#TV3dYfP&ukqJPUchI{!5Rfw mhG)z(_-~j5uxEfn;{bbL<^G@f$87F_Z1HsUb6Mw<&;$VXyS-!p literal 373 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQjEnx?oJHr&dIz4vh_V(978f1 z-%eSWci2Fn?Z4k_lQf|O))t8tiJ!LH)FswhZ7`RZVG`H-zV^_z1rr!9vs~$VBIL~P zvodUgPT1ShRqvcTOLx7mDd%($U~vSYBdQPnrpXG`i|%e%{(Nfx++xl9)4#u8=-c5n z?|FJQ14B(+PV=AZ3z;;ZE?JN{D>P%@jeom;=LYOsz~-U3H|W)iH{a6!f4<6pSRmxU z&cBZT8J^29ELfMFv6hjccK_kWzZh%xHy888URS-{B=XNy+F;$?2!>>yYqxIRm@(hk z>;HOQ0jG+kB0Yu~x65p-yDBSdt!>0z8+A@UnDaU6_2k(TZtc%t?lIhOt*N+g)he~e z7SAV7wrrj9&sA8+se(b{bWzv=32PtCV_*Isk`H+jaYDvW|KI&TFrR&7-DtCOrf8kX RKVUdAc)I$ztaD0e0st59p{oD@ diff --git a/Resources/Textures/Objects/Devices/station_beacon.rsi/icon.png b/Resources/Textures/Objects/Devices/station_beacon.rsi/icon.png index 67f3f53eb5010a9b612cd02ec21f1d09fb71a651..15c1e94221d6ad947744547dfc7b4a8634b81917 100644 GIT binary patch delta 257 zcmZ3-G>K_~WIZzj1B1(wu46!ou{g-xiDBJ2nU_EgOS+@4BLl<6e(pbstU$hWfKQ0) zP8VHqF)3|rz0Ax?MP-A|&N*J*5pVYd0p(5Ztpxz|{T;`{9({iY5uxk4q!ywY7;7H|gb?uFFJ@!En+a diff --git a/Resources/Textures/Objects/Devices/station_beacon.rsi/meta.json b/Resources/Textures/Objects/Devices/station_beacon.rsi/meta.json index 771ce4c261a..96aaf12a24a 100644 --- a/Resources/Textures/Objects/Devices/station_beacon.rsi/meta.json +++ b/Resources/Textures/Objects/Devices/station_beacon.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC0-1.0", - "copyright": "Created by EmoGarbage404 (github) for SS14, based on beacon design from /tg/", + "copyright": "Created by EmoGarbage404 (github) for SS14, based on beacon design from /tg/ // Icon/Blink Taken from Paradise at https://github.com/Henri215/Paradise/blob/27087670280de99e2fceb47194aad29a7b99b280/icons/obj/radio.dmi", "size": { "x": 32, "y": 32 From 068ee52f47497ada24bb8625e93351bb0b110364 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Wed, 29 May 2024 00:05:08 +0000 Subject: [PATCH 015/155] Automatic Changelog Update (#402) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index ba49523cfde..976421ab857 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4094,3 +4094,11 @@ Entries: appear on low-pop servers. id: 6112 time: '2024-05-28T23:44:39.0000000+00:00' +- author: FoxxoTrystan + changes: + - type: Tweak + message: Better wall sprites. + - type: Tweak + message: Better window sprites. + id: 6113 + time: '2024-05-28T23:59:19.0000000+00:00' From 08c8a73197d938538e16bc69561d765926cf0667 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Wed, 29 May 2024 00:14:23 +0000 Subject: [PATCH 016/155] Automatic Changelog Update (#404) --- Resources/Changelog/Changelog.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 976421ab857..96983e8124e 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4102,3 +4102,13 @@ Entries: message: Better window sprites. id: 6113 time: '2024-05-28T23:59:19.0000000+00:00' +- author: FoxxoTrystan + changes: + - type: Tweak + message: Radio Resprites, Talkwalkies, Beacon, Headset... + - type: Tweak + message: >- + Radio and uplink radio looks the same, make sure to check what freq the + radio is on! + id: 6114 + time: '2024-05-29T00:00:50.0000000+00:00' From 67df38eab15ae138d3b614c0ca049e8b5b70c4a2 Mon Sep 17 00:00:00 2001 From: SimpleStation14 <130339894+SimpleStation14@users.noreply.github.com> Date: Tue, 28 May 2024 20:48:10 -0400 Subject: [PATCH 017/155] Mirror: Change Syndie Monkey Price 8-6 TC (#243) ## Mirror of PR #26214: [Change Syndie Monkey Price 8-6 TC](https://github.com/space-wizards/space-station-14/pull/26214) from space-wizards [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `6095383ce491e9cb4836662f3bc56ee26eee29f6` PR opened by
FungiFellow at 2024-03-17 17:55:32 UTC --- PR changed 1 files with 2 additions and 2 deletions. The PR had the following labels: - No C# ---

Original Body

> > > > ## About the PR > > I decreased the Price of Monkey reinforcements from 8 to 6, > ## Why / Balance > > Monkies are awful in combat and anyone can take them out with 1-3 shoves and aren't worth 8TC 90% of the time unless the consience piloting it is robust. > ## Technical details > > > ## Media > > > - [X] I have added screenshots/videos to this PR showcasing its changes ingame, **or** this PR does not require an ingame showcase > > ## Breaking changes > > > **Changelog** > > > > :cl: > - tweak: Changed Monkey Reinf Price to 6TC
Co-authored-by: SimpleStation14 --- Resources/Prototypes/Catalog/uplink_catalog.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/Catalog/uplink_catalog.yml b/Resources/Prototypes/Catalog/uplink_catalog.yml index 90d2a0e53e7..1e81cdf2dd1 100644 --- a/Resources/Prototypes/Catalog/uplink_catalog.yml +++ b/Resources/Prototypes/Catalog/uplink_catalog.yml @@ -494,7 +494,7 @@ productEntity: ReinforcementRadioSyndicateMonkeyNukeops icon: { sprite: Objects/Devices/communication.rsi, state: radio } cost: - Telecrystal: 8 + Telecrystal: 6 categories: - UplinkUtility conditions: From 8629041c94849b4abc8db33a85205add34a00ff0 Mon Sep 17 00:00:00 2001 From: SimpleStation14 <130339894+SimpleStation14@users.noreply.github.com> Date: Tue, 28 May 2024 20:48:30 -0400 Subject: [PATCH 018/155] Mirror: Updated the TEG page (#260) ## Mirror of PR #26170: [Updated the TEG page](https://github.com/space-wizards/space-station-14/pull/26170) from space-wizards [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `353784bfaed731b8a803a3191e51c9afaf6e5bb4` PR opened by Terraspark4941 at 2024-03-16 05:21:22 UTC --- PR changed 1 files with 166 additions and 13 deletions. The PR had the following labels: - No C# - Status: Needs Review ---

Original Body

> > > > ## About the PR > > Updated the TEG page to have actual information/meta about setting up the TEG > Ported from guidebook-cleanup branch on my fork > [ This information has been certified by a TEG-setup expert ] > > ## Why / Balance > > It made me angry reading the old page and not getting the information that I needed > > ## Media > > > - [X] I have added screenshots/videos to this PR showcasing its changes ingame, **or** this PR does not require an ingame showcase > > **Changelog** > > > :cl: > - tweak: The TEG page in the guidebook has been updated with proper information! > >
Co-authored-by: SimpleStation14 Co-authored-by: VMSolidus --- .../ServerInfo/Guidebook/Engineering/TEG.xml | 179 ++++++++++++++++-- 1 file changed, 166 insertions(+), 13 deletions(-) diff --git a/Resources/ServerInfo/Guidebook/Engineering/TEG.xml b/Resources/ServerInfo/Guidebook/Engineering/TEG.xml index a2a04e03ef0..9e8697a9e13 100644 --- a/Resources/ServerInfo/Guidebook/Engineering/TEG.xml +++ b/Resources/ServerInfo/Guidebook/Engineering/TEG.xml @@ -1,18 +1,18 @@ - + # Thermo-electric Engine (TEG) - The TEG generates power by exchanging heat between hot and cold gases. On station, hot gas is usually created by burning plasma, and an array of heat-exchanging pipes in space radiates away heat to make a cold side. + The TEG generates power by exchanging heat between hot and cold gases. On the station, hot gas is usually created by burning plasma, and an array of heat-exchanging pipes in space radiates away heat to cool down circulated gases. - The TEG relies heavily on atmospherics piping. The only truly special component about it is the generator core, the rest is all off-the-shelf atmospherics equipment. Note that while the exact layout may vary significantly depending on station, the general components and setup are usually the same. + The TEG relies heavily on atmospherics piping. The only truly special component about it is the generator core and circulators; the rest is all off-the-shelf atmospherics equipment. Note that while the exact layout may vary significantly depending on station, the general components and setup are usually the same. ## Generator - The main generator itself is a machine made up of multiple parts: the core generator and two "circulators", in this arrangement: + The main generator itself is a machine made up of 3 major parts: the central generator and two "circulators", in this arrangement: - - - + + + The circulators take in either a hot or cold gas, and pass it through the machine to exchange heat. The gas then gets output on the other end of the circulator. The generator produces the actual power and outputs it over an HV wire. @@ -21,19 +21,172 @@ There is no preference for which side must be hot or cold, there need only be a difference in temperature between them. The gases in the two "loops" are never mixed, only energy is exchanged between them. The hot side will cool down, the cold side will heat up. - ## Burn Chamber + ## The Pipes + + There are 2 major pipenets to worry about here: The Hot Loop (where gas will be burnt for heat), and The Cold Loop (where circulated, heated waste gas will either be removed into space or cooled back down). Make sure that [bold]both pipenets do NOT mix[/bold], as only heat should be transferred between the two through the TEG. + + # The Hot Loop + + As I'm sure a wise person once said: the best way to make something hot is to light it on fire. Well, depending on context, that may not be very wise, but luckily your engineering department has just what's needed to do it wisely after all. + + As stated above, there are many different layouts one can follow to heat up (or cool down) gases; this part of the guide will cover 2 common methods one will often see for the hot loop when the TEG is setup: The Pipe Burn, and the Burn chamber. + + Side note: Plasma fires burn relatively cool compared to, for example, Tritium fires. It may be viable to extract Tritium from an extraction setup (using a 97/3 ratio of O2/Plasma) and react it with Oxygen to get truly hellish temperatures for power. Although, this is just a recommendation; I'm not ya mum. + + ## The Pipe Burn + + Also known as the naive method, this is generally discouraged when working for efficiency. However, if all you need is a smidge of power to run the station, and you don't feel like setting up the burn chamber, this method will do. + + TODO: Remove this section when atmos pipes are updated to have pressure/temperature limits in a future atmos refactor. + + Most (if not all) pipe burns follow this general layout: + + Gas input -> High-pressure pump -> Pipe segment (with heater) -> Low-pressure pump -> Circulator + + + + + + + + + + + + - The Gas input is pretty self-explanatory; this is where you will input the O2-Plasma mix to be burnt. A 2:1 (67/33) ratio of Oxygen to Plasma is recommended for the hottest burn. + - The High-pressure pump serves 2 purposes; first, it prevents the burn from backwashing into the supply pipe, which would be.. bad, for many reasons. Second, it maintains a positive pressure in the following pipe segment, which is important to allow the burn to continue, especially since hot gases expand. + - The Pipe segment is where the burn actually occurs; to start it off, one can use a heater to increase the temperature up to the ignition temperature of Plasma. Afterwards, the reaction should be self-sustaining, so long as the Pressure and Moles supplied remains high enough. Be warned; if you wish to remove the heater, it will carry some of this superheated gas with it, transferring it to the next pipenet you connect it to. Best to space the gas through a space vent, if you must. + - The Low-pressure pump (whose pressure should be [italics]slightly lower[/italics] than the input pump) prevents [italics]all[/italics] the gas from passing through the circulator, which could result in the loss of the Moles required to sustain a burn. + - The Circulator is where this generated heat will flow to the cold loop; afterwards, feel free to space the waste gases. + + Note: Pressure pumps are used here as, while they pump on pressure (not flow-rate, which is comparatively faster), they are a bit easier to control when it comes to the limited Plasma supply on-station. However, the steps shown can be followed with volumetric pumps too. + + ## The Burn Chamber + + The burn chamber is the preferred method for heating up gases, and it is commonly used for other purposes too. (see: Tritium production) + + Most (if not all) stations have the burn chamber separated from the main atmospherics block by a 1-wide spaced grid, presumably to prevent conduction. The chambers consist of 3(+1) important parts: + - The Air Injector/Passive Vent + - The Space Vent + - The Radiator Loop + + Most normal burn chambers don't come with Heat-Exchangers; instead, they have air scrubbers (and optionally, an air alarm) to help filter for Tritium, which is a highly reactive, hot-burning gas that can also be used to heat the TEG efficiently. + However, this is a slightly more advanced setup than just burning plasma, as it needs 2 burn chambers instead of 1 (one for tritium production, one for burning said tritium), so remove the scrubbers and retrofit the burn chamber with a parallel array of heat-exchangers instead. + + The air injector (or Passive Vent) injects air (or allows air to flow) into the burn chamber. Either should be supplemented with a pump before it, to keep pressures high. + There is a notable difference between the passive vent and the air injector; the air injector can only keep injecting air up to 9MPa, which can be reached very easily with a good burn. Ideally, switch out the air injector for a passive vent connected to a volume pump. + + The space vent (designated as a blast door to space on one side of the burn chamber) allows waste gases to be expelled and destroyed. Open this to keep the pressure under control. + + The radiator loop collects heat from the burnt gases and brings it to the TEG. To maximize efficiency, hook up the heat-exchangers [italics]in parallel to each other[/italics], with a pressure pump at max pressure after the array and a volumetric pump before the array. + The pressure of the volumetric pump should be set to ( 200 / number of heat-exchangers ) L/s. For example, having 2 heat-exchangers would mean you should set the pressure to 100 L/s. + Finally, fill the whole loop with (ideally) a high heat capacity gas, like Frezon or Plasma. (Yes, Frezon =/= Cold. Frezon has one of the highest heat capacities in the game; so long as it isn't reacting with Nitrogen, it can actually be heated and can store heat really well!) + + # The Cold Loop + + As with the Hot Loop, the Cold Loop must also be setup in order to operate the TEG. However, the Cold Loop is usually a lot more low-tech than the Hot Loop; in reality, the Cold Loop only has to be "relatively" cooler -- hey, room temperature is technically cooler than the surface of the sun, right? + + There are 3 main methods you will see used for the Cold Loop: The Water Cooler (see: Liltenhead's video on the TEG), the Coolant Array and the Freezer Loop. + + ## The Water Cooler - As I'm sure a wise person once said: the best way to make something hot is to light it on fire. Well, depending on context that may not be very wise, but luckily your engineering department has just what's needed to do it wisely after all. + An equally naive method as the Pipe Burn, this simply involves taking some useless gas (in this case, Water Vapour) and flowing it through the TEG and into space. It's dirt-cheap and simple, at the cost of efficiency and permanant loss of gas. - TODO: somebody fill this out once we settle on a general mapped layout for burn chambers. + Setting this up is so simple, even Hamlet could manage it. Just take an output of a gas (here, Water Vapour), send it through the Cold side of the TEG, and then vent it into space. + + + + + + + + + + + TODO: Remove this section when gas miners are removed in a future atmos refactor. ## Coolant Array - A whole bunch of heat-exchanger piping in space. There's not much to say here: gas goes through and cools down. + This is the default method for the Cold Loop you will see on a variety of stations. Being of moderate complexity and having no losses of any resource, this [italics]should[/italics] be the main method of cooling down the TEG. However, every station at the moment somehow has their heat exchangers hooked up wrong, reducing efficiency greatly. (Thanks a bunch, NT!) - ## The Pipes + To use heat-exchangers properly, they must be setup in [italics]parallel[/italics], not in series (like what you see on most stations). A gas pump at max pressure should be placed after, and a volumetric pump before the heat-exchangers. + The flow-rate of the volumetric pump should be set to ( 200 / number of heat-exchangers ) L/s. - TODO: somebody fill this out once we settle on a general mapped layout for burn chambers. + Simply speaking, the Coolant Array consists of 3 major parts: An input connector port, a few pumps and the heat-exchanger array out in space. It can be setup like so: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - Connector Port: Use this to input a gas with high heat capacity; most of the time, Plasma or Frezon is used to do so, as they both have very high specific heat capacities (although most any gas will do). (Yes, Plasma =/= Hot. You can cool it down, and it acts as a really good heat exchange medium.) + - Input/Output Pumps: Used to make sure gas keeps flowing through both the Circulator and the Heat-Exchanger array. As the gas cools down and heats up (and as it flows through the Exchanger), pressure must be applied for it to keep flowing. + - Heat-Exchanger: Basically, just a bunch of heat-exchanger pipes in space. Not much to say, besides the fact that it cools down the gas inside it. Make sure the heat-exchangers are placed on lattice, not plating! Otherwise, the heat-exchange efficiency will be greatly reduced, as the heat-exchangers aren't directly exposed to space below them. + + ## The Freezer Loop + + Most of the time, you will see this method being used in efficient TEG setups. It's basically just the Coolant array, but replacing the Heat-Exchangers with a freezer. Even though the freezer does use power, it is only a small fraction of what the TEG can generate, and it's better than the default Coolant array at the moment, so go fish. + + Just follow the steps for the Coolant array, but use a freezer in place of the Heat-Exchangers. As so: + + + + + + + + + + + + + + + + + + + + Once again, use Plasma or Frezon in the loop for max efficiency (although most any gas will do). From b7583b3ed8aa1c693065a825d2e581db9c88c1e3 Mon Sep 17 00:00:00 2001 From: SimpleStation14 <130339894+SimpleStation14@users.noreply.github.com> Date: Tue, 28 May 2024 20:48:51 -0400 Subject: [PATCH 019/155] Mirror: Red Neck Gaiter (#214) ## Mirror of PR #25891: [Red Neck Gaiter](https://github.com/space-wizards/space-station-14/pull/25891) from space-wizards [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `1938768ea69ad2f69758036816142a205552eb63` PR opened by Nairodian at 2024-03-06 22:32:25 UTC --- PR changed 8 files with 41 additions and 0 deletions. The PR had the following labels: - No C# - Changes: Sprites ---

Original Body

> ## About the PR > Real simple. Adds a (shameless) recolor of the existing neck gaiter in a red variant and adds two of it to the AutoDrobe > > ## Why / Balance > I felt like a proper red face mask style was missing to go with the new cowboy stuff. > > ## Media > ![image](https://github.com/space-wizards/space-station-14/assets/110078045/bae039ea-7b0c-4d14-8351-c58ea164ad5d) > - [X] I have added screenshots/videos to this PR showcasing its changes ingame. > > **Changelog** > :cl: > - add: Added a new red neck gaiter to the AutoDrobe. >
--------- Co-authored-by: SimpleStation14 Co-authored-by: VMSolidus --- .../Catalog/Cargo/cargo_vending.yml | 2 +- .../VendingMachines/Inventories/theater.yml | 1 + .../Entities/Clothing/Masks/masks.yml | 10 ++++++ .../equipped-MASK-reptilian.png | Bin 0 -> 442 bytes .../Mask/neckgaiterred.rsi/equipped-MASK.png | Bin 0 -> 409 bytes .../Clothing/Mask/neckgaiterred.rsi/icon.png | Bin 0 -> 307 bytes .../Mask/neckgaiterred.rsi/inhand-left.png | Bin 0 -> 332 bytes .../Mask/neckgaiterred.rsi/inhand-right.png | Bin 0 -> 349 bytes .../Clothing/Mask/neckgaiterred.rsi/meta.json | 30 ++++++++++++++++++ 9 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 Resources/Textures/Clothing/Mask/neckgaiterred.rsi/equipped-MASK-reptilian.png create mode 100644 Resources/Textures/Clothing/Mask/neckgaiterred.rsi/equipped-MASK.png create mode 100644 Resources/Textures/Clothing/Mask/neckgaiterred.rsi/icon.png create mode 100644 Resources/Textures/Clothing/Mask/neckgaiterred.rsi/inhand-left.png create mode 100644 Resources/Textures/Clothing/Mask/neckgaiterred.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/Mask/neckgaiterred.rsi/meta.json diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml b/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml index d0ae444bf77..76ab0499170 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml @@ -34,7 +34,7 @@ state: base product: CrateVendingMachineRestockClothesFilled cost: 8050 - category: cargoproduct-category-name-service + category: Service group: market - type: cargoProduct diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/theater.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/theater.yml index 92e4032b0cb..bb21bc36d47 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/theater.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/theater.yml @@ -87,6 +87,7 @@ ClothingShoesBootsCowboyBrown: 1 ClothingShoesBootsCowboyBlack: 1 ClothingShoesBootsCowboyWhite: 1 + ClothingMaskNeckGaiterRed: 2 emaggedInventory: ClothingShoesBling: 1 ClothingShoesBootsCowboyFancy: 1 diff --git a/Resources/Prototypes/Entities/Clothing/Masks/masks.yml b/Resources/Prototypes/Entities/Clothing/Masks/masks.yml index 1f70211caa8..ad738792a73 100644 --- a/Resources/Prototypes/Entities/Clothing/Masks/masks.yml +++ b/Resources/Prototypes/Entities/Clothing/Masks/masks.yml @@ -514,6 +514,16 @@ tags: - WhitelistChameleon +- type: entity + parent: ClothingMaskNeckGaiter + id: ClothingMaskNeckGaiterRed + name: red neck gaiter + components: + - type: Sprite + sprite: Clothing/Mask/neckgaiterred.rsi + - type: Clothing + sprite: Clothing/Mask/neckgaiterred.rsi + - type: entity parent: ClothingMaskClownBase id: ClothingMaskSexyClown diff --git a/Resources/Textures/Clothing/Mask/neckgaiterred.rsi/equipped-MASK-reptilian.png b/Resources/Textures/Clothing/Mask/neckgaiterred.rsi/equipped-MASK-reptilian.png new file mode 100644 index 0000000000000000000000000000000000000000..88542905cfcfe65b7cebca3fe31c4d573ba03577 GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wk0|R4@ zr;B4q#hkadHu^OOh_F3~f6UnX|KM5h52X@ebpCp@BY?F y7w^xTCu(n6=qDVID!sz*$hw}A@!`Oc`yTz+vR@9N{n zE*^&rKbI-pQF$g3n4qU=WUkEKs%MLD#Z zZk_o0`oia5kLkHKS_HqDeqhys2_MZT2w$kTPmxIHy1kW`;j4=Agpkx^x%5@WZ}UID zjAQ(8i~ZJ${@{7Z^|qVerL6bcJLT7dS=>zue^~vm@kOwi|M*%B^e}^`tDnm{r-UW| DT{(Is literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Mask/neckgaiterred.rsi/inhand-left.png b/Resources/Textures/Clothing/Mask/neckgaiterred.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..5a37ace23e68bc693b636d6409220d71466ae9ba GIT binary patch literal 332 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAQ1G9p zi(^Q|oVT|Oxehr9v_1^f*}}mcrWA2RFSJNJdi})iincBHT(!B6T7@c1Ez91j;K6ct zX2yg6zxH^hi3gqO02%=T9UEur|Cvy9{8r=Zmp;~)Ov3jv?ko<{3)UB^&wBW?Xy&gw zmc7@j4L5R}ojduIXkE2cPg2o0U)xoi4n29r{>nUIs)~|QQBL&KJrjhBwyrc+*l{nv ze(Gh{y^On0M*@wz-ttZV^eb@=h-C~60!!a3y5;OW_=Y{=YH)7DQxIFTBvW=g7$k77w1alox)LiaTPwqe^_Pj7i_IlP#X+b7olx zXaq!g{@X9=w13Z*)CzwVpvgesF!O9qT+6wH#hK?OzU@AJa!chbhFQBhZt7VRp}?mu98-qj^V@HpS1 zujikb?0kJi?7_dva&M82+`QM`1@*hP@jVXKw`~8!ZPGSP9AYs815d+yHW&HVk=u`* z`Y})PMe^QbtQ?lcA8!9HUs`0hz~{xxMxW3p58qXW$lX3IB)3Fy;F)U1Hi&=O7 qrO+2!;}7A+Tnno{eEG+CV4?o;F1P-kci&%v4EJ>Pb6Mw<&;$TKbd<9I literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Mask/neckgaiterred.rsi/meta.json b/Resources/Textures/Clothing/Mask/neckgaiterred.rsi/meta.json new file mode 100644 index 00000000000..9094fa918f0 --- /dev/null +++ b/Resources/Textures/Clothing/Mask/neckgaiterred.rsi/meta.json @@ -0,0 +1,30 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Originally sprited by belay5 (Discord) then recolored by Nairod (Github)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-MASK", + "directions": 4 + }, + { + "name": "equipped-MASK-reptilian", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} From 6657aeabf1b3bce929acfe4fcd2e7254202b1836 Mon Sep 17 00:00:00 2001 From: SimpleStation14 <130339894+SimpleStation14@users.noreply.github.com> Date: Tue, 28 May 2024 20:49:07 -0400 Subject: [PATCH 020/155] Mirror: Add PVS command permissions (#207) ## Mirror of PR #26124: [Add PVS command permissions](https://github.com/space-wizards/space-station-14/pull/26124) from space-wizards [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `361092a40b110049b85187e935f4eb531f36a99f` PR opened by ElectroJr at 2024-03-15 03:05:58 UTC --- PR changed 1 files with 1 additions and 0 deletions. The PR had the following labels: - No C# - Status: Needs Review ---

Original Body

> Requires https://github.com/space-wizards/RobustToolbox/pull/4958
Co-authored-by: SimpleStation14 Co-authored-by: VMSolidus --- Resources/engineCommandPerms.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/Resources/engineCommandPerms.yml b/Resources/engineCommandPerms.yml index 15200531e3a..51743c6e822 100644 --- a/Resources/engineCommandPerms.yml +++ b/Resources/engineCommandPerms.yml @@ -67,6 +67,7 @@ - scene - replay_recording_stats - print_pvs_ack + - pvs_override_info - merge_grids From 159ebe44fd7d543990a0513bbec3e01e2d49557a Mon Sep 17 00:00:00 2001 From: SimpleStation14 <130339894+SimpleStation14@users.noreply.github.com> Date: Tue, 28 May 2024 20:49:35 -0400 Subject: [PATCH 021/155] Mirror: fix admin verb to set unspawned ballisic ammo count (#375) ## Mirror of PR #26411: [fix admin verb to set unspawned ballisic ammo count](https://github.com/space-wizards/space-station-14/pull/26411) from space-wizards [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `451890b85b49e17a0019d107db4a31a48cdd3518` PR opened by IProduceWidgets at 2024-03-24 21:06:57 UTC --- PR changed 2 files with 15 additions and 3 deletions. The PR had the following labels: - Status: Needs Review ---

Original Body

> > > > ## About the PR > > Fixed #26362 > > ## Why / Balance > > > ## Technical details > > I made the UpdateBallisticAppearance function public, I can't think of any reason that's a bad idea. > > ## Media > > > - [X] I have added screenshots/videos to this PR showcasing its changes ingame, **or** this PR does not require an ingame showcase > > ## Breaking changes > > > **Changelog** > > > > :ADMIN: > - fix: setting ballistic ammo counts for a magazine should no longer be able to crash your game.
Co-authored-by: SimpleStation14 --- .../Systems/AdminVerbSystem.Tools.cs | 16 ++++++++++++++-- .../Ranged/Systems/SharedGunSystem.Ballistic.cs | 2 +- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/Content.Server/Administration/Systems/AdminVerbSystem.Tools.cs b/Content.Server/Administration/Systems/AdminVerbSystem.Tools.cs index c68336deab8..9d66338c8bf 100644 --- a/Content.Server/Administration/Systems/AdminVerbSystem.Tools.cs +++ b/Content.Server/Administration/Systems/AdminVerbSystem.Tools.cs @@ -718,9 +718,21 @@ private void AddTricksVerbs(GetVerbsEvent args) Icon = new SpriteSpecifier.Rsi(new("/Textures/Objects/Fun/caps.rsi"), "mag-6"), Act = () => { - _quickDialog.OpenDialog(player, "Set Bullet Amount", $"Amount (max {ballisticAmmo.Capacity}):", (int amount) => + _quickDialog.OpenDialog(player, "Set Bullet Amount", $"Amount (standard {ballisticAmmo.Capacity}):", (string amount) => { - ballisticAmmo.UnspawnedCount = amount; + if (!int.TryParse(amount, out var result)) + return; + + if (result > 0) + { + ballisticAmmo.UnspawnedCount = result; + } + else + { + ballisticAmmo.UnspawnedCount = 0; + } + + _gun.UpdateBallisticAppearance(args.Target, ballisticAmmo); }); }, Impact = LogImpact.Medium, diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Ballistic.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Ballistic.cs index a8f7ee23956..91aad895821 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Ballistic.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Ballistic.cs @@ -261,7 +261,7 @@ private void OnBallisticAmmoCount(EntityUid uid, BallisticAmmoProviderComponent args.Capacity = component.Capacity; } - private void UpdateBallisticAppearance(EntityUid uid, BallisticAmmoProviderComponent component) + public void UpdateBallisticAppearance(EntityUid uid, BallisticAmmoProviderComponent component) { if (!Timing.IsFirstTimePredicted || !TryComp(uid, out var appearance)) return; From af3d9350c445542fca53a9284eb8b4e85a8e88e6 Mon Sep 17 00:00:00 2001 From: FoxxoTrystan <45297731+FoxxoTrystan@users.noreply.github.com> Date: Wed, 29 May 2024 03:06:42 +0200 Subject: [PATCH 022/155] Glorious Tools! (#407) # Glorious Tools! Add//Change a bunch of tools sprites that was in the tool category to make them fit better in general, Old TG... please update.exe Anywho here they are! --- # TODO - [x] Import Sprites ---

Media

![image](https://github.com/Simple-Station/Einstein-Engines/assets/45297731/233559ef-0367-4836-a258-d41e481cba4e)

--- # Changelog :cl: - tweak: New Tools Sprites! --- .../Textures/Objects/Tools/crowbar.rsi/icon.png | Bin 174 -> 371 bytes .../Objects/Tools/crowbar.rsi/meta.json | 2 +- .../Objects/Tools/crowbar.rsi/red-icon.png | Bin 200 -> 446 bytes .../Objects/Tools/drill.rsi/drill_bolt.png | Bin 886 -> 702 bytes .../Objects/Tools/drill.rsi/drill_screw.png | Bin 887 -> 691 bytes .../Textures/Objects/Tools/drill.rsi/meta.json | 2 +- .../Objects/Tools/geiger.rsi/geiger_base.png | Bin 427 -> 467 bytes .../Objects/Tools/geiger.rsi/geiger_on_ext.png | Bin 228 -> 260 bytes .../Objects/Tools/geiger.rsi/geiger_on_high.png | Bin 176 -> 218 bytes .../Objects/Tools/geiger.rsi/geiger_on_idle.png | Bin 173 -> 218 bytes .../Objects/Tools/geiger.rsi/geiger_on_low.png | Bin 176 -> 218 bytes .../Objects/Tools/geiger.rsi/geiger_on_med.png | Bin 176 -> 218 bytes .../Textures/Objects/Tools/geiger.rsi/meta.json | 2 +- .../Tools/hand_labeler.rsi/hand_labeler.png | Bin 273 -> 479 bytes .../Objects/Tools/hand_labeler.rsi/meta.json | 2 +- .../Objects/Tools/multitool.rsi/green-unlit.png | Bin 123 -> 176 bytes .../Objects/Tools/multitool.rsi/icon.png | Bin 359 -> 540 bytes .../Objects/Tools/multitool.rsi/meta.json | 2 +- .../Objects/Tools/multitool.rsi/red-unlit.png | Bin 117 -> 175 bytes .../Tools/multitool.rsi/yellow-unlit.png | Bin 121 -> 174 bytes .../Textures/Objects/Tools/rcd.rsi/icon.png | Bin 638 -> 857 bytes .../Objects/Tools/screwdriver.rsi/meta.json | 2 +- .../Tools/screwdriver.rsi/screwdriver-map.png | Bin 262 -> 310 bytes .../screwdriver.rsi/screwdriver-screwybits.png | Bin 152 -> 225 bytes .../Tools/screwdriver.rsi/screwdriver.png | Bin 227 -> 223 bytes .../Objects/Tools/seclite.rsi/meta.json | 2 +- .../Objects/Tools/seclite.rsi/seclite-on.png | Bin 287 -> 260 bytes .../Tools/seclite.rsi/seclite-overlay.png | Bin 121 -> 279 bytes .../Objects/Tools/seclite.rsi/seclite.png | Bin 286 -> 321 bytes .../Objects/Tools/spray_painter.rsi/meta.json | 2 +- .../Tools/spray_painter.rsi/spray_painter.png | Bin 518 -> 772 bytes .../Textures/Objects/Tools/welder.rsi/icon.png | Bin 290 -> 568 bytes .../Textures/Objects/Tools/welder.rsi/meta.json | 2 +- .../Objects/Tools/welder.rsi/welder_flame.png | Bin 181 -> 255 bytes .../Tools/welder_experimental.rsi/icon.png | Bin 564 -> 907 bytes .../Tools/welder_experimental.rsi/meta.json | 2 +- .../welder_experimental.rsi/welder_flame.png | Bin 295 -> 247 bytes .../Tools/welder_industrial.rsi/icon.png | Bin 345 -> 462 bytes .../Tools/welder_industrial.rsi/meta.json | 2 +- .../welder_industrial.rsi/welder_flame.png | Bin 296 -> 247 bytes .../Tools/welder_industrialadv.rsi/icon.png | Bin 396 -> 548 bytes .../Tools/welder_industrialadv.rsi/meta.json | 2 +- .../welder_industrialadv.rsi/welder_flame.png | Bin 297 -> 247 bytes .../wirecutters.rsi/cutters-cutty-thingy.png | Bin 217 -> 239 bytes .../Tools/wirecutters.rsi/cutters-map.png | Bin 331 -> 411 bytes .../Objects/Tools/wirecutters.rsi/cutters.png | Bin 228 -> 231 bytes .../Objects/Tools/wirecutters.rsi/meta.json | 2 +- .../Textures/Objects/Tools/wrench.rsi/icon.png | Bin 230 -> 484 bytes .../Textures/Objects/Tools/wrench.rsi/meta.json | 2 +- 49 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Resources/Textures/Objects/Tools/crowbar.rsi/icon.png b/Resources/Textures/Objects/Tools/crowbar.rsi/icon.png index a8c6cb3f8da55d48bca152d2e4851161987be7e3..436a75975b342462fdf8cad0071754919d2338ac 100644 GIT binary patch delta 356 zcmV-q0h|7=0rLWo7=H)`0001UdV2H#000SaNLh0L01m_e01m_fl`9S#0003cNkll{#&5lX!-nn|g9 zhv#!v(AOGG7z7F90u1grCDQBmX~$%sdnAxBDj>seublQUwmTi#m8%uu8Dj$cYiDq_ z%A)P~um^N8BA{EjyxAbz-G;~_u?1eOoX^-D(*ANj2}d)Q01ux{rcdE~XY3e;g}+NA z0aNfu0w&=f3tgCoen;h-1sVbgC1MVN2M)YY zX;{?Y=pq=($gDhz$wWIq)|5kpW0AH%prdhPpg`zBaRo+(5;2aK5iBuElru`WV*><}y)L~30k z4<#P@G3^_7WcEk7>KldF?`4<=%jYw@GxIh9D^4sB3;b_^2-kES z(wP*WzrGBh+kIfRb?1>#A|S)JvzbZ#sBnUVM}l0SlH6jC4%{&EaB*JeH6epFHxmg` z0fg`6lCbW=ombB5I2KDKUfVxB@H|5%AmFLZGz`lX_#TbGW^a6zySl+}4}^t8K)`o& z4Qh>BFdg`{3xAjM^xOx($if2h%Kw62nN7g&{`L9cIhqRz$naLD_bXi9^<>8|Dtubz z5}<<5B|r(ES%4ZolYk0%WC2z1NCGP10Reyi#$aQ4cN)n?^^6=I5Wr|sClg())4t(% zJ2gC1;NG(MD7qHHv76Zn-~j>rWx~!i78%z#+;@E{6Dh#BFy@;pOXw+34V@~m%)|mK a7x)1^VdyatfcNqM0000lQ)B~wG&!lQ;BpBG j5H&F1TBIeR!oaZTJ&*r8>HKp*s~9|8{an^LB{Ts5G#oeh diff --git a/Resources/Textures/Objects/Tools/drill.rsi/drill_bolt.png b/Resources/Textures/Objects/Tools/drill.rsi/drill_bolt.png index 6fb3b4ab8e659efb01b14ea9eeced1fc55ef8f2c..d7e908fa9c611ea973be719440c86db90fe95254 100644 GIT binary patch delta 678 zcmV;X0$Kg`2EGN5B!3BTNLh0L01m_e01m_fl`9S#0007TNkl)_bF+d?TN9| zXCVqj7NK~!dG(LJ``Kvk8X=?s_?Sh6RES6}L^dv$QJ@>J_~gUkF+>cALVP1Xp$m~b zwg6d3vFf)?)AZ8mG=@h_w*K^tfB$G>>CrS>F1oZ)9)DIAAj5TCRt}Hq+ejp!*=(jV znT+?@c}I@m6|A7dyii>1cme*hMR_4{G^8SEdEV;2MdPAx;h4se0!XA(^uoWF4}_t- zJj>i)SnoYYD<6n5NHLZ3kAbym68B%nufaTtn81zs4C{B;95*~4NJ=WAxVTO3fo)Q= zS^Lhk|9?edm3upfA!lo9<69D6YO4JR`bL|w@Yp#T5? M07*qoM6N<$f`msr{Qv*} delta 863 zcmV-l1EBoA1@;DzB!2;OQb$4nuFf3k0009pNklInD(2OxQ zts!k}GcG1G$z&$U#4L2-x4Gw@Iro0woO|vA{^LLXGK5Bg`+xiU)zdp3HB55+%5qg6 zj}ube_WS)D9r9X(@>4bE2oY1OiSU#Y0LZc|loR{?ek4gE9*+a?>-(L0nk_hTR3L=g zR)hy&aB#5Pr|Q0NI7~DerK_upa5xM=!LR8Zy57g=#R*eeiP1|Fph8}7b2zYUE5ZXH zNs{3R1Oj9-8Gj^6LQxa|W@cs#yYRD=Fx@Wqm7_3U@-O1zVAnFCVY3KNDwSe#a?&&~ zm&-9eHin`oh@!~1A~`@|4vSrwgOPJjtpdtoQ*)5Xx=FoRHpO@VlF6juh(scQw)W|C z8i3y3USe=qX&srY=8FX-YBqcvxKX?g{8$$#;mT~dS*Yw zdGuHtT5U_#6%ZPBs|Wga*?w~^CCTT$*iNce*bnb6HGUM|I^kA#?s3t+23EJisuozt z*WKDC6jXui0%WrA^11ags#^nDMWuBCR;5WT~U1=C8HLw5x002ovPDHLkV1kCMo$vqv diff --git a/Resources/Textures/Objects/Tools/drill.rsi/drill_screw.png b/Resources/Textures/Objects/Tools/drill.rsi/drill_screw.png index c51ae6332b212cb66cd2b9d58ffe841152d0d747..0951ee8d9b7a5d07f776e4d62489a86da62cd2a9 100644 GIT binary patch delta 667 zcmV;M0%ZO72D1f_B!3BTNLh0L01m_e01m_fl`9S#0007INklTD1rg8#IW}-YVV{Jb3ojv!@(9dhnEUZ=O9wkY1J*3Z;}D6dNfNwM|$B z8%b1huq*`H?aZvZZno=YXEsF&ez2Lp&3xayH*ep&k6Xr_0DoZtV-wTn>TFq>aAr9l z6BfWo?fzssg`w0(De`-5T~JqGxXg z`HsN{(gKb?yoL6@=8PQyWMI@}g!_jD=*4}I{%5>@T0Z0J?DTej#8efI3v4R{fe?lMmYr56I_fOIM0nP@pzfYW*1CRd%_iZCH+$oM z&AmBN~ID@BogL{{+Wj0bF3oA zt&m;3vH~o(1z90-He@1L`-H%R1e%tP^V?c11DYuXt?>WV1Ab6f#<=-2n~mR*st1BL zWEe_WVLk5;PX0v#}Kav!jQU=T|A)Qfdksp_;_yEdKegaT$uzu zf-iK|z>m7sBp$_1!1wsi}dNtxp?k3$`&p{SKE@&31uz>R)HU40? zIix}YHi|8HSM9qhI-1uos%^ax>0(fl z;B6z_h^Vzgu~6D7-l4V@Z@6^bT@_tO1^o$L7a~O(NUY$-Si2~c3L;`9A-eEJg7z3= zZ5!IgHsfMC(`06nOw2+TzMFH-%zM7?nKS1G|Mg#gSyDOXj(?60_4JNMWhXg)d9h%g zDkn+xx}qo??eE6p0XI0PzWBsYiK7i}S2dh(v09$H&l z@pwEmG&JDz`F{{XAcSCabkwM4XH>E?8icttD?6=uv(qZ`lP(T6La@)BXRZQBCXDB;PFNd8z?y~^gKOSacQmg-%hJQDaEawCHzo6jqXl`y+0TPJ> zot>Qw4{I}h@Z_r;R87?@wem}9`PqiLrM9Gf{kzYqC3#T*I}m^y`#)Md+qY=tJ@q<) zKmdSLDrI=zC$UWq4)%ei-(!HhPijG@c5BJbcwP{Fr+K6PsFB?3^%~wn$sGZhK}MF^ z9SdVBz<<^)%bsvT?}wy4(GPb(?*#eu7{xOn!*dbY)}7evU3A=6?euS4|rw)@}CT@>H`h|H+8znqAN2 zhd7TOYh4R1$&vuUKDTdrkbJZoTe4Xmn$ zxlGBWou{lSk)DH}X?XeEdKi_Q18JdBGY2bbAX8RqT`Kc)ke;@GTNI%GYZGhJYmHf5 zUs+%OM+kvI?SQJStz~&LcK`qoi^UK^Fm&m4-gAA~IhB4undNvHS~nYE>nm4|?gRQ= qpb~k#UgJb93qXgc6u>U|KcU}Fxn=bu4hl8^0000{|4DTONe+1a>N!JKhO*_DAplC8AbFZPVBI}thKgyy3>%CfsU8Mkxgul!D%v_gKuD6o z%wrY9zR3b$OOXLc93;vs4?tfV3_}bwhp-P@F&BR{d@(jyho2IRF5fzm3J^`Cjn= O00000fhe31FHj&Ie%SAL_t(|oMT}aU@+={Q3s4VVCXu)+(`F7jD7OlWk$L>0A#tc zf((PQqAbJR`;S3F|H*X($qv|9!}s4SR*AtT@*czi51ud_S+2yeZSlkZ{w<$Kb_7Wd zfLQJbwj2a@?LQ8tLHr}j9T_$<>?hd~B!>Xl=fL2{CSK*mKz}kAdbwb6?G1+5X6)kE z&vMe%0igH=rGrB=o-i=++rh>EeLTdlV-qI>%@ZLEfGlsCB@WJlpqx;b26D`Pa*QHB z4Ztjilml$!8biJVV3vbu28NgPb-;opTN$oh_{Y$m!^}`Qb|fr6=?E{-7{-fw#y`4|*Aa+tdp{jdMj^@T}ox8Y6Y;*Gw?ntnQRo?FV$JhO!> zbFJsE!{y8!9vT2 delta 211 zcmZo+dcrtCvYw5BfuXvubRCdlOY(MiVfYV%3-&Ib3>4uk@Q5sCVBk9f!i-b3`J{n@ z>?NMQuI$e^S%i!%Lb7dM0EG%YT^vI)?!CS4%hjMD(DqQUN$-Iqlk)p|fyF0`cknB2 zsI}*A*XZ~jS!W>6yh~D$;lOd9w+=5;cIf(a8(sTmdg|z5*Jq}#t5~01n`bnA@}6xC zr%!&aW(1ndus_kndGhwBGrlUW+!gZt=cYUxSq6p!$z`2|0#Z`ZHy?u3c)I$ztaD0e F0szMUPVoQ$ diff --git a/Resources/Textures/Objects/Tools/geiger.rsi/geiger_on_high.png b/Resources/Textures/Objects/Tools/geiger.rsi/geiger_on_high.png index 15edc91e52938302e7edd8e02013a69dd0304f09..7b160b48d7b2c8cc6397a18f7b7ac306120d6d78 100644 GIT binary patch delta 201 zcmdnMc#Cm@WIZzj1B1(wu46!ou{g-xiDBJ2nU_EgOS+@4BLl<6e(pbstUx}0fKQ04 zJEPDBA4rj@Q5r1N*@7X#;MwT(m+9H zPZ!4!3;(xg9Jv@2I9vkV_x_*hJlCmL(6#!$TI>8r{K8YtJ20hZt#%0A`1j%LBMdiG rH|$Bc<8}TsQ~Ile2U${^9_(Y#pTWP@hJh;c#Cm@WIZzj1B1(wu46!ou{g-xiDBJ2nU_EgOS+@4BLl<6e(pbstUx}0fKQ04 zRHRA5{=|hZW=q$a0L2y_<+%r>SWANZg8u^n!|!c;!9W4d0*}aI1_r((Aj~*bn@<`j z=~ t8>$=jB;4^j|CuTM)xm=-sZ9^|G3d|WUu(m_6$>wzucY)XHkaDv_x3l~-)9aVawq}%IV9;TYP-H!5vESq{&?E*=S3j3^P6#WLC0c}brt@5zopr0P09Y!~g&Q delta 159 zcmcb`xPftkWIY=L14D6D)fXVemgMd3!tfsi7wla=87RV8;1OBOz`%C|gc+x5^GO2* z*-JcqUD=;;vIwaPbp;o$01DZ9x;TbJ98OM*M66Z9+7 zHcnXl@|bs`&Z2zx#l>I+Ty6(7fT|@LbQlgTe~DWM4fY=JY) diff --git a/Resources/Textures/Objects/Tools/geiger.rsi/meta.json b/Resources/Textures/Objects/Tools/geiger.rsi/meta.json index 10968b47768..11fbd436814 100644 --- a/Resources/Textures/Objects/Tools/geiger.rsi/meta.json +++ b/Resources/Textures/Objects/Tools/geiger.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/bfc9c6ba8126ee8c41564d68c4bfb9ce37faa8f8", + "copyright": "Taken from Paradise https://github.com/ParadiseSS13/Paradise", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Tools/hand_labeler.rsi/hand_labeler.png b/Resources/Textures/Objects/Tools/hand_labeler.rsi/hand_labeler.png index 9938103840821ec610fa3ff217b4c8a3965985b5..77fbcef30da736b4008b8a3c372a3bc43424dda2 100644 GIT binary patch delta 465 zcmV;?0WSWL0^b9W7=H)`0001UdV2H#000SaNLh0L01m_e01m_fl`9S#0004zNklemU<3GDd$a17H9QfPVo<4NzIH`SS1PK|S+p z05HGt8cI(GA~67)JI+#|@4AgZDp4?r0bo8cIi>W`!?p58o!+l6BNItI1Fn0n0I;&9 zc>xh71%Tt*sqE5rb8}E%I;UjiSHvEyd#@fnKRt>km36gO(|UlB34nZV?TE77VYT{w z2@T0M^3ds*gcK z#QB+7>U8hL;OUBwObYLBY7ytuc0MhCc1U29O3BXS800000NkvXX Hu0mjfc3aR= delta 257 zcmV+c0sj8q1Caud7=Hu<0001iRA0W=jG90004WQchC>1bUyXb7osrRTWf8T3TAh z%$aRnU0rPu+4l1C&c#Y*vu4ej1`z diff --git a/Resources/Textures/Objects/Tools/hand_labeler.rsi/meta.json b/Resources/Textures/Objects/Tools/hand_labeler.rsi/meta.json index 216140cec3c..3c793a97322 100644 --- a/Resources/Textures/Objects/Tools/hand_labeler.rsi/meta.json +++ b/Resources/Textures/Objects/Tools/hand_labeler.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/tgstation/tgstation at commit 44636483b7b2868b3e42c92205539f11f6d7968f. Inhand sprites by Macoron.", + "copyright": "Taken from https://github.com/ParadiseSS13/Paradise/. Inhand sprites by Macoron.", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Tools/multitool.rsi/green-unlit.png b/Resources/Textures/Objects/Tools/multitool.rsi/green-unlit.png index fccc17e9193e7371d0b0630e1eb19d25699ad886..d0bac8b61eb217c36e109147a9aef63d1eee1b10 100644 GIT binary patch delta 147 zcmb>4z&Jsrp0PN{-HBn{IhmIX3=Aykj=qiz3>*8o|0J>k`J4qFk;M!Qe1}1p@p%4< z6riB1r;B4qgnP0C>*55Fo~A&9M~uo-)Fe;LH~OJp_1SXD@dF>CVkbRZc$0O~+2p26 r%xr9T7@;b;+zx6;url*VNHBa4V`uyJHVQ!P zknI2k6Nmr)-u?^|8w(lp>-+z2+`5tB!I=Y$baMa*IM|poYy>(4OamQ24j|b9AfLn7 zGv+Knp+R!L?!04o_TduIAwiM@Ko<13w=oQ1VBm+atXRtgeU}zRZprF2sL!2%S zaIdFoI+uEIRNu9ENg<~)QlJyQVO2Y#sQ#22C@ufvA`rThFdnDfl(0*wj2a(qCPSl zS;kL_k>r&FAaLg7KA?^AU_K~Hl6wAuEx&c{GwmGEw|x5=u!7P04+?6Pr8;nNP@+7t zi~($U*P_o1`)=K(O>GDQ>)wkoTwSP!QXzpVDFomq$vm>MVMa;N@Ij92f!S`KqW9VE2B{dj5>gt002SGvy^e9L(~8O002ovPDHLk FV1oM6-}(Rm delta 333 zcmV-T0kZy_1m^;fBYy!dNkl9ReWB7cQ1V z2*l1|m^ej{VaE>A%pp4wQVUR&1_ZBsq1YK@Ibh?)_Y4!K++kqIQGttr_#knbJ3wB3 zCL<^z-napE1QdYy_wV0iaBw)l$iP5{f{0pxYzJs)K(b>*8o|0J>k`J4qFk;M!Qd`Cc-ajG_- zG*HmR)5S3)!aZ4nb#a17Pg9`5BSz&ZYLa^Kfnzk|bp- tk^2+Y$^CLy&Hg}(43Bp`BuUb*fDJgg0_WdhT?zmI002ovPDHLkV1lX&C6oXF diff --git a/Resources/Textures/Objects/Tools/multitool.rsi/yellow-unlit.png b/Resources/Textures/Objects/Tools/multitool.rsi/yellow-unlit.png index f890dbd413ae102ef91ec7bd277c61418e501d93..911fad308880b654934332ff45ebbcf8b58f6059 100644 GIT binary patch delta 145 zcmb*8o|0J>k`J4qFk;M!Qd`Cc-ajG_- zG*Hml)5S3)!u{BlG!?8#U|^qcponco-h=&1UtS7fXn4z?$ xv&{X75ht6?t6i=713feBzTPzf004iIv;nEo2J8>CYB~S_002ovPDHLkV1gJ+CH4RS diff --git a/Resources/Textures/Objects/Tools/rcd.rsi/icon.png b/Resources/Textures/Objects/Tools/rcd.rsi/icon.png index cb62979010f4ddc12341edfdbc08a6cd69426857..3913af251881e2963334cf77daeb8f931c9ab74e 100644 GIT binary patch delta 835 zcmV-J1HAnH1lb0VBYyx1a7bBm000ie000ie0hKEb8vp^i_2mJfr(;6A1|>z^dX3m50yQvLg7P@y-9%zefhAF1R)VdzC?^5 zSRh!stPCt@D4R(_pc$J{!ZO`+W@mIAcXza~9`?X;@7%q2&VTRz&$;K$Cj4Vd1Ec}c z00{w_j+UrW#TM>&j+SwIsdN~}ZUk)`0zl3^XHIj!p|YCW(wsuP2GqX^ku(I~KgirF zW4pO^9FQ5RX<*S%CzYjwH37H}N~+fTl5i0@cY5sDv0q9FkV>&t6(}kyKyxopH89Q3 zli9V*2qXOb09N)%R;>qj+ z9Iy6cWJF}l*Ln`yatK`wxxE{eCqiiJvj9LzNI4LWJ?kKbLINVXph+JL3?UqrV)KSj zSFT{PBMa~q8}plcbNC%?jj)yjG!sct0;o!pX~9D=)f;v|&g?8z=fGc(cB1zTX> zX4U&xQ-3UbXD*D*Oem|q(*$78G*8Of8{$0BjhvH_yp&|_!mUDHg?AYKGz+^c50M|* zX2>}~h{LM}-^-2e4&;k4ycrx8@=kHgDdTaaTW#wL*}M=^iv>lFr9@6< zmMQqqbFmVW_WKKIi?wf4N1A*dyzaOg!xWC^Q4 z-r!eh$^Q;CFy}~9;1^$O1KkLJTj@G$8ljQ6oo${78KPehM{Q?n4v8l3~IZQVyS|O zOe`f+7Pk5iutfX@vmhjtF$*lsT5uay7lDV!K>`m{S-_DTMU`00@Ng2>aS~7 z=RPOz%elvnCCjpyr!LHO_XWTLU;zMJOj`&}^e{R;Q>p-5@_)<7TbA@+08T!^<6T(W zfNt(S084E+IM%~iLZku!w7!YjJNp7a#)IOHfRLs{SlS#9n*cBjBLsM~J^qW=t_pW1 zsov1TaS$UN&@>JEhYIci0C`pPduoGLv+&!6fkTm2uZep6QPiC~@USo*B5@U%rYSj& zgXej?wl!=QPJiDQ`s+Ql(Lc7``0Mi!(33p@;x+|D_roC66CE&3Ge&Dw^$-f=?~2X4 zxl2wH!fFKCaG%XSCnE>cz zOR610WnVviOaMU;jOZ@QHjT^!83fy{-4Czb({zh|uBwGM10Ok(x3+A2KBmwPTod5s;07*qoM6N<$f>`(+ A5dZ)H diff --git a/Resources/Textures/Objects/Tools/screwdriver.rsi/meta.json b/Resources/Textures/Objects/Tools/screwdriver.rsi/meta.json index 17ec25991ac..47fc7c177ee 100644 --- a/Resources/Textures/Objects/Tools/screwdriver.rsi/meta.json +++ b/Resources/Textures/Objects/Tools/screwdriver.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from vgstation at https://github.com/vgstation-coders/vgstation13/commit/1cdfb0230cc96d0ba751fa002d04f8aa2f25ad7d", + "copyright": "Taken from https://github.com/ParadiseSS13/Paradise", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Tools/screwdriver.rsi/screwdriver-map.png b/Resources/Textures/Objects/Tools/screwdriver.rsi/screwdriver-map.png index 2bede8bc3b0708beedbacbd88aa4a50e20c463aa..86ac05b87ed63916f9001d1d8653a3dd60ab51ee 100644 GIT binary patch delta 283 zcmZo;+Qu|NrJl3EBeIx*f$smm{q4U4bWFDzvA+^c ztoZqhcg8WMf6CTOM;Ytw?b$9X#OGGFO0wR!-{TN?oF{~xsbAi{VRhx6PmIiV1<$XQ z-ckJU_nMQN-`0wP0=s`bnHS>O40l)w@CJA1X=pMib0xIhKe+0TRoK=k4F{+5y2~Pb d^o5NAIEMm%7|7681arT;-RBP%yt?Emkt zC~BCwL>WFDEMr7g|M_$`R`c)y7HpR1xIl!>jCA1Qr_P;)v*$exMR6#XW+cPU#|OxY zObi$ESvCA;lQ4luvT(u0|Nr@h(-3AJDTcpao-zD-afZQ?_hUF*Tv%8bMV*+K7=xsw zBtv<5Iow{15C8>rs`^nd+sw!qE{-h(zFl7qra>X_=lv~)PsbVsu2pa1{> diff --git a/Resources/Textures/Objects/Tools/screwdriver.rsi/screwdriver-screwybits.png b/Resources/Textures/Objects/Tools/screwdriver.rsi/screwdriver-screwybits.png index 565ebc24f66a0a622c01e1fca2073a35928b7c33..f018f39ffdf86e95555561dc5ac713ac8238a8b5 100644 GIT binary patch delta 208 zcmbQi_>ggeWIZzj1B1(wu46!ou{g-xiDBJ2nU_EgOS+@4BLl<6e(pbstUx}0fKQ04 zqqApOZG(!MX78jaK(R#+|Ed5f){-E<;Qv6t@Ov9yFi?QAz$3Dlfr0M`2s2LA=92~r zdU?7yhFJK&?eXMdP~c&H`{}=V_AD(=r4Dz&Il;61qW>HaKjH1f*u#C3D>6HtKd&A^y^Ls8q476>gTe~DWM4fk7GtS delta 134 zcmaFJID>J5WIY=L14D6D)fXTY@9E+g649D0!MZp>q^Bv+fXnTm1G8JsxA3sAf9x02 z+>RA&41Rv@(9O4R-$s0$$h;y=fM>_<-T&J+wzjqgJ~?vah=hu&s^qEDryqXftKfi| jpdrDkEMs6`z`(HczYt4S{^YMfs~9|8{an^LB{Ts5L&Y`} diff --git a/Resources/Textures/Objects/Tools/screwdriver.rsi/screwdriver.png b/Resources/Textures/Objects/Tools/screwdriver.rsi/screwdriver.png index 9d0d820ddaa8a7610582061de5121e0fe779d51c..9e1369973418dd4a0e681f2cb730f43b07e17418 100644 GIT binary patch delta 206 zcmaFNc%N~CWIZzj1B1(wu46!ou{g-xiDBJ2nU_EgOS+@4BLl<6e(pbstUx|bfKQ0) z%$YNLdV0Qp{|*$WEwRm-86?~2mhKo zJtkXy***r!t=_<$R9@M)^z82^?VLw`9{9`1SIWKo>C=$^K!X`PUHx3vIVCg!0Na^N AF8}}l delta 210 zcmV;@04@LD0pkIX8Gi-<0047(dh`GQ0IEquK~z|UV;BXaU=)mkQ7{TdJYd8Y06jfD z|3Ne_FE3o|^XJbfY9u8k8KR@38IjeOl$2mKk0byy3?KOZ{ri6q2B`&M5PQ|CRRr~6 z0~juzIdkTJJ3Bitn}>%7F8<}q7o3JDC@3&Ic<_MX(4j*N=}YP9B!vPCx&SDsH8nNy z8Upe$h@LuiDwv<0oy~Ch@@0}O2Z6zt21das7zLwX6pRA80tN;K0N&L{g44@Iu>b%7 M07*qoM6N<$f+sjqKL7v# diff --git a/Resources/Textures/Objects/Tools/seclite.rsi/meta.json b/Resources/Textures/Objects/Tools/seclite.rsi/meta.json index 86f25b0b7a1..d466ad62d59 100644 --- a/Resources/Textures/Objects/Tools/seclite.rsi/meta.json +++ b/Resources/Textures/Objects/Tools/seclite.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/52cbeaf94322209d4c6596818dda9fb3654729d3 and modified by Swept", + "copyright": "Taken from https://github.com/ParadiseSS13/Paradise/blob/master/icons/obj/lighting.dmi", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Tools/seclite.rsi/seclite-on.png b/Resources/Textures/Objects/Tools/seclite.rsi/seclite-on.png index 317e638c18c679b0a0ee848973c731e7a901d786..e02d6ee077424adc4cbf9fc449925864a056d150 100644 GIT binary patch delta 243 zcmbQw)WS4DvYwfNfx%@-*D)Z)SRCZ;#IWw1%u67LCEd~2k%3`jKlh(RRv=#@z$e62 zT3Xu5%F4^jD<~-F>(}Rzk&!q&P}~{DS{O0K>iJy^%mM&H|6fVg?4j zBOuH;Rhv&5D46K!;uvD#|F+*Thwp#_2TS?ZY5)K4P*4qYezj4&eTQOV6W7fGmgnw_ zUFNpo44ZZ&CVuPb(_SZV;eZgUwbeD5)?*qUmU&JNI4CuhtM+~LP0`!#YC8ANY_Pre h<`ECTATm? delta 271 zcmV+q0r38W0-pkq8Gi-<0047(dh`GQ0OmeLU~vc%BofpuCFuov+nQ`66ZA9f9mn#jx=re6cX@>w!K4|ULenNn5Jp{$nv$Hz#H)d5Pw)4U5KK{3F*4dxf6yV zG)=P^zl->8S(Z>$m0gQCOHGgv+z7$EzSZs%VN8-ljIR&{NT5U5ofMIIp1s{f0mc|- zBZ7HxEu166Ff6$g$xY7YK;SLlhmZD%PDHLkV1mdxcBlXV diff --git a/Resources/Textures/Objects/Tools/seclite.rsi/seclite-overlay.png b/Resources/Textures/Objects/Tools/seclite.rsi/seclite-overlay.png index a5e9f773ed55bfbc12fbbdce978c3733689ff043..7ea22fa4c673b9069203b7c9aea6b79030624493 100644 GIT binary patch delta 250 zcmV!4MC`~i)=g%J~3jsh5bb&Id;{c!k3?v077q=rL zhz5lU%|iemU<3lHIA9AS1K3BT09YcVc?htuus~U;fQ?-V>}Z-h;PmO63@cY1W%&N> z0K=q7YeDfpgKk+684OrKGzvz+C>RBU9565d0A?&i+Z#0Exc~qF07*qoM6N<$f>26Z A(f|Me delta 91 zcmbQvR5?K<)WOrmF(jh(?L|W_1_d6LgWdn@m(11os7=aN_HbyC^{CHbVPGhmd3amt vF0Hp;+1IhT^lxIR7mE;#<7Z%4(6)rL*jZtbwErhd1|aZs^>bP0l+XkK{`Vjk diff --git a/Resources/Textures/Objects/Tools/seclite.rsi/seclite.png b/Resources/Textures/Objects/Tools/seclite.rsi/seclite.png index d8ace36de984710ee0aa9095539bc689fc209fa8..1064101c28a568b4dc9acf68e1ff423b8e473014 100644 GIT binary patch delta 294 zcmV+>0oneZ0>J{1B!3BTNLh0L01m_e01m_fl`9S#0002JqVK_WqId6ylbqZBq4mXUkrwWQbkUH{NP{a6AZ00JNY0&s4C zIF9ere$zCULjX8&k|flRqDYlxN#9=~0$1Q(O%sPTthCr);0Y5kH|0#W8)Cf4X&f3j7@3uSO5S307*qo IM6N<$f@ZpRga7~l diff --git a/Resources/Textures/Objects/Tools/spray_painter.rsi/meta.json b/Resources/Textures/Objects/Tools/spray_painter.rsi/meta.json index 056ba0a8563..a7ed6684445 100644 --- a/Resources/Textures/Objects/Tools/spray_painter.rsi/meta.json +++ b/Resources/Textures/Objects/Tools/spray_painter.rsi/meta.json @@ -1,5 +1,5 @@ { - "copyright" : "Taken from https://github.com/tgstation/tgstation at commit a21274e56ae84b2c96e8b6beeca805df3d5402e8.", + "copyright" : "Taken from Paradise at https://github.com/ParadiseSS13/Paradise/blob/8e92e96d56f231f79dc16f95918d59b2803085aa/icons/obj/painting.dmi", "license" : "CC-BY-SA-3.0", "size" : { "x" : 32, diff --git a/Resources/Textures/Objects/Tools/spray_painter.rsi/spray_painter.png b/Resources/Textures/Objects/Tools/spray_painter.rsi/spray_painter.png index 462e22932c2b9401cd950e8630eb80caf0ea1a80..0c7ebdadccef551b183bb87c0e117d9c80d9e4e0 100644 GIT binary patch delta 749 zcmVA5 zY33`l*SfKbr#7o;zIo2<+im8(=lWLZ55xDq@j2gbzWL^RyMGlnS^p2f;NUenJbWj# zDF7IJDzymJkSBl$e(8Ka^mR4`o&{F`XYhj^hMWr$LJQywj+#!Bsz4|KL~xdJAcTNn z7*&H%0u&dH(P~4u)N4r0RqR1iWz^akIZP(TPjZ_UEZTSG9m&fc)5 zZ-EVAtM^!pW`DkA*PR6|z?F9ca<>x+3y$_Qa$9@1na^Pc2x;OLVGs^29uo?|oWN@W zz~C3dy~T;1IB=iY8WzAVM7u%ZGuB1k>f*smi!?@mUR~hOIv6FuliQzRqTiB!ZghqF zXs;hSDf>XVFu3>|TEif4_*4#FFEwbtBT9g}=f9yg-G2%qov@9Km$tqCV3f7z()Td~ zs#?Hzr%(Ta8nRD&eU$+9jr-x>bQX6hf;xSbaE(9kNy7LB@T2m;Sd1VtwhH)kBS$b03dk^2@w- zH(#4uA;U7zu$lpr^?^(-!a!%hO%-JT(|_-HH)btAhDucNH4GxSD?ow%km>g$adpKt z?CT`HzLZ*k)S?xtOKhjn@NVde*7IRzTd1xM#MKpwkNX4nJOaFWI1mH}1Arjq3gFyr f(1CpcY=r&-6d`W^TIn^;r%VKxW6EsV3o%90*43z$rVDlCJPdOAY==Jjf};z>twU@!=w@14}_h}yf^PV z@4eXsa&mG$I^MjFzVA!jS`Y-z`#KqB1q+5taBu^sUuK?u?SI)>lu#lY zLL_Tp7;61gyDVE(%(5x?(f4TFzK))yQpuz@LA4u?#{kspbpQr~!IW)g2IAn}?`S

R+>SW-=sx=Xa~}X{6Y(iMk*>dmL`1h2O*FP( z??*K5T@|bwSTkTay($8L&YuE82+HL$#bOcYTLsKyU|x0_vvZAa6RV#!197cyA3`qv z{ZF5Miv8UQ)yf1>98s-6yJL;-)`X^@i?Yx)RO$AhP-d9!f&Nt=u$N(mRud@?(f-;Q zkg1OqV-wCH!jp&4YDQxhhs+ZE`ulpnRS~*(gKBepnfN=Q?Ez(zWOH3cjxRI)oOqLQ j{Qn@$TZ880yenP+m)WPJs1y#N00000NkvXXu0mjfMi}PH diff --git a/Resources/Textures/Objects/Tools/welder.rsi/icon.png b/Resources/Textures/Objects/Tools/welder.rsi/icon.png index a023a035ad47559b1b80b4d2ea46c2531d76eb54..c6917c8ba514fb1471fd732080cdb413c7d5ac6d 100644 GIT binary patch delta 554 zcmV+_0@eMZ0=NW_8Gi-<0047(dh`GQ010qNS#tmY4#WTe4#WYKD-Ig~00HVrL_t(| zob8p%O9D|8#=oFIf}qkxp*=|37@~_7NiL-RfFPj=H}xM_%c4!vI>ANKCO0(%*`|F+ zCAnx}2||#NIHg1?B!s)$Tx+IreB@)ajK0;mkKy~BJLlfhiGLr~Kfpi0?*`}|G!Z_2 zON2UF3P8N;N*D=^RqTYxOvN=6{h}J z!Cv#Ul}Nu|H28(s;Xy^fvL}!Y0=I4-mbTqsHhg%^+Vk_NR0c|ApRi9H^Xt~Bukmtd zAP?vbCQE{p1%J4B0_JQsFg_m^*4EKw&p{U7_%A0638Y0eGYF?`< zUPEent<{prXjCwl?xAyyKz#cUQF96r&gHPljh%#GZ+~=LST9urvI6iBG*jN3uY7Sa zHWh%19`hy#VdBh<20hOFfqeE9YNZtbRDAV|Wl$)vuU31}G)^1~l3SY6g%y`>Fvx-g{laSdQ$g s2KY21k|VJ!s;L*C32L8r;LifQ1C@uwSxGc<%>V!Z07*qoM6N<$f+Q9AIRF3v delta 274 zcmV+t0qy>{1fl|v8Gi!+002a!ipBr{06$PnR7C&)02vt>AS*y7CMGH=DJv=}F)=Yc zJv~H1LPtkONHzdSNJvyvR8><`X=!O{Pyu&$cYIz1jQ{|db`H;<52tCijsO4v0d!JM zQvg8b*k%9#0Fg;VK~y-)-IGZYLLm%9L7PYm%^$-3&*}lbhJS?%tIW1vCFu+){Zjx7 zy?4a=^bRw#Pk@`bk)n~j&FPm6?wyoG@{!&Bxm|lOqgYBQ`8bZZE{rNA^io@_r=0U* zSP18ZI;s>D!PtjzE;8Ue1E30#4X`S-2{z#y03aK}lVJ-14z;iX_i>MbQL$Rpk3Q-J YRQd(HNLK_J01E&B07*qoM6N<$g5soRH2?qr diff --git a/Resources/Textures/Objects/Tools/welder.rsi/meta.json b/Resources/Textures/Objects/Tools/welder.rsi/meta.json index 5f876da9ae0..407f85d4cf6 100644 --- a/Resources/Textures/Objects/Tools/welder.rsi/meta.json +++ b/Resources/Textures/Objects/Tools/welder.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/199fffd989d6f7fd6ea9c5188c875137df4f34b8", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/199fffd989d6f7fd6ea9c5188c875137df4f34b8 // Icon Taken from Paradise at https://github.com/ParadiseSS13/Paradise/blob/3c5cb36e811725e1479c4c025b04220027230632/icons/obj/tools.dmi", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Tools/welder.rsi/welder_flame.png b/Resources/Textures/Objects/Tools/welder.rsi/welder_flame.png index 20aa48abf68c85cebc135633200b994f8efd9c66..6c8ef525ccd7a64c212523ae35c1a3adda12ddf2 100644 GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!3HF&`%2dVDb50q$YKTtz9S&aI8~cZ8YsBY z)5S5QV$RzedwH1*dD;@AlX$jqcsm>wIqCCJB;>fr%_iHPUY4VsR^d-dC(4^wiYz@@ zKB<`-s56_fs$5?=TuoK%md|p=RmUG1PES)pcW)hV4?82an}9MKV(uae0%BFqJXu-b)bDx3)Jzf1=);T3K0RU-PTd)8C literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!N$PAcy*Sa5Rk)J;1OBOz`zY;a|FVdQ&MBb@089@=M*si- diff --git a/Resources/Textures/Objects/Tools/welder_experimental.rsi/icon.png b/Resources/Textures/Objects/Tools/welder_experimental.rsi/icon.png index 446d4b21bf7742ce04c265fb06bf89a17c91643c..d33656a0be4000ed43d259b1404726e98595ca41 100644 GIT binary patch delta 895 zcmV-_1AzRr1d9id8Gi-<0063Kaozv`010qNS#tmY4#WTe4#WYKD-Ig~00TWqL_t(| zob6goXcIvgeSxKxCP+geQoB~DJ&87ADX0}GQoRU81rPP4;6X%0#go*V2M_*$s3*aj z76dE3T1pUGd(n_8o+MCB6)PcPf2dMf^G!1AcJsTN{Q>uT5Pz~WJ2P+g&Fp+L$x{$; zumA`+SO5eZEP%XFRaK+!EnB-q`t?*IWVcb-Rwk3FyA8ki6i4GrM) z+{e1h`pK_I@?WV!MrW)S$@U4oBNDI1r_dGIjy_irfXIIyy@{1?Nj&*Ji{Y<>NMb@1Fn7c% zsACc{3x!dAyR?3K`^hf^*boOcKEHy)c_o2OVg&4vXS2DIyxT8E^lS5jOZdsJ(DWms zY&@r{F3G7udY5+X?h|?Gr4QosIDHowgPteT5w&SuLB6xO8IL+Tv}|&*H!z=WN{fAvGLs=p64g ze@y{8-}hn~381}@Hpf`%#8Y{lCwFoW;01qG0mSySAL3mj_05et{jh%U*PH>3{5IzV z+~((Bg%NPD00=l(00bN?00Isc009RJATQV-!2W`LW|=eE~8Z`R%ShfcPqT69|zx_6M*(z$(}u zQ0*rB1Hk@(vS5FJ0qhT8e*pUf;1<{)-~m7T18Nmue*pUf*dOp;g9Sjq!2%%Q_zV29 V_Xtar;P3zd002ovPDHLkV1nJ;q!a)E delta 550 zcmV+>0@?kG2ebr`8Gi!+005o0f$RVP08UU$R7JqRz$hpvXlQ6qP*5;1FhD>+I5;?F z0A@1)W@Z4)nE=e0GtA60%v4lVASghY0A>I){{R60005a77#IKmW=Kd#W&i-0007JY z03aYB+w%7O00001bW%=J06^y0W&i*HczRS=bVOxyV{&P5bbo1YZU6vyoKseCa&`Cg zQ*iP1gNKs3ILmWA5}ybnxFsx z0T4+PX{)+vJ9T=g>(?`H=YazU{q6mulxZ_iS9E<@mi~FFw5w0VjRI69F*t|PSe-O8yu7o0LP%gW4;bd5rc4oVR)P%#?1x-3T=pSQ0}A{ z+7RQQ{F@{~pDD&ccXIx3?{FY={#Txql=MvfpqZcFP(PR-?<&|27K2bfSPX*wU`-I{ o2Wx`V4`?N3ItWQ<|33|HvxvXHYaZfQYryHA+84w9GEfV$B6_Wn(<>s z!Ve&skdW}>$B7?5egGvrBz~NjaoNPu7pR`GB*-tA!Qt7BG$5zCDkP%BCAB!YD6^m> zGe3`kp<+&OSV2+g_bJZhXNCOYs3r?@pfj{QT^vI!PA4ZwutqdY;M9sYVVrvYo)P!d`?lO? mSuTp02=lr*mx}OMGBDhmzV=>FAqk0`zoGDgNa-_7|Uz2 zF~Xt{nD(OvvzZa7umZUGdV5FbSI>_Mf(%TW&ttWIe!M~8dHVOE@2d)q<2VOW2!Q6g z0$x%9y1A`x7k>*K7a1D?IOlk=m>wOgd@nbQV1B-4UiVL z=S{mUmJJ!_01rfRz9=13AimjGO^ft@Q^;MsD|4?&?cu q1wj7~GPyHZJp$LJr2(o`1Mm&4YnlqU^tWXI0000V=-0C=2JR&a84_w-Y6 z@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+(=$pSoPXky#FA7XQz{V5ArtmH< c^elw{0LzCCj!+{7kpKVy07*qoM6N<$g4gVLr2qf` diff --git a/Resources/Textures/Objects/Tools/welder_industrial.rsi/meta.json b/Resources/Textures/Objects/Tools/welder_industrial.rsi/meta.json index ab4744aaa63..1a92064078a 100644 --- a/Resources/Textures/Objects/Tools/welder_industrial.rsi/meta.json +++ b/Resources/Textures/Objects/Tools/welder_industrial.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/782006a07ef7f16f70128489b3e78b210ee4bbbe", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/782006a07ef7f16f70128489b3e78b210ee4bbbe // Icon Taken from Paradise at https://github.com/ParadiseSS13/Paradise/blob/3c5cb36e811725e1479c4c025b04220027230632/icons/obj/tools.dmi", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Tools/welder_industrial.rsi/welder_flame.png b/Resources/Textures/Objects/Tools/welder_industrial.rsi/welder_flame.png index 7814b7485199170ae34cacd3a4ecfe43995e1367..c4cac4606ac872e32a0a3b4df7fdb4540bc5087e 100644 GIT binary patch literal 247 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!3HF&`%2dVDb50q$YKTtz9S&aI8~cZ8YsBZ z)5S5QV$RzeYXzAV1==3=&*V7en8!I$lhM;tUGt%eszUIwsSUdwj`*svHtZ;8-H`?N3ItWQ<|33|HvxvXHYaZfQYryHA+84w9GEfV$B6_Wn(<>s z!Ve&skdW}>$B7?5egGvrBz~NjaoNPu7pR`GB*-tA!Qt7BG$5y@DkP%BCAB!YD6^m> zGe3`kp<+&OSV2+g_bOFCU9!Sn=np2f6s_}>U~@8 nvn&@yOoVyeoJ&P`EEyQ?O<+FpeccaPpe_baS3j3^P6uG diff --git a/Resources/Textures/Objects/Tools/welder_industrialadv.rsi/icon.png b/Resources/Textures/Objects/Tools/welder_industrialadv.rsi/icon.png index c187486f2bc9e34736019ee3a74cd4ef72380787..425cf3c4b3f8fb37bcda7ada9e600899acf3caf8 100644 GIT binary patch delta 535 zcmV+y0_gpW1Ed6y7=H)`0001UdV2H#000SaNLh0L01m_e01m_fl`9S#0005jNkl??{i(=5;!D~Q# zP>hJ|u=Li1TBif|whh&OAFN&vjP*QJ?rvZlDO<4^5q~-7JKZiogs{fre9rz^6QltR z1rQ;`CMCj*<17#Wle-Sg0TAr~sFmdI9}~lJAl~X zLIGgmXYy*R+5mKF3g8JKA5dOrfHr`zG+6-j5BZnQ0AB$4A3=xnp#Tg5G;6YI;9mlK Z0T=1hN)URuay9?}002ovPDHLkV1hy&?hpU~ delta 381 zcmV-@0fPRd1dIca7=Hu<0001iRAkc z%p)V88yj&E5kd_OCI<(5dwZxf7Hj|j00DGTPE!Ct=GbNc003`#R9JLGWpiV4X>fFD zZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDSycTa*U0*I5Sc+(=$pS zoZ^zil2jm5sk9(7FQq&+CndE=iHkEOv#1y-YRJWzR+N~V3SlcNxca$(4F>=PKOC-y ziw-XU005XtL_t(2k)@Ea5yCJGMHNqA8^fms-X36Yd=KD&eb zbE9`(Uy_Ob5O(*+s_qbz??~SYdc+J<+Q4+po2H9_nQnmAX;>Z#P79c=XVjV^5D{3l zW;pTYpe^6&;>e*4F%QD?_2#l0EWsDxB(&PzWk XIQ~%k!X785D3GY9tDnm{r-UW|X0lPz literal 297 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!VDw>HYaZfQYryHA+84w9GEfV$B6_Wn(<>s z!Ve&skdW}>$B7?5egGvrBz~NjaoNPu7pR`GB*-tA!Qt7BG$5z0DkP%BCAB!YD6^m> zGe3`kp<+&OSV2+g_bQ)bPd;iXEW7W+oBs3CF9Gw|9WyWl-B<8QnmON7l zYicRw**Qft=5Ne_X^adU=M#*h`=$22WQ%mvv4FO#pr8dXWGC diff --git a/Resources/Textures/Objects/Tools/wirecutters.rsi/cutters-cutty-thingy.png b/Resources/Textures/Objects/Tools/wirecutters.rsi/cutters-cutty-thingy.png index f331df4390e4cd2193af7bf878126a071b8badc7..09cfe9a497ae2b589ee05b3495f7618f3e1e0ec4 100644 GIT binary patch delta 222 zcmcb~_?~fsWIZzj1B1(wu46!ou{g-xiDBJ2nU_EgOS+@4BLl<6e(pbstUx}0fKQ04 zikhaQvuA84rj@Q5sCVBk9f!i-b3`J{n@ z5uPrNAr}5``w#Lp7;rc*eEffZWYm>#m+h(Q!u-|d$FyJSh~+H&u{7aOYues83qL8w z-u4F*SNbrWGoIrnyQXmM+2|GA2J_=~Sg&xo-)Jz)r_L~e`{;A0BaA;D@_pa9B$p9r O34^DrpUXO@geCwJRZhYH delta 200 zcmV;(05|{d0oehN8Gi-<0047(dh`GQ0H8@kK~z|U?UOMM!ypVrosKNbNZi0P_df+U z-~ueHRF2ZfaS|k&sp@|c!XVine}Di00Dxbo>yc9GcF&9x%d7!0#>+y2_kNh0b0(|# zniVgl>;-fz;?B8|_`=LYH%>f)nOFNm2VQ!P zj5=V{0izBWd=5z9=l)NO#=F1&FdY8&laZrUn>d7k^G)U~qKy{EzGi6bC?q z6mJx;SUQ1y0Wt{0M`nWn$YCI`W#d+c$B!SN=)H66I#?~TBQVkc!Fb)fodISsObEnQ zQPcdNnUjrSG00Mo9Eir|V4@NsC~63W0LbUlr%VOMy`{M|!;@!E!43gg4pIkm1hVBA z4#1rVk(8Y|#Cia;5CmdlQ{V=IEQSG)ypO*(iYdS}@E_zboN0jAL?{n*1WY}yTmS+f z%g_PdTmXuHrtfS(9}&)q|2Tg^(#x&uIMv+2BZt)iAaL;iXW|N%ZwyocgRdwab-<_t fMjbHf0D1!eas!}p`@|`?00000NkvXXu0mjflbE8u delta 305 zcmV-10nYxL1Iq%CBYy!BNklZq}6o!9jvcSL;DQ{AyrhZ6db(>kO|<5cF2(TEzbu0-v54VgJBqkxqAZFfH%Mz0207& zadox!ue3?lfPIbUSc*p+PZbsqp*Ozo_9UW%)*4xs`K0tjw|@_)`{#I$Llr=Tb})W? z{a_>IX!ayYyguZ4-V@Q8kPANhskkvFkWyOu-W^l%D2h;)-i)Hwo0{~xLq~t8wZM_==IdNWsK?6oxBG~gpZ-(j)-2JsBZVP}jRTHAe>k$yi00000NkvXXu0mjf DU3ih> diff --git a/Resources/Textures/Objects/Tools/wirecutters.rsi/cutters.png b/Resources/Textures/Objects/Tools/wirecutters.rsi/cutters.png index 3f79cb157cacf02c6412154c488d2af8c68a7928..68c8a3ed715738ad6d3cff7bf54aece317ffea32 100644 GIT binary patch delta 214 zcmaFD_?&TqWIZzj1B1(wu46!ou{g-xiDBJ2nU_EgOS+@4BLl<6e(pbstUx|bfKQ0) zk|j&(>+4URJP8yqdpyAaq^=~$FZloe{|pXVE588woCO|{#S9F5M?jcysy3fAP%y;P z#WBRf|82h^AAB)v%UIhk){-2IL>zexHfcTVfCSHk!OF2W>c3))C+bh4f zy~o-^Y|$iUrgQ4zB`KQ{`*{9!PV!^n(7hOXTzpEj;}RyP``k`{6Lo@t7BG0a`njxg HN@xNA?kPvt delta 211 zcmV;^04)FK0ptOY8Gi-<0047(dh`GQ0INwvK~z|U?UcO@10f8BeNjp}W}v5Y#|+HC z0Ia|cHwkMn12aHHPvl4^CDP?ja&(d6uX(P(etrOgAPB`b@Tf^&}7`lI>Cfe->H zrM|NQ3Kb$kt@XO|J*5nAr~kASG$rA^f2hk`N04-hD4~e|x7+if6O6{Bc1P;s*e`oecm21{q>F7>PnedZ1Lkm@^Os zAvGcaJnxMT9A^e`=(sAE+o#voGcg46BNYI=cxqgqgSj@2Yq{{`T;Q>S2@@GX$4yvyZF>hUko)TsK3$9r$#! zIADr_LBTnz)+9sb=F3thsyb23%TsjqX9=;2g)p+kPv>62q_dC5go)ury8OIUQ5Ghk OwG5uFelF{r5}E+v*+~`v diff --git a/Resources/Textures/Objects/Tools/wrench.rsi/meta.json b/Resources/Textures/Objects/Tools/wrench.rsi/meta.json index a2c8f06819b..ecd76812cd4 100644 --- a/Resources/Textures/Objects/Tools/wrench.rsi/meta.json +++ b/Resources/Textures/Objects/Tools/wrench.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from vgstation at commit https://github.com/vgstation-coders/vgstation13/commit/1cdfb0230cc96d0ba751fa002d04f8aa2f25ad7d, storage by EmoGarbage404 (github)", + "copyright": "Taken from vgstation at commit https://github.com/vgstation-coders/vgstation13/commit/1cdfb0230cc96d0ba751fa002d04f8aa2f25ad7d, storage by EmoGarbage404 (github) // Icon Taken from Paradise at https://github.com/ParadiseSS13/Paradise", "size": { "x": 32, "y": 32 From 470c75bf60a3549d4e52cfb72ccc32004fdc789d Mon Sep 17 00:00:00 2001 From: SimpleStation14 <130339894+SimpleStation14@users.noreply.github.com> Date: Tue, 28 May 2024 21:07:51 -0400 Subject: [PATCH 023/155] Mirror: new book - Tales of a Tired Janitor (#278) ## Mirror of PR #24441: [new book - Tales of a Tired Janitor](https://github.com/space-wizards/space-station-14/pull/24441) from space-wizards [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `0a6921d5ef90ebaaf1e054178f2889889eea661c` PR opened by Boaz1111 at 2024-01-23 09:28:08 UTC --- PR changed 2 files with 22 additions and 0 deletions. The PR had the following labels: - No C# ---

Original Body

> > > > ## About the PR > > I added a new book, as requested by someone in the discord. This book is about the life of a janitor working aboard a (presumably NT) space station "14". They describe the things they have to deal with, the disrespect from others, the lack of good equipment. > ## Why / Balance > > More variety in books, especially books indirectly talking about life on a space station, and the jobs on said station. > ## Technical details > > > ## Media > > > - [X] I have added screenshots/videos to this PR showcasing its changes ingame, **or** this PR does not require an ingame showcase > > ## Breaking changes > > > **Changelog** > > > > no cl
Co-authored-by: SimpleStation14 Co-authored-by: VMSolidus --- Resources/Locale/en-US/paper/book-authorbooks.ftl | 8 ++++++++ .../Entities/Objects/Misc/authorbooks.yml | 14 ++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/Resources/Locale/en-US/paper/book-authorbooks.ftl b/Resources/Locale/en-US/paper/book-authorbooks.ftl index b1981d9e152..ae886e835af 100644 --- a/Resources/Locale/en-US/paper/book-authorbooks.ftl +++ b/Resources/Locale/en-US/paper/book-authorbooks.ftl @@ -253,3 +253,11 @@ book-text-inspiration = As a freelance writer, Sarah was always in search of ins Without a moment's hesitation, Sarah took out her pen and notebook and began to write. She wrote about the beauty of the scene, the peacefulness she felt, and the surreal quality of the moment. She wanted to capture this feeling and share it with others through her words. As she finished writing, Sarah heard the snap of a twig and looked up to see a man approaching her with a camera. He introduced himself as a nature photographer and asked if she had seen the waterfall. They struck up a conversation, and soon they were both laughing and sharing stories of their adventures. As the sun began to set, the two of them packed up their gear and said their goodbyes. Sarah felt grateful for this unexpected encounter and the inspiration it brought her. She knew that this moment would stay with her forever, and she felt a sense of serenity knowing that there was still so much beauty in the world waiting to be discovered. + +book-text-janitor = [bold][color=black][head=3]The Tales of a Tired Janitor[/head][/bold] + Cleaning a space station as a janitor is like being trapped in a cosmic custodial nightmare. You'd think floating through the vastness of space would be glamorous, but no, I'm stuck scrubbing space grime and extraterrestrial goop off the walls. It's a thankless job in a zero-gravity abyss. + First off, let's talk about the mess. Space dust, alien gunk, and who knows what else accumulates faster than a rocket launch. It's not just about sweeping up the crumbs; it's about battling interstellar filth that seems to have a life of its own. You'd hope for a sleek, futuristic space station, but you get a swirling vortex of space garbage waiting for you around every corner. + And the tools they give us! You'd expect state-of-the-art cleaning gadgets, but nope. They raided a dollar store on Earth before launching us into the cosmos. Mops that barely work in microgravity, spray bottles that run out in one use, and don't even get me started on the space janitor jumpsuit. I feel like a reject from a sci-fi B-movie. + Speaking of jumpsuits, the lack of respect is astronomical. The scientists and astronauts zoom past in their sleek suits, utterly oblivious to the fact that I'm the unsung hero keeping this place from turning into a cosmic trash heap. I bet they don't even know my name. "Hey, Space Janitor!" That's what I get. No appreciation for the elbow grease I put into keeping their precious station spick and span. + And let's remember the hazards. Cleaning up alien slime? Yeah, that's a regular Tuesday for me. One wrong move and I'm dealing with an intergalactic biohazard. It's like playing Russian roulette with space critters that could burst out of some hidden nook and cranny. I signed up to mop floors, not play host to extraterrestrial invaders. + Being a janitor on this so-called Space Station 14 is a cosmic joke. Where did the other 13 stations go? It's not all spacewalks and futuristic gadgets; it's scrubbing toilets and battling alien goo. If anyone thinks space is glamorous, they clearly haven't seen the mess we space janitors deal with every single day. It's time they appreciate the unsung heroes of the space station – the custodians of the cosmos. \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Objects/Misc/authorbooks.yml b/Resources/Prototypes/Entities/Objects/Misc/authorbooks.yml index c3f5170001a..70d984240ea 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/authorbooks.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/authorbooks.yml @@ -387,3 +387,17 @@ - state: book6 - type: Paper content: book-text-inspiration + +- type: entity + parent: BookBase + id: BookJanitorTale + name: the tales of a tired janitor + description: A clean looking book, smelling vaguely of soap and bleach. + components: + - type: Sprite + sprite: Objects/Misc/books.rsi + layers: + - state: book0 + - type: Paper + content: book-text-janitor + From c21bdce01db87e82012041edede6dbc70897e773 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Wed, 29 May 2024 01:08:28 +0000 Subject: [PATCH 024/155] Automatic Changelog Update (#407) --- Resources/Changelog/Changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 96983e8124e..fc0b5c906c7 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4112,3 +4112,9 @@ Entries: radio is on! id: 6114 time: '2024-05-29T00:00:50.0000000+00:00' +- author: FoxxoTrystan + changes: + - type: Tweak + message: New Tools Sprites! + id: 6115 + time: '2024-05-29T01:06:42.0000000+00:00' From 4fdfd6fef21def450e2af6617dff0d33d7b1f665 Mon Sep 17 00:00:00 2001 From: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com> Date: Tue, 28 May 2024 18:10:56 -0700 Subject: [PATCH 025/155] Add More Suggested VSCode Extensions (#414) Co-authored-by: Danger Revolution! <142105406+DangerRevolution@users.noreply.github.com> --- .vscode/extensions.json | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 83bca6f97bc..737b90563e8 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,6 +1,12 @@ { "recommendations": [ "ms-dotnettools.csharp", - "editorconfig.editorconfig" + "editorconfig.editorconfig", + "aaron-bond.better-comments", + "tamasfe.even-better-toml", + "slava0135.robust-yaml", + "slevesque.shader", + "macabeus.vscode-fluent", + "redhat.vscode-yaml" ] } From a22601c7b5ba55b5fe7b5f3a6a7a3e6596567a2d Mon Sep 17 00:00:00 2001 From: SimpleStation14 <130339894+SimpleStation14@users.noreply.github.com> Date: Tue, 28 May 2024 21:18:15 -0400 Subject: [PATCH 026/155] Mirror: Obsolete `Logger` cleanup for `EntitySystem`s part 2 (#237) ## Mirror of PR #26159: [Obsolete `Logger` cleanup for `EntitySystem`s part 2](https://github.com/space-wizards/space-station-14/pull/26159) from space-wizards [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `7d275a4b5e4188db424cc417c609dced3f9aca89` PR opened by LordCarve at 2024-03-15 20:15:41 UTC --- PR changed 14 files with 36 additions and 25 deletions. The PR had the following labels: - Status: Needs Review ---

Original Body

> > > > ## About the PR > > Part 2 of 2, continuation of #25941 > Gets rid of the remaining obsolete `Logger` method calls from all `EntitySystem`s and uses the expected `Log` to get at the proper sawmill. > > In particular: > 1. Make the `ExamineSystemShared`'s `InRangeUnObstructed` non-`static` (so finally able to use instance-based `Log` rather than `Logger`) and inject dependency to all systems that were using it as `static`. > 2. Adjust 4 more `EntitySystem`s to use `Log` rather than `Logger` that were missed in the previous PR. > > Tested that the game runs and the affected systems direct logs to the correct sawmill. > > ## Why / Balance > > Using Logger directly for logging is marked obsolete. Brings some order to logs (i.e. all `EntitySystem` logs start with a preceding `system.`). > > ## Technical details > > I'm pretty sure `ExamineSystemShared`'s `InRangeUnObstructed` not being `static` is the intended way since it being `static` dodges the IoC entirely. It even has dirty hacks such as getting the occluder system inside to make it happen. I didn't fix any of that as it's beyond the scope of this PR, but it's another thing that needs improving. > > These are the changes to the log sawmills: > `ExamineSystemShared.cs`: BEFORE: `root` -> NEW: `system.examine` > `AtmosphereSystem.Monstermos.cs`: BEFORE: `root` -> NEW: `system.atmosphere` > `TypingIndicatorSystem.cs`: BEFORE: `root` -> NEW: `system.typing_indicator` > `PiratesRuleSystem.cs` BEFORE: `pirates` -> NEW: `system.pirates_rule` > `TabletopSystem.Session.cs` BEFORE: `root` -> NEW: `system.tabletop` > > ## Media > > > - [X] I have added screenshots/videos to this PR showcasing its changes ingame, **or** this PR does not require an ingame showcase > > ## Breaking changes > > Some logs now fall under a different sawmill (more precise). Any software that analyzes logs and makes assumptions on which sawmill do these logs fall to will need to be adjusted.
--------- Signed-off-by: VMSolidus Co-authored-by: SimpleStation14 Co-authored-by: VMSolidus --- Content.Client/CardboardBox/CardboardBoxSystem.cs | 5 +++-- Content.Client/Popups/PopupOverlay.cs | 5 ++++- Content.Client/Popups/PopupSystem.cs | 3 +++ .../UserInterface/Systems/Chat/ChatUIController.cs | 2 +- Content.Client/Verbs/VerbSystem.cs | 8 ++++---- .../Administration/Systems/AdminVerbSystem.cs | 3 ++- .../EntitySystems/AtmosphereSystem.Monstermos.cs | 2 +- .../Chat/TypingIndicator/TypingIndicatorSystem.cs | 2 +- .../GameTicking/Rules/PiratesRuleSystem.cs | 4 ++-- Content.Server/NPC/Systems/NPCUtilitySystem.cs | 5 +++-- .../Abilities/PsionicRegenerationPowerSystem.cs | 3 ++- .../Pointing/EntitySystems/PointingSystem.cs | 3 ++- Content.Server/Remotes/DoorRemoteSystem.cs | 3 ++- Content.Server/Tabletop/TabletopSystem.Session.cs | 2 +- Content.Shared/Examine/ExamineSystemShared.cs | 12 ++++++------ 15 files changed, 37 insertions(+), 25 deletions(-) diff --git a/Content.Client/CardboardBox/CardboardBoxSystem.cs b/Content.Client/CardboardBox/CardboardBoxSystem.cs index 50f9de239d5..90a21d8e41b 100644 --- a/Content.Client/CardboardBox/CardboardBoxSystem.cs +++ b/Content.Client/CardboardBox/CardboardBoxSystem.cs @@ -1,4 +1,4 @@ -using System.Numerics; +using System.Numerics; using Content.Shared.CardboardBox; using Content.Shared.CardboardBox.Components; using Content.Shared.Examine; @@ -11,6 +11,7 @@ public sealed class CardboardBoxSystem : SharedCardboardBoxSystem { [Dependency] private readonly EntityLookupSystem _entityLookup = default!; [Dependency] private readonly TransformSystem _transform = default!; + [Dependency] private readonly ExamineSystemShared _examine = default!; public override void Initialize() { @@ -55,7 +56,7 @@ private void OnBoxEffect(PlayBoxEffectMessage msg) foreach (var mob in mobMoverEntities) { var mapPos = _transform.GetMapCoordinates(mob); - if (!ExamineSystemShared.InRangeUnOccluded(sourcePos, mapPos, box.Distance, null)) + if (!_examine.InRangeUnOccluded(sourcePos, mapPos, box.Distance, null)) continue; var ent = Spawn(box.Effect, mapPos); diff --git a/Content.Client/Popups/PopupOverlay.cs b/Content.Client/Popups/PopupOverlay.cs index 1305d8bb947..3bfa7278734 100644 --- a/Content.Client/Popups/PopupOverlay.cs +++ b/Content.Client/Popups/PopupOverlay.cs @@ -21,6 +21,7 @@ public sealed class PopupOverlay : Overlay private readonly IUserInterfaceManager _uiManager; private readonly PopupSystem _popup; private readonly PopupUIController _controller; + private readonly ExamineSystemShared _examine; private readonly ShaderInstance _shader; @@ -33,12 +34,14 @@ public PopupOverlay( IPrototypeManager protoManager, IUserInterfaceManager uiManager, PopupUIController controller, + ExamineSystemShared examine, PopupSystem popup) { _configManager = configManager; _entManager = entManager; _playerMgr = playerMgr; _uiManager = uiManager; + _examine = examine; _popup = popup; _controller = controller; @@ -81,7 +84,7 @@ private void DrawWorld(DrawingHandleScreen worldHandle, OverlayDrawArgs args, fl var distance = (mapPos.Position - args.WorldBounds.Center).Length(); // Should handle fade here too wyci. - if (!args.WorldBounds.Contains(mapPos.Position) || !ExamineSystemShared.InRangeUnOccluded(viewPos, mapPos, distance, + if (!args.WorldBounds.Contains(mapPos.Position) || !_examine.InRangeUnOccluded(viewPos, mapPos, distance, e => e == popup.InitialPos.EntityId || e == ourEntity, entMan: _entManager)) continue; diff --git a/Content.Client/Popups/PopupSystem.cs b/Content.Client/Popups/PopupSystem.cs index cf96c41241a..46c1e0cdf62 100644 --- a/Content.Client/Popups/PopupSystem.cs +++ b/Content.Client/Popups/PopupSystem.cs @@ -1,4 +1,5 @@ using System.Linq; +using Content.Shared.Examine; using Content.Shared.GameTicking; using Content.Shared.Popups; using Robust.Client.Graphics; @@ -26,6 +27,7 @@ public sealed class PopupSystem : SharedPopupSystem [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly IUserInterfaceManager _uiManager = default!; [Dependency] private readonly IReplayRecordingManager _replayRecording = default!; + [Dependency] private readonly ExamineSystemShared _examine = default!; public IReadOnlyList WorldLabels => _aliveWorldLabels; public IReadOnlyList CursorLabels => _aliveCursorLabels; @@ -51,6 +53,7 @@ public override void Initialize() _prototype, _uiManager, _uiManager.GetUIController(), + _examine, this)); } diff --git a/Content.Client/UserInterface/Systems/Chat/ChatUIController.cs b/Content.Client/UserInterface/Systems/Chat/ChatUIController.cs index ff4972d9d08..0ad78f974e5 100644 --- a/Content.Client/UserInterface/Systems/Chat/ChatUIController.cs +++ b/Content.Client/UserInterface/Systems/Chat/ChatUIController.cs @@ -627,7 +627,7 @@ private void UpdateQueuedSpeechBubbles(FrameEventArgs delta) var otherPos = EntityManager.GetComponent(ent).MapPosition; - if (occluded && !ExamineSystemShared.InRangeUnOccluded( + if (occluded && !_examine.InRangeUnOccluded( playerPos, otherPos, 0f, (ent, player), predicate)) diff --git a/Content.Client/Verbs/VerbSystem.cs b/Content.Client/Verbs/VerbSystem.cs index 329a8977a68..77f46a3fc97 100644 --- a/Content.Client/Verbs/VerbSystem.cs +++ b/Content.Client/Verbs/VerbSystem.cs @@ -20,7 +20,7 @@ namespace Content.Client.Verbs public sealed class VerbSystem : SharedVerbSystem { [Dependency] private readonly PopupSystem _popupSystem = default!; - [Dependency] private readonly ExamineSystem _examineSystem = default!; + [Dependency] private readonly ExamineSystem _examine = default!; [Dependency] private readonly TagSystem _tagSystem = default!; [Dependency] private readonly IStateManager _stateManager = default!; [Dependency] private readonly EntityLookupSystem _entityLookup = default!; @@ -77,7 +77,7 @@ public bool TryGetEntityMenuEntities(MapCoordinates targetPos, [NotNullWhen(true bool Predicate(EntityUid e) => e == player || entitiesUnderMouse.Contains(e); // first check the general location. - if (!_examineSystem.CanExamine(player.Value, targetPos, Predicate)) + if (!_examine.CanExamine(player.Value, targetPos, Predicate)) return false; TryComp(player.Value, out ExaminerComponent? examiner); @@ -86,7 +86,7 @@ public bool TryGetEntityMenuEntities(MapCoordinates targetPos, [NotNullWhen(true entities = new(); foreach (var ent in _entityLookup.GetEntitiesInRange(targetPos, EntityMenuLookupSize)) { - if (_examineSystem.CanExamine(player.Value, targetPos, Predicate, ent, examiner)) + if (_examine.CanExamine(player.Value, targetPos, Predicate, ent, examiner)) entities.Add(ent); } } @@ -147,7 +147,7 @@ public bool TryGetEntityMenuEntities(MapCoordinates targetPos, [NotNullWhen(true { var entity = entities[i]; - if (!ExamineSystemShared.InRangeUnOccluded( + if (!_examine.InRangeUnOccluded( playerPos, xformQuery.GetComponent(entity).MapPosition, ExamineSystemShared.ExamineRange, diff --git a/Content.Server/Administration/Systems/AdminVerbSystem.cs b/Content.Server/Administration/Systems/AdminVerbSystem.cs index c4754af9340..f5b237b4492 100644 --- a/Content.Server/Administration/Systems/AdminVerbSystem.cs +++ b/Content.Server/Administration/Systems/AdminVerbSystem.cs @@ -66,6 +66,7 @@ public sealed partial class AdminVerbSystem : EntitySystem [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly StationSystem _stations = default!; [Dependency] private readonly StationSpawningSystem _spawning = default!; + [Dependency] private readonly ExamineSystemShared _examine = default!; private readonly Dictionary> _openSolutionUis = new(); @@ -416,7 +417,7 @@ private void AddDebugVerbs(GetVerbsEvent args) Act = () => { - var message = ExamineSystemShared.InRangeUnOccluded(args.User, args.Target) + var message = _examine.InRangeUnOccluded(args.User, args.Target) ? Loc.GetString("in-range-unoccluded-verb-on-activate-not-occluded") : Loc.GetString("in-range-unoccluded-verb-on-activate-occluded"); diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Monstermos.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Monstermos.cs index f156125b0ff..dcbc1e86ee2 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Monstermos.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Monstermos.cs @@ -661,7 +661,7 @@ private void AdjustEqMovement(TileAtmosphere tile, AtmosDirection direction, flo // Turns out: no they don't. Temporary debug checks to figure out which caller is causing problems: if (tile == null) { - Logger.Error($"Encountered null-tile in {nameof(AdjustEqMovement)}. Trace: {Environment.StackTrace}"); + Log.Error($"Encountered null-tile in {nameof(AdjustEqMovement)}. Trace: {Environment.StackTrace}"); return; } var adj = tile.AdjacentTiles[direction.ToIndex()]; diff --git a/Content.Server/Chat/TypingIndicator/TypingIndicatorSystem.cs b/Content.Server/Chat/TypingIndicator/TypingIndicatorSystem.cs index 761e9456bcd..c923738930a 100644 --- a/Content.Server/Chat/TypingIndicator/TypingIndicatorSystem.cs +++ b/Content.Server/Chat/TypingIndicator/TypingIndicatorSystem.cs @@ -39,7 +39,7 @@ private void OnClientTypingChanged(TypingChangedEvent ev, EntitySessionEventArgs var uid = args.SenderSession.AttachedEntity; if (!Exists(uid)) { - Logger.Warning($"Client {args.SenderSession} sent TypingChangedEvent without an attached entity."); + Log.Warning($"Client {args.SenderSession} sent TypingChangedEvent without an attached entity."); return; } diff --git a/Content.Server/GameTicking/Rules/PiratesRuleSystem.cs b/Content.Server/GameTicking/Rules/PiratesRuleSystem.cs index f83d719c219..98926536b9d 100644 --- a/Content.Server/GameTicking/Rules/PiratesRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/PiratesRuleSystem.cs @@ -201,7 +201,7 @@ private void OnPlayerSpawningEvent(RulePlayerSpawningEvent ev) if (!gridId.HasValue) { - Logger.ErrorS("pirates", $"Gridid was null when loading \"{map}\", aborting."); + Log.Error($"Gridid was null when loading \"{map}\", aborting."); foreach (var session in ops) { ev.PlayerPool.Add(session); @@ -230,7 +230,7 @@ private void OnPlayerSpawningEvent(RulePlayerSpawningEvent ev) if (spawns.Count == 0) { spawns.Add(Transform(pirates.PirateShip).Coordinates); - Logger.WarningS("pirates", $"Fell back to default spawn for pirates!"); + Log.Warning($"Fell back to default spawn for pirates!"); } for (var i = 0; i < ops.Length; i++) diff --git a/Content.Server/NPC/Systems/NPCUtilitySystem.cs b/Content.Server/NPC/Systems/NPCUtilitySystem.cs index fc483f68c3b..33941be9292 100644 --- a/Content.Server/NPC/Systems/NPCUtilitySystem.cs +++ b/Content.Server/NPC/Systems/NPCUtilitySystem.cs @@ -43,6 +43,7 @@ public sealed class NPCUtilitySystem : EntitySystem [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly SolutionContainerSystem _solutions = default!; [Dependency] private readonly WeldableSystem _weldable = default!; + [Dependency] private readonly ExamineSystemShared _examine = default!; private EntityQuery _puddleQuery; private EntityQuery _xformQuery; @@ -296,7 +297,7 @@ private float GetScore(NPCBlackboard blackboard, EntityUid targetUid, UtilityCon { var radius = blackboard.GetValueOrDefault(NPCBlackboard.VisionRadius, EntityManager); - return ExamineSystemShared.InRangeUnOccluded(owner, targetUid, radius + 0.5f, null) ? 1f : 0f; + return _examine.InRangeUnOccluded(owner, targetUid, radius + 0.5f, null) ? 1f : 0f; } case TargetInLOSOrCurrentCon: { @@ -313,7 +314,7 @@ private float GetScore(NPCBlackboard blackboard, EntityUid targetUid, UtilityCon return 1f; } - return ExamineSystemShared.InRangeUnOccluded(owner, targetUid, radius + bufferRange, null) ? 1f : 0f; + return _examine.InRangeUnOccluded(owner, targetUid, radius + bufferRange, null) ? 1f : 0f; } case TargetIsAliveCon: { diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PsionicRegenerationPowerSystem.cs b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PsionicRegenerationPowerSystem.cs index 2eca3173b6d..097a0cb750b 100644 --- a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PsionicRegenerationPowerSystem.cs +++ b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PsionicRegenerationPowerSystem.cs @@ -38,6 +38,7 @@ public sealed class PsionicRegenerationPowerSystem : EntitySystem [Dependency] private readonly SharedPsionicAbilitiesSystem _psionics = default!; [Dependency] private readonly IGameTiming _gameTiming = default!; [Dependency] private readonly MindSystem _mindSystem = default!; + [Dependency] private readonly ExamineSystemShared _examine = default!; public override void Initialize() @@ -76,7 +77,7 @@ private void OnPowerUsed(EntityUid uid, PsionicRegenerationPowerComponent compon _popupSystem.PopupEntity(Loc.GetString("psionic-regeneration-begin", ("entity", uid)), uid, // TODO: Use LoS-based Filter when one is available. - Filter.Pvs(uid).RemoveWhereAttachedEntity(entity => !ExamineSystemShared.InRangeUnOccluded(uid, entity, ExamineRange, null)), + Filter.Pvs(uid).RemoveWhereAttachedEntity(entity => !_examine.InRangeUnOccluded(uid, entity, ExamineRange, null)), true, PopupType.Medium); diff --git a/Content.Server/Pointing/EntitySystems/PointingSystem.cs b/Content.Server/Pointing/EntitySystems/PointingSystem.cs index a7c455e6a5d..06d2d6f58b5 100644 --- a/Content.Server/Pointing/EntitySystems/PointingSystem.cs +++ b/Content.Server/Pointing/EntitySystems/PointingSystem.cs @@ -37,6 +37,7 @@ internal sealed class PointingSystem : SharedPointingSystem [Dependency] private readonly VisibilitySystem _visibilitySystem = default!; [Dependency] private readonly SharedMindSystem _minds = default!; [Dependency] private readonly IAdminLogManager _adminLogger = default!; + [Dependency] private readonly ExamineSystemShared _examine = default!; private static readonly TimeSpan PointDelay = TimeSpan.FromSeconds(0.5f); @@ -100,7 +101,7 @@ public bool InRange(EntityUid pointer, EntityCoordinates coordinates) } else { - return ExamineSystemShared.InRangeUnOccluded(pointer, coordinates, 15, predicate: e => e == pointer); + return _examine.InRangeUnOccluded(pointer, coordinates, 15, predicate: e => e == pointer); } } diff --git a/Content.Server/Remotes/DoorRemoteSystem.cs b/Content.Server/Remotes/DoorRemoteSystem.cs index 6403c41addf..d335911901a 100644 --- a/Content.Server/Remotes/DoorRemoteSystem.cs +++ b/Content.Server/Remotes/DoorRemoteSystem.cs @@ -22,6 +22,7 @@ public sealed class DoorRemoteSystem : EntitySystem [Dependency] private readonly SharedPopupSystem _popupSystem = default!; [Dependency] private readonly DoorSystem _doorSystem = default!; [Dependency] private readonly SharedInteractionSystem _interactionSystem = default!; + [Dependency] private readonly ExamineSystemShared _examine = default!; // I'm so sorry [Dependency] private readonly SharedAirlockSystem _sharedAirlockSystem = default!; public override void Initialize() @@ -67,7 +68,7 @@ private void OnBeforeInteract(EntityUid uid, DoorRemoteComponent component, Befo || !TryComp(args.Target, out var doorComp) // If it isn't a door we don't use it // Only able to control doors if they are within your vision and within your max range. // Not affected by mobs or machines anymore. - || !ExamineSystemShared.InRangeUnOccluded(args.User, args.Target.Value, SharedInteractionSystem.MaxRaycastRange, null)) + || !_examine.InRangeUnOccluded(args.User, args.Target.Value, SharedInteractionSystem.MaxRaycastRange, null)) { return; } diff --git a/Content.Server/Tabletop/TabletopSystem.Session.cs b/Content.Server/Tabletop/TabletopSystem.Session.cs index f16f3f01e98..c2bb8426fc2 100644 --- a/Content.Server/Tabletop/TabletopSystem.Session.cs +++ b/Content.Server/Tabletop/TabletopSystem.Session.cs @@ -31,7 +31,7 @@ public TabletopSession EnsureSession(TabletopGameComponent tabletop) // Since this is the first time opening this session, set up the game tabletop.Setup.SetupTabletop(session, EntityManager); - Logger.Info($"Created tabletop session number {tabletop} at position {session.Position}."); + Log.Info($"Created tabletop session number {tabletop} at position {session.Position}."); return session; } diff --git a/Content.Shared/Examine/ExamineSystemShared.cs b/Content.Shared/Examine/ExamineSystemShared.cs index 5a3fb872293..f792862be14 100644 --- a/Content.Shared/Examine/ExamineSystemShared.cs +++ b/Content.Shared/Examine/ExamineSystemShared.cs @@ -144,7 +144,7 @@ public bool IsOccluded(EntityUid uid) return TryComp(uid, out var eye) && eye.DrawFov; } - public static bool InRangeUnOccluded(MapCoordinates origin, MapCoordinates other, float range, Ignored? predicate, bool ignoreInsideBlocker = true, IEntityManager? entMan = null) + public bool InRangeUnOccluded(MapCoordinates origin, MapCoordinates other, float range, Ignored? predicate, bool ignoreInsideBlocker = true, IEntityManager? entMan = null) { // No, rider. This is better. // ReSharper disable once ConvertToLocalFunction @@ -154,7 +154,7 @@ public static bool InRangeUnOccluded(MapCoordinates origin, MapCoordinates other return InRangeUnOccluded(origin, other, range, predicate, wrapped, ignoreInsideBlocker, entMan); } - public static bool InRangeUnOccluded(MapCoordinates origin, MapCoordinates other, float range, + public bool InRangeUnOccluded(MapCoordinates origin, MapCoordinates other, float range, TState state, Func predicate, bool ignoreInsideBlocker = true, IEntityManager? entMan = null) { if (other.MapId != origin.MapId || @@ -171,7 +171,7 @@ public static bool InRangeUnOccluded(MapCoordinates origin, MapCoordinat if (length > MaxRaycastRange) { - Logger.Warning("InRangeUnOccluded check performed over extreme range. Limiting CollisionRay size."); + Log.Warning("InRangeUnOccluded check performed over extreme range. Limiting CollisionRay size."); length = MaxRaycastRange; } @@ -207,7 +207,7 @@ public static bool InRangeUnOccluded(MapCoordinates origin, MapCoordinat return true; } - public static bool InRangeUnOccluded(EntityUid origin, EntityUid other, float range = ExamineRange, Ignored? predicate = null, bool ignoreInsideBlocker = true) + public bool InRangeUnOccluded(EntityUid origin, EntityUid other, float range = ExamineRange, Ignored? predicate = null, bool ignoreInsideBlocker = true) { var entMan = IoCManager.Resolve(); var originPos = entMan.GetComponent(origin).MapPosition; @@ -216,7 +216,7 @@ public static bool InRangeUnOccluded(EntityUid origin, EntityUid other, float ra return InRangeUnOccluded(originPos, otherPos, range, predicate, ignoreInsideBlocker); } - public static bool InRangeUnOccluded(EntityUid origin, EntityCoordinates other, float range = ExamineRange, Ignored? predicate = null, bool ignoreInsideBlocker = true) + public bool InRangeUnOccluded(EntityUid origin, EntityCoordinates other, float range = ExamineRange, Ignored? predicate = null, bool ignoreInsideBlocker = true) { var entMan = IoCManager.Resolve(); var originPos = entMan.GetComponent(origin).MapPosition; @@ -225,7 +225,7 @@ public static bool InRangeUnOccluded(EntityUid origin, EntityCoordinates other, return InRangeUnOccluded(originPos, otherPos, range, predicate, ignoreInsideBlocker); } - public static bool InRangeUnOccluded(EntityUid origin, MapCoordinates other, float range = ExamineRange, Ignored? predicate = null, bool ignoreInsideBlocker = true) + public bool InRangeUnOccluded(EntityUid origin, MapCoordinates other, float range = ExamineRange, Ignored? predicate = null, bool ignoreInsideBlocker = true) { var entMan = IoCManager.Resolve(); var originPos = entMan.GetComponent(origin).MapPosition; From a8242a38a3cd3883aca423e8fb87a8476089c798 Mon Sep 17 00:00:00 2001 From: SimpleStation14 <130339894+SimpleStation14@users.noreply.github.com> Date: Tue, 28 May 2024 21:34:09 -0400 Subject: [PATCH 027/155] Mirror: CargoConsoleMenu localization (#127) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Mirror of PR #25931: [CargoConsoleMenu localization](https://github.com/space-wizards/space-station-14/pull/25931) from space-wizards [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `6e38b992cfc607e09178efc178b86f35152f0cde` PR opened by modern-nm at 2024-03-08 14:46:29 UTC PR merged by web-flow at 2024-03-09 06:56:40 UTC --- PR changed 20 files with 211 additions and 195 deletions. The PR had the following labels: - Changes: UI ---

Original Body

> > > > ## About the PR > > This PR adds localization capability for CargoConsoleMenu (name of entity: ComputerCargoOrders) > > ## Why / Balance > > > Please let me tell you a story of my vision. First i decided to make these changes on one of russian community servers. But taking into account future changes of .yml files by space-wizards community (they are regularly added to our space-station build), we will have to constantly edit xml files to remove duplicate categories — imagine someone added cargoproduct with category "Fun", when we have tons of items with category "Развлечения". > > To summarize: my PR makes possible to localize categories of "cargoproduct" and makes communities do less work when upstream comes > > ## Technical details > > > New code considers strings comparisons of prototype.Category (Content.Client/Cargo/UI/CargoConsoleMenu.xaml.cs) using Loc.GetString(...). And that's all. > > ## Media > > Off course there are no visible changes on eng-localization > > ![Снимок_ножницы](https://github.com/space-wizards/space-station-14/assets/87994977/5cdbf5df-c4cc-42e6-861b-aa35a009e957) > > That's how these changes look like on our community build, using other .ftl file > > ![Снимок_ножницы2](https://github.com/space-wizards/space-station-14/assets/87994977/20023fc8-5cdf-4069-981b-edbfa98fa31d) > > > - [x] I have added screenshots/videos to this PR showcasing its changes ingame, **or** this PR does not require an ingame showcase > > ## Breaking changes > > > > .yml > - every category of type "cargoProduct" was edited to "cargoproduct-category-name-{categoryName}" > > .ftl > - file "cargoproduct-categories.ftl" was added to english localization to localize categories of cargoProduct > > .cs > - CargoConsoleMenu.xaml.cs got tweaks which prevent issues with strings comparisons > > **Changelog** > >
--------- Signed-off-by: VMSolidus Co-authored-by: MODERN <87994977+modern-nm@users.noreply.github.com> Co-authored-by: VMSolidus --- .../Cargo/UI/CargoConsoleMenu.xaml.cs | 4 +- .../catalog/cargo/cargoproduct-categories.ftl | 16 +++++ .../Prototypes/Catalog/Cargo/cargo_armory.yml | 12 ++-- .../Catalog/Cargo/cargo_atmospherics.yml | 22 +++---- .../Prototypes/Catalog/Cargo/cargo_botany.yml | 10 ++-- .../Prototypes/Catalog/Cargo/cargo_cargo.yml | 4 +- .../Catalog/Cargo/cargo_circuitboards.yml | 2 +- .../Catalog/Cargo/cargo_emergency.yml | 16 ++--- .../Catalog/Cargo/cargo_engineering.yml | 28 ++++----- .../Catalog/Cargo/cargo_engines.yml | 36 ++++++------ .../Prototypes/Catalog/Cargo/cargo_food.yml | 16 ++--- .../Prototypes/Catalog/Cargo/cargo_fun.yml | 58 +++++++++---------- .../Catalog/Cargo/cargo_livestock.yml | 46 +++++++-------- .../Catalog/Cargo/cargo_materials.yml | 22 +++---- .../Catalog/Cargo/cargo_medical.yml | 30 +++++----- .../Catalog/Cargo/cargo_science.yml | 6 +- .../Catalog/Cargo/cargo_security.yml | 18 +++--- .../Catalog/Cargo/cargo_service.yml | 38 ++++++------ .../Catalog/Cargo/cargo_shuttle.yml | 6 +- .../Catalog/Cargo/cargo_vending.yml | 52 ++++++++--------- 20 files changed, 229 insertions(+), 213 deletions(-) create mode 100644 Resources/Locale/en-US/prototypes/catalog/cargo/cargoproduct-categories.ftl diff --git a/Content.Client/Cargo/UI/CargoConsoleMenu.xaml.cs b/Content.Client/Cargo/UI/CargoConsoleMenu.xaml.cs index baf0d31f1f1..e60335bc45c 100644 --- a/Content.Client/Cargo/UI/CargoConsoleMenu.xaml.cs +++ b/Content.Client/Cargo/UI/CargoConsoleMenu.xaml.cs @@ -93,7 +93,7 @@ public void PopulateProducts() if (search.Length == 0 && _category == null || search.Length != 0 && prototype.Name.ToLowerInvariant().Contains(search) || search.Length != 0 && prototype.Description.ToLowerInvariant().Contains(search) || - search.Length == 0 && _category != null && prototype.Category.Equals(_category)) + search.Length == 0 && _category != null && Loc.GetString(prototype.Category).Equals(_category)) { var button = new CargoProductRow { @@ -122,7 +122,7 @@ public void PopulateCategories() foreach (var prototype in ProductPrototypes) { - if (!_categoryStrings.Contains(prototype.Category)) + if (!_categoryStrings.Contains(Loc.GetString(prototype.Category))) { _categoryStrings.Add(Loc.GetString(prototype.Category)); } diff --git a/Resources/Locale/en-US/prototypes/catalog/cargo/cargoproduct-categories.ftl b/Resources/Locale/en-US/prototypes/catalog/cargo/cargoproduct-categories.ftl new file mode 100644 index 00000000000..f2451527b09 --- /dev/null +++ b/Resources/Locale/en-US/prototypes/catalog/cargo/cargoproduct-categories.ftl @@ -0,0 +1,16 @@ +cargoproduct-category-name-armory = Armory +cargoproduct-category-name-atmospherics = Atmospherics +cargoproduct-category-name-cargo = Cargo +cargoproduct-category-name-circuitboards = Circuitboards +cargoproduct-category-name-emergency = Emergency +cargoproduct-category-name-engineering = Engineering +cargoproduct-category-name-food = Food +cargoproduct-category-name-fun = Fun +cargoproduct-category-name-hydroponics = Hydroponics +cargoproduct-category-name-livestock = Livestock +cargoproduct-category-name-materials = Materials +cargoproduct-category-name-medical = Medical +cargoproduct-category-name-science = Science +cargoproduct-category-name-security = Security +cargoproduct-category-name-service = Service +cargoproduct-category-name-shuttle = Shuttle diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_armory.yml b/Resources/Prototypes/Catalog/Cargo/cargo_armory.yml index 399181b4fab..6341042bf89 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_armory.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_armory.yml @@ -5,7 +5,7 @@ state: icon product: CrateArmorySMG cost: 9000 - category: Armory + category: cargoproduct-category-name-armory group: market - type: cargoProduct @@ -15,7 +15,7 @@ state: icon product: CrateArmoryShotgun cost: 7000 - category: Armory + category: cargoproduct-category-name-armory group: market - type: cargoProduct @@ -25,7 +25,7 @@ state: implanter0 product: CrateTrackingImplants cost: 1000 - category: Armory + category: cargoproduct-category-name-armory group: market - type: cargoProduct @@ -35,7 +35,7 @@ state: training-bomb product: CrateTrainingBombs cost: 3000 - category: Armory + category: cargoproduct-category-name-armory group: market - type: cargoProduct @@ -45,7 +45,7 @@ state: icon product: CrateArmoryLaser cost: 4800 - category: Armory + category: cargoproduct-category-name-armory group: market - type: cargoProduct @@ -55,5 +55,5 @@ state: icon product: CrateArmoryPistols cost: 5200 - category: Armory + category: cargoproduct-category-name-armory group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_atmospherics.yml b/Resources/Prototypes/Catalog/Cargo/cargo_atmospherics.yml index 0aa49383992..c85210adf6a 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_atmospherics.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_atmospherics.yml @@ -5,7 +5,7 @@ state: grey product: AirCanister cost: 1100 - category: Atmospherics + category: cargoproduct-category-name-atmospherics group: market - type: cargoProduct @@ -15,7 +15,7 @@ state: blue product: OxygenCanister cost: 1100 - category: Atmospherics + category: cargoproduct-category-name-atmospherics group: market - type: cargoProduct @@ -25,7 +25,7 @@ state: blue product: LiquidOxygenCanister cost: 2500 - category: Atmospherics + category: cargoproduct-category-name-atmospherics group: market - type: cargoProduct @@ -35,7 +35,7 @@ state: red product: NitrogenCanister cost: 1100 - category: Atmospherics + category: cargoproduct-category-name-atmospherics group: market - type: cargoProduct @@ -45,7 +45,7 @@ state: red product: LiquidNitrogenCanister cost: 2500 - category: Atmospherics + category: cargoproduct-category-name-atmospherics group: market - type: cargoProduct @@ -55,7 +55,7 @@ state: black product: CarbonDioxideCanister cost: 2200 # Until someone fixes it co2 can be used to oneshot people so it's more expensive - category: Atmospherics + category: cargoproduct-category-name-atmospherics group: market - type: cargoProduct @@ -65,7 +65,7 @@ state: black product: LiquidCarbonDioxideCanister cost: 4000 - category: Atmospherics + category: cargoproduct-category-name-atmospherics group: market - type: cargoProduct @@ -75,7 +75,7 @@ state: yellow product: StorageCanister cost: 1010 # No gases in it so it's cheaper - category: Atmospherics + category: cargoproduct-category-name-atmospherics group: market #- type: cargoProduct @@ -87,7 +87,7 @@ # state: water_vapor # product: WaterVaporCanister # cost: 2600 -# category: Atmospherics +# category: cargoproduct-category-name-atmospherics # group: market - type: cargoProduct @@ -97,7 +97,7 @@ state: orange product: PlasmaCanister cost: 4000 - category: Atmospherics + category: cargoproduct-category-name-atmospherics group: market #- type: cargoProduct @@ -109,5 +109,5 @@ # state: green # product: TritiumCanister # cost: 15500 -# category: Atmospherics +# category: cargoproduct-category-name-atmospherics # group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_botany.yml b/Resources/Prototypes/Catalog/Cargo/cargo_botany.yml index 4a80b76a3fa..a6671ff0998 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_botany.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_botany.yml @@ -5,7 +5,7 @@ state: seed product: CrateHydroponicsSeedsExotic cost: 1000 - category: Hydroponics + category: cargoproduct-category-name-hydroponics group: market - type: cargoProduct @@ -15,7 +15,7 @@ state: seed product: CrateHydroponicsSeedsMedicinal cost: 500 - category: Hydroponics + category: cargoproduct-category-name-hydroponics group: market - type: cargoProduct @@ -25,7 +25,7 @@ state: icon product: CrateHydroponicsTools cost: 500 - category: Hydroponics + category: cargoproduct-category-name-hydroponics group: market - type: cargoProduct @@ -35,7 +35,7 @@ state: seed product: CrateHydroponicsSeeds cost: 550 - category: Hydroponics + category: cargoproduct-category-name-hydroponics group: market - type: cargoProduct @@ -45,5 +45,5 @@ state: jug product: CratePlantBGone cost: 750 - category: Hydroponics + category: cargoproduct-category-name-hydroponics group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_cargo.yml b/Resources/Prototypes/Catalog/Cargo/cargo_cargo.yml index 9dac47b6f15..fb3b2da41a8 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_cargo.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_cargo.yml @@ -15,7 +15,7 @@ state: orebox product: OreBox cost: 500 - category: Logistics # DeltaV - Logistics Department replacing Cargo + category: cargoproduct-category-name-cargo group: market - type: cargoProduct @@ -25,5 +25,5 @@ state: icon product: CrateCargoLuxuryHardsuit cost: 15000 - category: Logistics # DeltaV - Logistics Department replacing Cargo + category: cargoproduct-category-name-cargo group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_circuitboards.yml b/Resources/Prototypes/Catalog/Cargo/cargo_circuitboards.yml index 0af5b5db016..a96780fc3ed 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_circuitboards.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_circuitboards.yml @@ -5,5 +5,5 @@ state: cpuboard product: CrateCrewMonitoringBoards cost: 2000 - category: Circuitboards + category: cargoproduct-category-name-circuitboards group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_emergency.yml b/Resources/Prototypes/Catalog/Cargo/cargo_emergency.yml index 2777f859a07..2715e0c3501 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_emergency.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_emergency.yml @@ -5,7 +5,7 @@ state: icon product: CrateEmergencyExplosive cost: 650 - category: Emergency + category: cargoproduct-category-name-emergency group: market - type: cargoProduct @@ -15,7 +15,7 @@ state: fire_extinguisher_closed product: CrateEmergencyFire cost: 1500 - category: Emergency + category: cargoproduct-category-name-emergency group: market - type: cargoProduct @@ -25,7 +25,7 @@ state: icon product: CrateEmergencyInternals cost: 500 - category: Emergency + category: cargoproduct-category-name-emergency group: market - type: cargoProduct @@ -35,7 +35,7 @@ state: icon product: CrateEmergencyInternalsLarge cost: 2000 - category: Emergency + category: cargoproduct-category-name-emergency group: market - type: cargoProduct @@ -45,7 +45,7 @@ state: radiation product: CrateEmergencyRadiation cost: 1000 - category: Emergency + category: cargoproduct-category-name-emergency group: market - type: cargoProduct @@ -55,7 +55,7 @@ state: item_wall product: CrateEmergencyInflatablewall cost: 500 - category: Emergency + category: cargoproduct-category-name-emergency group: market - type: cargoProduct @@ -65,7 +65,7 @@ state: icon product: CrateSlimepersonLifeSupport cost: 300 - category: Emergency + category: cargoproduct-category-name-emergency group: market - type: cargoProduct @@ -75,5 +75,5 @@ state: icon product: CrateGenericBiosuit cost: 800 - category: Emergency + category: cargoproduct-category-name-emergency group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_engineering.yml b/Resources/Prototypes/Catalog/Cargo/cargo_engineering.yml index b5468fd982c..754e30f133a 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_engineering.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_engineering.yml @@ -5,7 +5,7 @@ state: coillv-30 product: CrateEngineeringCableLV cost: 300 - category: Engineering + category: cargoproduct-category-name-engineering group: market - type: cargoProduct @@ -15,7 +15,7 @@ state: coilmv-30 product: CrateEngineeringCableMV cost: 300 - category: Engineering + category: cargoproduct-category-name-engineering group: market - type: cargoProduct @@ -25,7 +25,7 @@ state: coilhv-30 product: CrateEngineeringCableHV cost: 300 - category: Engineering + category: cargoproduct-category-name-engineering group: market - type: cargoProduct @@ -35,7 +35,7 @@ state: coilall-30 product: CrateEngineeringCableBulk cost: 750 - category: Engineering + category: cargoproduct-category-name-engineering group: market - type: cargoProduct @@ -45,7 +45,7 @@ state: icon product: CrateEngineeringElectricalSupplies cost: 4500 - category: Engineering + category: cargoproduct-category-name-engineering group: market - type: cargoProduct @@ -55,7 +55,7 @@ state: icon product: CrateEngineeringStationBeaconBundle cost: 500 - category: Engineering + category: cargoproduct-category-name-engineering group: market - type: cargoProduct @@ -65,7 +65,7 @@ state: icon product: CrateEngineeringJetpack cost: 1000 - category: Engineering + category: cargoproduct-category-name-engineering group: market - type: cargoProduct @@ -75,7 +75,7 @@ state: icon product: CrateEngineeringMiniJetpack cost: 750 - category: Engineering + category: cargoproduct-category-name-engineering group: market - type: cargoProduct @@ -85,7 +85,7 @@ state: icon product: CrateAirlockKit cost: 1100 - category: Engineering + category: cargoproduct-category-name-engineering group: market - type: cargoProduct @@ -95,7 +95,7 @@ state: icon product: CrateEvaKit cost: 5000 - category: Engineering + category: cargoproduct-category-name-engineering group: market - type: cargoProduct @@ -105,7 +105,7 @@ state: ammo product: CrateRCDAmmo cost: 2500 - category: Engineering + category: cargoproduct-category-name-engineering group: market - type: cargoProduct @@ -115,7 +115,7 @@ state: icon product: CrateRCD cost: 800 - category: Engineering + category: cargoproduct-category-name-engineering group: market - type: cargoProduct @@ -125,7 +125,7 @@ state: base product: CrateParticleDecelerators cost: 15000 - category: Engineering + category: cargoproduct-category-name-engineering group: market - type: cargoProduct @@ -135,5 +135,5 @@ state: sheaterOff product: SpaceHeaterAnchored cost: 300 - category: Engineering + category: cargoproduct-category-name-engineering group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_engines.yml b/Resources/Prototypes/Catalog/Cargo/cargo_engines.yml index ece817b746e..bd00b0c2d4c 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_engines.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_engines.yml @@ -5,7 +5,7 @@ state: jar product: CrateEngineeringAMEJar cost: 2000 - category: Engineering + category: cargoproduct-category-name-engineering group: market - type: cargoProduct @@ -15,7 +15,7 @@ state: icon product: CrateEngineeringSingularityGenerator cost: 4000 - category: Engineering + category: cargoproduct-category-name-engineering group: market - type: cargoProduct @@ -25,7 +25,7 @@ state: icon product: CrateEngineeringSingularityContainment cost: 1000 - category: Engineering + category: cargoproduct-category-name-engineering group: market #- type: cargoProduct @@ -37,7 +37,7 @@ # state: emitter2 # product: CrateEngineeringSingularityEmitter # cost: 3000 -# category: Engineering +# category: cargoproduct-category-name-engineering # group: market - type: cargoProduct @@ -47,7 +47,7 @@ state: ca_on product: CrateEngineeringSingularityCollector cost: 1000 - category: Engineering + category: cargoproduct-category-name-engineering group: market - type: cargoProduct @@ -57,7 +57,7 @@ state: completed product: CrateEngineeringParticleAccelerator cost: 2000 - category: Engineering + category: cargoproduct-category-name-engineering group: market - type: cargoProduct @@ -67,18 +67,18 @@ state: solar-assembly-part product: CrateEngineeringSolar cost: 500 - category: Engineering + category: cargoproduct-category-name-engineering group: market -#- type: cargoProduct -# id: EngineTeslaGenerator -# icon: -# sprite: Structures/Power/Generation/Tesla/generator.rsi -# state: icon -# product: CrateEngineeringTeslaGenerator -# cost: 4000 -# category: Engineering -# group: market +- type: cargoProduct + id: EngineTeslaGenerator + icon: + sprite: Structures/Power/Generation/Tesla/generator.rsi + state: icon + product: CrateEngineeringTeslaGenerator + cost: 4000 + category: cargoproduct-category-name-engineering + group: market - type: cargoProduct id: EngineTeslaCoil @@ -87,7 +87,7 @@ state: coil product: CrateEngineeringTeslaCoil cost: 1200 - category: Engineering + category: cargoproduct-category-name-engineering group: market - type: cargoProduct @@ -97,5 +97,5 @@ state: grounding_rod product: CrateEngineeringTeslaGroundingRod cost: 400 - category: Engineering + category: cargoproduct-category-name-engineering group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_food.yml b/Resources/Prototypes/Catalog/Cargo/cargo_food.yml index e5069959296..1a6f8380961 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_food.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_food.yml @@ -5,7 +5,7 @@ state: margherita-slice product: CrateFoodPizza cost: 450 - category: Food + category: cargoproduct-category-name-food group: market - type: cargoProduct @@ -15,7 +15,7 @@ state: margherita product: CrateFoodPizzaLarge cost: 1800 - category: Food + category: cargoproduct-category-name-food group: market - type: cargoProduct @@ -25,7 +25,7 @@ state: nutribrick product: CrateFoodMRE cost: 1000 - category: Food + category: cargoproduct-category-name-food group: market - type: cargoProduct @@ -35,7 +35,7 @@ state: flour-big product: CrateFoodCooking cost: 750 - category: Food + category: cargoproduct-category-name-food group: market - type: cargoProduct @@ -45,7 +45,7 @@ state: tin product: CrateFoodDinnerware cost: 750 - category: Food + category: cargoproduct-category-name-food group: market - type: cargoProduct @@ -55,7 +55,7 @@ state: icon product: CrateFoodBarSupply cost: 750 - category: Food + category: cargoproduct-category-name-food group: market - type: cargoProduct @@ -65,7 +65,7 @@ state: icon product: CrateFoodSoftdrinks cost: 1200 - category: Food + category: cargoproduct-category-name-food group: market - type: cargoProduct @@ -75,5 +75,5 @@ state: icon product: CrateFoodSoftdrinksLarge cost: 2400 - category: Food + category: cargoproduct-category-name-food group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_fun.yml b/Resources/Prototypes/Catalog/Cargo/cargo_fun.yml index d84fedd543f..c29458a1ee5 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_fun.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_fun.yml @@ -5,7 +5,7 @@ state: icon product: CrateFunInstrumentsVariety cost: 2000 - category: Fun + category: cargoproduct-category-name-fun group: market - type: cargoProduct @@ -15,7 +15,7 @@ state: tuba product: CrateFunInstrumentsBrass cost: 2500 - category: Fun + category: cargoproduct-category-name-fun group: market - type: cargoProduct @@ -25,7 +25,7 @@ state: icon product: CrateFunInstrumentsString cost: 2500 - category: Fun + category: cargoproduct-category-name-fun group: market - type: cargoProduct @@ -35,7 +35,7 @@ state: icon product: CrateFunInstrumentsWoodwind cost: 2500 - category: Fun + category: cargoproduct-category-name-fun group: market - type: cargoProduct @@ -45,7 +45,7 @@ state: icon product: CrateFunInstrumentsKeyedPercussion cost: 2500 - category: Fun + category: cargoproduct-category-name-fun group: market - type: cargoProduct @@ -55,7 +55,7 @@ state: icon product: CrateFunInstrumentsSpecial cost: 10000 - category: Fun + category: cargoproduct-category-name-fun group: market - type: cargoProduct @@ -65,7 +65,7 @@ state: box product: CrateFunArtSupplies cost: 500 - category: Fun + category: cargoproduct-category-name-fun group: market - type: cargoProduct @@ -85,7 +85,7 @@ state: birthday product: CrateFunParty cost: 1000 - category: Fun + category: cargoproduct-category-name-fun group: market - type: cargoProduct @@ -95,7 +95,7 @@ state: display product: CrateFunWaterGuns cost: 750 - category: Fun + category: cargoproduct-category-name-fun group: market - type: cargoProduct @@ -105,7 +105,7 @@ state: plushie_h product: CrateFunPlushie cost: 1000 - category: Fun + category: cargoproduct-category-name-fun group: market - type: cargoProduct @@ -115,7 +115,7 @@ state: plushie_lizard product: CrateFunLizardPlushieBulk cost: 500 - category: Fun + category: cargoproduct-category-name-fun group: market - type: cargoProduct @@ -125,7 +125,7 @@ state: d6_6 product: CrateFunBoardGames cost: 1500 - category: Fun + category: cargoproduct-category-name-fun group: market - type: cargoProduct @@ -135,7 +135,7 @@ state: implanter0 product: CrateFunSadTromboneImplants cost: 1000 - category: Fun + category: cargoproduct-category-name-fun group: market - type: cargoProduct @@ -145,7 +145,7 @@ state: implanter0 product: CrateFunLightImplants cost: 1000 - category: Fun + category: cargoproduct-category-name-fun group: market - type: cargoProduct @@ -155,7 +155,7 @@ state: icon product: CrateFunBoxing cost: 500 - category: Fun + category: cargoproduct-category-name-fun group: market - type: cargoProduct @@ -165,7 +165,7 @@ state: crate_icon product: CrateFunPirate cost: 400 - category: Fun + category: cargoproduct-category-name-fun group: market - type: cargoProduct @@ -175,7 +175,7 @@ state: crate_icon product: CrateFunToyBox cost: 900 - category: Fun + category: cargoproduct-category-name-fun group: market - type: cargoProduct @@ -185,7 +185,7 @@ state: implanter0 product: CrateFunBikeHornImplants cost: 1000 - category: Fun + category: cargoproduct-category-name-fun group: market - type: cargoProduct @@ -195,7 +195,7 @@ state: fig_box product: CrateFunMysteryFigurines cost: 4000 - category: Fun + category: cargoproduct-category-name-fun group: market - type: cargoProduct @@ -205,15 +205,15 @@ state: icon product: CrateFunDartsSet cost: 900 - category: Fun + category: cargoproduct-category-name-fun group: market -#- type: cargoProduct -# id: FunCrateGambling -# icon: -# sprite: Objects/Economy/cash.rsi -# state: cash_1000000 -# product: CrateCargoGambling -# cost: 10000 -# category: Fun -# group: market +- type: cargoProduct + id: FunCrateGambling + icon: + sprite: Objects/Economy/cash.rsi + state: cash_1000000 + product: CrateCargoGambling + cost: 10000 + category: cargoproduct-category-name-fun + group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_livestock.yml b/Resources/Prototypes/Catalog/Cargo/cargo_livestock.yml index 6ef0ab4e211..922e2951b6c 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_livestock.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_livestock.yml @@ -5,7 +5,7 @@ state: 0 product: CrateNPCBee cost: 7000 - category: Livestock + category: cargoproduct-category-name-livestock group: market - type: cargoProduct @@ -15,7 +15,7 @@ state: butterfly product: CrateNPCButterflies cost: 4400 - category: Livestock + category: cargoproduct-category-name-livestock group: market - type: cargoProduct @@ -25,7 +25,7 @@ state: cat product: CrateNPCCat cost: 1200 - category: Livestock + category: cargoproduct-category-name-livestock group: market - type: cargoProduct @@ -35,7 +35,7 @@ state: icon-1 product: CrateNPCChicken cost: 4000 - category: Livestock + category: cargoproduct-category-name-livestock group: market - type: cargoProduct @@ -45,7 +45,7 @@ state: crab product: CrateNPCCrab cost: 3000 - category: Livestock + category: cargoproduct-category-name-livestock group: market - type: cargoProduct @@ -55,7 +55,7 @@ state: icon-0 product: CrateNPCDuck cost: 6000 - category: Livestock + category: cargoproduct-category-name-livestock group: market - type: cargoProduct @@ -65,7 +65,7 @@ state: corgi product: CrateNPCCorgi cost: 1200 - category: Livestock + category: cargoproduct-category-name-livestock group: market - type: cargoProduct @@ -75,7 +75,7 @@ state: puppy product: CrateNPCPuppyCorgi cost: 1200 - category: Livestock + category: cargoproduct-category-name-livestock group: market - type: cargoProduct @@ -85,7 +85,7 @@ state: cow product: CrateNPCCow cost: 3200 - category: Livestock + category: cargoproduct-category-name-livestock group: market - type: cargoProduct @@ -95,7 +95,7 @@ state: goat product: CrateNPCGoat cost: 1200 - category: Livestock + category: cargoproduct-category-name-livestock group: market - type: cargoProduct @@ -105,7 +105,7 @@ state: goose product: CrateNPCGoose cost: 2100 - category: Livestock + category: cargoproduct-category-name-livestock group: market - type: cargoProduct @@ -115,7 +115,7 @@ state: icon product: CrateNPCGorilla cost: 1100 - category: Livestock + category: cargoproduct-category-name-livestock group: market - type: cargoProduct @@ -125,7 +125,7 @@ state: box product: CrateNPCMonkeyCube cost: 2000 - category: Livestock + category: cargoproduct-category-name-livestock group: market - type: cargoProduct @@ -135,7 +135,7 @@ state: box_kobold product: CrateNPCKoboldCube cost: 2000 - category: Livestock + category: cargoproduct-category-name-livestock group: market - type: cargoProduct @@ -145,7 +145,7 @@ state: icon-0 product: CrateNPCMouse cost: 4400 - category: Livestock + category: cargoproduct-category-name-livestock group: market - type: cargoProduct @@ -155,7 +155,7 @@ state: parrot product: CrateNPCParrot cost: 3000 - category: Livestock + category: cargoproduct-category-name-livestock group: market - type: cargoProduct @@ -165,7 +165,7 @@ state: penguin product: CrateNPCPenguin cost: 2100 - category: Livestock + category: cargoproduct-category-name-livestock group: market - type: cargoProduct @@ -175,7 +175,7 @@ state: pig product: CrateNPCPig cost: 1100 - category: Livestock + category: cargoproduct-category-name-livestock group: market - type: cargoProduct @@ -185,7 +185,7 @@ state: snake product: CrateNPCSnake cost: 3000 - category: Livestock + category: cargoproduct-category-name-livestock group: market - type: cargoProduct @@ -195,7 +195,7 @@ state: icon-0 product: CrateNPCHamster cost: 2800 - category: Livestock + category: cargoproduct-category-name-livestock group: market - type: cargoProduct @@ -205,7 +205,7 @@ state: lizard product: CrateNPCLizard cost: 1100 - category: Livestock + category: cargoproduct-category-name-livestock group: market - type: cargoProduct @@ -215,7 +215,7 @@ state: kangaroo product: CrateNPCKangaroo cost: 2800 - category: Livestock + category: cargoproduct-category-name-livestock group: market - type: cargoProduct @@ -225,5 +225,5 @@ state: mothroach product: CrateNPCMothroach cost: 5000 - category: Livestock + category: cargoproduct-category-name-livestock group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_materials.yml b/Resources/Prototypes/Catalog/Cargo/cargo_materials.yml index e3b07af13ba..6f945001d93 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_materials.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_materials.yml @@ -5,7 +5,7 @@ state: glass_3 product: CrateMaterialGlass cost: 1000 - category: Materials + category: cargoproduct-category-name-materials group: market - type: cargoProduct @@ -15,7 +15,7 @@ state: steel_3 product: CrateMaterialSteel cost: 1000 - category: Materials + category: cargoproduct-category-name-materials group: market - type: cargoProduct @@ -25,7 +25,7 @@ state: plastic_3 product: CrateMaterialPlastic cost: 1500 - category: Materials + category: cargoproduct-category-name-materials group: market - type: cargoProduct @@ -35,7 +35,7 @@ state: brass_3 product: CrateMaterialBrass cost: 2500 - category: Materials + category: cargoproduct-category-name-materials group: market - type: cargoProduct @@ -45,7 +45,7 @@ state: plasteel_3 product: CrateMaterialPlasteel cost: 3000 - category: Materials + category: cargoproduct-category-name-materials group: market - type: cargoProduct @@ -55,7 +55,7 @@ state: cloth_3 product: CrateMaterialTextiles cost: 1000 - category: Materials + category: cargoproduct-category-name-materials group: market - type: cargoProduct @@ -65,7 +65,7 @@ state: plasma_3 product: CrateMaterialPlasma cost: 2000 - category: Materials + category: cargoproduct-category-name-materials group: market - type: cargoProduct @@ -75,7 +75,7 @@ state: cardboard_3 product: CrateMaterialCardboard cost: 750 - category: Materials + category: cargoproduct-category-name-materials group: market - type: cargoProduct @@ -85,7 +85,7 @@ state: paper_3 product: CrateMaterialPaper cost: 1000 - category: Materials + category: cargoproduct-category-name-materials group: market - type: cargoProduct @@ -95,7 +95,7 @@ state: fueltank product: WeldingFuelTankFull cost: 1500 - category: Materials + category: cargoproduct-category-name-materials group: market - type: cargoProduct @@ -105,5 +105,5 @@ state: watertank product: WaterTankFull cost: 1000 - category: Materials + category: cargoproduct-category-name-materials group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_medical.yml b/Resources/Prototypes/Catalog/Cargo/cargo_medical.yml index 01a7192b35b..1addf523e4b 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_medical.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_medical.yml @@ -5,7 +5,7 @@ state: firstaid product: CrateMedicalSupplies cost: 2400 - category: Medical + category: cargoproduct-category-name-medical group: market - type: cargoProduct @@ -15,7 +15,7 @@ state: beaker product: CrateChemistrySupplies cost: 750 - category: Medical + category: cargoproduct-category-name-medical group: market - type: cargoProduct @@ -25,7 +25,7 @@ state: vial product: CrateChemistryVials cost: 1000 - category: Medical + category: cargoproduct-category-name-medical group: market - type: cargoProduct @@ -35,7 +35,7 @@ state: burnkit product: CrateEmergencyBurnKit cost: 700 - category: Medical + category: cargoproduct-category-name-medical group: market - type: cargoProduct @@ -45,7 +45,7 @@ state: toxinkit product: CrateEmergencyToxinKit cost: 600 - category: Medical + category: cargoproduct-category-name-medical group: market - type: cargoProduct @@ -55,7 +55,7 @@ state: o2kit product: CrateEmergencyO2Kit cost: 600 - category: Medical + category: cargoproduct-category-name-medical group: market - type: cargoProduct @@ -65,7 +65,7 @@ state: brutekit product: CrateEmergencyBruteKit cost: 600 - category: Medical + category: cargoproduct-category-name-medical group: market - type: cargoProduct @@ -75,7 +75,7 @@ state: advkit product: CrateEmergencyAdvancedKit cost: 1200 - category: Medical + category: cargoproduct-category-name-medical group: market - type: cargoProduct @@ -85,7 +85,7 @@ state: radkit product: CrateEmergencyRadiationKit cost: 600 - category: Medical + category: cargoproduct-category-name-medical group: market - type: cargoProduct @@ -95,7 +95,7 @@ state: bag_folded product: CrateBodyBags cost: 700 - category: Medical + category: cargoproduct-category-name-medical group: market - type: cargoProduct @@ -105,7 +105,7 @@ state: icon product: CrateVirologyBiosuit cost: 800 - category: Medical + category: cargoproduct-category-name-medical group: market - type: cargoProduct @@ -115,7 +115,7 @@ state: implanter0 product: CrateMindShieldImplants cost: 3000 - category: Medical + category: cargoproduct-category-name-medical group: market - type: cargoProduct @@ -125,7 +125,7 @@ state: icon product: CrateChemistryP cost: 850 - category: Medical + category: cargoproduct-category-name-medical group: market - type: cargoProduct @@ -135,7 +135,7 @@ state: icon product: CrateChemistryS cost: 750 - category: Medical + category: cargoproduct-category-name-medical group: market - type: cargoProduct @@ -145,5 +145,5 @@ state: icon product: CrateChemistryD cost: 750 - category: Medical + category: cargoproduct-category-name-medical group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_science.yml b/Resources/Prototypes/Catalog/Cargo/cargo_science.yml index f370155e075..756a223e74d 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_science.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_science.yml @@ -5,7 +5,7 @@ state: artifact_container_icon product: CrateArtifactContainer cost: 500 - category: Epistemics # DeltaV - Epistemics Department replacing Science + category: cargoproduct-category-name-science group: market - type: cargoProduct @@ -15,7 +15,7 @@ state: ano13 product: RandomArtifactSpawner cost: 2000 - category: Epistemics # DeltaV - Epistemics Department replacing Science + category: cargoproduct-category-name-science group: market - type: cargoProduct @@ -25,5 +25,5 @@ state: icon product: CrateScienceBiosuit cost: 800 - category: Epistemics # DeltaV - Epistemics Department replacing Science + category: cargoproduct-category-name-science group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_security.yml b/Resources/Prototypes/Catalog/Cargo/cargo_security.yml index a616202bdba..2ad7628ddb3 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_security.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_security.yml @@ -4,8 +4,8 @@ sprite: DeltaV/Clothing/OuterClothing/Armor/platecarrier.rsi # DeltaV - resprite state: icon product: CrateSecurityArmor - cost: 1000 # DeltaV - raise price for buffed armour - category: Security + cost: 800 + category: cargoproduct-category-name-security group: market - type: cargoProduct @@ -15,7 +15,7 @@ state: icon product: CrateSecurityHelmet cost: 550 - category: Security + category: cargoproduct-category-name-security group: market - type: cargoProduct @@ -25,7 +25,7 @@ state: base product: CrateSecurityNonlethal cost: 4000 - category: Security + category: cargoproduct-category-name-security group: market - type: cargoProduct @@ -35,7 +35,7 @@ state: icon product: CrateSecurityRiot cost: 5500 - category: Security + category: cargoproduct-category-name-security group: market - type: cargoProduct @@ -45,7 +45,7 @@ state: box_security product: CrateSecuritySupplies cost: 500 - category: Security + category: cargoproduct-category-name-security group: market - type: cargoProduct @@ -55,7 +55,7 @@ state: handcuff product: CrateRestraints cost: 1000 - category: Security + category: cargoproduct-category-name-security group: market - type: cargoProduct @@ -65,7 +65,7 @@ state: icon product: CrateSecurityBiosuit cost: 800 - category: Security + category: cargoproduct-category-name-security group: market - type: cargoProduct @@ -75,5 +75,5 @@ state: idle product: DeployableBarrier cost: 1000 - category: Security + category: cargoproduct-category-name-security group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_service.yml b/Resources/Prototypes/Catalog/Cargo/cargo_service.yml index a2c0af9ce7f..f27adb65a4a 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_service.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_service.yml @@ -5,7 +5,7 @@ state: cleaner product: CrateServiceJanitorialSupplies cost: 560 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -15,7 +15,7 @@ state: normal product: CrateServiceReplacementLights cost: 600 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -25,7 +25,7 @@ state: mousetrap product: CrateMousetrapBoxes cost: 500 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -35,7 +35,7 @@ state: icon product: CrateServiceTheatre cost: 1800 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -45,7 +45,7 @@ state: closed product: CrateServiceSmokeables cost: 1500 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -55,7 +55,7 @@ state: closed product: CrateServiceCustomSmokable cost: 1000 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -65,7 +65,7 @@ state: pen product: CrateServiceBureaucracy cost: 1000 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -75,7 +75,7 @@ state: default product: CrateServicePersonnel cost: 1000 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -85,7 +85,7 @@ state: book0 product: CrateServiceBooks cost: 1000 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -95,7 +95,7 @@ state: book_engineering2 product: CrateServiceGuidebooks cost: 1300 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -105,7 +105,7 @@ state: icon product: CrateServiceSodaDispenser cost: 850 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -115,7 +115,7 @@ state: icon product: CrateServiceBoozeDispenser cost: 750 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -125,7 +125,7 @@ state: box product: CrateServiceBox cost: 400 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -135,7 +135,7 @@ state: icon product: CrateJanitorBiosuit cost: 800 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -145,7 +145,7 @@ state: icon-hot product: FoodCartHot cost: 2000 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -155,7 +155,7 @@ state: icon-cold product: FoodCartCold cost: 2000 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -165,7 +165,7 @@ state: icon product: PetCarrier cost: 500 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -175,7 +175,7 @@ state: icon product: CrateJanitorExplosive cost: 1000 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -185,6 +185,6 @@ state: icon-cart product: JanitorialTrolley cost: 300 - category: Service + category: cargoproduct-category-name-service group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_shuttle.yml b/Resources/Prototypes/Catalog/Cargo/cargo_shuttle.yml index 96a193881ef..278104caed1 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_shuttle.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_shuttle.yml @@ -5,7 +5,7 @@ state: base product: CrateEngineeringThruster cost: 1500 - category: Shuttle + category: cargoproduct-category-name-shuttle group: market - type: cargoProduct @@ -15,7 +15,7 @@ state: base product: CrateEngineeringGyroscope cost: 4000 - category: Shuttle + category: cargoproduct-category-name-shuttle group: market # - type: cargoProduct @@ -25,6 +25,6 @@ # state: avionics-systems # product: CrateEngineeringShuttle # cost: 3000 - # category: Shuttle + # category: cargoproduct-category-name-shuttle # group: market # locked: true # only the QM has permission to order by default diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml b/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml index 76ab0499170..3e303c32127 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml @@ -13,7 +13,7 @@ state: base product: CrateVendingMachineRestockBoozeFilled cost: 3500 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -24,7 +24,7 @@ state: base product: CrateVendingMachineRestockChefvendFilled cost: 680 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -34,7 +34,7 @@ state: base product: CrateVendingMachineRestockClothesFilled cost: 8050 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -44,7 +44,7 @@ state: base product: CrateVendingMachineRestockDinnerwareFilled cost: 2000 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -55,7 +55,7 @@ state: base product: CrateVendingMachineRestockCondimentStationFilled cost: 300 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -65,7 +65,7 @@ state: base product: CrateVendingMachineRestockEngineeringFilled cost: 3200 - category: Engineering + category: cargoproduct-category-name-engineering group: market - type: cargoProduct @@ -75,7 +75,7 @@ state: base product: CrateVendingMachineRestockGamesFilled cost: 750 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -85,7 +85,7 @@ state: base product: CrateVendingMachineRestockHotDrinksFilled cost: 1200 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -95,7 +95,7 @@ state: base product: CrateVendingMachineRestockMedicalFilled cost: 1750 - category: Medical + category: cargoproduct-category-name-medical group: market - type: cargoProduct @@ -104,8 +104,8 @@ sprite: Objects/Specific/Service/vending_machine_restock.rsi state: base product: CrateVendingMachineRestockChemVendFilled - cost: 6300 #Delta V - was 3820, see rebase PR #53 - category: Medical + cost: 3820 + category: cargoproduct-category-name-medical group: market - type: cargoProduct @@ -115,7 +115,7 @@ state: base product: CrateVendingMachineRestockNutriMaxFilled cost: 2400 - category: Hydroponics + category: cargoproduct-category-name-hydroponics group: market - type: cargoProduct @@ -125,7 +125,7 @@ state: base product: CrateVendingMachineRestockPTechFilled cost: 1200 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -135,7 +135,7 @@ state: base product: CrateVendingMachineRestockRobustSoftdrinksFilled cost: 1200 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -145,7 +145,7 @@ state: base product: CrateVendingMachineRestockSalvageEquipmentFilled cost: 1000 - category: Engineering + category: cargoproduct-category-name-engineering group: market - type: cargoProduct @@ -155,7 +155,7 @@ state: base product: CrateVendingMachineRestockSecTechFilled cost: 2200 - category: Security + category: cargoproduct-category-name-security group: market - type: cargoProduct @@ -165,7 +165,7 @@ state: base product: CrateVendingMachineRestockSeedsFilled cost: 3375 - category: Hydroponics + category: cargoproduct-category-name-hydroponics group: market - type: cargoProduct @@ -175,7 +175,7 @@ state: base product: CrateVendingMachineRestockSmokesFilled cost: 1200 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -185,7 +185,7 @@ state: base product: CrateVendingMachineRestockVendomatFilled cost: 1200 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -195,7 +195,7 @@ state: base product: CrateVendingMachineRestockRoboticsFilled cost: 1600 - category: Epistemics # DeltaV - Epistemics Department replacing Science + category: cargoproduct-category-name-science group: market - type: cargoProduct @@ -205,7 +205,7 @@ state: base product: CrateVendingMachineRestockTankDispenserFilled cost: 1000 - category: Atmospherics + category: cargoproduct-category-name-atmospherics group: market - type: cargoProduct @@ -215,7 +215,7 @@ state: base product: CrateVendingMachineRestockHappyHonkFilled cost: 2100 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -225,7 +225,7 @@ state: base product: CrateVendingMachineRestockGetmoreChocolateCorpFilled cost: 1200 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -235,7 +235,7 @@ state: base product: CrateVendingMachineRestockChangFilled cost: 1200 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -245,7 +245,7 @@ state: base product: CrateVendingMachineRestockDiscountDansFilled cost: 1200 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -255,5 +255,5 @@ state: base product: CrateVendingMachineRestockDonutFilled cost: 1200 - category: Service + category: cargoproduct-category-name-service group: market From 9c087755aaf336965901ffe113eb76c383b9a3ee Mon Sep 17 00:00:00 2001 From: SimpleStation14 <130339894+SimpleStation14@users.noreply.github.com> Date: Tue, 28 May 2024 21:34:24 -0400 Subject: [PATCH 028/155] Updates spawners with new content (#86) ## Mirror of PR #1032: [Updates spawners with new content](https://github.com/DeltaV-Station/Delta-v/pull/1032) from DeltaV-Station [DeltaV-Station](https://github.com/DeltaV-Station)/[Delta-v](https://github.com/DeltaV-Station/Delta-v) `5e397c6e7b2d2513f49948fbba1eb1d658fe4a9e` --- PR changed 0 files with 0 additions and 0 deletions. The PR had the following labels: - Changes: YML ---

Original Body

> ## About the PR > Title. Updates box, device, hat, machinepart, and seed spawners. > Will do Items later. > > ## Why / Balance > Just catching up
--------- Co-authored-by: Velcroboy <107660393+IamVelcroboy@users.noreply.github.com> Co-authored-by: VMSolidus Co-authored-by: Danger Revolution! <142105406+DangerRevolution@users.noreply.github.com> --- .../Markers/Spawners/Random/books.yml | 1 + .../Markers/Spawners/Random/boxes.yml | 8 +++++ .../Markers/Spawners/Random/devices.yml | 34 ++++++++++++++++++- .../Entities/Markers/Spawners/Random/hats.yml | 20 +++++++++++ .../Markers/Spawners/Random/machineparts.yml | 2 +- .../Markers/Spawners/Random/seeds.yml | 3 ++ 6 files changed, 66 insertions(+), 2 deletions(-) diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/books.yml b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/books.yml index 28340ead40a..59e3690b6bc 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/books.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/books.yml @@ -45,6 +45,7 @@ - BookMap - BookJourney - BookInspiration + - BookJanitorTale # Guidebook Books - BookSpaceEncyclopedia - BookTheBookOfControl diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/boxes.yml b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/boxes.yml index a75f31cf0f7..181bacca45e 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/boxes.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/boxes.yml @@ -36,6 +36,7 @@ - BoxCandle - BoxCandleSmall - BoxDarts + - BoxCartridgeBB chance: 0.7 rarePrototypes: - BoxHugHealing @@ -49,6 +50,7 @@ - PresentRandom - BoxHolyWater - MysteryFigureBox + - BoxCleanerGrenades rareChance: 0.05 @@ -100,6 +102,8 @@ - BoxMagazineCaselessRifleRubber - BoxMagazineUniversalMagnumPractice - BoxMagazineUniversalMagnumRubber + - MagazineBoxSpecialRubber + - MagazineBoxSpecialPractice chance: 0.15 rarePrototypes: - BoxMagazinePistolCaselessRifle @@ -121,4 +125,8 @@ - BoxShellSoulbreaker - BoxMagazineUniversalMagnum - BoxSpeedLoaderLightRifle + - MagazineBoxSpecial + - MagazineBoxSpecialIncendiary + - MagazineBoxSpecialUranium + - MagazineBoxSpecialMindbreaker rareChance: 0.015 diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/devices.yml b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/devices.yml index c8efdbdc8cf..abd4d86a1ef 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/devices.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/devices.yml @@ -1,7 +1,7 @@ - type: entity parent: MarkerBase id: RandomBoards - name: random machine board spawner + name: random device & board spawner components: - type: Sprite layers: @@ -71,6 +71,16 @@ - HotplateMachineCircuitboard - ElectricGrillMachineCircuitboard - FatExtractorMachineCircuitboard + - SpaceHeaterMachineCircuitBoard + - StationMapCircuitboard + - Igniter + - IntercomElectronics + - DoorRemoteFirefight + - RadiationCollectorFlatpack + - ContainmentFieldGeneratorFlatpack + - SolarAssemblyFlatpack + - StationBeaconPart + - HandheldStationMap chance: 0.8 rarePrototypes: - TraversalDistorterMachineCircuitboard @@ -107,4 +117,26 @@ - ShockCollar - GlimmerMonitorCartridge - PotatoAIChip + - CargoTelepadMachineCircuitboard + - FlatpackerMachineCircuitboard + - OreProcessorIndustrialMachineCircuitboard + - TurboItemRechargerCircuitboard + - PowerCageRechargerCircuitboard + - HellfireHeaterMachineCircuitBoard + - HellfireFreezerMachineCircuitBoard + - BiofabricatorMachineCircuitboard + - SalvageExpeditionsComputerCircuitboard + - RadarConsoleCircuitboard + - RipleyCentralElectronics + - RipleyPeripheralsElectronics + - HamtrCentralElectronics + - HamtrPeripheralsElectronics + - HonkerCentralElectronics + - HonkerPeripheralsElectronics + - HonkerTargetingElectronics + - RemoteSignallerAdvanced + - SignalTimerElectronics + - LogProbeCartridge + - HoloprojectorField + - DeviceQuantumSpinInverter rareChance: 0.25 diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/hats.yml b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/hats.yml index b9def15132e..f0dd4709034 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/hats.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/hats.yml @@ -42,6 +42,18 @@ - ClothingHeadCage - ClothingHeadHelmetKendoMen - ClothingHeadBandMerc + - ClothingHeadHatCowboyWhite + - ClothingHeadHatCowboyGrey + - ClothingHeadHatCowboyBrown + - ClothingHeadHatBrownFlatcap + - ClothingHeadHatGreyFlatcap + - ClothingHeadHatPartyRed + - ClothingHeadHatPartyYellow + - ClothingHeadHatPartyGreen + - ClothingHeadHatPartyBlue + - ClothingHeadHatWatermelon + - WaterDropletHat + - ClothingHeadHatRedRacoon rareChance: 0.03 prototypes: - ClothingHeadHatAnimalCat @@ -98,5 +110,13 @@ - ClothingHeadHatFlatBrown - ClothingHeadTinfoil - ClothingHeadHatStrawHat + - ClothingHeadHatCowboyBountyHunter + - ClothingHeadHatCowboyRed + - ClothingHeadHatCowboyBlack + - ClothingHeadHatGladiator + - ClothingHeadHatMagician + - ClothingHeadHatHetmanHat + - ClothingHeadHatTacticalMaidHeadband + - ClothingHeadHatPirateTricord chance: 0.5 offset: 0.2 diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/machineparts.yml b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/machineparts.yml index 7785e5aaa82..61a99faa2f1 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/machineparts.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/machineparts.yml @@ -36,5 +36,5 @@ - MatterBinStockPart - CrateMaterialSteel - CrateMaterialGlass - chance: 0.45 + chance: 0.50 offset: 0.0 diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/seeds.yml b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/seeds.yml index 9f183dcefbd..0c3370890c8 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/seeds.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/seeds.yml @@ -48,6 +48,7 @@ - PeaSeeds - PumpkinSeeds - CottonSeeds + - LilySeeds chance: 0.95 offset: 0.0 rarePrototypes: @@ -64,4 +65,6 @@ - LemoonSeeds - SteelcapSeeds - KoibeanSeeds + - SpacemansTrumpetSeeds + - LaughinPeaSeeds rareChance: 0.05 From 8223dca8b7e5d91e0cfd0ccac981f8ce0be0c24b Mon Sep 17 00:00:00 2001 From: SimpleStation14 <130339894+SimpleStation14@users.noreply.github.com> Date: Tue, 28 May 2024 22:19:15 -0400 Subject: [PATCH 029/155] Mirror: Fixes store purchase events and adds support to raise a directed event (#364) ## Mirror of PR #26389: [Fixes store purchase events and adds support to raise a directed event](https://github.com/space-wizards/space-station-14/pull/26389) from space-wizards [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `4dced51f0d8d008714a14675b48c8fa2b7fa0ace` PR opened by keronshb at 2024-03-24 14:16:44 UTC --- PR changed 2 files with 8 additions and 3 deletions. The PR had the following labels: - Status: Needs Review ---

Original Body

> > > > ## About the PR > > > When testing around some things with the magic PR I found that the purchase event wasn't being compared correctly. Also I added support to raise the purchase event directed at the buyer instead of just a broadcast event. > > ## Technical details > > The equals method will now check for purchase event type instead of comparing the references. To make this stronger we should talk about creating a base store purchase event class. > > For directing the event I added a bool to raise on user and we check if that's true. > > ## Media > > > - [x] I have added screenshots/videos to this PR showcasing its changes ingame, **or** this PR does not require an ingame showcase
Co-authored-by: SimpleStation14 --- Content.Server/Store/Systems/StoreSystem.Ui.cs | 6 ++++-- Content.Shared/Store/ListingPrototype.cs | 5 ++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Content.Server/Store/Systems/StoreSystem.Ui.cs b/Content.Server/Store/Systems/StoreSystem.Ui.cs index 281d8f57267..70b70e2ca90 100644 --- a/Content.Server/Store/Systems/StoreSystem.Ui.cs +++ b/Content.Server/Store/Systems/StoreSystem.Ui.cs @@ -248,10 +248,12 @@ private void OnBuyRequest(EntityUid uid, StoreComponent component, StoreBuyListi HandleRefundComp(uid, component, upgradeActionId.Value); } - //broadcast event if (listing.ProductEvent != null) { - RaiseLocalEvent(listing.ProductEvent); + if (!listing.RaiseProductEventOnUser) + RaiseLocalEvent(listing.ProductEvent); + else + RaiseLocalEvent(buyer, listing.ProductEvent); } //log dat shit. diff --git a/Content.Shared/Store/ListingPrototype.cs b/Content.Shared/Store/ListingPrototype.cs index 2f067afbeeb..25245327ce9 100644 --- a/Content.Shared/Store/ListingPrototype.cs +++ b/Content.Shared/Store/ListingPrototype.cs @@ -98,6 +98,9 @@ public partial class ListingData : IEquatable, ICloneable [DataField("productEvent")] public object? ProductEvent; + [DataField] + public bool RaiseProductEventOnUser; + /// /// used internally for tracking how many times an item was purchased. /// @@ -120,7 +123,7 @@ public bool Equals(ListingData? listing) Description != listing.Description || ProductEntity != listing.ProductEntity || ProductAction != listing.ProductAction || - ProductEvent != listing.ProductEvent || + ProductEvent?.GetType() != listing.ProductEvent?.GetType() || RestockTime != listing.RestockTime) return false; From 2affb3e544cab7b868c7a5b27c1d52c491ddc87a Mon Sep 17 00:00:00 2001 From: SimpleStation14 <130339894+SimpleStation14@users.noreply.github.com> Date: Tue, 28 May 2024 23:31:54 -0400 Subject: [PATCH 030/155] Mirror: Adds logging for refunds (#275) ## Mirror of PR #26274: [Adds logging for refunds](https://github.com/space-wizards/space-station-14/pull/26274) from space-wizards [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `85f4b43db1c0256e6d4c48a01558e8cc0a883ada` PR opened by keronshb at 2024-03-19 23:42:22 UTC --- PR changed 2 files with 4 additions and 0 deletions. The PR had the following labels: - Status: Needs Review ---

Original Body

> > > > ## About the PR > > > Refunds now have logging > > ## Why / Balance > > > Good for admins to keep track of. > > ## Technical details > > A Store Refund entry was added into the logging enum and a log entry is made when a refund is successful.
Signed-off-by: VMSolidus Co-authored-by: SimpleStation14 Co-authored-by: VMSolidus --- Content.Server/Store/Systems/StoreSystem.Ui.cs | 3 +++ Content.Shared.Database/LogType.cs | 1 + 2 files changed, 4 insertions(+) diff --git a/Content.Server/Store/Systems/StoreSystem.Ui.cs b/Content.Server/Store/Systems/StoreSystem.Ui.cs index 70b70e2ca90..49db980451e 100644 --- a/Content.Server/Store/Systems/StoreSystem.Ui.cs +++ b/Content.Server/Store/Systems/StoreSystem.Ui.cs @@ -5,6 +5,7 @@ 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; @@ -323,6 +324,8 @@ private void OnRequestRefund(EntityUid uid, StoreComponent component, StoreReque if (!component.RefundAllowed || component.BoughtEntities.Count == 0) return; + _admin.Add(LogType.StoreRefund, LogImpact.Low, $"{ToPrettyString(buyer):player} has refunded their purchases from {ToPrettyString(uid):store}"); + for (var i = component.BoughtEntities.Count - 1; i >= 0; i--) { var purchase = component.BoughtEntities[i]; diff --git a/Content.Shared.Database/LogType.cs b/Content.Shared.Database/LogType.cs index 70a6119130e..ba94b0f3738 100644 --- a/Content.Shared.Database/LogType.cs +++ b/Content.Shared.Database/LogType.cs @@ -98,4 +98,5 @@ public enum LogType ChatRateLimited = 87, AtmosTemperatureChanged = 88, DeviceNetwork = 89, + StoreRefund = 90 } From 28a7f198894eebfaafad2072012003145c484ecd Mon Sep 17 00:00:00 2001 From: SimpleStation14 <130339894+SimpleStation14@users.noreply.github.com> Date: Tue, 28 May 2024 23:32:10 -0400 Subject: [PATCH 031/155] Mirror: Fix artifact report guidebook info (#268) ## Mirror of PR #26252: [Fix artifact report guidebook info](https://github.com/space-wizards/space-station-14/pull/26252) from space-wizards [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `e70928fad8c849ac0fd48da1415b6b134f9336a8` PR opened by Vermidia at 2024-03-19 03:17:41 UTC --- PR changed 1 files with 1 additions and 1 deletions. The PR had the following labels: - No C# - Status: Needs Review ---

Original Body

> Fix conflicting info > > > > > ## About the PR > > > The line about current value still treated extracting points from artifacts as destroying them, so I've changed it to clarify how it works better. > > ## Why / Balance > > > Really confusing when part of the guide tells you to always extract and the other says to be careful since it'll get destroyed. > > ## Technical details > > > ## Media > > > - [ ] I have added screenshots/videos to this PR showcasing its changes ingame, **or** this PR does not require an ingame showcase > > ## Breaking changes > > > **Changelog** > > :cl: > - tweak: Made the Artifact Reports page up to date with current Xenoarchaeology > >
Signed-off-by: VMSolidus Co-authored-by: SimpleStation14 Co-authored-by: VMSolidus --- Resources/ServerInfo/Guidebook/Science/ArtifactReports.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/ServerInfo/Guidebook/Science/ArtifactReports.xml b/Resources/ServerInfo/Guidebook/Science/ArtifactReports.xml index b7ba3d4c8b4..a377c980e55 100644 --- a/Resources/ServerInfo/Guidebook/Science/ArtifactReports.xml +++ b/Resources/ServerInfo/Guidebook/Science/ArtifactReports.xml @@ -14,7 +14,7 @@ A large portion of Xenoarchaeology gameplay revolves around the interpretation o - [color=#a4885c]Edges:[/color] the amount of nodes that are connected to the current node. Using this, you can calculate the total number of nodes as well as organize a map of their connections. -- [color=#a4885c]Unextracted value:[/color] the amount of research points an artifact will give when extracted. Extracting sets this to zero and traversing new nodes increases it. +- [color=#a4885c]Current value:[/color] the amount of research points an artifact is currently worth. Extracting will set this to zero and traversing new nodes will increase it. Reports are a helpful tool in manipulating an artifact, especially in the later stages where you are traversing nodes that have already been activated. From 2ca6be7161b132ed7024a2a9bf2b1356cb2df0e4 Mon Sep 17 00:00:00 2001 From: SimpleStation14 <130339894+SimpleStation14@users.noreply.github.com> Date: Tue, 28 May 2024 23:32:18 -0400 Subject: [PATCH 032/155] Mirror: More good looking inventory part 2.2 (instruments version) (#189) ## Mirror of PR #26090: [More good looking inventory part 2.2 (instruments version)](https://github.com/space-wizards/space-station-14/pull/26090) from space-wizards [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `91aa6445714d6b833474fcb911c4c8555a54f799` PR opened by lzk228 at 2024-03-13 18:52:29 UTC --- PR changed 4 files with 12 additions and 4 deletions. The PR had the following labels: - No C# ---

Original Body

> > > > ## About the PR > > - media > - fix tophat name > > ## Why / Balance > > > ## Technical details > > > ## Media > > ![Screenshot_20240313_194028](https://github.com/space-wizards/space-station-14/assets/124214523/51640a13-f4b7-490d-8982-6d2e07dcc009) > > - [X] I have added screenshots/videos to this PR showcasing its changes ingame, **or** this PR does not require an ingame showcase > > ## Breaking changes > > > **Changelog** > > no cl no fun > >
Signed-off-by: VMSolidus Co-authored-by: SimpleStation14 Co-authored-by: VMSolidus --- Resources/Prototypes/Entities/Clothing/Head/hats.yml | 5 +++-- .../Entities/Objects/Fun/Instruments/instruments_misc.yml | 3 +++ .../Objects/Fun/Instruments/instruments_percussion.yml | 2 ++ .../Entities/Objects/Fun/Instruments/instruments_wind.yml | 5 +++-- 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/Resources/Prototypes/Entities/Clothing/Head/hats.yml b/Resources/Prototypes/Entities/Clothing/Head/hats.yml index 43d6c7c9b70..c845d7cc4a0 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/hats.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/hats.yml @@ -809,8 +809,8 @@ - type: entity parent: ClothingHeadBase id: ClothingHeadHatMagician - name: magician's top hat. - description: "A magician's top hat." + name: magician's tophat + description: "A magician's tophat." components: - type: Icon sprite: Clothing/Head/Hats/magician.rsi @@ -827,6 +827,7 @@ - type: Item size: Small sprite: Clothing/Head/Hats/magician.rsi + storedRotation: 0 - type: Storage grid: - 0,0,0,0 diff --git a/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_misc.yml b/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_misc.yml index 8c3aed0d069..edad2b40631 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_misc.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_misc.yml @@ -89,6 +89,7 @@ program: 125 - type: Item size: Small + storedRotation: -90 - type: entity parent: BaseHandheldInstrument @@ -118,6 +119,7 @@ - type: Item size: Small sprite: Objects/Fun/Instruments/gunpet.rsi + storedRotation: -90 - type: Tag tags: - Sidearm @@ -141,6 +143,7 @@ - type: Item sprite: Objects/Fun/Instruments/bike_horn.rsi size: Small + storedRotation: -90 - type: Clothing sprite: Objects/Fun/Instruments/bike_horn.rsi slots: [Belt] diff --git a/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_percussion.yml b/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_percussion.yml index a255ab4a32c..b09ea96f7b4 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_percussion.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_percussion.yml @@ -98,6 +98,8 @@ - type: Tag tags: - KeyedInstrument + - type: Item + size: Small - type: entity parent: BaseHandheldInstrument diff --git a/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_wind.yml b/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_wind.yml index 3b89d1075be..e99f825d483 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_wind.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_wind.yml @@ -141,7 +141,7 @@ sprite: Objects/Fun/Instruments/panflute.rsi state: icon - type: Item - size: Normal + size: Small sprite: Objects/Fun/Instruments/panflute.rsi - type: Tag tags: @@ -160,8 +160,9 @@ sprite: Objects/Fun/Instruments/ocarina.rsi state: icon - type: Item - size: Normal + size: Small sprite: Objects/Fun/Instruments/ocarina.rsi + storedRotation: -90 - type: Tag tags: - WoodwindInstrument From 2bbf7addfc87fe962bc031147a6d7e071b8eb8ca Mon Sep 17 00:00:00 2001 From: SimpleStation14 <130339894+SimpleStation14@users.noreply.github.com> Date: Tue, 28 May 2024 23:33:11 -0400 Subject: [PATCH 033/155] Mirror: Syringes that spawn with content start in inject mode (#129) ## Mirror of PR #25881: [Syringes that spawn with content start in inject mode](https://github.com/space-wizards/space-station-14/pull/25881) from space-wizards [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `5cb48c922fa7236d07b463f0c38ada2d5805e54b` PR opened by Plykiya at 2024-03-06 13:43:59 UTC PR merged by web-flow at 2024-03-09 10:19:03 UTC --- PR changed 3 files with 25 additions and 23 deletions. The PR had the following labels: - Status: Needs Review ---

Original Body

> > > > ## About the PR > > Made it so that syringes that spawn with content start out in inject mode rather than draw mode. Also got rid of unnecessary DataField names if they matched. > > ## Why / Balance > > Grab bic syringe from medkit, use it on patient, it's in draw mode by default, cry. > > ## Technical details > > I added a new yml entity for prefilled syringes that starts in inject mode. > > I attempted to do it the "smart way" by changing the ComponentInit code to check for the solution amount and toggle based on that, but for some reason the solution was returning false on the server-side but not on the client-side so there was a desync in the Inject state. Couldn't really figure out how to fix it, so I just went with the dumb simple method instead. > > ## Media > > > - [ X ] I have added screenshots/videos to this PR showcasing its changes ingame, **or** this PR does not require an ingame showcase > > ## Breaking changes > > None > > **Changelog** > > > > :cl: > - tweak: Pre-filled syringes start in inject mode now.
Signed-off-by: VMSolidus Co-authored-by: Plykiya <58439124+Plykiya@users.noreply.github.com> Co-authored-by: VMSolidus --- .../Chemistry/Components/InjectorComponent.cs | 14 ++++------ .../Objects/Specific/Medical/healing.yml | 28 +++++++++---------- .../Entities/Objects/Specific/chemistry.yml | 7 +++++ 3 files changed, 26 insertions(+), 23 deletions(-) diff --git a/Content.Shared/Chemistry/Components/InjectorComponent.cs b/Content.Shared/Chemistry/Components/InjectorComponent.cs index 188028c8f8f..437c5e327d2 100644 --- a/Content.Shared/Chemistry/Components/InjectorComponent.cs +++ b/Content.Shared/Chemistry/Components/InjectorComponent.cs @@ -30,7 +30,7 @@ public sealed partial class InjectorComponent : Component /// Whether or not the injector is able to draw from containers or if it's a single use /// device that can only inject. ///
- [DataField("injectOnly")] + [DataField] public bool InjectOnly; /// @@ -39,28 +39,26 @@ public sealed partial class InjectorComponent : Component /// /// for example: droppers would ignore mobs /// - [DataField("ignoreMobs")] + [DataField] public bool IgnoreMobs; /// /// The minimum amount of solution that can be transferred at once from this solution. /// [DataField("minTransferAmount")] - [ViewVariables(VVAccess.ReadWrite)] public FixedPoint2 MinimumTransferAmount = FixedPoint2.New(5); /// /// The maximum amount of solution that can be transferred at once from this solution. /// [DataField("maxTransferAmount")] - public FixedPoint2 MaximumTransferAmount = FixedPoint2.New(15); + public FixedPoint2 MaximumTransferAmount = FixedPoint2.New(50); /// /// Amount to inject or draw on each usage. If the injector is inject only, it will /// attempt to inject it's entire contents upon use. /// - [ViewVariables(VVAccess.ReadWrite)] - [DataField("transferAmount")] + [DataField] [AutoNetworkedField] public FixedPoint2 TransferAmount = FixedPoint2.New(5); @@ -71,8 +69,7 @@ public sealed partial class InjectorComponent : Component /// The base delay has a minimum of 1 second, but this will still be modified if the target is incapacitated or /// in combat mode. /// - [ViewVariables(VVAccess.ReadWrite)] - [DataField("delay")] + [DataField] public TimeSpan Delay = TimeSpan.FromSeconds(5); /// @@ -80,7 +77,6 @@ public sealed partial class InjectorComponent : Component /// right SolutionCaps to support injection/drawing. For InjectOnly injectors this should /// only ever be set to Inject /// - [ViewVariables(VVAccess.ReadWrite)] [AutoNetworkedField] [DataField] public InjectorToggleMode ToggleState = InjectorToggleMode.Draw; diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/healing.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/healing.yml index bd789214f99..9fde67afb44 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/healing.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/healing.yml @@ -786,7 +786,7 @@ # Syringes - type: entity name: ephedrine syringe - parent: BaseSyringe + parent: PrefilledSyringe id: SyringeEphedrine components: - type: SolutionContainerManager @@ -799,7 +799,7 @@ - type: entity name: inaprovaline syringe - parent: BaseSyringe + parent: PrefilledSyringe id: SyringeInaprovaline components: - type: SolutionContainerManager @@ -812,7 +812,7 @@ - type: entity name: tranexamic acid syringe - parent: BaseSyringe + parent: PrefilledSyringe id: SyringeTranexamicAcid components: - type: SolutionContainerManager @@ -825,7 +825,7 @@ - type: entity name: bicaridine syringe - parent: BaseSyringe + parent: PrefilledSyringe id: SyringeBicaridine components: - type: SolutionContainerManager @@ -838,7 +838,7 @@ - type: entity name: dermaline syringe - parent: BaseSyringe + parent: PrefilledSyringe id: SyringeDermaline components: - type: SolutionContainerManager @@ -851,7 +851,7 @@ - type: entity name: hyronalin syringe - parent: BaseSyringe + parent: PrefilledSyringe id: SyringeHyronalin components: - type: SolutionContainerManager @@ -864,7 +864,7 @@ - type: entity name: ipecac syringe - parent: BaseSyringe + parent: PrefilledSyringe id: SyringeIpecac components: - type: SolutionContainerManager @@ -877,7 +877,7 @@ - type: entity name: ambuzol syringe - parent: BaseSyringe + parent: PrefilledSyringe id: SyringeAmbuzol components: - type: SolutionContainerManager @@ -890,7 +890,7 @@ - type: entity name: sigynate syringe - parent: BaseSyringe + parent: PrefilledSyringe id: SyringeSigynate components: - type: SolutionContainerManager @@ -903,7 +903,7 @@ - type: entity name: ethylredoxrazine syringe - parent: BaseSyringe + parent: PrefilledSyringe id: SyringeEthylredoxrazine components: - type: SolutionContainerManager @@ -916,7 +916,7 @@ - type: entity name: phalanximine syringe - parent: BaseSyringe + parent: PrefilledSyringe id: SyringePhalanximine components: - type: SolutionContainerManager @@ -929,7 +929,7 @@ - type: entity name: saline syringe - parent: BaseSyringe + parent: PrefilledSyringe id: SyringeSaline components: - type: SolutionContainerManager @@ -943,7 +943,7 @@ #this is where all the syringes are so i didn't know where to put it - type: entity name: romerol syringe - parent: BaseSyringe + parent: PrefilledSyringe id: SyringeRomerol components: - type: SolutionContainerManager @@ -956,7 +956,7 @@ - type: entity name: stimulants syringe - parent: BaseSyringe + parent: PrefilledSyringe id: SyringeStimulants components: - type: SolutionContainerManager diff --git a/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml b/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml index ab65940fabc..ae4aaed7d21 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml @@ -364,6 +364,13 @@ - Syringe - Trash +- type: entity + parent: BaseSyringe + id: PrefilledSyringe + components: + - type: Injector + toggleState: Inject + - type: entity id: SyringeBluespace parent: BaseSyringe From 4e8c3cacad95a464ddbff5d747983f8a62ed9bfd Mon Sep 17 00:00:00 2001 From: SimpleStation14 <130339894+SimpleStation14@users.noreply.github.com> Date: Tue, 28 May 2024 23:34:02 -0400 Subject: [PATCH 034/155] Mirror: Fix vox custom sprites (#186) ## Mirror of PR #25989: [Fix vox custom sprites](https://github.com/space-wizards/space-station-14/pull/25989) from space-wizards [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `8a77722f91a94846f0027f56b8d8f2ec76254d81` PR opened by Errant-4 at 2024-03-11 09:29:16 UTC --- PR changed 1 files with 2 additions and 0 deletions. The PR had the following labels: - No C# - Status: Needs Review ---

Original Body

> ## About the PR > Clothing with custom sprites for vox have been displaying the default sprites due to a component accident. > > ## Media > - [X] I have added screenshots/videos to this PR showcasing its changes ingame, **or** this PR does not require an ingame showcase > > **Changelog** > :cl: Errant > - fix: Clothes with alternate sprites for vox once again show the alternate sprites, instead of the defaults. >
Co-authored-by: SimpleStation14 --- Resources/Prototypes/Entities/Mobs/Species/vox.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Resources/Prototypes/Entities/Mobs/Species/vox.yml b/Resources/Prototypes/Entities/Mobs/Species/vox.yml index 5e40254e3a8..a271e9d0846 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/vox.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/vox.yml @@ -14,6 +14,8 @@ - type: HumanoidAppearance species: Vox #- type: VoxAccent # Not yet coded + - type: Inventory + speciesId: vox - type: Speech speechVerb: Vox speechSounds: Vox From 3b2a19d9ecd18ddea6ed91bf67f20f08719dcc4a Mon Sep 17 00:00:00 2001 From: SimpleStation14 <130339894+SimpleStation14@users.noreply.github.com> Date: Tue, 28 May 2024 23:36:53 -0400 Subject: [PATCH 035/155] Mirror: Code cleanup: Purge calls to obsolete EntityCoordinates methods (#289) ## Mirror of PR #26292: [Code cleanup: Purge calls to obsolete EntityCoordinates methods](https://github.com/space-wizards/space-station-14/pull/26292) from space-wizards [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `f4cb02fb0ca385c858569c07c51afb0d24ade949` PR opened by Tayrtahn at 2024-03-20 16:04:43 UTC --- PR changed 34 files with 70 additions and 56 deletions. The PR had the following labels: - Status: Needs Review ---

Original Body

> > > > ## About the PR > > Cleaned up some outdated code. > > ## Why / Balance > > Clean code is happy code. > > ## Technical details > > Updated all calls to obsolete EntityCoordinates methods (ToMap, ToMapPos, FromMap, ToVector2i, InRange) to non-obsolete ones (by passing in SharedTransformSystem as an arg). > > ## Media > > Code > - [X] I have added screenshots/videos to this PR showcasing its changes ingame, **or** this PR does not require an ingame showcase > > ## Breaking changes > > > **Changelog** > > > >
--------- Signed-off-by: VMSolidus Co-authored-by: SimpleStation14 Co-authored-by: VMSolidus --- Content.Client/Construction/ConstructionSystem.cs | 3 ++- .../ContextMenu/UI/EntityMenuUIController.cs | 2 +- Content.Client/Gameplay/GameplayStateBase.cs | 2 +- Content.Client/NPC/PathfindingSystem.cs | 10 +++++++--- Content.Client/Popups/PopupOverlay.cs | 6 ++++-- Content.Client/Popups/PopupSystem.cs | 2 ++ .../Radiation/Overlays/RadiationPulseOverlay.cs | 5 ++++- Content.Client/Sandbox/SandboxSystem.cs | 3 ++- .../AtmosphereSystem.HighPressureDelta.cs | 2 +- Content.Server/Chemistry/EntitySystems/VaporSystem.cs | 4 ++-- .../Construction/Conditions/ComponentInTile.cs | 3 ++- .../Construction/ConstructionSystem.Initial.cs | 7 ++----- Content.Server/Dragon/DragonSystem.cs | 3 ++- .../Explosion/EntitySystems/ExplosionSystem.cs | 2 +- Content.Server/GameTicking/GameTicker.Spawning.cs | 2 +- Content.Server/Guardian/GuardianSystem.cs | 3 ++- Content.Server/Hands/Systems/HandsSystem.cs | 3 ++- Content.Server/Implants/SubdermalImplantSystem.cs | 2 +- Content.Server/Magic/MagicSystem.cs | 2 +- .../Preconditions/CoordinatesInRangePrecondition.cs | 2 +- .../CoordinatesNotInRangePrecondition.cs | 2 +- .../HTN/Preconditions/TargetInRangePrecondition.cs | 2 +- Content.Server/NPC/Pathfinding/PathfindingSystem.cs | 2 +- .../Pointing/EntitySystems/PointingSystem.cs | 7 ++++--- Content.Server/Respawn/SpecialRespawnSystem.cs | 5 +++-- .../Singularity/EntitySystems/GravityWellSystem.cs | 8 ++++---- .../EntitySystems/SingularityAttractorSystem.cs | 11 +++-------- .../Storage/EntitySystems/BluespaceLockerSystem.cs | 3 ++- .../Systems/Carvers/NoiseRangeCarverSystem.cs | 3 ++- .../Construction/Conditions/WallmountCondition.cs | 3 ++- .../Hands/EntitySystems/SharedHandsSystem.Pickup.cs | 2 +- Content.Shared/Interaction/SharedInteractionSystem.cs | 6 +++--- Content.Shared/Spawning/EntitySystemExtensions.cs | 2 +- 33 files changed, 69 insertions(+), 55 deletions(-) diff --git a/Content.Client/Construction/ConstructionSystem.cs b/Content.Client/Construction/ConstructionSystem.cs index ae1724c3bf6..66000a8457d 100644 --- a/Content.Client/Construction/ConstructionSystem.cs +++ b/Content.Client/Construction/ConstructionSystem.cs @@ -27,6 +27,7 @@ public sealed class ConstructionSystem : SharedConstructionSystem [Dependency] private readonly IPlayerManager _playerManager = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly SharedInteractionSystem _interactionSystem = default!; + [Dependency] private readonly SharedTransformSystem _transformSystem = default!; [Dependency] private readonly PopupSystem _popupSystem = default!; private readonly Dictionary _ghosts = new(); @@ -195,7 +196,7 @@ public bool TrySpawnGhost( return false; // This InRangeUnobstructed should probably be replaced with "is there something blocking us in that tile?" - var predicate = GetPredicate(prototype.CanBuildInImpassable, loc.ToMap(EntityManager)); + var predicate = GetPredicate(prototype.CanBuildInImpassable, loc.ToMap(EntityManager, _transformSystem)); if (!_interactionSystem.InRangeUnobstructed(user, loc, 20f, predicate: predicate)) return false; diff --git a/Content.Client/ContextMenu/UI/EntityMenuUIController.cs b/Content.Client/ContextMenu/UI/EntityMenuUIController.cs index ae1b3ec3bf0..a60619baa35 100644 --- a/Content.Client/ContextMenu/UI/EntityMenuUIController.cs +++ b/Content.Client/ContextMenu/UI/EntityMenuUIController.cs @@ -170,7 +170,7 @@ private bool HandleOpenEntityMenu(in PointerInputCmdHandler.PointerInputCmdArgs if (_combatMode.IsInCombatMode(args.Session?.AttachedEntity)) return false; - var coords = args.Coordinates.ToMap(_entityManager); + var coords = args.Coordinates.ToMap(_entityManager, _xform); if (_verbSystem.TryGetEntityMenuEntities(coords, out var entities)) OpenRootMenu(entities); diff --git a/Content.Client/Gameplay/GameplayStateBase.cs b/Content.Client/Gameplay/GameplayStateBase.cs index bdbd69d1086..6236cd8e958 100644 --- a/Content.Client/Gameplay/GameplayStateBase.cs +++ b/Content.Client/Gameplay/GameplayStateBase.cs @@ -104,7 +104,7 @@ private bool HandleInspect(ICommonSession? session, EntityCoordinates coords, En public IEnumerable GetClickableEntities(EntityCoordinates coordinates) { - return GetClickableEntities(coordinates.ToMap(_entityManager)); + return GetClickableEntities(coordinates.ToMap(_entityManager, _entitySystemManager.GetEntitySystem())); } public IEnumerable GetClickableEntities(MapCoordinates coordinates) diff --git a/Content.Client/NPC/PathfindingSystem.cs b/Content.Client/NPC/PathfindingSystem.cs index 548edd601ce..7bf3df1f0b9 100644 --- a/Content.Client/NPC/PathfindingSystem.cs +++ b/Content.Client/NPC/PathfindingSystem.cs @@ -23,6 +23,7 @@ public sealed class PathfindingSystem : SharedPathfindingSystem [Dependency] private readonly IResourceCache _cache = default!; [Dependency] private readonly NPCSteeringSystem _steering = default!; [Dependency] private readonly MapSystem _mapSystem = default!; + [Dependency] private readonly SharedTransformSystem _transformSystem = default!; public PathfindingDebugMode Modes { @@ -39,7 +40,7 @@ public PathfindingDebugMode Modes } else if (!overlayManager.HasOverlay()) { - overlayManager.AddOverlay(new PathfindingOverlay(EntityManager, _eyeManager, _inputManager, _mapManager, _cache, this, _mapSystem)); + overlayManager.AddOverlay(new PathfindingOverlay(EntityManager, _eyeManager, _inputManager, _mapManager, _cache, this, _mapSystem, _transformSystem)); } if ((value & PathfindingDebugMode.Steering) != 0x0) @@ -140,6 +141,7 @@ public sealed class PathfindingOverlay : Overlay private readonly IMapManager _mapManager; private readonly PathfindingSystem _system; private readonly MapSystem _mapSystem; + private readonly SharedTransformSystem _transformSystem; public override OverlaySpace Space => OverlaySpace.ScreenSpace | OverlaySpace.WorldSpace; @@ -153,7 +155,8 @@ public PathfindingOverlay( IMapManager mapManager, IResourceCache cache, PathfindingSystem system, - MapSystem mapSystem) + MapSystem mapSystem, + SharedTransformSystem transformSystem) { _entManager = entManager; _eyeManager = eyeManager; @@ -161,6 +164,7 @@ public PathfindingOverlay( _mapManager = mapManager; _system = system; _mapSystem = mapSystem; + _transformSystem = transformSystem; _font = new VectorFont(cache.GetResource("/Fonts/NotoSans/NotoSans-Regular.ttf"), 10); } @@ -480,7 +484,7 @@ private void DrawWorld(OverlayDrawArgs args, DrawingHandleWorld worldHandle) if (neighborPoly.NetEntity != poly.GraphUid) { color = Color.Green; - var neighborMap = _entManager.GetCoordinates(neighborPoly).ToMap(_entManager); + var neighborMap = _entManager.GetCoordinates(neighborPoly).ToMap(_entManager, _transformSystem); if (neighborMap.MapId != args.MapId) continue; diff --git a/Content.Client/Popups/PopupOverlay.cs b/Content.Client/Popups/PopupOverlay.cs index 3bfa7278734..fb6bb3bf565 100644 --- a/Content.Client/Popups/PopupOverlay.cs +++ b/Content.Client/Popups/PopupOverlay.cs @@ -22,7 +22,7 @@ public sealed class PopupOverlay : Overlay private readonly PopupSystem _popup; private readonly PopupUIController _controller; private readonly ExamineSystemShared _examine; - + private readonly SharedTransformSystem _transform; private readonly ShaderInstance _shader; public override OverlaySpace Space => OverlaySpace.ScreenSpace; @@ -35,6 +35,7 @@ public PopupOverlay( IUserInterfaceManager uiManager, PopupUIController controller, ExamineSystemShared examine, + SharedTransformSystem transform, PopupSystem popup) { _configManager = configManager; @@ -42,6 +43,7 @@ public PopupOverlay( _playerMgr = playerMgr; _uiManager = uiManager; _examine = examine; + _transform = transform; _popup = popup; _controller = controller; @@ -76,7 +78,7 @@ private void DrawWorld(DrawingHandleScreen worldHandle, OverlayDrawArgs args, fl foreach (var popup in _popup.WorldLabels) { - var mapPos = popup.InitialPos.ToMap(_entManager); + var mapPos = popup.InitialPos.ToMap(_entManager, _transform); if (mapPos.MapId != args.MapId) continue; diff --git a/Content.Client/Popups/PopupSystem.cs b/Content.Client/Popups/PopupSystem.cs index 46c1e0cdf62..479fb02906c 100644 --- a/Content.Client/Popups/PopupSystem.cs +++ b/Content.Client/Popups/PopupSystem.cs @@ -28,6 +28,7 @@ public sealed class PopupSystem : SharedPopupSystem [Dependency] private readonly IUserInterfaceManager _uiManager = default!; [Dependency] private readonly IReplayRecordingManager _replayRecording = default!; [Dependency] private readonly ExamineSystemShared _examine = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; public IReadOnlyList WorldLabels => _aliveWorldLabels; public IReadOnlyList CursorLabels => _aliveCursorLabels; @@ -54,6 +55,7 @@ public override void Initialize() _uiManager, _uiManager.GetUIController(), _examine, + _transform, this)); } diff --git a/Content.Client/Radiation/Overlays/RadiationPulseOverlay.cs b/Content.Client/Radiation/Overlays/RadiationPulseOverlay.cs index adc535b2684..9012767ef3f 100644 --- a/Content.Client/Radiation/Overlays/RadiationPulseOverlay.cs +++ b/Content.Client/Radiation/Overlays/RadiationPulseOverlay.cs @@ -121,7 +121,10 @@ private void RadiationQuery(IEye? currentEye) private bool PulseQualifies(EntityUid pulseEntity, MapCoordinates currentEyeLoc) { - return _entityManager.GetComponent(pulseEntity).MapID == currentEyeLoc.MapId && _entityManager.GetComponent(pulseEntity).Coordinates.InRange(_entityManager, EntityCoordinates.FromMap(_entityManager, _entityManager.GetComponent(pulseEntity).ParentUid, currentEyeLoc), MaxDist); + var transformComponent = _entityManager.GetComponent(pulseEntity); + var transformSystem = _entityManager.System(); + return transformComponent.MapID == currentEyeLoc.MapId + && transformComponent.Coordinates.InRange(_entityManager, transformSystem, EntityCoordinates.FromMap(transformComponent.ParentUid, currentEyeLoc, transformSystem, _entityManager), MaxDist); } private sealed record RadiationShaderInstance(MapCoordinates CurrentMapCoords, float Range, TimeSpan Start, float Duration) diff --git a/Content.Client/Sandbox/SandboxSystem.cs b/Content.Client/Sandbox/SandboxSystem.cs index d16751e3715..6a1129bb75d 100644 --- a/Content.Client/Sandbox/SandboxSystem.cs +++ b/Content.Client/Sandbox/SandboxSystem.cs @@ -16,6 +16,7 @@ public sealed class SandboxSystem : SharedSandboxSystem [Dependency] private readonly IMapManager _map = default!; [Dependency] private readonly IPlacementManager _placement = default!; [Dependency] private readonly ContentEyeSystem _contentEye = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; private bool _sandboxEnabled; public bool SandboxAllowed { get; private set; } @@ -108,7 +109,7 @@ public bool Copy(ICommonSession? session, EntityCoordinates coords, EntityUid ui } // Try copy tile. - if (!_map.TryFindGridAt(coords.ToMap(EntityManager), out _, out var grid) || !grid.TryGetTileRef(coords, out var tileRef)) + if (!_map.TryFindGridAt(coords.ToMap(EntityManager, _transform), out _, out var grid) || !grid.TryGetTileRef(coords, out var tileRef)) return false; if (_placement.Eraser) diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.HighPressureDelta.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.HighPressureDelta.cs index 77b5bf18af2..cb50ff114e0 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.HighPressureDelta.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.HighPressureDelta.cs @@ -236,7 +236,7 @@ public void ExperiencePressureDifference( // TODO: Technically these directions won't be correct but uhh I'm just here for optimisations buddy not to fix my old bugs. if (throwTarget != EntityCoordinates.Invalid) { - var pos = ((throwTarget.ToMap(EntityManager).Position - xform.WorldPosition).Normalized() + dirVec).Normalized(); + var pos = ((throwTarget.ToMap(EntityManager, _transformSystem).Position - xform.WorldPosition).Normalized() + dirVec).Normalized(); _physics.ApplyLinearImpulse(uid, pos * moveForce, body: physics); } else diff --git a/Content.Server/Chemistry/EntitySystems/VaporSystem.cs b/Content.Server/Chemistry/EntitySystems/VaporSystem.cs index 7d3f70bc0d8..1415b6cad3c 100644 --- a/Content.Server/Chemistry/EntitySystems/VaporSystem.cs +++ b/Content.Server/Chemistry/EntitySystems/VaporSystem.cs @@ -22,8 +22,8 @@ namespace Content.Server.Chemistry.EntitySystems [UsedImplicitly] internal sealed class VaporSystem : EntitySystem { - [Dependency] private readonly IMapManager _mapManager = default!; [Dependency] private readonly IPrototypeManager _protoManager = default!; + [Dependency] private readonly SharedMapSystem _map = default!; [Dependency] private readonly SharedPhysicsSystem _physics = default!; [Dependency] private readonly SolutionContainerSystem _solutionContainerSystem = default!; [Dependency] private readonly ThrowingSystem _throwing = default!; @@ -115,7 +115,7 @@ private void Update(float frameTime, Entity ent, Entity()); + var transformSys = entityManager.System(); + var indices = transform.Coordinates.ToVector2i(entityManager, IoCManager.Resolve(), transformSys); var lookup = entityManager.EntitySysManager.GetEntitySystem(); diff --git a/Content.Server/Construction/ConstructionSystem.Initial.cs b/Content.Server/Construction/ConstructionSystem.Initial.cs index e0bdf096296..39705fc1974 100644 --- a/Content.Server/Construction/ConstructionSystem.Initial.cs +++ b/Content.Server/Construction/ConstructionSystem.Initial.cs @@ -2,7 +2,6 @@ using System.Linq; using System.Threading.Tasks; using Content.Server.Construction.Components; -using Content.Server.Storage.EntitySystems; using Content.Shared.ActionBlocker; using Content.Shared.Construction; using Content.Shared.Construction.Prototypes; @@ -15,7 +14,6 @@ using Content.Shared.Interaction; using Content.Shared.Inventory; using Content.Shared.Storage; -using Content.Shared.Tag; using Robust.Shared.Containers; using Robust.Shared.Player; using Robust.Shared.Timing; @@ -30,8 +28,7 @@ public sealed partial class ConstructionSystem [Dependency] private readonly ActionBlockerSystem _actionBlocker = default!; [Dependency] private readonly SharedHandsSystem _handsSystem = default!; [Dependency] private readonly EntityLookupSystem _lookupSystem = default!; - [Dependency] private readonly StorageSystem _storageSystem = default!; - [Dependency] private readonly TagSystem _tagSystem = default!; + [Dependency] private readonly SharedTransformSystem _transformSystem = default!; // --- WARNING! LEGACY CODE AHEAD! --- // This entire file contains the legacy code for initial construction. @@ -466,7 +463,7 @@ void Cleanup() return; } - var mapPos = location.ToMap(EntityManager); + var mapPos = location.ToMap(EntityManager, _transformSystem); var predicate = GetPredicate(constructionPrototype.CanBuildInImpassable, mapPos); if (!_interactionSystem.InRangeUnobstructed(user, mapPos, predicate: predicate)) diff --git a/Content.Server/Dragon/DragonSystem.cs b/Content.Server/Dragon/DragonSystem.cs index 93d6bc8db0b..6400472d036 100644 --- a/Content.Server/Dragon/DragonSystem.cs +++ b/Content.Server/Dragon/DragonSystem.cs @@ -28,6 +28,7 @@ public sealed partial class DragonSystem : EntitySystem [Dependency] private readonly RoleSystem _role = default!; [Dependency] private readonly SharedActionsSystem _actions = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; private EntityQuery _objQuery; @@ -146,7 +147,7 @@ private void OnSpawnRift(EntityUid uid, DragonComponent component, DragonSpawnRi // cant stack rifts near eachother foreach (var (_, riftXform) in EntityQuery(true)) { - if (riftXform.Coordinates.InRange(EntityManager, xform.Coordinates, RiftRange)) + if (riftXform.Coordinates.InRange(EntityManager, _transform, xform.Coordinates, RiftRange)) { _popup.PopupEntity(Loc.GetString("carp-rift-proximity", ("proximity", RiftRange)), uid, uid); return; diff --git a/Content.Server/Explosion/EntitySystems/ExplosionSystem.cs b/Content.Server/Explosion/EntitySystems/ExplosionSystem.cs index 1a5a5c40118..6351d999a98 100644 --- a/Content.Server/Explosion/EntitySystems/ExplosionSystem.cs +++ b/Content.Server/Explosion/EntitySystems/ExplosionSystem.cs @@ -331,7 +331,7 @@ public void QueueExplosion(MapCoordinates epicenter, CameraShake(iterationIntensity.Count * 4f, epicenter, totalIntensity); //For whatever bloody reason, sound system requires ENTITY coordinates. - var mapEntityCoords = EntityCoordinates.FromMap(EntityManager, _mapManager.GetMapEntityId(epicenter.MapId), epicenter); + var mapEntityCoords = EntityCoordinates.FromMap(_mapManager.GetMapEntityId(epicenter.MapId), epicenter, _transformSystem, EntityManager); // play sound. // for the normal audio, we want everyone in pvs range diff --git a/Content.Server/GameTicking/GameTicker.Spawning.cs b/Content.Server/GameTicking/GameTicker.Spawning.cs index 54587e95be3..bf69b4b9094 100644 --- a/Content.Server/GameTicking/GameTicker.Spawning.cs +++ b/Content.Server/GameTicking/GameTicker.Spawning.cs @@ -394,7 +394,7 @@ public EntityCoordinates GetObserverSpawnPoint() // Ideally engine would just spawn them on grid directly I guess? Right now grid traversal is handling it during // update which means we need to add a hack somewhere around it. var spawn = _robustRandom.Pick(_possiblePositions); - var toMap = spawn.ToMap(EntityManager); + var toMap = spawn.ToMap(EntityManager, _transform); if (_mapManager.TryFindGridAt(toMap, out var gridUid, out _)) { diff --git a/Content.Server/Guardian/GuardianSystem.cs b/Content.Server/Guardian/GuardianSystem.cs index 627c336a36b..d3a717c74af 100644 --- a/Content.Server/Guardian/GuardianSystem.cs +++ b/Content.Server/Guardian/GuardianSystem.cs @@ -34,6 +34,7 @@ public sealed class GuardianSystem : EntitySystem [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly BodySystem _bodySystem = default!; [Dependency] private readonly SharedContainerSystem _container = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; public override void Initialize() { @@ -328,7 +329,7 @@ private void CheckGuardianMove( if (!guardianComponent.GuardianLoose) return; - if (!guardianXform.Coordinates.InRange(EntityManager, hostXform.Coordinates, guardianComponent.DistanceAllowed)) + if (!guardianXform.Coordinates.InRange(EntityManager, _transform, hostXform.Coordinates, guardianComponent.DistanceAllowed)) RetractGuardian(hostUid, hostComponent, guardianUid, guardianComponent); } diff --git a/Content.Server/Hands/Systems/HandsSystem.cs b/Content.Server/Hands/Systems/HandsSystem.cs index a783a9e0968..a0e872dbeb1 100644 --- a/Content.Server/Hands/Systems/HandsSystem.cs +++ b/Content.Server/Hands/Systems/HandsSystem.cs @@ -31,6 +31,7 @@ public sealed class HandsSystem : SharedHandsSystem [Dependency] private readonly VirtualItemSystem _virtualItemSystem = default!; [Dependency] private readonly ActionBlockerSystem _actionBlockerSystem = default!; [Dependency] private readonly SharedHandsSystem _handsSystem = default!; + [Dependency] private readonly SharedTransformSystem _transformSystem = default!; [Dependency] private readonly PullingSystem _pullingSystem = default!; [Dependency] private readonly ThrowingSystem _throwingSystem = default!; @@ -191,7 +192,7 @@ hands.ActiveHandEntity is not { } throwEnt || throwEnt = splitStack.Value; } - var direction = coordinates.ToMapPos(EntityManager) - Transform(player).WorldPosition; + var direction = coordinates.ToMapPos(EntityManager, _transformSystem) - Transform(player).WorldPosition; if (direction == Vector2.Zero) return true; diff --git a/Content.Server/Implants/SubdermalImplantSystem.cs b/Content.Server/Implants/SubdermalImplantSystem.cs index ac415a04342..8eb27414481 100644 --- a/Content.Server/Implants/SubdermalImplantSystem.cs +++ b/Content.Server/Implants/SubdermalImplantSystem.cs @@ -99,7 +99,7 @@ private void OnScramImplant(EntityUid uid, SubdermalImplantComponent component, return; var xform = Transform(ent); - var entityCoords = xform.Coordinates.ToMap(EntityManager); + var entityCoords = xform.Coordinates.ToMap(EntityManager, _xform); // try to find a valid position to teleport to, teleport to whatever works if we can't var targetCoords = new MapCoordinates(); diff --git a/Content.Server/Magic/MagicSystem.cs b/Content.Server/Magic/MagicSystem.cs index 2c9b11dbd3d..92cd794ce2c 100644 --- a/Content.Server/Magic/MagicSystem.cs +++ b/Content.Server/Magic/MagicSystem.cs @@ -168,7 +168,7 @@ private void OnProjectileSpell(ProjectileSpellEvent ev) foreach (var pos in GetSpawnPositions(xform, ev.Pos)) { // If applicable, this ensures the projectile is parented to grid on spawn, instead of the map. - var mapPos = pos.ToMap(EntityManager); + var mapPos = pos.ToMap(EntityManager, _transformSystem); var spawnCoords = _mapManager.TryFindGridAt(mapPos, out var gridUid, out _) ? pos.WithEntityId(gridUid, EntityManager) : new(_mapManager.GetMapEntityId(mapPos.MapId), mapPos.Position); diff --git a/Content.Server/NPC/HTN/Preconditions/CoordinatesInRangePrecondition.cs b/Content.Server/NPC/HTN/Preconditions/CoordinatesInRangePrecondition.cs index 3e030aa8197..3485bd2a18c 100644 --- a/Content.Server/NPC/HTN/Preconditions/CoordinatesInRangePrecondition.cs +++ b/Content.Server/NPC/HTN/Preconditions/CoordinatesInRangePrecondition.cs @@ -22,6 +22,6 @@ public override bool IsMet(NPCBlackboard blackboard) if (!blackboard.TryGetValue(TargetKey, out var target, _entManager)) return false; - return coordinates.InRange(_entManager, target, blackboard.GetValueOrDefault(RangeKey, _entManager)); + return coordinates.InRange(_entManager, _entManager.System(), target, blackboard.GetValueOrDefault(RangeKey, _entManager)); } } diff --git a/Content.Server/NPC/HTN/Preconditions/CoordinatesNotInRangePrecondition.cs b/Content.Server/NPC/HTN/Preconditions/CoordinatesNotInRangePrecondition.cs index 6d8977bb7a7..9d000ca2eb8 100644 --- a/Content.Server/NPC/HTN/Preconditions/CoordinatesNotInRangePrecondition.cs +++ b/Content.Server/NPC/HTN/Preconditions/CoordinatesNotInRangePrecondition.cs @@ -22,7 +22,7 @@ public override bool IsMet(NPCBlackboard blackboard) if (!blackboard.TryGetValue(TargetKey, out var target, _entManager)) return false; - return !coordinates.InRange(_entManager, target, blackboard.GetValueOrDefault(RangeKey, _entManager)); + return !coordinates.InRange(_entManager, _entManager.System(), target, blackboard.GetValueOrDefault(RangeKey, _entManager)); } } diff --git a/Content.Server/NPC/HTN/Preconditions/TargetInRangePrecondition.cs b/Content.Server/NPC/HTN/Preconditions/TargetInRangePrecondition.cs index 5d616ba630e..aaccb426d71 100644 --- a/Content.Server/NPC/HTN/Preconditions/TargetInRangePrecondition.cs +++ b/Content.Server/NPC/HTN/Preconditions/TargetInRangePrecondition.cs @@ -23,6 +23,6 @@ public override bool IsMet(NPCBlackboard blackboard) !_entManager.TryGetComponent(target, out var targetXform)) return false; - return coordinates.InRange(_entManager, targetXform.Coordinates, blackboard.GetValueOrDefault(RangeKey, _entManager)); + return coordinates.InRange(_entManager, _entManager.System(), targetXform.Coordinates, blackboard.GetValueOrDefault(RangeKey, _entManager)); } } diff --git a/Content.Server/NPC/Pathfinding/PathfindingSystem.cs b/Content.Server/NPC/Pathfinding/PathfindingSystem.cs index 95f931cdd6a..a59af88ff58 100644 --- a/Content.Server/NPC/Pathfinding/PathfindingSystem.cs +++ b/Content.Server/NPC/Pathfinding/PathfindingSystem.cs @@ -405,7 +405,7 @@ public async void GetPathEvent( return null; } - var localPos = xform.InvWorldMatrix.Transform(coordinates.ToMapPos(EntityManager)); + var localPos = xform.InvWorldMatrix.Transform(coordinates.ToMapPos(EntityManager, _transform)); var origin = GetOrigin(localPos); if (!TryGetChunk(origin, comp, out var chunk)) diff --git a/Content.Server/Pointing/EntitySystems/PointingSystem.cs b/Content.Server/Pointing/EntitySystems/PointingSystem.cs index 06d2d6f58b5..9b2e14eff8b 100644 --- a/Content.Server/Pointing/EntitySystems/PointingSystem.cs +++ b/Content.Server/Pointing/EntitySystems/PointingSystem.cs @@ -36,6 +36,7 @@ internal sealed class PointingSystem : SharedPointingSystem [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly VisibilitySystem _visibilitySystem = default!; [Dependency] private readonly SharedMindSystem _minds = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly IAdminLogManager _adminLogger = default!; [Dependency] private readonly ExamineSystemShared _examine = default!; @@ -97,7 +98,7 @@ public bool InRange(EntityUid pointer, EntityCoordinates coordinates) { if (HasComp(pointer)) { - return Transform(pointer).Coordinates.InRange(EntityManager, coordinates, 15); + return Transform(pointer).Coordinates.InRange(EntityManager, _transform, coordinates, 15); } else { @@ -142,7 +143,7 @@ public bool TryPoint(ICommonSession? session, EntityCoordinates coordsPointed, E return false; } - var mapCoordsPointed = coordsPointed.ToMap(EntityManager); + var mapCoordsPointed = coordsPointed.ToMap(EntityManager, _transform); _rotateToFaceSystem.TryFaceCoordinates(player, mapCoordsPointed.Position); var arrow = EntityManager.SpawnEntity("PointingArrow", coordsPointed); @@ -150,7 +151,7 @@ public bool TryPoint(ICommonSession? session, EntityCoordinates coordsPointed, E if (TryComp(arrow, out var pointing)) { if (TryComp(player, out TransformComponent? xformPlayer)) - pointing.StartPosition = EntityCoordinates.FromMap(arrow, xformPlayer.Coordinates.ToMap(EntityManager)).Position; + pointing.StartPosition = EntityCoordinates.FromMap(arrow, xformPlayer.Coordinates.ToMap(EntityManager, _transform), _transform).Position; pointing.EndTime = _gameTiming.CurTime + PointDuration; diff --git a/Content.Server/Respawn/SpecialRespawnSystem.cs b/Content.Server/Respawn/SpecialRespawnSystem.cs index 51c092be18b..2822c94093f 100644 --- a/Content.Server/Respawn/SpecialRespawnSystem.cs +++ b/Content.Server/Respawn/SpecialRespawnSystem.cs @@ -20,6 +20,7 @@ public sealed class SpecialRespawnSystem : SharedSpecialRespawnSystem [Dependency] private readonly ITileDefinitionManager _tileDefinitionManager = default!; [Dependency] private readonly AtmosphereSystem _atmosphere = default!; [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly TurfSystem _turf = default!; [Dependency] private readonly IChatManager _chat = default!; @@ -129,11 +130,11 @@ private void OnTermination(EntityUid uid, SpecialRespawnComponent component, ref private void Respawn(EntityUid oldEntity, string prototype, EntityCoordinates coords) { var entity = Spawn(prototype, coords); - _adminLog.Add(LogType.Respawn, LogImpact.High, $"{ToPrettyString(oldEntity)} was deleted and was respawned at {coords.ToMap(EntityManager)} as {ToPrettyString(entity)}"); + _adminLog.Add(LogType.Respawn, LogImpact.High, $"{ToPrettyString(oldEntity)} was deleted and was respawned at {coords.ToMap(EntityManager, _transform)} as {ToPrettyString(entity)}"); _chat.SendAdminAlert($"{MetaData(oldEntity).EntityName} was deleted and was respawned as {ToPrettyString(entity)}"); } - /// + /// /// Try to find a random safe tile on the supplied grid /// /// The grid that you're looking for a safe tile on diff --git a/Content.Server/Singularity/EntitySystems/GravityWellSystem.cs b/Content.Server/Singularity/EntitySystems/GravityWellSystem.cs index ce4334391db..f1d0af6f905 100644 --- a/Content.Server/Singularity/EntitySystems/GravityWellSystem.cs +++ b/Content.Server/Singularity/EntitySystems/GravityWellSystem.cs @@ -18,13 +18,13 @@ namespace Content.Server.Singularity.EntitySystems; /// public sealed class GravityWellSystem : SharedGravityWellSystem { -#region Dependencies + #region Dependencies [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly IViewVariablesManager _vvManager = default!; [Dependency] private readonly EntityLookupSystem _lookup = default!; [Dependency] private readonly SharedPhysicsSystem _physics = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; -#endregion Dependencies + #endregion Dependencies /// /// The minimum range at which gravpulses will act. @@ -155,7 +155,7 @@ public void GravPulse(EntityUid uid, float maxRange, float minRange, float baseR /// The minimum distance at which entities can be affected by the gravity pulse. /// The base velocity added to any entities within affected by the gravity pulse scaled by the displacement of those entities from the epicenter. public void GravPulse(EntityCoordinates entityPos, float maxRange, float minRange, in Matrix3 baseMatrixDeltaV) - => GravPulse(entityPos.ToMap(EntityManager), maxRange, minRange, in baseMatrixDeltaV); + => GravPulse(entityPos.ToMap(EntityManager, _transform), maxRange, minRange, in baseMatrixDeltaV); /// /// Greates a gravitational pulse, shoving around all entities within some distance of an epicenter. @@ -166,7 +166,7 @@ public void GravPulse(EntityCoordinates entityPos, float maxRange, float minRang /// The base radial velocity that will be added to entities within range towards the center of the gravitational pulse. /// The base tangential velocity that will be added to entities within countrclockwise around the center of the gravitational pulse. public void GravPulse(EntityCoordinates entityPos, float maxRange, float minRange, float baseRadialDeltaV = 0.0f, float baseTangentialDeltaV = 0.0f) - => GravPulse(entityPos.ToMap(EntityManager), maxRange, minRange, baseRadialDeltaV, baseTangentialDeltaV); + => GravPulse(entityPos.ToMap(EntityManager, _transform), maxRange, minRange, baseRadialDeltaV, baseTangentialDeltaV); /// /// Causes a gravitational pulse, shoving around all entities within some distance of an epicenter. diff --git a/Content.Server/Singularity/EntitySystems/SingularityAttractorSystem.cs b/Content.Server/Singularity/EntitySystems/SingularityAttractorSystem.cs index 3c44a7fc7af..bc0de7c8c64 100644 --- a/Content.Server/Singularity/EntitySystems/SingularityAttractorSystem.cs +++ b/Content.Server/Singularity/EntitySystems/SingularityAttractorSystem.cs @@ -2,12 +2,7 @@ using Content.Server.Power.EntitySystems; using Content.Server.Singularity.Components; using Content.Shared.Singularity.Components; -using Content.Shared.Singularity.EntitySystems; using Robust.Shared.Map; -using Robust.Shared.Map.Components; -using Robust.Shared.Physics; -using Robust.Shared.Physics.Components; -using Robust.Shared.Physics.Systems; using Robust.Shared.Timing; using System.Numerics; @@ -18,8 +13,8 @@ namespace Content.Server.Singularity.EntitySystems; /// public sealed class SingularityAttractorSystem : EntitySystem { - [Dependency] private readonly EntityLookupSystem _lookup = default!; [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; /// /// The minimum range at which the attraction will act. @@ -69,7 +64,7 @@ private void Update(EntityUid uid, SingularityAttractorComponent? attractor = nu attractor.LastPulseTime = _timing.CurTime; - var mapPos = xform.Coordinates.ToMap(EntityManager); + var mapPos = xform.Coordinates.ToMap(EntityManager, _transform); if (mapPos == MapCoordinates.Nullspace) return; @@ -77,7 +72,7 @@ private void Update(EntityUid uid, SingularityAttractorComponent? attractor = nu var query = EntityQuery(); foreach (var (singulo, walk, singuloXform) in query) { - var singuloMapPos = singuloXform.Coordinates.ToMap(EntityManager); + var singuloMapPos = singuloXform.Coordinates.ToMap(EntityManager, _transform); if (singuloMapPos.MapId != mapPos.MapId) continue; diff --git a/Content.Server/Storage/EntitySystems/BluespaceLockerSystem.cs b/Content.Server/Storage/EntitySystems/BluespaceLockerSystem.cs index 9995ed40c12..356768769bb 100644 --- a/Content.Server/Storage/EntitySystems/BluespaceLockerSystem.cs +++ b/Content.Server/Storage/EntitySystems/BluespaceLockerSystem.cs @@ -26,6 +26,7 @@ public sealed class BluespaceLockerSystem : EntitySystem [Dependency] private readonly WeldableSystem _weldableSystem = default!; [Dependency] private readonly LockSystem _lockSystem = default!; [Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!; + [Dependency] private readonly SharedTransformSystem _transformSystem = default!; [Dependency] private readonly ExplosionSystem _explosionSystem = default!; public override void Initialize() @@ -386,7 +387,7 @@ private void DestroyAfterLimit(EntityUid uid, BluespaceLockerComponent component switch (component.BehaviorProperties.DestroyType) { case BluespaceLockerDestroyType.Explode: - _explosionSystem.QueueExplosion(uid.ToCoordinates().ToMap(EntityManager), + _explosionSystem.QueueExplosion(uid.ToCoordinates().ToMap(EntityManager, _transformSystem), ExplosionSystem.DefaultExplosionPrototypeId, 4, 1, 2, maxTileBreak: 0); goto case BluespaceLockerDestroyType.Delete; case BluespaceLockerDestroyType.Delete: diff --git a/Content.Server/Worldgen/Systems/Carvers/NoiseRangeCarverSystem.cs b/Content.Server/Worldgen/Systems/Carvers/NoiseRangeCarverSystem.cs index aed32bc89c3..f2e051669a2 100644 --- a/Content.Server/Worldgen/Systems/Carvers/NoiseRangeCarverSystem.cs +++ b/Content.Server/Worldgen/Systems/Carvers/NoiseRangeCarverSystem.cs @@ -9,6 +9,7 @@ namespace Content.Server.Worldgen.Systems.Carvers; public sealed class NoiseRangeCarverSystem : EntitySystem { [Dependency] private readonly NoiseIndexSystem _index = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; /// public override void Initialize() @@ -19,7 +20,7 @@ public override void Initialize() private void OnPrePlaceDebris(EntityUid uid, NoiseRangeCarverComponent component, ref PrePlaceDebrisFeatureEvent args) { - var coords = WorldGen.WorldToChunkCoords(args.Coords.ToMapPos(EntityManager)); + var coords = WorldGen.WorldToChunkCoords(args.Coords.ToMapPos(EntityManager, _transform)); var val = _index.Evaluate(uid, component.NoiseChannel, coords); foreach (var (low, high) in component.Ranges) diff --git a/Content.Shared/Construction/Conditions/WallmountCondition.cs b/Content.Shared/Construction/Conditions/WallmountCondition.cs index bf3016d4974..fe4336e6fc7 100644 --- a/Content.Shared/Construction/Conditions/WallmountCondition.cs +++ b/Content.Shared/Construction/Conditions/WallmountCondition.cs @@ -19,8 +19,9 @@ public bool Condition(EntityUid user, EntityCoordinates location, Direction dire var entManager = IoCManager.Resolve(); // get blueprint and user position + var transformSystem = entManager.System(); var userWorldPosition = entManager.GetComponent(user).WorldPosition; - var objWorldPosition = location.ToMap(entManager).Position; + var objWorldPosition = location.ToMap(entManager, transformSystem).Position; // find direction from user to blueprint var userToObject = (objWorldPosition - userWorldPosition); diff --git a/Content.Shared/Hands/EntitySystems/SharedHandsSystem.Pickup.cs b/Content.Shared/Hands/EntitySystems/SharedHandsSystem.Pickup.cs index bbae03e45b3..20e08b2767d 100644 --- a/Content.Shared/Hands/EntitySystems/SharedHandsSystem.Pickup.cs +++ b/Content.Shared/Hands/EntitySystems/SharedHandsSystem.Pickup.cs @@ -114,7 +114,7 @@ public bool TryPickup( && (itemPos.Position - xform.MapPosition.Position).Length() <= MaxAnimationRange && MetaData(entity).VisibilityMask == MetaData(uid).VisibilityMask) // Don't animate aghost pickups. { - var initialPosition = EntityCoordinates.FromMap(coordinateEntity, itemPos, EntityManager); + var initialPosition = EntityCoordinates.FromMap(coordinateEntity, itemPos, TransformSystem, EntityManager); _storage.PlayPickupAnimation(entity, initialPosition, xform.Coordinates, itemXform.LocalRotation, uid); } } diff --git a/Content.Shared/Interaction/SharedInteractionSystem.cs b/Content.Shared/Interaction/SharedInteractionSystem.cs index 7d5e390b6f0..0e390ecea45 100644 --- a/Content.Shared/Interaction/SharedInteractionSystem.cs +++ b/Content.Shared/Interaction/SharedInteractionSystem.cs @@ -459,7 +459,7 @@ protected bool ValidateInteractAndFace(EntityUid user, EntityCoordinates coordin return false; if (!HasComp(user)) - _rotateToFaceSystem.TryFaceCoordinates(user, coordinates.ToMapPos(EntityManager)); + _rotateToFaceSystem.TryFaceCoordinates(user, coordinates.ToMapPos(EntityManager, _transform)); return true; } @@ -612,7 +612,7 @@ public bool InRangeUnobstructed( Ignored combinedPredicate = e => e == origin || (predicate?.Invoke(e) ?? false); var inRange = true; MapCoordinates originPos = default; - var targetPos = otherCoordinates.ToMap(EntityManager); + var targetPos = otherCoordinates.ToMap(EntityManager, _transform); Angle targetRot = default; // So essentially: @@ -785,7 +785,7 @@ public bool InRangeUnobstructed( Ignored? predicate = null, bool popup = false) { - return InRangeUnobstructed(origin, other.ToMap(EntityManager), range, collisionMask, predicate, popup); + return InRangeUnobstructed(origin, other.ToMap(EntityManager, _transform), range, collisionMask, predicate, popup); } /// diff --git a/Content.Shared/Spawning/EntitySystemExtensions.cs b/Content.Shared/Spawning/EntitySystemExtensions.cs index 14b171baeb1..507a0f4aa27 100644 --- a/Content.Shared/Spawning/EntitySystemExtensions.cs +++ b/Content.Shared/Spawning/EntitySystemExtensions.cs @@ -16,7 +16,7 @@ public static class EntitySystemExtensions SharedPhysicsSystem? physicsManager = null) { physicsManager ??= entityManager.System(); - var mapCoordinates = coordinates.ToMap(entityManager); + var mapCoordinates = coordinates.ToMap(entityManager, entityManager.System()); return entityManager.SpawnIfUnobstructed(prototypeName, mapCoordinates, collisionLayer, box, physicsManager); } From a58b8155e5d6bee9089f5a2a7b027395e9029ebc Mon Sep 17 00:00:00 2001 From: SimpleStation14 <130339894+SimpleStation14@users.noreply.github.com> Date: Tue, 28 May 2024 23:42:06 -0400 Subject: [PATCH 036/155] Mirror: Snore is a trait now (#299) ## Mirror of PR #26322: [Snore is a trait now](https://github.com/space-wizards/space-station-14/pull/26322) from space-wizards [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `3b3b874dd9222770da616ba07277842d6b7a09be` PR opened by lzk228 at 2024-03-21 23:18:00 UTC --- PR changed 4 files with 24 additions and 1 deletions. The PR had the following labels: ---

Original Body

> > > > ## About the PR > > Title. > Snore sound is emitting with trait. Without trait not. > > ## Why / Balance > > Someone told me that snoring is a disease, and not every should have it so i decided to do this pr. > > ## Technical details > > > ## Media > > > - [ ] I have added screenshots/videos to this PR showcasing its changes ingame, **or** this PR does not require an ingame showcase > > ## Breaking changes > > > **Changelog** > > > > Make sure to take this Changelog template out of the comment block in order for it to show up. > :cl: > - tweak: Snoring is now a trait in character preference menu. > >
Co-authored-by: SimpleStation14 --- Content.Server/Bed/Components/SnoringComponent.cs | 10 ++++++++++ Content.Server/Bed/Sleep/SleepingSystem.cs | 5 ++++- Resources/Locale/en-US/traits/traits.ftl | 3 +++ Resources/Prototypes/Traits/disabilities.yml | 7 +++++++ 4 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 Content.Server/Bed/Components/SnoringComponent.cs diff --git a/Content.Server/Bed/Components/SnoringComponent.cs b/Content.Server/Bed/Components/SnoringComponent.cs new file mode 100644 index 00000000000..09f80327ba7 --- /dev/null +++ b/Content.Server/Bed/Components/SnoringComponent.cs @@ -0,0 +1,10 @@ +namespace Content.Server.Bed.Sleep; + +/// +/// This is used for the snoring trait. +/// +[RegisterComponent] +public sealed partial class SnoringComponent : Component +{ + +} diff --git a/Content.Server/Bed/Sleep/SleepingSystem.cs b/Content.Server/Bed/Sleep/SleepingSystem.cs index 685b1087d70..b4972544338 100644 --- a/Content.Server/Bed/Sleep/SleepingSystem.cs +++ b/Content.Server/Bed/Sleep/SleepingSystem.cs @@ -67,7 +67,10 @@ private void OnSleepStateChanged(EntityUid uid, MobStateComponent component, Sle if (TryComp(uid, out var sleepSound)) { var emitSound = EnsureComp(uid); - emitSound.Sound = sleepSound.Snore; + if (HasComp(uid)) + { + emitSound.Sound = sleepSound.Snore; + } emitSound.PlayChance = sleepSound.Chance; emitSound.RollInterval = sleepSound.Interval; emitSound.PopUp = sleepSound.PopUp; diff --git a/Resources/Locale/en-US/traits/traits.ftl b/Resources/Locale/en-US/traits/traits.ftl index c097a689dd8..7a3564edf66 100644 --- a/Resources/Locale/en-US/traits/traits.ftl +++ b/Resources/Locale/en-US/traits/traits.ftl @@ -29,3 +29,6 @@ trait-frontal-lisp-desc = You thpeak with a lithp trait-socialanxiety-name = Social Anxiety trait-socialanxiety-desc = You are anxious when you speak and stutter. + +trait-snoring-name = Snoring +trait-snoring-desc = You will snore while sleeping. diff --git a/Resources/Prototypes/Traits/disabilities.yml b/Resources/Prototypes/Traits/disabilities.yml index 064b34adbaf..2f1a7f92d26 100644 --- a/Resources/Prototypes/Traits/disabilities.yml +++ b/Resources/Prototypes/Traits/disabilities.yml @@ -60,3 +60,10 @@ description: trait-frontal-lisp-desc components: - type: FrontalLisp + +- type: trait + id: Snoring + name: trait-snoring-name + description: trait-snoring-desc + components: + - type: Snoring From 3bf69bf95846cbd2a14fca24d1ec434ee9cef1f5 Mon Sep 17 00:00:00 2001 From: SimpleStation14 <130339894+SimpleStation14@users.noreply.github.com> Date: Tue, 28 May 2024 23:42:38 -0400 Subject: [PATCH 037/155] Mirror: Sanitize "ig" (#298) ## Mirror of PR #26328: [Sanitize "ig"](https://github.com/space-wizards/space-station-14/pull/26328) from space-wizards [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `4f816b4b2f74db8da32cd157110df538e50eed1a` PR opened by Doctor-Cpu at 2024-03-22 05:20:30 UTC --- PR changed 2 files with 7 additions and 3 deletions. The PR had the following labels: - No C# ---

Original Body

> > > > ## About the PR > > "ig" gets replaced with "i guess" > > ## Why / Balance > > Common slang online which I've seen being attempted to be used before. > > ## Technical details > > N/A > > ## Media > > > - [X] I have added screenshots/videos to this PR showcasing its changes ingame, **or** this PR does not require an ingame showcase > > ## Breaking changes > > N/A > > **Changelog** > > > > Don't feel like one is needed.
Co-authored-by: SimpleStation14 --- .../Locale/en-US/speech/speech-chatsan.ftl | 3 +++ .../Prototypes/Accents/word_replacements.yml | 17 +++++++++-------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/Resources/Locale/en-US/speech/speech-chatsan.ftl b/Resources/Locale/en-US/speech/speech-chatsan.ftl index 4c8cf5db54c..6ce575e648d 100644 --- a/Resources/Locale/en-US/speech/speech-chatsan.ftl +++ b/Resources/Locale/en-US/speech/speech-chatsan.ftl @@ -114,3 +114,6 @@ chatsan-replacement-41 = what are you doing chatsan-word-42 = ofc chatsan-replacement-42 = of course + +chatsan-word-43 = ig +chatsan-replacement-43 = i guess diff --git a/Resources/Prototypes/Accents/word_replacements.yml b/Resources/Prototypes/Accents/word_replacements.yml index 147aebb5c5d..92b3d7de9b3 100644 --- a/Resources/Prototypes/Accents/word_replacements.yml +++ b/Resources/Prototypes/Accents/word_replacements.yml @@ -1,4 +1,4 @@ -# Accents that work off of word replacements. +# Accents that work off of word replacements. # this is kind of dumb but localization demands it. # i guess you could just specify the prefix ('mobster') and count and let the system fill it @@ -263,7 +263,7 @@ accent-pirate-replaced-30: accent-pirate-replacement-30 accent-pirate-replaced-31: accent-pirate-replacement-31 accent-pirate-replaced-32: accent-pirate-replacement-32 - + - type: accent id: cowboy wordReplacements: @@ -366,7 +366,7 @@ accent-cowboy-words-97: accent-cowboy-replacement-97 accent-cowboy-words-98: accent-cowboy-replacement-98 accent-cowboy-words-99: accent-cowboy-replacement-99 - + # For the chat sanitization system - type: accent @@ -409,8 +409,9 @@ # chatsan-word-35: chatsan-replacement-35 # chatsan-word-36: chatsan-replacement-36 chatsan-word-37: chatsan-replacement-37 - # chatsan-word-38: chatsan-replacement-38 - # chatsan-word-39: chatsan-replacement-etcetera - # chatsan-word-40: chatsan-replacement-etcetera - # chatsan-word-41: chatsan-replacement-41 - # chatsan-word-42: chatsan-replacement-42 + chatsan-word-38: chatsan-replacement-38 + chatsan-word-39: chatsan-replacement-etcetera + chatsan-word-40: chatsan-replacement-etcetera + chatsan-word-41: chatsan-replacement-41 + chatsan-word-42: chatsan-replacement-42 + chatsan-word-43: chatsan-replacement-43 From ef7f58fa5fae40e5238faff2d75c8a3e994b8982 Mon Sep 17 00:00:00 2001 From: SimpleStation14 <130339894+SimpleStation14@users.noreply.github.com> Date: Tue, 28 May 2024 23:43:16 -0400 Subject: [PATCH 038/155] Mirror: Fix placement mode on chairs (#183) ## Mirror of PR #26041: [Fix placement mode on chairs](https://github.com/space-wizards/space-station-14/pull/26041) from space-wizards [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `bcc147634af1fea7b5f53f18d136f44ed46cb053` PR opened by IamVelcroboy at 2024-03-12 14:45:33 UTC --- PR changed 1 files with 8 additions and 7 deletions. The PR had the following labels: - No C# ---

Original Body

> ## About the PR > Placement mode on chairs was donked up a little bit recently. This returns the ability to free place certain(unanchored) chairs while mapping. > > ## Why / Balance > More dynamic mapping > > ## Technical details > n/a > > ## Media > - [x] I have added screenshots/videos to this PR showcasing its changes in-game, **or** this PR does not require an in-game showcase > > ## Breaking changes > n/a > > **Changelog** > n/a
Signed-off-by: VMSolidus Co-authored-by: SimpleStation14 Co-authored-by: VMSolidus --- .../Entities/Structures/Furniture/chairs.yml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Resources/Prototypes/Entities/Structures/Furniture/chairs.yml b/Resources/Prototypes/Entities/Structures/Furniture/chairs.yml index 518ff2f066e..0b3c291af25 100644 --- a/Resources/Prototypes/Entities/Structures/Furniture/chairs.yml +++ b/Resources/Prototypes/Entities/Structures/Furniture/chairs.yml @@ -4,7 +4,7 @@ abstract: true description: You sit in this. Either by will or force. placement: - mode: SnapgridCenter + mode: PlaceFree components: - type: Clickable - type: InteractionOutline @@ -65,6 +65,8 @@ id: ChairBase abstract: true parent: UnanchoredChairBase + placement: + mode: SnapgridCenter components: - type: Physics bodyType: Static @@ -87,6 +89,8 @@ id: StoolBase parent: OfficeChairBase abstract: true + placement: + mode: SnapgridCenter components: - type: Physics bodyType: Static @@ -116,7 +120,7 @@ - type: entity name: stool id: Stool - parent: ChairBase + parent: UnanchoredChairBase description: Apply butt. components: - type: Sprite @@ -241,7 +245,7 @@ - type: entity id: ChairMeat - parent: ChairBase + parent: UnanchoredChairBase name: meat chair description: Uncomfortably sweaty. components: @@ -285,7 +289,7 @@ name: web chair id: ChairWeb description: For true web developers. - parent: ChairBase + parent: UnanchoredChairBase components: - type: Sprite sprite: Structures/Web/chair.rsi @@ -349,8 +353,6 @@ parent: ChairFolding id: ChairFoldingSpawnFolded suffix: folded - placement: - mode: PlaceFree components: - type: Foldable folded: true From 6ca11bd783a6ff84290725a42dd0263400db0e1c Mon Sep 17 00:00:00 2001 From: SimpleStation14 <130339894+SimpleStation14@users.noreply.github.com> Date: Tue, 28 May 2024 23:51:26 -0400 Subject: [PATCH 039/155] Mirror: Fix mice steering (#134) ## Mirror of PR #25965: [Fix mice steering](https://github.com/space-wizards/space-station-14/pull/25965) from space-wizards [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `819ec6361d0d2792b43357a6c45f8c95cb08d9ed` PR opened by metalgearsloth at 2024-03-10 14:57:30 UTC PR merged by web-flow at 2024-03-10 15:41:42 UTC --- PR changed 1 files with 24 additions and 1 deletions. The PR had the following labels: ---

Original Body

> Thinks there's obstacles when there isn't. Blending exposed it but it was an issue before. > > > :cl: > - fix: Fix NPC mouse movement. >
Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Co-authored-by: VMSolidus --- .../NPC/Systems/NPCSteeringSystem.Context.cs | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/Content.Server/NPC/Systems/NPCSteeringSystem.Context.cs b/Content.Server/NPC/Systems/NPCSteeringSystem.Context.cs index 7ac6768e359..e7af2c91073 100644 --- a/Content.Server/NPC/Systems/NPCSteeringSystem.Context.cs +++ b/Content.Server/NPC/Systems/NPCSteeringSystem.Context.cs @@ -56,7 +56,30 @@ private bool IsFreeSpace( return true; } - return false; + // TODO: Ideally for "FreeSpace" we check all entities on the tile and build flags dynamically (pathfinder refactor in future). + var ents = _entSetPool.Get(); + _lookup.GetLocalEntitiesIntersecting(node.GraphUid, node.ChunkOrigin, ents, flags: LookupFlags.Static); + var result = true; + + if (ents.Count > 0) + { + var fixtures = _fixturesQuery.GetComponent(uid); + var physics = _physicsQuery.GetComponent(uid); + + foreach (var intersecting in ents) + { + if (!_physics.IsCurrentlyHardCollidable((uid, fixtures, physics), intersecting)) + { + continue; + } + + result = false; + break; + } + } + + _entSetPool.Return(ents); + return result; } /// From 2fb4c5e79384877f9aa8f8373529ffcde55e5cbe Mon Sep 17 00:00:00 2001 From: SimpleStation14 <130339894+SimpleStation14@users.noreply.github.com> Date: Wed, 29 May 2024 00:03:15 -0400 Subject: [PATCH 040/155] Mirror: Create DeviceNetworkJammerComponent & System as a general way for entities to act as jammers (#382) ## Mirror of PR #26342: [Create DeviceNetworkJammerComponent & System as a general way for entities to act as jammers](https://github.com/space-wizards/space-station-14/pull/26342) from space-wizards [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `266cc85f57c883b3a604a66da91d94bb1e18ec5d` PR opened by nikthechampiongr at 2024-03-22 19:17:23 UTC --- PR changed 7 files with 91 additions and 25 deletions. The PR had the following labels: - Status: Needs Review ---

Original Body

> > > > ## About the PR > > This PR creates the DeviceNetworkJammerComponent & System as a general way for entities to act as jammers for the DeviceNetwork. > > Additionally it adjusts the JammerSystem for the radio jammer to use this, and rips out the previous special code for jamming suit sensors. > > As a result of this, the radio jammer can now additionally jam the suit sensor server itself from receiving DeviceNetwork packets. > > ## Why / Balance > > This pr was requested by a maintainer. > > Additionally a general jamming system can have some utility in the future. E.g. an artifact effect. > ## Technical details > > > Whenever a device attempts to send a packet, the > DeviceNetworkJammerSystem listens for the BeforePacketSentEvent. > From there if any entity with the jammer component is within range of > either the sender or receiver of the packet the event will be cancelled. > Additionally jammers can only block packets in certain networks. If a > packet is not being transmitted in one of the networks it can block then > even if the jammer is in range the event will not be cancelled. > > The range is stored in the jammer component along with the networks it > can jam. > > Jammable network ids are stored as strings which seems to be how custom > networks are stored (E.g. network ids for suit sensors). > > To allow for all of this, the BeforePacketSentEvent was modified to > provide the NetworkId. > > The JammerSystem now needs to get the networkid for suit sensors for use in the DeviceNetwork. The previous event subscription for jamming suit sensors have been removed along with the event. > > I wish I could use this to jam radios as well but radios are magic and do not use device networks. > > ## Media > > > - [x] I have added screenshots/videos to this PR showcasing its changes ingame, **or** this PR does not require an ingame showcase > > **Changelog** > > > > no cl no fun
Signed-off-by: VMSolidus Co-authored-by: SimpleStation14 Co-authored-by: VMSolidus --- .../Systems/DeviceNetworkJammerSystem.cs | 38 +++++++++++++++++++ .../Systems/DeviceNetworkSystem.cs | 11 +++++- .../Systems/SingletonDeviceNetServerSystem.cs | 5 ++- .../Radio/EntitySystems/JammerSystem.cs | 17 +++++++++ .../DeviceNetworkJammerComponent.cs | 24 ++++++++++++ 5 files changed, 91 insertions(+), 4 deletions(-) create mode 100644 Content.Server/DeviceNetwork/Systems/DeviceNetworkJammerSystem.cs create mode 100644 Content.Shared/DeviceNetwork/Components/DeviceNetworkJammerComponent.cs diff --git a/Content.Server/DeviceNetwork/Systems/DeviceNetworkJammerSystem.cs b/Content.Server/DeviceNetwork/Systems/DeviceNetworkJammerSystem.cs new file mode 100644 index 00000000000..3d3820562d6 --- /dev/null +++ b/Content.Server/DeviceNetwork/Systems/DeviceNetworkJammerSystem.cs @@ -0,0 +1,38 @@ +using Content.Server.DeviceNetwork.Components; +using Content.Shared.DeviceNetwork.Components; +using Robust.Server.GameObjects; + +namespace Content.Server.DeviceNetwork.Systems; + +public sealed class DeviceNetworkJammerSystem : EntitySystem +{ + [Dependency] private TransformSystem _transform = default!; + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(BeforePacketSent); + } + + private void BeforePacketSent(EntityUid uid, TransformComponent xform, BeforePacketSentEvent ev) + { + if (ev.Cancelled) + return; + + var query = EntityQueryEnumerator(); + + while (query.MoveNext(out _, out var jammerComp, out var jammerXform)) + { + if (!jammerComp.JammableNetworks.Contains(ev.NetworkId)) + continue; + + if (jammerXform.Coordinates.InRange(EntityManager, _transform, ev.SenderTransform.Coordinates, jammerComp.Range) + || jammerXform.Coordinates.InRange(EntityManager, _transform, xform.Coordinates, jammerComp.Range)) + { + ev.Cancel(); + return; + } + } + } + +} diff --git a/Content.Server/DeviceNetwork/Systems/DeviceNetworkSystem.cs b/Content.Server/DeviceNetwork/Systems/DeviceNetworkSystem.cs index 83967c9bbd4..20ee7a5dd1b 100644 --- a/Content.Server/DeviceNetwork/Systems/DeviceNetworkSystem.cs +++ b/Content.Server/DeviceNetwork/Systems/DeviceNetworkSystem.cs @@ -351,13 +351,14 @@ private void SendToConnections(ReadOnlySpan connections, var xform = Transform(packet.Sender); - BeforePacketSentEvent beforeEv = new(packet.Sender, xform, _transformSystem.GetWorldPosition(xform)); + var senderPos = _transformSystem.GetWorldPosition(xform); foreach (var connection in connections) { if (connection.Owner == packet.Sender) continue; + BeforePacketSentEvent beforeEv = new(packet.Sender, xform, senderPos, connection.NetIdEnum.ToString()); RaiseLocalEvent(connection.Owner, beforeEv, false); if (!beforeEv.Cancelled) @@ -386,11 +387,17 @@ public sealed class BeforePacketSentEvent : CancellableEntityEventArgs ///
public readonly Vector2 SenderPosition; - public BeforePacketSentEvent(EntityUid sender, TransformComponent xform, Vector2 senderPosition) + /// + /// The network the packet will be sent to. + /// + public readonly string NetworkId; + + public BeforePacketSentEvent(EntityUid sender, TransformComponent xform, Vector2 senderPosition, string networkId) { Sender = sender; SenderTransform = xform; SenderPosition = senderPosition; + NetworkId = networkId; } } diff --git a/Content.Server/DeviceNetwork/Systems/SingletonDeviceNetServerSystem.cs b/Content.Server/DeviceNetwork/Systems/SingletonDeviceNetServerSystem.cs index fd62514d006..cdc083feacd 100644 --- a/Content.Server/DeviceNetwork/Systems/SingletonDeviceNetServerSystem.cs +++ b/Content.Server/DeviceNetwork/Systems/SingletonDeviceNetServerSystem.cs @@ -1,4 +1,5 @@ -using Content.Server.DeviceNetwork.Components; +using System.Diagnostics.CodeAnalysis; +using Content.Server.DeviceNetwork.Components; using Content.Server.Medical.CrewMonitoring; using Content.Server.Power.Components; using Content.Server.Station.Systems; @@ -38,7 +39,7 @@ public bool IsActiveServer(EntityUid serverId, SingletonDeviceNetServerComponent /// The address of the active server if it exists /// The component type that determines what type of server you're getting the address of /// True if there is an active serve. False otherwise - public bool TryGetActiveServerAddress(EntityUid stationId, out string? address) where TComp : IComponent + public bool TryGetActiveServerAddress(EntityUid stationId, [NotNullWhen(true)] out string? address) where TComp : IComponent { var servers = EntityQueryEnumerator< SingletonDeviceNetServerComponent, diff --git a/Content.Server/Radio/EntitySystems/JammerSystem.cs b/Content.Server/Radio/EntitySystems/JammerSystem.cs index fdf02f94df5..53e0409af06 100644 --- a/Content.Server/Radio/EntitySystems/JammerSystem.cs +++ b/Content.Server/Radio/EntitySystems/JammerSystem.cs @@ -1,8 +1,13 @@ +using Content.Server.DeviceNetwork.Components; +using Content.Server.DeviceNetwork.Systems; +using Content.Server.Medical.CrewMonitoring; using Content.Server.Medical.SuitSensors; using Content.Server.Popups; using Content.Server.Power.EntitySystems; using Content.Server.PowerCell; using Content.Server.Radio.Components; +using Content.Server.Station.Systems; +using Content.Shared.DeviceNetwork.Components; using Content.Shared.Examine; using Content.Shared.Interaction; using Content.Shared.PowerCell.Components; @@ -15,6 +20,8 @@ public sealed class JammerSystem : EntitySystem [Dependency] private readonly BatterySystem _battery = default!; [Dependency] private readonly PopupSystem _popup = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; + [Dependency] private readonly StationSystem _stationSystem = default!; + [Dependency] private readonly SingletonDeviceNetServerSystem _singletonServerSystem = default!; public override void Initialize() { @@ -36,6 +43,7 @@ public override void Update(float frameTime) !_battery.TryUseCharge(batteryUid.Value, jam.Wattage * frameTime, battery)) { RemComp(uid); + RemComp(uid); } } } @@ -48,10 +56,19 @@ private void OnActivate(EntityUid uid, RadioJammerComponent comp, ActivateInWorl if (activated) { EnsureComp(uid); + var stationId = _stationSystem.GetOwningStation(uid); + if (stationId != null && _singletonServerSystem.TryGetActiveServerAddress(stationId.Value, out var netId)) + { + EnsureComp(uid, out var jammingComp); + jammingComp.Range = comp.Range; + jammingComp.JammableNetworks.Add(netId); + Dirty(uid, jammingComp); + } } else { RemComp(uid); + RemComp(uid); } var state = Loc.GetString(activated ? "radio-jammer-component-on-state" : "radio-jammer-component-off-state"); var message = Loc.GetString("radio-jammer-component-on-use", ("state", state)); diff --git a/Content.Shared/DeviceNetwork/Components/DeviceNetworkJammerComponent.cs b/Content.Shared/DeviceNetwork/Components/DeviceNetworkJammerComponent.cs new file mode 100644 index 00000000000..75de0cb8a25 --- /dev/null +++ b/Content.Shared/DeviceNetwork/Components/DeviceNetworkJammerComponent.cs @@ -0,0 +1,24 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.DeviceNetwork.Components; + +/// +/// Allow entities to jam DeviceNetwork packets. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class DeviceNetworkJammerComponent : Component +{ + /// + /// Range where packets will be jammed. This is checked both against the sender and receiver. + /// + [DataField, AutoNetworkedField] + public float Range = 5.0f; + + /// + /// Device networks that can be jammed. For a list of default NetworkIds see DeviceNetIdDefaults on Content.Server. + /// Network ids are not guaranteed to be limited to DeviceNetIdDefaults. + /// + [DataField, AutoNetworkedField] + public HashSet JammableNetworks = []; + +} From 3898d0913c790f37bc15f436f02316981a1d8a35 Mon Sep 17 00:00:00 2001 From: SimpleStation14 <130339894+SimpleStation14@users.noreply.github.com> Date: Wed, 29 May 2024 00:08:15 -0400 Subject: [PATCH 041/155] Mirror: Irish Coffee Recipe Tweak (#302) ## Mirror of PR #26327: [Irish Coffee Recipe Tweak](https://github.com/space-wizards/space-station-14/pull/26327) from space-wizards [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `e93af9bee6143f95bd01a595a34590b61e1b92cb` PR opened by BlitzTheSquishy at 2024-03-22 04:05:06 UTC --- PR changed 1 files with 3 additions and 3 deletions. The PR had the following labels: - No C# ---

Original Body

> > > > ## About the PR > > Changed the reaction for Irish Coffee to be more logical > > ## Why / Balance > > This would simply make it easier for bartenders to mix Irish Coffee to a number that's a multiple of 2, rather than 4 (such as a metamorphic glass) > > ## Technical details > > > ## Media > > > - [X] I have added screenshots/videos to this PR showcasing its changes ingame, **or** this PR does not require an ingame showcase > > ## Breaking changes > > > **Changelog** > > > > :cl: > > - tweak: Irish Coffee recipe adjusted to be more logical > >
Co-authored-by: SimpleStation14 Co-authored-by: VMSolidus --- Resources/Prototypes/Recipes/Reactions/drinks.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Resources/Prototypes/Recipes/Reactions/drinks.yml b/Resources/Prototypes/Recipes/Reactions/drinks.yml index e5afdbd6def..7608369b2ce 100644 --- a/Resources/Prototypes/Recipes/Reactions/drinks.yml +++ b/Resources/Prototypes/Recipes/Reactions/drinks.yml @@ -454,11 +454,11 @@ id: IrishCoffee reactants: Coffee: - amount: 2 + amount: 1 IrishCream: - amount: 2 + amount: 1 products: - IrishCoffee: 4 + IrishCoffee: 2 - type: reaction id: IrishCream From 75106b3d8cad057bc954d2baaf82ad9764a628a1 Mon Sep 17 00:00:00 2001 From: SimpleStation14 <130339894+SimpleStation14@users.noreply.github.com> Date: Wed, 29 May 2024 00:12:14 -0400 Subject: [PATCH 042/155] Mirror: Adds craftable ducky slippers (#261) ## Mirror of PR #26138: [Adds craftable ducky slippers](https://github.com/space-wizards/space-station-14/pull/26138) from space-wizards [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `6694f92171ad8d6465b8c8403bf863ba66a75b74` PR opened by Plykiya at 2024-03-15 11:38:14 UTC --- PR changed 5 files with 43 additions and 1 deletions. The PR had the following labels: - No C# ---

Original Body

> > > > ## About the PR > > Allows you to craft ducky slippers out of two rubber duckies. > > ## Why / Balance > > Quack > > ## Technical details > > All yml requirements to add a construction graph, tags for it, and the end result. > > ## Media > > > - [ X ] I have added screenshots/videos to this PR showcasing its changes ingame, **or** this PR does not require an ingame showcase > ![image](https://github.com/space-wizards/space-station-14/assets/58439124/42a7e44c-3be1-42a4-9e0a-c9735380c63a) > > **Changelog** > > > > :cl: > - add: You can now craft ducky slippers.
Signed-off-by: VMSolidus Co-authored-by: SimpleStation14 Co-authored-by: VMSolidus --- .../Entities/Clothing/Shoes/misc.yml | 3 +++ .../Prototypes/Entities/Objects/Fun/toys.yml | 3 +++ .../Graphs/clothing/ducky_slippers.yml | 22 +++++++++++++++++++ .../Recipes/Construction/clothing.yml | 11 ++++++++++ Resources/Prototypes/tags.yml | 3 +++ 5 files changed, 42 insertions(+) create mode 100644 Resources/Prototypes/Recipes/Construction/Graphs/clothing/ducky_slippers.yml diff --git a/Resources/Prototypes/Entities/Clothing/Shoes/misc.yml b/Resources/Prototypes/Entities/Clothing/Shoes/misc.yml index ee1708caef6..d1f6e083f40 100644 --- a/Resources/Prototypes/Entities/Clothing/Shoes/misc.yml +++ b/Resources/Prototypes/Entities/Clothing/Shoes/misc.yml @@ -47,6 +47,9 @@ collection: FootstepDuck params: variation: 0.07 + - type: Construction + graph: ClothingShoeSlippersDuck + node: shoes - type: entity parent: ClothingShoesBaseButcherable diff --git a/Resources/Prototypes/Entities/Objects/Fun/toys.yml b/Resources/Prototypes/Entities/Objects/Fun/toys.yml index 6697aa711e0..67c6e1194b7 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/toys.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/toys.yml @@ -643,6 +643,9 @@ requiresSpecialDigestion: true useSound: path: /Audio/Items/Toys/mousesqueek.ogg + - type: Tag + tags: + - ToyRubberDuck - type: entity parent: BasePlushie diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/clothing/ducky_slippers.yml b/Resources/Prototypes/Recipes/Construction/Graphs/clothing/ducky_slippers.yml new file mode 100644 index 00000000000..e017096fa90 --- /dev/null +++ b/Resources/Prototypes/Recipes/Construction/Graphs/clothing/ducky_slippers.yml @@ -0,0 +1,22 @@ +- type: constructionGraph + id: ClothingShoeSlippersDuck + start: start + graph: + - node: start + edges: + - to: shoes + steps: + - tag: ToyRubberDuck + name: a rubber ducky + icon: + sprite: Objects/Fun/ducky.rsi + state: icon + doAfter: 1 + - tag: ToyRubberDuck + name: a rubber ducky + icon: + sprite: Objects/Fun/ducky.rsi + state: icon + doAfter: 1 + - node: shoes + entity: ClothingShoeSlippersDuck diff --git a/Resources/Prototypes/Recipes/Construction/clothing.yml b/Resources/Prototypes/Recipes/Construction/clothing.yml index 4fe2c474bb4..f1eb270af73 100644 --- a/Resources/Prototypes/Recipes/Construction/clothing.yml +++ b/Resources/Prototypes/Recipes/Construction/clothing.yml @@ -85,3 +85,14 @@ description: Two huds joined by arms icon: { sprite: Clothing/Eyes/Hud/medsec.rsi, state: icon } objectType: Item + +- type: construction + name: ducky slippers + id: ClothingShoeSlippersDuck + graph: ClothingShoeSlippersDuck + startNode: start + targetNode: shoes + category: construction-category-clothing + description: Comfy, yet haunted by the ghosts of ducks you fed bread to as a child. + icon: { sprite: Clothing/Shoes/Misc/duck-slippers.rsi, state: icon } + objectType: Item diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml index 2694cbeaf39..c6a0ab3f8fd 100644 --- a/Resources/Prototypes/tags.yml +++ b/Resources/Prototypes/tags.yml @@ -1190,6 +1190,9 @@ - type: Tag id: Torch +- type: Tag + id: ToyRubberDuck + - type: Tag id: ToySidearm From ec3986b6cfb2879f6b765589ff0cc727062431cc Mon Sep 17 00:00:00 2001 From: SimpleStation14 <130339894+SimpleStation14@users.noreply.github.com> Date: Wed, 29 May 2024 00:16:49 -0400 Subject: [PATCH 043/155] Mirror: Fix anomaly decay logs (#227) ## Mirror of PR #26180: [Fix anomaly decay logs](https://github.com/space-wizards/space-station-14/pull/26180) from space-wizards [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `d8a7b33b43cd9b0e241dc189653cbd4cf4c49086` PR opened by LordCarve at 2024-03-16 17:05:24 UTC --- PR changed 1 files with 3 additions and 2 deletions. The PR had the following labels: - Status: Needs Review ---

Original Body

> > > > ## About the PR > > - Decayed Anomalies leave log with `LogImpact.Low` (down from `LogImpact.Extreme` and being misreported as having gone supercritical) > Reason: Admin Logs severity usually means how much of admin attention this requires. A decayed anomaly does not require any Admin attention and is essentially just a convenience note. > > - Swapped `LogImpact`s of supercritical event starting and finishing. > Reason: When an anomaly starts going supercritical it leaves a log with `LogImpact.High`, but when it finishes the animation it leaves a log with `LogImpact.Extreme`. This seems inconsistent to me, because the moment anomaly starts going supercritical seems to demand more Admin attention than an "it had already happened"-style report. After this change, a supercritical anomaly will still always leave at least one `LogImpact.Extreme` admin log, so from reporting perspective it should be conveying the same message;, but from "immediate responder" perspective Admins get the more-important `Extreme` log sooner (as the supercritical event starts happening, rather than after it had already finished). > > Resolves #26122 > > ## Why / Balance > > Bugfix. > > ## Technical details > > Anomalies ending still leave multiple logs. This is beyond the scope of this PR. > But at least now it won't spam the `LogImpact.Extreme` category. > > ## Media > > ![image](https://github.com/space-wizards/space-station-14/assets/27449516/09ddfd79-a872-4be2-8ba7-16619b63835b) > > - [X] I have added screenshots/videos to this PR showcasing its changes ingame, **or** this PR does not require an ingame showcase > > **Changelog** > > > :cl: > ADMIN > - fix: Decayed anomalies no longer show as having gone supercritical in logs.
Signed-off-by: VMSolidus Co-authored-by: SimpleStation14 Co-authored-by: VMSolidus --- Content.Shared/Anomaly/SharedAnomalySystem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Shared/Anomaly/SharedAnomalySystem.cs b/Content.Shared/Anomaly/SharedAnomalySystem.cs index a3bb1e14679..c335cd7b858 100644 --- a/Content.Shared/Anomaly/SharedAnomalySystem.cs +++ b/Content.Shared/Anomaly/SharedAnomalySystem.cs @@ -129,7 +129,7 @@ public void StartSupercriticalEvent(EntityUid uid) if (HasComp(uid)) return; - AdminLog.Add(LogType.Anomaly, LogImpact.High, $"Anomaly {ToPrettyString(uid)} began to go supercritical."); + AdminLog.Add(LogType.Anomaly, LogImpact.Extreme, $"Anomaly {ToPrettyString(uid)} began to go supercritical."); if (_net.IsServer) Log.Info($"Anomaly is going supercritical. Entity: {ToPrettyString(uid)}"); From 4e8365c3407676b4c5f2c5d34990b5c040ae00c9 Mon Sep 17 00:00:00 2001 From: SimpleStation14 <130339894+SimpleStation14@users.noreply.github.com> Date: Wed, 29 May 2024 00:18:31 -0400 Subject: [PATCH 044/155] Mirror: Use entity queries in ambient sound & power receiver systems (#376) ## Mirror of PR #26410: [Use entity queries in ambient sound & power receiver systems](https://github.com/space-wizards/space-station-14/pull/26410) from space-wizards [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `31d70db547f855d2a3d4075e4fcf54d1c87c0f06` PR opened by ElectroJr at 2024-03-24 20:29:56 UTC --- PR changed 2 files with 18 additions and 10 deletions. The PR had the following labels: ---

Original Body

>
Co-authored-by: SimpleStation14 Co-authored-by: VMSolidus --- .../Power/EntitySystems/PowerReceiverSystem.cs | 17 +++++++++++------ .../Audio/SharedAmbientSoundSystem.cs | 11 +++++++---- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/Content.Server/Power/EntitySystems/PowerReceiverSystem.cs b/Content.Server/Power/EntitySystems/PowerReceiverSystem.cs index 5ed39d51787..048fda23553 100644 --- a/Content.Server/Power/EntitySystems/PowerReceiverSystem.cs +++ b/Content.Server/Power/EntitySystems/PowerReceiverSystem.cs @@ -20,6 +20,8 @@ public sealed class PowerReceiverSystem : EntitySystem [Dependency] private readonly IAdminManager _adminManager = default!; [Dependency] private readonly AppearanceSystem _appearance = default!; [Dependency] private readonly AudioSystem _audio = default!; + private EntityQuery _recQuery; + private EntityQuery _provQuery; public override void Initialize() { @@ -35,6 +37,9 @@ public override void Initialize() SubscribeLocalEvent>(OnGetVerbs); SubscribeLocalEvent>(AddSwitchPowerVerb); + + _recQuery = GetEntityQuery(); + _provQuery = GetEntityQuery(); } private void OnGetVerbs(EntityUid uid, ApcPowerReceiverComponent component, GetVerbsEvent args) @@ -77,7 +82,7 @@ private void OnProviderShutdown(EntityUid uid, ApcPowerProviderComponent compone private void OnProviderConnected(Entity receiver, ref ExtensionCableSystem.ProviderConnectedEvent args) { var providerUid = args.Provider.Owner; - if (!EntityManager.TryGetComponent(providerUid, out var provider)) + if (!_provQuery.TryGetComponent(providerUid, out var provider)) return; receiver.Comp.Provider = provider; @@ -94,7 +99,7 @@ private void OnProviderDisconnected(Entity receiver, private void OnReceiverConnected(Entity provider, ref ExtensionCableSystem.ReceiverConnectedEvent args) { - if (EntityManager.TryGetComponent(args.Receiver, out ApcPowerReceiverComponent? receiver)) + if (_recQuery.TryGetComponent(args.Receiver, out var receiver)) { provider.Comp.AddReceiver(receiver); } @@ -102,7 +107,7 @@ private void OnReceiverConnected(Entity provider, ref private void OnReceiverDisconnected(EntityUid uid, ApcPowerProviderComponent provider, ExtensionCableSystem.ReceiverDisconnectedEvent args) { - if (EntityManager.TryGetComponent(args.Receiver, out ApcPowerReceiverComponent? receiver)) + if (_recQuery.TryGetComponent(args.Receiver, out var receiver)) { provider.RemoveReceiver(receiver); } @@ -116,7 +121,7 @@ private void AddSwitchPowerVerb(EntityUid uid, PowerSwitchComponent component, G if (!HasComp(args.User)) return; - if (!TryComp(uid, out var receiver)) + if (!_recQuery.TryGetComponent(uid, out var receiver)) return; if (!receiver.NeedsPower) @@ -152,7 +157,7 @@ private void ProviderChanged(Entity receiver) ///
public bool IsPowered(EntityUid uid, ApcPowerReceiverComponent? receiver = null) { - if (!Resolve(uid, ref receiver, false)) + if (!_recQuery.Resolve(uid, ref receiver, false)) return true; return receiver.Powered; @@ -164,7 +169,7 @@ public bool IsPowered(EntityUid uid, ApcPowerReceiverComponent? receiver = null) ///
public bool TogglePower(EntityUid uid, bool playSwitchSound = true, ApcPowerReceiverComponent? receiver = null, EntityUid? user = null) { - if (!Resolve(uid, ref receiver, false)) + if (!_recQuery.Resolve(uid, ref receiver, false)) return true; // it'll save a lot of confusion if 'always powered' means 'always powered' diff --git a/Content.Shared/Audio/SharedAmbientSoundSystem.cs b/Content.Shared/Audio/SharedAmbientSoundSystem.cs index 6318ba25573..5f17261825c 100644 --- a/Content.Shared/Audio/SharedAmbientSoundSystem.cs +++ b/Content.Shared/Audio/SharedAmbientSoundSystem.cs @@ -5,16 +5,19 @@ namespace Content.Shared.Audio; public abstract class SharedAmbientSoundSystem : EntitySystem { + private EntityQuery _query; + public override void Initialize() { base.Initialize(); SubscribeLocalEvent(GetCompState); SubscribeLocalEvent(HandleCompState); + _query = GetEntityQuery(); } public virtual void SetAmbience(EntityUid uid, bool value, AmbientSoundComponent? ambience = null) { - if (!Resolve(uid, ref ambience, false) || ambience.Enabled == value) + if (!_query.Resolve(uid, ref ambience, false) || ambience.Enabled == value) return; ambience.Enabled = value; @@ -24,7 +27,7 @@ public virtual void SetAmbience(EntityUid uid, bool value, AmbientSoundComponent public virtual void SetRange(EntityUid uid, float value, AmbientSoundComponent? ambience = null) { - if (!Resolve(uid, ref ambience, false) || MathHelper.CloseToPercent(ambience.Range, value)) + if (!_query.Resolve(uid, ref ambience, false) || MathHelper.CloseToPercent(ambience.Range, value)) return; ambience.Range = value; @@ -39,7 +42,7 @@ protected virtual void QueueUpdate(EntityUid uid, AmbientSoundComponent ambience public virtual void SetVolume(EntityUid uid, float value, AmbientSoundComponent? ambience = null) { - if (!Resolve(uid, ref ambience, false) || MathHelper.CloseToPercent(ambience.Volume, value)) + if (!_query.Resolve(uid, ref ambience, false) || MathHelper.CloseToPercent(ambience.Volume, value)) return; ambience.Volume = value; @@ -48,7 +51,7 @@ public virtual void SetVolume(EntityUid uid, float value, AmbientSoundComponent? public virtual void SetSound(EntityUid uid, SoundSpecifier sound, AmbientSoundComponent? ambience = null) { - if (!Resolve(uid, ref ambience, false) || ambience.Sound == sound) + if (!_query.Resolve(uid, ref ambience, false) || ambience.Sound == sound) return; ambience.Sound = sound; From 5c2cff00227dae204f07c3e77cdf134e791e72ec Mon Sep 17 00:00:00 2001 From: SimpleStation14 <130339894+SimpleStation14@users.noreply.github.com> Date: Wed, 29 May 2024 00:19:32 -0400 Subject: [PATCH 045/155] Mirror: Fix wire layout inheritance. (#284) ## Mirror of PR #26289: [Fix wire layout inheritance.](https://github.com/space-wizards/space-station-14/pull/26289) from space-wizards [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `a4692004de978cda6761d4090e13ed4d8bc1fa11` PR opened by PJB3005 at 2024-03-20 14:42:55 UTC --- PR changed 2 files with 105 additions and 0 deletions. The PR had the following labels: ---

Original Body

> Wire layouts manually navigate the inheritance hierarchy, but the data fields on the prototypes were also automatically inherited already. This meant that inheriting a wire layout prototype and changing nothing would cause the wires to be duplicated unless they were manually modified on top. > > Fix is easy: just disable inheritance on the data fields. > > Also, integration test for it. >
Co-authored-by: SimpleStation14 Co-authored-by: Danger Revolution! <142105406+DangerRevolution@users.noreply.github.com> --- .../Tests/Wires/WireLayoutTest.cs | 103 ++++++++++++++++++ Content.Server/Wires/WireLayout.cs | 2 + 2 files changed, 105 insertions(+) create mode 100644 Content.IntegrationTests/Tests/Wires/WireLayoutTest.cs diff --git a/Content.IntegrationTests/Tests/Wires/WireLayoutTest.cs b/Content.IntegrationTests/Tests/Wires/WireLayoutTest.cs new file mode 100644 index 00000000000..920dc088186 --- /dev/null +++ b/Content.IntegrationTests/Tests/Wires/WireLayoutTest.cs @@ -0,0 +1,103 @@ +using Content.Server.Doors; +using Content.Server.Power; +using Content.Server.Wires; +using Robust.Shared.GameObjects; +using Robust.Shared.IoC; +using Robust.Shared.Map; + +namespace Content.IntegrationTests.Tests.Wires; + +[TestFixture] +[Parallelizable(ParallelScope.All)] +[TestOf(typeof(WiresSystem))] +public sealed class WireLayoutTest +{ + [TestPrototypes] + public const string Prototypes = """ + - type: wireLayout + id: WireLayoutTest + dummyWires: 2 + wires: + - !type:PowerWireAction + - !type:DoorBoltWireAction + + - type: wireLayout + id: WireLayoutTest2 + parent: WireLayoutTest + wires: + - !type:PowerWireAction + + - type: wireLayout + id: WireLayoutTest3 + parent: WireLayoutTest + + - type: entity + id: WireLayoutTest + components: + - type: Wires + layoutId: WireLayoutTest + + - type: entity + id: WireLayoutTest2 + components: + - type: Wires + layoutId: WireLayoutTest2 + + - type: entity + id: WireLayoutTest3 + components: + - type: Wires + layoutId: WireLayoutTest3 + """; + + [Test] + public async Task TestLayoutInheritance() + { + await using var pair = await PoolManager.GetServerClient(); + var server = pair.Server; + var testMap = await pair.CreateTestMap(); + + await server.WaitAssertion(() => + { + var wires = IoCManager.Resolve().GetEntitySystem(); + + // Need to spawn these entities to make sure the wire layouts are initialized. + var ent1 = SpawnWithComp(server.EntMan, "WireLayoutTest", testMap.MapCoords); + var ent2 = SpawnWithComp(server.EntMan, "WireLayoutTest2", testMap.MapCoords); + var ent3 = SpawnWithComp(server.EntMan, "WireLayoutTest3", testMap.MapCoords); + + // Assert.That(wires.TryGetLayout("WireLayoutTest", out var layout1)); + // Assert.That(wires.TryGetLayout("WireLayoutTest2", out var layout2)); + // Assert.That(wires.TryGetLayout("WireLayoutTest3", out var layout3)); + + Assert.Multiple(() => + { + // Entity 1. + Assert.That(ent1.Comp.WiresList, Has.Count.EqualTo(4)); + Assert.That(ent1.Comp.WiresList, Has.Exactly(2).With.Property("Action").Null, "2 dummy wires"); + Assert.That(ent1.Comp.WiresList, Has.One.With.Property("Action").InstanceOf(), "1 power wire"); + Assert.That(ent1.Comp.WiresList, Has.One.With.Property("Action").InstanceOf(), "1 door bolt wire"); + + Assert.That(ent2.Comp.WiresList, Has.Count.EqualTo(5)); + Assert.That(ent2.Comp.WiresList, Has.Exactly(2).With.Property("Action").Null, "2 dummy wires"); + Assert.That(ent2.Comp.WiresList, Has.Exactly(2).With.Property("Action").InstanceOf(), "2 power wire"); + Assert.That(ent2.Comp.WiresList, Has.One.With.Property("Action").InstanceOf(), "1 door bolt wire"); + + Assert.That(ent3.Comp.WiresList, Has.Count.EqualTo(4)); + Assert.That(ent3.Comp.WiresList, Has.Exactly(2).With.Property("Action").Null, "2 dummy wires"); + Assert.That(ent3.Comp.WiresList, Has.One.With.Property("Action").InstanceOf(), "1 power wire"); + Assert.That(ent3.Comp.WiresList, Has.One.With.Property("Action").InstanceOf(), "1 door bolt wire"); + }); + }); + + await pair.CleanReturnAsync(); + } + + private static Entity SpawnWithComp(IEntityManager entityManager, string prototype, MapCoordinates coords) + where T : IComponent, new() + { + var ent = entityManager.Spawn(prototype, coords); + var comp = entityManager.EnsureComponent(ent); + return new Entity(ent, comp); + } +} diff --git a/Content.Server/Wires/WireLayout.cs b/Content.Server/Wires/WireLayout.cs index ecafba013e0..621992c915a 100644 --- a/Content.Server/Wires/WireLayout.cs +++ b/Content.Server/Wires/WireLayout.cs @@ -28,11 +28,13 @@ public sealed partial class WireLayoutPrototype : IPrototype, IInheritingPrototy /// initialization) ///
[DataField("dummyWires")] + [NeverPushInheritance] public int DummyWires { get; private set; } = default!; /// /// All the valid IWireActions currently in this layout. /// [DataField("wires")] + [NeverPushInheritance] public List? Wires { get; private set; } } From b61bdcac4f793fc72e6c87fb4fc9d0812f5b9675 Mon Sep 17 00:00:00 2001 From: SimpleStation14 <130339894+SimpleStation14@users.noreply.github.com> Date: Wed, 29 May 2024 00:30:46 -0400 Subject: [PATCH 046/155] Mirror: Per-department wire layouts (#285) ## Mirror of PR #26247: [Per-department wire layouts](https://github.com/space-wizards/space-station-14/pull/26247) from space-wizards [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `670a9826fec9627ffdbee69742a881dab3606fa1` PR opened by Killerqu00 at 2024-03-18 21:09:54 UTC --- PR changed 2 files with 208 additions and 0 deletions. The PR had the following labels: - Status: Needs Review ---

Original Body

> > > > ## About the PR > Wire layouts for airlocks are now only same inside a single department. Wire layouts for different department airlocks are different. > ~~Also, airlocks now generally have more wires.~~ > > ## Why / Balance > > See Discord discussions and feedback regarding MRP hacking clarifications: > https://ptb.discord.com/channels/310555209753690112/1217557314328854628/1217779616828231691 > > ## Technical details > > Made some WiresSystem.cs changes, fixing code that broke inheritance. > > ## Media > > ![image](https://github.com/space-wizards/space-station-14/assets/47712032/476f5ff2-725b-481b-9805-421078905590) > ![image](https://github.com/space-wizards/space-station-14/assets/47712032/0ba49109-86f8-4bcf-8e59-d87b2989fc12) > > > - [X] I have added screenshots/videos to this PR showcasing its changes ingame, **or** this PR does not require an ingame showcase > > ## Breaking changes > > > **Changelog** > > > :cl: > - tweak: Airlock wires are now different between departments. >
--------- Co-authored-by: SimpleStation14 Co-authored-by: VMSolidus --- .../Structures/Doors/Airlocks/access.yml | 189 +++++++++++++++++- Resources/Prototypes/Wires/layouts.yml | 20 ++ 2 files changed, 208 insertions(+), 1 deletion(-) diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml index 51f121c64ff..d07a73b022e 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml @@ -6,6 +6,8 @@ components: - type: AccessReader access: [["Service"]] + - type: Wires + layoutId: AirlockService - type: entity parent: Airlock @@ -14,6 +16,8 @@ components: - type: AccessReader access: [["Lawyer"]] + - type: Wires + layoutId: AirlockService - type: entity parent: Airlock @@ -22,6 +26,8 @@ components: - type: AccessReader access: [["Theatre"]] + - type: Wires + layoutId: AirlockService - type: entity parent: AirlockScience # DeltaV - Chapel is in Epistemics @@ -30,6 +36,8 @@ components: - type: AccessReader access: [["Chapel"]] + - type: Wires + layoutId: AirlockService - type: entity parent: Airlock @@ -38,6 +46,8 @@ components: - type: AccessReader access: [["Janitor"]] + - type: Wires + layoutId: AirlockService - type: entity parent: Airlock @@ -46,6 +56,8 @@ components: - type: AccessReader access: [["Kitchen"]] + - type: Wires + layoutId: AirlockService - type: entity parent: Airlock @@ -54,6 +66,8 @@ components: - type: AccessReader access: [["Bar"]] + - type: Wires + layoutId: AirlockService - type: entity parent: Airlock @@ -62,6 +76,8 @@ components: - type: AccessReader access: [["Hydroponics"]] + - type: Wires + layoutId: AirlockService - type: entity parent: Airlock @@ -70,6 +86,8 @@ components: - type: AccessReader access: [["Captain"]] + - type: Wires + layoutId: AirlockCommand - type: entity parent: AirlockExternal @@ -86,6 +104,8 @@ components: - type: AccessReader access: [["Cargo"]] + - type: Wires + layoutId: AirlockCargo - type: entity parent: AirlockExternal @@ -94,6 +114,8 @@ components: - type: AccessReader access: [["Engineering"]] + - type: Wires + layoutId: AirlockEngineering - type: entity parent: AirlockExternal @@ -102,6 +124,8 @@ components: - type: AccessReader access: [["Atmospherics"]] + - type: Wires + layoutId: AirlockEngineering - type: entity parent: AirlockExternal @@ -126,6 +150,8 @@ components: - type: AccessReader access: [["Kitchen"]] + - type: Wires + layoutId: AirlockService - type: entity parent: AirlockFreezer @@ -134,6 +160,8 @@ components: - type: AccessReader access: [["Kitchen"], ["Hydroponics"]] + - type: Wires + layoutId: AirlockService - type: entity parent: AirlockFreezer @@ -142,6 +170,8 @@ components: - type: AccessReader access: [["Hydroponics"]] + - type: Wires + layoutId: AirlockService - type: entity parent: AirlockEngineering @@ -150,6 +180,8 @@ components: - type: AccessReader access: [["Engineering"]] + - type: Wires + layoutId: AirlockEngineering - type: entity parent: AirlockAtmospherics @@ -158,6 +190,8 @@ components: - type: AccessReader access: [["Atmospherics"]] + - type: Wires + layoutId: AirlockEngineering - type: entity parent: AirlockCargo @@ -166,6 +200,8 @@ components: - type: AccessReader access: [["Cargo"]] + - type: Wires + layoutId: AirlockCargo - type: entity parent: AirlockCargo @@ -174,6 +210,8 @@ components: - type: AccessReader access: [["Salvage"]] + - type: Wires + layoutId: AirlockCargo - type: entity parent: AirlockMining @@ -182,6 +220,8 @@ components: - type: AccessReader access: [["Salvage"]] + - type: Wires + layoutId: AirlockService - type: entity parent: AirlockMedical @@ -190,6 +230,8 @@ components: - type: AccessReader access: [["Medical"]] + - type: Wires + layoutId: AirlockMedical - type: entity parent: AirlockMedical @@ -206,6 +248,8 @@ components: - type: AccessReader access: [["Medical"]] + - type: Wires + layoutId: AirlockMedical - type: entity parent: AirlockChemistry @@ -214,6 +258,8 @@ components: - type: AccessReader access: [["Chemistry"]] + - type: Wires + layoutId: AirlockMedical - type: entity parent: AirlockScience @@ -222,6 +268,8 @@ components: - type: AccessReader access: [["Research"]] + - type: Wires + layoutId: AirlockScience - type: entity parent: AirlockScience @@ -230,6 +278,8 @@ components: - type: AccessReader access: [["Research"], ["Medical"]] + - type: Wires + layoutId: AirlockScience - type: entity parent: AirlockCentralCommand @@ -258,6 +308,8 @@ components: - type: AccessReader access: [["Captain"]] + - type: Wires + layoutId: AirlockCommand - type: entity parent: AirlockCommand @@ -266,6 +318,8 @@ components: - type: AccessReader access: [["ChiefMedicalOfficer"]] + - type: Wires + layoutId: AirlockCommand - type: entity parent: AirlockCommand @@ -274,6 +328,8 @@ components: - type: AccessReader access: [["ChiefEngineer"]] + - type: Wires + layoutId: AirlockCommand - type: entity parent: AirlockCommand @@ -282,6 +338,8 @@ components: - type: AccessReader access: [["HeadOfSecurity"]] + - type: Wires + layoutId: AirlockCommand - type: entity parent: AirlockCommand @@ -290,6 +348,8 @@ components: - type: AccessReader access: [["ResearchDirector"]] + - type: Wires + layoutId: AirlockCommand - type: entity parent: AirlockCommand @@ -298,6 +358,8 @@ components: - type: AccessReader access: [["HeadOfPersonnel"]] + - type: Wires + layoutId: AirlockCommand - type: entity parent: AirlockCommand @@ -306,6 +368,8 @@ components: - type: AccessReader access: [["Quartermaster"]] + - type: Wires + layoutId: AirlockCommand - type: entity parent: AirlockSecurity @@ -365,6 +429,8 @@ components: - type: AccessReader access: [["Security", "Command"]] + - type: Wires + layoutId: AirlockSecurity - type: entity parent: AirlockCommand @@ -373,6 +439,8 @@ components: - type: AccessReader access: [["External"]] + - type: Wires + layoutId: AirlockCommand # Glass Airlocks - type: entity @@ -382,6 +450,8 @@ components: - type: AccessReader access: [["Service"]] + - type: Wires + layoutId: AirlockService - type: entity parent: AirlockGlass @@ -390,6 +460,8 @@ components: - type: AccessReader access: [["Lawyer"]] + - type: Wires + layoutId: AirlockService - type: entity parent: AirlockGlass @@ -398,6 +470,8 @@ components: - type: AccessReader access: [["Theatre"]] + - type: Wires + layoutId: AirlockService - type: entity parent: AirlockGlass @@ -406,6 +480,8 @@ components: - type: AccessReader access: [["Bar"]] + - type: Wires + layoutId: AirlockService - type: entity parent: AirlockExternalGlass @@ -422,6 +498,8 @@ components: - type: AccessReader access: [["Cargo"]] + - type: Wires + layoutId: AirlockService - type: entity parent: AirlockExternalGlass @@ -446,6 +524,8 @@ components: - type: AccessReader access: [["Engineering"]] + - type: Wires + layoutId: AirlockEngineering - type: entity parent: AirlockExternalGlass @@ -454,6 +534,8 @@ components: - type: AccessReader access: [["Atmospherics"]] + - type: Wires + layoutId: AirlockEngineering - type: entity parent: AirlockGlass @@ -462,6 +544,8 @@ components: - type: AccessReader access: [["Kitchen"]] + - type: Wires + layoutId: AirlockService - type: entity parent: AirlockGlass @@ -470,6 +554,8 @@ components: - type: AccessReader access: [["Janitor"]] + - type: Wires + layoutId: AirlockService - type: entity parent: AirlockGlass @@ -478,6 +564,8 @@ components: - type: AccessReader access: [["Hydroponics"]] + - type: Wires + layoutId: AirlockService - type: entity parent: AirlockScienceGlass # DeltaV - Chapel is in Epistemics @@ -486,6 +574,8 @@ components: - type: AccessReader access: [["Chapel"]] + - type: Wires + layoutId: AirlockService - type: entity parent: AirlockEngineeringGlass @@ -494,6 +584,8 @@ components: - type: AccessReader access: [["Engineering"]] + - type: Wires + layoutId: AirlockEngineering - type: entity parent: AirlockAtmosphericsGlass @@ -502,6 +594,8 @@ components: - type: AccessReader access: [["Atmospherics"]] + - type: Wires + layoutId: AirlockEngineering - type: entity parent: AirlockCargoGlass @@ -510,6 +604,8 @@ components: - type: AccessReader access: [["Cargo"]] + - type: Wires + layoutId: AirlockCargo - type: entity parent: AirlockCargoGlass @@ -518,6 +614,8 @@ components: - type: AccessReader access: [["Salvage"]] + - type: Wires + layoutId: AirlockCargo - type: entity parent: AirlockMiningGlass @@ -526,6 +624,8 @@ components: - type: AccessReader access: [["Salvage"]] + - type: Wires + layoutId: AirlockCargo - type: entity parent: AirlockChemistryGlass @@ -534,6 +634,8 @@ components: - type: AccessReader access: [["Chemistry"]] + - type: Wires + layoutId: AirlockMedical - type: entity parent: AirlockMedicalGlass @@ -542,6 +644,8 @@ components: - type: AccessReader access: [["Medical"]] + - type: Wires + layoutId: AirlockMedical - type: entity parent: AirlockMedicalGlass @@ -558,6 +662,8 @@ components: - type: AccessReader access: [["Medical"]] + - type: Wires + layoutId: AirlockMedical - type: entity parent: AirlockScienceGlass @@ -566,6 +672,8 @@ components: - type: AccessReader access: [["Research"]] + - type: Wires + layoutId: AirlockScience - type: entity parent: AirlockScienceGlass @@ -574,6 +682,8 @@ components: - type: AccessReader access: [["Research"], ["Medical"]] + - type: Wires + layoutId: AirlockScience - type: entity parent: AirlockCentralCommandGlass @@ -592,6 +702,8 @@ components: - type: AccessReader access: [["Command"]] + - type: Wires + layoutId: AirlockCommand - type: entity parent: AirlockCommandGlass @@ -600,6 +712,8 @@ components: - type: AccessReader access: [["Captain"]] + - type: Wires + layoutId: AirlockCommand - type: entity parent: AirlockCommandGlass @@ -608,6 +722,8 @@ components: - type: AccessReader access: [["ChiefMedicalOfficer"]] + - type: Wires + layoutId: AirlockCommand - type: entity parent: AirlockCommandGlass @@ -616,6 +732,8 @@ components: - type: AccessReader access: [["ChiefEngineer"]] + - type: Wires + layoutId: AirlockCommand - type: entity parent: AirlockCommandGlass @@ -624,6 +742,8 @@ components: - type: AccessReader access: [["HeadOfSecurity"]] + - type: Wires + layoutId: AirlockCommand - type: entity parent: AirlockCommandGlass @@ -632,6 +752,8 @@ components: - type: AccessReader access: [["ResearchDirector"]] + - type: Wires + layoutId: AirlockCommand - type: entity parent: AirlockCommandGlass @@ -640,6 +762,8 @@ components: - type: AccessReader access: [["HeadOfPersonnel"]] + - type: Wires + layoutId: AirlockCommand - type: entity parent: AirlockCommandGlass @@ -648,6 +772,8 @@ components: - type: AccessReader access: [["Quartermaster"]] + - type: Wires + layoutId: AirlockCommand - type: entity parent: AirlockSecurityGlass @@ -656,6 +782,8 @@ components: - type: AccessReader access: [["Security"]] + - type: Wires + layoutId: AirlockCommand - type: entity parent: AirlockSecurityGlass @@ -664,8 +792,9 @@ components: - type: AccessReader access: [["Detective"]] + - type: Wires + layoutId: AirlockCommand -#Delta V: Removed Brig Access #- type: entity # parent: AirlockSecurityGlass # id: AirlockBrigGlassLocked @@ -673,6 +802,8 @@ # components: # - type: AccessReader # access: [["Brig"]] +# - type: Wires +# layoutId: AirlockCommand - type: entity parent: AirlockSecurityGlass @@ -681,6 +812,8 @@ components: - type: AccessReader access: [["Security"], ["Lawyer"]] + - type: Wires + layoutId: AirlockSecurity - type: entity parent: AirlockSecurityGlass @@ -689,6 +822,8 @@ components: - type: AccessReader access: [["Armory"]] + - type: Wires + layoutId: AirlockSecurity - type: entity parent: AirlockCommandGlassLocked @@ -738,6 +873,8 @@ components: - type: AccessReader access: [["Salvage"]] + - type: Wires + layoutId: AirlockCargo - type: entity parent: AirlockMaint @@ -746,6 +883,8 @@ components: - type: AccessReader access: [["Cargo"]] + - type: Wires + layoutId: AirlockCargo - type: entity parent: AirlockMaint @@ -754,6 +893,8 @@ components: - type: AccessReader access: [["Command"]] + - type: Wires + layoutId: AirlockCommand - type: entity parent: AirlockMaint @@ -770,6 +911,8 @@ components: - type: AccessReader access: [["Engineering"]] + - type: Wires + layoutId: AirlockEngineering - type: entity parent: AirlockMaint @@ -778,6 +921,8 @@ components: - type: AccessReader access: [["Atmospherics"]] + - type: Wires + layoutId: AirlockEngineering - type: entity parent: AirlockMaint @@ -786,6 +931,8 @@ components: - type: AccessReader access: [["Bar"]] + - type: Wires + layoutId: AirlockService - type: entity parent: AirlockMaint @@ -794,6 +941,8 @@ components: - type: AccessReader access: [["Chapel"]] + - type: Wires + layoutId: AirlockService - type: entity parent: AirlockMaint @@ -802,6 +951,8 @@ components: - type: AccessReader access: [["Hydroponics"]] + - type: Wires + layoutId: AirlockService - type: entity parent: AirlockMaint @@ -810,6 +961,8 @@ components: - type: AccessReader access: [["Janitor"]] + - type: Wires + layoutId: AirlockService - type: entity parent: AirlockMaint @@ -818,6 +971,8 @@ components: - type: AccessReader access: [["Lawyer"]] + - type: Wires + layoutId: AirlockService - type: entity parent: AirlockMaint @@ -826,6 +981,8 @@ components: - type: AccessReader access: [["Service"]] + - type: Wires + layoutId: AirlockService - type: entity parent: AirlockMaint @@ -834,6 +991,8 @@ components: - type: AccessReader access: [["Theatre"]] + - type: Wires + layoutId: AirlockService - type: entity parent: AirlockMaint @@ -842,6 +1001,8 @@ components: - type: AccessReader access: [["Kitchen"]] + - type: Wires + layoutId: AirlockService - type: entity parent: AirlockMaint @@ -858,6 +1019,8 @@ components: - type: AccessReader access: [["Medical"]] + - type: Wires + layoutId: AirlockMedical - type: entity parent: AirlockMaint @@ -866,6 +1029,8 @@ components: - type: AccessReader access: [["Chemistry"]] + - type: Wires + layoutId: AirlockMedical - type: entity parent: AirlockMaint @@ -874,6 +1039,8 @@ components: - type: AccessReader access: [["Research"]] + - type: Wires + layoutId: AirlockScience - type: entity parent: AirlockMaint @@ -882,6 +1049,8 @@ components: - type: AccessReader access: [["Research"], ["Medical"]] + - type: Wires + layoutId: AirlockScience - type: entity parent: AirlockMaint @@ -890,6 +1059,8 @@ components: - type: AccessReader access: [["Security"]] + - type: Wires + layoutId: AirlockSecurity - type: entity parent: AirlockMaint @@ -898,6 +1069,8 @@ components: - type: AccessReader access: [["Detective"]] + - type: Wires + layoutId: AirlockSecurity - type: entity parent: AirlockMaint @@ -906,6 +1079,8 @@ components: - type: AccessReader access: [["HeadOfPersonnel"]] + - type: Wires + layoutId: AirlockCommand - type: entity parent: AirlockMaint @@ -914,6 +1089,8 @@ components: - type: AccessReader access: [["Captain"]] + - type: Wires + layoutId: AirlockCommand - type: entity parent: AirlockMaint @@ -922,6 +1099,8 @@ components: - type: AccessReader access: [["ChiefEngineer"]] + - type: Wires + layoutId: AirlockCommand - type: entity parent: AirlockMaint @@ -930,6 +1109,8 @@ components: - type: AccessReader access: [["ChiefMedicalOfficer"]] + - type: Wires + layoutId: AirlockCommand - type: entity parent: AirlockMaint @@ -938,6 +1119,8 @@ components: - type: AccessReader access: [["HeadOfSecurity"]] + - type: Wires + layoutId: AirlockCommand - type: entity parent: AirlockMaint @@ -946,6 +1129,8 @@ components: - type: AccessReader access: [["ResearchDirector"]] + - type: Wires + layoutId: AirlockCommand - type: entity parent: AirlockMaint @@ -954,6 +1139,8 @@ components: - type: AccessReader access: [["Armory"]] + - type: Wires + layoutId: AirlockSecurity - type: entity parent: AirlockSyndicate diff --git a/Resources/Prototypes/Wires/layouts.yml b/Resources/Prototypes/Wires/layouts.yml index 338bf188ba0..b30e68545df 100644 --- a/Resources/Prototypes/Wires/layouts.yml +++ b/Resources/Prototypes/Wires/layouts.yml @@ -15,6 +15,26 @@ - type: wireLayout parent: Airlock + id: AirlockService + +- type: wireLayout + parent: Airlock + id: AirlockCargo + +- type: wireLayout + parent: Airlock + id: AirlockEngineering + +- type: wireLayout + parent: Airlock + id: AirlockMedical + +- type: wireLayout + parent: Airlock + id: AirlockScience + +- type: wireLayout + parent: HighSec id: AirlockCommand - type: wireLayout From 23c0e985d436deeb367406fd08d4a1fdf379cc7c Mon Sep 17 00:00:00 2001 From: SimpleStation14 <130339894+SimpleStation14@users.noreply.github.com> Date: Wed, 29 May 2024 05:14:43 -0400 Subject: [PATCH 047/155] Mirror: Run `fixgridatmos` for cargo & emergency shuttle (#361) ## Mirror of PR #26382: [Run `fixgridatmos` for cargo & emergency shuttle](https://github.com/space-wizards/space-station-14/pull/26382) from space-wizards [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `ec761114eacdeed6e68f9c94dddfdbec8a6e26be` PR opened by ElectroJr at 2024-03-24 07:27:14 UTC --- PR changed 6 files with 60 additions and 575 deletions. The PR had the following labels: - Status: Needs Review ---

Original Body

> This PR also changes fixgridatmos so that it trimms empty/invalid tiles. > > :cl: > - fix: Fixed the cargo & emergency shuttle not being airtight. >
Signed-off-by: VMSolidus Co-authored-by: SimpleStation14 Co-authored-by: VMSolidus --- .../Atmos/Overlays/AtmosDebugOverlay.cs | 2 + .../EntitySystems/AtmosDebugOverlaySystem.cs | 3 +- .../AtmosphereSystem.Commands.cs | 6 + .../SharedAtmosDebugOverlaySystem.cs | 3 +- Resources/Maps/Shuttles/cargo.yml | 230 ++--------- Resources/Maps/Shuttles/emergency.yml | 391 ++---------------- 6 files changed, 60 insertions(+), 575 deletions(-) diff --git a/Content.Client/Atmos/Overlays/AtmosDebugOverlay.cs b/Content.Client/Atmos/Overlays/AtmosDebugOverlay.cs index fcf3b04e530..6dfbc326ecb 100644 --- a/Content.Client/Atmos/Overlays/AtmosDebugOverlay.cs +++ b/Content.Client/Atmos/Overlays/AtmosDebugOverlay.cs @@ -256,6 +256,8 @@ private void DrawTooltip(DrawingHandleScreen handle, Vector2 pos, AtmosDebugOver handle.DrawString(_font, pos, $"Map: {data.MapAtmosphere}"); pos += offset; handle.DrawString(_font, pos, $"NoGrid: {data.NoGrid}"); + pos += offset; + handle.DrawString(_font, pos, $"Immutable: {data.Immutable}"); } private void GetGrids(MapId mapId, Box2Rotated box) diff --git a/Content.Server/Atmos/EntitySystems/AtmosDebugOverlaySystem.cs b/Content.Server/Atmos/EntitySystems/AtmosDebugOverlaySystem.cs index c0284f26c90..505c4a3b385 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosDebugOverlaySystem.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosDebugOverlaySystem.cs @@ -109,7 +109,8 @@ private void OnPlayerStatusChanged(object? sender, SessionStatusEventArgs e) tile.ExcitedGroup?.GetHashCode(), tile.Space, tile.MapAtmosphere, - tile.NoGridTile); + tile.NoGridTile, + tile.Air?.Immutable ?? false); } public override void Update(float frameTime) diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Commands.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Commands.cs index 6fbd638844b..1c18b8fe29c 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Commands.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Commands.cs @@ -92,6 +92,12 @@ private void FixGridAtmosCommand(IConsoleShell shell, string argstr, string[] ar if (tile == null) continue; + if (!_mapSystem.TryGetTile(gridComp, indices, out var gTile) || gTile.IsEmpty) + { + gridAtmosphere.Tiles.Remove(indices); + continue; + } + if (tile.Immutable && !IsTileSpace(euid, transform.MapUid, indices, gridComp)) { tile = new GasMixture(tile.Volume) { Temperature = tile.Temperature }; diff --git a/Content.Shared/Atmos/EntitySystems/SharedAtmosDebugOverlaySystem.cs b/Content.Shared/Atmos/EntitySystems/SharedAtmosDebugOverlaySystem.cs index 136c1955025..979bbf77ba6 100644 --- a/Content.Shared/Atmos/EntitySystems/SharedAtmosDebugOverlaySystem.cs +++ b/Content.Shared/Atmos/EntitySystems/SharedAtmosDebugOverlaySystem.cs @@ -20,7 +20,8 @@ public readonly record struct AtmosDebugOverlayData( int? InExcitedGroup, bool IsSpace, bool MapAtmosphere, - bool NoGrid); + bool NoGrid, + bool Immutable); /// /// Invalid tiles for the gas overlay. diff --git a/Resources/Maps/Shuttles/cargo.yml b/Resources/Maps/Shuttles/cargo.yml index 3b9953d94cf..8a3007dd9c4 100644 --- a/Resources/Maps/Shuttles/cargo.yml +++ b/Resources/Maps/Shuttles/cargo.yml @@ -3,11 +3,11 @@ meta: postmapinit: false tilemap: 0: Space - 81: FloorShuttleBlue - 85: FloorShuttleWhite - 89: FloorSteel - 104: FloorTechMaint - 121: Plating + 84: FloorShuttleBlue + 89: FloorShuttleWhite + 93: FloorSteel + 108: FloorTechMaint + 126: Plating entities: - proto: "" entities: @@ -22,19 +22,19 @@ entities: chunks: -1,0: ind: -1,0 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAVQAAAAAAUQAAAAAAVQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAUQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAWQAAAAAAVAAAAAAAWQAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAVAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 0,0: ind: 0,0 - tiles: WQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: XQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 -1,-1: ind: -1,-1 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAbAAAAAAAfgAAAAAAbAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAXQAAAAAA version: 6 0,-1: ind: 0,-1 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 - type: Broadphase - type: Physics @@ -107,98 +107,34 @@ entities: data: tiles: -2,-1: - 0: 34816 - 1: 17612 - -1,-3: - 0: 480 - 1: 65024 + 0: 52428 -1,-1: - 0: 17 - 1: 65518 + 0: 65535 -1,-2: - 1: 65535 + 0: 61440 -2,1: - 0: 34944 - 1: 17484 + 0: 52428 -1,0: - 1: 65535 + 0: 65535 -1,1: - 0: 4096 - 1: 59647 - 2: 512 - 3: 1024 - 4: 256 + 0: 65535 -1,2: - 5: 1 - 6: 16 - 7: 4 - 8: 64 - 1: 61066 - 9: 32 - -1,3: - 0: 546 - 1: 52428 - 0,-3: - 0: 240 - 1: 65280 - 0,-2: - 1: 65535 + 0: 255 0,-1: - 1: 65535 - 1,-3: - 0: 528 - 1: 12544 - 1,-2: - 1: 13107 - 1,-1: - 0: 17442 - 1: 4369 + 0: 4369 0,1: - 1: 65535 + 0: 4369 0,2: - 1: 65535 - 0,3: - 1: 65535 + 0: 1 0,0: - 1: 65535 - 1,3: - 0: 273 - 1,0: - 1: 30583 - 1,1: - 0: 25664 - 1: 4375 - 1,2: - 0: 34 - 1: 4369 - 0,4: - 0: 120 - 1: 7 - -1,4: - 0: 132 - 1: 8 + 0: 4369 -2,0: - 1: 52428 + 0: 52428 -2,2: - 1: 140 + 0: 140 -2,-2: - 1: 32768 + 0: 32768 uniqueMixes: - - volume: 2500 - immutable: True - moles: - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - volume: 2500 temperature: 293.15 moles: @@ -214,126 +150,6 @@ entities: - 0 - 0 - 0 - - volume: 2500 - temperature: 268.94583 - moles: - - 20.00614 - - 75.26119 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - volume: 2500 - temperature: 285.08194 - moles: - - 21.218632 - - 79.82248 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - volume: 2500 - temperature: 196.33333 - moles: - - 14.549919 - - 54.735413 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - volume: 2500 - temperature: 147.92499 - moles: - - 10.912439 - - 41.05156 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - volume: 2500 - temperature: 184.23123 - moles: - - 13.64055 - - 51.31445 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - volume: 2500 - temperature: 291.44815 - moles: - - 21.696999 - - 81.62205 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - volume: 2500 - temperature: 286.34256 - moles: - - 21.313358 - - 80.178825 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - volume: 2500 - temperature: 265.9203 - moles: - - 19.778797 - - 74.40595 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 chunkSize: 4 - type: OccluderTree - type: Shuttle diff --git a/Resources/Maps/Shuttles/emergency.yml b/Resources/Maps/Shuttles/emergency.yml index eeb7048141d..20cd9230554 100644 --- a/Resources/Maps/Shuttles/emergency.yml +++ b/Resources/Maps/Shuttles/emergency.yml @@ -3,13 +3,13 @@ meta: postmapinit: false tilemap: 0: Space - 29: FloorDark - 77: FloorReinforced - 89: FloorSteel - 104: FloorTechMaint - 108: FloorWhite - 120: Lattice - 121: Plating + 31: FloorDark + 79: FloorReinforced + 93: FloorSteel + 108: FloorTechMaint + 112: FloorWhite + 125: Lattice + 126: Plating entities: - proto: "" entities: @@ -24,19 +24,19 @@ entities: chunks: -1,0: ind: -1,0 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAHQAAAAAAHQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAWQAAAAAAHQAAAAAAWQAAAAAAWQAAAAAAHQAAAAAAWQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAWQAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAWQAAAAAAHQAAAAAAWQAAAAAAWQAAAAAAHQAAAAAAWQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAHQAAAAAAHQAAAAAAeQAAAAAAeQAAAAAAbAAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAHQAAAAAAWQAAAAAAeQAAAAAAbAAAAAAAbAAAAAAAbAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAHQAAAAAAWQAAAAAAeQAAAAAAbAAAAAAAbAAAAAAAbAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAHQAAAAAAWQAAAAAAeQAAAAAAbAAAAAAAbAAAAAAAbAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAHQAAAAAAWQAAAAAAeQAAAAAAeQAAAAAAbAAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAWQAAAAAAWQAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAWQAAAAAAWQAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAHwAAAAAAHwAAAAAAfgAAAAAAfgAAAAAAbAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAXQAAAAAAHwAAAAAAXQAAAAAAXQAAAAAAHwAAAAAAXQAAAAAAXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAXQAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAXQAAAAAAHwAAAAAAXQAAAAAAXQAAAAAAHwAAAAAAXQAAAAAAXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAHwAAAAAAHwAAAAAAfgAAAAAAfgAAAAAAcAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXQAAAAAAHwAAAAAAXQAAAAAAfgAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAHwAAAAAAXQAAAAAAfgAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXQAAAAAAHwAAAAAAXQAAAAAAfgAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAHwAAAAAAXQAAAAAAfgAAAAAAfgAAAAAAcAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAXQAAAAAAXQAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAXQAAAAAAXQAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 -1,-1: ind: -1,-1 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAHQAAAAAAWQAAAAAAeQAAAAAAaAAAAAAAaAAAAAAATQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAHQAAAAAAWQAAAAAAeQAAAAAAaAAAAAAAaAAAAAAATQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAHQAAAAAAWQAAAAAAeQAAAAAAaAAAAAAAaAAAAAAAeQAAAAAAeQAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXQAAAAAAHwAAAAAAXQAAAAAAfgAAAAAAbAAAAAAAbAAAAAAATwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAHwAAAAAAXQAAAAAAfgAAAAAAbAAAAAAAbAAAAAAATwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXQAAAAAAHwAAAAAAXQAAAAAAfgAAAAAAbAAAAAAAbAAAAAAAfgAAAAAAfgAAAAAA version: 6 0,-1: ind: 0,-1 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAHQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAHQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAHQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXQAAAAAAHwAAAAAAXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXQAAAAAAHwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXQAAAAAAHwAAAAAAXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 0,0: ind: 0,0 - tiles: HQAAAAAAHQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAAAWQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAAAWQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAAAWQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAAAHQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAHQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAHQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAHQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAHQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAAAHQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: HwAAAAAAHwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAXQAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAXQAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAXQAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAHwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXQAAAAAAHwAAAAAAXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXQAAAAAAHwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXQAAAAAAHwAAAAAAXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXQAAAAAAHwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAHwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXQAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXQAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 - type: Broadphase - type: Physics @@ -135,97 +135,41 @@ entities: data: tiles: -2,-1: - 0: 32703 - 1: 32768 - 2: 64 - -1,-3: - 1: 480 - 0: 65024 + 0: 65535 -1,-1: - 0: 61439 - 2: 4096 - -1,-2: 0: 65535 + -1,-2: + 0: 65280 -2,1: 0: 65535 -1,0: 0: 65535 -1,1: - 2: 4096 - 0: 61439 + 0: 65535 -1,2: 0: 65535 -1,3: - 1: 34 - 3: 512 - 0: 49373 - 4: 2048 - 5: 1024 - 6: 256 - 0,-3: - 1: 240 - 0: 65280 + 0: 4095 0,-2: - 0: 65535 + 0: 29440 0,-1: - 0: 65519 - 2: 16 - 1,-3: - 1: 528 - 0: 12544 - 1,-2: - 0: 13107 - 1,-1: - 1: 17442 - 0: 4369 + 0: 30583 0,1: - 0: 65535 + 0: 30583 0,2: - 2: 1 - 0: 65502 - 7: 32 + 0: 30583 0,3: - 0: 65229 - 8: 16 - 9: 256 - 10: 2 - 11: 32 + 0: 311 0,0: - 0: 65535 - 1,3: - 1: 273 - 1,0: 0: 30583 - 1,1: - 1: 25664 - 0: 4375 - 1,2: - 1: 34 - 0: 4369 - 0,4: - 1: 120 - 0: 7 - -1,4: - 1: 132 - 0: 8 -2,0: - 0: 61167 - 12: 16 - 13: 256 - 14: 4096 + 0: 65535 -2,2: - 0: 65499 - 7: 32 - 2: 4 + 0: 65535 -2,3: - 0: 143 - 15: 32 - 16: 64 - 17: 1024 - 18: 2048 + 0: 3311 -2,-2: - 0: 64256 - 19: 1024 + 0: 65024 uniqueMixes: - volume: 2500 temperature: 293.15 @@ -242,291 +186,6 @@ entities: - 0 - 0 - 0 - - volume: 2500 - immutable: True - moles: - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - volume: 2500 - temperature: 293.15 - moles: - - 20.04244 - - 75.39776 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - volume: 2500 - temperature: 122.82263 - moles: - - 9.026207 - - 33.955734 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - volume: 2500 - temperature: 282.50452 - moles: - - 21.024963 - - 79.0939 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - volume: 2500 - temperature: 250.56815 - moles: - - 18.625212 - - 70.06627 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - volume: 2500 - temperature: 192.74052 - moles: - - 14.27995 - - 53.719814 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - volume: 2500 - temperature: 293.15 - moles: - - 21.213781 - - 79.80423 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - volume: 2500 - temperature: 292.48465 - moles: - - 21.774883 - - 81.91504 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - volume: 2500 - temperature: 290.48862 - moles: - - 21.6249 - - 81.350815 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - volume: 2500 - temperature: 293.10843 - moles: - - 21.821754 - - 82.09136 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - volume: 2500 - temperature: 292.98364 - moles: - - 21.812382 - - 82.0561 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - volume: 2500 - temperature: 220.53749 - moles: - - 16.36866 - - 61.57734 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - volume: 2500 - temperature: 202.38438 - moles: - - 15.004604 - - 56.445892 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - volume: 2500 - temperature: 197.84608 - moles: - - 14.66359 - - 55.163033 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - volume: 2500 - temperature: 147.925 - moles: - - 10.912439 - - 41.05156 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - volume: 2500 - temperature: 256.84375 - moles: - - 19.09677 - - 71.840225 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - volume: 2500 - temperature: 138.84843 - moles: - - 10.230412 - - 38.485836 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - volume: 2500 - temperature: 181.96211 - moles: - - 13.470042 - - 50.67302 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - volume: 2500 - temperature: 220.5375 - moles: - - 16.36866 - - 61.57734 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 chunkSize: 4 - type: OccluderTree - type: Shuttle From d684fb6dcb2c7f33f0e2e06b7bef4f08439b0e6f Mon Sep 17 00:00:00 2001 From: FoxxoTrystan <45297731+FoxxoTrystan@users.noreply.github.com> Date: Fri, 31 May 2024 02:13:45 +0200 Subject: [PATCH 048/155] Glorious Canisters (#406) # Description Changed the Canisters Sprites to a better updated one, no more ugly 2D Flat Canisters! Also update the TG Sprite from Tank Canisters now shiny! ---

Media

![image](https://github.com/Simple-Station/Einstein-Engines/assets/45297731/559aaa68-d430-412b-a44d-7236f4874832) ![image](https://github.com/Simple-Station/Einstein-Engines/assets/45297731/2e7732ce-d8d5-48c8-988e-ada0d9bb7048)

--- # Changelog :cl: - tweak: Resprited gas canisters - tweak: Resprited gas tanks --------- Co-authored-by: VMSolidus --- .../Objects/Tanks/anesthetic.rsi/icon.png | Bin 632 -> 942 bytes .../Objects/Tanks/emergency.rsi/icon.png | Bin 459 -> 678 bytes .../Objects/Tanks/emergency_double.rsi/icon.png | Bin 664 -> 887 bytes .../Tanks/emergency_double_red.rsi/icon.png | Bin 648 -> 930 bytes .../Tanks/emergency_extended.rsi/icon.png | Bin 463 -> 693 bytes .../Tanks/emergency_extended_red.rsi/icon.png | Bin 482 -> 852 bytes .../Objects/Tanks/emergency_red.rsi/icon.png | Bin 473 -> 609 bytes .../Objects/Tanks/emergency_yellow.rsi/icon.png | Bin 463 -> 722 bytes .../Textures/Objects/Tanks/generic.rsi/icon.png | Bin 623 -> 844 bytes .../Textures/Objects/Tanks/oxygen.rsi/icon.png | Bin 651 -> 851 bytes .../Textures/Objects/Tanks/plasma.rsi/icon.png | Bin 482 -> 513 bytes .../Textures/Objects/Tanks/red.rsi/icon.png | Bin 619 -> 853 bytes .../Structures/Storage/canister.rsi/black-1.png | Bin 705 -> 329 bytes .../Structures/Storage/canister.rsi/black.png | Bin 497 -> 340 bytes .../Structures/Storage/canister.rsi/blue-1.png | Bin 819 -> 377 bytes .../Structures/Storage/canister.rsi/blue.png | Bin 541 -> 394 bytes .../Storage/canister.rsi/can-connector.png | Bin 306 -> 269 bytes .../Structures/Storage/canister.rsi/can-o0.png | Bin 103 -> 206 bytes .../Structures/Storage/canister.rsi/can-o1.png | Bin 96 -> 114 bytes .../Structures/Storage/canister.rsi/can-o2.png | Bin 99 -> 112 bytes .../Structures/Storage/canister.rsi/can-o3.png | Bin 99 -> 114 bytes .../Structures/Storage/canister.rsi/can-oa1.png | Bin 186 -> 144 bytes .../Storage/canister.rsi/can-open.png | Bin 127 -> 143 bytes .../Storage/canister.rsi/darkblue-1.png | Bin 753 -> 377 bytes .../Storage/canister.rsi/darkblue.png | Bin 478 -> 491 bytes .../Storage/canister.rsi/frezon-1.png | Bin 481 -> 377 bytes .../Structures/Storage/canister.rsi/frezon.png | Bin 453 -> 394 bytes .../Structures/Storage/canister.rsi/grey-1.png | Bin 890 -> 324 bytes .../Structures/Storage/canister.rsi/grey.png | Bin 615 -> 341 bytes .../Structures/Storage/canister.rsi/meta.json | 2 +- .../Storage/canister.rsi/orange-1.png | Bin 781 -> 351 bytes .../Structures/Storage/canister.rsi/orange.png | Bin 478 -> 359 bytes .../Structures/Storage/canister.rsi/red-1.png | Bin 729 -> 352 bytes .../Structures/Storage/canister.rsi/red.png | Bin 515 -> 358 bytes .../Structures/Storage/canister.rsi/redws-1.png | Bin 834 -> 378 bytes .../Structures/Storage/canister.rsi/redws.png | Bin 607 -> 403 bytes .../Storage/canister.rsi/water_vapor-1.png | Bin 705 -> 329 bytes .../Storage/canister.rsi/water_vapor.png | Bin 612 -> 483 bytes .../Storage/canister.rsi/yellow-1.png | Bin 707 -> 367 bytes .../Structures/Storage/canister.rsi/yellow.png | Bin 606 -> 386 bytes 40 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Textures/Objects/Tanks/anesthetic.rsi/icon.png b/Resources/Textures/Objects/Tanks/anesthetic.rsi/icon.png index 027abc289fe525f233da102411a255b12d97e14e..3ef540f37f7d4def3bd557b9bea0eec9d9b863b8 100644 GIT binary patch delta 921 zcmV;K17`gA1g-~=BYyw^b5ch_0Itp)=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi z!~g&e!~vBn4jTXf14BtfK~z{r?Uh?dlVKRg|I^jhELYPGD_7ID>EKD{|cFGI#0jgWmuAeX?|M63Ij~HP%BSnG`X^s00|6S6?}c^mI9U^3|mq*_zdAi5emy3eBgbX|reZ zVsQ$ek)h%#On=3${p@xs7lsiEW!yZsM& zZb1&4M5)8#=dIZT69&`;>fYXNcImg`TKXD*}B*5hDN8t`7;+IK0Oh03k=Fq zzH3i07B5@?!9)>S8ceYE_QL$-8+&T6Cm`3VV7OczRZhfIfhT1}yj%p0Z8s1970ybZlu}j@!^yS-Re|Wzd2aRIfosY za}_Yw+!?W)7||vq`82T*c{}&Q>G8r9=(&E09ZAQ{Ozv`WP|T5|)_6B2IT5u2)N?Ak zZ0k;Z{oap(8<&wHOhVf;8DtZj@V$~iSR}>$dw-8(mJ<;J(2>fQwu z-+v)xrV@Qt8zxUlh0o_>hfKeUhodPO>Dmu4z0}}@<5EI$BJ5j09~Ii+t*_hB+0o7B ze*XZZ2Xts{RNn00000NkvXXu0mjfEB&&q delta 608 zcmV-m0-yb^2lxb#BYy%vNkl3^j$3VfRFn0AKR0>MQLO@GUtT4zZ zUQ9#l5DQ~B$J{{}3<^DY9V2Xq4R;cUksf63B&@Vh7!$e*g|+h_$XJ}L$#zus@6?dm zHfhr6sqZoQljr%~{2>AQ>F0_f@Ej3%jySEOuL^4Db%e(!;D03Hn}EP`B(a!;q1Pes z90@Q%6!SSSw{F`?_#z2S7mg@(4g(nu1*pgMmE$~vQWUdJ?LF7Mw zp#Y#~e!!Oc(X9P4+}cK`v>0^@e{m;-S6@#M$)wHWR=6ZdScu&> zr}s@DH8VvNW)Kzn1^{4Rzd$6D_5^n=(3re>{Ilt}@_*aF-G!uUIN)Lrbb{~e7Z{_5 zaG-92Wm#8npvwkgqDbCsY~Wqu0ak`dQ~iys3=`b@p}T?uT{O^u*J?FHGHJa0Lm~X{ zya^s<20Xz5hX$;0Yu-Lz!x%ke!dFjzd4k&tbb>c_`+>R%g&Fibc_VEfffF16*57A) zhIbTb2U+y`o;$_yTVMqP@bs$LrELSddwbNwR0@(LwZNY}ec~J3F)>jjnx+v=(@3FE u=;|laZ5$_wi6YU@P66QhChw=8>&$=79vnEQBv~N<0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi z!~g&e!~vBn4jTXf0y{}WK~z{r?UYYQ6j2< zAUXtIq=To5q9E{Q2kTID5TT$z`sW5gU80C0Fd?Y*&qlWGnt!-i+BTLpv%Bu@O!Ir} zNI@}gcRkJr9`6nF=6$~J_htq*Ha0dZNmW&iPAzxIMM!d8Epy5co>n;9k#a9 zS;pQCS)To;E8ioiFy*VyK4o&}%K+wHzk{Q6Eo$3#Lw^ZPF3Sn3#Q)?(UI84v2sK{} zV9oJIICADBHuxl@rDK@7+YQg2R)jC#L}Yw`yQ&2D_bc=o;&--1zS z>JQZH^y7KgUbfrZbZ)pRV9NK48d7sIo&?jZ>?C*j8xX!aSdg5se8|_)tCt9sa7!Yx zNflZu0e?9(1ud}v_pW9{`yU`O(pQk2u&lu1XpHr8^7Hbnbw7bPdG zk07g}wpC(7dF&%H^E0S!67lJJ0Fkj9Mac=S1vWQ!>UAeNkpB7IsKPvA_a6WCsTBkF pA{4^-%K%z(#pE_NHZ}n88#Ao*mK2#0NdN!<00>D%PDHLkV1m+6 delta 434 zcmV;j0Zsm<1ZYxTxTsW$#plu(=nx7uTNcrw zsNhsb>EfSok`6^dCntptE~0}V(m_xQ(ibQ?h>NH+35tUqKBpEGTap^LoGIjWPPmtV zi;IhkgDA2j6j>5>o@sMZY8pCYlT+A<_)~x)OJZSZ5!297WPeF?`}~||&+zs3S&nEq zK#?U8n^DEnZhVLp7YFqqqw|Pbv3PTt99$0$Ty9mJoC6r|e~p_?%d# zG9KnBo}zz034k}3YC7-Vuza(sC4{!N!Di|4+xgm;w<5P3plS&*Howa8hu2X#SQvq- zCB*w+^k3wb0s!Rcsc%c>l-zPaATV4PJ1Ga7J8*HCcPms57Jo!1hdUlXcwepo9Fx1a cxVQj(0g%16%!>5-C;$Ke07*qoM6N<$f-q3U@&Et; diff --git a/Resources/Textures/Objects/Tanks/emergency_double.rsi/icon.png b/Resources/Textures/Objects/Tanks/emergency_double.rsi/icon.png index 78f1677a2b43a3dd8afcca502b08ca196f3906d7..7a604ad671d17361796f8c44cd457dc55bbccb96 100644 GIT binary patch delta 865 zcmV-n1D^bt1@{J!BYyw^b5ch_0Itp)=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi z!~g&e!~vBn4jTXf0}M$-K~z{r?Ur3glTjGQ|GLd=lMJU$r)jCHX%<_}zD%T~Ez1N+ zi3AfX=pv}Bh#-QDE@}`&f-ow&3Cu9Es2N&jla^nliHWvy=6}W1MZ?cEoqF=TZX)D# z>UP!s@ba8@d(Zj(pXWU9+2D~!|Gm6yaaocWRQ|RhnuVtZ0s;htj!mXMm#japrr>M% z5fOwN#3wXTGrqn&vSa5yVmIP8+2PyL4w1lE5lP6(U`*s3KTD{I@bDP-nXto;oV!4R zWE*MbjEU_jsecTVR={m0XqoMq+u=0Qd%6{~%kLHwRhPx2T6>tu*bb+apzxQcMGTB? z!)z0ddScOCO5wo=qTwgW#gAb#GUNpiuZ>4*ofaP+CBSN#fU%+rnGX!i^A^hp!=NU( zT)%(b3~yU>N_KdNG!HNi!cd?@iE(cuaPo+ekpRM`nO#|!+uk!X8o#HF?Y*PH_sK4|_!Xa%$- zDWo_%hE&~4CSPlBldkXgNk>CE(OivX_PAAZkSOC;JKb;#R)E44=}F9(t0;o5MmH!lUTJo0+sn6QQkAOsIogWK;eRP5%}U`7#h`KSp5{{&_u+` zwm|PKLDQ8&@FuOWjuQC9g+hDd(~|bwp@F>Qpnq#49VQ0eqt+ut9tl#bhJJkA)VE$} z=Wc?zq8!5g(fC~WWyuXU=Op`q@wQlsUUesUTf-pDxd=m}3eR)jqciCYI2@m;YXw>w z>+z|P8UcR+zL|B*&9o1t00000NkvXXu0mjfWD1$K delta 640 zcmV-`0)PGY2ABnqBYy&4NklGnDA=3d9_m~a z^m?6lZ}$iH;c)Kx{{QoR-#G^`F)=v@LIFR80)Eo-?*$_SIe(9fE?aE?fc(y`oH+w*=SsbXKO1w9a%*5?CSI;oEr$pDnwdD00a4&-JLf|-ox#Lp z7|rW1;BMzyAvC;qllq*$BA-~x%USFp`6nJ|1;WBiGF`|w|#70?L4#Lej06>txq^3HtSVbbXiYY#fY&tV=+Pg01 zJT4jwjpOHD85>{T;rsh1ZSzLeTr)tciS?LrE)CZ+Nb8f!FtXcq1>!s|wb2Z_UQJ9) a{&NcY##;FL(&wW90000L#Nq@uu01m_fl`9S#0009wNklAXyxRKss>~(JvAIhC!=-h!KS%N<~3}qG6JV=B-w0IlOFc zDyB^r+NtyTDOQ_vPUz1b_&D$3JLf#ld->k;!3{V5H$2$UC4VRa96%(0vAoY(xe_tmO_9o$zu9v9+nhuF17#7R?&ecSN z^bG0D*APjxjOLsK9#oL*D;yyU0%V^M?MPmUCjEWrSA*}6(JD#{u2eKYJXsj+%GE^rtt~%6hB3aCW#?8 z)KtNX%Ym^!5d5EB(1xi{!aL9IToqy~1zV0lNpU49Funv&a|*L26MD6+h*zv2JU0(Q zu^4GLwYY8&Gi#~H>Ss|XpVvAaVVj`j-zT7lLD{2#u6tuI>>&yj^XC)bphJ zck6lI3OMX&6V$78|2|Asb>nN02l&Hm+;Uz>x<<~F}g-3(bQJAZE^~` zn_p??qPH5oSZdV~FzEciAzVg4xN;h0reK%JDK4LkX#v!#Qm2-b9}$++Q$8;$||0+t|c_ZjN)>;M1&07*qoM6N<$f>}L_)c^nh delta 586 zcmV-Q0=5032Z#lbNq@rt01m?e$8V@)0006VNklJka zg3=TLJvC*pg)mD$et6HIrK<;a2v`9gK(PZrmS<#VgV_QiVqm_!iaNvb!w129LXKdB z(qsXcWgp(WVsLVHVOYO*H3N(fvi#wln{fW&Q)jT+MRo|le18ry{PTuXu;nm5%<@aO z?lOXCd?7(r2*d`s|DUQT#o&GPGKSB6cmx@?e0dMH6y|e~V=Zm%8LnNvgb@-XhXBm- zTMu7=EkpJ>i0>@G0;WNHP+|lDP)LB%1U5jD13;Gd%v=PveD8-p3|IJ=7>;<`F)UxY z3~o6t0CEJjbbmm!17Mav&P;$?4hxBX8Bs7F1VC~y0J0Ry#0iLU0L=1|^f$K>%kIfGpSf1b+!q5Dl{&6cQjB7TlCr4gz@7 zK&HM7JkCKr2Kl_HtsU%$p!f`i!Y8l6>d3Vm1h6^)RBAnV_Lkv$MF-e&SV+Je;o;-U zFmLv3hREnBiYx~KoFM?J%|d*=!E9JafB?u5eeJCbp6)K-{7;GHAb?Xda`Cxl^Hzoh zkugvi2t%OM=P-cR0Axpi3L8oj95z7E5acQs2B>8@2oPlu$PrK`QN`;h7zLw%c)-8_ Y072YB(?5M#LI3~&07*qoM6N<$f*X7LNdN!< diff --git a/Resources/Textures/Objects/Tanks/emergency_extended.rsi/icon.png b/Resources/Textures/Objects/Tanks/emergency_extended.rsi/icon.png index ab8bebedb66473deecf4ae8c20de54aeb8e32b0b..2b73dad0b5be0cae15e34c9ab79116922f58a845 100644 GIT binary patch delta 670 zcmV;P0%85n1GNQ^BYyw^b5ch_0Itp)=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi z!~g&e!~vBn4jTXf0!m3lK~z{r?Uc)F6Hye0f3YAggy0BHOF)Csaw12cAH8!nGo5$E{u5&KQ zP*5_HNfsjW!Ei`s?)}a^=gh#u!s5T9p+RJH6@Kcnt`I9?Z`UDBn$4!sw!MQV!f)zO zaRMZ74YqSJNd>`$H__)1gnC0sRFnY8{kuDG@6L62JYJqeU;hbJ?m{XxXE+H{>`aV! zJ#Ed*>D$75p??r>LHKNd$6`wy4kweOmXb4JssbcegSaBt(E8#ca=A2apW28GT|V4A z?&d9^YA8y^MwKWv6ShJ$Oi`XVb~W1c;55{T%Li)_=n)~0O=Cr2SpC89F8mGWK78l< zQzfV^i;KxWd}URjD32c);&S`o6AbUG!EmHelh^I=s(R z^d4carbbvS+{@@cD)G~6``J*tyR4xrD=QMYyZzYKGk{D=hCF>2$p)7lP6=hH2F`l5tCP9Wy=Xe3ySjK(KDEzieowcQ0qC#-`;qy_FOjA zW8Fn-<$p61ACZ}R1SJ|rM$W??5c$c?%88N-Nluaa?r^V%Je$MP_$-zdeqmF$gz-zS zE0Pl>XJF!ff}eE$@fRraDi$I$TrM5PdcLRIu?QV_{+x{q-0 z-Q7P2L4pMNZ_zbX=$a~Izi;*%>N++(y?w|^coxt#Rg7dtaeo~fT~kFUtZ;I4NVvU2 zO2U(XuBl>RFvZH!5?zrf00V<50E)MHDGARfu(P#ES0sw_RAMTvaFE?6t|tkF6)6c% z0$84n9ujdT_ zsLRYU4Y9a3$J_aE&3I+!vl})?r)PDoDP4q(fP>@-Sf(MCXIgnFUHJ-^60l4|EKC$W zjr#$IAFjYM4UtK_H4Ofv06@ZMtNFeBgoDI8@Y*>IOfS|*_yvbLYQXQEOAAya?jOnk gzQTh93GyfM4%4>HHU-pp-2eap07*qoM6N<$g0{TSWdHyG diff --git a/Resources/Textures/Objects/Tanks/emergency_extended_red.rsi/icon.png b/Resources/Textures/Objects/Tanks/emergency_extended_red.rsi/icon.png index 8ea77e5c6c0726859e53976593c36d3f5aef2054..67d4bb4eb67c07c0fd2dccb25f8f7b27668f3590 100644 GIT binary patch delta 792 zcmV+z1LyqW1JnkPNq@uu01m_fl`9S#0008%Nkl7 zEf|nZ08JM6PmxW2o7&uNH(L_QFgy66Gdy$)4z)pU)FJq5QITFCGcWYb?ET8sHdd0*TsRYPWq{y;p!H-baQOI%K>B&y zva4{YoJWtY0e^!7FIhII9F&Q0J)sCj*$Tm}7rHEkuWw@cSSNaYCY03wg2%s$`6-UA zyS6;WqT9W#piGdNjg3{28!lp_egSNmmmZW zoH#6e)~ta_NM*xVyUo5uQcM{bD7h%)pK_sXNrkufZhv6&(L=ZcXS^I4`9S;2LdCF>Twd4m^L=Pv)G7t$)^(JX6?RfvGDk?ZB>K^E5 z@B9ls+x-MvZm$UUr0gKuXp;peMYWLNckj32W5s3hn(-bV_!*rD&o?;mVb~-KPErP= zqzHcc+xwbby#sCL7K3LOJ1}aljR{VYG!SYyx?Y@?hqZ44e2oEqCy%8-!`saQN-Gy(9!AX+WkbX?4yBB9O#D?2eZlR_5d&1x($xZI4uL~!SPQo^K z0J{o5l!6L5`b`Xv*2Gowy^6RInP_U90GFnM%j=K3;lgR(&B#RXG2!r}lKKw>`~fOv WauEzvIQ(}20000Y5QgX0*r=F`h?QU? zM8ppS5fp-AEd2v&WhIir&i|3(z|KEmVK?%h7KvqJ`h;op&2m~Y^bp)W#?vG^{1bzf+5dWPqC(SL{72|%>5waH?DpzH$ zidrjPTy}KDssIFwndO!|YbSVA^78GSg-Uq!MC1gpp(yOLOvyWeB+wJxh;#*zqwz|o z$29d;r|UsMdw)XEiTlaxxQ1>e|4HZswpW%Kj@?H))WdRh@_fC{aTqxWm4K30M6aA_ z66NHIz#spH90Y1Y$n$e)?Q-Dz6Xdy}q>S3=kOR*OKt3V*Wzl~CD42C}d(HGBX(gl5uOg;br N002ovPDHLkV1nVv$9n(( diff --git a/Resources/Textures/Objects/Tanks/emergency_red.rsi/icon.png b/Resources/Textures/Objects/Tanks/emergency_red.rsi/icon.png index 4fd5f559aca45824e7394d1f5e2c2792d65df4ad..cf68a7c1c7f9e4807f531c343bd8a79e352f12fc 100644 GIT binary patch delta 547 zcmV+;0^I%C1K|XaNq@uu01m_fl`9S#0005@NkljObZ(kVH)b+p)0ZS4AC~^SEa#c+&u*D!txwv>3E}TEcz{SN&v?IuN z0LXF$Q$2>&%jN(ryZ_z)|w!$5%#B zbP!4tj8K{=0JHpA(A4u%>#`YuG(+znZ3Z*77YvtA@G|^i{LS!}@ejk*mx>H+pJ##1 z289GDTHd{TiGS5DqC)^?`4fjOu;pw;yTO)EWqreN{kRYV%YRk|CH+q*mV*E&Byd?y zGT5LP{C{V0z<+a3-~X@9Zu@^T%JDx)3>3ttf~@~n@urcS=!kY1$RbV4cMNKUl?-1# zeq^{eYcj+A)1qKGDZ>{GcH1t1eG3*K0T2}h_$(LJeSgZZVYfC}mV*F6O(4rbiA&Dl zEdx6XGsCAJzZhO#5d+6L$nx#`^-$uRR6sBUPQ4KZr|w4=gyEKh_`F(=DYhI0h>8MH zjkgTnm_IW-y2cBpxs_fr>^)>avE?8@lmVdBZDMu`%>MK5AH#(+7F4ku1c){SIg3%t l@=-7fMjXK?U|?Wi000kI<=cB-sSyAG002ovPDHLkV1gAI^!)$; delta 410 zcmV;L0cHN-1la?SNq@rt01m?e$8V@)0004QNkl#I1-R zRs{t?1chR0-Rv&vQU$n^ zDUJ}Ul!Hh!aCFn;wJJG~J_JS7JMWyUl4~>?4H3}?ffJ~|!AAhpumAu607*qoM6N<$ Ef+*~_!TPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi z!~g&e!~vBn4jTXf0%u7?K~z{r?UYMs6Hyd~|D>_hBvxsId9;P7O>2TQB8m?vidBNB zrHF#~prS|@bz>LRjbJw}BJRvW5Z#CiZC!|n&nQ}~QQHV=7Jq`4+7OL~SaI@bGVz*o zO^UISOdbo7`CvH7T;_f!=f4@q$jJP6)Ya)3U74>1QD$mctXaExMjDL@XlZTZjqt?+ zl-&TyEmj*BlT@wN;-&Wq)arSXnkcIQlABkx;p*k{(CLi4iLG6`({e3Bp^uWAD2e5P zb4Fdu5~gV~uzx1IokuWqu$k9vBsDb}*4X&#Ugoh`lr#a7r;9$JR>0yJKrAM}b=U-> z!;Fi&YIy`Sjd(nwph@IA6N*fgOjaJ);qscU^&(y2+N45jhXG%1y@!}!5R(jV+(GpF zzVZEO5)?}~9GvAVY64lge}j|DtNZS9`I-Cmm~xL}PJgum^&RFMIYE>7o4h3UcRAQ? z?_Rcg%Xaqc)mir9hJ!siVdXi~XQyp`QHQRmuKJETS2+0AE!zrf%Lr!!`>%r^iZ`6L}vb zxxUkaX+cCHl7hScDL%LNLXn(?GX5Q-lVRL@JXo@v$U6aRD0xzwN`TdBAb2LRaFG^* z`yt{wOGV^F!9%E8YD8?zKl6gI?Xy-)P88gP{xsJsj@Ti_Q|apme3yJ>W&S6UHv0YL hQc1atjLbg(@Dmzw6;CRKpVj~X002ovPDHLkV1fizPh|iA delta 438 zcmV;n0ZIPS1PdcLRIu?QV_{+x{q-0 z-Q7P2L4pMNZ_zbX=$a~Izi;*%>N++(y?w|^coxt#Rg7dtaeo~fT~kFUtZ;I4NVvU2 zO2U(XuBl>RFvZH!5?zrf00V<50E)MHDGARfu(P#ES0sw_RAMTvaFE?6t|tkF6)6c% z0$84n9ujdT_ zsLRYU4Y9a3$J_aE&3I+!vl})?r)PDoDP4q(fP>@-Sf(MCXIgnFUHJ-^60l4|EKC$W zjr#$IAFjYM4UtK_H4Ofv06@ZMtNFeBgoDI8@Y*>IOfS|*_yvbLYQXQEOAAya?jOnk gzQTh93GyfM4%4>HHU-pp-2eap07*qoM6N<$g6LY%f&c&j diff --git a/Resources/Textures/Objects/Tanks/generic.rsi/icon.png b/Resources/Textures/Objects/Tanks/generic.rsi/icon.png index 0202db50aad41fa2ef23b84e3f35f753014a65b4..1074a9dffa8ec992d0cd00c572640d02c852a57d 100644 GIT binary patch delta 822 zcmV-61IhgF1k47IBYyw^b5ch_0Itp)=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi z!~g&e!~vBn4jTXf0^vzSK~z{r?Uh|fQ(+j#|FhJ&X@nn)`H@QQ!5@xJRQNyh$IC^NjPxu_^Q>#3WTH(qT4zfI^WW8bXo)A^GF`caWW}W|cQIwXivd!yYxnmZ+G&rOwvw=H+rF zpPygCQ<$dHXMfps>-j5eNkVhsLTsr6Bo_u1$9Z6EIw7=w5n6*5mDPJu-*6JIp7*nE z&~i{G!tIH;0|ez|^QUf@G#{_w>zE03tt}`k*R%QU$;miedz9@1+7~{bM@Hv=BMXi( zu|__U`}7i0I!2%`C`PqL563`{5IUhb)c=YlQ-ujS%8QEgHZ3PM z-GPqwE`PqLG>ggYb91mQeBU6~8%ogE`*728Vq0(&h2&SSU&h_uez=8qofBkI$cd-{ zNM6@?2G3>{zz?&Q0*dntwM78z&K}ISXo(? zL{3Cp0&068;KzjJGwgQf>bJeV`IuyKBH}}+3ul@eF>ba%u23*J{mtI%c_5jb5PeW6 zgfBcTjqQUcj|Sp;)x?PUFbWYom0X@6!G8eo8*bp9jDR^2D*ylh07*qoM6N<$g8ik6 A?f?J) delta 599 zcmV-d0;v7W2JZxrBYy%mNkl1t|gX1MZTyE%6C>*4>gg}R*;o9Bh zkD(2SlS2k$A{48GlRBw%2snyUB`F!*4nqO~aY+gX77Hq5P(qT!(cyP72T9E3l3Y9G zo$fyF?s>lNKmI#dWtB^ckxWP z5~W$M5xH^GQz8%nBbkuq?jCPSCDu1K30;q3?(PBb{p%M`iNGdMJuS1ov5E8h54SV7 zsGgSDHg-@VQBR3L1e`&iZDWT)_ZNj?4uE_23)p9EwD^`Q@xOOsX#pddkZT_gvCrBR zkDdUaswx1PJAZd+)@wL}KJD|1P_tf}xc}O+@crxoCz%R`e{g_Kr{f+gktp>~pF;rc z^NY~1cVSWm&h#;)r+j~^C%!+(7X2q9#tRHD^tp(sjVa9;vL zI6yj`#G#c)?s;UdaJq3giGMmlfI1ZYojYycLNw3#K zRaIWSc(yPcrtAYk2$@Qy+$|MAQ4|`D2BvAcwWH#LrQqN(0Zr3J*4eggVzC&OWd#NY zk8eRZ98d-(cei*v9vB>^OrTP!gpQAo(RF>K9>ki@6(NMQEK6FJC9Bn{ub<3$GqV#R lg#7vA8^G0dzRD_BnZH8}4{Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi z!~g&e!~vBn4jTXf0_aIZK~z{r?Uh|fQ(+j#|5M!7+0t|yb8e|IwfxA8(DWkGDEhF% zqKmrdrmG+_(wpeYF1qo~AW#TGqL30Xk-VrVkODK&QCOmaXn(G3n{&D^H|J^3+vbJt z!)+(%Vm}z~&d%BU`@hd~-gA&7$-g2iOU=_Ka2S@9z$ggSH77QtPNyA3d&^l6b}|ft z1t580aS0QXl;h+W8~q55+Zi#0AOV8%7tbC+snoEQ*Ed{d=gj7xQ9~p|g|S1UEYkB* zsf^d@3izt3V}E?vg=Thq_1Z1glHj>eArh(p$^C=c<#M3B;k3W}D{$r4AhWCx1*fm$ z)ypnc4QdBfBGf%03XCxmlp8NT9L?#ufgiQ4(4A|BLaTw#WrxM^9lY0#seyKOz1!^& zQ6(tM;^M-FH?9Di<>IE-@Rrs?lV6He(>%;yronq$EPsG=as|_)55jt4Zb4A)U-1_C znqwJDGs{R3a}bGlKyhH--#j=^_c)>rO?PJ|3Va(^1r_vqlUn&7pWktXqCpz|}6d%der z$ei$fo50A>AWg+#YU~#>BsTv}aO2HjcS3R^ z?4wvwqGdfcjeLc5Y5_jG1?vtgR7Z2+TJ{JcC&EsmKiJ6czEsKHYN9kLd$Gu}IhY0) z5;p4jW+F~RA#%=^z~^@Qx139GIT3X-3K94!xI9Uc{{Y|*`h}J&tuOcr00000NkvXX Hu0mjf`LT;r delta 627 zcmV-(0*w9B28#udBYy%?Nkl{%zzZ2&FwLjutgxB%Q7GZ$o=@nm+%|_uAv#yyD576y@tebGtsbs zBnn!~>szFEQ-6GoECF!P=L4YNyUu1}gM2Pa>itK@W@6)?_Z^MG$0sLv@_g0UIl$?? zZR6UxJx3z>rXr{A24qFmF5P)$3b&HF8juxLQ*Pep;oj%6^}pfOc3+o(tf*S=3@rs;g$ttMb#cZn&s)U7$dI2 zv2fAvtr-p$W+gHxPaiqs8<3Ju7LsvUL&jQh1CC!*iW{9@c# zyQ(S;!)z-GK=E8lhb+03;;wo^2RzD$vz+9w<(FsmOkC$~JgKftT?` zNBr&$!egPb^@Bd2Ewz`%^h5ez0L3}58(vjFm-zL42f%iCGtK-L`2*RN3UI@X4}Aat N002ovPDHLkV1m~)IY0ma diff --git a/Resources/Textures/Objects/Tanks/plasma.rsi/icon.png b/Resources/Textures/Objects/Tanks/plasma.rsi/icon.png index a7fdcf8f676acd409535449890051e28d97434da..2eb105e1cc10d9e0135aceee7774669e1e1f8ad1 100644 GIT binary patch delta 488 zcmV-t?hrN;MLDU5~v* zI6<*uUiFKYmxYH4;6m&IN#r*dSl;q=M3kV)aV`rF6=4XHfYC1{N?_aZ%uzrU9w`te zfpGDbV~hij6$q4Y?}R9!a^}hcaS}=3(gINuN#IHXK@xT=8C+RFlt>C6OJGvqL;{nH eR3H_Yy1);^k4H_V^-Yfe00001wvv+)FN5J4z*VNmN4RQwr8DMByM zF6u%&fCumZrHi`IBa~91h+vOUwM4`s3PsZB0o)WF7bQhwn@rM;i@d84X7W7qecuG4 zM2RwC3?ZZ;gbcfXW>Wax&K7U>JAk}sG-5%&5qQH-`1|}ESj~BvV?N4hH&$7@Ip_KDb3-AJ29VP=t;@J!=C3%C<%;$UsYe& z-d`LGccLdHnSW-QaW}-b1%B}3?iyNua0BWaH^1O2@f0wG@IAQ~-0$=NQ(kZ_5g$yp zo*G+r2cBuB1H-{%1`HwO;ru<-&rJ?zFR{L6eS3b~UE^foRvGSDfr~~XR(@S(fBKqo ze-~}4KXTpAvIm8G3XGC4YaR6L(hwS^=k6#ibhks#EPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi z!~g&e!~vBn4jTXf0_sUbK~z{r?UY?eQ(+j#|J!7&O{LA%oQxuKhKgn?nn}?`Q4xe# z7hTjvL3I%l+Erad(8q;05#)tt7nMm+h!=fO*#}mVvs$1@pns8uY16Yab56Ipv(uiJ zZIJE5eFRYB|tohLEAy$NlLr7)EJgj?`pY%mjUsT(K0o7j4%(;=Zs zP#B)K1if(uSSpt{KEn~K3N`9)KDmG~vla_72V47v(|_Tj?M_%v%q=zu^q577HeBUH?mNDCY6td2v)Z5mSI<%L$o(j!I)glek+w0K>6*%-U=r<+?%+ zk6)H7TYpY0Yaz+cU#iE8qC=nxxIDria<|lpoPrrVd9^VnIT7_MAo;F+Td^=>!=^_U zF!;{*ef#AkrlHQ`;*t{)TR=UhvQIXf@grXYwNehgd_B6a%wko#%_nyuE00Id+w!>N zMA!g<14rdnW!qtEA7*mTyaS`Fz2JHQWAO;y^nX^wEhj<-AUVyM`Z-o^`n4*wcJy51 zF}l(PiPrGI4YGcHD9z--+%kgxDHpn5 z-%m(Rggu1D3hJ>F;{zI4hP1&?ZA*1OOjd7Fw-i;`r2uj z`Z%f*>iJS4ZbTs}tNNfwOM}znNxGbfx*3J=UnX6iBE^3I@EZ*%intP!sz(3-002ov JPDHLkV1gMgdgA~9 delta 595 zcmV-Z0<8Vj2I~ZnBYy%iNkl9l{rSK!!<b3D!E7#k1bIOAnDJ_o@5-j1n+Z4Ioxddb*$klN2C zH(jmI)9MT!*=s6ci$G1UGOf;_|MkJ5IL zM}biQ;&Myk)_=Ly9MtqG#of=2jl%k|=N*H>6R9N6^KaWb2Y9C+w69UR72Dtd&Q4z( zT)GHbFvI*8`2$Ki4>0FXWB&jE002ovPDHLkV1iBEDiZ(z diff --git a/Resources/Textures/Structures/Storage/canister.rsi/black-1.png b/Resources/Textures/Structures/Storage/canister.rsi/black-1.png index 791f22c9585e4edbb8f317ed5056af0c0401aa54..2f7fc54a31d9ae8803959f49eb998bd39f8d1e00 100644 GIT binary patch delta 314 zcmV-A0mc5o1<3-C7=Hu<0001iRAQZFw! zV_;zO^Yh5a&w6xpfRp$l00001bW%=J06^y0W&i*H)=5M`R49?%(7|rPFboFZgg0=5 zIKyBm$2M+LwCf}upjFtq(;BPUc3daK8}I^1+;`wTNehVV6@TWNzk~hTjQ#V1DVqVn zz0V#-QC`wbIIi8I>KXu%g76^l(>;GkL9_$cBp#X-?u)rKg>gSTVO)fEpw&+ozqA)r~1rQ#`0OuHK547=H)`0001UdV2H#00M|fL_t(|ob8r9OY2Y=$A7U&O#;neYbj1j zpYP*Xu-4l#02$yyW=!7?_S--@K+Q zz6uWy4@$&r{LRhHG_h%NdV0DrS7Hw|8V!UH35So54-CV=bzJ~l*JUsmP$(3r*Xx-{ zd%Yf&N@b~LQk$^RXsF*p2wd02Fs4t{!NCExZ7)pv`+rvvu$B_AG0$*+f6s6@RAW3m zJjAwbgb?bO$DhCbxwan#=*b<&!M1I#uC6GRN?4YK5JF8T>vl;>r4sM&@2d-t$RZ~v zCje}1Z6!qN=UJM~Ce3D(ZnwLrp$Y9k! bBy0Wwoo@~i%npX!00000NkvXXu0mjfczRWM diff --git a/Resources/Textures/Structures/Storage/canister.rsi/black.png b/Resources/Textures/Structures/Storage/canister.rsi/black.png index c7c4d4732e82d702e4862bd8a5add4555682ab4e..2b07b2b087de424e2cdea45a4f36f45737149617 100644 GIT binary patch delta 325 zcmV-L0lNP21JnYL7=Hu<0001iRARwHz?PJU?_ z?)BB$&-t6-(yl#p!w?8#BwQG(NB|f+hPhw74}Hz>MZI%9UNH)DOtS z>MvlbmrQ&b>gp|G%i{m2yt1%VSt5`kI#5&7f_*QI)S+jA;A{Kj+;jZ^{umF`Kq17y z8TfL!kj5qj2_Xih6lZ>Dtw|)v1X#0wf~o?Ez~OKhC`3510DrLCLWbKX1Xc>NEW>`k z55}fx3avE&S_;?-oX_WA`|)^WjYn1>%Q9GNNrNh-$W_2nfSLjh*eL*j=hF!Q(7uen zU!TTj@m`>+DwJhO9_w)nfe<*80|W(@%I>Ww#+QD46#ZA5uYeF@i1{F>fHNNeSZmQV zO^h$fvYg6LDSs7RH%K1vNf=|I@tl2wT?GJED}h@9zy=eB%CK!)HUV}Sx)ew$e|!UY z@&g0~eB)VbA*FJ5D?Hy?<->0)K!@vM;7-RrDK^=gC0dSbXv4G*A`mNnOHU$A#K>z;@?;^Tk$nf^_mZB-DVraKD&00000NkvXX Hu0mjf4|%8c delta 807 zcmV+?1K9le0<#8?8Gi-<0047(dh`GQ0{TfrK~#90?Uq|e6k!;KpUpL=+{m;HI#6v| zLy%eo9jQ$r5u#FT1j(=h5rn#mqNSpuA|j%wo4GIv2^yooo9ZGc(A2qY6OwjwO+b1(e>1F;`y<0|mBmR&q136~+m4424l!8W8Jc050#G zZ8+_3dru#b|F8&;#{FCeZ6v$4*{1(>DGkgaRPJ^09}V>)9v$7vF{vGu|OdBhS0MIlwJBZVM1S5XHvxD z3NYhfQxj705&+I$y^0_RsK;i(NCYwj#FN8uG3(ZEfV#gxZc+j!jb~_WZf4-s7XUJ| zT`VstA%8Dxnn5a_97a7>U>oae^d&_;p@2{@h*Z7?<^B`q&L3?$BN0^ZJjk4?jU$n` zIPuI|ZA{_<8UoawjyS{O!m(Taa%f1KWC)0--@u;|)6Hti*RG|<{||+me8z|{x8&cyBCKq?!t24OD7_JmAK1f*OV{E>=+&n198c_M^Q_Jd l_aGSaP$-nrpN}-`@DH^J93Q-lhco~H002ovPDHLkV1iX-g0=tv diff --git a/Resources/Textures/Structures/Storage/canister.rsi/blue.png b/Resources/Textures/Structures/Storage/canister.rsi/blue.png index 412994d96c8a01d3cbb4ccd96d80e4157008154f..c39f1ff26e9569c5932254727626659431ec0127 100644 GIT binary patch delta 379 zcmV->0fhdY1d0QY7=Hu<0001iRAmVo_wl8G+Ks z4s~)-)@3!hB^QFnm2G+PN2ykq7T8l!+z|lp{Uni+mRHXJ@ow{b3tz!)mYp}(07JT) z5%mV#p(9eV&~(D7>M#z~uUW)xbidsWIso`%dJI_`a46wYa+a9K%qUBQs7bN_pqp4c zGyv`+8=)o_W`-BweMJMCc87}40D3#j_=f*@Rq005>I1<09F*#RpaY?{*LrBtB<&b< ZJpY16O<2m#t&IQx002ovPDHLkV1n6(uTcO1 delta 528 zcmV+r0`L8b1Dynr7=H)`0001UdV2H#00HDlL_t(|ob6XVO9Md=eTtQ_3ncylxlNHu zun|()2q%aUkrY>LX&Zv|5p69GgdpJv280M{QVRZpfS&jVVkDiZ&*F0Ho=I+Jl7Nk` zNiIxg-ps03z_LT>`mFfg(kKTlgx=Pn4PXR9j z#1e48Z$bcvwQT^v=SlQ@w;6qk!T{b`4ze{Q`&wUwKpHr~0ZImDj9s@rNIVPedm;mt z9h&+eJp*y`0e?{g5}Hu9hH4C@>l<~0)&m-epdnLDgE%k|>?r^+cM`Z004&giX=C{G z{>3K1SHejNgyT*91^^}I+BRoEZ@hjJ!to#+PX!GcQjrmkm)HZ8onR!;>vj|g{nR>i zGJ5b{x3fHf7^D00+zHS#008yl4Am{a2X4xF0Kh>5cz>?ufoccY!V!Qd1Ebf;smC-$ zG!nRIe;A#ppgJ-+(tpV%$ey;Trl>uP$+pG}=yey4mpIk__4EmKF*2zpK*>O{q7;zg zFotw}k|eXGc$N??gLDGXD*f4r%)pe_GTz06xQvtnuIy&?n}`X-d*MF-;2VOPt|IeG S!e0OY00{s|MNUMnLSTY_r|c{M diff --git a/Resources/Textures/Structures/Storage/canister.rsi/can-connector.png b/Resources/Textures/Structures/Storage/canister.rsi/can-connector.png index 7996e1b26dbe64d980dd740285fb66b53173a8ea..9360a41c58ba355632074d216c2ce7e9c6f61de5 100644 GIT binary patch delta 253 zcmV-7=H)`0001UdV2H#008+(L_t(|ob8pt3WOjOMQ>B&P6#A|zQF(g zn7$yWMFg(0AZO7ePNP#YIV%qYB@fPhPb(l2i9{j+sq0#u)np+9R8<843IN)+P5vGL z0Lrq&x~>4AY#|;YIveQXYA%qZ+QtGvD0bCy+6R#~e%1y>`M4G1h`HI{-fDKdXBfcd7A;epF#Op&uDFq=! pUsvAq+u)pAe;lo@^++Ugl_ymqU5}tdx+4Gp002ovPDHLkV1kDMe8>O* diff --git a/Resources/Textures/Structures/Storage/canister.rsi/can-o0.png b/Resources/Textures/Structures/Storage/canister.rsi/can-o0.png index 5f13bbacae63b8754c7402d03958efa8a4e27c19..89f617973f8bca28041d61e91bb0ff746df11552 100644 GIT binary patch delta 188 zcmYd4$2dWlBSEK+1tvy{F zLp;3Sp54gHpuofIc goQ2~93kQS5w{PMP_cyXc0?lFYboFyt=akR{0E8<(Q2+n{ delta 84 zcmX@dm_9+$kBxzWVbR>W79geP>EaktG3V{Mjl2vBJj@$9{@44(CpeUB)GuISV7NYO li|2NE{W))eDj66K_%r9eW&XcYUUfN$>*?y}vd$@?2>_|D97+HH diff --git a/Resources/Textures/Structures/Storage/canister.rsi/can-o1.png b/Resources/Textures/Structures/Storage/canister.rsi/can-o1.png index 2e548fcaca256ad4f71aa1d235df5e812667be34..6f9566ee13cfef2cfc8ec94125469f1878b8dfcc 100644 GIT binary patch delta 95 zcmYc&njjIy#LU3Jz$Y>(9Y}Eo_=LFr|Np;7M&rJYg+s97M4%vJNswPKgTu2MX+Vy+ vr;B5V#MI=31^NXIhDHfIyjHs#Oc)qCS1??hJV8PcsD#1O)z4*}Q$iB}2E7}R delta 77 zcmXR)m>}W7!N$PAP+V2@1xTrTx;TbZ%z1mpQINragL#A8KihISw(~9yLJW2$nUmvU fiYGEK95}{Y6v_NQXIJV^pcV#CS3j3^P6?0s#LU3Jz$Y>(9Z2y6_=LFr|NsBYOosnw7!+Ie{@Uz24HRcA3GxeOaCmkj u4agDlba4!kn3|j*p>SXu<6J`xMuunS7<0w$#99Jn89ZJ6T-G@yGywo^SskhX delta 80 zcmXR&o*?1P!N$PAP+V2@1xRUmx;TbZ%z1lmBQJvi&tZeb|L@Pf`gh?=4><)5#)QOK kewTe8|Cz(9Y}Eo_=LFr|NmdHRgdAGxVX~Sa-bk%NswPKgTu2MX+Vy+ ur;B5V#MI=31;z<2h9-$Tyj9kXA`A>BZyAEse%6E3GkCiCxvXbIO&;K94zizIIdw>k<-dc7^2_Pu4 z5udnp{v!bn-oTWEiZ2~Ge?z=mQjKL#TyhUoN=Z0yM!9RrvPPgiZU;3aSef}41k=Pj UUrU{>1GLXPh8W&ce*Vz|a_yejG>%1^9%x{{R2q%`Lc~pj2DixWA_-EG*vi**$%rEMrNK zUoeBivm0qZj<%PnS ZU?{rGtZM$1=P*zkgQu&X%Q~loCIE{qC7S>M delta 109 zcmeBYte+r}&cVjOz))OO^#w?|dAc};RLpsMUn`U!_CQ_j zv(P#N^(bZrh99jJ5D?Hy?<->0)K!@vM;7-RrDK^=gC0dSbXv4G*A`mNnOHU$A#K>z;@?;^Tk$nf^_mZB-DVraKD&00000NkvXX Hu0mjfWq+tL delta 740 zcmVMg%<~rpmk< zOJ^jnzepIhWGq`YO_c?D!RCr=_<_W|&|TaYW)n_(>hl_sR&a86A7k)zP}7pN;rKt(>s z<@%>AeEJ4JRgGCCPm@Z+VIf8bz5!oRSBFzKAr%BY2CYM_#P8+D*(daM z9|K@@v`q*Z4#T;LOmYw;I(gLbw2&;3;?>Gtg+wxai3W6TP z`m?DOF+ZMjADsF9fX|EXa0e0$UAf4O(fj#Dl<*vHJW=OaZH)U>I~I$T^yi}tJ^TY_ WMhU6HdbU0Q0000ouZcz2f_HNo zuOFECrj&JCm~7$Ot=pD*Y+SpwswFFXcI?_+jrqPVbsEe5HoHAyI-t1mbRaYT+&jzP zRT({dn6b57$R>UvXTyx5fUM5i(1?a4yKaU<2dABHNo07J5Wz6ZkI$pNF)rfhmdK II;Vst05z?{#{d8T delta 463 zcmV;=0WkjS1KtCW8Gi-<0047(dh`GQ0i{VqK~#90?Uz4F#6T3rKgCL|7cU?gi>(C9 zTtG-=A(A51+(E2^o?$>(WC>dfUcf5^B;o~@wbeQn*^Co6JM+C5u<>hlv&_Et+xK?| z_+#zRC!?emS$=(_Y;yonQtP}B`8PLL6a)<*^4^L7*rSb2Q-7eGhmA%_ZO;4!l&&qkDl^t;HPaSGWu~(Sn4J&=P?@n1?yq*`!nn@2ofiT0IqHS<0FDN* z&AA%^+k&6mL>#mW`XDxRFrmIX`Ywya( zFE2Pmo&WCc?i_T(^YinFwE7_;Ey&2v%G35VP2D;G0004WQchC!S2EGZx^prw85kH?(j9#r85lP9bN@+X1@fZ;d_r6~!-`LxI%U1{ zIfHGKVEu}xPoLJ_{PptXOA!%~w{PEGzkXedf#Ji455)`&oGgs*-n|3riwj|p0Z|Of z%F3@_zm}Gke*gZxprD|-pncV4-+A+9?rKQ3IjK;>`B3JZ?XS3% zj4DAK4u)|}Q>0fhd=1BwHX7=Hu<0001iRAmVo_wl8G+Ks z4s~)-)@3!hB^QFnm2G+PN2ykq7T8l!+z|lp{Uni+mRHXJ@ow{b3tz!)mYp}(07JT) z5%mV#p(9eV&~(D7>M#z~uUW)xbidsWIso`%dJI_`a46wYa+a9K%qUBQs7bN_pqp4c zGyv`+8=)o_W`-BweMJMCc87}40D3#j_=f*@Rq005>I1<09F*#RpaY?{*LrBtB<&b< ZJpY16O<2m#t&IQx002ovPDHLkV1g4U}oXkrghb7(7*O7r?V?XzwL{=c*KENl$ zl{2ik_U13a`W2^6ow|Pg`u+R&8KhLKcRnv>V2BF=Vg?3o0cI<|*RNkcefsqM`}ZF{ ze0clz?aP-h-@SVWG((b!DFH}{mIV0){|AG52n8bT-AZ)9w-&p4wTbV4CrY^g-^F~z zHPP&oPDsYb!;6j{sO)9yeE{S>#ntNKVVMeQrVpIK}ta@gW(^Gq=xN-&mJ<{m?{J78Fw7Lr^5VI;;NP0 zW`?kxu4-QQqTl?IKEV>kYp`@mL62BE_xU4EYdpFQZm-#MScxyiGyW>?hFp1}Dw7b) T`KCcYzcYBc`njxgN@xNA-%7y< diff --git a/Resources/Textures/Structures/Storage/canister.rsi/grey-1.png b/Resources/Textures/Structures/Storage/canister.rsi/grey-1.png index 1782cc29e89c994d272294a0482149c88e96f776..d7bef4b366c90cc62db43143e81611e14e66a9bf 100644 GIT binary patch delta 309 zcmV-50m}aR2E+o87=Hu<0001iRAT^C2QFdTz-K00001bW%=J06^y0W&i*H(Md!>R49?%(7_JDKoADtU2ia1 z?uZAd>{jZg+1=u-33{z9?hTI&g`S0Qh-EO-S&*qC^#~QsE0(!jz~T*BBdS6i zSdpnse?(}sM7&-6bL*0+t%EJ%)j z?AE4GttCwRzAmT*v(cseiB7o>P(O|UpYi(nR+{ z0FopDP%f8sKYypwsoR-M27u7eklxAfajPhTXg1I)#*9E9U|QtYj~@;1R#K^^v6WPc z<1b(MFgdA;p`oFsuTQ7bOiWC0dV1QFM0=D3s3-GAL(mY0`-Z*6a!B5e(r2AWZ; z)v#DB0KC-ec)ecL>-Fl3Zfa@@fM77l+S=Ni`I^>1Hk(D3Wm890Rk^#nqr1Bs0Jq!C z*47rZY-NC7N+o_P7AX`8KPEsE(aP1;70F~$FP_b2>Fet=O;{`z0T>$_YpVm6w;cBO z_gPw6(tq3T^ZA&cpC^$>nELnk_wz3C?#;q&2`H6HY;SJ^P^nb#`Fw0_YyhynzHSg9 zNfO0k5$_*fE-o(G5@31`Xx!Y~=yp#}59M;1SS*Iy?IsqBnZ^_f1r84n+nRs)w*!8^ z-*m8At?G6(8pY{!lFQ|IdU_(4%i(glXpAou3V+Pb&I0Jqw-A4_+5QHsW+D_t(e06u z5t7Ly(P$KaL?Xe_(NUAX-|y%6_!vNcLi56IJ*EZtb{FLHd4quK>ubZd93LMi6bdmj zGo$Ycjp^xW4h{|sc|J@|0;Wf?F5q)MpO0z*kw^rf=`z~e+tU*c3=AMi5{rwA1_6J4 z{b*_s@EW&@A~apcS{EXbi0OH-y1L5A$q4{4@s?7Ll6Y4Rx1ED zn~i$CPNh$wu^TF_y+>mEsB-!5dZ)H002ovPDHLk FV1i)3rLX`1 diff --git a/Resources/Textures/Structures/Storage/canister.rsi/grey.png b/Resources/Textures/Structures/Storage/canister.rsi/grey.png index f7ef5a60f9a279d62c0a97812e38ce805f32648e..6668cd6789b8f7a26c8ef1bb6d718db9ee55ab47 100644 GIT binary patch delta 326 zcmV-M0lEI?1l0nN7=Hu<0001iRAT^V!+i z$jHwpDEkEf0004WQchC4tt|OVY zbG9h^0zM#J1n0C<`2CSqF*(#Xo@`@GQ9KPmtqJm3wD&kN$bXXnI3C_IQ0ZKUJ2(#> z%C8+X+K@3BL;|HuZYl;phH={6GI+1+DVMZmlBsJm(4TWZ$RO2=jZuwutC6N&C%-fd zx9YoX-{((;OSAScHA5hbk#J!sBLQIS80LQQKJ*pC2ldYN_`88nsAJS*x5pe5*;In| z#GsbiUuOn+qdx=z^I#R+GiC;OWB@P3K6)tLhs9>`fig&V_5PYG(#qDq%^O@LMe#iT Y0pU9~I%jRoy8r+H07*qoM6N<$f{_E2y#N3J delta 602 zcmV-g0;T=c0_Oyf7=H)`0001UdV2H#00J&aL_t(|ob6UIi{d~O{%*N#js*!;_5*?Z zgDnLi5bR8ug#$^kwt^6_UpTQ%69$gkHg+Ne0x7k!6b`nsu{b4ITg(=cT-Mc@H|xPR z_ca>lz3+Xz_q{m4C*un>&}2;L5dVI8A#sy}OvXf#raJXuw|`nB5npu(KMf{hf^#k? zW6+5OG&)c%pqnED*#iJD2m)A^C5>$~8s)hDsRs%ShePQ(=Uj`AEMO1>`0@0ljI&!U zBxy=EtyTx9BhZ2N2mm0yzXt&PagWcxz8yd3k8{|zjU-9PTsI#PAcIbEfY5<+Yv<1A zZ=N43->V%k8GjS1O^|lLWK0Z#0C%+-!Z5^gxm4*zk|gMKI=HLVkff>dy+QIouh#x+2c)sr=&vO`tf$4Or z#i#5*)p+Ca7@Tu(&hh=>p)4Ln5da{HBDCA>GJZ4~U4JjY^Sn|-v)O!ip65AS*G0Wv zhwHk?^SmtXdEWH`s>rhJ-EW3rAdX|~c00sz48t&VC}{%r`~AhUD2m|wK7ivm3J(-H zH@CM^ZjuSN+pYAx@PJNE0a6Fn>otk&T+ZQexK2Q^cEEWPs&a*p-{6!Z==b~O_bkgu z&IW+lY*PjRa2)440jFY$j{JOn)=9kx<)zWGEK%)(&W*@%9IRF=X${h?*s?4E{2hnt o&!}j-syJD|sSp(?h5w_#E5U`$Gra>DdjJ3c07*qoM6N<$g83a9Jpcdz diff --git a/Resources/Textures/Structures/Storage/canister.rsi/meta.json b/Resources/Textures/Structures/Storage/canister.rsi/meta.json index 95d67cc8ae1..7c2915a3a7b 100644 --- a/Resources/Textures/Structures/Storage/canister.rsi/meta.json +++ b/Resources/Textures/Structures/Storage/canister.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Frezon canister modified from tgstation, the rest are taken from tgstation at commit https://github.com/tgstation/tgstation/commit/f8581a636acfc1517611a680b7711a74fc7ef335", + "copyright": "Taken from https://github.com/ParadiseSS13/Paradise/", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Structures/Storage/canister.rsi/orange-1.png b/Resources/Textures/Structures/Storage/canister.rsi/orange-1.png index 4d0714e54571088674675b1319e933b835138375..136b36ca3cd675473e6325737069537f61a7a4c9 100644 GIT binary patch delta 335 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 delta 501 zcmVHg=}FV))tb& zB9E|0>L7AYV0CpK!}>t5vP>btGRRieDJ(=J4^*7nTWdA>!MQ?0Lc~(Ldk+Z#k$(aJ7RZ2?NYDWkDd2>0 z#RLGpf%AwOOHDuxff+CXM#i*0cQ_o9ILATX1UyE0-g+3+*D=wxGewQ?U%oA4~E1!rV7v4?Lwdpn&cp;(Ey55N*{oD3DP`Y^#H`p zs8s=PDzB6#G=Br;ky9|WmZVC4Yi-m;MXu(NwWhA|6qF%$8dOc_$!sfw_5?tOCT#10 z&xO{8A_^QgTuZAS$O0mvJ8CIJ6_^F<>nd?(%!N%LW_)Lrv$c$N$ zIBB?lM6E!mMB?0%1Z^^Yiohc4#3YEjk$<$jHzAs*q@=>p%bi00DGTPE!Ct z=GbNc008VsL_t(IjqQ@ja)dApMDZrs76JwS|6kL##~Csia(_=%T7?hjxzWP1{OhmD zIgita5FGR-9h3LS6X#rFd_`O=sn+U~@LEdfV(#b6vu?E}*0sdIirDuMRCN$8m%y9Z zrZ8Y75#B{qcV0T+N)E|V17N^}yEK6h9tL_ClyuFk$TtH3vUAV|tcA7)7y+OY2Im0I zFF*#6E&!Ui0%M15M>Tr_Drn^!U~)*cCqS6Q1ac8NOh{0xe-zmrW|1Y6l2$yIHc`Wz zL$e@maWkkf>Jjfp-3e;Dxmi|UH@<*(H|y>Q9QpCT{7nC*PxpuqcjWjYhX4Qo07*qo IM6N<$f<$JcIsgCw delta 822 zcmV-61IhgQ0>TE68Gi-<0047(dh`GQ0|`k)K~#90?UqkS6j2<va89K`n?7?G!9b}uutP|H zg!CZlz79J(zMWllJ-1&NnBV)o-~0Z4-`{)l25P9Gh8k-4-+v)gBLVWLfN3}847?eG zzJvVLBBYW}q|*STOq1K1RyKKXa}$341mFVDrTF^XSWHtMCkf#ve`}gJuJbi;8aV0N zb5bIN5IeRl0W!J{z}3Y?0495Ss^tX=YK7E+x26f~SEg1tCMCN|OBBgf{QCIOd++l3 z`qF7qzI7d7Vt;%bEK7zGAn&>r6rHO;yKkX+A;{P^b-FIpB-H9xDQ`>4G*MgYho?X& z7{q~!y)R;TXvkCG$-n@gf$PB_A`$^$$`^aGp#gwPripD?KtXnOvxkc0M`2S+p3Tn# zkkoaq$K!lFJ^ zulmE<1%HssR+mIY1=?q41>p62b!5cz6-f^ww>6Eg{r!CH@2@@qQCC+oxH>ZOPP=lY zVt}duKrkAGeBSf-x{383qK*o06AB@S7)H@Nf5Wo87X0n*rlr1~3Bw@ep68iduJAR> z=gDtx0}wF`mfba$4TE4T2Ed1xFFiv4h3DM`_kW$j4e(=n8h|ew8@zh)!kc(&c$io? zT(OEXi3EXgm^+=Fg`^ZT-@M7><;y_%r#NL<<;M{4s)YT0kkoaSg`nBp@eh1N1OjET z04TPj45uus^y*H4+;tqe>o_t2az)eRil)iut*vs$w&jj(%X24A$mMuku4tMZ0{MM> z+%J37*orb8fU15-GH`Jh-j6}Pl3&Gfe@JTh2heUP(J#@8od5s;07*qoM6N<$f>|bx A82|tP diff --git a/Resources/Textures/Structures/Storage/canister.rsi/redws.png b/Resources/Textures/Structures/Storage/canister.rsi/redws.png index 8390cb6539a4d06f8f66c9ee27f36208e0654894..630651777084e1e28ef3dc2219bc16052c314c80 100644 GIT binary patch delta 388 zcmV-~0ek-61d{`h7=Hu<0001iRA>-68(e*?Ht00001bW%=J06^y0W&i*I6iGxuR49>c z(7#TEFdPT)a!hR3Hbg>VaxF2e0x|v@eS-4_d;)efq^xMnb$>K*LMP&6;^t(^6UZ$- z0JE=Q&r5%0xbN0a+HZd?LVJS==M3AmlU-#xa{zbYU_754TVQ@sEXf3pa)JHp38Xw? zQDniR( zELsd%N_UUxnDy{hFdn*OG$ElF&p}%;WNJ6>ri+#qEg?gfYAS`0F$o?jb+Avl&`S5t z6?ExaY>TJ&zI*S#dp`Kb7DydOQ1}F%2xGUU$%jWrKKWrbD}N*qB1+%Y8Tu)MBoy`FExlvmIBR*Jd!;danc$EAsO`Ye4NCV>};pXy^sn%ux zD=o`-cXb6}NPd6sjO_$iXw6}glpvj*9l~}Sf^}sJYk_%AzFd+omjL{jO#U7K;KRWI z0EbCJad*d0AnbO@Z*L#@wRU$2x3>6xav}*U2e3iRkbfCiVzk@hJGPzM&=y|0PCT&A zg7YjZVFpT-0t9$tecu@1RH+i;TZNAeV<$g#Y*`V2Z7(XG+ZFIN5kOU9lhm$&(Lmih zwt0`^Du_+3@mbI~fGw;l5lY_O7+@I3BKIA)-+Q3 zND>whj!R=R5ufev({8nX^9j4%hk!v)&Vsj5QZFw! zV_;zO^Yh5a&w6xpfRp$l00001bW%=J06^y0W&i*H)=5M`R49?%(7|rPFboFZgg0=5 zIKyBm$2M+LwCf}upjFtq(;BPUc3daK8}I^1+;`wTNehVV6@TWNzk~hTjQ#V1DVqVn zz0V#-QC`wbIIi8I>KXu%g76^l(>;GkL9_$cBp#X-?u)rKg>gSTVO)fEpw&+ozqA)r~1rQ#`0OuHK547=H)`0001UdV2H#00M|fL_t(|ob8seOB+!f$3O3qATdO1CkqY^ z!i5k7mw-!09fTIk4f+RUuUIla3NBfaQ4mU@LTQMfm!!cz;raDgNW=2!N$p4aafD zCSPA%aC>(r0364Oh_yC1_1cl=CNiMKH=0d?AON5OT$>KV5Fv!<`F;qn+h_prWq%)l z{Q7!QU9F!r?>3rE0LtYu0DYi5h~3=W@N{{J5;ysEJ+!ITD$e)zR8@2=2m)N!WoKt6 z%mU$`PDd|L*?*5&6@s4cldD#RX~N9@9dH{XZnkz5U4d*SLl6Y9y;tO_Rm}2xo=3Z0 zN6gLwuqq|1#{3ugJOCTD8vgOI&IMz$T1q?#J>SJx3a@dwxpybC7+~B^vuW} za2yBE^I|8yT38_GdD?`O5-BBCp#WmI>3?^-04&?~^nV7F2}QeJ2c9$jd4CT)mtGp# z^&cL{%+Krlm$uED$z2@7niNo#$W^O)OiGF8c{+Pd7=1B5A9SZTU=<3Hz+lJI^L={0 zuSJ#cn28a-caxbIYXJ;Puljv(da7flfjHhv$;WmZfDbDx|21F%h+Hl*xZ7y3yuBT} zVAMcnZhsE?eH}j>j2}+>76>6C8_@GS-GWl71fWhYZNPP1==bSAJ_1lGm1wyx04>)g zQ!E1T?c~JNjBFVFEqJ=RdKNZ%r^J-_Bplnunwh~Wm&fM4Ef&ddZ2_@Ial8Rj*gSkp zOd-d%vGRGWL8YcZL_WvLM0Ra$;(5^NbT~UZ8!ooMFrn5m#pigG*q@Lkc)d70!xR0m bq$K4p+5;fR^44i500000NkvXXu0mjfH~T{} diff --git a/Resources/Textures/Structures/Storage/canister.rsi/water_vapor.png b/Resources/Textures/Structures/Storage/canister.rsi/water_vapor.png index ee8b7979ce93f380310768eae43bb3dd28b33d6a..993c5ac4ff668b4d96f876ebaf3beab7c7c7fa91 100644 GIT binary patch delta 468 zcmaFD@|byoWIZzj1B1(wu46!ou{g-xiDBJ2nU_EgOS+@4BLl<6e(pbstU$hQfKQ04 zqLQw@z6B4DL~=qxRY^%uP>{R3Phw(jXXo673)i1GasKAbo1fpm|NQwgP)Gf8*$+U9 zza+>n_&*9@xN>L4LZB39fk%C0F#`kNVGw3Kp1&dm=n5527sn6_|JF&3lUfxxTm{8N zi~s&Vf0sM+=8H4;%=dEjg}1EuznE2F(St*WIUL_Be_W($^KNf(fpENB1IHDbTirt2k##*K~EmcZ|j^H==Xr zs?@}<Z!v+ zODOawc*&6Ej@hzw&EDZrx|9rB3lA?HgO&_gIu|qq<4uH2DQN2)8$+VkK_8JC$M0TM zrO*TBN%qyb$M@ZjC*U8$6WH3n!Oaz5wbml#qAre~zUBq;F z=2?igATtIpN29HVgZ+Js4iDM<;t0GuKHmEK{PI%7$BsZ|45m@UGM=BERZ-|K0@EnM zx6@PB7JRZeGO5t@J0|0(f@%`5q#Y#)U_c+FTLC^3d0yvO32Y3;9Qg%Ox zTKBYky#AtfQ-6eoBM)2=u$eIcfHX~!rm4fch(Oi0?-z?oL}%E{7`sXmn;BDeH|Hl$ zQ=4C3+xx}B*%6&vFpVP2XEOl6DoHTh-Gv_nfLBJ=Hu&=#`Ff3fy#@e$y0~!uLsk{M zJvjjY%x5#$WfS0u!hBh^#Cc-ep zhohtVK2JC}*y@LKB&$Wd3PS{g!4m_2Jbonfym}V6oO1;LWj9+TNkP0p1ORx$Vbd{- kU;5_4o$bB75&i%81xkV0Vt8IZHUIzs07*qoM6N<$f@!Q3=>Px# diff --git a/Resources/Textures/Structures/Storage/canister.rsi/yellow-1.png b/Resources/Textures/Structures/Storage/canister.rsi/yellow-1.png index 3937104ebe712d965fb33bfce47906ff84ddba54..c12694850d30dc69f9d10326dfdb93d5e23f9445 100644 GIT binary patch delta 351 zcmV-l0igcF1@8io8Gi!+002a!ipBr{05DKYR7L;){~8(^M@LLZKmaZ-E}@~X*1!^h zauF{tIQQQo{N_QdkrVUt^C2QF$jHzC^MrhFVk-au00DGTPE!Ct=GbNc008YtL_t(I zjqQ@%a>O7Ag%?o}3HttT+oPuGw%zP~X9^Q9^yBcC$K&7rntu@`oQWwj6Tf)QB_+Iz zQkG2o17Xdj)|!fG6TD7SUFR9E>PM|bp+u|>Z;jdAH$geG9uWubNnH#=X6{WN3qS~$ zC=+PnDu|VD0LtcH68Gi-<0047(dh`GQ0*XmQK~#90?Up@DD?t>7pOrKs*lcHPL=e)% zHm#&d1W6%G{=kx$a@Q)2g^iV)G8+5?*;X)VF1EH}k?P__)^f{m%elqL>_>L>MsIoZ z!f@u}e7tjJX3xSJYpk)x8vi@2rLhL+bYN>MnS6g&00co0>whbybh#Wbn`IqLr#YXi z!FADq4nwr-qP4c;rj*iYU8R&(O6f2}cRJF-P+Fsb{vbpl3|kFQt-`|tTwf;&MY|8f zB*^Y=qT6UdtF?OYUJt8e2GuImYSKSH7wLH_V~`G`p_i%P* z1CcJdF4`;rIDZaQDlnVD_BI4T07%*$NBU;{?oMnjF5vA==8J+G|BfRvouxPf$H!2w z!(?Iu&~Ddr&di#D=S9rtLcr{>T(+02A{@uqMogzztyYrBjln>I7s2cvU_Aa&s52TR z_9l3{T`$}~5#kIyKZ|j*8BwV~xg4OBib;50lr#2y8-L%2Za0eWz*kX92Z!ttq|P7T zFU|nK?XAsdlqa|fHe6Rahli^<*t8<{tcXoZ^t)Y=jmEd)QyL6lK3^^Po)z(1+Zp)_ zczTN1+4&xU4UmhJK8C-MNK374YBiWn|ABzk{ZEzBFW^<%83}R+mi0e+H8}$24nSvd zo*kgWcz?W)Qt~CVESZ1R{Y(a4bwAcOKIF9|5@0gv$NlA6VSyB)!9XUKv(awsf=G<gLlERy8X}%|6|W74IkQjE z>!nJ!l;FOGd^t8Hc~O=%poc@z*SfD=S8S?PnJ@neiNYU}1)&TM4&d=Isg6fS0Y%8{ cYK;}}2Mq}}POJcZ;Q#;t07*qoM6N<$g1f~>Gynhq diff --git a/Resources/Textures/Structures/Storage/canister.rsi/yellow.png b/Resources/Textures/Structures/Storage/canister.rsi/yellow.png index 595ceb298b04731eb854e73e1ec909e4e419851c..fc98a4568223f3bd173b79308edcf15ead4c003e 100644 GIT binary patch delta 371 zcmV-(0gV3M1cC#Q7=Hu<0001iRAK~yM_ZID4vgD@C|%edfeZHbKA z3I_Ei)F@XpLHz;!0VpYYWHYPYL>3)4(PZQ2%C@xSu=my{?|=7xUta(Y3L?)VP`?ej z(^vs>YCt$1U1&gT#u79DCn<;a%>YE6PkdhkqX!uKI@CycR%H2LOUk(yCS*I%mEBE)jU4en(IG delta 593 zcmV-X04GnIMW%7&EPV zvIcH${2Ir85N$TV%Zryuh3!^#WHN!Zsl=~oXbr|O2sAZN$yLbvGMUgAbZTMD#%Kx_ z3*Y9<+|&VMO5r(mr&_#rB>quLu+IEk9@ z=lOIhCJ8vFY7&dZ+uuI{wfEHu0M@3E{D}z~L{Cp|_kIAK2=wv%JR^Z2{G#eaV8^gY zc+g$Y$B^ez%zhWlO5pVsb+rS-MK}g)OWfU!pBYWTdJPmsBe#ois36;L&X40i1p$Al z#Ic`*%}SITzKoj5n2=1k*Ks(EX-E`>Uzf{ Date: Fri, 31 May 2024 00:14:07 +0000 Subject: [PATCH 049/155] Automatic Changelog Update (#406) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index fc0b5c906c7..d0b3206f26d 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4118,3 +4118,11 @@ Entries: message: New Tools Sprites! id: 6115 time: '2024-05-29T01:06:42.0000000+00:00' +- author: FoxxoTrystan + changes: + - type: Tweak + message: Resprited gas canisters + - type: Tweak + message: Resprited gas tanks + id: 6116 + time: '2024-05-31T00:13:45.0000000+00:00' From 6d3e0784feb3d73557aed926aeea46bda1b071d3 Mon Sep 17 00:00:00 2001 From: LovelyLophi <111106265+LovelyLophi@users.noreply.github.com> Date: Sat, 1 Jun 2024 20:36:58 -0400 Subject: [PATCH 050/155] CorporatCoatsWavetwo (#426) # Description Further expanded Assistant gang colors and added them to loadouts VM is bad at helping so image is in comments --- # Changelog :cl: - add: Added five new coats - add: Added loadouts - fix: Fixed the coat handhole --------- Co-authored-by: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com> Co-authored-by: VMSolidus Co-authored-by: Danger Revolution! <142105406+DangerRevolution@users.noreply.github.com> --- .../Inventories/clothesmate.yml | 11 ++- .../Clothing/OuterClothing/wintercoats.yml | 63 +++++++++++++- .../Prototypes/Loadouts/outerClothing.yml | 77 ++++++++++++++++++ .../equipped-OUTERCLOTHING.png | Bin 0 -> 9460 bytes .../WinterCoats/bc_corpo_jacket.rsi/icon.png | Bin 0 -> 6403 bytes .../WinterCoats/bc_corpo_jacket.rsi/meta.json | 18 ++++ .../equipped-OUTERCLOTHING.png | Bin 8610 -> 8727 bytes .../equipped-OUTERCLOTHING.png | Bin 0 -> 9455 bytes .../WinterCoats/dd_corpo_jacket.rsi/icon.png | Bin 0 -> 6135 bytes .../WinterCoats/dd_corpo_jacket.rsi/meta.json | 18 ++++ .../equipped-OUTERCLOTHING.png | Bin 8514 -> 8689 bytes .../equipped-OUTERCLOTHING.png | Bin 0 -> 9750 bytes .../WinterCoats/fa_corpo_jacket.rsi/icon.png | Bin 0 -> 6348 bytes .../WinterCoats/fa_corpo_jacket.rsi/meta.json | 18 ++++ .../equipped-OUTERCLOTHING.png | Bin 0 -> 8865 bytes .../WinterCoats/ge_corpo_jacket.rsi/icon.png | Bin 0 -> 6116 bytes .../WinterCoats/ge_corpo_jacket.rsi/meta.json | 18 ++++ .../equipped-OUTERCLOTHING.png | Bin 8310 -> 8433 bytes .../equipped-OUTERCLOTHING.png | Bin 9341 -> 9422 bytes .../equipped-OUTERCLOTHING.png | Bin 9025 -> 9418 bytes .../WinterCoats/id_corpo_jacket.rsi/icon.png | Bin 5955 -> 6131 bytes .../equipped-OUTERCLOTHING.png | Bin 0 -> 9578 bytes .../WinterCoats/zh_corpo_jacket.rsi/icon.png | Bin 0 -> 6141 bytes .../WinterCoats/zh_corpo_jacket.rsi/meta.json | 18 ++++ 24 files changed, 234 insertions(+), 7 deletions(-) create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/equipped-OUTERCLOTHING.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/icon.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/meta.json create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/dd_corpo_jacket.rsi/equipped-OUTERCLOTHING.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/dd_corpo_jacket.rsi/icon.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/dd_corpo_jacket.rsi/meta.json create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/fa_corpo_jacket.rsi/equipped-OUTERCLOTHING.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/fa_corpo_jacket.rsi/icon.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/fa_corpo_jacket.rsi/meta.json create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/ge_corpo_jacket.rsi/equipped-OUTERCLOTHING.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/ge_corpo_jacket.rsi/icon.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/ge_corpo_jacket.rsi/meta.json create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/zh_corpo_jacket.rsi/equipped-OUTERCLOTHING.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/zh_corpo_jacket.rsi/icon.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/zh_corpo_jacket.rsi/meta.json diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml index 04cc2e3e19d..2c4c27137f0 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml @@ -86,10 +86,15 @@ ClothingOuterDenimJacket: 2 # DeltaV - Clothing addition ClothingOuterCorporateJacket: 2 # DeltaV - Clothing addition ClothingOuterCsCorporateJacket: 2 # Einstein Engines - Clothing addition - ClothingOuterEECorporateJacket: 2 # Einstein Engines - Clothing addition - ClothingOuterHICorporateJacket: 2 # Einstein Engines - Clothing addition - ClothingOuterHMCorporateJacket: 2 # Einstein Engines - Clothing addition + ClothingOuterEeCorporateJacket: 2 # Einstein Engines - Clothing addition + ClothingOuterHiCorporateJacket: 2 # Einstein Engines - Clothing addition + ClothingOuterHmCorporateJacket: 2 # Einstein Engines - Clothing addition ClothingOuterIdCorporateJacket: 2 # Einstein Engines - Clothing addition + ClothingOuterZhCorporateJacket: 2 # Einstein Engines - Clothing addition + ClothingOuterGeCorporateJacket: 2 # Einstein Engines - Clothing addition + ClothingOuterFaCorporateJacket: 2 # Einstein Engines - Clothing addition + ClothingOuterDdCorporateJacket: 2 # Einstein Engines - Clothing addition + ClothingOuterBcCorporateJacket: 2 # Einstein Engines - Clothing addition ClothingShoesBootsFishing: 2 # Nyano - Clothing addition ClothingHeadTinfoil: 2 # Nyano - Clothing addition ClothingHeadFishCap: 2 diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/wintercoats.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/wintercoats.yml index d45e8c3f3c2..f3610178b9e 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 @@ -555,7 +555,7 @@ - type: entity parent: ClothingOuterWinterCoat - id: ClothingOuterEECorporateJacket + id: ClothingOuterEeCorporateJacket name: Einstein Engines Corporate Jacket description: A cozy jacket with the Einstein Engines logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: @@ -566,7 +566,7 @@ - type: entity parent: ClothingOuterWinterCoat - id: ClothingOuterHICorporateJacket + id: ClothingOuterHiCorporateJacket name: Hephaestus Industries Corporate Jacket description: A cozy jacket with the Hephaestus Industries logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: @@ -577,7 +577,7 @@ - type: entity parent: ClothingOuterWinterCoat - id: ClothingOuterHMCorporateJacket + id: ClothingOuterHmCorporateJacket name: Hawkmoon Acquisitions Corporate Jacket description: A cozy jacket with the Hawkmoon Acquisitions logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: @@ -596,3 +596,58 @@ sprite: Clothing/OuterClothing/WinterCoats/id_corpo_jacket.rsi - type: Clothing sprite: Clothing/OuterClothing/WinterCoats/id_corpo_jacket.rsi + +- type: entity + parent: ClothingOuterWinterCoat + id: ClothingOuterBcCorporateJacket + name: Bishop Cybernetics Corporate Jacket + description: A cozy jacket with the Bishop Cybernetics logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. + components: + - type: Sprite + sprite: Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi + - type: Clothing + sprite: Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi + +- type: entity + parent: ClothingOuterWinterCoat + id: ClothingOuterDdCorporateJacket + name: Discount Dan's Corporate Jacket + description: A cozy jacket with the Discount Dan's logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. + components: + - type: Sprite + sprite: Clothing/OuterClothing/WinterCoats/dd_corpo_jacket.rsi + - type: Clothing + sprite: Clothing/OuterClothing/WinterCoats/dd_corpo_jacket.rsi + +- type: entity + parent: ClothingOuterWinterCoat + id: ClothingOuterFaCorporateJacket + name: Five Points Armory Corporate Jacket + description: A cozy jacket with the Five Points Armory logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. + components: + - type: Sprite + sprite: Clothing/OuterClothing/WinterCoats/fa_corpo_jacket.rsi + - type: Clothing + sprite: Clothing/OuterClothing/WinterCoats/fa_corpo_jacket.rsi + +- type: entity + parent: ClothingOuterWinterCoat + id: ClothingOuterGeCorporateJacket + name: Gilthari Exports Corporate Jacket + description: A cozy jacket with the Gilthari Exports logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. + components: + - type: Sprite + sprite: Clothing/OuterClothing/WinterCoats/ge_corpo_jacket.rsi + - type: Clothing + sprite: Clothing/OuterClothing/WinterCoats/ge_corpo_jacket.rsi + +- type: entity + parent: ClothingOuterWinterCoat + id: ClothingOuterZhCorporateJacket + name: Zeng-Hu Pharmaceuticals Corporate Jacket + description: A cozy jacket with the Zeng-Hu Pharmaceuticals logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. + components: + - type: Sprite + sprite: Clothing/OuterClothing/WinterCoats/zh_corpo_jacket.rsi + - type: Clothing + sprite: Clothing/OuterClothing/WinterCoats/zh_corpo_jacket.rsi diff --git a/Resources/Prototypes/Loadouts/outerClothing.yml b/Resources/Prototypes/Loadouts/outerClothing.yml index 7923d9e66f0..078cf530ba2 100644 --- a/Resources/Prototypes/Loadouts/outerClothing.yml +++ b/Resources/Prototypes/Loadouts/outerClothing.yml @@ -32,3 +32,80 @@ cost: 3 items: - ClothingOuterWinterCoat + +- type: loadout + id: LoadoutOuterCorporateJacket + category: Outer + cost: 2 + items: + - ClothingOuterCorporateJacket + +- type: loadout + id: LoadoutOuterCsCorporateJacket + category: Outer + cost: 2 + items: + - ClothingOuterCsCorporateJacket + +- type: loadout + id: LoadoutOuterEeCorporateJacket + category: Outer + cost: 2 + items: + - ClothingOuterEeCorporateJacket + +- type: loadout + id: LoadoutOuterHiCorporateJacket + category: Outer + cost: 2 + items: + - ClothingOuterHiCorporateJacket + +- type: loadout + id: LoadoutOuterHmCorporateJacket + category: Outer + cost: 2 + items: + - ClothingOuterHmCorporateJacket + +- type: loadout + id: LoadoutOuterIdCorporateJacket + category: Outer + cost: 2 + items: + - ClothingOuterIdCorporateJacket + +- type: loadout + id: LoadoutOuterBcCorporateJacket + category: Outer + cost: 2 + items: + - ClothingOuterBcCorporateJacket + +- type: loadout + id: LoadoutOuterDdCorporateJacket + category: Outer + cost: 2 + items: + - ClothingOuterDdCorporateJacket + +- type: loadout + id: LoadoutOuterFaCorporateJacket + category: Outer + cost: 2 + items: + - ClothingOuterFaCorporateJacket + +- type: loadout + id: LoadoutOuterGeCorporateJacket + category: Outer + cost: 2 + items: + - ClothingOuterGeCorporateJacket + +- type: loadout + id: LoadoutOuterZhCorporateJacket + category: Outer + cost: 2 + items: + - ClothingOuterZhCorporateJacket diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..5eadcdc1c1ab3fbd2bf67c5055286b407e2e4a60 GIT binary patch literal 9460 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..dbb09f8ed0689a7cc79066703737e71083792db4 GIT binary patch literal 6403 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 Wzt56b8L0!Z523iOa4B*Mi~n!Kzyx{# literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/meta.json new file mode 100644 index 00000000000..42d21c3d8ab --- /dev/null +++ b/Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "leonardo_dabepis on discord / @leonardo-dabepis on Tumblr, Edited by heartparkyheart on Discord", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi/equipped-OUTERCLOTHING.png index 73e230e8a5f2088cbea061e045059ab6e5c52140..631fcc2c946a0131aff878e41b8da273a212dd19 100644 GIT binary patch delta 4796 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 a2hi|>*QIHm6bl{BIt>*a<)@0*ZvG!trPjOv literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/dd_corpo_jacket.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/dd_corpo_jacket.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c7fd65e30b5729faecb62cb354319e5ddd4feec4 GIT binary patch literal 6135 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 N002ovPDHLkV1g)L8iW7< delta 4777 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 DpPC*5 diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/fa_corpo_jacket.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/fa_corpo_jacket.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..fa468b2390b544d69d79019d254584a10abd39fb GIT binary patch literal 9750 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 W>=TC`4&;HXLud}J_SLpQ+x`uCitNh( literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/fa_corpo_jacket.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/WinterCoats/fa_corpo_jacket.rsi/meta.json new file mode 100644 index 00000000000..42d21c3d8ab --- /dev/null +++ b/Resources/Textures/Clothing/OuterClothing/WinterCoats/fa_corpo_jacket.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "leonardo_dabepis on discord / @leonardo-dabepis on Tumblr, Edited by heartparkyheart on Discord", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/ge_corpo_jacket.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/ge_corpo_jacket.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..87fd745850387bc5509c30d040b8fe3bf1cc706c GIT binary patch literal 8865 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/ge_corpo_jacket.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/ge_corpo_jacket.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2af90d92f711ed7cc517ee4d09db2cbd81d78091 GIT binary patch literal 6116 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 DdDeA0 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/ge_corpo_jacket.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/WinterCoats/ge_corpo_jacket.rsi/meta.json new file mode 100644 index 00000000000..42d21c3d8ab --- /dev/null +++ b/Resources/Textures/Clothing/OuterClothing/WinterCoats/ge_corpo_jacket.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "leonardo_dabepis on discord / @leonardo-dabepis on Tumblr, Edited by heartparkyheart on Discord", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/hi_corpo_jacket.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/hi_corpo_jacket.rsi/equipped-OUTERCLOTHING.png index f18a64ab9c0c4012305f51ab70dc2710c1131824..e1f137dca37aea0a072e0ee239e01b3a91f13b5a 100644 GIT binary patch delta 4499 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 lZjWG%0D>S0f*?o~{s2YO>&z|kfSdpT002ovPDHLkV1j7No_+uT delta 4541 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 bLn~v%yfLqYE00000NkvXXu0mjfrURt= diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/hm_corpo_jacket.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/hm_corpo_jacket.rsi/equipped-OUTERCLOTHING.png index fb400585e5a6645107e6e2117da976a2b3bf5dd9..2d103cfa66729e5d5cc4a0383788456b758095c6 100644 GIT binary patch delta 5498 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 delta 5582 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 Ef|()i4FCWD delta 2184 zcmV;32zU4MFT*a7BmsJnB_MxxC94hmXBAmOBM?H%K?2Un4zm1|==Qb8a_m#&z=5(4^?fcvh=2{UHDY3N&}sK-5)*Q`KsspeCWA_-#?6}*A2o@ zL0j&hGM@Qw z_Qz+3zj_}Wo_@IT$>CI=@$$(}?bW`<)5jZ`zjo~L-bV_I*T(dNMf%R1pB=kr-{;IY z#i$KlY|o+IPI7t)6XAdATFzq)m*Ah#mvbquevQk4=DhqeT%I)(kl4BAnMdAv<(bg& z?69%YB0)>!fFj0v5mIu1k%0@Yyh)0dSvt`2gJ>;uo04icQqSdQw~n1>##G8!EaQY%c75J}E(WCuV4rXx1UfIw!Z2_vbN z(tu5;*cy*W%4aSy-Q&-0XA9&z^awOAE_N28eF(Cb7SGo%A=K58@HC4v=Fu- zMXIng5$U2bdg*_)b8lUG@7jlw7U&*pQ_-%fV_?sLl?NUkJq?T)S+Qzt&BVH?4F`R^ zI(u{R?&@RGEECc&+mzX-&av_Wl~!H6+LE;T(ls`?w#%-YciXc2);(URJ*fV4eFL@p zphgF&m?tmPFe>r{H0Y9Ik-!XyQO!VH06_+!DKNWwu9bfRxxnmFLR2upNDgdf4#a?9 zT{#i&j3;mG-jVw@ZmG3j;zr*=E(LUd0l61$X~~1z7pTq1ZGI5DqcCFdDu_PZUwu#? zk*`jh-a3D^{d=MR-GxjDw6>nRpfF=&S194|IuN%p4b=z~wle;rpgD7NvN&k3>|V~K z0Yx|+B;J2tw&`~hKDX0{W!^kzL)$X1C9YNzH{sUj)!O8~>Np4TJ|Xr4u~bJiqbpMM z@P$(@*g2812e+~aI~dH5ShF}R6lL8m~>XF&lKOFiHa` zKo6(DTP;t9NTxbG4C1cUoA^BT@PaZ$3%}Jh;7!RS+YQ$ru2J1%Cya#`}7O-(HOATK}nl}8jJPV z$DDuUnmg(fn;Xi9GoZ}V4TNP9^pY@t7J=Ss-gPM`a#ISf13E5xyd<7PQMyL|wjnR@ z$=4KPxEI^+2|uLZoia0a@$n;J-#!ODj8w~=%wa+{Ik*<}-73ofUL$OYxM(t-nzD4|Nu@Z5jB z4ak~)u?x=ychGQs<51r^03 z6t_P^&~81oCiLmcq0KLxzIYh`V^vbF&qp z_7%e-sPm0NGvEvq5ZQa9U?1=z+=zdZXGqI3=UWC*N}wbjhF}|PK{6mszDGy7VcVzA zwzSOwZf;A8aKHvQ`~l(Y0uatFKWzf%2R9;iFcrkV1{^GI$09-vJ|W@TkEIb}96lfw$B3^X+|I59LdF)=wZG?RD>Zw)j$GcZ&#F*-CkIxsYo z^a~*kG&(adR5CF-G&wpjG_xWM4FR(b4qyltdz}L600006VoOIv0RI600RN!9r<0R} z79f8C0Wk!IZF0r{00B-(L_t(o!|jwYOT$1E$Nw#X1`3W2xj@0RkRi}a*&IZK7Nm32)14X#s67Jr+_x|_t?g0vgLh+wq zhE101(Jq_idc+KyWMej~2-y@-CaP8eonC*R!f*% zV_?C5<^q6|#jNlYzDqy8xrTmxl*f5}er!k!ST9$54J~p0uQ-}aDSe&6F}wNt6hLG; z`Fgf|!ASBqG;v@m3lRMwzEzRxSZ3HHnyWaHi+i%KK%r154$c=Wk(z;b9!Avw0000< KMNUMnLSTZY-xx~( diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/zh_corpo_jacket.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/zh_corpo_jacket.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..b138d1416b77e292cf051eef49a9c7946a8b51e0 GIT binary patch literal 9578 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/zh_corpo_jacket.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/zh_corpo_jacket.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d85eeb0592b6b0649873e858d1b644dd8dcc91a6 GIT binary patch literal 6141 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 au)1IWQ9F0`NF*#jg5|W{v1CnP+ Date: Sun, 2 Jun 2024 00:37:25 +0000 Subject: [PATCH 051/155] Automatic Changelog Update (#426) --- Resources/Changelog/Changelog.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index d0b3206f26d..000caf90200 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4126,3 +4126,13 @@ Entries: message: Resprited gas tanks id: 6116 time: '2024-05-31T00:13:45.0000000+00:00' +- author: LovelyLophi + changes: + - type: Add + message: Added five new coats + - type: Add + message: Added loadouts + - type: Fix + message: Fixed the coat handhole + id: 6117 + time: '2024-06-02T00:36:59.0000000+00:00' From 8e27a833df67be6e0ef67abcbe316117d618829c Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Sun, 2 Jun 2024 01:38:16 -0400 Subject: [PATCH 052/155] Set RollForward Behavior to Patch (#424) This is apparently a more desirable behavior for global.json, as it allows servers running any version of Dotnet 8.0.1xx to automatically switch to a newer version than the base. This update was apparently required for DS14, NS14, and Syndicate Station to work properly, since Linux servers can't actually run 8.0.100, and the earliest they can use is 8.0.105(which is still a viable version). --- global.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global.json b/global.json index 2244195a209..c8526b0a8ba 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "sdk": { "version": "8.0.100", - "rollForward": "disable" + "rollForward": "patch" } } From 9de58f9f151e04cfdc70ef3a46383b76170ed94b Mon Sep 17 00:00:00 2001 From: stellar-novas Date: Sun, 2 Jun 2024 15:59:03 -0400 Subject: [PATCH 053/155] Update to nixpkgs 24.05 (#431) Nix devShell user only change, this doesn't affect normal building. --- flake.lock | 14 +++++++------- flake.nix | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/flake.lock b/flake.lock index 6ab38fa41bd..7baaa468ea5 100644 --- a/flake.lock +++ b/flake.lock @@ -5,11 +5,11 @@ "systems": "systems" }, "locked": { - "lastModified": 1705309234, - "narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=", + "lastModified": 1710146030, + "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", "owner": "numtide", "repo": "flake-utils", - "rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26", + "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", "type": "github" }, "original": { @@ -20,16 +20,16 @@ }, "nixpkgs": { "locked": { - "lastModified": 1708210246, - "narHash": "sha256-Q8L9XwrBK53fbuuIFMbjKvoV7ixfLFKLw4yV+SD28Y8=", + "lastModified": 1717352157, + "narHash": "sha256-hbBzucWOhwxt3QzeAyUojtD6/aHH81JssDfhFfmqOy0=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "69405156cffbdf2be50153f13cbdf9a0bea38e49", + "rev": "44f538ab12e2726af450877a5529f4fd88ddb0fb", "type": "github" }, "original": { "owner": "NixOS", - "ref": "release-23.11", + "ref": "release-24.05", "repo": "nixpkgs", "type": "github" } diff --git a/flake.nix b/flake.nix index e2e119eb997..095e6b017c7 100644 --- a/flake.nix +++ b/flake.nix @@ -1,7 +1,7 @@ { description = "Development environment for Space Station 14"; - inputs.nixpkgs.url = "github:NixOS/nixpkgs/release-23.11"; + inputs.nixpkgs.url = "github:NixOS/nixpkgs/release-24.05"; inputs.flake-utils.url = "github:numtide/flake-utils"; outputs = { self, nixpkgs, flake-utils }: From 47672c902d17d1c0b8e2097a0d35fa2a9f1c4e76 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 2 Jun 2024 18:39:59 -0700 Subject: [PATCH 054/155] Update Credits (#429) This is an automated Pull Request. This PR updates the GitHub contributors in the credits section. Co-authored-by: SimpleStation Changelogs Co-authored-by: Danger Revolution! <142105406+DangerRevolution@users.noreply.github.com> --- Resources/Credits/GitHub.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Credits/GitHub.txt b/Resources/Credits/GitHub.txt index db58663a2b2..8c54ecb084d 100644 --- a/Resources/Credits/GitHub.txt +++ b/Resources/Credits/GitHub.txt @@ -1 +1 @@ -0x6273, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 4dplanner, 612git, 778b, Ablankmann, Acruid, actioninja, adamsong, Admiral-Obvious-001, Adrian16199, Aerocrux, Aexxie, africalimedrop, Agoichi, Ahion, AJCM-git, AjexRose, Alekshhh, AlexMorgan3817, AlmondFlour, AlphaQwerty, Altoids1, amylizzle, ancientpower, ArchPigeon, Arendian, arimah, Arteben, AruMoon, as334, AsikKEsel, asperger-sind, aspiringLich, avghdev, AzzyIsNotHere, BananaFlambe, BasedUser, BGare, BingoJohnson-zz, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, Boaz1111, BobdaBiscuit, brainfood1183, Brandon-Huu, Bribrooo, Bright0, brndd, BubblegumBlue, BYONDFuckery, c4llv07e, CakeQ, CaptainSqrBeard, Carbonhell, Carolyn3114, casperr04, CatTheSystem, Centronias, chairbender, Charlese2, Cheackraze, cheesePizza2, Chief-Engineer, chromiumboy, Chronophylos, clement-or, Clyybber, ColdAutumnRain, Colin-Tel, collinlunn, ComicIronic, coolmankid12345, corentt, crazybrain23, creadth, CrigCrag, Crotalus, CrudeWax, CrzyPotato, Cyberboss, d34d10cc, Daemon, daerSeebaer, dahnte, dakamakat, dakimasu, DamianX, DangerRevolution, daniel-cr, Darkenson, DawBla, dch-GH, Deahaka, DEATHB4DEFEAT, DeathCamel58, deathride58, DebugOk, Decappi, deepdarkdepths, Delete69, deltanedas, DeltaV-Bot, DerbyX, DoctorBeard, DogZeroX, dontbetank, Doru991, DoubleRiceEddiedd, DrMelon, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, Duddino, Dutch-VanDerLinde, Easypoller, eclips_e, EdenTheLiznerd, EEASAS, Efruit, ElectroSR, elthundercloud, Emisse, EmoGarbage404, Endecc, enumerate0, eoineoineoin, ERORR404V1, Errant-4, estacaoespacialpirata, exincore, exp111, Fahasor, FairlySadPanda, ficcialfaint, Fildrance, FillerVK, Fishfish458, Flareguy, FluffiestFloof, FluidRock, FoLoKe, fooberticus, Fortune117, freeman2651, Fromoriss, FungiFellow, GalacticChimp, gbasood, Geekyhobo, Genkail, Git-Nivrak, github-actions[bot], gituhabu, GNF54, Golinth, GoodWheatley, Gotimanga, graevy, GreyMario, Guess-My-Name, gusxyz, h3half, Hanzdegloker, Hardly3D, harikattar, Hebiman, Henry12116, HerCoyote23, Hmeister-real, HoofedEar, hord-brayden, hubismal, Hugal31, Hyenh, iacore, IamVelcroboy, icekot8, igorsaux, ike709, Illiux, Ilya246, IlyaElDunaev, Injazz, Insineer, IntegerTempest, Interrobang01, IProduceWidgets, ItsMeThom, j-giebel, Jackal298, Jackrost, jamessimo, janekvap, JerryImMouse, Jessetriesagain, jessicamaybe, Jezithyr, jicksaw, JiimBob, JoeHammad1844, joelhed, JohnGinnane, johnku1, joshepvodka, jproads, Jrpl, juliangiebel, JustArt1m, JustCone14, JustinTether, JustinTrotter, KaiShibaa, kalane15, kalanosh, KEEYNy, Keikiru, Kelrak, kerisargit, keronshb, KIBORG04, Killerqu00, KingFroozy, kira-er, Kit0vras, KittenColony, Kmc2000, Ko4ergaPunk, komunre, koteq, Krunklehorn, Kukutis96513, kxvvv, Lamrr, LankLTE, lapatison, Leander-0, leonardo-dabepis, LetterN, Level10Cybermancer, lever1209, LightVillet, liltenhead, LittleBuilderJane, Lomcastar, LordCarve, LordEclipse, LovelyLophi, LudwigVonChesterfield, Lukasz825700516, lunarcomets, luringens, lvvova1, lzimann, lzk228, M3739, MACMAN2003, Macoron, MagnusCrowe, ManelNavola, matthst, Matz05, MehimoNemo, MeltedPixel, MemeProof, Menshin, Mervill, metalgearsloth, mhamsterr, MilenVolf, Minty642, Mirino97, mirrorcult, MishaUnity, MisterMecky, Mith-randalf, Moneyl, Moomoobeef, moony, Morb0, Mr0maks, musicmanvr, Myakot, Myctai, N3X15, Nairodian, Naive817, namespace-Memory, NickPowers43, nikthechampiongr, Nimfar11, Nirnael, nmajask, nok-ko, Nopey, notafet, notquitehadouken, noudoit, noverd, nuke-haus, NULL882, OCOtheOmega, OctoRocket, OldDanceJacket, onoira, Owai-Seek, pali6, Pangogie, patrikturi, PaulRitter, Peptide90, peptron1, Phantom-Lily, PHCodes, PixelTheKermit, PJB3005, Plykiya, pofitlo, pointer-to-null, PolterTzi, PoorMansDreams, potato1234x, ProfanedBane, PrPleGoo, ps3moira, Psychpsyo, psykzz, PuroSlavKing, quatre, QuietlyWhisper, qwerltaz, Radosvik, Radrark, Rainbeon, Rainfey, Rane, ravage123321, rbertoche, Redict, RedlineTriad, RednoWCirabrab, RemberBM, RemieRichards, RemTim, rene-descartes2021, RiceMar1244, RieBi, Rinkashikachi, Rockdtben, rolfero, rosieposieeee, Saakra, Samsterious, SaphireLattice, ScalyChimp, scrato, Scribbles0, Serkket, SethLafuente, ShadowCommander, Shadowtheprotogen546, SignalWalker, SimpleStation14, Simyon264, SirDragooon, Sirionaut, siyengar04, Skarletto, Skrauz, Skyedra, SlamBamActionman, Slava0135, Snowni, snowsignal, SonicHDC, SoulSloth, SpaceManiac, SpeltIncorrectyl, spoogemonster, ssdaniel24, Stealthbomber16, stellar-novas, StrawberryMoses, Subversionary, SweptWasTaken, Szunti, TadJohnson00, takemysoult, TaralGit, Tayrtahn, tday93, TekuNut, TemporalOroboros, tentekal, tgrkzus, thatrandomcanadianguy, TheArturZh, theashtronaut, thedraccx, themias, theomund, theOperand, TheShuEd, TimrodDX, Titian3, tkdrg, tmtmtl30, tom-leys, tomasalves8, Tomeno, tosatur, Tryded, TsjipTsjip, Tunguso4ka, TurboTrackerss14, Tyler-IN, Tyzemol, UbaserB, UKNOWH, UnicornOnLSD, Uriende, UristMcDorf, Vaaankas, Varen, VasilisThePikachu, veliebm, Veritius, Verslebas, VigersRay, Visne, VMSolidus, volundr-, Voomra, Vordenburg, vulppine, waylon531, weaversam8, Willhelm53, wixoaGit, WlarusFromDaSpace, wrexbe, xRiriq, yathxyz, Ygg01, YotaXP, YuriyKiss, zach-hill, Zandario, Zap527, ZelteHonor, zerorulez, zionnBE, zlodo, ZNixian, ZoldorfTheWizard, Zumorica, Zymem +0x6273, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 4dplanner, 612git, 778b, Ablankmann, Acruid, actioninja, adamsong, Admiral-Obvious-001, Adrian16199, Aerocrux, Aexxie, africalimedrop, Agoichi, Ahion, AJCM-git, AjexRose, Alekshhh, AlexMorgan3817, AlmondFlour, AlphaQwerty, Altoids1, amylizzle, ancientpower, ArchPigeon, Arendian, arimah, Arteben, AruMoon, as334, AsikKEsel, asperger-sind, aspiringLich, avghdev, AzzyIsNotHere, BananaFlambe, BasedUser, BGare, BingoJohnson-zz, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, Boaz1111, BobdaBiscuit, brainfood1183, Brandon-Huu, Bribrooo, Bright0, brndd, BubblegumBlue, BYONDFuckery, c4llv07e, CakeQ, CaptainSqrBeard, Carbonhell, Carolyn3114, casperr04, CatTheSystem, Centronias, chairbender, Charlese2, Cheackraze, cheesePizza2, Chief-Engineer, chromiumboy, Chronophylos, clement-or, Clyybber, ColdAutumnRain, Colin-Tel, collinlunn, ComicIronic, coolmankid12345, corentt, crazybrain23, creadth, CrigCrag, Crotalus, CrudeWax, CrzyPotato, Cyberboss, d34d10cc, Daemon, daerSeebaer, dahnte, dakamakat, dakimasu, DamianX, DangerRevolution, daniel-cr, Darkenson, DawBla, dch-GH, Deahaka, DEATHB4DEFEAT, DeathCamel58, deathride58, DebugOk, Decappi, deepdarkdepths, Delete69, deltanedas, DeltaV-Bot, DerbyX, DoctorBeard, DogZeroX, dontbetank, Doru991, DoubleRiceEddiedd, DrMelon, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, Duddino, Dutch-VanDerLinde, Easypoller, eclips_e, EdenTheLiznerd, EEASAS, Efruit, ElectroSR, elthundercloud, Emisse, EmoGarbage404, Endecc, enumerate0, eoineoineoin, ERORR404V1, Errant-4, estacaoespacialpirata, exincore, exp111, Fahasor, FairlySadPanda, ficcialfaint, Fildrance, FillerVK, Fishfish458, Flareguy, FluffiestFloof, FluidRock, FoLoKe, fooberticus, Fortune117, FoxxoTrystan, freeman2651, Fromoriss, FungiFellow, GalacticChimp, gbasood, Geekyhobo, Genkail, Git-Nivrak, github-actions[bot], gituhabu, GNF54, Golinth, GoodWheatley, Gotimanga, graevy, GreyMario, Guess-My-Name, gusxyz, h3half, Hanzdegloker, Hardly3D, harikattar, Hebiman, Henry12116, HerCoyote23, Hmeister-real, HoofedEar, hord-brayden, hubismal, Hugal31, Hyenh, iacore, IamVelcroboy, icekot8, igorsaux, ike709, Illiux, Ilya246, IlyaElDunaev, Injazz, Insineer, IntegerTempest, Interrobang01, IProduceWidgets, ItsMeThom, j-giebel, Jackal298, Jackrost, jamessimo, janekvap, JerryImMouse, Jessetriesagain, jessicamaybe, Jezithyr, jicksaw, JiimBob, JoeHammad1844, joelhed, JohnGinnane, johnku1, joshepvodka, jproads, Jrpl, juliangiebel, JustArt1m, JustCone14, JustinTether, JustinTrotter, KaiShibaa, kalane15, kalanosh, KEEYNy, Keikiru, Kelrak, kerisargit, keronshb, KIBORG04, Killerqu00, KingFroozy, kira-er, Kit0vras, KittenColony, Kmc2000, Ko4ergaPunk, komunre, koteq, Krunklehorn, Kukutis96513, kxvvv, Lamrr, LankLTE, lapatison, Leander-0, leonardo-dabepis, LetterN, Level10Cybermancer, lever1209, LightVillet, liltenhead, LittleBuilderJane, Lomcastar, LordCarve, LordEclipse, LovelyLophi, LudwigVonChesterfield, Lukasz825700516, lunarcomets, luringens, lvvova1, lzimann, lzk228, M3739, MACMAN2003, Macoron, MagnusCrowe, ManelNavola, matthst, Matz05, MehimoNemo, MeltedPixel, MemeProof, Menshin, Mervill, metalgearsloth, mhamsterr, MilenVolf, Minty642, Mirino97, mirrorcult, misandrie, MishaUnity, MisterMecky, Mith-randalf, Moneyl, Moomoobeef, moony, Morb0, Mr0maks, musicmanvr, Myakot, Myctai, N3X15, Nairodian, Naive817, namespace-Memory, NickPowers43, nikthechampiongr, Nimfar11, Nirnael, nmajask, nok-ko, Nopey, notafet, notquitehadouken, noudoit, noverd, nuke-haus, NULL882, OCOtheOmega, OctoRocket, OldDanceJacket, onoira, Owai-Seek, pali6, Pangogie, patrikturi, PaulRitter, Peptide90, peptron1, Phantom-Lily, PHCodes, PixelTheKermit, PJB3005, Plykiya, pofitlo, pointer-to-null, PolterTzi, PoorMansDreams, potato1234x, ProfanedBane, PrPleGoo, ps3moira, Psychpsyo, psykzz, PuroSlavKing, quatre, QuietlyWhisper, qwerltaz, Radosvik, Radrark, Rainbeon, Rainfey, Rane, ravage123321, rbertoche, Redict, RedlineTriad, RednoWCirabrab, RemberBM, RemieRichards, RemTim, rene-descartes2021, RiceMar1244, RieBi, Rinkashikachi, Rockdtben, rolfero, rosieposieeee, Saakra, Samsterious, SaphireLattice, ScalyChimp, scrato, Scribbles0, Serkket, SethLafuente, ShadowCommander, Shadowtheprotogen546, SignalWalker, SimpleStation14, Simyon264, SirDragooon, Sirionaut, siyengar04, Skarletto, Skrauz, Skyedra, SlamBamActionman, Slava0135, Snowni, snowsignal, SonicHDC, SoulSloth, SpaceManiac, SpeltIncorrectyl, spoogemonster, ssdaniel24, Stealthbomber16, stellar-novas, StrawberryMoses, SweptWasTaken, Szunti, TadJohnson00, takemysoult, TaralGit, Tayrtahn, tday93, TekuNut, TemporalOroboros, tentekal, tgrkzus, thatrandomcanadianguy, TheArturZh, theashtronaut, thedraccx, themias, theomund, theOperand, TheShuEd, TimrodDX, Titian3, tkdrg, tmtmtl30, tom-leys, tomasalves8, Tomeno, tosatur, Tryded, TsjipTsjip, Tunguso4ka, TurboTrackerss14, Tyler-IN, Tyzemol, UbaserB, UKNOWH, UnicornOnLSD, Uriende, UristMcDorf, Vaaankas, Varen, VasilisThePikachu, veliebm, Veritius, Verslebas, VigersRay, Visne, VMSolidus, volundr-, Voomra, Vordenburg, vulppine, waylon531, weaversam8, Willhelm53, wixoaGit, WlarusFromDaSpace, wrexbe, xRiriq, yathxyz, Ygg01, YotaXP, YuriyKiss, zach-hill, Zandario, Zap527, ZelteHonor, zerorulez, zionnBE, zlodo, ZNixian, ZoldorfTheWizard, Zumorica, Zymem From f175e199b1fbcd323d669686bb1370ac0c2c4211 Mon Sep 17 00:00:00 2001 From: FoxxoTrystan <45297731+FoxxoTrystan@users.noreply.github.com> Date: Mon, 3 Jun 2024 21:23:50 +0200 Subject: [PATCH 055/155] The Floors! (Resprites) (#417) # Description Edit/Resprite most of the floors in-game because in all honest TG Floors... currently... are extremly flat and old... even TG already has upgraded their floors... This also changed some minor edits to decals to fit, This PR is recomended paired with #402 and others updated looks PRs This bring new floors sprites from baystation, paradise station. --- # TODO - [x] Import Sprites - [x] @VMSolidus Edits ---

Media

![image](https://github.com/Simple-Station/Einstein-Engines/assets/45297731/01a4351c-b72a-446f-9db5-ca50f63f140e) ![image](https://github.com/Simple-Station/Einstein-Engines/assets/45297731/bde02ff6-38d9-49a5-8594-a53e005a4075) ![image](https://github.com/Simple-Station/Einstein-Engines/assets/45297731/9e4b508e-9512-481b-8e7e-a2f500a6375c) ![image](https://github.com/Simple-Station/Einstein-Engines/assets/45297731/34634648-c489-4581-8d5f-ee088744255d) ![image](https://github.com/Simple-Station/Einstein-Engines/assets/45297731/4e0b666c-ba84-4c5b-ae63-ee2af3c44b96)

--- # Changelog :cl: - tweak: Floors Looks Updated/Resprited. --------- Co-authored-by: VMSolidus --- Resources/Prototypes/Tiles/floors.yml | 46 +----------------- .../Decals/bricktile.rsi/dark_box.png | Bin 417 -> 4791 bytes .../Decals/bricktile.rsi/dark_corner_ne.png | Bin 354 -> 4242 bytes .../Decals/bricktile.rsi/dark_corner_nw.png | Bin 325 -> 4244 bytes .../Decals/bricktile.rsi/dark_corner_se.png | Bin 351 -> 4247 bytes .../Decals/bricktile.rsi/dark_corner_sw.png | Bin 320 -> 4249 bytes .../Decals/bricktile.rsi/dark_end_e.png | Bin 407 -> 4748 bytes .../Decals/bricktile.rsi/dark_end_n.png | Bin 387 -> 4741 bytes .../Decals/bricktile.rsi/dark_end_s.png | Bin 395 -> 4258 bytes .../Decals/bricktile.rsi/dark_end_w.png | Bin 384 -> 4493 bytes .../Decals/bricktile.rsi/dark_inner_ne.png | Bin 222 -> 4491 bytes .../Decals/bricktile.rsi/dark_inner_nw.png | Bin 218 -> 4477 bytes .../Decals/bricktile.rsi/dark_inner_se.png | Bin 213 -> 4232 bytes .../Decals/bricktile.rsi/dark_inner_sw.png | Bin 235 -> 4478 bytes .../Decals/bricktile.rsi/dark_line_e.png | Bin 297 -> 4231 bytes .../Decals/bricktile.rsi/dark_line_n.png | Bin 256 -> 4230 bytes .../Decals/bricktile.rsi/dark_line_s.png | Bin 269 -> 4230 bytes .../Decals/bricktile.rsi/dark_line_w.png | Bin 256 -> 4477 bytes .../Textures/Decals/bricktile.rsi/meta.json | 2 +- .../Decals/bricktile.rsi/steel_box.png | Bin 456 -> 4854 bytes .../Decals/bricktile.rsi/steel_corner_ne.png | Bin 373 -> 4351 bytes .../Decals/bricktile.rsi/steel_corner_nw.png | Bin 343 -> 4340 bytes .../Decals/bricktile.rsi/steel_corner_se.png | Bin 367 -> 4341 bytes .../Decals/bricktile.rsi/steel_corner_sw.png | Bin 338 -> 4346 bytes .../Decals/bricktile.rsi/steel_end_e.png | Bin 430 -> 4377 bytes .../Decals/bricktile.rsi/steel_end_n.png | Bin 428 -> 4352 bytes .../Decals/bricktile.rsi/steel_end_s.png | Bin 414 -> 4365 bytes .../Decals/bricktile.rsi/steel_end_w.png | Bin 412 -> 4367 bytes .../Decals/bricktile.rsi/steel_inner_ne.png | Bin 234 -> 4270 bytes .../Decals/bricktile.rsi/steel_inner_nw.png | Bin 226 -> 4274 bytes .../Decals/bricktile.rsi/steel_inner_se.png | Bin 220 -> 4273 bytes .../Decals/bricktile.rsi/steel_inner_sw.png | Bin 241 -> 4421 bytes .../Decals/bricktile.rsi/steel_line_e.png | Bin 306 -> 4253 bytes .../Decals/bricktile.rsi/steel_line_n.png | Bin 270 -> 4317 bytes .../Decals/bricktile.rsi/steel_line_s.png | Bin 277 -> 1621 bytes .../Decals/bricktile.rsi/steel_line_w.png | Bin 263 -> 4292 bytes .../Decals/bricktile.rsi/white_box.png | Bin 444 -> 4305 bytes .../Decals/bricktile.rsi/white_corner_ne.png | Bin 367 -> 4283 bytes .../Decals/bricktile.rsi/white_corner_nw.png | Bin 337 -> 4285 bytes .../Decals/bricktile.rsi/white_corner_se.png | Bin 361 -> 4247 bytes .../Decals/bricktile.rsi/white_corner_sw.png | Bin 334 -> 4290 bytes .../Decals/bricktile.rsi/white_end_e.png | Bin 418 -> 4301 bytes .../Decals/bricktile.rsi/white_end_n.png | Bin 404 -> 4294 bytes .../Decals/bricktile.rsi/white_end_s.png | Bin 409 -> 4299 bytes .../Decals/bricktile.rsi/white_end_w.png | Bin 401 -> 4290 bytes .../Decals/bricktile.rsi/white_inner_ne.png | Bin 230 -> 1914 bytes .../Decals/bricktile.rsi/white_inner_nw.png | Bin 226 -> 4272 bytes .../Decals/bricktile.rsi/white_inner_se.png | Bin 220 -> 4273 bytes .../Decals/bricktile.rsi/white_inner_sw.png | Bin 241 -> 4494 bytes .../Decals/bricktile.rsi/white_line_e.png | Bin 306 -> 4272 bytes .../Decals/bricktile.rsi/white_line_n.png | Bin 270 -> 4271 bytes .../Decals/bricktile.rsi/white_line_s.png | Bin 272 -> 4271 bytes .../Decals/bricktile.rsi/white_line_w.png | Bin 256 -> 4274 bytes .../Textures/Decals/minitile.rsi/dark_box.png | Bin 394 -> 5238 bytes .../Decals/minitile.rsi/dark_corner_ne.png | Bin 363 -> 5199 bytes .../Decals/minitile.rsi/dark_corner_nw.png | Bin 343 -> 5088 bytes .../Decals/minitile.rsi/dark_corner_se.png | Bin 331 -> 5238 bytes .../Decals/minitile.rsi/dark_corner_sw.png | Bin 315 -> 5132 bytes .../Decals/minitile.rsi/dark_end_e.png | Bin 404 -> 5242 bytes .../Decals/minitile.rsi/dark_end_n.png | Bin 373 -> 5188 bytes .../Decals/minitile.rsi/dark_end_s.png | Bin 354 -> 5241 bytes .../Decals/minitile.rsi/dark_end_w.png | Bin 405 -> 5159 bytes .../Decals/minitile.rsi/dark_inner_ne.png | Bin 229 -> 4962 bytes .../Decals/minitile.rsi/dark_inner_nw.png | Bin 225 -> 4892 bytes .../Decals/minitile.rsi/dark_inner_se.png | Bin 220 -> 4999 bytes .../Decals/minitile.rsi/dark_inner_sw.png | Bin 236 -> 4941 bytes .../Decals/minitile.rsi/dark_line_e.png | Bin 283 -> 5134 bytes .../Decals/minitile.rsi/dark_line_n.png | Bin 280 -> 4938 bytes .../Decals/minitile.rsi/dark_line_s.png | Bin 267 -> 4996 bytes .../Decals/minitile.rsi/dark_line_w.png | Bin 263 -> 5013 bytes .../Textures/Decals/minitile.rsi/meta.json | 2 +- .../Decals/minitile.rsi/steel_box.png | Bin 425 -> 5312 bytes .../Decals/minitile.rsi/steel_corner_ne.png | Bin 368 -> 5223 bytes .../Decals/minitile.rsi/steel_corner_nw.png | Bin 352 -> 5225 bytes .../Decals/minitile.rsi/steel_corner_se.png | Bin 336 -> 5265 bytes .../Decals/minitile.rsi/steel_corner_sw.png | Bin 317 -> 5258 bytes .../Decals/minitile.rsi/steel_end_e.png | Bin 409 -> 5291 bytes .../Decals/minitile.rsi/steel_end_n.png | Bin 378 -> 5255 bytes .../Decals/minitile.rsi/steel_end_s.png | Bin 359 -> 5293 bytes .../Decals/minitile.rsi/steel_end_w.png | Bin 397 -> 5280 bytes .../Decals/minitile.rsi/steel_inner_ne.png | Bin 234 -> 4961 bytes .../Decals/minitile.rsi/steel_inner_nw.png | Bin 226 -> 4952 bytes .../Decals/minitile.rsi/steel_inner_se.png | Bin 220 -> 4992 bytes .../Decals/minitile.rsi/steel_inner_sw.png | Bin 241 -> 4973 bytes .../Decals/minitile.rsi/steel_line_e.png | Bin 287 -> 5109 bytes .../Decals/minitile.rsi/steel_line_n.png | Bin 285 -> 5050 bytes .../Decals/minitile.rsi/steel_line_s.png | Bin 267 -> 5099 bytes .../Decals/minitile.rsi/steel_line_w.png | Bin 267 -> 5083 bytes .../Decals/minitile.rsi/white_box.png | Bin 394 -> 5307 bytes .../Decals/minitile.rsi/white_corner_ne.png | Bin 363 -> 5198 bytes .../Decals/minitile.rsi/white_corner_nw.png | Bin 347 -> 5242 bytes .../Decals/minitile.rsi/white_corner_se.png | Bin 331 -> 5238 bytes .../Decals/minitile.rsi/white_corner_sw.png | Bin 317 -> 5281 bytes .../Decals/minitile.rsi/white_end_e.png | Bin 404 -> 5257 bytes .../Decals/minitile.rsi/white_end_n.png | Bin 373 -> 5250 bytes .../Decals/minitile.rsi/white_end_s.png | Bin 354 -> 5297 bytes .../Decals/minitile.rsi/white_end_w.png | Bin 392 -> 5303 bytes .../Decals/minitile.rsi/white_inner_ne.png | Bin 229 -> 4936 bytes .../Decals/minitile.rsi/white_inner_nw.png | Bin 226 -> 4941 bytes .../Decals/minitile.rsi/white_inner_se.png | Bin 220 -> 4960 bytes .../Decals/minitile.rsi/white_inner_sw.png | Bin 236 -> 4983 bytes .../Decals/minitile.rsi/white_line_e.png | Bin 282 -> 5045 bytes .../Decals/minitile.rsi/white_line_n.png | Bin 313 -> 5043 bytes .../Decals/minitile.rsi/white_line_s.png | Bin 314 -> 5092 bytes .../Decals/minitile.rsi/white_line_w.png | Bin 267 -> 5132 bytes Resources/Textures/Tiles/arcadeblue2.png | Bin 546 -> 698 bytes Resources/Textures/Tiles/attributions.yml | 45 +++++++++-------- Resources/Textures/Tiles/bar.png | Bin 1614 -> 1583 bytes Resources/Textures/Tiles/blue_circuit.png | Bin 360 -> 508 bytes Resources/Textures/Tiles/cafeteria.png | Bin 1328 -> 204 bytes Resources/Textures/Tiles/checker_dark.png | Bin 1334 -> 204 bytes Resources/Textures/Tiles/clown.png | Bin 851 -> 185 bytes Resources/Textures/Tiles/dark.png | Bin 1129 -> 536 bytes Resources/Textures/Tiles/dark_diagonal.png | Bin 470 -> 4304 bytes .../Textures/Tiles/dark_diagonal_mini.png | Bin 281 -> 4282 bytes Resources/Textures/Tiles/dark_herringbone.png | Bin 624 -> 4316 bytes Resources/Textures/Tiles/dark_mini.png | Bin 302 -> 1962 bytes Resources/Textures/Tiles/dark_mono.png | Bin 536 -> 4245 bytes Resources/Textures/Tiles/dark_offset.png | Bin 439 -> 4251 bytes Resources/Textures/Tiles/dark_pavement.png | Bin 667 -> 4273 bytes .../Textures/Tiles/dark_pavement_vertical.png | Bin 828 -> 4477 bytes Resources/Textures/Tiles/dark_plastic.png | Bin 471 -> 4283 bytes Resources/Textures/Tiles/glass.png | Bin 2350 -> 5977 bytes Resources/Textures/Tiles/green_circuit.png | Bin 360 -> 633 bytes Resources/Textures/Tiles/hydro.png | Bin 445 -> 161 bytes Resources/Textures/Tiles/kitchen.png | Bin 477 -> 185 bytes Resources/Textures/Tiles/laundry.png | Bin 843 -> 185 bytes Resources/Textures/Tiles/lime.png | Bin 952 -> 178 bytes Resources/Textures/Tiles/mime.png | Bin 845 -> 179 bytes Resources/Textures/Tiles/plastic.png | Bin 564 -> 4283 bytes Resources/Textures/Tiles/plating.png | Bin 352 -> 183 bytes Resources/Textures/Tiles/plating_burnt.png | Bin 1565 -> 1407 bytes Resources/Textures/Tiles/red_circuit.png | Bin 0 -> 702 bytes Resources/Textures/Tiles/rglass.png | Bin 3158 -> 6911 bytes Resources/Textures/Tiles/shuttleblack.png | Bin 1768 -> 506 bytes Resources/Textures/Tiles/shuttleblue.png | Bin 767 -> 463 bytes Resources/Textures/Tiles/shuttlegrey.png | Bin 724 -> 393 bytes Resources/Textures/Tiles/shuttleorange.png | Bin 767 -> 414 bytes Resources/Textures/Tiles/shuttlepurple.png | Bin 751 -> 473 bytes Resources/Textures/Tiles/shuttlered.png | Bin 2109 -> 556 bytes Resources/Textures/Tiles/shuttlewhite.png | Bin 704 -> 421 bytes Resources/Textures/Tiles/steel.png | Bin 952 -> 1927 bytes Resources/Textures/Tiles/steel_diagonal.png | Bin 501 -> 4304 bytes .../Textures/Tiles/steel_diagonal_mini.png | Bin 300 -> 4272 bytes Resources/Textures/Tiles/steel_dirty.png | Bin 1257 -> 979 bytes .../Textures/Tiles/steel_herringbone.png | Bin 677 -> 4380 bytes Resources/Textures/Tiles/steel_mini.png | Bin 321 -> 1962 bytes Resources/Textures/Tiles/steel_mono.png | Bin 547 -> 4299 bytes Resources/Textures/Tiles/steel_offset.png | Bin 452 -> 4251 bytes Resources/Textures/Tiles/steel_pavement.png | Bin 697 -> 4232 bytes .../Tiles/steel_pavement_vertical.png | Bin 768 -> 4721 bytes Resources/Textures/Tiles/white.png | Bin 1129 -> 536 bytes Resources/Textures/Tiles/white_diagonal.png | Bin 470 -> 4304 bytes .../Textures/Tiles/white_diagonal_mini.png | Bin 281 -> 4272 bytes .../Textures/Tiles/white_herringbone.png | Bin 641 -> 4275 bytes Resources/Textures/Tiles/white_mini.png | Bin 315 -> 1962 bytes Resources/Textures/Tiles/white_mono.png | Bin 536 -> 4290 bytes Resources/Textures/Tiles/white_offset.png | Bin 439 -> 4210 bytes Resources/Textures/Tiles/white_pavement.png | Bin 670 -> 4273 bytes .../Tiles/white_pavement_vertical.png | Bin 842 -> 4664 bytes Resources/Textures/Tiles/white_plastic.png | Bin 515 -> 4286 bytes 161 files changed, 29 insertions(+), 66 deletions(-) create mode 100644 Resources/Textures/Tiles/red_circuit.png diff --git a/Resources/Prototypes/Tiles/floors.yml b/Resources/Prototypes/Tiles/floors.yml index 59fa88be2b2..b5ca240d5ca 100644 --- a/Resources/Prototypes/Tiles/floors.yml +++ b/Resources/Prototypes/Tiles/floors.yml @@ -201,7 +201,7 @@ collection: FootstepHull itemDrop: FloorTileItemBrassFilled heatCapacity: 10000 - + - type: tile id: FloorBrassReebe name: tiles-brass-floor-reebe @@ -1207,12 +1207,6 @@ id: FloorShuttleWhite name: tiles-white-shuttle-floor sprite: /Textures/Tiles/shuttlewhite.png - variants: 4 - placementVariants: - - 1.0 - - 1.0 - - 1.0 - - 1.0 baseTurf: Plating isSubfloor: false deconstructTools: [ Prying ] @@ -1225,12 +1219,6 @@ id: FloorShuttleGrey name: tiles-grey-shuttle-floor sprite: /Textures/Tiles/shuttlegrey.png - variants: 4 - placementVariants: - - 1.0 - - 1.0 - - 1.0 - - 1.0 baseTurf: Plating isSubfloor: false deconstructTools: [ Prying ] @@ -1243,12 +1231,6 @@ id: FloorShuttleBlack name: tiles-black-shuttle-floor sprite: /Textures/Tiles/shuttleblack.png - variants: 4 - placementVariants: - - 1.0 - - 1.0 - - 1.0 - - 1.0 baseTurf: Plating isSubfloor: false deconstructTools: [ Prying ] @@ -1261,12 +1243,6 @@ id: FloorShuttleBlue name: tiles-blue-shuttle-floor sprite: /Textures/Tiles/shuttleblue.png - variants: 4 - placementVariants: - - 1.0 - - 1.0 - - 1.0 - - 1.0 baseTurf: Plating isSubfloor: false deconstructTools: [ Prying ] @@ -1279,12 +1255,6 @@ id: FloorShuttleOrange name: tiles-orange-shuttle-floor sprite: /Textures/Tiles/shuttleorange.png - variants: 4 - placementVariants: - - 1.0 - - 1.0 - - 1.0 - - 1.0 baseTurf: Plating isSubfloor: false deconstructTools: [ Prying ] @@ -1297,12 +1267,6 @@ id: FloorShuttlePurple name: tiles-purple-shuttle-floor sprite: /Textures/Tiles/shuttlepurple.png - variants: 4 - placementVariants: - - 1.0 - - 1.0 - - 1.0 - - 1.0 baseTurf: Plating isSubfloor: false deconstructTools: [ Prying ] @@ -1315,12 +1279,6 @@ id: FloorShuttleRed name: tiles-red-shuttle-floor sprite: /Textures/Tiles/shuttlered.png - variants: 4 - placementVariants: - - 1.0 - - 1.0 - - 1.0 - - 1.0 baseTurf: Plating isSubfloor: false deconstructTools: [ Prying ] @@ -1940,4 +1898,4 @@ barestepSounds: collection: BarestepWood itemDrop: FloorTileItemWoodLarge - heatCapacity: 10000 \ No newline at end of file + heatCapacity: 10000 diff --git a/Resources/Textures/Decals/bricktile.rsi/dark_box.png b/Resources/Textures/Decals/bricktile.rsi/dark_box.png index 153e7d3cfce199ac5433c14a92d39b415453e786..d9b23d56766cc0e57537e7ef03a3582cb65e294d 100644 GIT binary patch literal 4791 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 CuI;4& delta 327 zcmbQF_=stONGZx^prw85kH?(j9#r85lP9bN@+X1@ff>d_r8EoSYOD72Vz3 zTwPoo9Ua|VUG41bY;A3U@_XcuGyo~ik|4j}|4_gX>|Y@S5-jkDEM{QfI}E~%$MaXD z00nn@x;Tbd_%EG&o9~DMhs)8|_5c2hzvsE2<{eg3;NyE#x#!k2g_Zj!1x01;OBRVzopr00&=txc~qF diff --git a/Resources/Textures/Decals/bricktile.rsi/dark_corner_nw.png b/Resources/Textures/Decals/bricktile.rsi/dark_corner_nw.png index 7f28df096187a10c2b41ef8d847ccfdbe886892c..d249245bd4eddcd5f71b7270d3896e6b969b533d 100644 GIT binary patch literal 4244 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 F{vWo?>7@Vw delta 298 zcmbQDc$8^^NGZx^prw85kH?(j9#r85lP9bN@+X1@c7$d_r8EoSYOD72Vz3 zTwPoo9Ua|VU4b$Wt8WJbDfW^ezu^C1z#!$#>;@F#EbxddW?^UdveH!FXpUb#Xw=`8q5Wk&mCR@R!-PgaYul&bj5$w#mriXEhXbexnssrb* rGAfJfKH$H={DghN>4gm6_c1IL64>={#hE^!n;AS^{an^LB{Ts5sA6zL diff --git a/Resources/Textures/Decals/bricktile.rsi/dark_corner_se.png b/Resources/Textures/Decals/bricktile.rsi/dark_corner_se.png index 2cb5db32d35bbda4d249acea530f90ccb6f5df68..c608bd12e03d3a1e3ad4149f65a61d4db65b7a54 100644 GIT binary patch literal 4247 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 O7(8A5T-G@yGywqcfPMP_ diff --git a/Resources/Textures/Decals/bricktile.rsi/dark_corner_sw.png b/Resources/Textures/Decals/bricktile.rsi/dark_corner_sw.png index f4d9633ba273d80daa4ec733d86c138000f17e86..7d47c299ba6ef2b4305a2d6d034dc3bc91bf4ae5 100644 GIT binary patch literal 4249 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 Jm+kR7{$Haz>zx1q delta 293 zcmbQKcz|hwNGZx^prw85kH?(j9#r85lP9bN@+X1@a{Vd_r8EoSYOD6}+jqfs!p|fu=x;qa?^L_&)?N+-u$&2^8Zj@Q5sCVBk9p!i>lBSEK+1 z=X$z0hFJLDo#e=OSb>Ly_r{n1_V4P~MQ-iV@>z1ns$He+ppKH-t?cGVf33s@FOS8y z4!Ozi6_I#2(_yjL0-2WNHs|)_6NSntm66?hFSNXpzp~&~Q~QtE{}b6+HJ&*!%ZJUK zec+X>lZ#J7c+2tzPbp4To}JH~YJwk>rnB29`1np*f56OSU6Xf&?ljkfk~2Ts1@AZ@ jH{py%!0R2-QPs>_eh97ManY@NP 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 delta 380 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 delta 360 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 JtaD0e0szPKlq>)M diff --git a/Resources/Textures/Decals/bricktile.rsi/dark_end_w.png b/Resources/Textures/Decals/bricktile.rsi/dark_end_w.png index b010ef23997674afea7d83439712745f22898b42..dcb96039e9db7f84548d7f3d1712b5268ccc81a7 100644 GIT binary patch literal 4493 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 diff --git a/Resources/Textures/Decals/bricktile.rsi/dark_inner_ne.png b/Resources/Textures/Decals/bricktile.rsi/dark_inner_ne.png index 08f219869f02dd498d71087e8ea56679208cf741..7a9da46b878a4b09b9d16267bbf0cadc76d975a2 100644 GIT binary patch literal 4491 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 H?LGWok>oF2 delta 205 zcmeBHzQ;I0vYw5BfuXpn>I;x!EDmyaVpw-h<|UBBlJ4m1$iT3%pZiZDE0E7w;1OBO zz`%DHgc*frs^iQe2CR`n!55OZILDUrs5WbyuG5U(&Ma zL#Bbr#Nxj1x!HGLa5PTaHot48=F>k{W(MglbQ4mT?zDQVGv`zW+nH|uwhe~w^Os9G y#Qi_b^3MC|*V?O_clkZq`&=UVHPAXB*e4KM@KEzuB%cfqi0kR<=d#Wzp$Pz2>Pznc diff --git a/Resources/Textures/Decals/bricktile.rsi/dark_inner_nw.png b/Resources/Textures/Decals/bricktile.rsi/dark_inner_nw.png index d716a81e8319080e908275c88ff9e3d22fd71984..d0ccf15f35393ecba904416a35536767dfb0b8c9 100644 GIT binary patch literal 4477 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 M3HIjYJG_tl7v4xNfdBvi delta 201 zcmeyXbc=CeDe5=|WS6-mq44$rjF6*2UngCcBPA>oe diff --git a/Resources/Textures/Decals/bricktile.rsi/dark_inner_se.png b/Resources/Textures/Decals/bricktile.rsi/dark_inner_se.png index fc60f8969822474fce58fcd81dbe08cef94d1a37..70b3944d6c6d42ff0932557c5809eb1c4842e839 100644 GIT binary patch literal 4232 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 delta 185 zcmeBByvjI1rJk`k$lZxy-8q?;3=9k`>5jgR3=A9lx&I`x0{KD#J|V8!+S-bWicU^W zwzjs8jzDRK+eg%@ffQRwkYDhB5MbE6f60EJ2xoyuWHAE+-(e7DJf6QI1t@6c>Eak- z;s5rWAs>SRhjU=p*MH$=5#fmi#(#dQ8m&FMh;3ElFKG!sbB1tEiQPOCO41h0N#Jy{ dnGFNM%1 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 diff --git a/Resources/Textures/Decals/bricktile.rsi/dark_line_e.png b/Resources/Textures/Decals/bricktile.rsi/dark_line_e.png index 99cb16a6ad86009b2a7bf569127ed6185b83efaf..f2f3b75fd8f043c708099afb7ffcaed54fa6ba53 100644 GIT binary patch literal 4231 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 delta 270 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 delta 228 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 delta 241 zcmZou>}8suQqNc%jC67SAu1SI+s`pQxKq%aUWgYFgx4 z?S{=Br}7p(;<3Ilcr=#KzXEa(iKIaTc;5i|*;+)D?Mic$Q h`%32{81EVHX2^{ci&-t)xEg3JgQu&X%Q~loCIGdzT*&|c diff --git a/Resources/Textures/Decals/bricktile.rsi/dark_line_w.png b/Resources/Textures/Decals/bricktile.rsi/dark_line_w.png index bfae586a073c539c5c4cc8928e2550f7671ccd8c..1bd29e14973953767bfe2ae14f38c72b99d13c07 100644 GIT binary patch literal 4477 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 delta 346 zcmeyb_?2mbNGZx^prw85kH?(j9#r85lP9bN@+X1@aXGd_r6s8ylS*9eaCv zI@{V>T3YJs>$^LF%(j}Enu>}FpsL)M{bE3hyCldj_&*#lc=WDUTcYd4tI;lrt=d1#7H=rZYrOkZcgOAEUmh*z zbKMeE{g|H%wu)vmemgXyxNjoopQ9;+QA)+Y{Q7Pc#SQ&tv{ywX$Kh igs$KW!8fe#Us-=ANxofd$+ivXCk9VfKbLh*2~7a!(U8ml diff --git a/Resources/Textures/Decals/bricktile.rsi/steel_corner_nw.png b/Resources/Textures/Decals/bricktile.rsi/steel_corner_nw.png index 9601a55f50d42cae220d05306cd3bffd26bf48c9..86fa0e9e007dcbea205ab665402f92d320c8d747 100644 GIT binary patch literal 4340 zcmbtX2{=^k+dr19Wofe&V~T9EYnW+NVl3I2gra6MCd^E;Swl&vlqDovwg}mJDHYlz zC0ml-7NL46A-tkdzC+8^dtLAMeb@K@&NXMA=iJZl{@u%SKlgP`ytAYA3ORK-0036l z+E}`RBV_TGkpTZK3y>X`{VBLS?o4N&2D#6z*lsCccFZ=i#3f!8*&`wqU? zZSa_LYu7QrTeWf-e|;MKWzV1I%s;=O6>%iR?*O`n8Lf=R-rcT`Gj6N{){f76 zq6h!%CKBt6YwP|nHpZa8mO3v8rr0}QJST>#&DJxNE-jq+SUKOV4(xA>KX7^K1gt_X zsvQR0e<`9oHU**zOW5n5HeFM6ARyw!&95a?A9Qz5Q%=8wUa2yz_|+-4DX+4Tv2p9z z>B&xS+$VeT@hEtOh9OMH;eIir5aYS-+CXmXtd{gQfu@vsRy~Ga>|e{QM30#0lRS)35f_9 zFi1JUTNpR_%D7cDs1uzzfos>%JKDZ-5~K3@ZpX^=Vq!Mp28q%Swyz%sEcQ#4N5MFf zteYCM(Mn3P?h)V)gZbw zFSJDMizZ$+JGNqbbf>r9@^i-`Vqe{ou|IOLYGwH{jXTRhdxtGv@8XExkZO;Sf4!cg z^8(O{+46d7V)HDPAh#|0FQq6YW%c~ys?gllD*Zm)%@{EBn@p0o{Z0!TL9J zUrCLhW(@Hrie|0CO}^nH#GAG!>iVr3mC-)B@wV;`oxD^|(nQomvdzX)!Ijs& zn(4-j93hRY9NEylyRev6h4w_eUY{??3@ZL#(n1&M~w>&d-DId%amob&gfjSJC@e= z5SGe2GjxAVYi;Yxw6IN1=|L$@Y5h9=`U}otMdyo^N)n5z_6_9UZgYL_`n;&Th-h~j z(NHX7_+DR1zhW1mq_5JnxUl?9-kAzg5#O9?m2qLTB&%?5MYvUnS4=*o^7bzM-MF&J zGjO}0{Nhf-k%no{UBq2ZyYdb+ypMW+YpUMI zST$o?UuuL_<;3{p`y{*)9P;RQ%`IzkitGde_Xpm@_#stM8`bb?zUph#?fP#Z+;YVGNs#(+fTaJ^W3=qkLS}t7&A#oc_>g~inn~D3_!~OU+>utirmXAH7XN7+Y3ugEt50S)7fkLT*eXLY$%c=LL z0$OxiY&UrqZ!9iw?8tV=nrr{qJ_X0ZKkRL&6=_d`w~1hx$cweBqd~X*rU)rA(c~Oe{0W4ibx{D%#*3NBBAJ3#H)zwUp31+ z_uksmHKI7*Fdrn^w!BlpW7Px|qKkx7=}y=tGM#;#_aSvmb!TlRJ}CW_*qtcK!{^=Z z%t5wR4OhLZn&Uj3sF~=J8Hy7qKZUM=)+c$p^p#YVTqvneWf^`h&x)&ygP+v&DQYkX zdy@J@uFTCn_f*nJ^1ZA$V#~1>&GE#UnQERF>^gr=5!5>K3LZA zv54#2tPzZ`c3MT)*cE>le^39gNzxSdZNep<*X|}wFRd$$jOZ`Nj;vUvVTRRwW!ZP; z#z=8^%6!fI?#w$TK`MG{0*qAq2dj&Uobwa+nbtfJ`oF~XV8`kXe|-16tS-`sqT&t1 z>R0GR?7MAH|0Q9>B(*>MPvs`+`JNj7f@7QGtM&nJh3g9Gw&`!v62@nqzjSd#APgdF zH~Ds?9;dGngvo}*gjpLNGQ3`DTq<;LsB|oE^d8##*uBi-dV?@RE3CgWqUGx)!A?Q5 zU|fNt_~PQ{l5xMz10|+$xU(S>wp0&l|CN*M%*@s2j%RLNH@IHiY#smVm1m{(b8&-7 z-D|HB`_PAszYHgg?``^UU~|AFc0uhLEs2(+EjbZdqOTJNbBD|}sc!O$?3~Z5%kK8+ z5fi-Ow+VHHr-Ve|ik#`K&mIRpfBCJT>vXK+#hg+cEbQ9!@&Wr>8BPpdM|-y2HWS{~ zf%#x3`;M>j$||hCrDhcNPS*#|C5wvW4>=xUAf9_~6*Rwl&{}q~Ec>ZZrC@r`^pyqL zCpS^l+wCoavJc)SkWf5uQ|gL*-67mU0X)CxCOb5 zHC{~*VGn$}Cp|1pR4meTC%A_9Ok5u82rNh|C~n!?@Pf(tW$yNoa_Xb%tt;L3A=*?Lk|KGtu%W>I>k~mK@}A?>qYHiIq^`K}>LPDiVz}rl5@= zXe1hgK%x;y91MxYqp^6DG33Vu1?@o~1TM`N?`moF!yfo#2KD3fId}vjC@2UXgn_fU z3yOhNYo!Fk@3=W0)|WLZ?z_G#bhT_fy}JO%*Iw$4`CQ|54wG%LLCUIp9C$SvpONM~kpjU3eQN58U^V zU*aEU#EpLNH_;Da028uQWOy=l@$i^Isf$%Zr$K*+ng4NezS9Qz(LvJxp=7?pcx+#O z5SdFiXMlGZx^prw85kH?(j9#r85lP9bN@+X1@ff>d_r6s8ylS*9eaCv zI@{V>T3YJs>$^KUn;RN{@?5*atAG?|NswRge<)xG_OB2E2^M%n7BevL9R^{>(A3d0%qH7tIg8g@S8Gf0-;JR($HSy*6s;I5Ln{DIF?7z%a- z+az;6_@tZqMx^0ngtTQs!HFNaPA=G>qnDsYRr@~-U!Ee5f@yO!0T{b`!s zFf~i&LJx0%RYkq2!}Eah5CPKz@{5>a>=|zINhhq8-n3aPh$H+|2hjBlp00i_>zopr E01%jZ-~a#s diff --git a/Resources/Textures/Decals/bricktile.rsi/steel_corner_se.png b/Resources/Textures/Decals/bricktile.rsi/steel_corner_se.png index 134997a61124debf52a5a5e812ca21acebc6746c..203dce3f83b504d06118be5758a1b18ccbdaff29 100644 GIT binary patch literal 4341 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 hc(n(K&`U7q@G)n{ delta 340 zcmeyW_?~HkNGZx^prw85kH?(j9#r85lP9bN@+X1@aXGd_r8E936Xmdg|-z z8yg#2T3R~W+PXVCYiepLDk_>98-c2HHiTLNDejUWzu^CHz~JT2_z5V?S>O>_%)r2R z7=#&*=dVZs3LfxuaSXBW@10zKTc}ws@mB+b(CF0->iyQF=Ca+>+dM>2AaCQ9|N1abk7HwX-()Zbm z{YL^BFIxMDKd^tnI$_%ieXb9)^cA=t@RUv3&aJ^7BfR6%0#V22m7;-@Ya|$Vmu}3` eN!$~dEx-S%)bTwLXR3g{VeoYIb6Mw<&;$SpLx=GI diff --git a/Resources/Textures/Decals/bricktile.rsi/steel_corner_sw.png b/Resources/Textures/Decals/bricktile.rsi/steel_corner_sw.png index bb107cb037e01d6903abe78fd68388f6f88272e3..9eb1cfc533fe8e7801bc396b20c9b64b41448240 100644 GIT binary patch literal 4346 zcmbtX2{@G9+kfm!WlPz@m=H0G84V^vj3qmhrBGvLj0rQ-EcQ?min3(OmMv?xUJ9X7 zNy(O^mlCR%vV~Vk<$GwkdavvKzVG_}-*a8(Ip^HxcmMAD+~+>`^*nL*w&q)eWrYC% z*kWm6>In9b^(M#zzD179XV-%c>J^NF+DATA^DGy z+>U2nHs1pJLsL9)gbbOZYCIxn?OLS*ZgHIHC8&k{-N-(BWoOe`F-d%lfU=;PmNX8p zNjDojS56V^DQb2MEB0ZhoiYxKq*7+#?>?!di2lg}&$)#{K zQXQ~%HfuUk6Dlay`RH+Ut`d{`2rt)si0e&m#*-x~8|Zig&A;vG}7nJwno!eXE*vg&EJw^c!OD>6Kh_dhRv5?L&jL zlKI`(>ex-_#%xXTQHff!v&dA9ah>rYya<{HkhJuZVz|aZG2&WriW0A(<8Odh7D7jk zkGN>QB5k^x&a|}Z8Dnjg;A6|D!CwsgdCB?Tm%ANM)yV9mJn`sve3E%{2e5ta ziyLbE&wd=PLA$=;4{dEU>T9|E8fTGyU}P8zSVmkYlZaIPe@33 z@YwE@bF8&Fov)PJ#p5bbS@U|`Dr%>@B^J<9AMf@^T;}4k;NG1m@X$zp5->T+Ul|Ew z@X~I{eTotj6LRL+Zoyj?DOzWwFvKfttTiOG9C^%MK-L)T!`ETFOP8-Z%IcNu4K7;L z>QPDSNXpUeH~BY-@e-6!rYB!3ZL`?gAJYZlCy6#1x7v$I3fK!ed_E7PLN9RwGf#C)d6iw0F|v)j#T2hE2sxAcln z^0K!#iFur)?Y~}#D4-Ya>aEt2-n^wSq4rLY7gWnKqdr5TYoE2;+a2Cw=<}KFUbPFZ zCo1I!6(8Ldu8AJnJ?${*nva}Mwoon?zZ!Sa6n=bX zZE{e2P^PX~m{qdURFb4WMZXs6e4mVV3{r=wOQ~NO2q}{-OL5%k$m*A* zI#DC0@KX{~JNsRVN=P-RLns=`FOxen3MECluP%to8Q)KEz&Oc*id*rU4`#i?*%WMd zYAY16r;y2{^v*M#-j45A3y-yV7#F;E%ghAxh`6%2lf~Xip_e2lY#bs&z|>DqrVctil(wjj3jtSEfs|i`=Wi%z_U^7kE|QIjHWUSFvyr zZWUNi(yKAmvgCFUchK%&{;`&Kk?&4jYB*GSsP$0RpC+7BSQ7)!7WWqO6V4{McDtQ+ zg}8}aRnL_C%+f}eYj!M8tHT=Zz7@_TgBKgJ8`1-+0?sY-$k&~Z>Xyyn&pF&A?Qw=y zH@okJTu4oBv}b{5!b{Ex*HOp3iZ;85UcmpT|1Go+Qd&z{1}oz&+aP^jrY}A$VIcvV zkSpgaZ7ws1nni!}@ggL9_4_bK@%IOYwMYLLUJ67TpwrwEp2Jvmjm<0ki||FMM@#9) z(`JqYbe!@Uqtrev=opVGPE{GLd&>OtK>O~&^1)-Ljmf;o1JdbN`v$uQT-V^#bBExSXX zral#}aB|K&pA=8HpB;R;^&6aaLqGaBrb9N8sX#UH;`@5=ZT99jaJp&KJhzk;RSnJerVVTi zqS??KK?&_9RfW!8_jT}f^9^0VFJj&#TxA_{X;V0)c)gVp_4&-HEnDRbFbXeChc4cn zDhW&ZQuoCrt6e8hN^P5;ru67|ZE>-ELE;hJx~BoYFE9g`*@lxdZ-*-yA~e0EJYX30 zDz)$TwTM|;CNzFy@V;N0WP zi7-S*%08CP`Sczu)s5B52%fhjx)MjP$J4X2Brl!K+P7m|Ue;g-`^NR><&7(`<4OJ7 zZ{UVdC$v9LCd|3Fy+5|c?<&2pew!js$LWsTaK+WH^T+ch40cKHIuz0SCBGr3-*bSA z^P1fipc-&K02i<&cWK}AC;r1Pz7_Ueh_NlpE!TsEHZ5%)v%Z~aM`87J=U5r)u=b68 z39_^9`MOD5iuO1EvWWXqW6(W82JkzY^EFE6DzDD}s zv>N%wsDo4S-b1I7&K89$>Z4yH+25|be{6OACe5R{WqkP+V{$$xX)>vA@AO`$K&RQ( z8|lIHv2XVUCIxV!#R|^)j$s4y*JgYC3)2cqI@~)xD+(C48g|P@EL+`2%t{Hz4F*<0grR0<`K!!a^81?#nsw|4-W4X$YK|0)D_0&GWHr?rg-khS7514Tj% z3pW-3h}>OoT&Wr&asa>=PsO{kU2UwfM7lqmK%#q*;X(ck5Dk8-8U`^4L|-x+;zg!V zX$H`_<~AsVN-}`D?6E=GFiglkRErQM*(t;pPYm%T>XD#^`?d({2Vp@5e=?f@3G(-& zv9Lh~&<$cNI9?YcppXp++t&bUylxTVYGV&Ep)<)4Jvb6ZL?X2yI(l#-5{1XOg_Jj;3Zm?13`_s1KXXz#V%18eCTXC%ZL8o zQ2$!~hXF9gHa5R({Hrhi{=ZDH*th_28$Y7*uV@xNm_bH3l38>PlSsw|fNt(w-wgw6 z!Xy*ebS9oo_xpKb_CH;QptRu_h}!xYA@_h|e>h4@cMk+f*3m-ik<=j&H5V$4L=R-C z|Hef&C9uf`P*6!5hSY)~QFs&@i`2m)wKS060QntiLnl$agZ~NDLgG;(j5VSA(V3v(b?<(cgMVp1e$ot}EJySG z5KEj1MoSNafuZ198}8cJU@d7ZHi1SYTbdd`!MMSxR1%i#?X9Il^45jv5C|w33Z;#K zdFf!hU`Q|09-=l{hlJAg`l)Y9Cvw)a|13)@#A<`_@PNTZq2neybrH9N(p2fdXfs-p}&5KKoT- z$uzL8GQk4chrQni7GJ8RsWD#HZl-@�V*A+Bc=Pw$|BQU)Gx__~B@98L8wQAlXg^ z_)=~uhCz`!+-Gi#HZB%QLJb&-d3} nGZx^prw85kH?(j9#r85lP9bN@+X1@h$rd_r6s8ylS*9Xs3F zx;r~tT3VVL8ft24Dk>`K>+69^w6zv00x7PNAiv=MFu<_sjLvzWC})93WHAE+-(e7D zJf6QI1t_@O)5S5w!vE}~i$X05^&GCEkxT#ofA~(d?ATnjiWjNpotMfnP8R#}xbfPN zlP!!!j+q&1Jd%?*<6Od0bTc$pggHez3og_t3TgW6^unbP0l+XkK%yD|% diff --git a/Resources/Textures/Decals/bricktile.rsi/steel_end_e.png b/Resources/Textures/Decals/bricktile.rsi/steel_end_e.png index 58c70fb94851f327c9d1d4e62dd9268844f1aaf5..fb05cd35c4f04fc3ba8133d5f43cae1d2d80879c 100644 GIT binary patch literal 4377 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 diff --git a/Resources/Textures/Decals/bricktile.rsi/steel_end_n.png b/Resources/Textures/Decals/bricktile.rsi/steel_end_n.png index 36092d5d0fefad6b41bdb32db7ee9e74241f7a08..e1e2e04c39447957fdb57e36c82025095c0b4ebb 100644 GIT binary patch literal 4352 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 delta 402 zcmZorTEjd+rJk`k$lZxy-8q?;3=9k`>5jgR3=A9lx&I`x0{Q9zJ|V7+jg3x@j=eoS zoo#I`EiLu+_1&GF%?%B0ZEa1BjWsnj6%`dgwW+^sLV*--NswRgen*L=ln7p>nD=FQU5 zcb9UkoO~~CsnXIJXJb9`=Y&r0u)OeraZ`{K9N8gP0EYG!;gL-NGEQ2i`r~^NmsGq`$`228Ipi!uS{T8&;_&yhyWFF4;GO zcZ#q?Mg+ql@u>`F5(GXhdM^0tdPDSsK8>$8ea|;~3Z1z1mt{e;WrDPa@)|3SR}+{O pm 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 axTgP6Uiep{xQR2+^9-J@elF{r5}E)J^`B7y diff --git a/Resources/Textures/Decals/bricktile.rsi/steel_end_w.png b/Resources/Textures/Decals/bricktile.rsi/steel_end_w.png index e9fd6a0579757e48fc8788f8df98b3dcdd992935..0eeb92f6f71316adf6a1e9edd2cb5c727c4ac20c 100644 GIT binary patch literal 4367 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 Je8+*~{{?w`Bf$Uw delta 385 zcmeBIn!`LnrJk`k$lZxy-8q?;3=9k`>5jgR3=A9lx&I`x0{MyoJ|V7+jg3x@j=eoS zoo#I`EiLu+_1&GF%?%ATH8m9#6+l%2Aw^6;in}DpFZe$kFnIYhegX<}7I;J!GcfQS z24TkI`72U@f^R)t978Ppmrky~DAsJi;k+_o?eG8mag#Q!{Jh0ZM{e!`)3qnwxTo%1 zHDjlHil`R%;!q=QMp5g=8j;jef8 zV(p7%I`AwkSWV`@GS#&`R~k2blJamkp!j$;$AL!&4<=U^&0xwo$@4;r`RA@=g(_3V z8ztW*8`ejrGuX%WN*?H(#dzyTJwv#+x1@2GsA;WTHxb%18R Y;zf~j!mM9ifL>?tboFyt=akR{0E63@A^-pY diff --git a/Resources/Textures/Decals/bricktile.rsi/steel_inner_ne.png b/Resources/Textures/Decals/bricktile.rsi/steel_inner_ne.png index d8e5a50f8cf2b8374503360e0d2feb8933b04811..33f2919865bc505a96cb687a6cfa04f7692a7ae0 100644 GIT binary patch literal 4270 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 P+S)Dgwx$((JR|=Ll=S=g delta 217 zcmZ3d_=<6YWIZzj1B1(wu46!ou{g-xiDBJ2nU_EgOS+@4BLl<6e(pbstU$hWfKQ04 zlcQr(V`FDqTT4qzV`F1|eSLRlXJ}|BP~Mqc=_-)oED7=p{tpEV!TuFOAi)BU$YKTt zzQZ8Qcszea3P^*ei(`mIkpJ8B2YDG3I9ME69Dl99A@F5+I^!n)8511p`l8&*4=BZo zG8h`CF;u;gXNaF*(a`WnpY83n2T_e{9KNv@%x8Qf=YQi$=tQ7-44$rjF6*2UngA_M BO+Eks diff --git a/Resources/Textures/Decals/bricktile.rsi/steel_inner_nw.png b/Resources/Textures/Decals/bricktile.rsi/steel_inner_nw.png index ea84f9755ff478ebfe5d08c163edff7ed84ea297..644f5448cd00d0bc018ee0b90bfb5b820efa49f5 100644 GIT binary patch literal 4274 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 ZfOMXkX+!#@2|;_e#W`A5>^gY-zW|66{_6k$ delta 209 zcmdm__=s_WWIZzj1B1(wu46!ou{g-xiDBJ2nU_EgOS+@4BLl<6e(pbstU$g*fKP~P zV`HO}qhn1?O?`cROG`^dMMY?6C{QxoY~KMO#ZeOE7yKUr816OijRcBu7I;J!GcfQS z24TkI`72U@g7%&+jv*HQZ%-Zc;$=|aaK6Z;^gBOCB#%wP;oj2BPY>JJ9N5(lx@H=z wW_X~KFimBGHfLMpKlu;5r3qFB@hq#PCoPql;niBU7HAfOr>mdKI;Vst0MgG$iU0rr diff --git a/Resources/Textures/Decals/bricktile.rsi/steel_inner_se.png b/Resources/Textures/Decals/bricktile.rsi/steel_inner_se.png index 7d29fb22571d9b08a4875d2ec3880800f99f92ff..0f9072cc9e587b91193f2bb0f9e5aa46a82afc16 100644 GIT binary patch literal 4273 zcmbtX2{e@L+kZ%evQ^eFrpPwChM9MW7)y30QK&I9#)O$^7Hgp-6lKYpB_u+&UJ9X2 zQnDo}l~BEu5MB}SJ=#w1Iq&y<=lg$i&OP^iU(fIQUCVvl*Lj{;2Rn-mVv1q_0Bo?b zG;;!H$m&?P2K+a>c|z0WgEKEI(BvV{ci02(?OZS=<;Jx-4^ZfpT$CzssN z!_Rw Fm5W7m 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 SZ`-@twXKMDX63sM9{(@=0QQOi delta 192 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 BP^16= diff --git a/Resources/Textures/Decals/bricktile.rsi/steel_line_e.png b/Resources/Textures/Decals/bricktile.rsi/steel_line_e.png index 0eded8ad61fb41794dbabdf2ac149fc644062593..10b910fe1699cd472f0d0d2eda1d0bb4988a3e28 100644 GIT binary patch literal 4253 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 NEpfJ{mHRzU{TKY&@p1qF delta 279 zcmbQMxQS_kNGZx^prw85kH?(j9#r85lP9bN@+X1@h$rd_r8E936Xmdg|-z z8yg#2T3R~W+PXVCYiepLDk^|V7BceO1X5fjL4LviVSr)N8J+V$QO*L7$YKTtzC$3) zD5~Mr02FNZba4!^@LxLVEMJ2`JxB9I`S$n!4^2B$VX#i-+T%}4-!km{r+R#f4rA*X z$p?bx7(QDZ)+k_O6=7R1Wnco5; To5ak3j$-h1^>bP0l+XkK2@q?B diff --git a/Resources/Textures/Decals/bricktile.rsi/steel_line_n.png b/Resources/Textures/Decals/bricktile.rsi/steel_line_n.png index 8c2112e975a80cb1a2496b2026799a19c37130e3..0a6d337048ba3762d16d88101db0fa88de2f1929 100644 GIT binary patch literal 4317 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 KTCwNw@&5vQ>IjGc delta 242 zcmcbs*vB+MrJk`k$lZxy-8q?;3=9k`>5jgR3=A9lx&I`x0{IdFJ|V7+jg3x@j=eoS zoo#I`EiLu+_1&GFKuJN7IrD)OM@f)h@P7zkxYxWl5-7%5;1OBOz`%DHgc*%37(w~Wu*l~v1HH8^Y8uM z$GrF6+uhk($X&}Rin37Owi>Xa^qoHsU+c36-@$S&X>6@2kDpxs1r8Uynq5&cb+NNa(fUl=a5U(;+`K?)!)AQT1CEF zRqq#VY)9+7<8PnDeD7qZ>6{!oWmmoZ%0jL(puiAt$1)r^?JJ{21(${_Nv zs@77AXy4vN>muf;tYgi=*hHnW?qGroEpiJHO!5XM1} zwK=v2r>feKGNOjj@Avh7UKg=vnB{Ugr6EKEgq9qKk`1&lSsIayX)K;Nu^&lageawD zEzy%z6xtU1L-9U(>1 z5r0EH{e8*+zU;8Q4=8goiSb4vL( zVa#T(@1W&Av$m@I&XikEhQn_kTo~p)?LL3-`3G~4-p4Qh@Z-BbFXQ1) ci^}E8%CBE61`l7f9;S1;zOiFHUORZ_FDv}yH~;_u delta 220 zcmcc0GnHwAW4&B}Pl&6NqhnJe2z0i!wY0R<*Vot7)KpYdba!?#FfeHL9%lhkTqQw% z!T(`^Vbd9%^FUF~0*}aI1_r*vAk26?e?|ruvCx2Uq&uKHkGKW=N89af^650BE zZgaJQG+dobH}|SHnJaHi~l@!>OeVz_{Tb#RS~&ot^loN@O1Ta JS?83{1OSdhSgZg5 diff --git a/Resources/Textures/Decals/bricktile.rsi/steel_line_w.png b/Resources/Textures/Decals/bricktile.rsi/steel_line_w.png index a67b6abc834d0af0824fb51707c3235b504b3ccd..aff9dabab687bfd1812ad2fc0375f20511cd999b 100644 GIT binary patch literal 4292 zcmbtX2{=^k+duYDwiY{MiilavFwBIAv1Dfwg^ZaoCd^E;SPLbgC`-1oWQ&lkmqK`3 zBqdvtQVHp$gz$=p?`XSvuj~E3@B04Vxvu9t&$-X<{@u%SKlgP`oP(XkCJ{Li001^w zS(-V4Gh}^i-~;bwg=g-A6F=3&)&u~m&mCKKOj&+ZVrZRem3&@FyxB#lrNh0*9)}$+X4Mi~2vtHmHmGaM;0am` z^Zv6H<+nc1&MuFZGd^DbT)#Zo)OAoANG?XCrwdy1BtG0c6J?M!A(`aJnFJzvl)NG} z02>$chQn218zkBvJ&w*%Veua3=a~t0y~WFX(v6O^6I#nHbelMKVmt$oymTEat0gHN ztFLOE2(RlplOdO`TFaj z?!{KdilXbYv?Pb5s?E zfYuwb=)H87m37xJd$W`PM==fls_(@`lh1F-MNEF)yMUTzW;^wXN3YY9%v%b;w&@i& z)X0loJibn+w(bud9W?4|slys~jXe#AOMkxCC3TsH$C7tfqR>NQ#c{yYORzi=#^k5} zDZdycAtCI-x6P9OYNU9LvC;s)h>7-q@IvGf2O&8Vw68#$$xeNN&M50QayNPCQOjOi zY$B;%+inSpO7Ig^P-Z9Is%*8~+#AyY5hRP(n>0H}Y!PnVD=Z-{wKt^Or$lB~RB2vl ziR>38oN#tbg>h83hwsLVr^91j-`-$z@@kb-xq$rLji9{~rf>E$d2b1JMvJ~tWU9Ud zl%sdQnVZpF#2AR|iTX<-QbJNL|BMWD<2`{-7Ws+6r_PsKoJkZZ+Vq1n?HJ`TmYMB@SCeYXxhS_Ma>@S2X8d4t3OXB$c@JS?I`Ki|w}`F9FF66kZ8cfG4;U5}S5 z_A5WSCsGwXuxrwB(rr>AkatI&lN=ga<7yq$e})3Dl6(O`{RYOe*S z&r?U)GewK$$MjZl;k+%ziE6%^CpV~^+Hps1uWDW@GifGrCfRaFspPe|6K3$E+pCj< zEC(uXCT!e)={?>yf17hl zftUl8LLsNOpKkYg)c+tSO|eKt2X;{!7VWZcx1IczrbGFE+@lFo+ZR-?S)Wepcmzvj zUl@I`wY|3eRa)3i`}Cj``?Mj|A&oT$o}$ae5+#X6RfmW3?{ql5cN#1zFTz`&M>G|0 z(0s2Us8O-spk$y@zqqjcZQg|nLJ`M=W}bOvvLvg}z2ca8$ie7*@5(#-H4b3QW-q|4 zgYt{JH7A46o2XBYSsYtBV=%4G{?A8L^CI8Cpa zGI}K+T9p&+neUnKntR-J$SJq1#Xh1N2=EH{6YYzX(cU48ll76SlQ}2b6MrmWHUXEA zBkw0;Av=wlLa+LI6O+AreOW_<`+b8tLw^j;2cZqoX>JM6VeFdv#wEcy_?+~k`Shb{ z9}fq%o%9~2RzJ;e8;L4PRUN8%%6hTy?ymmQ{v)SMDE!EMGU?ZP`aApO%kAA-YODW{ z98kEi^titp^L!!pV;}3|Sk_p=qqdKIlNo`32No=FmR*4@^1Ir zhk7Q&SDIFWmiKJz7IWP^LxQLwAysNKR*5tRPlv-uReiNZ%b5=neCzpUu?F^lTW7>t&t<6K5p>xrgEykMIbipBB@Pd)aL$R zYkI4_>VWE`U4|XUvfMIjxPe(#k4QF1d7u0)>P3(M*l{a{A<^&GLpArPpQy7j8`y zA4^%OSvhd&u3nI|`c{7}nW2&Dq9TX<#KZbEPXqm4VfrvrbtgW)8!W4f(DIh{fMGN$ z)WZ+o*;W4~VL~r;=-3O%7SiRu8qS(shu!PWVGprJv2?5Sv9yHgg~3;jb_m3-h}xY# zU8!d%Te)GvVbNh0n#VO8OLa;EU79NG%9}k#-JiIWxi&ThhAW2+b%(coy~f?gZRJjj zF~whA{aiBb+kK=&KNg!2GGj$@B@Nw(XI#3p<>Hx3MhYW}a)t_=n>U`9)-T15B=v5) zi61~6*ZDG@Fzw#*;fSvPHAX@0R%O1nQ*Aln%FAD8j^>UU?v&YiFrs@UuP(dSvyX@S zmeUca7I-cYAGj%J-st(0fWcR*1wH3u?5^gNVqswo^Bae4ZfDw4*%xzE=JFC{M*i5|B*PDKoQ7;#(QJ!~(FFUx+WRmq({G=F1_{K%AY1;uUdZC{jy_B8M5l#5ufzK@vRDUy?zORy=m z!PsZoW?u}?Q&I$b5jGky)HoBABI-6>J*~NCJbZk0eD2fj;y(M_RRO+?xfO=m zOYpN2kaDmg;C+33g1B5`6Ehl>8pz>*V))&@sn1i*=8hBpNs9KZz8;CJetU?!2|N8v!cDO4KW5IWu1 z0)^1XhR_4Lwn$s1DaDs&8OowKhuRTHp?)MR8M?=4lZZhu4rBtX~H@(sfAGlZI~TZFjUIzUVrED8h*N5V)*q&7qk3nw8_NF8sK76gSvp%F+F z0*QqoF*pz6|aX~?Q5QqVb?1OVMGyh=^d@_XkayU#J0udAx1P?;P87wM78;ixR z)1Xi=5CLO{&^g3l7@fWSJIN0kGYXr;qA@u%1|70aOY~-NIfhWslf_<$72Xu1 zjm2PKD7f}FcWrHPR&+LpNGDOO%nYGm-rzJE8Hd%uVu-p#G)xbpqYLxK=;*+RK0dlI zeSH)PrHe)B>G@E8>YFi0-1X}CsZaht>f5tu;5jAw|HnMvPSg6)GWb?qI7=EE-1m@Q z;vZ+knR4_u(GQ_N4f3tXa75Dj;W31g)~kj>hW-%K{^R6)rw#I@fTaIJ$$W>g89tmK zB8y@|1rz!Is#e5rF&ZG&d%^E<8zBBIMc;A1^^k8I-=$!K0-r#=pY3t|=~s)T(80dS z0vl*Zm!byPeD$o%ObGh+Brh+1J~bDG$P-Dj8_l0LDmwcP}5GgcyquLNP5=M^ delta 235 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 M07*qoM6N<$f`81ossI20 diff --git a/Resources/Textures/Decals/bricktile.rsi/white_corner_ne.png b/Resources/Textures/Decals/bricktile.rsi/white_corner_ne.png index 292139bfe4cfab3b2366b8e1bfb6b87b5139649b..90cda6ec336e94ae1855c8d8b0f302877807045e 100644 GIT binary patch literal 4283 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 delta 340 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 delta 310 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 diff --git a/Resources/Textures/Decals/bricktile.rsi/white_corner_sw.png b/Resources/Textures/Decals/bricktile.rsi/white_corner_sw.png index fb06423131e937a5ecc56260d6dc9c7e26933d62..a2157c064c4fbb6038230ae50c32bdfee1506f09 100644 GIT binary patch literal 4290 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 diff --git a/Resources/Textures/Decals/bricktile.rsi/white_end_e.png b/Resources/Textures/Decals/bricktile.rsi/white_end_e.png index 548bdd6303952fc6059eda24fee40f27fd3bc640..6b857400be333fe118d58a1eb932227c3d5ca9f9 100644 GIT binary patch literal 4301 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 B3Q_<7 delta 392 zcmX@BxQKazNGZx^prw85kH?(j9#r85lP9bN@+X1@h$rd_r8GK7Cq{oBQ#@ zhqtd@y?F8B@#Dwu-@bkD;K7|ccYsPh-LhE-q_|3g{DS|(0K=v;I_H6+oCO|{#S9F5 zhe4R}c>anMpx}2;7sn6_|K7=rLWdOUd03iRy8i#)P(FQ2*p@4AExaNoB^*>c^>}hp z*y`$YO`jgD;543o;iJQ+C~MZk{Cqz)3K+;g_F8zc{fz1E109b&6{l&O)@+_|AWQJI z;(@b#j8zP8{J9mTaPz2Iw?5DJauzh5**LQ)Zm|nn+6={QK=yB;8+UiHl&I2zzhqfSB<`po>;tZ zTqLrg{@_HG^TEB&C#n;h%Zk@dNGNRjUM;w@wCAtD6vg+fMg>MEgnR^2IDJ2@4z$o^ kc(2BJeCJzkuS&*GD+GUTH<*=n01~;h1^@s6 diff --git a/Resources/Textures/Decals/bricktile.rsi/white_end_n.png b/Resources/Textures/Decals/bricktile.rsi/white_end_n.png index 68fe5bcf7b6287ebf51726575fda5fb634e5b824..739e4dcdfcd5b140cac617cd7bb8d827ede462ea 100644 GIT binary patch literal 4294 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 delta 377 zcmX@6IE8tFNGZx^prw85kH?(j9#r85lP9bN@+X1@h$rd_r8GK7Cq{oBQ#@ zhqtd@y?F8B@#Dwu-@bkD;K7|ccYsPh-LhE-q_|3g{DS|(0K=v;I_H6+oCO|{#S9F5 zhe4R}c>anMpx{eS7sn6_|D}^|3msOd=Wtp0XzBm|hwqAR^;J3PY(801-#voW(lg$D zrH5BqviK$O^qt;EtO7nTZkocyc(6hE-y?=^wevVqJ~dRPF~u0xFn>_CJ>}oBj?ZBB z`l+lnv4@yl>i-@v=$trD)gw|YVbS}=Cf}bjN+|X8YPMdV%9JCK82j1KRf17~4_x68SpLAu=D}Rue23h%SG^7doZaNU;>`?JmhBlDGnfzcaWPnB zu>84rnB!;ufnbj4H;0;MrR0AI;l2Ccx)yaw0he>r|-PH7d2 UTwNPJ1L$oAPgg&ebxsLQ06QL|vj6}9 diff --git a/Resources/Textures/Decals/bricktile.rsi/white_end_s.png b/Resources/Textures/Decals/bricktile.rsi/white_end_s.png index 4b96c7858aa986659186f00e22771f874babbb0d..03b4eb7593e119247b267c9d732e22cc8558b0ef 100644 GIT binary patch literal 4299 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 delta 374 zcmX@4IFWgRNGZx^prw85kH?(j9#r85lP9bN@+X1@h$rd_r8GK7Cq{oBQ#@ zhqtd@y?F8B@#Dwu-@bkD;K7|ccYsPh-LhE-q_|3g{DS|(0K=v;I_H6+oCO|{#S9F5 zhe4R}c>anMpx`r47sn6_|D}^(i!~e6b2P79y0-eic%0CT>6L5jd(y=pWOs?a^-r~2 zJ>%-Dd7&$GdS<0OW3tk7h|5+__;I*Fo}1xohjyczoWb=!3~4gqOdDPF*x5Z9%DZFk zH|+Ih$XGYiC~mW-j&3>EfweVxDhD1;_~?4`N%P^$V*Y$KlOzRpv41Lyw^+cQ#r7cc zTfXE0_v^K61&h)eW>v5kNZ9&6)?%`FmAhnyg%(4uP;hik&qk*ol8ZSVCbqaRXr5Cw zWhqd5+Mus;O{XZYoFP=uoxzQ>rB#Em_r2QdT+srd*(v>+M=E!lYdz(j_eZE||ED=~ QfqrK2boFyt=akR{0COUrfB*mh diff --git a/Resources/Textures/Decals/bricktile.rsi/white_inner_ne.png b/Resources/Textures/Decals/bricktile.rsi/white_inner_ne.png index 0726c4506607ca9936c02fc425388c469b526188..e8d326d08d593c9bc875490fc1b66c48b91b5453 100644 GIT binary patch literal 1914 zcmbtVO>7%Q6yDGlK}sSddWe9-Xe(81!gyzYy!Ni_7AH;{OI;)~fXQ$G3lj$@yNxX-Lx7pIrQt zUV!;)o432`cRTlvj*gCxkHPTAuWi9{KJT=*PEJmwcbC6<3iDT!jrTH1TKqx0bDyp( zz9mU79|zs-eA~Hgvp6hKFLrrp7$$(0q}q*PLfJ0Qk;{8QRF{AM_B$B`UR}Olc8HU# z@tt7fAmv*J?JhgmWtJ!3xV|u78`{7S@|>b!*pD)MSeFZ88^*${$f$tiyLGuCBBE_) z6RpK5M^=eoMu>_kR*4af7_RmX(uk%jL{o@`iD_%5tr}?j$Pf>qTI%_Br+IT64`y|F zC(jdGQ3iuSX`q+lw5O<+WeFNh!+^lqew5Q8jiQ|>4m3kK3DLz*aRiHOoH3JTlGqdEOou*YmaPD2V>1R?ElC5d`6nksCs z#r-&iz>u9@WZ^h=E6Q>jG2Uv{Wssv31fK1xZq?Meg*{WRU_&)bT=o4jE?ZT`-HPw4 zsyFd(#%xb4`o!P+kN$Vk0NRiCUzn$8645cWXN6A48cFx)Lg?XySk^Fo?lZ$3xSj9(#cbF>kN^uSq9~XimO%X zV#76b?80usW`$Ndphf3U-W^dH)4 z1j}MSAJCLHdax`1S4S%|HI8(gt-Ge2CD8~sbIukVBP$%@Fay8I6(VNSYlug1_oQ&i z3|dz%!3DL_YBsvnJM6)e#igaszCWD%@}(;`$qNdp^mEeZ WKV9^{c|<-C7h7w+-F&?I;L%@JgD?UB delta 173 zcmeyx_l$9ZW4%OxPl#(lZtl~kPv5?J_2R{g$B!SsfBSao)Ts;%3~A>!o&-`HB|(0{ z{~>_kUi02apcrR?M`SSr1K(i~W;~w1A_XYu?CIhdV&VVx{7GI01rFB0u$TLjoiEI; z diff --git a/Resources/Textures/Decals/bricktile.rsi/white_inner_nw.png b/Resources/Textures/Decals/bricktile.rsi/white_inner_nw.png index 5e75689308a7147a179fe2e84c44393a9dc76f16..1b6e902e53513f759f08b2f44e7ce2224510a2be 100644 GIT binary patch literal 4272 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 X#wpCmD)P3jHFrzAt!eqbqo@80#Ss2i delta 209 zcmdm>_=s_WWIZzj1B1(wu46!ou{g-xiDBJ2nU_EgOS+@4BLl<6e(pbstU$g*fKQ0) z)2B}ha&sR%c<}h~;}eQ(~$;|(E&I2iqk|4j}{}8}%uX%4IP>i#{BeIx* zf$uN~Gak=hkpdL7_jGX#vG9L;>Yx`dg93;1MJ}b^`8gtaY!VLlmS%o>*v96-u71!p z(_l5j1Eqv%DigFh+amwTf8Z@muri2eStUJbsniUw*0Qxgvlu*G{an^LB{Ts5ao$j} diff --git a/Resources/Textures/Decals/bricktile.rsi/white_inner_se.png b/Resources/Textures/Decals/bricktile.rsi/white_inner_se.png index 82013151cb9063a11de552c526c4775eb9589f01..f41846183f00e2e1eb4f23ed25921c676d6ad939 100644 GIT binary patch literal 4273 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 KEZ^#L=)VAjqA|Gu delta 213 zcmeBE{>V5%rJk`k$lZxy-8q?;3=9k`>5jgR3=A9lx&I`x0{PMbJ|V6Jxw%uPPW|}d z!{f(~pFVy1;>C-%uU@@>`xYp_dFF*HK#H>@$S?Rm6fgw)R|tUw3p^r=85sBugD~Uq z{1qucK`&1i#}Etuw`U#s8VopG0!94VivA0GvzX8F`@SsS{gbhW&YJ~q7W`4kaKA5K zH0|Z26{{pY9yIKpn2^FKc8B|mtCY?L7WIRR-%s!0mdur#Bz^8LH_%uHPgg&ebxsLQ E01_Qp&;S4c diff --git a/Resources/Textures/Decals/bricktile.rsi/white_line_e.png b/Resources/Textures/Decals/bricktile.rsi/white_line_e.png index ecbc891f6f73e096e7178607deba107adbd2991c..1d70a2d6ede2b64f402bc1c95c4c77b1205b51cb 100644 GIT binary patch literal 4272 zcmbtX2{e@L+kZ$zWoxm8F-5l78D>I>v1Dh6LXDX*Cd^DTV=ty86lKYlEhIv=UJ9X2 zQnDo}l~BEu5MI%U|D)~np7Z{{?|kn!=iKw$_x1d)-?iM=eVzM>wYN22FD5Sr0Kj@n z3sXn%30WCyR)PPf7f;;-A3`)^8)E>dI&*~Yki7DeY~g4F0MQZv5C@L0pwh8j0B|$} z0LD%OfWcb;kZb1{L>`5S{%NKz-v2CrOT&jd&{bNH>n#-J&eVX64x8?wW|x#pItVnjcLIZU3GfqHL>Yat+k5z z-I$7)wV1jrZK*-&Dzj6_6s=*s;eMhxW)-l}(ocrv8Vkirp<Uz88@~7n8ksqT>rhoc(IGvJk@y9g$YA<*y4cBKZe5 zTJvZJH{TFmD=9=$L7N_Xqq50jLr-)&M3^E`XWV2jxly!bx2U9q^zM)@?_yca$dbI! zV!1C$c+u?W@?DW#9zN^NpA3(Fb!(0F@ynIcWvdnLtOM;GGkNXI61*YY5w-TUB1`oJ zpd7X1^~{v+Jk~&LXXKxfJV`0}{8O^fb$3^PGS5#4K5@3p{8WP2MFBdYKGEon8v0Z_ zgy|r=aW%nQF5k}~r`Ueu+8W^+CFkQMW{PG37eXEM9LU9Pz2-V{S7Q3i2QD;rNsS6| zH`hyg9AoUhR)EN77HsdTK*_FKUl3n)JJ<_~vP`c@mu@$*R(Q9?TM~07xa}1uMO6?q4r96 z@+@tHGgUZmc0_LpA1>IuD?!a?!}uDN6Wea9?N-f8VI@xSrjjhSl}KHQJ!T3&ytOJR zI4(Ft-|UE0lFC@3yG8dl6}rfnm4YL2yB8Azp}Z+v2v> zaafgczFEGBm&I`1Hcv;V9!qu&rJNG=Mzrli62>uD1EwLPaj7@-vi#*_$E}W>o{e-T zdc+uUOnPi<&)$ngluGnIGz0CIA(#<~mZ99!SVPDj-c54AI?02I8;I+iGv51G+1#*4Eqx|bg@3)vTy?^SWzSz|A*bow0J zDk#6GOKYrg*3FsVZ0DSJsPR4T{qgg)`-=B9?aO>_5^x-EV(8iE-e`W*#e{IjZmV4Z zVI)V*GdVA#xNh%NJC3K-el2(3QkSB>bG2EuX@TW|r{`8FR-cLNkk1y*-d`{4agtFz zVf0cVv@$2kGv71*Rlrf#LC4(EX1japg#CQa9nHRyzC$OBsY1v-vT0Yk`#Sm*%Iw^lYpVW` z>fds0;Za`~_Ssy_$6ofww^?uFAGUt%9ZwJZE3jaW%Xj6knkx`55x0&Oj&42k{)}I% zTC3%DkD_fw1-6~pHdzZDA3J8?SojC`jyh<$QaPb~6$8!4V?1G;eevYQh8O!^&^%v*jS|5o^`@P@BSWnJ#K z_IHm-EH*9%@prE45_jD&MTV#$A(d)VmI-uwPx}K%ReiO2i>VKiey?Y zc_LQo@ZP1IH*Hf%A&vA0 z^k?+Qu`gp$V+Fo`edBJJho6V^sJrA!(e*;a?oMK}z4>*5ekwiJEqOsrOZ$UqEf_KM!zQlzI{3QzhD{S^uy5n9aQ5wOR@$e0t%(--<>c}88x#z&O0P`&&)pa+ zI+DCty|_2?j$V+A`X)bZ*}>te!b1D}gai83PXc{kVtcU@wZ}fb8z`-f(Dst?fMGSt z)x!_m)~x#yKc<&5c;vZMGxwZJohguwMVvqsMz`wzTaD(F5NZF@PV1P2SNpItX(eJjI`#_8ibt@t5$Nxch8f@In&5aP3jsqcp^ThfzSwy9aHhai!T$wJQQ<_s?EirhIbZ z^WN@i4JiHKp;yM_O2Cy3FmI6DrAr?kSzWuq@Mvfpo_oz2oytxeP3+z=zQZZVX`<7K}_2tlGy$;H6&Nbl6uiBA85)PkZ`_tr1UB0HOQcF0G}S=~cSZWqf*$R%2r zSYz!nY_iV><~DuezI_}^8|&QcEf$foR5MrCF{2#LS-cW~^$Hwbz1&hXXyy5!*~@w+QS zAVo`D0RUFV(TT2HR~u_QnduKFQJ7v-c(6YUM1%L!oxv;;*_X>4nEir`i&S5 z&R4_;DC8T2>uU%#Ua<&qwXuhoFxgZH4vvJ8kw_Fo4+keB(MTOHv^E5dL}L(0Gy;i( zA+dNg7LU?_{P;mZdk}~Lo8pakG&TES4_p~SeYji}9)So73W5h=;7m3Rfx_W%D>P^{ z3`D>Q4x+*4l{sFrV;`{H@B`t!@`@esU$9wO=L3t ze(sq4PnRKR9XJ-EzOqM1U2yIXN2Bz0AxNqo3WK9)Kp^US=?n@ph@O9qEaVvwnpriM^3Z*V%Dg7?CqboFt%7#Imf#lSH7I(jfKBt;+Qt*h@% z(Z%ZPqR@Ij^-Y=NfR*a_sZaSo>f5pD;5jAv{cE0Yr)lMA8GNfQyak;D?t92D@sBg& zL_PeQ=!ejc4*6DOcoKQ#@EAhLD^)|KK!1qo|2jF}X@h*IAnE^5GT&hwrZ+c;#HJe4 zz(oGPsul5Dj0T96UhsR|28e%3(RbW$J>(n5cPZGQz!j+Xvpue?ezjOC1MI78uz{L) zpL_x~UoA^hW1_wt`QSZqS=o%6Jb@xXH8Z5FGg5owO#vdH7xQS_kNGZx^prw85kH?(j9#r85lP9bN@+X1@h$rd_r6ca&td^`0)7g zOzuukUM<4;T9GVJ`PdVGow zW9u2o2ZHAqK3g2tC}3k1VOw{GkxgVp%L2Ye9=?jpjKLWU5gYOssjyE-C=q{a7H`WR z-|4%yapKHmg9UtTj4L@7IGCO|=D3|vE>QN?B;E(Jiw`JRHu&V(@hJb6Mw<&;$TCgmy;& diff --git a/Resources/Textures/Decals/bricktile.rsi/white_line_n.png b/Resources/Textures/Decals/bricktile.rsi/white_line_n.png index 1d7203daab84c4e3fb8bce397fc3dfa0c6a7c659..cfd681dcbbee6a01b89120c3d38dda22945d3395 100644 GIT binary patch literal 4271 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 diff --git a/Resources/Textures/Decals/bricktile.rsi/white_line_s.png b/Resources/Textures/Decals/bricktile.rsi/white_line_s.png index 408d3220d75c1f3aef6efdf56d7c94afee64cf32..c92bae8346ac2c311cfe3336030c58b59e4a9d21 100644 GIT binary patch literal 4271 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 Rg4tTnw!+()RqXLP@n2s|_p<;1 delta 244 zcmZ3lIDu(`NGZx^prw85kH?(j9#r85lP9bN@+X1@ff>d_r6ca&wx0pKAjMe{PLUZTYho~~lmYis;~B&8D4O9|l>5#OWj^q%v6-*>+MH|N}Q-}m+WuHUuX*L|Jmi6_`wZWNIh0RUj5 zwUxOOI78OQ20rlL{L-oW;KWZewKD~P>N7`{9aGmIlC7NV03cQZ0209Q6;wL53jmIW z0>H#+05BQ@0J#p1QA{uZh#=@@W&~?9GYEmr^r8Dx0l=y)Cq0-*e6}^Vt0_1v|1px+ z>E!FiTR?AkswbY5Dd(lZCyv&uRxRL_!keFmS`qF=^$@nZm{&_~CRPb;-=Lu@izn(Z zE&5Mal;8Y3JG(qu&ir`obN%vUQ`deOAf*_Qks)Zqlk{-YOtewf&0l#n+sldrxioRA;Md zc`vRqP840Ats^xgU2Sm+nWjBrFfu?CNAm%jt^H+KuJKTely1C=^jql281TkQ_~7A} z`*hw=MDJy=t!=u7Ih&*fxJv2pSA8$en|^*vDPr;S-UZaPv)XA-JbIm;WZhH*wob3O zp+;Wx;_-EQwRL~$>7h|yO9^X%bId(22k~KYi}f_gt81q}R<88Q1702Rhpx??hE<3} zb;5uLua>=^7y?n3N|;K|S{fwmj1cj>rVWYJhh1FKr84fKq-EwMzB zt<=+;wP}N|wA)1^YS9;Fu$^ieCpx8P(K4U!bxB|3;j!Y?N)mdwOKBW1^AaqNg0c7+ zw-gqmB_)Mj__kW{Ux|{a*`++dFJh`YAiNNDh#(|yiuM&~Gu>e*&>3y>M*ap5BYN3u zvuza3YwJxxQAvK1D$4xWTh%RAn|fnAAc7Q$dedftueM)4tqD%9` zO60yMK2D&D@OsBF0E$XY^l^QIb;f1*c@8V)q0-Sr#OPoH$!9fYzkrq}!xq5bv^}<-IF!I#^RTG!!K=&X(O$x}9@->aPW- z&(cOYGewIQM+{bR5xgzClGJ@SO>R&D5?&;**Yt62uR8V5x3b%hqK|6(L!Zc+xFZYFAk-w7aw9SdryP57x zkDMS*NKb6*-FK;&Qia-&Vxau9c(bBWGL-w88}KAv<9_+jfEXHNeANC5Dn+_EGd5{r+kiJ&VdG5kCTj= zDU(+UVO6;?o&}zXuLF;|4mstOwKzm}0|8zEx6r;wS>5e&I5{8rI@vRFJqbq=XA^OW zxe9)=mU7dmDfFtZHz~!t*Oxs+yx%vdH}vP=d@$M=o$i+S9LA}sZ(I_bgU`u4n$I|# z{_$W?+i~wv>>3+=md?6Q|SKX%T+G4K!Wo%PTPuH)enChb|AEJZt8Eyu4GaTikWi3>l)1gjA`|SSQg5o`i!)HAD49tCEJp3T(E^lTW73zT{W-2$yo_HZ01sVcc#QlG}q{#>3NR~H9QQ1&cp(h7f? z_Ee>&5=W+K5p>xrgECUWe_&}Jh@GC)b{>h zYeuVs+JM@meWpFvs@y7jxPetxk4P~}eV_6!^=qnxTI3#K2f9sb(f!N0Z`)^5LYwFh z>CfrW6JI7`CJO!h`zPJdk3J6@Ps<=5r|=Wb3E zA4y%QS=o2tu0gPj#uk4a*`bl@q9Q^;(m}(Tr$K(NFnyS*x?>;T4VKkK>Uhg|z%ZH> z8W9KYXw`p7oG?fmI`TrQg?zEEhP!6pVgI^w*h9QgJi|I;EIo00VeplsJp!Q>S-Zoh zEA13@OJKNgcucsZ_EGJ|QoYh3m!?Yl@@9`w_a`o8u8mDW5h~$B-4ShHuLkZ3Yz>?i zXGy%g^0{Q%xBF0uVH`FybjF(ON*=nNz`Sr_^Z8R3OcY0yC%C)#o&RF=Qa9L^gx-XXhVe`NPceqBzlXCF`C zTW&{?deE65e9*?+d6VZ)0tR2L7WSNtwZD>EiiL$Y%!>`%-p+EMak@HlY<3!OOomrN z9BjM3ib}~a{uW#icb~5hSxQ+h50?R&l7?d-)5^xnG^jjo%_40?uHrH=5JQ|xu7T&PNXL6FqlY9P{{KGled8+wF zMksT5^}f)!5MH84*~Q4|NZ-u0sjh&+^uppc_qH!8LOYvxcFIRC*xW}~hWr}Mb5s6G&tzD?^oKuP5tXz%6cn6ILthE*o*?2x|F`7U0 zyezjqs@}5F`5>Z0rYSj+vj`gv7;2meP8D^VuAbK3IUX^-IzIR5c5$CW-l_m!=G+QX z{U!KX35XGFiTIqHoT{oSN2k4@Kt1ez4mk01o$Q_0*4BVsT36=5y)etljROGU_tpnb znzpzC00<<|iLP8%J6jx?82~3ynBG))NB|2&gYTz1Ls%rTAC(L7rqbvPW9W2a3lu`9 z7(@5z+ac{(W>jCgRT!J<9A-}>hxw7Q6zEQqjUq-NIFKQL$|XTU0{j^qT!=CB8!--C zuZs~-$TtYr&lqaDZV}>YM}U|y*;EJ?j)aksNL`2l7EVT@kb2%I9S91ELL-nU1QH8F zVsI!7PFD}|;|B%pK_EtKiVx1o+~S8laAyql<#Jg#1R^*%7#@s zI3FfEfCT1(9zdc|5iAA`3i*{`oEg)f$p#Itd-uB>{4)FTVP*{FI9cw7SmVtwx>yVb zhJx#UbJxxeXU*VnNenX8+T0il<_%7#Q*cNO8R=s{!oc(mNcu2}kDfjZi#4Rc^mLKl z21pbNgQcQ>>YFpkf$P=rQ=jsG)OTRh!Fx*b|BrdT-KO=cW%RAOa8`5mlDbzDvOd1@1t-pY3sd_p8NH8DL*!gAFvI z<<`NFKtO^JpMWG^p%K6M|(sAI`IVisG(L5jgR3=A9lx&I`x0{Nl=J|V78pFSB9}F0zyqVpALYxI2k;M!Qe1}1p@p%4<6rfw4=;#d$-z>2k~ zplIOvgTSTs}oC9w#>jlFzs$<>`xnx7pwo2{4{uJv5~n|+vByxpO@wh32vJHb?2mKTi2{SUekH!)`0TJMkD@X zr}*2R`3>1lDQ{ogPx|tHaFEO9YR{%R7t#Xr$77n9vnL!a8FZfAH=|SLTKzi7>){ET z-7k}_J$5cmSMEf!q8o5CC`4`{qMpXcH~A)E6a-B zXD%G`)wRyvN#(e@jcKz~UiVSY%5U~j!_p>jIx2pES89o}NxYb}p;SfNgF?zCJN(=! zFa2(3Q5hYCFDP>yosWO9$JUA3xID4TY<_HHaqYwLT{~!2-4C5=mj80KZ~G1pfpyh3 z*O~a3At`;2YnbV_M;B^p!=Bw_Db7}fcdRXNneYvC^e}zjBs?ptj9m28^<4d~iZv~R zg_g}%vlE<2xlz*nl&y{tg;?9)S4Jg|?@#erY#jTgNwRRoyxcA4iMuuj4qTht?bb3i z%d+;0U${)0Zs&XqKk0=p=3r%P_M>efq9A7*jKltH3s0W1{jN{x z4i0qtTa|@ai~6CtXJ-r=9hnpP#Ld)r{ial#Lz5Y0Xq(+?>nM1Odv;)@>mH-&d`gMf z{ebA_%(B2RNq)KbhpC%Oe=UrzE>gR1i0`iL?lW2|7#}}mH@;*#5v`m~D#`R_2+J!= zmonO0_YY(}-&ddi_3^HzCXa*1vSQk6N`GoQnLp-Gas*HFTjc>c@1^S7>I<(_i+#V+ z{wT&XtZ!sYPKZ8H+g(}IbJjZD!qn_8>Wi6k`E2u~^*H0&jGdP=-ZPFgCH`X}S7ubht(KA;R9IX>Gtp=_CZ zbN7);`{SyZJLD(YDz3M*7fn;cZ!h{W+q#UH*Mb=XrKXR0HMg7`zEe*WRkq^_L@k}T z!-4$`u{6ul6%*II4e95doN)Hb_D0mKa0WN!w?*gg<-Bgq)8E=H-gc1|&AK>YP48^z zOu{7d0_=m02`h7pz2j~${&?A@xw7i}tXK1VUS*|KXGfHnur4Z}1+^|~s8Yt~P6;?x z*M0L*{-uzIev9m}RXaTsAKhxS9J*xh(cNqkoaZlE*x9piUe}B`c3&5!bi&0uKa8XF zRHh81^PYJhdb{hNe+ngN)ygSNT2=XS?D(;@Z1xE&$1`Qt)%UuBEY;Cd88;MAdR!ZWJz1|))}ISNsV3FS z@5=M!oQU08DCY2sI-gjz>L%md0gIf%csI9`u3pD-FVFhfe#}mfR6+m3n)Y0?b<=jp zxA*gxpJ+UU%n8SP&vLSBYmJc#D{Jq@onL!?QRwCTS8s0Gxj86iRa5&UwGj;HMiq}% zuDLm79yxUT#K~rT-)(aajtgHfuArtXcxiv<<~M~k*2~L9o8T>s*?;bx_T2o;(d203 z*CliLwg*=}J((jvcqe1d&wrfG;r&Z#l#y6d;7szRbu!-a6_GMFRA`*>S=>9_zuhG-z1P9~MBxjG)+ zfXfB%dNB!)GpJ~m@$hl{NSwbyh2ZE!I+08W)S)RM@cQw&Vg-zfxrSE;4AH0z z8k0a}lBonb2jUReA~J=*;m|k`gHC~IWMmXns9ddq_|7bhKA`C^3MdlNlVQgbfks6bX|+r?S}u zh{1#i2ux+LX&gj?Kr92480H2kR5A!mCn|#y5t34#Xz0)r&h?87<>9GB@&`$z6w*k5 z0ayd5T&&QlKXeIE84|65^n6lS;7g^_IBW)u%^_1hD9uMyYLJV1R0^3$qZ)ej6T=1J z0BRw9rUC$i97MzQS0Ru_p%N+-QXXFK6i#pXzMBsglo--L0gwg(pkykYOJ;CsWFeKx zr82pIM>3F%(pQL4$%_A_tzSMkui;4#LDgXV6$a7pnuZj=*mrXDFOoq5kvTBTp%KUo7EGWs5jufQ22B>7!eWa= zbPj_&JcIAi)e4D53#kylM8G593M8n3E8NVHsdE3=8*LJzp9er07=tj1GCXM{SdzYC zyo=V0^j~~<85Bm97+^On1EmX8Lel$EIKmh3_3!+Q%){R~1P=FkkWb?GGhLtQ`XmNE zN%?bjeWvS^82BXR&)M~Vqs#KcVG5ChUqD)LRPs9PaS9x>>>}q017U^K*DoMS5JRCb zm@F<37x!2azyqrhghyk1f9(MO+F`Jwu;2j92Gc1apkbj5iC1GVV=m|~Y=h#U7zoWZ zq5MGe9@A+?lV=pXjyw%SjL-l-;mm9BSb;zgbjf;CX6E_ELZ;EBq;#y5WkSAi8*87w p%P$#w;ulECv9W(7^D3iaAR%{{s*>%gF!$ delta 359 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 diff --git a/Resources/Textures/Decals/minitile.rsi/dark_corner_nw.png b/Resources/Textures/Decals/minitile.rsi/dark_corner_nw.png index 428ce9c617fbaa32d7a508075515e72653a8fdb9..92590b4a514b1f75ed12483f25a9290bb9fb8a21 100644 GIT binary patch literal 5088 zcmeHLc~leU77wyVz+J(O81weKoJd3y$rSD5X#q)a3JD&6UpUIibeD}Ne_uc!u z_q)lL{Ftb4NBU$sjYe}6M}$bhongAHEWzh0nc^&sX8A{kEP;}u28LFrNhXy9gIb{_ z7=)2brqPVoYZt0Eobj-GdD-)coki$x{4lKj`=v#Vqe^-<_dKY0us^~6%xGipr=QgS zF)*!fl+*1E9?R-w(j@Jfv4t{^`d`D#<3GG};!^PX@P@{+U5_lAWFI^9*H)h%KrSn6 zkJq&JeeRZeHurIFQ2v_i<2uTUzW!Wn-|1MvRO>F+hqt%)Tu720c#&!UOZ|ncr2K!m zKd)BxUwOVZJ=4{v?%ITsAbez5GuNui!YaTmj~=?*5uGfTZMDDV{46l%lkS%9o_ho$ zQ9k%*8IF$dVl_+h3lI0tSQI!-A8+WP_;BW zj^3f1=~56;!g7aj&nsWg%;h>v-w4 zoangNCIp>+(IL{~NxThjmh96BJF2pD$kmwk?Xe3=lDSY)Tm+k(=jpB~;I5hKnHnWf zT$mLXGWhbf@)qY!p zN)p@Z(l^78dzQ_L*)}&F z>k@OaPjGiE{XG0>|E$|je?6I#)nM}vm!(^3vJa24FB;Wf?R6IJufAmw(6gyx-WfRS z!NecFOnmG*Y1gCG*TW{n!+ReH9`$$hZGDb9K0fy1e$np-FMhOf@}x;UKd#@|=+M(r z*}L&Y!R5C7ks=4X#+{{77>SQUz6>wO|8REIly5?g_&4q! zKkj64RiUiyNYulLhQ1krQ!?#Zr-=G@m)+mPJsBU_mocWiko+NFf9oH$1%K8tq@TR*urgG(lHeKCW3?9TID0IV0?0e8X{e z?74j?PmXzZ+I;W=8K6%|RY6MYpof-n6eS7;-_t}+(ud_?p5UJRs1SFewH5g5a}siZRef-XKzD~c{RpbPdqIUW$N*L885cG(w|CAzzx znCW+@_`>Y($2o2G%8))=+;FYfCeL-Fy7ZZ3`LT1miMdfs|JhT=c3fGYlpQ#FC*f4? zsU_kIpZz}2HP(HCW_CU2m*k_-T=cs-kxwnvH7$}QE_I%4^UK~1Gr|+17LDK3&>g<) z*^R=1vId9cwekXN9ruI2D%Z!hjR(`>EMHd7lZ>fZ`P+#ibiDZ`V06+lxTEZNrSM4htwMk;x!&5i_1EVM(;XL<$*^p(EllqGVV` zDki|00seG9qYwb72nuBwRZ6v9XcRHcxI*x362nY}S%pd!F%u*)j9`t9U?ARzHwy|i zlIa|#Kb_&H!;^*5kgy>LFcL9SC`v1YVS~ZoZSe8d=oBzpAP~ST4$R>|Km*dRP*bQ8 zQtRDJ5Q7*YgdWq8T8h-D8753ru1TXrOeUCTyz)<_l}KL0tMx-H06t(Ns)gC!ELf$2 zhg;~W&~yMYe={W`RYV+xn)qb%z?;KCSZsuc@HxZm7ZN%> zs6`Vho8|4pF`JtbBLv|9YEe_A0syldL?aB=5h$h6$ut_Jh-q?)VX}NZEdd(}M=3M} zr3e7Z;vhm6SLnl%aX3PbuMlBFEFc-CuffUW75_`yw0#(UgGrAd^@&G7< zSX^irWlVS|SlHAtUPbE%{}&&AW`$ub2G|YCKMB= qY@y_FXkI&x(mK^R>u0C&1{%#OauV&XW?eS0qlrVKLiWvFn)4slX@KSc delta 328 zcmaE$ew}H8L_G&H0|SH0lCEPwim^Dz-HBn{IhmJ04okYDuOkD)#(wTUiL5}rT!2rA ztD~c%larI8qN1ydi<_&fyPKPxot>?%t+uu{P)TG^Wg(E_Dhcun{tp8To6hK*2a0kQ zctjR6Fz_7)VaDV6D^h@hYwA5+978Pp-%hj^I-?|p;Q#ZltK+1v8Jm+YQZ#Qqo7Bcl`%sy`Fu|K}?`+EHp{&(Crn}0ifd$7-Og6$4C z|4YF><{yd+H0t-U9y2tUV8QyMyub0fcNK5{??e09H(g`zvz1s<^2Em#=yC>6S3j3^ HP6<>WFQFyuzgmsmI|mK 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 diff --git a/Resources/Textures/Decals/minitile.rsi/dark_end_e.png b/Resources/Textures/Decals/minitile.rsi/dark_end_e.png index 15f5068670c907475bbf3f1ea2fda67b6b78bfa7..82b0087a0370b9326385b12597b1a857cf2ebe66 100644 GIT binary patch literal 5242 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 delta 389 zcmeyRF@<@8L_G&H0|SH0lCEPwim^Dz-HBn{IhmJ04okYDuOkD)#(wTUiL5}rT!2rA ztCN$HqN1X!i;J79tGk<Sdqob{@t+uu{P{~~FPx(NKt0c%T_&*FVY&xTJ9w^FL z;1OBOz`%DHgc*qb)Iyv zvs2LO`mKZy?OEcMW=`iV(~6hhd#(4DAy&BhhF`1o)q>Y*}Os37G_Qx&z+ywCR}l3N2OQupZxXbL->rWrZ)HZJylp7YoSARAVZ#-N-k-+pI|CA%O`e^Xsd%r`a_rB-H_AUJ+Szd}oOoFLSOqh~JHac< S*USV3G=rzBpUXO@geCyM5u@q= diff --git a/Resources/Textures/Decals/minitile.rsi/dark_end_n.png b/Resources/Textures/Decals/minitile.rsi/dark_end_n.png index 3bd2d26686bfc0c989613551392165db0da77f52..b642ce1bf4b58ef371cd5fa7847aa8f123f794ef 100644 GIT binary patch literal 5188 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 diff --git a/Resources/Textures/Decals/minitile.rsi/dark_end_w.png b/Resources/Textures/Decals/minitile.rsi/dark_end_w.png index d6e3ca96ea6716ecb87cae91b3e1b75a5e80042a..d9099511d8ca2131b358f292af00e6dfa30d077b 100644 GIT binary patch literal 5159 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 diff --git a/Resources/Textures/Decals/minitile.rsi/dark_inner_ne.png b/Resources/Textures/Decals/minitile.rsi/dark_inner_ne.png index 82cfac92064a29ee1999e785d13d7e597448d792..7dac62620b8f92af311b697e69bbf2eab23f9769 100644 GIT binary patch literal 4962 zcmeHLc~leU77sSPTeJg9uS@p>;Adfj~BrfgowhL^GV|T<-rslc z@4NRVUp|eFig2Qjqtj?KCuw9@47fvv@WSXrob|W#TWi+%2Or;i?_7^p%#;;-x{-DC`Yhz% zUt~FV?+=dawH@hka#Hy%c?|mSl#4^0&mVzb)TN-E`<^t!xvdO7xM7+7ZYgx@`S#2F zzH3n?+b_#5^lUC^-=FjN`rJ-3IQYZ5DK1Z%j=C3>7(R3fnsyh7K2J{EOFXMv8!$(x zo!We7{E>Uzi_wGw;+Hw=?>dP^Wg@%p%ffr9kmp-M{anN08v9-HBO_|*2|FR^*G_5` zU9_+(dHJ-vS*H_rKl$aS?el+5*(kCT-njL{wRhF}-6&iC81dyncW@D|%nDeMxq@ z%kl$je_dHssI%MU*@4>~-zL7UZ)je+1%syFrV&>h1@N_CQs?@GhGB zgd>PGA2`aJj3e{6oS{u$yLarl&px4*<@tD_*{vH#H93Zi-G|$z+S2g!D z+qI(Kosy}!H)W^o+jfjw_`P;YQ|_2FC2jqpwIS^jY+Q#7}=yQCRBQXM|pudaq)9_trY);x0erpwL_m0ovdb*JXuJJ?qBj948bC@tI5RB*T0qp#@q zy{F*SqsBS8t^T>83zk&0R5uo#Kj>fiQAB%Vmw#dWbLNPBb-(XD@?o*KR+M1Qj4W;Y zve7B6v*rBLa=aztq~g%mHf|j`;}2bmK$dH&Cbx+%dUb|;_g((%0;f$kPH2}nKMY;B zXxf;Ql2bwN%X_`@`ZzuK-Np;KB_5LFt)KZn7x@093nq`X`rK=oPovqaR!Jn$QiUl`C;D(yY6or2OC@pu+4ih%7;&FX&oYBzAKk?;=+-(cIy^l;59n3r9_v0An z?Nc*jdKVvV$s4}TW2@HOD@(0wDkrB$F@pRixLmt5Pc5(hrZfKJnv)6AGlft4T3x)y z>iiBN_m$tw;bWI;#N0}%b>eKc)a*WP`2DZ)Cq=|ZEpjb7+#ZqK`@`nGZHFCGD;1mY zY`%ZbE{{j{#}A~%+P)~ADH~n3?6)Ji+Om$U=|6TK%N6g}zn7JGxMpf!t*3jRtN7!K zbzff=petT;ZBf!48Vc zoQ27(YuoBe(63i@n7g0Zyx42V;O;4G1>G}U1-fLsY&MGPG)#=pDM)69Mi06ujV21t z&|`QCNkIxSQKc0#eyu;wfK-H-5yzLYWqJvjq>9Wmkg=Ijay&By7ZQx%Ai5|61ppe7 z!k`R|T5Ciz#0)Dg3Z5-u76Y=XP$^@U11tbOSQ(g}#bL5p8Vzfxg^>zR2Ot9u{iTIb z4!&$yF{DwKX28ktbW%%s4uv4_L3@3gL2V6(z*(f4)Bsf@Se5g}k`Yo_^q_@>f<%=@ zZ?ytszoAK~l&{Hp!#B%}HJqW20P{iIH?&{HZdC?aG8r1C!_zG8NyEep%lasx!&L-o zeH3!|3Y^P9U?I*|!aP1HgoQ)^4;JzQ0u=%dU&%%IL!hKuBZX;k(gFp*nJR$8CHOd3 z$O(i6Y&HfUz?KGbc?cX3$S3eXA~1kMB10hN7*rrDG4)WdEKmf1Qt$)$ToU2KN{)hn zc|u$XD>w)VBT9fF;0gFbw$chk;OGpUL4$$qRB5n8lBL%sS|==oqoL7KF#}<;UrVCZ z7^MUTpaxW0LT56*o|3CHWGsbQ_~Zz{8$oy+j*un4x7pCkH@kx zC$wD z5R6zlNm%^^Sp8FY5~fWgLH`&?*jIAZUnGNo48*x?J_7SWUco#g1AGBr|IXLIKKz|aK+wBI-iqIMbiJeNtr&PK z<#*Zjj;^<2;H{M3W!L|WF8b@k6sZNjfK1@1)TX}K0ghQN(X-{@xK7RC@Iykw=Elqm z5THP82-sND70pI5Dv+IE-=z)&JC8!rcqZ$0HHl4 zm4(~iwexsy9QP@7a2^m%l7@xKea_=cLTEEc9G46yY&^ZZ!rL6)f6u1D$K6b$t$Z;o UuR?S(7%0=E;Zb4xrY~9jUjf%kQ2+n{ delta 193 zcmaE)_LOmgL>vb*0|SH0lCEPwim^Dz-HBn{IhmJ04okYDuOkD)#(wTUiL5}rM1W6- ztD>T!o2#pNX%5g122WQ%mvv4FO#mM*Ly`ah diff --git a/Resources/Textures/Decals/minitile.rsi/dark_inner_nw.png b/Resources/Textures/Decals/minitile.rsi/dark_inner_nw.png index 6cebbf93f45eb3bd64bb8bd70b1a890f96a03bd9..e3ef1166304bf63b88cc21943eadb8c68a4a8944 100644 GIT binary patch literal 4892 zcmeHLc~leU77wzhxKt5vd7v@4usF$NUnCG92oZxAB7(S0W+pI@jbwm;r7RY;PYN7vG5qF3KAB^-o5)X#MY7>z;j)a%l~RE&l!~x?rFkCVMnYfV^+@ zJHdBees6498eJGtpj0&FWuM-ErBN~MaAR)y`1fC}`{Ip#>9U-8=eKNTylwDpblEuf zWT?OAA1RRAiUH&2wzbPH;-Q5hb@^X;c^A=|Oxbk%*SDh1o_u=Ob$L=td*v|yEkA7F zo!@;KfBH6+B`x=vkek-81csMfboGK8Z>=Q=hV*ecprJ=P^%^FpFkF3nC<6o;>!u&j}vU|_!J zrx^kB3&oFBbE>k($!4#e@K5K*%?obuTE>0(Cb#m2Q|$G6x5CK*1^v&&Pdq+6vGvyh zrajvw&h4XpT2I#G4C1>Ux*9l88b2@Ks{4OpGwAs{v$pQ>EcZ|hxqerfLvQGUVYFD+{ z`1;9%-%lns(W*EH?x{|Oc^#-#=RU|g=wp{4Ze8i&K5F@w*PB9w2|;ZYS1RtS&&3i4 zOhwDzZGWh1T=+Qo7m4>W4tWnb5i&BFcD3Z|^(E(hwQZC3-!7XQow;-V)+xiex4$dg z+E|9vKPkznPcF_MnUxf3*IYS-x-E^FAMW*nc5vOvT7k=$=J$nVs&wFy^%I05dPWiuS+MhGae{E4%mD@p7P(h?Qac?;o?$3AoNuXw2naU6Oax^gC~bm&sw&D)u|V|n;{Nd&)9L#F!%oO_+TV)~|3WaiG6!~U~O z#v9z@-}hg!E@tAynsL4rtLnUO4;#GRCtcAxr|Q}&hukr1bp@^Rr0Splg$ITMzTBMZ zFU`~__a17Fu3c0+S5{Zp)^WpWqKn?UlJ%SV&~z?xd7qfQo4nyZ4VD#*80GNWuGM2h zqQhgIi>hvgB(yf%K?#Cr8@0@0cndTDtH>%?e%Vo$SEd zFORGcmmB(I$5rj~={VpqqQhA{|6=vvZTJBC9-j?+2NX5@(o%5M{YOuG>|Lan*?*0G z!=n1w_&J{UqmDd$W#hE^>XkuH#z>~mPGHopJG@PFF!N5q%Xc>IWkxgmyTTiw_oWb^ z$3@GhiBP?kj$nEfPB&`}pa)VYzW!zdf+pf5RfWe9Ix+3p;iEJvfr)9exN=x-2*Tru z&~zgnnI5i0(-To4M)UV`^fikBfEFhas#&YinM7tW&5A1m&lWL*MzyMtiDFu`Jc1ge zH{w(dokNGAU^9`zqWL*eeT|q}q>xVOf&e2iEuJI|A_gNhHI<&qrt6Jy45m;hWWX#2 zivnR$&;#MsX&@VR2Lt!ogS&Q>_wk)Hue) z1b7c9na)HaIuy4+0dP72a9BJZ3uE%x5TB(MKpYj92?0PDV)8gRN1)X?ogiK6h(czDh2n|B2fdQxiLWk*7O&_O}gcgq^5euJ8J~&t`4wKD+ zd3-+mqf!)ZG=W^SpfX`Pn`ND`Y>Wtm1E@tTnF;``auAIu$cQ7P-l){;HDa2@DXPV? zds+?(3PVUlijX(}g;^XC%oVX=C5r|46mi)Q3?x1D^%$W}`(N6Y@}c^6Zh9zT0_&$) zMV&Pji6?cAI)@sLIKU&|3M8nNE2?MLR(bW- zPmRYd`v53|U@p{yG8&^RScauze2CVU@n3xSS`~V<7+}{a1FZ{mLPmEh?BdJPbpFOq z*FOA>D*))vi+mElpXvHc*C#RXNy?wI>oZ-S#K0#hf6lJ|8(oecU#4&!_yv>-UX>V} zXHnoa%PC@-G8o(?0n!Kag_$b!SAdjc2a{0Uu+B@tAbCoti z2rX3K9>FOkTBFwOoj%7}Yg!}c+>g)Wp6TMb6g8{nQl2dN{LQQFQCxHeVvICm451`t st=+b3j3Mv+(QgO<00000e@Ao!TOK;KZzr-F3;+NC07*qoM6N<$f|Yelu>b%7 diff --git a/Resources/Textures/Decals/minitile.rsi/dark_inner_se.png b/Resources/Textures/Decals/minitile.rsi/dark_inner_se.png index f6890fe52fe1860faf81ed110e823717841fe3e8..3ddb20a5f4d00775aa55c5659737a18bb1d04b21 100644 GIT binary patch literal 4999 zcmeHLc~lcu7Z0*k6sgo&M3E4+f->0`GZF+zSkxdUfC#NRnHfSPo5?^TYL!J)6i|#I z`e9pKDt@S+Af+fuD`>T#1ym4PE!w(PTybBpF98wH*K@w(IbZ)XIg^=p-@U(g@9*7v zlb6*|kzuYbo-QO3$u%NeC;@k}^>VNWpXt%^<0O*(zO?8#LV_5`TAe0Qp~T6=A}vnF zjfzAP$@t5y!i4h6pAOFMm?JVTAL}6FTc)>kk{cRnowti>W}JF(d7RsE(@-<+^B_I9 z?#1)tF3T=mv`E6^{m&JR$%~d=$<993l~nzWCH1gdjr!8FVDH;Jj|u6fuG9DNWoOP@ zIO69S|LoZMhc|z`XWaHp!}kLILD)V2#5Rw@ZE1Y>Kuyz?uea3Y9Eg7kXQ5x}&WFmb zjX3mY*C_b&!-9D`Gdf*YNGv;pa^tfaNkTg$Wd=V|I z2srzo^?G{!VbPt3mo~-z-XQ$4py$TODq-Ff!MJ}JE-RyHq>sM99}S%R#6qc(Z|WW6rEZ7I4;SMfVx%lLK-vY*E`57#vfTZ zZppJB;%kPj+Im61qRJv@|Df)tMXsz5i&MtM7&0_ho@)0F$oO;4qj8e;ZGR98eP2HR zbe(Jb{E~IoJhwBc&f!B3#yW%y81QxIR+HcGt5dUto+M6Ip5syH57td^bNDG@Y-Vnm zAverLC5_F7gYpYUg!{J6w)@uv*L@Pn$*&3q>q~YeNm_P`#HE$~eEbx@u#Q6>|k@|=9>8qq)qxE7qbOU-(El`pMPYwr2|%9T{~$ zcC2`nb-2){yY^zP|D1~FE9bg%O>J@4wvOOue3-^*#IY{8K9ZWwb}C%g@eqKlXBgd0TTlYa$XM9R(DkdUZ|kdW843o5o~>H5jx_QAtMGXuA- zk|8cbk3eVZmzS*CA)Mu4?-P1=c2zZF)``6cPlo!nIr+a}ce{*CRzXU~;JfxR6|y5~ z46<~CgZt4*^plrvip%BRdD?Tjq=(e`st##rlQ`zkM`h)5J8%lh3Not#?}Cy-{s? zB3^j##J};Wk(9s*qug6h$0(!A4*VWhn_2sLM1%QRcf0%ek2Mo2nKu&;%;X?v$_1=F zM7!4vdW6Zt)9L2!0-vzB$b?~qRp-MNJo$A^x20)PoZG&6nyt<_Rp41c$*!_@WM z?&U6>k+t324mxbA0(8OOMN((wIi4-u!s726ZoFL0^xk4?V+^PPa zLRMe`%5099F4l(NNs90^9WG6aj7HOvQ9eeQ66g|OgaLpGClInxrBv%-qkv+=g~78` zOrwx(Dnzn?5+{x#hiG&-nN4L=>5#~%NM%w2UC04CED@FnLwg~>NI*#<2rW#b84L!h zfkoBm4P8I`p>|`e^WlM3dlpO^Oc1MX9)& z7}FmDL;LKtDLSPs91Nx5N?Zk0^p-6l~)?2<= zXKdm0cLbRC;l8E)I(C~f&=QMbp$1K{x)&i7P^|02m_LjIsS*4GMq`2xQFlds-=_$QYjlix4$PW-;7>pflX#K1c#zt67sbiES;@1*=b zyZ&!rH0>>=(s2R~B(%n-G1}7+3I7<@4<-tIFFYi_}xY-es zNGU1kY8&`xi)1I89wsEMa`XxZgMr%cIeHRlNS*bvJFY3gfY6zU5R06zJ9-cBU}oXkrghb7(7*O7r?V?XzwL{=bQG{7gs zRa;wIQBl#!$;sB%*3r??)x`xUBe$sVB#>e+3Gxg64+acU-pp=5AvToMus8KyJ2sc{@w+#t#GK{FvSF)``j ra)uOU?KokMos1dGu6->GZf*?MH;V0@ADV3pG>O5})z4*}Q$iB}rxrTK diff --git a/Resources/Textures/Decals/minitile.rsi/dark_inner_sw.png b/Resources/Textures/Decals/minitile.rsi/dark_inner_sw.png index 0a5c96d7621e2ba51bb0ca672bf023da287efd48..cc8919b283d12924049fa8c1ab3d3c640391ab76 100644 GIT binary patch literal 4941 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 diff --git a/Resources/Textures/Decals/minitile.rsi/dark_line_e.png b/Resources/Textures/Decals/minitile.rsi/dark_line_e.png index c50102d604cba12ee357b1d13c207d7702d965bc..544580f150f2fde2b1a53af9ace64be19dff1f9b 100644 GIT binary patch literal 5134 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 delta 248 zcmeCvn9VdnB8`KYfq}tgN!KwT#aJBV?!>U}oXkrghb7(7*O7r?V?XzwL{=bQF2E(b37t$<@Wh&DB*~Tiedg&eqlzsAR$eEf*lgRTAVE{2vAwHl5KqKY5L? zM16s$i(`m||Ih($ diff --git a/Resources/Textures/Decals/minitile.rsi/dark_line_n.png b/Resources/Textures/Decals/minitile.rsi/dark_line_n.png index e1ca99dbc64d221658c90e766fec0cb6a36c9e02..ba8bb6a1769a8b22eb387f46611429502553547d 100644 GIT binary patch literal 4938 zcmeHLX;c$g7A^#_K~M=gqoNXG+k#L@rIHX6iELq00x>Ki+fb=gLP<800s`9FV$*^f zDu_rcuCyE4ic2HXDk5OFyNxL7$e^|xj^fdF0mXRfLwm_wN1P zy*GKumqvs*+K;q{AjmN+R4fB`y7{uP2A}hzRgDm2osk_KN6D~Ey568ul4^oZW$6hz zVIq|fWV-tA*o2kW=?<^&4i)5#a~slF>$AhKV3aTXa8`y=6}9HJXN)zmJU7*jm$LB5 ztuBXFsmYTqK2tnpipvzQz53jgYttUgBp2^Y%01^+(|W&-cT8%REl7sfJ?D#(ppfZq z_Xp6^?jD=#E4`Vo8|=4r?2|m7MRWVDat?hte1r3bF{iG|_P(BF*EO+oZbJU($c`VD z;`gcS*>eg;w6xooBZKFU-1UX4Rh}<9G8`2Hsr!H>8+^E zlVX|qW$kri6IMhzXN4N7JGXZFb*^2ts&jDJ=5@5z_C~v52Nyo<;;4Q))Vw67sbu*B ziuvHz(t&%fwH;4NfReAGWBQAe4{R8jkzN;jFX387Q*iEZO0uYF`^7DLJA)nFg2&9~ z*xYHTEc$BAKt2*o`}yK+ub}GTRqDmh-RIN?oYJ(!$K7x!n^aq5m$Kixb}_F;h(-9? zi@#4g6p(njO#N-!>8ybqB;aZIj@>q`5Aa#Z{T+6wS_(q_v3hPcq_Dw%se> zgdSQCg*qjA=D1l|rz{nFTqs_{aiWp*Z47D@{YEXc-4L>TR1mF-opHHjCAp>&ZL-Qv zRHg)sYx{P@@Evr|;QH=gF6>#jV^MI7r1aAMRLM&D#Ufe6T#sfi!FLsc-`B#c6D3}y z@s(<2{meE-75BiFm5W!&X6Bx=zrCnsnC*c_HK)d8I?lfOR6DyRt?oIwmz)ao)5gA9uc`*0@NIA$d~DuQm$|MT>u-Ixn)bxydWToa zh}buc_4ns64$f$)pVZz_`s#9X8}I4&JX#xVuBrxqd!gFy?bW06Z}{mp@Xx#4duvU5 zJz`ad^N_l`!R`6^ObD{dAp--YVS$0~DiGA&+OJnk3bpnh8WcHsQ=S~NcdCV(e*I=! zUb%RhjkQ~F$MmYh>}e-=V|+R8amCi_HMiT|B~1gX`}=oT%QaYe>R9aSLL1tNiOA`; zv)3DEXC9kZ#D@7-1{AL|-gI`-WN4Fj&MRLQ@!C(y|EHSD_VGXSM|wfzx=bu)=kvq9 z(~X7}UhP)9f|42I$Jc!6vwy{@2{)Vvt?|s3y-cjSyuvoub(Oa0rDRt1$sI&M1Y`1q zQMBfZG3w~Ohi=9lUvNAr>{M}QcMEO&Fx`ZMXuI-IBoF(oQpDLswTuo&!it8Ev~90g z=@t?fkuY?1)%B2>FRv}`E~#>uwM)JTU&8Zxw#oI60Y~?xM_IoqpCWPEHv36Ufp%N# z{D2!zj}(Z0)c2dOs;cztJ}`E8_fXM4E>sWNNDO4|_AK2yaP_tG&xppUqXI^CtTObgy z5R`?YFwlUFSy~D+!CK>3Gei%Dm@wi7QcsaOE!~WX$#v2>H&EsW9NYlS5vjJk9KP6TBTT54=x2nGJ$UY~AI zTf$M`EJ96afT|I!%Km7{kT8k#y@i1d6d?4B_%&j8O8~*hDTtaM3;x zkp>cEC8qA{l^IF_pags_M#uq_k}oF!6oJ74oP)v>mAF#DLj?j9>w!|>!eE_2gMsZN zHJFNE>9s1$8fLC_^I*(ti& z^8K^~6qEv^Ffm3E02D#FLWC#eAkio)MEODlfe|3-qpwqt%B=sTZ7v_WPtT@@l18w8 zmPOQ4Q&GgMo>9+GOY2h*F|CRK{i8Qw-^s~8Nd_(l z;V9Vz7seC<9?ZoN0W9b8y_>eQMXM2gafEBNzj0M{ayRHK#A?Q`vH+_nAkts{Tx0-CX)p> rI4sJ^IexOlyI(`D4zZ}N}y-M{0s!&)^gm`yAO3r@(TFN?9 delta 265 zcmX@5HiKz`L_G&H0|SH0lCEPwim^Dz-HBn{IhmJ04okYDuOkD)#(wTUiL5}rT!2rA ztCN$HqN1X!i;J79tGk<Sdqob{@t+uu{P{~~FPx(NKt0c%T_&*FVY&xTJ9w^FL z;1OBOz`%DHgc*Y#;uQM?XF_pJHJK( diff --git a/Resources/Textures/Decals/minitile.rsi/dark_line_s.png b/Resources/Textures/Decals/minitile.rsi/dark_line_s.png index 1005b61e5338be443f7048f796c4d5eff06a93da..d2419e8cd3b2d19e76105aee389dd3e766ac0051 100644 GIT binary patch literal 4996 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 diff --git a/Resources/Textures/Decals/minitile.rsi/meta.json b/Resources/Textures/Decals/minitile.rsi/meta.json index 313a68db1ac..50dd3a3a1b2 100644 --- a/Resources/Textures/Decals/minitile.rsi/meta.json +++ b/Resources/Textures/Decals/minitile.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC0-1.0", - "copyright": "Edited by Flareguy, originally created by github user @moonheart08", + "copyright": "Made by github user @Morb0", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Decals/minitile.rsi/steel_box.png b/Resources/Textures/Decals/minitile.rsi/steel_box.png index 25643de33c01e5a95e71b45f0f45670c77dd7a27..65bfc266e917bfd76435e1fb146a8c5eed49d4a8 100644 GIT binary patch literal 5312 zcmeHLX;f3!77j8!5m9ggff^%KKr>I|mLNkIVhvD0WfX3bn-Iuka!CS+2+EU!iXtF` zP@$!@RZ-xHinB6VM?`SI*(##qNYOgbo&;1}uWP;KTCe|1)}8k7oxQ)a&px^NHaO6K zti@Cd3f95RpGsXx=OIsfFc!asz!d(?|HNjKk~4}4*jJ9E{!z8x;xp6=Ehw7-~}S?XX} z-2mO+JL5Gnmu(lhb`vgSVw&BrC)U-cniGwYaVJ)8xX zYf?lfy6H{qFIiVk?CxuNR#8~;YK8c_g{LaIS6pAw--35PP+6&TP&R%PI%cE=jqb9a8cT%Un*Nl6KblxJWeqsmCZ$w z^6KtKP*>g;DGz_{S!^~gK=N|>jMZ-E+P;^ryL>nPd6^W>jk^47;iGN%$k<2Y!f!X1 zme21!tP_vjPQEsOCt+6ArVP?UoMp@RAsDZyJ13n6uDPmzEjd29-g}N`j;brd&UnSL zorP-@SJq#(TX6T_tuO#Bt2!Q*OKm<2Ih-;HqRilGtmW?-Y-+8uPQeV18oHoxebolVb@g!aepoY%Z` zWng;C;2883bs%ZVIgSuxh|73;Rt0TuJWd6=y-L(d-prdXV> zBlPa_@l#Rw7i^rKU7u-PNaPgnj^P%INN87^0_mF>*0dEN+^r05^w@XWqS_~}%wC=F z+luBxMeB2VrzUcGcRr6UNeP|YUy`}Dm)+_=rQu+MRpx@$3sOZuXP9I$3$q^ zsaY`{Pq(h_eNd=5UR=}razV?G>N@Iv>3ror2IGvn4;kM#3-|W)4O%9KUf4J>ec(=b zjA?rEi?i}EZ(b&J{-{+QQZ-dhcpU4n6_57QM1}h5Be-eLlhQ%r(!S z{yb(zsqCmOe|pM#)iP+=Qs5E#c#6LRRI#MSVab!&=^g1#PKO_SP08AV!5C#qe0+kr zK0fa{9O!GC($;?!VC*%~H^`$Zn-5!9AHkphb@`U;YR)$%#?$?tEZVb={7qX8%;XDP zE}G4GLmRZPPn6-Mre05s`7*dVeg>Sj!NjJ?jdb$n=_{?N+QaDuWIXetc~QCg)&y&r zM!tA!diC1CH=e=Ft5P(@-RsovNqIr#T6n?Mfqioqsa2QgM}8WeR~#{G)_y1V|ExdZ zdToML$?TMnm(hDJtT)S=Rwyrc$y?Ic_6y=2i1ToDu<1ItKpIxN_g47P6-Q&ZCyHJT zUb2}rN#WW+c_7*wM29=-*wpRlCCB+BZh`Govj^Mqr~8KoMorwf=Zb&A%kJF4;ysp2 zw)1lYtLbz4tET;KeyBbv)c9@nJf8KI)TjINdbx?awM5^@pNMU?0**zM%a#7hEFR7hw_V3;5!QNR-7=6YDT z>mUFiLr@s2lS$=jNXNz*a3OH77ZY(G3T7K=qBQHT@@9$4Vj$#N9d;pOTXdWazm z4x$#QBuZ4GkYn|jFkg{`vT-<|$G(eCrsVP7!^_pfEC4=;I#@|06G%jvj5yLmjrwW; z$Z$Y^>!A(<+cq%-Q7e*E0>oE?$k7=iA%ueW{>mhk)R2x)Kt!a744A6HsN|1^^yl(| z-+SmO5KClAgBKwCBTG~w`asr4vFSC2bVddO+~4DVWc@C8gE6q;@gR;ukfaZf%VFd6 z<3mD)Kq7<;w`4au%op)#crr!6z|#GzLtk^GPJUh>lS4G$EOWhxt@0p2;B7seFb|z!15OfCy4aKvlxhkx}WPgaC@= zCWL8B8WqncxzX@678$_fL1veqvjtozWU2T0Ul{A7b@XibG8ONO3? z9;Fh)V!~n#%L0N0Ln)|X4I(te39yD#f_PXiMnL}9kRHW5-Khv4M!r<#>fTpAn1?2?_CQvCPTLJla;w z7}XNL+(^naAsxGFG+}v}SCY}rtHBu=8goCLWv0#uW1s6nS(?s@1ppYXZy=|}J1+At Do;>!3 delta 411 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 aDq~#TLfgPtGX@j5;ez}^cn5vrGXDd)OUG6K delta 333 zcmaE^@quZAL>31#0|SH0lCEPwim^Dz-HBn{IhmJ04okYDuOkD)#(wTUiL5}rVt`MG zYhz=hlcQrxOG{^4TW?QKO-)UGeSLRlXGKLtXlN)<)w?RY6F`c)B*-uLKO8W4`7?f+ z{6|=#{-CFeV~BsNKKsEe!MJIN{Qvm%CTq;qPOu z!-f}^rm0=(TU&fTfjuMth2rtB9lfl<{%cHhbb5P_@vYk^ymoq9ez-_WSwR(J=sJfI z&2L9<`W7_FFPto1y7B+hzjMztx~Uc~2s|m15n{wHH8mWGKjV-y-#@ko`w|p>JnZ*a z{Kzq~hq0H7tKdL#sSloKZsizuwLbFekG;(@-j;p P(3=dNu6{1-oD!M<2}F;^ diff --git a/Resources/Textures/Decals/minitile.rsi/steel_corner_nw.png b/Resources/Textures/Decals/minitile.rsi/steel_corner_nw.png index 9cd5e7d03a449a47e55fa53e585029e13136a799..8216073046ed9714b7cf2327f838e7cfeb71a213 100644 GIT binary patch literal 5225 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 NK>;ED2Yh2w{ss)1(scj; delta 317 zcmaE<@qlT9L>31#0|SH0lCEPwim^Dz-HBn{IhmJ04okYDuOkD)#(wTUiL5}rVt`MG zYhz=hlcQrxOG{^4TW?QKO-)UGeSLRlXGKLtXlN)<)w?RY6F`c)B*-uLKO8W4`7?f+ z{8w0_exs+0V~B>CD#)jQutooGw_uq1~{Ky-$iSf8)k%ptl%2UHx3v IIVCg!0Ne|R#Q*>R diff --git a/Resources/Textures/Decals/minitile.rsi/steel_corner_se.png b/Resources/Textures/Decals/minitile.rsi/steel_corner_se.png index 1446f6856eef81f7ebd9fb34bb03a799da79826d..2535334eab0e225b62d0fa562a210d90bb46e130 100644 GIT binary patch literal 5265 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 Zb&rc!voep%Mxe79JYD@<);T3K0RWO0b4LIG diff --git a/Resources/Textures/Decals/minitile.rsi/steel_end_e.png b/Resources/Textures/Decals/minitile.rsi/steel_end_e.png index a01e46cc97f51936b82321f73d9efaeb97892412..a5bd0f3807f11eb5cd7222d9ad676f1f90018c4f 100644 GIT binary patch literal 5291 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 a>#&$SzLQL7otOhmF`OVCyCPso=6?WN<@^Bv delta 375 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 E0RN?)9smFU diff --git a/Resources/Textures/Decals/minitile.rsi/steel_inner_ne.png b/Resources/Textures/Decals/minitile.rsi/steel_inner_ne.png index d8e5a50f8cf2b8374503360e0d2feb8933b04811..b32452a8db8c0639e6dc9b810b8bb855c6825900 100644 GIT binary patch literal 4961 zcmeHLdsGu=7M}=+Me%{?Vq2FXXo<=slNTf@0RrI>O9Da=YSlV3nS{Z-$P6SxeW21> zL|qi|$!<|OU<)W(tu)qGx5}a|J}3)5&sr6$E3HM;Q`GL4@DR`ToIRei{m;xvX6AnP z{_efM@7|kCK2Fgj`1-u=13{3lDp8pV&amt4=>a|qwT4p=rU+BaiQ#=nZi??PwA!SF)#^ z``fmPE|w78fxW?nEFd|t#a&ns0Pk8!u4=8`*P`&Q)B(w z1NKzjA76E^`2_lQd(P&>zhEKQZk%^&OGX>)P#;NpZiD+tdZHMiStqi2@8UoKpH6xd*BxCFSkUs$ zg9q8=T~RxJ8~tG5I6BJzt!Mjnk9b~%O&|T`X>BY7v6fS@u_>z9*nzeL&A5GW>D!4O z3jes|$Q`S2%xBzjq_ufj&8jNpEKiT1_@6TlIr+1i>alQ~nASc#^oi)1&l?L(h|x>& zvj=X%s7PAxMrF{p4)O8o*Vb)*Hzefnl!(tuPfx!(e)N_Z`KgcR9{OkL z@S?zt=Ca4?oG+U`C1W(~$mwtTwVh8lY8x7_XP#JbVxH=B`LEA9{6Z#JrXLjC)i)-K zu?zd;!aAm7auTX43wV9_-P-j*37MMr{5KuCoRIza(&}fM4~@#H!;6U$ap;2`fj!Ov|L{6<&9%aqtKCP|$@f@?6&eohoAK;GaKJNv`TOU-99>C{3qQQTmOBl@4o}1ljmgf+BQ2Y zWnV14R@U9idb-=@5bi4P0K+qn0z)!Wog^bHCN8G4;3U^!vVtKBK@m|7D@H6N85k!G zlv&RH$$69wQ#v_2L##&C)>tx&O3b&BY55v0k-w0T>ex|{J`oNX05FjZ20KhfGc9w- z*=}4JxORzoY}l>BER?e|)hTeS#YVy+u84~waSkd^z>f5RBWyaoEL9ob4*~Av>@0?{ z%6L4x-OjZOxfYv&$CpZ_JXF9F2oRuw(2L9r=0MDJunVFOLrKzvjj}S7#SFVJG2D{N z$k}YL4iCgosN#+kw(%4RB7Oq|ANZ|l{#h6!bO3BGFjbLfb17E8A|`0 ztQTT)t+>+}8VE2S#C<_~Aa}Pi&{C^qN(+(e3Qwh!vt9mWItxMRWbR8`hzY{6FeyTa z2tFbra2%0J#Cn7vP@FH7NW_F*Hv~#$rWwpkkS-_y&ZPhjAD4=RVPSeiN(d#02*oi3 zmts;R97Xwhsa_()!_grS$uiA7u^8oSR|v4na&TD<8cK&Tm=a@10E!AkGE^)RqFRAKCJ@U+0t5w;A^H{_ zrC;>Fv|a53NAzuaB1HrLi`=5Vo=PKg`tJH}jg-5YVA$OjGK}a;fyVO4K8^ua-x869 znGGbEAN>V8Ag6w(7;r$FPK*)=E<%Nf2qUD3G@JxidNC#mM{%iMCv>wgh)!Gdj2*L) z3IpH~a0Lp~%@xe)->PXZ>f5tO*FFHs5LAo|p^VMzPnPGJ7z5cx@cxUB2)DwJ5d-Y{ zWMFiGNyr- z`c^ym(+XnY?<6RpRbG=5!Od&d#CK^38vV8F%{pbN(E*`1qf*Ct-}VX|Hfj0+ee!G| z3Q{Q*T22eGAR3A%2_km5jukw0YTU(u);>hCoYyAy@FU!*zH~G();852WWw@@`~-`J ohDZ8rZ?8RwYFy*+jkRDt;~P2u8&^Un0xeb%7 diff --git a/Resources/Textures/Decals/minitile.rsi/steel_inner_nw.png b/Resources/Textures/Decals/minitile.rsi/steel_inner_nw.png index ea84f9755ff478ebfe5d08c163edff7ed84ea297..0bda9148f10a82520ed91d027111675096606892 100644 GIT binary patch literal 4952 zcmeHLc~leU77s+QqG$`QC=!EKR3>{!G7u3-fT#%&P;dd6$xO&7SxAN?(Do@~P;>$^{01zZm*ygBS)a^9(uO=X8X-MxLW37w9c zzU;WPncJ1VdYEFuj?^Efc-ElnHV*dqTS-hC-!u8rtJ{@>TQ+yzdYn)(K-nA`Uf3NR zzJEp3@V%WYy!A1m-PdyN+`YMZTpab(Dvk6kGxRs(#LvxV?rteL4=c^Dgezf1n-{m^ z+0e=*cS_*6e~1G^gJ0CmoYEA$B?M|nq*Om1UACpPLb`9ltolQ|$njCqnelgjIn1FK zPrLB)+eOj~rBG3NO09b*e-240Db^uW=77Z2YaRVq`R z4so3jGCtka_1=l<4U7{T$A-C8l%B!zeB;LXUOh2>WqYh<*x$29zR;}8@vqMx)U07< zcojT3KkDA1h3WU7_{U_ePMtIs@ikUvj>$T6Fn5Q4efHDOp(@9Wy6S`b!a~pozige_ zZE|aLhFH;!reV3yPdg~TEFDq5emSKg$7d3}rY&oI*uX6rXLhI8WKgynL)VX!x?L9T zD(zTx)(^)ksGY*5*2B3Io&Dy!Bpk1Z4IJsYw4y>2eX(p?)%@AH!}GS~`|b?hT@*WH zTR~G3v@p5j{;#KgyuPQfX}&?TMA26LbII)bBBxD*Z!lOs<;D#jm6^pm=I*L3$h>L`PVt;x3vVEmOpCvy}WC= zN8AN#-hxbX)QZ-Jw=!Cjx2_(uJUMH??R_671U*B|!sCsruc2n_L{&t{`nsZ&1;=Kv zhN9neCX9MHv97V3sjI&|S=Y7r)XJ5QzxwI0@iXbpT`dt;k2S~D9+>$u<#i4GBs)gCH zicn3_dit1;cYBG3J$NPmoEn3@)cv6VYSYU)lnMdC_Zv0x83$%Yqo?hOz zrdu741UCF37;|{3b+(6Ul4fmVt^csq?t#@A-#sQTtQnHCZ(mc(jRy{cnxB!kPm1%H zoUR>rzJ2=We&6xYk&xCS8Bd z+?`~b=Ny(Sf3%15gYR-DgvKfs4lk^^7P{o+)zz310Z}c*Ng9eL5;`%x z{lF1Ajljh87`~h(Hw5DvA}q~_N2MvERcT9AB8(n5-6g;Z0{|^fA~dTuNoRtsV!9m{ z2KP2GlTNd%kW0n%Sa}33SZ~B>JO+=!f}~c$%%M+rp#>N*HLR3`^g@7bGRQ zZgIRo-%Zlc3U=APV@gWwF^wZa4 zggW(qY1_(&7SOZlVT1{+pK2HN)KnCn+%xJKCK2{xqS5SS0VArO5KM>}$LxLrtez>A z2GJ$rpnvox>>D}pC&?fL+lL||HY7qo5Ihb@3)Bzf6RyTEE{X~`eyHeObdz39S`Z^1 zln8hPT!93&b4By%-Kr_?>RU9pZ65$-5Q`7>qm0h%4VG!^7;mBtVEz{$0d|FcEe6>2 z$Uy4?osikr3VZpoHJ!ik)4LCU;R*oy!y@m+?+3a*(DhynyqEHa?D|00dol1{${(`p z|3;U~+m|U^2cCc|;8kh4yVF+in&lQTCt3=gJ&D9bOG?U&AW8h9ML>+bXfFmA2U4ks zqRhB=8T?;GaX@E>N+?-Qo?&1x$PhN)M4=4*-gY{i)K_3YIFOXdr33Ffc{z@Ora4}D z4n&?ZNl>&;i|S*gQmLNdyecE3VecrGvtwo?>%IfU%b7as>Y5XmfFeaERYgQu&X%Q~loCIJ3VNWB06 diff --git a/Resources/Textures/Decals/minitile.rsi/steel_inner_se.png b/Resources/Textures/Decals/minitile.rsi/steel_inner_se.png index 7d29fb22571d9b08a4875d2ec3880800f99f92ff..de8f47511a8131cb4d901f4e0d4d81542cb50797 100644 GIT binary patch literal 4992 zcmeHLdsGu=77s6}5wwEq1Es{Em4}l_CYg|=1i=JDl<k>(%uEPGsVHsN zvQ`BV(Q3CqL0SbBQSni&+KSt%6%`clQC(UeRo7R$9JOq}1VlXBbM|=7_CJ#|nfdN_ z@9(?!_uYGwFCQi)D14a#Oa_DDtBjMUfIG{1d3u1)rD}Z(gW>VHL!C~iV0ML0)Bt=+u8C{@t(s3>^+9L18`bvGZ7i7OkTuZ_ze{m`n06-V^m^M-edw^nRfyGnMW zCG@&!Qtsu$TNZAVZ4U2zNQFg{VP!`azjm%JwkJONX+lguK=Iq!@l}G04at?^{)`9A z%}-{Rv_4RuomK6fb{BHgkNDm=`Cxqa(C)?S;9r(LLc_;D9#OJp9`x?He=pp}yg#(y z(D@C!f34sZmm{B^I{&Fz)&X6xy?5{Q=pW#gWpl4q-A+mN+3Cm%J0a32#;HGyIbS7T z697qePY|ruTno0u6y)+n!j>k(f%32thRTN^rr(^4xPdWEVC+36vRgBCF5t#{KW!aDEq1`##?sLzVi`=Z-?@6|^xIJKoP##UDFp_ zE1RN)t?sh-BhRze=8GBf*XrXw@boD}{c7TOaL2G223Flf+f>%wtU`4@TbaNfcX8~Z z>;oy;A2%ZB+#E(-*7V7<+#+TN9G|J=Et!d&sI0A0&fYm1t?z8?E<>+pHj>5lamvc< zf7FZ$-zD&$Ra;(Pk+CanFH@+h-&_99uJ-oVcOIsWcKHsex7|IHdj2#8Uvk_rWj$UY zpu3Yl_(;;(9qRw2<;2eTk8Qh)hR4?g2Rgc|C*+>1hT?Zk#%gN9w>28u+U{PBzO z$3qTYY}6-yQdzK6*5mtLVD<3G%=Xh&w5exVNPUO4k#AXH&vV_jvHUg zL}xj}f&}POkJzR&o`o59F@xc@%pj8`DP^)}MGH!GV?oJVaUL|*T|DSJtoe$H>Y_&FZp-_7NNmIFASObRM5*DpJRfIUNQGPG$yPjI~Xfi|ZS@<3SM@yvsLH*ZfDCa?SI%EU8(U@H9Fp;*ybeM8=%_#kMMOlO3DA z<=6ew=1|rS^zi1Pt12?4OgS(qvZ>^|u*?3#*M~b&dNP~OmkfD7Xsx-dN40R@@h^z! z3GAq_34ZNoW*gNz_FhXrQgmdV^1JfKy&Zm2{z8WBMt;`qO+>M?jZ%I+-4PhiRhEqn z81nPh(us=ngt?>EHD6S`)6@00-il_Qh4q?Zd<8o7QB}|{-iLPDQaygFnW-9Cx9I+X zRpz=YOQ&CccyN_;o5g*pzPT~HcUSP(-ciy8t^0;o62mwR;Tv`gTi12^*Rr<2FGIYv zPf|nkrmZ126t&OI&J6i6?cnuCZhob0=X`GmMJK-f4%}X`zf!Vi$(6E)Puza{+?vP# zth@uX)?5Q{fF2rgI3C( zgQ~bHi;T!N#5t@)sv|*-J92QbmOU+s8JQ;m049RQSa~L+nUds5*)CiOcy@|mHp`_# z=SbPzRKhi%K;B zZ>IWL0DQoCm<8r>xUk6t54ND_*jxb8@6aDwP-^f^1g8)bX|v))Y%XD@g9k%s@d0~_ z&1!Uoqs3vuNSJ^s1y<#~u%tq%N*b_mQlK}OEG{cR_6wS{LHC@j7kqQhxWXCi2rwVO zeL?$K>@H=XrBX@cByMxMr<6~wKz{JKy;{( z7zB}MHGr(djDx*$LTLdMA4j-4L?niIgb+Y+#W*BFg*YUP5a@U!4VTbF;4UaFE}21E zO&Hitg9+0Uu*Ix*O*jdc#3U)DY=pyoE=e+Cv; z2BD6?xf-4b66pjyNDzUdkQfsSAij>vMMXk^Mu7J1-~c*B>S#M=C1Uh|N5B z1$_N8U;X>=XD-2Fy;|g@_Hv(3-U1mgBD7IcA|8=aDn%835y0{Bad;ij3T zkTaHh1;&BFP)l3}#b69S>b%@q$T}?$decf(toIGCAop?nR^RL8K*UzcW7Hwv<5^?9 vihQ_Ccemog#vMB*78jP3ma^}7Mc-vG=I3~}TR$Rh18s&fHbLGnJ!{$TzuZfH delta 184 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 b2D(Q*y~71sKK<6efhI*387r+0PcQrriE2Yz delta 205 zcmaE>_K|UdL=p!x0|SH0lCEPwim^Dz-HBn{IhmJ04okYDuOkD)#(wTUiL5}rbbwEY ztCOQ+XlQ6}PfvY)ePd%|OG`^w@B6ZR_fN(iI&T)dS@1_C!~MQ|(X^M7R;-fr xc+jwWVnPa|*d6XKu2MQ1SkwNBRF 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 DQRRzO delta 272 zcmeyWKA&lVL_G&H0|SH0lCEPwim^Dz-HBn{IhmJ04okYDuOkD)#(wTUiL5}rVt`MG ztCOQ+Z%B9}XD2{24z1 zg*gj6B8wRq_zr_GSBU-ppRip_zxVFF(!P{K zlX#2vDM!06Yg#qSQn0I9)2&6e&G_Lx2jv6jSj<%>bU4cu8GM>7w~1v!v*5;aF)IWE zwFLvFNQnzLw3a#Qm}v+XD9_-2U7w-eu=7JFP}xN8{?+nVvwpFbgIvVm>FVdQ&MBb@ E00*LEE&u=k diff --git a/Resources/Textures/Decals/minitile.rsi/steel_line_n.png b/Resources/Textures/Decals/minitile.rsi/steel_line_n.png index 953586a1c506fbd30ce854a1205f297192aa69be..f73aa627b9f16e247f110c702a4243507d3e9d63 100644 GIT binary patch literal 5050 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 BY;ynr delta 270 zcmdm`K9^~NL_G&H0|SH0lCEPwim^Dz-HBn{IhmJ04okYDuOkD)#(wTUiL5}rVt`MG zYhz=hlcQrxOG{^4TW?QKO-)UGeSLRlXGKLtXlN)<)w?RY6F`c)B*-uLKO8W4`7?e3 z3Ud~CL>4nJ@ErzW#^d=bQtE-Cd7dtgAr}5`drylt7;vzN3k6=TKd84qM%Ur_gvv(N z0FUV7GhF@@J}%(7WM=H}yzHFp)<(HgvNLY4$zr{vZhgwlnr*Gwj^s(JZwGGIW_sx8 z$3LZzb%NRRN86gj|Fo!-@4Q*RM*N?{C-zDHEZ3?S{;4V?r!5h<1GJgJlik(NWt~$( F69BnUX-EJ7 diff --git a/Resources/Textures/Decals/minitile.rsi/steel_line_s.png b/Resources/Textures/Decals/minitile.rsi/steel_line_s.png index 89b0fe63f0b47ca60ffc8cbb48c202199dde5208..fe8804e8c99fd8f0dfc63e9e1181741fe15d5c74 100644 GIT binary patch literal 5099 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 diff --git a/Resources/Textures/Decals/minitile.rsi/white_box.png b/Resources/Textures/Decals/minitile.rsi/white_box.png index 995c63267d043764170fb9a1de8544d63503f53b..b8f0174c49fdeaf118c053329491215cee460b1e 100644 GIT binary patch literal 5307 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 literal 394 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCil&0(?STpFVwBkemDB#f!JEUVZ%V;lYCkj~_q2bLY;~sZ)VUxMD0lKvYSP zU+{kzVAym<=R8o9v%n*=n1O-sFbFdq&tH)O6uj^0;uvD#-#h8H5R)N?^TO>{|Nl=E zo_3{h#p22jXQoY=7U8|~MwR@8&+S`0b&Ctvrd~VtY;S%V`v&tb8#Z=coz^y+d1_me zgmieBLb7^P_r`te3|Op9GCXdH8i{YzKbO}gT+wpBN@eNav&tIvb*r9DU|op~KMCLo zy2Gf&wpM+0;-d#A?I%u`WoK@R`pA>eX76! diff --git a/Resources/Textures/Decals/minitile.rsi/white_corner_ne.png b/Resources/Textures/Decals/minitile.rsi/white_corner_ne.png index c584d3987646aec972c4bb627b00f0f19453ec5b..f0342975d290a315f560ed73ef83d7ac673b4963 100644 GIT binary patch literal 5198 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 delta 348 zcmX@7@tSFZL_G&H0|SH0lCEPwim^Dz-HBn{IhmJ04okYDuOkD)#(wTUiL5}rT!2rA z>(i%C3vzQ`ym;~U)vJ#mK0J8v;PKZ*{d0Lu!hbmSRtAdyj=y*Rq)bML5xdmXGmUPl#R~#Y%7nuC zt(rDZ9^^BeV--H=U+*F%%6}?}CnF@Ffmx3G51SpEiPlBMXDx22=Z~*^@ZIKz=z*ON f^otU>R>?11D1L(NiQWUCZx}pX{an^LB{Ts5M2nW0 diff --git a/Resources/Textures/Decals/minitile.rsi/white_corner_nw.png b/Resources/Textures/Decals/minitile.rsi/white_corner_nw.png index 04cdc186e58679a64f32022a2d88b8c7cc69b197..8d751af952eede58c569afe2106dc9e69ed618d5 100644 GIT binary patch literal 5242 zcmeHLeK=IvA0K(!D3#cdGEFLE%$@6wF_YI&$aoo3=!Ndg++mnEGs6tpgla<%dRZjw z(pD6E=X<{2&-s2o=X<_q z&P@;WUpiUOOb>^{P4@BjWP&?hb!lmW-xOBl1sqOmS0XD^&O{Y>iB!zv3oyJqL4x5i zC7*}GDQ{P@nlyaXhBwi2>g-GIIR|Rf!bS@5w}t(~ef`BPP5AVLBFpHO#O}Uysqa2XE$d$7xT?d@m$0{YC?#5c@a8>aiH;2nlizYGtm~){}dS&k!UP@2uaeXb{FlB6J#Ba7}`m&YJnKl>q5868S(g$rVQrFVVjuHu7Z}6xmnEqEAr00-_B0zJCUbZJ+Z%gohGHA z?3tUdc2|m7Jg0qmPS*6G%Q%yn0d7tBj017Kzqa_ww9h{)_t?xV zuXf7iRpk}bHJKcXwQG4O)k|8}X6ADx{Lv+t*T$aK$kysKU-QJ!gmK+=^&--u;D_t2 z@BD4J{YJM@eXd{n?A956%jrbSYpBu`x!V=RUt{*@E0c3(JEsimQp_${?+aZ!0iEn& zGCiE)YE_zJ+VHhsNY|X*I;mo@>4ERd2H%-~TTwvT2p@51&iE#f{Pb#XhAde;T#bnj+%oz-q+XKdY+8J5FOCyK?8xFXe}u%Wuhv^i$b=NeQVwC~~lD-{P6 zKkB(JPudgp+|c>&gMJr7bgyRU=x5k|Z&tTvsFx&U;120u=QVB?TKJ{ z83+#Utr0e8+EBr{2J>w)uZl&u@r>>tUrL_Xq!j2DF; zOx~O2|JE&#dPg8nbaHQa6_*`Qq(GM+d|m4rB9pdK&hDR>ogcPf!AVP}W7{s-bWAtc zwJ?$SW_8WYZ91DQz7y?y!-)N*{s6YvpWtF+ZrIYaT);Yf;?K~!w7NAumvRS3S`8N% zi*0^}`*|k(d#&rTCFo&JjLbC!nsuQJN3X7#MMn!|g28Pm#=o}J7Vm35{p?s)NQw)0Pt2`P~^M;4A$&ovn_a*nw6 zi$MvdZ&$Uj;IMvPTjT4UH)fr((&i2YTPt06hzrtMRzR$2dgO?g0^P49>vTzGn z8BJ=*uPvb;Pww3LVn}1ST&lGHF}D?LCGmW)WrQ;P=p3=o4&{p3n4MB60b2?V=j5uC zpqv;?j%Q<$e33KZN$qI@p3ikAgisg|L*ju&@x2qJSa700i<20`p>YYWE_zN%Isg!2 zaulx=3Pdux(wU&frGsacm_)#kC{iKI{{>=gEPVre9aOrz0A5KMw$BG4ep5=3%TNfgQEsvt%&JTVzZ z%9qIbVi8`2iL%9Ua%Tbo^yA1CTL? z{?S6l0y{5>iOIxqQV!-7kBQ`S$3t*AAM7P@Qh_=gE{B8(FdY5%|GE zML{HAC{bGhvOm$3^LZc1`ouR?k2;+3jsWuyxSwdhk6o<{v=|J!rU5Xh2}`4I8wr0ReX}E;0wd{RD|YW?*LIgDy_hzGLVZZ zR5D~|Kk9^PV(1_oKrO1uQ~;p10MXDrq!=m}OIc#Ez?qI%&K`k0xQ^8p5Xlt}7 z;HwuC9&bd)n1f((tvxN1KE)@T68k;KXPxTd1m}(vXWkiTV z97h>}G!`sLRWaU2>qPo5KAhAF<4O#$8Qh=k<;|JFp!7 z?nOmKhYlSIVlL0j%mhu^Uv1&wrXgqg2jkp&Zh=>LI1To)rJlGg+OxbtW1_@6Ooqc5 z)Tu5FV=LbcK&UJCVR-5GYFkV&Gbr_b;|WBzKA!F@tE-%;OeS;5`AHe6sde@F4inBt rZO{-(i%C3vzQ`ym;~U)vJ#mK0J8v;PKN_!NOYG1CgzQK5l$99SS(UlhswkjukEOC37z)a6ORQ)AaPWcs+WnHZu3dO=L-No2Jl-ca517XEaOZqTJtF_+;l6sA X7vhWU(iFY{UC-d@>gTe~DWM4fJZqRh diff --git a/Resources/Textures/Decals/minitile.rsi/white_corner_se.png b/Resources/Textures/Decals/minitile.rsi/white_corner_se.png index be5170a0e224871a72970eb0cab3e714a236233c..54eea747f037150e2809d90da72c9d12e60cacfd 100644 GIT binary patch literal 5238 zcmeHLX;f3!7EWZ2ii*$*$|D9Sh-SK(17R>s5dz30Dk?WOHxS4~5=a1NpU7ZE5CN@- zq9{}awTd8h0Bhxmt)hYhii&lpP^+yX&jH^_K*jaC)?2Ri`p;w~_nv+B{?6Xt-e;fO zvr4$SIlRSQ|03FwZajRZLJDX>EEu6fm%K^X}cglzZ*3-lVM4yg{~B;QDJt zJ1qhlh0W?OiYd<@d>L?QJ*(hczPH`Rn$|Yb?V4?m;l?;MH+%oytXocnzr5jh`lm}h zx>zR`kF&bgi}PG4e%|Le??lKk{VUTy>`VfB-^ArK^-OF(Sa4~g%P$_`=l7i4@l*WR z()_S$ub{=e@VX?kO(CyCitc`QVvAd6N_60(aV7k%&Ybgg=y|us(!Q?5uFUShb2*jS zInihAFFO}gTaKE2bx!+L!x!6WEBW@vZkp-L_e`$7us}2V@sF#`RPreentNYgX=f=^ z)Ye%=l=0G@GvaSUt;b<(ihYSEQbQ?zif{gg zb*u^Q+G|_3VCj9_(%iU%ce1A@5=*cXx+RfmE(5727H03USeZPx-ey{G-@!d`#cw^W zUSqB!+beIStdFX|ttXVlvQPcP62s^}8@qszYoB`#Q{9qgyMBi6@|dbq0;}$zgbk-d zk&vDP(a{uP*%{c}#rFBe<-(_S39Gl=4#(L~`SuZ`I{EU>x%r(BksJpkwB7pj=Eb;T z`sw1xFxQSgP3vYPjPsxho%h?tC1?KKj)e1GT7Rn*$H-?&(EC-1PswJDvy+|4b&y~}-6`Y4&9Rom>`iS`R!&l9Z<@aH+lUn# zlFQPVKP*p(o2$KRk?!JInSFzJ!+rHc#UD|>v~J6q*jUi8V0-6p)XV0gEW3G;jhujZn zB7RIIZFS9 zf3>zM__>`N)5>rE4VU{Y#IENdkWAU>>GHbSDnr=fYymXttn0hdX6l0V-zC+R@5r*N zOz9}Mh)uz-JnOYq+pN4aPo_&>WhqHaypZvrE%4>jpG&{KynAoY1IKLYy78e7KF&|g z)|{GoIExL>m1@NHUgKDI@(%Mu{+ThRqN!n5!hI{8)7>T2)4Nqp{Vx@nq?0MvchZ(Z z6>Hd6p#+mVvx|L}S^0)pX5;Pe->B|b{E%3JgtmIk!0&|xXm}BXSdeEED_Xw=sj&AY7%%I3PceedFRsIbkWd!qHG>6wuO z@eNlB%~v~ZR1^;gQ;)WOi_Q!qczaB->AV;ti$2iU6W6k;Wr3irRLv4jsLp!&eSxC-){2?ke;zO3)u~3UNNhMbeekgJq(NKWqV}WK+tJaa z+Uc7Qj4tiE&|lo)c+A~Q{3>di-e-ey^QzAIN%8LYVvj#~hP5f`xIDJc$v1pnGP$#? zX*>7GvRlP}zQVq#QR`_tORj+vBwY$lia22?7g5SduvjTVNqV^ooFo{GmyccrBPpmB zFG3Tg3LfG2rV|9bRLmpHVF)Qg6(3EK24||#sLZfvBr^r!hzUO4I4?aH0LW1-jMvL$ z3Jq7!BN%bH;NBo66YxeAZ3>SNCyc=Jm1-1EC(%h1Vt`(n4iUU@crUeB!j1F~9EJcR z9wAAqRdLB=olZy6(MU>lBALqJaL5#h3_(PoLDXa@w6LD2&^Q|)hA{k54WgE+v{I!4 zZ@`2_$}}yHKmhajcmBy$Lg9OOg=Uxqzz10mtH@Lmg)EnoM_OpK0qFo_*rC6)&_sg+ zmmG;|lxb=N4M;~7TIZ1vV&uKODorgjh9gGEs0@_@RSj5``q7d>0%62^3j+m-Qn|`# z1<3wLQ!ABxAnPOF3^T@XMmhq_-{XFy{VsN+GSCtVx&BHdÐEpGPpP&lM{XshDfL zWiZ7|k(fy*vS}!tNQdYUkghr(iB^(4H z(j_!Dkwc}k0Vs}%`MB{{kaIRm3fJcBxln;^! z8LX861F#3A3b9hB`7jkNm7`Hw*uW>11>O)uV=);tHjT~spcIR$HJ}y^s8kAx1{r4z ziQ$590JX58QUQQb4x-`m)hMi0s-u-k8INFa3U9D{KP?0sN(^gZe^`qGPzprnQW#ts zB^rXb5R*$~5-C73LSHGCN;3YJwqg6=y@rw=EY*PZGmN64Jr#wf4vmI}GO2Mh;qk_8 z!G)2b5HxT)DmMBFu!g3PBv_G%g8ngFuKbr;wB;!5DNEfN qyh8%!+ShCCeb26^%1tla#9|(lC+c4Uc7zvYU4nJ@ErzW#^d=bQhOEZ?LoEECPR!;zqQKEI@p#tz`iHVwHZts#na#RBJxkDOQT*zwxGs6$}Ejvd`8 zS^QrN-QKe{EQrWr;PpD7E}^eqz?$I3;qc4 diff --git a/Resources/Textures/Decals/minitile.rsi/white_corner_sw.png b/Resources/Textures/Decals/minitile.rsi/white_corner_sw.png index 756200c26313fb6bd6f6f47a9bcf0c7fb0256e64..b57417997e597ab1ee94a0227adcd956f1f3f596 100644 GIT binary patch literal 5281 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 fk><2Lc~FA~RAMFi_QEKLhb3Z delta 302 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 GnSTLv6X6H| delta 389 zcmeCwoWeXoqMn19fq}tgN!KwT#aJBV?!>U}oXkrghb7(7*O7r?V?XzwL{=bQF2Eea^&A09k-@c8lLJ9q9(ojMh$ge%6<14NYs`33)n0ftRybj|}s zISV`@iy0XB4ude`@%$AjK*5*wo-U3d7XGc1BKepNIh;=#Wmf;^zMjV8vEuaa6`{_P z4t915T3x@D@S#0R+|tbHyk%PP@_VoK-ZI1rSKsh!wZ2;L+AVdFz$@1pwi-Rpsya00RVEn}* zbx#ghGu)TfW2yfrlv*Nj zZ_k!qr;Ic6EjMhq;?VokxP50pVzbG!^D-6hby|-7S@=fz=R`X@u7wj1iyy0CW_Txf UW%-(!pnzuZboFyt=akR{06SE%$p8QV diff --git a/Resources/Textures/Decals/minitile.rsi/white_end_n.png b/Resources/Textures/Decals/minitile.rsi/white_end_n.png index edc8a69135da4e654a790c71792abaabf8f35f1a..a8ba5574771c95858f3c658b2c7de8edcfea8ec6 100644 GIT binary patch literal 5250 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 diff --git a/Resources/Textures/Decals/minitile.rsi/white_end_s.png b/Resources/Textures/Decals/minitile.rsi/white_end_s.png index ca2528efd15673be15318eb4f99c6505a07fca92..55823a70963cef9c17de55b68f28a075d0cd5d27 100644 GIT binary patch literal 5297 zcmeHLeOOFs8$YS^;cF#nC5>UX51rB*Sr6jxz2OWb3ga}d+z7=-1q&= zneRoxQ-@fOwuT^Rh#<&c4DKYuWo8Q66_V(a5M*{HK@v`g5gkdbQQ&gmE2f(_2jByO_#bdmh$h9iH|t9rXcCy zH+3T$VcSk*Ua}P{*J{r%aGPyWP?L4Uz+IDys0V9U2Og!O$5`{!CuVxKDECzj9cB8s z&dTxLg_{HShs>=o72Ho|dvaghUVYK0%;90})0R=u_}Qk@yRq=GL#JQ!{fS}oud5vm z4)+?xYUSA%b89KMklie5f0l~*)Sb_gl$qVS-kD#KKyulH!5fn54*CU*cu_t=Z+acg z_ZiFTs1LVZPtLL9-0}JfT6iHXO*#GCY3>BNX`c0!P@m@I%SW`CICJ$*D}*>}ZDhv& z?e0Gy$2n{UXGkNM>Xrh_PGV!Ta(MXD~f5C*);=({Dzf5~HwbHezJuGj6>yAu~ zTQR=XFMEvk40q$)L8H=zVbk1;+r`sLO6TMszWpfGyqvA9S@msW)O7ez{X&bS2_5xl z2>(TWXKR~9SNia&qvJC}b%&CtExC%NFS-77eizTT{C8Q3E8_z5sr&w$p^>FE<-Vpj+*Y;~y5J{VqkO0j z*I|_oadj32smS%Mq|q4l*(~&lKgLDpBB~79y}TO>z_q_ zDVjfyB*w~~M_w!&k}_uQgL_NTz7Aux`Z~W<+!DMVz5Yn*!+OcU%zN`Q8g18$AD(^e zQLXp!92NMpx)S-7F*YpfwUg9srZ_9VJ~{H6p_|X>i*|J$D7i39>X6T_+x?&O?6=4C zxufU1pGa!{S(doIVKvW{*;!XD9Lv_(UDeTNx)rqTh)7g+*Rq%UUVrYyK8Qo+X_j`> zwOPAKt&eJ2k|Z&&((HPEvChp|s`aZ_*zC5oMgJrz@pg($>;{WBUEFOQ1H_vP2L&m{ z{$^gtzEBUE&4fwu+S!Jt!O#dnBQ(gv4873zz4@1bNHA*sb-7{8*b8m|PwYz<1to=z z4prv)u9IfDLHkDdoV@X8S9Q~hVYOb~@+~c|)Z2nLBs^}unUb00nN_fVPj~eIRpU<8 z;de8tSEtrmaJ(i4eD64j{|t$C2pN2=^K!%wk9R&-nko4@=Se=k--RE0S6-|vLQm~MJfl$8s{`G;nLXAHixjZj-1muTlmgivGagy`qnS+| zhkCB^WQUcTp_$EJtm>X4bc zx~jZqYcpLb~4t<0xyOx_l2^o+vn zYvAmOlYuiPTsVV=suUiGR27AJ=oM;k20@UQw_c5)i!g!|g+nRCK*+T zMSOC&P(<=mX)qGggXuwq1N5>uI(f1+$x9=}d1C*-J_yj`lVb=%&7)9sI-Q4(;i1w* zQ)pZ+mqMje=yVupz}k2vf#_kScDwl5D$BgW4|fgTsi`KQt2F+Nu}d3 zhlWyNDVKxbG!_SEG8z4#1WGM|C{fG+1;9OI0Ef#(Fg62a!E7#$00PLx4ju1F7068F2N>w`T$03PKfrSx> zflrzz_|oYN4xP(n(Adn6O0zJH7Q~_fl}7bo(2XO8jp2di0BR9Kqyhk=9IS@tr@;_H zrIDyqaz5GM6v<%uVOR(fN{SGOKSE#tluBpvs4O0XDxuQ>2|SP)R3Pc6uae5}`2VGC zNFS0{@1_UIv|#>tqo_Bh!m!1?z22@|W=tj$$(R;A1npgd7Ky{8Mn3^o?+_Y;D5Eh@ zKl%dpywBC)z`&fhJ65(!BiI9k1{f)Z?P0Z#dyD3FUo)M;bm0lS7Lx&uMCtf zPzfm?N?{*ghNANie){&|ADjU|f0^X7`29lH7rH)+fzML@5?x>D`YZ-MOZiK5{om-a z{`fM5DZwuw9e7nL9&%_Cc+IjA&5#5@ut{!iZfR+0sCZ^tS{e}VO1j|;ZYG2{I1KW+ zcNP5S2bn}opXv{-F?S3C9V>Ov94!P5Jz=;^PO6HeKxjb-gaH;E=1v1f+m%gNU;{*S zfxoZBUhe2xB1r%fl!Mh#L|%~ U-bqY$18YbS5bVEa%7Uc703}cIAOHXW delta 319 zcmV-F0l@yTDdGZ<7-k3q0000)q>9D>0004VQb$4nuFf3k00004XF*Lt006O%3;baP z0000UP)t-s<>lpYZEf-J@ZjL!fGGim6eqM007-sJ6!+(019+cPE-H? z|NsC0|Ns90vdk>clRp#~f450QK~y+T<&t3zLm>!*LDBbi{|m1mby@Ib2U!0!(Jw+9 zC8e)#Xz4k{w3;D)%5GlS#ua6u5~RRSuWH|Mk$kQ9POtCq-)Y)RIDI79dV2fD#ST47 zXB6qR_M1Z59A=XbPPEI7-|v>qbYQkUSbOk?XIEH`4jGfOnp7K`Lb?_fTbkWkL%T9H zpsIe=qa!)351pLG3OV}|ul`b=8@7Js4uyk{-NTFS55g_peB<8EXt}+%ntgRHc6;XI zDSy7WHAuh9)ploHLer zq50_9Ywa&H*X0T%PDM|$UucV?cZJzi*5p39Uvw^Y&UxD;>G&geHnt=vPRXKkikDUN z&=Z(gz25;p-WbQB+fzq9pB(-De3w?MusI{mn{D>qB^O0QVzf5jgZXW3bhV$qi<{s$ zuPoCstI13tN}m{eO|7z4>}d`ti8g!EaK3byWz{(w`^&_MVzX`3f)_(FEY)2vm$jt1 zQa9*3&C{0Saokm_XD?oAk*V1b+9i5=>$DDX z-}cb8IqGWmABp8vTh@!ewF;_;O?s6W{a}4d>&S$QBAsx9y7bJtS-zngcKhCTDmgpK z(=IUSq^9J@=8?&^trwOj*FyzsP{MeY>5%x}3kvHR1pG==wwB-)QBsy%@0xNty(Bhf z-;33b=YEXmKNVMpXF4Z?(^QQsF7y;5?4+=wqXs z@|LmLdv4In8KYN5iWvJtT&hmph>8iXQeWn!>-ui1pM1Tf^k(YK?{&Hv zsus*ixG^|GTAysGrRVFUAy?{FT1 zolI&tU={V-KAFdsqw6d_6caW}gZ9~JmMLr(p%^jqbZJ8?` zwqIZI+g>N`(+e+_hjHgmT}wKaGgVY;JLiX2%n59@hPz~1hU#cmzL>_3Z4~x2ruKL` zvAf+n*=Oss{t#F`>InTaJf!LH_lFSN`XX{JXUwWI;)R12YTavC`M>9)Z=1KxR6AYx z>x#JX+0>seLR|~v_SyOMg67a|=e`<^H${KfEN%=DWVf)J7H2FgblF{&Uj;!X8FDT+ zRKVqaC~u&s6)nt}8aR++;~(O?DN}-&Tb&?XJ)d5lxtSMcI?y@bxw!f;Ev&8*VM@>` z*UjAD(chapBq~XYL7e9UB}!y-`~+lSuBr8DFKYe0hSu5zDaRM*(MZhegVz=7?vJuk zCab=!SiE_4@H@Xy=4}O@=EJ%8Dk(dpI0cEUczt-9Sf{<=d1C9(?1C5_T^k~ zZ5uVB&@D~WIlKB=j@b`R`Kr85;rv5&+p+1vL|@l&)-9JK6%kbj??<0pdUB57!n&^a zH>_Pot6lfQ?XrU*p2(FwY>%Dz4ab>OLEczFNG*lhdogHG7l72li|Z5?YlncyT0KReop5^tO&;+3a1K0ZZbl_qe_PWy09^ zHte}gheniQ!^o9x>#K(SbgS`oUbExT$%CZb;ZyX}a@FgXw#3HIp8P24*yEQb)@z%u z4u9h07cwh>(o%4^lyzY7oxF~2lb&r_y+_%)8{iO1mV?74S~!!1s+D9!s+M46y;1`X zBM9=Drq>{7B8C$rSe#tNCO$h{LnO$hY@*mxNEK?hSiC$iO^b!61xKK1iKw@fIL+7G zN6!KTN(@H`dZj|8W9ivMBQFcw8_X0U!3e<<*~DmJD1ociVgx#wPNtIl_3~tx=xa{! z(Mn}35ig*R0<_q~cpTTTD3p|x6mp6OS*?wu(7e69DO8vO!z6$p=~7iVq9>_z6ATo+ z96U^iYULVSu2vBYoQOo7gtLi6&`Um z$#TGhF&Gjm-CIJ!JP{d*PK7ZN@bo4jQkW*AGhxJ=iuI!i(aJ$qB8vV|8K|UyN(Rdi ziG%@IB%TZsod&2RbT1jnivdevIunt4qll48in0RKS|tLOQ?5kfFp5SMXY4Qt&fsKC+>ua?SXss9UY*ggcG-bD|T>%jP_MpN&e3diR6wtAZi zxp6ZQ2*z!}LeSnR=#XSgYK#+b^>(50h$;>P^`kFgKiK7elME6M8G@n+O7cP(9wfR{ zhJnSSdXT(io>T;8FkqO*_?%s*mf(H4I z{?J5|;^N}nyLX3)BD1oxfcZRqZWp+i;G*Dg$nV$d;LktEL^6ZVgE9v>27<;=O<;@; zf<~M&d`xQ9I(=tz-B6mZsJMMlQSx&p?4 wv+?OB3MLG>{d^F*u98yIpB^8Q%^697wm+UQZ7R;W3tSU}oXkrghb7(7*O7r?V?XzwL{=bQF2Eea^&A09k-@c8lLJ9q9(ojMh$ge%6<14NYs`33)n0ftRybj|}s zISV`@iy0XB4ude`@%$AjK*789o-U3d7XC{odx{-a;Bh`X|_bOXMW1gWl!eQAuN6@p0R2(aroy#y{;`eyzB(#Gc=$M8uYHVB?x%2l2S P^eTg=tDnm{r-UW|<#ePT diff --git a/Resources/Textures/Decals/minitile.rsi/white_inner_ne.png b/Resources/Textures/Decals/minitile.rsi/white_inner_ne.png index 7f8448e50263556316141b7e5ed46b769d742dad..76733f6c22477899613f7678a2108d5682380b3d 100644 GIT binary patch literal 4936 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 Cic`t} diff --git a/Resources/Textures/Decals/minitile.rsi/white_inner_nw.png b/Resources/Textures/Decals/minitile.rsi/white_inner_nw.png index 5e75689308a7147a179fe2e84c44393a9dc76f16..b368cd57316156fed3590adb454292b0264b132f 100644 GIT binary patch literal 4941 zcmeHLc~leU7EeGCQ8|L*3KHXjsFO@~5))*Hpa~G7pip&^nLs2P$v`63M^S4PR9pa& zCst5Ur~-;2sLuuUY1Jw!DwORhRjasQQB-QNUjibY*K^+SoY()%oMdM1ckl1s`}^*_ z$z)xqIB=NVI6DG?FiaTaCjn=Y`8~iIe5OcaE)WRT%af#$xCAkhbb75qslrJ3G95<3 zOiBfTVEXxKR#aB&w4rNS7M!0+6xy!4ucJMDX|H(Ou_{+OCHL9mob4B~$2jEK=7rP^ zzR)sT@n*>Az|Kvz{B1iXl}IIbQ&TQ<6d&K4op_3RvatORZ`WrdhGu$QdV8w_OTKxt z>5TjIfUX}mzmCfnh%@lFuiXOg_#7fH3|oIWtjc-t_akubzK0buist*HH5Hi+My zIQzIOUXxpLYv(C9-_A8Y?pMC^+OTN#H3Hh?9(3O8dYa1jaO$k*%_TvbHbpEuws@e! zPfkmdlrO#Rd*zR#qqbs7k4bp@__w{vh-!|#mlsHMgcji==sKm#% zv=N@UwGl5RVo;Y88^k zA3hyA@fstDO&JvAkTrjRua(uVfcy;iapevZH`{wT<+T#xt%;KRDJ1SXv@CwnoL0Ah zhK$TS`3j1TjwP35tTx7 zzBtV-;+p2!q7$PiE59quir#N>FPOi7!QHBRcbsgFur)U%H*56e4-OpuIm}a#@U$xG z^`ayfKKh@xwBO3^?p~i%lOo~W$P4s*(!Sd{A-}e8_4dN6e0A5%^5&wiB9oW4>Ai_cFR`%Qe%fO{3gckNn6OB1`lARo;>U+v*^$yPGD+&gWIZQ-g& zx2C#*p6e+3_v@m{UY_3Y9;zy?XTy?sInHnjGorJ8|I>7Oq2Ylu3 z)y50Uji-|{Xb`7vP*$$t-UtVEqGr(#$pst5@4P}eO)5Nz@BP!Og!GVHBQo!Y&f~Kq z4ElQ3nZ1M4vlqCzotVr&y!rC<<`MSWXCz79L|5L~Z1b&arY7T!DE`>RV$4TO_MGnQ zc>BgYmGofMy~yfS)n5rOXLWVgJGwb(r&rM16jdQCsq;+Rk4vjw`OO>x@&3u{f`fAXr@`P~fKMI0H4*QnBIFYW|*OKDX z+;K8pP^z;^iK#p^qx;CDG2J5ti?1KE&%=gLN@nC79I~yUrZeM~%fF@#M1K!=H_hIv z%~^FjDmHrB{rM*!z9c$sxm7#tiK|!0!ll&P*~jyEN0VDJI({eqQKUC9_GHzAVVS4| zLore`mnYY%DF~{SVHA^E2Zknrz@Kf>A@Vp3C&{oFrA9!0e*6@fq(lYe2$l#I>3p$R zWl)kH3r`YDv&YE(P*R?85FHPhDzgdxm1`= zrPCpx0U4HQaKr>@43o?dJs5tNL9SQoaHUp5GGih#Z2~SJlfgRaLwstTNYn?fG4!$k z_@J5)9hF9bscJQ~zl8z!PXr*n0sW7IGX*h9wa#J%$o@nVS1LY|^+{~z6-zq(0|DlJxSwc$ z$lan0v_vAFpH`k=4o~POAe;U3P_0~v@+_B3h646r(K!%HMpHmc510vY5g3LzD2>fQ zS#&N!L;FDqH3l5f$T2e%0H-Jc4u=LS6kLV}B%`Bjh$&}sAVfiDK?)`lK`@$(#YVaP zAVTy?P?d8Q8YJV;VTjIv>2!o8W7AkY(V%i(fL5eeHqywl$%#{iNEOL+y&sUEjxK=OKYE=TV zIVh6ZvTs=g8VW^l#1FwS01DHYJeb8}z*0J$M`!cEe!xJ|PhX2F70dpYwz+*s{GLq@ zQW}8&WfoCSPlaRgJ$F5~Dy5~FNF+;J@DO=V3I-$*>){w+^(@I_5lsvR=0|VAevm8w zq8OM67h_{IHbmnnUWrwbD4i<8gd_X}NL==v-MK1=yab$y}hvl#d+=cr2(;MOGXtq5pjt)oZ$7K4*W?) zAj;+h`VrO+bO{1CgLOd*36=r8sw@maF+Pl?e_sQ>@~ delta 190 zcmX@B_K0zUL>vb*0|SH0lCEPwim^Dz-HBn{IhmJ04okYDuOkD)#(wTUiL5}rM1W6- z>(i%C3vzQGJb3W<@#7aSUfj8JXX@0cK*`Micg_PTj*=k1;QtW7aIbl9JJ9N5(lx@H=zW_X~KFimBGHfLMp kKlu;5r3qFB@hq#PCoPql;niBU7H9#3r>mdKI;Vst0FK~H{{R30 diff --git a/Resources/Textures/Decals/minitile.rsi/white_inner_se.png b/Resources/Textures/Decals/minitile.rsi/white_inner_se.png index 82013151cb9063a11de552c526c4775eb9589f01..819ebfa14df9b07b6c5a954d78cb20529d939c52 100644 GIT binary patch literal 4960 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 delta 220 zcmeya_J(nSL_G&H0|SH0lCEPwim^Dz-HBn{IhmJ04okYDuOkD)#(wTUiL5}rM1W6- zYe8=A)TvWHe)#bC@#CjYpT2nU;_a(fK*>PM_X~g&M@f)h@P7zkxYxWl5-7%5;1OBO zz`%DHgc*x5cFeO%cQeI>_zt?oexb42Xo)GpAlx{m%8xQAgcptDubu1 KpUXO@geCxi%~(VL diff --git a/Resources/Textures/Decals/minitile.rsi/white_line_e.png b/Resources/Textures/Decals/minitile.rsi/white_line_e.png index 99edbdd838eac5905376de555ad93d72f0ce3647..8b81f03389733939b9ef2e99813cb553a717f561 100644 GIT binary patch literal 5045 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 delta 267 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 AcmMzZ delta 299 zcmV+`0o4BFC%OWV7=H)`0001UdV2H#0004VQb$4nuFf3k0002=NklEo3FtyIOwv?DL^tzolFpl-H?$N`6h%=KMNt&x z&rG&$dm9tin+;CKzZRt(NDxX+y%)hP~;XK4dT{z`i9 x2j7q+gur^P(IjHE8g3-+B^_VXU;YPv!5w2!V^9}0k17BF002ovPDHLkV1ifKfJOiS diff --git a/Resources/Textures/Decals/minitile.rsi/white_line_w.png b/Resources/Textures/Decals/minitile.rsi/white_line_w.png index 663ee84761eca24c67ad83156ffef23d9980bd83..53b8223cb19ea0de8593e25a66305aee77d2c7e1 100644 GIT binary patch literal 5132 zcmeHLc~lcu7Z0*278IlwQ8WfTKrtklBn*jR4@;;C5KvL6buu%77_yK|NCd3{r6Q=v zA|gUt_r0zN6qkZ17AP$(P;qO~uSylI7K(m~^m_@2c)p(V9nbmtpUIiby!-C`y?cN6 zzMH(Pj~0d7+Bn;gNF-Z91YZp9WaDLF4n8yD5*tY*3pgzV~2*hctC({A*XC?qtP#M?F`qnFcpnpb^XQznotz`O9hF zg*qja_N*@Euzcqkkz3VZBOESwoo2t$XW_>ZQ&$GHcT3GdZkP`SZFrUA~tamvs7SX04cF^mF^2(q?_556SW?ZQFAs6 zPA%V2|BxNAgKE8Y{8F#X*=FX;H}bzJvTey29~d^d*q&>XGtr5>Ksmm!BF7poXzVo1 z`97hk$;roQU1`RI(AAdeBDbu$cOCydC4p~;zpFcVkDb)MyDLw>?Cg`eNii)!narT9 zNwXU^2XAutu)PP(VeBoP;+~PT;t$W=rQ)V(=~6?hVICUPnw{sksNM0S;PrF1Boz2} zEI4xRQ)l_Xnv^1|7fI)`r!HNwa+mFaQ#C^Pd^S}nYj!!%d6D?3^7+iP-UD~DDnsx8 zHe@9~6@UAi_IM||PP%jb1xs5_Tivwr=wrmT!0dJevmwIu@^nef@bb3)Ysl(>r(aP&? zs5XZ(Ik%>Bu(zy(#(wsL)9I9^g)1K0$98qE6Folu(c-?UiIb+6xeH0WFG58<Gr#hgAb?Au*T#d}+8y?%U_G_Q)Y zrI-0IU~ykZru+k!^}oINBv%`eGn>L0#=FCk`x1Zc|Y;XC-?;hPdiV&CP z8nA)SmPAxaEIqaJ5X!Zfz;>+ju>aW4ZVj#ii`P&1(;NG;ZhBGt*c7A$K|( zb-Bd9<9N}AZQHr2C+_UsRDrczZ$DndhIPGesBwI_<^bwGjS0q6!xnK<3mMwjMp5Tr z;CIVLGy@KG>@%7VOk6`5irz4cF<3YdFhkI|rV<;no;vQa*JdZ?2@=UHQx*~uEeHvD z*+M|$C|_MLFTy;?F*M45XO0B1v9F`HH?7^DvxgsJVLm(T(W2^FM$F|e5m}>KErTAJOBBeSBv)j0k%dEpFTJI^^?GBv{_8cx3@UuZx}-vTYl^)hRk`fY znmwCDgMrcTjbtK?7xe9)y8NgLJ+k1?KyAPxt)`1zw{Jpz>0)>HGj6<71;8 zdjB+ZUs@BzMt(fu$2>xGxy+{vik+OT?jJ6k9Ud=Q>bSM~diaW`*Ybu+tKUgEBFRNJ zu;=#gob{*m`IEX>^A~#}h4%Z?AD_ur?*BO>_-5a^e7~dWaT$r#C%lF#U7dy;{XS~@ z%5Dcf(fdoUvf~rCUi*HaxWnbFhb8tr*3%GBq$27vOrwxZDumpR5-*G)-%0TnnW6d!{N~A5DkK;K!d7XsU#2sRjG9~LJVW@aV@Hm zsR@}%Nj7345|xhdqfo#+`K5mfwNN+;uhfpP0QjI85H*eAO{Xaow6PXiA~Y3%j5zeS z7TP%Qy+{+|T9rc@MK&8RJCAL#%oK43xv_57DfsZ zWeT;)3XuJpCLxo)BI`BZj5DTi#ySGbM{!@%ei^$-8E6TGT)qm`8Ql}`{V2xuxtI!- zVcg+IjDfLWoJmD6h)!j3AebtVGJU90Da`gkaM;(^hcyODpwtqG62*;B0Nh&!a5z#4 z%0O5!6^GfrRF)4ep>m`kuc#D*AO-{F_%bD9AfhxfP?bpXSg(vw7=WVVObCY%4i#l{ zASw&?VNf}A1`PaS`9f?|g5uI)Z!nY_rqU=7kWQHbNyKStWuj>fBjMbjXn`LE@}|F% zL?%--pt_{ zV`8`<96&8%tW*GCvH;O=Lo_%-s5EgZRk9z&=oHy#IXW!_8wx`RgpUw70Hs4LE}hL~ z(&HeA3;A%FFqIA@WAs&+OuF)aX&bi>nKzvD2$>eFztSWc-czx7%J67-m@G4GCNkNy zEw~6e9D)`}#W9ng0Bd*(O+u83IOrcE1^ZGi`&U>cv7h@-A}f$D7vK}( z`t<43g52B(4<0;z{P@L-7kBR5nL2gq+gGnXe)s@X@+#i>9FXEF3Gxg64+9LF&gh(< zyhd1}G{MuwF~q|E?xl@<2NXD514VS6{;%ILWs|85+wyODYVM0&PPK_%+>^|(h_kVz zp+ow>9)<`(hQ}{Yd|kbxIeh+y)s_#eE2JGD0AZB6Yegc8yGxY{an^LB{Ts588B&w diff --git a/Resources/Textures/Tiles/arcadeblue2.png b/Resources/Textures/Tiles/arcadeblue2.png index 013af9f36f723033972d1b6cbea18c5c025043b4..3def0f19c7e54275f848dacb7d2c7bb29264b0d2 100644 GIT binary patch delta 685 zcmV;e0#f~=1iA%~8Gi-<0047(dh`GQ010qNS#tmY4#WTe4#WYKD-Ig~00L}DL_t(| zoZXi}XcIvchX0TewLMiqB1DQUq%?Swwq6Pm3nB={Lk`9DKNG$QMpzcwIF&>$kZf_Rfu3Kc5AlSCa0mMNT_}b%PBBXxleXz(ne;XGbEKB#=uAwld{piS_)7Lfz^|&{ za#KQ|4}ft346c3EgkCEtewu=|%>HxRs@(HR=u~Z!Cof@0>VeV&SiNVqo^wa#PW4Pc z2Y<5n1b?m{{fcMOPnSw+oQXKEXT$CI+mP5Tn3{W9w%31EfIgsh4R?k6E7X<9kP>ZE!q^`CM6zQ|SjzKsTKBIsZK5Q0H^j zhTnn!Pbk`WSlFo*uR);oiAy+7#7su}e#vke{w73VG_(ZNB?0FOMKeJ_1>dkAEPGqn TiZn1^00000NkvXXu0mjfKg&n~ delta 532 zcmV+v0_**{1)>Cy8Gi!+002a!ipBr{0E$pdR7IsZLZmuDxt>lRI$R?&V4^ua7c)w@ zpiQ=(Nt&IenV+T=ajzGuF&1*N7jd(yu(ZG(iV|Cx6{;+RiI9bek*u+}6iG zFcp(46qG8zABw#lhJuKU5|byB8f}poX}ujHz#S&PA0};Zd4Ftic$pa@DrBIdrLJml zbe9<(EM=p>xhB85CZhn&?f?J)ae7o(bVOxyV{&P5bZKvH004NLQ&wMjza$WB11SAch{_xqLL)7q>EsUtXM*6&95umZdVhj9_t;p51#fGYbD#Na&;?(u zH*IYYvTd~M5n@RA{zV{x8y$N7L}rM)`XC&cL-Nxkj}wFwCj8r7q*?muA7;qTc~QRK zA0yBgy(fPH>i-j?gySS W7&&6tpA9Df0000m^MCyGR^%VvmzyZI7`h zO?DBYloJwy6C8jQl{g?IR4qtIl{kQe1P4U9AP)QiNSwGL!GW=pSSeb*8p*NWo8SAr zk9qIC*516bx^i|!lBCsEv(XXn8{z>=i{k&nN&g}7T8KMWE=#xXp8G`zOZ}QvlcZ1H zJn;uUF60N>8{M^!`sB{dSFd)SJ~%iyJUo2y$I4IQ=z*~LY%ED9P9@KR^v-){BC?cJfBpOm8BoWRw~7|D!a5ny=6*!3 z?QeGN{axE|iIMnD)T#_p2;Vj3TH+CGTWwHh5dpZ-0Q0-?lv0mow{h|f<*rZf!_+Yt>pWdTTNagPnTDT|0FsrX^W z9mLamiOQ*C9I9FlCaI-B$Ifu!F!Is}99tzG@kzjAfz>i>IAEN`1NJx6+3`INM2Rgc z^KoP>zMr{>`Py}n#)Nu>WPD7%0O>O zJ+9Co4b`$xD~LG`Y|?6&vZzgtQU{fwqq}aesJKqvQ3_7MP%1^JD=yY?v0Sj79@b{| z4Q3CM4w%_H|I_}dh>B6f-hK0=6O)WjHSHkOq_Mc$y-YowgKOl4In`9@QIIwg!gews zrfesjK^%FiruSW(3GHY=1nEDt%LEoPmyd8nYJE}2|J0G{TrO2Lnd|xds_IdtnBeC2 zLCP`Fie)1tVK>`!iIiohL@sU#x!%%+fd+?>S zym9yIot?&`FaL1k>f-w9t+yARJbi3A`gY;W`>#Cr;a9(Xu>AU2_`LMl$y*;6+MQ$4 Y8^8a2ap|RJ&Lyk4wYJ%~eR=2RpO?PhYybcN delta 1609 zcmV-P2DbUH49*OY7=H)@0002({D2n#00DSuLqkwWLqi}?a&Km7Y-IodD9@FVy-UMD z7{;HrYDFs*bP!RpxKX6 zbji%N=CgA-{5d}F;1l&WCVJt2qqm^i4DfXmCz!<@;u+%fx?>66CLUxZxj=kK9OZOC z;wzym9zP2%di*Y!=Q6W&H_=lnwz1O2ti%oC3F3&MS6K5r;wB;0T+C7(rZoZ^8KjVe z1O*kWL5G7FRezH*``s6B_!dwm52M{e6`UMJl*k(;wL)E0sv7AkO&wK{`_DXWZEDi% z9!dh8PpZgP!Ob*nisx#_9j?>NlieXW$>LGtU43 z076hqR7HJKNkTzERaI4ujEsU+On+2MgM)*FgoKHPhImaxdQV1tQAmM-fp~a$e0+R= ze}8^cN`zQXgH}z8iHU}WhJaN}ZII7g00009a7bBm000id000id0mpBsWB>pJE=fc| zR9HvFmVeQ58Zit-*#c#O1=^(j|6lDr_sZ&`}KP)((&llv1NIy$XrzIkN%&om*f4kl8$ODo7$MJY%2|qt$ zFLP@j*zZ0DfM^hr06=sg9AVmj4gmJP+bMYL9e*AO{77G95|K#n-7QN(7ytsCm}1&5 zk0gLNvld(~wnnZO03cumZVVs?Sd$0o?{~XK9(MvfVFRcN6@aag^uTf5Km(`> z1%E(#FHnX6nB~9O8(>X9O7M8hZIcT0Br0G86YX7$XY`a5*v9Gfa@=Y51$gbwzYl(FqS|7CJ;hppc=dY zUP`b!Z~(Rc2w(ysBm=919K*_wyVw96zkejb$M6-vIdB)_z^5ScH2}viNl=731(60| zV@UuO2ZuomwO}p5*o3bDG~rr;)`X~F(7FL&ZNe}r1{sLf8#O??NH$HF9JLZafCHa` z8#mAf;F@EYL`#on+2Wv1fvw%;5_(|aHdY~i6@V_|+{OX0wY$6kWG>6xcmU`!&VOxO zJ>c6|h4@_nGM6bAW$u9iz$%5G6(0bGLB)3feeD3WbF3ZS_G|nEK&9{p#ZL(gKzQ3{ z!Bd7|)f_zK{rahwZ}sH7Kaj${cxd+F13 z)^hHBW?D;NKg@qxq8fq#ws+G+1b@()qB$7mf6%O>_12~<2TM+c7f9%OlSyc80T8{t z52Vkj^8$$ha;|aD0-d!c%zvRJ0mPXNkb4970M=}Mw)43FDnkL-z7KHF&wqab*cMR? z0rd0V09By^ur2ZmfP-Yf2nOih2Lph6;Ax%`4D-J-U<3oK38)g(c%;a7FwB1exc-Wx z_W=Oe0!7xEXAd|-0dV~l$MauJNNhyY(Ez9=tp^GKae!g`0$>6mBmwp!&O9{I9{1w3VeIWfX|9@K(K2O0g|Gxlm4mPJ?13(iF^Izpd1%uWN0DTh%fQ!QZ zStot>J}`i7C2I+?1Gx`CyGW`Da}2Xl9B2zzD^A@5`kovq1{sKZZ`1(oBHJ`!a?}9Q zK3r4*=;pt^Z{7z6Nc-f*Yd4|0TtW|Y^Irg)_W=NQfCt1SFo455g+l%O*EclUA@2j} zg^szyy9WjUtJe9ybngS{^|c4+MB}nFB>-&X{rdm>9+;*-uySaX9B-4(00000NkvXX Hu0mjfTKC34 diff --git a/Resources/Textures/Tiles/blue_circuit.png b/Resources/Textures/Tiles/blue_circuit.png index 021c5363d6ece3de600a6fe274eb34937345dd0f..529654b467b73fb0f651d09cfc8cb46ebd57e2c7 100644 GIT binary patch delta 494 zcmVAfbYgkW26g zUZCY$GIV!)Gy8L4ub-KA?`HP9+4b`+s=KwDs(-Ha3;g(gAE_p2qF<<% zVG($Fx)WdSbT`yz^=irI>x-FnNq=c&jVC}aaadU1RGk3H0rBD<7kdOpgMpS;z24v2 z;rX%t?~{@Z7qtYS_;~xEw)b|db*zO*R|obu608TXxx_pK&?hf&s3pK{tV#Xku1|*8 z5((r)FadI9h<}VZI*R~O5UGS{rhqa7kpj~viHvDu*uSi;m=*zDOq6|Ybfz#$hJayz zG$RjAPkwbA50DLS9SHG&giIdb8xN6<@<3&zO%4xyeY{y8T$ue_Hwrm$lgS>CK%Ff_#$Z015ob5aqzoj!sfhJ}Z;}ZCH(7ZJ zaFa~RK;oOMSP#@GO*^41B^x3E)B)+Lg%qMxlBA?B62PUwcg>>b)L5vto9i){&os+kwJ2UKnw(xGQJxb9uU>eJt=s>qWyr({{Jf(t?f&4i8xR-j9Stl zA~Wlzv&fB)%ExZ3qUv7u@};63Jvwv^py5!t+9*}SaLR;))_UjOgbW5hP++iqIC2JsW$c-Z2hZ-0k=WT&0ME8`c>Wo# r?wP|&05_G*kLriseRId>Kl1nia=KE49-V9C00000NkvXXu0mjf%CDUm diff --git a/Resources/Textures/Tiles/cafeteria.png b/Resources/Textures/Tiles/cafeteria.png index 69e8dc47f05ea2126e3a88bbbf58befc22acd2ec..451b0825f55b7cb6fad5dfba38f989de279660e7 100644 GIT binary patch delta 140 zcmV;70CWGa3d{kJ7zqRe0000e3~d&XAs`qJP)t-sot>Squ&_~5RcU8ucXf52Nf^)PPX~Mh&2r0ZJ4C26D>* u7@vV$r^EQ828lpYZEaOmRZUDxhK7cVii(Yl zj6y*{m6et4>gwp|=!ArXiH3&U+}z;c;N#=tfq{W|czAq#e1Cs`@$m5P?d^hsf`EX4 zi;0Pcg@uKLgoA^FlrLvW00009a7bBm000id000id0mpBsWB>pJWl2OqR9Hu?mg|2~ z<1h?`lP)B*4UO9@6qfgY&pj78v7P>5;7oUiiEQbMBwOif^@l%C&qJX;459uoh9UG_ z`%7aVyY2{`PO+dHpU%)U;U9i<@cR0Cp=PQZhY32LlLfoC%Q|EKaJ^n{)I!02g1Cgg zzg^G$*e>gm2=G<|Jip&*p+G_aMkjxSB8jC_Et;0rnt+Kmq{0T}loi z020uND8?ZzP5|RfaB#V3H#J`fKmx9y8v(!pcQX&L-)?eEEjQS^*$H5bqX6K5yO{@- z;4Ki2N5lX?iU4~6{D~5L1i~~K;FP!T0B!#Q0!;9q_X}W4fJ?9}Q+~3aEZ0m>c_p#fBX#Q8v%vI!ZRngc+al_3E*g)B1Gun8HPS^_}z2g4hBk*7co7{mZ= z2>>7hAVdbD!2@7dg3W=BA=-bx1rPxcoPo`Ok749TT`T||KPN%Qa1WpysEY}pQ(!#? zh?@Weh!Cg1$^hC786YV*8L$uzwi2{WxCdYpZY9V~ND~>bt^wGZ(2R(|41E6kgjFvp zfP9e@P3Rou5|DrnbPBG#feL`x$Iyv(2}nQ(aSF6sT@JAazLZ|Y5CDHJW8cOG&~9~k z0AM?I`o<#wE@R)u(F3Xh{|f+Y$5vjHz6TnBl{qhtA1+l<9XKD^|cOTt$4iZr}me4zN&L7S1Bch`t%hR zYj3ahZF|SjgPN!%P?UeMng6{yl1um-V0Y8WilX-#UAZN=pB={~{9*pHC88l1K>O7+ z765WnWC!*9?^E@CzyQ&7;UM``XaO`DO*XbR02n=gAHeQYrv;Dze6H!93vkx5F#nOl z^7}vlzBlNefH51iUn#EVKQ05KLCcK*B(MjBAV4{vYXJPo8rpwI3;|U0A0_bBOkpi+ zY$Gum0Q`v(`0A&ymOW6;=KzQd8KC?=po41u6F_?@!~j4&{{;{g3IOe;_5gI?3Pw09yj01Th|2WI3qkKLJ#K#KHFg0sIOqGS;j;pbQy6^+z1d ze>5RuQ<#ndpc#M4JrDqt0@UMI03rZ_Gf+%F253vr%zwOg9Iyb`m7to>j{wT=1K8{N zzc%4|3Yz)<06;k?PC)^{CamW_n~)|lU|j=HH=zM|QOG~n!CrkI2ta$Gtpt7pxHmw) zNTLbL?*lr(D{wdB#65uL&JkiT19q<$6+phoiY9c9GJts7hZmIr%K6V8D83H_;P&y2 zmv2IKIm8}N4ftOG6yFB~kOO+4R007gyi!=re_lkz_W|s1%k2uU9%uk$Lim{fsro*E z9Zze3O5=e8ybu8j{l2}6v7B{?xxFf$XZ^Ch@BagIQJl596Sk!Q0000f^)PPX~Mh&2r0ZJ4C26D>* u7@vV$r^EQ828pJYe_^wR9Hu?mg|2~ z<1h?`lP)B*4UO9@6qfgY&pj78v7P>5;7nmUl_h4gjP`um`|bwBREUrpW-O?7joI2|!I2f&tFieFe}03X1`7jtn5o0MUP;0FXE3 z88~eZkO87Y27p})P$2?Lh@brhuob{9Se7Y2Wa13C0zweLRsgr41fahwAOr!-^D!40 zQEGs421IB8^&fdYFr^$q=BDNVkh3Zz0GE(W#u^SGb5lzIsQ+Mi!z^+aC;*cfpltyF zL;!@SKn!>Q>{_q|&^E;Qw*Y@40D>#91@JbE`e=#;!0qQEXdCVUR0B;h0kjLO#{h8> zfB+d{7g!lU&X56;l9K@o5nyXUJA``x4&l~2U601jiH#xVox0sdj70N@T+9+W-@8i17U?{}ovoFV`(gUGK0__YE+TzV_L{I~o% zie+;8Xn_Ej9{vCb_E2+KGBsP2EXz(+HM zwd}Et#ApEU6)o`5Phl-*puC?0ASz^l^8J7Ts{5Y+@}-ai0QLPZfap*F$d}p!a0Xlf zAqb#)KWG3n1FO4R(A@t~0U-!rD?qd$u17W*Ys$-qw;uu2f8@dY0Rj97Y%bG^-TxRu=B9seI|_hiD9=CuP}+v|^(z1o0KpX~Za*eyThQG9c zDBlkdpuYdtAzXJsbN@d8Pz{P*PylcU>-(QWND~>bt^ufr&;UFr6rby0uig&?AYW)} zfu8{34Ui9#7{c=XfC2Cb^hTaI2k^UVgdD7Z!|Oo>kPm*cVhCNM4B+wML1lpQ{^tx7 z?*{_#`1r)jC!wYs;tZ$<_{S6kDBceUpa6_OsRaU1dd@(7|MMU!-VYD}ap|t~nt=vD zCZ`ub^?u+7r~xXC2VUTX2vF$v?Oj~US%i_@%07*qo IM6N<$g5kq5rvLx| diff --git a/Resources/Textures/Tiles/clown.png b/Resources/Textures/Tiles/clown.png index 74e59719235270dea7548f50c3c36cd42108ece7..d81a759b12ce181c638f86b27a80b756b9c9647d 100644 GIT binary patch delta 169 zcmcc2wv%y!L_G^L0|P^2NcwRg#aJBV?!>U}oXkrghb7(7*O7r?V?XzwL{=c5Kfou% zb$VFH%8X10N0*T5=@}DO-V99%0!ncfctjR6Fz_7)VaDV6D^h@h#-1*YAsXkC6GT{; z6@|qO3X%j87?{=4lMM`{?lE~~G%$+sZ75JmY|w1Yl)cBaV&TFiEDSS0T6S*`I=309 OpTX1B&t;ucLK6T6DKd2c delta 840 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 G9{C@~<_Z-6 delta 444 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 delta 253 zcmdm`IFo6DNGZx^prw85kH?(j9#r85lP9bN@+X1@c7$d_r6m6%`#F9c^uG z?do_}~`3{=2b;1OBOz`%DHgc*FybujS`6|IOSrTWdmno#J(%%NRUe{an^LB{Ts5S+``3 diff --git a/Resources/Textures/Tiles/dark_herringbone.png b/Resources/Textures/Tiles/dark_herringbone.png index 01e0c4ef60e3fb97bc51ec25f388e0315521aa4b..88b13a43b3fc088524fc1ea453ab110a9a7cff37 100644 GIT binary patch literal 4316 zcmbtX2{=@3`#<(jmKOUmrihrG!GwshWM{HvY0QiFNN?{ zBqdvtQpwg!*}^L#{g1Y*@4DXq|9^eocdqL>=REiM-M@Qz?&m(|B-q)QZ4r_Y0svr( zg}I3Xc#Q@JgqH_At8NaE057~$BWoi7s5*CS)joCOA<5jq8UW%%0pKh+zJN-{4FMn` z6aXgA0D#^&07!SR^FNBITuG0%&Bf?tO^PSmbEbf3E``I< zYJioKX}wov_$IOT$4_E&lvvzeyj*i(E_b+@PrEVEHUeLBueweiJ3f&Ch+n>`E3F|e z8Ly*knFO!xI-MbtuHhr4?9-%bB>p%-mzcc8U{#~KAmhb#z1sLz-J+Y0FT7`Ve5|!n zGHZ#ih!@7xWod{HZLKmrjl8HnqCGM|5W(;O+b#ShnJx)XtT-w`aqAd#WE^;FF6edi zm9xfMvT#c}%fhm2n7wT)A4fh7{<`nwC8JMc58>p8Q^e7!jYQ`XJF+* z(VZ~h;pH1YKN=&h2AqF-#|n)51}sJjei z&d+yy=zg>!o{ol>%c{eatsfRquVP%~>W6dVmK6oo0~Pp+p5PSiY6H%|(w{ zJ-pp2ntE8`4!^J%FHs3?a(ql_hxxYNxDE(ES+vfm$xdv$VC#NCG10C2L%V&7rS`;> z;rnQopA>TPe3{wlB%!NZG<@)-rYyDLyqo3|7sR^1EnhN3JoYBIKV7+A@^lk*Y7oXfoLT{Z6# zQ6}H7__#%=GIn6kl>LS%2DAEwL2 zrG%Uf$<#4DW|^Wine1-fvrCC4Fex@EHwm9q&a~=>?oBCp$UQH@!mMzwh_58_;_sQ? zvpfN-GRim2H}*CksoUl0;Mi-ysv(z?W5)#BKcrwBLeyYtl4{rb!mi6)Pj%So!0z2n zbEHL05+=7!?(B8GT12iyyP@f5|4i=87_=n$f!Zc~_Q-ysJ=ReMRNO|`eDLynymh{W zV{?Is9hE{Mr?;PK_j%m^FegpEP)QSZNfH+8bYQQI?6t;2`G2&~1gY&y$~P=erFA@p zU1VPveYm5&ru}tV_-@|>puXbF8SBk`nlL{-nhV$=rIJ|clEG#R;Tb@TW z7Hv|0ug0%deo(J?phBnUYS~!cg>ph6$B1T{d2OmV>#BSCG1E}D*nIDbdk58=bxY?j zz%7IGi@Mb(8y8&<;t$#$%sbNfKKlKMOSNvrZcT2NUm6FVz!~d%Ho7;OMK~Gb@7wOQ zEx?cFsCcI4Wfs>t-?U|WS{_n&_bYWO>c3E%Rhu4E9&~1jN51-8Os7mXfA*nzDUVb1 z>KTLAvSF1uv7Y&!iEjcUT!tKSOPg(@x`BYh0e@nAky5B#(l}`!nOdoH(miL7CC(?} z5_4qzq|Bse(KDEJUvFZHcdsvNi146qP;=;y!Np*VJ|@jI@db=sUDvR}zW`s5e7u-` zG;P`|sO^OJFtzGge%nY);YH=4>SwH%2k!6bFX=yW(ul%~JRp^Rqo=>KU$)HFwYjG1 z5AgxHTPsicyRk2p;-~vq)8kp=iI3Z+`=&C2{thZw;;g!?@+=jIl!#cx@yE5Ddw-x#?iO*`Hb;V}AR(11a~4T7J5M_=q_U36viaNxvA>dflUDO^dH1?= zknNQdmG3H7n9t{`=Xy4c#s`W&hwgyZC41Np6jv5sE3UgpSN~L&6<-?O=n(fSP<8{(#xvr@zD(V^^Olmn; zM8iHa1U0;qTpm7i%g^4=)h~RWuz(#;yuo&JZdPzpywyaF`F!fcmTj{7ScNwx0~hX0 z79C4nt6p=yd|x|QQgw&FhSbnVRbioBev+3?^|K(q*VsPnOzrXMcY~$1Q5xQo9x$w0 zxoV`>y*+iG6DPGV4jp?b-b}jESIzlq(_!+2o%iAxVzHA^jA}^ya$GLs$MM>RC{77=I z#BKZlIzsdFMB=P_^M@l^{x=u}H9Hh}+D^9RL@KU+nLC<0s=r%mw_8;AT3&5-uV)`u z;25VPNG0f85I$&2&Z5DKrvZbn*9&^i$Jt!ZDba<6*Dr1!wz`{XOJ#R;W?SylW*ZEz zh1gnkeGwLyr2oyoB;vkU7qXJFS|}W06G24`dKd(@zI)VOdbTwCxkg3c;-SS`U&$XG zSEI)b+X72Jcxaa~IHGVxJorStoePSQ?6n(FSnr?_zOSuCLzbS8n)Mcs zyeQ47i>@=PaP&fSNH!)%v6o?^0YeRQ!KuQovsJU|`z9hM)+ZJ|-Yx30&0Xi?$yiup zsJsF{D*-_}D+1o$;UEg7WoTrw7FDypA!M4nvH?J(Wn*w%R2Pv20KT&{f(ysR+6qTv z1i*=8hBpNs62Jt};K%5`5GIl2N8v!cDO4I=A3EF64296h`cP*rYos;PnBq$_4`Wdr z!)yqoFh7zm8M@D4i;!Lj4rB^8Rg9eR;fe08ol+GcB!07Cq-${PZ zm{8ax7LCcFG3byDTB0{2kfRR;UH%?R0P`0&o&6(WVCoPdL?!|SM{dOS4M-;a!Z8C` z{@*+xlMobtN&tnan>#n6Vd9Kg6e5SgA}|>KKUd7|r^^tuCL9Y<-B=@} z7I+^3N27GKAV`Wf3ZqL_gFsZBX>>9pn63637sZ6gq3A~zcP$7X81E$py3VgewTy4VL$%D^r37Av;7bYyfGG~i^amwaMU+pvS{EwCHnuzJl}TH#@5pNR$VxA8XH{q&|l&od&H4)^f%EDp+61st;ldh z(#Gb|hmtm`hC+t^5YztSC|CFNdxZirnH;(U8ut9+{Q154Z+?f4pu@pMkS6N^K70Z+Yn>295!o-MR-Zp)~ zQUp-iWZWam(#vG^t?dGdsrOQzJ8Vs3IhlV?{?EP`9EfNKY^s2F0?A*r;|l9xU1 S3%(Wrzyfb$QojH2iT?pPE)3HE delta 599 zcmV-d0;v7mA@Br{B!2;OQb$4nuFf3k00004XF*Lt006O%3;baP0000OP)t-sM@B{= zAt6FSLPbPGMny$IK|ww~J}WCL#4-Wt00009a7bBm000id000id0mpBsWB>pG;Ymb6 zR7l5_RBcYfFbs7e9AGyfZX5oxHvI1vbAWXX{6`x1KLWPXj(fJLy9^a=av&>V{Dtpp^vo~f&WNl3!x_?da`NCSClkc^l#KRfjw5(do z3JYsJC*Rwz*4Yxz4a{j-wMNf_g0+sx_o6d5xX;6Eq#$W6w|r);WAeSd%+8j0h(x-A zXpJV=nTulby_J8y#HR+^CGn#L$@hw5ftLoKxwf;XmmJ3e4|21)&ucL^pc|j#in~nv zdpyXD&rp57;cX6-cy2&9KF1Yra{voGq#6I~^9^rvpu~foGxPa|w>ePae;cemzZPWL l-{W;2NaDu#H2o9rc0X1;S*o`JJeU9g002ovPDHLkV1nr&6W{;< diff --git a/Resources/Textures/Tiles/dark_mini.png b/Resources/Textures/Tiles/dark_mini.png index 02c75c56c4f9f115b1042561a2a2f8eee948dea9..aeb982b732bd360e782129ebb809445935856543 100644 GIT binary patch literal 1962 zcmbtU3v3f*9KXtYvJG`il(>93h#9c!eb*Q3(F$9;M<-?7C^Et$yWV}>&b4>t?n=8M z$QIrPkjErq)P>g+%>YSws1XJ%3q}Q^m=FRiKnNf(g-Ak(#_!s$DG6%COYZUg@Av)w zkMIBgt?|vM$j*8>iy(+>Po=vSzn9?~3?77^g(JiH1YwAYE|<^aasi(r2gMM=KTfxA zbiRJVH)cik++Ew-bJ*3z!Y5bGl-7)@__TiOtut@zyR~VjXVQ4FvUca;EMv})VP|{x zcE8>6S>GNod@ZZa5E1#=(XF6zJjeO}coMbUlp4r=#`?Yo<19f=n7 zzxrHH-FN$Q)pf_p^TnNDTIuMfGku_2f(I@yIkj6hjBXLW@%~hQwx;y`OU36Vc22xK zF}h;I%57U8opywy%JGj2Jcf(aU5{*8%VW#RFGi29pLb~C$mIpC&+fRh7k1vvz4iOS z{3*ot500Hjb2l$)y-(HO=+2||PgrrdZBN$MA3gKOkovx%H|GC#;LRnyr=0Iz?xVjP z`rtt;b9Y16(m`l#!->upzP*Z1VuWwHzie8GyQX#)!&pzgxUN+f$Gkkz8UPOI}yXL&hnH6G#kCZvG?Y7iwS+5gp15{QD6oNe_& zZ^VTf#mW{1&1{+B=UbY1yFgBTEj!B*XE8$;`hZJT5U?8|#Y4z|$#x?TP0$iB6#)}8nQ3UEp`C&@)?{ND3rJlg_6LAN5rS;3 zyFBF&ubgC~rbSqqj>TfenAs>R4K!o7+jSa~iNXjk*PHh7#8|@NvZX2@C|hvK#pIF0*P zu)woHSqXEv7GjudKy*ZEAVIpqtV<5b3U;hVmubgxmQph(sn%AMfLiKuC zkECjx#3PT}N#dFrMNwe+fM5x5wjhN#Yk)!)3r7VQ8=``ifSKWKybap9f&FfokLsN< zuwVF(`>PcZ&nOpqYM#U->0{+cbQW7Fs`$*C)8^EC%tQ+_OeteX1c?S?IbI(eC&}v_ zg9I{V7N5E}N!nN=!leJuE=iaw2elZdppph$$p6);bViO2TGxThydCtDN|eN9=tqJh zX~p7%S9srmH0rCgydnu}s)EJy+}fI6EWFU;F7a3P^7VOndD{n@heHT!+A6X;RvN1E r+RkclTTc0p-Hq%R@30*=3B#5x1hQ6@NFUM*bk+8h&2V>>*0=oyaj=jg delta 276 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 Hu0mjfU)rZJ diff --git a/Resources/Textures/Tiles/dark_pavement.png b/Resources/Textures/Tiles/dark_pavement.png index 1585211593ba1c002831ecd27e2a28870037ef5e..6ad0bc4209b9aabb252c72bfef30076553239111 100644 GIT binary patch literal 4273 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 aeZbuqlfw3Hm5TL2Zi98OsM_m$;(q|5WAg0) delta 642 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 T7UDSThms}U*0g-L=kb35YacLv delta 805 zcmV+=1KRxkBD@BWB!2;OQb$4nuFf3k00004XF*Lt006O%3;baP0000OP)t-sK|w(w zAt6FSLOwn|MMOkKMMXV5Jx4}HJDx_200009a7bBm000id000id0mpBsWB>pHtw}^d zR7l5_RY8uUKn!%#QSSQ#Xi&~OLYn(T@PQ3HfXkkHVWfP2s(*})I_yfT$)zZlG0R&-9N{m&h9v3UqhH%RC3= z^V|?Ci?@~s{iD<+N?hbVgnGOO!PBd84&-T`8ggMAyk*|5H!u2C1O>*X9)1OxkT6X_ z`Gf>;VI2I%ynkJ9Ui9nFxI{_#uIY^j#Hz}Np&^fmli!f{FI@}h$#!G#1m#D8Jzf?l zb$mixe&E**V?&f~2st>v9{E#SSt9*{JI3p}oo zz<6XFoCOXY=(@xT1=uXs12VvSc-$r=nD@$&=Q`1K?SBLILVdR$px5x2ujoCZ9M^{q zJoG62!d|H1t@Z%Dg~v5|-Ft+*MV{-#Ly!IY!d^)5)-8%S;ad8J@d|PB7J04{UDs*U z0;pIPAh(2rmjw=;US3ZgNAuX@&Rut;F3;!l59WG*1Dv?>Zhs=<>^>Bj)KA|B z8OTp)tv^=IKM&0?TVAsJBu~8P7vBe&i0|Y4Grro~C&O%cwcRHhPME#m`(RV-8;&pI z*{rJ#H_L17J}pr0gY7i`e-{{E_rYc!`##uC^M9Ys^V-n$V;^idF!kQ%egk@M=o=K? zm%4Mo6B>HUx#xUuK;^b4a^ZccJC_ZfueSR+-&?X?usx9r?@QgeenPh0Pha!hdcpc2 z7v7h;bII^L+wSLlXCS%niClPJ>dqy@^9Q`;+;covAi3{}jDvcZ_oeP!r}1IlGVon4 jWgZX2(|^SOd0f5#{pcf6u39rm00000NkvXXu0mjfZ}^QW diff --git a/Resources/Textures/Tiles/dark_plastic.png b/Resources/Textures/Tiles/dark_plastic.png index 34c3e57ce68a6c8712cb014b88adfcf666cfbfc2..79e0ff407e60d50df7b8f2e89cee5621520786cd 100644 GIT binary patch literal 4283 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 diff --git a/Resources/Textures/Tiles/glass.png b/Resources/Textures/Tiles/glass.png index 37adc67679ee5ef61ffb63558c06cc608a25d803..bc782a9c6c3cdeb6e7c7d84f26eb7a31975e1adb 100644 GIT binary patch literal 5977 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 JPDHLkV1j>~5Iq0@ diff --git a/Resources/Textures/Tiles/green_circuit.png b/Resources/Textures/Tiles/green_circuit.png index 1628c20ae775e19e5302c426977026e22dd425d0..c215175c49971a78ecbf294b61662905bd608ed9 100644 GIT binary patch delta 620 zcmV-y0+apd0{H}x7=H)`0001UdV2H#000SaNLh0L01m_e01m_fl`9S#0006jNklCW1Y&jQqxH~?9 zFK^us7zg8wPr!sB2zb7@iabGYzh&GvHMa;;YqM$r)akE)ev!i!IRxt`D{gzebL)N6 zdmIP?aP`&gX_(KX0v*e{Pu~08W!oe63sJ#&cz0XQtb%}Erv*+k%}!z;Ex00(P$o0o z1)~sHbq4?+AAioQ0=%|+f(Q;Igjyt|T!AeIBNJ{_?gJt?kT7bAR7K7T;DDmSL~vp8 z!`K5V6C#<32pzN@P??a(bRyzFYeJcf6JY}Ed;F{k0YWw*w_;g@37lphhK)fm6^A*L z1cix+g4Khfa3V0|3E_Wk1C*9NA)TLbKMzj_S`kqp^M48T04lON;CTQEbt0ldn+a)E zD270pEv^9(#wPRwjRTMr&UhRH(p;X8Gf7W zz|YD@`DH=(lVSy+$*g)SK&DGP{*@Et8q!FB37HCXbh#s}6@aAUT(z>0gW7KiR%5Ph z+JXcf8|9icyy*st44T7quK#s4n}`5iJrD-h^>%!69RCgOmX3qYBjwxx00001n2^g7=Hu<0001iRA+kwJ2UKnw(xGQJxb9uU>eJt=s>qWyr({{Jf(t?f&4i8xR-j9Stl zA~Wlzv&fB)%ExZ3qUv7u@};63Jvwv^py5!t+9*}SaLR;))_UjOgbW5hP++iqIC2JsW$c-Z2hZ-0k=WT&0ME8`c>Wo# r?wP|&05_G*kLriseRId>Kl1nia=KE49-V9C00000NkvXXu0mjf`Hq?R diff --git a/Resources/Textures/Tiles/hydro.png b/Resources/Textures/Tiles/hydro.png index 5878bce5b709b0f1f53248618b366c9d3019febc..0d1c6fef23fde3a2229c61ee4b8decd486f00ade 100644 GIT binary patch delta 103 zcmdnXypVB%V*+P@Pl#*A^pN_M84ivv?DGSa7#J8h3p^r=85sBugD~Uq{1qucK}Am& z#}JM4$q6DX%!(3c6%H`4`507HaBD1Vy!gR^&C82n%6%@;9lK9y02MQMy85}Sb4q9e E06J|SPyhe` delta 389 zcmV;00eb$S0lfo|L4PMuOjJd3jdwypK~+^%dX#^6kb88Gd2^0=c#?f_i*|L8du)et zZ;EtEWKS=I%MSnm010qNS#tmY4#EHc4#EKyC`y0;00AFKL_t(2&vlVKYQ!)Qg-2i! z<89WPi+EWG?lVSh3JoR)$PEH+9f(1Yc2D7Lwlt{9&GJT;9e)U9nz29Wz4;O4I6Yoc zoT=dM1;9Ls@4P&p=^=wQ1R^T{@5~}(nu&$kLo$FcK!Jk<^j|?gfE17*a|e%4hcCN& zFg)6cc^JlDNjrHEyP9g1){18*`35{1&z(3k}H(P*kU#w7$p)(eePn(7wkn1Dm0QkuhE6<+|ocDjKG zk6wFMVE+QLD{$B(K&6s01Lj~3O9u8oQ0-M5Hl`j+$N(Eg?`VC##i$YhyrQ8Q!^B|r j*FSF4Zu|I7sjhzj&WmgfSqu&_~5Re5%HiHC>d+W+;D zeHTdpGf6~2R4C75U=#!cArlucaAFW(00SmxV=yop-U3Q!fB_Z`uyA33DTQer-U6th bp`-)=nejP`uoBL*00000NkvXXu0mjf32Z7e delta 435 zcmV;k0Zjh60o?9FoAs~Mh0f5z{ZG5L6BveFX{{Dj%ENJzS}z~QsndUG zHbbvh0_M{Ktt-Cx2zWn$LRAW+01{+G`BY07K(JtocOvr~KxIwH31s;MmTlVtsREio zv?yg=6RGzMnUsL~gV{>`s|5fNK*AwIUQ-l~7bY=gbI37cLNLg2g~aP1(t$t*6~K3| zRWgHm@DYH_Z$PbFHL7ey!0dCA=M{fXjpn_E??a}$HMtr!xiK>$>BzXU+rIAyrH%xU z1wf6z00CABH30K+F!}&Ej&w)*L%^cTvC|X4PiDaVlemD~%5Q)f!a+y^%mDur*sm6! z4xlt9;`e~22>lN*WNXnfkl=AO#m)`&fHoP+7Jy~Pw$B!^YMlZAkCF9Qb*CTi@HnU2 d*a<)<_a9?S8K^%SZ5{vs002ovPDHLkV1lyKx}N|5 diff --git a/Resources/Textures/Tiles/laundry.png b/Resources/Textures/Tiles/laundry.png index 60f079498ab817ee3ba0ba9362cbb4292d7554fa..e89ae3d14cb77d36efcd1d5bf044d810127105b5 100644 GIT binary patch delta 158 zcmX@jwv%y!ay4Tx04UFukv&MmP!xqvQ;Sk64t5af zkfAzR5EXIMC={VWs1;guFnQ@8G-*guTpR`0f`dPcRR<0iRG4n}j03viSm~rBW^=1z?<>NHA%8#}QkZSd$#M!^>+7CQ zQr#tZ7XDZLTHata0ArtXFERbx;1nNZwdk<~nr@Ni1RsGDN7T zp^OR~Bxp5Av44@KeW{Co*z?QeQpr^YBgX=&(4lyK@IUxHTe~nh;U`5TAoSw8A0t5T zF3_yI?)S0lHcx=yGjL_J{nZ9A^GSNWt;LUkfobjp-=$c z&*+s{X6*MB*;KhJpcgY*L-0&<4x^1p`w z001peOjJeX<>hc~ZIzXktk&%9>gwp|=%>->s?zE2?d_z_<)zQ&tJLe`pGG)Y83R4C7Fkv(d}Fc5`h$U=(s5<4eZ z76Nwd?SE6mR~Qvr26hU!DfR>ocBe+hzQ7i)(wp4CAqQ}DhCKb4B#>!@KIT2W8HrHo z{lV2<+!V)0farnbS<>@f+y;;}%`j*Jcqxjq6j5F?F-u4;AO%3jAQsrW1*Z|DgXDty z5gxA&U>cv7h@-A}f&38Q>G* z+SeR4XF{5Tql=ZZraDNlz$3Dlfr0NZ2s0kfUy%Y7H1c$D4DmRgoFKx&tXP!E#>i%n zpfp|1G~r4^AoGgU2BFr3EjAJ$?!#nhhSa5vlY|&p_%s5SZm3}dYG?3t^>bP0l+XkK DMK3Il delta 942 zcmV;f15y040k{W{7=H)@0002({D2n#00DPtLqkwWLqi}?a&Km7Y-IodD9@FVJxjw- z7==$;rJ|J%I*2%AsN&EAb; zNdetYuKP9$gm-{O-F3f?T(@xygdTwlqwTLSr|A#s^|lr}0HT|~*=1Xkc7gLPVCcaV zEwL$uxPqz*yq*I61z_L?=w0!%YJJDaJ&@nvFS-Wy_J4sf?vJj117(V5!>1F<;{X5v zHc(7dMVgXwLP0@QRaH$)Or4c>p_zH3ntGs>cAS)Sp_q7@l5?4nahQ;Bo|Sc-lysYu zbCZi}mX2XZ z>2mG8>lr2lH!m{{I%&Ag`h!`BEiiesDTM#%3q-3=s=9Ia17CA z#1Qq~wxWyX(9E|vQbi$Xe&Ec#r~^?Oe;FbOGJl|`LN|w?8t<#Lb9+RQ+9qzkt1yHj zNC!Y22qGRHizI5w3UA*xyr><5o99Wz>KF+92d@(cDmpOpJgXlhlvf#vaC!rXb!EM+mcHpu4oFRlu~eW z2!GfpSf*U5Y*^P&k-n+}FUN-9PGw#MJfZ_LFAeu|8h0Ugtpqn81kMqKR9-r8aI8{s zo=XxI2~3X;%zP6VZ4)fdL2&a}rI9}cHy;EplE)Cied@r$IYcygIck+IJRx?1n?nG^ z8=A919F{t+5Ov_?7$OP6oFg9A$@K#_A18zBGM_TfukYu1EpPeo|AAV60pd{GuDO~^n delta 823 zcmV-71IYZd0nG-GBYy#eX+uL$Nkc;*P;zf(X>4Tx04UFukv&MmP!xqvQ;Sk64t5af zkfAzR5EXIMC={VWs1;guFnQ@8G-*guTpR`0f`dPcRR<0iRG4n}j03viSm~rBW^=1z?<>NHA%8#}QkZSd$#M!^>+7CQ zQr#tZ7XDZLTHata0ArtXFERbx;1nNZwdk<~nr@Ni1RsGDN7T zp^OR~Bxp5Av44@KeW{Co*z?QeQpr^YBgX=&(4lyK@IUxHTe~nh;U`5TAoSw8A0t5T zF3_yI?)S0lHcx=yGjL_J{nZ9A^GSNWt;LUkfobjp-=$c z&*+s{X6*MB*;KhJpcgY*L-0&<4x^1p`w z001yhOjJdIfq_CnK~+^%aBXez@bHO-hJ=KK=;-L}>gtP$iR0tr<>lq??d^Ymf85;M z;NajJ^_$=T000SaNLh0L01m?d01m?e$8V@)0003qNkl$?u};G<5Qgo6N(>$7 ztAvfQm4A?u*_FDnV5v`F4~$6lkd>iN5abRF9b7e1`T`lk1LPIL9wf|vwj)5|Hh;SR zzyHoG)#7#)YRRs|`T>C7E4|a|dC9I5$gQnwrvP4rkdpDDGRhbY$sR-ioD2v7dJ}kR zK~9kD@m|B@wFGg|L%<`ijA`4$k0h@&h>NB)C4YBHn^L6?cof>~RB3{#d?X3R!Zsw8 zA?ZOWr%c!-fZ}YO)&OkYQ@yXIZEs>NvQ*POcpd8q4+&Ano5B0h+9R7GcZZI~`@sjW zK~Op8mrqi>0c>Ktn)oMo*{LcUY002ovPDHLkV1h7| Bjj8|u diff --git a/Resources/Textures/Tiles/plastic.png b/Resources/Textures/Tiles/plastic.png index 8fd68090319bf1b0ee3014867c9f3f4debaf0ca7..8b004d5164bda91e96c7d8b635125290bba0cf3b 100644 GIT binary patch literal 4283 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 Mt(}QCExnHZ7rMGFWB>pF delta 551 zcmV+?0@(e#A+!XL7=Hu<0000e3~d$w0004VQb$4nuFf3k00004XF*Lt006O%3;baP z0000UP)t-sf`NfTK|xhjRgH{{iH3%RgoJ;8e|&s=czAe$fr0P!M5F)!010qNS#tmY z4#NNd4#NS*Z>VGd00Ey#L_t(Y$K92|PQpMChIbOW!m)VrF@H8dDQDmTHWu$j;Sr24 zpm5!Umh!ev`_F8GhNOskaMNV?KPF9o`p;nG3~xv6aTn{}YFY5*C!2>gU+!l2y5-A{ z!CeCGr{Ga*ze$R=(`W0Jxc;{7^b>Gr!F>)Mwf382F<*@5D?clmx^exN=9`_LfIAEB zb8t5hok_px6@O#?#1@{L$`;<68?yy)mw@{zc+}c&l6$_^ z!K2px>u15(O>-VcI$f9Q6la*8p3YkL0UdFIxm1fMI)A`pP+g)1*%wjEZ$x|WU}V0j z#=HmB6>5-u5w+|KD#7^%G8{FM7G&P3LJg8sI*Qg|E5X?U5=93jEvPP0gCsR-NhB!3c6OjJccK}0bzH6bA;QBqYUB`P*IIzjrhNdN!S zV1NKdD9yycYzzhl5Xu-R;G~2EoPh$Wf*=qQ2&R;Q0*Wpm5F!F1UBLp5U=<=DQgkp0 zsD^?-h$xr>3J9pUAOVFSnCC=>qURLRJck)`=y8h?`$}j402Hm?J)fsoiw*z)002ov JPDHLkV1n3|GYI z6ckWUP#GB+C@3f`EiE%MGb1A-E#uwf00009a7bBm000ic000ic0Tn1pfB*mh(Md!> zR4C7Fkzo#kFbstUdH~=Eo?wv?{+c-S0IYZbUGIMc`&tn}UVpN+`O0c<^x zk%6=US%Ea2WR5N~PxD|Y-hEG;Z7?%&G)n+Z6)zgfy$aYI9=?aU`4v1HSR!e~&E^1q zDOk+ygRgxJYChjUn1THmDKK+koH$#>)tb^kDgFL>98yf!3)x=GM7wNmyW79*ujPt2 XUPW@3VB2Ss00000NkvXXu0mjf0ylc_ diff --git a/Resources/Textures/Tiles/plating_burnt.png b/Resources/Textures/Tiles/plating_burnt.png index 7c89de081eb6328dab96fc81a71e1483b8c23e1a..899e6c918805571db1d80d7defe5a4795dbd1de2 100644 GIT binary patch delta 1399 zcmV--1&I2c4F3v{8Gi-<0047(dh`GQ1x86kK~z`?g_mh>B1aI0oAJO5U<_C}G)o_E}gc9W7!b=Te9b&NZ=x3{PDW*br%^o#I+ zG-S5hV;E1yVLqRQREITyjdU#^(8~U0`16myLN1~4Pwyx;70s7+`@a?aB|@C(oVeJ+7opA8K7~M7Z(>S?SHxplie6CCL35f$K%mu^1N(x zoq%3_tJ;HK9;g-|a-3s`2nFeyTgWUJWN{RAa@RrrTviq$R<4Mem6pXRV65$2iG<-% z_S`t)^Z7e_J9JdZ+A`0{7=?U6K7Q1H`ElYAD=7XLB#_Bn9{WCqQk~Yu> zkjXp=t$$&#A=61V*3({$tqI1A$f!HA8G#EBqC#NCV zIElcG86S)x_(~`+Hz9`#5-b{a&>3Bgz1k?lYV+jlvm9uj21OZ^bAnW+!v|EV$SMcq z9GVAQR}S)&AsrYQe*)DdOn@>I$Z=5=u0W77E`J$e=*p2aZ~~^X0B-s}lTgNpT6qu^ zV^BCD7=iLedmM91=(FYzo%XFYNk|!Lc<`S6K@n)PgW;v;L4Ppt_lCwAgYe`SXJuJB z4?fWCbzO!x2SlfGfHVnnMk-Sccz=KIm`d2JV=HdAQv_(eBrAWkZjunWSV2Wt%pcqi zbbsZCS~)`sS&|UQndkIqX7e}SzG@AYp`9+aXP2&jI5mKCW&$$=Ic|`f5%dRFmibo= z4ZV#y#yLqyFy4wO3xL5A2Tn9DLv4&><^&)ePOG7mo?5!x7SEWrVshhb77!uEi-PZf zm}tsg3_)WL##mJ?jT)0|V(nEGG8&EK*MD;cyQv*MNZ!2p-DNVpMWazKP)L=?VjQF; zrIUi?ylsb5!Xs#skZaeCBkP}Jd^*A4BLYAer4%p(P?{^7xJ<(o#7}9gkzed$5Xa}9 z*)F{iNv`R)7*Kn~IUNm}{-i*o`INK#^fJDYXRpR2eK1eZOhXnBsBeH|0zRhb41fEP zto9mUht63_h4xWOee=E)qxG&5H!CL zJEh7{w+4^uL;n2H;0R1HWj03Yseh(Vafvg0fR%kP`{ zj_B;G>K|u|)_ywP6}i!2?T|&Z-eF zdTLKR>~>zi{=xsB;+opm$#oHB8&X-xe2j*k=#p#O`WK}qpZW~hjq(5h002ovPDHLk FV1ktos)7Ij delta 1559 zcmV+y2I%?!3Y`p)8Gi!+002a!ipBr{00DDSM?wIu&K&6g000DMK}|sb0I`n?{9y$E z00JveOjJcPGcyzv6cQ2=5fKp^5)w5vH4_sP5)u^_5*9KtGB!3g4-XG8FfcDKFDxu9 zDJdx=B_$&xBPS>*CMGB;DJm=}DK;)PE-o%8C@3cF z9UUMZ9wj6sF)b}3A|fFnAuA&zD=RcBD=R1@Bp@IlDkvx@C?qH`F+4mxFE2GQF)=nV zF)%ADDk>^AGJi5HEiEP{CQD08C?+Nx92_$)E)Wn9H#9UKA0J6cNhcv8BrPRIMn)t9aKR-VoARs3vB@PY_J3BifA|n+Q6*@XP8yp-iE;2VUF&P>fM@L5*BN{I+FgiCk zIy5vF7Z@}%GcYPH7#JEgGc!3gH8C+VEG#ZBEiEi2CVx0MI5adg5*89hOhz0O6b%gx zARQecA0S9bMkpvMBPA&u9wHE!CE-NcdO-)HjK`t&OH7+hTFfcGIEF&KzEhHo>B_%L2 zFfJx0Kz}$mC?X;=FE1q^AR!|oIXO8@NJu_DJ~T8nDVGd00VnTL_t(IPk%jAXP4VV6dg-E2YaQNh$hWjJM4PN zM92~{WdySV!hn#>vS?v3fyJf-2)$_Ofk5abl%@CHJD~-B9>W*zIq#hLaL=84?z@kW zmSx#TSp?dawaxkuM_abl>29;S=E0bRcK+MqJ43On#QHmZb%DuFmG?EDM>7 zbBDW)!uB0;pd@m7o<9Eq9z((kzjL8mR)wqO_#z-;A+5v;W=#1PJKid!++VuHQ6*M^ zTd!RTOT>2~E?O(VGno6#S1FjB6nG-j_t_XqXIBGb2wK1*_e< ze>#d=mc97^kOvoHo=GXPOy;sqntxF^F;8K#H6CUyAP+qpb7YDtj&(YTo1xhMh+qso z6oEA}CLirhIns_(x(dUU6q5P?b01UqI4{sT_ymwWO$(K))sw8?UKT@~Gq%q)t9nXR z?b*{no@u5+5oJJWPsjzrMD%W4!jom*zIV!a}gJ{CfX4h~EYle)s(kKmMfQ z=U=pmbHiM>>k{&7b@;d6|M=7Y%LhCn@bKS9b{_bL>!tzgU)Gqwp%BAEEW!W)002ov JPDHLkV1mU$Jpup# diff --git a/Resources/Textures/Tiles/red_circuit.png b/Resources/Textures/Tiles/red_circuit.png new file mode 100644 index 0000000000000000000000000000000000000000..d7cee0fb61f966738f5d6d75e0cdd6e6f3ea9a18 GIT binary patch literal 702 zcmV;v0zv(WP)XqWEAqq1(i}ZM-iB=T`dAV?m5d?1!g~~ES@1=;5?8<0m!ajA8A0OmP> zZuc8bWDYC$0PSNG$TACfdBq~bnV{R5sI6q$M=B6YKq??J0`$^~T0?HO@;eD0C$j>Y z1aC%YG}M}{-i$O-?S>M1X?2CmMifav*VSb(-i$P&`XrKoK1Thhm0R-ly8FER+d@n85b}X;@xy=u-{Xqo?V7*WCn}y}MO#kWE k>`w^D^FUhgzhNH#FNqQA#R%~KH~;_u07*qoM6N<$f(?yA1ONa4 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Tiles/rglass.png b/Resources/Textures/Tiles/rglass.png index bae2908132bbdd4ac4ed025e37c8bcedc775970a..6dd3bb591727d58e7a7090de87d1f52c060ddec0 100644 GIT binary patch literal 6911 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 jtbA$>5^9(X1N@#aJ^STsivIG?X& zzrUM2K)eCQtJQhHF`lgzFAUZm8{jt*M6xg|-ijB_N>@S0c%il8a{|`sqZ4KoXpIY> zntgTxPPnH6c$Rw083bQ%>F3w?Dl?B~Jhv{UzOd}43gBU+4_J7; znYaEbeZazJ3H?jJ>H|GI&+yho7R^&k>gBn{bCT?VmyD+)JcmViiFyD)y?UTUPq=!Z zf?-Sg1gy1BxOyPt@fv+%PJqEnd2DUm(kEbUA86&VSAncg%n3w1)zsRePlS4azh+UN zsAD?$);^Ky0eH(mGhJf7<->ZQMfdZ`bOkcJtgZWp^uQLnpYg69*i!fFIc6W|slbxB wclxjbJv`6wO?m*JwRC^>ze7g9=c9V!4}Gc;Dxd#RivR!s07*qoM6N<$f>=A~g#Z8m literal 1768 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 diff --git a/Resources/Textures/Tiles/shuttlegrey.png b/Resources/Textures/Tiles/shuttlegrey.png index 337fef7d30d20fc7ce42552491c1cd4b4903a319..8ffd372ab06c05803f32c23c915ab3ff5b354558 100644 GIT binary patch literal 393 zcmV;40e1e0P)h0)yK)_!2QwCZd(kR zh|gUc4KO%J<3$?J*y);2;qz{@zBJx7OuvS;`y7ompO58%u{;5(c|g;W2mWV(R3FDG zI1fPDeeT<6!FfPJg-ck24YhN^wbre%LwIUz9?*Oah2(yp(0h#MsdN7rKfeo>0e(6U n$TKz%gyacMz0aZ8Jb{`oqeo!M-DVXC00000NkvXXu0mjfw#KT( literal 724 zcmV;_0xSKAP)Px#1ZP1_K>z@;j|==^1poj58&FJCMW?5yS65f7tE;fEu$-KnmzS5Mq@<6Jk6>V6 z8#@k_00009a7bBm000id000id0mpBsWB>pHLPHetbNT3p7cdYoH*@7g^4$O6%h#Q>Q?4azp_$C7ML?=JR$X_9elQml}&j!L*kl?4{(1 zHvWC{c~c!{bR2oqcnp6C!NLg|X#knucH@WWxa6C9OotUFX#sM^=CY0!)CYniKkB6> zzg!B^LMCR6%pQ9M*;-KC6dbWA2xA_?NC$z>8(x4Xguw8Fz+(7=Ov)8EoSwBXRvh_r zz58JP$GqpSVwPf;V)Hj2IDeyU~N7N_10*ym$fqDX)vwDP& z;gvvRVC@vz7OF2&#bpZK0>|I^VE%s}oc8`#?}U7f%m>$IUo5A+@9%=_|6Jb*)GX!$ z)cU?)f`0G&9%%NzZfX4Ua4l+3>v;;Nz3idRYi0000FYr>LzlYz}ko?1|KyI5bERLdtkHPP^;Za6k(s64jN!^u%5)TBwlH&Y4+X6>{Iyswb)aS^%8Gt=9SkM zk@TJ;3rIe9<$*MLLd*k_@;vZA4TSpGSE=&=B)#XhgO)lEaHz1o=dhtkd{4k;Hc5E^ z(s>}n=PsePi~o8aaPir@AaCHO^8k;&c_2-mP@(U6NS?r&JBeOF{PIr=i~s-t07*qo IM6N<$g3d^`$p8QV literal 767 zcmVPx#1ZP1_K>z@;j|==^1poj59#BkFMcttY+n)%GVFl%<3F@i|*qsR0n+V~i3C@-X zo^S@A$gDL0000SaNLh0L01m?d01m?e$8V@)0007NNklA6SgNG0lSO_MH_dUU5A&{z5s5#6!=fCF?OZdAKL|3B=&{NYiFFz5k*8#6} zbd-=E=(l4;V=oED9Egu$iQqWpx}9=PM|$x02a2^|ZD(|hIe?F2%!d&4te}dX*!Tp3 z1sj256cIj-(H(l`f^_w6Pkizi(tVL zL0hG|t!N=YzZc9A2!Y{+z%b^6ER^e@p?eB~H(d~n6iR=egQn>3KV$Mf`~TgTbq;t& ze%YMB4qvwe!%mjtfmQNhMp(?g5-5gk+l6fk>s)lJ zUAo{YF#b<-Q0)Eh?gV_`E0JASKkAFU?{`7=|G3@>`1Cdh@FiRSOt9bkeiwZIJBAPL z0DR! xHK1B-<=*$Z;QN1bC!()4O~JbGv%Ao|d;(%}8qkYEzXkvR002ovPDHLkV1ggAT_OMg diff --git a/Resources/Textures/Tiles/shuttlepurple.png b/Resources/Textures/Tiles/shuttlepurple.png index 2236948d38223129c5a117ac8c44a7d1f89899ff..05601b839f69deb167796d628831c0db1c77bcfa 100644 GIT binary patch literal 473 zcmV;~0Ve*5P)WHc-5pRl*dxWd?|RR?jPRtiAwsc6@-hk5BIf ze0g$U4@Ainx1$GZ5q2qp;^^w~G))oV_dIXT`;ynMfPXA)U|ujhbU(%Ta*W0ELKorU z5zckD|4>$(Bd-f^`IInnhzi5d$?M|tYOBU5=7ehH^O`v!$?)B~pf8}Uk6X`yrE2h%QyhI+ P00000NkvXXu0mjfT|(O^ literal 751 zcmVPx#1ZP1_K>z@;j|==^1poj59#BkFMX-w4s)f;4S68-=;JA_Erh?3)fXT9q+n;^J zU|?X_HY~#c000SaNLh0L01m?d01m?e$8V@)00077Nklrn)|VxsU5JqHA0H=3i+7<< zea~_oZ{s-LTpwQh6xc@lTq3cQM>+i{<@5)Blr&743Hsap+RxAxmIL%GLV$-3D}oJv z@2u2Y*Eo$$@rL&}vi5U~KCr!aH&xEF+*dnM{ zA~<(Bo;#`p=y$~&fe;w31cosmWT9L~4c$`^yy}8rq|o~N92}ee{xc@;vw!cS7m+cK zY5Zn$0u0~QPL|`2Rr0+<9PhQo(J_2myAn(ViWxb>*><$eZLF3|3keK z@VWRLAXU>-yZ8Mr`2MeVLL#6hf@}no002ovPDHLkV1mXaS6Bc5 diff --git a/Resources/Textures/Tiles/shuttlered.png b/Resources/Textures/Tiles/shuttlered.png index 732cf385d64451ee78b57b4563ec9ca4003c5dd1..8757c81aadc6a99ed81f15e56dd779fee990c88a 100644 GIT binary patch literal 556 zcmV+{0@MA8P);bZ?e#X?JdgYPaeN>DcvfHxj~pE4vfF^JQ-M@0g*KjxM_yIf zg+9WCA=rHGcvpbz0*@&j$Q?(1*F2~0!2hqpXJbCkt- z9A$>5(D1w?ghyKBAp735Nj~Mg2%@Ql_jD}8SOp#47hv%;)&U+dyt_tOTibVl^OSEA z<2j8xoYaW{UUX2?8RR_G+RU$~crNjh)|$>Nq5~RUZW>#E5gpL*se*z6G#!}2^H|$0 zok7V{nlzQ?67R#%8BFnX4$mnpJX#vyHg_@A59IiXs2_N{oVv+Jbn uf&$j`{iFQ=Rk@V!Pkndb-1qrhKk*AdaJJ{n*d_A-00002N#&TLMj5T>2+3BK%qUwX##+|VB74Rz#xi7&Ln4Xs(_tjq zP-96^Axt8fBjGSAvP5=+GrvFX_qm?yz25u&T+j2zn`A*T636bw0szEKj18&68Z8u2 z6eT>T1kqB$0tHZwNT8A{GcIfpcLQ?+0G_1d1T?hp4sUVR`g8&S$tY9`fK|92)H_3=;C-aNZDfO~{W%X9-P&@CcHQ!NdUI1b~g+ z;C|t}#I6~i7e3wE{C`0$e(XyCV4j*78d%#K`Q)UyNE&T#k>bQJ^YXI~BJpop%UNk+ z=9UkmYx+GMJSu#qMmIP0SJyiy_ZZ}#%WRv{30~Apufx&)?RT@WQH=xTBi&Ce+sQw8 ztMP)`3gxfc>%z>+75;9u!&_S|u6M9Y#NRTaPTVyC1TS@ooR=U3=9elG ztObMi8&rkI3+9Y2_F~Wf_s#%4va`2J zWSWxGqLt81@A)E!N;|0P?Yky#zvNtgbzLga@2Pg6A+|uL8jsg+C3><0W1O1Ealvjn zH}|hITioMYUYuWkc#Zw5XqJ{b)Z{xGsdrqX^m%%aj`yRbv8cte!q5)RD(yApO4T1t zVsZ(hj{7PcEIG?0-&PrGiRG%JKPtAiS#cY@1ET4H$iTMa6tB#jpLL|@cB^jxTsZQf z`N^UXrAze2(!gS^w@c^i75%Ts^!=ahoOa4Br1=l%)Cpq=))3$LK;#=Be ztegCRT2~26?ucnnyyB$ID?-4VbeO)9LIHZ`h*RLGuOEqfetGv7lx^vsULYT~Btk z7LFeBgLxJqGQ>QNZZ(mER++k~&Pu*V{pB@&u~~K>31%e@S{gQ%Lb*&<8dC+t280;Zjp24e?6ZQG04pgnzYKJv{pDZ6J zXUwQiX{ATE6Y4A~E`Z`U!>?B&z|3%SUMbcrhWr8V1B;%u`k)(eC}G`Af0}W1Mj~iJ z5oD=}?CgvT-&5!7uFz!~;Q{aWbwhr&yc03#TYQE&jJ9E$n0$JyGF`mmf`PX}*XfHx z!4js2>=av*^tZifPSIOf>{~dyd9z`CeIrU0duD8f7TEDDPIRScGr&`jWaipeQr;4$ z%}G<6Xr;WNO-_r5uMCb7dM||kv6@wxkbZkF4+qVNMD4QcXSJrP`-H>FTXL0t(2kt&jf}Q?eaoeE#gqYh1{GB=lPf!{ z(fGrh&WK9C$i(8F%XJpEu<6%p{cVh z8LvENi1#{_=D+UbFTg@jcWQUt2w1Q!<|Q9yAZlIv=DgmmYj0jz+fWgcwGp(^B)`R4 ztqlzA^grQ61r73!(DpN;qqN^~qz&%79EstWJ*V}@6KU)$KblC?&yMY_N|V*S zigErYS@uPNQUyl9cOx}PNY0;GGlfD_SUu9q(J_sCjzINHr!a1gX4}-lySh{4npw@9 z*wwR)1k^P^D=7`T0Gqkg`TU~wcBAqTrrp*&c+-H(r#`B^)ttOEubmV8NS|vG zzI+!{4aE95`W%@5ENC$7=Zc6`Y=dUtKhEq^c#+04COu95`xFwN!sqwJvc)ytw*UU! z97NiEj^dini}FBGo`BRmpsC6OuhT%Rk3;312O#Y}cMY0%9*|IB6V_lu?LN=0WqHWP zLnaSsJ~!QZyNKsU=l&wTd>2#=JarzBXJ{Vq$rBuVpF^Q}0(*V|+7@{|Wf?+{ P00000NkvXXu0mjfFwVUS literal 704 zcmV;x0zdtUP)Px#1ZP1_K>z@;j|==^1poj59#BkFMb_5V(b3Ukg>TjqAI< zSGX0Dsyn2#WLM zyJ01f;5`!HTO{zE=&uD1&KYxkcFx5oX!+yU*C%2Jx3Re9paO3l=?BwWff&HNT*3OHvPGN$>MgUJ9e^0XyiM}QlHd+tx7Rg+#w?!lj6l_q z2W<$j(sEXdX3-DO8$b+T9{nMEy?q}m=zy{Uf2#t^%N6Wbz6JP!dczCw#IFSE56L=L zdczBa3h4>V`#&G>2I@~lM>g$!0&mUVlYfM7r2d5YK$|;c_}UNly(CDD$|@`gwBuDX zBLQ`0^9XnV{^(~EexQGTt$-fc->87`OmM0Q-~)ODfaV23iq9%sJ;7!|;gMT@_y-?U zbN{D35t|r&fLz99sOCQRg3bSF-V?|fk`Iu}d7%X5+~*wN{O1`t*aOHxF5_~j=04{@ zoc}KG3FI7-4|=n5j7vTDxfeM9^PaE@q^iItg2mkDUf}%Cd*U(^oU8|NUdYuPNPB_v mf3YVlZ+=2j;cxR``}hqvc_MypyesDb0000Sr9K;OR^}b%aZarGZ)(%#rtQ%EE0MqN;x9(i;uH0Q| zH-6j*lOH3<2ri-#f{Y=W0b=-3BY#;4LzTc&APht7>-~$}#5-e)e3? zo?~xr`?PmA7_tsry`J}LHLF3mHa>FEwAi(uXTD}(=0o++UfrOvuQg| zUc6p@xG4YB>g$JkvfB4J7u|b!;adBdzJdi0Zx{95_-@Rs7mH$h7aq{>l{$7dzIr%T z(D%}FJ$2vi%hTRDIwN1)0j5`sZ9Llxj>&NUmF1^)DyFf`!Z*J2!E-eg?_VzcVM^DO z+f!m~8{XQ|@#u_GimAu97I;mUs=FWAb5_M$W?YILS-2RYz$-0KImJBx9 zpy-O$p!^MW=JR6)aE^VxjEyJyB1st&nqIjChmp?86VY0rDT?S?q$x3#N0m#kn-h&_ zqO4m*oUW(=MTzuR%-`=aU~FbPC^TvWi}AZ;W-O(}0HP9$)gepzf8b8Op*0po6tC_oI?mf zyFl5Pl6s2aY{e93XCP%|LRJo1c>#t>`}I8vA2W*HuP^*Z{c2Uj6<2 zO~Y1+8ZKv3Mx1W_xoGhKQCb)gL9%yPjyGn)Me;^7Ac0Ja#iveAiZWIA zytp;@G~TI<*Ha#-I>`se49c3IirJ=Y7$iFiii77{YO;2rmQiiNFP!6y<4-(+I$PUE Y5rc9IYdZHXGZ`z{TRF$mT@hUQ7s@$)y8r+H delta 554 zcmV+_0@eM854Z=A7zqdi0002({D2p+A%+2eHc(7dMS+2VLP0@QRaH$)OooPri;9Yk zjEsqfhJ=KKi;0PXf`Wj6fPa5~hlPcOgoJ~GgLrs&e0+SQ2D=yl000SaNLh0L01m+b z01m+cxRGn^0004{NklXZ>2mG8>lr2lH!m{{I%&Ag`h!`BEiiesDTM#%3q-3=s=9Ia17CA#1Qq~wxWyX(9E|vQbi$Xe&Ec#r~^?O ze;FbOGN7nJH;14a@2j+Pdqk1iCT_let1yHjNC!Y22qGRHizI5w3UA*xyr><5o99Wz z>KF+92d@(cDmpOpJgXlhlvf#vaC!rXb!EM+mcHpu4oFRlu~eW2-qlCrd+9PSl3XIzN!N+$A;j4PGw#M zJfZ_LFAeu|8h0Ugtpqn81kMqKR9-r8aI8{so=XxI2~3X;%zP6VZ4)fdL2&a}rI9}c zHy;EplE)Cied@r$IYcygIck+IJRx?1n?nG^8=A919F{t+5Ov_?7$OP6oFg9A$@K#_ sAA{>MpEA#{@8@|fZ~5^5fm(kR0pd_+rLRf_R7ADDI#XqFq0+ASh6z-p~lP@6K1AatR<09lqFkPLLy`<%HE9E>~fO^k_usIY5Z0^36HnTMCxUZOC&n5CxCDsrNiMG zfVHz(-Jy!mP2z3sPolC_n7oJhcxFOe8h9Dcx>4b_0^f43xQ-t?IhGDcT)Kgg)sm2o z(N(odfYx-KNta90@|IEcZc;arXphAZ5=9J_wW{*dUtZIziFtr2yy5iHYiir)8fz8v zmYDLG&8XT;Er~(NO0zTY6wP6s;eNa*Y6Gy<(odS<5(`F4AYzpzN5RAIfp->yhmO8J zp!JTlxh0KhY1K8v+9J7;t(XdZ)BEb8(U(zD0fUeCKA@(V(MEaZ(c}0mqd@_XnqF~5 z4!`Qb;cB$2Yi??5qmZk`_TM;j^nI@fa3QjbwG{E|-_A~!uk^?PhdW}A+?YEHDH96s zgaD7;EPFlE1;Vcs(G_1b*NNHa!D4xh>f$SpIyu?iLKIMqZl1bgHVK>Xe*CNq=eSlDy2rW5K&CLE!OT#WBF-Fn?({guzF< zBfl6aE-vW2LCS*fTDVx%UZs9MAtOY;;6nHjdjUBkl+VUiqn)}NJ0q>$$=&9mMJ^xS zY8_5FEY-ljS)7lcf;2rjsuOHXtMh@T`@Yt&>fzE$vnv7oq^q;YV!cahAl$l~0P zBH6D>Si!95vb~Yr9zMbsPlrXny}QXe;#!4d=|=hc!d!bNP2TNi@HX&wMs0ql$WVO^ zC`aviH#f6;5v?a=82OiYxVVH|-WeINaLdNe=6MN0r_Ps}pGgq9!b8Q?B^r#XAAC^bY-`QP`kP#NikFUHJx6g!?=ru6%e8kMjH%n|3Sw#JOYSJ%&AKZxq;_<3kVb>rTmI?u zlo8fU!J^qQoi%J2Z}Z*+HJ>dLn^aEixTj{Unw!E%oC%*vve;29aXt2=DfH;}%A}yU zpbTBJV^&Ej|Csu|XO;5|wCk9cQAnW!b+C5feYKHNQvdsY#U zN~1ipJQFXA;o2RZj!r$6%xY2@DQZ-(?NbuUF-QZVA+2$>H{_b!wPeTbj;x-oR43|* zas0UC`1YOyR|-iLNH-)6>6gKq5s8#0J=EBQ%NjN&IG~;6xQbiw!uv0M#M$IYIW^~t z+Ed76Qd-;THt+VnN7<>01uEK*i_(xN=Y4x@<*zm#%)8k_6{NH+s9v`^o!Ze3Nnu?W zd9N-O z)jX4PGm2^t+^}PLS{>AM_bqWQ?7L8tS(6q}7I1c9gJRXW$WFN|{;Y#_G9IUCRZ|9U z z%9zVeBd1VnK3;?*uO1)fApT+RfcD_cf%!m`J}T8U{w0J}Ra?KrKL?$YZl6y(nmTzX zpf$p4h*J4HuXQ-GAVqbs>N)e(zWclSiu;b7G9vTA_sOJPf7;jCCtqsk+FV_EQ=(tt z*3y%{ZuHBAn8{w|U(^GCOy`*_Z;Rjt)> zr$^zA!hGAVESt=w&dJU>C>r|7y|Wfvrc{P2+dxCoa%sEfaSYkZ^P{RDJ56P>^VyY+h3EEMu9uz#hnmyV!lN8)YeN25x zjU4|v9yOlt>(@8oifaEdq(j~-TY{|P!$0l9H`|-v#_6U~b6k^`)HJm|nbxq;uzEvt z7$vlmR2DjQ%h$oz)i-n&KZkxFf1TxapjpXH`BoDp^6TjckuCE2Xr;HN{TCX>3y&qQ zRIMDibYCY>T78?JmdxOAWkG>`Ucw>Ws^t{dUvIq zA#dY^3Wi37nrj}{tS{Cs4sdQPw=He*7;%5*T;fvS7!al$I@lf7x_X_nkMn>tEy@sk zeeFxpv`_buBHb8Fdhm=T(S*j@rtnX&nQCMA_SyqNREQ6tyAUo@> z)y)#pw7>ZmMBV3WgO-w(3pO9OJx+lQco=XVe0bbe5?7M-LaUrJe{lZRH_~UP^9%>ZMUc36~iPfzJnn!)(@WMOB*i2U9SmM(?6MLKjou-;@rv=l8 z)*cFs3E;#El$`Y(kM+*nnCkM+Pt7lEb#MKuEMVAV*eQ2n!RjGwdZ$o!LJr=#*cxq@ zVUu++AgAdw`~9<6%6ONQx6p}{wd#f1&N<~U*2?u0Xs>|bjo%&=4qACWZq}PW^0Fkm zHoVrn-02XkL%K2X1Zxp8;y+kF6PUc&b-Hp|({LwyZCn6irci0N5Bu#k;UwY^4T^1o53I|NgsS*w+-BeVM6wyT7)pkP9e5< zVu&vhLjoHbhzRKgVYv+cWHtd5ufx;m~I2-}e!9a;{BwX7IsRcs9kti4(34>!Ga5NT)#v-&qKYw7ZJrGEbN%F=z znwtHz$KC0Jeb{UU76uCp41@-vpmZh$hQMGj>oiCtgo}W%f@y3*5QN6s{)6NvjVYN$ zWKtPyDxC&erzLpNIc$9}*X19v_%nWU(^x+f#!Ve8h`@j$pz!tBz5_|b-#7+`>G$0O z5)nrBBm0wSY!(-b_>E=w(AjjB5B-0k{{8r03~+O7WAod_Kl3y#*tOb?DJ@??>;-5X@L_Ye5=%>(+3i@7TSORgq zdGx`=^{OG0z(2**|2R26Xajx7T+;ueWPZR{bZ>Sbfk`%^a1;4oRV(a|81-Q5v*6FT z^*R%Y z5db7?e00MIpUASGZx^prw85kH?(j9#r85lP9bN@+X1@ct_d_r8E936Xmdg|-z z8yg!t+uB-MTDm(sLqkKG8XGGrDr#zKnwy(%c^4M})pHhjL>4nJ@ErzW#^d=bQWzK* zqdZ+4Lp+Ypy<+HnI6&aQM{dW8dY`G!ZcoeJ+j7oy;=5z-9$or4p=ICR z*^B31@-6s$`sboMkIKyd8Oglgt6a}9iD~lozGS%4R{|rywYx|a4=WJLZv-ex))LZ;7f*;!_y#02VbM1x0qIKm_ zYhwhSvS+u-$!)ybQW|WrE2`!12M?uY`G~6~*?$lGxZOWR$}cng*IX<2#p|D@-|*%= zIn&5zi^!ymbl9{K?MGFAGh-zVOP1-5<3zjjA@jm~Py=ge@fa|L^myY`N?= z7QAJU-XfdOyp1{MLRkavExrwow;8wXZ(4`UH_Na-fKdFS*v;OjHunF%7mN1;L!ZIZ L)z4*}Q$iB}-R9bb diff --git a/Resources/Textures/Tiles/steel_diagonal_mini.png b/Resources/Textures/Tiles/steel_diagonal_mini.png index 0b56a7794d26461a53bacb878a01baef45bd4cba..51cbdf8b04091c8bdb5cf013ef75bca96881c778 100644 GIT binary patch literal 4272 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 WN(ItROKY#qaZ8-7X~llei2nhjo%S#Q delta 273 zcmdm>xQ1zhNGZx^prw85kH?(j9#r85lP9bN@+X1@aXGd_r8E932}Q8!IX* z>g(%UT3R~W+Io9>YHDhl8XN0tY8vb6rsSEa02OlfQPuM0Z+gYFzqP~6+E<52Ih_$upNhXbrTc&2B!y?NkMy*hu@ z$~wL$6_-rz^opjMc9y+9)7ASTclw*NUBwf>eLSnHJ@53z4U7D@{qNit5x8shi*FMm zC$?RDQXF{gC*%EwZVzTXCEgt!CJ%l!t6gG(FqJMfM1NoK&hc*ZF81!le;E&ZrhoWc UrF5Brfs28`)78&qol`;+0P;b3tpET3 diff --git a/Resources/Textures/Tiles/steel_dirty.png b/Resources/Textures/Tiles/steel_dirty.png index 660fdf886855c3693337de483da74ab3942fb937..fda6fabe1fcca264263776498355ff044ae3e411 100644 GIT binary patch delta 958 zcmV;v13~=h3DXCVBYy#0P)t-sUtC&XTv=sdUT0%qVqRNiVP9%zWoTq!WME!$Z*FvP za6mysW@2DxV_|7!V{B+WcxQ&3N8XJ%1OO=e?aYiMU;Utd&EO-n~cR8dfAW@T}1ZCzSfRZ&i1 zTv=OKR$^aXZfk2=R#j_fWm{KOS5s1OZERCeO<7e_Qcp}xN=Z~wQc_P&QA|l$R#a9} zP*_z{YG!0uRDV)pU|wr!Xkc7gVP9QnWn@=VQC(VCU|m~XSyyFZVP0EVVP0HgUtDi& zYHw?4c5`xicXxGiaaUDUZ)|K{T3J(2P*qb?Tv%6aX=qneQd?J6R#Q-HYH4F%T~tv~ zXk}tmQcssK?uGyW0y0TNK~y-6g;M!<(m)W-f(I}Ht$(!)o1i9y6l@Fi2(Gqhso|Ub32FI|pCuUw7A3DQ!7Nu*jdMiI0lUe$Mt|C^+labBfV`=jSg=eqaY-)%D+L~%I|N7(PDiv* z+VTpls()D4(6BH;>V z9=?3#brL<{neFzDfOJ5n=G)y~1C-sp{{CPv>{nmEIXD~&U~h}>`1`?t^U9)o3QhE@>_by-)HghF-|RyY&F@o23780w-w=MtZ8!~r!ey9h z;D=r(e+H2~pW*Dx5J8nqyV=yrPx#1ZP1_K>z@;j|==^1poj6n@~(tMR|90 zdU$nvd3QlTKwMEwhJ=BIf`EmCfQN*FhJ%5Jg@cTXib6p_fO~j|goJ~Ff`EU2etmp@ zetv;~fP;gBh=qlLfPaR9fr*HQf_{5|fPj8|eSUs^eSLj?et&&@dwG9;e2IsJiin7R ze}8^_dWVFBhJ%8LhJ=NIe|>y{w5Xbj!gN$PDuwBXJIOqsU zEJ@EoLVu$JYV!wF=9Oh>XsKi=)@i9lKP>CdZuaC!-}mmlo1M?j%+3r#%70SvDI5q& zoeuPz2?j!E&mkpD2+=g%SELt*&TE=R2&JsAFB-Z4KtBsJO1V@oLO2jJ;)cPw$rH&W zy(j@I9A=DZl+u(0^!TMT++Z1&Nk%UNK>96+u0;GkH2F z0h3ztMkbTZau&i!xoTN51&B)E+EAP^%gO=4IKA!zP^Isu2^nG7pkQQjxtwJTj@W3F zK)jCpA_0)ZjkIO)nZJND5IaRVzaRN#%Ocywx zahw_e2vw``l%~}mJbX0!7>abzoa@$}B%aPcdtRGgD7~muDlZoogTbYxS0#vm8yGKR zY%k>u2fY zG=RkQzo*NEkA|7q{jeZun@4f5F=uu1@}wqq=YWeQ5>O$yW8>~)CDvEWGyNnwE(7J~4qvhB8Ihh&7vNs-V=nb9!j z=Ed5#@7@jw+WBM4I}iXQqtTyzx=$WEjHv^z_$9>ecDud5+iLB#4yyn(#SsitQP+hd zgvkFX3(*AQXkAqm=Li58`>||n+cy5&u{y%|9|YE#v+lgMrvLx|07*qoM6N<$f<-qd ALI3~& diff --git a/Resources/Textures/Tiles/steel_herringbone.png b/Resources/Textures/Tiles/steel_herringbone.png index 2f676827d7a5c763be93b536c45190267bf9b5dd..19ae3bb8717ae64cc023f8305aef5c4a284702a5 100644 GIT binary patch literal 4380 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 delta 653 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 xV5Q?Sj}$qvj`bGc% delta 522 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 B>(~GQ delta 426 zcmV;b0agB+A;bfaB!2;OQb$4nuFf3k00004XF*Lt006O%3;baP0000aP)t-siH3%O zfq_CnL5+-ze}8|3goKNUiGzcKhK7b!RaJO+czk?(<_0rD00009a7bBm000id000id z0mpBsWB>pGDM>^@R4C7NlCe(2Fc3snLUCJ$Mf>3}Wjlb+^YyEF+RwSE*t2cfj9}XPiOw1OG2n Uu%nX%0000007*qoM6N<$f?8Cw`~Uy| diff --git a/Resources/Textures/Tiles/steel_pavement.png b/Resources/Textures/Tiles/steel_pavement.png index 5b561e9ae651719cf9b1b9b9dcf33c372a7ed2a7..200471ea9957e3eca3ccb8e6f823abdfc5b210dc 100644 GIT binary patch literal 4232 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 E07lJ3#sB~S diff --git a/Resources/Textures/Tiles/steel_pavement_vertical.png b/Resources/Textures/Tiles/steel_pavement_vertical.png index 1c38de21e7a77d70b05507e3abedbe1aa2a38695..950a2c0e5f15c78d3efa5804844986afb6e0e393 100644 GIT binary patch literal 4721 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 YVDt@9uWm9yG}nk7s4g~T>-_ip3x8;KuK)l5 delta 744 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 delta 444 zcmcbhc#V02NGZx^prw85kH?(j9#r85lP9bN@+X1@ff>d_r6ca&td^`0)7g zA{D6KzH#ien4-oo{%awau+vf2v$>s`K~R*P4PU zpVmHZbj|MQU&VdaX4#89=L;`MZTND#S=#N8%}0kTQU-pZ#_=6~N1y)X-O6_4{XZ|| zr2(I=Us`z0CgG*5eZ7Lt_pdE0zEri|pW7C^a@LQC{uQ5o2|bT^Jj3gr+^f`DPc3GC zo*9MD8g)NO%VJCQ;3Y>;Lb(l<>AeVvVdo^H%1h4P_2I*Z4XP-eNS2uvU0xs(r&sfi0W; h2sR~+_P_ryYrJ3;U-@6>DKMNFJYD@<);T3K0RXfH(P{ty diff --git a/Resources/Textures/Tiles/white_diagonal_mini.png b/Resources/Textures/Tiles/white_diagonal_mini.png index 736733753a640ab741a1ba722263211473525dc4..e4e32c65cd99de69b64bfde468000df1fbbbd260 100644 GIT binary patch literal 4272 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 VsX*FkX>I--x5V3;R_yaQ^*?+^^;7@= delta 253 zcmdm>IFo6DNGZx^prw85kH?(j9#r85lP9bN@+X1@c7$d_r6ca&sR)ethT7 zod*vdJbn7~{oA)6KYZX@V?GtAfV03OvY3H^?=T269?xHq0u=1^ba4#vIR5sEBiA7V zf!2rSESuzfU&rk^pmA{THrs|R>>Mxto=<4M_u#DA>N5S+jR(#*-;tX&t$*X9x$hTk zO$m!}c^Noz|IXjHCZkkH_xhQxEjemm*RJ`^xQ|hMB3q1$ zRDodTfv?QYOIRUH*CmYG-#gxK-p5|c&u9Ldxofu8g!($g>p+(=c)I$ztaD0e0ssrO BZ;b!| diff --git a/Resources/Textures/Tiles/white_herringbone.png b/Resources/Textures/Tiles/white_herringbone.png index fef9466a174f1c32aa8b57c8cad04f227b5b2132..80d006810bf1f26586f809a4dc505dbac6e142e0 100644 GIT binary patch literal 4275 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 delta 616 zcmV-u0+;=>A%O*uB!2;OQb$4nuFf3k00004XF*Lt006O%3;baP0000RP)t-s@$m3) zZEfi2=lbu;N#=tm6esxXWZ)m000SaNLh0L01m6W7%Rp3$ z`37T!iW77=$?sGiUJlCEM zk}w18woGFe3a;4hay&OsWGxqr2i8`F0{kubf?ICzn3o$6pYX;B|A%c|) zXZYI?$IeJW`@Q%OEDbXJ?LY8=mUOE16}NZze>^znj(_|((U^Un;tNkZ$HUy2(6kmKP5aGY1I{RuN`Jq6$Ei)nR^=LYIHuUez!MZsFT;Crt#H+am$qft1|M?sr8pI*-BL%_tf?bC94gRFsPL^I% z>@qy~$zi5GFU8z|?tG3bt`qGa@!)rS>hp->9?0?BfbM*bD~@{rGdzSH|IgJOsy|XQgTVE)Cbooqi)wr^cYq#G#^J>q{EuG$Jlcnw5o0`Qo~*%a`17nOdLs{d~K7a>vAtZN9G6 zyN`c1Ze`JE(^ztSNB;S1ugm65Gk>|aaruHnW0c%K=dUQ~d$(m)c2k9&TIY0s|LKf9 zC(mCkI#Q5(YTebteZ#iwb1uI7;M|ohrw8&DKDbpdaP7OCiWdu_J&O+NcMBbRg7c0< z^9EjermyDP{n^^v$4YahPB5!@eDF*^=#}AtODj(8QB32T#jkun)}E~@e(z%8PgA?5 z-kKU+vuW*)?GH~o!%_A4hk0Jph05-S_KelBRiziAM>j4yv~=w1yq2eT-QEYgZe-v5 z{b244V(0tE&Y^`{m$lrZYOnX^Q2VE>Io!H8?Enij${Y?_BDq zKOcGjehYJFQ}@bYXhXw^uIIkFf^TAse|Dgxy}iAsr>ClVUa)&uY0~ z+NNbqB#05~r9h2dl(%~ zX>6oX(G{&x`5Wr==SLji8vA@{ACHYC98SB?^pa&bjZ{@0i`D{75kyxbO^K=kDp`iZ zoMdDZ;oK_Xbwv#*N@(!L{DUC_)@rtceB+Lw4ZnxYEK_I$5KU(+4si+q`ST@NRASnc zAzaAA>&QjoLskkhl!XaEE5{acHf9>Ma1bV;K1G!3n}$MJieUrL!C7pa&GHBox0T52 z{J(-lfvZ>4Fpp~?h4}_VN8|<)q$|w1m5`!h$3}ER?O4uIYUU!f>at=`7nMRfCCQ0U zeLl`BYdS9r$m?;DxMpTa5^+X2D9E#vmA8tN-EOr|Ji_f)?{E|{jKwD4HF(~m2vMUm z2G5KC@qDE!;Th#aPt22;Bx9_ciO%B6B@N$sQ`(%GkGW{+5L3z+l0c%tI9@OY$3+T8 z#~_hRnWZN#PLej(h%o6tv`Z4EDfN1cS5Z*|F695}RC-8`PTJ6cp?N#$$CW6F8=@Zx zj-(Zf6W-x-gVJd1((;OAtf?v%&%Fjq)kwv9lxiXyq4USg=Ww`7i|ySTRXFZ>*hr~m)} delta 289 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 delta 413 zcmV;O0b>60Ah!dMB!2;OQb$4nuFf3k00004XF*Lt006O%3;baP0000UP)t-s?ds~~ z<>hc~ZSnB%VGd z00AONL_t(2&vlY9Z-g)mg)LPuClN;6SUND1UiVVvhHmL#=6{>=Tj*Gcq4~FcPPpoZ z)(hgpFL}>~h^#wbB2i**u6PvzV2RXdpgxU}$AJ)-3J>IANYaY|nZDQJ?tuGRrC=VVp{isvN$(F_U3UqVxMduKG zU&12XY}8;pR;gf3Af~QTcYA)tB8hdC8b*Hy{0(Wr85Tr8N&ZiT`0^vp00000NkvXX Hu0mjfT(7+; diff --git a/Resources/Textures/Tiles/white_pavement.png b/Resources/Textures/Tiles/white_pavement.png index 78fcf0195d2e8fa3a3cc5a124411eb801905ba58..69da122ba61935448084ac323c319410dcdc672b 100644 GIT binary patch literal 4273 zcmbtX2{e>_+rKRlm94UdF-64e3^Q30W691Wgp8RnCd^DTV=t71qAXdngha^JLm@mW zNy(O^R6=@83E>e@eYdvLd(QKH-+AA6&iT)M|F8RZ{jTMIUDvtqczav(O``Im003;V zv@mr9uTkKF2nvAz>Kg;3!HXcx*v1$DYR(>AaY$WzNVaga0f1O>07wAWXHe<*9soEN z3IMz_0H8ks0CHU%{g_|?5Jk{UOzbU9Od$4brVrhp3IG-zx#__~;uGoEp61}Nf`>?c z$5Stx{sj8NQ#}c!OgS%g0WpkrjY=WEB*8QrYGHpTs?UChvuTaQ7GkyVj`iv&Sprdu zX*PJKvf}2)xw)0`3g-K39~)MtntR-2fRqwMMuw0TU()@}v(frFJjrAS?i3Kkr{oo- z0a!bmH6E%CUoX-5;9*Rj3Y-6sAm415%T0dPqh3sut?<|UORl`5$0suZ$qUzTa$1ry zaeAs&N$~of)0y%aT0XL>J}v6Tk`Ll>q~uM8D_XThnNP3i*T=QvO0GFQ^`74Pq25}> z{7zg|+y+cTj+W$zRE^nbWSZuf?${7f3?l$+vGkW=xx_=UlBjrPsn^i43E-85$e|<8 z4`{ujY`BxbwzTRQx70wBxcc?X`>NG`dBCeH{_wT=Gq6h0 zsBRc=@5PGuBRwGMQYlmMNo%9HjXolt-?%Zc=7_U%x@5*}w3N((_-DJ=)`F@Q+783% zb922OxDVE((^2qB1x=W$&Ak%ZC5-E~#?k!PC1v3+fl5NgIU!>Cw>J|`#$Qf&U?ov^ zq2rC{4Z1!)<70mIlKAZ}m)aYoDTAt4c= zqq|biaK6syex|h*kEupqn8kIgs-NtZn#0I^ywf9fk&n-Ue^-+5{XL44fQgq-MHGxB z$oNxXDOy58#92VvLhwqIcplmIp{i&OI-)dwdJnH4Vn*MZ0?nu z6y!=bN_ZS+?7d!uC}bAx?5#q{ZroIqSaU1H8;Y{btjm<@GPG8Bv&}~Wb2jU?cg>v3 zu?odO%uHGM;Un|Q{#@;?>Za@#hIsvX%7qH$C0 zrO?bd+Bj#nc**Rj?iYLnf9swkHQ&us>s3zfxTUsNwIGd^JR3EeVzHx4@@o8XQ}~hX zH7OwpAz6B6N3Bv+c**V-eLGa>!aNDyHXfX(nq@r*-JMc&kAF^#jalYjmRwF0B;2yN zWpx5pV_axfXyR=#*096V(W&2(T}P>;#Jm>ie3yc84AFpT$Y@+12)iPGCDn1eBd320 z-H9H_Bl4tp+xrh(Dxp-P-OvoQe-?jMG+KsoS7SXPcWf`o0qZ0WDsCoj+<)OM!KP5! zskKPVo<^loGCEIn`aBrCmzSwJ+OzSAxvIMptFM0G^tt36-w#S)3qq~hvBqlLG+9N#()7grP$tj-~t zOV(??)ezFC+^=6cRHavPsp56P`AT9j*O+dWb$O~Z=aPHnQL|9Dm_qNWTl+N*;L7LD z!>xh~OL{eV%?qyk3H$B#7aVSW8};@?cD-AvTZ`L;XC{Fs@FoVH&F;AM_bYcU89ZN~Q=bu38FXe*K(Y30bhmu2Q0~D-S&vhU z+G)cV3SrfGF`k8xr{jGm$%wQ_5uN30e@nAk+P^Aa(Fo(`Fh#2a(xL$6Xz1~ ziFpcsvgUF#=xNLsUvE;1cfT)tgm`ygSbOA;;e}v~0Vdrw@hOZ`+t9QuG!LJbd9aXi zB>nxNppFyXqqLgGg&kwj#c8S|wU61)_TAn!ST=b0q%lUhUUkLoVfZpc!H8=ar3V5 z$7zp6%blF_&n733?&ic1I!<*c#UJZgpka}JjolnOJnrKPuV}8I`I`sf!n4U88spY? zhubsS?Nosaf#Z@EsiP+Jt+KcaA&U@WCn-bbg zzfXTkkLG>i#qf&!{0FC8F%LeD>QeW}m7^O4iG4l9R(tas1if^6zH92Tnx@t}(|Rrz z(PU(fpoMo+D#NF*`#Jcz`i0LC=dlxsS2=D6T9w?CueZ>mKb<R_Ueb(D|FZ zlB21swW|j%+|~`2QQzvXB|9=!Q(SCcm~=?5_HmHk3+w=Py8ih4H^b%iky_p|9x$v% zrFz7nTe})QCGvFBMvgv{Y$abDsO5gO?XrE@J?bIWB$i>BF_E4)vpD?1!4`qo6P+lm&CarZ~g_Q&7p1{0tVN3Su3x?aq6y*)Jac^9ITGp@}H|q$#{^ovXc|v*a6RoPig@X&%zfwLp ztwc@i=?E-;=b>A{{iqeZpI@~)xDGM957E?V71%zc(|A47KBAFnU+NYcy62T6IICA9vED&r>%O*^j97WzZ`EHo z{Ioo;A*#W=%IOfIOQtzFlCuOG4;X2h4Nl$QI#V;FX*3xz`DJqcLtDv!UH+GK0-5ux zOtt6WYb79JZ%riR=H^ycS35ZF_p3Z|X-&woaOD7i*qyb-m!>JE008R}=tLK;i;Xp& z%nX2&C`@lEJS2bxqQRF@qYxH}>__E7ys0!g!vH$d)Cz^rDF)C3IyOifmI>9DZV|?& zI)&L1$zgtE90h7*xJgt$1P?LulNF)lPi-VJqXr#6`S_^_kqA>_08iB;YkXSq#i$`fge*B=IJqSdf zP4U4ynwtHv2ks1@zFaN~k3a+m2g8Fga3-6EK;dw>H5xP;1|ndbPzIM20%LHte<%4t zV@lo0{&SXH=Xi478K&}B4boqNM0jyu#49<^)fvH1;kXQ&59Jv8;oGk|g&&G$kq2_{$+4vU4M;izx!+SuSN85}N& zL8e-o8bHCk!Rd4gUYAVvL6Nm}VBX$n5)4bxM!`r(u>8ondN`aml}z#>>-^L=Ws(Ee zs^h0V<=@n|W7EMtCHeoyJm0!$t+n*ORTtiZ&H>Lo^q2TYk2q0}{3iM#^ru6<6&apH zUTYo$D0!`Fs1)cAG5tSI&Ue~iUn)rYf0WF37>DV@4JNUv#xyXI|5ddjev45bu{H~S zk6Rz{PbvD2`)!7N-=I>=sI z1O-&sbRj+=q!%qMY<^^qzmsWnrQP41^D;v Z1MWr}7PNIKm9GtQOMlqz;NaZc-0$t}Yto7P00009a7bBm000id000id0mpBsWB>pH4@pEp zR7l6Al)-M>FbsxC%_H;# zCGXpM4=w`qc(^TL9M9C?7Qz^w@%TH0g%VC8?j`TrdQXqTxyL8UhoLlB!azG7!!6Jr z-btheCGXpMX@3ASHCU*_i<}_v4&y-I-n^4oP7w42AM1T~8QhEqe!eu&AswUZ00!?Q z)*;%|tu8~n;xU)yVfWyIk-D#Jf4$wSAxDRwS(7HlttRGGn-^FEGjCX9$BbJ|Xib|J zSOYU}SR;I+iFwuL1=e(e6E>{rfv=j7Rc&5i4a~e@jep(poqnm>yug||4cM?o8dYvJ zt*WaRSU>CoX`WNoUGLR!5yt7F>}O$|F6s@dYaS=L7m`MVNf@U|+0Vi_UDO*^*E~k? zLehv3g>j0?eip{*qT1@3$1Gk***p@3af-@*7RJ;-wAD3_S-g<4d1MmCX;SvHFfJ!x zZFS9K7Je@zjrfIv4C`8lXj9ibX7NJOh>!aKKD^)m6|aAwzTYL1w)?^KR-OLFYkj{< zByIPD>CJk_7lbnA$lC4)(_8iR2gG>&fq39kgMZYa<4($$BWt@KOmEfKVG&~)$~tA! foAt+Bu-m-@+^I{sd~BsA00000NkvXXu0mjfACW## diff --git a/Resources/Textures/Tiles/white_pavement_vertical.png b/Resources/Textures/Tiles/white_pavement_vertical.png index 5126f699db5c8dc2a77c7444d4b2cbe1ee4be394..20d887903c52836d94de5a4ab641f5e92ed3e4b6 100644 GIT binary patch literal 4664 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 diff --git a/Resources/Textures/Tiles/white_plastic.png b/Resources/Textures/Tiles/white_plastic.png index 99d6c60e88117204e5546b5d46540a917a31a6c8..b31ea0e8553e981fd3404055219f36a5e6582d77 100644 GIT binary patch literal 4286 zcmbtX2{@E(+kTLUB8o&Y4N7TNW0_&d*s~<2HBf z;gzko?6M~zls#GcA8p6`{r~rW-|>I{9LF=y{oL1ipVxJr_jO;#^F-L&S*(*#lmGx= zot34j19<0y7erhH{2yE7ZvtYgPb_Tfgs=$X}4sr0x4${WcQ4QXOxHEf}WDw zywSJ(wan!_Xk?gi-keaNxW>C)4IN^)bhlz~!C;v#b2g`J7VDAtDIwSpFn7&0y%Clr zMA<7h84joz=)jeC@I)ktkWdl+o>-V<#PlU$pm$;7^C)QjBD|`%p1ubF7;UT0_USF2 zwBJ-SAOWbY1?~tc+6h4FdH~IqLyH1v31Bpp8z&5?1HchwrA^X&FCjpmdUc-&;QvN# zP8cZCaNH%l=Qglsd(FlO;4dk_>H6)B0wC8F(5Sf*&JoIu2VAeF)I|fXp8$U1PI-#R zdIiAs)_O@tA@NzD{IZ4FXFyy_NaK8TPQaUk&f6Ls0pN2!MezP=G*OhX?Loy>=cA7T zlJ#^=?%KDVS#xGs_>uSrDz#?Sn@S)`O9bGX`|6M~orTa&5l_$^C_8!wfCW&(dO+ok?RAE*s6 zj4sW;%- z9I|?raKyf(X7%WGI3#z7uRbaa4DfnRWxig&8bGZ+9mSIdkn{21wt8*`lH0Ft+yd}7 z$%IK>n@o7AAO!HmG4`T5o~I2JPK&njRg3xh0ih~&XYIpJ={W%e%P^bECh*;12kcj= z=gJfjTjzfSN^DJ5aP8PDQI8s6LjeJgV5sM*t= zq3m_GBgMH%X&vGAU-O<4kHzaPBww%dR6l%LnGpZFU`TFSzC&PW@h7r;NI^`i!UqYj zdO^qw*u6Q5T$|^1S2+8bVxG?34JDy7ZmMm^g(J$Ly{nW?>2JG?ybe*@4c)yXS~g2u zOuYV#)bn)&6;kx)xN5Z#*?SQTQ$titETK+aUPd$AuYz1LRdJ+3s9#AoqGDTIl(S`M zs-A-)ZB1tMgQzA`oXNBEyuIcCJx<`r7o~ucWVLK`KjllhdTiUX-lD-m2AAAyu2J@Ku`I zqi9vrZdF=xb?fSa2C;+WL4CQH$a@klW~upvw8LqK-aoF9Jdl-@ne}i)xcNl0MDy*e zg9j{{GQ8Zq475W#*o9t&@4R?TRZWLRq()Lk;zrU&#F`PA(zMIkb(lqrsbZMo0;YjB zU4V>13I3GL|D(X`(1$}JKC*8U>OIo)tlN6>O4@JVP`sgqxvf2g$=2TIHOod`+4xtYVyNxwVNgt#|D;cVrW@y|S}gG71X{D}vJfUSaw% zt+Y2Z?Z)voq)#cG?W5@P)dySjtVpy7R)iR}8SNj_Y4__0F5>0C%FQV}*_+&le4A39 zQs1X*p=psqE__!%TsOSjc+iHKxXeB~vv%VAQLS-YUIHPZ1y`sa%=Y(<(bvUEm&6vU zJsxE}dO_v9C{F7X+&4X_(kgdKt}(D&|Agkt+Rn zg89{7$QQPkQyw<-mOoRU8-|FTx#%-EA#QU zSg)#q&e%0%m3tu9pcuAlUEJ1u>_Fd^M(i6bEM0D+pp$( zZ(`uf(3i(w@&ZGqiW-zGS$j417UO$Pgmf=jOLFBYyY(K~`=z+{y*71ov*~|Uap{!3 z@del25jP*G(uma?7#j>X1x6HwpRH8xXHU51Td)Hs?ISH}2BZ6kubLv8WY+9+P!Eig zk1f(4qX&6@U7n6OAAA0e&0cr6LEp@?n4=w6(r#Y6-mF>>Blj|B(<4~NV^5;8T28Hb z{s)hTyV@k;Zdub(oNtfT#$9tvoPz7(<~);vk}x^mdCmPZ0#g^zx`Ilq{ZF>3wsUyQ^6o*!f*X;+slnKV zq!#m5|B%|Hq9=Cg_fy9kLxz{TMP$TqBS%L*N{=Y-_THluz3#<1S*fE74Ra+e=J8c! zwh4ExzF;{8ercbJ=;<+(<)$ua%z3_(zGF11SB3kd^E?K@P^Meahv^r*$FPPA0mtKy zzs*yjpX@yO{IltdRecmS-7{TcpKU^e5#Hb2-+jQRrhR!fY)rbLGO46pru%iU;m~5G zok{mkJbuj-N< zTk$zJ%leMLdv3d2ulaDWbL0_zZnjH*4KL_ZNW;>En5K%XioB7-apHv2 zoNxWB7$e;o++5P=)Y!)$+4%wEr@7zejq<-u_$GheIYp~Xe&)J#`Q2X;q;GxRuLki- z0r2C7h7Qw$uL%8PPNiS^4(7O&n3FBUj@7u>E&lO!??Ur(tJblHm%=XKL!##07wHrF zV?42LP7g06d>*Nnv~XoHZ!+qAdeJN6n<{n`JDbG~BC%78=PUivR^B`moD z+^8Nj1|IsUdJH z5Hu34g+QVaNGuGggG1}!P#DP19~5-QrnuuAOwE5f1E26vPcD~*Lm+rO9-OBIXRt2xHKjMvcgDmWBPINP%zXVInY_ZX&IcK zI)REI0!SNl3<$>cIQp3MJ+`nUNX z9Dv%|+Wz+OPh+9ef4kst&HTYMehTtW(HvqRi;8fda+rQ>GS$o<3{!O_8y3!lO(k)e zY$B8C^J}NErKO{5kMiTnYzWm0JFfq#dhVJI{aiN$GQaN0Wm00qm5 zLgJGCEto>axii^x5~u}@PV%54SPTy+`+9;APQX2`=MPVs0EjF$$l%<@oPQh|G0i1n+6_FlFxt4vvO!x$_i&mX}9vA)b3CU%PE}>V{{l_PlfqDj4LU#D2=S{?I@ zc8R;?5*O|5H+V^{J=dsPy{v!Ax^7&=!r+C=j>H`)a!#Rg#nLCJrP7_qX$^mV;Zd=b Po^54jXL_IDdg{LbbSN-a delta 501 zcmVlpYZEcm6mGSWK?dt02=;-6)1cjLpm-jE z1`!AmpnpC>92vo1h`@2=Tkya37H*G_J60m(&XfqbV Date: Mon, 3 Jun 2024 19:24:17 +0000 Subject: [PATCH 056/155] Automatic Changelog Update (#417) --- Resources/Changelog/Changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 000caf90200..743c0add322 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4136,3 +4136,9 @@ Entries: message: Fixed the coat handhole id: 6117 time: '2024-06-02T00:36:59.0000000+00:00' +- author: FoxxoTrystan + changes: + - type: Tweak + message: Floors Looks Updated/Resprited. + id: 6118 + time: '2024-06-03T19:23:51.0000000+00:00' From 82edb60ac6f872c4605010f5198dd71fa6ab3ec9 Mon Sep 17 00:00:00 2001 From: FoxxoTrystan <45297731+FoxxoTrystan@users.noreply.github.com> Date: Mon, 10 Jun 2024 22:48:48 +0200 Subject: [PATCH 057/155] Languages (#43) Resolves https://github.com/Simple-Station/Einstein-Engines/issues/37 # Description This PR adds languages. Every entity who can speak now speaks a specific language (or Universal, for entities that are not supposed to speak, which is understood by everyone). Other entities who do not understand this language will see gibberish (it's possible to learn how certain induvidual words are spelled. But the spelling changes between rounds). This means that certain creatures, like xenos, cats, vulps, can communicate within their species in their own languages. Similarly, it means that xenos, cats and other things cannot understand GalacticCommon speakers without a translator or cognization. An entity may be able to speak multiple languages, or understand a language but be unable to speak it. Thi PR was orignally made for Frontier but is now being ported and will be maintain here. Orignal PR: https://github.com/new-frontiers-14/frontier-station-14/pull/671 This PR was made orignally by Mnemotechnician and FoxxoTrystan. --- # TODO - [x] Language System. (Check Frontier PR for all the compleated todo list) - [x] Port PR from Frontier. - [x] QOL Changes. - [x] Missing Default Languages. (Missing default langauges for some roundstart species) - [x] Animals Languages. ---

Media

![image](https://github.com/Simple-Station/Einstein-Engines/assets/45297731/fc43efd9-612e-4a6d-8ed6-90a26d315c6f) ![image](https://github.com/Simple-Station/Einstein-Engines/assets/45297731/b86616a3-d5fb-408d-865e-90d09096b6d7) ![image](https://github.com/Simple-Station/Einstein-Engines/assets/45297731/ab1e8581-522d-4e7e-95e8-f62575bc5039)

--- # Changelog :cl: FoxxoTrystan / Mnemotechnician - add: All species can now bring their own cultures and languages --------- Signed-off-by: Mnemotechnican <69920617+Mnemotechnician@users.noreply.github.com> Signed-off-by: FoxxoTrystan <45297731+FoxxoTrystan@users.noreply.github.com> Co-authored-by: fox Co-authored-by: Mnemotechnican <69920617+Mnemotechnician@users.noreply.github.com> Co-authored-by: Pspritechologist <81725545+Pspritechologist@users.noreply.github.com> Co-authored-by: Lincoln McQueen Co-authored-by: Arkyfloof Co-authored-by: reese1243 Co-authored-by: VMSolidus Co-authored-by: Eagle-0 <114363363+Eagle-0@users.noreply.github.com> Co-authored-by: BlitzDev <145472107+Reese1243@users.noreply.github.com> Co-authored-by: Arkyfloof <161242062+Arkyfloof@users.noreply.github.com> Co-authored-by: Danger Revolution! <142105406+DangerRevolution@users.noreply.github.com> Co-authored-by: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com> --- Content.Client/Input/ContentContexts.cs | 1 + .../Language/LanguageMenuWindow.xaml | 18 + .../Language/LanguageMenuWindow.xaml.cs | 134 +++++ .../Language/Systems/LanguageSystem.cs | 76 +++ .../Systems/TranslatorImplanterSystem.cs | 8 + .../Options/UI/Tabs/KeyRebindTab.xaml.cs | 1 + .../Systems/Chat/Controls/ChatInputBox.cs | 1 + .../Language/LanguageMenuUIController.cs | 89 ++++ .../MenuBar/GameTopMenuBarUIController.cs | 4 + .../MenuBar/Widgets/GameTopMenuBar.xaml | 10 + Content.Server/Chat/Systems/ChatSystem.cs | 153 ++++-- .../Chemistry/ReagentEffects/MakeSentient.cs | 20 +- .../Language/Commands/ListLanguagesCommand.cs | 39 ++ .../Language/Commands/SayLanguageCommand.cs | 53 ++ .../Commands/SelectLanguageCommand.cs | 48 ++ .../Language/DetermineEntityLanguagesEvent.cs | 29 ++ .../Language/LanguageSystem.Networking.cs | 59 +++ Content.Server/Language/LanguageSystem.cs | 289 ++++++++++ .../Language/TranslatorImplanterSystem.cs | 72 +++ Content.Server/Language/TranslatorSystem.cs | 225 ++++++++ .../Mind/Commands/MakeSentientCommand.cs | 10 + .../Radio/EntitySystems/HeadsetSystem.cs | 16 +- .../Radio/EntitySystems/RadioDeviceSystem.cs | 5 +- .../Radio/EntitySystems/RadioSystem.cs | 66 ++- Content.Server/Radio/RadioEvent.cs | 14 +- .../Speech/EntitySystems/ListeningSystem.cs | 7 +- Content.Shared/Input/ContentKeyFunctions.cs | 1 + .../Components/LanguageSpeakerComponent.cs | 29 ++ .../TranslatorImplanterComponent.cs | 35 ++ .../Translators/BaseTranslatorComponent.cs | 47 ++ .../HandheldTranslatorComponent.cs | 15 + .../Translators/HoldsTranslatorComponent.cs | 11 + .../ImplantedTranslatorComponent.cs | 9 + .../IntrinsicTranslatorComponent.cs | 10 + .../UniversalLanguageSpeakerComponent.cs | 11 + .../Language/Events/LanguagesSetMessage.cs | 13 + .../Language/Events/LanguagesUpdateEvent.cs | 8 + .../Events/LanguagesUpdatedMessage.cs | 15 + .../Events/RequestLanguagesMessage.cs | 10 + Content.Shared/Language/LanguagePrototype.cs | 37 ++ .../Language/Systems/SharedLanguageSystem.cs | 39 ++ .../SharedTranslatorImplanterSystem.cs | 36 ++ .../Systems/SharedTranslatorSystem.cs | 34 ++ Resources/Locale/en-US/language/commands.ftl | 8 + .../Locale/en-US/language/language-menu.ftl | 4 + Resources/Locale/en-US/language/languages.ftl | 71 +++ .../Locale/en-US/language/technologies.ftl | 2 + .../Locale/en-US/language/translator.ftl | 8 + .../DeltaV/Entities/Mobs/NPCs/animals.yml | 13 +- .../DeltaV/Entities/Mobs/NPCs/familiars.yml | 5 + .../DeltaV/Entities/Mobs/NPCs/nukiemouse.yml | 10 +- .../DeltaV/Entities/Mobs/Species/harpy.yml | 13 +- .../Entities/Mobs/Species/vulpkanin.yml | 7 + .../Mobs/Cyborgs/base_borg_chassis.yml | 7 + .../Prototypes/Entities/Mobs/NPCs/animals.yml | 129 ++++- .../Entities/Mobs/NPCs/argocyte.yml | 7 +- .../Prototypes/Entities/Mobs/NPCs/pets.yml | 65 ++- .../Entities/Mobs/NPCs/regalrat.yml | 13 + .../Entities/Mobs/NPCs/revenant.yml | 1 + .../Prototypes/Entities/Mobs/NPCs/shadows.yml | 11 +- .../Prototypes/Entities/Mobs/NPCs/silicon.yml | 7 + .../Prototypes/Entities/Mobs/NPCs/slimes.yml | 7 +- .../Prototypes/Entities/Mobs/NPCs/space.yml | 23 +- .../Prototypes/Entities/Mobs/NPCs/xeno.yml | 12 + .../Entities/Mobs/Player/observer.yml | 1 + .../Entities/Mobs/Player/replay_observer.yml | 1 + .../Prototypes/Entities/Mobs/Species/base.yml | 9 +- .../Entities/Mobs/Species/diona.yml | 7 + .../Entities/Mobs/Species/dwarf.yml | 7 + .../Entities/Mobs/Species/human.yml | 7 + .../Prototypes/Entities/Mobs/Species/moth.yml | 7 + .../Entities/Mobs/Species/reptilian.yml | 7 + .../Entities/Mobs/Species/slime.yml | 7 + .../Objects/Devices/translator_implants.yml | 132 +++++ .../Entities/Objects/Devices/translators.yml | 205 ++++++++ .../Entities/Structures/Machines/lathe.yml | 18 + .../Structures/Machines/vending_machines.yml | 7 + Resources/Prototypes/Language/languages.yml | 493 ++++++++++++++++++ .../Nyanotrasen/Entities/Mobs/Species/Oni.yml | 7 + .../Entities/Mobs/Species/felinid.yml | 9 + .../Prototypes/Recipes/Lathes/language.yml | 190 +++++++ .../Prototypes/Research/civilianservices.yml | 40 ++ Resources/Textures/Interface/language.png | Bin 0 -> 739 bytes .../Objects/Devices/translator.rsi/icon.png | Bin 0 -> 278 bytes .../Objects/Devices/translator.rsi/meta.json | 17 + .../Devices/translator.rsi/translator.png | Bin 0 -> 202 bytes Resources/keybinds.yml | 3 + 87 files changed, 3270 insertions(+), 134 deletions(-) create mode 100644 Content.Client/Language/LanguageMenuWindow.xaml create mode 100644 Content.Client/Language/LanguageMenuWindow.xaml.cs create mode 100644 Content.Client/Language/Systems/LanguageSystem.cs create mode 100644 Content.Client/Language/Systems/TranslatorImplanterSystem.cs create mode 100644 Content.Client/UserInterface/Systems/Language/LanguageMenuUIController.cs create mode 100644 Content.Server/Language/Commands/ListLanguagesCommand.cs create mode 100644 Content.Server/Language/Commands/SayLanguageCommand.cs create mode 100644 Content.Server/Language/Commands/SelectLanguageCommand.cs create mode 100644 Content.Server/Language/DetermineEntityLanguagesEvent.cs create mode 100644 Content.Server/Language/LanguageSystem.Networking.cs create mode 100644 Content.Server/Language/LanguageSystem.cs create mode 100644 Content.Server/Language/TranslatorImplanterSystem.cs create mode 100644 Content.Server/Language/TranslatorSystem.cs create mode 100644 Content.Shared/Language/Components/LanguageSpeakerComponent.cs create mode 100644 Content.Shared/Language/Components/TranslatorImplanterComponent.cs create mode 100644 Content.Shared/Language/Components/Translators/BaseTranslatorComponent.cs create mode 100644 Content.Shared/Language/Components/Translators/HandheldTranslatorComponent.cs create mode 100644 Content.Shared/Language/Components/Translators/HoldsTranslatorComponent.cs create mode 100644 Content.Shared/Language/Components/Translators/ImplantedTranslatorComponent.cs create mode 100644 Content.Shared/Language/Components/Translators/IntrinsicTranslatorComponent.cs create mode 100644 Content.Shared/Language/Components/UniversalLanguageSpeakerComponent.cs create mode 100644 Content.Shared/Language/Events/LanguagesSetMessage.cs create mode 100644 Content.Shared/Language/Events/LanguagesUpdateEvent.cs create mode 100644 Content.Shared/Language/Events/LanguagesUpdatedMessage.cs create mode 100644 Content.Shared/Language/Events/RequestLanguagesMessage.cs create mode 100644 Content.Shared/Language/LanguagePrototype.cs create mode 100644 Content.Shared/Language/Systems/SharedLanguageSystem.cs create mode 100644 Content.Shared/Language/Systems/SharedTranslatorImplanterSystem.cs create mode 100644 Content.Shared/Language/Systems/SharedTranslatorSystem.cs create mode 100644 Resources/Locale/en-US/language/commands.ftl create mode 100644 Resources/Locale/en-US/language/language-menu.ftl create mode 100644 Resources/Locale/en-US/language/languages.ftl create mode 100644 Resources/Locale/en-US/language/technologies.ftl create mode 100644 Resources/Locale/en-US/language/translator.ftl create mode 100644 Resources/Prototypes/Entities/Objects/Devices/translator_implants.yml create mode 100644 Resources/Prototypes/Entities/Objects/Devices/translators.yml create mode 100644 Resources/Prototypes/Language/languages.yml create mode 100644 Resources/Prototypes/Recipes/Lathes/language.yml create mode 100644 Resources/Textures/Interface/language.png create mode 100644 Resources/Textures/Objects/Devices/translator.rsi/icon.png create mode 100644 Resources/Textures/Objects/Devices/translator.rsi/meta.json create mode 100644 Resources/Textures/Objects/Devices/translator.rsi/translator.png diff --git a/Content.Client/Input/ContentContexts.cs b/Content.Client/Input/ContentContexts.cs index 03f4f3f38b7..fa631938100 100644 --- a/Content.Client/Input/ContentContexts.cs +++ b/Content.Client/Input/ContentContexts.cs @@ -55,6 +55,7 @@ public static void SetupContexts(IInputContextContainer contexts) human.AddFunction(ContentKeyFunctions.UseItemInHand); human.AddFunction(ContentKeyFunctions.AltUseItemInHand); human.AddFunction(ContentKeyFunctions.OpenCharacterMenu); + human.AddFunction(ContentKeyFunctions.OpenLanguageMenu); human.AddFunction(ContentKeyFunctions.ActivateItemInWorld); human.AddFunction(ContentKeyFunctions.ThrowItemInHand); human.AddFunction(ContentKeyFunctions.AltActivateItemInWorld); diff --git a/Content.Client/Language/LanguageMenuWindow.xaml b/Content.Client/Language/LanguageMenuWindow.xaml new file mode 100644 index 00000000000..ff33a6ddf56 --- /dev/null +++ b/Content.Client/Language/LanguageMenuWindow.xaml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + diff --git a/Content.Client/Language/LanguageMenuWindow.xaml.cs b/Content.Client/Language/LanguageMenuWindow.xaml.cs new file mode 100644 index 00000000000..312814aca35 --- /dev/null +++ b/Content.Client/Language/LanguageMenuWindow.xaml.cs @@ -0,0 +1,134 @@ +using Content.Client.Language.Systems; +using Content.Shared.Language; +using Content.Shared.Language.Systems; +using Robust.Client.AutoGenerated; +using Robust.Client.UserInterface.Controls; +using Robust.Client.UserInterface.CustomControls; +using Robust.Client.UserInterface.XAML; +using Robust.Shared.Console; +using Robust.Shared.Utility; +using Serilog; +using static Content.Shared.Language.Systems.SharedLanguageSystem; + +namespace Content.Client.Language; + +[GenerateTypedNameReferences] +public sealed partial class LanguageMenuWindow : DefaultWindow +{ + private readonly LanguageSystem _clientLanguageSystem; + private readonly List _entries = new(); + + + public LanguageMenuWindow() + { + RobustXamlLoader.Load(this); + _clientLanguageSystem = IoCManager.Resolve().GetEntitySystem(); + } + + protected override void Opened() + { + // Refresh the window when it gets opened. + // This actually causes two refreshes: one immediately, and one after the server sends a state message. + UpdateState(_clientLanguageSystem.CurrentLanguage, _clientLanguageSystem.SpokenLanguages); + _clientLanguageSystem.RequestStateUpdate(); + } + + + public void UpdateState(string currentLanguage, List spokenLanguages) + { + var langName = Loc.GetString($"language-{currentLanguage}-name"); + CurrentLanguageLabel.Text = Loc.GetString("language-menu-current-language", ("language", langName)); + + OptionsList.RemoveAllChildren(); + _entries.Clear(); + + foreach (var language in spokenLanguages) + { + AddLanguageEntry(language); + } + + // Disable the button for the currently chosen language + foreach (var entry in _entries) + { + if (entry.button != null) + entry.button.Disabled = entry.language == currentLanguage; + } + } + + private void AddLanguageEntry(string language) + { + var proto = _clientLanguageSystem.GetLanguagePrototype(language); + var state = new EntryState { language = language }; + + var container = new BoxContainer { Orientation = BoxContainer.LayoutOrientation.Vertical }; + + #region Header + var header = new BoxContainer + { + Orientation = BoxContainer.LayoutOrientation.Horizontal, + HorizontalExpand = true, + SeparationOverride = 2 + }; + + var name = new Label + { + Text = proto?.Name ?? Loc.GetString("generic-error"), + MinWidth = 50, + HorizontalExpand = true + }; + + var button = new Button { Text = "Choose" }; + button.OnPressed += _ => OnLanguageChosen(language); + state.button = button; + + header.AddChild(name); + header.AddChild(button); + + container.AddChild(header); + #endregion + + #region Collapsible description + var body = new CollapsibleBody + { + HorizontalExpand = true, + Margin = new Thickness(4f, 4f) + }; + + var description = new RichTextLabel { HorizontalExpand = true }; + description.SetMessage(proto?.Description ?? Loc.GetString("generic-error")); + body.AddChild(description); + + var collapser = new Collapsible(Loc.GetString("language-menu-description-header"), body) + { + Orientation = BoxContainer.LayoutOrientation.Vertical, + HorizontalExpand = true + }; + + container.AddChild(collapser); + #endregion + + // Before adding, wrap the new container in a PanelContainer to give it a distinct look + var wrapper = new PanelContainer(); + wrapper.StyleClasses.Add("PdaBorderRect"); + + wrapper.AddChild(container); + OptionsList.AddChild(wrapper); + + _entries.Add(state); + } + + + private void OnLanguageChosen(string id) + { + var proto = _clientLanguageSystem.GetLanguagePrototype(id); + if (proto != null) + _clientLanguageSystem.RequestSetLanguage(proto); + } + + + private struct EntryState + { + public string language; + public Button? button; + } +} diff --git a/Content.Client/Language/Systems/LanguageSystem.cs b/Content.Client/Language/Systems/LanguageSystem.cs new file mode 100644 index 00000000000..9714078b2c5 --- /dev/null +++ b/Content.Client/Language/Systems/LanguageSystem.cs @@ -0,0 +1,76 @@ +using Content.Shared.Language; +using Content.Shared.Language.Events; +using Content.Shared.Language.Systems; +using Robust.Client; +using Robust.Shared.Console; + +namespace Content.Client.Language.Systems; + +/// +/// Client-side language system. +/// +/// +/// Unlike the server, the client is not aware of other entities' languages; it's only notified about the entity that it posesses. +/// Due to that, this system stores such information in a static manner. +/// +public sealed class LanguageSystem : SharedLanguageSystem +{ + [Dependency] private readonly IBaseClient _client = default!; + + /// + /// The current language of the entity currently possessed by the player. + /// + public string CurrentLanguage { get; private set; } = default!; + /// + /// The list of languages the currently possessed entity can speak. + /// + public List SpokenLanguages { get; private set; } = new(); + /// + /// The list of languages the currently possessed entity can understand. + /// + public List UnderstoodLanguages { get; private set; } = new(); + + public override void Initialize() + { + base.Initialize(); + + SubscribeNetworkEvent(OnLanguagesUpdated); + _client.RunLevelChanged += OnRunLevelChanged; + } + + private void OnLanguagesUpdated(LanguagesUpdatedMessage message) + { + CurrentLanguage = message.CurrentLanguage; + SpokenLanguages = message.Spoken; + UnderstoodLanguages = message.Understood; + } + + private void OnRunLevelChanged(object? sender, RunLevelChangedEventArgs args) + { + // Request an update when entering a game + if (args.NewLevel == ClientRunLevel.InGame) + RequestStateUpdate(); + } + + /// + /// Sends a network request to the server to update this system's state. + /// The server may ignore the said request if the player is not possessing an entity. + /// + public void RequestStateUpdate() + { + RaiseNetworkEvent(new RequestLanguagesMessage()); + } + + public void RequestSetLanguage(LanguagePrototype language) + { + if (language.ID == CurrentLanguage) + return; + + RaiseNetworkEvent(new LanguagesSetMessage(language.ID)); + + // May cause some minor desync... + // So to reduce the probability of desync, we replicate the change locally too + if (SpokenLanguages.Contains(language.ID)) + CurrentLanguage = language.ID; + } +} diff --git a/Content.Client/Language/Systems/TranslatorImplanterSystem.cs b/Content.Client/Language/Systems/TranslatorImplanterSystem.cs new file mode 100644 index 00000000000..da19b3decf9 --- /dev/null +++ b/Content.Client/Language/Systems/TranslatorImplanterSystem.cs @@ -0,0 +1,8 @@ +using Content.Shared.Language.Systems; + +namespace Content.Client.Language.Systems; + +public sealed class TranslatorImplanterSystem : SharedTranslatorImplanterSystem +{ + +} diff --git a/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs b/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs index f0537079b97..49e8099e0fb 100644 --- a/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs +++ b/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs @@ -212,6 +212,7 @@ void AddCheckBox(string checkBoxName, bool currentState, Action, IOnStateExited +{ + public LanguageMenuWindow? LanguageWindow; + private MenuButton? LanguageButton => UIManager.GetActiveUIWidgetOrNull()?.LanguageButton; + + public override void Initialize() + { + SubscribeNetworkEvent((LanguagesUpdatedMessage message, EntitySessionEventArgs _) => + LanguageWindow?.UpdateState(message.CurrentLanguage, message.Spoken)); + } + + public void OnStateEntered(GameplayState state) + { + DebugTools.Assert(LanguageWindow == null); + + LanguageWindow = UIManager.CreateWindow(); + LayoutContainer.SetAnchorPreset(LanguageWindow, LayoutContainer.LayoutPreset.CenterTop); + + CommandBinds.Builder.Bind(ContentKeyFunctions.OpenLanguageMenu, + InputCmdHandler.FromDelegate(_ => ToggleWindow())).Register(); + } + + public void OnStateExited(GameplayState state) + { + if (LanguageWindow != null) + { + LanguageWindow.Dispose(); + LanguageWindow = null; + } + + CommandBinds.Unregister(); + } + + public void UnloadButton() + { + if (LanguageButton == null) + return; + + LanguageButton.OnPressed -= LanguageButtonPressed; + } + + public void LoadButton() + { + if (LanguageButton == null) + return; + + LanguageButton.OnPressed += LanguageButtonPressed; + + if (LanguageWindow == null) + return; + + LanguageWindow.OnClose += () => LanguageButton.Pressed = false; + LanguageWindow.OnOpen += () => LanguageButton.Pressed = true; + } + + private void LanguageButtonPressed(ButtonEventArgs args) + { + ToggleWindow(); + } + + private void ToggleWindow() + { + if (LanguageWindow == null) + return; + + if (LanguageButton != null) + LanguageButton.SetClickPressed(!LanguageWindow.IsOpen); + + if (LanguageWindow.IsOpen) + LanguageWindow.Close(); + else + LanguageWindow.Open(); + } +} diff --git a/Content.Client/UserInterface/Systems/MenuBar/GameTopMenuBarUIController.cs b/Content.Client/UserInterface/Systems/MenuBar/GameTopMenuBarUIController.cs index 1505db48a79..156fa63884e 100644 --- a/Content.Client/UserInterface/Systems/MenuBar/GameTopMenuBarUIController.cs +++ b/Content.Client/UserInterface/Systems/MenuBar/GameTopMenuBarUIController.cs @@ -9,6 +9,7 @@ using Content.Client.UserInterface.Systems.MenuBar.Widgets; using Content.Client.UserInterface.Systems.Sandbox; using Robust.Client.UserInterface.Controllers; +using Content.Client.UserInterface.Systems.Language; namespace Content.Client.UserInterface.Systems.MenuBar; @@ -22,6 +23,7 @@ public sealed class GameTopMenuBarUIController : UIController [Dependency] private readonly ActionUIController _action = default!; [Dependency] private readonly SandboxUIController _sandbox = default!; [Dependency] private readonly GuidebookUIController _guidebook = default!; + [Dependency] private readonly LanguageMenuUIController _language = default!; private GameTopMenuBar? GameTopMenuBar => UIManager.GetActiveUIWidgetOrNull(); @@ -44,6 +46,7 @@ public void UnloadButtons() _ahelp.UnloadButton(); _action.UnloadButton(); _sandbox.UnloadButton(); + _language.UnloadButton(); } public void LoadButtons() @@ -56,5 +59,6 @@ public void LoadButtons() _ahelp.LoadButton(); _action.LoadButton(); _sandbox.LoadButton(); + _language.LoadButton(); } } diff --git a/Content.Client/UserInterface/Systems/MenuBar/Widgets/GameTopMenuBar.xaml b/Content.Client/UserInterface/Systems/MenuBar/Widgets/GameTopMenuBar.xaml index 3c8cd1d164f..a76943ace85 100644 --- a/Content.Client/UserInterface/Systems/MenuBar/Widgets/GameTopMenuBar.xaml +++ b/Content.Client/UserInterface/Systems/MenuBar/Widgets/GameTopMenuBar.xaml @@ -63,6 +63,16 @@ HorizontalExpand="True" AppendStyleClass="{x:Static style:StyleBase.ButtonSquare}" /> + (source)) @@ -249,10 +255,10 @@ public void TrySendInGameICMessage( switch (desiredType) { case InGameICChatType.Speak: - SendEntitySpeak(source, message, range, nameOverride, hideLog, ignoreActionBlocker); + SendEntitySpeak(source, message, range, nameOverride, hideLog, ignoreActionBlocker, languageOverride: languageOverride); break; case InGameICChatType.Whisper: - SendEntityWhisper(source, message, range, null, nameOverride, hideLog, ignoreActionBlocker); + SendEntityWhisper(source, message, range, null, nameOverride, hideLog, ignoreActionBlocker, languageOverride: languageOverride); break; case InGameICChatType.Emote: SendEntityEmote(source, message, range, nameOverride, hideLog: hideLog, ignoreActionBlocker: ignoreActionBlocker); @@ -382,12 +388,14 @@ private void SendEntitySpeak( ChatTransmitRange range, string? nameOverride, bool hideLog = false, - bool ignoreActionBlocker = false + bool ignoreActionBlocker = false, + LanguagePrototype? languageOverride = null ) { if (!_actionBlocker.CanSpeak(source) && !ignoreActionBlocker) return; + // The original message var message = TransformSpeech(source, FormattedMessage.RemoveMarkup(originalMessage)); if (message.Length == 0) @@ -411,18 +419,19 @@ private void SendEntitySpeak( speech = proto; } - name = FormattedMessage.EscapeText(name); + var language = languageOverride ?? _language.GetLanguage(source); - var wrappedMessage = Loc.GetString(speech.Bold ? "chat-manager-entity-say-bold-wrap-message" : "chat-manager-entity-say-wrap-message", - ("entityName", name), - ("verb", Loc.GetString(_random.Pick(speech.SpeechVerbStrings))), - ("fontType", speech.FontId), - ("fontSize", speech.FontSize), - ("message", FormattedMessage.EscapeText(message))); + name = FormattedMessage.EscapeText(name); + // The chat message wrapped in a "x says y" string + var wrappedMessage = WrapPublicMessage(source, name, message); + // The chat message obfuscated via language obfuscation + var obfuscated = SanitizeInGameICMessage(source, _language.ObfuscateSpeech(message, language), out var emoteStr, true, _configurationManager.GetCVar(CCVars.ChatPunctuation), (!CultureInfo.CurrentCulture.IsNeutralCulture && CultureInfo.CurrentCulture.Parent.Name == "en") || (CultureInfo.CurrentCulture.IsNeutralCulture && CultureInfo.CurrentCulture.Name == "en")); + // The language-obfuscated message wrapped in a "x says y" string + var wrappedObfuscated = WrapPublicMessage(source, name, obfuscated); - SendInVoiceRange(ChatChannel.Local, message, wrappedMessage, source, range); + SendInVoiceRange(ChatChannel.Local, name, message, wrappedMessage, obfuscated, wrappedObfuscated, source, range, languageOverride: language); - var ev = new EntitySpokeEvent(source, message, null, null); + var ev = new EntitySpokeEvent(source, message, null, false, language); RaiseLocalEvent(source, ev, true); // To avoid logging any messages sent by entities that are not players, like vendors, cloning, etc. @@ -455,7 +464,8 @@ private void SendEntityWhisper( RadioChannelPrototype? channel, string? nameOverride, bool hideLog = false, - bool ignoreActionBlocker = false + bool ignoreActionBlocker = false, + LanguagePrototype? languageOverride = null ) { if (!_actionBlocker.CanSpeak(source) && !ignoreActionBlocker) @@ -465,8 +475,6 @@ private void SendEntityWhisper( if (message.Length == 0) return; - var obfuscatedMessage = ObfuscateMessageReadability(message, 0.2f); - // get the entity's name by visual identity (if no override provided). string nameIdentity = FormattedMessage.EscapeText(nameOverride ?? Identity.Name(source, EntityManager)); // get the entity's name by voice (if no override provided). @@ -483,41 +491,57 @@ private void SendEntityWhisper( } name = FormattedMessage.EscapeText(name); - var wrappedMessage = Loc.GetString("chat-manager-entity-whisper-wrap-message", - ("entityName", name), ("message", FormattedMessage.EscapeText(message))); - - var wrappedobfuscatedMessage = Loc.GetString("chat-manager-entity-whisper-wrap-message", - ("entityName", nameIdentity), ("message", FormattedMessage.EscapeText(obfuscatedMessage))); - - var wrappedUnknownMessage = Loc.GetString("chat-manager-entity-whisper-unknown-wrap-message", - ("message", FormattedMessage.EscapeText(obfuscatedMessage))); - + var language = languageOverride ?? _language.GetLanguage(source); + var languageObfuscatedMessage = SanitizeInGameICMessage(source, _language.ObfuscateSpeech(message, language), out var emoteStr, true, _configurationManager.GetCVar(CCVars.ChatPunctuation), (!CultureInfo.CurrentCulture.IsNeutralCulture && CultureInfo.CurrentCulture.Parent.Name == "en") || (CultureInfo.CurrentCulture.IsNeutralCulture && CultureInfo.CurrentCulture.Name == "en")); foreach (var (session, data) in GetRecipients(source, WhisperMuffledRange)) { - EntityUid listener; - - if (session.AttachedEntity is not { Valid: true } playerEntity) + if (session.AttachedEntity is not { Valid: true } listener) continue; - listener = session.AttachedEntity.Value; if (MessageRangeCheck(session, data, range) != MessageRangeCheckResult.Full) continue; // Won't get logged to chat, and ghosts are too far away to see the pop-up, so we just won't send it to them. + var canUnderstandLanguage = _language.CanUnderstand(listener, language); + // How the entity perceives the message depends on whether it can understand its language + var perceivedMessage = canUnderstandLanguage ? message : languageObfuscatedMessage; + + // Result is the intermediate message derived from the perceived one via obfuscation + // Wrapped message is the result wrapped in an "x says y" string + string result, wrappedMessage; if (data.Range <= WhisperClearRange) - _chatManager.ChatMessageToOne(ChatChannel.Whisper, message, wrappedMessage, source, false, session.Channel); - //If listener is too far, they only hear fragments of the message - //Collisiongroup.Opaque is not ideal for this use. Preferably, there should be a check specifically with "Can Ent1 see Ent2" in mind - else if (_interactionSystem.InRangeUnobstructed(source, listener, WhisperMuffledRange, Shared.Physics.CollisionGroup.Opaque)) //Shared.Physics.CollisionGroup.Opaque - _chatManager.ChatMessageToOne(ChatChannel.Whisper, obfuscatedMessage, wrappedobfuscatedMessage, source, false, session.Channel); - //If listener is too far and has no line of sight, they can't identify the whisperer's identity + { + // Scenario 1: the listener can clearly understand the message + result = perceivedMessage; + wrappedMessage = Loc.GetString("chat-manager-entity-whisper-wrap-message", + ("entityName", name), + ("message", FormattedMessage.EscapeText(result))); + } + else if (_interactionSystem.InRangeUnobstructed(source, listener, WhisperMuffledRange, Shared.Physics.CollisionGroup.Opaque)) + { + // Scenerio 2: if the listener is too far, they only hear fragments of the message + // Collisiongroup.Opaque is not ideal for this use. Preferably, there should be a check specifically with "Can Ent1 see Ent2" in mind + result = ObfuscateMessageReadability(perceivedMessage); + wrappedMessage = Loc.GetString("chat-manager-entity-whisper-wrap-message", + ("entityName", nameIdentity), ("message", FormattedMessage.EscapeText(result))); + } else - _chatManager.ChatMessageToOne(ChatChannel.Whisper, obfuscatedMessage, wrappedUnknownMessage, source, false, session.Channel); + { + // Scenario 3: If listener is too far and has no line of sight, they can't identify the whisperer's identity + result = ObfuscateMessageReadability(perceivedMessage); + wrappedMessage = Loc.GetString("chat-manager-entity-whisper-unknown-wrap-message", + ("message", FormattedMessage.EscapeText(result))); + } + + _chatManager.ChatMessageToOne(ChatChannel.Whisper, result, wrappedMessage, source, false, session.Channel); } - _replay.RecordServerMessage(new ChatMessage(ChatChannel.Whisper, message, wrappedMessage, GetNetEntity(source), null, MessageRangeHideChatForReplay(range))); + var replayWrap = Loc.GetString("chat-manager-entity-whisper-wrap-message", + ("entityName", name), + ("message", FormattedMessage.EscapeText(message))); + _replay.RecordServerMessage(new ChatMessage(ChatChannel.Whisper, message, replayWrap, GetNetEntity(source), null, MessageRangeHideChatForReplay(range))); - var ev = new EntitySpokeEvent(source, message, channel, obfuscatedMessage); + var ev = new EntitySpokeEvent(source, message, channel, true, language); RaiseLocalEvent(source, ev, true); if (!hideLog) if (originalMessage == message) @@ -564,7 +588,7 @@ private void SendEntityEmote( if (checkEmote) TryEmoteChatInput(source, action); - SendInVoiceRange(ChatChannel.Emotes, action, wrappedMessage, source, range, author); + SendInVoiceRange(ChatChannel.Emotes, name, action, wrappedMessage, obfuscated: "", obfuscatedWrappedMessage: "", source, range, author); if (!hideLog) if (name != Name(source)) _adminLogger.Add(LogType.Chat, LogImpact.Low, $"Emote from {ToPrettyString(source):user} as {name}: {action}"); @@ -591,7 +615,13 @@ private void SendLOOC(EntityUid source, ICommonSession player, string message, b ("entityName", name), ("message", FormattedMessage.EscapeText(message))); - SendInVoiceRange(ChatChannel.LOOC, message, wrappedMessage, source, hideChat ? ChatTransmitRange.HideChat : ChatTransmitRange.Normal, player.UserId); + SendInVoiceRange(ChatChannel.LOOC, name, message, wrappedMessage, + obfuscated: string.Empty, + obfuscatedWrappedMessage: string.Empty, // will be skipped anyway + source, + hideChat ? ChatTransmitRange.HideChat : ChatTransmitRange.Normal, + player.UserId, + languageOverride: LanguageSystem.Universal); _adminLogger.Add(LogType.Chat, LogImpact.Low, $"LOOC from {player:Player}: {message}"); } @@ -672,15 +702,29 @@ private MessageRangeCheckResult MessageRangeCheck(ICommonSession session, ICChat /// /// Sends a chat message to the given players in range of the source entity. /// - private void SendInVoiceRange(ChatChannel channel, string message, string wrappedMessage, EntityUid source, ChatTransmitRange range, NetUserId? author = null) + private void SendInVoiceRange(ChatChannel channel, string name, string message, string wrappedMessage, string obfuscated, string obfuscatedWrappedMessage, EntityUid source, ChatTransmitRange range, NetUserId? author = null, LanguagePrototype? languageOverride = null) { + var language = languageOverride ?? _language.GetLanguage(source); foreach (var (session, data) in GetRecipients(source, VoiceRange)) { var entRange = MessageRangeCheck(session, data, range); if (entRange == MessageRangeCheckResult.Disallowed) continue; var entHideChat = entRange == MessageRangeCheckResult.HideChat; - _chatManager.ChatMessageToOne(channel, message, wrappedMessage, source, entHideChat, session.Channel, author: author); + if (session.AttachedEntity is not { Valid: true } playerEntity) + continue; + EntityUid listener = session.AttachedEntity.Value; + + + // If the channel does not support languages, or the entity can understand the message, send the original message, otherwise send the obfuscated version + if (channel == ChatChannel.LOOC || channel == ChatChannel.Emotes || _language.CanUnderstand(listener, language)) + { + _chatManager.ChatMessageToOne(channel, message, wrappedMessage, source, entHideChat, session.Channel, author: author); + } + else + { + _chatManager.ChatMessageToOne(channel, obfuscated, obfuscatedWrappedMessage, source, entHideChat, session.Channel, author: author); + } } _replay.RecordServerMessage(new ChatMessage(channel, message, wrappedMessage, GetNetEntity(source), null, MessageRangeHideChatForReplay(range))); @@ -790,6 +834,21 @@ public string SanitizeMessageReplaceWords(string message) return msg; } + /// + /// Wraps a message sent by the specified entity into an "x says y" string. + /// + public string WrapPublicMessage(EntityUid source, string name, string message) + { + var speech = GetSpeechVerb(source, message); + var verbName = Loc.GetString(_random.Pick(speech.SpeechVerbStrings)); + return Loc.GetString(speech.Bold ? "chat-manager-entity-say-bold-wrap-message" : "chat-manager-entity-say-wrap-message", + ("entityName", name), + ("verb", verbName), + ("fontType", speech.FontId), + ("fontSize", speech.FontSize), + ("message", FormattedMessage.EscapeText(message))); + } + /// /// Returns list of players and ranges for all players withing some range. Also returns observers with a range of -1. /// @@ -836,7 +895,7 @@ public readonly record struct ICChatRecipientData(float Range, bool Observer, bo { } - private string ObfuscateMessageReadability(string message, float chance) + public string ObfuscateMessageReadability(string message, float chance = DefaultObfuscationFactor) { var modifiedMessage = new StringBuilder(message); @@ -925,7 +984,8 @@ public sealed class EntitySpokeEvent : EntityEventArgs { public readonly EntityUid Source; public readonly string Message; - public readonly string? ObfuscatedMessage; // not null if this was a whisper + public readonly bool IsWhisper; + public readonly LanguagePrototype Language; /// /// If the entity was trying to speak into a radio, this was the channel they were trying to access. If a radio @@ -933,12 +993,13 @@ public sealed class EntitySpokeEvent : EntityEventArgs /// public RadioChannelPrototype? Channel; - public EntitySpokeEvent(EntityUid source, string message, RadioChannelPrototype? channel, string? obfuscatedMessage) + public EntitySpokeEvent(EntityUid source, string message, RadioChannelPrototype? channel, bool isWhisper, LanguagePrototype language) { Source = source; Message = message; Channel = channel; - ObfuscatedMessage = obfuscatedMessage; + IsWhisper = isWhisper; + Language = language; } } diff --git a/Content.Server/Chemistry/ReagentEffects/MakeSentient.cs b/Content.Server/Chemistry/ReagentEffects/MakeSentient.cs index bf7691fe375..da16529d515 100644 --- a/Content.Server/Chemistry/ReagentEffects/MakeSentient.cs +++ b/Content.Server/Chemistry/ReagentEffects/MakeSentient.cs @@ -1,10 +1,14 @@ +using System.Linq; using Content.Server.Ghost.Roles.Components; using Content.Server.Speech.Components; using Content.Shared.Chemistry.Reagent; +using Content.Shared.Language; +using Content.Shared.Language.Systems; using Content.Shared.Mind.Components; using Robust.Shared.Prototypes; using Content.Server.Psionics; //Nyano - Summary: pulls in the ability for the sentient creature to become psionic. using Content.Shared.Humanoid; //Delta-V - Banning humanoids from becoming ghost roles. +using Content.Shared.Language.Events; namespace Content.Server.Chemistry.ReagentEffects; @@ -24,6 +28,20 @@ public override void Effect(ReagentEffectArgs args) entityManager.RemoveComponent(uid); entityManager.RemoveComponent(uid); + var speaker = entityManager.EnsureComponent(uid); + var fallback = SharedLanguageSystem.FallbackLanguagePrototype; + + if (!speaker.UnderstoodLanguages.Contains(fallback)) + speaker.UnderstoodLanguages.Add(fallback); + + if (!speaker.SpokenLanguages.Contains(fallback)) + { + speaker.CurrentLanguage = fallback; + speaker.SpokenLanguages.Add(fallback); + } + + args.EntityManager.EventBus.RaiseLocalEvent(uid, new LanguagesUpdateEvent(), true); + // Stops from adding a ghost role to things like people who already have a mind if (entityManager.TryGetComponent(uid, out var mindContainer) && mindContainer.HasMind) { @@ -47,7 +65,7 @@ public override void Effect(ReagentEffectArgs args) ghostRole = entityManager.AddComponent(uid); entityManager.EnsureComponent(uid); - entityManager.EnsureComponent(uid); //Nyano - Summary:. Makes the animated body able to get psionics. + entityManager.EnsureComponent(uid); //Nyano - Summary:. Makes the animated body able to get psionics. var entityData = entityManager.GetComponent(uid); ghostRole.RoleName = entityData.EntityName; diff --git a/Content.Server/Language/Commands/ListLanguagesCommand.cs b/Content.Server/Language/Commands/ListLanguagesCommand.cs new file mode 100644 index 00000000000..6698e1b6453 --- /dev/null +++ b/Content.Server/Language/Commands/ListLanguagesCommand.cs @@ -0,0 +1,39 @@ +using System.Linq; +using Content.Shared.Administration; +using Robust.Shared.Console; +using Robust.Shared.Enums; + +namespace Content.Server.Language.Commands; + +[AnyCommand] +public sealed class ListLanguagesCommand : IConsoleCommand +{ + public string Command => "languagelist"; + public string Description => Loc.GetString("command-list-langs-desc"); + public string Help => Loc.GetString("command-list-langs-help", ("command", Command)); + + public void Execute(IConsoleShell shell, string argStr, string[] args) + { + if (shell.Player is not { } player) + { + shell.WriteError(Loc.GetString("shell-cannot-run-command-from-server")); + return; + } + + if (player.Status != SessionStatus.InGame) + return; + + if (player.AttachedEntity is not {} playerEntity) + { + shell.WriteError(Loc.GetString("shell-must-be-attached-to-entity")); + return; + } + + var languages = IoCManager.Resolve().GetEntitySystem(); + + var (spokenLangs, knownLangs) = languages.GetAllLanguages(playerEntity); + + shell.WriteLine("Spoken:\n" + string.Join("\n", spokenLangs)); + shell.WriteLine("Understood:\n" + string.Join("\n", knownLangs)); + } +} diff --git a/Content.Server/Language/Commands/SayLanguageCommand.cs b/Content.Server/Language/Commands/SayLanguageCommand.cs new file mode 100644 index 00000000000..2e4a27b1dcc --- /dev/null +++ b/Content.Server/Language/Commands/SayLanguageCommand.cs @@ -0,0 +1,53 @@ +using Content.Server.Chat.Systems; +using Content.Shared.Administration; +using Robust.Shared.Console; +using Robust.Shared.Enums; + +namespace Content.Server.Language.Commands; + +[AnyCommand] +public sealed class SayLanguageCommand : IConsoleCommand +{ + public string Command => "saylang"; + public string Description => Loc.GetString("command-saylang-desc"); + public string Help => Loc.GetString("command-saylang-help", ("command", Command)); + + public void Execute(IConsoleShell shell, string argStr, string[] args) + { + if (shell.Player is not { } player) + { + shell.WriteError(Loc.GetString("shell-cannot-run-command-from-server")); + return; + } + + if (player.Status != SessionStatus.InGame) + return; + + if (player.AttachedEntity is not {} playerEntity) + { + shell.WriteError(Loc.GetString("shell-must-be-attached-to-entity")); + return; + } + + if (args.Length < 2) + return; + + var languageId = args[0]; + var message = string.Join(" ", args, startIndex: 1, count: args.Length - 1).Trim(); + + if (string.IsNullOrEmpty(message)) + return; + + var languages = IoCManager.Resolve().GetEntitySystem(); + var chats = IoCManager.Resolve().GetEntitySystem(); + + var language = languages.GetLanguagePrototype(languageId); + if (language == null || !languages.CanSpeak(playerEntity, language.ID)) + { + shell.WriteError($"Language {languageId} is invalid or you cannot speak it!"); + return; + } + + chats.TrySendInGameICMessage(playerEntity, message, InGameICChatType.Speak, ChatTransmitRange.Normal, false, shell, player, languageOverride: language); + } +} diff --git a/Content.Server/Language/Commands/SelectLanguageCommand.cs b/Content.Server/Language/Commands/SelectLanguageCommand.cs new file mode 100644 index 00000000000..e3363846539 --- /dev/null +++ b/Content.Server/Language/Commands/SelectLanguageCommand.cs @@ -0,0 +1,48 @@ +using System.Linq; +using Content.Shared.Administration; +using Robust.Shared.Console; +using Robust.Shared.Enums; + +namespace Content.Server.Language.Commands; + +[AnyCommand] +public sealed class SelectLanguageCommand : IConsoleCommand +{ + public string Command => "languageselect"; + public string Description => Loc.GetString("command-language-select-desc"); + public string Help => Loc.GetString("command-language-select-help", ("command", Command)); + + public void Execute(IConsoleShell shell, string argStr, string[] args) + { + if (shell.Player is not { } player) + { + shell.WriteError(Loc.GetString("shell-cannot-run-command-from-server")); + return; + } + + if (player.Status != SessionStatus.InGame) + return; + + if (player.AttachedEntity is not { } playerEntity) + { + shell.WriteError(Loc.GetString("shell-must-be-attached-to-entity")); + return; + } + + if (args.Length < 1) + return; + + var languageId = args[0]; + + var languages = IoCManager.Resolve().GetEntitySystem(); + + var language = languages.GetLanguagePrototype(languageId); + if (language == null || !languages.CanSpeak(playerEntity, language.ID)) + { + shell.WriteError($"Language {languageId} is invalid or you cannot speak it!"); + return; + } + + languages.SetLanguage(playerEntity, language.ID); + } +} diff --git a/Content.Server/Language/DetermineEntityLanguagesEvent.cs b/Content.Server/Language/DetermineEntityLanguagesEvent.cs new file mode 100644 index 00000000000..13ab2cac279 --- /dev/null +++ b/Content.Server/Language/DetermineEntityLanguagesEvent.cs @@ -0,0 +1,29 @@ +namespace Content.Server.Language; + +/// +/// Raised in order to determine the language an entity speaks at the current moment, +/// as well as the list of all languages the entity may speak and understand. +/// +public sealed class DetermineEntityLanguagesEvent : EntityEventArgs +{ + /// + /// The default language of this entity. If empty, remain unchanged. + /// This field has no effect if the entity decides to speak in a concrete language. + /// + public string CurrentLanguage; + /// + /// The list of all languages the entity may speak. Must NOT be held as a reference! + /// + public List SpokenLanguages; + /// + /// The list of all languages the entity may understand. Must NOT be held as a reference! + /// + public List UnderstoodLanguages; + + public DetermineEntityLanguagesEvent(string currentLanguage, List spokenLanguages, List understoodLanguages) + { + CurrentLanguage = currentLanguage; + SpokenLanguages = spokenLanguages; + UnderstoodLanguages = understoodLanguages; + } +} diff --git a/Content.Server/Language/LanguageSystem.Networking.cs b/Content.Server/Language/LanguageSystem.Networking.cs new file mode 100644 index 00000000000..7517b4185e3 --- /dev/null +++ b/Content.Server/Language/LanguageSystem.Networking.cs @@ -0,0 +1,59 @@ +using Content.Server.Mind; +using Content.Shared.Language; +using Content.Shared.Language.Events; +using Content.Shared.Mind; +using Content.Shared.Mind.Components; +using Robust.Shared.Player; + +namespace Content.Server.Language; + +/// +/// LanguageSystem Networking +/// This is used to update client state when mind change entity. +/// + +public sealed partial class LanguageSystem +{ + [Dependency] private readonly MindSystem _mind = default!; + + + public void InitializeNet() + { + // Refresh the client's state when its mind hops to a different entity + SubscribeLocalEvent((uid, _, _) => SendLanguageStateToClient(uid)); + SubscribeLocalEvent((_, _, args) => + { + if (args.Mind.Comp.Session != null) + SendLanguageStateToClient(args.Mind.Comp.Session); + }); + + SubscribeLocalEvent((uid, comp, _) => SendLanguageStateToClient(uid, comp)); + SubscribeNetworkEvent((_, session) => SendLanguageStateToClient(session.SenderSession)); + } + + + private void SendLanguageStateToClient(EntityUid uid, LanguageSpeakerComponent? comp = null) + { + // Try to find a mind inside the entity and notify its session + if (!_mind.TryGetMind(uid, out _, out var mindComp) || mindComp.Session == null) + return; + + SendLanguageStateToClient(uid, mindComp.Session, comp); + } + + private void SendLanguageStateToClient(ICommonSession session, LanguageSpeakerComponent? comp = null) + { + // Try to find an entity associated with the session and resolve the languages from it + if (session.AttachedEntity is not { Valid: true } entity) + return; + + SendLanguageStateToClient(entity, session, comp); + } + + private void SendLanguageStateToClient(EntityUid uid, ICommonSession session, LanguageSpeakerComponent? component = null) + { + var langs = GetLanguages(uid, component); + var message = new LanguagesUpdatedMessage(langs.CurrentLanguage, langs.SpokenLanguages, langs.UnderstoodLanguages); + RaiseNetworkEvent(message, session); + } +} diff --git a/Content.Server/Language/LanguageSystem.cs b/Content.Server/Language/LanguageSystem.cs new file mode 100644 index 00000000000..f1bf44c1f4f --- /dev/null +++ b/Content.Server/Language/LanguageSystem.cs @@ -0,0 +1,289 @@ +using System.Linq; +using System.Text; +using Content.Server.GameTicking.Events; +using Content.Shared.Language; +using Content.Shared.Language.Events; +using Content.Shared.Language.Systems; +using Robust.Shared.Random; +using UniversalLanguageSpeakerComponent = Content.Shared.Language.Components.UniversalLanguageSpeakerComponent; + +namespace Content.Server.Language; + +public sealed partial class LanguageSystem : SharedLanguageSystem +{ + // Static and re-used event instances used to minimize memory allocations during language processing, which can happen many times per tick. + // These are used in the method GetLanguages and returned from it. They should never be mutated outside of that method or returned outside this system. + private readonly DetermineEntityLanguagesEvent + _determineLanguagesEvent = new(string.Empty, new(), new()), + _universalLanguagesEvent = new(UniversalPrototype, [UniversalPrototype], [UniversalPrototype]); // Returned for universal speakers only + + /// + /// A random number added to each pseudo-random number's seed. Changes every round. + /// + public int RandomRoundSeed { get; private set; } + + + public override void Initialize() + { + base.Initialize(); + + SubscribeNetworkEvent(OnClientSetLanguage); + SubscribeLocalEvent(OnInitLanguageSpeaker); + SubscribeLocalEvent(_ => RandomRoundSeed = _random.Next()); + + InitializeNet(); + } + + + #region public api + /// + /// Obfuscate a message using an entity's default language. + /// + public string ObfuscateSpeech(EntityUid source, string message) + { + var language = GetLanguage(source) ?? Universal; + return ObfuscateSpeech(message, language); + } + + /// + /// Obfuscate a message using the given language. + /// + public string ObfuscateSpeech(string message, LanguagePrototype language) + { + var builder = new StringBuilder(); + if (language.ObfuscateSyllables) + ObfuscateSyllables(builder, message, language); + else + ObfuscatePhrases(builder, message, language); + + return builder.ToString(); + } + + public bool CanUnderstand(EntityUid listener, LanguagePrototype language, LanguageSpeakerComponent? listenerLanguageComp = null) + { + if (language.ID == UniversalPrototype || HasComp(listener)) + return true; + + var listenerLanguages = GetLanguages(listener, listenerLanguageComp)?.UnderstoodLanguages; + + return listenerLanguages?.Contains(language.ID, StringComparer.Ordinal) ?? false; + } + + public bool CanSpeak(EntityUid speaker, string language, LanguageSpeakerComponent? speakerComp = null) + { + if (HasComp(speaker)) + return true; + + var langs = GetLanguages(speaker, speakerComp)?.UnderstoodLanguages; + return langs?.Contains(language, StringComparer.Ordinal) ?? false; + } + + /// + /// Returns the current language of the given entity. + /// Assumes Universal if not specified. + /// + public LanguagePrototype GetLanguage(EntityUid speaker, LanguageSpeakerComponent? languageComp = null) + { + var id = GetLanguages(speaker, languageComp)?.CurrentLanguage; + if (id == null) + return Universal; // Fallback + + _prototype.TryIndex(id, out LanguagePrototype? proto); + + return proto ?? Universal; + } + + public void SetLanguage(EntityUid speaker, string language, LanguageSpeakerComponent? languageComp = null) + { + if (!CanSpeak(speaker, language) || HasComp(speaker)) + return; + + if (languageComp == null && !TryComp(speaker, out languageComp)) + return; + + if (languageComp.CurrentLanguage == language) + return; + + languageComp.CurrentLanguage = language; + + RaiseLocalEvent(speaker, new LanguagesUpdateEvent(), true); + } + + /// + /// Adds a new language to the lists of understood and/or spoken languages of the given component. + /// + public void AddLanguage(LanguageSpeakerComponent comp, string language, bool addSpoken = true, bool addUnderstood = true) + { + if (addSpoken && !comp.SpokenLanguages.Contains(language)) + comp.SpokenLanguages.Add(language); + + if (addUnderstood && !comp.UnderstoodLanguages.Contains(language)) + comp.UnderstoodLanguages.Add(language); + + RaiseLocalEvent(comp.Owner, new LanguagesUpdateEvent(), true); + } + + public (List spoken, List understood) GetAllLanguages(EntityUid speaker) + { + var languages = GetLanguages(speaker); + // The lists need to be copied because the internal ones are re-used for performance reasons. + return (new List(languages.SpokenLanguages), new List(languages.UnderstoodLanguages)); + } + + /// + /// Ensures the given entity has a valid language as its current language. + /// If not, sets it to the first entry of its SpokenLanguages list, or universal if it's empty. + /// + public void EnsureValidLanguage(EntityUid entity, LanguageSpeakerComponent? comp = null) + { + if (comp == null && !TryComp(entity, out comp)) + return; + + var langs = GetLanguages(entity, comp); + if (!langs.SpokenLanguages.Contains(comp!.CurrentLanguage, StringComparer.Ordinal)) + { + comp.CurrentLanguage = langs.SpokenLanguages.FirstOrDefault(UniversalPrototype); + RaiseLocalEvent(comp.Owner, new LanguagesUpdateEvent(), true); + } + } + #endregion + + #region event handling + private void OnInitLanguageSpeaker(EntityUid uid, LanguageSpeakerComponent component, ComponentInit args) + { + if (string.IsNullOrEmpty(component.CurrentLanguage)) + component.CurrentLanguage = component.SpokenLanguages.FirstOrDefault(UniversalPrototype); + } + #endregion + + #region internal api - obfuscation + private void ObfuscateSyllables(StringBuilder builder, string message, LanguagePrototype language) + { + // Go through each word. Calculate its hash sum and count the number of letters. + // Replicate it with pseudo-random syllables of pseudo-random (but similar) length. Use the hash code as the seed. + // This means that identical words will be obfuscated identically. Simple words like "hello" or "yes" in different langs can be memorized. + var wordBeginIndex = 0; + var hashCode = 0; + for (var i = 0; i < message.Length; i++) + { + var ch = char.ToLower(message[i]); + // A word ends when one of the following is found: a space, a sentence end, or EOM + if (char.IsWhiteSpace(ch) || IsSentenceEnd(ch) || i == message.Length - 1) + { + var wordLength = i - wordBeginIndex; + if (wordLength > 0) + { + var newWordLength = PseudoRandomNumber(hashCode, 1, 4); + + for (var j = 0; j < newWordLength; j++) + { + var index = PseudoRandomNumber(hashCode + j, 0, language.Replacement.Count); + builder.Append(language.Replacement[index]); + } + } + + builder.Append(ch); + hashCode = 0; + wordBeginIndex = i + 1; + } + else + hashCode = hashCode * 31 + ch; + } + } + + private void ObfuscatePhrases(StringBuilder builder, string message, LanguagePrototype language) + { + // In a similar manner, each phrase is obfuscated with a random number of conjoined obfuscation phrases. + // However, the number of phrases depends on the number of characters in the original phrase. + var sentenceBeginIndex = 0; + for (var i = 0; i < message.Length; i++) + { + var ch = char.ToLower(message[i]); + if (IsSentenceEnd(ch) || i == message.Length - 1) + { + var length = i - sentenceBeginIndex; + if (length > 0) + { + var newLength = (int) Math.Clamp(Math.Cbrt(length) - 1, 1, 4); // 27+ chars for 2 phrases, 64+ for 3, 125+ for 4. + + for (var j = 0; j < newLength; j++) + { + var phrase = _random.Pick(language.Replacement); + builder.Append(phrase); + } + } + sentenceBeginIndex = i + 1; + + if (IsSentenceEnd(ch)) + builder.Append(ch).Append(" "); + } + } + } + + private static bool IsSentenceEnd(char ch) + { + return ch is '.' or '!' or '?'; + } + #endregion + + #region internal api - misc + /// + /// Dynamically resolves the current language of the entity and the list of all languages it speaks. + /// + /// If the entity is not a language speaker, or is a universal language speaker, then it's assumed to speak Universal, + /// aka all languages at once and none at the same time. + /// + /// + /// The returned event is reused and thus must not be held as a reference anywhere but inside the caller function. + /// + private DetermineEntityLanguagesEvent GetLanguages(EntityUid speaker, LanguageSpeakerComponent? comp = null) + { + // This is a shortcut for ghosts and entities that should not speak normally (admemes) + if (HasComp(speaker) || !TryComp(speaker, out comp)) + return _universalLanguagesEvent; + + var ev = _determineLanguagesEvent; + ev.SpokenLanguages.Clear(); + ev.UnderstoodLanguages.Clear(); + + ev.CurrentLanguage = comp.CurrentLanguage; + ev.SpokenLanguages.AddRange(comp.SpokenLanguages); + ev.UnderstoodLanguages.AddRange(comp.UnderstoodLanguages); + + RaiseLocalEvent(speaker, ev, true); + + if (ev.CurrentLanguage.Length == 0) + ev.CurrentLanguage = !string.IsNullOrEmpty(comp.CurrentLanguage) ? comp.CurrentLanguage : UniversalPrototype; // Fall back to account for admemes like admins possessing a bread + return ev; + } + + /// + /// Generates a stable pseudo-random number in the range (min, max) for the given seed. + /// Each input seed corresponds to exactly one random number. + /// + private int PseudoRandomNumber(int seed, int min, int max) + { + // This is not a uniform distribution, but it shouldn't matter given there's 2^31 possible random numbers, + // the bias of this function should be so tiny it will never be noticed. + seed += RandomRoundSeed; + var random = ((seed * 1103515245) + 12345) & 0x7fffffff; // Source: http://cs.uccs.edu/~cs591/bufferOverflow/glibc-2.2.4/stdlib/random_r.c + return random % (max - min) + min; + } + + /// + /// Set CurrentLanguage of the client, the client must be able to Understand the language requested. + /// + private void OnClientSetLanguage(LanguagesSetMessage message, EntitySessionEventArgs args) + { + if (args.SenderSession.AttachedEntity is not {Valid: true} speaker) + return; + + var language = GetLanguagePrototype(message.CurrentLanguage); + + if (language == null || !CanSpeak(speaker, language.ID)) + return; + + SetLanguage(speaker, language.ID); + } + #endregion +} diff --git a/Content.Server/Language/TranslatorImplanterSystem.cs b/Content.Server/Language/TranslatorImplanterSystem.cs new file mode 100644 index 00000000000..1e0c13375e4 --- /dev/null +++ b/Content.Server/Language/TranslatorImplanterSystem.cs @@ -0,0 +1,72 @@ +using System.Linq; +using Content.Server.Administration.Logs; +using Content.Server.Popups; +using Content.Shared.Database; +using Content.Shared.Interaction; +using Content.Shared.Language; +using Content.Shared.Language.Components; +using Content.Shared.Language.Events; +using Content.Shared.Language.Systems; +using Content.Shared.Mobs.Components; +using Content.Shared.Language.Components.Translators; + +namespace Content.Server.Language; + +public sealed class TranslatorImplanterSystem : SharedTranslatorImplanterSystem +{ + [Dependency] private readonly PopupSystem _popup = default!; + [Dependency] private readonly IAdminLogManager _adminLogger = default!; + [Dependency] private readonly LanguageSystem _language = default!; + + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnImplant); + } + + + private void OnImplant(EntityUid implanter, TranslatorImplanterComponent component, AfterInteractEvent args) + { + if (component.Used || !args.CanReach || args.Target is not { Valid: true } target) + return; + + if (!TryComp(target, out var speaker)) + return; + + if (component.MobsOnly && !HasComp(target)) + { + _popup.PopupEntity("translator-implanter-refuse", component.Owner); + return; + } + + var understood = _language.GetAllLanguages(target).understood; + if (component.RequiredLanguages.Count > 0 && !component.RequiredLanguages.Any(lang => understood.Contains(lang))) + { + _popup.PopupEntity(Loc.GetString("translator-implanter-refuse", + ("implanter", implanter), ("target", target)), implanter); + return; + } + + var intrinsic = EnsureComp(target); + intrinsic.Enabled = true; + + foreach (var lang in component.SpokenLanguages.Where(lang => !intrinsic.SpokenLanguages.Contains(lang))) + intrinsic.SpokenLanguages.Add(lang); + + foreach (var lang in component.UnderstoodLanguages.Where(lang => !intrinsic.UnderstoodLanguages.Contains(lang))) + intrinsic.UnderstoodLanguages.Add(lang); + + component.Used = true; + _popup.PopupEntity(Loc.GetString("translator-implanter-success", + ("implanter", implanter), ("target", target)), implanter); + + _adminLogger.Add(LogType.Action, LogImpact.Medium, + $"{ToPrettyString(args.User):player} used {ToPrettyString(implanter):implanter} to give {ToPrettyString(target):target} the following languages:" + + $"\nSpoken: {string.Join(", ", component.SpokenLanguages)}; Understood: {string.Join(", ", component.UnderstoodLanguages)}"); + + OnAppearanceChange(implanter, component); + RaiseLocalEvent(target, new LanguagesUpdateEvent(), true); + } +} diff --git a/Content.Server/Language/TranslatorSystem.cs b/Content.Server/Language/TranslatorSystem.cs new file mode 100644 index 00000000000..3b7704b9a71 --- /dev/null +++ b/Content.Server/Language/TranslatorSystem.cs @@ -0,0 +1,225 @@ +using System.Linq; +using Content.Server.Popups; +using Content.Server.PowerCell; +using Content.Shared.Interaction; +using Content.Shared.Interaction.Events; +using Content.Shared.Language; +using Content.Shared.Language.Events; +using Content.Shared.Language.Systems; +using Content.Shared.PowerCell; +using Content.Shared.Language.Components.Translators; + +namespace Content.Server.Language; + +// This does not support holding multiple translators at once. +// That shouldn't be an issue for now, but it needs to be fixed later. +public sealed class TranslatorSystem : SharedTranslatorSystem +{ + [Dependency] private readonly PopupSystem _popup = default!; + [Dependency] private readonly LanguageSystem _language = default!; + [Dependency] private readonly PowerCellSystem _powerCell = default!; + + public override void Initialize() + { + base.Initialize(); + + // I wanna die. But my death won't help us discover polymorphism. + SubscribeLocalEvent(OnDetermineLanguages); + SubscribeLocalEvent(OnDetermineLanguages); + SubscribeLocalEvent(OnDetermineLanguages); + + SubscribeLocalEvent(OnTranslatorToggle); + SubscribeLocalEvent(OnPowerCellSlotEmpty); + + // TODO: why does this use InteractHandEvent?? + SubscribeLocalEvent(OnTranslatorInteract); + SubscribeLocalEvent(OnTranslatorDropped); + } + + private void OnDetermineLanguages(EntityUid uid, IntrinsicTranslatorComponent component, + DetermineEntityLanguagesEvent ev) + { + if (!component.Enabled) + return; + + if (!_powerCell.HasActivatableCharge(uid)) + return; + + var addUnderstood = true; + var addSpoken = true; + if (component.RequiredLanguages.Count > 0) + { + if (component.RequiresAllLanguages) + { + // Add langs when the wielder has all of the required languages + foreach (var language in component.RequiredLanguages) + { + if (!ev.SpokenLanguages.Contains(language, StringComparer.Ordinal)) + addSpoken = false; + + if (!ev.UnderstoodLanguages.Contains(language, StringComparer.Ordinal)) + addUnderstood = false; + } + } + else + { + // Add langs when the wielder has at least one of the required languages + addUnderstood = false; + addSpoken = false; + foreach (var language in component.RequiredLanguages) + { + if (ev.SpokenLanguages.Contains(language, StringComparer.Ordinal)) + addSpoken = true; + + if (ev.UnderstoodLanguages.Contains(language, StringComparer.Ordinal)) + addUnderstood = true; + } + } + } + + if (addSpoken) + { + foreach (var language in component.SpokenLanguages) + AddIfNotExists(ev.SpokenLanguages, language); + + if (component.DefaultLanguageOverride != null && ev.CurrentLanguage.Length == 0) + ev.CurrentLanguage = component.DefaultLanguageOverride; + } + + if (addUnderstood) + foreach (var language in component.UnderstoodLanguages) + AddIfNotExists(ev.UnderstoodLanguages, language); + } + + private void OnTranslatorInteract( EntityUid translator, HandheldTranslatorComponent component, InteractHandEvent args) + { + var holder = args.User; + if (!EntityManager.HasComponent(holder)) + return; + + var intrinsic = EnsureComp(holder); + UpdateBoundIntrinsicComp(component, intrinsic, component.Enabled); + + RaiseLocalEvent(holder, new LanguagesUpdateEvent(), true); + } + + private void OnTranslatorDropped(EntityUid translator, HandheldTranslatorComponent component, DroppedEvent args) + { + var holder = args.User; + if (!EntityManager.TryGetComponent(holder, out var intrinsic)) + return; + + if (intrinsic.Issuer == component) + { + intrinsic.Enabled = false; + RemCompDeferred(holder, intrinsic); + } + + _language.EnsureValidLanguage(holder); + + RaiseLocalEvent(holder, new LanguagesUpdateEvent(), true); + } + + private void OnTranslatorToggle(EntityUid translator, HandheldTranslatorComponent component, ActivateInWorldEvent args) + { + if (!component.ToggleOnInteract) + return; + + var hasPower = _powerCell.HasDrawCharge(translator); + + if (Transform(args.Target).ParentUid is { Valid: true } holder + && EntityManager.HasComponent(holder)) + { + // This translator is held by a language speaker and thus has an intrinsic counterpart bound to it. + // Make sure it's up-to-date. + var intrinsic = EnsureComp(holder); + var isEnabled = !component.Enabled; + if (intrinsic.Issuer != component) + { + // The intrinsic comp wasn't owned by this handheld component, so this comp wasn't the active translator. + // Thus it needs to be turned on regardless of its previous state. + intrinsic.Issuer = component; + isEnabled = true; + } + + isEnabled &= hasPower; + UpdateBoundIntrinsicComp(component, intrinsic, isEnabled); + component.Enabled = isEnabled; + _powerCell.SetPowerCellDrawEnabled(translator, isEnabled); + + _language.EnsureValidLanguage(holder); + RaiseLocalEvent(holder, new LanguagesUpdateEvent(), true); + } + else + { + // This is a standalone translator (e.g. lying on the ground), toggle its state. + component.Enabled = !component.Enabled && hasPower; + _powerCell.SetPowerCellDrawEnabled(translator, !component.Enabled && hasPower); + } + + OnAppearanceChange(translator, component); + + // HasPower shows a popup when there's no power, so we do not proceed in that case + if (hasPower) + { + var message = Loc.GetString( + component.Enabled + ? "translator-component-turnon" + : "translator-component-shutoff", + ("translator", component.Owner)); + _popup.PopupEntity(message, component.Owner, args.User); + } + } + + private void OnPowerCellSlotEmpty(EntityUid translator, HandheldTranslatorComponent component, PowerCellSlotEmptyEvent args) + { + component.Enabled = false; + _powerCell.SetPowerCellDrawEnabled(translator, false); + OnAppearanceChange(translator, component); + + if (Transform(translator).ParentUid is { Valid: true } holder + && EntityManager.HasComponent(holder)) + { + if (!EntityManager.TryGetComponent(holder, out var intrinsic)) + return; + + if (intrinsic.Issuer == component) + { + intrinsic.Enabled = false; + EntityManager.RemoveComponent(holder, intrinsic); + } + + _language.EnsureValidLanguage(holder); + RaiseLocalEvent(holder, new LanguagesUpdateEvent(), true); + } + } + + /// + /// Copies the state from the handheld to the intrinsic component + /// + private void UpdateBoundIntrinsicComp(HandheldTranslatorComponent comp, HoldsTranslatorComponent intrinsic, bool isEnabled) + { + if (isEnabled) + { + intrinsic.SpokenLanguages = new List(comp.SpokenLanguages); + intrinsic.UnderstoodLanguages = new List(comp.UnderstoodLanguages); + intrinsic.DefaultLanguageOverride = comp.DefaultLanguageOverride; + } + else + { + intrinsic.SpokenLanguages.Clear(); + intrinsic.UnderstoodLanguages.Clear(); + intrinsic.DefaultLanguageOverride = null; + } + + intrinsic.Enabled = isEnabled; + intrinsic.Issuer = comp; + } + + private static void AddIfNotExists(List list, string item) + { + if (list.Contains(item)) + return; + list.Add(item); + } +} diff --git a/Content.Server/Mind/Commands/MakeSentientCommand.cs b/Content.Server/Mind/Commands/MakeSentientCommand.cs index 5e19d135b6f..cacd499ab8d 100644 --- a/Content.Server/Mind/Commands/MakeSentientCommand.cs +++ b/Content.Server/Mind/Commands/MakeSentientCommand.cs @@ -1,7 +1,10 @@ using Content.Server.Administration; +using Content.Server.Language; using Content.Shared.Administration; using Content.Shared.Emoting; using Content.Shared.Examine; +using Content.Shared.Language; +using Content.Shared.Language.Systems; using Content.Shared.Mind.Components; using Content.Shared.Movement.Components; using Content.Shared.Speech; @@ -55,6 +58,13 @@ public static void MakeSentient(EntityUid uid, IEntityManager entityManager, boo { entityManager.EnsureComponent(uid); entityManager.EnsureComponent(uid); + + var language = IoCManager.Resolve().GetEntitySystem(); + var speaker = entityManager.EnsureComponent(uid); + // If the speaker knows any language (like monkey or robot), they keep those + // Otherwise, we give them the fallback + if (speaker.SpokenLanguages.Count == 0) + language.AddLanguage(speaker, SharedLanguageSystem.FallbackLanguagePrototype); } entityManager.EnsureComponent(uid); diff --git a/Content.Server/Radio/EntitySystems/HeadsetSystem.cs b/Content.Server/Radio/EntitySystems/HeadsetSystem.cs index d18b044205c..53517da6cb4 100644 --- a/Content.Server/Radio/EntitySystems/HeadsetSystem.cs +++ b/Content.Server/Radio/EntitySystems/HeadsetSystem.cs @@ -1,6 +1,9 @@ using Content.Server.Chat.Systems; using Content.Server.Emp; +using Content.Server.Language; using Content.Server.Radio.Components; +using Content.Server.Speech; +using Content.Shared.Chat; using Content.Shared.Inventory.Events; using Content.Shared.Radio; using Content.Shared.Radio.Components; @@ -14,6 +17,7 @@ public sealed class HeadsetSystem : SharedHeadsetSystem { [Dependency] private readonly INetManager _netMan = default!; [Dependency] private readonly RadioSystem _radio = default!; + [Dependency] private readonly LanguageSystem _language = default!; public override void Initialize() { @@ -99,8 +103,16 @@ public void SetEnabled(EntityUid uid, bool value, HeadsetComponent? component = private void OnHeadsetReceive(EntityUid uid, HeadsetComponent component, ref RadioReceiveEvent args) { - if (TryComp(Transform(uid).ParentUid, out ActorComponent? actor)) - _netMan.ServerSendMessage(args.ChatMsg, actor.PlayerSession.Channel); + var parent = Transform(uid).ParentUid; + if (TryComp(parent, out ActorComponent? actor)) + { + var canUnderstand = _language.CanUnderstand(parent, args.Language); + var msg = new MsgChatMessage + { + Message = canUnderstand ? args.OriginalChatMsg : args.LanguageObfuscatedChatMsg + }; + _netMan.ServerSendMessage(msg, actor.PlayerSession.Channel); + } } private void OnEmpPulse(EntityUid uid, HeadsetComponent component, ref EmpPulseEvent args) diff --git a/Content.Server/Radio/EntitySystems/RadioDeviceSystem.cs b/Content.Server/Radio/EntitySystems/RadioDeviceSystem.cs index ace7d8ae31a..fc3f69a3ba2 100644 --- a/Content.Server/Radio/EntitySystems/RadioDeviceSystem.cs +++ b/Content.Server/Radio/EntitySystems/RadioDeviceSystem.cs @@ -1,5 +1,6 @@ using Content.Server.Chat.Systems; using Content.Server.Interaction; +using Content.Server.Language; using Content.Server.Popups; using Content.Server.Power.Components; using Content.Server.Power.EntitySystems; @@ -29,6 +30,7 @@ public sealed class RadioDeviceSystem : EntitySystem [Dependency] private readonly InteractionSystem _interaction = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] private readonly UserInterfaceSystem _ui = default!; + [Dependency] private readonly LanguageSystem _language = default!; // Used to prevent a shitter from using a bunch of radios to spam chat. private HashSet<(string, EntityUid)> _recentlySent = new(); @@ -208,7 +210,8 @@ private void OnReceiveRadio(EntityUid uid, RadioSpeakerComponent component, ref ("originalName", nameEv.Name)); // log to chat so people can identity the speaker/source, but avoid clogging ghost chat if there are many radios - _chat.TrySendInGameICMessage(uid, args.Message, InGameICChatType.Whisper, ChatTransmitRange.GhostRangeLimit, nameOverride: name, checkRadioPrefix: false); + var message = args.OriginalChatMsg.Message; // The chat system will handle the rest and re-obfuscate if needed. + _chat.TrySendInGameICMessage(uid, message, InGameICChatType.Whisper, ChatTransmitRange.GhostRangeLimit, nameOverride: name, checkRadioPrefix: false, languageOverride: args.Language); } private void OnBeforeIntercomUiOpen(EntityUid uid, IntercomComponent component, BeforeActivatableUIOpenEvent args) diff --git a/Content.Server/Radio/EntitySystems/RadioSystem.cs b/Content.Server/Radio/EntitySystems/RadioSystem.cs index e2a61b5022b..60aa7c2f4fb 100644 --- a/Content.Server/Radio/EntitySystems/RadioSystem.cs +++ b/Content.Server/Radio/EntitySystems/RadioSystem.cs @@ -1,10 +1,13 @@ using Content.Server.Administration.Logs; using Content.Server.Chat.Systems; +using Content.Server.Language; using Content.Server.Power.Components; using Content.Server.Radio.Components; +using Content.Server.Speech; using Content.Server.VoiceMask; using Content.Shared.Chat; using Content.Shared.Database; +using Content.Shared.Language; using Content.Shared.Radio; using Content.Shared.Radio.Components; using Content.Shared.Speech; @@ -29,6 +32,7 @@ public sealed class RadioSystem : EntitySystem [Dependency] private readonly IPrototypeManager _prototype = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly ChatSystem _chat = default!; + [Dependency] private readonly LanguageSystem _language = default!; // set used to prevent radio feedback loops. private readonly HashSet _messages = new(); @@ -44,7 +48,7 @@ private void OnIntrinsicSpeak(EntityUid uid, IntrinsicRadioTransmitterComponent { if (args.Channel != null && component.Channels.Contains(args.Channel.ID)) { - SendRadioMessage(uid, args.Message, args.Channel, uid); + SendRadioMessage(uid, args.Message, args.Channel, uid, args.Language); args.Channel = null; // prevent duplicate messages from other listeners. } } @@ -52,15 +56,23 @@ private void OnIntrinsicSpeak(EntityUid uid, IntrinsicRadioTransmitterComponent private void OnIntrinsicReceive(EntityUid uid, IntrinsicRadioReceiverComponent component, ref RadioReceiveEvent args) { if (TryComp(uid, out ActorComponent? actor)) - _netMan.ServerSendMessage(args.ChatMsg, actor.PlayerSession.Channel); + { + // Einstein-Engines - languages mechanic + var listener = component.Owner; + var msg = args.OriginalChatMsg; + if (listener != null && !_language.CanUnderstand(listener, args.Language)) + msg = args.LanguageObfuscatedChatMsg; + + _netMan.ServerSendMessage(new MsgChatMessage { Message = msg}, actor.PlayerSession.Channel); + } } /// /// Send radio message to all active radio listeners /// - public void SendRadioMessage(EntityUid messageSource, string message, ProtoId channel, EntityUid radioSource, bool escapeMarkup = true) + public void SendRadioMessage(EntityUid messageSource, string message, ProtoId channel, EntityUid radioSource, LanguagePrototype? language = null, bool escapeMarkup = true) { - SendRadioMessage(messageSource, message, _prototype.Index(channel), radioSource, escapeMarkup: escapeMarkup); + SendRadioMessage(messageSource, message, _prototype.Index(channel), radioSource, escapeMarkup: escapeMarkup, language: language); } ///
private int GetCargoSpace(EntityUid gridUid) { - var space = GetCargoPallets(gridUid).Count; + var space = GetCargoPallets(gridUid, BuySellType.Buy).Count; return space; } - private List<(EntityUid Entity, CargoPalletComponent Component, TransformComponent PalletXform)> GetCargoPallets(EntityUid gridUid) + /// GetCargoPallets(gridUid, BuySellType.Sell) to return only Sell pads + /// GetCargoPallets(gridUid, BuySellType.Buy) to return only Buy pads + private List<(EntityUid Entity, CargoPalletComponent Component, TransformComponent PalletXform)> GetCargoPallets(EntityUid gridUid, BuySellType requestType = BuySellType.All) { _pads.Clear(); + var query = AllEntityQuery(); while (query.MoveNext(out var uid, out var comp, out var compXform)) @@ -215,7 +218,13 @@ private int GetCargoSpace(EntityUid gridUid) continue; } + if ((requestType & comp.PalletType) == 0) + { + continue; + } + _pads.Add((uid, comp, compXform)); + } return _pads; @@ -275,7 +284,7 @@ private void GetPalletGoods(EntityUid gridUid, out HashSet toSell, ou amount = 0; toSell = new HashSet(); - foreach (var (palletUid, _, _) in GetCargoPallets(gridUid)) + foreach (var (palletUid, _, _) in GetCargoPallets(gridUid, BuySellType.Sell)) { // Containers should already get the sell price of their children so can skip those. _setEnts.Clear(); diff --git a/Resources/Maps/Shuttles/trading_outpost.yml b/Resources/Maps/Shuttles/trading_outpost.yml index a10f070bd25..f040d58253d 100644 --- a/Resources/Maps/Shuttles/trading_outpost.yml +++ b/Resources/Maps/Shuttles/trading_outpost.yml @@ -3,20 +3,20 @@ meta: postmapinit: false tilemap: 0: Space - 29: FloorDark - 34: FloorDarkMono - 37: FloorDarkPavementVertical - 49: FloorGrassJungle - 64: FloorMetalDiamond - 77: FloorReinforced - 89: FloorSteel - 100: FloorSteelMono - 104: FloorTechMaint - 105: FloorTechMaint2 - 118: FloorWood - 119: FloorWoodTile - 120: Lattice - 121: Plating + 31: FloorDark + 36: FloorDarkMono + 39: FloorDarkPavementVertical + 51: FloorGrassJungle + 66: FloorMetalDiamond + 79: FloorReinforced + 93: FloorSteel + 104: FloorSteelMono + 108: FloorTechMaint + 109: FloorTechMaint2 + 122: FloorWood + 124: FloorWoodTile + 125: Lattice + 126: Plating entities: - proto: "" entities: @@ -31,27 +31,27 @@ entities: chunks: 0,0: ind: 0,0 - tiles: WQAAAAABWQAAAAABTQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAABWQAAAAADeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAWQAAAAADWQAAAAADWQAAAAACWQAAAAADWQAAAAAAWQAAAAAAWQAAAAADWQAAAAAAWQAAAAABWQAAAAADWQAAAAAAIgAAAAABJQAAAAADeQAAAAAAAAAAAAAAAAAAAAAAIgAAAAAAIgAAAAAAIgAAAAABIgAAAAAAIgAAAAAAIgAAAAACIgAAAAABIgAAAAAAIgAAAAAAIgAAAAABIgAAAAACeQAAAAAATQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAATQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAdgAAAAAAdwAAAAABdwAAAAADdwAAAAACMQAAAAAAMQAAAAAAMQAAAAAAdwAAAAADdwAAAAABdwAAAAABdgAAAAACeQAAAAAATQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAdgAAAAADdwAAAAABdwAAAAADdwAAAAADdgAAAAADdgAAAAACdgAAAAADdwAAAAAAdwAAAAABdwAAAAAAdgAAAAACIgAAAAADJQAAAAACeQAAAAAAAAAAAAAAAAAAAAAAdgAAAAAAdgAAAAABdgAAAAACdgAAAAABdgAAAAAAdgAAAAACdgAAAAAAdgAAAAAAdgAAAAABdgAAAAADdgAAAAACeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: XQAAAAABXQAAAAABTwAAAAAATwAAAAAATwAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAXQAAAAABXQAAAAADfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAXQAAAAADXQAAAAADXQAAAAACXQAAAAADXQAAAAAAXQAAAAAAXQAAAAADXQAAAAAAXQAAAAABXQAAAAADXQAAAAAAJAAAAAABJwAAAAADfgAAAAAAAAAAAAAAAAAAAAAAJAAAAAAAJAAAAAAAJAAAAAABJAAAAAAAJAAAAAAAJAAAAAACJAAAAAABJAAAAAAAJAAAAAAAJAAAAAABJAAAAAACfgAAAAAATwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAATwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAegAAAAAAfAAAAAABfAAAAAADfAAAAAACMwAAAAAAMwAAAAAAMwAAAAAAfAAAAAADfAAAAAABfAAAAAABegAAAAACfgAAAAAATwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAegAAAAADfAAAAAABfAAAAAADfAAAAAADegAAAAADegAAAAACegAAAAADfAAAAAAAfAAAAAABfAAAAAAAegAAAAACJAAAAAADJwAAAAACfgAAAAAAAAAAAAAAAAAAAAAAegAAAAAAegAAAAABegAAAAACegAAAAABegAAAAAAegAAAAACegAAAAAAegAAAAAAegAAAAABegAAAAADegAAAAACfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 0,-1: ind: 0,-1 - tiles: eQAAAAAAaAAAAAAAaAAAAAAAaAAAAAAAIgAAAAAAeQAAAAAAeQAAAAAAIgAAAAABIgAAAAABHQAAAAACeQAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAIgAAAAABIgAAAAACIgAAAAAAIgAAAAAAIgAAAAABIgAAAAABIgAAAAACIgAAAAAAIgAAAAACeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAWQAAAAADWQAAAAADWQAAAAAAWQAAAAACWQAAAAADWQAAAAACWQAAAAADWQAAAAAAWQAAAAACWQAAAAABWQAAAAABeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAWQAAAAACWQAAAAAATQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAAAWQAAAAABeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAAADWQAAAAAATQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAACZAAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAWQAAAAADWQAAAAABTQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAAAWQAAAAADeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAWQAAAAACWQAAAAABTQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAADWQAAAAADeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAZAAAAAAAWQAAAAABaQAAAAAAaQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAaQAAAAAAaQAAAAAAWQAAAAAAZAAAAAACeQAAAAAAIgAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAWQAAAAACWQAAAAAAaQAAAAAAaQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAaQAAAAAAaQAAAAAAWQAAAAADWQAAAAACeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAZAAAAAAAWQAAAAAAaQAAAAAAaQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAaQAAAAAAaQAAAAAAWQAAAAABZAAAAAACeQAAAAAAIgAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAWQAAAAADTQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAADWQAAAAABeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAWQAAAAABWQAAAAACTQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAABWQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAZAAAAAACWQAAAAAATQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAADZAAAAAADeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAA + tiles: fgAAAAAAbAAAAAAAbAAAAAAAbAAAAAAAJAAAAAAAfgAAAAAAfgAAAAAAJAAAAAABJAAAAAABHwAAAAACfgAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAJAAAAAABJAAAAAACJAAAAAAAJAAAAAAAJAAAAAABJAAAAAABJAAAAAACJAAAAAAAJAAAAAACfgAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAXQAAAAADXQAAAAADXQAAAAAAXQAAAAACXQAAAAADXQAAAAACXQAAAAADXQAAAAAAXQAAAAACXQAAAAABXQAAAAABfgAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAXQAAAAACXQAAAAAATwAAAAAATwAAAAAATwAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAXQAAAAAAXQAAAAABfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaAAAAAADXQAAAAAATwAAAAAATwAAAAAATwAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAXQAAAAACaAAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAXQAAAAADXQAAAAABTwAAAAAATwAAAAAATwAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAXQAAAAAAXQAAAAADfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAXQAAAAACXQAAAAABTwAAAAAATwAAAAAATwAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAXQAAAAADXQAAAAADfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAaAAAAAAAXQAAAAABbQAAAAAAbQAAAAAAbAAAAAAAfgAAAAAAbAAAAAAAbQAAAAAAbQAAAAAAXQAAAAAAaAAAAAACfgAAAAAAJAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAXQAAAAACXQAAAAAAbQAAAAAAbQAAAAAAbAAAAAAAfgAAAAAAbAAAAAAAbQAAAAAAbQAAAAAAXQAAAAADXQAAAAACfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAaAAAAAAAXQAAAAAAbQAAAAAAbQAAAAAAbAAAAAAAfgAAAAAAbAAAAAAAbQAAAAAAbQAAAAAAXQAAAAABaAAAAAACfgAAAAAAJAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAXQAAAAAAXQAAAAADTwAAAAAATwAAAAAATwAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAXQAAAAADXQAAAAABfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAXQAAAAABXQAAAAACTwAAAAAATwAAAAAATwAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAXQAAAAABXQAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAaAAAAAACXQAAAAAATwAAAAAATwAAAAAATwAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAXQAAAAADaAAAAAADfgAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAA version: 6 -1,0: ind: -1,0 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAJQAAAAACIgAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAATQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAATQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAATQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAJQAAAAADIgAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAJwAAAAACJAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAATwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAATwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAATwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAJwAAAAADJAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 -1,-1: ind: -1,-1 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAIgAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAIgAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAJAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAJAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfgAAAAAA version: 6 0,-2: ind: 0,-2 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAIgAAAAABIgAAAAACHQAAAAACHQAAAAADHQAAAAABHQAAAAABeQAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAaAAAAAAAaAAAAAAAaAAAAAAAHQAAAAABHQAAAAACHQAAAAABIgAAAAADIgAAAAADHQAAAAACeQAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAQgAAAAAAQgAAAAAAQgAAAAAAJAAAAAABJAAAAAACHwAAAAACHwAAAAADHwAAAAABHwAAAAABfgAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAbAAAAAAAbAAAAAAAbAAAAAAAHwAAAAABHwAAAAACHwAAAAABJAAAAAADJAAAAAADHwAAAAACfgAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAA version: 6 -1,-2: ind: -1,-2 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfQAAAAAA version: 6 - type: Broadphase - type: Physics @@ -1889,276 +1889,303 @@ entities: rot: 1.5707963267948966 rad pos: 2.5,-17.5 parent: 2 -- proto: CargoPallet +- proto: CargoPalletBuy entities: - - uid: 20 - components: - - type: Transform - pos: 7.5,0.5 - parent: 2 - uid: 21 components: - type: Transform - pos: 8.5,0.5 + rot: -1.5707963267948966 rad + pos: 3.5,-9.5 parent: 2 - uid: 24 components: - type: Transform - pos: 8.5,-0.5 + rot: -1.5707963267948966 rad + pos: 2.5,-9.5 parent: 2 - uid: 25 components: - type: Transform - pos: 7.5,-0.5 + rot: -1.5707963267948966 rad + pos: 2.5,-8.5 parent: 2 - uid: 26 components: - type: Transform - pos: 7.5,-1.5 + rot: -1.5707963267948966 rad + pos: 3.5,-8.5 parent: 2 - uid: 27 components: - type: Transform - pos: 8.5,-1.5 + rot: -1.5707963267948966 rad + pos: 3.5,-7.5 parent: 2 - uid: 30 components: - type: Transform rot: -1.5707963267948966 rad - pos: 6.5,0.5 - parent: 2 - - uid: 32 - components: - - type: Transform pos: 2.5,-7.5 parent: 2 - - uid: 34 + - uid: 32 components: - type: Transform rot: -1.5707963267948966 rad - pos: 7.5,-7.5 + pos: 4.5,-9.5 parent: 2 - uid: 35 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 8.5,-7.5 + rot: 1.5707963267948966 rad + pos: 7.5,-0.5 parent: 2 - uid: 36 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 6.5,-1.5 + rot: 1.5707963267948966 rad + pos: 6.5,-0.5 parent: 2 - uid: 37 components: - type: Transform rot: -1.5707963267948966 rad - pos: 8.5,-9.5 + pos: 4.5,-7.5 parent: 2 - uid: 39 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 8.5,-8.5 + rot: 1.5707963267948966 rad + pos: 6.5,-2.5 parent: 2 - uid: 41 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 7.5,-8.5 + rot: 1.5707963267948966 rad + pos: 6.5,-1.5 parent: 2 - uid: 42 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 6.5,-8.5 + rot: 1.5707963267948966 rad + pos: 7.5,-1.5 parent: 2 - uid: 43 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 6.5,-9.5 + rot: 1.5707963267948966 rad + pos: 8.5,-2.5 parent: 2 - uid: 44 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 4.5,-0.5 + rot: 1.5707963267948966 rad + pos: 8.5,-1.5 parent: 2 - - uid: 45 + - uid: 47 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 4.5,-8.5 + rot: 1.5707963267948966 rad + pos: 8.5,0.5 parent: 2 - - uid: 46 + - uid: 49 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 6.5,-6.5 + rot: 1.5707963267948966 rad + pos: 8.5,-0.5 parent: 2 - - uid: 47 + - uid: 50 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 4.5,-9.5 + rot: 1.5707963267948966 rad + pos: 7.5,-2.5 parent: 2 - - uid: 48 + - uid: 56 components: - type: Transform rot: -1.5707963267948966 rad - pos: 6.5,-7.5 + pos: 4.5,-6.5 parent: 2 - - uid: 49 + - uid: 61 components: - type: Transform - pos: 7.5,-9.5 + rot: -1.5707963267948966 rad + pos: 4.5,-8.5 parent: 2 - - uid: 50 + - uid: 67 components: - type: Transform - pos: 3.5,-7.5 + rot: -1.5707963267948966 rad + pos: 3.5,-6.5 parent: 2 - - uid: 51 + - uid: 71 components: - type: Transform - pos: 3.5,-9.5 + rot: -1.5707963267948966 rad + pos: 2.5,-6.5 parent: 2 - - uid: 52 + - uid: 183 components: - type: Transform - pos: 3.5,-8.5 + rot: 1.5707963267948966 rad + pos: 6.5,0.5 parent: 2 - - uid: 54 + - uid: 900 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 4.5,-7.5 + rot: 1.5707963267948966 rad + pos: 7.5,0.5 parent: 2 - - uid: 55 +- proto: CargoPalletSell + entities: + - uid: 34 components: - type: Transform rot: -1.5707963267948966 rad - pos: 6.5,-2.5 + pos: 4.5,-0.5 parent: 2 - - uid: 56 + - uid: 45 components: - type: Transform - pos: 3.5,-1.5 + rot: 1.5707963267948966 rad + pos: 8.5,-7.5 parent: 2 - - uid: 57 + - uid: 46 components: - type: Transform - pos: 2.5,-8.5 + rot: -1.5707963267948966 rad + pos: 4.5,-2.5 parent: 2 - - uid: 58 + - uid: 48 components: - type: Transform - pos: 3.5,-0.5 + rot: -1.5707963267948966 rad + pos: 3.5,-2.5 parent: 2 - - uid: 59 + - uid: 51 components: - type: Transform - pos: 3.5,0.5 + rot: -1.5707963267948966 rad + pos: 3.5,-1.5 parent: 2 - - uid: 60 + - uid: 52 components: - type: Transform rot: -1.5707963267948966 rad - pos: 6.5,-0.5 + pos: 2.5,-2.5 parent: 2 - - uid: 61 + - uid: 54 components: - type: Transform - pos: 2.5,-9.5 + rot: 1.5707963267948966 rad + pos: 6.5,-9.5 parent: 2 - - uid: 66 + - uid: 55 components: - type: Transform rot: -1.5707963267948966 rad - pos: 7.5,-2.5 + pos: 2.5,-1.5 parent: 2 - - uid: 67 + - uid: 57 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 8.5,-9.5 + parent: 2 + - uid: 58 components: - type: Transform rot: -1.5707963267948966 rad - pos: 2.5,-2.5 + pos: 4.5,0.5 parent: 2 - - uid: 68 + - uid: 59 components: - type: Transform - pos: 2.5,-1.5 + rot: 1.5707963267948966 rad + pos: 8.5,-6.5 parent: 2 - - uid: 69 + - uid: 60 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 3.5,-2.5 + rot: 1.5707963267948966 rad + pos: 7.5,-7.5 parent: 2 - - uid: 70 + - uid: 66 components: - type: Transform rot: -1.5707963267948966 rad - pos: 8.5,-2.5 + pos: 3.5,0.5 parent: 2 - - uid: 71 + - uid: 68 components: - type: Transform - pos: 2.5,-0.5 + rot: 1.5707963267948966 rad + pos: 7.5,-8.5 parent: 2 - - uid: 72 + - uid: 69 components: - type: Transform - pos: 2.5,0.5 + rot: 1.5707963267948966 rad + pos: 8.5,-8.5 parent: 2 - - uid: 73 + - uid: 70 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 8.5,-6.5 + rot: 1.5707963267948966 rad + pos: 7.5,-9.5 parent: 2 - - uid: 183 + - uid: 72 components: - type: Transform - rot: -1.5707963267948966 rad + rot: 1.5707963267948966 rad pos: 7.5,-6.5 parent: 2 - - uid: 900 + - uid: 73 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 3.5,-6.5 + rot: 1.5707963267948966 rad + pos: 6.5,-6.5 parent: 2 - uid: 901 components: - type: Transform rot: -1.5707963267948966 rad - pos: 2.5,-6.5 + pos: 2.5,-0.5 parent: 2 - uid: 903 components: - type: Transform rot: -1.5707963267948966 rad - pos: 4.5,0.5 + pos: 3.5,-0.5 parent: 2 - uid: 907 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 4.5,-6.5 + rot: 1.5707963267948966 rad + pos: 7.5,-7.5 parent: 2 - uid: 908 components: - type: Transform rot: -1.5707963267948966 rad - pos: 4.5,-2.5 + pos: 4.5,-1.5 parent: 2 - uid: 909 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 6.5,-8.5 + parent: 2 + - uid: 960 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 6.5,-7.5 + parent: 2 + - uid: 961 components: - type: Transform rot: -1.5707963267948966 rad - pos: 4.5,-1.5 + pos: 2.5,0.5 parent: 2 - proto: CarpetBlack entities: diff --git a/Resources/Prototypes/Entities/Objects/Specific/Cargo/cargo_pallet.yml b/Resources/Prototypes/Entities/Objects/Specific/Cargo/cargo_pallet.yml index 925e036e09e..c628d199a90 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Cargo/cargo_pallet.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Cargo/cargo_pallet.yml @@ -21,6 +21,7 @@ mask: - MachineMask - type: CargoPallet + palletType: All - type: StaticPrice price: 100 - type: Sprite @@ -53,3 +54,33 @@ - type: GuideHelp guides: - Cargo + +- 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. + parent: CargoPallet + components: + - type: CargoPallet + palletType: sell + - type: Sprite + drawdepth: FloorTiles + layers: + - sprite: Structures/cargo_pallets.rsi + state: cargo_pallet_sell + + +- type: entity + id: CargoPalletBuy + name: cargo buying pallet + description: Designates where orders will appear when purchased. + parent: CargoPallet + components: + - type: CargoPallet + palletType: buy + - type: Sprite + drawdepth: FloorTiles + layers: + - sprite: Structures/cargo_pallets.rsi + state: cargo_pallet_buy + diff --git a/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_buy.png b/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_buy.png new file mode 100644 index 0000000000000000000000000000000000000000..024678fc209363462f2b44b707900f56c749dc56 GIT binary patch literal 551 zcmV+?0@(eDP)Px$;Ymb6R9J=WSHEk*Kp1_7xCN|8$yAPl!~GpuL`rsNagYuY2t}NVlS2_CgLIJM z{~-P^5d;UPLnMkW0jV9##r(8Y(<;JIv$xX^ff)P)a}fJf#!> zKE1Wa`bIr6|gFG#WvYB*?N1#uzB2yC!0EK`Di4nvuDvyrGNkT6~Z7 zdJRIzj)H(%1pxd50f69~&K(D8zs+}tdEeTh%`S}YTH9SQ;tbvEbU*lh%X}*Q z5AYZ_AK1sh%?JLK4>)(YM0~(|$2_QkUSk7QGd*`W)4SNon&^VU(8s8?O$<6YsM-M^ z;I~%?iTOaSy@8>J-x{Hr$A=8wsxwqtGT{6|%d)t7Pab<8J+TdVUo1&O)uQL!27Px$(Md!>R9J=Wm$7c*KoEvMTUa{DM#2>?9JcivTyI4J9w4>5Ywj7Y;u+GUbDcIt zULkK_+B*tw#Y$jBRw8_b*_>^1;2b82bo|w<|Iy4W|L7NMOsCT#&vQNkmSxe)^Bi?) z03ffETEg&qP&;?c3n4JVFf7!iK^8CGeuX1oM?PQf9_i`H9LK?qe4P8IlQv#YtlDMG zD(T!mv7T7Cu8Z-_KuT#!DNWaPky8Hid0UJ1#M-%FuQ}nxgTt?{Yx+PC1RMQ52m*jj zHMcFVP}q^r#e>6=<^BQGm7>3mlO$=<)n=`E50C!n88uRHQ|8F)1R+EzL3LZxS!xb$ z2c)wUN{LKeP@gNkTJgGGI!kMk(@6dh>`0(>J4W+;{Bn6<2VT?lt(x!Shr=PTmHqCq zl%U~IM{9n7ui^9Vz$-CyuoJCzpi9l0&^z!~AE0~9n|uwQcL&ZspkvNH@F#||5BwKC z;QjD63WbNq;C9f752&lM9>5raYG(2`EJUmuEdt~wAun*{euUmBH z16jPlj{KeBj4%v~`F#HF50l! Date: Sun, 16 Jun 2024 15:06:45 -0700 Subject: [PATCH 067/155] Update Credits (#437) This is an automated Pull Request. This PR updates the GitHub contributors in the credits section. Co-authored-by: SimpleStation Changelogs Co-authored-by: Danger Revolution! <142105406+DangerRevolution@users.noreply.github.com> --- Resources/Credits/GitHub.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Credits/GitHub.txt b/Resources/Credits/GitHub.txt index 8c54ecb084d..03d5059e95b 100644 --- a/Resources/Credits/GitHub.txt +++ b/Resources/Credits/GitHub.txt @@ -1 +1 @@ -0x6273, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 4dplanner, 612git, 778b, Ablankmann, Acruid, actioninja, adamsong, Admiral-Obvious-001, Adrian16199, Aerocrux, Aexxie, africalimedrop, Agoichi, Ahion, AJCM-git, AjexRose, Alekshhh, AlexMorgan3817, AlmondFlour, AlphaQwerty, Altoids1, amylizzle, ancientpower, ArchPigeon, Arendian, arimah, Arteben, AruMoon, as334, AsikKEsel, asperger-sind, aspiringLich, avghdev, AzzyIsNotHere, BananaFlambe, BasedUser, BGare, BingoJohnson-zz, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, Boaz1111, BobdaBiscuit, brainfood1183, Brandon-Huu, Bribrooo, Bright0, brndd, BubblegumBlue, BYONDFuckery, c4llv07e, CakeQ, CaptainSqrBeard, Carbonhell, Carolyn3114, casperr04, CatTheSystem, Centronias, chairbender, Charlese2, Cheackraze, cheesePizza2, Chief-Engineer, chromiumboy, Chronophylos, clement-or, Clyybber, ColdAutumnRain, Colin-Tel, collinlunn, ComicIronic, coolmankid12345, corentt, crazybrain23, creadth, CrigCrag, Crotalus, CrudeWax, CrzyPotato, Cyberboss, d34d10cc, Daemon, daerSeebaer, dahnte, dakamakat, dakimasu, DamianX, DangerRevolution, daniel-cr, Darkenson, DawBla, dch-GH, Deahaka, DEATHB4DEFEAT, DeathCamel58, deathride58, DebugOk, Decappi, deepdarkdepths, Delete69, deltanedas, DeltaV-Bot, DerbyX, DoctorBeard, DogZeroX, dontbetank, Doru991, DoubleRiceEddiedd, DrMelon, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, Duddino, Dutch-VanDerLinde, Easypoller, eclips_e, EdenTheLiznerd, EEASAS, Efruit, ElectroSR, elthundercloud, Emisse, EmoGarbage404, Endecc, enumerate0, eoineoineoin, ERORR404V1, Errant-4, estacaoespacialpirata, exincore, exp111, Fahasor, FairlySadPanda, ficcialfaint, Fildrance, FillerVK, Fishfish458, Flareguy, FluffiestFloof, FluidRock, FoLoKe, fooberticus, Fortune117, FoxxoTrystan, freeman2651, Fromoriss, FungiFellow, GalacticChimp, gbasood, Geekyhobo, Genkail, Git-Nivrak, github-actions[bot], gituhabu, GNF54, Golinth, GoodWheatley, Gotimanga, graevy, GreyMario, Guess-My-Name, gusxyz, h3half, Hanzdegloker, Hardly3D, harikattar, Hebiman, Henry12116, HerCoyote23, Hmeister-real, HoofedEar, hord-brayden, hubismal, Hugal31, Hyenh, iacore, IamVelcroboy, icekot8, igorsaux, ike709, Illiux, Ilya246, IlyaElDunaev, Injazz, Insineer, IntegerTempest, Interrobang01, IProduceWidgets, ItsMeThom, j-giebel, Jackal298, Jackrost, jamessimo, janekvap, JerryImMouse, Jessetriesagain, jessicamaybe, Jezithyr, jicksaw, JiimBob, JoeHammad1844, joelhed, JohnGinnane, johnku1, joshepvodka, jproads, Jrpl, juliangiebel, JustArt1m, JustCone14, JustinTether, JustinTrotter, KaiShibaa, kalane15, kalanosh, KEEYNy, Keikiru, Kelrak, kerisargit, keronshb, KIBORG04, Killerqu00, KingFroozy, kira-er, Kit0vras, KittenColony, Kmc2000, Ko4ergaPunk, komunre, koteq, Krunklehorn, Kukutis96513, kxvvv, Lamrr, LankLTE, lapatison, Leander-0, leonardo-dabepis, LetterN, Level10Cybermancer, lever1209, LightVillet, liltenhead, LittleBuilderJane, Lomcastar, LordCarve, LordEclipse, LovelyLophi, LudwigVonChesterfield, Lukasz825700516, lunarcomets, luringens, lvvova1, lzimann, lzk228, M3739, MACMAN2003, Macoron, MagnusCrowe, ManelNavola, matthst, Matz05, MehimoNemo, MeltedPixel, MemeProof, Menshin, Mervill, metalgearsloth, mhamsterr, MilenVolf, Minty642, Mirino97, mirrorcult, misandrie, MishaUnity, MisterMecky, Mith-randalf, Moneyl, Moomoobeef, moony, Morb0, Mr0maks, musicmanvr, Myakot, Myctai, N3X15, Nairodian, Naive817, namespace-Memory, NickPowers43, nikthechampiongr, Nimfar11, Nirnael, nmajask, nok-ko, Nopey, notafet, notquitehadouken, noudoit, noverd, nuke-haus, NULL882, OCOtheOmega, OctoRocket, OldDanceJacket, onoira, Owai-Seek, pali6, Pangogie, patrikturi, PaulRitter, Peptide90, peptron1, Phantom-Lily, PHCodes, PixelTheKermit, PJB3005, Plykiya, pofitlo, pointer-to-null, PolterTzi, PoorMansDreams, potato1234x, ProfanedBane, PrPleGoo, ps3moira, Psychpsyo, psykzz, PuroSlavKing, quatre, QuietlyWhisper, qwerltaz, Radosvik, Radrark, Rainbeon, Rainfey, Rane, ravage123321, rbertoche, Redict, RedlineTriad, RednoWCirabrab, RemberBM, RemieRichards, RemTim, rene-descartes2021, RiceMar1244, RieBi, Rinkashikachi, Rockdtben, rolfero, rosieposieeee, Saakra, Samsterious, SaphireLattice, ScalyChimp, scrato, Scribbles0, Serkket, SethLafuente, ShadowCommander, Shadowtheprotogen546, SignalWalker, SimpleStation14, Simyon264, SirDragooon, Sirionaut, siyengar04, Skarletto, Skrauz, Skyedra, SlamBamActionman, Slava0135, Snowni, snowsignal, SonicHDC, SoulSloth, SpaceManiac, SpeltIncorrectyl, spoogemonster, ssdaniel24, Stealthbomber16, stellar-novas, StrawberryMoses, SweptWasTaken, Szunti, TadJohnson00, takemysoult, TaralGit, Tayrtahn, tday93, TekuNut, TemporalOroboros, tentekal, tgrkzus, thatrandomcanadianguy, TheArturZh, theashtronaut, thedraccx, themias, theomund, theOperand, TheShuEd, TimrodDX, Titian3, tkdrg, tmtmtl30, tom-leys, tomasalves8, Tomeno, tosatur, Tryded, TsjipTsjip, Tunguso4ka, TurboTrackerss14, Tyler-IN, Tyzemol, UbaserB, UKNOWH, UnicornOnLSD, Uriende, UristMcDorf, Vaaankas, Varen, VasilisThePikachu, veliebm, Veritius, Verslebas, VigersRay, Visne, VMSolidus, volundr-, Voomra, Vordenburg, vulppine, waylon531, weaversam8, Willhelm53, wixoaGit, WlarusFromDaSpace, wrexbe, xRiriq, yathxyz, Ygg01, YotaXP, YuriyKiss, zach-hill, Zandario, Zap527, ZelteHonor, zerorulez, zionnBE, zlodo, ZNixian, ZoldorfTheWizard, Zumorica, Zymem +0x6273, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 4dplanner, 612git, 778b, Ablankmann, Acruid, actioninja, adamsong, Admiral-Obvious-001, Adrian16199, Aerocrux, Aexxie, africalimedrop, Agoichi, Ahion, AJCM-git, AjexRose, Alekshhh, AlexMorgan3817, AlmondFlour, AlphaQwerty, Altoids1, amylizzle, ancientpower, ArchPigeon, Arendian, arimah, Arteben, AruMoon, as334, AsikKEsel, asperger-sind, aspiringLich, avghdev, AzzyIsNotHere, BananaFlambe, BasedUser, BGare, BingoJohnson-zz, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, Boaz1111, BobdaBiscuit, brainfood1183, Brandon-Huu, Bribrooo, Bright0, brndd, BubblegumBlue, BYONDFuckery, c4llv07e, CakeQ, CaptainSqrBeard, Carbonhell, Carolyn3114, casperr04, CatTheSystem, Centronias, chairbender, Charlese2, Cheackraze, cheesePizza2, Chief-Engineer, chromiumboy, Chronophylos, clement-or, Clyybber, ColdAutumnRain, Colin-Tel, collinlunn, ComicIronic, coolmankid12345, corentt, crazybrain23, creadth, CrigCrag, Crotalus, CrudeWax, CrzyPotato, Cyberboss, d34d10cc, Daemon, daerSeebaer, dahnte, dakamakat, dakimasu, DamianX, DangerRevolution, daniel-cr, Darkenson, DawBla, dch-GH, Deahaka, DEATHB4DEFEAT, DeathCamel58, deathride58, DebugOk, Decappi, deepdarkdepths, Delete69, deltanedas, DeltaV-Bot, DerbyX, DoctorBeard, DogZeroX, dontbetank, Doru991, DoubleRiceEddiedd, DrMelon, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, Duddino, Dutch-VanDerLinde, Easypoller, eclips_e, EdenTheLiznerd, EEASAS, Efruit, ElectroSR, elthundercloud, Emisse, EmoGarbage404, Endecc, enumerate0, eoineoineoin, ERORR404V1, Errant-4, estacaoespacialpirata, exincore, exp111, Fahasor, FairlySadPanda, ficcialfaint, Fildrance, FillerVK, Fishfish458, Flareguy, FluffiestFloof, FluidRock, FoLoKe, fooberticus, Fortune117, FoxxoTrystan, freeman2651, Fromoriss, FungiFellow, GalacticChimp, gbasood, Geekyhobo, Genkail, Git-Nivrak, github-actions[bot], gituhabu, GNF54, Golinth, GoodWheatley, Gotimanga, graevy, GreyMario, Guess-My-Name, gusxyz, h3half, Hanzdegloker, Hardly3D, harikattar, Hebiman, Henry12116, HerCoyote23, Hmeister-real, HoofedEar, hord-brayden, hubismal, Hugal31, Hyenh, iacore, IamVelcroboy, icekot8, igorsaux, ike709, Illiux, Ilya246, IlyaElDunaev, Injazz, Insineer, IntegerTempest, Interrobang01, IProduceWidgets, ItsMeThom, j-giebel, Jackal298, Jackrost, jamessimo, janekvap, JerryImMouse, Jessetriesagain, jessicamaybe, Jezithyr, jicksaw, JiimBob, JoeHammad1844, joelhed, JohnGinnane, johnku1, joshepvodka, jproads, Jrpl, juliangiebel, JustArt1m, JustCone14, JustinTether, JustinTrotter, KaiShibaa, kalane15, kalanosh, KEEYNy, Keikiru, Kelrak, kerisargit, keronshb, KIBORG04, Killerqu00, KingFroozy, kira-er, Kit0vras, KittenColony, Kmc2000, Ko4ergaPunk, komunre, koteq, Krunklehorn, Kukutis96513, kxvvv, Lamrr, LankLTE, lapatison, Leander-0, leonardo-dabepis, LetterN, Level10Cybermancer, lever1209, LightVillet, liltenhead, LittleBuilderJane, Lomcastar, LordCarve, LordEclipse, LovelyLophi, LudwigVonChesterfield, Lukasz825700516, lunarcomets, luringens, lvvova1, lzimann, lzk228, M3739, MACMAN2003, Macoron, MagnusCrowe, ManelNavola, matthst, Matz05, MehimoNemo, MeltedPixel, MemeProof, Menshin, Mervill, metalgearsloth, mhamsterr, MilenVolf, Minty642, Mirino97, mirrorcult, misandrie, MishaUnity, MisterMecky, Mith-randalf, Moneyl, Moomoobeef, moony, Morb0, Mr0maks, musicmanvr, Myakot, Myctai, N3X15, Nairodian, Naive817, namespace-Memory, NickPowers43, nikthechampiongr, Nimfar11, Nirnael, nmajask, nok-ko, Nopey, notafet, notquitehadouken, noudoit, noverd, nuke-haus, NULL882, OCOtheOmega, OctoRocket, OldDanceJacket, onoira, Owai-Seek, pali6, Pangogie, patrikturi, PaulRitter, Peptide90, peptron1, Phantom-Lily, PHCodes, PixelTheKermit, PJB3005, Plykiya, pofitlo, pointer-to-null, PolterTzi, PoorMansDreams, potato1234x, ProfanedBane, PrPleGoo, ps3moira, Psychpsyo, psykzz, PuroSlavKing, quatre, QuietlyWhisper, qwerltaz, Radosvik, Radrark, Rainbeon, Rainfey, Rane, ravage123321, rbertoche, Redict, RedlineTriad, RednoWCirabrab, RemberBM, RemieRichards, RemTim, rene-descartes2021, RiceMar1244, RieBi, Rinkashikachi, Rockdtben, rolfero, rosieposieeee, Saakra, Samsterious, SaphireLattice, ScalyChimp, scrato, Scribbles0, Serkket, SethLafuente, ShadowCommander, Shadowtheprotogen546, SignalWalker, SimpleStation14, Simyon264, SirDragooon, Sirionaut, siyengar04, Skarletto, Skrauz, Skyedra, SlamBamActionman, Slava0135, Snowni, snowsignal, SonicHDC, SoulSloth, SpaceManiac, SpeltIncorrectyl, spoogemonster, ssdaniel24, Stealthbomber16, stellar-novas, StrawberryMoses, SweptWasTaken, Szunti, TadJohnson00, takemysoult, TaralGit, Tayrtahn, tday93, TekuNut, TemporalOroboros, tentekal, tgrkzus, thatrandomcanadianguy, TheArturZh, theashtronaut, thedraccx, themias, theomund, theOperand, TheShuEd, TimrodDX, Titian3, tkdrg, tmtmtl30, tom-leys, tomasalves8, Tomeno, Tornado-Technology, tosatur, Tryded, TsjipTsjip, Tunguso4ka, TurboTrackerss14, Tyler-IN, Tyzemol, UbaserB, UKNOWH, UnicornOnLSD, Uriende, UristMcDorf, Vaaankas, Varen, VasilisThePikachu, veliebm, Veritius, Verslebas, VigersRay, Visne, VMSolidus, volundr-, Voomra, Vordenburg, vulppine, waylon531, weaversam8, Willhelm53, wixoaGit, WlarusFromDaSpace, wrexbe, xRiriq, yathxyz, Ygg01, YotaXP, YuriyKiss, zach-hill, Zandario, Zap527, ZelteHonor, zerorulez, zionnBE, zlodo, ZNixian, ZoldorfTheWizard, Zumorica, Zymem From b032f9f347e53605d55bef3ad893efc4ecefb15a Mon Sep 17 00:00:00 2001 From: Pspritechologist <81725545+Pspritechologist@users.noreply.github.com> Date: Sun, 16 Jun 2024 18:14:33 -0400 Subject: [PATCH 068/155] Corpo Jacket Fixes (#462) # Description Adds hand-holes for corpo jackets pending the game being any good. Renames corpo jacket sprites for clarity and organization. ---

Media

See the bot :)

--- .../Clothing/OuterClothing/wintercoats.yml | 40 +++++++++--------- .../equipped-OUTERCLOTHING.png | Bin 9460 -> 0 bytes .../equipped-OUTERCLOTHING.png | Bin 0 -> 10509 bytes .../icon.png | Bin .../meta.json | 0 .../equipped-OUTERCLOTHING.png | Bin 0 -> 9875 bytes .../icon.png | Bin .../meta.json | 0 .../equipped-OUTERCLOTHING.png | Bin 0 -> 10492 bytes .../icon.png | Bin .../meta.json | 0 .../equipped-OUTERCLOTHING.png | Bin 0 -> 9782 bytes .../icon.png | Bin .../meta.json | 0 .../equipped-OUTERCLOTHING.png | Bin 0 -> 10959 bytes .../icon.png | Bin .../meta.json | 0 .../equipped-OUTERCLOTHING.png | Bin 0 -> 9936 bytes .../icon.png | Bin .../meta.json | 0 .../equipped-OUTERCLOTHING.png | Bin 0 -> 10546 bytes .../icon.png | Bin .../meta.json | 0 .../equipped-OUTERCLOTHING.png | Bin 0 -> 9675 bytes .../icon.png | Bin .../meta.json | 0 .../equipped-OUTERCLOTHING.png | Bin 0 -> 10494 bytes .../icon.png | Bin .../meta.json | 0 .../equipped-OUTERCLOTHING.png | Bin 0 -> 10740 bytes .../icon.png | Bin .../meta.json | 0 .../equipped-OUTERCLOTHING.png | Bin 8727 -> 0 bytes .../equipped-OUTERCLOTHING.png | Bin 9455 -> 0 bytes .../equipped-OUTERCLOTHING.png | Bin 8689 -> 0 bytes .../equipped-OUTERCLOTHING.png | Bin 9750 -> 0 bytes .../equipped-OUTERCLOTHING.png | Bin 8865 -> 0 bytes .../equipped-OUTERCLOTHING.png | Bin 8433 -> 0 bytes .../equipped-OUTERCLOTHING.png | Bin 9422 -> 0 bytes .../equipped-OUTERCLOTHING.png | Bin 9418 -> 0 bytes .../equipped-OUTERCLOTHING.png | Bin 9578 -> 0 bytes 41 files changed, 20 insertions(+), 20 deletions(-) delete mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/equipped-OUTERCLOTHING.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi/equipped-OUTERCLOTHING.png rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{bc_corpo_jacket.rsi => corpo_jacket_bishop_cybernetics.rsi}/icon.png (100%) rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{bc_corpo_jacket.rsi => corpo_jacket_bishop_cybernetics.rsi}/meta.json (100%) create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_cybersun.rsi/equipped-OUTERCLOTHING.png rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{cs_corpo_jacket.rsi => corpo_jacket_cybersun.rsi}/icon.png (100%) rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{cs_corpo_jacket.rsi => corpo_jacket_cybersun.rsi}/meta.json (100%) create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_discount_dans.rsi/equipped-OUTERCLOTHING.png rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{dd_corpo_jacket.rsi => corpo_jacket_discount_dans.rsi}/icon.png (100%) rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{dd_corpo_jacket.rsi => corpo_jacket_discount_dans.rsi}/meta.json (100%) create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_einstein_engines.rsi/equipped-OUTERCLOTHING.png rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{ee_corpo_jacket.rsi => corpo_jacket_einstein_engines.rsi}/icon.png (100%) rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{ee_corpo_jacket.rsi => corpo_jacket_einstein_engines.rsi}/meta.json (100%) create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_five_points_armory.rsi/equipped-OUTERCLOTHING.png rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{fa_corpo_jacket.rsi => corpo_jacket_five_points_armory.rsi}/icon.png (100%) rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{fa_corpo_jacket.rsi => corpo_jacket_five_points_armory.rsi}/meta.json (100%) create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_gilthari_exports.rsi/equipped-OUTERCLOTHING.png rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{ge_corpo_jacket.rsi => corpo_jacket_gilthari_exports.rsi}/icon.png (100%) rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{ge_corpo_jacket.rsi => corpo_jacket_gilthari_exports.rsi}/meta.json (100%) create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_hawkmoon_aquisitions.rsi/equipped-OUTERCLOTHING.png rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{hm_corpo_jacket.rsi => corpo_jacket_hawkmoon_aquisitions.rsi}/icon.png (100%) rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{hi_corpo_jacket.rsi => corpo_jacket_hawkmoon_aquisitions.rsi}/meta.json (100%) create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_hephestus_industries.rsi/equipped-OUTERCLOTHING.png rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{hi_corpo_jacket.rsi => corpo_jacket_hephestus_industries.rsi}/icon.png (100%) rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{hm_corpo_jacket.rsi => corpo_jacket_hephestus_industries.rsi}/meta.json (100%) create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_interdyne.rsi/equipped-OUTERCLOTHING.png rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{id_corpo_jacket.rsi => corpo_jacket_interdyne.rsi}/icon.png (100%) rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{id_corpo_jacket.rsi => corpo_jacket_interdyne.rsi}/meta.json (100%) create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_zeng_hu_pharma.rsi/equipped-OUTERCLOTHING.png rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{zh_corpo_jacket.rsi => corpo_jacket_zeng_hu_pharma.rsi}/icon.png (100%) rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{zh_corpo_jacket.rsi => corpo_jacket_zeng_hu_pharma.rsi}/meta.json (100%) delete mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi/equipped-OUTERCLOTHING.png delete mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/dd_corpo_jacket.rsi/equipped-OUTERCLOTHING.png delete mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi/equipped-OUTERCLOTHING.png delete mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/fa_corpo_jacket.rsi/equipped-OUTERCLOTHING.png delete mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/ge_corpo_jacket.rsi/equipped-OUTERCLOTHING.png delete mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/hi_corpo_jacket.rsi/equipped-OUTERCLOTHING.png delete mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/hm_corpo_jacket.rsi/equipped-OUTERCLOTHING.png delete mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/id_corpo_jacket.rsi/equipped-OUTERCLOTHING.png delete mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/zh_corpo_jacket.rsi/equipped-OUTERCLOTHING.png diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/wintercoats.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/wintercoats.yml index f3610178b9e..aa4a7b50e65 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/wintercoats.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/wintercoats.yml @@ -549,9 +549,9 @@ description: A cozy jacket with the Cybersun logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_cybersun.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_cybersun.rsi - type: entity parent: ClothingOuterWinterCoat @@ -560,9 +560,9 @@ description: A cozy jacket with the Einstein Engines logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_einstein_engines.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_einstein_engines.rsi - type: entity parent: ClothingOuterWinterCoat @@ -571,9 +571,9 @@ description: A cozy jacket with the Hephaestus Industries logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/hi_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_hephestus_industries.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/hi_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_hephestus_industries.rsi - type: entity parent: ClothingOuterWinterCoat @@ -582,9 +582,9 @@ description: A cozy jacket with the Hawkmoon Acquisitions logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/hm_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_hawkmoon_aquisitions.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/hm_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_hawkmoon_aquisitions.rsi - type: entity parent: ClothingOuterWinterCoat @@ -593,9 +593,9 @@ description: A cozy jacket with the Interdyne logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/id_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_interdyne.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/id_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_interdyne.rsi - type: entity parent: ClothingOuterWinterCoat @@ -604,9 +604,9 @@ description: A cozy jacket with the Bishop Cybernetics logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi - type: entity parent: ClothingOuterWinterCoat @@ -615,9 +615,9 @@ description: A cozy jacket with the Discount Dan's logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/dd_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_discount_dans.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/dd_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_discount_dans.rsi - type: entity parent: ClothingOuterWinterCoat @@ -626,9 +626,9 @@ description: A cozy jacket with the Five Points Armory logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/fa_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_five_points_armory.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/fa_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_five_points_armory.rsi - type: entity parent: ClothingOuterWinterCoat @@ -637,9 +637,9 @@ description: A cozy jacket with the Gilthari Exports logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/ge_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_gilthari_exports.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/ge_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_gilthari_exports.rsi - type: entity parent: ClothingOuterWinterCoat @@ -648,6 +648,6 @@ description: A cozy jacket with the Zeng-Hu Pharmaceuticals logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/zh_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_zeng_hu_pharma.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/zh_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_zeng_hu_pharma.rsi diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/equipped-OUTERCLOTHING.png deleted file mode 100644 index 5eadcdc1c1ab3fbd2bf67c5055286b407e2e4a60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9460 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 diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..35003686d555624fcac17b387f726605cd147bd7 GIT binary patch literal 10509 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi/icon.png similarity index 100% rename from Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/icon.png rename to Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi/icon.png diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi/meta.json similarity index 100% rename from Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/meta.json rename to Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi/meta.json diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_cybersun.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_cybersun.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..fe470b0074272a504eac30798883e5e2c6c5e027 GIT binary patch literal 9875 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_cybersun.rsi/icon.png similarity index 100% rename from Resources/Textures/Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi/icon.png rename to Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_cybersun.rsi/icon.png diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_cybersun.rsi/meta.json similarity index 100% rename from Resources/Textures/Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi/meta.json rename to Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_cybersun.rsi/meta.json diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_discount_dans.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_discount_dans.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..06932fff6fa7370f5410813dea7991e4cf15cae8 GIT binary patch literal 10492 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/dd_corpo_jacket.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_discount_dans.rsi/icon.png similarity index 100% rename from Resources/Textures/Clothing/OuterClothing/WinterCoats/dd_corpo_jacket.rsi/icon.png rename to Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_discount_dans.rsi/icon.png diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/dd_corpo_jacket.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_discount_dans.rsi/meta.json similarity index 100% rename from Resources/Textures/Clothing/OuterClothing/WinterCoats/dd_corpo_jacket.rsi/meta.json rename to Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_discount_dans.rsi/meta.json diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_einstein_engines.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_einstein_engines.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..553d9e2f64723d236c10d8feeb56c23836529b00 GIT binary patch literal 9782 zcmeHN2V7Ihx<52QET9XD3WBIB#XuT?gc3nPa7BtVv0z9ulmrM(lw{SlEEaZEL=nNY zA=LuNVuUOxV4+BnDxjbsC5GO~xszaF@7?#_-S^&o@BMynPneuJGv9pk{l7MIhWzNb zZSw-f<%$plEwHoQ=E%>HQ;?UJpF3AUalXoe`Sa$@U$*!gB^8b3nkzMy ztE+3RF<7Uiy?(X2x{k5#dL#;q#cHm@o137`3@})WTdnq=|xg9i=^NukS35*PD*mkKmpIvGO}`W^owlcM61r_Y{ORoA?#t*dWneB0Lk z?tMq+hpz7afx)5SkIm6ef|7vqwW4if`kBrCTHHD|G< zlRPQ#8*TI<1r@8Gf4NsMcQwYjPt`l9QgO)|?Ax{dVrUX%{~WNx|0!f&fPKZ)2+fy~ z0>+bB1QDTeQIyVA>HiBQDJN&rMwrNa9a?6&)2-IRM%cnECmvS~e$#2-vh~KbjOR;h ziR1wo+Rx{3kE<0Ei&NaUtK>5|yT~oMKF)5kt&Zus!HN2s{BmwR4E5B+t((e$q3>bH z^I_S@nWj*YQE*o-Z`BqbLf)C6sLU|N$nHc7L4zPFea8|NCu?YSQDqjF2omT*oL@;_ zC%$6LbxY%edjrOt!O*}dlhh=6e9$%eTGi0a(?7zHgXUN#4DE^Tb(jc;p%UW6uwS%( zD>i|Z)8nqkG>kd7jIDpmRrCaglA@>BFmz}0$hv7WZhPW%M0Up{Co6yRq}NRsoh?a) zNA;pKzrlCwl{F_dgdUvCp+C^eX2%^>aoQmFrMRY=60?QV9c8}?;yY55&%b}6@$CG0 z*M_DK4-H3%iK3r7_w%?%n5aZ{k4H7G`H|bvV%{jXGLIV#L+Ks^6?{ztlyJ9;Zh4Gr z*)L6TZOH6oD>e7<;^~R(*FRTt@Wp!bPI3hrd}8eT&Ijy77;^QzO&2ZiE~-3v@>1K| zZqtEJnnKf?sed{JKJh3FykVxDO;SNVk)0rJsp)TZ)MTV584&uE;LoAorWO< z480-N=9>Fji%JHFRc1otus;7{)W=9)w^o-)3*qaJ&CzWoL$`VyrtiHAd^f(6-&h_v zG;{}N5^=6pXS6e_FwzEl3mASy6X%W>;*4jMPTE4{Yf(DTOv$FxNAh6kQA3VKX8bFw z#qqi1T=dx}o@wM#FykN$iKk?NDKTKm<+P@psF%OiafB1bclu#yICbTY(f0Sn<~=D# z@l`3gS*Gk=HcPT~HYy6$TKR6gbKgWYoqNnfiDKemsG2Cs^IqO-fEdi_7#4VveeAY9 zi+iW0XVg{hx;ixdRYs?IGK1fc?=C!8fgwIVMP4ZyPAJP!ck4WHy3M!HC@e_<>diGAKG5)rW%eZe895CSui9e%6``42`u@u#FBhq$!K1M!YCFh7Djlm+4#r5UexsOf@`0jTulpw5C+~gIU ztW_X!aT`7z+b~tp!fZZMKb*Gw;!eo<#29vQqf?m{YkHSuOVQ!Gu+|sd8g-ngrOS~FeDFxESpm&D(P`@2;s4w zO;m^UFYtk()pUn7UW#?1Rug+Odg&A~ojJ}KF5me&GBNBKFVwUx9fo|l)k;%b5CBfw z9=%;*ouJ-j!xX4y2rOP?b~f|O@42QNI2oPgKMs8OV2$dL>>(pXoohcyf{x|U5Sdsy z-65zKM0*yb%hil@jsk3lxWlPi*Z~J$1kqPgX^dUBaDzRr!7G#=OkW?pjPn<%cLE~C zjK+jsPN!y{p(uOb*d7N%!9ltyal|LrE&j%pVQgXbFUxN3eA~nC%IK(@THQJ{3`0M` z(8Lf7^=eM+hoPt3=?K0=Wfo%C+qS2JP}NGEseyS&4wXux_V5{Kc}QESN0d;PMR&NI@R2$zq>IqmR`XNJ>Z?{GP+cA zU(%&G#*&uOboEm;1m4}4 z@fP8A^sgR2_-IkV zd)Lg<=-*~g>g?`j+Nl4ds1k;5d5w(%*N^@>JJ;t_UhJhNm!OdhX&+)1 zw<}g;4nws!y1yk-JDjdX>B~5NO+BAe(EsmyYABBAHz>{*#N+sKZefbcR}Z-Ls2~=G z?h(7%VMrZVv2xauc_%Vw6Ylht5odEEKe8W-Ohtqpboc0m{Z(KaT%zJ59r#BbTf zPcgaPkJHe>8KjkR7qUT0KkA2xy#An>f10uF^5y&5Y$tcB;g^+si0jR*E|KK2RGK<> zX_v#K;UxE_OV@zK4(3|yt7_DpG)~ET(I96Eh8ChuaZkG>e>AYD%z4+8V?OBU=J2!< zBoSNb*@ERv8IeYW*_=^YS>ogPP7BeiLpw#w_>)T;`C)ucMO!f{u|MSpDn6)$?Pqq| z=3034kqqFkyemcQh?v;=sXHyK=7joUlshqp+Xdo697S$M0+0|wIYL?~3@wqY+CCp# zlG1+e?l75JXb|&@{xkpUyYEyrDWvnvw!7w6G=&Na&n{`^MP11AJRh^K``{0HgrEU@ zl+LwBn3^vk{W-M3oq%Iyg*N5%Ct>_cRJw-*8{3JA?_uc45$0Q@l z&g;Q=@xs6Iz^#VJ%(9t%N~ckky9Sjz0o5D**eONLX+T=ZOO zbtX!AnuiLVv)(hzhgf+JcajtP5y$H}FD9EOL9hb-9+<3^V~xeZkbqB}ZYjGALnra& z#KOD!y2XyM>vPP~Hr?KGJ)C<4Y!)(jVBh5IJv%w5<|cWLThJ@w+jDB~_JrAMHm+n% zWi~_~>?FSRbUt?~BS)KI($KqmV7lu;L|9{(Xq5SyyO5jiDJlmB;ExGGYE7$ejEpWF z9~GAPk(U7vYzfgT+j0MH;N!ykAso#_mR9uRmOb36%)|*gz?e+D%kKi4L$Tw(5`rvz zZ=zC?&sF`b+#CkXV;xpU5{EKNZ(oagXBO}WX+?%FDg^t+M9IF<>DgN$MzhPKWEunb z)y6i$Q2q42Nv}!G^pJ=3$I@Eg9Z*cLdC2Xe8|_buyi6B{F~Pb!QT>P?QJJ4LNsk@u zZAfS+4-~2HoHP{yEw=NgBUU-5sh%_QqXZ15H5(r9Y$|hcKTB`fv9 zkiN*1Rq+6XVwzrITKvthT%?`Ni@pC4aygHTVaU*{PpQYl$ULv4Vf5hT9CE&HQA5<0 z?vj9oJ{#D(!bWnYkzkVyR=FDPmsNSE-ia3tnfFsh-MwfHVBJU<%W$9EDZ0o7Ib+(# z*XO{!$$0K>{D~UEZB>hoNEIiK6<;^RUpL1Z@6+oV!=^5Ww&(j41^OlnDn7Dj_AJ}^ z+5E2KA|lA+>91V8yGBeG2RfaLdiS;Y`q%k1Hmxj+HM4^u1AZT|3qUCqus`hS^+^U8pDqYLE-U{KbzY= z-k@IOwcX!ZPcc+E@TudK-fP-tJdbL-C}dluF8nr@V|nh_nxZ170EEfdJ&%xpz}i;@ zuFA5+4e=WBD!Xqyf!7{gf?BCQ+TNU3(rmh6pUXvBNSSmT^Kuu(sH&M%#-BJ3JEsX)&~7rpXKupu($uhp2_~C1)vYZa8iIF$^dET?{7GJ z1UuL|6fpTD&>xOqyX+638ah+itdJlw)jE{Q3|>8(1%>=&d_YK$p9BttY)JK^`U6rn zm=*QADa8kaUq*;kKxg;|NJar=|Bf=4LHnw#-^nKKk-(WP2pIl_@9(HTW0w#EDtmjv zCKfqFES}vab8Yeb1PY7Hpb#WgZ*L5eh9_eXcrqD>z#3yQ2yeW%34($#!6LDE9LfYu zo5jkG$qptl$y6~bz}$cV_)u`hI5LffMNmw{EKDdkgbB{r8-X;&Vo4~P2@;FL&SK#Z z!~kAN@|!J{m=y)EqT)~(B+{6Qz+tFV1Qv}&BJf67G=hXeQZU9S43L#1VMQSmY*<15 zBw$X4KZ#B?3}DhF9b$zOEFJC4wb2I1uPu&#q+l8tV6MHD!3+ui+Tp_Rr*01>iM5F` zMwwvocq|5Igu&yD&|it%s6lMtiDI6TBVI|5*enD91}K&!_EW$>(hjf?HU?2i!K@$` z7R%3E`^(|*mu`CyP83owX%i`!3YdO5E_V5RT#P`11LPU;#q8`^6b5boe?%<~9xXFK z4@_>$V1xPhOPXdPYCAP>=4s~9k0A*qEiFk<5J==12y9X)l_HT7@S5o&?;|nkRFFMB zx$Eb4#vix>5{EaUQ7IIJH-YJz!j)i1Rm>+M3S&56a|g@J$E*X792(jqFT~{ z9)YfadrA({wRGGWObRQEt^0fWuzggq9e~P!ju0563mPpxYBw_0HvHGa1BcuuWN!)? zfj1#x5LgPCguo-wz}>M(8t`~B-h@2ko?n#rUx8O)u;70P*#8N5WN$o)iXnLe zP)H*XeJEf!V>AlXjFH|T$nhAQ@$aqiZ^M&>*}r2u90FzZ_wN45f@X%|jQ`nR%?$s+ zqh|29OVDaZ_UeY z2OEM6R*Q>N_)TIcXp|4Ov$vN2Fh?1}D^DcP&j3HeVA^f6bO~=1#1%MHJF1uPn-u*$ zb{$qIP~G0P>oxVzlOIwK$-K2{`*Fo_jYnhQovoAr8`m-^?nv#9ZpuE;N~QP6)^PX~Jarrw`le-`79qatG(Lyet9{tqZn|Hkl?{)~fbi zsWFRD!p(WN^pr02QuTzYoUM!0+Y97MUUY)Y=2oo)J)Jd7>Bz?$I0e5oroL$}z)$2H zIGfHA+-;Caar6}pweQIbztVCoZch4Siu_NxmZkelb>cO=ZJG|1E_krgA#vjM{_6&@ zWA!i1Tpj1!mEACr$BMZmf45Nm1^D^UlWKp3AAQIX&(FxksqPxC=q|g}!%}66mTYP@ zf-E~-Cxq0@t!(Hh*CRWLUoZGiA;JSqR5(@$&ivKFt=C`yw^glA$d`{^ka%wDM z-G`C#iUh*|rx>Mn4a)j`H9bZPdO3MJJ8aL#=Rq8zg&68&}$~`l_+q4$Y!#cjYrKDM64AfgawxY9wzVGU;-Jz0Bg+>#7a+p0f5F z>V(dR8GDaE+d&pgo9f?}^LtZJdT`RmPrvc`{c#1TFW1A*m%-b-T&8g022N0|PvC(b zO}}&-W_?CM#NIsX`-@eo@sD*KVk1S@wqD3zzf$3_7Wm7M7mzH(7~xMgR( LZBvHT-ot+bfr+RI literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_einstein_engines.rsi/icon.png similarity index 100% rename from Resources/Textures/Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi/icon.png rename to Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_einstein_engines.rsi/icon.png diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_einstein_engines.rsi/meta.json similarity index 100% rename from Resources/Textures/Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi/meta.json rename to Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_einstein_engines.rsi/meta.json diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_five_points_armory.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_five_points_armory.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..19b5dc75afffdae7d345415572ef0d33fb92b869 GIT binary patch literal 10959 zcmeHNcU)7+_P_LE0TmS$0Z|tO11Xdw0#OkaT|ns~$c7XQEkHtz5WB0QtOc7E8!XUZX*M$>;i6P}liPBOZg2kc4J|Ydk1uP*(xhbWmtVrsgUF z_1B=tPktv>LC{Wc_vO0D%6gk7S|5ef$6&#DB-#*syve9ZIm`JQ3@B=qM7LdHGtemWjyquhzf`Yu_OqE$PXUv$nXzn~Em8FX{)R!(+ zQ`20budS)IdbygKj>)RkNR*+Wp@ufj42w3^#~7l;Oe7Q(6lTttsXA+xDtejPGW4JR zzz?B0@?x2!B(xyOITBKHB;coz29Q%mV)8Qu1>8$YNz2H}$tx(%00cS8Voga&N=wPe zNK1p>NYD>S&yktC47E;n-gcs#R-g)c->D?|-kX4N9>R}z06KSbM_GUg%_F+?RW zv@7K|!bi@8+;~mnp(A|G1p!a*Wl3L8Iitr+x7{vyW$FA7>n+D-T->?*WQB&HXqF5jrS)~G@1EB0(gJPaLj$V#?+ZT?#u45f58-`Gm$I_K)$VAidt3$dl^mRb8V4f&}(9abWx{B!X&o zJlj*(>4Y95-|gM?43m&VO5I>jW5S#C>Q_t|mF;W46{q4uNo>E!WTEzpfqO6{+tp^? zQjv8T=WsgODa9r*Rh{M=!8us45{Be+8wizAmHf+z1Eti){KE36k#@Jkrvg8O^YpvA zdt+QXh7IQW4sd?M09BOQrsf2U2N(C6d>rZ>&YD=Mcs6hj|5z>O1EVFQB6D53K7Y6; z|5C)Sal&gKqXeY`gA=&&z}{}R;Ab5ENnRpoXuyFbPcKxw&r@NSrcNlq5GAW1YO%h4 zI&ZK}4Xd`{eynz`Euzlm@e_f^D`9W!N787h7j8s7w#v;dd`Xmh9e0mIbxj8h&BJ_v zp{L0L9x!{L#CwOd51&XYxlq{H{fUCV^>iyQPIsrCN7aW3DHuX23A|wFj+#T@3fhxY*?9(ROQ{CK!M^a~7al#`KoGn$HQN*uCH2+r8ZjT0!-N3d7_GEG% z<>R<{Lm8ta%+A)-|&HH#^AuFqGhim8q z9^afh#9mXz?e8uoNOkUrWec{7F0fm8LhqiEZLwDCt`DwcWxQ!A?N`3GDAnAl+skKU z)>hGuC_=^UEPc}x9R04gBHivXZoTourI5BFA8otH1m{KN>}!4pQgt1cFZxtF7C+i? zD&yy~?fI$n7mL*;VCei2;T;&N%Q)CiKgelbAkY}6*GE-yL_2(ef8Xae3H9ht9&q0j zRSHfB_%Ni7iWabHQjhy`npX)ldd!g9hp z521HcpLv?_5|HujSb|sFgiEmri&eWRH`_HO-2FqgUv!Iw(iVfuu4bWQ>T$q8&L>D z3UWd`41KT_vvo|+SVBUKsq$~8nWtP+N%Ry_lTK&YxTm|y`T zbq|YXWvV;e;AAh4o3-EJ+N;L8Pv^h}>f=om zvL6yMf2!h-Xm~Xa_&1&$&Ajf&cT^E9a!T#~shQK2r)xhQeUYEUq_}4ZV+)>fVzBE=K`O5cXs#HWBoA> zU$pu6b;_!A8&AYEm~xwZ>tdSA8Hs)Av1WxObt8K&<&uh4Wg{uTx&9#8$>4zw`cOuM z|0!Wos|e%@busV2aJF~-Wo*p8c7v~7N@zN5FX)g ziWBfm%D8>q#i*W0p9@8|1R8OIGQr>kwiqQcG6JdLeM(+?RrLF73zO`Q>D)N+hxu&g zn>WHcuY|2-=Rs5lJAvZr-=%WQngts5BCp;(*?JmJCb#8Gnq90_PzeJcyIlUh)hEwy z>D#w#%(ugJ6Q3O`fFVp2`+#b(nXn_Zj@=;CO}7J?9O9YcvB1{juZw>tv|Vamo?s*I zjQ`t_vUM(;}oWW*!KAz!|TFtJ}tbNHgMJ-W%BNb|REBD@W-jn
@@ -68,8 +80,11 @@ public void SendRadioMessage(EntityUid messageSource, string message, ProtoId /// Entity that spoke the message /// Entity that picked up the message and will send it, e.g. headset - public void SendRadioMessage(EntityUid messageSource, string message, RadioChannelPrototype channel, EntityUid radioSource, bool escapeMarkup = true) + public void SendRadioMessage(EntityUid messageSource, string message, RadioChannelPrototype channel, EntityUid radioSource, LanguagePrototype? language = null, bool escapeMarkup = true) { + if (language == null) + language = _language.GetLanguage(messageSource); + // TODO if radios ever garble / modify messages, feedback-prevention needs to be handled better than this. if (!_messages.Add(message)) return; @@ -84,6 +99,7 @@ public void SendRadioMessage(EntityUid messageSource, string message, RadioChann name = FormattedMessage.EscapeText(name); + // most radios are relayed to chat, so lets parse the chat message beforehand SpeechVerbPrototype speech; if (mask != null && mask.Enabled @@ -99,24 +115,15 @@ public void SendRadioMessage(EntityUid messageSource, string message, RadioChann ? FormattedMessage.EscapeText(message) : message; - var wrappedMessage = Loc.GetString(speech.Bold ? "chat-radio-message-wrap-bold" : "chat-radio-message-wrap", - ("color", channel.Color), - ("fontType", speech.FontId), - ("fontSize", speech.FontSize), - ("verb", Loc.GetString(_random.Pick(speech.SpeechVerbStrings))), - ("channel", $"\\[{channel.LocalizedName}\\]"), - ("name", name), - ("message", content)); + var wrappedMessage = WrapRadioMessage(messageSource, channel, name, content); + var msg = new ChatMessage(ChatChannel.Radio, content, wrappedMessage, NetEntity.Invalid, null); - // most radios are relayed to chat, so lets parse the chat message beforehand - var chat = new ChatMessage( - ChatChannel.Radio, - message, - wrappedMessage, - NetEntity.Invalid, - null); - var chatMsg = new MsgChatMessage { Message = chat }; - var ev = new RadioReceiveEvent(message, messageSource, channel, chatMsg); + // ... you guess it + var obfuscated = _language.ObfuscateSpeech(content, language); + var obfuscatedWrapped = WrapRadioMessage(messageSource, channel, name, obfuscated); + var notUdsMsg = new ChatMessage(ChatChannel.Radio, obfuscated, obfuscatedWrapped, NetEntity.Invalid, null); + + var ev = new RadioReceiveEvent(messageSource, channel, msg, notUdsMsg, language); var sendAttemptEv = new RadioSendAttemptEvent(channel, radioSource); RaiseLocalEvent(ref sendAttemptEv); @@ -162,10 +169,23 @@ public void SendRadioMessage(EntityUid messageSource, string message, RadioChann else _adminLogger.Add(LogType.Chat, LogImpact.Low, $"Radio message from {ToPrettyString(messageSource):user} on {channel.LocalizedName}: {message}"); - _replay.RecordServerMessage(chat); + _replay.RecordServerMessage(msg); _messages.Remove(message); } + private string WrapRadioMessage(EntityUid source, RadioChannelPrototype channel, string name, string message) + { + var speech = _chat.GetSpeechVerb(source, message); + return Loc.GetString(speech.Bold ? "chat-radio-message-wrap-bold" : "chat-radio-message-wrap", + ("color", channel.Color), + ("fontType", speech.FontId), + ("fontSize", speech.FontSize), + ("verb", Loc.GetString(_random.Pick(speech.SpeechVerbStrings))), + ("channel", $"\\[{channel.LocalizedName}\\]"), + ("name", name), + ("message", FormattedMessage.EscapeText(message))); + } + /// private bool HasActiveServer(MapId mapId, string channelId) { diff --git a/Content.Server/Radio/RadioEvent.cs b/Content.Server/Radio/RadioEvent.cs index 69d764ffe67..35220d1d757 100644 --- a/Content.Server/Radio/RadioEvent.cs +++ b/Content.Server/Radio/RadioEvent.cs @@ -1,10 +1,22 @@ using Content.Shared.Chat; +using Content.Shared.Language; using Content.Shared.Radio; namespace Content.Server.Radio; +/// +/// The message to display when the speaker can understand "language" +/// The message to display when the speaker cannot understand "language" +/// [ByRefEvent] -public readonly record struct RadioReceiveEvent(string Message, EntityUid MessageSource, RadioChannelPrototype Channel, MsgChatMessage ChatMsg); +public readonly record struct RadioReceiveEvent( + // Einstein-Engines - languages mechanic + EntityUid MessageSource, + RadioChannelPrototype Channel, + ChatMessage OriginalChatMsg, + ChatMessage LanguageObfuscatedChatMsg, + LanguagePrototype Language +); /// /// Use this event to cancel sending message per receiver diff --git a/Content.Server/Speech/EntitySystems/ListeningSystem.cs b/Content.Server/Speech/EntitySystems/ListeningSystem.cs index ea3569e055c..f2a625600ca 100644 --- a/Content.Server/Speech/EntitySystems/ListeningSystem.cs +++ b/Content.Server/Speech/EntitySystems/ListeningSystem.cs @@ -8,6 +8,7 @@ namespace Content.Server.Speech.EntitySystems; /// public sealed class ListeningSystem : EntitySystem { + [Dependency] private readonly ChatSystem _chat = default!; [Dependency] private readonly SharedTransformSystem _xforms = default!; public override void Initialize() @@ -18,10 +19,10 @@ public override void Initialize() private void OnSpeak(EntitySpokeEvent ev) { - PingListeners(ev.Source, ev.Message, ev.ObfuscatedMessage); + PingListeners(ev.Source, ev.Message, ev.IsWhisper); } - public void PingListeners(EntityUid source, string message, string? obfuscatedMessage) + public void PingListeners(EntityUid source, string message, bool isWhisper) { // TODO whispering / audio volume? Microphone sensitivity? // for now, whispering just arbitrarily reduces the listener's max range. @@ -32,7 +33,7 @@ public void PingListeners(EntityUid source, string message, string? obfuscatedMe var attemptEv = new ListenAttemptEvent(source); var ev = new ListenEvent(message, source); - var obfuscatedEv = obfuscatedMessage == null ? null : new ListenEvent(obfuscatedMessage, source); + var obfuscatedEv = !isWhisper ? null : new ListenEvent(_chat.ObfuscateMessageReadability(message), source); var query = EntityQueryEnumerator(); while(query.MoveNext(out var listenerUid, out var listener, out var xform)) diff --git a/Content.Shared/Input/ContentKeyFunctions.cs b/Content.Shared/Input/ContentKeyFunctions.cs index ee4a4e9023b..0b72ac5ee74 100644 --- a/Content.Shared/Input/ContentKeyFunctions.cs +++ b/Content.Shared/Input/ContentKeyFunctions.cs @@ -25,6 +25,7 @@ public static class ContentKeyFunctions public static readonly BoundKeyFunction CycleChatChannelBackward = "CycleChatChannelBackward"; public static readonly BoundKeyFunction EscapeContext = "EscapeContext"; public static readonly BoundKeyFunction OpenCharacterMenu = "OpenCharacterMenu"; + public static readonly BoundKeyFunction OpenLanguageMenu = "OpenLanguageMenu"; public static readonly BoundKeyFunction OpenCraftingMenu = "OpenCraftingMenu"; public static readonly BoundKeyFunction OpenGuidebook = "OpenGuidebook"; public static readonly BoundKeyFunction OpenInventoryMenu = "OpenInventoryMenu"; diff --git a/Content.Shared/Language/Components/LanguageSpeakerComponent.cs b/Content.Shared/Language/Components/LanguageSpeakerComponent.cs new file mode 100644 index 00000000000..95232ffe6ff --- /dev/null +++ b/Content.Shared/Language/Components/LanguageSpeakerComponent.cs @@ -0,0 +1,29 @@ +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; + +namespace Content.Shared.Language; + +[RegisterComponent, AutoGenerateComponentState] +public sealed partial class LanguageSpeakerComponent : Component +{ + /// + /// The current language the entity may use to speak. + /// Other listeners will hear the entity speak in this language. + /// + [ViewVariables(VVAccess.ReadWrite)] + [AutoNetworkedField] + public string CurrentLanguage = default!; + + /// + /// List of languages this entity can speak. + /// + [ViewVariables] + [DataField("speaks", customTypeSerializer: typeof(PrototypeIdListSerializer), required: true)] + public List SpokenLanguages = new(); + + /// + /// List of languages this entity can understand. + /// + [ViewVariables] + [DataField("understands", customTypeSerializer: typeof(PrototypeIdListSerializer), required: true)] + public List UnderstoodLanguages = new(); +} diff --git a/Content.Shared/Language/Components/TranslatorImplanterComponent.cs b/Content.Shared/Language/Components/TranslatorImplanterComponent.cs new file mode 100644 index 00000000000..401e8a8b8aa --- /dev/null +++ b/Content.Shared/Language/Components/TranslatorImplanterComponent.cs @@ -0,0 +1,35 @@ +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; + +namespace Content.Shared.Language.Components; + +/// +/// An item that, when used on a mob, adds an intrinsic translator to it. +/// +[RegisterComponent] +public sealed partial class TranslatorImplanterComponent : Component +{ + [DataField("spoken", customTypeSerializer: typeof(PrototypeIdListSerializer))] + public List SpokenLanguages = new(); + + [DataField("understood", customTypeSerializer: typeof(PrototypeIdListSerializer))] + public List UnderstoodLanguages = new(); + + /// + /// The list of languages the mob must understand in order for this translator to have effect. + /// Knowing one language is enough. + /// + [DataField("requires", customTypeSerializer: typeof(PrototypeIdListSerializer))] + public List RequiredLanguages = new(); + + /// + /// If true, only allows to use this implanter on mobs. + /// + [DataField] + public bool MobsOnly = true; + + /// + /// Whether this implant has been used already. + /// + [DataField] + public bool Used = false; +} diff --git a/Content.Shared/Language/Components/Translators/BaseTranslatorComponent.cs b/Content.Shared/Language/Components/Translators/BaseTranslatorComponent.cs new file mode 100644 index 00000000000..a66c9be082e --- /dev/null +++ b/Content.Shared/Language/Components/Translators/BaseTranslatorComponent.cs @@ -0,0 +1,47 @@ +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; + +namespace Content.Shared.Language.Components.Translators; + +public abstract partial class BaseTranslatorComponent : Component +{ + // TODO may need to be removed completely, it's a part of legacy code that never ended up being used. + /// + /// The language this translator changes the speaker's language to when they don't specify one. + /// If null, does not modify the default language. + /// + [DataField("defaultLanguage")] + [ViewVariables(VVAccess.ReadWrite)] + public string? DefaultLanguageOverride = null; + + /// + /// The list of additional languages this translator allows the wielder to speak. + /// + [DataField("spoken", customTypeSerializer: typeof(PrototypeIdListSerializer))] + public List SpokenLanguages = new(); + + /// + /// The list of additional languages this translator allows the wielder to understand. + /// + [DataField("understood", customTypeSerializer: typeof(PrototypeIdListSerializer))] + public List UnderstoodLanguages = new(); + + /// + /// The languages the wielding MUST know in order for this translator to have effect. + /// The field [RequiresAllLanguages] indicates whether all of them are required, or just one. + /// + [DataField("requires", customTypeSerializer: typeof(PrototypeIdListSerializer))] + public List RequiredLanguages = new(); + + /// + /// If true, the wielder must understand all languages in [RequiredLanguages] to speak [SpokenLanguages], + /// and understand all languages in [RequiredLanguages] to understand [UnderstoodLanguages]. + /// + /// Otherwise, at least one language must be known (or the list must be empty). + /// + [DataField("requiresAll")] + [ViewVariables(VVAccess.ReadWrite)] + public bool RequiresAllLanguages = false; + + [DataField("enabled"), ViewVariables(VVAccess.ReadWrite)] + public bool Enabled = true; +} diff --git a/Content.Shared/Language/Components/Translators/HandheldTranslatorComponent.cs b/Content.Shared/Language/Components/Translators/HandheldTranslatorComponent.cs new file mode 100644 index 00000000000..f900603f01d --- /dev/null +++ b/Content.Shared/Language/Components/Translators/HandheldTranslatorComponent.cs @@ -0,0 +1,15 @@ +namespace Content.Shared.Language.Components.Translators; + +/// +/// A translator that must be held in a hand or a pocket of an entity in order ot have effect. +/// +[RegisterComponent] +public sealed partial class HandheldTranslatorComponent : Translators.BaseTranslatorComponent +{ + /// + /// Whether or not interacting with this translator + /// toggles it on or off. + /// + [DataField("toggleOnInteract")] + public bool ToggleOnInteract = true; +} diff --git a/Content.Shared/Language/Components/Translators/HoldsTranslatorComponent.cs b/Content.Shared/Language/Components/Translators/HoldsTranslatorComponent.cs new file mode 100644 index 00000000000..caea9b9a948 --- /dev/null +++ b/Content.Shared/Language/Components/Translators/HoldsTranslatorComponent.cs @@ -0,0 +1,11 @@ +namespace Content.Shared.Language.Components.Translators; + +/// +/// Applied internally to the holder of [HandheldTranslatorComponent]. +/// Do not use directly. Use [HandheldTranslatorComponent] instead. +/// +[RegisterComponent] +public sealed partial class HoldsTranslatorComponent : IntrinsicTranslatorComponent +{ + public Component? Issuer = null; +} diff --git a/Content.Shared/Language/Components/Translators/ImplantedTranslatorComponent.cs b/Content.Shared/Language/Components/Translators/ImplantedTranslatorComponent.cs new file mode 100644 index 00000000000..d1d72e83ed7 --- /dev/null +++ b/Content.Shared/Language/Components/Translators/ImplantedTranslatorComponent.cs @@ -0,0 +1,9 @@ +namespace Content.Shared.Language.Components.Translators; + +/// +/// Applied to entities who were injected with a translator implant. +/// +[RegisterComponent] +public sealed partial class ImplantedTranslatorComponent : IntrinsicTranslatorComponent +{ +} diff --git a/Content.Shared/Language/Components/Translators/IntrinsicTranslatorComponent.cs b/Content.Shared/Language/Components/Translators/IntrinsicTranslatorComponent.cs new file mode 100644 index 00000000000..d8def4ac1de --- /dev/null +++ b/Content.Shared/Language/Components/Translators/IntrinsicTranslatorComponent.cs @@ -0,0 +1,10 @@ +namespace Content.Shared.Language.Components.Translators; + +/// +/// A translator attached to an entity that translates its speech. +/// An example is a translator implant that allows the speaker to speak another language. +/// +[RegisterComponent, Virtual] +public partial class IntrinsicTranslatorComponent : Translators.BaseTranslatorComponent +{ +} diff --git a/Content.Shared/Language/Components/UniversalLanguageSpeakerComponent.cs b/Content.Shared/Language/Components/UniversalLanguageSpeakerComponent.cs new file mode 100644 index 00000000000..6f5ad1178b8 --- /dev/null +++ b/Content.Shared/Language/Components/UniversalLanguageSpeakerComponent.cs @@ -0,0 +1,11 @@ +namespace Content.Shared.Language.Components; + +// +// Signifies that this entity can speak and understand any language. +// Applies to such entities as ghosts. +// +[RegisterComponent] +public sealed partial class UniversalLanguageSpeakerComponent : Component +{ + +} diff --git a/Content.Shared/Language/Events/LanguagesSetMessage.cs b/Content.Shared/Language/Events/LanguagesSetMessage.cs new file mode 100644 index 00000000000..f7a78210aaf --- /dev/null +++ b/Content.Shared/Language/Events/LanguagesSetMessage.cs @@ -0,0 +1,13 @@ +using Robust.Shared.Serialization; + +namespace Content.Shared.Language.Events; + +/// +/// Sent from the client to the server when it needs to want to set his currentLangauge. +/// Yeah im using this instead of ExecuteCommand... Better right? +/// +[Serializable, NetSerializable] +public sealed class LanguagesSetMessage(string currentLanguage) : EntityEventArgs +{ + public string CurrentLanguage = currentLanguage; +} diff --git a/Content.Shared/Language/Events/LanguagesUpdateEvent.cs b/Content.Shared/Language/Events/LanguagesUpdateEvent.cs new file mode 100644 index 00000000000..90ce2f4446b --- /dev/null +++ b/Content.Shared/Language/Events/LanguagesUpdateEvent.cs @@ -0,0 +1,8 @@ +namespace Content.Shared.Language.Events; + +/// +/// Raised on an entity when its list of languages changes. +/// +public sealed class LanguagesUpdateEvent : EntityEventArgs +{ +} diff --git a/Content.Shared/Language/Events/LanguagesUpdatedMessage.cs b/Content.Shared/Language/Events/LanguagesUpdatedMessage.cs new file mode 100644 index 00000000000..563f036df6d --- /dev/null +++ b/Content.Shared/Language/Events/LanguagesUpdatedMessage.cs @@ -0,0 +1,15 @@ +using Robust.Shared.Serialization; + +namespace Content.Shared.Language.Events; + +/// +/// Sent to the client when its list of languages changes. +/// The client should in turn update its HUD and relevant systems. +/// +[Serializable, NetSerializable] +public sealed class LanguagesUpdatedMessage(string currentLanguage, List spoken, List understood) : EntityEventArgs +{ + public string CurrentLanguage = currentLanguage; + public List Spoken = spoken; + public List Understood = understood; +} diff --git a/Content.Shared/Language/Events/RequestLanguagesMessage.cs b/Content.Shared/Language/Events/RequestLanguagesMessage.cs new file mode 100644 index 00000000000..aead1f4cd1a --- /dev/null +++ b/Content.Shared/Language/Events/RequestLanguagesMessage.cs @@ -0,0 +1,10 @@ +using Robust.Shared.Serialization; + +namespace Content.Shared.Language.Events; + +/// +/// Sent from the client to the server when it needs to learn the list of languages its entity knows. +/// This event should always be followed by a , unless the client doesn't have an entity. +/// +[Serializable, NetSerializable] +public sealed class RequestLanguagesMessage : EntityEventArgs; diff --git a/Content.Shared/Language/LanguagePrototype.cs b/Content.Shared/Language/LanguagePrototype.cs new file mode 100644 index 00000000000..801ab8a393b --- /dev/null +++ b/Content.Shared/Language/LanguagePrototype.cs @@ -0,0 +1,37 @@ +using System.Runtime.CompilerServices; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Language; + +[Prototype("language")] +public sealed class LanguagePrototype : IPrototype +{ + [IdDataField] + public string ID { get; private set; } = default!; + + /// + /// If true, obfuscated phrases of creatures speaking this language will have their syllables replaced with "replacement" syllables. + /// Otherwise entire sentences will be replaced. + /// + [DataField(required: true)] + public bool ObfuscateSyllables; + + /// + /// Lists all syllables that are used to obfuscate a message a listener cannot understand if obfuscateSyllables is true. + /// Otherwise uses all possible phrases the creature can make when trying to say anything. + /// + [DataField(required: true)] + public List Replacement = []; + + #region utility + /// + /// The in-world name of this language, localized. + /// + public string Name => Loc.GetString($"language-{ID}-name"); + + /// + /// The in-world description of this language, localized. + /// + public string Description => Loc.GetString($"language-{ID}-description"); + #endregion utility +} diff --git a/Content.Shared/Language/Systems/SharedLanguageSystem.cs b/Content.Shared/Language/Systems/SharedLanguageSystem.cs new file mode 100644 index 00000000000..e2eeb8bb493 --- /dev/null +++ b/Content.Shared/Language/Systems/SharedLanguageSystem.cs @@ -0,0 +1,39 @@ +using Content.Shared.Actions; +using Robust.Shared.Prototypes; +using Robust.Shared.Random; + +namespace Content.Shared.Language.Systems; + +public abstract class SharedLanguageSystem : EntitySystem +{ + /// + /// The language used as a fallback in cases where an entity suddenly becomes a language speaker (e.g. the usage of make-sentient) + /// + [ValidatePrototypeId] + public static readonly string FallbackLanguagePrototype = "GalacticCommon"; + + /// + /// The language whose speakers are assumed to understand and speak every language. Should never be added directly. + /// + [ValidatePrototypeId] + public static readonly string UniversalPrototype = "Universal"; + + /// + /// A cached instance of + /// + public static LanguagePrototype Universal { get; private set; } = default!; + + [Dependency] protected readonly IPrototypeManager _prototype = default!; + [Dependency] protected readonly IRobustRandom _random = default!; + + public override void Initialize() + { + Universal = _prototype.Index("Universal"); + } + + public LanguagePrototype? GetLanguagePrototype(string id) + { + _prototype.TryIndex(id, out var proto); + return proto; + } +} diff --git a/Content.Shared/Language/Systems/SharedTranslatorImplanterSystem.cs b/Content.Shared/Language/Systems/SharedTranslatorImplanterSystem.cs new file mode 100644 index 00000000000..a13225378cd --- /dev/null +++ b/Content.Shared/Language/Systems/SharedTranslatorImplanterSystem.cs @@ -0,0 +1,36 @@ +using Content.Shared.Examine; +using Content.Shared.Implants.Components; +using Content.Shared.Language.Components; +using Robust.Shared.Serialization; + +namespace Content.Shared.Language.Systems; + +public abstract class SharedTranslatorImplanterSystem : EntitySystem +{ + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnExamined); + } + + private void OnExamined(EntityUid uid, TranslatorImplanterComponent component, ExaminedEvent args) + { + if (!args.IsInDetailsRange) + return; + + var text = !component.Used + ? Loc.GetString("translator-implanter-ready") + : Loc.GetString("translator-implanter-used"); + + args.PushText(text); + } + + protected void OnAppearanceChange(EntityUid implanter, TranslatorImplanterComponent component) + { + var used = component.Used; + _appearance.SetData(implanter, ImplanterVisuals.Full, !used); + } +} diff --git a/Content.Shared/Language/Systems/SharedTranslatorSystem.cs b/Content.Shared/Language/Systems/SharedTranslatorSystem.cs new file mode 100644 index 00000000000..08a016efa9c --- /dev/null +++ b/Content.Shared/Language/Systems/SharedTranslatorSystem.cs @@ -0,0 +1,34 @@ +using Content.Shared.Examine; +using Content.Shared.Toggleable; +using Content.Shared.Language.Components.Translators; + +namespace Content.Shared.Language.Systems; + +public abstract class SharedTranslatorSystem : EntitySystem +{ + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnExamined); + } + + private void OnExamined(EntityUid uid, HandheldTranslatorComponent component, ExaminedEvent args) + { + var state = Loc.GetString(component.Enabled + ? "translator-enabled" + : "translator-disabled"); + + args.PushMarkup(state); + } + + protected void OnAppearanceChange(EntityUid translator, HandheldTranslatorComponent? comp = null) + { + if (comp == null && !TryComp(translator, out comp)) + return; + + _appearance.SetData(translator, ToggleVisuals.Toggled, comp.Enabled); + } +} diff --git a/Resources/Locale/en-US/language/commands.ftl b/Resources/Locale/en-US/language/commands.ftl new file mode 100644 index 00000000000..32fa5415b8c --- /dev/null +++ b/Resources/Locale/en-US/language/commands.ftl @@ -0,0 +1,8 @@ +command-list-langs-desc = List languages your current entity can speak at the current moment. +command-list-langs-help = Usage: {$command} + +command-saylang-desc = Send a message in a specific language. +command-saylang-help = Usage: {$command} . Example: {$command} GalacticCommon "Hello World!" + +command-language-select-desc = Select the currently spoken language of your entity. +command-language-select-help = Usage: {$command} . Example: {$command} GalacticCommon diff --git a/Resources/Locale/en-US/language/language-menu.ftl b/Resources/Locale/en-US/language/language-menu.ftl new file mode 100644 index 00000000000..83687d0f1a6 --- /dev/null +++ b/Resources/Locale/en-US/language/language-menu.ftl @@ -0,0 +1,4 @@ +language-menu-window-title = Language Menu +language-menu-current-language = Current Language: {$language} +language-menu-description-header = Description +ui-options-function-open-language-menu = Open language Menu diff --git a/Resources/Locale/en-US/language/languages.ftl b/Resources/Locale/en-US/language/languages.ftl new file mode 100644 index 00000000000..69c5d0a4a76 --- /dev/null +++ b/Resources/Locale/en-US/language/languages.ftl @@ -0,0 +1,71 @@ +language-Universal-name = Universal +language-Universal-description = What are you? + +language-GalacticCommon-name = Galactic common +language-GalacticCommon-description = The standard Galatic language, most commonly used for inter-species communications and legal work. + +language-Bubblish-name = Bubblish +language-Bubblish-description = The language of Slimes. Being a mixture of bubbling noises and pops it's very difficult to speak for humans without the use of mechanical aids. + +language-RootSpeak-name = Rootspeak +language-RootSpeak-description = The strange whistling-style language spoken by the Diona. + +language-Nekomimetic-name = Nekomimetic +language-Nekomimetic-description = To the casual observer, this language is an incomprehensible mess of broken Japanese. To the felinids, it's somehow comprehensible. + +language-Draconic-name = Draconic +language-Draconic-description = The common language of lizard-people, composed of sibilant hisses and rattles. + +language-SolCommon-name = Sol common +language-SolCommon-description = The language common to species from the Sol System. + +language-Canilunzt-name = Canilunzt +language-Canilunzt-description = The guttural language spoken and utilized by the inhabitants of the Vazzend system, composed of growls, barks, yaps, and heavy utilization of ears and tail movements. Vulpkanin speak this language with ease. + +language-Moffic-name = Moffic +language-Moffic-description = The language of the mothpeople borders on complete unintelligibility. + +language-RobotTalk-name = RobotTalk +language-RobotTalk-description = A language consisting of harsh binary chirps, whistles, hisses, and whines. Organic tongues cannot speak it without aid from special translators. + +language-Cat-name = Cat +language-Cat-description = Meow + +language-Dog-name = Dog +language-Dog-description = Bark! + +language-Fox-name = Fox +language-Fox-description = Yeeps! + +language-Xeno-name = Xeno +language-Xeno-description = Sssss! + +language-Monkey-name = Monkey +language-Monkey-description = oooook! + +language-Mouse-name = Mouse +language-Mouse-description = Squeeek! + +language-Chicken-name = Chicken +language-Chicken-description = Coot! + +language-Duck-name = Duck +language-Duck-description = Quack! + +language-Cow-name = Cow +language-Cow-description = Moooo! + +language-Sheep-name = Sheep +language-Sheep-description = Baaah! + +language-Kangaroo-name = Kangaroo +language-Kangaroo-description = Chuu! + +language-Pig-name = Pig +language-Pig-description = Oink! + +language-Crab-name = Crab +language-Crab-description = Click! + +language-Kobold-name = Kobold +language-Kobold-description = Hiss! diff --git a/Resources/Locale/en-US/language/technologies.ftl b/Resources/Locale/en-US/language/technologies.ftl new file mode 100644 index 00000000000..901a48061c5 --- /dev/null +++ b/Resources/Locale/en-US/language/technologies.ftl @@ -0,0 +1,2 @@ +research-technology-basic-translation = Basic Translation +research-technology-advanced-translation = Advanced Translation diff --git a/Resources/Locale/en-US/language/translator.ftl b/Resources/Locale/en-US/language/translator.ftl new file mode 100644 index 00000000000..b2a1e9b2b8c --- /dev/null +++ b/Resources/Locale/en-US/language/translator.ftl @@ -0,0 +1,8 @@ +translator-component-shutoff = The {$translator} shuts off. +translator-component-turnon = The {$translator} turns on. +translator-enabled = It appears to be active. +translator-disabled = It appears to be disabled. +translator-implanter-refuse = The {$implanter} has no effect on {$target}. +translator-implanter-success = The {$implanter} successfully injected {$target}. +translator-implanter-ready = This implanter appears to be ready to use. +translator-implanter-used = This implanter seems empty. diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/animals.yml index 92615131f05..e932974a0f4 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/animals.yml @@ -66,6 +66,11 @@ - type: Tag tags: - VimPilot + - type: LanguageSpeaker + speaks: + - Fox + understands: + - Fox - type: entity name: security dog @@ -154,8 +159,6 @@ spawned: - id: FoodMeat amount: 2 - - type: ReplacementAccent - accent: dog - type: InteractionPopup successChance: 0.5 interactSuccessString: petting-success-dog @@ -176,3 +179,9 @@ tags: - DoorBumpOpener - VimPilot + - type: LanguageSpeaker + speaks: + - Dog + understands: + - Dog + - GalacticCommon diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/familiars.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/familiars.yml index 771da36719f..fa51b99325c 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/familiars.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/familiars.yml @@ -95,6 +95,11 @@ factions: - PsionicInterloper - NanoTrasen + - type: LanguageSpeaker + speaks: + - GalacticCommon + understands: + - GalacticCommon - type: GhostTakeoverAvailable - type: GhostRole makeSentient: true diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/nukiemouse.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/nukiemouse.yml index 96950317c1f..c2ae33ec0ba 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/nukiemouse.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/nukiemouse.yml @@ -96,8 +96,12 @@ spawned: - id: FoodMeat amount: 1 - - type: ReplacementAccent - accent: mouse + - type: LanguageSpeaker + speaks: + - Mouse + understands: + - Mouse + - GalacticCommon - type: Tag tags: - VimPilot @@ -163,4 +167,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/Mobs/Species/harpy.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/harpy.yml index a4498299c9a..18437e074dd 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/harpy.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/harpy.yml @@ -122,12 +122,19 @@ - type: MovementSpeedModifier baseWalkSpeed: 2.5 baseSprintSpeed: 5.0 - - type: Inventory + - type: Inventory speciesId: harpy templateId: digitigrade - type: HarpyVisuals - type: UltraVision - + - type: LanguageSpeaker + speaks: + - GalacticCommon + - SolCommon + understands: + - GalacticCommon + - SolCommon + - type: entity save: false name: Urist McHands @@ -138,7 +145,7 @@ components: - type: HumanoidAppearance species: Harpy - - type: Inventory + - type: Inventory speciesId: harpy - type: Sprite scale: 0.9, 0.9 diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/vulpkanin.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/vulpkanin.yml index 4a187d51b33..52853d696a2 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/vulpkanin.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/vulpkanin.yml @@ -97,6 +97,13 @@ Female: FemaleVulpkanin Unsexed: MaleVulpkanin - type: DogVision + - type: LanguageSpeaker + speaks: + - GalacticCommon + - Canilunzt + understands: + - GalacticCommon + - Canilunzt - type: entity save: false diff --git a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml index dec46df0b53..0645e451af2 100644 --- a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml +++ b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml @@ -213,6 +213,13 @@ visMask: - PsionicInvisibility - Normal + - type: LanguageSpeaker + speaks: + - GalacticCommon + - RobotTalk + understands: + - GalacticCommon + - RobotTalk - type: entity id: BaseBorgChassisNT diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index 378b3f8a9d8..369544fdc1b 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -48,8 +48,11 @@ flavorKind: station-event-random-sentience-flavor-organic - type: Bloodstream bloodMaxVolume: 50 - - type: ReplacementAccent - accent: mouse + - type: LanguageSpeaker + speaks: + - Mouse + understands: + - Mouse - type: MeleeWeapon soundHit: path: /Audio/Effects/bite.ogg @@ -229,8 +232,11 @@ - type: EggLayer eggSpawn: - id: FoodEgg - - type: ReplacementAccent - accent: chicken + - type: LanguageSpeaker + speaks: + - Chicken + understands: + - Chicken - type: SentienceTarget flavorKind: station-event-random-sentience-flavor-organic - type: NpcFactionMember @@ -504,8 +510,11 @@ prob: 0.5 - type: Extractable grindableSolutionName: food - - type: ReplacementAccent - accent: mothroach + - type: LanguageSpeaker + speaks: + - Moffic + understands: + - Moffic - type: ZombieAccentOverride accent: zombieMoth - type: Vocal @@ -601,8 +610,11 @@ - type: EggLayer eggSpawn: - id: FoodEgg - - type: ReplacementAccent - accent: duck + - type: LanguageSpeaker + speaks: + - Duck + understands: + - Duck - type: SentienceTarget flavorKind: station-event-random-sentience-flavor-organic - type: NpcFactionMember @@ -839,8 +851,11 @@ interactSuccessSpawn: EffectHearts interactSuccessSound: path: /Audio/Voice/Arachnid/arachnid_chitter.ogg - - type: ReplacementAccent - accent: crab + - type: LanguageSpeaker + speaks: + - Crab + understands: + - Crab - type: Bloodstream bloodMaxVolume: 50 bloodReagent: CopperBlood @@ -1076,8 +1091,11 @@ - type: Inventory speciesId: kangaroo templateId: kangaroo - - type: ReplacementAccent - accent: kangaroo + - type: LanguageSpeaker + speaks: + - Kangaroo + understands: + - Kangaroo - type: InventorySlots - type: Strippable - type: Butcherable @@ -1266,7 +1284,12 @@ - type: Speech speechSounds: Monkey speechVerb: Monkey - - type: MonkeyAccent + - type: LanguageSpeaker + speaks: + - Monkey + understands: + - Monkey + - Kobold - type: SentienceTarget flavorKind: station-event-random-sentience-flavor-primate - type: AlwaysRevolutionaryConvertible @@ -1300,7 +1323,13 @@ - type: Speech speechSounds: Monkey speechVerb: Monkey - - type: MonkeyAccent + - type: LanguageSpeaker + speaks: + - Monkey + understands: + - Monkey + - Kobold + - GalacticCommon - type: NpcFactionMember factions: - Syndicate @@ -1339,8 +1368,12 @@ - type: NameIdentifier group: Kobold - type: LizardAccent - - type: ReplacementAccent - accent: kobold + - type: LanguageSpeaker + speaks: + - Kobold + understands: + - Kobold + - Monkey - type: Speech speechSounds: Lizard speechVerb: Reptilian @@ -1568,8 +1601,11 @@ spawned: - id: FoodMeatRat amount: 1 - - type: ReplacementAccent - accent: mouse + - type: LanguageSpeaker + speaks: + - Mouse + understands: + - Mouse - type: Tag tags: - Trash @@ -1894,6 +1930,11 @@ path: /Audio/Animals/parrot_raught.ogg - type: Bloodstream bloodMaxVolume: 50 + - type: LanguageSpeaker + speaks: + - GalacticCommon + understands: + - GalacticCommon - type: entity name: penguin @@ -2140,8 +2181,11 @@ - type: MeleeChemicalInjector transferAmount: 0.75 solution: melee - - type: ReplacementAccent - accent: xeno + - type: LanguageSpeaker + speaks: + - Xeno + understands: + - Xeno - type: InteractionPopup successChance: 0.5 interactSuccessString: petting-success-tarantula @@ -2472,6 +2516,11 @@ - type: Tag tags: - VimPilot + - type: LanguageSpeaker + speaks: + - Fox + understands: + - Fox - type: entity name: corgi @@ -2518,8 +2567,11 @@ spawned: - id: FoodMeat amount: 2 - - type: ReplacementAccent - accent: dog + - type: LanguageSpeaker + speaks: + - Dog + understands: + - Dog - type: InteractionPopup interactSuccessString: petting-success-dog interactFailureString: petting-failure-generic @@ -2671,8 +2723,11 @@ spawned: - id: FoodMeat amount: 3 - - type: ReplacementAccent - accent: cat + - type: LanguageSpeaker + speaks: + - Cat + understands: + - Cat - type: InteractionPopup successChance: 0.7 interactSuccessString: petting-success-cat @@ -2739,6 +2794,12 @@ - type: NpcFactionMember factions: - Syndicate + - type: LanguageSpeaker + speaks: + - Xeno + understands: + - Xeno + - GalacticCommon - type: entity name: space cat @@ -3034,8 +3095,11 @@ spawned: - id: FoodMeat amount: 1 - - type: ReplacementAccent - accent: mouse + - type: LanguageSpeaker + speaks: + - Mouse + understands: + - Mouse - type: Tag tags: - VimPilot @@ -3141,8 +3205,11 @@ interactSuccessSpawn: EffectHearts interactSuccessSound: path: /Audio/Animals/pig_oink.ogg - - type: ReplacementAccent - accent: pig + - type: LanguageSpeaker + speaks: + - Pig + understands: + - Pig - type: SentienceTarget flavorKind: station-event-random-sentience-flavor-organic - type: NpcFactionMember @@ -3228,6 +3295,12 @@ reformTime: 10 popupText: diona-reform-attempt reformPrototype: MobDionaReformed + - type: LanguageSpeaker + speaks: + - RootSpeak + understands: + - GalacticCommon + - RootSpeak - type: entity parent: MobDionaNymph diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/argocyte.yml b/Resources/Prototypes/Entities/Mobs/NPCs/argocyte.yml index 39e68b63a78..3bcf8e7a16f 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/argocyte.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/argocyte.yml @@ -15,8 +15,11 @@ - type: Sprite sprite: Mobs/Aliens/Argocyte/argocyte_common.rsi - type: SolutionContainerManager - - type: ReplacementAccent - accent: xeno + - type: LanguageSpeaker + speaks: + - Xeno + understands: + - Xeno - type: Bloodstream bloodReagent: FerrochromicAcid bloodMaxVolume: 75 #we don't want the map to become pools of blood diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml b/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml index 9981bb8bd92..8ca1b2d2f0e 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml @@ -36,6 +36,12 @@ - VimPilot - type: StealTarget stealGroup: AnimalIan + - type: LanguageSpeaker + speaks: + - Dog + understands: + - GalacticCommon + - Dog - type: entity name: Old Ian @@ -121,6 +127,12 @@ tags: - CannotSuicide - VimPilot + - type: LanguageSpeaker + speaks: + - Cat + understands: + - GalacticCommon + - Cat - type: entity name: Exception @@ -139,6 +151,12 @@ tags: - CannotSuicide - VimPilot + - type: LanguageSpeaker + speaks: + - Cat + understands: + - GalacticCommon + - Cat - type: entity name: Floppa @@ -288,8 +306,12 @@ spawned: - id: FoodMeat amount: 2 - - type: ReplacementAccent - accent: dog + - type: LanguageSpeaker + speaks: + - Dog + understands: + - GalacticCommon + - Dog - type: InteractionPopup successChance: 0.5 interactSuccessString: petting-success-dog @@ -387,8 +409,12 @@ spawned: - id: FoodMeat amount: 3 - - type: ReplacementAccent - accent: dog + - type: LanguageSpeaker + speaks: + - Dog + understands: + - GalacticCommon + - Dog - type: InteractionPopup successChance: 0.7 interactSuccessString: petting-success-dog @@ -546,6 +572,12 @@ - VimPilot - type: StealTarget stealGroup: AnimalRenault + - type: LanguageSpeaker + speaks: + - Fox + understands: + - GalacticCommon + - Fox - type: entity name: Hamlet @@ -593,6 +625,12 @@ - CannotSuicide - Hamster - VimPilot + - type: LanguageSpeaker + speaks: + - Mouse + understands: + - GalacticCommon + - Mouse - type: entity name: Shiva @@ -765,6 +803,12 @@ attributes: proper: true gender: female + - type: LanguageSpeaker + speaks: + - Bubblish + understands: + - GalacticCommon + - Bubblish - type: entity name: Pun Pun @@ -799,6 +843,13 @@ attributes: proper: true gender: male + - type: LanguageSpeaker + speaks: + - Monkey + understands: + - GalacticCommon + - Monkey + - Kobold - type: entity name: Tropico @@ -826,3 +877,9 @@ # - type: AlwaysRevolutionaryConvertible - type: StealTarget stealGroup: AnimalTropico + - type: LanguageSpeaker + speaks: + - Crab + understands: + - GalacticCommon + - Crab diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml b/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml index 89a6f16e525..50fe3b6765e 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml @@ -119,6 +119,13 @@ attributes: gender: male - type: PotentialPsionic # Nyano + - type: LanguageSpeaker + speaks: + - GalacticCommon + - Mouse + understands: + - GalacticCommon + - Mouse - type: entity id: MobRatKingBuff @@ -289,6 +296,12 @@ - type: Food - type: Item size: Tiny # Delta V - Make them eatable and pickable. + - type: LanguageSpeaker + speaks: + - Mouse + understands: + - GalacticCommon + - Mouse - type: weightedRandomEntity id: RatKingLoot diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/revenant.yml b/Resources/Prototypes/Entities/Mobs/NPCs/revenant.yml index ec1ed3a58f6..1316aefc50b 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/revenant.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/revenant.yml @@ -97,6 +97,7 @@ - RevenantTheme - type: Speech speechVerb: Ghost + - type: UniversalLanguageSpeaker - type: Tag tags: - NoPaint diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/shadows.yml b/Resources/Prototypes/Entities/Mobs/NPCs/shadows.yml index f08fe36544e..9559ae3a0c0 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/shadows.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/shadows.yml @@ -36,7 +36,7 @@ speedModifierThresholds: 60: 0.7 80: 0.5 - + - type: entity name: shadow cat parent: BaseShadowMob @@ -50,8 +50,11 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: cat - type: Physics - - type: ReplacementAccent - accent: cat + - type: LanguageSpeaker + speaks: + - Cat + understands: + - Cat - type: InteractionPopup successChance: 0.01 # you cant pet shadow cat... almost interactSuccessString: petting-success-cat @@ -64,4 +67,4 @@ gender: epicene - type: Tag tags: - - VimPilot \ No newline at end of file + - VimPilot diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml b/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml index 42b7ff9e211..e3166c15f6e 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml @@ -107,6 +107,13 @@ - type: TypingIndicator proto: robot - type: ZombieImmune + - type: LanguageSpeaker + speaks: + - GalacticCommon + - RobotTalk + understands: + - GalacticCommon + - RobotTalk - type: entity parent: MobSiliconBase diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml b/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml index c64479369a6..901bf149cbc 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml @@ -111,8 +111,11 @@ successChance: 0.5 interactSuccessString: petting-success-slimes interactFailureString: petting-failure-generic - - type: ReplacementAccent - accent: slimes + - type: LanguageSpeaker + speaks: + - Bubblish + understands: + - Bubblish - type: GhostTakeoverAvailable - type: GhostRole makeSentient: true diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/space.yml b/Resources/Prototypes/Entities/Mobs/NPCs/space.yml index 0a294805cfd..9ea2d784dbb 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/space.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/space.yml @@ -165,8 +165,11 @@ - type: FootstepModifier footstepSoundCollection: collection: FootstepBounce - - type: ReplacementAccent - accent: kangaroo + - type: LanguageSpeaker + speaks: + - Kangaroo + understands: + - Kangaroo - type: InventorySlots - type: Strippable - type: UserInterface @@ -248,8 +251,11 @@ - type: MeleeChemicalInjector solution: melee transferAmount: 4 - - type: ReplacementAccent - accent: xeno + - type: LanguageSpeaker + speaks: + - Xeno + understands: + - Xeno - type: InteractionPopup successChance: 0.20 interactSuccessString: petting-success-tarantula @@ -351,8 +357,11 @@ - type: MeleeChemicalInjector solution: melee transferAmount: 6 - - type: ReplacementAccent - accent: xeno + - type: LanguageSpeaker + speaks: + - Xeno + understands: + - Xeno - type: InteractionPopup successChance: 0.2 interactSuccessString: petting-success-snake @@ -373,4 +382,4 @@ parent: MobCobraSpace suffix: "Salvage Ruleset" components: - - type: SalvageMobRestrictions \ No newline at end of file + - type: SalvageMobRestrictions diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml b/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml index d0ac6fc0265..26553a2f1f2 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml @@ -125,6 +125,11 @@ chance: -2 - type: Psionic #Nyano - Summary: makes psionic by default. removable: false + - type: LanguageSpeaker + speaks: + - Xeno + understands: + - Xeno - type: entity name: Praetorian @@ -234,6 +239,13 @@ - type: Tag tags: - CannotSuicide + - type: LanguageSpeaker + speaks: + - GalacticCommon + - Xeno + understands: + - GalacticCommon + - Xeno - type: entity name: Ravager diff --git a/Resources/Prototypes/Entities/Mobs/Player/observer.yml b/Resources/Prototypes/Entities/Mobs/Player/observer.yml index 8f3e6c13466..0086be81d9a 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/observer.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/observer.yml @@ -53,6 +53,7 @@ - type: Tag tags: - BypassInteractionRangeChecks + - type: UniversalLanguageSpeaker # Ghosts should understand any language. - type: entity id: ActionGhostBoo diff --git a/Resources/Prototypes/Entities/Mobs/Player/replay_observer.yml b/Resources/Prototypes/Entities/Mobs/Player/replay_observer.yml index ad9b37f63e1..07deef857c3 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/replay_observer.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/replay_observer.yml @@ -7,3 +7,4 @@ - type: MovementSpeedModifier baseSprintSpeed: 24 baseWalkSpeed: 16 + - type: UniversalLanguageSpeaker diff --git a/Resources/Prototypes/Entities/Mobs/Species/base.yml b/Resources/Prototypes/Entities/Mobs/Species/base.yml index a610e04d6dd..67212d416fe 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/base.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/base.yml @@ -141,7 +141,7 @@ - Pacified - StaminaModifier - PsionicsDisabled #Nyano - Summary: PCs can have psionics disabled. - - PsionicallyInsulated #Nyano - Summary: PCs can be made insulated from psionic powers. + - PsionicallyInsulated #Nyano - Summary: PCs can be made insulated from psionic powers. - type: Reflect enabled: false reflectProb: 0 @@ -218,7 +218,12 @@ - type: MobPrice price: 1500 # Kidnapping a living person and selling them for cred is a good move. deathPenalty: 0.01 # However they really ought to be living and intact, otherwise they're worth 100x less. - - type: CanEscapeInventory # Carrying system from nyanotrasen. + - type: CanEscapeInventory # Carrying system from nyanotrasen. + - type: LanguageSpeaker # This is here so all with no LanguageSpeaker at least spawn with the default languages. + speaks: + - GalacticCommon + understands: + - GalacticCommon - type: Tag tags: - CanPilot diff --git a/Resources/Prototypes/Entities/Mobs/Species/diona.yml b/Resources/Prototypes/Entities/Mobs/Species/diona.yml index 3d405c4dd91..5cb3de6f168 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/diona.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/diona.yml @@ -102,6 +102,13 @@ actionPrototype: DionaGibAction allowedStates: - Dead + - type: LanguageSpeaker + speaks: + - GalacticCommon + - RootSpeak + understands: + - GalacticCommon + - RootSpeak - type: entity parent: BaseSpeciesDummy diff --git a/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml b/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml index fe36754b9b5..7afc5cddd70 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml @@ -52,6 +52,13 @@ accent: dwarf - type: Speech speechSounds: Bass + - type: LanguageSpeaker + speaks: + - GalacticCommon + - SolCommon + understands: + - GalacticCommon + - SolCommon - type: entity parent: BaseSpeciesDummy diff --git a/Resources/Prototypes/Entities/Mobs/Species/human.yml b/Resources/Prototypes/Entities/Mobs/Species/human.yml index 7bf96efe2cc..7c3f857c001 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/human.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/human.yml @@ -17,6 +17,13 @@ - id: FoodMeatHuman amount: 5 - type: PotentialPsionic #Nyano - Summary: makes potentially psionic. + - type: LanguageSpeaker + speaks: + - GalacticCommon + - SolCommon + understands: + - GalacticCommon + - SolCommon - type: entity parent: BaseSpeciesDummy diff --git a/Resources/Prototypes/Entities/Mobs/Species/moth.yml b/Resources/Prototypes/Entities/Mobs/Species/moth.yml index 1680dd6cda6..39aa0ab8dea 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/moth.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/moth.yml @@ -23,6 +23,13 @@ accent: zombieMoth - type: Speech speechVerb: Moth + - type: LanguageSpeaker + speaks: + - GalacticCommon + - Moffic + understands: + - GalacticCommon + - Moffic - type: TypingIndicator proto: moth - type: Butcherable diff --git a/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml b/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml index 09e86b19968..bdea4499ed1 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml @@ -59,6 +59,13 @@ types: Heat : 1.5 #per second, scales with temperature & other constants - type: Wagging + - type: LanguageSpeaker + speaks: + - GalacticCommon + - Draconic + understands: + - GalacticCommon + - Draconic - type: entity parent: BaseSpeciesDummy diff --git a/Resources/Prototypes/Entities/Mobs/Species/slime.yml b/Resources/Prototypes/Entities/Mobs/Species/slime.yml index 481afd06a3c..a601010ef94 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/slime.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/slime.yml @@ -74,6 +74,13 @@ types: Asphyxiation: -1.0 maxSaturation: 15 + - type: LanguageSpeaker + speaks: + - GalacticCommon + - Bubblish + understands: + - GalacticCommon + - Bubblish - type: entity parent: MobHumanDummy diff --git a/Resources/Prototypes/Entities/Objects/Devices/translator_implants.yml b/Resources/Prototypes/Entities/Objects/Devices/translator_implants.yml new file mode 100644 index 00000000000..fc947efe9a3 --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Devices/translator_implants.yml @@ -0,0 +1,132 @@ +- type: entity + abstract: true + id: BaseTranslatorImplanter + parent: [ BaseItem ] + name: basic translator implant + description: Translates speech. + components: + - type: Sprite + sprite: Objects/Specific/Medical/implanter.rsi + state: implanter0 + layers: + - state: implanter1 + map: [ "implantFull" ] + visible: true + - state: implanter0 + map: [ "implantBroken" ] + - type: Appearance + - type: GenericVisualizer + visuals: + enum.ImplanterVisuals.Full: + implantFull: + True: {visible: true} + False: {visible: false} + implantBroken: + True: {visible: false} + False: {visible: true} + +- type: entity + id: BasicGalaticCommonTranslatorImplanter + parent: [ BaseTranslatorImplanter ] + name: basic Galactic Common translator implant + description: An implant giving the ability to understand Galactic Common. + components: + - type: TranslatorImplanter + understood: + - GalacticCommon + +- type: entity + id: AdvancedGalaticCommonTranslatorImplanter + parent: [ BaseTranslatorImplanter ] + name: advanced Galactic Common translator implant + description: An implant giving the ability to understand and speak Galactic Common. + components: + - type: TranslatorImplanter + spoken: + - GalacticCommon + understood: + - GalacticCommon + +- type: entity + id: BubblishTranslatorImplanter + parent: [ BaseTranslatorImplanter ] + name: Bubblish translator implant + description: An implant giving the ability to understand and speak Bubblish. + components: + - type: TranslatorImplanter + spoken: + - Bubblish + understood: + - Bubblish + +- type: entity + id: NekomimeticTranslatorImplanter + parent: [ BaseTranslatorImplanter ] + name: Nekomimetic translator implant + description: An implant giving the ability to understand and speak Nekomimetic. Nya~! + components: + - type: TranslatorImplanter + spoken: + - Nekomimetic + understood: + - Nekomimetic + +- type: entity + id: DraconicTranslatorImplanter + parent: [ BaseTranslatorImplanter ] + name: Draconic translator implant + description: An implant giving the ability to understand and speak Draconic. + components: + - type: TranslatorImplanter + spoken: + - Draconic + understood: + - Draconic + +- type: entity + id: CanilunztTranslatorImplanter + parent: [ BaseTranslatorImplanter ] + name: Canilunzt translator implant + description: An implant giving the ability to understand and speak Canilunzt. Yeeps! + components: + - type: TranslatorImplanter + spoken: + - Canilunzt + understood: + - Canilunzt + +- type: entity + id: SolCommonTranslatorImplanter + parent: [ BaseTranslatorImplanter ] + name: SolCommon translator implant + description: An implant giving the ability to understand and speak SolCommon. Raaagh! + components: + - type: TranslatorImplanter + spoken: + - SolCommon + understood: + - SolCommon + +- type: entity + id: RootSpeakTranslatorImplanter + parent: [ BaseTranslatorImplanter ] + name: RootSpeak translator implant + description: An implant giving the ability to understand and speak RootSpeak. + components: + - type: TranslatorImplanter + spoken: + - RootSpeak + understood: + - RootSpeak + +- type: entity + id: MofficTranslatorImplanter + parent: [ BaseTranslatorImplanter ] + name: Moffic translator implant + description: An implant giving the ability to understand and speak Moffic. + components: + - type: TranslatorImplanter + spoken: + - Moffic + understood: + - Moffic diff --git a/Resources/Prototypes/Entities/Objects/Devices/translators.yml b/Resources/Prototypes/Entities/Objects/Devices/translators.yml new file mode 100644 index 00000000000..e5ad824c5d9 --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Devices/translators.yml @@ -0,0 +1,205 @@ +- type: entity + abstract: true + id: TranslatorUnpowered + parent: [ BaseItem ] + name: translator + description: Translates speech. + components: + - type: Sprite + sprite: Objects/Devices/translator.rsi + state: icon + layers: + - state: icon + - state: translator + shader: unshaded + visible: false + map: [ "enum.ToggleVisuals.Layer", "enum.PowerDeviceVisualLayers.Powered" ] + - type: Appearance + - type: GenericVisualizer + visuals: + enum.ToggleVisuals.Toggled: + enum.ToggleVisuals.Layer: + True: { visible: true } + False: { visible: false } + - type: HandheldTranslator + enabled: false + +- type: entity + abstract: true + id: Translator + parent: [ TranslatorUnpowered, PowerCellSlotMediumItem ] + suffix: Powered + components: + - type: PowerCellDraw + drawRate: 1 + +- type: entity + abstract: true + id: TranslatorEmpty + parent: [ Translator ] + suffix: Empty + components: + - type: ItemSlots + slots: + cell_slot: + name: power-cell-slot-component-slot-name-default + + +- type: entity + id: CanilunztTranslator + parent: [ TranslatorEmpty ] + name: Canilunzt translator + description: Translates speech between Canilunzt and Galactic Common. + components: + - type: HandheldTranslator + spoken: + - GalacticCommon + - Canilunzt + understood: + - GalacticCommon + - Canilunzt + requires: + - GalacticCommon + - Canilunzt + +- type: entity + id: BubblishTranslator + parent: [ TranslatorEmpty ] + name: Bubblish translator + description: Translates speech between Bubblish and Galactic Common. + components: + - type: HandheldTranslator + spoken: + - GalacticCommon + - Bubblish + understood: + - GalacticCommon + - Bubblish + requires: + - GalacticCommon + - Bubblish + +- type: entity + id: NekomimeticTranslator + parent: [ TranslatorEmpty ] + name: Nekomimetic translator + description: Translates speech between Nekomimetic and Galactic Common. Why would you want that? + components: + - type: HandheldTranslator + spoken: + - GalacticCommon + - Nekomimetic + understood: + - GalacticCommon + - Nekomimetic + requires: + - GalacticCommon + - Nekomimetic + +- type: entity + id: DraconicTranslator + parent: [ TranslatorEmpty ] + name: Draconic translator + description: Translates speech between Draconic and Galactic Common. + components: + - type: HandheldTranslator + spoken: + - GalacticCommon + - Draconic + understood: + - GalacticCommon + - Draconic + requires: + - GalacticCommon + - Draconic + +- type: entity + id: SolCommonTranslator + parent: [ TranslatorEmpty ] + name: Sol Common translator + description: Translates speech between Sol Common and Galactic Common. Like a true Earthman! + components: + - type: HandheldTranslator + spoken: + - GalacticCommon + - SolCommon + understood: + - GalacticCommon + - SolCommon + requires: + - GalacticCommon + - SolCommon + +- type: entity + id: RootSpeakTranslator + parent: [ TranslatorEmpty ] + name: RootSpeak translator + description: Translates speech between RootSpeak and Galactic Common. Like a true plant? + components: + - type: HandheldTranslator + spoken: + - GalacticCommon + - RootSpeak + understood: + - GalacticCommon + - RootSpeak + requires: + - GalacticCommon + - RootSpeak + +- type: entity + id: MofficTranslator + parent: [ TranslatorEmpty ] + name: Moffic translator + description: Translates speech between Moffic and Galactic Common. Like a true moth... or bug? + components: + - type: HandheldTranslator + spoken: + - GalacticCommon + - Moffic + understood: + - GalacticCommon + - Moffic + requires: + - GalacticCommon + - Moffic + +- type: entity + id: XenoTranslator + parent: [ TranslatorEmpty ] + name: Xeno translator + description: Translates speech between Xeno and Galactic Common. Not sure if that will help. + components: + - type: HandheldTranslator + spoken: + - GalacticCommon + - Xeno + understood: + - GalacticCommon + - Xeno + requires: + - GalacticCommon + +- type: entity + id: AnimalTranslator + parent: [ TranslatorEmpty ] + name: Animal translator + description: Translates all the cutes noises that animals make into a more understandable form! + components: + - type: HandheldTranslator + understood: + - Cat + - Dog + - Fox + - Monkey + - Mouse + - Chicken + - Duck + - Cow + - Sheep + - Kangaroo + - Pig + - Crab + - Kobold + requires: + - GalacticCommon diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml index 011f2a3b649..7300c0b9ec3 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml @@ -341,6 +341,24 @@ - FauxTileAstroSnow - OreBagOfHolding - DeviceQuantumSpinInverter + - CanilunztTranslator + - BubblishTranslator + - NekomimeticTranslator + - DraconicTranslator + - SolCommonTranslator + - RootSpeakTranslator + - XenoTranslator + - BasicGalaticCommonTranslatorImplanter + - AdvancedGalaticCommonTranslatorImplanter + - BubblishTranslatorImplanter + - NekomimeticTranslatorImplanter + - DraconicTranslatorImplanter + - CanilunztTranslatorImplanter + - SolCommonTranslatorImplanter + - RootSpeakTranslatorImplanter + - AnimalTranslator + - MofficTranslatorImplanter + - MofficTranslator - type: EmagLatheRecipes emagDynamicRecipes: - ExplosivePayload diff --git a/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml b/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml index 64b6b068c71..6efa5a63711 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml @@ -101,6 +101,13 @@ price: 100 - type: Appearance - type: WiresVisuals + - type: LanguageSpeaker + speaks: + - GalacticCommon + - RobotTalk + understands: + - GalacticCommon + - RobotTalk - type: entity parent: VendingMachine diff --git a/Resources/Prototypes/Language/languages.yml b/Resources/Prototypes/Language/languages.yml new file mode 100644 index 00000000000..90bce1baed2 --- /dev/null +++ b/Resources/Prototypes/Language/languages.yml @@ -0,0 +1,493 @@ +# The universal language, assumed if the entity has a UniversalLanguageSpeakerComponent. +# Do not use otherwise. Try to use the respective component instead of this language. +- type: language + id: Universal + obfuscateSyllables: false + replacement: + - "*incomprehensible*" + +# The common galactic tongue. +- type: language + id: GalacticCommon + obfuscateSyllables: true + replacement: + - Blah + - Blah + - Blah + - dingle-doingle + - dingle + - dangle + - jibber-jabber + - jubber + - bleh + - zippity + - zoop + - wibble + - wobble + - wiggle + - yada + - meh + - neh + - nah + - wah + +# Spoken by slimes. +- type: language + id: Bubblish + obfuscateSyllables: true + replacement: + - blob + - plop + - pop + - bop + - boop + +# Spoken by moths. +- type: language + id: Moffic + obfuscateSyllables: true + replacement: + - år + - i + - går + - sek + - mo + - ff + - ok + - gj + - ø + - gå + - la + - le + - lit + - ygg + - van + - dår + - næ + - møt + - idd + - hvo + - ja + - på + - han + - så + - ån + - det + - att + - nå + - gö + - bra + - int + - tyc + - om + - när + - två + - må + - dag + - sjä + - vii + - vuo + - eil + - tun + - käyt + - teh + - vä + - hei + - huo + - suo + - ää + - ten + - ja + - heu + - stu + - uhr + - kön + - we + - hön + + # Spoken by dionas. +- type: language + id: RootSpeak + obfuscateSyllables: true + replacement: + - hs + - zt + - kr + - st + - sh + +# A mess of broken Japanese, spoken by Felinds and Oni +- type: language + id: Nekomimetic + obfuscateSyllables: true + replacement: + - neko + - nyan + - mimi + - moe + - mofu + - fuwa + - kyaa + - kawaii + - poka + - munya + - puni + - munyu + - ufufu + - icha + - doki + - kyun + - kusu + - nya + - nyaa + - desu + - kis + - ama + - chuu + - baka + - hewo + - boop + - gato + - kit + - sune + - yori + - sou + - baka + - chan + - san + - kun + - mahou + - yatta + - suki + - usagi + - domo + - ori + - uwa + - zaazaa + - shiku + - puru + - ira + - heto + - etto + +# Spoken by the Lizard race. +- type: language + id: Draconic + obfuscateSyllables: true + replacement: + - za + - az + - ze + - ez + - zi + - iz + - zo + - oz + - zu + - uz + - zs + - sz + - ha + - ah + - he + - eh + - hi + - ih + - ho + - oh + - hu + - uh + - hs + - sh + - la + - al + - le + - el + - li + - il + - lo + - ol + - lu + - ul + - ls + - sl + - ka + - ak + - ke + - ek + - ki + - ik + - ko + - ok + - ku + - uk + - ks + - sk + - sa + - as + - se + - es + - si + - is + - so + - os + - su + - us + - ss + - ss + - ra + - ar + - re + - er + - ri + - ir + - ro + - or + - ru + - ur + - rs + - sr + - a + - a + - e + - e + - i + - i + - o + - o + - u + - u + - s + - s + +# Spoken by the Vulpkanin race. +- type: language + id: Canilunzt + obfuscateSyllables: true + replacement: + - rur + - ya + - cen + - rawr + - bar + - kuk + - tek + - qat + - uk + - wu + - vuh + - tah + - tch + - schz + - auch + - ist + - ein + - entch + - zwichs + - tut + - mir + - wo + - bis + - es + - vor + - nic + - gro + - lll + - enem + - zandt + - tzch + - noch + - hel + - ischt + - far + - wa + - baram + - iereng + - tech + - lach + - sam + - mak + - lich + - gen + - or + - ag + - eck + - gec + - stag + - onn + - bin + - ket + - jarl + - vulf + - einech + - cresthz + - azunein + - ghzth + +# The common language of the Sol system. +- type: language + id: SolCommon + obfuscateSyllables: true + replacement: + - tao + - shi + - tzu + - yi + - com + - be + - is + - i + - op + - vi + - ed + - lec + - mo + - cle + - te + - dis + - e + +- type: language + id: RobotTalk + obfuscateSyllables: true + replacement: + - 0 + - 1 + - 01 + - 10 + - 001 + - 100 + - 011 + - 110 + - 101 + - 010 + +# Languages spoken by various critters. +- type: language + id: Cat + obfuscateSyllables: true + replacement: + - murr + - meow + - purr + - mrow + +- type: language + id: Dog + obfuscateSyllables: true + replacement: + - woof + - bark + - ruff + - bork + - raff + - garr + +- type: language + id: Fox + obfuscateSyllables: true + replacement: + - bark + - gecker + - ruff + - raff + - garr + +- type: language + id: Xeno + obfuscateSyllables: true + replacement: + - sss + - sSs + - SSS + +- type: language + id: Monkey + obfuscateSyllables: true + replacement: + - ok + - ook + - oook + - ooook + - oooook + +- type: language + id: Mouse + obfuscateSyllables: true + replacement: + - Squeak + - Piep + - Chuu + - Eeee + - Pip + - Fwiep + - Heep + +- type: language + id: Chicken + obfuscateSyllables: true + replacement: + - Coo + - Coot + - Cooot + +- type: language + id: Duck + obfuscateSyllables: true + replacement: + - Quack + - Quack quack + +- type: language + id: Cow + obfuscateSyllables: true + replacement: + - Moo + - Mooo + +- type: language + id: Sheep + obfuscateSyllables: true + replacement: + - Ba + - Baa + - Baaa + +- type: language + id: Kangaroo + obfuscateSyllables: true + replacement: + - Shreak + - Chuu + +- type: language + id: Pig + obfuscateSyllables: true + replacement: + - Oink + - Oink oink + +- type: language + id: Crab + obfuscateSyllables: true + replacement: + - Click + - Click-clack + - Clack + - Tipi-tap + - Clik-tap + - Cliliick + +- type: language + id: Kobold + obfuscateSyllables: true + replacement: + - Yip + - Grrar. + - Yap + - Bip + - Screet + - Gronk + - Hiss + - Eeee + - Yip diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/Oni.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/Oni.yml index e11f1c4165f..8a0e750abd6 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/Oni.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/Oni.yml @@ -35,6 +35,13 @@ - MobLayer - type: Stamina critThreshold: 115 + - type: LanguageSpeaker + speaks: + - GalacticCommon + - Nekomimetic + understands: + - GalacticCommon + - Nekomimetic - type: entity save: false diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/felinid.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/felinid.yml index d9b25c5dd1b..2184926b95a 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/felinid.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/felinid.yml @@ -64,6 +64,15 @@ Unsexed: MaleFelinid - type: Felinid - type: NoShoesSilentFootsteps + - type: LanguageSpeaker + speaks: + - GalacticCommon + - SolCommon + - Nekomimetic + understands: + - GalacticCommon + - SolCommon + - Nekomimetic - type: entity save: false diff --git a/Resources/Prototypes/Recipes/Lathes/language.yml b/Resources/Prototypes/Recipes/Lathes/language.yml new file mode 100644 index 00000000000..6871ed5228d --- /dev/null +++ b/Resources/Prototypes/Recipes/Lathes/language.yml @@ -0,0 +1,190 @@ +- type: latheRecipe + id: CanilunztTranslator + result: CanilunztTranslator + completetime: 2 + materials: + Steel: 500 + Glass: 100 + Plastic: 50 + Gold: 50 + +- type: latheRecipe + id: BubblishTranslator + result: BubblishTranslator + completetime: 2 + materials: + Steel: 500 + Glass: 100 + Plastic: 50 + Gold: 50 + +- type: latheRecipe + id: NekomimeticTranslator + result: NekomimeticTranslator + completetime: 2 + materials: + Steel: 500 + Glass: 100 + Plastic: 50 + Gold: 50 + +- type: latheRecipe + id: DraconicTranslator + result: DraconicTranslator + completetime: 2 + materials: + Steel: 500 + Glass: 100 + Plastic: 50 + Gold: 50 + +- type: latheRecipe + id: SolCommonTranslator + result: SolCommonTranslator + completetime: 2 + materials: + Steel: 500 + Glass: 100 + Plastic: 50 + Gold: 50 + +- type: latheRecipe + id: RootSpeakTranslator + result: RootSpeakTranslator + completetime: 2 + materials: + Steel: 500 + Glass: 100 + Plastic: 50 + Gold: 50 + +- type: latheRecipe + id: MofficTranslator + result: MofficTranslator + completetime: 2 + materials: + Steel: 500 + Glass: 100 + Plastic: 50 + Gold: 50 + +- type: latheRecipe + id: BasicGalaticCommonTranslatorImplanter + result: BasicGalaticCommonTranslatorImplanter + completetime: 2 + materials: + Steel: 500 + Glass: 500 + Plastic: 100 + Gold: 50 + Silver: 50 + +- type: latheRecipe + id: XenoTranslator + result: XenoTranslator + completetime: 2 + materials: + Steel: 200 + Plastic: 50 + Gold: 50 + Plasma: 50 + Silver: 50 + +- type: latheRecipe + id: AdvancedGalaticCommonTranslatorImplanter + result: AdvancedGalaticCommonTranslatorImplanter + completetime: 2 + materials: + Steel: 500 + Glass: 500 + Plastic: 100 + Gold: 50 + Silver: 50 + +- type: latheRecipe + id: BubblishTranslatorImplanter + result: BubblishTranslatorImplanter + completetime: 2 + materials: + Steel: 500 + Glass: 500 + Plastic: 100 + Gold: 50 + Silver: 50 + +- type: latheRecipe + id: NekomimeticTranslatorImplanter + result: NekomimeticTranslatorImplanter + completetime: 2 + materials: + Steel: 500 + Glass: 500 + Plastic: 100 + Gold: 50 + Silver: 50 + +- type: latheRecipe + id: DraconicTranslatorImplanter + result: DraconicTranslatorImplanter + completetime: 2 + materials: + Steel: 500 + Glass: 500 + Plastic: 100 + Gold: 50 + Silver: 50 + +- type: latheRecipe + id: CanilunztTranslatorImplanter + result: CanilunztTranslatorImplanter + completetime: 2 + materials: + Steel: 500 + Glass: 500 + Plastic: 100 + Gold: 50 + Silver: 50 + +- type: latheRecipe + id: SolCommonTranslatorImplanter + result: SolCommonTranslatorImplanter + completetime: 2 + materials: + Steel: 500 + Glass: 500 + Plastic: 100 + Gold: 50 + Silver: 50 + +- type: latheRecipe + id: RootSpeakTranslatorImplanter + result: RootSpeakTranslatorImplanter + completetime: 2 + materials: + Steel: 500 + Glass: 500 + Plastic: 100 + Gold: 50 + Silver: 50 + +- type: latheRecipe + id: MofficTranslatorImplanter + result: MofficTranslatorImplanter + completetime: 2 + materials: + Steel: 500 + Glass: 500 + Plastic: 100 + Gold: 50 + Silver: 50 + +- type: latheRecipe + id: AnimalTranslator + result: AnimalTranslator + completetime: 2 + materials: + Steel: 200 + Plastic: 50 + Gold: 50 + Plasma: 50 + Silver: 5 diff --git a/Resources/Prototypes/Research/civilianservices.yml b/Resources/Prototypes/Research/civilianservices.yml index 61f95894ee6..acb6a2498d4 100644 --- a/Resources/Prototypes/Research/civilianservices.yml +++ b/Resources/Prototypes/Research/civilianservices.yml @@ -227,3 +227,43 @@ recipeUnlocks: - BluespaceBeaker - SyringeBluespace + +- type: technology + id: BasicTranslation + name: research-technology-basic-translation + icon: + sprite: Objects/Devices/translator.rsi + state: icon + discipline: CivilianServices + tier: 2 + cost: 10000 + recipeUnlocks: + - CanilunztTranslator + - BubblishTranslator + - NekomimeticTranslator + - DraconicTranslator + - SolCommonTranslator + - RootSpeakTranslator + - BasicGalaticCommonTranslatorImplanter + - MofficTranslator + +- type: technology + id: AdvancedTranslation + name: research-technology-advanced-translation + icon: + sprite: Objects/Devices/translator.rsi + state: icon + discipline: CivilianServices + tier: 3 + cost: 15000 + recipeUnlocks: + - XenoTranslator + - AdvancedGalaticCommonTranslatorImplanter + - BubblishTranslatorImplanter + - NekomimeticTranslatorImplanter + - DraconicTranslatorImplanter + - CanilunztTranslatorImplanter + - SolCommonTranslatorImplanter + - RootSpeakTranslatorImplanter + - AnimalTranslator + - MofficTranslatorImplanter diff --git a/Resources/Textures/Interface/language.png b/Resources/Textures/Interface/language.png new file mode 100644 index 0000000000000000000000000000000000000000..2b39424d12d3d75421a5f48ab87ec0c4f852129f GIT binary patch literal 739 zcmV<90v!E`P)4Tx04UFukv&MmP!xqvQ>9WWf_4yb$WWc^q9TqZ6^me@v=v%)FnQ@8G-*gu zTpR`0f`dPcRR<0iR+(n?#Q;sW z&2&N%bNN*<@QM(ERKpNuW*N!MVirBu*FAiEzl-uL{BI4a1&aYbkvPT-(0(wkHR4&~h^pz7FXTK{ zId5^+s&&@xlfN)j&{r~Cry55BOGqLG5en+4pb8sN+I3Par0HDh;U9DTDRL>~s(_JW z0X1llT|f9A{GP2--aXJgw?FT=^MmvQjVW@mx*a zR9HvtliLo2APhtW#Q*Z7 zxueKOz!l>drAkVi37b}eoEaHck8hT`Y711a{BAiv=MV89^d&Flsg z;w6 zQhU|Z-a6Cv%8BbI{bv4!1BA+Lo2}0W538WU#pihLZ&zz@(>PT+|s@$ z;f&CupQ;C=PPAHcUOTL%$X6+}V=}kyeUH}1?myQVa~Q{oXWeD^{6ysAU#rzwKqoMG My85}Sb4q9e0CGNE+5i9m literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/translator.rsi/meta.json b/Resources/Textures/Objects/Devices/translator.rsi/meta.json new file mode 100644 index 00000000000..0202c0c39c7 --- /dev/null +++ b/Resources/Textures/Objects/Devices/translator.rsi/meta.json @@ -0,0 +1,17 @@ +{ + "version": 2, + "license": "CC-BY-SA-3.0", + "copyright": "baystation12", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "translator" + } + ] +} diff --git a/Resources/Textures/Objects/Devices/translator.rsi/translator.png b/Resources/Textures/Objects/Devices/translator.rsi/translator.png new file mode 100644 index 0000000000000000000000000000000000000000..6c54a0b86366cef370ee7e2575979bc054a826dd GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSL74G){)!Z!V7#Y`V@QPi+bb724=C`kT-dCARMX0%{FPtn zM7@b>Ggy`WPQ1h1>1a^Uq@bh}Rp#`xG0tlB_rgh+7A^Z3Ffrqd#I~w``;=d`)m1S? uB}Iz&N5B8Xx#z0zhx6*&T(($0U_Q1^;pBD8!#jaiF?hQAxvX Date: Mon, 10 Jun 2024 20:49:11 +0000 Subject: [PATCH 058/155] Automatic Changelog Update (#43) --- Resources/Changelog/Changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 743c0add322..babf5f90782 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4142,3 +4142,9 @@ Entries: message: Floors Looks Updated/Resprited. id: 6118 time: '2024-06-03T19:23:51.0000000+00:00' +- author: FoxxoTrystan + changes: + - type: Add + message: All species can now bring their own cultures and languages + id: 6119 + time: '2024-06-10T20:48:48.0000000+00:00' From 87850a78f228ff8d3798ca9b5277b3fdfe85dce5 Mon Sep 17 00:00:00 2001 From: FoxxoTrystan <45297731+FoxxoTrystan@users.noreply.github.com> Date: Tue, 11 Jun 2024 02:34:02 +0200 Subject: [PATCH 059/155] Misc Resprites! (#435) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Description This PR add a bunch of Misc Repsrites and others fixes that i have missed. This PR will avoid ALL .yml changes and will focus on only "Sprites" changes. Here is the following list of Changed Sprites: • Rust Solid/Reinforced Walls • Stunbaton • Banners • Radiation Collector • Riot Suit • Bulletproof Vest • Armor Vest • Slim Armor Vest • Fire Extinguisher • Stock Parts • Rack • Screen # TODO - [x] Port/Resprites. ---

Media

![image](https://github.com/Simple-Station/Einstein-Engines/assets/45297731/3ad4521e-093c-4e3a-a088-6e61e8e66a49)

--- # Changelog :cl: - tweak: Rust Walls Sprites. - tweak: Armor, Bulletproof, Riot Suit Resprites. - tweak: New Banners Sprites. - tweak: Stunbaton, Fire Extinguisher New Sprites. - tweak: Rack/WallScreen resprites. - tweak: Stock Parts new sprites! - tweak: Radiation Collector has now a new sprite! --- .../equipped-OUTERCLOTHING.png | Bin 411 -> 622 bytes .../Armor/bulletproof.rsi/icon.png | Bin 244 -> 236 bytes .../Armor/bulletproof.rsi/meta.json | 2 +- .../Armor/riot.rsi/equipped-OUTERCLOTHING.png | Bin 1562 -> 648 bytes .../OuterClothing/Armor/riot.rsi/icon.png | Bin 293 -> 231 bytes .../OuterClothing/Armor/riot.rsi/meta.json | 4 +- .../security.rsi/equipped-OUTERCLOTHING.png | Bin 343 -> 413 bytes .../OuterClothing/Armor/security.rsi/icon.png | Bin 252 -> 193 bytes .../Armor/security.rsi/meta.json | 2 +- .../equipped-OUTERCLOTHING.png | Bin 428 -> 484 bytes .../Armor/security_slim.rsi/icon.png | Bin 277 -> 195 bytes .../Armor/security_slim.rsi/meta.json | 2 +- .../fire_extinguisher_closed.png | Bin 429 -> 303 bytes .../fire_extinguisher_open.png | Bin 420 -> 315 bytes .../Misc/fire_extinguisher.rsi/meta.json | 2 +- .../Misc/stock_parts.rsi/adv_capacitor.png | Bin 420 -> 345 bytes .../Misc/stock_parts.rsi/adv_scan_module.png | Bin 927 -> 725 bytes .../stock_parts.rsi/advanced_matter_bin.png | Bin 426 -> 430 bytes .../stock_parts.rsi/bluespace_matter_bin.png | Bin 627 -> 1283 bytes .../Misc/stock_parts.rsi/capacitor.png | Bin 254 -> 391 bytes .../Misc/stock_parts.rsi/femto_mani.png | Bin 589 -> 416 bytes .../Misc/stock_parts.rsi/high_micro_laser.png | Bin 278 -> 333 bytes .../Misc/stock_parts.rsi/matter_bin.png | Bin 462 -> 457 bytes .../Objects/Misc/stock_parts.rsi/meta.json | 50 ++++++++---------- .../Misc/stock_parts.rsi/micro_laser.png | Bin 263 -> 357 bytes .../Misc/stock_parts.rsi/micro_mani.png | Bin 366 -> 390 bytes .../Misc/stock_parts.rsi/nano_mani.png | Bin 394 -> 428 bytes .../Misc/stock_parts.rsi/pico_mani.png | Bin 373 -> 404 bytes .../stock_parts.rsi/quadratic_capacitor.png | Bin 729 -> 367 bytes .../stock_parts.rsi/quadultra_micro_laser.png | Bin 371 -> 421 bytes .../Misc/stock_parts.rsi/scan_module.png | Bin 491 -> 478 bytes .../Misc/stock_parts.rsi/super_capacitor.png | Bin 419 -> 291 bytes .../Misc/stock_parts.rsi/super_matter_bin.png | Bin 397 -> 523 bytes .../stock_parts.rsi/super_scan_module.png | Bin 1182 -> 564 bytes .../stock_parts.rsi/triphasic_scan_module.png | Bin 631 -> 770 bytes .../ultra_high_micro_laser.png | Bin 304 -> 389 bytes .../Weapons/Melee/stunbaton.rsi/meta.json | 2 +- .../Melee/stunbaton.rsi/stunbaton_nocell.png | Bin 431 -> 253 bytes .../Melee/stunbaton.rsi/stunbaton_off.png | Bin 362 -> 224 bytes .../Melee/stunbaton.rsi/stunbaton_on.png | Bin 1091 -> 1753 bytes .../Decoration/banner.rsi/banner.png | Bin 1577 -> 397 bytes .../Decoration/banner.rsi/banner_cargo.png | Bin 519 -> 415 bytes .../banner.rsi/banner_engineering.png | Bin 724 -> 381 bytes .../Decoration/banner.rsi/banner_medical.png | Bin 428 -> 420 bytes .../Decoration/banner.rsi/banner_science.png | Bin 537 -> 417 bytes .../Decoration/banner.rsi/banner_security.png | Bin 742 -> 402 bytes .../banner.rsi/banner_syndicate.png | Bin 569 -> 394 bytes .../Decoration/banner.rsi/meta.json | 2 +- .../Furniture/furniture.rsi/meta.json | 4 +- .../Furniture/furniture.rsi/rack.png | Bin 250 -> 315 bytes .../Singularity/collector.rsi/ca-o0.png | Bin 1477 -> 152 bytes .../Singularity/collector.rsi/ca-o1.png | Bin 1415 -> 149 bytes .../Singularity/collector.rsi/ca-o2.png | Bin 1383 -> 151 bytes .../Singularity/collector.rsi/ca-o3.png | Bin 1421 -> 148 bytes .../Singularity/collector.rsi/ca-tank.png | Bin 2071 -> 198 bytes .../Singularity/collector.rsi/ca_active.png | Bin 10749 -> 3159 bytes .../Singularity/collector.rsi/ca_deactive.png | Bin 10791 -> 3131 bytes .../Singularity/collector.rsi/ca_off.png | Bin 2755 -> 990 bytes .../Singularity/collector.rsi/ca_on.png | Bin 3212 -> 1521 bytes .../Singularity/collector.rsi/cu.png | Bin 558 -> 990 bytes .../Singularity/collector.rsi/meta.json | 2 +- .../Singularity/collector.rsi/static.png | Bin 664 -> 1608 bytes .../Wallmounts/screen.rsi/meta.json | 2 +- .../Wallmounts/screen.rsi/screen.png | Bin 266 -> 398 bytes .../Structures/Walls/solid_rust.rsi/full.png | Bin 2155 -> 2228 bytes .../Structures/Walls/solid_rust.rsi/meta.json | 2 +- .../solid_rust.rsi/reinf_construct-0.png | Bin 2293 -> 2248 bytes .../solid_rust.rsi/reinf_construct-1.png | Bin 2303 -> 2272 bytes .../solid_rust.rsi/reinf_construct-2.png | Bin 2340 -> 2269 bytes .../solid_rust.rsi/reinf_construct-3.png | Bin 2339 -> 2272 bytes .../solid_rust.rsi/reinf_construct-4.png | Bin 2372 -> 2268 bytes .../solid_rust.rsi/reinf_construct-5.png | Bin 2381 -> 2265 bytes .../Walls/solid_rust.rsi/reinf_over0.png | Bin 3230 -> 3233 bytes .../Walls/solid_rust.rsi/reinf_over1.png | Bin 2990 -> 3206 bytes .../Walls/solid_rust.rsi/reinf_over2.png | Bin 3230 -> 3233 bytes .../Walls/solid_rust.rsi/reinf_over3.png | Bin 2990 -> 3206 bytes .../Walls/solid_rust.rsi/reinf_over4.png | Bin 2903 -> 3191 bytes .../Walls/solid_rust.rsi/reinf_over5.png | Bin 2908 -> 3128 bytes .../Walls/solid_rust.rsi/reinf_over6.png | Bin 2903 -> 3191 bytes .../Walls/solid_rust.rsi/reinf_over7.png | Bin 2840 -> 3083 bytes .../Walls/solid_rust.rsi/rgeneric.png | Bin 2332 -> 2248 bytes .../Walls/solid_rust.rsi/solid0.png | Bin 2943 -> 3281 bytes .../Walls/solid_rust.rsi/solid1.png | Bin 2638 -> 3147 bytes .../Walls/solid_rust.rsi/solid2.png | Bin 2943 -> 3281 bytes .../Walls/solid_rust.rsi/solid3.png | Bin 2638 -> 3147 bytes .../Walls/solid_rust.rsi/solid4.png | Bin 2554 -> 3156 bytes .../Walls/solid_rust.rsi/solid5.png | Bin 2565 -> 3128 bytes .../Walls/solid_rust.rsi/solid6.png | Bin 2531 -> 3156 bytes .../Walls/solid_rust.rsi/solid7.png | Bin 2495 -> 3083 bytes 89 files changed, 34 insertions(+), 42 deletions(-) diff --git a/Resources/Textures/Clothing/OuterClothing/Armor/bulletproof.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/Armor/bulletproof.rsi/equipped-OUTERCLOTHING.png index 81512185135281cfe088087f850d732431838ab5..78f7cd2453efbbe1b9cd75a835227c0d872a0a16 100644 GIT binary patch delta 589 zcmV-T0c0004VQb$4nuFf3k00004XF*Lt006O%3;baP z0000FP)t-sAs`|d7#c4wF+xE^00014tKnM!000GaQchF<|Ns90`?d~KkuDd10oO@H zK~z{r?N-~C#2^S$+yDROO^}%af}OLoPkWk&Rt$~tQnj65;t_ZR2rJNLpsy8u$ZK?Y zDNJ%}gAty&LhE3F(JgMUyQg-O7`Ow(E;0Ch-<0E=3Gdx4cN0n1-fy)%gxSzJMW5T18l)qzGUL_f@tjpz+< zvt+?Opb5`=fr(lm;cWm)TB!Qar-C10uf{%<2H1i?qY0la0$NVM`HKmmxu_qo8VF-R zverm>E5HGS%`yMl6>!f*cc^E4TLVRg zb|{yKLP02=pLR!Z4vv9a2oEQ%2@t9ysd9krRBji00VI_I*sVCo)gTBZIfZ~cc!}6J znBCtA$N?+y0=7RJF9f7;EFL9ZAnsWxy7215)5$f&^090n8HMo#DAP+%`a2&~PsR)T_U43i r`>O}hgRHI-ZKL3qQraEx&+`q(U?z<000005AXa0qg;gB!3T3OjJd{z`!9OA}=m685kNuK}1D=0xBL50000< KMNUMnLSTZ)D_7_M delta 216 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 delta 328 zcmV-O0k{601J?qO7=Hu<00013M{Ml?001gbOjJbx000;l86zSlDJdyBIX*l(KS4l1 zLqbMHMMYCmR#jD1S5{hCSy^swZg}atJpcdz0d!JMQvg8b*k%9#0NY7KK~zY`?bAI9 z!axuO;D;lm_XK)_g;9$I!B$%l4-iO^Dv&}XWsb7l66+MXL4Q~)TfK{=Gw}xmv5>s( z4If(!J3yarW@v!vn~rr1N|*P(%9#(MgB-}oUNlWEU!Wr|6xcVl2G#YVz^OynFgu%u^ceSs7=k2L=K3{k`*B4{y+8kv*_CeV9)BC6UeGVA!i^5W1tIw zK?j^ASUiBpoQ3Ycer6o_mkLF+OFCcxZF;A3E<_5e;KNEk5PWxgzZ aev=zDtvcEW$;fR00000%X=h6_*`Bpy@s#~XKV;b%Dk5f};t TA?!hr00000NkvXXu0mjfnGHSE delta 224 zcmX@e_=j()+*x_<~Rj6z)&xuGThXyT!;%7W6jK_LrI$Y>7XqHrJ zNYUNJpzWf-;K_X=Ktxv|dm^ioBa??;dO7Zm6f1oo`xWD8G908>YsI`;45b=s}P=DNk@J3oITnGT2Lh(kV zMu=gJ080j30~CuT004(I!j?guuO&3epshu&6OhgqqYa%?7Ld*^-E)@|$a48>&kEUF$H3f{X;5R<=G-p|n%%8| z+Gs#$yzRKFk$f#M+Zn;^0d1Uq{74Q-z_h(RnmzFBoXKGjkS*9{;Jtk=U{mj9U^k~1 zz*l?Vd75qH5?oxuq=y-uai4h!UYVW*&6=RcME%YsP9}n_j|j7wrSrQSfg_;&THwAP Xj1pUE|AAcn00000NkvXXu0mjf14_G% delta 372 zcmaFDyoPy#W4&~MPl&6&o}rVYi=u*3NN_+}YNCX=q_UElxtRq61A~^0$ORz9SrX(I z{2vM!g8eImK!ODxk;M!Qe1}1p@p%4<6b1%HR!6cp39*bI#YIya5+2;=Su{mR zL`pbyN$@FMDMz^*d&E-SJWEe=kPELkDSdF8^M-tG#?1mB)F;g6+BE0Dv-^7v{bE_6 zP#0y=q*AeEMG}jJN=7!ndOoYXK$C!hA_t>zQ#^NH^SNzviY^syS-OCAQ(Q@TKzn;) zaBA-4?^$*)PDW|1cx6@jp+|w6{mZdi)2~ce)b%v$Qi5v9i@D){xtkl(SvX~XeR#mV zmdKI;Vst09n8=KmY&$ delta 261 zcmX@iIF)IFL_G&H0|SH0lCEPwim^Dz-HBn{IhmJ04okYDuOkD)#(wTUiL5}rP=HT} ztAx0uzMi3zqf1(9Vn}cRP}tyDaWIf#D+%%o{tp5SoA)o-4;0}n@Q5sCVBk9p!i>lB zSEK+1t2|vCLoEE?P6*^Xs=&cg&RF-p{^@ou`AasJxJwop&gSblTJ=zPQagi9o(!fU*(~tYWo*xpm^e1`L*wa96$4YzXx;%gQu&X%Q~loCIF)) BUr7J} diff --git a/Resources/Textures/Clothing/OuterClothing/Armor/security_slim.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Armor/security_slim.rsi/meta.json index e0d437b8ece..afdd4120b55 100644 --- a/Resources/Textures/Clothing/OuterClothing/Armor/security_slim.rsi/meta.json +++ b/Resources/Textures/Clothing/OuterClothing/Armor/security_slim.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/6665eec76c98a4f3f89bebcd10b34b47dcc0b8ae", + "copyright": "Taken from https://github.com/ParadiseSS13/Paradise", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Misc/fire_extinguisher.rsi/fire_extinguisher_closed.png b/Resources/Textures/Objects/Misc/fire_extinguisher.rsi/fire_extinguisher_closed.png index 7c99615ffec1d6df58698e5dcf25e1fe7e9e4ad1..b84389a06bd18e2ef60cf5e4bc94fde649b421bf 100644 GIT binary patch delta 287 zcmV+)0pR|v1Fr&*8Gi!+002a!ipBr{06b7kR7L9a{d;?R<>lqJwzgSWSvEI1QB+ko zH#Z?6CQktzj0Ga;bac7}1*HH0**G}nO-+f1hlPohyTQri=jy`bCkFrk00DGTPE!Ct z=GbNc005y$L_t(IjkVIz4#OY_1yHCWV%4qs|NlDL?QLR{Hh<;yo?J*2;Gsc0iI*AB zcyazDp5&95h`>9$ok9qV4iU$K0>#Ma{o;7IgF*ygX75mY2IK%DNsXxZzhnop=3Gjt zqKZd1NM6@kYZ2p01ut#L*8#;T*eh-WdK!fH2>{rBU^78GKr?}~)_ZTwTp{@Y_6_s5 l_=^2M*tv?7(ikkiG9QYM3CE9d_ALMa002ovPDHLkV1i3Yeu@A9 delta 414 zcmV;P0b%~H0<8m(8Gi-<0047(dh`GQ010qNS#tmY4#WTe4#WYKD-Ig~00Cb~L_t(| zob8suYJ)Hs$G>QIDfH;*!6JzFb@Y%HpJOKr(s$T16b5^Vflsj)C?1O23kZU+GH)x4 z!Khij&_JOZG&U+_{voJ|`1_d{lOAIX+DxxidMD5c=n&X$2!9(48Nu_SD8!VqEQ>TI zfN+%fGT$LhQ=pWd4A&wM$1xii0He`0hchMkSpvTAi|)?z9G1%nwxtJ<#iCB77b*!L z9Kl(Z3D7+uEaAsT)<6#&!V!#hL(_yC!vJ}$BBCsSa16pEcwCmyrxeDk6+G?RPL)s+ zkmD}j9^o>d9Dm-Q%^>8*2Zd*zJqz&dWv(U@04|`C%l{MpF9A6NS`)BsTf0Q1A#far z-ThMky4Jy;vG3&;(K46cZq-R|hVTK5B0LA40zNEavY1L(hp8>j(KiU0rr07*qo IM6N<$f@^xR4*&oF diff --git a/Resources/Textures/Objects/Misc/fire_extinguisher.rsi/fire_extinguisher_open.png b/Resources/Textures/Objects/Misc/fire_extinguisher.rsi/fire_extinguisher_open.png index 7909d14f269cea522d6e0b9033e83d81451f94ca..0cf52827fca440fc3ec9a0d956ea5e53e86f2176 100644 GIT binary patch delta 299 zcmV+`0o4Aa1G@r{8Gi!+002a!ipBr{06b7kR7L9a{d;?R<>lqJwzgSWSvEI1H#av? zR8=7%CQktzj0Ga;bac7}1*HH0**G}nO-+f1hlPohyTQri=jt*%SjGSV00DGTPE!Ct z=GbNc006B?L_t(IjkVI<4#OY_1z@Ry#lNlg{oi$Hcd=xm$$y%0d%oZa(U?CCz#`se zK;q51MLfypv2k{?9T5pE04M^z_XN&umWFSj$9*RvXF>K12>RU^<{*Yed^c%;V@f&a z!lGyhQjDdP%;Sy?JY+)}g4S^XTE`opzn}mwC%$q8Jmth!t^m2PjM2fzEWz;xhYD&3 xRRvt@d7iaSIwW*(qoj!TAM{*A2w|50GA|%_3Obz{x$^)3002ovPDHLkV1j(`fVThu delta 405 zcmV;G0c!rc0;B_w8Gi-<0047(dh`GQ010qNS#tmY4#WTe4#WYKD-Ig~00CA>L_t(| zob8rDYQjJihF{cf+y`8T>}zo`N{$jCc!!=LQ0OHJo+1~JEF^k?Kp_PUj6i z5!>24lZgoVVF;6feBV4~GSib%!adWwE4>wH1?mpcsM{`2pBFF@Npa~D^Y0?BAl{S@cv{1fqK3%zQGo_ zEI-bk@-!L&D1QM?SOQf3I`cTcV%mC*3!MLOFtqoL3tWOtve*5+f zj5KqAp1#Tdz=%i&c{xdjgM0VkQubf{_Y($tPbr4yw|+86sEaoJ4#VpJ zkmWwUK4A94N6#7Tot?0%Q&81pSifR9!@7wV7z6}G7#L14Fn@e_|Av7WKyn%YIRqC7 zQWF7(0th_6B@7G+z5j$lf+z<(xP2Y$OMLQApFLr?3iS29*9h?s+X;sP(IEh`1ewML zU?G4=2Mh$$0bU0{HG|UuCzGd?kaGbAu&wvPl6AY9mLS#n(ts$fa3?4mtz(5Kh vDhi143Atcslp=(q4j6U7r~^hFKuZ7sUu$URzcXAb00000NkvXXu0mjf%t3Z? delta 372 zcmV-)0gL|G0;B_wIe%73L_t(|oMT}aU@+={Q3s4VVAKI*J7CK6)&D{CojZ3JR8&;J zVmXr$uxGr_3Kv{wr)QRb_B!$3}A~v0DmM-Dj+)-z$^m=`PS{I z4y36ADoU&wI(jxR`1%H5$Zg)d0W80B+fv#&00g#gZDa8Cu7dMnzV7diXL$LN#%bW# zu`3Mrj^1F)?u4f?sH~g?r(yCmbwG8^G*BM@9~g)k1?$&ufXUO&0U+@Dy)4+W8;gUSI|2xSrhinJfcuO)cOnQiuPjd$-xIbjX$EUdis0BtHFzSE-cK`sQWjik93kwuy7iazGD-ygRx;rRlt_(|fp{@l-)9NW=R$Obp zxN5Yfy?hYVl@?g=g1cj9(w4R_pLW~tZGSc|Jwqer*Ux*lmQ|K@^PePfbTK7}Ff3+} zU_GG0;Kpdc)ey+g0}+~$!ua`f|F4y|-@U2XBVcO0_NOP)rVmG#KGks8f3Df!?9ZJ{ z@9tG!*l$*DyYKrxQBM1NcG6bWZ{F2v)+*eZFkkz@*HbZnX2kY2um4^6`PkJbj8@!p zca;A2i}|@zuv>qTN$!dBq93x>n*T`ty>ahWS=STW-s`yRx&6vj^wtFXk32vAyuSbb zb+&v`+OvNvZ_CTRJvMpj^8dE`UuhSZ)W3W>`^T3$=F{iD{eQUmcyhYNWT1UNZ@+tx zZmt(QuXj<(;dSn&U`KrT@Zg91iG+sz(-USs6=^%a_Rx+$XRmIV{w4Bh`tSWat$s=@ zc_v<^T=waU(u`w&R2b{^mQK3g5wi13c68k*$$;;EqN!1z_lmP%4I(U|1{3Nq680O^LGn~`E%P+CrZQshTKb_suGpy=M*nTrUH`rfdpKwX)=jNFC_A2>p zYM(x*ZICbU`}CImz)z4F?^zF`M-0pgq_{#6`pY2ko6+DKbHW?;12^~^RzCgB+?M^M z^XpIb^b>ZGd(Zt*+aS*neEK_kPqgy=E5H6+PFtb8pA({Zqdddoy$UGCK~uy1wAg+R U#Ul5ez;w#s>FVdQ&MBb@0PF}o;Q#;t delta 918 zcmV;H18Mx#1)m3y7k@wq1^@s6)-goag_de%+_nZL)K@bE%5Pt+AcqnBe++zqbRg{a1 z!9T;9grF|~>jb#L2T%{DB$UGfpkkE(rA#DUH<-nK@D~8or|Sl@eg>js3`xJW4`_`U zrHnyq%-G%{WP70-fN4-j_1%*>1dfd0pm7`=7{`FtLUM8da~;Oh51nZVf9 z9yWdI{H+H3^y3c$0O|Z60KnJGHUMCCtAIC`&K-IXDoNjNu&psOcRP-r`TLl-a0^;% zI(kOuR=`dVw;+~|aw zZpQHDMc?(km_Nyia2XhQ;KgmM7&-PDss0Zbau(UfK$*W|b=Bv0p_P?RqqWB7W&t}p zzmd!3fPd_UKVJh&^tIOL)6cNNq|Y*c7o|+ZIo-wkA{K4reG!W`kn~ArT-xc*hPSGb zcDh--m{7FQgtu$>li)WcD?g@`F-n=3-#bAm6LF&LMk!;8pZ@Q{Xv4l4N7w}C%m*%O@FAIqE z@f1obqyzaD40vP4u{ffx9~2JN0s;1cy!f>gfXj?4^d?U^vsf$i2G)!tJu^A$^UI+> sp)BA&kO{IAS`kR_1wjx5L9pU4$ev$+sSgitw*UYD07*qoM6N<$f)NM21poj5 diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/advanced_matter_bin.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/advanced_matter_bin.png index 819275417bab0d14b6904c6877cf9435fb74a812..7533331b835f14da64cc2356e30d496d6f8282ab 100644 GIT binary patch delta 382 zcmV-^0fGLi1Fi#*Ie%bDL_t(|oMT}aU@+={Q3s4VU}!qP(=*^dy4d#Z8yIQs0GP#r z5s}!W|C8eoq8$LT9A@#9zHSC-DH#-bBuD)x#Sug~0AzVVSrJ2Od>n&-pa@nq>sKsi zxO(*hLrrrhNsb^p5k7tP1SJ$ed~yKE4*2l?4LlT(Ed_~#z<`jf%%}QKnKvE2S)|WF;sH^3_N`F98AL;f-L^v_H~ByXD=|23MeXwU=9LVjt)Qx zmzab|^^y>l6aE~V$FQ9U^)xApK_Rl`#9N}&(yT7Xun=a*x=3XQfKoUJfJ!}iIZ3Q) zw6zTwmMmI8w0D^#hd`RkKZaRAhk!~(eBjZe2h=MGFI_yt2+Z66LB4x_>nBiz6Q^2G zA|%#wq8$JNP(%M;y$T6tbN~x>QYT)D5l9Vkkb|OzkfVum0CFm}v*HJ*fzP+@g86q8?*J`l09zCq;>)ml&1SG8 zK$e5p*wO{b4gi4%JLUf$+4`K}A;|K)F0dHyq%vR_e}t<6g%k)NTfTGKQoLD^Xa^{` zKLi`(!?g0hu5%VI*mAH#+|$AGAYUVg0!_dfQ3M7OZfj@ zms+rxWm7oA^O=u<5X=vX$A(C zt)4E9Ar*7p&fT9a;wW>}T|`jO)RDV>LHcYDrL4@t8>)_;s<&cgCz*tm9kf6Ah--Di z)I&}px~gv8+@h1NNrbo@oxC6;(c*J#zFzU`zqfAQtlYl&J#*sbn~(3k+4tt$y|>@b zz6oUE;$?7VK5&7-z=VMZ#_Z&kklr8he#_glucz-0Io7i5{&vQwA8&p{Y>E5*Y3<$9 zueR}OuBwY?>)0VyxAD)G$FJSo&%2&}zjgiB-rmx5cEyyxF4GkR<>y6q)Wz%n7uMF@ zpOqKCR?kFwBJ0~P+RDopJuUjW(ERU?Z;x)dZHd`yHaEh)P+sBDuLbVBH~wAZwTK9f z>%4W*g5#22{I5mYRY_Hq&$3Eno=Cj0uT89e9k%GZSIU8I+JG*L}t3CdSmK2ZS*S%I+9aehr-G+JDGds`q>-=QwS57jhe?Ps*@x`xL-U-1gZnO8tE!iuo z(^PlfSm9mGpQ!7dhn?M*Fly;8e69YD`QE=9Yqie5U%m8I(dq1Z`?@9H^7dt~OE2XW z`&(c z-5EN(i-L=b)9)S)XO#Wg8X>*s_3>K?tMk8>me_Akj1-y#j3$$R!i)G-etEAfJF!x0 z#~&q~lE3@TGdvEyTfaRu@@<9S7vcD(8k;W~lkDU@n-(%AWH3lbF|@HY;AGC=XLxNa z&u}f>j$uvyRQ?I89#rJ+3E}v?=KOkz)Q`JjUMkCY2wOarJ-L3-`K z{$Z??-+w>seyE*NsJczY|Rk~i4!_=twE8DRX^`^nJ$ z^`oo$^q&nAPPp1Bq!dl&=a_ouDYH{^zsf;W7t}L`MA$ABW!wNN)fhZo{an^LB{Ts5 D=1N37 delta 617 zcmZqX`plx(8Q|y6%O%Cdz`(%k>ERLtq#Zz*gAGWo$}GG$QBk~}N!8QEF{EP7+gaA$ zhXW+q;ul&}92V1e)#~cFwocNeu<&D(LeSl#t{?3!eks41U!WZtT_|XM<(1GXKP}OG z=K~983lt}9ZOpp-~+= zhlF|kYwxAsq8CWatf^!?S-)gus{RB&`S8+KCq)hQi3VFAWgq@IkLApo+?&h3Gjs0V z`%lbWON?2EacR)Xg}f8a^}8^5J1qV=FWn)1gLv-6jpyCi>ih2hT*qW)w(acm=i(A= zfyH-DohrJzspg;1rWNPPML&q@EsNNG^<96@g4&`#n~j4xg_7q4>&d(;zx$%9K49*9 ztpk;!y=AO#i#J>;Oy16$yx>okg4k?_g$1ekEga(S>#g+nF0$IcF8jdUhZ8Di)f{?f zSzu6_q#u3aT-15<`^iTp3RxU3wS9g%e8H(dyI6S6-@mPWEA#A(2wC0saDi)c-4C9h z8$S1aCR@z=z2U9(3$vbwKChm|c=4sBaR2uDsr=o=YXTfLMr@I1+FyRp^#4Ogt^1eX zH@x1w_|;T>UB~11KP3MP^V6FDpQq76hv7&fBSx?aw6ivVq#piac=_e5Z}4mBoVePC zlzla|4a+?5&Yylx|9fGrLvulG!)=Cj{6F4*Wo)*Mkyn^}{ww2Gd!9$X8lt{G|NQgW vHTDRT?RF05O@YMoUksYaF(=Tzr-47Z!D(qS-{MSQ>S6G7^>bP0l+XkKQFIuz diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/capacitor.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/capacitor.png index 305087c37b634d1fe0fa8962937605c45200cb89..242f217e4afd493c1d23275a445a3abcab026f92 100644 GIT binary patch delta 364 zcmV-y0h9jz0fz&SB!3BTNLh0L01m_e01m_fl`9S#0003wNklEaninmGVuxxStbgRqz+!@fPc z!D3R95)9jS?_cGX zbm)ZeEl?3J00EyVc5F;r=}wah5%D! z4#SVFn;8yF+r;3IxaIK*#(i#UXed05SyR+h2V0e_%c+1Q>w$W_S`#JxC5CDyj&Ez=!v57`UJgfB}#X z(b+JI-@kqbrlHY7&=GhYASb8rUnr{q%!Z`{5Y2{W`PHiz7z6}GkS!(}5S0c%mV(j& zC<+b$`R}Gd9EIjPc#eTN0u*`_IRNAq{Q^f(G&;cek xcmgEFa;i9h980P007}5914bP%>VN@v004BWo|uaA($W9`002ovPDHLkV1hvxnTr4b literal 589 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|VoK zPZ!6KiaBp*ZS-aelsUfNDcd=1!1+qbaw>i%WCD6(Zs*tXWK zA*R`C`_GYUMGJ#rLXn_N9fPkw+#sf3BB4=(|z>UY}3`M-m==KtLx7? zmW}}Hzs$}SJ#rEEpRY?_C?xtb_C3Q!j?G+R@25Rca$#NdX~vCpN!7DNZJk`}!kL^F zCjJ!cU}ZU!T(sxgwvWbauhxf3>WO8n-#cl6(*2DMQES;^&u_0;fB#w3xynkNho4^` zp0z!E`-)TVH6HxSxpHEjO``hu???TX>#g~iV$~G$?$Yv1trSXX_v=IT(9f5K|Q z+jjr`^lpRI4mK4>l%)6~S7Q=VAYaa0v<{y*{jdnN@wZid1L z2Fw6UWQ0gHTo&GG&u~Znz+Xlval!2TU&fSQ%=eBrx-7C>__{+(s&U>I_Kuo^Cl-WO yPkg_}USXbj!PNYjpSRg70F`R3JB?va4Rf!${Fei_UkC%!2ZN`ppUXO@geCx_?EK&W diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/high_micro_laser.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/high_micro_laser.png index 2bd8d3837da037939796bf6e9c74730fdc936985..c23c941e150eda9e282659576a6b1707a9b721bc 100644 GIT binary patch delta 306 zcmbQnbe3s?N{ zjpG6(3@0ue=Ket_XbQHguQ7s1CId-y7Tz2ThmcCO@E2W|%gE(bg2#kAG?v_XW7^K&SyeO0}yFj0@#(0{{$TSpXKfqWW<)N6&}@!TFiA!rud#-!A|X zla^Kiyy_kR7<`Y!_fMGFoMycm-alZmSS)YH1sm*JseF8qNdN!<07*qoM6N<$g7!Le A`v3p{ diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/matter_bin.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/matter_bin.png index c4603632dff5c79f7610e6bf724f687f2b1303e1..494582986fd3e448c7b114a3a92ee75d0d323d74 100644 GIT binary patch delta 431 zcmV;g0Z{(V1IYuBB!3BTNLh0L01m_e01m_fl`9S#0004dNkls^-zNcMMmrUSRNabt1_TLoX42c>e|*3V%S*Es5P0$G6@$LAFoQmu7=w|%9+;2pKym;{4mf`J zAcMZ63d6%YH^B~&5EDaj1TygT^7_Ad+cts;k?M&M`N_-%ID*=K4RZBvsVgIEhB{1YbiH<>51%*%b zx&YY`AT}tKg8(e=-@5yjEXzr90FomZ7}l;vX%Fms^eCP_?EwsjPyr0R+HlkXqYj`p Z004NKpP(c3k*oj!002ovPDHLkV1h25y*B^= delta 436 zcmV;l0ZabL1I`1GB!2;OQb$4nuFf3k0004qNklwPye( zr=}I_Pmd1(j2g#;X9^jp7E74zwzk>J7{@1oW(3t@Nyva+NCh}uZcJ87>!K+k*PSl6 z=vZ|TtgU+hIDgm=cdVBymEIdTKRszJ@NR4>YTjOIEv+c3B8bPL#ADI68oA!L2o{%? z0XRC0bky`Eg5NBxtOCs=KT92RnaKcPaX3`Z5{{q~sbqq{_D)y5Ju#q@V8&tVpMi8T zp^JoqLfMup6(XS^>10CaH!pk#eg;awpW~KvaB-byD=p`zkjn`#hc4d(vvc!`?*TQ7 eH8eCdWWE94#e$z+?t)eT0000<_?gPQ}~}@AT+9RRXiOIMFULQIU|#eb_;3|hLFYMwoR!C+~k zhc5h|7)RiB0L=2^hYy1Jfx)3*N1y{KNeQqcKr{@1^bz9-ybk#I;XRz4%OJw=1j>e4 zhHfc2fM67WECGSZ3~v|$k@)EJhc}oZgX{sa9B}E@T~P4-mse3|Fw)m!ICt?9R&@{W z+++Z$K^KGSCqv%>$c_LRhz)%B@s~k>gP8$co*2uCasV-gJz^jq49%i=)B&Ro7kJx?-Don8Cu|EH(M7XOcLU(Yjp+Zwgg zI-3qmUw{2y{m-hm|F^E*{jc4~;E#P-$-DZZvq?(fj~BE1OMn1Z|2fs`9H(RymMa`S z00asO3f2aE4Xp>-`TN2H$~fIy&c(Ha?v4~u5J`BZ)U9rOSFwZG35y#1xyHmj@V h*Hvb)(*q6OFfg>{crW&Cn3l@`1fH&bF6*2UngFhSZ=L`E diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/micro_mani.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/micro_mani.png index 8dca252f688e5ea18df98922c7dc02cf353ee676..c63b141f11d8ad63b1579c59afcc6447d82c91f9 100644 GIT binary patch delta 363 zcmV-x0hIpk0)_*SB!3BTNLh0L01m_e01m_fl`9S#0003vNkl-gv5FAPj40johT|`m- zKNyJva-57_C}e|{o<3L(nK0AvX|fJFnua!ddX^8ZlZgTc9rml*H?oN0i8OaOBP z$oHUV`SSfS*x|U$q)AB#as*n`-~@xSC?0jdr~^hFFzNt$0ssbqdC#va9D4u&002ov JPDHLkV1i%anSlTR delta 339 zcmV-Z0j&Op1MUKlB!2;OQb$4nuFf3k0003fNkl1pw6o$XF^^(Oy2za&+ zUVoAG5(@ezNl5Si^?nH~ z7K_F5WF~((6vwdwq-i>7$L)M%Lc2^;3E8PhZ(KwE84799aw27Co;$axF-|sn{ zPQAyr>weW?OiWpGe#X&fqiq+yJMmC93d>G(ZD?Xt1jCeFEIXJu+xu1@VA;E^mQRS` lbNg`7K2Ny0#bWu#d;u5pZ+MgdwjBTf002ovPDHLkV1lQ?p4I>W diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/nano_mani.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/nano_mani.png index 93b2d06f098388d6a153ab87f3bfb3836c5db4e1..0c3defdefa4fdf1061e71e468e243ede1394a20c 100644 GIT binary patch delta 380 zcmV-?0fYXE1FQp(Ie%VBL_t(|oMT}aU@+={Q3s4VVAKJl4jB9n@bnD$kIdh`eFGyt z^;I0000L%}k1m#z8OlgE z2Y`T~fhL@N{=#*J{rjf-*0b*M)`+xie1_li+b%v|KNeBfw z!C=cl4n(H$If7^h+_`gyVe58O{=xmP!Ipl`>tf)YRK{@Z*cFD??`7fg$TZmwc(7Cc z|B-qd@@VdpL;jf;$44 zrpN)vApim(%Tr+h6yzXFkJqhauxtuvAO{c~0`6W{{$Ia-1x0Scwxw_%ZmF3@8wbF^ sP9)2y35HHxFzSF&2aGyk)B&^t0LO8NgsdPP_W%F@07*qoM6N<$f-iuXKL7v# diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/pico_mani.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/pico_mani.png index f3d1ff54dc93bff2eaf5ba08ed42bc1f64a49508..2da4e416464424d15410f82c64ecc33403fa2200 100644 GIT binary patch delta 356 zcmV-q0h|8y0+a)gIe$h;L_t(|ob8pn4gouj)Q6PHNlPbQhm&ivn;IWy~pA4>r!00p1`6o3>! zG?q3*eYqHUz6yZmsak^9lOaE}n_#>XLMj4iEW}|t?}K;=fPY4~YZ?W(LWsU`XLffq zG;)u|r2sO8l5yDXtwnIb$?nJ@^l}}$ZUHO^FcXTJi=ESjThrBD5;_@60f>cY@`-$Sbq!^& zsq3d$#@vmh-T{#dWB9>SY(acT|M53e017|>d{P%az@Cv??+F3`00003&IrGse`7fUexiQzps z_{jl8hk%Lm`#%3L3vV!70@G*q9*6r7$fk`0kSw6M)T77&v;w0J7EanisyaYV-{gOj?^ht}E0}-a z1UJLFTW=VSF44hIdv@1dhP?L*{~tYifYT9VM?v1A?@-ovxR`a!6_U*%$^jr>BlGJv zb2A7Ca-*p6&V9iEixxt`PLcyafAK9XB?IRRiVA`0_pjgK)ApZOM-UYPPoF(OVe9DY zf!SBDUcgYRt!=0x$jV0@(#2iBL{Q4GJ0x0000DNk~Le0000$0000$2nGNE0IF$m-jN{}e*%k1 zL_t(|ob8%DNE|^JhTj9Ru~4q@k3a+of-AxJ6BH{&L_`PyC4x;PO^T!ou@Xs@V0RWa zq6mUPAx#QF5v&eYQ4ua+5jZRqL&Bv9*9hS<-^eazmlJ20S;6_9M)w=!nR(CC)qN}A zI2-^RhXa7)Z~$-|4gij$9l-GLfAbQ3EEEbzr_*w_x%nl9gfQjT3V`Hwb+zGj@Hx$s z2*IRZIe@7AIyAQ(f@!~U0Q4<)T^MZU;^Iea-3F%pT5o}lj&_`#ormIJBaMv>*xufO zZA|)=1Mp|w0UzctI5-e)fW!pJ<@(4jY~fE$084A-{j~1i-me^h_kI@sf7f;3#mjIO zr0#!ShBrEn9PHuEFT(#cD_?||UxZKlQ}HVYP}A~69#V!7-JF=yI&%B4h4j;lKp{l^ zVy^1f`WetU_8Jg}jq;#p2!DS6gl(i>9M*(iIe=g1c{H~@l`>+ZWgTNDI zfRpSN{f;d)wRXqW^56D?e|2k^_G`Tbs{dX}8S!!DJMx`-;XDaU`n3Wm7K^B^g1iSm z71Ccymw?g!ixH~=^f2LQ)$K7fD5mlkUvD3}lc0000VQ!Pj5=V{0izC}xdZg{P5y)EOBc^D(%k_d z%ePLJV6cw4f>RAa2f%!Q4KPLKF#KCS1%nL(O}<~jmOpy*0ITl_Isjz(hxc#5Y;A1= z20>9FhWD@EAru_kz;Jx#90tqA22?f_t=?lSI;uoI5>eF zfeaF~85rZXE44DlAPoF&j zM*|4ty;t~;Ei~{(!MkY&f)0Q=0=MJ?>})8= zTcq&+=n`dMR>U6vL^*&G0J79NhT%UxH8d}ZDM|zM0HY2Vb-<_tMjZeErzoaF>8JT< P00000NkvXXu0mjfrRSkd literal 371 zcmV-(0gV2MP)(flqAWoXIYj>rVP zAY{I%2i)vDQ>$+PP^)ipzkMf}Ml58$xCvfwT>|j1dn*nvBUHX<1I~y0h47Qt(^89A zX1@3Y9KM_Z(0S^J!^;Sj|L=c=<%@2&J&guTr!W}A`wRRl`AR9Jlv1kVz5vGZr4}K? R+4led002ovPDHLkV1n%7sx<%r diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/scan_module.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/scan_module.png index b95b803d8f7eb81581855ac7bfb9cd74b846b3f2..a05d626eea0e41ee7c45b01db0b5756d1ce45885 100644 GIT binary patch literal 478 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|Vm( zPZ!6KiaBp*8G0XfU}&BH;(}pPho7s4g-GsnrKTV0bN+Di`N{s__WLI(=n@m<5+Jgr zSwUlM@M{Ib=~11RTDB?>zYgU5+(}=P&;GUj9JIUioj;Kg*p%f6lZ%(9++w{y;^Cjm_QrNhUvg zu04(qnK)lFAxprX{le~jKfl&hZ&d6QBY*A^WwR7wC{kg-=5>g~3i$--b#)GYSNH?$ u9sV+WWd<=0@V;Vq_}g%40#azr(Z6Mz^JC}EQ;xt0WAJqKb6Mw<&;$TFE6KkA literal 491 zcmV9(urJYCU!XB+l9oP!gNp^V)X-v6LgH2q61b{MU_(PR8RXO&eSrq27HcT* zINk^s zTW3#20kfW;@qMt}Zby=ISuAR`R?}!SQn_6A9`C>AdlejYyW>?K48~tPKaby^o|LIp z|NKWtQ@&TRJ5rSEbdzs+~fOOO8I@hb546N8(L^BtMa;*czzu7_uc^?ZEqjNF^rev`3pU6-m8?oHmf0I{#l=g z&ZNv@zaM=*1n&|!0KdvFx>NNH^OK%G00000000000000;f?038rl3E68q9ioxV2as zv*3^W0mir=U@Yis{rT2{|Ax+bf4;R??g!AH h4*&oF001x(-T?GNg|&x+);0hD002ovPDHLkV1l)(+F$?x diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/super_capacitor.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/super_capacitor.png index d6d1f9d555a0a98a519049b70c227aaeb774217c..054299f6d7ab343ed10b88b8a50f00e59be60e7f 100644 GIT binary patch delta 243 zcmZ3?yqIZ%MLok+PZ!6KiaE)N5(x&c8UopStP-v;F6NUcWr$q!EE%3v$4oo4s3Bm(~C&vX%n=Sma{EkU+&n_ rG%JPufXqRMWP=^vhv05sz|O!B{Mb$VZP9#A1|aZs^>bP0l+XkKONC)E delta 372 zcmV-)0gL{l0;2uLNYiBPDLoVs6_|C*&)u| z#Koy9s5rT05IVSM2DcVRF^(ySE}=ukAt^#v!OwauN>)--sJZ(i;IVk_$*9Sm?mn3WJ{yt|$34r$=WLNR-5u66@2~Y++1wE^_R!_@? zm{$To_7Z)!4 diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/super_matter_bin.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/super_matter_bin.png index 54678e59150cbdd9b369d147265e3617e8a065e7..b56c920f7be3acb4ab4fe2dea88296c6e2575934 100644 GIT binary patch delta 476 zcmV<20VDp61B(QZIe)!LL_t(|oMT}aU@+={Q3s4VU}!nOH9z4$jQ#)q7p!XbY+A!e z69<4SSJo7Q^Y7wN=i(RgpA<(Bs!rTNhk;R%ha^Xk6a~nZOH0Y1 z$US}bgyH7;0}Sec4x|`Kej)@}i0%k-0Lc#c@cs>$289I35r1@ZfR&6G14C61I2w>0 zf($^x4@xU{aO4n*8~_7eKt~V)FCV|4z5|Xuc?Agt0$}m(8w{iXf)3C%wE2(B2RQ^8 z+`aw|t3Ek7h5wHpJs_AB2|BYMDT6LL}$_kUqvC2fXg?^U-9wOfTTXb>RQ_e47Y=7^7P z75*ES=rG(`bcO*$e_V8h!PpIzCdG1+8~_3!!)5IrfZ4ccQo-QQ1)~n2H2?rhjjn4? SvY`n80000Hl%bEoq*~NOcFm zEPVFhF@uzXEQ6Du8^e-Gb1~F`${*#XF@_?V+1Jn?}N-M&TJ7#QLpav-)-oEO*;Aj?6H!Xr zAAzXi@G$8w?_fE)tHj$MI^gDiu^^NnMdz%(hA6YT&P vsIHktlHpW$04>0%14bP%>VQ!P47dXTHfNF$WMu~G00000NkvXXu0mjfxsTL#T@vAC^Q~)KHf_Ptt1JC4sApv4a!u)2 zmeJeRA*OobXxpKM3*SE5S@k$6>UrGxYTkR#&F>r*{Ay|U{ZHl9biPvy83Xuu8;UX* zrZ_V%m~(?I=Y44H<+%7c>5KkO_)w@B^ICltbv-2;op~bT-k1>u^Non84RQs$fACHB zcoi*qVQ=O`o^Lar?{*2Yzoz!WzFxsf)IHNQzG=5=YfIgm;01r5lvSONvcG7Uu`J@V zinUGMnRRoV>rOjINz`tBJ^Rt|o7^$@U!7J}FW1hI&h z)?<;15KL(!R3#G7L2z{;mrZD_Mogg_noMddeI90JXVYw)$;|A&4E=pz88$ofzQ6bT zy?-IXH^K z;1vw(Xn*gVBU~F)$F*%r1D1Yi0M%*jh6B>a^f{n7g31n|iX%E4V4=tP4sI*dHU#K& zK77qf=jVV)`hiX)-%I8@Rln`WH`K<@oe)Z1n>fYq)Z&>G-22h3K8Q!>hmQVXnVwxt~+uQv1 z<7KKVZkatf)KWEgFWU=8-!#p}XP3UaN?VO22u;ECTYoV`uQtw4Pw#1OcAR?p92KHirWzy%r>HlV<5hph1}|;z z0Jtrwvi#7U^gbLu!>|4D{m{uBr>|T=_2f{utdgT~05JD4-27|jq<4B^0)R_*Uuc~7 z%a^F^IQ6vz+Og_e|DUDZ3euwy#ru%p;aJ%s0-$AkTCxN(=;31 z@A~zNRyVv4nb%1yRY^Si5P&=p4FRPxq@RYlMOWW6O)hM{#50ShxxAKS`#!ulN}@JH zs#`(&8~|&fY_RJ;I0Xxnr2N*uHbW{q4qn<%_%)(9LdBT_9_7f96} z95A=ox}34DAGnlX=G7d9%;H%MlO!rh35dK#L`pl+?}3xYG* zYYBoqIscmibUYAjINh+09S?%r`c&9f7(^R`-t;j`-#+#Rv7z&0R+L12vlUFco3Jab zSfl%8P{5WiM1?qC5ClOG1VIo4K@bE%cx;II!?1As13>@d;FzbU$9IFqLD-)V0iic& zl*-X1U+q`B{}U>}HTxLbAOy!CX>U@{(*q28``-%wKK39GZU}PTf$De{YGCAHMSQqoz&y`MTLpdit*A-k$mSQPal! zeBJzi0Gga%Ds!z=rcx?XcYbb_pTBYimCLxF&=$5iKVLWA!$pe>u;F*87miN2`T5_x z&7aSo;85)|mj7tO5M=j&g-I*jd-yQQ(RcFm`}$s^`tz)-Z}))OjCYE-PQ3RA6xhIE z)&6EJ_YS*1x6IFvnl|R=>n6}D2x787;Bi3r{s7(jVTs~lTm-W*mI9hq8o3Or w`bE5ZLAWtfXMVn5Bg2m%2!bF8g0OG?17)@3(3V13H2?qr07*qoM6N<$g1$RElmGw# diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/triphasic_scan_module.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/triphasic_scan_module.png index d3e7d72b57de409a078622ed638518a3d732bf7c..e2fd4e6fbff41f2e89a8c64668a35d7cabe4aaf9 100644 GIT binary patch literal 770 zcmeAS@N?(olHy`uVBq!ia0vp^4nUm1!3HGP9xZtRq&N#aB8wRq_>O=u<5X=vX$A(S zEuJopAr*7p&auxB4wN~*-%IeNLf96uqcd(!+vY63(5s+8vn$)Yy-Q*14$GhGXU}f- zKIqAE_o!)!pt>U8&Ex>j#W$2zTsT;1Lk{C|-czrW?1pO{e0b7|HoUQf?m?0nqOc3Ua=M7ES*hh$cDP7>Sp);*XuugtNY&Mj?tX1y5CPu-n%-n za9wSKspn7j>ERncr`TSuS=_Mo`To80O?~{&x35lUuBm_hRqEO+57(f&r`JOF7;$>c z%oh>(dHCW)PmZMUu!rYQFR%Uk`0e31uF0QPi|Zx7I``M-^Y=YGznWXFKm2IE{^MzB z8^1latA8_G|H*up<15d#90@DQTgC@c?ebd}%5XIlX)v5x$e_{Av;Z3?vG#z%!!`U2 zubCs{5By@NuiqCslmGUq*``~X-oBdiika{Cd+CXlE}C~^HlEtPihn|YQf;Bz`}qZFe1dF?CaBk$63;`D66&X-M+lNT7iYB|rCww&8aI&~fQ1 zub5+ke*9v%F0#!|L7yvHeu8-GTK*H=3+Kx#{6DK}$`pKh_1(4ExBve9oA%;4dx`xX zb;T938}81(pKnxI=dd9^zIV;P6){}g@$wI5OboAz25hY!mrwjU3l?hUq1j5Eud7UlmulKE9qX}=Do4hR7& zn(zRi-<;#@;2r(ue5GtODVm%ZvpVzU^hx_YW%85fD{6mM`6B9fL5bOZv}ob(xrWiA zl`8V+`zvKlh&n&nsEhkU0KmN6Oyx)AOb&n$u)-jSJGH3&Hn0qX0IK=w9pE^r6Gq|Q za2Wrt)9YoHEi3P;nzx&HIlqcKq0{TFT&-j1CLrgF~4*r^O zrJu)$We0)G0OZ3s`FtWGA|fIpA|fIpA|j$4ApSpD;X0I6et&>8$@TgFf%NE;&M%Am z1B7vZfH3VjVB6N`OIv#q{%w7}NmZ`Tm!`EtMrVD#$q%5)_4(4YcF5?g&o{k8rmFS% z(vJOP{gcc#2Ah}c}0Y=A^(YW1i>gcI`b5m z7MGP^uu2mHI|2q4@4kVdKGs!(fx!#n2$&c?#}JhUwoMdZIDfnAD#IrR6O0f5TZjZe zj{1N93qy|HRR&`>WuU&h4ERC>rvqL-e!-x^0Eq&x{13no&}N9Uz*L7TN@}+XGcauZ z0AvXRJ@A7e5r-r2hQQtH?-(TPR8TAfiM=><2h0aWOLg!YhQuBYhWRBwz%%;Ff*EAl*Lm4j6U7r~^hFFd`fP0PP-v2@MvA8~^|S07*qo IM6N<$f+@X@dH?_b delta 277 zcmV+w0qXvR1F!;+B!BlwL_t(|ob8l9OG0rJh9AYD;o_u4g7^oV#3}p+4M7q#DAd%f zI0n|IXt9rwgPUB}Mh7qS1%gt73m3P#_tJLV#2R119L}@+IKz40mvat3Fbu=^XHrVj zMXQ~J;pe6fqc7&(Ow!6IO{GeWAn-S}6K53}o$3oor*o5RzkjM$`Y(eiNPFw|@00Bn ze8&+Jcf7kBSiZmV`v_H}0E4?T7K;D?-(LYR_hwQ6=>{G>mvZ?CfI=b9)5laYmjeLY zK0g33d>hH;a)55L^~3zSc)r^J0KMuJ0G9`+vN`O*S1e6n;*L}G#tFH@V;m>+; zCnq=|BrB%QG0U;P02gG2M00001bW%=J06^y0W&i*Hen~_@R49>S zV4w^zDxe7nE21edatuIKpduE4rXUqn2bux~MsZXH3__)73TD*N93fP|fK!10x`ILs z69mvrV8^hcq7}`GS*y|9u%;W8&vjx0eg(JC6mXy`=mIL>dxs>z4OH*|2;qPasDJ^4 n;NTrY0ID8_cct$hFc1v@&DR delta 417 zcmV;S0bc(70j~p)7=H)`0001UdV2H#00DMML_t(|ob8t}PQx$&MPE?|RH;iCI^dyM zkh++m7jUHxC?jWJ=L(#mf|-j{A`2@LUb=KBl9vp4V5r#4Kod2hEhTnRB=}oo$?y5w zi52+IUx<{_B}w8ojU6=sf4+<`#;{4ER)HKoN+FkMOkf@UpnqVL!erQPMqm^CCVoTR zKeZYWh@yyVE5C&UeC@TXt#E*?16AQlDYVvDYtdSNJAbe(r~-#T z4XnenEMqpC?LDt|13qwX0be+HY{5EwKA&TZsWexm213E1LIZ=rz{PRQa=G+|!>WPR zikwnvA?hw)FJVsFJbTaq&S?7CkKZXsQtenxIp&)T8GDe`5F~(Lg;(|Zg%0$JhrhL00000 LNkvXXu0mjfr*p&W diff --git a/Resources/Textures/Objects/Weapons/Melee/stunbaton.rsi/stunbaton_off.png b/Resources/Textures/Objects/Weapons/Melee/stunbaton.rsi/stunbaton_off.png index 59940f44ca4373ace1a3068261c7b823721077c6..8704ab6bcfc9d1cc1a0e0a9959d1eef636a6de3b 100644 GIT binary patch delta 208 zcmaFG^nh`KL_G^L0|P^2NcwRgr5@lD;(Fk~0XL6`__VVBoyH%wI*JNQuMRX&SGQ19 z(Ka%-6%mzo@d{Oxkp5D`d>5#Nu_VYZn8D%MjWi%9-P6S}L}Oxd!U7%xtp%JM+KV&| zig+AC7buA}EK?8-WuL{w=2jTO%Hy;&gX_vg8O4wTo({>ZGHWxqtkM^1&bZsUEa5nl zmc|3iW|af1Aq5N^4;$E5G%&V2c);V#uu87YcxgJHfdDUqo1Ij^3JEVwpq&h!u6{1- HoD!M`@`vI+$Fb`L>fF@Y}pwS?^+cAM2Q0)Kt*=er~2%iF~w0!2~q z;vwAMU0$8NJa3kNv6Fc)5yC0c8ob7-vx=O;UYIdDkSKo{OL4Ru|Q zo*Ugj3_MyO77h_d(1jagu-49+HLHPCaG246hto^PxI(^;hXInDq8002ovPDHLkV1m=$n416q diff --git a/Resources/Textures/Objects/Weapons/Melee/stunbaton.rsi/stunbaton_on.png b/Resources/Textures/Objects/Weapons/Melee/stunbaton.rsi/stunbaton_on.png index 2132190ad45aa02a2165f4372bacbfd0be16514e..2adbe76e9e16819f2e91a89abba140f95eebb6db 100644 GIT binary patch delta 1738 zcmV;*1~vJ^2-yvgBYyw^b5ch_0Itp)=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi z!vFvd!vV){sAK>D25w12K~#8N?OaW09z_`5D0;G1^VgQ9g%)cOy@(XOeMZ5bL-Alz zDgm`39x5sn@tS&(R(eo`VorJywDuz6!HcANu;9U48>)>Og@0;N+q4QEJgoDqGs|SY z+1>ee-*=|F-#qZLyR%>NWS(c{-Pzsu%gEy5ViFR)UQg}~CvKA4h(PdS!2OeN_7L*W z8?K*!WJYd#h^)~Qz%Am0+%M#3H9!hKKYL`$;;ZlM3z6&AM8`h~!GHTbU!4}4&jo*J z|Je+XBmQAQet-1K=^wJTw~oD^W;-4rM;!PMoOUFo+pR+y;<5Z`St#r{9H4jkNm)UTM{)AH~|sF z=5Pppq#Y5ji(TjblN*51T|_?l_V3A$-`sul`_=g~@_*wTSQGqN+R^!OtoVgUZ2TDA zRsGlb*{%UaZ;-;QXjjS1CZPL%NP7yP(5_kqj+ zQ+(N62`U53&dX+RDC5^hya|$PKwa^va3hNkl+C`z21N0j@i#Icir<{SwgFLm8va@a zMDgkP2U-OkdhzA#Y2M#g*OSrl9VFrpvI^S0=YPHp{JzEK;CG$@5dY4x(FBo-pYlEO z(RrOeg!ml%P6jCPN5{4%SO2^sTm3)Lv9`qPiRjXu5eihphO zx6bgF8W6?j=PxuMitmTtYCsgeBh$+op2<QShA6rnn3<2ME20Dm_>*&DICpn4DbCe!w6LZ5`tfF<}=TgpUeP|i^#u{BQ|{{+5ks=zJKH{ z>^wKWLXr7p{A31zT!bpW>myfH!W@v?dhwGte%*Kt?)s@teV6z##m3kfb0r?MiAT&&n+es`v|*iezx;e<2zh;6g5PU*Q)N znxanUDgT~9`OU%5Xcg4Nc?z_JAEFnTUfX~uJ`I1Z6coj$;~!`SplAu(E`QbM4+0K; zX9HBl7_hRu+*dQhjjr-Lr65I)a=rNd0MFkK(8;@AC~E^Zf2jdce185y1ETnT_^k#+ z@%{1lt%6+0^@3FD`plu@hXH1cPi#+j-F0t@t$A+O){SlEF+~g$zqJv+)P-CHwFtw+ zUw9*?rkR>zD5qGx>@gJ#34ed(ovKWyclr( zeAxQ@8yTz@VJUi6sERj8A1)kcU$wLiY%@R?UsVO;RbI9ek%PqmQ+!pZ3UJovw-H=3 zz*~KO>w#+kWuO)kWqP6N^V=3|*MQLV`E3EqDo9;yL)GWE3FHRoMSn|pcm+i9i$Q9D zSuv(oJ5l&zkQqQ(t~X2|xd=z`>!Yy&QT%3TWIzJeplg?g7k8|5cT<8Mx_BRwUQC_QEEUGpC5$=MDhK=YCsgoPR-|3mK|CRkHY=>Ok8Oenk&Q=%%teb?s?3o7q~mB^v$^Sch`M-dS` gsJs)7;6#%A2Q;gBDykCIUH||907*qoM6N<$g8DaQjsO4v delta 1071 zcmV+~1kn504Z{eKBYy-6NklF>BjE7=~Y$7)nOh5JQcjOY7+h@oK2DIN%J0 z{)5t?WB)?vPsrH+(IHuyKafB@nc}H&i36^O45pyrx=7|MTbAV9-KYC>F9eG~{M@VW zPSU~mMt~QoYBnG;L?=3&*Xmf>V7kITFbF-24x6(XngGyh0e>>Ia}r9z?*kYo_}y9^ zSH|JdPv`y)$3h4>91i9E9gby)j&gEL^9L$lh8S4pXZn9;0v;VUXEQWU&&18o4-HJG zQ+)b7yoqK*Q#Ut-KUeu@?}wKWzi)#Npqu4idjVp&dh$=Mfp`#>l*Jz#WcOqK+n%^g z;dkQ$69w2X|9>L@POgEAp0Qib8XwBcBjAs7_+L!`?FC4KpTByLYp zw)xUhfNgLc-&+O#lW)QQzA4_JjyCKF7jQ!?`|^Y>Z-T+Ek&U-%D& z5VGBFW4T zn=b=DbAJU;nXd{z^9$SUwgiCiP~zd&AL}Qe>ijhwy?!Y@U#|-71CE}*fDnT0BvhIo zgQ*6ggKGQ=SI?AYi^&cly?XL%f{{*CSI zQu_1P`eSyrYuMl$;tpzcT;#d4KxzO|6Ese1esHL=0BV%kw}c2Vsc4 z_2h5i8@mkUht>Jv9W8Qy80;i>KKahZRZ0v`r|G0S5HB@?*q}3PvLxo&j%3mwH6?wKi>HB zZ+}*QK7hW-G3?{NQuzRr8^3-1`+R_9esU62A|GIK<5kpuas~Q)05RX^1Bm&R%LnMV z92Mp7V)}dlG2iC{i1|JrK+N~~0Ajw+2N3gpK7g3-^8v(spARTGe@)b_c^vsZAK(g~ zYkxj9-{%8}YxF%Nb4{%ZJ@&T^NWOg@0CoX7`oR_XHr+*Rs)KowN_d;oWqJ|Ezv$hYR{ms9zGN+^rE pKcB07K7d%xUc`f<@qt8y=R=jP2qBvaNdTSoy@g8oJGIYH>X){PBW$kRW^1? z03R+5{;&eM73HVJ)sc)Y2x16`gc!sSt_BZ;-pbXp9tkcls0p%G5pb9QdQ(u*Uzn?f bp5!6EN-!F3!qZui00000NkvXXu0mjf%S5GH delta 1571 zcmV+;2Hg3L1E~y<8Gi-<0047(dh`GQ010qNS#tmY4#WTe4#WYKD-Ig~00rAgL_t(| zoTXP=Z&Xzj{`NkXxl}3_ffU*f)dyenK`;dI@??P0tA-HYc+e=+s;G%3CjJ3@k$?j4 z`o^UQRZ?Dz7rdZ8s0kPq+S1YnXi6w;=iK)8TW7c!?Q~|!?te6sIp^%XzO~l3zO{~v zD%R@Nt1T9=Mn^|grDy&Jpq#OZ%u3iO0(fNK{t0yLTm%^Y^gLd&II{0Lw(VX4o5X;2 zu`Iqa=UM*+<<9khY@AT_FvgTF@)*y*kH4p&93M8GfaBExj+mxB{@HK>DpwB`2e3wC z!YqNYDPCCD#eeeX>YNdoGX?TscFl6Dt%7nh=_w|d;kOIRf9>UVDpb^~M{cyNZ_9ekhjE>Enj`AF!0r3`EtQ#19t1v?Uff01{wlE}0j;CeI?*!Z5 zUXIT{xrWvqOW?X$f{GX*0@i{%SJq5<04C-qhFiZB$$#{9dQ^|&A74htD-AHjg_wMx zr$%{jGIcO+fVLMG;mDp5Y8L2hZL_|G`PPY6@+=1?D}1 z3W~g!WsWU@pJDW#o%`*P*}f}1(MK9hlC|JywWo^C=pcq`Bc1=>(vfGvT7B} zOlqDLA>~#AX3_lkCJg^Hz=#Z>uyG4dVOcO8x0iNB0YpC%g3{!OQ#*iQAdc-O} z$A1W9=t+QZCW4>$AapFOZ^ihpr*YxS&ro=33(GEhH+n{tDNa)m&rBj5|FdjQn70|3 zD1=|Plma&m(PJ?#iPls(WerxWZNsHA$1!qt0BfFk{_eg+>`_B9S?Fwe5vmA4Wmx0! zY${6Xwuel#4QJD^Yv#GIu?rWzK7zroj(^_Wm=u|RMvWjXHDbX4q?{}bE3#ZXo(ZOr zXLaC~#ybL#scG5Jj^VSX?rhU_i(zJ_NMdqBn%06NprzH4K$KePIQdNJFe`)<;t4Q< zuwjg5a$@+$FG~BuA{@tKDiTs*X5j#A63|2DQ2CDihq*z z(>;X^9WahGXeuBZTBS*5UI4-6bL!Zq&Gv=&mZi09N$w_=pj3u-Zk3jFN+BjIrE%S} zXs0k@#G!;KI=TN6w(iK^ zI{;}w`HY|T1(}FMo`v~JWI8End|GnpC}z{iNU>BCP9j!&sI)2qkV8A(T7^@GMzDF; zDn>Of@xhi#6H*05_6tr$ED5GaW8mO0Hov@z&rIGsfMD#r(wWC>+pCS}-+woVww(NQQ zQkZ2rvTV8i2gcC#Mhi?h#k}Zhj;;P z#?V)1ye0s$g5lqk-|(=tR66+e=ZPDV}GOuaxLp@ zGCP%)rV4J{xnAq48Nlr|d-3P=6;8yynwQXf0#NDgxZM2(y&YF;v>clC?=#AQ`3GlC Vkp%GIK=l9s002ovPDHLkV1f}G diff --git a/Resources/Textures/Structures/Decoration/banner.rsi/banner_cargo.png b/Resources/Textures/Structures/Decoration/banner.rsi/banner_cargo.png index ff808bbc8bbca4efe6e3184df645be9251be9340..899c8d6e4cb0aa6d7e4b18368d411d3c34846a18 100644 GIT binary patch delta 400 zcmV;B0dM|?1fK(t8Gi!+002a!ipBr{08vm(R7I4Olsz^yO-f25RUA-;r2yt67B^nbq1cr&G0TGzVcCeZWi;Sc4y@M)01DM8Hu; zCQ*72l2ei#3}O)~bJj3%djxJq!g&CxI}E6$m7zAINTe&#?5 u#-OeQkj5AZR|5ViK&Y!cD(bJe%P*r#9jPSko{sy&W}GzqMVyB{|CjODk|Tytnx-`iP@d-_U!Ok!Hh;58{7N!^E>DcHbg0PG z0S4-ZNBfLj%p%cK zkPF7t7b7P?zJK}>ZJO-_8OZU$0H#1HOsFXuV0j;lc6wO`8OZUBaXP@$vfgYQTx>>d zpe~Htv=MAVO)Me+)}XJ@07X%d0w+l_ECA>*9<$HiG27j$oNf8>gN_-z6AmR3z}!VO)*kq*kIQ2W&p3;QQD0F0000D#*AQSSYXs;JS z5hCq}P0z%HjP0-sNU5JW`700000 LNkvXXu0mjfoiw9? delta 711 zcmV;&0yzEs0@MYN8Gi-<0047(dh`GQ010qNS#tmY4#WTe4#WYKD-Ig~00M?dL_t(| zob8uQXcIvghM!H7)<_#g@w9kcFJ1&orKk`O>M=qEd(uPOc(bR1XbWvAA}YlSimeqd zf-QQf2l3}%1VNPggV5809wY}Vilj;slyG$=gK4Ke@fLoL3;((O8)`s0;FC+yhAUzoZB#fE`*AC zT>x3V^EYsI$4i^iizfwYsq^6PvGFd7n^1orHBUu>Yrr*FF10QpIlh3JE7aPVE2y002ovPDHLkV1i6$NB#f+ diff --git a/Resources/Textures/Structures/Decoration/banner.rsi/banner_medical.png b/Resources/Textures/Structures/Decoration/banner.rsi/banner_medical.png index 5bbd100773c4f80fca7401fc06b73090a0460cd8..c2dc11d21bf969063699ae9e24e9e1991b61e312 100644 GIT binary patch delta 405 zcmV;G0c!rN1Ed3x8Gi!+002a!ipBr{06$PnR7I4Olsz^yO-f2E;oDc5}eXC0umnSZwX*CF!%^q`b6##n21 z0l<-ehOM)9u@+zfw>plX@9qPvtGl@tzS0Bm&ilpt7LL^U1K{i~$z9kz)!|+Ecm|e+ z8lMj|UwTE8h?0aFlZme$h$x<}AQZ+kfXGDn69x7Wdmsyd6gE*1A7k!-BxBeB&C>~> z6F>t%9Y6!1^?x%Ucil@5)cQ-=_$qZTCtxc&uY~s827pyPaix+8zzDBUYB~otEp!I_ zyNmrC1e%}2ev;wpBwH_vY;e+x)^DC(S~vS{D-r2vH^sqcBBw-JKPAeeFNFxg<)@ry zHh<571FQp(8Gi-<0047(dh`GQ010qNS#tmY4#WTe4#WYKD-Ig~00CY}L_t(| zob8uAi^4zR^S=w4yUU7w3>JPZ z#LdUftcf7!+vIDq@3T8I3)=>QJkLwPLSY!TOffltGPB-j4u3)jl5rG8aN2(tj-^Aj zivsXR$8n%DoGDY+b%8336(36lb2+RaNs_`9DNF$d`o5o{ImcLskh(y5I!HCpq}~A5 z0K3n@-Sc>Td@ev;dIMAf;3gvbSe8|` diff --git a/Resources/Textures/Structures/Decoration/banner.rsi/banner_science.png b/Resources/Textures/Structures/Decoration/banner.rsi/banner_science.png index 8ae607cdcd4d5e1df01dccb78885b23735ae9246..1da59b8a315e63fb905d1f87ac802147b584434e 100644 GIT binary patch delta 402 zcmV;D0d4-71fc_v8Gi!+002a!ipBr{06$PnR7I4Olsz^yO-f2lp(5 zD@K6&=ROQ~QUJ1@7j-6q@u|QLJ=uvSTrj} z`tjQ9KfB3DQ5<{h|2#9c;*k(mmSrtHY`tC=IiD6lO6>gi+J7bfdHfb#D})-w9CTt# z@c!qf`QC1~QdQN?*lM+s@p#;{AEqxYUFg8@Qu1T#T2 z^-ay80bc9JLZ(s=4Y}sOS<4H6mI{4%9pe~#99>1IA-8a=0JhPG$$c+?TwXo7cLU(= z8DBOEGyuCZZxlKKhMt7n3CIHALWeR6;P&ex8rIk;uz!BN37^kC_5#|C42O@CA>c&h>cmMzZ0d!JM zQvg8b*k%9#0Rc%wK~y-6os)rbgCGz@;gAv%)}u-P|66-^1b>o>v@_iq&y{^5cFL>q+|q>^2S7Z79k2+#6n2arNaTT0I|Y)AtTcTsauwp$zS%GX;F zS!wll&F)Ru9dl*JwOVC%JAMFp2V}ge@exCp~!WL;cPk<75 zsG#`_*vgbZTYK*e)S{Ukr7i$Xb(S^oXixe741cX*?BX2YmK$-lP0fn|I@A23GQQ-# zVq0MGc?PUi(h6(W5m17Aw*}y1ZbU~ko^l}?!Y!Wjj^t%5pE(%L0Yq8>@~4n0 gt#U)sZ}F+V0m*+FJ_`6b!~g&Q07*qoM6N<$f*>!WQUCw| delta 729 zcmV;~0w(>E1Lg&g8Gi-<0047(dh`GQ010qNS#tmY4#WTe4#WYKD-Ig~00NjvL_t(| zob8v-YZE~f$6u0NgDVI{yT*<5;LSh6lh9I38$s%!hoUq#DU{lJ@ZYcv#l#{Af*!O* zYXaiIlYfM_fYQ{s3cUr%uXW!pvz^`S&aa9mAA}5VcK7?)w|{Tuz0p9x^7*_23f6A7 zQ@m@&0C-}CZ9{c`64r13gsy1@zO6SVY%JJ;FX>rPC@t=SxErq?AAA2D_vZ{^e7#}F z*P56ZgO7_y>?a@)u1M&PAU@%Okk2ehfod>>-76jZ(M}R+&9SSdf>g7&>j^1`{|`A3?L&Mg?~V!L0XLKxk)H0%mQH<7XTAY z6@n+u1n@Qv#%3gHtWAgs@UQGYfDnL6B8nuS5CCq+xSnMoh&b8Gl>sn&-@cr39^L&e zRpE$ub>D*7`LE2bh#P^dkq*WpQ3!=TJ>or{4{(324^Lm4uzAN8j)LDeOv2LgUjRTe zvS)%ZD}M^~+YcR#9KV+p0w@>V8vnt9((F-ULeh!%{G$c;X513asDi=(q(4OQdc*CA z=Ij6>PJDaM^u)0QE4AfGhN385e|HHgw|)dZB8*mhe*sqKeLz+TmIj~;6N>K~JlH zleNxG&d(mz)pvgY^Xy-~m6IJn@F7egv@)y@1Au#rc?;WZ9qyv#vp}_UOXj3Cnn)yt zsoV7j*kVeFBSQ%}rMO)H$q{lZlvIE!RS_K+gaWh(f8TSu0_Tq*;u}zjoJ+|pxdMRT zj7MR~HGm1>{&Rc)@O8;K?^d5dlpkln8p^*l$S&}UQsA^*P)ef{r1SwfiCRPNovh6{ zPD43O8q+7`u!P_r;*txo$uYHdY_}W)khTxR_k19aG46pA1hES`fSUpY@l#%r@Gn;N Y1)&HU!*I$j%K!iX07*qoM6N<$f)*2>QUCw| delta 555 zcmV+`0@VGA1Gxl{8Gi-<0047(dh`GQ00DDSM?wIu&K&6g000DMK}|sb0I`n?{9y$E z00GHKL_t(oN4=LzP69y?h6fA}AHfwnj5l%TF}#8Y@EBgfW4QAsMt1CoQ6ABeZ|EXT z+mEUN{gTcU(3$_|uj(Om>bkBz{)PupGx!!cT)pf7m)FocmtLmlxZtCT7*<8otaWs)+3pT>_?eKIbdez$+(ek$5 z3S;JZ@rjXWJCX)A5!QG8;hymO*V3!`+8TLUEok9k1`vN-d^B~5`{CKnM9Dzc zU9(ukfxX(aRDTKh2KaV4{C%WwlmxhuFU;%M5+2Sk_g?2v831nR_cn&?v0yp{kei2? z!PYI{0m2#fDGg(6__&8WjAA4cfYMQn#qB3h`u3on0SJ36W_Vwg6_WvonFwRIU^W29 zG||cc9Lq%3KQXdb|PHkB>|*PCri3xMInQ3OHIaS|>>j(;Ed4xs>K=M)xk49Wfg zy|7y_xMWvWknZ2fID*wORpw*|?zbFlM1kr&wI#HL;Hm(Cd%`ui(6a;O09Zhm9jF9A z`40FF{C5XXt~$U5pvv+MQI{Nf3S5bG3Vtmk0GngT2H=L2$;6|1D>&{F2nT&-hA*X0 x#PLx8P9l4~)g+{5ZmLQjas?KF#y+)o-~s27g>AAvL-hav002ovPDHLkV1flUeD?qV delta 233 zcmVH;^h=_=p znVD{GZb(Q-P*6}nKtMAyGgVbpi;IgbEiLbAP}=|i00DGTPE!Ct=GbNc004MNL_t(I zjn$Gt4uBvG1i?bFfcXF4iX}=l0ym@6(`Gl!1*JZO9%kLmYGTUQ$p9vwgmdk!v1n1k z8EWtLlW?Bl=!x=^B;kx@0me5J0V5B5QxW1w5r3wjn}Ti%hwh@_EESJb#dGgYMRR~} j4VIMV7Hj#j9n=eK@vIN;nsJPK00000NkvXXu0mjf5`1IE diff --git a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-o0.png b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-o0.png index 5eefb01db6a9d02c26a92a0504afb413f4dd4dc9..2cf968a8c32f2cfbd9b8e88a4e2e1ecb31796958 100644 GIT binary patch delta 124 zcmX@gJ%e$Aaw!92age(c!@6@aFBupZSkfJR9T^xl_H+M9WCij$3p^r=85sDEfH31! zZ9ZwBpsuHjV@QVc+vAR03<^BV8y@}t|3;+jyN-8;CNEGL2==_4e0yJf)LsT=RaUKB V=KpIx?sNl*d%F6$taD0e0szPtCOrTE delta 1460 zcmV;l1xxyv0mTcDBYy*bdQ@0+Qek%>aB^>EX>4U6ba`-PAZ2)IW&i+q+U-_f(5ex`{j-#J5y+MxOhwX3o+s!7~r0GnjQ)_HwgaE&XvD5nU=T3j%AXQFT%}Xui zz>#aN+%WOuI_i0)BcIpv$oCTN-{=!R78ojllUcbhzn+B-yPaKoai5+Q*?`hi1QO;YB*%I6 z%SPf9X`w%_9CnZm_mm(+9?uFu-aOtz9>+64Z$N&`(tGs%8{l)hE#w`R<;Dn;4;M&3 z2LFWkDX_d`#D8xWW_vA__aN^*eeZQWUCRZCmb;>k^gt)}z_0^yIky!I!>O3tIVy%9 z?HHhZ9^>d3gDNr5--$9!YP4yca?n7EnHL)*^8hWOb1|+wf*;8-XtPO`DGufauLRDr z@JlXq#;s?(L5|3iV9Eq%ApF}SeQ)t+M%sG>L=<59g?|A7n!-MaVM+d%n@Jam*{!$%!$@|1}-G0U{+v(C0CEp&>Nm#(sG`KqgJ)Y_Jv zx9+lS`>wmauy(Wh)%Xe4=w^*irozr%Sc5j1J%3zKv=a@^z!+x&;}#4=2Mf*)r<^&M z3(k%jT}~NEYH*V#1!JHvFJj&F!rd!#pW-d4e~LH$5pyZ1`yI?BQ1>-&AFwv#J2y_o zuD38SJp^wb)|a=$-r}Ry{;vEFI$E`(9q*0GW}vmt&R?5vGTWoq=yyBRMcdNd#$Is; zet-J1&Al#&!l4@|zg?1>Y>>ISrz~Q0fuQqLr_UW zLm+T+Z)Rz1WdHzpoPCi!NW)MRg-=sODJ>3m5OK&*#lfPeh@(`o2o_3Pp;ZTym;OPM zh9t$sQE)9d__J7baBPxntxpr zfT~$WDjpNFxmB^}6#<0c!#GAIX6lLbVg{b|bx)mCcTt|@-S=mOl)T9RpGZ8%bi*Rv zAfDN@bk6(4VOEk9;&b9LgDyz?$aUG}H_ki6e@t zQNECMS>e3JS*_Gq>z@3D!MwJT=6^b^A;htS1dga5(r*_wr^NjE7N1G-;q`(qgB*#(+)+x|Yb?dA#Ke+I6!w!hi{ zWoO54hX`2A*`ukQ~WRODGh8_cQvY9MFFY1lHWSwSUfW`T%5T zR?9cQ!67hGr0jK%clUPA?cbi({C)tY_;S3yUE(hQ000JJOGiWi{{a60|De66lK=n! z32;bRa{vGi!T<- O0000!lvI6;>1s;*b3=DinK$vl= zHlH+5P|MTBF(ktM?eT-03<^BV2Oj*hj&Ai^&|mk?gM$+&Z~yIN?tS&u;%zFd3Okwq Ua|%yy1d1|vy85}Sb4q9e06&Z*mH+?% delta 1397 zcmV-*1&aEW0f!5aBYy)=dQ@0+Qek%>aB^>EX>4U6ba`-PAZ2)IW&i+q+U=KHlH@21 zMgLjFECERf!E$&;^bUIYbHQX*W>xj0y60;mP1wQ$B%y<`?Z)?S)BS^kJ+TXFDdreG zj*vsQsxPSSe`mA^9v~W6xPQ%Th zEYHhZe+&|OzVsB1p**fi%*h@@ttZrWI_^-;8Ohr*c8$fodsGBNmb$``Fb^T|`NRW`H>D{FFj|qB8@~!6HXa8P%mwYZqFYj_0PmWOew1M>V z%2^Y+&$!E+~cWr8sP|8a3YYy3)abGDTt^68!{#DB$Wi6V?eZe7s}KxiIrx)XdW z2fu$Et-lcfMw2#WP%Az=*_6%DEy z)igQHT7RO%5H-eVacy$N#Db|sGfS4OBuOD@ipf$+IhD*=um@_6*>cJ`m%^^VQGu<3 z{so%KRcfeOW3`%UuBBo5w9vH0W-YbcO6M*e+eDAudg{5CL2h8D7-8s$!$ul;l!>)A zWrnFUPMc}wS?<&h)eq$h)aX#-O=|VCJ2hyX*?-Lht?fh?GZ5oIAa0Am+QAkxpC|-g zxx({FL(Uy*YQ-G4#O0o_M#pHS=TJ=Zp| z>nU70^@67l?IRV(sjQb;`CIui^fL4^^fL4^^fL4&XK00MYjfaZYK%E#?hn6N@u{sM zbARNyG$YjYC5x|-Xh8|TeC4jn*+3dO!+Fk~@M5(Y&Dpd%{R%R%^=7jS zTX$j2g(LnLdbnnc$xi&!m3`;mOZTIOugd?CA!KlN{3*MC0l68sNgs__8~^|ThG|1X zP)S2WAaHVTW@&6?004NLeUUv#!%!53Pk&QIDJ>3m5OK&*#lfPeh@(`o2o_3Pp;ZTy zm;OPMh9t$sQE)9d__J7baBPx znq3oss#!)V9uu>WTDX2A=hGPn}eEQJ&@9_h*HayvYEcNPj%X zbi*RvAfDN@bk6(4VOEk9;&b9LgDyz?$aUG}H_k zi6e@tQNECMS>e3JS*_Gq>z@3D!MwJT<~pq*#Ib|~k`N)IhB7L!5T#us#YBqEV;=rN z$DbsZOs+B*ITlcb3d!+<|H1Fsntz3oO54hX`2A*`ukQ~WRODGh8_cQvY9MFFY1lHWSwa#(+ z0Ay%Z%QwKmAuv*;>~)WK_jb;x7OI00v@9M??Vs0B-*P|De66 zlK=n!32;bRa{vGi!TR9M69 z&@mCfFaX3bU-@(XVCb4iyB8M#0KhF)TkUW6S;zAZ^Y#P(4RC_P00000NkvXXu0mjf Dquig` diff --git a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-o2.png b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-o2.png index 57a1eaa3abf69de8e86ed2770586422210073bd3..ef543a5e09e2dbc409b7e40bace45555c2417234 100644 GIT binary patch delta 123 zcmaFPHJx#SatQ-tage(c!@6@aFBupZSkfJR9T^xl_H+M9WCij$3p^r=85sDEfH31! zZ9ZwBppK`DV@QPi+v6KK84P%s9Vh;M?)zHc1B>6pXMA!CfeQBAn7Zq$Y~L(eq XSFpZjyZL?#P?*8f)z4*}Q$iB}`=uz< delta 1365 zcmV-b1*-a&0p|*kBYy)edQ@0+Qek%>aB^>EX>4U6ba`-PAZ2)IW&i+q+U=H2lH@21 zh4-9dj({YD#BunI=o`%O=V3duGOMa*s=I43i!@<_g)HRv0d|;w|5)KK92{c|NzHS~ z8SR)#DqPXr*s7>^K9he_LyqBQtg-Hk;-*uigpD%pT&K6G$eycLotvrPa%oN z)lVPUr%2uQ{zqj6r&-Jp)J1z625gMO% zkbW-yA@Re&a(~Z=pF2vuh59J+TEo|x=iAkkp=iElR17zD_A_v7kX(+(GK%3;wCyMb z#bb>f$Vcq4p>!(5P=5tVG^o;|dDNXcQcOJAP&0Ry!{%aKxPuW%+JzRI6dB?m*Lemo zOTzbD=oq&g<8^Y3JP58#2nOIkFX7)hf2D-A`j&{I-+#42Uc9F$(%9to6B>*A(| zz_)VYj}P+)QxydDklFEqHMTQEQ+k_Qa&Q*-De7|xQLu3ZfJ7Kukqik4U;&BJUPa7C z1RWiKDl%tD+(3X-c_2wnSQ;FRo%h&y#^~^6<;>fRy$K*xvKZJDseqM|V*Xfi%%Q5H zNma9&dVkQOHA_xebIz9cCRa@?nOZh8w_?@BldESpcQ0NG7r`E=B^N7RN~x7Y#XuFY zD*P)fjhnR8wB=^aTWPgp`t;Pb=WgA5>2>gsfo)>sVZ%ombyAqvDQ22F^R(%+%(^hw zmaMdNrPS@llsqWYoy0yVm*@j+_)*_|4!!GG))g7$Wzn;D34A`rJtVDDg?S#(N? zH@VF$mc7d)cXwJ`%-0WQ;0;Tz3oEwq1`#$TzRA=Ni68>Q|ue3bZim zO85s+y0=6m^+8Jj00D++LqkwWLqi~Na&Km7Y-Iodc$|HaJxIe)6opSyMJX)~b`WvM zP{qNbsEDIfu?QAQTcK44lb8NMlZGV4#eY$7EjakISaoo5*44pP5CnffTwRt63 zRCiIH<=yvZg_OL>0G~)a$8^IY-XNaYv~yF6ykH@F@r8h{K$3Lb6 z0XiiRAR+Gn001dTL_t(o!|l+a5dbg@12JFspEuNtMYL XAKwM*NnS>*00000NkvXXu0mjfl>e4G diff --git a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-o3.png b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-o3.png index 3522af81e5c10f2a19cf15e3bd4f3d47b42b13e1..4e1dc10c29ad7d0b38db1cb30eddbb1734ca537e 100644 GIT binary patch delta 120 zcmeC>p29dmxsZXeILO_JVcj{ImkbOHEa{HEjtmSN`?>!lvI6;>1s;*b3=DinK$vl= zHlH+5P}9@JF(ktM?a_^#3{jX)z4*}Q$iB}ND3u; delta 1403 zcmV->1%&#P0gVfgBYy)^dQ@0+Qek%>aB^>EX>4U6ba`-PAZ2)IW&i+q+U-_tlH4c^ z{m&_K1SBCOj)VEA+8gBfd0=->_sr~WCdr>vwJ9SkK$71BK^Wivnc*8Aj+8@E^IUR{ zcv4A)D;gfpr|gcaPvKHNKCHVUMipH{E&6?%P}aDVeb$Fn~8)x&-nx;kzK zWqDrS`eTsL^QotF87kv!T!kIu7Nw0>&+DHGIq|zcX(7J14>=tNSKF^#9jM2 zM%F7*mwwmGr?!fU1qeJ>Bmm^;_ii%AM}VF{zO}-8^zW^A;B&q7@(#;asFLR8Hna*vqTDyqZh=8Mm zpo+*@5+7iIRJkKaP9m9uvGekcIYxUdD`#G6Qmh|Kjx|(OG^uJ< zQx96SW`D^kYtGs7N^;f2lBs1gb1PO|Jh^&ybNAx4a1rD{ExB0nQcA5HDjZeVsu*9P zIrxwx9eU)$4nN9K8ivcj-tIJ$LKgORs~%K&BXJ=*Yu{k231STAMP{ z)S0JEpJmoNYZt2@$`@Fpi#6U%t#Ni|4ccIKGk-xVo#^5WjBz3`Zi|7H!4_xHDJ5Ra zEzV+DSxy;2>f$DJT8x3hG>CQ5ox3;Yeu}rC{!_g1|1lR9b$^1n0O~&S_6ci!opWt7 zcJ9K3X%y@}^bfCry{<#8{;qr(dKr2ddKr2dy2*(okGkOCQ@1%n>2t_jsTcQ52(7Cg zrGMepnfhw?TBf8IcN@aKn7G#b0L{s}8Y_rtAOHXX zhG|1XP)S2WAaHVTW@&6?004NLeUUv#!+%f|g-=sODJ>3m5OK&*#lfPeh@(`o2o_3P zp;ZTym;OPMh9t$sQE)9d__J7baBPxnq3oss#!)V9uu>WTDX2A=hGPn}eEQJ&@9_h*Hayno36 zpGZ8%bi*RvAfDN@bk6(4VOEk9;&b9LgDyz?$aUG}H_ki6e@tQNECMS>e3JS*_Gq>z@3D!MwJT<~pq*#Ib|~k`N)IhB7L!5T#us#YBqE zV;=rN$DbsZOs+B*ITlcb3d!+<|9`>n*_wr^NjE7N1G-;q`(qgB*#(+)+x|Yb?dA#K ze+I6!w!hi{WoO54hX`2A*`ukQ~WRODGh8_cQvY9MFFY1lHWS zwa#(+0Ay%Z%QwKmAuv*;>~)WK_jb;x7OI00v@9M|4C0{{a60 z|De66lK=n!32;bRa{vGi!T^@ zR9M69(4i3kFbo4RUqSZY*qx!Yk@%BO007_{ou<>*>^KLkcL6zopr0Do3PQ~&?~ delta 2059 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 literal 10749 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
TUh_xF|C(=XbqD%WgUBO*jBBgG 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 VU&TB4t!V%N002ovPDHLkV1h7j^?CpR literal 10791 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 delta 2748 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 delta 534 zcmV+x0_pwU2d)H=BYy$)Nkl_rY(eK3#Vpg%+;Dz5C@x+V)u z0`13#wK{jgToTIN9)z%n)})EnqzNG`LI{gM`w3`2K?sY~hV>bB#yPsq3T6ZVK>PTd z3Xy4}sM8BYn1AUNMREMIQN2#*pk9Y?a>BH;CEy00=b7W3PG?F`Rq-7E0stgl{)jI` zfDnQ`>{A&45Q~}mZV^}%OahW5;ZiPO{0eZpFtrz{A_yU_5fIX8BpMAWFGXMxxJ7{H zd0^()jx3XaEWZH&;y4CE07fvigb-@O0!ybyg{7m#fq&P9h!y%(Od}w7dypi_7w0sw z!Po*tQIN@IJaJsB*5>lT_AT%Wa|FJ}W3=w?Hb)@Hah`60D*?dYE%-krnHMk?HA@vF z>%#3#iOL6uNB$ECa-6G;Z4Q*nCHm=oFJK#ieE!t2zX+1a)ba#2dJ!2P39s-zG@piF YF`2?d0uREQRsaA107*qoM6N<$g5fswmH+?% diff --git a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/meta.json b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/meta.json index 1da3a0a7336..1c8714a8dbe 100644 --- a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/meta.json +++ b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from goonstation at https://github.com/goonstation/goonstation/commit/cbe076402ed43b1cd861295bbcb95608c453de7a. Edited by chromiumboy", + "copyright": "Taken from https://github.com/ParadiseSS13/Paradise/. Edited by FoxxoTrystan", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/static.png b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/static.png index 6097982ee260134d4413f66b77a391f69a499f97..7d8c7a8c49c0d50a333def578ddb231367e3d74e 100644 GIT binary patch delta 1592 zcmV-82FLlB1;`ALBYyw^b5ch_0Itp)=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi z!~g&e!~vBn4jTXf1>H$RK~z{r#a2s?6jc;Hb?e@G^lRF|5d|5dhy(%)MOP@GxG>5> z7R1EF#6*Llzd&3Vq+!5MBs=0pPtR9 zw*4%F1 z5TKiaUoi12Nq-m$Doi|!vV1PECovNkyj~hhCQXFhf}8~={J!2TVrZlF?zbmv&un@! zU)~n9zqxd3?7clZ^W`vs&vtxr)|t85uu7Iw8ZW!md+V+@+wp_8ANnod&(bUtCfs(U zU0GFe>+2_K?U}iS#o0~}^v+Y(V+e%Jl}_odvOBhRynpO9JAps%2c5=3$6LMb?iWwL zx_k;uWeTg}SkjiJVPr;{q*)RtJ;eadO{eN`SdA=6(m0Hh+_28SVG1FnFr}@e*1-wF zNfO17O8Yf3z<@w}>;h*Q%q`cgId*wf)d|``7BbSum=WCaUB82M2g2T_Fn;k*hH#NeHDYOeBIUVk?VaL&;M(=?4z&cD_yP%(%D zlf(}y6$-g_m?R>J8(`EpLqtcX3|yBiZkjsm`7di#fWbcDcuQs4O zVt?aInB6xmEhDXpE#Wo4ANO?hi;pFTAp{)ksUXF!2oos@qXdPA5=R2D$=)eP;!^M^_Fjh{>bX6H8ZAO2I(p7{>(qyu z;f|}@sGhYc@VgXrL(R*SCRHmXveEkGu`;#h^79}hRDt%&G);0`n{3;nQpF|T3-n-_ zIEp!lT80bGFW*ByZ@kFn=*Y*1(fL^~FzYARYN2Lhk>(p7dCiFYc1(#69*Lk*wSPu8 zW?Hn^3aLFCkcX$=itvmn@(^ft674l|ujN@M>tLb! z#2C+pFt~`IjuLp5;15taCERAck$)m>L1fUiD-GhTq@=L#lEN9wDa^4!A?~E>*E>jE zMsaGQZ5@4Xxn->zKcHS8qsvd7Aiv{L?4w&ylz)$1eu0|J zRxYswj({e>*syV1wt4eI^v=4^_4?VP_fxfArQ>_2^ty=m8+$2r(A%|MMa#BBB9PSn z%hLpY+x`Wm0bkkZttg|%|JbJq@EK!j>UX+w`JA>rl!B7$P`O;8^2YUa>QIxud~=%0 zlUVl$_W9g}oSaB$df#c9-hch0p7UNGaR=W3@H`Dc0G|Ryu#F;atp?@=rOiPQ2YBH0 zE_(2%U9{ns-L&D%?tJ&=Se}5rYIGE!7F_z^HJc8-jmrr0BA$P4&(QcU+?>G7?D7LJ z14W{%XiiD`8zJR6@2$CSwa)cdUw=0=iuwOHhKg|eqg(UUt-V&qSXZ|d0;xb7Y}dd?rC2P}P-m>K{a<`E2q8Z>6Q1$HvPqyak_U;^-; z0kxvwcSUKKqks8KF)R!W4qSjI9x5$_f$gwdUZew~$CT7j?MAY8v@n4h1UhuiI@_ko=s zJ8(K(O%<az&f&(GpUTFm0SxuI0WaW1hP-_5MPS34AM280lSdYh<=v(>t!Sven7Sz8a0H7d>D2QT9DyQWTTb<8$h5DPmxw*}? aD#E`ZG) diff --git a/Resources/Textures/Structures/Wallmounts/screen.rsi/meta.json b/Resources/Textures/Structures/Wallmounts/screen.rsi/meta.json index a4c3148aa8e..25f0d7f1981 100644 --- a/Resources/Textures/Structures/Wallmounts/screen.rsi/meta.json +++ b/Resources/Textures/Structures/Wallmounts/screen.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "From vgstation: https://github.com/vgstation-coders/vgstation13/commit/a7290010020e541ed6b57817a07023ca6bef26fe#diff-20395160138bed693d15eee6f16d671531b5fa533ec52c50e8df6d52370dbecd", + "copyright": "Taken from https://github.com/ParadiseSS13/Paradise/", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Structures/Wallmounts/screen.rsi/screen.png b/Resources/Textures/Structures/Wallmounts/screen.rsi/screen.png index a3e7a3fe55a7e1903126e5a270dbf1a58c74b4e3..6b6329e83d0189509e614d991e696343ef5dcc20 100644 GIT binary patch delta 351 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 delta 2092 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 MNkvXXt^-0~f*({x+5i9m delta 2231 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 P00000NkvXXu0mjft$R&e diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-2.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-2.png index 122fb41398207e6033b43ef850e9133e71b91922..63c1502b8a7955f594121f1659eb34bc10b71367 100644 GIT binary patch delta 2207 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 delta 2278 zcmV{pHq< zB3jA?5%sBRBrnKo%&27;XndkpxjC^4Uqmi3ht+s#rHF~f6o2XuqJRi59#I%z&8aj@ z$tiW%=eKrDqW9JZoq+N*BdiZXX z$(yPaq~LN$yhoFWsOP{FSVA3YDLux^IIRS;U1oQPZ3Gl53Ox){Ol-@Q*=)YOeFe&h zg}~6zZ-6fdo;*9~^}54h(qYvSF4VLM)chp$6X0Z$$A2lxm`jGg+3#qTSVQzGMR+i8 z0UvxK02epH!-Ku8h)nFk#&i9+--(ZAc^F2PhqG9mbREwZjf#iEoP||ukmWf}K;5|F z+M8Auc6VSa+qPT7V||B$II;Y|50W`gx9DWxILHp_Ze;1iu&6=+Lj(nhP|aqQ_c?G!q3JTFNRfxIqCD zhGNx{T4HaPmB4I7&LnZl%XRSz)nV12YVmv?SFOu z+kYST4oCtXz<^58)8Fs!e|_)KgS}t6>*p|1)Y>`Q_mzXhsW`zB2Hmb|px{*MAgDU(m(Omk zW8~g<2WJK#BzC;e=@j`fJVWJZW?F^CPG2ff7*ziXTDI~Z3))7um}ZJmy?gEbUbp-C zCp%w%^Gy)C8^Zu}_UQY)&#qq`_By}2`T;Ur5$b(W^P=SZcn*y@@YUuAL-G>C@PBNc z9ibMaR!ez&Hb=_n06O5%Op;+z>$`XU{D&{T`u5$)?2CW>`|p3cty~wL*OJ#73?4BS z*{Wkv;!?-;7-$%OSfF$kIe|spBA5}v>+!bu~dkjH1jBUr(ThODUwv8y$R1AS+>G ztJf^^EK^+Ez5npe?q_%J-&dvZ0-U6{UXl-BvEK#0P7+NyYdByk)1ugac><1s2j+(t z&trq`OG{w+Vq^|WFe}y#p5@^avVe%iX&P+czkd)nZ11TcK7CQ z=dGezl#BW1TL0d6Ka^acfQG|9Y+O02rOY#0oVdO@P3zJ6`pGQAZ002Eq7X>RK9;nc zS^;-~Es(|OyEi|=@bedM4u1|`|L4i`NBhs8{PY?lw{Kh?UjE>c8+YcjSu1mr!f4CTk7lYe$zp1m7v=uJi}hje`u2Mp{r=WyFd7Xv zMx(qao*n)?9P~Cv1DIkmTbsd;7Ou7|-Q zFQ+XVb>fjtoU=M1fXezNp3k16&X~0vlZBO34;;malX)RoX7FbhDP#da_ zTU5@bmSgtgV3sX(!+9rB@$|>t-J@wXFZ13C0xgZul&G%+zl2IuQdGEjXpCeOM!2o$ z!o+Q^T(}4rI9JJBQu=0m>&C}aELQPo%w%J8kn~kK-G4tg>_oWFNDEgH#Dw5`)p&WIjE=xt_jy z3c4duEMM~{xFIms@#*`+BSP1Lf<9VKg)9`Bw1OBt4mqG1xaBDC6%2ULkQ&d{eFh(h zhaz9pi@-7~veB1D-KZ|o6)Z;5?TrPHq)$ diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-3.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-3.png index 2e7be27dd052dec7ba25dfe40051b9af101b3176..ad5094443b9ad586d2b45c2f4f9bce0d5cc7d00e 100644 GIT binary patch delta 2210 zcmV;T2wnH165tV#R)2L#L_t(YOBI$!w_C>%geQj^frl4FQnVOk`Do#tk9YF_{|ny9 z8`69M;fBdQ?ePXX0MlLdRW<$NkH7WgkV4!#b_|(v8{{G`lFma6!0KZ3$>ld*Ng2ml zB!>mHs7cAimy;e~+o~9aj6_5BtPocNA)^$672mPUzkIw;1%C*P@8-^QxFegBPeRNr6{d#{@s9MCGML3IZR#Z_T0{+853E3O-+$Me!Rao z_mazRTTC%}wr)&af9#;oyR-Rxxke}z))ybS7m<=e*7ADGZ6dyx*X#Fqu<0#^vXN*# ztwG%Ub6y|26Mv-Fm23X<<5Pb(-L5b9_Go<4`XE)ZL+ZDq)f6Por&*^ik*YACrn$|2 z&3UeJGRIy`Ap`>RNg`HGx@_g_4Ly>duHipwepev!zyJ0=Dr4Tn)}`UWpsS47THV5O ztzgwmO>D1DJWN8wK`23Zh*gL*Mv!&rh_P^HS_vFAuYVUVq)G82)o8#3wy?6YK5&1a zJ*vEf#94&BFgoQ?mAZ)=Pr5&KW2w}byP~D#(0)`Im4)v32CD8^WH6v_mG_fb;-$G@ z&+C$t*nwq6L0qX@S7ga2E;4Ix^{v$;4KMie?tlxL}{ z+n0h=2Fgo~-o+eJ=RGCnW|kTyPfHNA$?nH0_J2X8Z8NkeDrMy^wKbU1KHmTSK@2=+ z82qu|s){J4T6ILk{C^`Spn?|Ih@R81kJ%&)&Lq=S*BnnV6bL#NrSEJ)7n_`vP|+w* zY^w0KF$i21swSAMjPgytIyGiB07hc%>XCb1*PiU- zn}11XS=#D_F`@2AUXrCpE*byj^Rb~C%peC#j#7_=T1i~yPBQUCiEpWeUEdqNpuvH)JFa1?FU5a>+Wwk ztYnbw$%+xmrF{z(!lCC4L#Z-7V;D(M-H>H_Sed$eaW~BV+xF+nkGJQ4LtgmYqm?2X{u{>EO)O_kZnK@jqby@jdC$>G zZ)#PnEHR&Z4J57Ej;IJ`l%Px3<9}?dqnbOy$dCZ|DpR6jc8Mc%bc|RFJshD^{MX+f zyV&jFe6ET4w!-q`_BK3GNYkzUC zIcC`e+FQa&J(#raY+aS7eB0w;ZHr+pQfU=$hFRcxOZ+-iYQKBCR}hnZ_kZcvhfjYw zp1PFsMo`2Rs7@>d;KaN|bhay5?Jgp2yIHW*!hinjJ(Exgo6VG_Nk5ba(Q*YULhhT9 zg;zU$X(7mD3m;rtW1d?fkX;n|aGH69q zXv5naMdh-qZhkXvq>8|L-+xWr$J67`9}kn@C!?f&M<2&e{3xT#SLs?mn<6NigI1xf zZKdq!ix1>}a``*|@YDNuwtIQmYT1eIceh0dg7vke>TO|Mp##Ve=(en91$EsPFL2E? zl%V9u6b(`~;w-=J&rlmQ@j_d5ZW3niGynPX1L?T%&@j!=DobMzlYcz;QgarxA!-!m zL}dqDD94M)&0bAm#-na^MIa*;#P<{#B$u+_>JVEgH2SJ>gn$0!y(I_8S1kyHuA!YPv9i7|Nj^VcfIL$;ywoA?$e-$R4Z$i)z@Tq+J8pKeUyehgG~F`i>$M+ zs%4Dg-DZ^5(e`LYXF?112g}o-d=k#W9SCwAf|iM(n!vVfy{WE>d3WW;KYjSxjXiNl z+U3)>ly|Z+jl%G}n`(Bby>zA48ZhadINwF2POR-f1R(AP`%nz2&FU*5T&!0ZPX;O8 zngw+*jEQum@_!bjw~y^NTJrXar_w;|Ftp2P{pQ51DN8K1io=h zE8gltZkuOH0JtEWcedRx)W?<+g+-4$Wlx&Mv?Hhg`hUkiO-n+=Q4VFImhg1l-DHOa z$*h~svn(N(LSWcv?t7$(Dcurc6J#hHO`%b?2D%QVOVO?6c&9zh*Q+^+bt{U0{cRKo}G8-{h7mFDG2d_=ZqabiurvLx|07*qoM6N<$f^dmZP5=M^ delta 2277 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 diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-5.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-5.png index 0969ca3ecd71c546d306133c643d8452f1b607c3..c6d8dacab13d04c03d2d9f6b1a7c9507b9005150 100644 GIT binary patch delta 2203 zcmV;M2xRxo64?=uR)20uL_t(YOBI&MjwHtsL}Ooat?KITA!kTPGn6Rspqn5F0?7aW z3{eMC(@Rz57Q2Tlc*$F4hKHFwbNchof9uI9g}8U@95UrL$W`1Vorf5J)z#>W%kR9B zGLE%K4l8O=lai}17d^nfS1}41iH7W1A+82OMkxdH%T~_b&@=hw9)4Bxw*?~q`;Q-^GUi?ET^gPYy2^;H z)vYYo3Rcb3#CGb$!z4r;gc5{@ScOPq1X+iU7zNs(*30yOQps<6fG@>_EBY27P{j*sCs0P!GK;W?2km0LzSmxKp=n$dXT7WY*5edq`e%RhE7%vnw%KdBZL7yt}w&v#u|qw?olH z@Iw=Tw0{C>jlbn!tFnprZ0aA-DZ#(|IMV!qcqbLb(hIr=PrGtzR%Flp#f~xFDH&%y zwkeFNJo0%y;YswRAg`2FQwCK00xZfH?d%F118*I-I}eEjK? z7Wql_4Tu;NA7vu zdVg|^?pIcOe8RTHeS?ZBcD~Ze838$oi2r);F@EatV zqD<};65b9PLeZL8ZGsSC^be>ltrHol%*u=;>p&{Y1eip%Um#>RKyCw@&{<4|2x`F+ zw?XHcZTI`e-zXAybu^2R4Zb*x+pI~6D1U;?kV`Dxbdc1O-jMcIHN@~1ApYsoJd%(8 zx-*|*?#i~jB`%+MlVtJgnVP=mx!EK-3QB6DetrK6k@|Z0 zC5Md+vK?75Lbp+Y$Iyv0zeOs^P5QdBo&*$!5w?om7pa~E~BW-#G2DgH!k4}VTz zMN&=dNaSRPMhzAeNR6c%uPwCbOb)U}hm6C<=v6eg*-qhEma(V2=V+xj zwJKKDn6JGClD2F|R0K0h(535fHh<|h2`t=K762*fac@TZ2wm66C+Iat3g(g?vksXp+rN6r@Ume)C#L>e{*j+ zW|`0*jc`&ACT$1XHsvYbk9gYJ#V{ACw2C9KE8LgF??a{bcW;jhOLmz_M}J8rA*H+% z6mbKp6AJ-2G4Bzb?MhaMi-`MSRxGvf@BaG8Bvis?Go@+LPvuE8u0Tb|eKWG~>Y%R; zf^2U3=Y=;q@G+A^6#8_Td4!~WazS!&(!C9rozPa8COgGXD`WIuzx=zSewf1Ai6)?9w7+U*OIEYg>i)rAVZ-0x?L62ZC|~>Ez?kfk|R?z zNZAr+`Tcl-+Cmd=v{mOWVfH@r?>;|~jtdXOwk);E(%8c!PrlTg1%GW3HHvbgvI8!Z z<1K5=UQJ=fqi%IYAR`sT_Y@f9`lhw?igavSI2lKZNSLVvtqXB1 zwu>>^wh`r4-YP^v%zrR-^?^sCxIGOP&sNC?(DUE~KiSqTA5hKDBuqQIV>zv@eptR# zUYML(8!clSuCeHY?$i#BBRn3}Whp{*;ivc4}#zP#LkyimC00sVjcw*M~Y zj+EK2|2wuAu*0&*c|d^HCn@X0r$G;?R@N-5@5vstjgb2&4S#z9nU1R$S!Z8WV~pb6 zZj{#1_Gm_DLIeAgjQ()m1Sct}Oh|pML1Zo;W0J^J%w~ z53(_h!ti{UY7VHqbfwlBFzJIh-$kTOY;8dVAZ~$UD27ytuo1$=c8Bp|kmAxTsDoil zq&t;MklsGGZ+|rM_KM`=RDhkTr)%;RH+raa6HMONxgRT(s2H{9ZW4@v(2`>-iGr@#E;pQe!zaetIUnW!Z^-48d}VMQ|Qrt>UI z$fXb%cAEPhX<|w@LhOPJg`+7nN=$ekN|&PB%K1Tin(udW5!+rA|KZDnSn+6K)kNKH z!P}+v%I%1Rl dSBn_`4-|G%(+ua+k(dAg002ovPDHLkV1kYxN;3ce delta 2320 zcmV+r3GepV5zP{iR)6A2L_t(YOD$Ggj~qu8KGpZ@+;{fkyVuTcvLFX1#6hxy70a=L z1Oy3C#1pSP^2P(N{16^MNJIz%QZ7Iqun~xuU=m|Hj@Nc}6Wg=1J=6E@>dO>g_qx=Y z>8|dobIy0Z^POU^pW6~di!vsn0r9HL5;7{;sTn3Jlc*MYM1PFqiAX1=u>v=BnY%<2 zvYQ7YiwHLck!|6dgHbV2&Zx^Sp4*a%jxP_p7DYiwM$Ze=UcX1AR#<>{{^Nl3lE~Do zVaK>}>-O5=qoSzEFh{G${OOl0*&}C}1i=XfpJh)H+0}^nlY6k!7&vum>(2Ie6anu~5iNbi0GuJXl*@nop)d<0j^t!82hQSRo>gU!p7~nKn1p z>Cs(@7lPN7x9>f-ek@C~il;dVgltpRC(j}3YlsA%P?u^7rns2|JZGxT)Go0Vi)=x* zfoXDyt?6Yr_n&=s6UKUkKDfTicB>z!4 z^8nb4oOzxgphd}}B$LPjVaOFVi3Qg7SPIORXmXhLP3HHSxEmCaJgi9sl>&@%a0Nw` z@mhAqduf);Gk~*pWCXHv(sN^28C~K&X^w>C>wl)(RDqD1Op&mu(3v)29f6Ilk!`u6 zHG@drzjnR-1`o_pNK-9o5jPX6LW=NaLBlHHkWj)rU0FTU(HWAQ8-__j^ex?xnV~H5 zD2&K1D_YQKky4h%;Jl{VA6&cst;^@%zxsD3P>M;^H4C?_ta%Br2?)1C4|r33 z?0@nL>#L`~=H0&&GU~}RVEKgEYm^4m;iP?d>&|30KUnd@?_L30Ok%(M!=Daj2E*Rv zix=mUT`I6uVs=-;RB(<8QB5k3pW681{w;ZZZQu@9v-u-eQWk<`Jnm^WjB!#ks&9UJ z|I#;K8oLOnc(}9saOcszon70ue)034dVhPn+Yg@{A9aVWl-6n?+lH$0lGiojkP&}( zFiPfAsfm$T0D`w^Y(~ee$b?G`v!E274^NMu+%ReMS`qf)+Z>$|_-?M4l z(8)1fK!(a`l&MXN8tjNXk*IhIT8Oz;w(6>^@tO(NU`Y4B*qeL4?HrUOX1FTTvVU#9 z`>z}AIutVMJub2&&9bQvixDHGS!s<3g?0MqKvq;Q%uo@a8n;G8Q%vwde&^apZ@zKq z!S3UvC_K*x$vi*wd{BF_>-lwEfA7^Zzx(U8^oqcEwJAeP&p=Y+v zOp}uG1e-y(pwu z=u|$=T2~JSd-F;r19KfeEu zOBY^#y1LyNwJI@Mrg)AGvU!NkCPY?cn=6CQC!Pdkc-WMOq@pY7QIb=Erm0Zk=?+c~ z%>Z#r(l1>&+wOj@oquV%)zeW&R7E7Il_!{ClvXhi5wD(M&+pKUXP&#@%^38dMX;04=6xKxH2O2mQY77M1PLPFRDVL*v1hl_V9}G z2p^$K;x{WR{7J-P6pocon&nET`PCc60&*m|WCPIl$?BsPz~V+^no$_Ak<7->FhMC~ z-X5R}alOZzj$p%6!?ZwkdF$BHP~o#E%bBbSp4Si*xiFlP*)%*-q`B($N$o1E&I@>? z0g!;Sks*RgS$`MZ&q7>>uRhd^jU!Vm-T|pXf+ErEW$!=Eb1&kKCE>Vncin0)FfSf9n&S#1y4_s>= z#wav;QljP4tLM+}%|bto`Yi;_sB&t>$Q57MBIjj}N`J=%7CW|s(@M*B5v8$?gi&pZ zGAb!}G&%R;SxVwIAC=r$Ssiu;BAwm7x7~Gco+%X^MUWdNXCze0v)bmFRX* zB?|~uRN}m4*HjKDv&kP&s;D*uZlM~-?Cj>lN2gpN%)Xy-_Vwqtx~e!kro1GsL)fvm zoDlN`2!F@A8Yq+=qPdsS6eq7<|KE2XY^^TE0%7IDrLpJFj;<~TyPsx&9}>$<4<`i1 zx+Z3skI diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over0.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over0.png index 89314482b3a3b392d3c07d3092e1ec06d182fe21..ce5adc65b5d1ef61d0c96091b9af8d7d0de684e4 100644 GIT binary patch delta 3191 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 delta 3188 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%0AT+W84P&p=<^=(f$0jPgNQ@erekDB{uZE2 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 delta 3188 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%0AT+W84P&p=<^=(f$0jPgNQ@erekDB{uZE2 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 delta 2859 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 JPDHLkV1k@(WV!$V diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over5.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over5.png index a9d7e7173785fed126e8dd104c6b89171fb666d5..d0384e6f2b4af36283ac4b470bbd10fee64c74ee 100644 GIT binary patch delta 3086 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 delta 2864 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 O0000z&Ip80}8C%oayHOZ@*b) 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 delta 2859 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 JPDHLkV1k@(WV!$V diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over7.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over7.png index 970ef1f1f5d37be02883f75dac02757445580d97..45a43655f63538bf0c87c3d80f63f39cc7b8f211 100644 GIT binary patch delta 3040 zcmV<63m^2D7K<2=Nq@os01m}g(f6}Yo zG_(>RKr8*J009rZX`uBvs$`NeNBE>0`S=AH4Fo_dBv@HwdeP0zuALi<6gW8k@|XWi zRk~nZX7r`Pb#f58z-(IRFAZ^Su*?B6w#c#@CU=L5fNvT^r+@ML@Bg!F5AyYRSf~Iz zrUy5f;pzp1b-4Ef(B;rqgXBD-?2$so7q_rDA;mMouMuuZuT_2?hbLg<*CoF|^H{%} z#pH9y#$#+Ue10YPyhY%qHBbFH2zZs46aiCbsN?N+8RoN$tSzJC<3g+^i$f@Y=64hH_U$j{^O1l($aF(p*<2}|J-{zI|H6Eat^(Sdu` zVGI+rEZ71Il3wA=fJ_Mt1^Z`b9G(E*Np4dDsv zx>jgdDI(8Nvl{ls;R$eZE9nQs*rSgUZgeOsK86KKR)2`g1XUy$U!w_UjD7*m6?(I< zd)C(~Kaax`AnP8U$FErK8D{u&hFB*EZ;?JNwlkizL~Rll++o)eVp0^v30d_93Ba9- zjseq&kNLwfb(8jg{nQn zl5-~Aqeh2D8$@LhnTS(iu$WI|grU80cmlMYxlx{We&y7Qm_OJMrbCzYSSWyHo1;$! zN833T&0I z^~laRJOL2YfZ`J~)qlQLP)fsC3opJ9C(1rIU)IE4&VTRe2~H8UEucGrROYWmejdlS zfPdBKdkUT)>put7?u*n%80tucn5YFFaz0c1s1a0w#&Fv#Sy5k|{xpv*Yqm487QH1wh|`gf6Gl`{>ELdt((P7?|`J!eOZMETSY$lC@M_dYFuT;}56YZ4x<3@gGRWo(Zp zbwTB1`2i=2;?c1?0g2GE=o(|*A%9f`)YIZg&U`Wr^P+_1odp-(xC|O z9lI0IR}mQ%&a4ks0n2_m!A5R8cues|J2M~^7LMAGh_!xcFbr%LD2`6^T7TuZ*qwle zqpi&p){7$K)Ucz28ghhN;O3vG_Y#E`?14jRct2;7wC!nn+NP2hM zf(k!f;3uxb;iGQMap^GCunhgsNj@=0mH0EVb>Ps!23)Q_WQ3sM>Pw!r_ z*Etz{(nMy*mKc$Hjm~(EM1@7|cXNAVcLG*nK%0(Q6i_8a&@0H2Uj1|?3`H6rkFwyu ze@>_}j?IQGF_uJS8YKM&9MBKc`CmO2@_&_xz>0Hm7_d+e-0F~R)qkM5;Zub!mGJ8c zSIgIo4dk-_y8hnSoq)VrpntP;fBbrGP?S*=1lS+c znWDBRdjBgV(YL)!+!oxk47y6V7>o2I7mP$-@yESBW@h>SKYY5oH+Cl=(tiSbCLuRDQcuF;_kFO4 zgM;B1%tD4|Bqm$IlOGW?gJEsax)pkOgG*xlCVprz&kvqOfrVNdmMLt>xI z_#_z?Oh&OPl*M+BVQl; zJ8al4pS>12Fn@L@V2UM@?QosBu`Gulh{oarbpxChTH;FuxAdsg{C$ChdBPeC%mgT# z-oOl5McnH)K+c^4-b<#+WY{&B3g|H;590(7`qd&$_^D3y`tiW5D_{4ge)?CX;I24#OcUNnb}q?E5|`)WQ>M-LYu9AlT3@l_0jOT{pWXh z0=h24B&Za_f=i!R3G@-P*S4^19r8jO@OV;R9yOvUa1R$a^1~$j_lGTe<9HRSXr{~) zA%EY-ro@<42p3vrCL&H6L9r2LY>&|E7(MJJA6f&+#81{AkG0FrlOC~&|!wGX_UxF z(Ml`}F?$kNI>QN4A+7^Tj!{KlF-;5F;(rZpl!RIFwA-)0aFmiE7Ej@0kIR~r$&*iH zhlL=OmWV-dv`R^x=(fwvsM>Mr-H+9@d)BVAR+|OYQ@xjR{@3sdC5w+zCjDfGdX`PFa>b_ll~stgd-9s4a2G! zdCDclv8uM~i}V6j4@ENkq7N|R8;rp)MyTyW6861*5^paF#yC82Nq@rt01m?e$8V@)000WDNklNa93={|%Eq$kuCIy1FuiGCc>L*|c%-td8X{rg3(hHh&Z~lOE zNQ(;(C2Ja1)qnF=p3A4Mo1k_Al4J^>uD*T|F=;X{XmrlHw6Z9gPpt|&AsqU|c>hR0 zySulquO_ISfPTLZG#wfSv|Ao}{T{a1CeH37p$`jC_+)@=zZmJG_6O# z1JWczS`=uLffgu)|C1fi)y!#x+6joY8?Tg|WzNqz6=BLKCofW61Pvj8 z!Z?kOF@IA_zIchul2FJDwG$wd+^Ql9po42C1dM01oCPiwvqS|Xih zs67;Z@rCc*eF2}Ag;e=ze1tpWJ>9144#lzR=_fC4vuJK!0SJGUip52@nnwO{R3=Yc$%#YQ21+?i#h8G zWm!VesKa;y27QQ}mGTpBU%p~wfGLa#_~kENQ%RCwPIuhhAH$*d&Qtc9(?o~AS||{- zX=bV#I5X<;f2{}*ZGZ2y6Y$d?y`aQ`-GA``J6qvf7ccORX6Ft)V9AJ1!J-F9+cXwg z6Of=*2+#BJ+uy%)x(WEsrLXZ9R0|cCEv)z|E1ya1iuO_#HJI>}7Tv#vn134J zNZR8{l0$D;xMZ2 zODZ~ha>)!$AXmH5qr#V3Y%x4aRjC)#7`hA{zaE94^mDN7WyGDXIl zF#a5hEX?#|NY7Y3yeu>AFHH&OYKAcZ66CC}*`i?2&NLBSdce7}XIPuU$)^bE3B_cr zjjvF@`wNT-kRGoTKw;P&u%B&hn)LU_`zZpajX}4~CvprsE-Y%o;Osd*5PzUyn=fgZ z!kB<*93x?tc6=1$EYnoU<;B$}%7f$5(enw84%s$8V)DYXnxs7r4JYWrZFjZtIe*)hEB&Yw55)s~Pm&u}_6n0QCdx1>V`1^0gJ@+5mVdH_kZf+z`~DkXwgHgvzTC{+w{5+?UuoC|9^m}3+5W2cW7oQBM8OF=v-+%u4v&s+JdSmm__61zKenT&dOVsbQB;YB~VuZNW?H~+g?>|PO7zB}k z7QNx!D`uOUrZ6Vp)mL6r31fi$gG1RE!Z*Khk*(G5T$D?wGFvU1*@$Iph(B8Yk8As1_PcJm2#KvFVH2nG6(BwzFT z&P~>v*rJeDZ>{jo`+qs@1bmk-AU;5IXiCIbA%CV=YCYlo{fjFXE^g!I$2VD%cb4^N z;OezcPQM2{@CGXqgpB5D)!3y6$b@=l=VN^JnP+k1#w~0=^E5uW`7dJvj6-2ltc{mp zE`2InY!e1d;swV?N4o4DjG0m^98&kHKN#VYMa)n0Mb+8~5Qt6d*g!9#uj&;PTD%oE z@qc7iSV2)E9>%It{T?8e=^{6k8noE49edRvc>^*mSI2FZ%aqJMrU@F$gswl)+x&@xb_C zQ8ZAfoQaj(H%Wj9f|34dY>WqV5yQ*AgnvsS?wO@5>beAgJavQ~U8BqkMu;u+dtLN95gr>==M7D;F$6eXsCSe1ml1X|Q9v8hhGYnU zOEu_XKV^K7u1_8V`-jK$0P}U_jUhlFBnal{!1d+Niu)f&k=MiObiLg}$+c|XTtLSHfec%IeWbn-9{KhDdpPO%7JS|zXh*7N z5BD`~FXmF>>wkt4e|UL6Jk5{$w`YA;E=qagBI+>?`&mm;cv~)uj3z=AEnViN?|x5d zseD%FLCoHJD9eSnRuN3nd~u4L;kRV?4<67ZiteF#FSH@2HNzEjOs3c6Oi(o}2F zVj(K@sU!NCu`n{h0DY*8#VHhCM*~WiE0uz^Nn*Vr<9{lK8yAx*%F~tRjSe2&i40Ao z)kmbE9GQ|iO(NHwJuu4QVy0Y)QcqcOjirB7D3O>nxEE26#8Od3J}M5gTEnfY;7Hq= zB0CCAloWO+cH0__E+R{`&xk{bj+x5yFy+PO5H-KGEn?bjSd&`UuWZm`mca0kP)b}& zld}Dmynn7jM;z!pJT)sAe*S49={-2h1!;L;WcQAkeCkr9FT+JoA>0W}i=6rvN>mKE zET?v2L(UB=p;hIv3A~h0t1f%uiw{A8y$vIK=;GdcYj5)Ae>jUvBRKpe|-4)BO5WLGP-ka zo5(Dys>Qjrmi`oSEQFCiGNqg0+TKe?wSHK{X42@2&+?3dz`9ZTv9D{pj*3K-EvgWZZjVNyJT zc>qA(vn0kR$?uuB$nudxW1gpya>!;rAb$=pC@98O1q!=?@Z-m2f)DPxQx`)rd3(G@ zQpwFl7j|o^gx`R{y8*PanEo<4YCUV!k*LIufL5o(k zDCB!4hLdg&IY@e%X>N-0k=I}w#j;UyWnFFBh<4_A8VC;9G%BixK#@pI=NchreEHq^?7l|9HHO z?+Jk-aXM5K8|P28_MBP!Xar!V4Lb-l^BpvCq-mm=mUXz<*Ax`N5uPBiN2Oo;@v?xQEn+PSxJK=dX24x$Vj~}2!HA=G^s_b?38g_@^jUWubQ$ zXHD16m5bJMWG6Xjf7yZb!c@r$Jgt;c0%I#xn__kAZMNKb@^_)e`wWJmq>odj`P^s+ zkOPu4Lr%t>!)fQCBEPCVdw(gb%z4?_@K}1kE3ri2t-nR^6+eFW;d^bqecNk3Kn{o9 zL-C9bHOK07rYM?43Rpz+ejkwe=yT5vBL9>mpQs?7bJ^vF_v34+Yuv+)^y=JsS)5Dw z!>4y(kh#(cOQlzqY(ts($>o|7Bi*7(5CoBIhe=q>EOmMDu0;&8*MAk1)CdDNkVZ?i zF)%)|_2_fiy5v5+12D-GB1FiRA_SywiKjr?uA)O_z$D{<*i&W9rNGEP5}E*o%eK3rRag z-;FhNM$6szb0t(d3_0?zUvCAzl5$C7bN_YQ{ySd`719v6qF)P-$JMbUldGa%_u=#<1{rJU91K0-r^64n012!rfQEGzdI|xX}DHnRG zj;ztuwvj``8-JtxM$f}kOAdk(eKs?rv@prBk;Gz?uDE)d{Smwrbx|NIx1nDZUs41r z%$oM}){ynqsYP`AZ%T05MCgpPt&nyHk2|)wwMSjyu{$bQDb_RVtnT*g zR3@R9Tf2|h#9+64ev*!)`(0hwwr7D~K0mRw9i=1*;&$^+KV;RnBlLpYZkf<;ajToR zP=VLz9aXYI`VKn5nI+ZY}&D@fNFk=X*ME00000 MNkvXXt^-0~f-km3f&c&j delta 2270 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 delta 2592 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 delta 2592 zcmV+*3g7k17|s-sNq@rt01m?e$8V@)000T&Nkl)H|;fMYh z;&zSC{`yb%;5)**0)F-JFWYi|i?&=LMnEN0NGNt$6+oB))doQ{;gjxnMvJF>3Mh9{ zNq}E}^658Q0Y7>6!?tQlWRs~~7sUo4_B^BTL5^B-5@8&nEvOWt|HV->!tek5w?PUx z>W)IOzznAVS@WBZ|YFKcl;(KyUc_pX33N=)e5S!YM_ATW{>2{4Jr znD98m8jCcv`x=jfogBs<8v^eN*wOR#BP7b1%?Q_cl(u-JS-JrO0Y(gp-%3gf-(nGz zoZDh?=M3)-?+S>c2thnUn$F1l2w4{4B0E7#F9_2yNq;a##OH!|P7Y+49WU@AeTuJ> z?*Q{B?n?&1y8?Q)I}dlHZaG)1faMz4a3XIidtwnZ*lcc?0&W;3T(lSp?+Or!B`{+; zf-pqgM!2H9l)v+E(Va@*Gp~6(n=2)9R5z>^hQmJti~<3oWWvue!f=dvmf_LG6Dok} z31TUGt~lC8rI10lwszJl!5t4kfCs>UU4`qMWiU0N@;_t6cfZieqD8Pk;XXcAO{OJIbG)o+7VyI7Aiy0D>Un zJWKpEjam0^X?az<3Ug~5TOX()q=@2_3S+9=u~#?*{|WyJh^9!g1dEdeFGO!qe%zJB z;)1IIdNwq?*I0+tA}?K{9D>2!;7^}FvoA_Fc(PU40Ec1^&Dkn z4&N2{_m0uJyKf*@q$mxS*8F3*0@}9=7(p%?j6d7t&?%C3#DA1ELOMNTgX4nQnmVcfS9kw+96$j(TA9*R z^5`utIOgsaru7v+Dhv73h@3G1YR+d%IU(A>S@hu<6n8jll}2f*LLR^|kqP zgz3mxRZEr{X!}x@b9`pQqXOrQ!#R&%9Do6^Rs2aHN64^kGhA=)l{iPCWr)3`u5TC^ zUt(0hV8>gK0e!XT4}%pD1QRM?f`4n;wWg389v3Gr_{E9rJi^7XSg~WPoA9W)8LwPh z>l+7QfQ37DauwUvgjT*@Gr?1MWrmVMu6P;EF0f)lzYdPDp{6!`Hcq4vzZk3lv|S(z z713Qwol=G{SQ0 z%3oXEB@bfGH6%`!CHTW1|MJaNz%QOZv-KMTW1ZFa`bt)LDs+_VmF`@`5AOW_;`|(! zmzUlZFgON~(0WZ_IN?b7jek=X`qQkRbtSU4ImrH-)oY%!R%|Ndx&Llxco3vjRon>b z@EihKyu>I>?H_PUnHw@;#}VVzYHKbN`mcl!p#VVvaED_>JPB`essj>ceDeomfkqMs z9Aw9BiK=)HN@1asU=6f+hNNqg|H(OVwT8Bl48Z!r*>ieJ_JEQ zL_fCAhVAYRkCCkg{Wq%8Rfs)oUC=WID?oAGom8lDR}pAYR6}>dFhk0EpkyVex4HFp zi+bN;l=MrdesKT>>}hTCJUl~`ommU4)#1|0qYbLv4Z=3ZB!8XbC2xjmm`XLttPW>d z8}N(43XqlW7qktX;gTcmmqRJ(=GJ9_kbKGc*(fdUSJ-a+zaKgX1C#;6IJJS;dA1_K zj7l&Yx7zZ|sKA;a<}tP!I58IZ#$W{$LB=jOGZq*Vs?x%tGQBy0iX^tdE1MxJx`mT* z#2&HR5$+QQV1EDwr*Umict>h|ZJ!Bdc2of@lea-+g`-x89s<1Y7JvTHx7!cD`w_nU z$KUN*`wDCeY_|(kY_jb#wF+qlPG*w+Cu@Vm?*{HKI0yrVpb8WvwB>EjblKuVhKE^{ zo8X*9T3zv;>o0pri+YEm+8xA$yemLR#(h_~XUqr~DSyUD17?a!6{TW^Ozx!3^8%;y zDW((VnXvzR?+)(@kXXHVE1qb)xMlWGjO5%x^^zVC@A*gD=j)smWygx4@Xr8BS--lp z(>f36?-9=8mbFrjM`6HzLC(;l#SQz1o8=9*ET-zRUyFKoJOBn*en60>NI6C*@HH#O zf^P6-n}6b^Yp{vdGR%|;n=+gBUFcAFSAg?k#(vu#o8mV908OOD68d{hO;jqb38oVCP-rM#%YTkS@>p=!z7vAi1;^t2DY7Hp4?@fR z;zeaq;yq9ROHm|hqPo&Y#J?)^-(o0e*H9K))&r65I34MKkLb+pEFK2$3fPgzB^^O) z$6K?zf?j6cy`;1OJIB7!DlIIqFyefLIp_Ke@$T@hfE8^XMln<1)O=pz>!q6N|Alv3!sXoCQ)&|X=wIQ!jz~7Tj!62C<-?FL`<@t+}yI;lDnetavj?s~n6yd9Fi7btw|6Bcf`5vS}AsHR9 zu}N$w3f8udfUscKf$^?xD@O*8*uj>sUCbMnU4vo^#$UBu+D{0QWce#C-R&) z5hNvWaQy!F{}8{ce!%O?3+y?=WnLgvjwxyJ9Gpk=^qNin$;vUV8j46oM+m$mRrS`(jyZV z-O1H3&ZAQg9t-G7pimZ4%b?2W?#SmjpIcZjh=7k?#|X+cp+tjwf^jGfBD&q!^I*lCxjJN`;KQ?#vl+@t8Rxo%MJSvTC_t`3xlJNr1^cqV5-T z$x4w!vQHGM?u3*YVbVP+bf|TLpbP?mIOPd!@`{vVXm1=2fJ$ZTgN&pY z(vdBbBTzVbwu(2OzzaZ-1M*kQWdEt*E-Q^BF>Hq$;!N6S@;KNrnoq6U_|$yw(cRXzt#Fn*Vq3!x#MY z=l|NTXLrQz3JAVO?jwv}A%i5DRR~>%HGdPx^a;7BkY|*#((pJYZ)twA=eG+1>$1Ox z_r`7jMy{Y!3K{0Ia(5F;|1MH2a>ncx_3bMxt!-X7em-Di(yxY!SX4#?T>isnTshl>5)NBi4l zE`DFRk+s1cpQ-XPw#P#u%8Ximz<-IPcy#OrAQ}U!D>8eBSmsy;1vOieo<&M^HzWbU z1{7?EnaWM1SBwNFt2p1ObB>PP08|r5d^dPUbMo3FH1zA)8B5DakWYxNK^rJ><%;K^ z;MgK37oi?C)_AA{c#GWt^kqQ$I3ro^tOAz(bRyF;aqlpNCnyYv8Ko@~kAIZ4tF6&< zcGAyrbSCes92dI*sHY5Vs<1SQBBz2GSEwO_fAaKl4^~KqTBZcUz~?Lc`hY0{^qHE# z{pRY9jNJgV*KvWktqmAT&qhsRDf?+;YMbZ8F9h((b>mzc+RRu!a}zvc+|USpWm+&SJ#Os- ztM2f)j+mzbdYCZXzhLgE6qgLYj=yqBd;$)rXmq{{Cw!v}l5a~qrzL#TAkAx%U0!oUB!XMZ%=316SSMU^-2s~i`*0dSMR!{2aq7E2%S+W#LOKTj~6@h|R% z;WpqZ?wBc#^lOWsU;h{D*rR*=4}SR!EufXa>{FZqXT0Zb$8V9+5>NdF-{}+uou5)3 zNp`_}*=}%tjgYp8)iX80Cs2Yirww+r#L;0W9+blq&KKZxA%8EV8Q39cwsCilkP{OY z+p|8;RE-)@Z}$O?jokoj7eIYM|6?-5f%Bj9zV`-USfN+y0#?U^CP=4(ls9tzb80Lt zy2T>l@khsQ0J?F;jG9b;ho&8_9EZK81>%eM3tAuPnJ2u;h@5^PUldAtM)AyPX+D7t z_`YVZpDBUAKY!z!!k|2*s7=60Jh2s?@Iw*tefa~PRe{U*8FY0)B^|z^Dyo}La82+& zDa`Q&#bd?9p*P&f_6uF1S&+5^?zu+aUZH&p(M5h{(ajR=%_G{~|NZXReFjER?%pc2 z=FBmezHxz=r~=!JBI!&{An{d#ULnEF3oJuQ1iNn?Rm-n4+Tb z3FyfFL;cF0zanv(Wv`KCGt{bKn0GENZ_fc79lHUrtzzN#oa+N-eMXE1Sx#SIIy~8D zENEb-l!V6}pXvWo2Y04-m^$i#PXItF3e0PY7&>le&%~}MoJx!QZeTBl>&*v=`&1$ zQKq=f0scx5kU_>A(F_Plj-aUeBHs%OGCjc&n14}ZZ=`tN?hnTHeU;SqTv zFj>yg&eK;+GtE_CrOa%rmX)(YrPLTT`Q)LXzLtb##pPb}v;F&bH~?LjViIJE!J_FS zD}O;@wA-WchOI-r(0be-NuEq0(Yb9`M;VHYLWlD@wG? z1R_itUa=ACfQ8d#t`{UX>WPKGXbI_W?~8mq4hKM>MBFZ|7Y<_{A-f)@8^M_GFlmMR z2`D&DQ~5wcp4gr%*hqETd_^_6Hx36N%zqxwNl71}X_)4>`v@~NQZN$MQf5yAwo5oc zN`z%V!7-|~`wWvsn}31_C6O$6nC;JBI7+D@tRwNU$7My8$(@hX4wgbH+JHfEw94%- zN;>|YMA`0t$m(za3=`6n$wF<9+8LOFDzcccED8KNBbh0j3UUO^)b=+7!jl(P1AoWe zS5^PM%E#ky0L}@MZnmdMzJ}y{2O^rWq{q1M=bAjg_p%D7BH&5UavFuasgTDDa_Z_|N|sx98&LmE=Zt&q4}oJZfp-a6)QnvFRBk+aO3D=M*>)V9FNrJ;zV~`5*tk zh0sjtm)__b28nvRozAi7#fnx}Sbv5qCJLc+ok)sg#=$@rJx`kdI*l^!H&cfLkOYpw zlB!Om2;0-9?0qe$3?G}lE?5!FoBeJE_B-`}a~ZszvG^Ph8m+x?JOIm`dbs6IPmrgP zwN1_MOBl-Cp>ZU?hJuJ9hz${A2Qjkmha6ckKwLN~cE;fVxID)&D6})no_{`irrCj8 z;J4?9SBbm5A<-I!T4AME2+576$>P`TG28q8TWf~{P^c13mf~{aS2*GPLxrcO3}q#d z78$-u8Wi;te3|2$ropAEQB(oHW0gEL#rrBBkHZ0&)-PCIMzptqJv{@zd_nhDhgUj1 z{pCSxY%%`&3)X4Ee|L8t*CXOV$JiQ+q5tK5m5&DSH-fj&)3AkQl>h($07*qoM6N<$ Ef_zHf+W-In delta 2507 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 delta 2518 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 diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/solid6.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/solid6.png index 8737894cbf0f7b8e5edaff7ed5d4fe981dbaf434..ba6ac0281f9fb64913d60d50c23036cabc209da0 100644 GIT binary patch delta 3114 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 Ef@F2y!~g&Q delta 2484 zcmV;l2}}0W7~>O=Nq@rt01m?e$8V@)000SiNklAVeZS;-`^0f(VHaWZ8(sjzO{`%x-(OXZls|p5mPER`s+U&TZ)q zKH9I|yIbdb-&?m$+qU8pAH4sQ_6P60l>fZ?uZX_NK$anPOVNn@?UPT9KJ-Woy1iEnyS;$Qa+b(VX-?#OjPTH5d&eV@Iv2Iu1#IVE z0qqf+ql8jGMsnDdk_^6URJw${R_N9uJZbLn@UDO=D_}?{!Q4YYQbi=~bU-6VX&`NP zPEZM#3S93B7=HwCX-Q-*xxE1P(|8D*w`zA1$!Ab~##1uzf9w6h7I1lqfTKio^6lQN$%HY79-^lvEt zD0KG%|4C3#%kpo)%aYy8LHA^sByjo?A2?P;K473EmYj3PVYzV<=#RIA5rB zE!U24%YW!c1;FVMd$vsqC6C_05#ANB+wP>jdkqT*G6SnbU+F|sOW%Y|05GCX8mOrA zfJCpl;R)mbP#G^IZwE+&Y=~L(to|CY5j2AlRU`gIhWRd2&>Yb<0R# zj!2VKBHlaQe>|M$13voj=Wt$RW}cw0H*n3e+T+CFWoL-(90?53ikId8G#Z4`m_}Z{ z^-TW#uP@}Y&%e3=jmP6+9>8vGi@H5v=^ns(gFy0fBX`JR#El@g1|odxx_Erf6Rh1ZR0f8^h#`1eQbY z+eph*4&EAM-Cl>YsNbrVUTYrVtbjK<9)T_UA?yg$D8Ttpg+ah%u`Z9YLDN&*e%;;i z3ugt;h&pPGkf}S1zJ2{R8kknDrc(&=0e?+T52y{?-yRc@^Z)LS3n;*L>2P@K*1+oZ zN=e>sZzMyfXBpe(#U9dK0tvqlAzkv(QfbK2OJkRJaQ3Of}*xiBsJ+4tziEjPESpgwRS^=W$1Aj=T zQV*ao*jXNN+?oAdC?a8MY%96X4-z~$i#IqcfaHl6v#xLFJRL?a1{s0;2JJyZfwE?% z!2KkgNRqPE^{;^ogg`7WkND{QL z1^)aCPCt{&k={&?hMEqd2&EH!L%``U&u~|O*0gSq0gw*l2N64B6(&Yzi7!i%?K_2s z#?d$2L!cA(0QXG^IY@&&M!ouv-ys@ouKTvT#~1pvqXzVfy004vQ&tMAkWc^lxz|$QtbpJD=GU!;|1cDDxD&IumVAei zVGGmapPsQtPTo?&yA8kZbKalihuR!}{O7;?e=Fcu@BavG4GJGPCFWjR;sv690itY* zZW;F&8W%W=L3zWuTnr0&Mt^+r55FF8kt*=+RU$`|f_5kendqd*3Pit_XCOXCm&iB> zK>h{xb4b@Tx#|8Qa8>|&zMCzN$YunZH0Tl~aEbj~_Bu|ylG5<}!Pv_wCps^peF6N030KXpNC3p#)S0$Rq{(F}=bsoE4zm-f&_EwluJck=4x`&IG8vv%JA` zMl!UC*;(9wcO{q)xaR;6BIhWcC}9N>qKs0I4<#?4nmE$QQ4W*N_&*6;C=1yS+etW< z%s}i#g^5$t0}hVuw0{{Jmaef14z1u*%s6E5pqnwmXf$B;Y9 z*%u+6G7nG)UH9u5&I*{rmA{2!BS*-gJxba3X^#SQia3n}gMaVAx54A7lyxM#U5tH< zwjfoBkQ*Wyjp9=xB)H<+H{5f81^|WA+?@JAP{8_jO5F7Nkg_b0FW?clz+6z`HkZ5m zhWFnKeDuo?>?~Rr9!6Jz6bO@%RGL$uu;2=MNN zGx+*v6rRDEDt`>0w=G5#qp7qL&L!Z6K^U>20(mYE55)Zk4d!?sX>Ft|-w<7E}t| zA6pF$U25+J?+UPU#sFB_lnH9xDsX$wPj4NliK9KUvwsWjS=74%TDZQ^PiY{lZ6d7P zts&}Cpl-S5pa&O7GF95eSZ;U%9sr`*X&eb9fEp`lgRI{?43<`_l|)cf6p%huLpcS< zqv2lx70FvkRcLYA*IJ%L8_0Az6WW_j&k5CSUO`Xxdy@;Ega=%~s7n}=iyw<}i%77R zZ)K=+On=d-e>BJkb}21$1B;?7yer@eLy6vzHRhuQ&fy1LgQh>7zysNCuk(#Mtq5@W zoi4z1gm(qJULRz2yOlV51(vTQDX>3>5~ebE&{@CV=-v(fLx8KxqM3Y&2IxknlC^=v zQ6xWv*AK%;sapYC#=`(gVAa5BpCw%IByxZSSAUeS(Xq|Vn!k-hOq@uXM(X^ipHygg zDuC;bUGanzzyxT^VUCV)4VpRnf|Cb;>@a3Nz!}&#O|6TrUEzH+_=n&9wk>M@R01SR zepF@FFD1|RGDyaDppAi$oqK|xEZ@=2uqtdv_{Wd`Pm?;JT0000}g(f6}Yo zG_(>RKr8*J009rZX`uBvs$`NeNBE>0`S=AH4Fo_dBv@HwdeP0zuALi<6gW8k@|XWi zRk~nZX7r`Pb#f58z-(IRFAZ^Su*?B6w#c#@CU=L5fNvT^r+@ML@Bg!F5AyYRSf~Iz zrUy5f;pzp1b-4Ef(B;rqgXBD-?2$so7q_rDA;mMouMuuZuT_2?hbLg<*CoF|^H{%} z#pH9y#$#+Ue10YPyhY%qHBbFH2zZs46aiCbsN?N+8RoN$tSzJC<3g+^i$f@Y=64hH_U$j{^O1l($aF(p*<2}|J-{zI|H6Eat^(Sdu` zVGI+rEZ71Il3wA=fJ_Mt1^Z`b9G(E*Np4dDsv zx>jgdDI(8Nvl{ls;R$eZE9nQs*rSgUZgeOsK86KKR)2`g1XUy$U!w_UjD7*m6?(I< zd)C(~Kaax`AnP8U$FErK8D{u&hFB*EZ;?JNwlkizL~Rll++o)eVp0^v30d_93Ba9- zjseq&kNLwfb(8jg{nQn zl5-~Aqeh2D8$@LhnTS(iu$WI|grU80cmlMYxlx{We&y7Qm_OJMrbCzYSSWyHo1;$! zN833T&0I z^~laRJOL2YfZ`J~)qlQLP)fsC3opJ9C(1rIU)IE4&VTRe2~H8UEucGrROYWmejdlS zfPdBKdkUT)>put7?u*n%80tucn5YFFaz0c1s1a0w#&Fv#Sy5k|{xpv*Yqm487QH1wh|`gf6Gl`{>ELdt((P7?|`J!eOZMETSY$lC@M_dYFuT;}56YZ4x<3@gGRWo(Zp zbwTB1`2i=2;?c1?0g2GE=o(|*A%9f`)YIZg&U`Wr^P+_1odp-(xC|O z9lI0IR}mQ%&a4ks0n2_m!A5R8cues|J2M~^7LMAGh_!xcFbr%LD2`6^T7TuZ*qwle zqpi&p){7$K)Ucz28ghhN;O3vG_Y#E`?14jRct2;7wC!nn+NP2hM zf(k!f;3uxb;iGQMap^GCunhgsNj@=0mH0EVb>Ps!23)Q_WQ3sM>Pw!r_ z*Etz{(nMy*mKc$Hjm~(EM1@7|cXNAVcLG*nK%0(Q6i_8a&@0H2Uj1|?3`H6rkFwyu ze@>_}j?IQGF_uJS8YKM&9MBKc`CmO2@_&_xz>0Hm7_d+e-0F~R)qkM5;Zub!mGJ8c zSIgIo4dk-_y8hnSoq)VrpntP;fBbrGP?S*=1lS+c znWDBRdjBgV(YL)!+!oxk47y6V7>o2I7mP$-@yESBW@h>SKYY5oH+Cl=(tiSbCLuRDQcuF;_kFO4 zgM;B1%tD4|Bqm$IlOGW?gJEsax)pkOgG*xlCVprz&kvqOfrVNdmMLt>xI z_#_z?Oh&OPl*M+BVQl; zJ8al4pS>12Fn@L@V2UM@?QosBu`Gulh{oarbpxChTH;FuxAdsg{C$ChdBPeC%mgT# z-oOl5McnH)K+c^4-b<#+WY{&B3g|H;590(7`qd&$_^D3y`tiW5D_{4ge)?CX;I24#OcUNnb}q?E5|`)WQ>M-LYu9AlT3@l_0jOT{pWXh z0=h24B&Za_f=i!R3G@-P*S4^19r8jO@OV;R9yOvUa1R$a^1~$j_lGTe<9HRSXr{~) zA%EY-ro@<42p3vrCL&H6L9r2LY>&|E7(MJJA6f&+#81{AkG0FrlOC~&|!wGX_UxF z(Ml`}F?$kNI>QN4A+7^Tj!{KlF-;5F;(rZpl!RIFwA-)0aFmiE7Ej@0kIR~r$&*iH zhlL=OmWV-dv`R^x=(fwvsM>Mr-H+9@d)BVAR+|OYQ@xjR{@3sdC5w+zCjDfGdX`PFa>b_ll~stgd-9s4a2G! zdCDclv8uM~i}V6j4@ENkq7N|R8;rp)MyTyW6861*5^paF#yCc=FLPAJr#7uW>-g32_ycdx!*No;=VJWS7)!~d>s^#x}dt{X9 z`yONB_rLx6`3vl;nxDr0%fisj1E5F?&U-vPZS)wHdB!t?j(_uS{_;0I^mT+Q7{Q8h>Xad^{A^3S)SVK z*Tnb)oPaWZi?XgQ0UFC}O7rFo(xEFc5*#?QFi!KPZS`sAJ{X;Vs@fr?sh_`yMB0=c zg>E_5RgRwGD}Po|_>eXc8pVg}U~~djs}(Q}DHxDP36`rRzTh<(dy0xS(4jTdHiZu; zy!2l+C4$*PA;KG@6Hr$T>aIgh1|l#J-u(yf+HdLq74I4w2hNan>}4@ghVA+Z+q!f& zJTN)|>wSe;R#QIzh!V&5jhkSJE2-e}BhoNgUu^;qMBg6Y%j(j?GrV zE~fY?9@DSz?=C@YBByebVKp(xCsRwn`w#Ci=TTg2U3T=s=mczA<$tGI$y@TXWJK6e z;cZvj;UK9?tRL^NJ~2Za8v%fzg_V)B_+fMc zEF>YZGJgTbltX8tfo2dd?QMgMA3dtw-kvX#l!;Q2!w}_aDUS*$I2bB2~v;`gON^n!4H-7JZn7L*ysE z`TIWx!yX6z77(*oSdr`oXi_viv7x=LX=QIXYYn@ZR zZGUvi!FbvE&>UF8g{<>u3VP$hn*f9DFw?w2b7FPY=MKW*of_sy72yM>DZ}8% zHWxv{-hFN3LD#d!qxKDdXPz$XZ;y>D!~oUkcH+QeFj+FfA8eFQsPh$LKtWz|WsCva zdj0$>W5SyNNpY56`cyR7A8Ir_DYpM*fx~l~0c0Ug)b_BZ8>Fef))G<`bPI%od3Ag%w`QTPK;#$he9Hq=~vaPWbQA=gn~J zc9@t6zHMSmvLzy#g9O*m{AUpZde(v6vm%{9TGCJ>T#}BOY0xfa9*@}XFMp-4wEwfP zfIf)PpN?n`9LEMh5TTw#C?*rU5JKhSHKVirzuYUvd8 z5WURFvkXl;ek&|^6Hs*qm4A6h?I#r8P%!oX!%ZD^u2=nrMUi>HJ5@~`ql5C}4Zz<5 z2Hck=OwgK4)~02o|BZ-4L#bI%U3L(hoW z$QsULWOx%Gqt=L#T0sYyExL4u2Qy=g_<#-G*=u&An+W4UV{G`x0OMAJwkmiiSj(W- zumMscyxaC@7!0<|3tRJs7V=`h2cLcU7I-Xp6HrkMwg8xCAtDw*s_oK3>i`b2i22OD zAyB>0(^jnKzciH*;eSm)ZruJpLGSal*T?PjE1px`o-MGg4F;h_K*@W{1-rzN;qL-O zF?I)I8G(7&l^@EXRj80TTQrnx;kFbe4>^+gfv%?|&;*G6}K)azvyVdqy6| zhBpC*Wo;0In9u13LvFvM_hBX2%6So1R9ORkbIaC?9>jt}-&vH8yP zg28jc`!0t3`G2o|`wOm;1$=N`BT`jp#ln%XC5Gp0a9b32vyNP~EISoi%f zIsxcfw1*b&zx*ZQ)NO`#YXz(-P88m@(t6OLClMFP{TUda0BM+VY@XIU@P~GvMVI30 zSwvnqT%xOuJJ-Ms5a6_K#nH!E#^HEgHkD0$u%Eor(|;_U1B4$&C*UlCEL|30U$I>j zZK3)h<@lfKtbwV%lg0S=lQ&=ij)b#GyZyjtT7(`EPo?mj&DI$`-Q;2)ugCZnAj#~| zi7TBVc24tPxX{b&HO^?56E?haov(fq7VraThY97a)lY4o*fCX@oGP0B6WxHfSR*_f zBODJu@_&<8VtfK@DM<&A_M;f4`5pnD?9kTX)b6C?^*%;JBAnk3zW*XCycRcO0Sj!A zG~d}p)r(j?zM{F;`V%=4P;$7d4(>&qA8v+#I|_N=n4fB9Iof};Kx)Il1VuQrn{0%g zU3x#0aIPa?kDDRDAYr--v7=;KC#tH36=IEl^?xfQ{Ueq%jWkY>L=g^$BUba-#S}bn zGX#W5Vc#ZyKF#obqX-yaH&FnH84VWrT=&?#_%pfB4^Klp@WagzAczE^#GHM>lr7QJ z8o7oZyJJ From 106cdd80eac12f92c84105f86d73fadda504e71b Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Tue, 11 Jun 2024 00:34:28 +0000 Subject: [PATCH 060/155] Automatic Changelog Update (#435) --- Resources/Changelog/Changelog.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index babf5f90782..1f876cf9a7f 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4148,3 +4148,21 @@ Entries: message: All species can now bring their own cultures and languages id: 6119 time: '2024-06-10T20:48:48.0000000+00:00' +- author: FoxxoTrystan + changes: + - type: Tweak + message: Rust Walls Sprites. + - type: Tweak + message: Armor, Bulletproof, Riot Suit Resprites. + - type: Tweak + message: New Banners Sprites. + - type: Tweak + message: Stunbaton, Fire Extinguisher New Sprites. + - type: Tweak + message: Rack/WallScreen resprites. + - type: Tweak + message: Stock Parts new sprites! + - type: Tweak + message: Radiation Collector has now a new sprite! + id: 6120 + time: '2024-06-11T00:34:02.0000000+00:00' From 00381a483e9d6195ce8a319f99f59bfcd21389f2 Mon Sep 17 00:00:00 2001 From: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com> Date: Mon, 10 Jun 2024 19:18:49 -0700 Subject: [PATCH 061/155] Update Nix Direnv .NET SDK (#436) # Description Nixpkgs updated `8.0.x` to `8.0.3xx` but we need `8.0.1xx` --- shell.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shell.nix b/shell.nix index 9a1b0ca4290..e93db685da5 100644 --- a/shell.nix +++ b/shell.nix @@ -7,7 +7,7 @@ in import (builtins.fetchTarball { let dependencies = with pkgs; [ - dotnetCorePackages.sdk_8_0 + dotnetCorePackages.sdk_8_0_1xx glfw SDL2 libGL From 32394b093b7d967b324b16cfc8956f8b6e59dcd1 Mon Sep 17 00:00:00 2001 From: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com> Date: Tue, 11 Jun 2024 02:18:56 -0700 Subject: [PATCH 062/155] Fix Null Being Taken Literally, Crashing Debug on Login (#440) There's probably an upcoming mirror for this, but whatever. --- Content.Server/Administration/Managers/AdminManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Server/Administration/Managers/AdminManager.cs b/Content.Server/Administration/Managers/AdminManager.cs index b1cca46e63f..57d6e089bd4 100644 --- a/Content.Server/Administration/Managers/AdminManager.cs +++ b/Content.Server/Administration/Managers/AdminManager.cs @@ -315,7 +315,7 @@ private async void LoginAdminMaybe(ICommonSession session) _admins.Add(session, reg); - if (!session.ContentData()!.ExplicitlyDeadminned) + if (!session.ContentData()?.ExplicitlyDeadminned ?? false) { reg.Data.Active = true; From 2138b8ac18f004b7364a5c54903963115b6b9cd7 Mon Sep 17 00:00:00 2001 From: SimpleStation14 <130339894+SimpleStation14@users.noreply.github.com> Date: Thu, 13 Jun 2024 15:30:31 -0400 Subject: [PATCH 063/155] Mirror 26441: Fix atmos NaN error (#449) ## Mirror of PR #26441: [Fix atmos NaN error](https://github.com/space-wizards/space-station-14/pull/26441) from space-wizards [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `fdb4a61487db9fc67714c913832427063abdea42` PR opened by ElectroJr at 2024-03-26 04:27:08 UTC - merged at 2024-03-26 04:44:56 UTC --- PR changed 16 files with 43 additions and 25 deletions. The PR had the following labels: - Status: Needs Review ---

Original Body

> - Fixes a bug I introduced in #22521 that caused the temperature to be set to `NaN`. I don't know for sure, but I assume this is causing the current atmos issues > - Fixes `FixVacuum` not working after #22521 > - Removes some redundant yaml that was setting FixVacuum to its default value > > :cl: > - fix: Fixed an atmos bug, which was (probably) causing atmospherics on the station to behave incorrectly.
Co-authored-by: SimpleStation14 --- .../Atmos/Components/AirtightComponent.cs | 32 ++- .../Atmos/EntitySystems/AirtightSystem.cs | 2 - .../AtmosphereSystem.GridAtmosphere.cs | 8 +- .../AtmosphereSystem.Processing.cs | 2 +- .../EntitySystems/AtmosphereSystem.Utils.cs | 3 +- Content.Server/Atmos/GasMixture.cs | 7 +- Content.Server/Atmos/TileAtmosphere.cs | 3 + .../Doors/Airlocks/base_structureairlocks.yml | 1 - .../Structures/Doors/Airlocks/highsec.yml | 209 +++++++++--------- .../Structures/Doors/Airlocks/shuttle.yml | 1 - .../Structures/Doors/Firelocks/firelock.yml | 2 - .../Doors/MaterialDoors/material_doors.yml | 1 - .../Doors/SecretDoor/secret_door.yml | 1 - .../Structures/Doors/Shutter/shutters.yml | 1 - .../Doors/Windoors/base_structurewindoors.yml | 1 - .../Entities/Structures/plastic_flaps.yml | 2 - 16 files changed, 147 insertions(+), 129 deletions(-) diff --git a/Content.Server/Atmos/Components/AirtightComponent.cs b/Content.Server/Atmos/Components/AirtightComponent.cs index ca107eafbe8..69488a71307 100644 --- a/Content.Server/Atmos/Components/AirtightComponent.cs +++ b/Content.Server/Atmos/Components/AirtightComponent.cs @@ -9,27 +9,53 @@ public sealed partial class AirtightComponent : Component { public (EntityUid Grid, Vector2i Tile) LastPosition { get; set; } + /// + /// The directions in which this entity should block airflow, relative to its own reference frame. + /// [DataField("airBlockedDirection", customTypeSerializer: typeof(FlagSerializer))] public int InitialAirBlockedDirection { get; set; } = (int) AtmosDirection.All; + /// + /// The directions in which the entity is currently blocking airflow, relative to the grid that the entity is on. + /// I.e., this is a variant of that takes into account the entity's + /// current rotation. + /// [ViewVariables] public int CurrentAirBlockedDirection; - [DataField("airBlocked")] + /// + /// Whether the airtight entity is currently blocking airflow. + /// + [DataField] public bool AirBlocked { get; set; } = true; - [DataField("fixVacuum")] + /// + /// If true, entities on this tile will attempt to draw air from surrounding tiles when they become unblocked + /// and currently have no air. This is generally only required when is + /// true, or if the entity is likely to occupy the same tile as another no-air airtight entity. + /// + [DataField] public bool FixVacuum { get; set; } = true; + // I think fixvacuum exists to ensure that repeatedly closing/opening air-blocking doors doesn't end up + // depressurizing a room. However it can also effectively be used as a means of generating gasses for free + // TODO ATMOS Mass conservation. Make it actually push/pull air from adjacent tiles instead of destroying & creating, + + // TODO ATMOS Do we need these two fields? [DataField("rotateAirBlocked")] public bool RotateAirBlocked { get; set; } = true; + // TODO ATMOS remove this? What is this even for?? [DataField("fixAirBlockedDirectionInitialize")] public bool FixAirBlockedDirectionInitialize { get; set; } = true; - [DataField("noAirWhenFullyAirBlocked")] + /// + /// If true, then the tile that this entity is on will have no air at all if all directions are blocked. + /// + [DataField] public bool NoAirWhenFullyAirBlocked { get; set; } = true; + /// [Access(Other = AccessPermissions.ReadWriteExecute)] public AtmosDirection AirBlockedDirection => (AtmosDirection)CurrentAirBlockedDirection; } diff --git a/Content.Server/Atmos/EntitySystems/AirtightSystem.cs b/Content.Server/Atmos/EntitySystems/AirtightSystem.cs index 548d6a36926..152fba8fc4d 100644 --- a/Content.Server/Atmos/EntitySystems/AirtightSystem.cs +++ b/Content.Server/Atmos/EntitySystems/AirtightSystem.cs @@ -85,8 +85,6 @@ private void OnAirtightMoved(Entity airtight, ref MoveEvent e private bool AirtightMove(Entity ent, ref MoveEvent ev) { var (owner, airtight) = ent; - if (!airtight.RotateAirBlocked || airtight.InitialAirBlockedDirection == (int)AtmosDirection.Invalid) - return false; airtight.CurrentAirBlockedDirection = (int) Rotate((AtmosDirection)airtight.InitialAirBlockedDirection, ev.NewRotation); var pos = airtight.LastPosition; diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.GridAtmosphere.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.GridAtmosphere.cs index d43cc81b0f8..beddef4be7e 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.GridAtmosphere.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.GridAtmosphere.cs @@ -399,10 +399,7 @@ private void GridIsHotspotActive(EntityUid uid, GridAtmosphereComponent componen args.Handled = true; } - private void GridFixTileVacuum( - Entity ent, - TileAtmosphere tile, - float volume) + private void GridFixTileVacuum(TileAtmosphere tile) { DebugTools.AssertNotNull(tile.Air); DebugTools.Assert(tile.Air?.Immutable == false ); @@ -416,6 +413,9 @@ private void GridFixTileVacuum( count++; } + if (count == 0) + return; + var ratio = 1f / count; var totalTemperature = 0f; diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Processing.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Processing.cs index 1f3ca2145b9..eba398c1821 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Processing.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Processing.cs @@ -272,7 +272,7 @@ private void UpdateTileAir( tile.Air = new GasMixture(volume){Temperature = Atmospherics.T20C}; if (data.FixVacuum) - GridFixTileVacuum(ent, tile, volume); + GridFixTileVacuum(tile); } private void QueueRunTiles( diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Utils.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Utils.cs index 9b0d0d9670d..67c6d5998dd 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Utils.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Utils.cs @@ -78,12 +78,13 @@ private AirtightData GetAirtightData(EntityUid uid, MapGridComponent grid, Vecto if (!_airtightQuery.TryGetComponent(ent, out var airtight)) continue; + fixVacuum |= airtight.FixVacuum; + if(!airtight.AirBlocked) continue; blockedDirs |= airtight.AirBlockedDirection; noAirWhenBlocked |= airtight.NoAirWhenFullyAirBlocked; - fixVacuum |= airtight.FixVacuum; if (blockedDirs == AtmosDirection.All && noAirWhenBlocked && fixVacuum) break; diff --git a/Content.Server/Atmos/GasMixture.cs b/Content.Server/Atmos/GasMixture.cs index 77fd7018333..3d73a4d0b16 100644 --- a/Content.Server/Atmos/GasMixture.cs +++ b/Content.Server/Atmos/GasMixture.cs @@ -62,9 +62,9 @@ public float Temperature get => _temperature; set { - DebugTools.Assert(!float.IsNaN(_temperature)); - if (Immutable) return; - _temperature = MathF.Min(MathF.Max(value, Atmospherics.TCMB), Atmospherics.Tmax); + DebugTools.Assert(!float.IsNaN(value)); + if (!Immutable) + _temperature = MathF.Min(MathF.Max(value, Atmospherics.TCMB), Atmospherics.Tmax); } } @@ -91,6 +91,7 @@ public GasMixture(float[] moles, float temp, float volume = Atmospherics.CellVol if (volume < 0) volume = 0; + DebugTools.Assert(!float.IsNaN(temp)); _temperature = temp; Moles = moles; Volume = volume; diff --git a/Content.Server/Atmos/TileAtmosphere.cs b/Content.Server/Atmos/TileAtmosphere.cs index 0dd35a29e76..0026dbbf4f0 100644 --- a/Content.Server/Atmos/TileAtmosphere.cs +++ b/Content.Server/Atmos/TileAtmosphere.cs @@ -28,6 +28,9 @@ public sealed class TileAtmosphere : IGasMixtureHolder [ViewVariables] public TileAtmosphere? PressureSpecificTarget { get; set; } + /// + /// This is either the pressure difference, or the quantity of moles transferred if monstermos is enabled. + /// [ViewVariables] public float PressureDifference { get; set; } diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml index 4bc43b5559e..476e715175e 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml @@ -104,7 +104,6 @@ - key: enum.WiresUiKey.Key type: WiresBoundUserInterface - type: Airtight - fixVacuum: true noAirWhenFullyAirBlocked: false - type: RadiationBlocker resistance: 3 diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/highsec.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/highsec.yml index d799558df75..a26226c9578 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/highsec.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/highsec.yml @@ -1,105 +1,104 @@ -- type: entity - id: HighSecDoor - parent: BaseStructure - name: high security door - description: Keeps the bad out and keeps the good in. - placement: - mode: SnapgridCenter - components: - - type: InteractionOutline - - type: Sprite - sprite: Structures/Doors/Airlocks/highsec/highsec.rsi - layers: - - state: closed - map: ["enum.DoorVisualLayers.Base"] - - state: closed_unlit - shader: unshaded - map: ["enum.DoorVisualLayers.BaseUnlit"] - - state: welded - map: ["enum.WeldableLayers.BaseWelded"] - - state: bolted_unlit - shader: unshaded - map: ["enum.DoorVisualLayers.BaseBolted"] - - state: emergency_unlit - map: ["enum.DoorVisualLayers.BaseEmergencyAccess"] - shader: unshaded - - state: panel_open - map: ["enum.WiresVisualLayers.MaintenancePanel"] - - type: AnimationPlayer - - type: Physics - - type: Fixtures - fixtures: - fix1: - shape: - !type:PhysShapeAabb - bounds: "-0.49,-0.49,0.49,0.49" # don't want this colliding with walls or they won't close - density: 100 - mask: - - FullTileMask - layer: - - WallLayer - - type: ContainerFill - containers: - board: [ DoorElectronics ] - - type: ContainerContainer - containers: - board: !type:Container - - type: Door - crushDamage: - types: - Blunt: 50 - openSound: - path: /Audio/Machines/airlock_open.ogg - closeSound: - path: /Audio/Machines/airlock_close.ogg - denySound: - path: /Audio/Machines/airlock_deny.ogg - - type: Weldable - time: 10 - - type: Airlock - - type: NavMapDoor - - type: DoorBolt - - type: AccessReader - - type: Appearance - - type: WiresVisuals - - type: ApcPowerReceiver - powerLoad: 20 - - type: ExtensionCableReceiver - - type: Electrified - enabled: false - usesApcPower: true - - type: WiresPanel - - type: WiresPanelSecurity - securityLevel: maxSecurity - - type: Wires - boardName: wires-board-name-highsec - layoutId: HighSec - alwaysRandomize: true - - type: UserInterface - interfaces: - - key: enum.WiresUiKey.Key - type: WiresBoundUserInterface - - type: Airtight - fixVacuum: true - - type: Occluder - - type: Damageable - damageContainer: StructuralInorganic - damageModifierSet: StrongMetallic - - type: Destructible - thresholds: - - trigger: - !type:DamageTrigger - damage: 1500 - behaviors: - - !type:DoActsBehavior - acts: ["Destruction"] - - type: IconSmooth - key: walls - mode: NoSprite - - type: Construction - graph: Airlock - node: highSecDoor - - type: Tag - tags: - - HighSecDoor - # This tag is used to nagivate the Airlock construction graph. It's needed because this construction graph is shared between Airlock, AirlockGlass, and HighSecDoor +- type: entity + id: HighSecDoor + parent: BaseStructure + name: high security door + description: Keeps the bad out and keeps the good in. + placement: + mode: SnapgridCenter + components: + - type: InteractionOutline + - type: Sprite + sprite: Structures/Doors/Airlocks/highsec/highsec.rsi + layers: + - state: closed + map: ["enum.DoorVisualLayers.Base"] + - state: closed_unlit + shader: unshaded + map: ["enum.DoorVisualLayers.BaseUnlit"] + - state: welded + map: ["enum.WeldableLayers.BaseWelded"] + - state: bolted_unlit + shader: unshaded + map: ["enum.DoorVisualLayers.BaseBolted"] + - state: emergency_unlit + map: ["enum.DoorVisualLayers.BaseEmergencyAccess"] + shader: unshaded + - state: panel_open + map: ["enum.WiresVisualLayers.MaintenancePanel"] + - type: AnimationPlayer + - type: Physics + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.49,-0.49,0.49,0.49" # don't want this colliding with walls or they won't close + density: 100 + mask: + - FullTileMask + layer: + - WallLayer + - type: ContainerFill + containers: + board: [ DoorElectronics ] + - type: ContainerContainer + containers: + board: !type:Container + - type: Door + crushDamage: + types: + Blunt: 50 + openSound: + path: /Audio/Machines/airlock_open.ogg + closeSound: + path: /Audio/Machines/airlock_close.ogg + denySound: + path: /Audio/Machines/airlock_deny.ogg + - type: Weldable + time: 10 + - type: Airlock + - type: NavMapDoor + - type: DoorBolt + - type: AccessReader + - type: Appearance + - type: WiresVisuals + - type: ApcPowerReceiver + powerLoad: 20 + - type: ExtensionCableReceiver + - type: Electrified + enabled: false + usesApcPower: true + - type: WiresPanel + - type: WiresPanelSecurity + securityLevel: maxSecurity + - type: Wires + boardName: wires-board-name-highsec + layoutId: HighSec + alwaysRandomize: true + - type: UserInterface + interfaces: + - key: enum.WiresUiKey.Key + type: WiresBoundUserInterface + - type: Airtight + - type: Occluder + - type: Damageable + damageContainer: StructuralInorganic + damageModifierSet: StrongMetallic + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 1500 + behaviors: + - !type:DoActsBehavior + acts: ["Destruction"] + - type: IconSmooth + key: walls + mode: NoSprite + - type: Construction + graph: Airlock + node: highSecDoor + - type: Tag + tags: + - HighSecDoor + # This tag is used to nagivate the Airlock construction graph. It's needed because this construction graph is shared between Airlock, AirlockGlass, and HighSecDoor diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/shuttle.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/shuttle.yml index 21d485be0c8..9771f633888 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/shuttle.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/shuttle.yml @@ -57,7 +57,6 @@ denySound: path: /Audio/Machines/airlock_deny.ogg - type: Airtight - fixVacuum: true noAirWhenFullyAirBlocked: false - type: Tag tags: diff --git a/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml b/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml index dccc76e96c1..e677ef185be 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml @@ -93,7 +93,6 @@ - type: Physics canCollide: false - type: Airtight - fixVacuum: true airBlocked: false noAirWhenFullyAirBlocked: true - type: RadiationBlocker @@ -158,7 +157,6 @@ sprite: Structures/Doors/edge_door_hazard.rsi snapCardinals: false - type: Airtight - fixVacuum: true airBlocked: false noAirWhenFullyAirBlocked: false airBlockedDirection: diff --git a/Resources/Prototypes/Entities/Structures/Doors/MaterialDoors/material_doors.yml b/Resources/Prototypes/Entities/Structures/Doors/MaterialDoors/material_doors.yml index 644976eb9c4..3709b739a3e 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/MaterialDoors/material_doors.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/MaterialDoors/material_doors.yml @@ -40,7 +40,6 @@ path: /Audio/Effects/stonedoor_openclose.ogg - type: Appearance - type: Airtight - fixVacuum: true - type: Damageable damageContainer: Inorganic damageModifierSet: Metallic diff --git a/Resources/Prototypes/Entities/Structures/Doors/SecretDoor/secret_door.yml b/Resources/Prototypes/Entities/Structures/Doors/SecretDoor/secret_door.yml index 2c54d3cd418..d6c087af0a5 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/SecretDoor/secret_door.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/SecretDoor/secret_door.yml @@ -38,7 +38,6 @@ - type: Weldable time: 2 - type: Airtight - fixVacuum: true - type: Damageable damageContainer: Inorganic damageModifierSet: Metallic diff --git a/Resources/Prototypes/Entities/Structures/Doors/Shutter/shutters.yml b/Resources/Prototypes/Entities/Structures/Doors/Shutter/shutters.yml index 7d3af93a64d..55010eea512 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Shutter/shutters.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Shutter/shutters.yml @@ -59,7 +59,6 @@ - key: enum.WiresUiKey.Key type: WiresBoundUserInterface - type: Airtight - fixVacuum: true - type: RadiationBlocker resistance: 2 - type: Damageable diff --git a/Resources/Prototypes/Entities/Structures/Doors/Windoors/base_structurewindoors.yml b/Resources/Prototypes/Entities/Structures/Doors/Windoors/base_structurewindoors.yml index 56167c178e2..d03765d4fc9 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Windoors/base_structurewindoors.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Windoors/base_structurewindoors.yml @@ -130,7 +130,6 @@ - type: Appearance - type: WiresVisuals - type: Airtight - fixVacuum: true noAirWhenFullyAirBlocked: false airBlockedDirection: - South diff --git a/Resources/Prototypes/Entities/Structures/plastic_flaps.yml b/Resources/Prototypes/Entities/Structures/plastic_flaps.yml index 8c53daf3b60..bf49eb1be35 100644 --- a/Resources/Prototypes/Entities/Structures/plastic_flaps.yml +++ b/Resources/Prototypes/Entities/Structures/plastic_flaps.yml @@ -83,7 +83,6 @@ - !type:DoActsBehavior acts: ["Destruction"] - type: Airtight - fixVacuum: true - type: entity id: PlasticFlapsAirtightOpaque @@ -101,4 +100,3 @@ - !type:DoActsBehavior acts: ["Destruction"] - type: Airtight - fixVacuum: true From 8594381ae76d9ffeb4859e3c355247ed18de65b3 Mon Sep 17 00:00:00 2001 From: SimpleStation14 <130339894+SimpleStation14@users.noreply.github.com> Date: Fri, 14 Jun 2024 06:36:39 -0700 Subject: [PATCH 064/155] Mirror 26447: Curtains fix (#450) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Mirror of PR #26447: [Curtains fix](https://github.com/space-wizards/space-station-14/pull/26447) from space-wizards [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `55b146a16c74d9b1ef4991f3ad3e22b15267f56f` PR opened by Futuristic-OK at 2024-03-26 13:45:20 UTC - merged at 2024-03-26 16:03:54 UTC --- PR changed 2 files with 13 additions and 31 deletions. The PR had the following labels: - No C# ---

Original Body

> > > > ## About the PR > > Now curtains can be built and opened inside walls and windows, etc. > (There is a mistake that if the curtain is opened outside the 180 degree range, the sound of the curtains opening will not be played by the player himself. All the surrounding players and ghosts will still hear the sound. > ## Why / Balance > > Why not? > ## Technical details > > A few lines of code > ## Media > > > - [X] I have added screenshots/videos to this PR showcasing its changes ingame, **or** this PR does not require an ingame showcase > > ## Breaking changes > > Erm... Nothing? > > **Changelog** > > - tweak: Сurtains can be built and opened inside full tiles > > >
Co-authored-by: SimpleStation14 --- .../Structures/Decoration/curtains.yml | 4 +- .../Recipes/Construction/furniture.yml | 40 +++++-------------- 2 files changed, 13 insertions(+), 31 deletions(-) diff --git a/Resources/Prototypes/Entities/Structures/Decoration/curtains.yml b/Resources/Prototypes/Entities/Structures/Decoration/curtains.yml index 85c9bdae3df..77b03d36f5d 100644 --- a/Resources/Prototypes/Entities/Structures/Decoration/curtains.yml +++ b/Resources/Prototypes/Entities/Structures/Decoration/curtains.yml @@ -50,6 +50,8 @@ MaterialCloth1: min: 1 max: 2 + - type: WallMount + arc: 360 - type: entity id: HospitalCurtains @@ -350,4 +352,4 @@ graph: Curtains node: CurtainsWhiteOpen - type: Physics - canCollide: false \ No newline at end of file + canCollide: false diff --git a/Resources/Prototypes/Recipes/Construction/furniture.yml b/Resources/Prototypes/Recipes/Construction/furniture.yml index 1a17b2f856d..25978771872 100644 --- a/Resources/Prototypes/Recipes/Construction/furniture.yml +++ b/Resources/Prototypes/Recipes/Construction/furniture.yml @@ -731,9 +731,7 @@ state: closed objectType: Structure placementMode: SnapgridCenter - canBuildInImpassable: false - conditions: - - !type:TileNotBlocked + canBuildInImpassable: true - type: construction id: CurtainsBlack @@ -748,9 +746,7 @@ state: closed objectType: Structure placementMode: SnapgridCenter - canBuildInImpassable: false - conditions: - - !type:TileNotBlocked + canBuildInImpassable: true - type: construction id: CurtainsBlue @@ -765,9 +761,7 @@ state: closed objectType: Structure placementMode: SnapgridCenter - canBuildInImpassable: false - conditions: - - !type:TileNotBlocked + canBuildInImpassable: true - type: construction id: CurtainsCyan @@ -782,9 +776,7 @@ state: closed objectType: Structure placementMode: SnapgridCenter - canBuildInImpassable: false - conditions: - - !type:TileNotBlocked + canBuildInImpassable: true - type: construction id: CurtainsGreen @@ -799,9 +791,7 @@ state: closed objectType: Structure placementMode: SnapgridCenter - canBuildInImpassable: false - conditions: - - !type:TileNotBlocked + canBuildInImpassable: true - type: construction id: CurtainsOrange @@ -816,9 +806,7 @@ state: closed objectType: Structure placementMode: SnapgridCenter - canBuildInImpassable: false - conditions: - - !type:TileNotBlocked + canBuildInImpassable: true - type: construction id: CurtainsPink @@ -833,9 +821,7 @@ state: closed objectType: Structure placementMode: SnapgridCenter - canBuildInImpassable: false - conditions: - - !type:TileNotBlocked + canBuildInImpassable: true - type: construction id: CurtainsPurple @@ -850,9 +836,7 @@ state: closed objectType: Structure placementMode: SnapgridCenter - canBuildInImpassable: false - conditions: - - !type:TileNotBlocked + canBuildInImpassable: true - type: construction id: CurtainsRed @@ -867,9 +851,7 @@ state: closed objectType: Structure placementMode: SnapgridCenter - canBuildInImpassable: false - conditions: - - !type:TileNotBlocked + canBuildInImpassable: true - type: construction id: CurtainsWhite @@ -884,9 +866,7 @@ state: closed objectType: Structure placementMode: SnapgridCenter - canBuildInImpassable: false - conditions: - - !type:TileNotBlocked + canBuildInImpassable: true - type: construction id: Bookshelf From 12ee94c4ef7eb2a5798978c233c54bdc5b998167 Mon Sep 17 00:00:00 2001 From: SimpleStation14 <130339894+SimpleStation14@users.noreply.github.com> Date: Fri, 14 Jun 2024 06:51:46 -0700 Subject: [PATCH 065/155] Mirror 26430: Reduces size of smaller cartons and fix size discrepancies with empty containers (#447) ## Mirror of PR #26430: [Reduces size of smaller cartons and fix size discrepancies with empty containers](https://github.com/space-wizards/space-station-14/pull/26430) from space-wizards [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `47fe7d3cc664d59bacc2036e5678adad47622e3d` PR opened by IamVelcroboy at 2024-03-25 16:06:33 UTC - merged at 2024-03-26 04:04:42 UTC --- PR changed 2 files with 49 additions and 33 deletions. The PR had the following labels: - No C# ---

Original Body

> ## About the PR > - Reduces the item size of drink cartons with `maxVol: 50` to `small` > - Fixes discrepancies between full alcohol bottles and empty > - Makes empty cartons consistent with full as well > > ## Why / Balance > Keeps it consistent with other drink containers. > > ## Technical details > n/a > > ## Media > Before: > ![image](https://github.com/space-wizards/space-station-14/assets/107660393/f232b56c-c4d1-480f-ae29-a11dc2f2c47c) > > - [X] I have added screenshots/videos to this PR showcasing its changes in-game, **or** this PR does not require an in-game showcase > > ## Breaking changes > n/a > > **Changelog** > n/a
Co-authored-by: SimpleStation14 --- .../Consumable/Drinks/drinks-cartons.yml | 23 +++++--- .../Consumable/Drinks/trash_drinks.yml | 59 +++++++++++-------- 2 files changed, 49 insertions(+), 33 deletions(-) diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks-cartons.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks-cartons.yml index f232bf1d34d..67d79540382 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks-cartons.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks-cartons.yml @@ -17,7 +17,7 @@ - type: Sprite state: icon - type: Item - size: Normal + size: Small - type: MeleeWeapon soundNoDamage: path: "/Audio/Effects/Fluids/splat.ogg" @@ -39,6 +39,18 @@ - type: TrashOnSolutionEmpty solution: drink +- type: entity + parent: DrinkCartonBaseFull + id: DrinkCartonBaseLargeFull + abstract: true + components: + - type: SolutionContainerManager + solutions: + drink: + maxVol: 100 + - type: Item + size: Normal + - type: entity id: DrinkCartonVisualsOpenable abstract: true @@ -116,7 +128,7 @@ sprite: Objects/Consumable/Drinks/cream.rsi - type: entity - parent: [DrinkCartonVisualsOpenable, DrinkCartonBaseFull] + parent: [DrinkCartonVisualsOpenable, DrinkCartonBaseLargeFull] id: DrinkMilkCarton name: milk description: An opaque white liquid produced by the mammary glands of mammals. @@ -124,7 +136,6 @@ - type: SolutionContainerManager solutions: drink: - maxVol: 100 reagents: - ReagentId: Milk Quantity: 100 @@ -132,7 +143,7 @@ sprite: Objects/Consumable/Drinks/milk.rsi - type: entity - parent: [DrinkCartonVisualsOpenable, DrinkCartonBaseFull] + parent: [DrinkCartonVisualsOpenable, DrinkCartonBaseLargeFull] id: DrinkSoyMilkCarton name: soy milk description: White and nutritious soy goodness! @@ -140,7 +151,6 @@ - type: SolutionContainerManager solutions: drink: - maxVol: 100 reagents: - ReagentId: MilkSoy Quantity: 100 @@ -148,7 +158,7 @@ sprite: Objects/Consumable/Drinks/soymilk.rsi - type: entity - parent: [DrinkCartonVisualsOpenable, DrinkCartonBaseFull] + parent: [DrinkCartonVisualsOpenable, DrinkCartonBaseLargeFull] id: DrinkOatMilkCarton name: oat milk description: It's oat milk. Tan and nutritious goodness! @@ -156,7 +166,6 @@ - type: SolutionContainerManager solutions: drink: - maxVol: 100 reagents: - ReagentId: MilkOat Quantity: 100 diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/trash_drinks.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/trash_drinks.yml index f6dd7222611..86bc34f3c8b 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/trash_drinks.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/trash_drinks.yml @@ -8,6 +8,8 @@ components: - type: Sprite state: icon + - type: Item + size: Normal - type: SolutionContainerManager solutions: drink: @@ -72,6 +74,19 @@ Glass: 100 - type: SpaceGarbage +- type: entity + name: base empty bottle + id: DrinkBottleBaseSmallEmpty + parent: DrinkBottleBaseEmpty + abstract: true + components: + - type: Item + size: Small + - type: SolutionContainerManager + solutions: + drink: + maxVol: 50 + - type: entity name: base empty carton id: DrinkCartonBaseEmpty @@ -122,6 +137,19 @@ Cardboard: 20 - type: SpaceGarbage +- type: entity + name: base empty bottle + id: DrinkCartonBaseLargeEmpty + parent: DrinkCartonBaseEmpty + abstract: true + components: + - type: Item + size: Normal + - type: SolutionContainerManager + solutions: + drink: + maxVol: 100 + # Containers - type: entity name: Jailbreaker Verte bottle @@ -143,28 +171,20 @@ - type: entity name: ale bottle - parent: DrinkBottleBaseEmpty + parent: DrinkBottleBaseSmallEmpty id: DrinkBottleAle components: - type: Sprite sprite: Objects/Consumable/TrashDrinks/alebottle_empty.rsi - - type: SolutionContainerManager - solutions: - drink: - maxVol: 50 - type: entity name: beer bottle - parent: DrinkBottleBaseEmpty + parent: DrinkBottleBaseSmallEmpty id: DrinkBottleBeer components: - type: Sprite sprite: Objects/Consumable/TrashDrinks/beer_empty.rsi - - type: SolutionContainerManager - solutions: - drink: - maxVol: 50 - type: entity @@ -322,37 +342,24 @@ - type: entity name: milk carton - parent: DrinkCartonBaseEmpty + parent: DrinkCartonBaseLargeEmpty id: DrinkCartonMilk components: - type: Sprite sprite: Objects/Consumable/Drinks/milk.rsi - - type: SolutionContainerManager - solutions: - drink: - maxVol: 100 - - type: entity name: soy milk carton - parent: DrinkCartonBaseEmpty + parent: DrinkCartonBaseLargeEmpty id: DrinkCartonSoyMilk components: - type: Sprite sprite: Objects/Consumable/Drinks/soymilk.rsi - - type: SolutionContainerManager - solutions: - drink: - maxVol: 100 - type: entity name: oat milk carton - parent: DrinkCartonBaseEmpty + parent: DrinkCartonBaseLargeEmpty id: DrinkCartonOatMilk components: - type: Sprite sprite: Objects/Consumable/Drinks/oatmilk.rsi - - type: SolutionContainerManager - solutions: - drink: - maxVol: 100 From 825ca8772ddac4c0e2852572913128221aee566b Mon Sep 17 00:00:00 2001 From: SimpleStation14 <130339894+SimpleStation14@users.noreply.github.com> Date: Sun, 16 Jun 2024 08:39:17 -0700 Subject: [PATCH 066/155] Mirror: Trading Outpost now has half buy-only and half sell-only pallets (#191) ## Mirror of PR #25955: [Trading Outpost now has half buy-only and half sell-only pallets](https://github.com/space-wizards/space-station-14/pull/25955) from space-wizards [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `c0bbbc33c19eafcc8defaa7f1ec2df42e485b435` PR opened by wafehling at 2024-03-10 02:47:02 UTC --- PR changed 8 files with 226 additions and 123 deletions. The PR had the following labels: - Changes: Sprites - Status: Needs Review ---

Original Body

> ## About the PR > I added two new entity types, a buy and sell only cargo pallet, and added them to the trading outpost in place of the old pallets. > > ## Why / Balance > Since the day this was added, every single shift, at some point I'll hear someone in cargo yelling about how **"You sold stuff I just bought!"** > > This seemed like the easiest way to fix the problem. > > ## Technical details > Added a variable to the cargo pallet component for labeling which type it is, added two new varieties of the cargo pallet to the yml, and adjusted all the calls for GetCargoPallets() to have boolean variables for buyOnly and sellOnly to tell the function what kind of call you're looking for. > > If you don't give it any specifics it'll still treat any pallet as a two-way one, but this function is only called 2 or 3 times and I've adjusted them all and commented the function itself for anyone looking to change/add it in the future. > > The old pallet is still in the game and is set to "both" by default, so it should work just fine for backwards compatibility. > > ## Media > ![image](https://github.com/space-wizards/space-station-14/assets/1471082/38cdf849-3e05-4f98-957f-65a719c2280d) > ![image](https://github.com/space-wizards/space-station-14/assets/1471082/56e471e9-b45e-4332-bd55-7220566542ab) > ![image](https://github.com/space-wizards/space-station-14/assets/1471082/a5e8e651-d301-420a-b2d7-cc4cf07a50af) > ![image](https://github.com/space-wizards/space-station-14/assets/1471082/fdf2cf4c-fba8-46c9-9a30-7313a2204b5e) > ![image](https://github.com/space-wizards/space-station-14/assets/1471082/3811edd0-bb32-44cf-b884-e0a9f4bf16fa) > > > - [X] I have added screenshots/videos to this PR showcasing its changes ingame, **or** this PR does not require an ingame showcase > > ## Breaking changes > > Shouldn't break anything, I've left the old pallets fully in, and updated them to work with the new GetCargoPallets() function just like they used to. Not sure if/where you'd still need them, but better safe than sorry. > > **Changelog** > :cl: > - tweak: The trading outpost now has dedicated buy-only and sell-only pallets. No more accidentally selling orders you just bought. Cargonians rejoice! >
Co-authored-by: SimpleStation14 --- .../Cargo/Components/CargoPalletComponent.cs | 21 +- .../Cargo/Systems/CargoSystem.Orders.cs | 2 +- .../Cargo/Systems/CargoSystem.Shuttle.cs | 15 +- Resources/Maps/Shuttles/trading_outpost.yml | 263 ++++++++++-------- .../Objects/Specific/Cargo/cargo_pallet.yml | 31 +++ .../cargo_pallets.rsi/cargo_pallet_buy.png | Bin 0 -> 551 bytes .../cargo_pallets.rsi/cargo_pallet_sell.png | Bin 0 -> 535 bytes .../Structures/cargo_pallets.rsi/meta.json | 17 ++ 8 files changed, 226 insertions(+), 123 deletions(-) create mode 100644 Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_buy.png create mode 100644 Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_sell.png create mode 100644 Resources/Textures/Structures/cargo_pallets.rsi/meta.json diff --git a/Content.Server/Cargo/Components/CargoPalletComponent.cs b/Content.Server/Cargo/Components/CargoPalletComponent.cs index ebf0be93e0c..cdfd0a3874f 100644 --- a/Content.Server/Cargo/Components/CargoPalletComponent.cs +++ b/Content.Server/Cargo/Components/CargoPalletComponent.cs @@ -1,7 +1,26 @@ namespace Content.Server.Cargo.Components; +using Content.Shared.Actions; +using Robust.Shared.Serialization.TypeSerializers.Implementations; /// /// Any entities intersecting when a shuttle is recalled will be sold. /// + +[Flags] +public enum BuySellType : byte +{ + Buy = 1 << 0, + Sell = 1 << 1, + All = Buy | Sell +} + + [RegisterComponent] -public sealed partial class CargoPalletComponent : Component {} +public sealed partial class CargoPalletComponent : Component +{ + /// + /// Whether the pad is a buy pad, a sell pad, or all. + /// + [DataField] + public BuySellType PalletType; +} diff --git a/Content.Server/Cargo/Systems/CargoSystem.Orders.cs b/Content.Server/Cargo/Systems/CargoSystem.Orders.cs index ebe66ff029e..d8b55a7237f 100644 --- a/Content.Server/Cargo/Systems/CargoSystem.Orders.cs +++ b/Content.Server/Cargo/Systems/CargoSystem.Orders.cs @@ -205,7 +205,7 @@ private void OnApproveOrderMessage(EntityUid uid, CargoOrderConsoleComponent com // Try to fulfill from any station where possible, if the pad is not occupied. foreach (var trade in _listEnts) { - var tradePads = GetCargoPallets(trade); + var tradePads = GetCargoPallets(trade, BuySellType.Buy); _random.Shuffle(tradePads); var freePads = GetFreeCargoPallets(trade, tradePads); diff --git a/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs b/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs index 3e39440da56..b8a491f4e89 100644 --- a/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs +++ b/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs @@ -198,13 +198,16 @@ private List GetProjectedOrders( ///
- [DataField] + [DataField, AutoNetworkedField] public bool IgnoreWeightless; + + /// + /// Does this have separate "StepOn" and "StepOff" triggers. + /// + [DataField, AutoNetworkedField] + public bool StepOn = false; } [RegisterComponent] diff --git a/Content.Shared/StepTrigger/Systems/StepTriggerSystem.cs b/Content.Shared/StepTrigger/Systems/StepTriggerSystem.cs index ede39b2aa97..b4ac2cde756 100644 --- a/Content.Shared/StepTrigger/Systems/StepTriggerSystem.cs +++ b/Content.Shared/StepTrigger/Systems/StepTriggerSystem.cs @@ -11,6 +11,7 @@ public sealed class StepTriggerSystem : EntitySystem { [Dependency] private readonly EntityLookupSystem _entityLookup = default!; [Dependency] private readonly SharedGravitySystem _gravity = default!; + [Dependency] private readonly SharedMapSystem _map = default!; public override void Initialize() { @@ -40,7 +41,9 @@ public override void Update(float frameTime) while (enumerator.MoveNext(out var uid, out var active, out var trigger, out var transform)) { if (!Update(uid, trigger, transform, query)) + { continue; + } RemCompDeferred(uid, active); } @@ -56,7 +59,8 @@ private bool Update(EntityUid uid, StepTriggerComponent component, TransformComp if (component.Blacklist != null && TryComp(transform.GridUid, out var grid)) { - var anch = grid.GetAnchoredEntitiesEnumerator(grid.LocalToTile(transform.Coordinates)); + var positon = _map.LocalToTile(uid, grid, transform.Coordinates); + var anch = _map.GetAnchoredEntitiesEnumerator(uid, grid, positon); while (anch.MoveNext(out var ent)) { @@ -109,8 +113,16 @@ private void UpdateColliding(EntityUid uid, StepTriggerComponent component, Tran return; } - var ev = new StepTriggeredEvent { Source = uid, Tripper = otherUid }; - RaiseLocalEvent(uid, ref ev, true); + if (component.StepOn) + { + var evStep = new StepTriggeredOnEvent(uid, otherUid); + RaiseLocalEvent(uid, ref evStep); + } + else + { + var evStep = new StepTriggeredOffEvent(uid, otherUid); + RaiseLocalEvent(uid, ref evStep); + } component.CurrentlySteppedOn.Add(otherUid); Dirty(uid, component); @@ -130,7 +142,7 @@ private bool CanTrigger(EntityUid uid, EntityUid otherUid, StepTriggerComponent var msg = new StepTriggerAttemptEvent { Source = uid, Tripper = otherUid }; - RaiseLocalEvent(uid, ref msg, true); + RaiseLocalEvent(uid, ref msg); return msg.Continue && !msg.Cancelled; } @@ -163,6 +175,12 @@ private void OnEndCollide(EntityUid uid, StepTriggerComponent component, ref End component.CurrentlySteppedOn.Remove(otherUid); Dirty(uid, component); + if (component.StepOn) + { + var evStepOff = new StepTriggeredOffEvent(uid, otherUid); + RaiseLocalEvent(uid, ref evStepOff); + } + if (component.Colliding.Count == 0) { RemCompDeferred(uid); @@ -230,9 +248,14 @@ public struct StepTriggerAttemptEvent public bool Cancelled; } +/// +/// Raised when an entity stands on a steptrigger initially (assuming it has both on and off states). +/// [ByRefEvent] -public struct StepTriggeredEvent -{ - public EntityUid Source; - public EntityUid Tripper; -} +public readonly record struct StepTriggeredOnEvent(EntityUid Source, EntityUid Tripper); + +/// +/// Raised when an entity leaves a steptrigger if it has on and off states OR when an entity intersects a steptrigger. +/// +[ByRefEvent] +public readonly record struct StepTriggeredOffEvent(EntityUid Source, EntityUid Tripper); diff --git a/Resources/Audio/Effects/attributions.yml b/Resources/Audio/Effects/attributions.yml index 90445a31d1c..6f18510d17b 100644 --- a/Resources/Audio/Effects/attributions.yml +++ b/Resources/Audio/Effects/attributions.yml @@ -226,3 +226,8 @@ copyright: TGStation at 3df5d3b42bfb6b3b5adba1067ab41f83816255bb license: CC-BY-SA-3.0 source: https://github.com/tgstation/tgstation/blob/3df5d3b42bfb6b3b5adba1067ab41f83816255bb/sound/misc/server-ready.ogg + +- files: [beep_landmine.ogg] + copyright: '"beep_landmine.ogg" by kaktuscsc of Discord for SS14' + license: "CC-BY-SA-3.0" + source: https://github.com/YuriyKiss/space-station-14/commit/971a135a9c83aed46e967aac9302ab5b35562b5f diff --git a/Resources/Audio/Effects/beep_landmine.ogg b/Resources/Audio/Effects/beep_landmine.ogg new file mode 100644 index 0000000000000000000000000000000000000000..48bc5e21d962084a1db41c473f30892d914894ae GIT binary patch literal 6034 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 Bu4e!M literal 0 HcmV?d00001 diff --git a/Resources/Prototypes/Entities/Objects/Misc/land_mine.yml b/Resources/Prototypes/Entities/Objects/Misc/land_mine.yml index 9088edc8159..a3e3485bc65 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/land_mine.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/land_mine.yml @@ -35,9 +35,13 @@ - !type:DoActsBehavior acts: [ "Destruction" ] - type: LandMine - - type: TriggerOnStepTrigger + sound: + path: /Audio/Effects/beep_landmine.ogg + params: + maxDistance: 10 - type: StepTrigger requiredTriggeredSpeed: 0 + stepOn: true - type: entity name: kick mine @@ -57,7 +61,6 @@ - type: Construction graph: ModularMineGraph node: emptyCase - - type: LandMine - type: entity name: explosive mine @@ -71,4 +74,3 @@ intensitySlope: 3 totalIntensity: 120 # about a ~4 tile radius canCreateVacuum: false - - type: DeleteOnTrigger diff --git a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml index 8d3c83e3e1e..2ddb21b9e6c 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml @@ -230,6 +230,7 @@ - type: StepTrigger intersectRatio: 0.2 requiredTriggeredSpeed: 0 + stepOn: true - type: CollisionWake enabled: false - type: Physics @@ -251,6 +252,10 @@ mask: - ItemMask - type: LandMine + sound: + path: /Audio/Effects/beep_landmine.ogg + params: + maxDistance: 10 - type: ExplodeOnTrigger - type: Explosive explosionType: HardBomb # normally Default and max 5 total 60 From 5a379f2d0d4f6d5f7301ff3957d2b80d0b10ec17 Mon Sep 17 00:00:00 2001 From: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com> Date: Mon, 17 Jun 2024 06:25:29 -0700 Subject: [PATCH 076/155] Workflow to Automatically Title Case PRs (#468) # Description Hooray, more JavaScript! I tested this on a personal repo with a new PAT, but it *should* work here first try. --------- Signed-off-by: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com> --- .github/workflows/prtitlecase.yml | 34 +++++++++++++++++++++++++++++++ Tools/changelogs/package.json | 2 ++ Tools/prtitlecase/index.js | 19 +++++++++++++++++ Tools/prtitlecase/package.json | 12 +++++++++++ 4 files changed, 67 insertions(+) create mode 100644 .github/workflows/prtitlecase.yml create mode 100644 Tools/prtitlecase/index.js create mode 100644 Tools/prtitlecase/package.json diff --git a/.github/workflows/prtitlecase.yml b/.github/workflows/prtitlecase.yml new file mode 100644 index 00000000000..0c5a38a4e8a --- /dev/null +++ b/.github/workflows/prtitlecase.yml @@ -0,0 +1,34 @@ +name: PR Title Case +on: + pull_request_target: + types: [opened, edited, synchronize] + +env: + GITHUB_TOKEN: ${{ secrets.BOT_TOKEN }} + PR_NUMBER: ${{ github.event.pull_request.number }} + +jobs: + prtitlecase: + runs-on: ubuntu-latest + steps: + - name: Checkout Master + uses: actions/checkout@v3 + with: + token: ${{ secrets.BOT_TOKEN }} + + - name: Setup Node + uses: actions/setup-node@v3 + with: + node-version: 18.x + + - name: Install Dependencies + run: | + cd "Tools/prtitlecase" + npm install + shell: bash + + - name: Change Title + run: | + cd "Tools/prtitlecase" + node src/index.js + shell: bash diff --git a/Tools/changelogs/package.json b/Tools/changelogs/package.json index 512a3624c87..1f0899df96c 100644 --- a/Tools/changelogs/package.json +++ b/Tools/changelogs/package.json @@ -1,5 +1,7 @@ { "name": "changelogs", + "author": "DEATHB4DEFEAT", + "license": "MIT", "dependencies": { "axios": "^1.3.4", "js-yaml": "^4.1.0" diff --git a/Tools/prtitlecase/index.js b/Tools/prtitlecase/index.js new file mode 100644 index 00000000000..0d72b711312 --- /dev/null +++ b/Tools/prtitlecase/index.js @@ -0,0 +1,19 @@ +import axios from 'axios'; +import { titleCase } from 'title-case'; + +if (process.env.GITHUB_TOKEN) axios.defaults.headers.common['Authorization'] = `token ${process.env.GITHUB_TOKEN}`; +else throw new Error('BOT_TOKEN was not provided in repository secrets or GITHUB_TOKEN was not set correctly.'); + + +// Get PR title +let prTitle = await axios.get(`https://api.github.com/repos/${process.env.GITHUB_REPOSITORY}/pulls/${process.env.PR_NUMBER}`) + .then(res => res.data.title); + +// Title case PR title +console.log(`Old PR title: ${prTitle}`); +prTitle = titleCase(prTitle); +console.log(`New PR title: ${prTitle}`); + +// Update PR title +await axios.patch(`https://api.github.com/repos/${process.env.GITHUB_REPOSITORY}/pulls/${process.env.PR_NUMBER}`, + { title: prTitle }); diff --git a/Tools/prtitlecase/package.json b/Tools/prtitlecase/package.json new file mode 100644 index 00000000000..ecba01099fe --- /dev/null +++ b/Tools/prtitlecase/package.json @@ -0,0 +1,12 @@ +{ + "name": "prtitlecase", + "description": "Converts PR titles to Title Case using title-case package", + "type": "module", + "exports": "./index.js", + "author": "DEATHB4DEFEAT", + "license": "MIT", + "dependencies": { + "axios": "^1.7.2", + "title-case": "^4.3.1" + } +} From caf3bdddd735b8947c0e2f8831b239daa2fd5616 Mon Sep 17 00:00:00 2001 From: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com> Date: Mon, 17 Jun 2024 14:36:15 -0700 Subject: [PATCH 077/155] Fix PRTitleCase Workflow (#472) Signed-off-by: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com> --- .github/workflows/prtitlecase.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/prtitlecase.yml b/.github/workflows/prtitlecase.yml index 0c5a38a4e8a..b3150dcc7e9 100644 --- a/.github/workflows/prtitlecase.yml +++ b/.github/workflows/prtitlecase.yml @@ -30,5 +30,5 @@ jobs: - name: Change Title run: | cd "Tools/prtitlecase" - node src/index.js + node index.js shell: bash From a9335dbbc9a43706e579c8ebc97bf02ae9bfc1e4 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Mon, 17 Jun 2024 17:42:12 -0400 Subject: [PATCH 078/155] Port Station Goals (#465) # Description https://github.com/Simple-Station/Parkstation-Friendly-Chainsaw/pull/10 This adds a feature whereby a random goal for the shift is faxed to the station's Captain at the start of every shift. It is up to the Captain to decide if and how this goal is to be completed. Goals are randomly generated every shift, and are meant to help encourage station activity and RP. Admins are also able to send station goals via `sendstationgoal`. ---

Media

![stationgoals](https://github.com/Simple-Station/Einstein-Engines/assets/16548818/4a2b5533-dfee-4388-bfbc-043ee71b2647) ---

# Changelog :cl: VMSolidus - add: Added station goals that get sent to the Command fax machine at the start of every shift --------- Signed-off-by: VMSolidus Co-authored-by: Danger Revolution! <142105406+DangerRevolution@users.noreply.github.com> Co-authored-by: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com> --- Content.Client/Entry/EntryPoint.cs | 1 + Content.Server/Fax/FaxMachineComponent.cs | 6 + .../GameTicking/Events/RoundEndedEvent.cs | 13 + .../GameTicking/Events/RoundStartedEvent.cs | 11 + .../GameTicking/GameTicker.RoundFlow.cs | 2 + .../StationGoal/StationGoalCommand.cs | 55 +++++ .../StationGoal/StationGoalPaperComponent.cs | 9 + .../StationGoal/StationGoalPaperSystem.cs | 118 +++++++++ .../StationGoal/StationGoalPrototype.cs | 12 + Content.Shared/CCVar/CCVars.cs | 12 + .../station-goal/station-goal-command.ftl | 6 + .../en-US/station-goal/station-goals.ftl | 224 ++++++++++++++++++ .../Mobs/Customization/Markings/harpy.yml | 2 +- .../Entities/Objects/Misc/paper.yml | 13 + .../Structures/Machines/fax_machine.yml | 2 + Resources/Prototypes/Objectives/goals.yml | 87 +++++++ 16 files changed, 572 insertions(+), 1 deletion(-) create mode 100644 Content.Server/GameTicking/Events/RoundEndedEvent.cs create mode 100644 Content.Server/GameTicking/Events/RoundStartedEvent.cs create mode 100644 Content.Server/StationGoal/StationGoalCommand.cs create mode 100644 Content.Server/StationGoal/StationGoalPaperComponent.cs create mode 100644 Content.Server/StationGoal/StationGoalPaperSystem.cs create mode 100644 Content.Server/StationGoal/StationGoalPrototype.cs create mode 100644 Resources/Locale/en-US/station-goal/station-goal-command.ftl create mode 100644 Resources/Locale/en-US/station-goal/station-goals.ftl create mode 100644 Resources/Prototypes/Objectives/goals.yml diff --git a/Content.Client/Entry/EntryPoint.cs b/Content.Client/Entry/EntryPoint.cs index 53a8051eecf..a1fc68bbd2f 100644 --- a/Content.Client/Entry/EntryPoint.cs +++ b/Content.Client/Entry/EntryPoint.cs @@ -124,6 +124,7 @@ public override void Init() _prototypeManager.RegisterIgnore("wireLayout"); _prototypeManager.RegisterIgnore("alertLevels"); _prototypeManager.RegisterIgnore("nukeopsRole"); + _prototypeManager.RegisterIgnore("stationGoal"); _componentFactory.GenerateNetIds(); _adminManager.Initialize(); diff --git a/Content.Server/Fax/FaxMachineComponent.cs b/Content.Server/Fax/FaxMachineComponent.cs index d1f269dd370..a189bdc05ac 100644 --- a/Content.Server/Fax/FaxMachineComponent.cs +++ b/Content.Server/Fax/FaxMachineComponent.cs @@ -51,6 +51,12 @@ public sealed partial class FaxMachineComponent : Component [DataField("receiveNukeCodes")] public bool ReceiveNukeCodes { get; set; } = false; + /// + /// Should this fax receive station goals + /// + [DataField] + public bool ReceiveStationGoal { get; set; } = false; + /// /// Sound to play when fax has been emagged /// diff --git a/Content.Server/GameTicking/Events/RoundEndedEvent.cs b/Content.Server/GameTicking/Events/RoundEndedEvent.cs new file mode 100644 index 00000000000..36bd1f47a1b --- /dev/null +++ b/Content.Server/GameTicking/Events/RoundEndedEvent.cs @@ -0,0 +1,13 @@ +namespace Content.Server.GameTicking; + +public sealed class RoundEndedEvent : EntityEventArgs +{ + public int RoundId { get; } + public TimeSpan RoundDuration { get; } + + public RoundEndedEvent(int roundId, TimeSpan roundDuration) + { + RoundId = roundId; + RoundDuration = roundDuration; + } +} diff --git a/Content.Server/GameTicking/Events/RoundStartedEvent.cs b/Content.Server/GameTicking/Events/RoundStartedEvent.cs new file mode 100644 index 00000000000..1e285a67496 --- /dev/null +++ b/Content.Server/GameTicking/Events/RoundStartedEvent.cs @@ -0,0 +1,11 @@ +namespace Content.Server.GameTicking; + +public sealed class RoundStartedEvent : EntityEventArgs +{ + public int RoundId { get; } + + public RoundStartedEvent(int roundId) + { + RoundId = roundId; + } +} diff --git a/Content.Server/GameTicking/GameTicker.RoundFlow.cs b/Content.Server/GameTicking/GameTicker.RoundFlow.cs index 004508ab916..6e02c4ac404 100644 --- a/Content.Server/GameTicking/GameTicker.RoundFlow.cs +++ b/Content.Server/GameTicking/GameTicker.RoundFlow.cs @@ -255,6 +255,7 @@ public void StartRound(bool force = false) AnnounceRound(); UpdateInfoText(); SendRoundStartedDiscordMessage(); + RaiseLocalEvent(new RoundStartedEvent(RoundId)); #if EXCEPTION_TOLERANCE } @@ -402,6 +403,7 @@ public void ShowRoundEndScoreboard(string text = "") _replayRoundPlayerInfo = listOfPlayerInfoFinal; _replayRoundText = roundEndText; + RaiseLocalEvent(new RoundEndedEvent(RoundId, roundDuration)); } private async void SendRoundEndDiscordMessage() diff --git a/Content.Server/StationGoal/StationGoalCommand.cs b/Content.Server/StationGoal/StationGoalCommand.cs new file mode 100644 index 00000000000..1c82509d691 --- /dev/null +++ b/Content.Server/StationGoal/StationGoalCommand.cs @@ -0,0 +1,55 @@ +using System.Linq; +using Content.Server.Administration; +using Content.Shared.Administration; +using Robust.Shared.Console; +using Robust.Shared.Prototypes; + +namespace Content.Server.StationGoal +{ + [AdminCommand(AdminFlags.Fun)] + public sealed class StationGoalCommand : IConsoleCommand + { + public string Command => "sendstationgoal"; + public string Description => Loc.GetString("send-station-goal-command-description"); + public string Help => Loc.GetString("send-station-goal-command-help-text", ("command", Command)); + + public void Execute(IConsoleShell shell, string argStr, string[] args) + { + if (args.Length != 1) + { + shell.WriteError(Loc.GetString("shell-need-exactly-one-argument")); + return; + } + + var protoId = args[0]; + var prototypeManager = IoCManager.Resolve(); + if (!prototypeManager.TryIndex(protoId, out var proto)) + { + shell.WriteError(Loc.GetString("send-station-goal-command-error-no-goal-proto", ("id", protoId))); + return; + } + + var stationGoalPaper = IoCManager.Resolve().System(); + if (!stationGoalPaper.SendStationGoal(proto)) + { + shell.WriteError(Loc.GetString("send-station-goal-command-error-couldnt-fax")); + return; + } + } + + public CompletionResult GetCompletion(IConsoleShell shell, string[] args) + { + if (args.Length == 1) + { + var options = IoCManager.Resolve() + .EnumeratePrototypes() + .OrderBy(p => p.ID) + .Select(p => new CompletionOption(p.ID)); + + return CompletionResult.FromHintOptions(options, Loc.GetString("send-station-goal-command-arg-id")); + } + + return CompletionResult.Empty; + } + } +} diff --git a/Content.Server/StationGoal/StationGoalPaperComponent.cs b/Content.Server/StationGoal/StationGoalPaperComponent.cs new file mode 100644 index 00000000000..445b4746818 --- /dev/null +++ b/Content.Server/StationGoal/StationGoalPaperComponent.cs @@ -0,0 +1,9 @@ +namespace Content.Server.StationGoal +{ + /// + /// Paper with a written station goal in it. + /// + [RegisterComponent] + public sealed partial class StationGoalPaperComponent : Component { } +} + diff --git a/Content.Server/StationGoal/StationGoalPaperSystem.cs b/Content.Server/StationGoal/StationGoalPaperSystem.cs new file mode 100644 index 00000000000..6a059c37a3d --- /dev/null +++ b/Content.Server/StationGoal/StationGoalPaperSystem.cs @@ -0,0 +1,118 @@ +using System.Text.RegularExpressions; +using Content.Server.GameTicking; +using Content.Server.Fax; +using Content.Server.Station.Systems; +using Content.Shared.CCVar; +using Content.Shared.Random; +using Content.Shared.Random.Helpers; +using Robust.Shared.Configuration; +using Robust.Shared.Prototypes; +using Robust.Shared.Random; +using Content.Shared.Dataset; + +namespace Content.Server.StationGoal; + +/// +/// System for station goals +/// +public sealed class StationGoalPaperSystem : EntitySystem +{ + [Dependency] private readonly IPrototypeManager _prototype = default!; + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly FaxSystem _fax = default!; + [Dependency] private readonly IConfigurationManager _config = default!; + [Dependency] private readonly StationSystem _station = default!; + + private static readonly Regex StationIdRegex = new(@".*-(\d+)$"); + + [ValidatePrototypeId] + private const string RandomPrototype = "StationGoals"; + [ValidatePrototypeId] + private const string RandomSignature = "names_last"; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnRoundStarted); + } + + + private void OnRoundStarted(RoundStartedEvent ev) + { + if (_config.GetCVar(CCVars.StationGoalsEnabled) + && _random.Prob(_config.GetCVar(CCVars.StationGoalsChance))) + SendRandomGoal(); + } + + /// + /// Send a random station goal to all faxes which are authorized to receive it + /// + /// If the fax was successful + /// Raised when station goal types in the prototype is invalid + public bool SendRandomGoal() + { + // Get the random station goal list + if (!_prototype.TryIndex(RandomPrototype, out var goals)) + { + Log.Error($"StationGoalPaperSystem: Random station goal prototype '{RandomPrototype}' not found"); + return false; + } + + // Get a random goal + var goal = RecursiveRandom(goals); + + // Send the goal + return SendStationGoal(goal); + } + + private StationGoalPrototype RecursiveRandom(WeightedRandomPrototype random) + { + var goal = random.Pick(_random); + + if (_prototype.TryIndex(goal, out var goalPrototype)) + return goalPrototype; + + if (_prototype.TryIndex(goal, out var goalRandom)) + return RecursiveRandom(goalRandom); + + throw new Exception($"StationGoalPaperSystem: Random station goal could not be found from prototypes {RandomPrototype} and {random.ID}"); + } + + /// + /// Send a station goal to all faxes which are authorized to receive it + /// + /// True if at least one fax received paper + public bool SendStationGoal(StationGoalPrototype goal) + { + var enumerator = EntityManager.EntityQueryEnumerator(); + var wasSent = false; + var signerName = _prototype.Index(RandomSignature); + + while (enumerator.MoveNext(out var uid, out var fax)) + { + if (!fax.ReceiveStationGoal + || !TryComp(_station.GetOwningStation(uid), out var meta)) + continue; + + var stationId = StationIdRegex.Match(meta.EntityName).Groups[1].Value; + + var printout = new FaxPrintout( + Loc.GetString("station-goal-fax-paper-header", + ("date", DateTime.Now.AddYears(1000).ToString("yyyy MMMM dd")), + ("station", string.IsNullOrEmpty(stationId) ? "???" : stationId), + ("content", goal.Text), + ("name", _random.Pick(signerName.Values)) + ), + Loc.GetString("station-goal-fax-paper-name"), + "StationGoalPaper" + ); + + _fax.Receive(uid, printout, null, fax); + + wasSent = true; + } + + return wasSent; + } +} diff --git a/Content.Server/StationGoal/StationGoalPrototype.cs b/Content.Server/StationGoal/StationGoalPrototype.cs new file mode 100644 index 00000000000..733759a37df --- /dev/null +++ b/Content.Server/StationGoal/StationGoalPrototype.cs @@ -0,0 +1,12 @@ +using Robust.Shared.Prototypes; + +namespace Content.Server.StationGoal +{ + [Serializable, Prototype("stationGoal")] + public sealed class StationGoalPrototype : IPrototype + { + [IdDataFieldAttribute] public string ID { get; } = default!; + + public string Text => Loc.GetString($"station-goal-{ID.ToLower()}"); + } +} diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index 891c790d52c..5aaf967dd1a 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -2106,5 +2106,17 @@ public static readonly CVarDef ///
public static readonly CVarDef PsionicRollsEnabled = CVarDef.Create("psionics.rolls_enabled", true, CVar.SERVERONLY); + + /// + /// Enables station goals + /// + public static readonly CVarDef StationGoalsEnabled = + CVarDef.Create("game.station_goals", true, CVar.SERVERONLY); + + /// + /// Chance for a station goal to be sent + /// + public static readonly CVarDef StationGoalsChance = + CVarDef.Create("game.station_goals_chance", 0.1f, CVar.SERVERONLY); } } diff --git a/Resources/Locale/en-US/station-goal/station-goal-command.ftl b/Resources/Locale/en-US/station-goal/station-goal-command.ftl new file mode 100644 index 00000000000..82ed4d5c8a7 --- /dev/null +++ b/Resources/Locale/en-US/station-goal/station-goal-command.ftl @@ -0,0 +1,6 @@ +send-station-goal-command-description = Sends the selected station target to all faxes that can receive it +send-station-goal-command-help-text = Usage: { $command } +send-station-goal-command-arg-id = Goal Prototype ID + +send-station-goal-command-error-no-goal-proto = No station goal found with ID {$id} +send-station-goal-command-error-couldnt-fax = Couldn't send station goal, probably due to a lack of fax machines that are able to recieve it diff --git a/Resources/Locale/en-US/station-goal/station-goals.ftl b/Resources/Locale/en-US/station-goal/station-goals.ftl new file mode 100644 index 00000000000..f98190fa3c4 --- /dev/null +++ b/Resources/Locale/en-US/station-goal/station-goals.ftl @@ -0,0 +1,224 @@ +station-goal-fax-paper-name = Station Goal + +station-goal-fax-paper-header = + ███╗░░██╗████████╗ + ████╗░██║╚══██╔══╝ Form NT-No.{$station}-CC + ██╔██╗██║░░░██║░░░ Target Order + ██║╚████║░░░██║░░░ Date: {$date} + ██║░╚███║░░░██║░░░ Signed: CCO-{$name} + ╚═╝░░╚══╝░░░╚═╝░░░ + ════════════════════════════════════════ + {$content} + ════════════════════════════════════════ + + +station-goal-xeno= + Dear Station Command, the purpose of your shift is to build a Xenobiology Lab and then study exotic life forms. + Two containment chambers must be constructed according to the following requirements: + 1. Must be well reinforced; + 2. At least one of the chambers must be equipped with a gas supply system; + 3. The entrance should be a cycling airlock system to prevent contamination. + + Get the Salvage Team to capture at least 2 representatives of life forms (e.g. space carp) and transport them to the above-described chambers. + + Capture requirements: + 1. Exotic fauna should not have critical injuries at the time of placement in the research department; + 2. When captured fauna dies, you are required to catch another, cloning is strictly prohibited. + + Once you collect the required fauna, you must study them and write a report on their properties. + The report must be stamped by the head of the department and faxed to Central Command. + + Experience Requirements: + 1. Experience should be documented in detail; + 2. Test activities may include: working with gases, smoke, foam, or injecting experimental reagents (e.g. Cognizine) into captured fauna. + +station-goal-museum= + Dear Command of the station, the purpose of your shift is to build a museum, the exhibits for which will be unique objects collected from the station. + + Below are the requirements for the design of the museum: + 1. The museum must be structurally connected to the station by a space-protected corridor, or be located within it; + 2. The premises must be of a size that allows them to easily receive a large number of visitors; + 3. The premises must be provided with a standard atmosphere, ventilation and stable power supply; + 4. Room decoration should be visually pleasing; + 5. Exhibits must be reinforced accordingly to what is contained in them. + + Exhibit requirements: + 1. Exhibits must be unique in their kind; + 2. Each department must provide at least 2 exhibits for the museum fund; + 3. The total number of exhibits must be at least 20. + + Exhibits may include: + 1. Exotic drinks and dishes that require an extraordinary method of production and/or non-standard ingredients; + 2. Exotic matter/substance; + 3. Works of art (e.g. statues, paintings); + 4. Fully studied and documented artifacts (optionally provide a copy of the document); + 5. High-tech devices or tools; + 6. High-tech or high-power weapons; + 7. Robotic entities (e.g. Mechs, Cyborgs, Drones); + 8. Mutated biological organisms; + 9. Domesticated wild animals or intelligent non-humanoid life forms; + 10. Found treasures or items not available on the market. + + Upon completion of the museum, it is required to provide the crew with at least 20 minutes of free time from work so that they can visit the museum. + +station-goal-area= + Dear Station Command, the goal of your shift is to increase the effective use of space at the station. + + It is required to bring the abandoned premises into proper form and find a use for them. + Each department must equip and effectively use the area of adjacent maintenance tunnels. + Sufficiently spacious maintenance tunnels need to be converted into residential areas. + The remaining tunnels should be provided with floor coverings and adequate lighting. + In addition, it is necessary to provide a public, well-lit corridor connecting all the restored compartments and new bedrooms. + +station-goal-bureaucraticerror = + ACCESS TO THIS DOCUMENT IS PROHIBITED FOR PERSONS WHO DO NOT HAVE LEGAL IMMUNITY + + Dear Station Command, we inform you that the purpose of your shift was lost as a result of a bureaucratic error. + With this news, Central Command gives you the opportunity to independently assign a new goal for the station. + + New goal requirements: + 1. Relevance: The goal must be relevant and relevant to the current situation; + 2. Engagement: The goal should require the cooperation of as many departments as possible in the plans; + 3. Scope: The goal should involve sufficient, but not excessive, amounts of work to ensure the effective completion of the task. + + Please note that distribution of the contents of this document to persons who do not have legal immunity is strictly prohibited due to the possibility of discrediting the management of the Corporation. + Therefore, in order to present a new goal to the crew, the command staff must contact Central Command for approval of your ideas. + +station-goal-anomalies= + Dear Station Command, the purpose of your shift is to provide new information about anomalies to NanoTrasen. + + It is necessary to conduct experimental studies aimed at testing the consequences of the collapse of at least 4 unique anomalies. + During or after the experiments, it is necessary to isolate and document the aforementioned anomalies. + + Document requirements: + 1. The official name of the anomaly; + 2. Physical description; + 3. Passive properties; + 4. Reaction of the anomaly to different particles; + 5. Consequences of the collapse; + 6. Location of the anomaly. + + The document must be certified by the stamp of the supervisor and faxed to Central Command. + +station-goal-combat= + Dear station Command, due to the increase in attacks of pirate ships in this sector, the purpose of your shift is to raise the overall combat readiness of the station. + + Required: + 1. Organize an inspection of every sentient being and cargo arriving at or leaving the station. + 2. Build or modify an existing security checkpoint at arrivals and departures. The checkpoint must be able to completely block the ports from the main part of the station. + Each of the above checkpoints must have at least one cell for the temporary detention of detainees. + 3. Organize a spare weapons storage in the opposite part of the station from the brig. + The vault arsenal should have enough weapons and equipment to fully equip all security personnel. + 4. Organize the recruitment of a new combat subdepartment of security. + Squad members must be recruited from the station's crew. + Recruitment should be carried out on a voluntary-compulsory basis. + Composition of the squad: + 1 Field Medic; + 1 Field Engineer; + 3 Combat Operatives. + All members of the squad must be trained in all the necessary skills to conduct combat and fulfill their role. + 5. Open a public shooting range. + The shooting range should present all available types of weapons or their training counterparts. + Avoid providing lethal weaponry to unauthorized personnel. + 6. Encourage the use of the station boxing ring. + If there is no boxing ring, you must create one. + +station-goal-shuttle= + Dear Station Command, the purpose of your shift is to build a space shuttle capable of being piloted. + + Shuttle requirements: + 1. The shuttle must have a locked bridge; + a medical room with the necessary medical supplies and chemical equipment; + a supply store surrounded by reinforced material; + a crew room with at least 12 seats. + 2. There must be an intermediate room between the docking airlock and the main rooms to prevent possible depressurization. + 3. The shuttle must have a standard atmosphere, and also have several air gas containers to maintain it. + 4. The shuttle must be able to move in all directions (forward, backward, sideways) and turn reasonably well. + + Upon completion, the shuttle crew must be recruited from the station personnel. + The shuttle crew must include: + 1 pilot; + 2 engineers; + 1 medic/chemist; + 1 security officer. + + The shuttle should take on board all the station Command representatives as passengers and, in parallel with the evacuation shuttle, go to the Central Command station. + +station-goal-singularity= + Dear station Command, the goal of your shift is to build a generator based on the gravitational singularity. + + The design requirements are: + 1. The structure must be located at a significant distance from the station. + 2. The structure must be protected from meteorites and space debris. + 3. The containment field must be able to prevent the loss of a class 3 singularity. + +station-goal-solarpanels= + Dear station Command, the purpose of your shift is to organize a backup power system. + + The following work is required: + 1. Build two new branches of solar panels. + 2. Allocate an area for a compartment with spare batteries. + This compartment should accommodate at least 3 fully charged SMES', which should not be connected to the main power system of the station unless needed. + +station-goal-artifacts= + Dear station Command, the purpose of your shift is to provide new information about alien artifacts to NanoTrasen. + + It is required to organize the work of salvagers to search for and deliver artifacts from the wreckage around the station or expeditions. + After the delivery of the artifacts, they must be transferred to a special container to the research department. + It is necessary to deliver at least 2 fully studied and documented artifacts on the evacuation shuttle in special containment units. + + Recommended information for the document: + 1. Name of the artifact. + 2. Physical description. + 3. Properties of the object. + 4. Location of where the artifact was found. + 5. Additional notes. + + The document must be certified by the stamp of the supervisor. + +station-goal-storage= + Dear station Command, the purpose of your shift is to build an orbital storage facility with supplies and technology. + + The storage should be placed in space separately from the main station, make sure its design is strong, a random meteorite should not damage it. + + 4 boxes must be placed in the storage containing the following respectively: + - Advanced medicines; + - Stocks of the best seeds; + - Refrigerator box of food with a high nutritional value; + - Valuable, but not unique boards. + + Monitor the safety of the contents in the storage until the end of the shift, a cleanup crew will come retrieve the contents as they prepare the station. + +station-goal-zoo= + Dear station Command, the purpose of your shift is to improve the recreational value of the personnel at the station. + + It is necessary to build a zoo with at least 5 enclosures containing different types of animals ordered from the supply department. + Provide animals with food, at least one cleaning robot in each enclosure, and everything necessary for life, depending on the type of animal. + It is also necessary to build a bathhouse for the animals, water vapor must be supplied by Atmospheric Technicians. + + Upon completion of the zoo, it is required to provide the crew with at least 20 minutes of free time from work so that they can visit the new zoo. + +station-goal-labor= + Dear station Command, the purpose of your shift is to increase the motivation of the personnel for the growth of labor productivity. + + This requires that each of the heads during the shift closely monitors the performance of the duties of their employees and evaluates them. + After the time set by Command for evaluation, in each of the departments, the best, in the opinion of the head, employee should be selected, who will be invited to a dinner, where the Command staff will be obliged to award them a medal and a prize. + The heads must provide a report indicating the employee's position and merits for the shift. + Drinks and meals should be prepared for the dinner, as well as, if possible, several entertainment events that allow the presence of actors and musicians. + For the duration of the celebration, the dining room or other place chosen for the event must be inaccessible to the rest of the crew. + + The duration of the shift for a more accurate assessment of the work of the personnel should be set by the Command staff. + After the dinner someone must announce the end of the shift and call the evacuation shuttle. + +station-goal-lectures= + Dear station Command, the purpose of your shift is to carry out a number of events within the framework of the Corporation's plan to increase the knowledge of its employees. + + The Command staff are instructed to organize a platform for public lectures, if none exists, create one nearby the bridge entry. + The venue should be equipped with a large enough stage for speakers in the middle, a podium for the presenter to one side of it, plenty of seating for guests, and a special counter/table for brochures at the entrance. + A host/organizer of the event must also be selected. + Each department is required to present a group of employees consisting of at least 2 people. + Selected employees, under the supervision of the head of the department, should prepare a short lecture/presentation on a specific topic within their specialization (e.g. the harm of drugs and their reason for their criminalization, the effect of smoking on the body, acting, product pricing, cooking etc.), preferably with demonstration materials, and at least 10 brochures, on which the abstracts of the lecture should be indicated. + At the time indicated by the Command staff, the crew must be assembled on the site for the event, where lectures will be read. + There may be breaks between lectures to allow guests to read brochures and catch their breath. + + After the end of the event someone must announce the end of the shift and call the evacuation shuttle. diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/harpy.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/harpy.yml index 9118692a082..4f65046ce9c 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/harpy.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/harpy.yml @@ -117,7 +117,7 @@ - !type:SimpleColoring sprites: - sprite: DeltaV/Mobs/Customization/Harpy/harpy_tailsx72.rsi - state: finch_tail + state: finch_tail - type: marking id: HarpyWing2ToneClassic diff --git a/Resources/Prototypes/Entities/Objects/Misc/paper.yml b/Resources/Prototypes/Entities/Objects/Misc/paper.yml index 58457ebb7fa..c1a5d9a1bfd 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/paper.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/paper.yml @@ -255,6 +255,19 @@ components: - type: NukeCodePaper +- type: entity + parent: Paper + id: StationGoalPaper + name: station goal + description: It looks like you have a lot of work to do. + components: + - type: Paper + stampState: paper_stamp-centcom + stampedBy: + - stampedName: stamp-component-stamped-name-centcom + stampedColor: "#bb3232" + + - type: entity name: pen parent: BaseItem diff --git a/Resources/Prototypes/Entities/Structures/Machines/fax_machine.yml b/Resources/Prototypes/Entities/Structures/Machines/fax_machine.yml index af15034257b..cd4a22b7909 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/fax_machine.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/fax_machine.yml @@ -108,5 +108,7 @@ - type: FaxMachine name: "Captain's Office" receiveNukeCodes: true + receiveStationGoal: true - type: StealTarget stealGroup: FaxMachineCaptain + diff --git a/Resources/Prototypes/Objectives/goals.yml b/Resources/Prototypes/Objectives/goals.yml new file mode 100644 index 00000000000..59e35ea8a51 --- /dev/null +++ b/Resources/Prototypes/Objectives/goals.yml @@ -0,0 +1,87 @@ +- type: stationGoal + id: Area + +- type: stationGoal + id: Anomalies + +- type: stationGoal + id: Artifacts + +- type: stationGoal + id: BureaucraticError + +- type: stationGoal + id: Combat + +- type: stationGoal + id: Labor + +- type: stationGoal + id: Lectures + +- type: stationGoal + id: Museum + +- type: stationGoal + id: Shuttle + +- type: stationGoal + id: Singularity + +- type: stationGoal + id: SolarPanels + +- type: stationGoal + id: Storage + +- type: stationGoal + id: Xeno + +- type: stationGoal + id: Zoo + + +- type: weightedRandom + id: StationGoals + weights: + StationGoalDepartment: 1 + StationGoalPower: 1 + StationGoalStation: 1 + + +- type: weightedRandom + id: StationGoalDepartment + weights: + StationGoalScience: 1 + StationGoalSecurity: 1 + + +- type: weightedRandom + id: StationGoalPower + weights: + Singularity: 1 + SolarPanels: 1 + +- type: weightedRandom + id: StationGoalScience + weights: + Anomalies: 1 + Artifacts: 1 + Xeno: 1 + +- type: weightedRandom + id: StationGoalSecurity + weights: + Combat: 1 + +- type: weightedRandom + id: StationGoalStation + weights: + Area: 1 + BureaucraticError: 1 + Labor: 1 + Lectures: 1 + Museum: 1 + Shuttle: 1 + Storage: 1 + Zoo: 1 From b04fb6136ea182ffde1a38d4480196d794ad9d51 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Mon, 17 Jun 2024 21:42:34 +0000 Subject: [PATCH 079/155] Automatic Changelog Update (#465) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index dc64e58caa3..99c2f6482e3 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4184,3 +4184,11 @@ Entries: message: Moths have way better control in zero gravity environments id: 6122 time: '2024-06-17T07:58:34.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: >- + Added station goals that get sent to the Command fax machine at the + start of every shift + id: 6123 + time: '2024-06-17T21:42:13.0000000+00:00' From f149d46b3d4d903972ffa2db2d110fb5af36026f Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Thu, 20 Jun 2024 18:07:28 -0400 Subject: [PATCH 080/155] Harpy Peacock Tail (#428) Courtesy of @StillIcarus # Description This adds a new Peacock tail marking to Harpies. I'm also taking this time to update them to the recent DeltaV changes to the birbs. # Media ![image](https://github.com/Simple-Station/Einstein-Engines/assets/16548818/4f776006-700e-4d92-802c-03e6dd201491) ![image](https://github.com/Simple-Station/Einstein-Engines/assets/16548818/5fd143ab-069f-4d1c-b5e0-ee982a95b4b6) The backside is semi cursed, but that's something I can't do within the scope of this PR due to sprite system limitations that Death has planned improvements for. Just ignore them. :) Have a birb as consolation. ![faridaiscute](https://github.com/Simple-Station/Einstein-Engines/assets/16548818/09373a57-f32f-48eb-b52b-6d12143f62ff) :cl: VMSolidus - add: Peacock Tails have been added for Harpies --------- Signed-off-by: VMSolidus Co-authored-by: Danger Revolution! <142105406+DangerRevolution@users.noreply.github.com> --- .../Locale/en-US/deltav/markings/harpy.ftl | 4 ++ .../Mobs/Customization/Markings/harpy.yml | 64 +++++++++++------- .../DeltaV/Entities/Mobs/Species/harpy.yml | 9 ++- .../digitigrade_inventory_template.yml | 7 -- .../Harpy/harpy_chest.rsi/lower.png | Bin .../Harpy/harpy_chest.rsi/meta.json | 0 .../Harpy/harpy_chest.rsi/upper.png | Bin .../harpy_ears.rsi/harpy_ears_default.png | Bin .../Harpy/harpy_ears.rsi/meta.json | 0 .../Harpy/harpy_legs.rsi/feet.png | Bin .../Harpy/harpy_legs.rsi/meta.json | 0 .../Harpy/harpy_legs.rsi/talons.png | Bin .../Harpy/harpy_legs.rsi/thighs.png | Bin .../Harpy/harpy_tails.rsi/meta.json | 0 .../Harpy/harpy_tails.rsi/phoenix_tail.png | Bin .../Harpy/harpy_tails.rsi/rooster_tail.png | Bin .../harpy_tails36x36.rsi}/finch_tail.png | Bin .../Harpy/harpy_tails36x36.rsi}/meta.json | 0 .../Harpy/harpy_tails48x48.rsi/meta.json | 19 ++++++ .../peacock_tail_eyes.png | Bin 0 -> 772 bytes .../peacock_tail_feathers.png | Bin 0 -> 1669 bytes .../Customization/Harpy/harpy_wingcover.png | Bin .../Harpy/harpy_wings.rsi/classicharpy.png | Bin .../Harpy/harpy_wings.rsi/harpy.png | Bin .../Harpy/harpy_wings.rsi/harpy2tone1.png | Bin .../Harpy/harpy_wings.rsi/harpy2tone2.png | Bin .../Harpy/harpy_wings.rsi/harpy3tone1.png | Bin .../Harpy/harpy_wings.rsi/harpy3tone2.png | Bin .../Harpy/harpy_wings.rsi/harpy3tone3.png | Bin .../Harpy/harpy_wings.rsi/harpyfolded.png | Bin .../Harpy/harpy_wings.rsi/harpyspeckled1.png | Bin .../Harpy/harpy_wings.rsi/harpyspeckled2.png | Bin .../Harpy/harpy_wings.rsi/harpyundertone1.png | Bin .../Harpy/harpy_wings.rsi/harpyundertone2.png | Bin .../Harpy/harpy_wings.rsi/harpywingtip1.png | Bin .../Harpy/harpy_wings.rsi/harpywingtip2.png | Bin .../Harpy/harpy_wings.rsi/meta.json | 0 37 files changed, 71 insertions(+), 32 deletions(-) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_chest.rsi/lower.png (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_chest.rsi/meta.json (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_chest.rsi/upper.png (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_ears.rsi/harpy_ears_default.png (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_ears.rsi/meta.json (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_legs.rsi/feet.png (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_legs.rsi/meta.json (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_legs.rsi/talons.png (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_legs.rsi/thighs.png (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_tails.rsi/meta.json (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_tails.rsi/phoenix_tail.png (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_tails.rsi/rooster_tail.png (100%) rename Resources/Textures/{DeltaV/Mobs/Customization/Harpy/harpy_tailsx72.rsi => Mobs/Customization/Harpy/harpy_tails36x36.rsi}/finch_tail.png (100%) rename Resources/Textures/{DeltaV/Mobs/Customization/Harpy/harpy_tailsx72.rsi => Mobs/Customization/Harpy/harpy_tails36x36.rsi}/meta.json (100%) create mode 100644 Resources/Textures/Mobs/Customization/Harpy/harpy_tails48x48.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Customization/Harpy/harpy_tails48x48.rsi/peacock_tail_eyes.png create mode 100644 Resources/Textures/Mobs/Customization/Harpy/harpy_tails48x48.rsi/peacock_tail_feathers.png rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_wingcover.png (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_wings.rsi/classicharpy.png (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_wings.rsi/harpy.png (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone1.png (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone2.png (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone1.png (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone2.png (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone3.png (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_wings.rsi/harpyfolded.png (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled1.png (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled2.png (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone1.png (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone2.png (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip1.png (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip2.png (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_wings.rsi/meta.json (100%) diff --git a/Resources/Locale/en-US/deltav/markings/harpy.ftl b/Resources/Locale/en-US/deltav/markings/harpy.ftl index 3c1a2e3b9b2..871f2f17290 100644 --- a/Resources/Locale/en-US/deltav/markings/harpy.ftl +++ b/Resources/Locale/en-US/deltav/markings/harpy.ftl @@ -40,6 +40,10 @@ marking-HarpyTailRooster-rooster_tail = Tail marking-HarpyTailFinch = Finch Tail marking-HarpyTailFinch-finch_tail = Tail +marking-HarpyTailPeacock = Peacock Tail +marking-HarpyTailPeacock-peacock_tail_feathers = Feathers +marking-HarpyTailPeacock-peacock_tail_eyes = Eyes + marking-HarpyChestDefault = Wing & Groin Under-Clothes marking-HarpyChestDefault-upper = Wing Under-Clothes marking-HarpyChestDefault-lower = Groin Under-Clothes diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/harpy.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/harpy.yml index 4f65046ce9c..bd1ad12a326 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/harpy.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/harpy.yml @@ -15,7 +15,7 @@ - !type:SimpleColoring color: "#964b00" sprites: - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi state: harpy - type: marking @@ -32,7 +32,7 @@ - !type:SimpleColoring color: "#964b00" sprites: - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi state: classicharpy - type: marking @@ -49,7 +49,7 @@ - !type:SimpleColoring color: "#964b00" sprites: - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi state: harpyfolded - type: marking @@ -66,7 +66,7 @@ - !type:SimpleColoring color: "#964b00" sprites: - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_ears.rsi + - sprite: Mobs/Customization/Harpy/harpy_ears.rsi state: harpy_ears_default - type: marking @@ -83,7 +83,7 @@ - !type:SimpleColoring color: "#964b00" sprites: - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_tails.rsi + - sprite: Mobs/Customization/Harpy/harpy_tails.rsi state: phoenix_tail - type: marking @@ -99,7 +99,7 @@ fallbackTypes: - !type:SimpleColoring sprites: - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_tails.rsi + - sprite: Mobs/Customization/Harpy/harpy_tails.rsi state: rooster_tail @@ -116,18 +116,36 @@ fallbackTypes: - !type:SimpleColoring sprites: - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_tailsx72.rsi + - sprite: Mobs/Customization/Harpy/harpy_tails36x36.rsi state: finch_tail +- type: marking + id: HarpyTailPeacock + bodyPart: Tail + markingCategory: Tail + speciesRestriction: [Harpy] + coloring: + default: + type: + !type:CategoryColoring + category: Hair + fallbackTypes: + - !type:SimpleColoring + sprites: + - sprite: Mobs/Customization/Harpy/harpy_tails48x48.rsi + state: peacock_tail_feathers + - sprite: Mobs/Customization/Harpy/harpy_tails48x48.rsi + state: peacock_tail_eyes + - type: marking id: HarpyWing2ToneClassic bodyPart: RArm markingCategory: Arms speciesRestriction: [Harpy] sprites: - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi state: harpy2tone1 - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi state: harpy2tone2 - type: marking @@ -136,11 +154,11 @@ markingCategory: Arms speciesRestriction: [Harpy] sprites: - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi state: harpy3tone1 - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi state: harpy3tone2 - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi state: harpy3tone3 - type: marking @@ -149,9 +167,9 @@ markingCategory: Arms speciesRestriction: [Harpy] sprites: - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi state: harpyspeckled1 - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi state: harpyspeckled2 - type: marking @@ -160,9 +178,9 @@ markingCategory: Arms speciesRestriction: [Harpy] sprites: - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi state: harpyundertone1 - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi state: harpyundertone2 - type: marking @@ -171,9 +189,9 @@ markingCategory: Arms speciesRestriction: [Harpy] sprites: - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi state: harpywingtip1 - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi state: harpywingtip2 - type: marking @@ -190,9 +208,9 @@ - !type:SimpleColoring color: "#964b00" sprites: - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_chest.rsi + - sprite: Mobs/Customization/Harpy/harpy_chest.rsi state: upper - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_chest.rsi + - sprite: Mobs/Customization/Harpy/harpy_chest.rsi state: lower - type: marking @@ -209,7 +227,7 @@ - !type:SimpleColoring color: "#964b00" sprites: - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi + - sprite: Mobs/Customization/Harpy/harpy_legs.rsi state: thighs - type: marking @@ -223,7 +241,7 @@ - !type:SimpleColoring color: "#964b00" sprites: - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi + - sprite: Mobs/Customization/Harpy/harpy_legs.rsi state: feet - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi + - sprite: Mobs/Customization/Harpy/harpy_legs.rsi state: talons diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/harpy.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/harpy.yml index 18437e074dd..0ddce8b0e65 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/harpy.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/harpy.yml @@ -54,7 +54,6 @@ visible: false - map: [ "id" ] - map: [ "gloves" ] - - map: [ "shoes" ] - map: [ "ears" ] - map: [ "outerClothing" ] - map: [ "eyes" ] @@ -127,6 +126,12 @@ templateId: digitigrade - type: HarpyVisuals - type: UltraVision + - type: Tag + tags: + - CanPilot + - FootstepSound + - DoorBumpOpener + - ShoesRequiredStepTriggerImmune - type: LanguageSpeaker speaks: - GalacticCommon @@ -147,6 +152,7 @@ species: Harpy - type: Inventory speciesId: harpy + templateId: digitigrade - type: Sprite scale: 0.9, 0.9 layers: @@ -167,7 +173,6 @@ - map: ["enum.HumanoidVisualLayers.RHand"] - map: [ "id" ] - map: [ "gloves" ] - - map: [ "shoes" ] - map: [ "ears" ] - map: [ "outerClothing" ] - map: [ "eyes" ] diff --git a/Resources/Prototypes/DeltaV/InventoryTemplates/digitigrade_inventory_template.yml b/Resources/Prototypes/DeltaV/InventoryTemplates/digitigrade_inventory_template.yml index 158541571aa..fc7dbda9321 100644 --- a/Resources/Prototypes/DeltaV/InventoryTemplates/digitigrade_inventory_template.yml +++ b/Resources/Prototypes/DeltaV/InventoryTemplates/digitigrade_inventory_template.yml @@ -1,13 +1,6 @@ - type: inventoryTemplate id: digitigrade slots: - - name: shoes - slotTexture: shoes - slotFlags: FEET - stripTime: 3 - uiWindowPos: 1,0 - strippingWindowPos: 1,3 - displayName: Shoes - name: jumpsuit slotTexture: uniform slotFlags: INNERCLOTHING diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_chest.rsi/lower.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_chest.rsi/lower.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_chest.rsi/lower.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_chest.rsi/lower.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_chest.rsi/meta.json b/Resources/Textures/Mobs/Customization/Harpy/harpy_chest.rsi/meta.json similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_chest.rsi/meta.json rename to Resources/Textures/Mobs/Customization/Harpy/harpy_chest.rsi/meta.json diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_chest.rsi/upper.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_chest.rsi/upper.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_chest.rsi/upper.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_chest.rsi/upper.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_ears.rsi/harpy_ears_default.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_ears.rsi/harpy_ears_default.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_ears.rsi/harpy_ears_default.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_ears.rsi/harpy_ears_default.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_ears.rsi/meta.json b/Resources/Textures/Mobs/Customization/Harpy/harpy_ears.rsi/meta.json similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_ears.rsi/meta.json rename to Resources/Textures/Mobs/Customization/Harpy/harpy_ears.rsi/meta.json diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi/feet.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_legs.rsi/feet.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi/feet.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_legs.rsi/feet.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi/meta.json b/Resources/Textures/Mobs/Customization/Harpy/harpy_legs.rsi/meta.json similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi/meta.json rename to Resources/Textures/Mobs/Customization/Harpy/harpy_legs.rsi/meta.json diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi/talons.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_legs.rsi/talons.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi/talons.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_legs.rsi/talons.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi/thighs.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_legs.rsi/thighs.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi/thighs.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_legs.rsi/thighs.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tails.rsi/meta.json b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/meta.json similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tails.rsi/meta.json rename to Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/meta.json diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tails.rsi/phoenix_tail.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/phoenix_tail.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tails.rsi/phoenix_tail.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/phoenix_tail.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tails.rsi/rooster_tail.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/rooster_tail.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tails.rsi/rooster_tail.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/rooster_tail.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tailsx72.rsi/finch_tail.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails36x36.rsi/finch_tail.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tailsx72.rsi/finch_tail.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_tails36x36.rsi/finch_tail.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tailsx72.rsi/meta.json b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails36x36.rsi/meta.json similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tailsx72.rsi/meta.json rename to Resources/Textures/Mobs/Customization/Harpy/harpy_tails36x36.rsi/meta.json diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_tails48x48.rsi/meta.json b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails48x48.rsi/meta.json new file mode 100644 index 00000000000..2961db3707d --- /dev/null +++ b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails48x48.rsi/meta.json @@ -0,0 +1,19 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Peacock by stillxicarus (Discord)", + "size": { + "x": 48, + "y": 48 + }, + "states": [ + { + "name": "peacock_tail_feathers", + "directions": 4 + }, + { + "name": "peacock_tail_eyes", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_tails48x48.rsi/peacock_tail_eyes.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails48x48.rsi/peacock_tail_eyes.png new file mode 100644 index 0000000000000000000000000000000000000000..71af693afd78b3c3a6c81ca03fc2f9db5913e590 GIT binary patch literal 772 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD3?#3*wSy!Wi-X*q7}lMWc?smOq&xaLGB9lH z=l+w(3gjyW_=LDtRW-hRc_J~f)7Q5xIl1%y|NjRL)R&hxZQ4}w>eVTrswZhYEkKI9 zB*-rqC<_G)UjB@qfWn*w9+AZi419+`m{C;2tAT-mDb&-&F(kwJ?aYg1hZQ*5k~e10 z{$Brpago!NU2e0xW%tk3W#hDWniRY{_rH<%g404TKGm}><1}Z=edpY|?DrC%?a|r+ ziTh6)CY;Y=;b(Y|{LP=f6PN*cE&-(I*n^FCEgYD{zpYy*y3!b(03e(!E zKL`01i1hql(XgD6?f9(?EOWQBzM3eNHgmzM_EX0vel@o(`2AOc=Uq`{@2{S%a=%h`o2b+9s8C>H zpx0*yEwdB-39}Z23B0Y`x5Z?^jjt+SxTNGfYPsrC93*qJxYysE%nl!b?@pzv*U&iA`jFQoxf?#_u}_@Wt{T0h^_`Kmq5-Qe-3bVZ$zPv?|c7GX8cfPYi| zF5rmun;0aqnJMW_X<*)qO$>Wd3>w3)UDTFXBJC*Z#k%g2a+7tPH~ z8~6Kli1^Msdz2|;NuW<-AJbu7wHyIefqy3r9y)gaUz_lS%i`Mur58n?E#mK{Sn_>b rcXDyRWMReq*qBB78xS7c@P5B*c|60ulNK9*sgA+Z)z4*}Q$iB}zuHxD literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_tails48x48.rsi/peacock_tail_feathers.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails48x48.rsi/peacock_tail_feathers.png new file mode 100644 index 0000000000000000000000000000000000000000..d56b093d6ca8a5584adf01c6e4e1d6aeca3c48ec GIT binary patch literal 1669 zcmV;027394P)Px#1ZP1_K>z@;j|==^1poj5Fi=cXMd|6tqoZ=bz<>Y$|LW?>va)pD-K~$0cTG)( zVPT1SdV#O6bBBj|V`GVTcY*)_02e%JDgXcg5Oh*bQ~&?}|NsC0|NsC0|NsC00N^8C z82|tP32;bRa{vGi!vFvd!vV){sAK>D1;R;0K~!i%?U;>{<0uS-L0}Aw9p3+K?-R!V z-t&wzTUT|J-kk(+TaAQJY)tvf_z2wMKNI*h;XfI&?fbj<V&TN zX92Zr#EV|h_8lr`n$Q*hBp{uBIBwy)yZ52;=Luc#j{?DkQhHCz_pSG@m>BbfF8Esk zbx;DIQOOb+3EH}Fykg-m6T0AU1ausF7fP!AR6@rs?aCP|f1c14erbGk6Vlyuz{Dr)qluDwijhP!vLFZkDj*VZtyaYi zETM=pm9iZwUwuFUvzigu*ZJ@Hi+~Nd8S^n;B*!Er9CejXVAMsXp14iOC=C|Lz2mR3 z#Z$?uyw`A3GX(`b!ZQTYXaB>P#@ z((^})b*SSjf3avpLhdhO-7}+85-ofiT_&UYgo4Q~l2;<+dSlH3*yX>bLG5lqk}xZ4GI|5E(?9K<)WWz!{6v zNvCx{bP0#;p`gxu?2@H*UZc}I<|@1 zH;mPvG`&7hL@i}ii!lAH#ut7QAh9Lt*y}ZUP_M`F_0l#~V86zVAG??GaXRIsU+`ZY z;~V}gkO^DrUJ_%j9#oYv$0)BZ5%9eOdp_J4_2Y^^3zR&J8j^fi18!k_INJX{e-UV? zQ(3U@UE!906!>*~1a9#WxWz}{79W9I{LcjTPY#c2{jSyu)K>e0tSWlK=&Th%D{73 z>&^l`pdfa71%C^J73>E+A5lyKJa4lwA?EV~){l`hFHwdUh}rb?Ik3cm_uH^$@Dn&a z^val$VJ{FmO(LXS8+iz$5>eBr(_F113h8(n7Q7>g53d?O0`DbGt+2wO9T2wpnqa!2 zZiTn@v+m&_QHBnK(@^`8&J@#SJx!~}e9thQMD@8EYx8UZ#dz{6>w#Es7q5cfLUej0 z7=%>xele^cI_2J*RK#*wPv4$FkM4q%l8l~lPWd%^ohQ>P{h;AsgL}M#} zLa#?*lv+o%eT*0!B_H#BKmVjH0@ZG>#pIn*p`}c#M4TO%1=Kk%^nG7Mo+?CcttLvp z26`6Y>Okn&Z{F7-nYH*8|ok5T^=iMCu={%a5Dy4XTnavu>e%1H$aYHq;)Fx9{dG-1a9#WxWz}{2BrK1WWU*nv@q8v P00000NkvXXu0mjfjI1Qj literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wingcover.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wingcover.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wingcover.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_wingcover.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/classicharpy.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/classicharpy.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/classicharpy.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/classicharpy.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpy.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpy.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone1.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone1.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone1.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone1.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone2.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone2.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone2.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone2.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone1.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone1.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone1.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone1.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone2.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone2.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone2.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone2.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone3.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone3.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone3.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone3.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyfolded.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpyfolded.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyfolded.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpyfolded.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled1.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled1.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled1.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled1.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled2.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled2.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled2.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled2.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone1.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone1.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone1.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone1.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone2.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone2.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone2.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone2.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip1.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip1.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip1.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip1.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip2.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip2.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip2.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip2.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/meta.json b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/meta.json similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/meta.json rename to Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/meta.json From 896627df10c3ce2d211d3d2e443616e718c5bd49 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Thu, 20 Jun 2024 22:07:52 +0000 Subject: [PATCH 081/155] Automatic Changelog Update (#428) --- Resources/Changelog/Changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 99c2f6482e3..9cf28c91be0 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4192,3 +4192,9 @@ Entries: start of every shift id: 6123 time: '2024-06-17T21:42:13.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: Peacock Tails have been added for Harpies + id: 6124 + time: '2024-06-20T22:07:29.0000000+00:00' From b353d958ecb2a744db12b198a6a1e27d2a8f7809 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Thu, 20 Jun 2024 18:17:02 -0400 Subject: [PATCH 082/155] Port Randomly Fire Dropped Weapons (#471) # Description Ports https://github.com/Simple-Station/Parkstation-Friendly-Chainsaw/pull/19 I have added a new stat for firearms, the "Reliability" stat, which is a number between 0 and 1. It's used as a percentage chance for the weapon to fire itself when violently thrown into anyone. This PR differs from the original one slightly in that to get it to actually work without crashing, I set the system to listen to an event that triggers whenever the gun collides with another entity, not necessarily just the floor. This is the same event responsible for the clown's cream pie system, or for glass shards embedding in an entity. # Changelog :cl: - add: NanoTrasen has disabled the unneeded safeties on your guns- Make sure you're careful with them! - tweak: All Firearms now have a reliability stat, some are more reliable than others. The more reliable a weapon is, the less likely it is to accidentally discharge when yeeted. --- .../Ranged/Systems/FireOnDropSystem.cs | 27 +++++++++++++++++++ .../Weapons/Ranged/Components/GunComponent.cs | 6 +++++ .../Objects/Weapons/Guns/Basic/base_pka.yml | 1 + .../Weapons/Guns/Battery/battery_guns.yml | 1 + .../Objects/Weapons/Guns/Pistols/pistols.yml | 14 +++++++++- .../Weapons/Guns/Revolvers/revolvers.yml | 3 +++ .../Objects/Weapons/Guns/Rifles/rifles.yml | 2 ++ .../Objects/Weapons/Guns/SMGs/smgs.yml | 5 ++++ .../Weapons/Guns/Shotguns/shotguns.yml | 7 +++++ .../Objects/Weapons/Guns/Snipers/snipers.yml | 10 +++++++ 10 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 Content.Server/Weapons/Ranged/Systems/FireOnDropSystem.cs diff --git a/Content.Server/Weapons/Ranged/Systems/FireOnDropSystem.cs b/Content.Server/Weapons/Ranged/Systems/FireOnDropSystem.cs new file mode 100644 index 00000000000..a6112ad49cf --- /dev/null +++ b/Content.Server/Weapons/Ranged/Systems/FireOnDropSystem.cs @@ -0,0 +1,27 @@ +using Content.Shared.Throwing; +using Content.Shared.Weapons.Ranged.Components; +using Content.Shared.Weapons.Ranged.Systems; +using Robust.Shared.Random; + +namespace Content.Server.Weapons.Ranged.Systems; + +public sealed class FireOnDropSystem : EntitySystem +{ + [Dependency] private readonly SharedGunSystem _gun = default!; + [Dependency] private readonly IRobustRandom _random = default!; + + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(HandleLand); + } + + + private void HandleLand(EntityUid uid, GunComponent component, ref ThrowDoHitEvent args) + { + if (_random.Prob(component.FireOnDropChance)) + _gun.AttemptShoot(uid, uid, component, Transform(uid).Coordinates.Offset(Transform(uid).LocalRotation.ToVec())); + } +} diff --git a/Content.Shared/Weapons/Ranged/Components/GunComponent.cs b/Content.Shared/Weapons/Ranged/Components/GunComponent.cs index 0183a30a73b..a18aac80abe 100644 --- a/Content.Shared/Weapons/Ranged/Components/GunComponent.cs +++ b/Content.Shared/Weapons/Ranged/Components/GunComponent.cs @@ -229,6 +229,12 @@ public sealed partial class GunComponent : Component ///
[DataField] public bool ClumsyProof = false; + + /// + /// The percentage chance of a given gun to accidentally discharge if violently thrown into a wall or person + /// + [DataField] + public float FireOnDropChance = 0.1f; } [Flags] diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/base_pka.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/base_pka.yml index f85e93b893f..93621bc3a28 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/base_pka.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/base_pka.yml @@ -22,6 +22,7 @@ - SemiAuto soundGunshot: path: /Audio/Weapons/Guns/Gunshots/kinetic_accel.ogg + fireOnDropChance: 1 - type: AmmoCounter - type: Appearance - type: GenericVisualizer diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml index 202604b8bf0..bf0c51849a3 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml @@ -18,6 +18,7 @@ selectedMode: SemiAuto availableModes: - SemiAuto + fireOnDropChance: 0.15 soundGunshot: path: /Audio/Weapons/Guns/Gunshots/laser.ogg - type: Battery diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml index 16cacb79dfa..410664e46e4 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml @@ -99,6 +99,15 @@ containers: gun_magazine: !type:ContainerSlot gun_chamber: !type:ContainerSlot + - type: Gun + fireRate: 6 + selectedMode: SemiAuto + availableModes: + - SemiAuto + - FullAuto + soundGunshot: + path: /Audio/Weapons/Guns/Gunshots/pistol.ogg + fireOnDropChance: 0.3 - type: entity name: cobra @@ -125,6 +134,7 @@ volume: -14 availableModes: - SemiAuto + fireOnDropChance: 0.1 - type: ItemSlots slots: gun_magazine: @@ -169,6 +179,7 @@ - SemiAuto soundGunshot: path: /Audio/Weapons/Guns/Gunshots/mk58.ogg + fireOnDropChance: 0.5 - type: entity id: WeaponPistolMk58Nonlethal @@ -198,7 +209,7 @@ name: N1984 parent: BaseWeaponPistol id: WeaponPistolN1984 # the spaces in description are for formatting. - description: The sidearm of any self respecting officer. Comes in .45 magnum, the lord's caliber. + description: The sidearm of any self respecting officer. Comes in .45 magnum, the lord's caliber. components: - type: Sprite sprite: Objects/Weapons/Guns/Pistols/N1984.rsi @@ -219,6 +230,7 @@ - SemiAuto soundGunshot: path: /Audio/Weapons/Guns/Gunshots/mk58.ogg + fireOnDropChance: 0.6 - type: ItemSlots slots: gun_magazine: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Revolvers/revolvers.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Revolvers/revolvers.yml index bd043c997da..c5237cdad9a 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Revolvers/revolvers.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Revolvers/revolvers.yml @@ -29,6 +29,7 @@ - SemiAuto soundGunshot: path: /Audio/Weapons/Guns/Gunshots/revolver.ogg + fireOnDropChance: 0.5 - type: UseDelay delay: 0.66 - type: ContainerContainer @@ -127,6 +128,7 @@ path: /Audio/Weapons/Guns/Gunshots/revolver.ogg params: volume: 2.25 + fireOnDropChance: 0.3 - type: entity name: Python @@ -155,6 +157,7 @@ sprite: Objects/Weapons/Guns/Revolvers/pirate_revolver.rsi - type: Gun fireRate: 1 + fireOnDropChance: 1 - type: ContainerContainer containers: revolver-ammo: !type:Container diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Rifles/rifles.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Rifles/rifles.yml index 5bc8125ebaa..c55b2b6b091 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Rifles/rifles.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Rifles/rifles.yml @@ -67,6 +67,7 @@ fireRate: 5 soundGunshot: path: /Audio/Weapons/Guns/Gunshots/rifle2.ogg + fireOnDropChance: 0.5 - type: ChamberMagazineAmmoProvider soundRack: path: /Audio/Weapons/Guns/Cock/ltrifle_cock.ogg @@ -159,6 +160,7 @@ - type: Gun soundGunshot: path: /Audio/Weapons/Guns/Gunshots/ltrifle.ogg + fireOnDropChance: 0.2 - type: ItemSlots slots: gun_magazine: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml index b693bdba370..2dfc833badf 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml @@ -72,6 +72,7 @@ fireRate: 10 soundGunshot: path: /Audio/Weapons/Guns/Gunshots/atreides.ogg + fireOnDropChance: 0.3 - type: MagazineVisuals magState: mag steps: 1 @@ -96,6 +97,7 @@ - type: Gun soundGunshot: path: /Audio/Weapons/Guns/Gunshots/c-20r.ogg + fireOnDropChance: 0.3 - type: ChamberMagazineAmmoProvider autoEject: true - type: MagazineVisuals @@ -126,6 +128,7 @@ path: /Audio/Weapons/Guns/Gunshots/atreides.ogg availableModes: - FullAuto + fireOnDropChance: 0.2 - type: ItemSlots slots: gun_magazine: @@ -173,6 +176,7 @@ path: /Audio/Weapons/Guns/Gunshots/atreides.ogg availableModes: - FullAuto + fireOnDropChance: 0.1 - type: ItemSlots slots: gun_magazine: @@ -225,6 +229,7 @@ selectedMode: FullAuto availableModes: - FullAuto + fireOnDropChance: 0.1 - type: ItemSlots slots: gun_magazine: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml index a8d9f539917..52b05b6d60b 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml @@ -28,6 +28,7 @@ path: /Audio/Weapons/Guns/Gunshots/shotgun.ogg soundEmpty: path: /Audio/Weapons/Guns/Empty/empty.ogg + fireOnDropChance: 0.2 - type: BallisticAmmoProvider whitelist: tags: @@ -75,6 +76,7 @@ path: /Audio/Weapons/Guns/Gunshots/shotgun.ogg soundEmpty: path: /Audio/Weapons/Guns/Empty/empty.ogg + fireOnDropChance: 0.3 - type: ItemSlots slots: gun_magazine: @@ -115,6 +117,7 @@ heldPrefix: db - type: Gun fireRate: 2 + fireOnDropChance: 0.5 - type: BallisticAmmoProvider capacity: 2 - type: Construction @@ -190,6 +193,7 @@ heldPrefix: sawn - type: Gun fireRate: 4 + fireOnDropChance: 0.5 - type: BallisticAmmoProvider capacity: 2 - type: Construction @@ -226,6 +230,7 @@ sprite: Objects/Weapons/Guns/Shotguns/hm_pistol.rsi - type: Gun fireRate: 4 + fireOnDropChance: 1 - type: BallisticAmmoProvider capacity: 1 - type: Construction @@ -250,6 +255,7 @@ sprite: Objects/Weapons/Guns/Shotguns/blunderbuss.rsi - type: Gun fireRate: 2 + fireOnDropChance: 1 - type: BallisticAmmoProvider capacity: 1 - type: StaticPrice @@ -273,6 +279,7 @@ heldPrefix: improvised - type: Gun fireRate: 4 #No reason to stifle the firerate since you have to manually reload every time anyways. + fireOnDropChance: 1 - type: BallisticAmmoProvider capacity: 1 proto: null diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml index c97459629cf..adb8e323f4a 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml @@ -46,6 +46,14 @@ components: - type: Sprite sprite: Objects/Weapons/Guns/Snipers/bolt_gun_wood.rsi + - type: Gun + fireRate: 0.75 + selectedMode: SemiAuto + availableModes: + - SemiAuto + soundGunshot: + path: /Audio/Weapons/Guns/Gunshots/sniper.ogg + fireOnDropChance: 1 - type: entity name: Hristov @@ -82,6 +90,7 @@ selectedMode: SemiAuto availableModes: - SemiAuto + fireOnDropChance: 1 - type: UseDelayOnShoot - type: UseDelay delay: 8 #it's a musket @@ -111,6 +120,7 @@ - type: Gun minAngle: 0 maxAngle: 30 #miss him entirely because the barrel is smoothbore + fireOnDropChance: 1 - type: Item size: Small storedRotation: 90 From ff6e9b7424c150f0c2d3854f1a5d2c0d7eb61d2d Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Thu, 20 Jun 2024 22:17:23 +0000 Subject: [PATCH 083/155] Automatic Changelog Update (#471) --- Resources/Changelog/Changelog.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 9cf28c91be0..454311cbd12 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4198,3 +4198,16 @@ Entries: message: Peacock Tails have been added for Harpies id: 6124 time: '2024-06-20T22:07:29.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: >- + NanoTrasen has disabled the unneeded safeties on your guns- Make sure + you're careful with them! + - type: Tweak + message: >- + All Firearms now have a reliability stat, some are more reliable than + others. The more reliable a weapon is, the less likely it is to + accidentally discharge when yeeted. + id: 6125 + time: '2024-06-20T22:17:03.0000000+00:00' From bc0e2e608e18aeaa093b1366f75048678be09912 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Thu, 20 Jun 2024 18:24:30 -0400 Subject: [PATCH 084/155] Port Random Bark System (#466) # Description https://github.com/Simple-Station/Parkstation-Friendly-Chainsaw/pull/11 Later, I would like to have this system not just for animals, but for implementations of humanoid NPCs, since it can just as easily be used for human NPCs. I could make space bandits that CHEEKI BREEKI at people. # Changelog :cl: DEATHB4DEFEAT - add: Animals will no longer be a silent, soulless shell --------- Signed-off-by: VMSolidus Co-authored-by: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com> --- .../Speech/Components/RandomBarkComponent.cs | 63 ++++++++++++++++++ .../Speech/Systems/RandomBarkSystem.cs | 47 ++++++++++++++ .../Prototypes/Entities/Mobs/NPCs/animals.yml | 65 +++++++++++++++++++ .../Prototypes/Entities/Mobs/NPCs/pets.yml | 4 ++ .../Entities/Mobs/NPCs/simplemob.yml | 1 + 5 files changed, 180 insertions(+) create mode 100644 Content.Server/Speech/Components/RandomBarkComponent.cs create mode 100644 Content.Server/Speech/Systems/RandomBarkSystem.cs diff --git a/Content.Server/Speech/Components/RandomBarkComponent.cs b/Content.Server/Speech/Components/RandomBarkComponent.cs new file mode 100644 index 00000000000..7229428f538 --- /dev/null +++ b/Content.Server/Speech/Components/RandomBarkComponent.cs @@ -0,0 +1,63 @@ +namespace Content.Server.Speech.Components; + +/// +/// Sends a random message from a list with a provided min/max time. +/// +[RegisterComponent] +public sealed partial class RandomBarkComponent : Component +{ + /// + /// Should the message be sent to the chat log? + /// + [DataField] + public bool ChatLog = false; + + /// + /// Minimum time an animal will go without speaking + /// + [DataField] + public int MinTime = 45; + + /// + /// Maximum time an animal will go without speaking + /// + [DataField] + public int MaxTime = 350; + + /// + /// Accumulator for counting time since the last bark + /// + [DataField] + public float BarkAccumulator = 8f; + + /// + /// Multiplier applied to the random time. Good for changing the frequency without having to specify exact values + /// + [DataField] + public float BarkMultiplier = 1f; + + /// + /// List of things to be said. Filled with garbage to be modified by an accent, but can be specified in the .yml + /// + [DataField] + public IReadOnlyList Barks = new[] + { + "Bark", + "Boof", + "Woofums", + "Rawrl", + "Eeeeeee", + "Barkums", + "Awooooooooooooooooooo awoo awoooo", + "Grrrrrrrrrrrrrrrrrr", + "Rarrwrarrwr", + "Goddamn I love gold fish crackers", + "Bork bork boof boof bork bork boof boof boof bork", + "Bark", + "Boof", + "Woofums", + "Rawrl", + "Eeeeeee", + "Barkums", + }; +} diff --git a/Content.Server/Speech/Systems/RandomBarkSystem.cs b/Content.Server/Speech/Systems/RandomBarkSystem.cs new file mode 100644 index 00000000000..4fc9dd420d2 --- /dev/null +++ b/Content.Server/Speech/Systems/RandomBarkSystem.cs @@ -0,0 +1,47 @@ +using Content.Server.Chat.Systems; +using Content.Shared.Mind.Components; +using Robust.Shared.Random; +using Content.Server.Speech.Components; + +namespace Content.Server.Speech.Systems; + +public sealed class RandomBarkSystem : EntitySystem +{ + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly ChatSystem _chat = default!; + [Dependency] private readonly EntityManager _entity = default!; + + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnInit); + } + + + private void OnInit(EntityUid uid, RandomBarkComponent barker, ComponentInit args) + { + barker.BarkAccumulator = _random.NextFloat(barker.MinTime, barker.MaxTime) * barker.BarkMultiplier; + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var barker)) + { + barker.BarkAccumulator -= frameTime; + if (barker.BarkAccumulator > 0) + continue; + + barker.BarkAccumulator = _random.NextFloat(barker.MinTime, barker.MaxTime) * barker.BarkMultiplier; + if (_entity.TryGetComponent(uid, out var actComp) && + actComp.HasMind) + continue; + + _chat.TrySendInGameICMessage(uid, _random.Pick(barker.Barks), InGameICChatType.Speak, barker.ChatLog ? ChatTransmitRange.Normal : ChatTransmitRange.HideChat); + } + } +} diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index 369544fdc1b..e311681ce5f 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -64,6 +64,7 @@ - type: Tag tags: - VimPilot + - type: RandomBark - type: entity name: bee @@ -132,6 +133,13 @@ - ReagentId: GroundBee Quantity: 5 - type: ZombieImmune + - type: RandomBark + barks: + - Bzzzzz + - Bzzz bzzz + - Bzzzzzzzzzzzz + - Bzz + barkMultiplier: 1.5 - type: entity name: bee @@ -242,6 +250,7 @@ - type: NpcFactionMember factions: - Passive + - type: RandomBark - type: entity parent: MobChicken @@ -620,6 +629,8 @@ - type: NpcFactionMember factions: - Passive + - type: RandomBark + barkMultiplier: 0.7 - type: entity name: white duck #Quack @@ -799,6 +810,16 @@ - type: GuideHelp guides: - Chef + - type: RandomBark + barks: + - Mooooooo + - Moo + - Huff + - Mooooooooooo + - Moooooo + - Moooo + barkMultiplier: 3 + - type: entity name: crab @@ -867,6 +888,12 @@ task: RuminantCompound - type: Body prototype: AnimalHemocyanin + - type: RandomBark + barks: + - click clack + - clack + - clickity clack + - clack clack - type: entity name: goat @@ -1479,6 +1506,8 @@ makeSentient: true name: ghost-role-information-kobold-name description: ghost-role-information-kobold-description + - type: RandomBark + barkMultiplier: 0.65 - type: entity name: guidebook monkey @@ -1641,6 +1670,8 @@ - type: BadFood - type: NonSpreaderZombie - type: PreventSpiller + - type: RandomBark + barkMultiplier: 0.3 - type: entity parent: MobMouse @@ -1876,6 +1907,18 @@ - type: Tag tags: - VimPilot + - type: RandomBark + barkMultiplier: 1.3 + barks: + - Croooaaaakkk + - Ribbit + - Ribbit + - Ribbit + - Crooaak + - Ribbit + - Ribbit + - Ribbit + - Bibbit # Would be cool to have some functionality for the parrot to be able to sit on stuff - type: entity @@ -1994,6 +2037,10 @@ heatDamage: types: Heat : 0.2 #per second, scales with temperature & other constants + - type: RandomBark + barks: + - Wank + barkMultiplier: 0.6 - type: entity name: grenade penguin @@ -2109,6 +2156,14 @@ - type: Damageable damageContainer: Biological damageModifierSet: Scale + - type: RandomBark + barkMultiplier: 1.5 + barks: + - Hsssssss + - Hss + - Hsssss + - Hisss + - Hshsss # Code unique spider prototypes or combine them all into one spider and get a # random sprite state when you spawn it. @@ -2236,6 +2291,7 @@ groups: Brute: -0.07 Burn: -0.07 + - type: RandomBark - type: entity name: tarantula @@ -2588,6 +2644,7 @@ - type: Tag tags: - VimPilot + - type: RandomBark - type: entity name: corrupted corgi @@ -2747,6 +2804,7 @@ - type: Tag tags: - VimPilot + - type: RandomBark - type: entity name: calico cat @@ -2941,6 +2999,10 @@ - type: Tag tags: - VimPilot + - type: RandomBark + barkMultiplier: 10 + barks: + - Sloth - type: entity name: ferret @@ -3140,6 +3202,8 @@ - type: MobPrice price: 60 - type: NonSpreaderZombie + - type: RandomBark + barkMultiplier: 0.45 - type: entity name: pig @@ -3309,3 +3373,4 @@ components: - type: ReplacementAccent accent: nymph + - type: RandomBark diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml b/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml index 8ca1b2d2f0e..5141811a8ea 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml @@ -329,6 +329,8 @@ - VimPilot - type: StealTarget stealGroup: AnimalMcGriff + - type: RandomBark + barkMultiplier: 1.3 - type: entity name: Paperwork @@ -432,6 +434,8 @@ - VimPilot - type: StealTarget stealGroup: AnimalWalter + - type: RandomBark + barkMultiplier: 1.1 - type: entity name: Morty diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml b/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml index 12ea40b1e3c..8e84f46a693 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml @@ -104,3 +104,4 @@ - type: MobPrice price: 150 - type: FloatingVisuals + - type: Speech From d42cd675232c9c54d7a26dd7d2f90028cdb04f2e Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Thu, 20 Jun 2024 22:24:53 +0000 Subject: [PATCH 085/155] Automatic Changelog Update (#466) --- Resources/Changelog/Changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 454311cbd12..2411ef27b06 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4211,3 +4211,9 @@ Entries: accidentally discharge when yeeted. id: 6125 time: '2024-06-20T22:17:03.0000000+00:00' +- author: DEATHB4DEFEAT + changes: + - type: Add + message: Animals will no longer be a silent, soulless shell + id: 6126 + time: '2024-06-20T22:24:30.0000000+00:00' From 4b8036c4946b16bbff51b91f707700d5aa15e354 Mon Sep 17 00:00:00 2001 From: SimpleStation14 <130339894+SimpleStation14@users.noreply.github.com> Date: Thu, 20 Jun 2024 15:25:18 -0700 Subject: [PATCH 086/155] Mirror 26250: Make all implants unable to be implanted more than once (#445) ## Mirror of PR #26250: [Make all implants unable to be implanted more than once](https://github.com/space-wizards/space-station-14/pull/26250) from space-wizards [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `771390bb6741074935e5f24c0aa9c87bc7b5ad09` PR opened by Simyon264 at 2024-03-19 00:44:21 UTC - merged at 2024-03-26 00:16:19 UTC --- PR changed 3 files with 28 additions and 0 deletions. The PR had the following labels: - Status: Needs Review ---

Original Body

> > > > ## About the PR > This PR makes mind shields unable to be implanted more than once. > ## Why / Balance > > PJB complained and people waste implants by injecting already injected people. > > ## Technical details > > Adds a new datafield to the Implanter component which is checked in implanter system. > > ## Media > > ![image](https://github.com/space-wizards/space-station-14/assets/63975668/4907ddb2-de2f-490c-a35d-07c4f3b6c79b) > > - [x] I have added screenshots/videos to this PR showcasing its changes ingame, **or** this PR does not require an ingame showcase > > ## Breaking changes > > N/A > > **Changelog** > > > :cl: Simyon > - tweak: All implants are now unable to be implanted more than once. >
Co-authored-by: SimpleStation14 --- Content.Server/Implants/ImplanterSystem.cs | 21 +++++++++++++++++++ .../Implants/Components/ImplanterComponent.cs | 6 ++++++ Resources/Locale/en-US/implant/implant.ftl | 1 + 3 files changed, 28 insertions(+) diff --git a/Content.Server/Implants/ImplanterSystem.cs b/Content.Server/Implants/ImplanterSystem.cs index 0d46241f414..3cfa3a9f5f8 100644 --- a/Content.Server/Implants/ImplanterSystem.cs +++ b/Content.Server/Implants/ImplanterSystem.cs @@ -1,3 +1,4 @@ +using System.Linq; using Content.Server.Popups; using Content.Shared.DoAfter; using Content.Shared.IdentityManagement; @@ -57,6 +58,17 @@ private void OnImplanterAfterInteract(EntityUid uid, ImplanterComponent componen return; } + // Check if we are trying to implant a implant which is already implanted + if (implant.HasValue && !component.AllowMultipleImplants && CheckSameImplant(target, implant.Value)) + { + var name = Identity.Name(target, EntityManager, args.User); + var msg = Loc.GetString("implanter-component-implant-already", ("implant", implant), ("target", name)); + _popup.PopupEntity(msg, target, args.User); + args.Handled = true; + return; + } + + //Implant self instantly, otherwise try to inject the target. if (args.User == target) Implant(target, target, uid, component); @@ -67,6 +79,15 @@ private void OnImplanterAfterInteract(EntityUid uid, ImplanterComponent componen args.Handled = true; } + public bool CheckSameImplant(EntityUid target, EntityUid implant) + { + if (!TryComp(target, out var implanted)) + return false; + + var implantPrototype = Prototype(implant); + return implanted.ImplantContainer.ContainedEntities.Any(entity => Prototype(entity) == implantPrototype); + } + /// /// Attempt to implant someone else. /// diff --git a/Content.Shared/Implants/Components/ImplanterComponent.cs b/Content.Shared/Implants/Components/ImplanterComponent.cs index 32a36361633..80330aa7e66 100644 --- a/Content.Shared/Implants/Components/ImplanterComponent.cs +++ b/Content.Shared/Implants/Components/ImplanterComponent.cs @@ -70,6 +70,12 @@ public sealed partial class ImplanterComponent : Component [DataField] public (string, string) ImplantData; + /// + /// Determines if the same type of implant can be implanted into an entity multiple times. + /// + [DataField] + public bool AllowMultipleImplants = false; + /// /// The for this implanter /// diff --git a/Resources/Locale/en-US/implant/implant.ftl b/Resources/Locale/en-US/implant/implant.ftl index 22db4460aff..2f6ab9e4e2f 100644 --- a/Resources/Locale/en-US/implant/implant.ftl +++ b/Resources/Locale/en-US/implant/implant.ftl @@ -4,6 +4,7 @@ implanter-component-implanting-target = {$user} is trying to implant you with so implanter-component-implant-failed = The {$implant} cannot be given to {$target}! implanter-draw-failed-permanent = The {$implant} in {$target} is fused with them and cannot be removed! implanter-draw-failed = You tried to remove an implant but found nothing. +implanter-component-implant-already = {$target} already has the {$implant}! ## UI implanter-draw-text = Draw From 2961bf4375f21e7489bd6ccc35b4fb858f9d2f83 Mon Sep 17 00:00:00 2001 From: SimpleStation14 <130339894+SimpleStation14@users.noreply.github.com> Date: Thu, 20 Jun 2024 15:26:05 -0700 Subject: [PATCH 087/155] Mirror: Bumps LoneOps minimum required players to 20 (#263) ## Mirror of PR #26244: [Bumps LoneOps minimum required players to 20](https://github.com/space-wizards/space-station-14/pull/26244) from space-wizards [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `61e31f4062b568591448ff5be83ba8be851269e9` PR opened by Boaz1111 at 2024-03-18 20:52:10 UTC --- PR changed 1 files with 1 additions and 1 deletions. The PR had the following labels: - No C# ---

Original Body

> > > > ## About the PR > > I bumped LoneOps minimum required players to 20 > ## Why / Balance > > It was at 10, and loneops are extremely dangerous especially if there's no sec. > ## Technical details > > > ## Media > > > - [X] I have added screenshots/videos to this PR showcasing its changes ingame, **or** this PR does not require an ingame showcase > > ## Breaking changes > > > **Changelog** > > > > :cl: Boaz1111 > - tweak: Lone operatives now require a minimum of 20 players to spawn
Co-authored-by: SimpleStation14 --- Resources/Prototypes/GameRules/events.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Resources/Prototypes/GameRules/events.yml b/Resources/Prototypes/GameRules/events.yml index 6812ca14f70..00ad5f54ea9 100644 --- a/Resources/Prototypes/GameRules/events.yml +++ b/Resources/Prototypes/GameRules/events.yml @@ -418,9 +418,9 @@ noSpawn: true components: - type: StationEvent - earliestStart: 60 # DeltaV - was 45 - weight: 3 # DeltaV - was 5 - minimumPlayers: 10 + earliestStart: 60 + weight: 3 + minimumPlayers: 20 reoccurrenceDelay: 30 duration: 1 - type: LoneOpsSpawnRule From d3ed34ff4e91ea5d5a0c766711f865a6917bf394 Mon Sep 17 00:00:00 2001 From: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com> Date: Thu, 20 Jun 2024 16:39:30 -0700 Subject: [PATCH 088/155] Trait Points (#434) # Description Some improvements to loadouts too. --- # TODO - [x] Points logic - [x] Server-side validation - [x] Categorize traits - [x] Assign points to traits - [x] Header costs - [x] Sort entries - [x] Max traits - [x] Communicate max traits - [x] Point bar - [x] Group exclusivity - Black outline on text - [x] Fix existing component whitelists ---

Media

## Accurate except for small details ![image](https://github.com/Simple-Station/Einstein-Engines/assets/77995199/c0ab2fbf-3bce-4e54-81d5-8e546d6b3c0b) ### Something to note: ![image](https://github.com/Simple-Station/Einstein-Engines/assets/77995199/09a3948e-0c9f-4f57-b297-f62063b11845) ![image](https://github.com/Simple-Station/Einstein-Engines/assets/77995199/35d76095-0714-4613-a17b-73df25a9a832) ![image](https://github.com/Simple-Station/Einstein-Engines/assets/77995199/87149e5c-0af2-4ac0-bbde-52f317a008a0)

--- # Changelog :cl: - add: Added trait points - add: Added categories for traits --------- Co-authored-by: VMSolidus --- .../Preferences/UI/HumanoidProfileEditor.xaml | 21 +- .../UI/HumanoidProfileEditor.xaml.cs | 555 ++++++++++++++---- Content.Client/Traits/ParacusiaSystem.cs | 3 +- Content.Server/Flash/FlashSystem.cs | 2 +- .../Events/MassHallucinationsRule.cs | 2 +- .../Traits/Assorted/ParacusiaSystem.cs | 2 + Content.Server/Traits/TraitSystem.cs | 40 +- .../Zombies/ZombieSystem.Transform.cs | 2 +- Content.Shared/CCVar/CCVars.cs | 24 +- .../Prototypes/LoadoutCategoryPrototype.cs | 1 + .../Loadouts/Prototypes/LoadoutPrototype.cs | 6 +- .../Loadouts/Systems/LoadoutRequirements.cs | 375 ------------ .../Loadouts/Systems/LoadoutSystem.cs | 40 +- .../Systems/CharacterRequirements.cs | 529 +++++++++++++++++ .../Systems/CharacterRequirementsSystem.cs | 43 ++ Content.Shared/Drunk/DrunkSystem.cs | 2 +- .../Preferences/HumanoidCharacterProfile.cs | 53 +- .../{ => Components}/AccentlessComponent.cs | 2 +- .../LegsParalyzedComponent.cs | 5 +- .../LightweightDrunkComponent.cs | 4 +- .../{ => Components}/ParacusiaComponent.cs | 3 +- .../PermanentBlindnessComponent.cs | 2 +- .../Traits/Assorted/LegsParalyzedSystem.cs | 58 -- .../{ => Systems}/AccentlessSystem.cs | 8 +- .../Assorted/Systems/LegsParalyzedSystem.cs | 58 ++ .../{ => Systems}/PermanentBlindnessSystem.cs | 20 +- .../{ => Systems}/SharedParacusiaSystem.cs | 2 +- .../Prototypes/TraitCategoryPrototype.cs | 14 + .../Traits/Prototypes/TraitPrototype.cs | 39 ++ Content.Shared/Traits/TraitPrototype.cs | 55 -- .../customization/character-requirements.ftl | 39 ++ .../Locale/en-US/deltav/traits/traits.ftl | 16 +- .../Locale/en-US/loadouts/categories.ftl | 5 +- .../en-US/loadouts/loadout-requirements.ftl | 13 - .../ui/humanoid-profile-editor.ftl | 26 +- .../simplestation14/Traits/disabilities.ftl | 5 +- Resources/Locale/en-US/traits/categories.ftl | 8 + Resources/Locale/en-US/traits/traits.ftl | 47 +- .../Prototypes/DeltaV/Traits/altvision.yml | 8 +- .../Prototypes/DeltaV/Traits/neutral.yml | 7 +- .../Loadouts/Jobs/Heads/captain.yml | 26 +- .../Loadouts/Jobs/Heads/chiefEngineer.yml | 8 +- .../Jobs/Heads/chiefMedicalOfficer.yml | 12 +- .../Loadouts/Jobs/Heads/headOfPersonnel.yml | 18 +- .../Loadouts/Jobs/Heads/headOfSecurity.yml | 30 +- .../Loadouts/Jobs/Heads/quarterMaster.yml | 12 +- .../Loadouts/Jobs/Heads/researchDirector.yml | 10 +- Resources/Prototypes/Loadouts/Jobs/cargo.yml | 4 +- .../Prototypes/Loadouts/Jobs/engineering.yml | 36 +- .../Prototypes/Loadouts/Jobs/medical.yml | 46 +- .../Prototypes/Loadouts/Jobs/science.yml | 18 +- .../Prototypes/Loadouts/Jobs/security.yml | 26 +- .../Prototypes/Loadouts/Jobs/service.yml | 30 +- Resources/Prototypes/Loadouts/categories.yml | 9 +- Resources/Prototypes/Loadouts/uniform.yml | 2 +- .../SimpleStation14/Traits/disabilities.yml | 15 +- Resources/Prototypes/Traits/categories.yml | 19 + Resources/Prototypes/Traits/disabilities.yml | 73 ++- .../Prototypes/Traits/inconveniences.yml | 18 +- Resources/Prototypes/Traits/neutral.yml | 25 +- 60 files changed, 1621 insertions(+), 960 deletions(-) delete mode 100644 Content.Shared/Clothing/Loadouts/Systems/LoadoutRequirements.cs create mode 100644 Content.Shared/Customization/Systems/CharacterRequirements.cs create mode 100644 Content.Shared/Customization/Systems/CharacterRequirementsSystem.cs rename Content.Shared/Traits/Assorted/{ => Components}/AccentlessComponent.cs (89%) rename Content.Shared/Traits/Assorted/{ => Components}/LegsParalyzedComponent.cs (65%) rename Content.Shared/Traits/Assorted/{ => Components}/LightweightDrunkComponent.cs (90%) rename Content.Shared/Traits/Assorted/{ => Components}/ParacusiaComponent.cs (93%) rename Content.Shared/Traits/Assorted/{ => Components}/PermanentBlindnessComponent.cs (81%) delete mode 100644 Content.Shared/Traits/Assorted/LegsParalyzedSystem.cs rename Content.Shared/Traits/Assorted/{ => Systems}/AccentlessSystem.cs (62%) create mode 100644 Content.Shared/Traits/Assorted/Systems/LegsParalyzedSystem.cs rename Content.Shared/Traits/Assorted/{ => Systems}/PermanentBlindnessSystem.cs (59%) rename Content.Shared/Traits/Assorted/{ => Systems}/SharedParacusiaSystem.cs (56%) create mode 100644 Content.Shared/Traits/Prototypes/TraitCategoryPrototype.cs create mode 100644 Content.Shared/Traits/Prototypes/TraitPrototype.cs delete mode 100644 Content.Shared/Traits/TraitPrototype.cs create mode 100644 Resources/Locale/en-US/customization/character-requirements.ftl delete mode 100644 Resources/Locale/en-US/loadouts/loadout-requirements.ftl create mode 100644 Resources/Locale/en-US/traits/categories.ftl create mode 100644 Resources/Prototypes/Traits/categories.yml diff --git a/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml b/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml index 9a70d678310..38d4a411ff3 100644 --- a/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml +++ b/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml @@ -142,18 +142,29 @@ - + - - - +
[ViewVariables] public HumanoidCharacterProfile? LastProfileLoaded; + + /// + /// The height of this humanoid. + /// + [DataField, AutoNetworkedField] + public float Height = 1f; + + /// + /// The width of this humanoid. + /// + [DataField, AutoNetworkedField] + public float Width = 1f; } [DataDefinition] diff --git a/Content.Shared/Humanoid/Prototypes/SpeciesPrototype.cs b/Content.Shared/Humanoid/Prototypes/SpeciesPrototype.cs index 8564ebe8e16..8268d0d7c74 100644 --- a/Content.Shared/Humanoid/Prototypes/SpeciesPrototype.cs +++ b/Content.Shared/Humanoid/Prototypes/SpeciesPrototype.cs @@ -126,6 +126,54 @@ public sealed partial class SpeciesPrototype : IPrototype /// [DataField] public string GuideBookIcon = "SpeciesInfoDefault"; + + /// + /// The minimum height for this species + /// + [DataField] + public float MinHeight = 0.75f; + + /// + /// The default height for this species + /// + [DataField] + public float DefaultHeight = 1f; + + /// + /// The maximum height for this species + /// + [DataField] + public float MaxHeight = 1.25f; + + /// + /// The minimum width for this species + /// + [DataField] + public float MinWidth = 0.7f; + + /// + /// The default width for this species + /// + [DataField] + public float DefaultWidth = 1f; + + /// + /// The maximum width for this species + /// + [DataField] + public float MaxWidth = 1.3f; + + /// + /// The average height in centimeters for this species, used to calculate player facing height values in UI elements + /// + [DataField] + public float AverageHeight = 176.1f; + + /// + /// The average shoulder-to-shoulder width in cm for this species, used to calculate player facing width values in UI elements + /// + [DataField] + public float AverageWidth = 40f; } public enum SpeciesNaming : byte diff --git a/Content.Shared/Humanoid/SharedHumanoidAppearanceSystem.cs b/Content.Shared/Humanoid/SharedHumanoidAppearanceSystem.cs index 4974e283dd5..6062bec8b05 100644 --- a/Content.Shared/Humanoid/SharedHumanoidAppearanceSystem.cs +++ b/Content.Shared/Humanoid/SharedHumanoidAppearanceSystem.cs @@ -1,8 +1,10 @@ using System.Linq; +using System.Numerics; using Content.Shared.Decals; using Content.Shared.Humanoid.Markings; using Content.Shared.Humanoid.Prototypes; using Content.Shared.Preferences; +using Content.Shared.HeightAdjust; using Robust.Shared.GameObjects.Components.Localization; using Robust.Shared.Network; using Robust.Shared.Prototypes; @@ -23,6 +25,7 @@ public abstract class SharedHumanoidAppearanceSystem : EntitySystem [Dependency] private readonly INetManager _netManager = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly MarkingManager _markingManager = default!; + [Dependency] private readonly HeightAdjustSystem _heightAdjust = default!; [ValidatePrototypeId] public const string DefaultSpecies = "Human"; @@ -248,6 +251,64 @@ public void SetSex(EntityUid uid, Sex sex, bool sync = true, HumanoidAppearanceC } } + /// + /// Set the height of a humanoid mob + /// + /// The humanoid mob's UID + /// The height to set the mob to + /// Whether to immediately synchronize this to the humanoid mob, or not + /// Humanoid component of the entity + public void SetHeight(EntityUid uid, float height, bool sync = true, HumanoidAppearanceComponent? humanoid = null) + { + if (!Resolve(uid, ref humanoid) || MathHelper.CloseTo(humanoid.Height, height, 0.001f)) + return; + + var species = _prototypeManager.Index(humanoid.Species); + humanoid.Height = Math.Clamp(height, species.MinHeight, species.MaxHeight); + + if (sync) + Dirty(humanoid); + } + + /// + /// Set the width of a humanoid mob + /// + /// The humanoid mob's UID + /// The width to set the mob to + /// Whether to immediately synchronize this to the humanoid mob, or not + /// Humanoid component of the entity + public void SetWidth(EntityUid uid, float width, bool sync = true, HumanoidAppearanceComponent? humanoid = null) + { + if (!Resolve(uid, ref humanoid) || MathHelper.CloseTo(humanoid.Width, width, 0.001f)) + return; + + var species = _prototypeManager.Index(humanoid.Species); + humanoid.Width = Math.Clamp(width, species.MinWidth, species.MaxWidth); + + if (sync) + Dirty(humanoid); + } + + /// + /// Set the scale of a humanoid mob + /// + /// The humanoid mob's UID + /// The scale to set the mob to + /// Whether to immediately synchronize this to the humanoid mob, or not + /// Humanoid component of the entity + public void SetScale(EntityUid uid, Vector2 scale, bool sync = true, HumanoidAppearanceComponent? humanoid = null) + { + if (!Resolve(uid, ref humanoid)) + return; + + var species = _prototypeManager.Index(humanoid.Species); + humanoid.Height = Math.Clamp(scale.Y, species.MinHeight, species.MaxHeight); + humanoid.Width = Math.Clamp(scale.X, species.MinWidth, species.MaxWidth); + + if (sync) + Dirty(humanoid); + } + /// /// Loads a humanoid character profile directly onto this humanoid mob. /// @@ -329,6 +390,8 @@ public virtual void LoadProfile(EntityUid uid, HumanoidCharacterProfile profile, humanoid.Age = profile.Age; + _heightAdjust.SetScale(uid, new Vector2(profile.Width, profile.Height)); + humanoid.LastProfileLoaded = profile; // DeltaV - let paradox anomaly be cloned Dirty(humanoid); diff --git a/Content.Shared/Preferences/HumanoidCharacterProfile.cs b/Content.Shared/Preferences/HumanoidCharacterProfile.cs index 8cf504582d4..601a62da894 100644 --- a/Content.Shared/Preferences/HumanoidCharacterProfile.cs +++ b/Content.Shared/Preferences/HumanoidCharacterProfile.cs @@ -35,6 +35,8 @@ private HumanoidCharacterProfile( string name, string flavortext, string species, + float height, + float width, int age, Sex sex, Gender gender, @@ -51,6 +53,8 @@ private HumanoidCharacterProfile( Name = name; FlavorText = flavortext; Species = species; + Height = height; + Width = width; Age = age; Sex = sex; Gender = gender; @@ -72,7 +76,7 @@ private HumanoidCharacterProfile( List antagPreferences, List traitPreferences, List loadoutPreferences) - : this(other.Name, other.FlavorText, other.Species, other.Age, other.Sex, other.Gender, other.Appearance, + : this(other.Name, other.FlavorText, other.Species, other.Height, other.Width, other.Age, other.Sex, other.Gender, other.Appearance, other.Clothing, other.Backpack, other.SpawnPriority, jobPriorities, other.PreferenceUnavailable, antagPreferences, traitPreferences, loadoutPreferences) { @@ -90,6 +94,8 @@ public HumanoidCharacterProfile( string name, string flavortext, string species, + float height, + float width, int age, Sex sex, Gender gender, @@ -102,7 +108,7 @@ public HumanoidCharacterProfile( IReadOnlyList antagPreferences, IReadOnlyList traitPreferences, IReadOnlyList loadoutPreferences) - : this(name, flavortext, species, age, sex, gender, appearance, clothing, backpack, spawnPriority, + : this(name, flavortext, species, height, width, age, sex, gender, appearance, clothing, backpack, spawnPriority, new Dictionary(jobPriorities), preferenceUnavailable, new List(antagPreferences), new List(traitPreferences), new List(loadoutPreferences)) @@ -118,6 +124,8 @@ public HumanoidCharacterProfile() : this( "John Doe", "", SharedHumanoidAppearanceSystem.DefaultSpecies, + 1f, + 1f, 18, Sex.Male, Gender.Male, @@ -147,6 +155,8 @@ public static HumanoidCharacterProfile DefaultWithSpecies(string species = Share "John Doe", "", species, + 1f, + 1f, 18, Sex.Male, Gender.Male, @@ -186,10 +196,14 @@ public static HumanoidCharacterProfile RandomWithSpecies(string species = Shared var sex = Sex.Unsexed; var age = 18; + var height = 1f; + var width = 1f; if (prototypeManager.TryIndex(species, out var speciesPrototype)) { sex = random.Pick(speciesPrototype.Sexes); age = random.Next(speciesPrototype.MinAge, speciesPrototype.OldAge); // people don't look and keep making 119 year old characters with zero rp, cap it at middle aged + height = random.NextFloat(speciesPrototype.MinHeight, speciesPrototype.MaxHeight); + width = random.NextFloat(speciesPrototype.MinWidth, speciesPrototype.MaxWidth); } var gender = Gender.Epicene; @@ -206,7 +220,7 @@ public static HumanoidCharacterProfile RandomWithSpecies(string species = Shared var name = GetName(species, gender); - return new HumanoidCharacterProfile(name, "", species, age, sex, gender, + return new HumanoidCharacterProfile(name, "", species, height, width, age, sex, gender, HumanoidCharacterAppearance.Random(species, sex), ClothingPreference.Jumpsuit, BackpackPreference.Backpack, SpawnPriorityPreference.None, new Dictionary @@ -217,8 +231,15 @@ public static HumanoidCharacterProfile RandomWithSpecies(string species = Shared public string Name { get; private set; } public string FlavorText { get; private set; } + [DataField("species")] public string Species { get; private set; } + [DataField("height")] + public float Height { get; private set; } + + [DataField("width")] + public float Width { get; private set; } + [DataField("age")] public int Age { get; private set; } @@ -271,6 +292,15 @@ public HumanoidCharacterProfile WithSpecies(string species) return new(this) { Species = species }; } + public HumanoidCharacterProfile WithHeight(float height) + { + return new(this) { Height = height }; + } + + public HumanoidCharacterProfile WithWidth(float width) + { + return new(this) { Width = width }; + } public HumanoidCharacterProfile WithCharacterAppearance(HumanoidCharacterAppearance appearance) { @@ -396,6 +426,8 @@ public bool MemberwiseEquals(ICharacterProfile maybeOther) if (maybeOther is not HumanoidCharacterProfile other || Name != other.Name || Age != other.Age + || Height != other.Height + || Width != other.Width || Sex != other.Sex || Gender != other.Gender || PreferenceUnavailable != other.PreferenceUnavailable @@ -407,7 +439,6 @@ public bool MemberwiseEquals(ICharacterProfile maybeOther) || !_traitPreferences.SequenceEqual(other._traitPreferences) || !_loadoutPreferences.SequenceEqual(other._loadoutPreferences)) return false; - return Appearance.MemberwiseEquals(other.Appearance); } @@ -495,6 +526,14 @@ public void EnsureValid(IConfigurationManager configManager, IPrototypeManager p flavortext = FormattedMessage.RemoveMarkup(FlavorText); } + var height = Height; + if (speciesPrototype != null) + height = Math.Clamp(Height, speciesPrototype.MinHeight, speciesPrototype.MaxHeight); + + var width = Width; + if (speciesPrototype != null) + width = Math.Clamp(Width, speciesPrototype.MinWidth, speciesPrototype.MaxWidth); + var appearance = HumanoidCharacterAppearance.EnsureValid(Appearance, Species, Sex); var prefsUnavailableMode = PreferenceUnavailable switch @@ -584,6 +623,8 @@ public void EnsureValid(IConfigurationManager configManager, IPrototypeManager p Name = name; FlavorText = flavortext; Age = age; + Height = height; + Width = width; Sex = sex; Gender = gender; Appearance = appearance; @@ -643,12 +684,16 @@ public override int GetHashCode() Clothing, Backpack ), - SpawnPriority, - PreferenceUnavailable, - _jobPriorities, - _antagPreferences, - _traitPreferences, - _loadoutPreferences + HashCode.Combine( + SpawnPriority, + Height, + Width, + PreferenceUnavailable, + _jobPriorities, + _antagPreferences, + _traitPreferences, + _loadoutPreferences + ) ); } } diff --git a/Resources/Locale/en-US/preferences/ui/humanoid-profile-editor.ftl b/Resources/Locale/en-US/preferences/ui/humanoid-profile-editor.ftl index 9b8eb74d969..f0ea0a4a721 100644 --- a/Resources/Locale/en-US/preferences/ui/humanoid-profile-editor.ftl +++ b/Resources/Locale/en-US/preferences/ui/humanoid-profile-editor.ftl @@ -11,6 +11,9 @@ humanoid-profile-editor-sex-female-text = Female humanoid-profile-editor-sex-unsexed-text = None humanoid-profile-editor-age-label = Age: humanoid-profile-editor-skin-color-label = Skin color: +humanoid-profile-editor-height-label = Height: {$height}cm +humanoid-profile-editor-width-label = Width: {$width}cm +humanoid-profile-editor-weight-label = Weight: {$weight}kg humanoid-profile-editor-species-label = Species: humanoid-profile-editor-pronouns-label = Pronouns: humanoid-profile-editor-pronouns-male-text = He / Him diff --git a/Resources/Prototypes/DeltaV/Species/harpy.yml b/Resources/Prototypes/DeltaV/Species/harpy.yml index bcc4dd22c44..384b327ff24 100644 --- a/Resources/Prototypes/DeltaV/Species/harpy.yml +++ b/Resources/Prototypes/DeltaV/Species/harpy.yml @@ -7,6 +7,12 @@ markingLimits: MobHarpyMarkingLimits dollPrototype: MobHarpyDummy skinColoration: HumanToned + minHeight: 0.6 + defaultHeight: 0.8 + maxHeight: 1.1 + minWidth: 0.55 + defaultWidth: 0.8 + maxWidth: 1.15 - type: speciesBaseSprites id: MobHarpySprites diff --git a/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml b/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml index 7afc5cddd70..c5395360187 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml @@ -21,7 +21,6 @@ - type: Sprite noRot: true drawdepth: Mobs - scale: 1, 0.8 - type: Body prototype: Dwarf requiredLegs: 2 @@ -64,6 +63,3 @@ parent: BaseSpeciesDummy id: MobDwarfDummy noSpawn: true - components: - - type: Sprite - scale: 1, 0.8 diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/Oni.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/Oni.yml index 8a0e750abd6..ab3f6f3d1c1 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/Oni.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/Oni.yml @@ -26,7 +26,7 @@ fix1: shape: !type:PhysShapeCircle - radius: 0.42 + radius: 0.35 density: 220 restitution: 0.0 mask: diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/felinid.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/felinid.yml index 2184926b95a..5bc02461eed 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/felinid.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/felinid.yml @@ -9,6 +9,7 @@ scale: 0.8, 0.8 - type: HumanoidAppearance species: Felinid + initial: Felinid - type: Fixtures fixtures: # TODO: This needs a second fixture just for mob collisions. fix1: diff --git a/Resources/Prototypes/Nyanotrasen/Species/Oni.yml b/Resources/Prototypes/Nyanotrasen/Species/Oni.yml index 9cb184b8ef0..ee8be0e5892 100644 --- a/Resources/Prototypes/Nyanotrasen/Species/Oni.yml +++ b/Resources/Prototypes/Nyanotrasen/Species/Oni.yml @@ -11,6 +11,12 @@ femaleFirstNames: names_oni_female lastNames: names_oni_location naming: LastNoFirst + minHeight: 0.9 + defaultHeight: 1.2 + maxHeight: 1.3 + minWidth: 0.85 + defaultWidth: 1.2 + maxWidth: 1.35 - type: markingPoints id: MobOniMarkingLimits diff --git a/Resources/Prototypes/Nyanotrasen/Species/felinid.yml b/Resources/Prototypes/Nyanotrasen/Species/felinid.yml index 754a4ae906b..4751d581746 100644 --- a/Resources/Prototypes/Nyanotrasen/Species/felinid.yml +++ b/Resources/Prototypes/Nyanotrasen/Species/felinid.yml @@ -7,6 +7,12 @@ markingLimits: MobFelinidMarkingLimits dollPrototype: MobFelinidDummy skinColoration: HumanToned + minHeight: 0.65 + defaultHeight: 0.8 + maxHeight: 1.1 + minWidth: 0.6 + defaultWidth: 0.8 + maxWidth: 1.15 - type: markingPoints id: MobFelinidMarkingLimits diff --git a/Resources/Prototypes/SimpleStation14/humanoidProfiles/felinid.yml b/Resources/Prototypes/SimpleStation14/humanoidProfiles/felinid.yml new file mode 100644 index 00000000000..33e6915a78c --- /dev/null +++ b/Resources/Prototypes/SimpleStation14/humanoidProfiles/felinid.yml @@ -0,0 +1,6 @@ +- type: humanoidProfile + id: Felinid + profile: + species: Felinid + height: 0.8 + width: 0.8 diff --git a/Resources/Prototypes/SimpleStation14/humanoidProfiles/oni.yml b/Resources/Prototypes/SimpleStation14/humanoidProfiles/oni.yml new file mode 100644 index 00000000000..1e2d8af1e30 --- /dev/null +++ b/Resources/Prototypes/SimpleStation14/humanoidProfiles/oni.yml @@ -0,0 +1,6 @@ +- type: humanoidProfile + id: Oni + profile: + species: Oni + height: 1.2 + width: 1.2 diff --git a/Resources/Prototypes/Species/dwarf.yml b/Resources/Prototypes/Species/dwarf.yml index 86743ca2d66..d32f1e6476a 100644 --- a/Resources/Prototypes/Species/dwarf.yml +++ b/Resources/Prototypes/Species/dwarf.yml @@ -7,3 +7,9 @@ markingLimits: MobHumanMarkingLimits dollPrototype: MobDwarfDummy skinColoration: HumanToned + minHeight: 0.6 + defaultHeight: 0.8 + maxHeight: 0.8 + minWidth: 0.55 + defaultWidth: 0.8 + maxWidth: 0.85 diff --git a/Resources/Prototypes/Species/reptilian.yml b/Resources/Prototypes/Species/reptilian.yml index f5cf1fa6ebf..752918e2f0c 100644 --- a/Resources/Prototypes/Species/reptilian.yml +++ b/Resources/Prototypes/Species/reptilian.yml @@ -11,6 +11,12 @@ maleFirstNames: names_reptilian_male femaleFirstNames: names_reptilian_female naming: FirstDashFirst + minHeight: 0.7 + defaultHeight: 0.95 + maxHeight: 1.25 + minWidth: 0.65 + defaultWidth: 0.95 + maxWidth: 1.3 - type: speciesBaseSprites id: MobReptilianSprites From 45b5c92bfbab7279efa3ebaeaa2b0dd72fc3158b Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Thu, 27 Jun 2024 17:47:49 +0000 Subject: [PATCH 101/155] Automatic Changelog Update (#458) --- Resources/Changelog/Changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 4196918ca7e..3aea1324fe4 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4245,3 +4245,9 @@ Entries: message: Mid-round events will occur much less often id: 6130 time: '2024-06-25T20:47:09.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: 'Height and Width sliders have been added to character creation. ' + id: 6131 + time: '2024-06-27T17:46:51.0000000+00:00' From 0269efcda3531b8668d513913bee21c4a84c2f11 Mon Sep 17 00:00:00 2001 From: SimpleStation14 <130339894+SimpleStation14@users.noreply.github.com> Date: Sat, 29 Jun 2024 15:46:53 -0700 Subject: [PATCH 102/155] Mirror: Throwing Knives: Syndicate Kit (#310) ## Mirror of PR #26026: [Throwing Knives: Syndicate Kit](https://github.com/space-wizards/space-station-14/pull/26026) from space-wizards [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `393bcbfc1346589075ad960473685c78bdbf46e5` PR opened by UbaserB at 2024-03-12 06:57:41 UTC --- PR changed 13 files with 101 additions and 8 deletions. The PR had the following labels: - No C# - Changes: Sprites ---

Original Body

> > > > ## About the PR > > > This PR adds throwing knives and a syndicate bundle in the bundle category for 6 TC which comes with 4 throwing knives in a box. Each knife does 10 slash + 15 pierce damage on throw, and 5 flash per hit (10 DPS). This makes it better than a kitchen knife, but worse than a combat knife, which is what security is fitted with. > > ## Why / Balance > > > This kit is built for weakening an enemy from a distance (from chasing, etc) while being able to fight back if cornered into a 1v1 CQC fight. Sure, you can kill several people with the kit; hence why it's so expensive, but there are drawbacks. Firstly, once it embeds into a target they are able to pull it out. Secondly, when you are pulling them out of a target, YOU are vulnerable. Thirdly, if you miss your hits the target will probably not die. Good things you have four knives and can stab them to death.. better than punches! > > ## Media > > > - [X] I have added screenshots/videos to this PR showcasing its changes ingame, **or** this PR does not require an ingame showcase > > **It embeds and kills in 4 throws on an unarmoured target.** > ![image](https://github.com/space-wizards/space-station-14/assets/134914314/05f4112d-a08c-4bde-9b34-8a5ecde0b270) > > **Item description.** > ![image](https://github.com/space-wizards/space-station-14/assets/134914314/87704a6e-8501-4f19-a158-bf89d6b4a83e) > > **4 knives.** > ![image](https://github.com/space-wizards/space-station-14/assets/134914314/44dc4c40-add3-46be-b224-b71e2f14f1e9) > > **Kit on uplink.** > [IMG NEEDS UPDATING] > > **Changelog** > > :cl: Ubaser > - add: You can now purchase a set of 4 throwing knives in the uplink as a bundle for 12 TC.
--------- Co-authored-by: SimpleStation14 Co-authored-by: VMSolidus --- .../Locale/en-US/store/uplink-catalog.ftl | 3 ++ .../Catalog/Fills/Boxes/syndicate.yml | 37 +++++++++++++----- .../Prototypes/Catalog/uplink_catalog.yml | 11 ++++++ .../Entities/Objects/Weapons/Melee/knife.yml | 29 ++++++++++++++ .../Objects/Storage/boxes.rsi/meta.json | 17 ++++---- .../Storage/boxes.rsi/throwing_knives.png | Bin 0 -> 1141 bytes .../Objects/Storage/boxicons.rsi/meta.json | 5 ++- .../Storage/boxicons.rsi/throwing_knives.png | Bin 0 -> 1392 bytes .../throwing_knife.rsi/equipped-BELT.png | Bin 0 -> 1289 bytes .../Weapons/Melee/throwing_knife.rsi/icon.png | Bin 0 -> 1593 bytes .../Melee/throwing_knife.rsi/inhand-left.png | Bin 0 -> 1296 bytes .../Melee/throwing_knife.rsi/inhand-right.png | Bin 0 -> 1298 bytes .../Melee/throwing_knife.rsi/meta.json | 26 ++++++++++++ 13 files changed, 110 insertions(+), 18 deletions(-) create mode 100644 Resources/Textures/Objects/Storage/boxes.rsi/throwing_knives.png create mode 100644 Resources/Textures/Objects/Storage/boxicons.rsi/throwing_knives.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/throwing_knife.rsi/equipped-BELT.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/throwing_knife.rsi/icon.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/throwing_knife.rsi/inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/throwing_knife.rsi/inhand-right.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/throwing_knife.rsi/meta.json diff --git a/Resources/Locale/en-US/store/uplink-catalog.ftl b/Resources/Locale/en-US/store/uplink-catalog.ftl index 70eb998bb40..4836a57d6b1 100644 --- a/Resources/Locale/en-US/store/uplink-catalog.ftl +++ b/Resources/Locale/en-US/store/uplink-catalog.ftl @@ -201,6 +201,9 @@ uplink-decoy-kit-desc = State-of-the-art distraction technology straight from RN uplink-chemistry-kit-name = Chemical Synthesis Kit uplink-chemistry-kit-desc = A starter kit for the aspiring chemist, includes toxin and vestine for all your criminal needs! +uplink-knives-kit-name = Throwing Knives Kit +uplink-knives-kit-desc = A set of 4 syndicate branded throwing knives, perfect for embedding into the body of your victims. + uplink-meds-bundle-name = Medical Bundle uplink-meds-bundle-desc = All you need to get your comrades back in the fight: mainly a combat medkit, a defibrillator and three combat medipens. diff --git a/Resources/Prototypes/Catalog/Fills/Boxes/syndicate.yml b/Resources/Prototypes/Catalog/Fills/Boxes/syndicate.yml index 53c526f0339..7b5b05a49a5 100644 --- a/Resources/Prototypes/Catalog/Fills/Boxes/syndicate.yml +++ b/Resources/Prototypes/Catalog/Fills/Boxes/syndicate.yml @@ -38,14 +38,31 @@ name: observations kit suffix: Filled components: - - type: StorageFill - contents: - - id: SyndiCrewMonitorEmpty - amount: 1 - - id: PowerCellHigh - amount: 1 - - id: ClothingEyesGlassesHiddenSecurity - amount: 1 - - id: SurveillanceCameraMonitorCircuitboard - amount: 1 + - type: StorageFill + contents: + - id: SyndiCrewMonitorEmpty + amount: 1 + - id: PowerCellHigh + amount: 1 + - id: ClothingEyesGlassesHiddenSecurity + amount: 1 + - id: SurveillanceCameraMonitorCircuitboard + amount: 1 +- type: entity + parent: BoxCardboard + id: ThrowingKnivesKit + name: throwing knives kit + description: A set of 4 syndicate branded throwing knives, perfect for embedding into the body of your victims. + components: + - type: Storage + grid: + - 0,0,3,1 + - type: StorageFill + contents: + - id: ThrowingKnife + amount: 4 + - type: Sprite + layers: + - state: box_of_doom + - state: throwing_knives diff --git a/Resources/Prototypes/Catalog/uplink_catalog.yml b/Resources/Prototypes/Catalog/uplink_catalog.yml index 1e81cdf2dd1..328ace7ba15 100644 --- a/Resources/Prototypes/Catalog/uplink_catalog.yml +++ b/Resources/Prototypes/Catalog/uplink_catalog.yml @@ -65,6 +65,17 @@ categories: - UplinkWeapons +- type: listing + id: UplinkThrowingKnivesKit + name: uplink-knives-kit-name + description: uplink-knives-kit-desc + icon: { sprite: /Textures/Objects/Storage/boxicons.rsi, state: throwing_knives } + productEntity: ThrowingKnivesKit + cost: + Telecrystal: 6 + categories: + - UplinkWeapons + - type: listing id: UplinkGlovesNorthStar name: uplink-gloves-north-star-name diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml index b5d597715aa..03654061ced 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml @@ -252,3 +252,32 @@ sprite: Objects/Weapons/Melee/uranium_shiv.rsi - type: Sprite sprite: Objects/Weapons/Melee/uranium_shiv.rsi + +- type: entity + name: throwing knife + parent: BaseKnife + id: ThrowingKnife + description: This bloodred knife is very aerodynamic and easy to throw, but good luck trying to fight someone hand-to-hand. + components: + - type: Tag + tags: + - CombatKnife + - Knife + - type: Sprite + sprite: Objects/Weapons/Melee/throwing_knife.rsi + state: icon + - type: MeleeWeapon + wideAnimationRotation: -135 + attackRate: 2 + damage: + types: + Slash: 5 + - type: EmbeddableProjectile + sound: /Audio/Weapons/star_hit.ogg + - type: DamageOtherOnHit + damage: + types: + Slash: 10 + Piercing: 15 + - type: Item + sprite: Objects/Weapons/Melee/throwing_knife.rsi diff --git a/Resources/Textures/Objects/Storage/boxes.rsi/meta.json b/Resources/Textures/Objects/Storage/boxes.rsi/meta.json index 23868a906f4..53ac39b639b 100644 --- a/Resources/Textures/Objects/Storage/boxes.rsi/meta.json +++ b/Resources/Textures/Objects/Storage/boxes.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/cc65477c04f7403ca8a457bd5bae69a01abadbf0, encryptokey was taken from Baystation12 at https://github.com/infinitystation/Baystation12/blob/073f678cdce92edb8fcd55f9ffc9f0523bf31506/icons/obj/radio.dmi and modified by lapatison. boxwidetoy, shelltoy, swab, flare, inflatable, trashbag, magazine, holo and forensic created by potato1234x (github) for ss14 based on toys.rsi, mouth_swab.rsi, flare.rsi, inflatable_wall.rsi, trashbag.rsi, caseless_pistol_mag.rsi, guardians.rsi and bureaucracy.rsi respectively, candle and darts created by TheShuEd for ss14, vials was drawn by Ubaser, evidence_markers by moomoobeef.", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/cc65477c04f7403ca8a457bd5bae69a01abadbf0, encryptokey was taken from Baystation12 at https://github.com/infinitystation/Baystation12/blob/073f678cdce92edb8fcd55f9ffc9f0523bf31506/icons/obj/radio.dmi and modified by lapatison. boxwidetoy, shelltoy, swab, flare, inflatable, trashbag, magazine, holo and forensic created by potato1234x (github) for ss14 based on toys.rsi, mouth_swab.rsi, flare.rsi, inflatable_wall.rsi, trashbag.rsi, caseless_pistol_mag.rsi, guardians.rsi and bureaucracy.rsi respectively, candle and darts created by TheShuEd for ss14, throwing_knives and vials was drawn by Ubaser, evidence_markers by moomoobeef.", "size": { "x": 32, "y": 32 @@ -35,7 +35,7 @@ "name": "sechud" }, { - "name": "bottle" + "name": "bottle" }, { "name": "box" @@ -142,6 +142,9 @@ { "name": "syringe" }, + { + "name": "throwing_knives" + }, { "name": "trashbag" }, @@ -152,12 +155,12 @@ "name": "writing_of_doom" }, { - "name": "headset" - }, + "name": "headset" + }, { - "name": "encryptokey" - }, - { + "name": "encryptokey" + }, + { "name": "inhand-left", "directions": 4 }, diff --git a/Resources/Textures/Objects/Storage/boxes.rsi/throwing_knives.png b/Resources/Textures/Objects/Storage/boxes.rsi/throwing_knives.png new file mode 100644 index 0000000000000000000000000000000000000000..834410a43ef64bd0f3dbfd9d852247d464cbd5f0 GIT binary patch literal 1141 zcmZ`&O=#0#7*2JTtvC;YZit60f{2)WZB~X2X<#$^3EEL=g=`16Hc7XzG+#)*+BgSJ z4^u%!9HT)<=$0%*`di&DU%@%;&UsW-gtBTI$qnX zp%I554$ONq(!q5-B8aU>&&x>89OD#NW(q1SYK&X9d=&3;_*m9Zfpp7;>2PkE@-;Yo z_QZf9eHAp7rsPbPJOXWv>|x?eoDyOrN%FQ@;&S3Z2*h~Qs5XK)Ri);~s@R6_ zMOA=iXl2br4oENw&8P z^E>(cRx~-Ey}kOY>*2{yt7|vq_uqb=K@7Mycl6Mok8_dE*+}P;Zi~1#+Hs@h!h`!> N%S-*k;zHl}`F|_-V#WXf literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Storage/boxicons.rsi/meta.json b/Resources/Textures/Objects/Storage/boxicons.rsi/meta.json index 858fc7c4e54..935b0b9f8b3 100644 --- a/Resources/Textures/Objects/Storage/boxicons.rsi/meta.json +++ b/Resources/Textures/Objects/Storage/boxicons.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from baystation at https://github.com/Baystation12/Baystation12/commit/bc9fbb1722530596e3aa7522ee407280b323ad43, vials drawn by Ubaser, tracks made by Fazansen(https://github.com/Fazansen).", + "copyright": "Taken from baystation at https://github.com/Baystation12/Baystation12/commit/bc9fbb1722530596e3aa7522ee407280b323ad43, throwing_knives and vials are drawn by Ubaser, tracks made by Fazansen(https://github.com/Fazansen).", "size": { "x": 32, "y": 32 @@ -76,6 +76,9 @@ { "name": "syringe" }, + { + "name": "throwing_knives" + }, { "name": "ziptie" }, diff --git a/Resources/Textures/Objects/Storage/boxicons.rsi/throwing_knives.png b/Resources/Textures/Objects/Storage/boxicons.rsi/throwing_knives.png new file mode 100644 index 0000000000000000000000000000000000000000..b2af7bce88436ed9b060cec8bd6f97019537caa9 GIT binary patch literal 1392 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}e5nzhX}-P; zT0k}j5QD&_;K@Lev%n*=n1MlK76>znTPbd0U|=rE42dX-@b$4u&d=3LOvz75)vL%Y z0PC`;umUo3Q%e#RDspr3imfVamB1>jfNYSkzLEl1NlCV?QiN}Sf^&XRs)CuGfu4bq z9hZWFf=y9MnpKdC8&o@xXRDM^Qc_^0uU}qXu2*iXmtT~wZ)j<0sc&GUZ)BtkRH0j3 znOBlnp_^B%3^4>|j!SBBa#3bMNoIbY0?6FNr2NtnTO}osMQ{LdXG${Mo`TY%9I!1Z z$@-}|sky0nCB^!NdWQPg^p#|$AzYYO3=Ixo!03ZyfZ7bOYV#~8Nj3q7lxqdhJy8Dv z9hwZbx40xlA4!3}k%57Qu7Q!Rk)=M|e?aHkq$FFFWR~Qlf&&ijA8-gd=9Hj{g4Bb8 zASV+PvQ{~XdFi%F6}l;@X^EvdB}#Tl`4#c`Y4Iuf`MEaw5QV4)Ktxf^wb94o1RIdY zts;X`i}Q0zK|yb4WM*Om4h|GiL?l3TL}1l{EQ+opAS1sdADF0$GLt>?N>Ymoihv0W zVk6W(+$zw`LRcP}msw(G1T_Fn7)cjW1X(#2m6YcfWru(x10^JJs)CvX300(Y3dscE z7y#x1J1!f2c#g8;T5vFZ7clEqd%8G=L~y$v&<~>y})k!b$Ij_*Boec?7c@H{qFghl3r*G!+?2O}8vz5m}+81h%=^c1PKS83O{n;1@QN}0Z7^Xpv`mc7*YUNB{2a+8@u z6VE;{x%R3Bx1%7%JU02a%^lN%F zE%jh-`3kPxCsNfyV%|*TT~Hz7n*90eUlmUe899+_S!k}&6*}S*Quc$Du?mypn?RQoOuZK{=k6;xQ!K#XyN7Ju|PyZWn zMDN`Biup!2tQbXXfBj=p>r*o7QRYk6np)zppMvt=Rf6n1)cS_o?!bBEpWVW zzxWC@_m8>zq*a)GFBhEM{dHDh?X&sHg;q@=(~U%$M(T(8_%FTW^V-_X+1Qs2Nx-^fT8s6w~6 zGOr}DLN~8i8Da>`9GBGM~RsBTId_|A5Z7NlCUU$t=l91qU45Kj08_%qc+?1*r!G zK~5$pWUX=%^U`gVDs)p)(-KQ_N|fv}^D+|iQgn+l(=$qJ^dTxyO@N4^8f>GF#SJzf zpIb!+r55Msl!C(E&dAKf1{@wJqKH_4=!n3o16dSZM?gk?Nj@-D6=f!S=9Q!t6%+we z7{o@XeYjPin}x7EG%vHn&IoD%nlO?sq!_YtEGj9_FUk%9#|COp;#3AT3KFbHDHW0p zz)=9q2XMaQ|Ei{ z!xO@M-(SD!`>3)=h^2Je2J^D5F{d?VMa9-GwO_78j!x3y?Z zAj4G~+4hAyrlqc*dNa%HszigAoqha~oP8H+mOXafayE9a!9u>WGK-y+(MulJo4!

{Sco1*{# literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Melee/throwing_knife.rsi/icon.png b/Resources/Textures/Objects/Weapons/Melee/throwing_knife.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2c61755b52c35b9138c5aa7f93ec6e71bffa7871 GIT binary patch literal 1593 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}e5nzhX}-P; zT0k}j5QD&_;K@Lev%n*=7^vU~2s2LA=96Y%V9v=5i71Ki^|4CM&(%vz$xlkvtH>$0h^0y1+`OA-|-a&z*EttxDlz$&bOY>=?Nk^)#sNw%$0gl~X?bAC~(f|;Iyo`I4b zmx6+VO;JjkRgjAtR6CGotCUevQedU8UtV6WS8lAAUzDzIXlZGwZ(yWvWTXpJp<7&; zSCUwvn^&w1F$89gOKNd)QD#9&W`3Rm$lS!F{L&IzB_)tWZ~$>9$H0x+$q?iKRIuN_L*U?(xRP#^yHq5LKwUA)=^;+UR4k-v;DstH_|# z;{2RaP`KM!n%RJZ0!0uJ0T2xl*fbyuqH74q$S=tUrl+FJWY4^k)S`kSVA=xPX9Tql zw+eK#5O#;=WtP~%3_ue`(uEW^R*pp_<@rU~A>epG1R_o)P-7qgij+Pfi60#Jz|?QY zWup(zNp@V%mxb~$FfjRex;TbJaJ~)o_78Rx`Ind7Qc!9C=1{nZp6(V`<|%VS?rwO| zv`YFX^9e4~PsSA-Axxj#MNAkEdHI&OX76G=)GMZ}=rs8q-}j!mL07V^3U2f6J^AI# zoq03g8>T;Fdis2i^@6E~7#7=l^gJ%xJ+Y%+lXKaHqX+i&-QKcutMlpi*H_-Xt=jRV zd*1~6f=%ZSTsAiTP#JCb>kaF>`@6Xp?f)>h#U}3b>)o#T)52Oly*PYaWOlU5PTu2@ z`>WU4$ImIf^YZ<&n>TcNwn&$7C%_^!e&PWtFDOYqF~P)RrY}dv#vx z+mV|31?|)Bt-W|{n`iU1w>;<0W?wzjc_fLaDOPdysp~DDCN*y^+BSEpyF4%F)yewt zqVAQxxweIq_1K#BTHaROvFh!q{eFz zK3OI`antZn#mM^|`vUTx9X{?q)pV<`M@~&xT=!J%TJAry)DFy+mU5`JKlnhdpM7PB z*G*T;g$Ycu3|n7Vm0iv>{N65lwq#bQ@Z<*>?{c(v2M9F!WqQbu$Pe0yk&>D6*Hq-gd*mBP7>5; hNwHl1#vxGFf@x_avz=0K&TUY!?dj_0vd$@?2>>-FL7@Nu literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Melee/throwing_knife.rsi/inhand-left.png b/Resources/Textures/Objects/Weapons/Melee/throwing_knife.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..5988d571dc12ca1c485efc87735bbba3ce635640 GIT binary patch literal 1296 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|_);T0(|mmy zw18|5AO?X;!IOa`XMsm#F$06fED&ZCw^H21z`$IV84^(v;p=0SoS&h?X&sHg;q@=(~U%$M(T(8_%FTW^V-_X+1Qs2Nx-^fT8s6w~6 zGOr}DLN~8i8Da>`9GBGM~RsBTId_|A5Z7NlCUU$t=l91qU45Kj08_%qc+?1*r!G zK~5$pWUX=%^U`gVDs)p)(-KQ_N|fv}^D+|iQgn+l(=$qJ^dTxyO@N4^8f>GF#SJzf zpIb!+r55Msl!C(E&dAKf1{@wJqKH_4=!n3o16dSZM?gk?Nj@-D6=f!S=9Q!t6%+we z7{o@XeYjPin}x7EG%vHn&IoD%nlO?sq!_YtEGj9_FUk%9#|COp;#3AT3KFbHDHW0p zz)=9q2X*mm#I&6k+g^W`6|5prbv@a}`Hz?!tn&ug}I zy!5S_wCuBHzq<U{MO(OH#J#lhTTXtx$E#ub`D;1*mDf3?|1NQ# p_;-Kx%DB?a9Dh3C-ua-+#BaJLkNt{4Ehnfn@^tlcS?83{1OP7tpo#zh literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Melee/throwing_knife.rsi/inhand-right.png b/Resources/Textures/Objects/Weapons/Melee/throwing_knife.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..09c015efac56e7935ff49a7488bea47ee21f706a GIT binary patch literal 1298 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|_);T0(|mmy zw18|5AO?X;!IOa`XMsm#F$06fED&ZCw^H21z`$IV84^(v;p=0SoS&h?X&sHg;q@=(~U%$M(T(8_%FTW^V-_X+1Qs2Nx-^fT8s6w~6 zGOr}DLN~8i8Da>`9GBGM~RsBTId_|A5Z7NlCUU$t=l91qU45Kj08_%qc+?1*r!G zK~5$pWUX=%^U`gVDs)p)(-KQ_N|fv}^D+|iQgn+l(=$qJ^dTxyO@N4^8f>GF#SJzf zpIb!+r55Msl!C(E&dAKf1{@wJqKH_4=!n3o16dSZM?gk?Nj@-D6=f!S=9Q!t6%+we z7{o@XeYjPin}x7EG%vHn&IoD%nlO?sq!_YtEGj9_FUk%9#|COp;#3AT3KFbHDHW0p zz)=9q2X1D--Z+E{R|F`Dg_uaXhW6tcgx!1%pi>paAZW9~hvW5@d6(?_2pParSE_c-* z{|Wn+{=e67Ep6>X)9_3GCW~F>Grp7k(%8AgO9|B?RC`-lOEe^_b5>b}$HEbI&63Re#m1*}He%`O5qM s!?yrm-qO5?#!wak2L?tE(OAW5$7GzxZoH}C0;oLlboFyt=akR{01HQ^j{pDw literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Melee/throwing_knife.rsi/meta.json b/Resources/Textures/Objects/Weapons/Melee/throwing_knife.rsi/meta.json new file mode 100644 index 00000000000..373d2d77701 --- /dev/null +++ b/Resources/Textures/Objects/Weapons/Melee/throwing_knife.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Drawn by Ubaser.", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "equipped-BELT", + "directions": 4 + } + ] +} From 6f54ed1b28908264a848c801ae6b86ed27a21734 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 29 Jun 2024 18:26:26 -0700 Subject: [PATCH 103/155] Update Credits (#495) This is an automated Pull Request. This PR updates the GitHub contributors in the credits section. Co-authored-by: SimpleStation Changelogs --- Resources/Credits/GitHub.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Credits/GitHub.txt b/Resources/Credits/GitHub.txt index b5381a4ce29..84796a94662 100644 --- a/Resources/Credits/GitHub.txt +++ b/Resources/Credits/GitHub.txt @@ -1 +1 @@ -0x6273, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 4dplanner, 612git, 778b, Ablankmann, Acruid, actioninja, adamsong, Admiral-Obvious-001, Adrian16199, Aerocrux, Aexxie, africalimedrop, Agoichi, Ahion, AJCM-git, AjexRose, Alekshhh, AlexMorgan3817, AlmondFlour, AlphaQwerty, Altoids1, amylizzle, ancientpower, ArchPigeon, Arendian, arimah, Arteben, AruMoon, as334, AsikKEsel, asperger-sind, aspiringLich, avghdev, AzzyIsNotHere, BananaFlambe, BasedUser, BGare, BingoJohnson-zz, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, Boaz1111, BobdaBiscuit, brainfood1183, Brandon-Huu, Bribrooo, Bright0, brndd, BubblegumBlue, BYONDFuckery, c4llv07e, CaasGit, CakeQ, CaptainSqrBeard, Carbonhell, Carolyn3114, casperr04, CatTheSystem, Centronias, chairbender, Charlese2, Cheackraze, cheesePizza2, Chief-Engineer, chromiumboy, Chronophylos, clement-or, Clyybber, ColdAutumnRain, Colin-Tel, collinlunn, ComicIronic, coolmankid12345, corentt, crazybrain23, creadth, CrigCrag, Crotalus, CrudeWax, CrzyPotato, Cyberboss, d34d10cc, Daemon, daerSeebaer, dahnte, dakamakat, dakimasu, DamianX, DangerRevolution, daniel-cr, Darkenson, DawBla, dch-GH, Deahaka, DEATHB4DEFEAT, DeathCamel58, deathride58, DebugOk, Decappi, deepdarkdepths, Delete69, deltanedas, DeltaV-Bot, DerbyX, DoctorBeard, DogZeroX, dontbetank, Doru991, DoubleRiceEddiedd, DrMelon, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, Duddino, Dutch-VanDerLinde, Easypoller, eclips_e, EdenTheLiznerd, EEASAS, Efruit, ElectroSR, elthundercloud, Emisse, EmoGarbage404, Endecc, enumerate0, eoineoineoin, ERORR404V1, Errant-4, estacaoespacialpirata, exincore, exp111, Fahasor, FairlySadPanda, ficcialfaint, Fildrance, FillerVK, Fishfish458, Flareguy, FluffiestFloof, FluidRock, FoLoKe, fooberticus, Fortune117, FoxxoTrystan, freeman2651, Fromoriss, FungiFellow, GalacticChimp, gbasood, Geekyhobo, Genkail, Git-Nivrak, github-actions[bot], gituhabu, GNF54, Golinth, GoodWheatley, Gotimanga, graevy, GreyMario, Guess-My-Name, gusxyz, h3half, Hanzdegloker, Hardly3D, harikattar, Hebiman, Henry12116, HerCoyote23, Hmeister-real, HoofedEar, hord-brayden, hubismal, Hugal31, Hyenh, iacore, IamVelcroboy, icekot8, igorsaux, ike709, Illiux, Ilya246, IlyaElDunaev, Injazz, Insineer, IntegerTempest, Interrobang01, IProduceWidgets, ItsMeThom, j-giebel, Jackal298, Jackrost, jamessimo, janekvap, JerryImMouse, Jessetriesagain, jessicamaybe, Jezithyr, jicksaw, JiimBob, JoeHammad1844, joelhed, JohnGinnane, johnku1, joshepvodka, jproads, Jrpl, juliangiebel, JustArt1m, JustCone14, JustinTether, JustinTrotter, KaiShibaa, kalane15, kalanosh, KEEYNy, Keikiru, Kelrak, kerisargit, keronshb, KIBORG04, Killerqu00, KingFroozy, kira-er, Kit0vras, KittenColony, Kmc2000, Ko4ergaPunk, komunre, koteq, Krunklehorn, Kukutis96513, kxvvv, Lamrr, LankLTE, lapatison, Leander-0, leonardo-dabepis, LetterN, Level10Cybermancer, lever1209, LightVillet, liltenhead, LittleBuilderJane, Lomcastar, LordCarve, LordEclipse, LovelyLophi, LudwigVonChesterfield, Lukasz825700516, lunarcomets, luringens, lvvova1, lzimann, lzk228, M3739, MACMAN2003, Macoron, MagnusCrowe, ManelNavola, matthst, Matz05, MehimoNemo, MeltedPixel, MemeProof, Menshin, Mervill, metalgearsloth, mhamsterr, MilenVolf, Minty642, Mirino97, mirrorcult, misandrie, MishaUnity, MisterMecky, Mith-randalf, Moneyl, Moomoobeef, moony, Morb0, Mr0maks, musicmanvr, Myakot, Myctai, N3X15, Nairodian, Naive817, namespace-Memory, NickPowers43, nikthechampiongr, Nimfar11, Nirnael, nmajask, nok-ko, Nopey, notafet, notquitehadouken, noudoit, noverd, nuke-haus, NULL882, OCOtheOmega, OctoRocket, OldDanceJacket, onoira, Owai-Seek, pali6, Pangogie, patrikturi, PaulRitter, Peptide90, peptron1, Phantom-Lily, PHCodes, PixelTheKermit, PJB3005, Plykiya, pofitlo, pointer-to-null, PolterTzi, PoorMansDreams, potato1234x, ProfanedBane, PrPleGoo, ps3moira, Psychpsyo, psykzz, PuroSlavKing, quatre, QuietlyWhisper, qwerltaz, Radosvik, Radrark, Rainbeon, Rainfey, Rane, ravage123321, rbertoche, Redict, RedlineTriad, RednoWCirabrab, RemberBM, RemieRichards, RemTim, rene-descartes2021, RiceMar1244, RieBi, Rinkashikachi, Rockdtben, rolfero, rosieposieeee, Saakra, Samsterious, SaphireLattice, ScalyChimp, scrato, Scribbles0, Serkket, SethLafuente, ShadowCommander, Shadowtheprotogen546, SignalWalker, SimpleStation14, Simyon264, SirDragooon, Sirionaut, siyengar04, Skarletto, Skrauz, Skyedra, SlamBamActionman, slarticodefast, Slava0135, Snowni, snowsignal, SonicHDC, SoulSloth, SpaceManiac, SpeltIncorrectyl, spoogemonster, ssdaniel24, Stealthbomber16, stellar-novas, StrawberryMoses, SweptWasTaken, Szunti, TadJohnson00, takemysoult, TaralGit, Tayrtahn, tday93, TekuNut, TemporalOroboros, tentekal, tgrkzus, thatrandomcanadianguy, TheArturZh, theashtronaut, thedraccx, themias, Theomund, theOperand, TheShuEd, TimrodDX, Titian3, tkdrg, tmtmtl30, tom-leys, tomasalves8, Tomeno, Tornado-Technology, tosatur, Tryded, TsjipTsjip, Tunguso4ka, TurboTrackerss14, Tyler-IN, Tyzemol, UbaserB, UKNOWH, UnicornOnLSD, Uriende, UristMcDorf, Vaaankas, Varen, VasilisThePikachu, veliebm, Veritius, Verslebas, VigersRay, Visne, VMSolidus, volundr-, Voomra, Vordenburg, vulppine, waylon531, weaversam8, Willhelm53, wixoaGit, WlarusFromDaSpace, wrexbe, xRiriq, yathxyz, Ygg01, YotaXP, YuriyKiss, zach-hill, Zandario, Zap527, ZelteHonor, zerorulez, zionnBE, zlodo, ZNixian, ZoldorfTheWizard, Zumorica, Zymem +0x6273, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 4dplanner, 612git, 778b, Ablankmann, Acruid, actioninja, adamsong, Admiral-Obvious-001, Adrian16199, Aerocrux, Aexxie, africalimedrop, Agoichi, Ahion, AJCM-git, AjexRose, Alekshhh, AlexMorgan3817, AlmondFlour, AlphaQwerty, Altoids1, amylizzle, ancientpower, ArchPigeon, Arendian, arimah, Arteben, AruMoon, as334, AsikKEsel, asperger-sind, aspiringLich, avghdev, AzzyIsNotHere, BananaFlambe, BasedUser, BGare, BingoJohnson-zz, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, Boaz1111, BobdaBiscuit, brainfood1183, Brandon-Huu, Bribrooo, Bright0, brndd, BubblegumBlue, BYONDFuckery, c4llv07e, CaasGit, CakeQ, CaptainSqrBeard, Carbonhell, Carolyn3114, casperr04, CatTheSystem, Centronias, chairbender, Charlese2, Cheackraze, cheesePizza2, Chief-Engineer, chromiumboy, Chronophylos, clement-or, Clyybber, ColdAutumnRain, Colin-Tel, collinlunn, ComicIronic, coolmankid12345, corentt, crazybrain23, creadth, CrigCrag, Crotalus, CrudeWax, CrzyPotato, Cyberboss, d34d10cc, Daemon, daerSeebaer, dahnte, dakamakat, dakimasu, DamianX, DangerRevolution, daniel-cr, Darkenson, DawBla, dch-GH, Deahaka, DEATHB4DEFEAT, DeathCamel58, deathride58, DebugOk, Decappi, deepdarkdepths, Delete69, deltanedas, DeltaV-Bot, DerbyX, DoctorBeard, DogZeroX, dontbetank, Doru991, DoubleRiceEddiedd, DrMelon, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, Duddino, Dutch-VanDerLinde, Easypoller, eclips_e, EdenTheLiznerd, EEASAS, Efruit, ElectroSR, elthundercloud, Emisse, EmoGarbage404, Endecc, enumerate0, eoineoineoin, ERORR404V1, Errant-4, estacaoespacialpirata, exincore, exp111, Fahasor, FairlySadPanda, ficcialfaint, Fildrance, FillerVK, Fishfish458, Flareguy, FluffiestFloof, FluidRock, FoLoKe, fooberticus, Fortune117, FoxxoTrystan, freeman2651, Fromoriss, FungiFellow, GalacticChimp, gbasood, Geekyhobo, Genkail, geraeumig, Git-Nivrak, github-actions[bot], gituhabu, GNF54, Golinth, GoodWheatley, Gotimanga, graevy, GreyMario, Guess-My-Name, gusxyz, h3half, Hanzdegloker, Hardly3D, harikattar, Hebiman, Henry12116, HerCoyote23, Hmeister-real, HoofedEar, hord-brayden, hubismal, Hugal31, Hyenh, iacore, IamVelcroboy, icekot8, igorsaux, ike709, Illiux, Ilya246, IlyaElDunaev, Injazz, Insineer, IntegerTempest, Interrobang01, IProduceWidgets, ItsMeThom, j-giebel, Jackal298, Jackrost, jamessimo, janekvap, JerryImMouse, Jessetriesagain, jessicamaybe, Jezithyr, jicksaw, JiimBob, JoeHammad1844, joelhed, JohnGinnane, johnku1, joshepvodka, jproads, Jrpl, juliangiebel, JustArt1m, JustCone14, JustinTether, JustinTrotter, KaiShibaa, kalane15, kalanosh, KEEYNy, Keikiru, Kelrak, kerisargit, keronshb, KIBORG04, Killerqu00, KingFroozy, kira-er, Kit0vras, KittenColony, Kmc2000, Ko4ergaPunk, komunre, koteq, Krunklehorn, Kukutis96513, kxvvv, Lamrr, LankLTE, lapatison, Leander-0, leonardo-dabepis, LetterN, Level10Cybermancer, lever1209, LightVillet, liltenhead, LittleBuilderJane, Lomcastar, LordCarve, LordEclipse, LovelyLophi, LudwigVonChesterfield, Lukasz825700516, lunarcomets, luringens, lvvova1, lzimann, lzk228, M3739, MACMAN2003, Macoron, MagnusCrowe, ManelNavola, matthst, Matz05, MehimoNemo, MeltedPixel, MemeProof, Menshin, Mervill, metalgearsloth, mhamsterr, MilenVolf, Minty642, Mirino97, mirrorcult, misandrie, MishaUnity, MisterMecky, Mith-randalf, Moneyl, Moomoobeef, moony, Morb0, Mr0maks, musicmanvr, Myakot, Myctai, N3X15, Nairodian, Naive817, namespace-Memory, NickPowers43, nikthechampiongr, Nimfar11, Nirnael, nmajask, nok-ko, Nopey, notafet, notquitehadouken, noudoit, noverd, nuke-haus, NULL882, OCOtheOmega, OctoRocket, OldDanceJacket, onoira, Owai-Seek, pali6, Pangogie, patrikturi, PaulRitter, Peptide90, peptron1, Phantom-Lily, PHCodes, PixelTheKermit, PJB3005, Plykiya, pofitlo, pointer-to-null, PolterTzi, PoorMansDreams, potato1234x, ProfanedBane, PrPleGoo, ps3moira, Psychpsyo, psykzz, PuroSlavKing, quatre, QuietlyWhisper, qwerltaz, Radosvik, Radrark, Rainbeon, Rainfey, Rane, ravage123321, rbertoche, Redict, RedlineTriad, RednoWCirabrab, RemberBM, RemieRichards, RemTim, rene-descartes2021, RiceMar1244, RieBi, Rinkashikachi, Rockdtben, rolfero, rosieposieeee, Saakra, Samsterious, SaphireLattice, ScalyChimp, scrato, Scribbles0, Serkket, SethLafuente, ShadowCommander, Shadowtheprotogen546, SignalWalker, SimpleStation14, Simyon264, SirDragooon, Sirionaut, siyengar04, Skarletto, Skrauz, Skyedra, SlamBamActionman, slarticodefast, Slava0135, Snowni, snowsignal, SonicHDC, SoulSloth, SpaceManiac, SpeltIncorrectyl, spoogemonster, ssdaniel24, Stealthbomber16, stellar-novas, StrawberryMoses, SweptWasTaken, Szunti, TadJohnson00, takemysoult, TaralGit, Tayrtahn, tday93, TekuNut, TemporalOroboros, tentekal, tgrkzus, thatrandomcanadianguy, TheArturZh, theashtronaut, thedraccx, themias, Theomund, theOperand, TheShuEd, TimrodDX, Titian3, tkdrg, tmtmtl30, tom-leys, tomasalves8, Tomeno, Tornado-Technology, tosatur, Tryded, TsjipTsjip, Tunguso4ka, TurboTrackerss14, Tyler-IN, Tyzemol, UbaserB, UKNOWH, UnicornOnLSD, Uriende, UristMcDorf, Vaaankas, Varen, VasilisThePikachu, veliebm, Veritius, Verslebas, VigersRay, Visne, VMSolidus, volundr-, Voomra, Vordenburg, vulppine, waylon531, weaversam8, Willhelm53, wixoaGit, WlarusFromDaSpace, wrexbe, xRiriq, yathxyz, Ygg01, YotaXP, YuriyKiss, zach-hill, Zandario, Zap527, ZelteHonor, zerorulez, zionnBE, zlodo, ZNixian, ZoldorfTheWizard, Zumorica, Zymem From f439eb70b897cd2f1424b1eed778b8a804c8c948 Mon Sep 17 00:00:00 2001 From: Mnemotechnican <69920617+Mnemotechnician@users.noreply.github.com> Date: Sun, 30 Jun 2024 21:22:28 +0300 Subject: [PATCH 104/155] Add Equip Delays to Clothing (#499) # Description For centuries SS14 had equip and unequip delays on the clothing component, and yet that feature remained unused and unheard of, not even nyanotrasen/deltav used it when designing shock collars and headcages, whose descriptions clearly suggested they should take time to take off. For centuries salvage specialists could safely swap suits in space. For centuries you could accidentally unequip your eva suit mid-spacewalk and die. Now the time has come. The time when we change it. This adds equip and unequip delays to the base clothing item. The currently chosen time is half a second - it's meant to not be too annoying, but at the same time prevent people from being able to instantly swap clothes, headsets, other things with a single click. EVA suits take 1.5 seconds to equip and 1 second to take off, so to swap EVA suits, you will have to expose your body to the dangers of space for at least 1.5 seconds. For hardsuits, both values are increased to 2.5 seconds. The values are not final and this PR will probably need polishing before it can be merged - for example, while recording the second preview video, I discovered that jetpacks do not inherit from base clothing and thus do not inherit the delays. There's probably way more such items. --- # TODO Add equip/unequip delays to: - [X] most basic clothing items - [X] hardsuits/softsuits - [X] special items (currently headcages and shock collars, possibly more later?) - [ ] Everything that was missed by the above ---

Media

Basics https://github.com/Simple-Station/Einstein-Engines/assets/69920617/3fc900b8-ee13-4968-bf5d-cddeb9a141b6 Hardsuits, eva suits, shock collars, headcages + demonstration that aghost stripping is unaffected. https://github.com/Simple-Station/Einstein-Engines/assets/69920617/a536578f-2ac3-40e1-9b27-3b167e006397

--- # Changelog :cl: - add: Most items now take time to equip and unequip, especially space suits. --- .../Entities/Clothing/OuterClothing/base_clothingouter.yml | 6 ++++++ Resources/Prototypes/Entities/Clothing/base_clothing.yml | 3 +++ .../Prototypes/Nyanotrasen/Entities/Clothing/Head/hats.yml | 2 ++ .../Nyanotrasen/Entities/Objects/Devices/shock_collar.yml | 2 ++ 4 files changed, 13 insertions(+) diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml index 13524efa9e6..902c57418e4 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml @@ -93,6 +93,9 @@ - Hardsuit - WhitelistChameleon - HidesHarpyWings #DeltaV: Used by harpies to help render their hardsuit sprites + - type: Clothing + equipDelay: 2.5 # Hardsuits are heavy and take a while to put on/off. + unequipDelay: 2.5 - type: entity abstract: true @@ -114,6 +117,9 @@ - type: Tag tags: - HidesHarpyWings #DeltaV: Used by harpies to help render their hardsuit sprites + - type: Clothing + equipDelay: 1.25 # Softsuits are easier to put on and off + unequipDelay: 1 - type: entity parent: ClothingOuterBase diff --git a/Resources/Prototypes/Entities/Clothing/base_clothing.yml b/Resources/Prototypes/Entities/Clothing/base_clothing.yml index 92a698dd301..810ada5429d 100644 --- a/Resources/Prototypes/Entities/Clothing/base_clothing.yml +++ b/Resources/Prototypes/Entities/Clothing/base_clothing.yml @@ -11,6 +11,9 @@ - WhitelistChameleon - type: StaticPrice price: 15 + - type: Clothing + equipDelay: 0.5 + unequipDelay: 0.5 - type: entity abstract: true diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Head/hats.yml b/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Head/hats.yml index 8278114d267..2cd9785d989 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Head/hats.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Head/hats.yml @@ -99,6 +99,8 @@ sprite: Nyanotrasen/Clothing/Head/Hats/cage.rsi - type: Clothing sprite: Nyanotrasen/Clothing/Head/Hats/cage.rsi + equipDelay: 0.5 + unequipDelay: 6 - type: HeadCage - type: entity diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Devices/shock_collar.yml b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Devices/shock_collar.yml index 35cdcae6589..1266a721fe2 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Devices/shock_collar.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Devices/shock_collar.yml @@ -8,6 +8,8 @@ sprite: Nyanotrasen/Clothing/Neck/Misc/shock.rsi - type: Clothing sprite: Nyanotrasen/Clothing/Neck/Misc/shock.rsi + equipDelay: 1 + unequipDelay: 10 # It's a collar meant to be used on prisoners (or not), so it probably has some sort of safety. - type: ShockCollar - type: UseDelay delay: 3 # DeltaV: prevent clocks instakilling people From 7c83c8b30c016b4f457d8d7398c282d9cba5a0da Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Sun, 30 Jun 2024 18:22:48 +0000 Subject: [PATCH 105/155] Automatic Changelog Update (#499) --- Resources/Changelog/Changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 3aea1324fe4..6fe7b0ff689 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4251,3 +4251,9 @@ Entries: message: 'Height and Width sliders have been added to character creation. ' id: 6131 time: '2024-06-27T17:46:51.0000000+00:00' +- author: Mnemotechnician + changes: + - type: Add + message: Most items now take time to equip and unequip, especially space suits. + id: 6132 + time: '2024-06-30T18:22:28.0000000+00:00' From 89a6bb3ab5897da04c0526c32ff408b90bfc70fc Mon Sep 17 00:00:00 2001 From: SimpleStation14 <130339894+SimpleStation14@users.noreply.github.com> Date: Mon, 1 Jul 2024 11:37:45 -0700 Subject: [PATCH 106/155] Mirror: StrippableSystem doafter overhaul (#205) ## Mirror of PR #25994: [StrippableSystem doafter overhaul](https://github.com/space-wizards/space-station-14/pull/25994) from space-wizards [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `41ca8f3dfcb986432e1e509247bf239cac137836` PR opened by Krunklehorn at 2024-03-11 12:36:28 UTC --- PR changed 7 files with 465 additions and 305 deletions. The PR had the following labels: - Status: Needs Review ---

Original Body

> ## About the PR > > Refactors Strippable DoAfter events to make them synchronous and organized. > > > ## Technical details > > ### Strippable System & Component > - Synchronous DoAfters > - Made use of `TimeSpan`, `GetStripTimeModifiers()` and `ByRefEvent` > - Reorganized checks, removed some redundant ones > - Resolve pattern where useful > - Added more asserts > - Lots of cleanup > > The DoAfters were grouped under one event to avoid copy-pasting eight separate cancel checks, asserts and function signatures. > > Let me know if this is bad for performance and I'll roll them out instead. > > > ## Media > > - [x] I have added screenshots/videos to this PR showcasing its changes ingame, **or** this PR does not require an ingame showcase > > > ## Breaking changes > > ### TimeSpans > `ThievingComponent`, `InventoryTemplatePrototype` and `ToggleableClothingSystem` use `TimeSpan` in places where they intersect with `StrippableComponent`. > > > **Changelog** > > N/A >
Signed-off-by: VMSolidus Co-authored-by: SimpleStation14 Co-authored-by: VMSolidus --- Content.Server/Strip/StrippableSystem.cs | 676 +++++++++++------- .../EntitySystems/ToggleableClothingSystem.cs | 2 +- .../Inventory/InventoryTemplatePrototype.cs | 2 +- .../Strip/Components/StrippableComponent.cs | 81 +-- .../Strip/Components/ThievingComponent.cs | 2 +- .../Strip/SharedStrippableSystem.cs | 6 +- Content.Shared/Strip/ThievingSystem.cs | 1 + 7 files changed, 465 insertions(+), 305 deletions(-) diff --git a/Content.Server/Strip/StrippableSystem.cs b/Content.Server/Strip/StrippableSystem.cs index 96b2ecc00c6..950411a8e2c 100644 --- a/Content.Server/Strip/StrippableSystem.cs +++ b/Content.Server/Strip/StrippableSystem.cs @@ -1,4 +1,3 @@ -using System.Linq; using Content.Server.Administration.Logs; using Content.Server.Ensnaring; using Content.Shared.CombatMode; @@ -21,18 +20,21 @@ using Robust.Server.GameObjects; using Robust.Shared.Player; using Robust.Shared.Utility; +using System.Linq; namespace Content.Server.Strip { public sealed class StrippableSystem : SharedStrippableSystem { - [Dependency] private readonly SharedCuffableSystem _cuffable = default!; - [Dependency] private readonly SharedHandsSystem _handsSystem = default!; [Dependency] private readonly InventorySystem _inventorySystem = default!; - [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; - [Dependency] private readonly SharedPopupSystem _popup = default!; - [Dependency] private readonly EnsnareableSystem _ensnaring = default!; + [Dependency] private readonly EnsnareableSystem _ensnaringSystem = default!; [Dependency] private readonly UserInterfaceSystem _userInterfaceSystem = default!; + + [Dependency] private readonly SharedCuffableSystem _cuffableSystem = default!; + [Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!; + [Dependency] private readonly SharedHandsSystem _handsSystem = default!; + [Dependency] private readonly SharedPopupSystem _popupSystem = default!; + [Dependency] private readonly IAdminLogManager _adminLogger = default!; // TODO: ECS popups. Not all of these have ECS equivalents yet. @@ -48,64 +50,58 @@ public override void Initialize() // BUI SubscribeLocalEvent(OnStripButtonPressed); SubscribeLocalEvent(OnStripEnsnareMessage); + + // DoAfters + SubscribeLocalEvent>(OnStrippableDoAfterRunning); + SubscribeLocalEvent(OnStrippableDoAfterFinished); } - private void OnStripEnsnareMessage(EntityUid uid, EnsnareableComponent component, StrippingEnsnareButtonPressed args) + private void AddStripVerb(EntityUid uid, StrippableComponent component, GetVerbsEvent args) { - if (args.Session.AttachedEntity is not {Valid: true} user) + if (args.Hands == null || !args.CanAccess || !args.CanInteract || args.Target == args.User) return; - foreach (var entity in component.Container.ContainedEntities) + if (!HasComp(args.User)) + return; + + Verb verb = new() { - if (!TryComp(entity, out var ensnaring)) - continue; + Text = Loc.GetString("strip-verb-get-data-text"), + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/outfit.svg.192dpi.png")), + Act = () => StartOpeningStripper(args.User, (uid, component), true), + }; - _ensnaring.TryFree(uid, user, entity, ensnaring); - return; - } + args.Verbs.Add(verb); } - private void OnStripButtonPressed(Entity strippable, ref StrippingSlotButtonPressed args) + private void AddStripExamineVerb(EntityUid uid, StrippableComponent component, GetVerbsEvent args) { - if (args.Session.AttachedEntity is not {Valid: true} user || - !TryComp(user, out var userHands)) - return; - - if (args.IsHand) - { - StripHand(user, args.Slot, strippable, userHands); + if (args.Hands == null || !args.CanAccess || !args.CanInteract || args.Target == args.User) return; - } - if (!TryComp(strippable, out var inventory)) + if (!HasComp(args.User)) return; - var hasEnt = _inventorySystem.TryGetSlotEntity(strippable, args.Slot, out var held, inventory); + ExamineVerb verb = new() + { + Text = Loc.GetString("strip-verb-get-data-text"), + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/outfit.svg.192dpi.png")), + Act = () => StartOpeningStripper(args.User, (uid, component), true), + Category = VerbCategory.Examine, + }; - if (userHands.ActiveHandEntity != null && !hasEnt) - PlaceActiveHandItemInInventory(user, strippable, userHands.ActiveHandEntity.Value, args.Slot, strippable); - else if (userHands.ActiveHandEntity == null && hasEnt) - TakeItemFromInventory(user, strippable, held!.Value, args.Slot, strippable); + args.Verbs.Add(verb); } - private void StripHand(EntityUid user, string handId, Entity target, HandsComponent userHands) + private void OnActivateInWorld(EntityUid uid, StrippableComponent component, ActivateInWorldEvent args) { - if (!_handsSystem.TryGetHand(target, handId, out var hand)) + if (args.Target == args.User) return; - // is the target a handcuff? - if (TryComp(hand.HeldEntity, out VirtualItemComponent? virt) - && TryComp(target, out CuffableComponent? cuff) - && _cuffable.GetAllCuffs(cuff).Contains(virt.BlockingEntity)) - { - _cuffable.TryUncuff(target, user, virt.BlockingEntity, cuffable: cuff); + if (!HasComp(args.User)) return; - } - if (userHands.ActiveHandEntity != null && hand.HeldEntity == null) - PlaceActiveHandItemInHands(user, target, userHands.ActiveHandEntity.Value, handId, target); - else if (userHands.ActiveHandEntity == null && hand.HeldEntity != null) - TakeItemFromHands(user, target, hand.HeldEntity.Value, handId, target); + StartOpeningStripper(args.User, (uid, component)); } public override void StartOpeningStripper(EntityUid user, Entity strippable, bool openInCombat = false) @@ -123,352 +119,514 @@ public override void StartOpeningStripper(EntityUid user, Entity args) + private void OnStripButtonPressed(Entity strippable, ref StrippingSlotButtonPressed args) { - if (args.Hands == null || !args.CanAccess || !args.CanInteract || args.Target == args.User) + if (args.Session.AttachedEntity is not { Valid: true } user || + !TryComp(user, out var userHands) || + !TryComp(strippable.Owner, out var targetHands)) return; - if (!HasComp(args.User)) + if (args.IsHand) + { + StripHand((user, userHands), (strippable.Owner, targetHands), args.Slot, strippable); return; + } - Verb verb = new() - { - Text = Loc.GetString("strip-verb-get-data-text"), - Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/VerbIcons/outfit.svg.192dpi.png")), - Act = () => StartOpeningStripper(args.User, (uid, component), true), - }; - args.Verbs.Add(verb); + if (!TryComp(strippable, out var inventory)) + return; + + var hasEnt = _inventorySystem.TryGetSlotEntity(strippable, args.Slot, out var held, inventory); + + if (userHands.ActiveHandEntity != null && !hasEnt) + StartStripInsertInventory((user, userHands), strippable.Owner, userHands.ActiveHandEntity.Value, args.Slot); + else if (userHands.ActiveHandEntity == null && hasEnt) + StartStripRemoveInventory(user, strippable.Owner, held!.Value, args.Slot); } - private void AddStripExamineVerb(EntityUid uid, StrippableComponent component, GetVerbsEvent args) + private void StripHand( + Entity user, + Entity target, + string handId, + StrippableComponent? targetStrippable) { - if (args.Hands == null || !args.CanAccess || !args.CanInteract || args.Target == args.User) + if (!Resolve(user, ref user.Comp) || + !Resolve(target, ref target.Comp) || + !Resolve(target, ref targetStrippable)) return; - if (!HasComp(args.User)) + if (!_handsSystem.TryGetHand(target.Owner, handId, out var handSlot)) return; - ExamineVerb verb = new() + // Is the target a handcuff? + if (TryComp(handSlot.HeldEntity, out var virtualItem) && + TryComp(target.Owner, out var cuffable) && + _cuffableSystem.GetAllCuffs(cuffable).Contains(virtualItem.BlockingEntity)) { - Text = Loc.GetString("strip-verb-get-data-text"), - Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/VerbIcons/outfit.svg.192dpi.png")), - Act = () => StartOpeningStripper(args.User, (uid, component), true), - Category = VerbCategory.Examine, - }; + _cuffableSystem.TryUncuff(target.Owner, user, virtualItem.BlockingEntity, cuffable); + return; + } - args.Verbs.Add(verb); + if (user.Comp.ActiveHandEntity != null && handSlot.HeldEntity == null) + StartStripInsertHand(user, target, user.Comp.ActiveHandEntity.Value, handId, targetStrippable); + else if (user.Comp.ActiveHandEntity == null && handSlot.HeldEntity != null) + StartStripRemoveHand(user, target, handSlot.HeldEntity.Value, handId, targetStrippable); } - private void OnActivateInWorld(EntityUid uid, StrippableComponent component, ActivateInWorldEvent args) + private void OnStripEnsnareMessage(EntityUid uid, EnsnareableComponent component, StrippingEnsnareButtonPressed args) { - if (args.Target == args.User) + if (args.Session.AttachedEntity is not { Valid: true } user) return; - if (!HasComp(args.User)) - return; + foreach (var entity in component.Container.ContainedEntities) + { + if (!TryComp(entity, out var ensnaring)) + continue; - StartOpeningStripper(args.User, (uid, component)); + _ensnaringSystem.TryFree(uid, user, entity, ensnaring); + return; + } } /// - /// Places item in user's active hand to an inventory slot. + /// Checks whether the item is in a user's active hand and whether it can be inserted into the inventory slot. /// - private async void PlaceActiveHandItemInInventory( - EntityUid user, + private bool CanStripInsertInventory( + Entity user, EntityUid target, EntityUid held, - string slot, - StrippableComponent component) + string slot) { - var userHands = Comp(user); + if (!Resolve(user, ref user.Comp)) + return false; + + if (user.Comp.ActiveHand == null) + return false; + + if (user.Comp.ActiveHandEntity == null) + return false; + + if (user.Comp.ActiveHandEntity != held) + return false; + + if (!_handsSystem.CanDropHeld(user, user.Comp.ActiveHand)) + { + _popupSystem.PopupCursor(Loc.GetString("strippable-component-cannot-drop"), user); + return false; + } + + if (_inventorySystem.TryGetSlotEntity(target, slot, out _)) + { + _popupSystem.PopupCursor(Loc.GetString("strippable-component-item-slot-occupied", ("owner", target)), user); + return false; + } - bool Check() + if (!_inventorySystem.CanEquip(user, target, held, slot, out _)) { - if (userHands.ActiveHandEntity != held) - return false; - - if (!_handsSystem.CanDropHeld(user, userHands.ActiveHand!)) - { - _popup.PopupCursor(Loc.GetString("strippable-component-cannot-drop"), user); - return false; - } - - if (_inventorySystem.TryGetSlotEntity(target, slot, out _)) - { - _popup.PopupCursor(Loc.GetString("strippable-component-item-slot-occupied",("owner", target)), user); - return false; - } - - if (!_inventorySystem.CanEquip(user, target, held, slot, out _)) - { - _popup.PopupCursor(Loc.GetString("strippable-component-cannot-equip-message",("owner", target)), user); - return false; - } - - return true; + _popupSystem.PopupCursor(Loc.GetString("strippable-component-cannot-equip-message", ("owner", target)), user); + return false; } + return true; + } + + /// + /// Begins a DoAfter to insert the item in the user's active hand into the inventory slot. + /// + private void StartStripInsertInventory( + Entity user, + EntityUid target, + EntityUid held, + string slot) + { + if (!Resolve(user, ref user.Comp)) + return; + + if (!CanStripInsertInventory(user, target, held, slot)) + return; + if (!_inventorySystem.TryGetSlot(target, slot, out var slotDef)) { Log.Error($"{ToPrettyString(user)} attempted to place an item in a non-existent inventory slot ({slot}) on {ToPrettyString(target)}"); return; } - var userEv = new BeforeStripEvent(slotDef.StripTime); - RaiseLocalEvent(user, userEv); - var ev = new BeforeGettingStrippedEvent(userEv.Time, userEv.Stealth); - RaiseLocalEvent(target, ev); + var (time, stealth) = GetStripTimeModifiers(user, target, slotDef.StripTime); + + if (!stealth) + _popupSystem.PopupEntity(Loc.GetString("strippable-component-alert-owner-insert", ("user", Identity.Entity(user, EntityManager)), ("item", user.Comp.ActiveHandEntity!.Value)), target, target, PopupType.Large); + + var prefix = stealth ? "stealthily " : ""; + _adminLogger.Add(LogType.Stripping, LogImpact.Low, $"{ToPrettyString(user):actor} is trying to {prefix}place the item {ToPrettyString(held):item} in {ToPrettyString(target):target}'s {slot} slot"); - var doAfterArgs = new DoAfterArgs(EntityManager, user, ev.Time, new AwaitedDoAfterEvent(), null, target: target, used: held) + var doAfterArgs = new DoAfterArgs(EntityManager, user, time, new StrippableDoAfterEvent(true, true, slot), user, target, held) { - ExtraCheck = Check, - Hidden = ev.Stealth, + Hidden = stealth, AttemptFrequency = AttemptFrequency.EveryTick, BreakOnDamage = true, BreakOnTargetMove = true, BreakOnUserMove = true, NeedHand = true, - DuplicateCondition = DuplicateConditions.SameTool // Block any other DoAfters featuring this same entity. + DuplicateCondition = DuplicateConditions.SameTool }; - if (!ev.Stealth && Check() && userHands.ActiveHandEntity != null) - { - var message = Loc.GetString("strippable-component-alert-owner-insert", - ("user", Identity.Entity(user, EntityManager)), ("item", userHands.ActiveHandEntity)); - _popup.PopupEntity(message, target, target, PopupType.Large); - } + _doAfterSystem.TryStartDoAfter(doAfterArgs); + } - var prefix = ev.Stealth ? "stealthily " : ""; - _adminLogger.Add(LogType.Stripping, LogImpact.Low, $"{ToPrettyString(user):actor} is trying to {prefix}place the item {ToPrettyString(held):item} in {ToPrettyString(target):target}'s {slot} slot"); + /// + /// Inserts the item in the user's active hand into the inventory slot. + /// + private void StripInsertInventory( + Entity user, + EntityUid target, + EntityUid held, + string slot) + { + if (!Resolve(user, ref user.Comp)) + return; - var result = await _doAfter.WaitDoAfter(doAfterArgs); - if (result != DoAfterStatus.Finished) + if (!CanStripInsertInventory(user, target, held, slot)) return; - DebugTools.Assert(userHands.ActiveHand?.HeldEntity == held); + if (!_handsSystem.TryDrop(user, handsComp: user.Comp)) + return; + + _inventorySystem.TryEquip(user, target, held, slot); + _adminLogger.Add(LogType.Stripping, LogImpact.Medium, $"{ToPrettyString(user):actor} has placed the item {ToPrettyString(held):item} in {ToPrettyString(target):target}'s {slot} slot"); + } - if (_handsSystem.TryDrop(user, handsComp: userHands)) + /// + /// Checks whether the item can be removed from the target's inventory. + /// + private bool CanStripRemoveInventory( + EntityUid user, + EntityUid target, + EntityUid item, + string slot) + { + if (!_inventorySystem.TryGetSlotEntity(target, slot, out var slotItem)) { - _inventorySystem.TryEquip(user, target, held, slot); + _popupSystem.PopupCursor(Loc.GetString("strippable-component-item-slot-free-message", ("owner", target)), user); + return false; + } - _adminLogger.Add(LogType.Stripping, LogImpact.Medium, $"{ToPrettyString(user):actor} has placed the item {ToPrettyString(held):item} in {ToPrettyString(target):target}'s {slot} slot"); + if (slotItem != item) + return false; + + if (!_inventorySystem.CanUnequip(user, target, slot, out var reason)) + { + _popupSystem.PopupCursor(Loc.GetString(reason), user); + return false; } + + return true; } /// - /// Places item in user's active hand in one of the entity's hands. + /// Begins a DoAfter to remove the item from the target's inventory and insert it in the user's active hand. /// - private async void PlaceActiveHandItemInHands( + private void StartStripRemoveInventory( EntityUid user, EntityUid target, - EntityUid held, - string handName, - StrippableComponent component) + EntityUid item, + string slot) { - var hands = Comp(target); - var userHands = Comp(user); + if (!CanStripRemoveInventory(user, target, item, slot)) + return; - bool Check() + if (!_inventorySystem.TryGetSlot(target, slot, out var slotDef)) { - if (userHands.ActiveHandEntity != held) - return false; - - if (!_handsSystem.CanDropHeld(user, userHands.ActiveHand!)) - { - _popup.PopupCursor(Loc.GetString("strippable-component-cannot-drop"), user); - return false; - } - - if (!_handsSystem.TryGetHand(target, handName, out var hand, hands) - || !_handsSystem.CanPickupToHand(target, userHands.ActiveHandEntity.Value, hand, checkActionBlocker: false, hands)) - { - _popup.PopupCursor(Loc.GetString("strippable-component-cannot-put-message",("owner", target)), user); - return false; - } - - return true; + Log.Error($"{ToPrettyString(user)} attempted to take an item from a non-existent inventory slot ({slot}) on {ToPrettyString(target)}"); + return; } - var userEv = new BeforeStripEvent(component.HandStripDelay); - RaiseLocalEvent(user, userEv); - var ev = new BeforeGettingStrippedEvent(userEv.Time, userEv.Stealth); - RaiseLocalEvent(target, ev); + var (time, stealth) = GetStripTimeModifiers(user, target, slotDef.StripTime); - var doAfterArgs = new DoAfterArgs(EntityManager, user, ev.Time, new AwaitedDoAfterEvent(), null, target: target, used: held) + if (!stealth) { - ExtraCheck = Check, - Hidden = ev.Stealth, + if (slotDef.StripHidden) + _popupSystem.PopupEntity(Loc.GetString("strippable-component-alert-owner-hidden", ("slot", slot)), target, target, PopupType.Large); + else + _popupSystem.PopupEntity(Loc.GetString("strippable-component-alert-owner", ("user", Identity.Entity(user, EntityManager)), ("item", item)), target, target, PopupType.Large); + } + + var prefix = stealth ? "stealthily " : ""; + _adminLogger.Add(LogType.Stripping, LogImpact.Low, $"{ToPrettyString(user):actor} is trying to {prefix}strip the item {ToPrettyString(item):item} from {ToPrettyString(target):target}'s {slot} slot"); + + var doAfterArgs = new DoAfterArgs(EntityManager, user, time, new StrippableDoAfterEvent(false, true, slot), user, target, item) + { + Hidden = stealth, AttemptFrequency = AttemptFrequency.EveryTick, BreakOnDamage = true, BreakOnTargetMove = true, BreakOnUserMove = true, NeedHand = true, + BreakOnHandChange = false, // Allow simultaneously removing multiple items. DuplicateCondition = DuplicateConditions.SameTool }; - var prefix = ev.Stealth ? "stealthily " : ""; - _adminLogger.Add(LogType.Stripping, LogImpact.Low, $"{ToPrettyString(user):actor} is trying to {prefix}place the item {ToPrettyString(held):item} in {ToPrettyString(target):target}'s hands"); - - var result = await _doAfter.WaitDoAfter(doAfterArgs); - if (result != DoAfterStatus.Finished) return; - - _handsSystem.TryDrop(user, checkActionBlocker: false, handsComp: userHands); - _handsSystem.TryPickup(target, held, handName, checkActionBlocker: false, animateUser: !ev.Stealth, animate: !ev.Stealth, handsComp: hands); - _adminLogger.Add(LogType.Stripping, LogImpact.Medium, $"{ToPrettyString(user):actor} has placed the item {ToPrettyString(held):item} in {ToPrettyString(target):target}'s hands"); - // hand update will trigger strippable update + _doAfterSystem.TryStartDoAfter(doAfterArgs); } /// - /// Takes an item from the inventory and places it in the user's active hand. + /// Removes the item from the target's inventory and inserts it in the user's active hand. /// - private async void TakeItemFromInventory( + private void StripRemoveInventory( EntityUid user, EntityUid target, EntityUid item, string slot, - Entity strippable) + bool stealth) + { + if (!CanStripRemoveInventory(user, target, item, slot)) + return; + + if (!_inventorySystem.TryUnequip(user, target, slot)) + return; + + RaiseLocalEvent(item, new DroppedEvent(user), true); // Gas tank internals etc. + + _handsSystem.PickupOrDrop(user, item, animateUser: stealth, animate: stealth); + _adminLogger.Add(LogType.Stripping, LogImpact.Medium, $"{ToPrettyString(user):actor} has stripped the item {ToPrettyString(item):item} from {ToPrettyString(target):target}'s {slot} slot"); + } + + /// + /// Checks whether the item in the user's active hand can be inserted into one of the target's hands. + /// + private bool CanStripInsertHand( + Entity user, + Entity target, + EntityUid held, + string handName) { - bool Check() + if (!Resolve(user, ref user.Comp) || + !Resolve(target, ref target.Comp)) + return false; + + if (user.Comp.ActiveHand == null) + return false; + + if (user.Comp.ActiveHandEntity == null) + return false; + + if (user.Comp.ActiveHandEntity != held) + return false; + + if (!_handsSystem.CanDropHeld(user, user.Comp.ActiveHand)) { - if (!_inventorySystem.TryGetSlotEntity(target, slot, out var ent) && ent == item) - { - _popup.PopupCursor(Loc.GetString("strippable-component-item-slot-free-message", ("owner", target)), user); - return false; - } - - if (!_inventorySystem.CanUnequip(user, target, slot, out var reason)) - { - _popup.PopupCursor(Loc.GetString(reason), user); - return false; - } - - return true; + _popupSystem.PopupCursor(Loc.GetString("strippable-component-cannot-drop"), user); + return false; } - if (!_inventorySystem.TryGetSlot(target, slot, out var slotDef)) + if (!_handsSystem.TryGetHand(target, handName, out var handSlot, target.Comp) || + !_handsSystem.CanPickupToHand(target, user.Comp.ActiveHandEntity.Value, handSlot, checkActionBlocker: false, target.Comp)) { - Log.Error($"{ToPrettyString(user)} attempted to take an item from a non-existent inventory slot ({slot}) on {ToPrettyString(target)}"); - return; + _popupSystem.PopupCursor(Loc.GetString("strippable-component-cannot-put-message", ("owner", target)), user); + return false; } - var userEv = new BeforeStripEvent(slotDef.StripTime); - RaiseLocalEvent(user, userEv); - var ev = new BeforeGettingStrippedEvent(userEv.Time, userEv.Stealth); - RaiseLocalEvent(target, ev); + return true; + } + + /// + /// Begins a DoAfter to insert the item in the user's active hand into one of the target's hands. + /// + private void StartStripInsertHand( + Entity user, + Entity target, + EntityUid held, + string handName, + StrippableComponent? targetStrippable = null) + { + if (!Resolve(user, ref user.Comp) || + !Resolve(target, ref target.Comp) || + !Resolve(target, ref targetStrippable)) + return; + + if (!CanStripInsertHand(user, target, held, handName)) + return; - var doAfterArgs = new DoAfterArgs(EntityManager, user, ev.Time, new AwaitedDoAfterEvent(), null, target: target, used: item) + var (time, stealth) = GetStripTimeModifiers(user, target, targetStrippable.HandStripDelay); + + var prefix = stealth ? "stealthily " : ""; + _adminLogger.Add(LogType.Stripping, LogImpact.Low, $"{ToPrettyString(user):actor} is trying to {prefix}place the item {ToPrettyString(held):item} in {ToPrettyString(target):target}'s hands"); + + var doAfterArgs = new DoAfterArgs(EntityManager, user, time, new StrippableDoAfterEvent(true, false, handName), user, target, held) { - ExtraCheck = Check, - Hidden = ev.Stealth, + Hidden = stealth, AttemptFrequency = AttemptFrequency.EveryTick, BreakOnDamage = true, BreakOnTargetMove = true, BreakOnUserMove = true, NeedHand = true, - BreakOnHandChange = false, // allow simultaneously removing multiple items. DuplicateCondition = DuplicateConditions.SameTool }; - if (!ev.Stealth && Check()) + _doAfterSystem.TryStartDoAfter(doAfterArgs); + } + + /// + /// Places the item in the user's active hand into one of the target's hands. + /// + private void StripInsertHand( + Entity user, + Entity target, + EntityUid held, + string handName, + bool stealth) + { + if (!Resolve(user, ref user.Comp) || + !Resolve(target, ref target.Comp)) + return; + + _handsSystem.TryDrop(user, checkActionBlocker: false, handsComp: user.Comp); + _handsSystem.TryPickup(target, held, handName, checkActionBlocker: false, animateUser: stealth, animate: stealth, handsComp: target.Comp); + _adminLogger.Add(LogType.Stripping, LogImpact.Medium, $"{ToPrettyString(user):actor} has placed the item {ToPrettyString(held):item} in {ToPrettyString(target):target}'s hands"); + + // Hand update will trigger strippable update. + } + + /// + /// Checks whether the item is in the target's hand and whether it can be dropped. + /// + private bool CanStripRemoveHand( + EntityUid user, + Entity target, + EntityUid item, + string handName) + { + if (!Resolve(target, ref target.Comp)) + return false; + + if (!_handsSystem.TryGetHand(target, handName, out var handSlot, target.Comp)) { - if (slotDef.StripHidden) - { - _popup.PopupEntity(Loc.GetString("strippable-component-alert-owner-hidden", ("slot", slot)), target, - target, PopupType.Large); - } - else if (_inventorySystem.TryGetSlotEntity(strippable, slot, out var slotItem)) - { - _popup.PopupEntity(Loc.GetString("strippable-component-alert-owner", ("user", Identity.Entity(user, EntityManager)), ("item", slotItem)), target, - target, PopupType.Large); - } + _popupSystem.PopupCursor(Loc.GetString("strippable-component-item-slot-free-message", ("owner", target)), user); + return false; } - var prefix = ev.Stealth ? "stealthily " : ""; - _adminLogger.Add(LogType.Stripping, LogImpact.Low, $"{ToPrettyString(user):actor} is trying to {prefix}strip the item {ToPrettyString(item):item} from {ToPrettyString(target):target}'s {slot} slot"); + if (HasComp(handSlot.HeldEntity)) + return false; - var result = await _doAfter.WaitDoAfter(doAfterArgs); - if (result != DoAfterStatus.Finished) - return; + if (handSlot.HeldEntity == null) + return false; - if (!_inventorySystem.TryUnequip(user, strippable, slot)) - return; - - // Raise a dropped event, so that things like gas tank internals properly deactivate when stripping - RaiseLocalEvent(item, new DroppedEvent(user), true); + if (handSlot.HeldEntity != item) + return false; - _handsSystem.PickupOrDrop(user, item, animateUser: !ev.Stealth, animate: !ev.Stealth); - _adminLogger.Add(LogType.Stripping, LogImpact.Medium, $"{ToPrettyString(user):actor} has stripped the item {ToPrettyString(item):item} from {ToPrettyString(target):target}'s {slot} slot"); + if (!_handsSystem.CanDropHeld(target, handSlot, false)) + { + _popupSystem.PopupCursor(Loc.GetString("strippable-component-cannot-drop-message", ("owner", target)), user); + return false; + } + return true; } /// - /// Takes an item from a hand and places it in the user's active hand. + /// Begins a DoAfter to remove the item from the target's hand and insert it in the user's active hand. /// - private async void TakeItemFromHands(EntityUid user, EntityUid target, EntityUid item, string handName, Entity strippable) + private void StartStripRemoveHand( + Entity user, + Entity target, + EntityUid item, + string handName, + StrippableComponent? targetStrippable = null) { - var hands = Comp(target); - var userHands = Comp(user); + if (!Resolve(user, ref user.Comp) || + !Resolve(target, ref target.Comp) || + !Resolve(target, ref targetStrippable)) + return; - bool Check() - { - if (!_handsSystem.TryGetHand(target, handName, out var hand, hands) || hand.HeldEntity != item) - { - _popup.PopupCursor(Loc.GetString("strippable-component-item-slot-free-message",("owner", target)), user); - return false; - } - - if (HasComp(hand.HeldEntity)) - return false; - - if (!_handsSystem.CanDropHeld(target, hand, false)) - { - _popup.PopupCursor(Loc.GetString("strippable-component-cannot-drop-message",("owner", target)), user); - return false; - } - - return true; - } + if (!CanStripRemoveHand(user, target, item, handName)) + return; - var userEv = new BeforeStripEvent(strippable.Comp.HandStripDelay); - RaiseLocalEvent(user, userEv); - var ev = new BeforeGettingStrippedEvent(userEv.Time, userEv.Stealth); - RaiseLocalEvent(target, ev); + var (time, stealth) = GetStripTimeModifiers(user, target, targetStrippable.HandStripDelay); - var doAfterArgs = new DoAfterArgs(EntityManager, user, ev.Time, new AwaitedDoAfterEvent(), null, target: target, used: item) + if (!stealth) + _popupSystem.PopupEntity( Loc.GetString("strippable-component-alert-owner", ("user", Identity.Entity(user, EntityManager)), ("item", item)), target, target); + + var prefix = stealth ? "stealthily " : ""; + _adminLogger.Add(LogType.Stripping, LogImpact.Low, $"{ToPrettyString(user):actor} is trying to {prefix}strip the item {ToPrettyString(item):item} from {ToPrettyString(target):target}'s hands"); + + var doAfterArgs = new DoAfterArgs(EntityManager, user, time, new StrippableDoAfterEvent(false, false, handName), user, target, item) { - ExtraCheck = Check, - Hidden = ev.Stealth, + Hidden = stealth, AttemptFrequency = AttemptFrequency.EveryTick, BreakOnDamage = true, BreakOnTargetMove = true, BreakOnUserMove = true, NeedHand = true, - BreakOnHandChange = false, // allow simultaneously removing multiple items. + BreakOnHandChange = false, // Allow simultaneously removing multiple items. DuplicateCondition = DuplicateConditions.SameTool }; - if (!ev.Stealth && Check() && _handsSystem.TryGetHand(target, handName, out var handSlot, hands) && handSlot.HeldEntity != null) + _doAfterSystem.TryStartDoAfter(doAfterArgs); + } + + /// + /// Takes the item from the target's hand and inserts it in the user's active hand. + /// + private void StripRemoveHand( + Entity user, + Entity target, + EntityUid item, + bool stealth) + { + if (!Resolve(user, ref user.Comp) || + !Resolve(target, ref target.Comp)) + return; + + _handsSystem.TryDrop(target, item, checkActionBlocker: false, handsComp: target.Comp); + _handsSystem.PickupOrDrop(user, item, animateUser: stealth, animate: stealth, handsComp: user.Comp); + _adminLogger.Add(LogType.Stripping, LogImpact.Medium, $"{ToPrettyString(user):actor} has stripped the item {ToPrettyString(item):item} from {ToPrettyString(target):target}'s hands"); + + // Hand update will trigger strippable update. + } + + private void OnStrippableDoAfterRunning(Entity entity, ref DoAfterAttemptEvent ev) + { + var args = ev.DoAfter.Args; + + DebugTools.Assert(entity.Owner == args.User); + DebugTools.Assert(args.Target != null); + DebugTools.Assert(args.Used != null); + DebugTools.Assert(ev.Event.SlotOrHandName != null); + + if (ev.Event.InventoryOrHand) { - _popup.PopupEntity( - Loc.GetString("strippable-component-alert-owner", - ("user", Identity.Entity(user, EntityManager)), ("item", item)), - strippable.Owner, - strippable.Owner); + if ( ev.Event.InsertOrRemove && !CanStripInsertInventory((entity.Owner, entity.Comp), args.Target.Value, args.Used.Value, ev.Event.SlotOrHandName) || + !ev.Event.InsertOrRemove && !CanStripRemoveInventory(entity.Owner, args.Target.Value, args.Used.Value, ev.Event.SlotOrHandName)) + ev.Cancel(); } + else + { + if ( ev.Event.InsertOrRemove && !CanStripInsertHand((entity.Owner, entity.Comp), args.Target.Value, args.Used.Value, ev.Event.SlotOrHandName) || + !ev.Event.InsertOrRemove && !CanStripRemoveHand(entity.Owner, args.Target.Value, args.Used.Value, ev.Event.SlotOrHandName)) + ev.Cancel(); + } + } - var prefix = ev.Stealth ? "stealthily " : ""; - _adminLogger.Add(LogType.Stripping, LogImpact.Low, - $"{ToPrettyString(user):actor} is trying to {prefix}strip the item {ToPrettyString(item):item} from {ToPrettyString(target):target}'s hands"); - - var result = await _doAfter.WaitDoAfter(doAfterArgs); - if (result != DoAfterStatus.Finished) + private void OnStrippableDoAfterFinished(Entity entity, ref StrippableDoAfterEvent ev) + { + if (ev.Cancelled) return; - _handsSystem.TryDrop(target, item, checkActionBlocker: false, handsComp: hands); - _handsSystem.PickupOrDrop(user, item, animateUser: !ev.Stealth, animate: !ev.Stealth, handsComp: userHands); - // hand update will trigger strippable update - _adminLogger.Add(LogType.Stripping, LogImpact.Medium, - $"{ToPrettyString(user):actor} has stripped the item {ToPrettyString(item):item} from {ToPrettyString(target):target}'s hands"); + DebugTools.Assert(entity.Owner == ev.User); + DebugTools.Assert(ev.Target != null); + DebugTools.Assert(ev.Used != null); + DebugTools.Assert(ev.SlotOrHandName != null); + + if (ev.InventoryOrHand) + { + if (ev.InsertOrRemove) + StripInsertInventory((entity.Owner, entity.Comp), ev.Target.Value, ev.Used.Value, ev.SlotOrHandName); + else StripRemoveInventory(entity.Owner, ev.Target.Value, ev.Used.Value, ev.SlotOrHandName, ev.Args.Hidden); + } + else + { + if (ev.InsertOrRemove) + StripInsertHand((entity.Owner, entity.Comp), ev.Target.Value, ev.Used.Value, ev.SlotOrHandName, ev.Args.Hidden); + else StripRemoveHand((entity.Owner, entity.Comp), ev.Target.Value, ev.Used.Value, ev.Args.Hidden); + } } } } diff --git a/Content.Shared/Clothing/EntitySystems/ToggleableClothingSystem.cs b/Content.Shared/Clothing/EntitySystems/ToggleableClothingSystem.cs index 0138de7a98f..22a1d1a8f52 100644 --- a/Content.Shared/Clothing/EntitySystems/ToggleableClothingSystem.cs +++ b/Content.Shared/Clothing/EntitySystems/ToggleableClothingSystem.cs @@ -95,7 +95,7 @@ private void StartDoAfter(EntityUid user, EntityUid item, EntityUid wearer, Togg if (component.StripDelay == null) return; - var (time, stealth) = _strippable.GetStripTimeModifiers(user, wearer, (float) component.StripDelay.Value.TotalSeconds); + var (time, stealth) = _strippable.GetStripTimeModifiers(user, wearer, component.StripDelay.Value); var args = new DoAfterArgs(EntityManager, user, time, new ToggleClothingDoAfterEvent(), item, wearer, item) { diff --git a/Content.Shared/Inventory/InventoryTemplatePrototype.cs b/Content.Shared/Inventory/InventoryTemplatePrototype.cs index a4779699629..585f80d4ce9 100644 --- a/Content.Shared/Inventory/InventoryTemplatePrototype.cs +++ b/Content.Shared/Inventory/InventoryTemplatePrototype.cs @@ -20,7 +20,7 @@ public sealed partial class SlotDefinition [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"; - [DataField("stripTime")] public float StripTime { get; private set; } = 4f; + [DataField("stripTime")] public TimeSpan StripTime { get; private set; } = TimeSpan.FromSeconds(4f); [DataField("uiWindowPos", required: true)] public Vector2i UIWindowPosition { get; private set; } diff --git a/Content.Shared/Strip/Components/StrippableComponent.cs b/Content.Shared/Strip/Components/StrippableComponent.cs index fbf99992e3c..8bf09c3f4c6 100644 --- a/Content.Shared/Strip/Components/StrippableComponent.cs +++ b/Content.Shared/Strip/Components/StrippableComponent.cs @@ -1,3 +1,4 @@ +using Content.Shared.DoAfter; using Content.Shared.Inventory; using Robust.Shared.GameStates; using Robust.Shared.Serialization; @@ -8,10 +9,10 @@ namespace Content.Shared.Strip.Components public sealed partial class StrippableComponent : Component { /// - /// The strip delay for hands. + /// The strip delay for hands. /// [ViewVariables(VVAccess.ReadWrite), DataField("handDelay")] - public float HandStripDelay = 4f; + public TimeSpan HandStripDelay = TimeSpan.FromSeconds(4f); } [NetSerializable, Serializable] @@ -21,63 +22,63 @@ public enum StrippingUiKey : byte } [NetSerializable, Serializable] - public sealed class StrippingSlotButtonPressed : BoundUserInterfaceMessage + public sealed class StrippingSlotButtonPressed(string slot, bool isHand) : BoundUserInterfaceMessage { - public readonly string Slot; - - public readonly bool IsHand; - - public StrippingSlotButtonPressed(string slot, bool isHand) - { - Slot = slot; - IsHand = isHand; - } + public readonly string Slot = slot; + public readonly bool IsHand = isHand; } [NetSerializable, Serializable] - public sealed class StrippingEnsnareButtonPressed : BoundUserInterfaceMessage - { - public StrippingEnsnareButtonPressed() - { - } - } + public sealed class StrippingEnsnareButtonPressed : BoundUserInterfaceMessage; - public abstract class BaseBeforeStripEvent : EntityEventArgs, IInventoryRelayEvent + [ByRefEvent] + public abstract class BaseBeforeStripEvent(TimeSpan initialTime, bool stealth = false) : EntityEventArgs, IInventoryRelayEvent { - public readonly float InitialTime; - public float Time => MathF.Max(InitialTime * Multiplier + Additive, 0f); - public float Additive = 0; - public float Multiplier = 1f; - public bool Stealth; + public readonly TimeSpan InitialTime = initialTime; + public TimeSpan Multiplier = TimeSpan.FromSeconds(1f); + public TimeSpan Additive = TimeSpan.Zero; + public bool Stealth = stealth; - public SlotFlags TargetSlots { get; } = SlotFlags.GLOVES; + public TimeSpan Time => TimeSpan.FromSeconds(MathF.Max(InitialTime.Seconds * Multiplier.Seconds + Additive.Seconds, 0f)); - public BaseBeforeStripEvent(float initialTime, bool stealth = false) - { - InitialTime = initialTime; - Stealth = stealth; - } + public SlotFlags TargetSlots { get; } = SlotFlags.GLOVES; } /// - /// Used to modify strip times. Raised directed at the user. + /// Used to modify strip times. Raised directed at the user. /// /// - /// This is also used by some stripping related interactions, i.e., interactions with items that are currently equipped by another player. + /// This is also used by some stripping related interactions, i.e., interactions with items that are currently equipped by another player. /// - public sealed class BeforeStripEvent : BaseBeforeStripEvent - { - public BeforeStripEvent(float initialTime, bool stealth = false) : base(initialTime, stealth) { } - } + [ByRefEvent] + public sealed class BeforeStripEvent(TimeSpan initialTime, bool stealth = false) : BaseBeforeStripEvent(initialTime, stealth); /// - /// Used to modify strip times. Raised directed at the target. + /// Used to modify strip times. Raised directed at the target. /// /// - /// This is also used by some stripping related interactions, i.e., interactions with items that are currently equipped by another player. + /// This is also used by some stripping related interactions, i.e., interactions with items that are currently equipped by another player. /// - public sealed class BeforeGettingStrippedEvent : BaseBeforeStripEvent + [ByRefEvent] + public sealed class BeforeGettingStrippedEvent(TimeSpan initialTime, bool stealth = false) : BaseBeforeStripEvent(initialTime, stealth); + + /// + /// Organizes the behavior of DoAfters for . + /// + [Serializable, NetSerializable] + public sealed partial class StrippableDoAfterEvent : DoAfterEvent { - public BeforeGettingStrippedEvent(float initialTime, bool stealth = false) : base(initialTime, stealth) { } + public readonly bool InsertOrRemove; + public readonly bool InventoryOrHand; + public readonly string SlotOrHandName; + + public StrippableDoAfterEvent(bool insertOrRemove, bool inventoryOrHand, string slotOrHandName) + { + InsertOrRemove = insertOrRemove; + InventoryOrHand = inventoryOrHand; + SlotOrHandName = slotOrHandName; + } + + public override DoAfterEvent Clone() => this; } } diff --git a/Content.Shared/Strip/Components/ThievingComponent.cs b/Content.Shared/Strip/Components/ThievingComponent.cs index 83679f132c4..a851dd5ef63 100644 --- a/Content.Shared/Strip/Components/ThievingComponent.cs +++ b/Content.Shared/Strip/Components/ThievingComponent.cs @@ -11,7 +11,7 @@ public sealed partial class ThievingComponent : Component /// [ViewVariables(VVAccess.ReadWrite)] [DataField("stripTimeReduction")] - public float StripTimeReduction = 0.5f; + public TimeSpan StripTimeReduction = TimeSpan.FromSeconds(0.5f); /// /// Should it notify the user if they're stripping a pocket? diff --git a/Content.Shared/Strip/SharedStrippableSystem.cs b/Content.Shared/Strip/SharedStrippableSystem.cs index a698ae5035a..7afd4f245a1 100644 --- a/Content.Shared/Strip/SharedStrippableSystem.cs +++ b/Content.Shared/Strip/SharedStrippableSystem.cs @@ -14,12 +14,12 @@ public override void Initialize() SubscribeLocalEvent(OnDragDrop); } - public (float Time, bool Stealth) GetStripTimeModifiers(EntityUid user, EntityUid target, float initialTime) + public (TimeSpan Time, bool Stealth) GetStripTimeModifiers(EntityUid user, EntityUid target, TimeSpan initialTime) { var userEv = new BeforeStripEvent(initialTime); - RaiseLocalEvent(user, userEv); + RaiseLocalEvent(user, ref userEv); var ev = new BeforeGettingStrippedEvent(userEv.Time, userEv.Stealth); - RaiseLocalEvent(target, ev); + RaiseLocalEvent(target, ref ev); return (ev.Time, ev.Stealth); } diff --git a/Content.Shared/Strip/ThievingSystem.cs b/Content.Shared/Strip/ThievingSystem.cs index 0ef4b66571f..2b3d3b38a00 100644 --- a/Content.Shared/Strip/ThievingSystem.cs +++ b/Content.Shared/Strip/ThievingSystem.cs @@ -1,4 +1,5 @@ using Content.Shared.Inventory; +using Content.Shared.Strip; using Content.Shared.Strip.Components; namespace Content.Shared.Strip; From ba2d53845e3f365a7423ac8f9ab6ee491e76d60d Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Mon, 1 Jul 2024 18:37:29 -0400 Subject: [PATCH 107/155] Make Spent Casing Ejection Not Suck (#478) # Description Part of #467, #460, and #474 This is a small PR that corrects a math error in SharedGunSystem, causing shell casings to be "Thrown" directly downwards instead of in an actually cinematic and exciting arc. While I'm at it, I also corrected the fixture of base shell casings to favor "Bounciness", and decreased its mass to approximately 100 grams. Finally, I added a sound for when casings bounce off of walls, which wasn't present before. https://github.com/Simple-Station/Einstein-Engines/assets/16548818/56bb4ecc-d5eb-4b36-853b-42f05374150d :cl: - fix: Spent bullet casings now fly away from a shooter in a cinematic manner, rather than fall at their feet. Co-authored-by: Danger Revolution! <142105406+DangerRevolution@users.noreply.github.com> --- Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs | 2 +- .../Guns/Ammunition/Cartridges/base_cartridge.yml | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs index cadb0a4b215..ff8b102bb57 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs @@ -443,7 +443,7 @@ protected void EjectCartridge( { Angle ejectAngle = angle.Value; ejectAngle += 3.7f; // 212 degrees; casings should eject slightly to the right and behind of a gun - ThrowingSystem.TryThrow(entity, ejectAngle.ToVec().Normalized() / 100, 5f); + ThrowingSystem.TryThrow(entity, ejectAngle.ToVec(), 625f); } if (playSound && TryComp(entity, out var cartridge)) { diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/base_cartridge.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/base_cartridge.yml index e188ee8c658..3bef413dffa 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/base_cartridge.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/base_cartridge.yml @@ -11,10 +11,10 @@ shape: !type:PhysShapeAabb bounds: "-0.10,-0.05,0.10,0.05" - density: 20 + density: 0.5 mask: - ItemMask - restitution: 0.3 # fite me + restitution: 0.7 # Small and bouncy friction: 0.2 - type: Tag tags: @@ -23,6 +23,11 @@ size: Tiny - type: SpaceGarbage - type: EmitSoundOnLand + sound: + path: /Audio/Weapons/Guns/Casings/casing_fall_1.ogg + params: + volume: -1 + - type: EmitSoundOnCollide sound: path: /Audio/Weapons/Guns/Casings/casing_fall_2.ogg params: From 2e712c00249cfe5bd254462a1efa1b6c8a1ec6bd Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Mon, 1 Jul 2024 22:37:52 +0000 Subject: [PATCH 108/155] Automatic Changelog Update (#478) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 6fe7b0ff689..515c1832db1 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4257,3 +4257,11 @@ Entries: message: Most items now take time to equip and unequip, especially space suits. id: 6132 time: '2024-06-30T18:22:28.0000000+00:00' +- author: VMSolidus + changes: + - type: Fix + message: >- + Spent bullet casings now fly away from a shooter in a cinematic manner, + rather than fall at their feet. + id: 6133 + time: '2024-07-01T22:37:29.0000000+00:00' From 7b89ce1326c74e9d813ac56b497951c867b3af3e Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Tue, 2 Jul 2024 03:15:06 -0400 Subject: [PATCH 109/155] Cherrypick "Fix StrippableSystem Blunders" (#504) --- Content.Server/Strip/StrippableSystem.cs | 16 +++++++++++----- .../Strip/Components/StrippableComponent.cs | 4 ++-- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/Content.Server/Strip/StrippableSystem.cs b/Content.Server/Strip/StrippableSystem.cs index 950411a8e2c..3b38b65a19d 100644 --- a/Content.Server/Strip/StrippableSystem.cs +++ b/Content.Server/Strip/StrippableSystem.cs @@ -122,13 +122,12 @@ public override void StartOpeningStripper(EntityUid user, Entity strippable, ref StrippingSlotButtonPressed args) { if (args.Session.AttachedEntity is not { Valid: true } user || - !TryComp(user, out var userHands) || - !TryComp(strippable.Owner, out var targetHands)) + !TryComp(user, out var userHands)) return; if (args.IsHand) { - StripHand((user, userHands), (strippable.Owner, targetHands), args.Slot, strippable); + StripHand((user, userHands), (strippable.Owner, null), args.Slot, strippable); return; } @@ -478,6 +477,9 @@ private void StripInsertHand( !Resolve(target, ref target.Comp)) return; + if (!CanStripInsertHand(user, target, held, handName)) + return; + _handsSystem.TryDrop(user, checkActionBlocker: false, handsComp: user.Comp); _handsSystem.TryPickup(target, held, handName, checkActionBlocker: false, animateUser: stealth, animate: stealth, handsComp: target.Comp); _adminLogger.Add(LogType.Stripping, LogImpact.Medium, $"{ToPrettyString(user):actor} has placed the item {ToPrettyString(held):item} in {ToPrettyString(target):target}'s hands"); @@ -542,7 +544,7 @@ private void StartStripRemoveHand( var (time, stealth) = GetStripTimeModifiers(user, target, targetStrippable.HandStripDelay); if (!stealth) - _popupSystem.PopupEntity( Loc.GetString("strippable-component-alert-owner", ("user", Identity.Entity(user, EntityManager)), ("item", item)), target, target); + _popupSystem.PopupEntity(Loc.GetString("strippable-component-alert-owner", ("user", Identity.Entity(user, EntityManager)), ("item", item)), target, target); var prefix = stealth ? "stealthily " : ""; _adminLogger.Add(LogType.Stripping, LogImpact.Low, $"{ToPrettyString(user):actor} is trying to {prefix}strip the item {ToPrettyString(item):item} from {ToPrettyString(target):target}'s hands"); @@ -569,12 +571,16 @@ private void StripRemoveHand( Entity user, Entity target, EntityUid item, + string handName, bool stealth) { if (!Resolve(user, ref user.Comp) || !Resolve(target, ref target.Comp)) return; + if (!CanStripRemoveHand(user, target, item, handName)) + return; + _handsSystem.TryDrop(target, item, checkActionBlocker: false, handsComp: target.Comp); _handsSystem.PickupOrDrop(user, item, animateUser: stealth, animate: stealth, handsComp: user.Comp); _adminLogger.Add(LogType.Stripping, LogImpact.Medium, $"{ToPrettyString(user):actor} has stripped the item {ToPrettyString(item):item} from {ToPrettyString(target):target}'s hands"); @@ -625,7 +631,7 @@ private void OnStrippableDoAfterFinished(Entity entity, ref Stri { if (ev.InsertOrRemove) StripInsertHand((entity.Owner, entity.Comp), ev.Target.Value, ev.Used.Value, ev.SlotOrHandName, ev.Args.Hidden); - else StripRemoveHand((entity.Owner, entity.Comp), ev.Target.Value, ev.Used.Value, ev.Args.Hidden); + else StripRemoveHand((entity.Owner, entity.Comp), ev.Target.Value, ev.Used.Value, ev.SlotOrHandName, ev.Args.Hidden); } } } diff --git a/Content.Shared/Strip/Components/StrippableComponent.cs b/Content.Shared/Strip/Components/StrippableComponent.cs index 8bf09c3f4c6..4faca4d8f21 100644 --- a/Content.Shared/Strip/Components/StrippableComponent.cs +++ b/Content.Shared/Strip/Components/StrippableComponent.cs @@ -35,11 +35,11 @@ public sealed class StrippingEnsnareButtonPressed : BoundUserInterfaceMessage; public abstract class BaseBeforeStripEvent(TimeSpan initialTime, bool stealth = false) : EntityEventArgs, IInventoryRelayEvent { public readonly TimeSpan InitialTime = initialTime; - public TimeSpan Multiplier = TimeSpan.FromSeconds(1f); + public float Multiplier = 1f; public TimeSpan Additive = TimeSpan.Zero; public bool Stealth = stealth; - public TimeSpan Time => TimeSpan.FromSeconds(MathF.Max(InitialTime.Seconds * Multiplier.Seconds + Additive.Seconds, 0f)); + public TimeSpan Time => TimeSpan.FromSeconds(MathF.Max(InitialTime.Seconds * Multiplier + Additive.Seconds, 0f)); public SlotFlags TargetSlots { get; } = SlotFlags.GLOVES; } From 606a28d11e706681ec23f0db32eb01ddc0534a2d Mon Sep 17 00:00:00 2001 From: WarMechanic <69510347+WarMechanic@users.noreply.github.com> Date: Tue, 2 Jul 2024 17:18:27 +1000 Subject: [PATCH 110/155] Fix Loadouts Breaking when You Spend All Your Points (#506) # Description Self explanatory P.S. i genuinely dont know what the fuck i did, who wrote this? # TODO - [X] Fix shit # Media https://youtu.be/hbJbd5SgZ54 # Changelog :cl: - fix: Fixed loadouts becoming uneditable after spending all your points --- Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs b/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs index c797f02a754..04810b07719 100644 --- a/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs +++ b/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs @@ -2086,7 +2086,7 @@ void AddSelector(LoadoutPreferenceSelector selector, int points, string id) selector.PreferenceChanged += preference => { // Make sure they have enough loadout points - preference = preference ? CheckPoints(points, preference) : CheckPoints(-points, preference); + preference = preference ? CheckPoints(-points, preference) : CheckPoints(points, preference); // Update Preferences Profile = Profile?.WithLoadoutPreference(id, preference); From 0d0dd4c01bfd859004b3b399d482187e6ba58ea8 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Tue, 2 Jul 2024 07:18:51 +0000 Subject: [PATCH 111/155] Automatic Changelog Update (#506) --- Resources/Changelog/Changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 515c1832db1..e4e812edeb4 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4265,3 +4265,9 @@ Entries: rather than fall at their feet. id: 6133 time: '2024-07-01T22:37:29.0000000+00:00' +- author: WarMechanic + changes: + - type: Fix + message: Fixed loadouts becoming uneditable after spending all your points + id: 6134 + time: '2024-07-02T07:18:27.0000000+00:00' From ffb9ec979ff9ffe76d81eeffa84cea0be45ac2fc Mon Sep 17 00:00:00 2001 From: Mnemotechnican <69920617+Mnemotechnician@users.noreply.github.com> Date: Tue, 2 Jul 2024 11:00:14 +0300 Subject: [PATCH 112/155] Unflip Hands for Felinid, Vulpkanin, Harpy (#503) # Description Cherry-picks https://github.com/DeltaV-Station/Delta-v/pull/1194 This is a minor issue in the yml files of custom species that will become a problem if we ever merge wizden's better hand indicators. This PR shouldn't require a preview; all credit goes to the original author of the fix. --- # Changelog Too minor for a cl. Or as some say, no cl no fun. Co-authored-by: Angelo Fallaria --- Resources/Prototypes/DeltaV/Body/Prototypes/harpy.yml | 5 ++--- Resources/Prototypes/DeltaV/Body/Prototypes/vulpkanin.yml | 6 +++--- .../Nyanotrasen/Entities/Body/Prototypes/felinid.yml | 4 ++-- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/Resources/Prototypes/DeltaV/Body/Prototypes/harpy.yml b/Resources/Prototypes/DeltaV/Body/Prototypes/harpy.yml index 5b3615c55d8..25988f4a3a8 100644 --- a/Resources/Prototypes/DeltaV/Body/Prototypes/harpy.yml +++ b/Resources/Prototypes/DeltaV/Body/Prototypes/harpy.yml @@ -13,10 +13,10 @@ torso: part: TorsoHarpy connections: - - left arm - right arm - - left leg + - left arm - right leg + - left leg organs: heart: OrganHumanHeart lungs: OrganHarpyLungs @@ -47,4 +47,3 @@ part: RightFootHarpy left foot: part: LeftFootHarpy - diff --git a/Resources/Prototypes/DeltaV/Body/Prototypes/vulpkanin.yml b/Resources/Prototypes/DeltaV/Body/Prototypes/vulpkanin.yml index 3d1552ac81f..cdf787e4736 100644 --- a/Resources/Prototypes/DeltaV/Body/Prototypes/vulpkanin.yml +++ b/Resources/Prototypes/DeltaV/Body/Prototypes/vulpkanin.yml @@ -1,4 +1,4 @@ -- type: body +- type: body name: "vulpkanin" id: Vulpkanin root: torso @@ -19,10 +19,10 @@ liver: OrganAnimalLiver kidneys: OrganHumanKidneys connections: - - left arm - right arm - - left leg + - left arm - right leg + - left leg right arm: part: RightArmVulpkanin connections: diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Body/Prototypes/felinid.yml b/Resources/Prototypes/Nyanotrasen/Entities/Body/Prototypes/felinid.yml index 6dd2a89e5a8..a09f3b6ab7f 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Body/Prototypes/felinid.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Body/Prototypes/felinid.yml @@ -13,10 +13,10 @@ torso: part: TorsoHuman connections: - - left arm - right arm - - left leg + - left arm - right leg + - left leg organs: heart: OrganAnimalHeart lungs: OrganHumanLungs From 7a124612a1b08b0d46f9baa2025c764d1b3a08de Mon Sep 17 00:00:00 2001 From: Mnemotechnican <69920617+Mnemotechnician@users.noreply.github.com> Date: Tue, 2 Jul 2024 11:01:35 +0300 Subject: [PATCH 113/155] Cherry-Pick the Secwatch Pda App (#502) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Description Cherry-picks https://github.com/DeltaV-Station/Delta-v/pull/1237 All credit goes to the original author, deltanedas Adds a PDA app that lets seccies know who's wanted and who's about to be thrown out of an airlock without relying on the sechud and people having their IDs on them. # Media ![image](https://github.com/Simple-Station/Einstein-Engines/assets/69920617/37f5fa1a-27a5-4392-b4bb-be0f1016b499) (see the original PR for a better preview) # Changelog :cl: deltanedas - add: Security can find the new SecWatch™ app in their PDAs to see current suspects and wanted criminals. Co-authored-by: deltanedas <39013340+deltanedas@users.noreply.github.com> Co-authored-by: Azzy --- .../Cartridges/CrimeAssistUi.cs | 9 --- .../Cartridges/CrimeAssistUiFragment.xaml.cs | 3 - .../Cartridges/SecWatchEntryControl.xaml | 19 +++++ .../Cartridges/SecWatchEntryControl.xaml.cs | 21 ++++++ .../CartridgeLoader/Cartridges/SecWatchUi.cs | 27 +++++++ .../Cartridges/SecWatchUiFragment.xaml | 13 ++++ .../Cartridges/SecWatchUiFragment.xaml.cs | 25 +++++++ .../Cartridges/SecWatchCartridgeComponent.cs | 23 ++++++ .../Cartridges/SecWatchCartridgeSystem.cs | 73 +++++++++++++++++++ .../CrimeAssistCartridgeComponent.cs | 5 -- .../CrimeAssistCartridgeSystem.cs | 16 ---- .../Cartridges/CrimeAssistUiState.cs | 18 ----- .../Cartridges/SecWatchUiState.cs | 24 ++++++ .../deltav/cartridge-loader/secwatch.ftl | 5 ++ .../Entities/Objects/Devices/cartridges.yml | 22 +++++- .../DeltaV/Entities/Objects/Devices/pda.yml | 3 +- .../Entities/Objects/Devices/pda.yml | 24 ++++-- .../Entities/Objects/Devices/pda.yml | 3 +- 18 files changed, 271 insertions(+), 62 deletions(-) create mode 100644 Content.Client/DeltaV/CartridgeLoader/Cartridges/SecWatchEntryControl.xaml create mode 100644 Content.Client/DeltaV/CartridgeLoader/Cartridges/SecWatchEntryControl.xaml.cs create mode 100644 Content.Client/DeltaV/CartridgeLoader/Cartridges/SecWatchUi.cs create mode 100644 Content.Client/DeltaV/CartridgeLoader/Cartridges/SecWatchUiFragment.xaml create mode 100644 Content.Client/DeltaV/CartridgeLoader/Cartridges/SecWatchUiFragment.xaml.cs create mode 100644 Content.Server/DeltaV/CartridgeLoader/Cartridges/SecWatchCartridgeComponent.cs create mode 100644 Content.Server/DeltaV/CartridgeLoader/Cartridges/SecWatchCartridgeSystem.cs delete mode 100644 Content.Server/DeltaV/CartridgeLoader/CrimeAssistCartridgeComponent.cs delete mode 100644 Content.Server/DeltaV/CartridgeLoader/CrimeAssistCartridgeSystem.cs delete mode 100644 Content.Shared/DeltaV/CartridgeLoader/Cartridges/CrimeAssistUiState.cs create mode 100644 Content.Shared/DeltaV/CartridgeLoader/Cartridges/SecWatchUiState.cs create mode 100644 Resources/Locale/en-US/deltav/cartridge-loader/secwatch.ftl diff --git a/Content.Client/DeltaV/CartridgeLoader/Cartridges/CrimeAssistUi.cs b/Content.Client/DeltaV/CartridgeLoader/Cartridges/CrimeAssistUi.cs index ea5aa3cf256..2dbe923b2a6 100644 --- a/Content.Client/DeltaV/CartridgeLoader/Cartridges/CrimeAssistUi.cs +++ b/Content.Client/DeltaV/CartridgeLoader/Cartridges/CrimeAssistUi.cs @@ -18,15 +18,6 @@ public override Control GetUIFragmentRoot() public override void Setup(BoundUserInterface userInterface, EntityUid? fragmentOwner) { _fragment = new CrimeAssistUiFragment(); - - _fragment.OnSync += _ => SendSyncMessage(userInterface); - } - - private void SendSyncMessage(BoundUserInterface userInterface) - { - var syncMessage = new CrimeAssistSyncMessageEvent(); - var message = new CartridgeUiMessage(syncMessage); - userInterface.SendMessage(message); } public override void UpdateState(BoundUserInterfaceState state) diff --git a/Content.Client/DeltaV/CartridgeLoader/Cartridges/CrimeAssistUiFragment.xaml.cs b/Content.Client/DeltaV/CartridgeLoader/Cartridges/CrimeAssistUiFragment.xaml.cs index e3163975d12..fb085a8a799 100644 --- a/Content.Client/DeltaV/CartridgeLoader/Cartridges/CrimeAssistUiFragment.xaml.cs +++ b/Content.Client/DeltaV/CartridgeLoader/Cartridges/CrimeAssistUiFragment.xaml.cs @@ -1,7 +1,6 @@ using Content.Client.Message; using Content.Shared.DeltaV.CartridgeLoader.Cartridges; using Robust.Client.AutoGenerated; -using Robust.Client.ResourceManagement; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.XAML; using Robust.Shared.Prototypes; @@ -13,9 +12,7 @@ namespace Content.Client.DeltaV.CartridgeLoader.Cartridges; public sealed partial class CrimeAssistUiFragment : BoxContainer { [Dependency] private readonly IPrototypeManager _prototypeManager = default!; - [Dependency] private readonly IResourceCache _resourceCache = default!; - public event Action? OnSync; private CrimeAssistPage _currentPage; private List? _pages; diff --git a/Content.Client/DeltaV/CartridgeLoader/Cartridges/SecWatchEntryControl.xaml b/Content.Client/DeltaV/CartridgeLoader/Cartridges/SecWatchEntryControl.xaml new file mode 100644 index 00000000000..2de8a37ff77 --- /dev/null +++ b/Content.Client/DeltaV/CartridgeLoader/Cartridges/SecWatchEntryControl.xaml @@ -0,0 +1,19 @@ + + + + + + + + + + diff --git a/Content.Client/DeltaV/CartridgeLoader/Cartridges/SecWatchEntryControl.xaml.cs b/Content.Client/DeltaV/CartridgeLoader/Cartridges/SecWatchEntryControl.xaml.cs new file mode 100644 index 00000000000..e8dd4eea446 --- /dev/null +++ b/Content.Client/DeltaV/CartridgeLoader/Cartridges/SecWatchEntryControl.xaml.cs @@ -0,0 +1,21 @@ +using Content.Shared.CartridgeLoader.Cartridges; +using Robust.Client.AutoGenerated; +using Robust.Client.UserInterface; +using Robust.Client.UserInterface.Controls; +using Robust.Client.UserInterface.XAML; + +namespace Content.Client.DeltaV.CartridgeLoader.Cartridges; + +[GenerateTypedNameReferences] +public sealed partial class SecWatchEntryControl : BoxContainer +{ + public SecWatchEntryControl(SecWatchEntry entry) + { + RobustXamlLoader.Load(this); + + Status.Text = Loc.GetString($"criminal-records-status-{entry.Status.ToString().ToLower()}"); + Title.Text = Loc.GetString("sec-watch-entry", ("name", entry.Name), ("job", entry.Job)); + + Reason.Text = entry.Reason ?? Loc.GetString("sec-watch-no-reason"); + } +} diff --git a/Content.Client/DeltaV/CartridgeLoader/Cartridges/SecWatchUi.cs b/Content.Client/DeltaV/CartridgeLoader/Cartridges/SecWatchUi.cs new file mode 100644 index 00000000000..da5ff825b91 --- /dev/null +++ b/Content.Client/DeltaV/CartridgeLoader/Cartridges/SecWatchUi.cs @@ -0,0 +1,27 @@ +using Content.Client.UserInterface.Fragments; +using Content.Shared.CartridgeLoader; +using Content.Shared.CartridgeLoader.Cartridges; +using Robust.Client.UserInterface; + +namespace Content.Client.DeltaV.CartridgeLoader.Cartridges; + +public sealed partial class SecWatchUi : UIFragment +{ + private SecWatchUiFragment? _fragment; + + public override Control GetUIFragmentRoot() + { + return _fragment!; + } + + public override void Setup(BoundUserInterface ui, EntityUid? owner) + { + _fragment = new SecWatchUiFragment(); + } + + public override void UpdateState(BoundUserInterfaceState state) + { + if (state is SecWatchUiState cast) + _fragment?.UpdateState(cast); + } +} diff --git a/Content.Client/DeltaV/CartridgeLoader/Cartridges/SecWatchUiFragment.xaml b/Content.Client/DeltaV/CartridgeLoader/Cartridges/SecWatchUiFragment.xaml new file mode 100644 index 00000000000..7fb2c42debc --- /dev/null +++ b/Content.Client/DeltaV/CartridgeLoader/Cartridges/SecWatchUiFragment.xaml @@ -0,0 +1,13 @@ + + + + diff --git a/Content.Client/DeltaV/CartridgeLoader/Cartridges/SecWatchUiFragment.xaml.cs b/Content.Client/DeltaV/CartridgeLoader/Cartridges/SecWatchUiFragment.xaml.cs new file mode 100644 index 00000000000..ad152840529 --- /dev/null +++ b/Content.Client/DeltaV/CartridgeLoader/Cartridges/SecWatchUiFragment.xaml.cs @@ -0,0 +1,25 @@ +using Content.Shared.CartridgeLoader.Cartridges; +using Robust.Client.AutoGenerated; +using Robust.Client.UserInterface.Controls; +using Robust.Client.UserInterface.XAML; + +namespace Content.Client.DeltaV.CartridgeLoader.Cartridges; + +[GenerateTypedNameReferences] +public sealed partial class SecWatchUiFragment : BoxContainer +{ + public SecWatchUiFragment() + { + RobustXamlLoader.Load(this); + } + + public void UpdateState(SecWatchUiState state) + { + NoEntries.Visible = state.Entries.Count == 0; + Entries.RemoveAllChildren(); + foreach (var entry in state.Entries) + { + Entries.AddChild(new SecWatchEntryControl(entry)); + } + } +} diff --git a/Content.Server/DeltaV/CartridgeLoader/Cartridges/SecWatchCartridgeComponent.cs b/Content.Server/DeltaV/CartridgeLoader/Cartridges/SecWatchCartridgeComponent.cs new file mode 100644 index 00000000000..7ccc90ef797 --- /dev/null +++ b/Content.Server/DeltaV/CartridgeLoader/Cartridges/SecWatchCartridgeComponent.cs @@ -0,0 +1,23 @@ +using Content.Shared.Security; + +namespace Content.Server.CartridgeLoader.Cartridges; + +[RegisterComponent, Access(typeof(SecWatchCartridgeSystem))] +public sealed partial class SecWatchCartridgeComponent : Component +{ + /// + /// Only show people with these statuses. + /// + [DataField] + public List Statuses = new() + { + SecurityStatus.Suspected, + SecurityStatus.Wanted + }; + + /// + /// Station entity thats getting its records checked. + /// + [DataField] + public EntityUid? Station; +} diff --git a/Content.Server/DeltaV/CartridgeLoader/Cartridges/SecWatchCartridgeSystem.cs b/Content.Server/DeltaV/CartridgeLoader/Cartridges/SecWatchCartridgeSystem.cs new file mode 100644 index 00000000000..16da24514cb --- /dev/null +++ b/Content.Server/DeltaV/CartridgeLoader/Cartridges/SecWatchCartridgeSystem.cs @@ -0,0 +1,73 @@ +using Content.Server.Station.Systems; +using Content.Server.StationRecords; +using Content.Server.StationRecords.Systems; +using Content.Shared.CartridgeLoader; +using Content.Shared.CartridgeLoader.Cartridges; +using Content.Shared.CriminalRecords; +using Content.Shared.StationRecords; + +namespace Content.Server.CartridgeLoader.Cartridges; + +public sealed class SecWatchCartridgeSystem : EntitySystem +{ + [Dependency] private readonly CartridgeLoaderSystem _cartridgeLoader = default!; + [Dependency] private readonly StationRecordsSystem _records = default!; + [Dependency] private readonly StationSystem _station = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnRecordModified); + + SubscribeLocalEvent(OnUiReady); + } + + private void OnRecordModified(RecordModifiedEvent args) + { + // when a record is modified update the ui of every loaded cartridge tuned to the same station + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var comp, out var cartridge)) + { + if (cartridge.LoaderUid is not {} loader || comp.Station != args.Station) + continue; + + UpdateUI((uid, comp), loader); + } + } + + private void OnUiReady(Entity ent, ref CartridgeUiReadyEvent args) + { + UpdateUI(ent, args.Loader); + } + + private void UpdateUI(Entity ent, EntityUid loader) + { + // if the loader is on a grid, update the station + // if it is off grid use the cached station + if (_station.GetOwningStation(loader) is {} station) + ent.Comp.Station = station; + + if (!TryComp(ent.Comp.Station, out var records)) + return; + + station = ent.Comp.Station.Value; + + var entries = new List(); + foreach (var (id, criminal) in _records.GetRecordsOfType(station, records)) + { + if (!ent.Comp.Statuses.Contains(criminal.Status)) + continue; + + var key = new StationRecordKey(id, station); + if (!_records.TryGetRecord(key, out var general, records)) + continue; + + var status = criminal.Status; + entries.Add(new SecWatchEntry(general.Name, general.JobTitle, criminal.Status, criminal.Reason)); + } + + var state = new SecWatchUiState(entries); + _cartridgeLoader.UpdateCartridgeUiState(loader, state); + } +} diff --git a/Content.Server/DeltaV/CartridgeLoader/CrimeAssistCartridgeComponent.cs b/Content.Server/DeltaV/CartridgeLoader/CrimeAssistCartridgeComponent.cs deleted file mode 100644 index 741a6134580..00000000000 --- a/Content.Server/DeltaV/CartridgeLoader/CrimeAssistCartridgeComponent.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace Content.Server.DeltaV.CartridgeLoader.Cartridges; - -[RegisterComponent] -public sealed partial class CrimeAssistCartridgeComponent : Component -{ } diff --git a/Content.Server/DeltaV/CartridgeLoader/CrimeAssistCartridgeSystem.cs b/Content.Server/DeltaV/CartridgeLoader/CrimeAssistCartridgeSystem.cs deleted file mode 100644 index 06732c2c534..00000000000 --- a/Content.Server/DeltaV/CartridgeLoader/CrimeAssistCartridgeSystem.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Content.Shared.CartridgeLoader; -using Content.Server.DeltaV.CartridgeLoader; -using Content.Server.CartridgeLoader.Cartridges; -using Content.Server.CartridgeLoader; - -namespace Content.Server.DeltaV.CartridgeLoader.Cartridges; - -public sealed class CrimeAssistCartridgeSystem : EntitySystem -{ - [Dependency] private readonly CartridgeLoaderSystem? _cartridgeLoaderSystem = default!; - - public override void Initialize() - { - base.Initialize(); - } -} diff --git a/Content.Shared/DeltaV/CartridgeLoader/Cartridges/CrimeAssistUiState.cs b/Content.Shared/DeltaV/CartridgeLoader/Cartridges/CrimeAssistUiState.cs deleted file mode 100644 index dd820f1a0b3..00000000000 --- a/Content.Shared/DeltaV/CartridgeLoader/Cartridges/CrimeAssistUiState.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Content.Shared.CartridgeLoader; -using Robust.Shared.Serialization; - -namespace Content.Shared.DeltaV.CartridgeLoader.Cartridges; - -[Serializable, NetSerializable] -public sealed class CrimeAssistUiState : BoundUserInterfaceState -{ - public CrimeAssistUiState() - { } -} - -[Serializable, NetSerializable] -public sealed class CrimeAssistSyncMessageEvent : CartridgeMessageEvent -{ - public CrimeAssistSyncMessageEvent() - { } -} diff --git a/Content.Shared/DeltaV/CartridgeLoader/Cartridges/SecWatchUiState.cs b/Content.Shared/DeltaV/CartridgeLoader/Cartridges/SecWatchUiState.cs new file mode 100644 index 00000000000..068b54a6ffb --- /dev/null +++ b/Content.Shared/DeltaV/CartridgeLoader/Cartridges/SecWatchUiState.cs @@ -0,0 +1,24 @@ +using Content.Shared.Security; +using Robust.Shared.Serialization; + +namespace Content.Shared.CartridgeLoader.Cartridges; + +/// +/// Show a list of wanted and suspected people from criminal records. +/// +[Serializable, NetSerializable] +public sealed class SecWatchUiState : BoundUserInterfaceState +{ + public readonly List Entries; + + public SecWatchUiState(List entries) + { + Entries = entries; + } +} + +/// +/// Entry for a person who is wanted or suspected. +/// +[Serializable, NetSerializable] +public record struct SecWatchEntry(string Name, string Job, SecurityStatus Status, string? Reason); diff --git a/Resources/Locale/en-US/deltav/cartridge-loader/secwatch.ftl b/Resources/Locale/en-US/deltav/cartridge-loader/secwatch.ftl new file mode 100644 index 00000000000..a5b96eab08f --- /dev/null +++ b/Resources/Locale/en-US/deltav/cartridge-loader/secwatch.ftl @@ -0,0 +1,5 @@ +sec-watch-program-name = SecWatch +sec-watch-title = SecWatch 1.0 +sec-watch-no-entries = Everything's calm. Why not enjoy a Monkin Donut? +sec-watch-entry = {$name}, {$job} +sec-watch-no-reason = None given??? diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Devices/cartridges.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Devices/cartridges.yml index e3d5e9d2138..def215cee43 100644 --- a/Resources/Prototypes/DeltaV/Entities/Objects/Devices/cartridges.yml +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Devices/cartridges.yml @@ -17,4 +17,24 @@ icon: sprite: DeltaV/Icons/cri.rsi state: cri - - type: CrimeAssistCartridge + +- type: entity + parent: BaseItem + id: SecWatchCartridge + name: sec watch cartridge + description: A cartridge that tracks the status of currently wanted individuals. + components: + - type: Sprite + sprite: DeltaV/Objects/Devices/cartridge.rsi + state: cart-cri + - type: Icon + sprite: DeltaV/Objects/Devices/cartridge.rsi + state: cart-cri + - type: UIFragment + ui: !type:SecWatchUi + - type: Cartridge + programName: sec-watch-program-name + icon: + sprite: Objects/Weapons/Melee/stunbaton.rsi + state: stunbaton_on + - type: SecWatchCartridge diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Devices/pda.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Devices/pda.yml index 6ee3a7543f7..d9607390cd7 100644 --- a/Resources/Prototypes/DeltaV/Entities/Objects/Devices/pda.yml +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Devices/pda.yml @@ -20,12 +20,13 @@ map: [ "enum.PdaVisualLayers.IdLight" ] shader: "unshaded" visible: false - - type: CartridgeLoader # DeltaV - Crime Assist + - type: CartridgeLoader # DeltaV - Crime Assist + SecWatch preinstalled: - CrewManifestCartridge - NotekeeperCartridge - NewsReaderCartridge - CrimeAssistCartridge + - SecWatchCartridge - type: Pda id: BrigmedicIDCard state: pda-corpsman diff --git a/Resources/Prototypes/Entities/Objects/Devices/pda.yml b/Resources/Prototypes/Entities/Objects/Devices/pda.yml index 706cbd5dbbf..7155be68d74 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/pda.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/pda.yml @@ -173,12 +173,13 @@ accentVColor: "#A32D26" - type: Icon state: pda-interncadet - - type: CartridgeLoader # DeltaV - Crime Assist + - type: CartridgeLoader # DeltaV - Crime Assist + SecWatch preinstalled: - CrewManifestCartridge - NotekeeperCartridge - NewsReaderCartridge - CrimeAssistCartridge + - SecWatchCartridge - type: entity parent: BasePDA @@ -430,12 +431,13 @@ borderColor: "#6f6192" - type: Icon state: pda-lawyer - - type: CartridgeLoader # DeltaV - Crime Assist + - type: CartridgeLoader # DeltaV - Crime Assist + SecWatch preinstalled: - CrewManifestCartridge - NotekeeperCartridge - NewsReaderCartridge - CrimeAssistCartridge + - SecWatchCartridge - type: entity parent: BasePDA @@ -643,12 +645,13 @@ accentHColor: "#447987" - type: Icon state: pda-hos - - type: CartridgeLoader # DeltaV - Crime Assist + - type: CartridgeLoader # DeltaV - Crime Assist + SecWatch preinstalled: - CrewManifestCartridge - NotekeeperCartridge - NewsReaderCartridge - CrimeAssistCartridge + - SecWatchCartridge - type: entity parent: BasePDA @@ -664,12 +667,13 @@ accentVColor: "#949137" - type: Icon state: pda-warden - - type: CartridgeLoader # DeltaV - Crime Assist + - type: CartridgeLoader # DeltaV - Crime Assist + SecWatch preinstalled: - CrewManifestCartridge - NotekeeperCartridge - NewsReaderCartridge - CrimeAssistCartridge + - SecWatchCartridge - type: entity parent: BasePDA @@ -684,12 +688,13 @@ borderColor: "#A32D26" - type: Icon state: pda-security - - type: CartridgeLoader # DeltaV - Crime Assist + - type: CartridgeLoader # DeltaV - Crime Assist + SecWatch preinstalled: - CrewManifestCartridge - NotekeeperCartridge - NewsReaderCartridge - CrimeAssistCartridge + - SecWatchCartridge - type: entity parent: BasePDA @@ -979,12 +984,13 @@ borderColor: "#774705" - type: Icon state: pda-detective - - type: CartridgeLoader # DeltaV - Crime Assist + - type: CartridgeLoader # DeltaV - Crime Assist + SecWatch preinstalled: - CrewManifestCartridge - NotekeeperCartridge - NewsReaderCartridge - CrimeAssistCartridge + - SecWatchCartridge - type: entity parent: BaseMedicalPDA @@ -1001,12 +1007,13 @@ accentVColor: "#d7d7d0" - type: Icon state: pda-brigmedic - - type: CartridgeLoader # DeltaV - Crime Assist + - type: CartridgeLoader # DeltaV - Crime Assist + SecWatch preinstalled: - CrewManifestCartridge - NotekeeperCartridge - NewsReaderCartridge - CrimeAssistCartridge + - SecWatchCartridge - type: entity parent: ClownPDA @@ -1092,12 +1099,13 @@ accentVColor: "#DFDFDF" - type: Icon state: pda-seniorofficer - - type: CartridgeLoader # DeltaV - Crime Assist + - type: CartridgeLoader # DeltaV - Crime Assist + SecWatch preinstalled: - CrewManifestCartridge - NotekeeperCartridge - NewsReaderCartridge - CrimeAssistCartridge + - SecWatchCartridge - type: entity parent: SyndiPDA diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Devices/pda.yml b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Devices/pda.yml index c2fd8786aff..4e6115ba339 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Devices/pda.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Devices/pda.yml @@ -32,12 +32,13 @@ accentVColor: "#DFDFDF" - type: Icon state: pda-security - - type: CartridgeLoader # DeltaV - Crime Assist + - type: CartridgeLoader # DeltaV - Crime Assist + SecWatch preinstalled: - CrewManifestCartridge - NotekeeperCartridge - NewsReaderCartridge - CrimeAssistCartridge + - SecWatchCartridge - type: entity parent: BasePDA From 2dcab4d57f74e25f4a1aafa23f48463ad6251516 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Tue, 2 Jul 2024 08:01:57 +0000 Subject: [PATCH 114/155] Automatic Changelog Update (#502) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index e4e812edeb4..cd2ca0c929f 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4271,3 +4271,11 @@ Entries: message: Fixed loadouts becoming uneditable after spending all your points id: 6134 time: '2024-07-02T07:18:27.0000000+00:00' +- author: deltanedas + changes: + - type: Add + message: >- + Security can find the new SecWatch™ app in their PDAs to see current + suspects and wanted criminals. + id: 6135 + time: '2024-07-02T08:01:36.0000000+00:00' From 2e8e56f763a5cda63511a1aaae0d649ff64eedad Mon Sep 17 00:00:00 2001 From: Mnemotechnican <69920617+Mnemotechnician@users.noreply.github.com> Date: Wed, 3 Jul 2024 22:48:28 +0300 Subject: [PATCH 115/155] Fix Clothing Quick-Equip (#507) # Description For some reason, ClothingSystem.TryEquip would return false if there's a do-after to equip the clothing. This had caused all quick-equip attempts on SMALL ITEMS to fail and ended up with every SMALL clothing item being equipped into one of the pocket slots (which have no equip delays). Also fixes quick swap - see the comments below. # Changelog :cl: - fix: Equipping clothing using the Z key works correctly again. --- Content.Shared/Clothing/EntitySystems/ClothingSystem.cs | 5 +++++ Content.Shared/Inventory/InventorySystem.Equip.cs | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs b/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs index f189db005bc..976682c9903 100644 --- a/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs +++ b/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs @@ -62,6 +62,11 @@ private void QuickEquip( { foreach (var slotDef in userEnt.Comp1.Slots) { + // Do not attempt to quick-equip clothing in pocket slots. + // We should probably add a special flag to SlotDefinition to skip quick equip if more similar slots get added. + if (slotDef.SlotFlags.HasFlag(SlotFlags.POCKET)) + continue; + if (!_invSystem.CanEquip(userEnt, toEquipEnt, slotDef.Name, out _, slotDef, userEnt, toEquipEnt)) continue; diff --git a/Content.Shared/Inventory/InventorySystem.Equip.cs b/Content.Shared/Inventory/InventorySystem.Equip.cs index 24006b0c9f9..7bdd17ee6fa 100644 --- a/Content.Shared/Inventory/InventorySystem.Equip.cs +++ b/Content.Shared/Inventory/InventorySystem.Equip.cs @@ -176,7 +176,7 @@ public bool TryEquip(EntityUid actor, EntityUid target, EntityUid itemUid, strin }; _doAfter.TryStartDoAfter(args); - return false; + return true; // Changed to return true even if the item wasn't equipped instantly } if (!_containerSystem.Insert(itemUid, slotContainer)) From 6aaf4664ad1b9d150da9af30c27bfc31858de8d6 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Wed, 3 Jul 2024 19:48:50 +0000 Subject: [PATCH 116/155] Automatic Changelog Update (#507) --- Resources/Changelog/Changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index cd2ca0c929f..c4056561c9c 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4279,3 +4279,9 @@ Entries: suspects and wanted criminals. id: 6135 time: '2024-07-02T08:01:36.0000000+00:00' +- author: Mnemotechnician + changes: + - type: Fix + message: Equipping clothing using the Z key works correctly again. + id: 6136 + time: '2024-07-03T19:48:29.0000000+00:00' From e092203d1134521f95c44c424bfa57f1ec7ffe53 Mon Sep 17 00:00:00 2001 From: Mnemotechnican <69920617+Mnemotechnician@users.noreply.github.com> Date: Fri, 5 Jul 2024 19:53:25 +0300 Subject: [PATCH 117/155] Frictionfull Space (#514) # Description Makes it so that the station and the ATS get a very tiny bit of friction to prevent cargo tech pros from sending either of those out of this galaxy cluster (which has actually happened multiple times on two servers and required either admin intervention or early round ending). # Technical details Added a PassiveDampeningComponent which defines how much friction an entity receives while in 0g. FrictionRemoverSystem was updated to try to fetch this component from an entity before updating its dampening. A new system was added to automatically add this component (if it's not already defined) to all station grids. # Media See the #when-you-code-it channel for a preview. It's kinda hard to demonstrate, but after a few minutes, stations and the ATS come to an almost complete stop. # Changelog :cl: - tweak: Space stations now have a tiny bit of velocity dampening to prevent them from being flunged into the void. --- .../Station/Systems/StationDampeningSystem.cs | 28 +++++++++++++++++++ .../Physics/FrictionRemoverSystem.cs | 13 +++++++-- .../Physics/PassiveDampeningComponent.cs | 18 ++++++++++++ Resources/Maps/Shuttles/trading_outpost.yml | 3 ++ 4 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 Content.Server/Station/Systems/StationDampeningSystem.cs create mode 100644 Content.Shared/Physics/PassiveDampeningComponent.cs diff --git a/Content.Server/Station/Systems/StationDampeningSystem.cs b/Content.Server/Station/Systems/StationDampeningSystem.cs new file mode 100644 index 00000000000..f499127031e --- /dev/null +++ b/Content.Server/Station/Systems/StationDampeningSystem.cs @@ -0,0 +1,28 @@ +using Content.Server.Station.Events; +using Content.Shared.Physics; + +namespace Content.Server.Station.Systems; + +public sealed class StationDampeningSystem : EntitySystem +{ + public override void Initialize() + { + SubscribeLocalEvent(OnInitStation); + } + + private void OnInitStation(ref StationPostInitEvent ev) + { + foreach (var grid in ev.Station.Comp.Grids) + { + // If the station grid doesn't have defined dampening, give it a small dampening by default + // This will ensure cargo tech pros won't fling the station 1000 megaparsec away from the galaxy + if (!TryComp(grid, out var dampening)) + { + dampening = AddComp(grid); + dampening.Enabled = true; + dampening.LinearDampening = 0.01f; + dampening.AngularDampening = 0.01f; + } + } + } +} diff --git a/Content.Shared/Physics/FrictionRemoverSystem.cs b/Content.Shared/Physics/FrictionRemoverSystem.cs index 65bbe9e4d23..c8d7521eb01 100644 --- a/Content.Shared/Physics/FrictionRemoverSystem.cs +++ b/Content.Shared/Physics/FrictionRemoverSystem.cs @@ -1,3 +1,4 @@ +using Robust.Shared.Map.Components; using Robust.Shared.Physics; using Robust.Shared.Physics.Components; using Robust.Shared.Physics.Systems; @@ -19,7 +20,15 @@ public override void Initialize() private void RemoveDampening(EntityUid uid, PhysicsComponent component, PhysicsSleepEvent args) { - _physics.SetAngularDamping(uid, component, 0f, false); - _physics.SetLinearDamping(uid, component, 0f); + var linear = 0f; + var angular = 0f; + if (TryComp(uid, out var dampening) && dampening.Enabled) + { + linear = dampening.LinearDampening; + angular = dampening.AngularDampening; + } + + _physics.SetAngularDamping(uid, component, angular, false); + _physics.SetLinearDamping(uid, component, linear); } } diff --git a/Content.Shared/Physics/PassiveDampeningComponent.cs b/Content.Shared/Physics/PassiveDampeningComponent.cs new file mode 100644 index 00000000000..834569195ee --- /dev/null +++ b/Content.Shared/Physics/PassiveDampeningComponent.cs @@ -0,0 +1,18 @@ +namespace Content.Shared.Physics; + +/// +/// A component that allows an entity to have friction (linear and angular dampening) +/// even when not being affected by gravity. +/// +[RegisterComponent] +public sealed partial class PassiveDampeningComponent : Component +{ + [DataField] + public bool Enabled = true; + + [DataField] + public float LinearDampening = 0.2f; + + [DataField] + public float AngularDampening = 0.2f; +} diff --git a/Resources/Maps/Shuttles/trading_outpost.yml b/Resources/Maps/Shuttles/trading_outpost.yml index f040d58253d..7b968b5c13d 100644 --- a/Resources/Maps/Shuttles/trading_outpost.yml +++ b/Resources/Maps/Shuttles/trading_outpost.yml @@ -60,6 +60,9 @@ entities: linearDamping: 0.05 fixedRotation: False bodyType: Dynamic + - type: PassiveDampening # To prevent cargotechs from flingling it away. + linearDampening: 0.01 + angularDampening: 0.01 - type: Fixtures fixtures: {} - type: OccluderTree From 81dd78259e66b6fda06fcb7c4b76b365eb4f652a Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Fri, 5 Jul 2024 16:53:46 +0000 Subject: [PATCH 118/155] Automatic Changelog Update (#514) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index c4056561c9c..847b9c90fbe 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4285,3 +4285,11 @@ Entries: message: Equipping clothing using the Z key works correctly again. id: 6136 time: '2024-07-03T19:48:29.0000000+00:00' +- author: Mnemotechnician + changes: + - type: Tweak + message: >- + Space stations now have a tiny bit of velocity dampening to prevent them + from being flunged into the void. + id: 6137 + time: '2024-07-05T16:53:25.0000000+00:00' From 58be8504857c54d311e9100ee89b921d2437ee35 Mon Sep 17 00:00:00 2001 From: Mnemotechnican <69920617+Mnemotechnician@users.noreply.github.com> Date: Fri, 5 Jul 2024 20:28:44 +0300 Subject: [PATCH 119/155] Port All Carrying/PseudoItem/EscapeInventory Tweaks From DeltaV (#484) # Description This cherry-picks the following two PRs of mine from delta-v: - https://github.com/DeltaV-Station/Delta-v/pull/1118 (this one is a port of two other frontier PRs, see the original description for details) - https://github.com/DeltaV-Station/Delta-v/pull/1232 Encompassing a total of 8 distinct changes: 1. Fixes dropping the carried person when walking to a different grid (from station to shuttle or vice versa. Walking into space however will still make you drop them) and also makes sure that pressing shift while being carried does not make you escape. 2. Ensures that the carried person is always centered relative to the parent (under certain conditions, such as walking near a gravitational anomaly, their position can change, and that leads to really weird effects) 3. Fixes the mass contest in CarryingSystem that caused stronger entities to take longer to escape than weaker ones. 4. Adds popups for when you're getting picked up or being stuffed into a bag as a pseudo-item (e.g. a felinid) 5. Adds an action to stop escaping an inventory. This action gets added to your action bar when you attempt escaping and gets removed when you stop or escape. It applies both to carrying and items (hampsters, felinids, whatever else). 6. Adds a sleep action for pseudo-items stuffed inside a suitable bag. The bag must have a special component, which is added to the base backpack item and thus inherited by all soft bags (duffels, satchels, etc). Contrary to a popular belief, sleeping IS PURELY COSMETICAL and does not provide healing. (Beds provide healing when you buckle into them and that healing does not depend on whether or not you're sleeping) 7. Makes it so that when you try to take a pseudo-item out of the bag (e.g. a felinid), you automatically try to carry them (if you don't have enough free hands, they will be dropped on the floor like usually), and enables you to insert the carried person into a bag, but only if they're a pseudo-item (e.g. felinid). 8. Allows pseudoitems to be inserted into bags even when there are other items (as long as there's enough space) --- ## For technical details and video showcases, see the original PRs This PR is split into separate commits so different parts can be reverted if deemed unneccessary. --- # Changelog :cl: - fix: Carrying is less likely to behave erratically or suddenly interrupt now. - add: You can now see when someone is trying to pick you up, and also you can interrupt your attempt at escaping from their hands or inventory. - add: You can now properly take Felinids out of bags and place them inside. - add: Scientists have discovered that Felinids can sleep in bags. --- .../Nyanotrasen/Carrying/CarryingSystem.cs | 116 +++++++++++- .../Item/PseudoItem/PseudoItemSystem.cs | 30 +++- .../Resist/CanEscapeInventoryComponent.cs | 6 + .../Resist/EscapeInventorySystem.cs | 26 +++ .../PseudoItem/AllowsSleepInsideComponent.cs | 9 + .../Item/PseudoItem/PseudoItemComponent.cs | 14 +- .../SharedPseudoItemSystem.Checks.cs | 166 ++---------------- .../Item/PseudoItem/SharedPseudoItemSystem.cs | 24 ++- .../Resist/EscapeInventoryCancelEvent.cs | 5 + .../Locale/en-US/actions/actions/sleep.ftl | 2 + .../en-US/nyanotrasen/carrying/carry.ftl | 1 + Resources/Prototypes/Actions/misc.yml | 10 ++ .../Entities/Clothing/Back/backpacks.yml | 3 +- .../escapeinventory.rsi/cancel-escape.png | Bin 0 -> 559 bytes .../Actions/escapeinventory.rsi/meta.json | 14 ++ 15 files changed, 259 insertions(+), 167 deletions(-) create mode 100644 Content.Shared/Nyanotrasen/Item/PseudoItem/AllowsSleepInsideComponent.cs create mode 100644 Content.Shared/Resist/EscapeInventoryCancelEvent.cs create mode 100644 Resources/Prototypes/Actions/misc.yml create mode 100644 Resources/Textures/Actions/escapeinventory.rsi/cancel-escape.png create mode 100644 Resources/Textures/Actions/escapeinventory.rsi/meta.json diff --git a/Content.Server/Nyanotrasen/Carrying/CarryingSystem.cs b/Content.Server/Nyanotrasen/Carrying/CarryingSystem.cs index bb071334fa1..103731b1b04 100644 --- a/Content.Server/Nyanotrasen/Carrying/CarryingSystem.cs +++ b/Content.Server/Nyanotrasen/Carrying/CarryingSystem.cs @@ -1,3 +1,4 @@ +using System.Numerics; using System.Threading; using Content.Server.DoAfter; using Content.Server.Body.Systems; @@ -5,6 +6,7 @@ using Content.Server.Resist; using Content.Server.Popups; using Content.Server.Inventory; +using Content.Server.Nyanotrasen.Item.PseudoItem; using Content.Shared.Climbing; // Shared instead of Server using Content.Shared.Mobs; using Content.Shared.DoAfter; @@ -23,9 +25,12 @@ using Content.Shared.Standing; using Content.Shared.ActionBlocker; using Content.Shared.Inventory.VirtualItem; +using Content.Shared.Item; using Content.Shared.Throwing; using Content.Shared.Physics.Pull; using Content.Shared.Mobs.Systems; +using Content.Shared.Nyanotrasen.Item.PseudoItem; +using Content.Shared.Storage; using Robust.Shared.Map.Components; using Robust.Shared.Physics.Components; @@ -44,11 +49,13 @@ public sealed class CarryingSystem : EntitySystem [Dependency] private readonly PopupSystem _popupSystem = default!; [Dependency] private readonly MovementSpeedModifierSystem _movementSpeed = default!; [Dependency] private readonly RespiratorSystem _respirator = default!; + [Dependency] private readonly PseudoItemSystem _pseudoItem = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent>(AddCarryVerb); + SubscribeLocalEvent>(AddInsertCarriedVerb); SubscribeLocalEvent(OnVirtualItemDeleted); SubscribeLocalEvent(OnThrow); SubscribeLocalEvent(OnParentChanged); @@ -64,7 +71,6 @@ public override void Initialize() SubscribeLocalEvent(OnDoAfter); } - private void AddCarryVerb(EntityUid uid, CarriableComponent component, GetVerbsEvent args) { if (!args.CanInteract || !args.CanAccess) @@ -97,6 +103,33 @@ private void AddCarryVerb(EntityUid uid, CarriableComponent component, GetVerbsE args.Verbs.Add(verb); } + private void AddInsertCarriedVerb(EntityUid uid, CarryingComponent component, GetVerbsEvent args) + { + // If the person is carrying someone, and the carried person is a pseudo-item, and the target entity is a storage, + // then add an action to insert the carried entity into the target + var toInsert = args.Using; + if (toInsert is not { Valid: true } || !args.CanAccess || !TryComp(toInsert, out var pseudoItem)) + return; + + if (!TryComp(args.Target, out var storageComp)) + return; + + if (!_pseudoItem.CheckItemFits((toInsert.Value, pseudoItem), (args.Target, storageComp))) + return; + + InnateVerb verb = new() + { + Act = () => + { + DropCarried(uid, toInsert.Value); + _pseudoItem.TryInsert(args.Target, toInsert.Value, pseudoItem, storageComp); + }, + Text = Loc.GetString("action-name-insert-other", ("target", toInsert)), + Priority = 2 + }; + args.Verbs.Add(verb); + } + /// /// Since the carried entity is stored as 2 virtual items, when deleted we want to drop them. /// @@ -125,7 +158,12 @@ private void OnThrow(EntityUid uid, CarryingComponent component, BeforeThrowEven private void OnParentChanged(EntityUid uid, CarryingComponent component, ref EntParentChangedMessage args) { - if (Transform(uid).MapID != args.OldMapId) + var xform = Transform(uid); + if (xform.MapID != args.OldMapId) + return; + + // Do not drop the carried entity if the new parent is a grid + if (xform.ParentUid == xform.GridUid) return; DropCarried(uid, component.Carried); @@ -158,9 +196,13 @@ private void OnMoveInput(EntityUid uid, BeingCarriedComponent component, ref Mov if (!TryComp(uid, out var escape)) return; + if (!args.HasDirectionalMovement) + return; + if (_actionBlockerSystem.CanInteract(uid, component.Carrier)) { - _escapeInventorySystem.AttemptEscape(uid, component.Carrier, escape, MassContest(uid, component.Carrier)); + // Note: the mass contest is inverted because weaker entities are supposed to take longer to escape + _escapeInventorySystem.AttemptEscape(uid, component.Carrier, escape, MassContest(component.Carrier, uid)); } } @@ -209,12 +251,7 @@ private void OnDoAfter(EntityUid uid, CarriableComponent component, CarryDoAfter } private void StartCarryDoAfter(EntityUid carrier, EntityUid carried, CarriableComponent component) { - TimeSpan length = TimeSpan.FromSeconds(3); - - var mod = MassContest(carrier, carried); - - if (mod != 0) - length /= mod; + TimeSpan length = GetPickupDuration(carrier, carried); if (length >= TimeSpan.FromSeconds(9)) { @@ -236,6 +273,9 @@ private void StartCarryDoAfter(EntityUid carrier, EntityUid carried, CarriableCo }; _doAfterSystem.TryStartDoAfter(args); + + // Show a popup to the person getting picked up + _popupSystem.PopupEntity(Loc.GetString("carry-started", ("carrier", carrier)), carried, carried); } private void Carry(EntityUid carrier, EntityUid carried) @@ -260,6 +300,26 @@ private void Carry(EntityUid carrier, EntityUid carried) _actionBlockerSystem.UpdateCanMove(carried); } + public bool TryCarry(EntityUid carrier, EntityUid toCarry, CarriableComponent? carriedComp = null) + { + if (!Resolve(toCarry, ref carriedComp, false)) + return false; + + if (!CanCarry(carrier, toCarry, carriedComp)) + return false; + + // The second one means that carrier is a pseudo-item and is inside a bag. + if (HasComp(carrier) || HasComp(carrier)) + return false; + + if (GetPickupDuration(carrier, toCarry) > TimeSpan.FromSeconds(9)) + return false; + + Carry(carrier, toCarry); + + return true; + } + public void DropCarried(EntityUid carrier, EntityUid carried) { RemComp(carrier); // get rid of this first so we don't recusrively fire that event @@ -323,5 +383,43 @@ private float MassContest(EntityUid roller, EntityUid target, PhysicsComponent? return rollerPhysics.FixturesMass / targetPhysics.FixturesMass; } + + private TimeSpan GetPickupDuration(EntityUid carrier, EntityUid carried) + { + var length = TimeSpan.FromSeconds(3); + + var mod = MassContest(carrier, carried); + if (mod != 0) + length /= mod; + + return length; + } + + public override void Update(float frameTime) + { + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var carried, out var comp)) + { + var carrier = comp.Carrier; + if (carrier is not { Valid: true } || carried is not { Valid: true }) + continue; + + // SOMETIMES - when an entity is inserted into disposals, or a cryosleep chamber - it can get re-parented without a proper reparent event + // when this happens, it needs to be dropped because it leads to weird behavior + if (Transform(carried).ParentUid != carrier) + { + DropCarried(carrier, carried); + continue; + } + + // Make sure the carried entity is always centered relative to the carrier, as gravity pulls can offset it otherwise + var xform = Transform(carried); + if (!xform.LocalPosition.Equals(Vector2.Zero)) + { + xform.LocalPosition = Vector2.Zero; + } + } + query.Dispose(); + } } } diff --git a/Content.Server/Nyanotrasen/Item/PseudoItem/PseudoItemSystem.cs b/Content.Server/Nyanotrasen/Item/PseudoItem/PseudoItemSystem.cs index 76cfe7d904b..6df387e6ba8 100644 --- a/Content.Server/Nyanotrasen/Item/PseudoItem/PseudoItemSystem.cs +++ b/Content.Server/Nyanotrasen/Item/PseudoItem/PseudoItemSystem.cs @@ -1,6 +1,9 @@ -using Content.Server.DoAfter; +using Content.Server.Carrying; +using Content.Server.DoAfter; using Content.Server.Item; +using Content.Server.Popups; using Content.Server.Storage.EntitySystems; +using Content.Shared.Bed.Sleep; using Content.Shared.DoAfter; using Content.Shared.IdentityManagement; using Content.Shared.Item; @@ -17,12 +20,14 @@ public sealed class PseudoItemSystem : SharedPseudoItemSystem [Dependency] private readonly StorageSystem _storage = default!; [Dependency] private readonly ItemSystem _item = default!; [Dependency] private readonly DoAfterSystem _doAfter = default!; - + [Dependency] private readonly CarryingSystem _carrying = default!; + [Dependency] private readonly PopupSystem _popup = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent>(AddInsertAltVerb); + SubscribeLocalEvent(OnTrySleeping); } private void AddInsertAltVerb(EntityUid uid, PseudoItemComponent component, GetVerbsEvent args) @@ -53,4 +58,25 @@ private void AddInsertAltVerb(EntityUid uid, PseudoItemComponent component, GetV }; args.Verbs.Add(verb); } + + protected override void OnGettingPickedUpAttempt(EntityUid uid, PseudoItemComponent component, GettingPickedUpAttemptEvent args) + { + // Try to pick the entity up instead first + if (args.User != args.Item && _carrying.TryCarry(args.User, uid)) + { + args.Cancel(); + return; + } + + // If could not pick up, just take it out onto the ground as per default + base.OnGettingPickedUpAttempt(uid, component, args); + } + + // Show a popup when a pseudo-item falls asleep inside a bag. + private void OnTrySleeping(EntityUid uid, PseudoItemComponent component, TryingToSleepEvent args) + { + var parent = Transform(uid).ParentUid; + if (!HasComp(uid) && parent is { Valid: true } && HasComp(parent)) + _popup.PopupEntity(Loc.GetString("popup-sleep-in-bag", ("entity", uid)), uid); + } } diff --git a/Content.Server/Resist/CanEscapeInventoryComponent.cs b/Content.Server/Resist/CanEscapeInventoryComponent.cs index 19b4abf7d0c..978e03d95f9 100644 --- a/Content.Server/Resist/CanEscapeInventoryComponent.cs +++ b/Content.Server/Resist/CanEscapeInventoryComponent.cs @@ -15,4 +15,10 @@ public sealed partial class CanEscapeInventoryComponent : Component [DataField("doAfter")] public DoAfterId? DoAfter; + + /// + /// Action to cancel inventory escape. + /// + [DataField] + public EntityUid? EscapeCancelAction; } diff --git a/Content.Server/Resist/EscapeInventorySystem.cs b/Content.Server/Resist/EscapeInventorySystem.cs index 127db7d2b34..95a470e9093 100644 --- a/Content.Server/Resist/EscapeInventorySystem.cs +++ b/Content.Server/Resist/EscapeInventorySystem.cs @@ -5,6 +5,7 @@ using Content.Shared.Hands.EntitySystems; using Content.Server.Storage.Components; using Content.Shared.ActionBlocker; +using Content.Shared.Actions; using Content.Shared.DoAfter; using Content.Shared.Hands.EntitySystems; using Content.Shared.Interaction.Events; @@ -13,6 +14,7 @@ using Content.Shared.Resist; using Content.Shared.Storage; using Robust.Shared.Containers; +using Robust.Shared.Prototypes; namespace Content.Server.Resist; @@ -24,11 +26,17 @@ public sealed class EscapeInventorySystem : EntitySystem [Dependency] private readonly ActionBlockerSystem _actionBlockerSystem = default!; [Dependency] private readonly SharedHandsSystem _handsSystem = default!; [Dependency] private readonly CarryingSystem _carryingSystem = default!; // Carrying system from Nyanotrasen. + [Dependency] private readonly SharedActionsSystem _actions = default!; /// /// You can't escape the hands of an entity this many times more massive than you. /// public const float MaximumMassDisadvantage = 6f; + /// + /// Action to cancel inventory escape + /// + [ValidatePrototypeId] + private readonly string _escapeCancelAction = "ActionCancelEscape"; public override void Initialize() { @@ -37,6 +45,7 @@ public override void Initialize() SubscribeLocalEvent(OnRelayMovement); SubscribeLocalEvent(OnEscape); SubscribeLocalEvent(OnDropped); + SubscribeLocalEvent(OnCancelEscape); } private void OnRelayMovement(EntityUid uid, CanEscapeInventoryComponent component, ref MoveInputEvent args) @@ -84,12 +93,20 @@ private void OnRelayMovement(EntityUid uid, CanEscapeInventoryComponent componen _popupSystem.PopupEntity(Loc.GetString("escape-inventory-component-start-resisting"), user, user); _popupSystem.PopupEntity(Loc.GetString("escape-inventory-component-start-resisting-target"), container, container); + + // Add an escape cancel action + if (component.EscapeCancelAction is not { Valid: true }) + _actions.AddAction(user, ref component.EscapeCancelAction, _escapeCancelAction); } private void OnEscape(EntityUid uid, CanEscapeInventoryComponent component, EscapeInventoryEvent args) { component.DoAfter = null; + // Remove the cancel action regardless of do-after result + _actions.RemoveAction(uid, component.EscapeCancelAction); + component.EscapeCancelAction = null; + if (args.Handled || args.Cancelled) return; @@ -109,4 +126,13 @@ private void OnDropped(EntityUid uid, CanEscapeInventoryComponent component, Dro if (component.DoAfter != null) _doAfterSystem.Cancel(component.DoAfter); } + + private void OnCancelEscape(EntityUid uid, CanEscapeInventoryComponent component, EscapeInventoryCancelActionEvent args) + { + if (component.DoAfter != null) + _doAfterSystem.Cancel(component.DoAfter); + + _actions.RemoveAction(uid, component.EscapeCancelAction); + component.EscapeCancelAction = null; + } } diff --git a/Content.Shared/Nyanotrasen/Item/PseudoItem/AllowsSleepInsideComponent.cs b/Content.Shared/Nyanotrasen/Item/PseudoItem/AllowsSleepInsideComponent.cs new file mode 100644 index 00000000000..a28c7698fcd --- /dev/null +++ b/Content.Shared/Nyanotrasen/Item/PseudoItem/AllowsSleepInsideComponent.cs @@ -0,0 +1,9 @@ +namespace Content.Shared.Nyanotrasen.Item.PseudoItem; + +/// +/// Signifies that pseudo-item creatures can sleep inside the container to which this component is applied. +/// +[RegisterComponent] +public sealed partial class AllowsSleepInsideComponent : Component +{ +} diff --git a/Content.Shared/Nyanotrasen/Item/PseudoItem/PseudoItemComponent.cs b/Content.Shared/Nyanotrasen/Item/PseudoItem/PseudoItemComponent.cs index d3774439d36..458b514b969 100644 --- a/Content.Shared/Nyanotrasen/Item/PseudoItem/PseudoItemComponent.cs +++ b/Content.Shared/Nyanotrasen/Item/PseudoItem/PseudoItemComponent.cs @@ -3,10 +3,10 @@ namespace Content.Shared.Nyanotrasen.Item.PseudoItem; - /// - /// For entities that behave like an item under certain conditions, - /// but not under most conditions. - /// +/// +/// For entities that behave like an item under certain conditions, +/// but not under most conditions. +/// [RegisterComponent, AutoGenerateComponentState] public sealed partial class PseudoItemComponent : Component { @@ -24,4 +24,10 @@ public sealed partial class PseudoItemComponent : Component public Vector2i StoredOffset; public bool Active = false; + + /// + /// Action for sleeping while inside a container with . + /// + [DataField] + public EntityUid? SleepAction; } diff --git a/Content.Shared/Nyanotrasen/Item/PseudoItem/SharedPseudoItemSystem.Checks.cs b/Content.Shared/Nyanotrasen/Item/PseudoItem/SharedPseudoItemSystem.Checks.cs index 7000c654048..906503b3707 100644 --- a/Content.Shared/Nyanotrasen/Item/PseudoItem/SharedPseudoItemSystem.Checks.cs +++ b/Content.Shared/Nyanotrasen/Item/PseudoItem/SharedPseudoItemSystem.Checks.cs @@ -3,163 +3,33 @@ namespace Content.Shared.Nyanotrasen.Item.PseudoItem; -/// -/// Almost all of this is code taken from other systems, but adapted to use PseudoItem. -/// I couldn't use the original functions because the resolve would fuck shit up, even if I passed a constructed itemcomp -/// -/// This is horrible, and I hate it. But such is life -/// public partial class SharedPseudoItemSystem { - protected bool CheckItemFits(Entity itemEnt, Entity storageEnt) + /// + /// Checks if the pseudo-item can be inserted into the specified storage entity. + /// + /// + /// This function creates and uses a fake item component if the entity doesn't have one. + /// + public bool CheckItemFits(Entity itemEnt, Entity storageEnt) { if (!Resolve(itemEnt, ref itemEnt.Comp) || !Resolve(storageEnt, ref storageEnt.Comp)) return false; - if (Transform(itemEnt).Anchored) + if (!TryComp(itemEnt, out var metadata)) return false; - if (storageEnt.Comp.Whitelist?.IsValid(itemEnt, EntityManager) == false) - return false; - - if (storageEnt.Comp.Blacklist?.IsValid(itemEnt, EntityManager) == true) - return false; - - var maxSize = _storage.GetMaxItemSize(storageEnt); - if (_item.GetSizePrototype(itemEnt.Comp.Size) > maxSize) - return false; - - // The following is shitfucked together straight from TryGetAvailableGridSpace, but eh, it works - - var itemComp = new ItemComponent - { Size = itemEnt.Comp.Size, Shape = itemEnt.Comp.Shape, StoredOffset = itemEnt.Comp.StoredOffset }; - - var storageBounding = storageEnt.Comp.Grid.GetBoundingBox(); - - Angle startAngle; - if (storageEnt.Comp.DefaultStorageOrientation == null) - startAngle = Angle.FromDegrees(-itemComp.StoredRotation); // PseudoItem doesn't support this - else - { - if (storageBounding.Width < storageBounding.Height) - { - startAngle = storageEnt.Comp.DefaultStorageOrientation == StorageDefaultOrientation.Horizontal - ? Angle.Zero - : Angle.FromDegrees(90); - } - else - { - startAngle = storageEnt.Comp.DefaultStorageOrientation == StorageDefaultOrientation.Vertical - ? Angle.Zero - : Angle.FromDegrees(90); - } - } - - for (var y = storageBounding.Bottom; y <= storageBounding.Top; y++) - { - for (var x = storageBounding.Left; x <= storageBounding.Right; x++) - { - for (var angle = startAngle; angle <= Angle.FromDegrees(360 - startAngle); angle += Math.PI / 2f) - { - var location = new ItemStorageLocation(angle, (x, y)); - if (ItemFitsInGridLocation(itemEnt, storageEnt, location.Position, location.Rotation)) - return true; - } - } - } - - return false; - } - - private bool ItemFitsInGridLocation( - Entity itemEnt, - Entity storageEnt, - Vector2i position, - Angle rotation) - { - if (!Resolve(itemEnt, ref itemEnt.Comp) || !Resolve(storageEnt, ref storageEnt.Comp)) - return false; - - var gridBounds = storageEnt.Comp.Grid.GetBoundingBox(); - if (!gridBounds.Contains(position)) - return false; - - var itemShape = GetAdjustedItemShape(itemEnt, rotation, position); - - foreach (var box in itemShape) + TryComp(itemEnt, out var item); + // If the entity doesn't have an item comp, create a fake one + // The fake component is never actually added to the entity + item ??= new ItemComponent { - for (var offsetY = box.Bottom; offsetY <= box.Top; offsetY++) - { - for (var offsetX = box.Left; offsetX <= box.Right; offsetX++) - { - var pos = (offsetX, offsetY); - - if (!IsGridSpaceEmpty(itemEnt, storageEnt, pos, itemShape)) - return false; - } - } - } - - return true; - } - - private IReadOnlyList GetAdjustedItemShape(Entity entity, Angle rotation, - Vector2i position) - { - if (!Resolve(entity, ref entity.Comp)) - return new Box2i[] { }; - - var shapes = entity.Comp.Shape ?? _item.GetSizePrototype(entity.Comp.Size).DefaultShape; - var boundingShape = shapes.GetBoundingBox(); - var boundingCenter = ((Box2) boundingShape).Center; - var matty = Matrix3.CreateTransform(boundingCenter, rotation); - var drift = boundingShape.BottomLeft - matty.TransformBox(boundingShape).BottomLeft; - - var adjustedShapes = new List(); - foreach (var shape in shapes) - { - var transformed = matty.TransformBox(shape).Translated(drift); - var floored = new Box2i(transformed.BottomLeft.Floored(), transformed.TopRight.Floored()); - var translated = floored.Translated(position); - - adjustedShapes.Add(translated); - } - - return adjustedShapes; - } - - private bool IsGridSpaceEmpty(Entity itemEnt, Entity storageEnt, - Vector2i location, IReadOnlyList shape) - { - if (!Resolve(storageEnt, ref storageEnt.Comp)) - return false; - - var validGrid = false; - foreach (var grid in storageEnt.Comp.Grid) - { - if (grid.Contains(location)) - { - validGrid = true; - break; - } - } - - if (!validGrid) - return false; - - foreach (var (ent, storedItem) in storageEnt.Comp.StoredItems) - { - if (ent == itemEnt.Owner) - continue; - - var adjustedShape = shape; - foreach (var box in adjustedShape) - { - if (box.Contains(location)) - return false; - } - } + Owner = itemEnt, + Shape = itemEnt.Comp.Shape, + Size = itemEnt.Comp.Size, + StoredOffset = itemEnt.Comp.StoredOffset + }; - return true; + return _storage.CanInsert(storageEnt, itemEnt, out _, storageEnt.Comp, item, ignoreStacks: true); } } diff --git a/Content.Shared/Nyanotrasen/Item/PseudoItem/SharedPseudoItemSystem.cs b/Content.Shared/Nyanotrasen/Item/PseudoItem/SharedPseudoItemSystem.cs index 4b7910746f1..5f4e6184346 100644 --- a/Content.Shared/Nyanotrasen/Item/PseudoItem/SharedPseudoItemSystem.cs +++ b/Content.Shared/Nyanotrasen/Item/PseudoItem/SharedPseudoItemSystem.cs @@ -1,14 +1,18 @@ +using Content.Shared.Actions; +using Content.Shared.Bed.Sleep; using Content.Shared.DoAfter; using Content.Shared.Hands; using Content.Shared.IdentityManagement; using Content.Shared.Interaction.Events; using Content.Shared.Item; using Content.Shared.Item.PseudoItem; +using Content.Shared.Popups; using Content.Shared.Storage; using Content.Shared.Storage.EntitySystems; using Content.Shared.Tag; using Content.Shared.Verbs; using Robust.Shared.Containers; +using Robust.Shared.Prototypes; namespace Content.Shared.Nyanotrasen.Item.PseudoItem; @@ -18,9 +22,13 @@ public abstract partial class SharedPseudoItemSystem : EntitySystem [Dependency] private readonly SharedItemSystem _item = default!; [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; [Dependency] private readonly TagSystem _tag = default!; + [Dependency] private readonly SharedPopupSystem _popupSystem = default!; + [Dependency] private readonly SharedActionsSystem _actions = default!; [ValidatePrototypeId] private const string PreventTag = "PreventLabel"; + [ValidatePrototypeId] + private const string SleepActionId = "ActionSleep"; // The action used for sleeping inside bags. Currently uses the default sleep action (same as beds) public override void Initialize() { @@ -64,7 +72,7 @@ private void AddInsertVerb(EntityUid uid, PseudoItemComponent component, GetVerb args.Verbs.Add(verb); } - private bool TryInsert(EntityUid storageUid, EntityUid toInsert, PseudoItemComponent component, + public bool TryInsert(EntityUid storageUid, EntityUid toInsert, PseudoItemComponent component, StorageComponent? storage = null) { if (!Resolve(storageUid, ref storage)) @@ -87,6 +95,10 @@ private bool TryInsert(EntityUid storageUid, EntityUid toInsert, PseudoItemCompo return false; } + // If the storage allows sleeping inside, add the respective action + if (HasComp(storageUid)) + _actions.AddAction(toInsert, ref component.SleepAction, SleepActionId, toInsert); + component.Active = true; return true; } @@ -98,9 +110,11 @@ private void OnEntRemoved(EntityUid uid, PseudoItemComponent component, EntGotRe RemComp(uid); component.Active = false; + + _actions.RemoveAction(uid, component.SleepAction); // Remove sleep action if it was added } - private void OnGettingPickedUpAttempt(EntityUid uid, PseudoItemComponent component, + protected virtual void OnGettingPickedUpAttempt(EntityUid uid, PseudoItemComponent component, GettingPickedUpAttemptEvent args) { if (args.User == args.Item) @@ -154,7 +168,11 @@ protected void StartInsertDoAfter(EntityUid inserter, EntityUid toInsert, Entity NeedHand = true }; - _doAfter.TryStartDoAfter(args); + if (_doAfter.TryStartDoAfter(args)) + { + // Show a popup to the person getting picked up + _popupSystem.PopupEntity(Loc.GetString("carry-started", ("carrier", inserter)), toInsert, toInsert); + } } private void OnAttackAttempt(EntityUid uid, PseudoItemComponent component, AttackAttemptEvent args) diff --git a/Content.Shared/Resist/EscapeInventoryCancelEvent.cs b/Content.Shared/Resist/EscapeInventoryCancelEvent.cs new file mode 100644 index 00000000000..75ee09ff045 --- /dev/null +++ b/Content.Shared/Resist/EscapeInventoryCancelEvent.cs @@ -0,0 +1,5 @@ +using Content.Shared.Actions; + +namespace Content.Shared.Resist; + +public sealed partial class EscapeInventoryCancelActionEvent : InstantActionEvent; diff --git a/Resources/Locale/en-US/actions/actions/sleep.ftl b/Resources/Locale/en-US/actions/actions/sleep.ftl index fd833fd4a5c..6188e1639fe 100644 --- a/Resources/Locale/en-US/actions/actions/sleep.ftl +++ b/Resources/Locale/en-US/actions/actions/sleep.ftl @@ -5,3 +5,5 @@ sleep-examined = [color=lightblue]{CAPITALIZE(SUBJECT($target))} {CONJUGATE-BE($ wake-other-success = You shake {THE($target)} awake. wake-other-failure = You shake {THE($target)}, but {SUBJECT($target)} {CONJUGATE-BE($target)} not waking up. + +popup-sleep-in-bag = {THE($entity)} curls up and falls asleep. diff --git a/Resources/Locale/en-US/nyanotrasen/carrying/carry.ftl b/Resources/Locale/en-US/nyanotrasen/carrying/carry.ftl index 4fa1abae8bd..490daced3f2 100644 --- a/Resources/Locale/en-US/nyanotrasen/carrying/carry.ftl +++ b/Resources/Locale/en-US/nyanotrasen/carrying/carry.ftl @@ -1,3 +1,4 @@ carry-verb = Carry carry-too-heavy = You're not strong enough. +carry-started = {THE($carrier)} is trying to pick you up! diff --git a/Resources/Prototypes/Actions/misc.yml b/Resources/Prototypes/Actions/misc.yml new file mode 100644 index 00000000000..60fec699210 --- /dev/null +++ b/Resources/Prototypes/Actions/misc.yml @@ -0,0 +1,10 @@ +- type: entity + id: ActionCancelEscape + name: Stop escaping + description: Calm down and sit peacefuly in your carrier's inventory + noSpawn: true + components: + - type: InstantAction + icon: Actions/escapeinventory.rsi/cancel-escape.png + event: !type:EscapeInventoryCancelActionEvent + useDelay: 2 diff --git a/Resources/Prototypes/Entities/Clothing/Back/backpacks.yml b/Resources/Prototypes/Entities/Clothing/Back/backpacks.yml index fbd5a02fa08..d72006f6c41 100644 --- a/Resources/Prototypes/Entities/Clothing/Back/backpacks.yml +++ b/Resources/Prototypes/Entities/Clothing/Back/backpacks.yml @@ -30,6 +30,7 @@ delay: 0.5 - type: ExplosionResistance damageCoefficient: 0.9 + - type: AllowsSleepInside # DeltaV - enable sleeping inside bags - type: entity parent: ClothingBackpack @@ -258,7 +259,7 @@ - type: Sprite sprite: Clothing/Back/Backpacks/syndicate.rsi - type: ExplosionResistance - damageCoefficient: 0.1 + damageCoefficient: 0.1 #Special - type: entity diff --git a/Resources/Textures/Actions/escapeinventory.rsi/cancel-escape.png b/Resources/Textures/Actions/escapeinventory.rsi/cancel-escape.png new file mode 100644 index 0000000000000000000000000000000000000000..609e9e3d199149f20e44d2684167d14ec0353ee9 GIT binary patch literal 559 zcmV+~0?_@5P)C<~Jk;wDqh(aouDd;i};T#PBQ58a& zHyRDGDJ4mgYnmL_Nqgmd!})(FzRWWIEN{&&k(O4!}HkuiK@U*EcKAx@acl>3J9v x$Dd)UhGdTYLIJq2bd+Wom#K+8KmYF&_y*p|(%DtXaRmSX002ovPDHLkV1kRp{4oFk literal 0 HcmV?d00001 diff --git a/Resources/Textures/Actions/escapeinventory.rsi/meta.json b/Resources/Textures/Actions/escapeinventory.rsi/meta.json new file mode 100644 index 00000000000..ba379dedab4 --- /dev/null +++ b/Resources/Textures/Actions/escapeinventory.rsi/meta.json @@ -0,0 +1,14 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Duffelbag icon taken from tgstation at commit https://github.com/tgstation/tgstation/commit/547852588166c8e091b441e4e67169e156bb09c1 | Modified into cancel-escape.png by Mnemotechnician (github)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "cancel-escape" + } + ] +} From 00d786acd8eb2d76b05eb1560c68bdd479557693 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Fri, 5 Jul 2024 17:29:07 +0000 Subject: [PATCH 120/155] Automatic Changelog Update (#484) --- Resources/Changelog/Changelog.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 847b9c90fbe..f0ee7cef2cc 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4293,3 +4293,17 @@ Entries: from being flunged into the void. id: 6137 time: '2024-07-05T16:53:25.0000000+00:00' +- author: Mnemotechnician + changes: + - type: Fix + message: Carrying is less likely to behave erratically or suddenly interrupt now. + - type: Add + message: >- + You can now see when someone is trying to pick you up, and also you can + interrupt your attempt at escaping from their hands or inventory. + - type: Add + message: You can now properly take Felinids out of bags and place them inside. + - type: Add + message: Scientists have discovered that Felinids can sleep in bags. + id: 6138 + time: '2024-07-05T17:28:44.0000000+00:00' From 476e6ded461d9c1cfe0b9a4933ffe0880eca2e41 Mon Sep 17 00:00:00 2001 From: Mnemotechnican <69920617+Mnemotechnician@users.noreply.github.com> Date: Fri, 5 Jul 2024 20:33:39 +0300 Subject: [PATCH 121/155] Port Paper Signatures (#456) # Description Ports delta-v paper signatures implemented by me in https://github.com/DeltaV-Station/Delta-v/pull/1172, including the changes later introduced by deltanedas in https://github.com/DeltaV-Station/Delta-v/pull/1345. Everything should be pretty self-explanatory, see the original PR for details. ---

Media

![image](https://github.com/Simple-Station/Einstein-Engines/assets/69920617/50737402-a60d-425a-8938-f6e47427b22b) (see the original PR for a video demonstation)

--- # Changelog :cl: - add: You can now sign paper by alt-clicking it while holding a pen. --------- Signed-off-by: Mnemotechnican <69920617+Mnemotechnician@users.noreply.github.com> Co-authored-by: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com> --- .../DeltaV/Paper/SignAttemptEvent.cs | 8 ++ .../DeltaV/Paper/SignatureSystem.cs | 104 ++++++++++++++++++ .../Locale/en-US/deltav/paper/signature.ftl | 5 + .../Objects/Misc/bureaucracy.rsi/meta.json | 5 +- .../bureaucracy.rsi/paper_stamp-signature.png | Bin 0 -> 955 bytes 5 files changed, 121 insertions(+), 1 deletion(-) create mode 100644 Content.Server/DeltaV/Paper/SignAttemptEvent.cs create mode 100644 Content.Server/DeltaV/Paper/SignatureSystem.cs create mode 100644 Resources/Locale/en-US/deltav/paper/signature.ftl create mode 100644 Resources/Textures/Objects/Misc/bureaucracy.rsi/paper_stamp-signature.png diff --git a/Content.Server/DeltaV/Paper/SignAttemptEvent.cs b/Content.Server/DeltaV/Paper/SignAttemptEvent.cs new file mode 100644 index 00000000000..ff2d1b5103a --- /dev/null +++ b/Content.Server/DeltaV/Paper/SignAttemptEvent.cs @@ -0,0 +1,8 @@ +namespace Content.Server.DeltaV.Paper; + +/// +/// Raised on the pen when trying to sign a paper. +/// If it's cancelled the signature wasn't made. +/// +[ByRefEvent] +public record struct SignAttemptEvent(EntityUid Paper, EntityUid User, bool Cancelled = false); diff --git a/Content.Server/DeltaV/Paper/SignatureSystem.cs b/Content.Server/DeltaV/Paper/SignatureSystem.cs new file mode 100644 index 00000000000..07a249399bc --- /dev/null +++ b/Content.Server/DeltaV/Paper/SignatureSystem.cs @@ -0,0 +1,104 @@ +using Content.Server.Access.Systems; +using Content.Server.Paper; +using Content.Server.Popups; +using Content.Shared.Paper; +using Content.Shared.Popups; +using Content.Shared.Tag; +using Content.Shared.Verbs; +using Robust.Server.Audio; +using Robust.Shared.Player; + +namespace Content.Server.DeltaV.Paper; + +public sealed class SignatureSystem : EntitySystem +{ + [Dependency] private readonly AudioSystem _audio = default!; + [Dependency] private readonly IdCardSystem _idCard = default!; + [Dependency] private readonly PaperSystem _paper = default!; + [Dependency] private readonly PopupSystem _popup = default!; + [Dependency] private readonly TagSystem _tags = default!; + + // The sprite used to visualize "signatures" on paper entities. + private const string SignatureStampState = "paper_stamp-signature"; + + public override void Initialize() + { + SubscribeLocalEvent>(OnGetAltVerbs); + } + + private void OnGetAltVerbs(Entity ent, ref GetVerbsEvent args) + { + if (!args.CanAccess || !args.CanInteract) + return; + + if (args.Using is not {} pen || !_tags.HasTag(pen, "Write")) + return; + + var user = args.User; + AlternativeVerb verb = new() + { + Act = () => + { + TrySignPaper(ent, user, pen); + }, + Text = Loc.GetString("paper-sign-verb"), + DoContactInteraction = true, + Priority = 10 + }; + args.Verbs.Add(verb); + } + + /// + /// Tries add add a signature to the paper with signer's name. + /// + public bool TrySignPaper(Entity paper, EntityUid signer, EntityUid pen) + { + var comp = paper.Comp; + + var ev = new SignAttemptEvent(paper, signer); + RaiseLocalEvent(pen, ref ev); + if (ev.Cancelled) + return false; + + var signatureName = DetermineEntitySignature(signer); + + var stampInfo = new StampDisplayInfo() + { + StampedName = signatureName, + StampedColor = Color.DarkSlateGray, //TODO Make this configurable depending on the pen. + }; + + if (!comp.StampedBy.Contains(stampInfo) && _paper.TryStamp(paper, stampInfo, SignatureStampState, comp)) + { + // Show popups and play a paper writing sound + var signedOtherMessage = Loc.GetString("paper-signed-other", ("user", signer), ("target", paper.Owner)); + _popup.PopupEntity(signedOtherMessage, signer, Filter.PvsExcept(signer, entityManager: EntityManager), true); + + var signedSelfMessage = Loc.GetString("paper-signed-self", ("target", paper.Owner)); + _popup.PopupEntity(signedSelfMessage, signer, signer); + + _audio.PlayPvs(comp.Sound, signer); + + _paper.UpdateUserInterface(paper, comp); + + return true; + } + else + { + // Show an error popup + _popup.PopupEntity(Loc.GetString("paper-signed-failure", ("target", paper.Owner)), signer, signer, PopupType.SmallCaution); + + return false; + } + } + + private string DetermineEntitySignature(EntityUid uid) + { + // If the entity has an ID, use the name on it. + if (_idCard.TryFindIdCard(uid, out var id) && !string.IsNullOrWhiteSpace(id.Comp.FullName)) + return id.Comp.FullName; + + // Alternatively, return the entity name + return Name(uid); + } +} diff --git a/Resources/Locale/en-US/deltav/paper/signature.ftl b/Resources/Locale/en-US/deltav/paper/signature.ftl new file mode 100644 index 00000000000..87741c962c0 --- /dev/null +++ b/Resources/Locale/en-US/deltav/paper/signature.ftl @@ -0,0 +1,5 @@ +paper-sign-verb = Sign + +paper-signed-other = {CAPITALIZE(THE($user))} signs {THE($target)}. +paper-signed-self = You sign {THE($target)}. +paper-signed-failure = You cannot sign {THE($target)} diff --git a/Resources/Textures/Objects/Misc/bureaucracy.rsi/meta.json b/Resources/Textures/Objects/Misc/bureaucracy.rsi/meta.json index 5117df77356..b57f9844bc7 100644 --- a/Resources/Textures/Objects/Misc/bureaucracy.rsi/meta.json +++ b/Resources/Textures/Objects/Misc/bureaucracy.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/e1142f20f5e4661cb6845cfcf2dd69f864d67432. paper_stamp-syndicate by Veritius. paper_receipt, paper_receipt_horizontal by eoineoineoin. pen_centcom is a resprited version of pen_cap by PuroSlavKing (Github). Luxury pen is drawn by Ubaser. Lawyer and psychologist paper stamp resprited by Guess-My-Name", + "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/e1142f20f5e4661cb6845cfcf2dd69f864d67432. paper_stamp-syndicate by Veritius. paper_receipt, paper_receipt_horizontal by eoineoineoin. pen_centcom is a resprited version of pen_cap by PuroSlavKing (Github). Luxury pen is drawn by Ubaser. Lawyer and psychologist paper stamp resprited by Guess-My-Name. paper_stamp-signature by Mnemotechnician.", "size": { "x": 32, "y": 32 @@ -259,6 +259,9 @@ }, { "name": "paper_stamp-psychologist" + }, + { + "name": "paper_stamp-signature" } ] } diff --git a/Resources/Textures/Objects/Misc/bureaucracy.rsi/paper_stamp-signature.png b/Resources/Textures/Objects/Misc/bureaucracy.rsi/paper_stamp-signature.png new file mode 100644 index 0000000000000000000000000000000000000000..6a7aa083ee597521958a77c2e68c9adf01ef78f5 GIT binary patch literal 955 zcmZvaziU)M5XXmHV#09&3l%jYK?aEy62VrC-o<1vgcwpNq&TpiN)S9Hkf`8^)fWq| zR2wS`!2v53Erm1|!UXg`h=ri2IL>>4a6f#oyR(m-{e0&;+g@6n8?PR&64AKKH|rk4>Jc$6(Y(UfUBAaGFEjF%Rt0)PO0JM27^LHg@r8)4mA}B zDql8GyU1Yrj~-7{6X^~%pGQ#D5`k^?rJ7L#_FE; zXCUr5a}1~t3x}H;1e$sgu5Mz;Iy79|vOWpVx{K^ySUS_qO9OY2+1wp!N=a~uA8?L( zoy%=^DMgb5<_Z%9ixPXE*OWrL>?Squ%Me&7Tr_(CV(l%rcq0f?hgfz_NVCq~*C5o} zpA<LPcuJrImEY#cq2UZ}NaOsR literal 0 HcmV?d00001 From 692ceff845aa4e2a5a519d40d6d666cfa0d6a8f8 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Fri, 5 Jul 2024 17:34:01 +0000 Subject: [PATCH 122/155] Automatic Changelog Update (#456) --- Resources/Changelog/Changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index f0ee7cef2cc..1b79764a611 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4307,3 +4307,9 @@ Entries: message: Scientists have discovered that Felinids can sleep in bags. id: 6138 time: '2024-07-05T17:28:44.0000000+00:00' +- author: Mnemotechnician + changes: + - type: Add + message: You can now sign paper by alt-clicking it while holding a pen. + id: 6139 + time: '2024-07-05T17:33:39.0000000+00:00' From e06045ce586fa29f9404b8ae8f83f887dd5d8e81 Mon Sep 17 00:00:00 2001 From: WarMechanic <69510347+WarMechanic@users.noreply.github.com> Date: Sat, 6 Jul 2024 03:49:24 +1000 Subject: [PATCH 123/155] Felinid Soft Thieving + Trait (#500) # Description Reworks felinid thieving to no longer act like passive thieving gloves which grant invisible stripping (hereon referred to as hard stealing), in favour of soft thievery (hereon referred to as soft stealing). Soft thievery comprises of the following: - A smaller popup, with the thief anonymised. - A visible doafter bar - A 33% faster strip speed, that stacks with Thieving gloves - An additional ability to identify hidden items to better plan your course of action You no longer need to completely avoid felinids to maintain your precious items as long as you pay attention. For a felinid to utilise their thieving passive, they are encouraged to exploit any distractions to make moves on a target. If there is none, create one through conversation or other forms of player interaction. If you are suspected, persuade your victim that the thief is in fact, the other person. A faster strip speed makes thief bonuses diegetic to other players, and also improves the value proposition of thieving gloves on someone who already has thieving bonuses. Any other race can also gain soft thievery via a moderate costing trait. Non-felinid thieves are encouraged to exploit any felinids as a scapegoat. --- # TODO Code - [X] IgnoreStripHidden - allows thieves to look into peoples pockets - [X] StripTimeMultiplier - stripping at a multiplicative rate helps strip bags/belts which creates trait value - [X] Stealthy > Stealth - rather than a bool, distinguishes stealth levels as an enum Balance - [X] Soft thieves can identify items in pockets, which creates player agency - [X] Soft thieves steal 33% faster, which stacks with thieving gloves - [X] Victims to soft stealing get a smaller popup, useful if they're preoccupied - [X] Soft thievery is a trait, which Felinids get for free - [X] Felinids no longer hard steal items Media - [x] Attach media ---

Media

![image](https://github.com/Simple-Station/Einstein-Engines/assets/69510347/c0c6e81f-21e2-48c5-a535-777c1f683ef7) ![video](https://www.youtube.com/embed/elDfOgAPmIs?si=yV5JjOaSYvurGZer)

--- # Changelog :cl: - add: Added the Thievery trait, which provides various soft stripping bonuses - tweak: Felinids no longer have passive thieving gloves, they instead get the Thievery trait by default --------- Signed-off-by: WarMechanic <69510347+WarMechanic@users.noreply.github.com> Co-authored-by: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com> --- .../Inventory/StrippableBoundUserInterface.cs | 5 +- Content.Server/Strip/StrippableSystem.cs | 51 +++++++++++-------- .../EntitySystems/ToggleableClothingSystem.cs | 10 ++-- .../Strip/Components/StrippableComponent.cs | 8 +-- .../Strip/Components/ThievingComponent.cs | 20 ++++++-- .../Strip/SharedStrippableSystem.cs | 18 ++++++- Content.Shared/Strip/ThievingSystem.cs | 39 +++++++++++++- .../en-US/strip/strippable-component.ftl | 6 ++- Resources/Locale/en-US/traits/traits.ftl | 5 ++ .../Entities/Clothing/Hands/gloves.yml | 2 - .../Entities/Clothing/Hands/specific.yml | 1 - .../Entities/Mobs/Player/admin_ghost.yml | 4 +- .../Entities/Mobs/Species/felinid.yml | 5 ++ Resources/Prototypes/Traits/skills.yml | 14 +++++ 14 files changed, 143 insertions(+), 45 deletions(-) create mode 100644 Resources/Prototypes/Traits/skills.yml diff --git a/Content.Client/Inventory/StrippableBoundUserInterface.cs b/Content.Client/Inventory/StrippableBoundUserInterface.cs index f8eb12df914..4bb49fecc14 100644 --- a/Content.Client/Inventory/StrippableBoundUserInterface.cs +++ b/Content.Client/Inventory/StrippableBoundUserInterface.cs @@ -19,6 +19,7 @@ using Robust.Client.GameObjects; using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controls; +using Robust.Client.Player; using Robust.Shared.Input; using Robust.Shared.Map; using Robust.Shared.Prototypes; @@ -31,6 +32,7 @@ namespace Content.Client.Inventory public sealed class StrippableBoundUserInterface : BoundUserInterface { [Dependency] private readonly IUserInterfaceManager _ui = default!; + [Dependency] private readonly IPlayerManager _playerManager = default!; private readonly ExamineSystem _examine; private readonly InventorySystem _inv; private readonly SharedCuffableSystem _cuffable; @@ -198,7 +200,8 @@ private void AddInventoryButton(EntityUid invUid, string slotId, InventoryCompon var entity = container.ContainedEntity; // If this is a full pocket, obscure the real entity - if (entity != null && slotDef.StripHidden) + if (entity != null && slotDef.StripHidden + && !(EntMan.TryGetComponent(_playerManager.LocalEntity, out var thiefcomponent) && thiefcomponent.IgnoreStripHidden)) entity = _virtualHiddenEntity; var button = new SlotButton(new SlotData(slotDef, container)); diff --git a/Content.Server/Strip/StrippableSystem.cs b/Content.Server/Strip/StrippableSystem.cs index 3b38b65a19d..686570f7dca 100644 --- a/Content.Server/Strip/StrippableSystem.cs +++ b/Content.Server/Strip/StrippableSystem.cs @@ -36,6 +36,7 @@ public sealed class StrippableSystem : SharedStrippableSystem [Dependency] private readonly SharedPopupSystem _popupSystem = default!; [Dependency] private readonly IAdminLogManager _adminLogger = default!; + [Dependency] private readonly ThievingSystem _thieving = default!; // TODO: ECS popups. Not all of these have ECS equivalents yet. @@ -251,15 +252,17 @@ private void StartStripInsertInventory( var (time, stealth) = GetStripTimeModifiers(user, target, slotDef.StripTime); - if (!stealth) - _popupSystem.PopupEntity(Loc.GetString("strippable-component-alert-owner-insert", ("user", Identity.Entity(user, EntityManager)), ("item", user.Comp.ActiveHandEntity!.Value)), target, target, PopupType.Large); + bool hidden = stealth == ThievingStealth.Hidden; - var prefix = stealth ? "stealthily " : ""; + if (!hidden) + StripPopup("strippable-component-alert-owner-insert", stealth, target, user: Identity.Entity(user, EntityManager), item: user.Comp.ActiveHandEntity!.Value); + + var prefix = hidden ? "stealthily " : ""; _adminLogger.Add(LogType.Stripping, LogImpact.Low, $"{ToPrettyString(user):actor} is trying to {prefix}place the item {ToPrettyString(held):item} in {ToPrettyString(target):target}'s {slot} slot"); var doAfterArgs = new DoAfterArgs(EntityManager, user, time, new StrippableDoAfterEvent(true, true, slot), user, target, held) { - Hidden = stealth, + Hidden = hidden, AttemptFrequency = AttemptFrequency.EveryTick, BreakOnDamage = true, BreakOnTargetMove = true, @@ -340,20 +343,22 @@ private void StartStripRemoveInventory( var (time, stealth) = GetStripTimeModifiers(user, target, slotDef.StripTime); - if (!stealth) + bool hidden = stealth == ThievingStealth.Hidden; + + if (!hidden) { if (slotDef.StripHidden) - _popupSystem.PopupEntity(Loc.GetString("strippable-component-alert-owner-hidden", ("slot", slot)), target, target, PopupType.Large); + StripPopup("strippable-component-alert-owner-hidden", stealth, target, slot: slot); else - _popupSystem.PopupEntity(Loc.GetString("strippable-component-alert-owner", ("user", Identity.Entity(user, EntityManager)), ("item", item)), target, target, PopupType.Large); + StripPopup("strippable-component-alert-owner", stealth, target, user: Identity.Entity(user, EntityManager), item: item); } - var prefix = stealth ? "stealthily " : ""; + var prefix = hidden ? "stealthily " : ""; _adminLogger.Add(LogType.Stripping, LogImpact.Low, $"{ToPrettyString(user):actor} is trying to {prefix}strip the item {ToPrettyString(item):item} from {ToPrettyString(target):target}'s {slot} slot"); var doAfterArgs = new DoAfterArgs(EntityManager, user, time, new StrippableDoAfterEvent(false, true, slot), user, target, item) { - Hidden = stealth, + Hidden = hidden, AttemptFrequency = AttemptFrequency.EveryTick, BreakOnDamage = true, BreakOnTargetMove = true, @@ -374,7 +379,7 @@ private void StripRemoveInventory( EntityUid target, EntityUid item, string slot, - bool stealth) + bool hidden) { if (!CanStripRemoveInventory(user, target, item, slot)) return; @@ -384,7 +389,7 @@ private void StripRemoveInventory( RaiseLocalEvent(item, new DroppedEvent(user), true); // Gas tank internals etc. - _handsSystem.PickupOrDrop(user, item, animateUser: stealth, animate: stealth); + _handsSystem.PickupOrDrop(user, item, animateUser: hidden, animate: hidden); _adminLogger.Add(LogType.Stripping, LogImpact.Medium, $"{ToPrettyString(user):actor} has stripped the item {ToPrettyString(item):item} from {ToPrettyString(target):target}'s {slot} slot"); } @@ -446,12 +451,14 @@ private void StartStripInsertHand( var (time, stealth) = GetStripTimeModifiers(user, target, targetStrippable.HandStripDelay); - var prefix = stealth ? "stealthily " : ""; + bool hidden = stealth == ThievingStealth.Hidden; + + var prefix = hidden ? "stealthily " : ""; _adminLogger.Add(LogType.Stripping, LogImpact.Low, $"{ToPrettyString(user):actor} is trying to {prefix}place the item {ToPrettyString(held):item} in {ToPrettyString(target):target}'s hands"); var doAfterArgs = new DoAfterArgs(EntityManager, user, time, new StrippableDoAfterEvent(true, false, handName), user, target, held) { - Hidden = stealth, + Hidden = hidden, AttemptFrequency = AttemptFrequency.EveryTick, BreakOnDamage = true, BreakOnTargetMove = true, @@ -471,7 +478,7 @@ private void StripInsertHand( Entity target, EntityUid held, string handName, - bool stealth) + bool hidden) { if (!Resolve(user, ref user.Comp) || !Resolve(target, ref target.Comp)) @@ -481,7 +488,7 @@ private void StripInsertHand( return; _handsSystem.TryDrop(user, checkActionBlocker: false, handsComp: user.Comp); - _handsSystem.TryPickup(target, held, handName, checkActionBlocker: false, animateUser: stealth, animate: stealth, handsComp: target.Comp); + _handsSystem.TryPickup(target, held, handName, checkActionBlocker: false, animateUser: hidden, animate: hidden, handsComp: target.Comp); _adminLogger.Add(LogType.Stripping, LogImpact.Medium, $"{ToPrettyString(user):actor} has placed the item {ToPrettyString(held):item} in {ToPrettyString(target):target}'s hands"); // Hand update will trigger strippable update. @@ -543,15 +550,17 @@ private void StartStripRemoveHand( var (time, stealth) = GetStripTimeModifiers(user, target, targetStrippable.HandStripDelay); - if (!stealth) - _popupSystem.PopupEntity(Loc.GetString("strippable-component-alert-owner", ("user", Identity.Entity(user, EntityManager)), ("item", item)), target, target); + bool hidden = stealth == ThievingStealth.Hidden; + + if (!hidden) + StripPopup("strippable-component-alert-owner", stealth, target, user: Identity.Entity(user, EntityManager), item: item); - var prefix = stealth ? "stealthily " : ""; + var prefix = hidden ? "stealthily " : ""; _adminLogger.Add(LogType.Stripping, LogImpact.Low, $"{ToPrettyString(user):actor} is trying to {prefix}strip the item {ToPrettyString(item):item} from {ToPrettyString(target):target}'s hands"); var doAfterArgs = new DoAfterArgs(EntityManager, user, time, new StrippableDoAfterEvent(false, false, handName), user, target, item) { - Hidden = stealth, + Hidden = hidden, AttemptFrequency = AttemptFrequency.EveryTick, BreakOnDamage = true, BreakOnTargetMove = true, @@ -572,7 +581,7 @@ private void StripRemoveHand( Entity target, EntityUid item, string handName, - bool stealth) + bool hidden) { if (!Resolve(user, ref user.Comp) || !Resolve(target, ref target.Comp)) @@ -582,7 +591,7 @@ private void StripRemoveHand( return; _handsSystem.TryDrop(target, item, checkActionBlocker: false, handsComp: target.Comp); - _handsSystem.PickupOrDrop(user, item, animateUser: stealth, animate: stealth, handsComp: user.Comp); + _handsSystem.PickupOrDrop(user, item, animateUser: hidden, animate: hidden, handsComp: user.Comp); _adminLogger.Add(LogType.Stripping, LogImpact.Medium, $"{ToPrettyString(user):actor} has stripped the item {ToPrettyString(item):item} from {ToPrettyString(target):target}'s hands"); // Hand update will trigger strippable update. diff --git a/Content.Shared/Clothing/EntitySystems/ToggleableClothingSystem.cs b/Content.Shared/Clothing/EntitySystems/ToggleableClothingSystem.cs index 22a1d1a8f52..4abe7bc876a 100644 --- a/Content.Shared/Clothing/EntitySystems/ToggleableClothingSystem.cs +++ b/Content.Shared/Clothing/EntitySystems/ToggleableClothingSystem.cs @@ -27,6 +27,7 @@ public sealed class ToggleableClothingSystem : EntitySystem [Dependency] private readonly SharedPopupSystem _popupSystem = default!; [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; [Dependency] private readonly SharedStrippableSystem _strippable = default!; + [Dependency] private readonly ThievingSystem _thieving = default!; public override void Initialize() { @@ -97,6 +98,8 @@ private void StartDoAfter(EntityUid user, EntityUid item, EntityUid wearer, Togg var (time, stealth) = _strippable.GetStripTimeModifiers(user, wearer, component.StripDelay.Value); + bool hidden = (stealth == ThievingStealth.Hidden); + var args = new DoAfterArgs(EntityManager, user, time, new ToggleClothingDoAfterEvent(), item, wearer, item) { BreakOnDamage = true, @@ -110,11 +113,8 @@ private void StartDoAfter(EntityUid user, EntityUid item, EntityUid wearer, Togg if (!_doAfter.TryStartDoAfter(args)) return; - if (!stealth) - { - var popup = Loc.GetString("strippable-component-alert-owner-interact", ("user", Identity.Entity(user, EntityManager)), ("item", item)); - _popupSystem.PopupEntity(popup, wearer, wearer, PopupType.Large); - } + if (!hidden) + _strippable.StripPopup("strippable-component-alert-owner-interact", stealth, wearer, user: Identity.Entity(user, EntityManager), item: item); } private void OnGetAttachedStripVerbsEvent(EntityUid uid, AttachedClothingComponent component, GetVerbsEvent args) diff --git a/Content.Shared/Strip/Components/StrippableComponent.cs b/Content.Shared/Strip/Components/StrippableComponent.cs index 4faca4d8f21..00725808297 100644 --- a/Content.Shared/Strip/Components/StrippableComponent.cs +++ b/Content.Shared/Strip/Components/StrippableComponent.cs @@ -32,12 +32,12 @@ public sealed class StrippingSlotButtonPressed(string slot, bool isHand) : Bound public sealed class StrippingEnsnareButtonPressed : BoundUserInterfaceMessage; [ByRefEvent] - public abstract class BaseBeforeStripEvent(TimeSpan initialTime, bool stealth = false) : EntityEventArgs, IInventoryRelayEvent + public abstract class BaseBeforeStripEvent(TimeSpan initialTime, ThievingStealth stealth = ThievingStealth.Obvious) : EntityEventArgs, IInventoryRelayEvent { public readonly TimeSpan InitialTime = initialTime; public float Multiplier = 1f; public TimeSpan Additive = TimeSpan.Zero; - public bool Stealth = stealth; + public ThievingStealth Stealth = stealth; public TimeSpan Time => TimeSpan.FromSeconds(MathF.Max(InitialTime.Seconds * Multiplier + Additive.Seconds, 0f)); @@ -51,7 +51,7 @@ public abstract class BaseBeforeStripEvent(TimeSpan initialTime, bool stealth = /// This is also used by some stripping related interactions, i.e., interactions with items that are currently equipped by another player. /// [ByRefEvent] - public sealed class BeforeStripEvent(TimeSpan initialTime, bool stealth = false) : BaseBeforeStripEvent(initialTime, stealth); + public sealed class BeforeStripEvent(TimeSpan initialTime, ThievingStealth stealth = ThievingStealth.Obvious) : BaseBeforeStripEvent(initialTime, stealth); /// /// Used to modify strip times. Raised directed at the target. @@ -60,7 +60,7 @@ public sealed class BeforeStripEvent(TimeSpan initialTime, bool stealth = false) /// This is also used by some stripping related interactions, i.e., interactions with items that are currently equipped by another player. /// [ByRefEvent] - public sealed class BeforeGettingStrippedEvent(TimeSpan initialTime, bool stealth = false) : BaseBeforeStripEvent(initialTime, stealth); + public sealed class BeforeGettingStrippedEvent(TimeSpan initialTime, ThievingStealth stealth = ThievingStealth.Obvious) : BaseBeforeStripEvent(initialTime, stealth); /// /// Organizes the behavior of DoAfters for . diff --git a/Content.Shared/Strip/Components/ThievingComponent.cs b/Content.Shared/Strip/Components/ThievingComponent.cs index a851dd5ef63..1d584627727 100644 --- a/Content.Shared/Strip/Components/ThievingComponent.cs +++ b/Content.Shared/Strip/Components/ThievingComponent.cs @@ -9,14 +9,24 @@ public sealed partial class ThievingComponent : Component /// /// How much the strip time should be shortened by /// - [ViewVariables(VVAccess.ReadWrite)] - [DataField("stripTimeReduction")] + [DataField] public TimeSpan StripTimeReduction = TimeSpan.FromSeconds(0.5f); + /// + /// A multiplier coefficient for strip time + /// + [DataField] + public float StripTimeMultiplier = 1f; + /// /// Should it notify the user if they're stripping a pocket? /// - [ViewVariables(VVAccess.ReadWrite)] - [DataField("stealthy")] - public bool Stealthy; + [DataField] + public ThievingStealth Stealth = ThievingStealth.Hidden; + + /// + /// Should the user be able to see hidden items? (i.e pockets) + /// + [DataField] + public bool IgnoreStripHidden; } diff --git a/Content.Shared/Strip/SharedStrippableSystem.cs b/Content.Shared/Strip/SharedStrippableSystem.cs index 7afd4f245a1..64dd6a81f3a 100644 --- a/Content.Shared/Strip/SharedStrippableSystem.cs +++ b/Content.Shared/Strip/SharedStrippableSystem.cs @@ -1,11 +1,14 @@ using Content.Shared.DragDrop; using Content.Shared.Hands.Components; +using Content.Shared.Popups; using Content.Shared.Strip.Components; namespace Content.Shared.Strip; public abstract class SharedStrippableSystem : EntitySystem { + [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly ThievingSystem _thieving = default!; public override void Initialize() { base.Initialize(); @@ -14,7 +17,7 @@ public override void Initialize() SubscribeLocalEvent(OnDragDrop); } - public (TimeSpan Time, bool Stealth) GetStripTimeModifiers(EntityUid user, EntityUid target, TimeSpan initialTime) + public (TimeSpan Time, ThievingStealth Stealth) GetStripTimeModifiers(EntityUid user, EntityUid target, TimeSpan initialTime) { var userEv = new BeforeStripEvent(initialTime); RaiseLocalEvent(user, ref userEv); @@ -55,4 +58,17 @@ private void OnCanDrop(EntityUid uid, StrippableComponent component, ref CanDrop if (args.CanDrop) args.Handled = true; } + + public void StripPopup(string messageId, ThievingStealth stealth, EntityUid target, EntityUid? user = null, EntityUid? item = null, string slot = "") + { + bool subtle = stealth == ThievingStealth.Subtle; + PopupType? popupSize = _thieving.GetPopupTypeFromStealth(stealth); + + if (popupSize.HasValue) // We should always have a value if we're not hidden + _popup.PopupEntity(Loc.GetString(messageId, + ("user", subtle ? Loc.GetString("thieving-component-user") : user ?? EntityUid.Invalid), + ("item", subtle ? Loc.GetString("thieving-component-item") : item ?? EntityUid.Invalid), + ("slot", slot)), + target, target, popupSize.Value); + } } diff --git a/Content.Shared/Strip/ThievingSystem.cs b/Content.Shared/Strip/ThievingSystem.cs index 2b3d3b38a00..8f523accfea 100644 --- a/Content.Shared/Strip/ThievingSystem.cs +++ b/Content.Shared/Strip/ThievingSystem.cs @@ -1,6 +1,7 @@ using Content.Shared.Inventory; -using Content.Shared.Strip; +using Content.Shared.Popups; using Content.Shared.Strip.Components; +using Robust.Shared.Serialization; namespace Content.Shared.Strip; @@ -17,7 +18,41 @@ public override void Initialize() private void OnBeforeStrip(EntityUid uid, ThievingComponent component, BeforeStripEvent args) { - args.Stealth |= component.Stealthy; + args.Stealth = (ThievingStealth) Math.Max((sbyte) args.Stealth, (sbyte) component.Stealth); args.Additive -= component.StripTimeReduction; + args.Multiplier *= component.StripTimeMultiplier; } + + public PopupType? GetPopupTypeFromStealth(ThievingStealth stealth) + { + switch (stealth) + { + case ThievingStealth.Hidden: + return null; + + case ThievingStealth.Subtle: + return PopupType.Small; + + default: + return PopupType.Large; + } + } +} +[Serializable, NetSerializable] +public enum ThievingStealth : sbyte +{ + /// + /// Target sees a large popup indicating that an item is being stolen by who + /// + Obvious = 0, + + /// + /// Target sees a small popup indicating that an item is being stolen + /// + Subtle = 1, + + /// + /// Target does not see any popup regarding the stealing of an item + /// + Hidden = 2 } diff --git a/Resources/Locale/en-US/strip/strippable-component.ftl b/Resources/Locale/en-US/strip/strippable-component.ftl index 7654b20b03f..65d7844ee22 100644 --- a/Resources/Locale/en-US/strip/strippable-component.ftl +++ b/Resources/Locale/en-US/strip/strippable-component.ftl @@ -19,4 +19,8 @@ strip-verb-get-data-text = Strip ## UI strippable-bound-user-interface-stripping-menu-title = {$ownerName}'s inventory -strippable-bound-user-interface-stripping-menu-ensnare-button = Remove Leg Restraints \ No newline at end of file +strippable-bound-user-interface-stripping-menu-ensnare-button = Remove Leg Restraints + +# Stealth +thieving-component-user = Someone +thieving-component-item = something \ No newline at end of file diff --git a/Resources/Locale/en-US/traits/traits.ftl b/Resources/Locale/en-US/traits/traits.ftl index e9163bdb548..80680ac0db2 100644 --- a/Resources/Locale/en-US/traits/traits.ftl +++ b/Resources/Locale/en-US/traits/traits.ftl @@ -31,3 +31,8 @@ trait-description-SocialAnxiety = You are anxious when you speak and stutter. trait-name-Snoring = Snoring trait-description-Snoring = You will snore while sleeping. + +trait-name-Thieving = Thieving +trait-description-Thieving = + You are deft with your hands, and talented at convincing people of their belongings. + You can identify pocketed items, steal them quieter, and steal ~33% faster. diff --git a/Resources/Prototypes/Entities/Clothing/Hands/gloves.yml b/Resources/Prototypes/Entities/Clothing/Hands/gloves.yml index bf08db78f71..4cd0c04e2be 100644 --- a/Resources/Prototypes/Entities/Clothing/Hands/gloves.yml +++ b/Resources/Prototypes/Entities/Clothing/Hands/gloves.yml @@ -231,7 +231,6 @@ - type: FingerprintMask - type: Thieving stripTimeReduction: 1 - stealthy: true - type: NinjaGloves - type: entity @@ -332,7 +331,6 @@ tags: [] # ignore "WhitelistChameleon" tag - type: Thieving stripTimeReduction: 1.5 - stealthy: true - type: entity parent: ClothingHandsGlovesColorWhite diff --git a/Resources/Prototypes/Entities/Clothing/Hands/specific.yml b/Resources/Prototypes/Entities/Clothing/Hands/specific.yml index e6a57319999..db34297b42a 100644 --- a/Resources/Prototypes/Entities/Clothing/Hands/specific.yml +++ b/Resources/Prototypes/Entities/Clothing/Hands/specific.yml @@ -29,4 +29,3 @@ components: - type: Thieving stripTimeReduction: 2 - stealthy: true diff --git a/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml b/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml index 80e87d3670c..9bdfb18830e 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml @@ -85,8 +85,8 @@ range: 500 - type: StationLimitedNetwork - type: Thieving - stripTimeReduction: 9999 - stealthy: true + stripTimeMultiplier: 0 + ignoreStripHidden: true - type: Stripping - type: SolutionScanner - type: IgnoreUIRange diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/felinid.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/felinid.yml index 5bc02461eed..d23607b16d5 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/felinid.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/felinid.yml @@ -74,6 +74,11 @@ - GalacticCommon - SolCommon - Nekomimetic + - type: Thieving + ignoreStripHidden: true + stealth: Subtle + stripTimeReduction: 0 + stripTimeMultiplier: 0.667 - type: entity save: false diff --git a/Resources/Prototypes/Traits/skills.yml b/Resources/Prototypes/Traits/skills.yml new file mode 100644 index 00000000000..6175834c1fc --- /dev/null +++ b/Resources/Prototypes/Traits/skills.yml @@ -0,0 +1,14 @@ +- type: trait + id: Thieving + category: Physical + points: -4 + components: + - type: Thieving + ignoreStripHidden: true + stealth: Subtle + stripTimeReduction: 0 + stripTimeMultiplier: 0.667 + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: Felinid From 4609f9e9b0dae53d99f4aeb46f20cbfbc2206b46 Mon Sep 17 00:00:00 2001 From: Mnemotechnican <69920617+Mnemotechnician@users.noreply.github.com> Date: Fri, 5 Jul 2024 20:49:57 +0300 Subject: [PATCH 124/155] Cherry-Pick Carrypets From Delta-V (#501) # Description Cherry-picks https://github.com/DeltaV-Station/Delta-v/pull/1145 All credit goes to the original author of the PR. Original description is: "adds carriable component to a lot of animals that didn't have it" --- # Why ## Renault my beloved!!! ---

Media

![image](https://github.com/Simple-Station/Einstein-Engines/assets/69920617/12777e9b-7d00-4df2-8703-a7f9e42ea1c6)

--- # Changelog :cl: Froffy025 - add: You can now carry most of the station pets. --------- Signed-off-by: Froffy025 <78222136+Froffy025@users.noreply.github.com> Co-authored-by: Froffy025 <78222136+froffy025@users.noreply.github.com> --- .../Prototypes/Entities/Mobs/NPCs/animals.yml | 30 +++++++++++++++++++ .../Prototypes/Entities/Mobs/NPCs/carp.yml | 1 + .../Entities/Mobs/NPCs/regalrat.yml | 2 ++ .../Prototypes/Entities/Mobs/NPCs/slimes.yml | 3 +- .../Prototypes/Entities/Mobs/NPCs/space.yml | 2 +- 5 files changed, 36 insertions(+), 2 deletions(-) diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index e311681ce5f..7fe105f940c 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -13,6 +13,7 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: bat sprite: Mobs/Animals/bat.rsi + - type: Carriable - type: Speech speechSounds: Squeak speechVerb: SmallMob @@ -188,6 +189,8 @@ noMovementLayers: movement: state: chicken-0 + - type: Carriable + freeHandsRequired: 1 - type: Fixtures fixtures: fix1: @@ -580,6 +583,8 @@ - MobMask layer: - MobLayer + - type: Carriable + freeHandsRequired: 1 - type: Tag tags: - DoorBumpOpener @@ -840,6 +845,8 @@ noMovementLayers: movement: state: crab + - type: Carriable + freeHandsRequired: 1 - type: Physics - type: Fixtures fixtures: @@ -907,6 +914,7 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: goat sprite: Mobs/Animals/goat.rsi + - type: Carriable - type: Fixtures fixtures: fix1: @@ -999,6 +1007,7 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: goose sprite: Mobs/Animals/goose.rsi + - type: Carriable - type: Fixtures fixtures: fix1: @@ -1245,6 +1254,7 @@ sprite: "Effects/creampie.rsi" state: "creampie_human" visible: false + - type: Carriable - type: Hands - type: GenericVisualizer visuals: @@ -1767,6 +1777,7 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: lizard sprite: Mobs/Animals/lizard.rsi + - type: Carriable - type: Physics - type: Fixtures fixtures: @@ -1821,6 +1832,8 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: slug sprite: Mobs/Animals/slug.rsi + - type: Carriable + freeHandsRequired: 1 - type: Physics - type: Fixtures fixtures: @@ -1873,6 +1886,7 @@ noMovementLayers: movement: state: frog + - type: Carriable - type: Physics - type: Fixtures fixtures: @@ -1936,6 +1950,8 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: parrot sprite: Mobs/Animals/parrot.rsi + - type: Carriable + freeHandsRequired: 1 - type: Fixtures fixtures: fix1: @@ -1991,6 +2007,7 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: penguin sprite: Mobs/Animals/penguin.rsi + - type: Carriable - type: Physics - type: Fixtures fixtures: @@ -2124,6 +2141,7 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: snake sprite: Mobs/Animals/snake.rsi + - type: Carriable - type: Physics - type: Fixtures fixtures: @@ -2186,6 +2204,7 @@ noMovementLayers: movement: state: tarantula + - type: Carriable - type: Physics - type: Fixtures fixtures: @@ -2371,6 +2390,7 @@ layers: - map: ["enum.DamageStateVisualLayers.Base"] state: possum + - type: Carriable - type: Physics - type: Fixtures fixtures: @@ -2446,6 +2466,7 @@ layers: - map: ["enum.DamageStateVisualLayers.Base"] state: raccoon + - type: Carriable - type: Physics - type: Fixtures fixtures: @@ -2510,6 +2531,7 @@ noMovementLayers: movement: state: fox + - type: Carriable - type: Physics - type: Fixtures fixtures: @@ -2590,6 +2612,7 @@ layers: - map: ["enum.DamageStateVisualLayers.Base"] state: corgi + - type: Carriable - type: Physics - type: Speech speechVerb: Canine @@ -2746,6 +2769,7 @@ layers: - map: ["enum.DamageStateVisualLayers.Base"] state: cat + - type: Carriable - type: Physics - type: Fixtures fixtures: @@ -2925,6 +2949,8 @@ Base: kitten_dead Dead: Base: kitten_dead + - type: Carriable + freeHandsRequired: 1 - type: Butcherable spawned: - id: FoodMeat @@ -2955,6 +2981,7 @@ layers: - map: ["enum.DamageStateVisualLayers.Base"] state: sloth + - type: Carriable - type: Physics - type: Fixtures fixtures: @@ -3016,6 +3043,7 @@ layers: - map: ["enum.DamageStateVisualLayers.Base"] state: ferret + - type: Carriable - type: Physics - type: Fixtures fixtures: @@ -3217,6 +3245,7 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: pig sprite: Mobs/Animals/pig.rsi + - type: Carriable - type: Fixtures fixtures: fix1: @@ -3292,6 +3321,7 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: nymph sprite: Mobs/Animals/nymph.rsi + - type: Carriable - type: Physics - type: Fixtures fixtures: diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml b/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml index 3e6c603626b..2aae27d31ef 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml @@ -22,6 +22,7 @@ layers: - map: [ "enum.DamageStateVisualLayers.Base" ] state: alive + - type: Carriable # This one is for you, deltanedas o7 - type: CombatMode - type: Physics - type: Fixtures diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml b/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml index 50fe3b6765e..31a32333f3f 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml @@ -170,6 +170,8 @@ description: He's da mini rat. He don't make da roolz. noSpawn: true #Must be configured to a King or the AI breaks. components: + - type: Carriable + freeHandsRequired: 1 - type: CombatMode - type: MovementSpeedModifier baseWalkSpeed : 3.5 diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml b/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml index 901bf149cbc..f18b371c4c2 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml @@ -1,4 +1,4 @@ -- type: entity +- type: entity name: basic slime id: MobAdultSlimes parent: [ SimpleMobBase, MobCombat ] @@ -17,6 +17,7 @@ layers: - map: [ "enum.DamageStateVisualLayers.Base" ] state: blue_adult_slime + - type: Carriable - type: Fixtures fixtures: fix1: diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/space.yml b/Resources/Prototypes/Entities/Mobs/NPCs/space.yml index 9ea2d784dbb..9b79d67f408 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/space.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/space.yml @@ -1,4 +1,4 @@ -- type: entity +- type: entity name: basic id: MobSpaceBasic parent: SimpleSpaceMobBase From 4ebb3cc779b9df30d877f680b44dc287c22f1d19 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Fri, 5 Jul 2024 17:53:28 +0000 Subject: [PATCH 125/155] Automatic Changelog Update (#500) --- Resources/Changelog/Changelog.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 1b79764a611..618c03ec9ed 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4313,3 +4313,13 @@ Entries: message: You can now sign paper by alt-clicking it while holding a pen. id: 6139 time: '2024-07-05T17:33:39.0000000+00:00' +- author: WarMechanic + changes: + - type: Add + message: Added the Thievery trait, which provides various soft stripping bonuses + - type: Tweak + message: >- + Felinids no longer have passive thieving gloves, they instead get the + Thievery trait by default + id: 6140 + time: '2024-07-05T17:49:25.0000000+00:00' From d971e7c5119ce3fa57339f15d47fbbf372a0e3b5 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Fri, 5 Jul 2024 17:54:28 +0000 Subject: [PATCH 126/155] Automatic Changelog Update (#501) --- Resources/Changelog/Changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 618c03ec9ed..d602db8a69b 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4323,3 +4323,9 @@ Entries: Thievery trait by default id: 6140 time: '2024-07-05T17:49:25.0000000+00:00' +- author: Froffy025 + changes: + - type: Add + message: You can now carry most of the station pets. + id: 6141 + time: '2024-07-05T17:49:57.0000000+00:00' From d5f73ad370982fa57b223099e016a93f033fd378 Mon Sep 17 00:00:00 2001 From: Mnemotechnican <69920617+Mnemotechnician@users.noreply.github.com> Date: Fri, 5 Jul 2024 22:10:24 +0300 Subject: [PATCH 127/155] Fix Them Pesky Job Requirements (#511) # Description Fixes job requirements using wrong locales Happened because one function had role-timer- as its default locale prefix and the other that called the first had null as the default. ---

Media

![image](https://github.com/Simple-Station/Einstein-Engines/assets/69920617/0d02c40a-a58f-4b48-89f5-e0a6b4ff75b9) ![image](https://github.com/Simple-Station/Einstein-Engines/assets/69920617/f3b651dd-492e-47c0-aa9f-74998c78f792)

--- # Changelog :cl: - fix: Job requirements are now displayed correctly. --- .../Players/PlayTimeTracking/JobRequirementsManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Client/Players/PlayTimeTracking/JobRequirementsManager.cs b/Content.Client/Players/PlayTimeTracking/JobRequirementsManager.cs index 7688a3b3aaa..ee581186f35 100644 --- a/Content.Client/Players/PlayTimeTracking/JobRequirementsManager.cs +++ b/Content.Client/Players/PlayTimeTracking/JobRequirementsManager.cs @@ -96,7 +96,7 @@ public bool IsAllowed(JobPrototype job, [NotNullWhen(false)] out FormattedMessag return CheckRoleTime(job.Requirements, out reason); } - public bool CheckRoleTime(HashSet? requirements, [NotNullWhen(false)] out FormattedMessage? reason, string? localePrefix = null) + public bool CheckRoleTime(HashSet? requirements, [NotNullWhen(false)] out FormattedMessage? reason, string? localePrefix = "role-timer-") { reason = null; From c4f77007441d8d7fef9067d4d6f70ec7182c3657 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Fri, 5 Jul 2024 19:10:53 +0000 Subject: [PATCH 128/155] Automatic Changelog Update (#511) --- Resources/Changelog/Changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index d602db8a69b..f9c1de93996 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4329,3 +4329,9 @@ Entries: message: You can now carry most of the station pets. id: 6141 time: '2024-07-05T17:49:57.0000000+00:00' +- author: Mnemotechnician + changes: + - type: Fix + message: Job requirements are now displayed correctly. + id: 6142 + time: '2024-07-05T19:10:24.0000000+00:00' From aaee45aa0aaa063f9d2044d186f1f5a0966d58e9 Mon Sep 17 00:00:00 2001 From: Mnemotechnican <69920617+Mnemotechnician@users.noreply.github.com> Date: Sat, 6 Jul 2024 00:03:28 +0300 Subject: [PATCH 129/155] Restore Old Event Rates (#509) # Description This restores the basic/survival event rates to how they were before before #486 (however, it keeps the CVars created in it). - 5-25 minutes for basic instead of 15-35 - 4-12 minutes for survival instead of 20-45 --- # Why The PR made it so that survival rounds actually have less events than extended - that is considering that survival rounds are supposed to be troublesome and filled with events while extended ones are supposed to be a chill alternative. Other forks don't bother with editing CVars every 5 minutes, so this "opportunity to configure their experience" was never addressed. Based on the feedback I've received from other players, the change was rather negative. From my personal experience, survival rounds became an extended extended, where during a 2-hour shift you can get a grand total of one power outage and two mice infestations, and nothing else at all. --- # Changelog :cl: - tweak: Events should now occur as frequently as before. Note: server owner can configure the frequency on their server manually. Signed-off-by: Mnemotechnican <69920617+Mnemotechnician@users.noreply.github.com> --- Content.Shared/CCVar/CCVars.cs | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index 7bde756f7c3..3961818baaa 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -112,14 +112,14 @@ public static readonly CVarDef /// Close to how long you expect a round to last, so you'll probably have to tweak this on downstreams. ///
public static readonly CVarDef - EventsRampingAverageEndTime = CVarDef.Create("events.ramping_average_end_time", 120f, CVar.ARCHIVE | CVar.SERVERONLY); + EventsRampingAverageEndTime = CVarDef.Create("events.ramping_average_end_time", 40f, CVar.ARCHIVE | CVar.SERVERONLY); /// /// Average ending chaos modifier for the ramping event scheduler. /// Max chaos chosen for a round will deviate from this /// public static readonly CVarDef - EventsRampingAverageChaos = CVarDef.Create("events.ramping_average_chaos", 4f, CVar.ARCHIVE | CVar.SERVERONLY); + EventsRampingAverageChaos = CVarDef.Create("events.ramping_average_chaos", 6f, CVar.ARCHIVE | CVar.SERVERONLY); /* * Game @@ -176,26 +176,26 @@ public static readonly CVarDef /// /// Minimum time between Basic station events in seconds /// - public static readonly CVarDef // 15 Minutes - GameEventsBasicMinimumTime = CVarDef.Create("game.events_basic_minimum_time", 900, CVar.SERVERONLY); + public static readonly CVarDef // 5 Minutes + GameEventsBasicMinimumTime = CVarDef.Create("game.events_basic_minimum_time", 300, CVar.SERVERONLY); /// /// Maximum time between Basic station events in seconds /// - public static readonly CVarDef // 35 Minutes - GameEventsBasicMaximumTime = CVarDef.Create("game.events_basic_maximum_time", 2100, CVar.SERVERONLY); + public static readonly CVarDef // 25 Minutes + GameEventsBasicMaximumTime = CVarDef.Create("game.events_basic_maximum_time", 1500, CVar.SERVERONLY); /// /// Minimum time between Ramping station events in seconds /// - public static readonly CVarDef // 20 Minutes - GameEventsRampingMinimumTime = CVarDef.Create("game.events_ramping_minimum_time", 1200, CVar.SERVERONLY); + public static readonly CVarDef // 4 Minutes + GameEventsRampingMinimumTime = CVarDef.Create("game.events_ramping_minimum_time", 240, CVar.SERVERONLY); /// /// Maximum time between Ramping station events in seconds /// - public static readonly CVarDef // 45 Minutes - GameEventsRampingMaximumTime = CVarDef.Create("game.events_ramping_maximum_time", 2700, CVar.SERVERONLY); + public static readonly CVarDef // 12 Minutes + GameEventsRampingMaximumTime = CVarDef.Create("game.events_ramping_maximum_time", 720, CVar.SERVERONLY); /// /// From 50092e9988ec1718272a72e54507765eb81b61dc Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Fri, 5 Jul 2024 21:03:51 +0000 Subject: [PATCH 130/155] Automatic Changelog Update (#509) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index f9c1de93996..cc18a7b1e00 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4335,3 +4335,11 @@ Entries: message: Job requirements are now displayed correctly. id: 6142 time: '2024-07-05T19:10:24.0000000+00:00' +- author: Mnemotechnician + changes: + - type: Tweak + message: >- + Events should now occur as frequently as before. Note: server owner can + configure the frequency on their server manually. + id: 6143 + time: '2024-07-05T21:03:28.0000000+00:00' From 8de45e767723a08d824bba4c2fda8411f2081e02 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Fri, 5 Jul 2024 18:53:36 -0400 Subject: [PATCH 131/155] More Loadout Items Wave 1 (#425) # Description The original release of Loadouts to EE did not have much in the way of actual implementation as far as the item list was concerned. This PR seeks to get a head start at fixing that by implementing a fairly sizeable chunk of new items that can be bought with loadout points. One important addition is the use of "non-clothing-job-related items", which helps further set this version of Loadouts apart from the /tg/ style of loadouts implemented elsewhere. One of the key strengths of this loadout system is that it's not limited to just replacing a job's clothing selections, but can also add items unrelated to clothing. My given example for this is the new option for Security characters(provided they have sufficient number of hours as a Security Officer) can spend roughly half their loadout points to start with a spare magazine for their handgun. Secondly, we also now have an opportunity to place non-nanotrasen corporate items in the game, in such a way that players can tie their characters to other corporations. Ostensibly this is to build up to the idea of "Contractor" characters. I hope that this will help broaden people's horizons. # On "Syndie" items I'd like to take this as an opportunity to kind of push people away from the whole thing of "THATS A SYNDICATE ITEM!!!!" wherever possible. For the most part this is very much NRP behavior that I'd like to discourage. With some notable exceptions, this doesn't mean outright antag items should be obtainable through Loadouts. To that end, items such as Interdyne branded smokes, Cybersun branded clothing, and other items with "In-Universe Company Brands" should be moved away from their identity as strictly antag objects, and instead things characters could reasonably have bought with their paycheck. # Technical Changes I had to make some improvements to the way Loadouts handles species, namely it wasn't previously possible to have an item require any entry from a list of species. I updated it so that SpeciesRequirement takes a list of Species, and will accept any entry from that list. My given example for this is the entries for Nitrogen air tanks, which can only be purchased in loadouts by SlimePersons and Vox(who are not currently playable, but I am accounting for them). Other usage of this is in the Oni-specific Security items. I do hope to use this as an opportunity to introduce more species-specific goods in the future. # Media Outerwear ![image](https://github.com/Simple-Station/Einstein-Engines/assets/16548818/8d0d9286-7758-45f3-aaff-506dddd35da6) More job-related selections available to some departments ![image](https://github.com/Simple-Station/Einstein-Engines/assets/16548818/7b214593-7111-42d7-966e-2a340c766f61) More variety of trinkets and items, including instruments! ![image](https://github.com/Simple-Station/Einstein-Engines/assets/16548818/1b7befaf-c94c-4238-b93b-cbdf14e939dd) Species Specific Items! ![image](https://github.com/Simple-Station/Einstein-Engines/assets/16548818/e4a2a7e6-085d-4e1b-9ed9-635af8b70e84) # Changelog :cl: VMSolidus - add: The catalog of items available via Loadouts has been greatly expanded. Have fun customizing your characters! --------- Signed-off-by: VMSolidus Signed-off-by: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com> Co-authored-by: Danger Revolution! <142105406+DangerRevolution@users.noreply.github.com> Co-authored-by: SimpleStation14 <130339894+SimpleStation14@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: SimpleStation Changelogs Co-authored-by: Pspritechologist <81725545+Pspritechologist@users.noreply.github.com> Co-authored-by: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com> Co-authored-by: stellar-novas --- .../customization/character-requirements.ftl | 2 +- .../Locale/en-US/loadouts/categories.ftl | 7 + Resources/Locale/en-US/loadouts/items.ftl | 2 + .../Entities/Clothing/Belt/belts.yml | 14 + .../Smokeables/Cigarettes/cigarette.yml | 2 +- .../Smokeables/Cigarettes/packs.yml | 2 +- .../Prototypes/Loadouts/Jobs/medical.yml | 264 +++++++++++++++++ .../Prototypes/Loadouts/Jobs/science.yml | 56 ++++ .../Prototypes/Loadouts/Jobs/security.yml | 266 +++++++++++++++++- .../Prototypes/Loadouts/Jobs/service.yml | 17 ++ Resources/Prototypes/Loadouts/categories.yml | 17 +- Resources/Prototypes/Loadouts/eyes.yml | 12 +- Resources/Prototypes/Loadouts/hands.yml | 115 ++++++++ Resources/Prototypes/Loadouts/head.yml | 184 ++++++++++-- Resources/Prototypes/Loadouts/items.yml | 140 ++++++++- Resources/Prototypes/Loadouts/neck.yml | 85 +++++- .../Prototypes/Loadouts/outerClothing.yml | 73 ++++- Resources/Prototypes/Loadouts/shoes.yml | 94 ++++++- Resources/Prototypes/Loadouts/species.yml | 35 +++ Resources/Prototypes/Loadouts/uniform.yml | 240 +++++++++++++++- 20 files changed, 1563 insertions(+), 64 deletions(-) create mode 100644 Resources/Prototypes/Loadouts/hands.yml create mode 100644 Resources/Prototypes/Loadouts/species.yml diff --git a/Resources/Locale/en-US/customization/character-requirements.ftl b/Resources/Locale/en-US/customization/character-requirements.ftl index b073bdb773f..efa1b7e7677 100644 --- a/Resources/Locale/en-US/customization/character-requirements.ftl +++ b/Resources/Locale/en-US/customization/character-requirements.ftl @@ -9,7 +9,7 @@ character-species-requirement = You must {$inverted -> character-trait-requirement = You must {$inverted -> [true] not have *[other] have -} the trait [color=lightblue]{$trait}[/color] +} one of these traits: [color=lightblue]{$traits}[/color] character-backpack-type-requirement = You must {$inverted -> [true] not use *[other] use diff --git a/Resources/Locale/en-US/loadouts/categories.ftl b/Resources/Locale/en-US/loadouts/categories.ftl index 685c5cbcbd9..9770bd8bafd 100644 --- a/Resources/Locale/en-US/loadouts/categories.ftl +++ b/Resources/Locale/en-US/loadouts/categories.ftl @@ -2,7 +2,14 @@ loadout-category-Uncategorized = Uncategorized loadout-category-Accessories = Accessories +loadout-category-Eyes = Eyes +loadout-category-Hands = Hands +loadout-category-Head = Head loadout-category-Items = Items loadout-category-Jobs = Jobs +loadout-category-Mask = Mask +loadout-category-Neck = Neck loadout-category-Outer = Outer +loadout-category-Shoes = Shoes +loadout-category-Species = Species loadout-category-Uniform = Uniform diff --git a/Resources/Locale/en-US/loadouts/items.ftl b/Resources/Locale/en-US/loadouts/items.ftl index a4819011262..b92f56bc7cb 100644 --- a/Resources/Locale/en-US/loadouts/items.ftl +++ b/Resources/Locale/en-US/loadouts/items.ftl @@ -11,3 +11,5 @@ loadout-description-LoadoutItemPlushieSharkBlue = Dive into battle with your ver loadout-description-LoadoutItemPlushieSharkPink = Unleash the power of pink with the Pink Shark Plushie! This rosy-hued predator might not have real teeth, but its sheer adorableness is enough to take a bite out of anyone's resolve. Watch as foes melt away in the face of its cottony charm. loadout-description-LoadoutItemPlushieSharkGrey = Introducing the Grey Shark Plushie, the apex predator of snuggles! With its sleek and understated design, this plushie strikes the perfect balance between cuddle companion and imaginary ocean guardian. Beware; opponents may be mesmerized by its dorsal fin's hypnotic sway! loadout-description-LoadoutItemPlushieCarp = Brace for extraterrestrial antics with the Purple Space Carp Plushie! A fishy invader from the cosmic deep, this plushie brings a splash of humor to zero-gravity escapades. From hostile waters to interstellar giggles, it's a cuddly contradiction that's out of this world +loadout-description-LoadoutSolCommonTranslator = The most common of all translators, such that it can be purchased in any civilized station. + This device translates Sol Common speech into Galactic Common. diff --git a/Resources/Prototypes/Entities/Clothing/Belt/belts.yml b/Resources/Prototypes/Entities/Clothing/Belt/belts.yml index 1f90b421526..e6c08bf90b9 100644 --- a/Resources/Prototypes/Entities/Clothing/Belt/belts.yml +++ b/Resources/Prototypes/Entities/Clothing/Belt/belts.yml @@ -607,6 +607,20 @@ - type: Clothing sprite: Clothing/Belt/securitywebbing.rsi +- type: entity + parent: ClothingBeltSecurityWebbing + id: ClothingBeltSecurityWebbingFilled + name: security webbing + description: Unique and versatile chest rig, can hold security gear. + components: + - type: StorageFill + contents: + - id: GrenadeFlashBang + - id: TearGasGrenade + - id: Stunbaton + - id: Handcuffs + - id: Handcuffs + - type: entity parent: ClothingBeltStorageBase id: ClothingBeltMercWebbing diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Smokeables/Cigarettes/cigarette.yml b/Resources/Prototypes/Entities/Objects/Consumable/Smokeables/Cigarettes/cigarette.yml index 659cbaa28a2..18ea198697e 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Smokeables/Cigarettes/cigarette.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Smokeables/Cigarettes/cigarette.yml @@ -80,7 +80,7 @@ - ReagentId: Nicotine Quantity: 10 - ReagentId: Omnizine - Quantity: 30 + Quantity: 5 - type: entity id: CigaretteOmnizine diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Smokeables/Cigarettes/packs.yml b/Resources/Prototypes/Entities/Objects/Consumable/Smokeables/Cigarettes/packs.yml index bc9079fb2db..eb8e0a1ffe6 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Smokeables/Cigarettes/packs.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Smokeables/Cigarettes/packs.yml @@ -182,7 +182,7 @@ id: CigPackSyndicate parent: CigPackBase name: Interdyne herbals packet - description: Elite cigarettes for elite syndicate agents. Infused with medicine for when you need to do more than calm your nerves. + description: Premium medicinal cigarettes from the Interdyne Corporation. Not endorsed by the Terra-Gov Surgeon General. components: - type: Sprite sprite: Objects/Consumable/Smokeables/Cigarettes/Packs/syndicate.rsi diff --git a/Resources/Prototypes/Loadouts/Jobs/medical.yml b/Resources/Prototypes/Loadouts/Jobs/medical.yml index 5e88006fcee..6dcce11d09f 100644 --- a/Resources/Prototypes/Loadouts/Jobs/medical.yml +++ b/Resources/Prototypes/Loadouts/Jobs/medical.yml @@ -9,6 +9,8 @@ - MedicalDoctor - Paramedic - ChiefMedicalOfficer + - MedicalIntern + - Chemist items: - ClothingHandsGlovesNitrile @@ -35,6 +37,7 @@ jobs: - MedicalDoctor - ChiefMedicalOfficer + - MedicalIntern items: - ClothingNeckStethoscope @@ -47,6 +50,9 @@ - !type:CharacterJobRequirement jobs: - MedicalDoctor + - Chemist + - Paramedic + - MedicalIntern items: - UniformScrubsColorBlue @@ -59,6 +65,9 @@ - !type:CharacterJobRequirement jobs: - MedicalDoctor + - Chemist + - Paramedic + - MedicalIntern items: - UniformScrubsColorGreen @@ -71,9 +80,85 @@ - !type:CharacterJobRequirement jobs: - MedicalDoctor + - Chemist + - Paramedic + - MedicalIntern items: - UniformScrubsColorPurple +- type: loadout + id: LoadoutMedicalUniformScrubsCyan + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - MedicalDoctor + - Chemist + - Paramedic + - MedicalIntern + items: + - UniformScrubsColorCyan + +- type: loadout + id: LoadoutMedicalUniformScrubsBlack + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - MedicalDoctor + - Chemist + - Paramedic + - MedicalIntern + items: + - UniformScrubsColorBlack + +- type: loadout + id: LoadoutMedicalUniformScrubsPink + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - MedicalDoctor + - Chemist + - Paramedic + - MedicalIntern + items: + - UniformScrubsColorPink + +- type: loadout + id: LoadoutMedicalUniformScrubsCybersun + category: Jobs + cost: 3 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - MedicalDoctor + - Chemist + - Paramedic + items: + - UniformScrubsColorCybersun + +- type: loadout + id: LoadoutMedicalOuterCybersunWindbreaker + category: Jobs + cost: 5 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - MedicalDoctor + - Chemist + - Paramedic + items: + - ClothingOuterCoatCybersunWindbreaker + - type: loadout id: LoadoutMedicalOuterLabcoatChem category: Jobs @@ -130,6 +215,9 @@ - !type:CharacterJobRequirement jobs: - MedicalDoctor + - Chemist + - Paramedic + - ChiefMedicalOfficer - !type:CharacterPlaytimeRequirement tracker: JobChemist min: 21600 # 6 hours @@ -151,6 +239,9 @@ - !type:CharacterJobRequirement jobs: - MedicalDoctor + - Chemist + - Paramedic + - ChiefMedicalOfficer - !type:CharacterPlaytimeRequirement tracker: JobChemist min: 21600 # 6 hours @@ -184,6 +275,9 @@ - !type:CharacterJobRequirement jobs: - MedicalDoctor + - Chemist + - Paramedic + - ChiefMedicalOfficer - !type:CharacterPlaytimeRequirement tracker: JobChemist min: 21600 # 6 hours @@ -195,3 +289,173 @@ min: 216000 # 60 hours items: - ClothingHeadHatBeretSeniorPhysician + +- type: loadout + id: LoadoutMedicalHeadSurgcapBlue + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - MedicalDoctor + - Chemist + - Paramedic + - MedicalIntern + items: + - ClothingHeadHatSurgcapBlue + +- type: loadout + id: LoadoutMedicalHeadSurgcapPurple + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - MedicalDoctor + - Chemist + - Paramedic + - MedicalIntern + items: + - ClothingHeadHatSurgcapPurple + +- type: loadout + id: LoadoutMedicalHeadSurgcapGreen + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - MedicalDoctor + - Chemist + - Paramedic + - MedicalIntern + items: + - ClothingHeadHatSurgcapGreen + +- type: loadout + id: LoadoutMedicalHeadSurgcapCyan + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - MedicalDoctor + - Chemist + - Paramedic + - MedicalIntern + items: + - ClothingHeadHatSurgcapCyan + +- type: loadout + id: LoadoutMedicalHeadSurgcapBlack + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - MedicalDoctor + - Chemist + - Paramedic + - MedicalIntern + items: + - ClothingHeadHatSurgcapBlack + +- type: loadout + id: LoadoutMedicalHeadSurgcapPink + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - MedicalDoctor + - Chemist + - Paramedic + - MedicalIntern + items: + - ClothingHeadHatSurgcapPink + +- type: loadout + id: LoadoutMedicalHeadSurgcapWhite + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - MedicalDoctor + - Chemist + - Paramedic + - MedicalIntern + items: + - ClothingHeadHatSurgcapWhite + +- type: loadout + id: LoadoutMedicalHeadSurgcapCybersun + category: Jobs + cost: 3 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - MedicalDoctor + - Chemist + - Paramedic + items: + - ClothingHeadHatSurgcapCybersun + +- type: loadout + id: LoadoutMedicalEyesHudMedical + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - MedicalDoctor + - Paramedic + - ChiefMedicalOfficer + - MedicalIntern + - Brigmedic + items: + - ClothingEyesHudMedical + +- type: loadout + id: LoadoutMedicalEyesEyepatchHudMedical + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - MedicalDoctor + - Paramedic + - ChiefMedicalOfficer + - MedicalIntern + - Brigmedic + items: + - ClothingEyesEyepatchHudMedical + +- type: loadout + id: LoadoutMedicalEyesHudMedicalPrescription + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - MedicalDoctor + - Paramedic + - ChiefMedicalOfficer + - MedicalIntern + - Brigmedic + - !type:CharacterTraitRequirement + traits: + - Nearsighted + items: + - ClothingEyesPrescriptionMedHud diff --git a/Resources/Prototypes/Loadouts/Jobs/science.yml b/Resources/Prototypes/Loadouts/Jobs/science.yml index ad6f02e589e..b9c815a15b0 100644 --- a/Resources/Prototypes/Loadouts/Jobs/science.yml +++ b/Resources/Prototypes/Loadouts/Jobs/science.yml @@ -84,3 +84,59 @@ - ResearchDirector items: - ClothingHeadHatBeretRND + +- type: loadout + id: LoadoutScienceEyesHudDiagnostic + category: Jobs + cost: 3 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Scientist + - ResearchAssistant + - ResearchDirector + items: + - ClothingEyesHudDiagnostic + +- type: loadout + id: LoadoutScienceEyesEyepatchHudDiag + category: Jobs + cost: 3 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Scientist + - ResearchAssistant + - ResearchDirector + items: + - ClothingEyesEyepatchHudDiag + +## Robes +- type: loadout + id: LoadoutOuterRobeTechPriest + category: Outer + cost: 2 + items: + - ClothingOuterRobeTechPriest + requirements: + - !type:CharacterJobRequirement + jobs: + - Scientist + - ResearchAssistant + - ResearchDirector + +- type: loadout + id: LoadoutHeadHoodTechPriest + category: Head + cost: 1 + exclusive: true + items: + - ClothingHeadTechPriest + requirements: + - !type:CharacterJobRequirement + jobs: + - Scientist + - ResearchAssistant + - ResearchDirector diff --git a/Resources/Prototypes/Loadouts/Jobs/security.yml b/Resources/Prototypes/Loadouts/Jobs/security.yml index ecf7e4893a2..e6a6693ec18 100644 --- a/Resources/Prototypes/Loadouts/Jobs/security.yml +++ b/Resources/Prototypes/Loadouts/Jobs/security.yml @@ -1,7 +1,22 @@ +## Uniforms - type: loadout - id: LoadoutSecurityUniformGrey + id: LoadoutSecurityUniformJumpsuitBlue category: Jobs - cost: 2 + cost: 1 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - SecurityOfficer + - SecurityCadet + - Warden + items: + - ClothingUniformJumpsuitSecBlue + +- type: loadout + id: LoadoutSecurityUniformJumpsuitGrey + category: Jobs + cost: 1 exclusive: true requirements: - !type:CharacterJobRequirement @@ -12,6 +27,34 @@ items: - ClothingUniformJumpsuitSecGrey +- type: loadout + id: LoadoutSecurityUniformJumpskirtGrey + category: Jobs + cost: 1 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - SecurityOfficer + - SecurityCadet + - Warden + items: + - ClothingUniformJumpskirtSecGrey + +- type: loadout + id: LoadoutSecurityUniformJumpskirtBlue + category: Jobs + cost: 1 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - SecurityOfficer + - SecurityCadet + - Warden + items: + - ClothingUniformJumpskirtSecBlue + - type: loadout id: LoadoutSecurityUniformJumpskirtSenior category: Jobs @@ -60,6 +103,108 @@ items: - ClothingUniformJumpsuitSeniorOfficer +- type: loadout + id: LoadoutUniformJumpsuitWardenBlue + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Warden + items: + - ClothingUniformJumpsuitWardenBlue + +- type: loadout + id: LoadoutUniformJumpsuitWardenGrey + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Warden + items: + - ClothingUniformJumpsuitWardenGrey + +- type: loadout + id: LoadoutUniformJumpskirtWardenBlue + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Warden + items: + - ClothingUniformJumpskirtWardenBlue + +- type: loadout + id: LoadoutUniformJumpskirtWardenGrey + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Warden + items: + - ClothingUniformJumpskirtWardenGrey + +- type: loadout + id: LoadoutUniformJumpskirtHoSBlue + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - HeadOfSecurity + items: + - ClothingUniformJumpskirtHoSBlue + +- type: loadout + id: LoadoutUniformJumpskirtHoSGrey + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - HeadOfSecurity + items: + - ClothingUniformJumpskirtHoSGrey + +- type: loadout + id: LoadoutUniformJumpsuitSecFormal + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Detective + - SecurityOfficer + - Warden + - HeadOfSecurity + items: + - ClothingUniformJumpsuitSecFormal + +- type: loadout + id: LoadoutUniformJumpsuitSecSummer + category: Jobs + cost: 1 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Detective + - SecurityOfficer + - Warden + - HeadOfSecurity + items: + - ClothingUniformJumpsuitSecSummer +## Mask - type: loadout id: LoadoutSecurityMaskGasSwat category: Jobs @@ -73,6 +218,7 @@ items: - ClothingMaskGasSwat +## Shoes - type: loadout id: LoadoutSecurityShoesJackboots category: Jobs @@ -87,3 +233,119 @@ - HeadOfSecurity items: - ClothingShoesBootsJack + +## Eyes +- type: loadout + id: LoadoutSecurityEyesHudSecurity + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - SecurityOfficer + - Warden + - HeadOfSecurity + - Brigmedic + items: + - ClothingEyesHudSecurity + +- type: loadout + id: LoadoutSecurityEyesEyepatchHudSecurity + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - SecurityOfficer + - Warden + - HeadOfSecurity + - Brigmedic + items: + - ClothingEyesEyepatchHudSecurity + +- type: loadout + id: LoadoutSecurityEyesHudSecurityPrescription + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - SecurityOfficer + - Warden + - HeadOfSecurity + - Brigmedic + - !type:CharacterTraitRequirement + traits: + - Nearsighted + items: + - ClothingEyesPrescriptionHudSecurity + +## Head +- type: loadout + id: LoadoutSecurityHeadHatBeret + category: Jobs + cost: 1 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - SecurityOfficer + - Warden + - HeadOfSecurity + - Brigmedic + items: + - ClothingHeadHatBeretSecurity + +- type: loadout + id: LoadoutSecurityHeadHelmetInsulated + category: Jobs + cost: 3 + requirements: + - !type:CharacterJobRequirement + jobs: + - SecurityOfficer + - Warden + - HeadOfSecurity + - Brigmedic + items: + - ClothingHeadHelmetInsulated + +## Belt +- type: loadout + id: LoadoutSecurityBeltWebbing + category: Jobs + cost: 1 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Detective + - SecurityOfficer + - SecurityCadet + - Warden + - HeadOfSecurity + items: + - ClothingBeltSecurityWebbingFilled + +## Species +#- type: loadout ##Uncomment this and reassess points when we can make it replace the secoff duty pistol +# id: LoadoutSecurityEquipmentTruncheon +# category: Jobs +# cost: 8 ## TODO: Make this replace the secoff handgun, and thus also make it cheaper +# requirements: +# - !type:CharacterJobRequirement +# jobs: +# - SecurityOfficer +# - Warden +# - HeadOfSecurity +# - Brigmedic +# - !type:CharacterPlaytimeRequirement +# tracker: JobSecurityOfficer +# min: 36000 # 10 hours +# - !type:CharacterSpeciesRequirement +# species: Oni +# items: +# - Truncheon diff --git a/Resources/Prototypes/Loadouts/Jobs/service.yml b/Resources/Prototypes/Loadouts/Jobs/service.yml index 6ef3c3ad485..ed6107db9e9 100644 --- a/Resources/Prototypes/Loadouts/Jobs/service.yml +++ b/Resources/Prototypes/Loadouts/Jobs/service.yml @@ -1,3 +1,4 @@ +## Clown - type: loadout id: LoadoutServiceClownOutfitJester category: Jobs @@ -26,6 +27,7 @@ - ClothingHeadHatJesterAlt - ClothingShoesJester +## Bartender - type: loadout id: LoadoutServiceBartenderUniformPurple category: Jobs @@ -38,6 +40,7 @@ items: - ClothingUniformJumpsuitBartenderPurple +## Botanist - type: loadout id: LoadoutServiceBotanistUniformOveralls category: Jobs @@ -50,6 +53,7 @@ items: - ClothingUniformOveralls +## Lawyer - type: loadout id: LoadoutServiceLawyerUniformBlueSuit category: Jobs @@ -158,6 +162,7 @@ items: - ClothingUniformJumpsuitJournalist +## Reporter - type: loadout id: LoadoutServiceReporterUniformDetectivesuit category: Jobs @@ -181,3 +186,15 @@ - Reporter items: - ClothingUniformJumpskirtDetective + +## Musician +- type: loadout + id: LoadoutItemSynthesizerInstrument + category: Jobs + cost: 8 + requirements: + - !type:CharacterJobRequirement + jobs: + - Musician + items: + - SynthesizerInstrument diff --git a/Resources/Prototypes/Loadouts/categories.yml b/Resources/Prototypes/Loadouts/categories.yml index a4381941acc..79d2d7fe2bf 100644 --- a/Resources/Prototypes/Loadouts/categories.yml +++ b/Resources/Prototypes/Loadouts/categories.yml @@ -4,7 +4,13 @@ id: Uncategorized - type: loadoutCategory - id: Accessories + id: Eyes + +- type: loadoutCategory + id: Hands + +- type: loadoutCategory + id: Head - type: loadoutCategory id: Items @@ -12,8 +18,17 @@ - type: loadoutCategory id: Jobs +- type: loadoutCategory + id: Neck + - type: loadoutCategory id: Outer +- type: loadoutCategory + id: Shoes + +- type: loadoutCategory + id: Species + - type: loadoutCategory id: Uniform diff --git a/Resources/Prototypes/Loadouts/eyes.yml b/Resources/Prototypes/Loadouts/eyes.yml index a7a8cbd7736..74226604e92 100644 --- a/Resources/Prototypes/Loadouts/eyes.yml +++ b/Resources/Prototypes/Loadouts/eyes.yml @@ -1,13 +1,21 @@ - type: loadout id: LoadoutEyesEyepatch - category: Accessories + category: Eyes cost: 1 items: - ClothingEyesEyepatch - type: loadout id: LoadoutEyesBlindfold - category: Accessories + category: Eyes cost: 2 items: - ClothingEyesBlindfold + +- type: loadout + id: LoadoutItemSunglasses + category: Eyes + cost: 5 + exclusive: true + items: + - ClothingEyesGlassesSunglasses diff --git a/Resources/Prototypes/Loadouts/hands.yml b/Resources/Prototypes/Loadouts/hands.yml new file mode 100644 index 00000000000..3604678d387 --- /dev/null +++ b/Resources/Prototypes/Loadouts/hands.yml @@ -0,0 +1,115 @@ +- type: loadout + id: LoadoutHandsColorPurple + category: Hands + cost: 1 + exclusive: true + items: + - ClothingHandsGlovesColorPurple + +- type: loadout + id: LoadoutHandsColorRed + category: Hands + cost: 1 + exclusive: true + items: + - ClothingHandsGlovesColorRed + +- type: loadout + id: LoadoutHandsColorBlack + category: Hands + cost: 1 + exclusive: true + items: + - ClothingHandsGlovesColorBlack + +- type: loadout + id: LoadoutHandsColorBlue + category: Hands + cost: 1 + exclusive: true + items: + - ClothingHandsGlovesColorBlue + +- type: loadout + id: LoadoutHandsColorBrown + category: Hands + cost: 1 + exclusive: true + items: + - ClothingHandsGlovesColorBrown + +- type: loadout + id: LoadoutHandsColorGray + category: Hands + cost: 1 + exclusive: true + items: + - ClothingHandsGlovesColorGray + +- type: loadout + id: LoadoutHandsColorGreen + category: Hands + cost: 1 + exclusive: true + items: + - ClothingHandsGlovesColorGreen + +- type: loadout + id: LoadoutHandsColorLightBrown + category: Hands + cost: 1 + exclusive: true + items: + - ClothingHandsGlovesColorLightBrown + +- type: loadout + id: LoadoutHandsColorOrange + category: Hands + cost: 1 + exclusive: true + items: + - ClothingHandsGlovesColorOrange + +- type: loadout + id: LoadoutHandsColorWhite + category: Hands + cost: 1 + exclusive: true + items: + - ClothingHandsGlovesColorWhite + +- type: loadout + id: LoadoutHandsColorYellowBudget + category: Hands + cost: 4 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Passenger + items: + - ClothingHandsGlovesColorYellowBudget + +- type: loadout + id: LoadoutHandsGlovesLeather + category: Hands + cost: 1 + exclusive: true + items: + - ClothingHandsGlovesLeather + +- type: loadout + id: LoadoutHandsGlovesPowerglove + category: Hands + cost: 2 + exclusive: true + items: + - ClothingHandsGlovesPowerglove + +- type: loadout + id: LoadoutHandsGlovesRobohands + category: Hands + cost: 1 + exclusive: true + items: + - ClothingHandsGlovesRobohands diff --git a/Resources/Prototypes/Loadouts/head.yml b/Resources/Prototypes/Loadouts/head.yml index 33a2f0b19bc..25cb4dadf11 100644 --- a/Resources/Prototypes/Loadouts/head.yml +++ b/Resources/Prototypes/Loadouts/head.yml @@ -1,125 +1,273 @@ +## Hats - type: loadout id: LoadoutHeadBeaverHat - category: Accessories + category: Head cost: 2 + exclusive: true items: - ClothingHeadHatBeaverHat - type: loadout id: LoadoutHeadTophat - category: Accessories + category: Head cost: 2 + exclusive: true items: - ClothingHeadHatTophat +- type: loadout + id: LoadoutHeadFedoraBlack + category: Head + cost: 2 + exclusive: true + items: + - ClothingHeadHatFedoraBlack + +- type: loadout + id: LoadoutHeadFedoraChoc + category: Head + cost: 2 + exclusive: true + items: + - ClothingHeadHatFedoraChoc + +- type: loadout + id: LoadoutHeadFedoraWhite + category: Head + cost: 2 + exclusive: true + items: + - ClothingHeadHatFedoraWhite + +- type: loadout + id: LoadoutHeadFlatBlack + category: Head + cost: 2 + exclusive: true + items: + - ClothingHeadHatFlatBlack + +- type: loadout + id: LoadoutHeadFlatBrown + category: Head + cost: 2 + exclusive: true + items: + - ClothingHeadHatFlatBrown + +- type: loadout + id: LoadoutHeadTinfoil + category: Head + cost: 3 + exclusive: true + items: + - ClothingHeadTinfoil + +- type: loadout + id: LoadoutHeadBellhop + category: Head + cost: 2 + exclusive: true + items: + - ClothingHeadHatBellhop +## Color Hats - type: loadout id: LoadoutHeadHatBluesoft - category: Accessories + category: Head cost: 1 + exclusive: true items: - ClothingHeadHatBluesoft - type: loadout id: LoadoutHeadHatBluesoftFlipped - category: Accessories + category: Head cost: 1 + exclusive: true items: - ClothingHeadHatBluesoftFlipped - type: loadout id: LoadoutHeadHatCorpsoft - category: Accessories + category: Head cost: 1 + exclusive: true items: - ClothingHeadHatCorpsoft - type: loadout id: LoadoutHeadHatCorpsoftFlipped - category: Accessories + category: Head cost: 1 + exclusive: true items: - ClothingHeadHatCorpsoftFlipped - type: loadout id: LoadoutHeadHatGreensoft - category: Accessories + category: Head cost: 1 + exclusive: true items: - ClothingHeadHatGreensoft - type: loadout id: LoadoutHeadHatGreensoftFlipped - category: Accessories + category: Head cost: 1 + exclusive: true items: - ClothingHeadHatGreensoftFlipped - type: loadout id: LoadoutHeadHatGreysoft - category: Accessories + category: Head cost: 1 + exclusive: true items: - ClothingHeadHatGreysoft - type: loadout id: LoadoutHeadHatGreysoftFlipped - category: Accessories + category: Head cost: 1 + exclusive: true items: - ClothingHeadHatGreysoftFlipped - type: loadout id: LoadoutHeadHatOrangesoft - category: Accessories + category: Head cost: 1 + exclusive: true items: - ClothingHeadHatOrangesoft - type: loadout id: LoadoutHeadHatOrangesoftFlipped - category: Accessories + category: Head cost: 1 + exclusive: true items: - ClothingHeadHatOrangesoftFlipped - type: loadout id: LoadoutHeadHatPurplesoft - category: Accessories + category: Head cost: 1 + exclusive: true items: - ClothingHeadHatPurplesoft - type: loadout id: LoadoutHeadHatPurplesoftFlipped - category: Accessories + category: Head cost: 1 + exclusive: true items: - ClothingHeadHatPurplesoftFlipped - type: loadout id: LoadoutHeadHatRedsoft - category: Accessories + category: Head cost: 1 + exclusive: true items: - ClothingHeadHatRedsoft - type: loadout id: LoadoutHeadHatRedsoftFlipped - category: Accessories + category: Head cost: 1 + exclusive: true items: - ClothingHeadHatRedsoftFlipped - type: loadout id: LoadoutHeadHatYellowsoft - category: Accessories + category: Head cost: 1 + exclusive: true items: - ClothingHeadHatYellowsoft - type: loadout id: LoadoutHeadHatYellowsoftFlipped - category: Accessories + category: Head cost: 1 + exclusive: true items: - ClothingHeadHatYellowsoftFlipped + +## Headbands +- type: loadout + id: LoadoutHeadBandBlack + category: Head + cost: 1 + exclusive: true + items: + - ClothingHeadBandBlack + +- type: loadout + id: LoadoutHeadBandBlue + category: Head + cost: 1 + exclusive: true + items: + - ClothingHeadBandBlue + +- type: loadout + id: LoadoutHeadBandGold + category: Head + cost: 1 + exclusive: true + items: + - ClothingHeadBandGold + +- type: loadout + id: LoadoutHeadBandGreen + category: Head + cost: 1 + exclusive: true + items: + - ClothingHeadBandGreen + +- type: loadout + id: LoadoutHeadBandGrey + category: Head + cost: 1 + exclusive: true + items: + - ClothingHeadBandGrey + +- type: loadout + id: LoadoutHeadBandRed + category: Head + cost: 1 + exclusive: true + items: + - ClothingHeadBandRed + +- type: loadout + id: LoadoutHeadBandSkull + category: Head + cost: 1 + exclusive: true + items: + - ClothingHeadBandSkull + +- type: loadout + id: LoadoutHeadBandMerc + category: Head + cost: 2 + exclusive: true + items: + - ClothingHeadBandMerc + +- type: loadout + id: LoadoutHeadBandBrown + category: Head + cost: 1 + exclusive: true + items: + - ClothingHeadBandBrown diff --git a/Resources/Prototypes/Loadouts/items.yml b/Resources/Prototypes/Loadouts/items.yml index 6ce8d260613..072061d2e28 100644 --- a/Resources/Prototypes/Loadouts/items.yml +++ b/Resources/Prototypes/Loadouts/items.yml @@ -1,3 +1,4 @@ +#Smokes - type: loadout id: LoadoutItemCig category: Items @@ -34,11 +35,18 @@ - CigPackBlack - type: loadout - id: LoadoutItemPAI + id: LoadoutItemCigsMixed category: Items cost: 3 items: - - PersonalAI + - CigPackMixed + +- type: loadout + id: LoadoutItemCigsSyndicate + category: Items + cost: 4 + items: + - CigPackSyndicate - type: loadout id: LoadoutItemLighter @@ -61,30 +69,138 @@ items: - Matchbox +## Instruments - type: loadout - id: LoadoutItemPlushieSharkBlue + id: LoadoutItemMicrophoneInstrument category: Items - cost: 2 + cost: 4 items: - - PlushieSharkBlue + - MicrophoneInstrument - type: loadout - id: LoadoutItemPlushieSharkPink + id: LoadoutItemKalimbaInstrument category: Items - cost: 2 + cost: 4 + items: + - KalimbaInstrument + +- type: loadout + id: LoadoutItemTrumpetInstrument + category: Items + cost: 6 + items: + - TrumpetInstrument + +- type: loadout + id: LoadoutItemElectricGuitar + category: Items + cost: 7 + items: + - ElectricGuitarInstrument + +- type: loadout + id: LoadoutItemBassGuitar + category: Items + cost: 7 + items: + - BassGuitarInstrument + +- type: loadout + id: LoadoutItemRockGuitar + category: Items + cost: 7 + items: + - RockGuitarInstrument + +- type: loadout + id: LoadoutItemAcousticGuitar + category: Items + cost: 7 + items: + - AcousticGuitarInstrument + +- type: loadout + id: LoadoutItemViolin + category: Items + cost: 6 + items: + - ViolinInstrument + +- type: loadout + id: LoadoutItemHarmonica + category: Items + cost: 3 + items: + - HarmonicaInstrument + +- type: loadout + id: LoadoutItemAccordion + category: Items + cost: 6 + items: + - AccordionInstrument + +- type: loadout + id: LoadoutItemFlute + category: Items + cost: 4 items: - - PlushieSharkPink + - FluteInstrument - type: loadout - id: LoadoutItemPlushieSharkGrey + id: LoadoutItemOcarina + category: Items + cost: 3 + items: + - OcarinaInstrument + +# Survival Kit +- type: loadout + id: LoadoutItemsEmergencyOxygenTank + category: Items + cost: 1 + items: + - EmergencyOxygenTankFilled + +- type: loadout + id: LoadoutItemsExtendedEmergencyOxygenTank category: Items cost: 2 items: - - PlushieSharkGrey + - ExtendedEmergencyOxygenTankFilled + +- type: loadout + id: LoadoutItemsDoubleEmergencyOxygenTank + category: Items + cost: 4 + items: + - DoubleEmergencyOxygenTankFilled + +- type: loadout + id: LoadoutItemsEmergencyCrowbar + category: Items + cost: 3 + items: + - CrowbarRed +#Misc Items - type: loadout - id: LoadoutItemPlushieCarp + id: LoadoutItemPAI + category: Items + cost: 3 + items: + - PersonalAI + +- type: loadout + id: LoadoutItemWaistbag category: Items cost: 2 items: - - PlushieCarp + - ClothingBeltStorageWaistbag + +- type: loadout + id: LoadoutSolCommonTranslator + category: Items + cost: 3 + items: + - SolCommonTranslator diff --git a/Resources/Prototypes/Loadouts/neck.yml b/Resources/Prototypes/Loadouts/neck.yml index 7e5526f966a..eb933de29ee 100644 --- a/Resources/Prototypes/Loadouts/neck.yml +++ b/Resources/Prototypes/Loadouts/neck.yml @@ -1,27 +1,104 @@ - type: loadout id: LoadoutNeckScarfStripedRed - category: Accessories + category: Neck cost: 1 + exclusive: true items: - ClothingNeckScarfStripedRed - type: loadout id: LoadoutNeckScarfStripedBlue - category: Accessories + category: Neck cost: 1 + exclusive: true items: - ClothingNeckScarfStripedBlue - type: loadout id: LoadoutNeckScarfStripedGreen - category: Accessories + category: Neck cost: 1 + exclusive: true items: - ClothingNeckScarfStripedGreen - type: loadout id: LoadoutNeckScarfStripedZebra - category: Accessories + category: Neck cost: 1 + exclusive: true items: - ClothingNeckScarfStripedZebra + +#Pride Accessories +- type: loadout + id: LoadoutItemsPrideLGBTPin + category: Neck + cost: 1 + exclusive: true + items: + - ClothingNeckLGBTPin + +- type: loadout + id: LoadoutItemsPrideAromanticPin + category: Neck + cost: 1 + exclusive: true + items: + - ClothingNeckAromanticPin + +- type: loadout + id: LoadoutItemsPrideAsexualPin + category: Neck + cost: 1 + exclusive: true + items: + - ClothingNeckAsexualPin + +- type: loadout + id: LoadoutItemsPrideBisexualPin + category: Neck + cost: 1 + exclusive: true + items: + - ClothingNeckBisexualPin + +- type: loadout + id: LoadoutItemsPrideIntersexPin + category: Neck + cost: 1 + exclusive: true + items: + - ClothingNeckIntersexPin + +- type: loadout + id: LoadoutItemsPrideLesbianPin + category: Neck + cost: 1 + exclusive: true + items: + - ClothingNeckLesbianPin + +- type: loadout + id: LoadoutItemsPrideNonBinaryPin + category: Neck + cost: 1 + exclusive: true + items: + - ClothingNeckNonBinaryPin + +- type: loadout + id: LoadoutItemsPridePansexualPin + category: Neck + cost: 1 + exclusive: true + items: + - ClothingNeckPansexualPin + +- type: loadout + id: LoadoutItemsPrideTransPin + category: Neck + cost: 1 + exclusive: true + items: + - ClothingNeckTransPin diff --git a/Resources/Prototypes/Loadouts/outerClothing.yml b/Resources/Prototypes/Loadouts/outerClothing.yml index 078cf530ba2..a5932214ce9 100644 --- a/Resources/Prototypes/Loadouts/outerClothing.yml +++ b/Resources/Prototypes/Loadouts/outerClothing.yml @@ -1,10 +1,3 @@ -- type: loadout - id: LoadoutOuterGhostSheet - category: Outer - cost: 2 - items: - - ClothingOuterGhostSheet - - type: loadout id: LoadoutOuterCoatBomberjacket category: Outer @@ -33,6 +26,72 @@ items: - ClothingOuterWinterCoat +- type: loadout + id: LoadoutOuterCoatHyenhSweater + category: Outer + cost: 3 + items: + - ClothingOuterCoatHyenhSweater + +- type: loadout + id: LoadoutOuterWinterCoatLong + category: Outer + cost: 3 + items: + - ClothingOuterWinterCoatLong + +- type: loadout + id: LoadoutOuterWinterCoatPlaid + category: Outer + cost: 3 + items: + - ClothingOuterWinterCoatPlaid + +- type: loadout + id: LoadoutOuterVestValet + category: Outer + cost: 1 + items: + - ClothingOuterVestValet + +## Letterman Jackets +- type: loadout + id: LoadoutOuterCoatLettermanBlue + category: Outer + cost: 3 + items: + - ClothingOuterCoatLettermanBlue + +- type: loadout + id: LoadoutOuterCoatLettermanRed + category: Outer + cost: 3 + items: + - ClothingOuterCoatLettermanRed + +## MNK +- type: loadout + id: LoadoutOuterCoatMNKWhiteHoodie + category: Outer + cost: 3 + items: + - ClothingOuterCoatMNKWhiteHoodie + +- type: loadout + id: LoadoutOuterCoatMNKBlackTopCoat + category: Outer + cost: 3 + items: + - ClothingOuterCoatMNKBlackTopCoat + +- type: loadout + id: LoadoutOuterCoatMNKBlackJacket + category: Outer + cost: 3 + items: + - ClothingOuterCoatMNKBlackJacket + +## Contractor Jackets - type: loadout id: LoadoutOuterCorporateJacket category: Outer diff --git a/Resources/Prototypes/Loadouts/shoes.yml b/Resources/Prototypes/Loadouts/shoes.yml index 4a1880b5e21..3c2e21e631b 100644 --- a/Resources/Prototypes/Loadouts/shoes.yml +++ b/Resources/Prototypes/Loadouts/shoes.yml @@ -1,7 +1,7 @@ # Colored - type: loadout id: LoadoutShoesBlack - category: Accessories + category: Shoes cost: 1 exclusive: true items: @@ -9,7 +9,7 @@ - type: loadout id: LoadoutShoesBlue - category: Accessories + category: Shoes cost: 1 exclusive: true items: @@ -17,7 +17,7 @@ - type: loadout id: LoadoutShoesBrown - category: Accessories + category: Shoes cost: 1 exclusive: true items: @@ -25,7 +25,7 @@ - type: loadout id: LoadoutShoesGreen - category: Accessories + category: Shoes cost: 1 exclusive: true items: @@ -33,7 +33,7 @@ - type: loadout id: LoadoutShoesOrange - category: Accessories + category: Shoes cost: 1 exclusive: true items: @@ -41,7 +41,7 @@ - type: loadout id: LoadoutShoesPurple - category: Accessories + category: Shoes cost: 1 exclusive: true items: @@ -49,7 +49,7 @@ - type: loadout id: LoadoutShoesRed - category: Accessories + category: Shoes cost: 1 exclusive: true items: @@ -57,7 +57,7 @@ - type: loadout id: LoadoutShoesWhite - category: Accessories + category: Shoes cost: 1 exclusive: true items: @@ -65,25 +65,93 @@ - type: loadout id: LoadoutShoesYellow - category: Accessories + category: Shoes cost: 1 exclusive: true items: - ClothingShoesColorYellow +- type: loadout + id: LoadoutShoesGeta + category: Shoes + cost: 1 + exclusive: true + items: + - ClothingShoesGeta + +## Boots +- type: loadout + id: LoadoutShoesBootsWork + category: Shoes + cost: 1 + exclusive: true + items: + - ClothingShoesBootsWork + +- type: loadout + id: LoadoutShoesBootsLaceup + category: Shoes + cost: 2 + exclusive: true + items: + - ClothingShoesBootsLaceup + +- type: loadout + id: LoadoutShoesBootsWinter + category: Shoes + cost: 1 + exclusive: true + items: + - ClothingShoesBootsWinter + +- type: loadout + id: LoadoutShoesBootsCowboyBrown + category: Shoes + cost: 2 + exclusive: true + items: + - ClothingShoesBootsCowboyBrown + +- type: loadout + id: LoadoutShoesBootsCowboyBlack + category: Shoes + cost: 2 + exclusive: true + items: + - ClothingShoesBootsCowboyBlack + +- type: loadout + id: LoadoutShoesBootsCowboyWhite + category: Shoes + cost: 2 + exclusive: true + items: + - ClothingShoesBootsCowboyWhite + +- type: loadout + id: LoadoutShoesBootsCowboyFancy + category: Shoes + cost: 2 + exclusive: true + items: + - ClothingShoesBootsCowboyFancy # Miscellaneous - type: loadout id: LoadoutShoesSlippersDuck - category: Accessories - cost: 1 + category: Shoes + cost: 2 exclusive: true items: - ClothingShoeSlippersDuck + requirements: + - !type:CharacterJobRequirement + jobs: + - Clown - type: loadout id: LoadoutShoesLeather - category: Accessories + category: Shoes cost: 1 exclusive: true items: @@ -91,7 +159,7 @@ - type: loadout id: LoadoutShoesMiscWhite - category: Accessories + category: Shoes cost: 1 exclusive: true items: diff --git a/Resources/Prototypes/Loadouts/species.yml b/Resources/Prototypes/Loadouts/species.yml new file mode 100644 index 00000000000..1d2fb58dc0a --- /dev/null +++ b/Resources/Prototypes/Loadouts/species.yml @@ -0,0 +1,35 @@ +- type: loadout + id: LoadoutSpeciesEmergencyNitrogenTank + category: Species + cost: 0 + requirements: + - !type:CharacterSpeciesRequirement + species: SlimePerson + - !type:CharacterSpeciesRequirement + species: Vox + items: + - EmergencyNitrogenTankFilled + +- type: loadout + id: LoadoutSpeciesExtendedEmergencyNitrogenTank + category: Species + cost: 1 + requirements: + - !type:CharacterSpeciesRequirement + species: SlimePerson + - !type:CharacterSpeciesRequirement + species: Vox + items: + - ExtendedEmergencyNitrogenTankFilled + +- type: loadout + id: LoadoutSpeciesDoubleEmergencyNitrogenTank + category: Species + cost: 3 + requirements: + - !type:CharacterSpeciesRequirement + species: SlimePerson + - !type:CharacterSpeciesRequirement + species: Vox + items: + - DoubleEmergencyNitrogenTankFilled diff --git a/Resources/Prototypes/Loadouts/uniform.yml b/Resources/Prototypes/Loadouts/uniform.yml index 5afdd303c0b..20c5b42c7c2 100644 --- a/Resources/Prototypes/Loadouts/uniform.yml +++ b/Resources/Prototypes/Loadouts/uniform.yml @@ -19,6 +19,10 @@ exclusive: true items: - ClothingUniformJumpsuitColorBlack + requirements: + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpskirtColorBlack @@ -27,6 +31,10 @@ exclusive: true items: - ClothingUniformJumpskirtColorBlack + requirements: + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpsuitColorBlue @@ -35,6 +43,10 @@ exclusive: true items: - ClothingUniformJumpsuitColorBlue + requirements: + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpskirtColorBlue @@ -43,6 +55,10 @@ exclusive: true items: - ClothingUniformJumpskirtColorBlue + requirements: + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpsuitColorGreen @@ -51,6 +67,10 @@ exclusive: true items: - ClothingUniformJumpsuitColorGreen + requirements: + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpskirtColorGreen @@ -59,6 +79,10 @@ exclusive: true items: - ClothingUniformJumpskirtColorGreen + requirements: + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpsuitColorOrange @@ -67,6 +91,10 @@ exclusive: true items: - ClothingUniformJumpsuitColorOrange + requirements: + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpskirtColorOrange @@ -75,6 +103,10 @@ exclusive: true items: - ClothingUniformJumpskirtColorOrange + requirements: + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpsuitColorPink @@ -83,6 +115,10 @@ exclusive: true items: - ClothingUniformJumpsuitColorPink + requirements: + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpskirtColorPink @@ -91,6 +127,10 @@ exclusive: true items: - ClothingUniformJumpskirtColorPink + requirements: + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpsuitColorRed @@ -99,6 +139,10 @@ exclusive: true items: - ClothingUniformJumpsuitColorRed + requirements: + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpskirtColorRed @@ -107,6 +151,10 @@ exclusive: true items: - ClothingUniformJumpskirtColorRed + requirements: + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpsuitColorWhite @@ -115,6 +163,10 @@ exclusive: true items: - ClothingUniformJumpsuitColorWhite + requirements: + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpskirtColorWhite @@ -123,6 +175,10 @@ exclusive: true items: - ClothingUniformJumpskirtColorWhite + requirements: + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpsuitColorYellow @@ -131,6 +187,10 @@ exclusive: true items: - ClothingUniformJumpsuitColorYellow + requirements: + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpskirtColorYellow @@ -139,6 +199,10 @@ exclusive: true items: - ClothingUniformJumpskirtColorYellow + requirements: + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpsuitColorDarkBlue @@ -147,6 +211,10 @@ exclusive: true items: - ClothingUniformJumpsuitColorDarkBlue + requirements: + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpskirtColorDarkBlue @@ -155,6 +223,10 @@ exclusive: true items: - ClothingUniformJumpskirtColorDarkBlue + requirements: + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpsuitColorTeal @@ -163,6 +235,10 @@ exclusive: true items: - ClothingUniformJumpsuitColorTeal + requirements: + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpskirtColorTeal @@ -171,6 +247,10 @@ exclusive: true items: - ClothingUniformJumpskirtColorTeal + requirements: + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpsuitColorPurple @@ -179,6 +259,10 @@ exclusive: true items: - ClothingUniformJumpsuitColorPurple + requirements: + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpskirtColorPurple @@ -187,6 +271,10 @@ exclusive: true items: - ClothingUniformJumpskirtColorPurple + requirements: + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpsuitColorDarkGreen @@ -195,6 +283,10 @@ exclusive: true items: - ClothingUniformJumpsuitColorDarkGreen + requirements: + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpskirtColorDarkGreen @@ -203,6 +295,10 @@ exclusive: true items: - ClothingUniformJumpskirtColorDarkGreen + requirements: + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpsuitColorLightBrown @@ -211,6 +307,10 @@ exclusive: true items: - ClothingUniformJumpsuitColorLightBrown + requirements: + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpskirtColorLightBrown @@ -219,6 +319,10 @@ exclusive: true items: - ClothingUniformJumpskirtColorLightBrown + requirements: + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpsuitColorBrown @@ -227,6 +331,10 @@ exclusive: true items: - ClothingUniformJumpsuitColorBrown + requirements: + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpskirtColorBrown @@ -235,6 +343,10 @@ exclusive: true items: - ClothingUniformJumpskirtColorBrown + requirements: + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpsuitColorMaroon @@ -243,6 +355,10 @@ exclusive: true items: - ClothingUniformJumpsuitColorMaroon + requirements: + - !type:CharacterJobRequirement + jobs: + - Passenger - type: loadout id: LoadoutUniformJumpskirtColorMaroon @@ -251,11 +367,131 @@ exclusive: true items: - ClothingUniformJumpskirtColorMaroon + requirements: + - !type:CharacterJobRequirement + jobs: + - Passenger + +## Kendo +- type: loadout + id: LoadoutUniformKendoHakama + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformKendoHakama + +- type: loadout + id: LoadoutUniformMartialGi + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformMartialGi + +## Kimono +- type: loadout + id: LoadoutClothingKimonoBlue + category: Uniform + cost: 3 + exclusive: true + items: + - ClothingKimonoBlue + +- type: loadout + id: LoadoutClothingKimonoPink + category: Uniform + cost: 3 + exclusive: true + items: + - ClothingKimonoPink + +- type: loadout + id: LoadoutClothingKimonoPurple + category: Uniform + cost: 3 + exclusive: true + items: + - ClothingKimonoPurple + +- type: loadout + id: LoadoutClothingKimonoSky + category: Uniform + cost: 3 + exclusive: true + items: + - ClothingKimonoSky + +- type: loadout + id: LoadoutClothingKimonoGreen + category: Uniform + cost: 3 + exclusive: true + items: + - ClothingKimonoGreen +## Gakuran - type: loadout - id: LoadoutUniformJumpsuitColorRainbow + id: LoadoutUniformSchoolGakuranBlack category: Uniform cost: 2 exclusive: true items: - - ClothingUniformColorRainbow + - ClothingUniformSchoolGakuranBlack + +## MNK Uniforms +- type: loadout + id: LoadoutClothingMNKOfficeSkirt + category: Uniform + cost: 3 + exclusive: true + items: + - ClothingUniformMNKOfficeSkirt + +- type: loadout + id: LoadoutClothingMNKUnderGarment + category: Uniform + cost: 3 + exclusive: true + items: + - ClothingUniformMNKUnderGarment + +- type: loadout + id: LoadoutClothingMNKGymBra + category: Uniform + cost: 3 + exclusive: true + items: + - ClothingUniformMNKGymBra + +- type: loadout + id: LoadoutClothingMNKDressBlack + category: Uniform + cost: 4 + exclusive: true + items: + - ClothingUniformMNKDressBlack + +- type: loadout + id: LoadoutClothingMNKBlackOveralls + category: Uniform + cost: 3 + exclusive: true + items: + - ClothingUniformMNKBlackOveralls + +- type: loadout + id: LoadoutClothingMNKBlackShoulder + category: Uniform + cost: 3 + exclusive: true + items: + - ClothingUniformMNKBlackShoulder + +- type: loadout + id: LoadoutClothingMNKTracksuitBlack + category: Uniform + cost: 3 + exclusive: true + items: + - ClothingUniformMNKTracksuitBlack From 529c5a4a9fd1fd613f9f1931723300183cd37318 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Fri, 5 Jul 2024 22:53:58 +0000 Subject: [PATCH 132/155] Automatic Changelog Update (#425) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index cc18a7b1e00..68ccf158b46 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4343,3 +4343,11 @@ Entries: configure the frequency on their server manually. id: 6143 time: '2024-07-05T21:03:28.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: >- + The catalog of items available via Loadouts has been greatly expanded. + Have fun customizing your characters! + id: 6144 + time: '2024-07-05T22:53:36.0000000+00:00' From 5d3648305a621c393375521469a2ae86688cff2f Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Fri, 5 Jul 2024 19:49:31 -0400 Subject: [PATCH 133/155] Trichromat Modification Trait (#505) # Description This PR brings back a previous briefly existing feature, that of the NormalVisionComponent, which now exists as a single point positive trait that can be taken only by Harpies and Vulpkanin(A list to later be expanded if we ever get new species that have modified vision types). This trait is called "Trichromat Modification", and it simply removes any species based vision modifications an entity may have, such as Ultraviolet Vision. :cl: - add: Trichromat Modification has been added as a new positive trait. It can be taken by Harpies and Vulpkanin to buy off their unique vision negative traits. Signed-off-by: VMSolidus --- .../Components/NormalVisionComponent.cs | 12 ++++++++++ .../Assorted/Systems/NormalVisionSystem.cs | 23 +++++++++++++++++++ Resources/Locale/en-US/traits/traits.ftl | 6 +++++ .../Prototypes/DeltaV/Traits/altvision.yml | 22 ++++++++++++++++++ Resources/Prototypes/Traits/neutral.yml | 20 ++++++++++++++++ 5 files changed, 83 insertions(+) create mode 100644 Content.Shared/Traits/Assorted/Components/NormalVisionComponent.cs create mode 100644 Content.Shared/Traits/Assorted/Systems/NormalVisionSystem.cs diff --git a/Content.Shared/Traits/Assorted/Components/NormalVisionComponent.cs b/Content.Shared/Traits/Assorted/Components/NormalVisionComponent.cs new file mode 100644 index 00000000000..442bb6f0084 --- /dev/null +++ b/Content.Shared/Traits/Assorted/Components/NormalVisionComponent.cs @@ -0,0 +1,12 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Traits.Assorted.Components; + +/// +/// This is used for removing species specific vision traits +/// +[RegisterComponent, NetworkedComponent] +public sealed partial class NormalVisionComponent : Component +{ +} + diff --git a/Content.Shared/Traits/Assorted/Systems/NormalVisionSystem.cs b/Content.Shared/Traits/Assorted/Systems/NormalVisionSystem.cs new file mode 100644 index 00000000000..ee25bf364b9 --- /dev/null +++ b/Content.Shared/Traits/Assorted/Systems/NormalVisionSystem.cs @@ -0,0 +1,23 @@ +using Content.Shared.Abilities; +using Content.Shared.Traits.Assorted.Components; + +namespace Content.Shared.Traits.Assorted.Systems; + +/// +/// This handles removing species-specific vision traits. +/// +public sealed class NormalVisionSystem : EntitySystem +{ + /// + public override void Initialize() + { + SubscribeLocalEvent(OnStartup); + } + + + private void OnStartup(EntityUid uid, NormalVisionComponent component, ComponentInit args) + { + RemComp(uid); + RemComp(uid); + } +} diff --git a/Resources/Locale/en-US/traits/traits.ftl b/Resources/Locale/en-US/traits/traits.ftl index 80680ac0db2..2f59d322282 100644 --- a/Resources/Locale/en-US/traits/traits.ftl +++ b/Resources/Locale/en-US/traits/traits.ftl @@ -32,6 +32,12 @@ trait-description-SocialAnxiety = You are anxious when you speak and stutter. trait-name-Snoring = Snoring trait-description-Snoring = You will snore while sleeping. +trait-name-NormalVisionHarpy = Trichromat Modification +trait-description-NormalVisionHarpy = Your eyes have been modified by means of advanced medicine to see in the standard colors of Red, Green, and Blue. + +trait-name-NormalVisionVulpkanin = Trichromat Modification +trait-description-NormalVisionVulpkanin = Your eyes have been modified by means of advanced medicine to see in the standard colors of Red, Green, and Blue. + trait-name-Thieving = Thieving trait-description-Thieving = You are deft with your hands, and talented at convincing people of their belongings. diff --git a/Resources/Prototypes/DeltaV/Traits/altvision.yml b/Resources/Prototypes/DeltaV/Traits/altvision.yml index d1980bc23ad..1257c1eeb09 100644 --- a/Resources/Prototypes/DeltaV/Traits/altvision.yml +++ b/Resources/Prototypes/DeltaV/Traits/altvision.yml @@ -2,6 +2,17 @@ id: UltraVision category: Visual points: -1 + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: Vulpkanin + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + - !type:CharacterTraitRequirement + inverted: true + traits: + - DogVision components: - type: UltraVision @@ -9,5 +20,16 @@ id: DogVision category: Visual points: -1 + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: Vulpkanin + - !type:CharacterSpeciesRequirement + inverted: true + species: Harpy + - !type:CharacterTraitRequirement + inverted: true + traits: + - UltraVision components: - type: DogVision diff --git a/Resources/Prototypes/Traits/neutral.yml b/Resources/Prototypes/Traits/neutral.yml index 3a3dc943cd7..86e12d20b34 100644 --- a/Resources/Prototypes/Traits/neutral.yml +++ b/Resources/Prototypes/Traits/neutral.yml @@ -21,3 +21,23 @@ - type: MothAccent - type: ReplacementAccent accent: dwarf + +- type: trait + id: NormalVisionHarpy + category: Visual + points: -1 + requirements: + - !type:CharacterSpeciesRequirement + species: Harpy + components: + - type: NormalVision + +- type: trait + id: NormalVisionVulpkanin + category: Visual + points: -1 + requirements: + - !type:CharacterSpeciesRequirement + species: Vulpkanin + components: + - type: NormalVision From 9d5f3b65dfbf93b4c4903e8a3ab3361182bed3f9 Mon Sep 17 00:00:00 2001 From: Mnemotechnican <69920617+Mnemotechnician@users.noreply.github.com> Date: Sat, 6 Jul 2024 02:49:47 +0300 Subject: [PATCH 134/155] Refactor the Language System (#459) # Description The language PR was merged early and OH GOD I ALREADY REGRET IT This PR is intended to provide the missing refactors and address the issues that were missed due to the early merge. --- # TODO - [X] Introduced a polymorphic obfuscation property to the LanguagePrototype - now it supports more than just 2 hardcoded methods, and each method can be configured per-language. Currently there are 3 obfuscation methods: replacement (same as replacement accent), obuscation by syllables and obfuscation by phrases. - [X] Refactored the existing obfuscation methods to not be a big hardcoded mess. - [X] Updated the existing languages accordingly: animalistic languages are now less of an unreadable mess and include less syllables. Certain languages like binary and snake seriously benefit from that. - [X] Refactored the existing commands in response to the never-addressed review (it got lost among hundreds of others) - [X] Refactored the commands to be more user-friendly (you can now use the number of the language in saylang and languageselect which can allow using keybinds to switch between languages) - [X] Moved a lot of obfuscation-related stuff from server to shared. The actual obfuscation process, however, is still done on the server. That may or may not be subject to change, too. - [X] Refactored the entire process of resolution of entities' languages. Instead of raising an event every time it's required to learn what languages an entity knows, the lists of ALL languages available to the entity (including via translators) is stored in LanguageSpeakerComponent and only updated when necessary (e.g. when a translator gets toggled). The list of languages the entity knows on its own is now stored in LanguageKnowledgeComponent. - [X] Made handheld translators automatically change your current language when activated. - [X] Rewrote the translator implanter system, now using the real implants and implanters - [ ] Rebalance science stuff (translators are incredibly expensive for what they're worth) - [ ] Uhhh stuff ---

Media

N/A for now

--- # Changelog :cl: - tweak: Translator implants are now proper implants that can be removed. - tweak: Animalistic languages should now look less messy. - fix: Hopefully fixed language menu desync and other issues. --------- Signed-off-by: Mnemotechnican <69920617+Mnemotechnician@users.noreply.github.com> --- .../Language/LanguageMenuWindow.xaml.cs | 13 +- .../Language/Systems/LanguageSystem.cs | 1 - .../Systems/TranslatorImplanterSystem.cs | 8 - Content.Server/Chat/Systems/ChatSystem.cs | 6 +- .../Chemistry/ReagentEffects/MakeSentient.cs | 23 +- .../Language/Commands/ListLanguagesCommand.cs | 27 +- .../Language/Commands/SayLanguageCommand.cs | 6 +- .../Commands/SelectLanguageCommand.cs | 50 +- .../Language/DetermineEntityLanguagesEvent.cs | 32 +- .../Language/LanguageSystem.Networking.cs | 39 +- Content.Server/Language/LanguageSystem.cs | 325 +++---- .../Language}/LanguagesUpdateEvent.cs | 2 +- .../Language/TranslatorImplantSystem.cs | 66 ++ .../Language/TranslatorImplanterSystem.cs | 72 -- Content.Server/Language/TranslatorSystem.cs | 137 ++- .../Mind/Commands/MakeSentientCommand.cs | 7 +- .../Radio/EntitySystems/HeadsetSystem.cs | 2 +- .../Radio/EntitySystems/RadioSystem.cs | 4 +- .../Components/LanguageKnowledgeComponent.cs | 22 + .../Components/LanguageSpeakerComponent.cs | 33 +- .../Components/TranslatorImplantComponent.cs | 21 + .../TranslatorImplanterComponent.cs | 35 - .../Translators/BaseTranslatorComponent.cs | 9 - .../HandheldTranslatorComponent.cs | 15 +- Content.Shared/Language/LanguagePrototype.cs | 15 +- Content.Shared/Language/ObfuscationMethods.cs | 184 ++++ .../Language/Systems/SharedLanguageSystem.cs | 34 +- .../SharedTranslatorImplanterSystem.cs | 36 - Resources/Locale/en-US/language/commands.ftl | 16 +- .../DeltaV/Entities/Mobs/NPCs/animals.yml | 4 +- .../DeltaV/Entities/Mobs/NPCs/familiars.yml | 2 +- .../DeltaV/Entities/Mobs/NPCs/nukiemouse.yml | 2 +- .../DeltaV/Entities/Mobs/Species/harpy.yml | 2 +- .../Entities/Mobs/Species/vulpkanin.yml | 2 +- .../Mobs/Cyborgs/base_borg_chassis.yml | 2 +- .../Prototypes/Entities/Mobs/NPCs/animals.yml | 38 +- .../Entities/Mobs/NPCs/argocyte.yml | 2 +- .../Prototypes/Entities/Mobs/NPCs/pets.yml | 20 +- .../Entities/Mobs/NPCs/regalrat.yml | 4 +- .../Prototypes/Entities/Mobs/NPCs/shadows.yml | 2 +- .../Prototypes/Entities/Mobs/NPCs/silicon.yml | 2 +- .../Prototypes/Entities/Mobs/NPCs/slimes.yml | 2 +- .../Prototypes/Entities/Mobs/NPCs/space.yml | 6 +- .../Prototypes/Entities/Mobs/NPCs/xeno.yml | 4 +- .../Prototypes/Entities/Mobs/Species/base.yml | 2 +- .../Entities/Mobs/Species/diona.yml | 2 +- .../Entities/Mobs/Species/dwarf.yml | 2 +- .../Entities/Mobs/Species/human.yml | 2 +- .../Prototypes/Entities/Mobs/Species/moth.yml | 2 +- .../Entities/Mobs/Species/reptilian.yml | 2 +- .../Entities/Mobs/Species/slime.yml | 2 +- Resources/Prototypes/Entities/Mobs/base.yml | 1 + .../Objects/Devices/translator_implants.yml | 168 ++-- .../Entities/Objects/Devices/translators.yml | 21 +- .../Objects/Misc/translator_implanters.yml | 77 ++ .../Structures/Machines/vending_machines.yml | 2 +- Resources/Prototypes/Language/languages.yml | 891 ++++++++++-------- .../Nyanotrasen/Entities/Mobs/Species/Oni.yml | 2 +- .../Entities/Mobs/Species/felinid.yml | 2 +- 59 files changed, 1398 insertions(+), 1114 deletions(-) delete mode 100644 Content.Client/Language/Systems/TranslatorImplanterSystem.cs rename {Content.Shared/Language/Events => Content.Server/Language}/LanguagesUpdateEvent.cs (78%) create mode 100644 Content.Server/Language/TranslatorImplantSystem.cs delete mode 100644 Content.Server/Language/TranslatorImplanterSystem.cs create mode 100644 Content.Shared/Language/Components/LanguageKnowledgeComponent.cs create mode 100644 Content.Shared/Language/Components/TranslatorImplantComponent.cs delete mode 100644 Content.Shared/Language/Components/TranslatorImplanterComponent.cs create mode 100644 Content.Shared/Language/ObfuscationMethods.cs delete mode 100644 Content.Shared/Language/Systems/SharedTranslatorImplanterSystem.cs create mode 100644 Resources/Prototypes/Entities/Objects/Misc/translator_implanters.yml diff --git a/Content.Client/Language/LanguageMenuWindow.xaml.cs b/Content.Client/Language/LanguageMenuWindow.xaml.cs index 312814aca35..11d1c290d16 100644 --- a/Content.Client/Language/LanguageMenuWindow.xaml.cs +++ b/Content.Client/Language/LanguageMenuWindow.xaml.cs @@ -1,14 +1,8 @@ using Content.Client.Language.Systems; -using Content.Shared.Language; -using Content.Shared.Language.Systems; using Robust.Client.AutoGenerated; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.CustomControls; using Robust.Client.UserInterface.XAML; -using Robust.Shared.Console; -using Robust.Shared.Utility; -using Serilog; -using static Content.Shared.Language.Systems.SharedLanguageSystem; namespace Content.Client.Language; @@ -121,8 +115,11 @@ private void AddLanguageEntry(string language) private void OnLanguageChosen(string id) { var proto = _clientLanguageSystem.GetLanguagePrototype(id); - if (proto != null) - _clientLanguageSystem.RequestSetLanguage(proto); + if (proto == null) + return; + + _clientLanguageSystem.RequestSetLanguage(proto); + UpdateState(id, _clientLanguageSystem.SpokenLanguages); } diff --git a/Content.Client/Language/Systems/LanguageSystem.cs b/Content.Client/Language/Systems/LanguageSystem.cs index 9714078b2c5..5dc2fc1f4e7 100644 --- a/Content.Client/Language/Systems/LanguageSystem.cs +++ b/Content.Client/Language/Systems/LanguageSystem.cs @@ -2,7 +2,6 @@ using Content.Shared.Language.Events; using Content.Shared.Language.Systems; using Robust.Client; -using Robust.Shared.Console; namespace Content.Client.Language.Systems; diff --git a/Content.Client/Language/Systems/TranslatorImplanterSystem.cs b/Content.Client/Language/Systems/TranslatorImplanterSystem.cs deleted file mode 100644 index da19b3decf9..00000000000 --- a/Content.Client/Language/Systems/TranslatorImplanterSystem.cs +++ /dev/null @@ -1,8 +0,0 @@ -using Content.Shared.Language.Systems; - -namespace Content.Client.Language.Systems; - -public sealed class TranslatorImplanterSystem : SharedTranslatorImplanterSystem -{ - -} diff --git a/Content.Server/Chat/Systems/ChatSystem.cs b/Content.Server/Chat/Systems/ChatSystem.cs index 7eecaa32b43..9b6a7f540be 100644 --- a/Content.Server/Chat/Systems/ChatSystem.cs +++ b/Content.Server/Chat/Systems/ChatSystem.cs @@ -502,7 +502,7 @@ private void SendEntityWhisper( if (MessageRangeCheck(session, data, range) != MessageRangeCheckResult.Full) continue; // Won't get logged to chat, and ghosts are too far away to see the pop-up, so we just won't send it to them. - var canUnderstandLanguage = _language.CanUnderstand(listener, language); + var canUnderstandLanguage = _language.CanUnderstand(listener, language.ID); // How the entity perceives the message depends on whether it can understand its language var perceivedMessage = canUnderstandLanguage ? message : languageObfuscatedMessage; @@ -717,7 +717,7 @@ private void SendInVoiceRange(ChatChannel channel, string name, string message, // If the channel does not support languages, or the entity can understand the message, send the original message, otherwise send the obfuscated version - if (channel == ChatChannel.LOOC || channel == ChatChannel.Emotes || _language.CanUnderstand(listener, language)) + if (channel == ChatChannel.LOOC || channel == ChatChannel.Emotes || _language.CanUnderstand(listener, language.ID)) { _chatManager.ChatMessageToOne(channel, message, wrappedMessage, source, entHideChat, session.Channel, author: author); } @@ -846,7 +846,7 @@ public string WrapPublicMessage(EntityUid source, string name, string message) ("verb", verbName), ("fontType", speech.FontId), ("fontSize", speech.FontSize), - ("message", FormattedMessage.EscapeText(message))); + ("message", message)); } /// diff --git a/Content.Server/Chemistry/ReagentEffects/MakeSentient.cs b/Content.Server/Chemistry/ReagentEffects/MakeSentient.cs index da16529d515..8d5a583f6d8 100644 --- a/Content.Server/Chemistry/ReagentEffects/MakeSentient.cs +++ b/Content.Server/Chemistry/ReagentEffects/MakeSentient.cs @@ -1,13 +1,17 @@ using System.Linq; using Content.Server.Ghost.Roles.Components; +using Content.Server.Language; +using Content.Server.Language.Events; using Content.Server.Speech.Components; using Content.Shared.Chemistry.Reagent; using Content.Shared.Language; using Content.Shared.Language.Systems; using Content.Shared.Mind.Components; using Robust.Shared.Prototypes; -using Content.Server.Psionics; //Nyano - Summary: pulls in the ability for the sentient creature to become psionic. -using Content.Shared.Humanoid; //Delta-V - Banning humanoids from becoming ghost roles. +using Content.Server.Psionics; +using Content.Shared.Body.Part; //Nyano - Summary: pulls in the ability for the sentient creature to become psionic. +using Content.Shared.Humanoid; +using Content.Shared.Language.Components; //Delta-V - Banning humanoids from becoming ghost roles. using Content.Shared.Language.Events; namespace Content.Server.Chemistry.ReagentEffects; @@ -28,19 +32,18 @@ public override void Effect(ReagentEffectArgs args) entityManager.RemoveComponent(uid); entityManager.RemoveComponent(uid); + // Make sure the entity knows at least fallback (Galactic Common) var speaker = entityManager.EnsureComponent(uid); + var knowledge = entityManager.EnsureComponent(uid); var fallback = SharedLanguageSystem.FallbackLanguagePrototype; - if (!speaker.UnderstoodLanguages.Contains(fallback)) - speaker.UnderstoodLanguages.Add(fallback); + if (!knowledge.UnderstoodLanguages.Contains(fallback)) + knowledge.UnderstoodLanguages.Add(fallback); - if (!speaker.SpokenLanguages.Contains(fallback)) - { - speaker.CurrentLanguage = fallback; - speaker.SpokenLanguages.Add(fallback); - } + if (!knowledge.SpokenLanguages.Contains(fallback)) + knowledge.SpokenLanguages.Add(fallback); - args.EntityManager.EventBus.RaiseLocalEvent(uid, new LanguagesUpdateEvent(), true); + IoCManager.Resolve().GetEntitySystem().UpdateEntityLanguages(uid, speaker); // Stops from adding a ghost role to things like people who already have a mind if (entityManager.TryGetComponent(uid, out var mindContainer) && mindContainer.HasMind) diff --git a/Content.Server/Language/Commands/ListLanguagesCommand.cs b/Content.Server/Language/Commands/ListLanguagesCommand.cs index 6698e1b6453..e5787cba48c 100644 --- a/Content.Server/Language/Commands/ListLanguagesCommand.cs +++ b/Content.Server/Language/Commands/ListLanguagesCommand.cs @@ -1,5 +1,5 @@ -using System.Linq; using Content.Shared.Administration; +using Content.Shared.Language; using Robust.Shared.Console; using Robust.Shared.Enums; @@ -30,10 +30,29 @@ public void Execute(IConsoleShell shell, string argStr, string[] args) } var languages = IoCManager.Resolve().GetEntitySystem(); + var currentLang = languages.GetLanguage(playerEntity).ID; - var (spokenLangs, knownLangs) = languages.GetAllLanguages(playerEntity); + shell.WriteLine(Loc.GetString("command-language-spoken")); + var spoken = languages.GetSpokenLanguages(playerEntity); + for (int i = 0; i < spoken.Count; i++) + { + var lang = spoken[i]; + shell.WriteLine(lang == currentLang + ? Loc.GetString("command-language-current-entry", ("id", i + 1), ("language", lang), ("name", LanguageName(lang))) + : Loc.GetString("command-language-entry", ("id", i + 1), ("language", lang), ("name", LanguageName(lang)))); + } - shell.WriteLine("Spoken:\n" + string.Join("\n", spokenLangs)); - shell.WriteLine("Understood:\n" + string.Join("\n", knownLangs)); + shell.WriteLine(Loc.GetString("command-language-understood")); + var understood = languages.GetUnderstoodLanguages(playerEntity); + for (int i = 0; i < understood.Count; i++) + { + var lang = understood[i]; + shell.WriteLine(Loc.GetString("command-language-entry", ("id", i + 1), ("language", lang), ("name", LanguageName(lang)))); + } + } + + private string LanguageName(string id) + { + return Loc.GetString($"language-{id}-name"); } } diff --git a/Content.Server/Language/Commands/SayLanguageCommand.cs b/Content.Server/Language/Commands/SayLanguageCommand.cs index 2e4a27b1dcc..2304781fa04 100644 --- a/Content.Server/Language/Commands/SayLanguageCommand.cs +++ b/Content.Server/Language/Commands/SayLanguageCommand.cs @@ -32,7 +32,6 @@ public void Execute(IConsoleShell shell, string argStr, string[] args) if (args.Length < 2) return; - var languageId = args[0]; var message = string.Join(" ", args, startIndex: 1, count: args.Length - 1).Trim(); if (string.IsNullOrEmpty(message)) @@ -41,10 +40,9 @@ public void Execute(IConsoleShell shell, string argStr, string[] args) var languages = IoCManager.Resolve().GetEntitySystem(); var chats = IoCManager.Resolve().GetEntitySystem(); - var language = languages.GetLanguagePrototype(languageId); - if (language == null || !languages.CanSpeak(playerEntity, language.ID)) + if (!SelectLanguageCommand.TryParseLanguageArgument(languages, playerEntity, args[0], out var failReason, out var language)) { - shell.WriteError($"Language {languageId} is invalid or you cannot speak it!"); + shell.WriteError(failReason); return; } diff --git a/Content.Server/Language/Commands/SelectLanguageCommand.cs b/Content.Server/Language/Commands/SelectLanguageCommand.cs index e3363846539..d340135925d 100644 --- a/Content.Server/Language/Commands/SelectLanguageCommand.cs +++ b/Content.Server/Language/Commands/SelectLanguageCommand.cs @@ -1,5 +1,7 @@ +using System.Diagnostics.CodeAnalysis; using System.Linq; using Content.Shared.Administration; +using Content.Shared.Language; using Robust.Shared.Console; using Robust.Shared.Enums; @@ -32,17 +34,55 @@ public void Execute(IConsoleShell shell, string argStr, string[] args) if (args.Length < 1) return; - var languageId = args[0]; - var languages = IoCManager.Resolve().GetEntitySystem(); - var language = languages.GetLanguagePrototype(languageId); - if (language == null || !languages.CanSpeak(playerEntity, language.ID)) + if (!TryParseLanguageArgument(languages, playerEntity, args[0], out var failReason, out var language)) { - shell.WriteError($"Language {languageId} is invalid or you cannot speak it!"); + shell.WriteError(failReason); return; } languages.SetLanguage(playerEntity, language.ID); } + + // TODO: find a better place for this method + /// + /// Tries to parse the input argument as either a language ID or the position of the language in the list of languages + /// the entity can speak. Returns true if sucessful. + /// + public static bool TryParseLanguageArgument( + LanguageSystem languageSystem, + EntityUid speaker, + string input, + [NotNullWhen(false)] out string? failureReason, + [NotNullWhen(true)] out LanguagePrototype? language) + { + failureReason = null; + language = null; + + if (int.TryParse(input, out var num)) + { + // The argument is a number + var spoken = languageSystem.GetSpokenLanguages(speaker); + if (num > 0 && num - 1 < spoken.Count) + language = languageSystem.GetLanguagePrototype(spoken[num - 1]); + + if (language != null) // the ability to speak it is implied + return true; + + failureReason = Loc.GetString("command-language-invalid-number", ("total", spoken.Count)); + return false; + } + else + { + // The argument is a language ID + language = languageSystem.GetLanguagePrototype(input); + + if (language != null && languageSystem.CanSpeak(speaker, language.ID)) + return true; + + failureReason = Loc.GetString("command-language-invalid-language", ("id", input)); + return false; + } + } } diff --git a/Content.Server/Language/DetermineEntityLanguagesEvent.cs b/Content.Server/Language/DetermineEntityLanguagesEvent.cs index 13ab2cac279..8d6b868d070 100644 --- a/Content.Server/Language/DetermineEntityLanguagesEvent.cs +++ b/Content.Server/Language/DetermineEntityLanguagesEvent.cs @@ -1,29 +1,25 @@ +using Content.Shared.Language; + namespace Content.Server.Language; /// -/// Raised in order to determine the language an entity speaks at the current moment, -/// as well as the list of all languages the entity may speak and understand. +/// Raised in order to determine the list of languages the entity can speak and understand at the given moment. +/// Typically raised on an entity after a language agent (e.g. a translator) has been added to or removed from them. /// -public sealed class DetermineEntityLanguagesEvent : EntityEventArgs +[ByRefEvent] +public record struct DetermineEntityLanguagesEvent { /// - /// The default language of this entity. If empty, remain unchanged. - /// This field has no effect if the entity decides to speak in a concrete language. - /// - public string CurrentLanguage; - /// - /// The list of all languages the entity may speak. Must NOT be held as a reference! + /// The list of all languages the entity may speak. + /// By default, contains the languages this entity speaks intrinsically. /// - public List SpokenLanguages; + public HashSet SpokenLanguages = new(); + /// - /// The list of all languages the entity may understand. Must NOT be held as a reference! + /// The list of all languages the entity may understand. + /// By default, contains the languages this entity understands intrinsically. /// - public List UnderstoodLanguages; + public HashSet UnderstoodLanguages = new(); - public DetermineEntityLanguagesEvent(string currentLanguage, List spokenLanguages, List understoodLanguages) - { - CurrentLanguage = currentLanguage; - SpokenLanguages = spokenLanguages; - UnderstoodLanguages = understoodLanguages; - } + public DetermineEntityLanguagesEvent() {} } diff --git a/Content.Server/Language/LanguageSystem.Networking.cs b/Content.Server/Language/LanguageSystem.Networking.cs index 7517b4185e3..572e2961fde 100644 --- a/Content.Server/Language/LanguageSystem.Networking.cs +++ b/Content.Server/Language/LanguageSystem.Networking.cs @@ -1,5 +1,7 @@ +using Content.Server.Language.Events; using Content.Server.Mind; using Content.Shared.Language; +using Content.Shared.Language.Components; using Content.Shared.Language.Events; using Content.Shared.Mind; using Content.Shared.Mind.Components; @@ -7,11 +9,6 @@ namespace Content.Server.Language; -/// -/// LanguageSystem Networking -/// This is used to update client state when mind change entity. -/// - public sealed partial class LanguageSystem { [Dependency] private readonly MindSystem _mind = default!; @@ -19,6 +16,11 @@ public sealed partial class LanguageSystem public void InitializeNet() { + SubscribeNetworkEvent(OnClientSetLanguage); + SubscribeNetworkEvent((_, session) => SendLanguageStateToClient(session.SenderSession)); + + SubscribeLocalEvent((uid, comp, _) => SendLanguageStateToClient(uid, comp)); + // Refresh the client's state when its mind hops to a different entity SubscribeLocalEvent((uid, _, _) => SendLanguageStateToClient(uid)); SubscribeLocalEvent((_, _, args) => @@ -26,12 +28,21 @@ public void InitializeNet() if (args.Mind.Comp.Session != null) SendLanguageStateToClient(args.Mind.Comp.Session); }); - - SubscribeLocalEvent((uid, comp, _) => SendLanguageStateToClient(uid, comp)); - SubscribeNetworkEvent((_, session) => SendLanguageStateToClient(session.SenderSession)); } + private void OnClientSetLanguage(LanguagesSetMessage message, EntitySessionEventArgs args) + { + if (args.SenderSession.AttachedEntity is not { Valid: true } uid) + return; + + var language = GetLanguagePrototype(message.CurrentLanguage); + if (language == null || !CanSpeak(uid, language.ID)) + return; + + SetLanguage(uid, language.ID); + } + private void SendLanguageStateToClient(EntityUid uid, LanguageSpeakerComponent? comp = null) { // Try to find a mind inside the entity and notify its session @@ -50,10 +61,18 @@ private void SendLanguageStateToClient(ICommonSession session, LanguageSpeakerCo SendLanguageStateToClient(entity, session, comp); } + // TODO this is really stupid and can be avoided if we just make everything shared... private void SendLanguageStateToClient(EntityUid uid, ICommonSession session, LanguageSpeakerComponent? component = null) { - var langs = GetLanguages(uid, component); - var message = new LanguagesUpdatedMessage(langs.CurrentLanguage, langs.SpokenLanguages, langs.UnderstoodLanguages); + var isUniversal = HasComp(uid); + if (!isUniversal) + Resolve(uid, ref component, logMissing: false); + + // I really don't want to call 3 getter methods here, so we'll just have this slightly hardcoded solution + var message = isUniversal || component == null + ? new LanguagesUpdatedMessage(UniversalPrototype, [UniversalPrototype], [UniversalPrototype]) + : new LanguagesUpdatedMessage(component.CurrentLanguage, component.SpokenLanguages, component.UnderstoodLanguages); + RaiseNetworkEvent(message, session); } } diff --git a/Content.Server/Language/LanguageSystem.cs b/Content.Server/Language/LanguageSystem.cs index f1bf44c1f4f..e68489e9e28 100644 --- a/Content.Server/Language/LanguageSystem.cs +++ b/Content.Server/Language/LanguageSystem.cs @@ -1,289 +1,212 @@ using System.Linq; -using System.Text; -using Content.Server.GameTicking.Events; +using Content.Server.Language.Events; using Content.Shared.Language; +using Content.Shared.Language.Components; using Content.Shared.Language.Events; using Content.Shared.Language.Systems; -using Robust.Shared.Random; using UniversalLanguageSpeakerComponent = Content.Shared.Language.Components.UniversalLanguageSpeakerComponent; namespace Content.Server.Language; public sealed partial class LanguageSystem : SharedLanguageSystem { - // Static and re-used event instances used to minimize memory allocations during language processing, which can happen many times per tick. - // These are used in the method GetLanguages and returned from it. They should never be mutated outside of that method or returned outside this system. - private readonly DetermineEntityLanguagesEvent - _determineLanguagesEvent = new(string.Empty, new(), new()), - _universalLanguagesEvent = new(UniversalPrototype, [UniversalPrototype], [UniversalPrototype]); // Returned for universal speakers only - - /// - /// A random number added to each pseudo-random number's seed. Changes every round. - /// - public int RandomRoundSeed { get; private set; } - - public override void Initialize() { base.Initialize(); + InitializeNet(); - SubscribeNetworkEvent(OnClientSetLanguage); SubscribeLocalEvent(OnInitLanguageSpeaker); - SubscribeLocalEvent(_ => RandomRoundSeed = _random.Next()); - - InitializeNet(); } #region public api - /// - /// Obfuscate a message using an entity's default language. - /// - public string ObfuscateSpeech(EntityUid source, string message) - { - var language = GetLanguage(source) ?? Universal; - return ObfuscateSpeech(message, language); - } - /// - /// Obfuscate a message using the given language. - /// - public string ObfuscateSpeech(string message, LanguagePrototype language) + public bool CanUnderstand(EntityUid listener, string language, LanguageSpeakerComponent? component = null) { - var builder = new StringBuilder(); - if (language.ObfuscateSyllables) - ObfuscateSyllables(builder, message, language); - else - ObfuscatePhrases(builder, message, language); + if (language == UniversalPrototype || HasComp(listener)) + return true; - return builder.ToString(); + if (!Resolve(listener, ref component, logMissing: false)) + return false; + + return component.UnderstoodLanguages.Contains(language); } - public bool CanUnderstand(EntityUid listener, LanguagePrototype language, LanguageSpeakerComponent? listenerLanguageComp = null) + public bool CanSpeak(EntityUid speaker, string language, LanguageSpeakerComponent? component = null) { - if (language.ID == UniversalPrototype || HasComp(listener)) + if (HasComp(speaker)) return true; - var listenerLanguages = GetLanguages(listener, listenerLanguageComp)?.UnderstoodLanguages; + if (!Resolve(speaker, ref component, logMissing: false)) + return false; - return listenerLanguages?.Contains(language.ID, StringComparer.Ordinal) ?? false; + return component.SpokenLanguages.Contains(language); } - public bool CanSpeak(EntityUid speaker, string language, LanguageSpeakerComponent? speakerComp = null) + /// + /// Returns the current language of the given entity, assumes Universal if it's not a language speaker. + /// + public LanguagePrototype GetLanguage(EntityUid speaker, LanguageSpeakerComponent? component = null) { - if (HasComp(speaker)) - return true; + if (HasComp(speaker) || !Resolve(speaker, ref component, logMissing: false)) + return Universal; // Serves both as a fallback and uhhh something (TODO: fix this comment) + + if (string.IsNullOrEmpty(component.CurrentLanguage) || !_prototype.TryIndex(component.CurrentLanguage, out var proto)) + return Universal; - var langs = GetLanguages(speaker, speakerComp)?.UnderstoodLanguages; - return langs?.Contains(language, StringComparer.Ordinal) ?? false; + return proto; } /// - /// Returns the current language of the given entity. - /// Assumes Universal if not specified. + /// Returns the list of languages this entity can speak. /// - public LanguagePrototype GetLanguage(EntityUid speaker, LanguageSpeakerComponent? languageComp = null) + /// Typically, checking is sufficient. + public List GetSpokenLanguages(EntityUid uid) { - var id = GetLanguages(speaker, languageComp)?.CurrentLanguage; - if (id == null) - return Universal; // Fallback + if (HasComp(uid)) + return [UniversalPrototype]; - _prototype.TryIndex(id, out LanguagePrototype? proto); + if (TryComp(uid, out var component)) + return component.SpokenLanguages; - return proto ?? Universal; + return []; } - public void SetLanguage(EntityUid speaker, string language, LanguageSpeakerComponent? languageComp = null) + /// + /// Returns the list of languages this entity can understand. + /// + /// Typically, checking is sufficient. + public List GetUnderstoodLanguages(EntityUid uid) { - if (!CanSpeak(speaker, language) || HasComp(speaker)) - return; + if (HasComp(uid)) + return [UniversalPrototype]; // This one is tricky because... well, they understand all of them, not just one. - if (languageComp == null && !TryComp(speaker, out languageComp)) - return; + if (TryComp(uid, out var component)) + return component.UnderstoodLanguages; + + return []; + } - if (languageComp.CurrentLanguage == language) + public void SetLanguage(EntityUid speaker, string language, LanguageSpeakerComponent? component = null) + { + if (!CanSpeak(speaker, language) || (HasComp(speaker) && language != UniversalPrototype)) return; - languageComp.CurrentLanguage = language; + if (!Resolve(speaker, ref component) || component.CurrentLanguage == language) + return; + component.CurrentLanguage = language; RaiseLocalEvent(speaker, new LanguagesUpdateEvent(), true); } /// - /// Adds a new language to the lists of understood and/or spoken languages of the given component. + /// Adds a new language to the respective lists of intrinsically known languages of the given entity. /// - public void AddLanguage(LanguageSpeakerComponent comp, string language, bool addSpoken = true, bool addUnderstood = true) + public void AddLanguage( + EntityUid uid, + string language, + bool addSpoken = true, + bool addUnderstood = true, + LanguageKnowledgeComponent? knowledge = null, + LanguageSpeakerComponent? speaker = null) { - if (addSpoken && !comp.SpokenLanguages.Contains(language)) - comp.SpokenLanguages.Add(language); + if (knowledge == null) + knowledge = EnsureComp(uid); - if (addUnderstood && !comp.UnderstoodLanguages.Contains(language)) - comp.UnderstoodLanguages.Add(language); + if (addSpoken && !knowledge.SpokenLanguages.Contains(language)) + knowledge.SpokenLanguages.Add(language); - RaiseLocalEvent(comp.Owner, new LanguagesUpdateEvent(), true); - } + if (addUnderstood && !knowledge.UnderstoodLanguages.Contains(language)) + knowledge.UnderstoodLanguages.Add(language); - public (List spoken, List understood) GetAllLanguages(EntityUid speaker) - { - var languages = GetLanguages(speaker); - // The lists need to be copied because the internal ones are re-used for performance reasons. - return (new List(languages.SpokenLanguages), new List(languages.UnderstoodLanguages)); + UpdateEntityLanguages(uid, speaker); } /// - /// Ensures the given entity has a valid language as its current language. - /// If not, sets it to the first entry of its SpokenLanguages list, or universal if it's empty. + /// Removes a language from the respective lists of intrinsically known languages of the given entity. /// - public void EnsureValidLanguage(EntityUid entity, LanguageSpeakerComponent? comp = null) + public void RemoveLanguage( + EntityUid uid, + string language, + bool removeSpoken = true, + bool removeUnderstood = true, + LanguageKnowledgeComponent? knowledge = null, + LanguageSpeakerComponent? speaker = null) { - if (comp == null && !TryComp(entity, out comp)) - return; + if (knowledge == null) + knowledge = EnsureComp(uid); - var langs = GetLanguages(entity, comp); - if (!langs.SpokenLanguages.Contains(comp!.CurrentLanguage, StringComparer.Ordinal)) - { - comp.CurrentLanguage = langs.SpokenLanguages.FirstOrDefault(UniversalPrototype); - RaiseLocalEvent(comp.Owner, new LanguagesUpdateEvent(), true); - } - } - #endregion + if (removeSpoken) + knowledge.SpokenLanguages.Remove(language); - #region event handling - private void OnInitLanguageSpeaker(EntityUid uid, LanguageSpeakerComponent component, ComponentInit args) - { - if (string.IsNullOrEmpty(component.CurrentLanguage)) - component.CurrentLanguage = component.SpokenLanguages.FirstOrDefault(UniversalPrototype); - } - #endregion + if (removeUnderstood) + knowledge.UnderstoodLanguages.Remove(language); - #region internal api - obfuscation - private void ObfuscateSyllables(StringBuilder builder, string message, LanguagePrototype language) - { - // Go through each word. Calculate its hash sum and count the number of letters. - // Replicate it with pseudo-random syllables of pseudo-random (but similar) length. Use the hash code as the seed. - // This means that identical words will be obfuscated identically. Simple words like "hello" or "yes" in different langs can be memorized. - var wordBeginIndex = 0; - var hashCode = 0; - for (var i = 0; i < message.Length; i++) - { - var ch = char.ToLower(message[i]); - // A word ends when one of the following is found: a space, a sentence end, or EOM - if (char.IsWhiteSpace(ch) || IsSentenceEnd(ch) || i == message.Length - 1) - { - var wordLength = i - wordBeginIndex; - if (wordLength > 0) - { - var newWordLength = PseudoRandomNumber(hashCode, 1, 4); - - for (var j = 0; j < newWordLength; j++) - { - var index = PseudoRandomNumber(hashCode + j, 0, language.Replacement.Count); - builder.Append(language.Replacement[index]); - } - } - - builder.Append(ch); - hashCode = 0; - wordBeginIndex = i + 1; - } - else - hashCode = hashCode * 31 + ch; - } + UpdateEntityLanguages(uid, speaker); } - private void ObfuscatePhrases(StringBuilder builder, string message, LanguagePrototype language) + /// + /// Ensures the given entity has a valid language as its current language. + /// If not, sets it to the first entry of its SpokenLanguages list, or universal if it's empty. + /// + /// True if the current language was modified, false otherwise. + public bool EnsureValidLanguage(EntityUid entity, LanguageSpeakerComponent? comp = null) { - // In a similar manner, each phrase is obfuscated with a random number of conjoined obfuscation phrases. - // However, the number of phrases depends on the number of characters in the original phrase. - var sentenceBeginIndex = 0; - for (var i = 0; i < message.Length; i++) + if (!Resolve(entity, ref comp)) + return false; + + if (!comp.SpokenLanguages.Contains(comp.CurrentLanguage)) { - var ch = char.ToLower(message[i]); - if (IsSentenceEnd(ch) || i == message.Length - 1) - { - var length = i - sentenceBeginIndex; - if (length > 0) - { - var newLength = (int) Math.Clamp(Math.Cbrt(length) - 1, 1, 4); // 27+ chars for 2 phrases, 64+ for 3, 125+ for 4. - - for (var j = 0; j < newLength; j++) - { - var phrase = _random.Pick(language.Replacement); - builder.Append(phrase); - } - } - sentenceBeginIndex = i + 1; - - if (IsSentenceEnd(ch)) - builder.Append(ch).Append(" "); - } + comp.CurrentLanguage = comp.SpokenLanguages.FirstOrDefault(UniversalPrototype); + RaiseLocalEvent(entity, new LanguagesUpdateEvent()); + return true; } - } - private static bool IsSentenceEnd(char ch) - { - return ch is '.' or '!' or '?'; + return false; } - #endregion - #region internal api - misc /// - /// Dynamically resolves the current language of the entity and the list of all languages it speaks. - /// - /// If the entity is not a language speaker, or is a universal language speaker, then it's assumed to speak Universal, - /// aka all languages at once and none at the same time. + /// Immediately refreshes the cached lists of spoken and understood languages for the given entity. /// - /// - /// The returned event is reused and thus must not be held as a reference anywhere but inside the caller function. - /// - private DetermineEntityLanguagesEvent GetLanguages(EntityUid speaker, LanguageSpeakerComponent? comp = null) + public void UpdateEntityLanguages(EntityUid entity, LanguageSpeakerComponent? languages = null) { - // This is a shortcut for ghosts and entities that should not speak normally (admemes) - if (HasComp(speaker) || !TryComp(speaker, out comp)) - return _universalLanguagesEvent; + if (!Resolve(entity, ref languages)) + return; - var ev = _determineLanguagesEvent; - ev.SpokenLanguages.Clear(); - ev.UnderstoodLanguages.Clear(); + var ev = new DetermineEntityLanguagesEvent(); + // We add the intrinsically known languages first so other systems can manipulate them easily + if (TryComp(entity, out var knowledge)) + { + foreach (var spoken in knowledge.SpokenLanguages) + ev.SpokenLanguages.Add(spoken); - ev.CurrentLanguage = comp.CurrentLanguage; - ev.SpokenLanguages.AddRange(comp.SpokenLanguages); - ev.UnderstoodLanguages.AddRange(comp.UnderstoodLanguages); + foreach (var understood in knowledge.UnderstoodLanguages) + ev.UnderstoodLanguages.Add(understood); + } - RaiseLocalEvent(speaker, ev, true); + RaiseLocalEvent(entity, ref ev); - if (ev.CurrentLanguage.Length == 0) - ev.CurrentLanguage = !string.IsNullOrEmpty(comp.CurrentLanguage) ? comp.CurrentLanguage : UniversalPrototype; // Fall back to account for admemes like admins possessing a bread - return ev; - } + languages.SpokenLanguages.Clear(); + languages.UnderstoodLanguages.Clear(); - /// - /// Generates a stable pseudo-random number in the range (min, max) for the given seed. - /// Each input seed corresponds to exactly one random number. - /// - private int PseudoRandomNumber(int seed, int min, int max) - { - // This is not a uniform distribution, but it shouldn't matter given there's 2^31 possible random numbers, - // the bias of this function should be so tiny it will never be noticed. - seed += RandomRoundSeed; - var random = ((seed * 1103515245) + 12345) & 0x7fffffff; // Source: http://cs.uccs.edu/~cs591/bufferOverflow/glibc-2.2.4/stdlib/random_r.c - return random % (max - min) + min; + languages.SpokenLanguages.AddRange(ev.SpokenLanguages); + languages.UnderstoodLanguages.AddRange(ev.UnderstoodLanguages); + + if (!EnsureValidLanguage(entity)) + RaiseLocalEvent(entity, new LanguagesUpdateEvent()); } - /// - /// Set CurrentLanguage of the client, the client must be able to Understand the language requested. - /// - private void OnClientSetLanguage(LanguagesSetMessage message, EntitySessionEventArgs args) - { - if (args.SenderSession.AttachedEntity is not {Valid: true} speaker) - return; + #endregion - var language = GetLanguagePrototype(message.CurrentLanguage); + #region event handling - if (language == null || !CanSpeak(speaker, language.ID)) - return; + private void OnInitLanguageSpeaker(EntityUid uid, LanguageSpeakerComponent component, ComponentInit args) + { + if (string.IsNullOrEmpty(component.CurrentLanguage)) + component.CurrentLanguage = component.SpokenLanguages.FirstOrDefault(UniversalPrototype); - SetLanguage(speaker, language.ID); + UpdateEntityLanguages(uid, component); } + #endregion } diff --git a/Content.Shared/Language/Events/LanguagesUpdateEvent.cs b/Content.Server/Language/LanguagesUpdateEvent.cs similarity index 78% rename from Content.Shared/Language/Events/LanguagesUpdateEvent.cs rename to Content.Server/Language/LanguagesUpdateEvent.cs index 90ce2f4446b..88ea09916bb 100644 --- a/Content.Shared/Language/Events/LanguagesUpdateEvent.cs +++ b/Content.Server/Language/LanguagesUpdateEvent.cs @@ -1,4 +1,4 @@ -namespace Content.Shared.Language.Events; +namespace Content.Server.Language.Events; /// /// Raised on an entity when its list of languages changes. diff --git a/Content.Server/Language/TranslatorImplantSystem.cs b/Content.Server/Language/TranslatorImplantSystem.cs new file mode 100644 index 00000000000..4d58144481d --- /dev/null +++ b/Content.Server/Language/TranslatorImplantSystem.cs @@ -0,0 +1,66 @@ +using Content.Shared.Implants.Components; +using Content.Shared.Language; +using Content.Shared.Language.Components; +using Robust.Shared.Containers; + +namespace Content.Server.Language; + +public sealed class TranslatorImplantSystem : EntitySystem +{ + [Dependency] private readonly LanguageSystem _language = default!; + + public override void Initialize() + { + SubscribeLocalEvent(OnImplant); + SubscribeLocalEvent(OnDeImplant); + SubscribeLocalEvent(OnDetermineLanguages); + } + + private void OnImplant(EntityUid uid, TranslatorImplantComponent component, EntGotInsertedIntoContainerMessage args) + { + if (args.Container.ID != ImplanterComponent.ImplantSlotId) + return; + + var implantee = Transform(uid).ParentUid; + if (implantee is not { Valid: true } || !TryComp(implantee, out var knowledge)) + return; + + component.Enabled = true; + // To operate an implant, you need to know its required language intrinsically, because like... it connects to your brain or something. + // So external translators or other implants can't help you operate it. + component.SpokenRequirementSatisfied = TranslatorSystem.CheckLanguagesMatch( + component.RequiredLanguages, knowledge.SpokenLanguages, component.RequiresAllLanguages); + + component.UnderstoodRequirementSatisfied = TranslatorSystem.CheckLanguagesMatch( + component.RequiredLanguages, knowledge.UnderstoodLanguages, component.RequiresAllLanguages); + + _language.UpdateEntityLanguages(implantee); + } + + private void OnDeImplant(EntityUid uid, TranslatorImplantComponent component, EntGotRemovedFromContainerMessage args) + { + // Even though the description of this event says it gets raised BEFORE reparenting, that's actually false... + component.Enabled = component.SpokenRequirementSatisfied = component.UnderstoodRequirementSatisfied = false; + + if (TryComp(uid, out var subdermal) && subdermal.ImplantedEntity is { Valid: true} implantee) + _language.UpdateEntityLanguages(implantee); + } + + private void OnDetermineLanguages(EntityUid uid, ImplantedComponent component, ref DetermineEntityLanguagesEvent args) + { + // TODO: might wanna find a better solution, i just can't come up with something viable + foreach (var implant in component.ImplantContainer.ContainedEntities) + { + if (!TryComp(implant, out var translator) || !translator.Enabled) + continue; + + if (translator.SpokenRequirementSatisfied) + foreach (var language in translator.SpokenLanguages) + args.SpokenLanguages.Add(language); + + if (translator.UnderstoodRequirementSatisfied) + foreach (var language in translator.UnderstoodLanguages) + args.UnderstoodLanguages.Add(language); + } + } +} diff --git a/Content.Server/Language/TranslatorImplanterSystem.cs b/Content.Server/Language/TranslatorImplanterSystem.cs deleted file mode 100644 index 1e0c13375e4..00000000000 --- a/Content.Server/Language/TranslatorImplanterSystem.cs +++ /dev/null @@ -1,72 +0,0 @@ -using System.Linq; -using Content.Server.Administration.Logs; -using Content.Server.Popups; -using Content.Shared.Database; -using Content.Shared.Interaction; -using Content.Shared.Language; -using Content.Shared.Language.Components; -using Content.Shared.Language.Events; -using Content.Shared.Language.Systems; -using Content.Shared.Mobs.Components; -using Content.Shared.Language.Components.Translators; - -namespace Content.Server.Language; - -public sealed class TranslatorImplanterSystem : SharedTranslatorImplanterSystem -{ - [Dependency] private readonly PopupSystem _popup = default!; - [Dependency] private readonly IAdminLogManager _adminLogger = default!; - [Dependency] private readonly LanguageSystem _language = default!; - - - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(OnImplant); - } - - - private void OnImplant(EntityUid implanter, TranslatorImplanterComponent component, AfterInteractEvent args) - { - if (component.Used || !args.CanReach || args.Target is not { Valid: true } target) - return; - - if (!TryComp(target, out var speaker)) - return; - - if (component.MobsOnly && !HasComp(target)) - { - _popup.PopupEntity("translator-implanter-refuse", component.Owner); - return; - } - - var understood = _language.GetAllLanguages(target).understood; - if (component.RequiredLanguages.Count > 0 && !component.RequiredLanguages.Any(lang => understood.Contains(lang))) - { - _popup.PopupEntity(Loc.GetString("translator-implanter-refuse", - ("implanter", implanter), ("target", target)), implanter); - return; - } - - var intrinsic = EnsureComp(target); - intrinsic.Enabled = true; - - foreach (var lang in component.SpokenLanguages.Where(lang => !intrinsic.SpokenLanguages.Contains(lang))) - intrinsic.SpokenLanguages.Add(lang); - - foreach (var lang in component.UnderstoodLanguages.Where(lang => !intrinsic.UnderstoodLanguages.Contains(lang))) - intrinsic.UnderstoodLanguages.Add(lang); - - component.Used = true; - _popup.PopupEntity(Loc.GetString("translator-implanter-success", - ("implanter", implanter), ("target", target)), implanter); - - _adminLogger.Add(LogType.Action, LogImpact.Medium, - $"{ToPrettyString(args.User):player} used {ToPrettyString(implanter):implanter} to give {ToPrettyString(target):target} the following languages:" - + $"\nSpoken: {string.Join(", ", component.SpokenLanguages)}; Understood: {string.Join(", ", component.UnderstoodLanguages)}"); - - OnAppearanceChange(implanter, component); - RaiseLocalEvent(target, new LanguagesUpdateEvent(), true); - } -} diff --git a/Content.Server/Language/TranslatorSystem.cs b/Content.Server/Language/TranslatorSystem.cs index 3b7704b9a71..5022e540960 100644 --- a/Content.Server/Language/TranslatorSystem.cs +++ b/Content.Server/Language/TranslatorSystem.cs @@ -1,4 +1,5 @@ using System.Linq; +using Content.Server.Language.Events; using Content.Server.Popups; using Content.Server.PowerCell; using Content.Shared.Interaction; @@ -8,6 +9,7 @@ using Content.Shared.Language.Systems; using Content.Shared.PowerCell; using Content.Shared.Language.Components.Translators; +using Robust.Shared.Utility; namespace Content.Server.Language; @@ -23,7 +25,6 @@ public override void Initialize() { base.Initialize(); - // I wanna die. But my death won't help us discover polymorphism. SubscribeLocalEvent(OnDetermineLanguages); SubscribeLocalEvent(OnDetermineLanguages); SubscribeLocalEvent(OnDetermineLanguages); @@ -31,67 +32,36 @@ public override void Initialize() SubscribeLocalEvent(OnTranslatorToggle); SubscribeLocalEvent(OnPowerCellSlotEmpty); - // TODO: why does this use InteractHandEvent?? SubscribeLocalEvent(OnTranslatorInteract); SubscribeLocalEvent(OnTranslatorDropped); } - private void OnDetermineLanguages(EntityUid uid, IntrinsicTranslatorComponent component, - DetermineEntityLanguagesEvent ev) + private void OnDetermineLanguages(EntityUid uid, IntrinsicTranslatorComponent component, DetermineEntityLanguagesEvent ev) { - if (!component.Enabled) + if (!component.Enabled || !TryComp(uid, out var speaker)) return; if (!_powerCell.HasActivatableCharge(uid)) return; - var addUnderstood = true; - var addSpoken = true; - if (component.RequiredLanguages.Count > 0) - { - if (component.RequiresAllLanguages) - { - // Add langs when the wielder has all of the required languages - foreach (var language in component.RequiredLanguages) - { - if (!ev.SpokenLanguages.Contains(language, StringComparer.Ordinal)) - addSpoken = false; - - if (!ev.UnderstoodLanguages.Contains(language, StringComparer.Ordinal)) - addUnderstood = false; - } - } - else - { - // Add langs when the wielder has at least one of the required languages - addUnderstood = false; - addSpoken = false; - foreach (var language in component.RequiredLanguages) - { - if (ev.SpokenLanguages.Contains(language, StringComparer.Ordinal)) - addSpoken = true; - - if (ev.UnderstoodLanguages.Contains(language, StringComparer.Ordinal)) - addUnderstood = true; - } - } - } + // The idea here is as follows: + // Required languages are languages that are required to operate the translator. + // The translator has a limited number of languages it can translate to and translate from. + // If the wielder understands the language of the translator, they will be able to understand translations provided by it + // If the wielder also speaks that language, they will be able to use it to translate their own speech by "speaking" in that language + var addSpoken = CheckLanguagesMatch(component.RequiredLanguages, speaker.SpokenLanguages, component.RequiresAllLanguages); + var addUnderstood = CheckLanguagesMatch(component.RequiredLanguages, speaker.UnderstoodLanguages, component.RequiresAllLanguages); if (addSpoken) - { foreach (var language in component.SpokenLanguages) - AddIfNotExists(ev.SpokenLanguages, language); - - if (component.DefaultLanguageOverride != null && ev.CurrentLanguage.Length == 0) - ev.CurrentLanguage = component.DefaultLanguageOverride; - } + ev.SpokenLanguages.Add(language); if (addUnderstood) foreach (var language in component.UnderstoodLanguages) - AddIfNotExists(ev.UnderstoodLanguages, language); + ev.UnderstoodLanguages.Add(language); } - private void OnTranslatorInteract( EntityUid translator, HandheldTranslatorComponent component, InteractHandEvent args) + private void OnTranslatorInteract(EntityUid translator, HandheldTranslatorComponent component, InteractHandEvent args) { var holder = args.User; if (!EntityManager.HasComponent(holder)) @@ -100,7 +70,7 @@ private void OnTranslatorInteract( EntityUid translator, HandheldTranslatorCompo var intrinsic = EnsureComp(holder); UpdateBoundIntrinsicComp(component, intrinsic, component.Enabled); - RaiseLocalEvent(holder, new LanguagesUpdateEvent(), true); + _language.UpdateEntityLanguages(holder); } private void OnTranslatorDropped(EntityUid translator, HandheldTranslatorComponent component, DroppedEvent args) @@ -115,59 +85,63 @@ private void OnTranslatorDropped(EntityUid translator, HandheldTranslatorCompone RemCompDeferred(holder, intrinsic); } - _language.EnsureValidLanguage(holder); - - RaiseLocalEvent(holder, new LanguagesUpdateEvent(), true); + _language.UpdateEntityLanguages(holder); } - private void OnTranslatorToggle(EntityUid translator, HandheldTranslatorComponent component, ActivateInWorldEvent args) + private void OnTranslatorToggle(EntityUid translator, HandheldTranslatorComponent translatorComp, ActivateInWorldEvent args) { - if (!component.ToggleOnInteract) + if (!translatorComp.ToggleOnInteract) return; + // This will show a popup if false var hasPower = _powerCell.HasDrawCharge(translator); if (Transform(args.Target).ParentUid is { Valid: true } holder - && EntityManager.HasComponent(holder)) + && TryComp(holder, out var languageComp)) { // This translator is held by a language speaker and thus has an intrinsic counterpart bound to it. // Make sure it's up-to-date. var intrinsic = EnsureComp(holder); - var isEnabled = !component.Enabled; - if (intrinsic.Issuer != component) + var isEnabled = !translatorComp.Enabled; + if (intrinsic.Issuer != translatorComp) { - // The intrinsic comp wasn't owned by this handheld component, so this comp wasn't the active translator. - // Thus it needs to be turned on regardless of its previous state. - intrinsic.Issuer = component; + // The intrinsic comp wasn't owned by this handheld translator, so this wasn't the active translator. + // Thus, the intrinsic comp needs to be turned on regardless of its previous state. + intrinsic.Issuer = translatorComp; isEnabled = true; } - isEnabled &= hasPower; - UpdateBoundIntrinsicComp(component, intrinsic, isEnabled); - component.Enabled = isEnabled; + + UpdateBoundIntrinsicComp(translatorComp, intrinsic, isEnabled); + translatorComp.Enabled = isEnabled; _powerCell.SetPowerCellDrawEnabled(translator, isEnabled); - _language.EnsureValidLanguage(holder); - RaiseLocalEvent(holder, new LanguagesUpdateEvent(), true); + // The first new spoken language added by this translator, or null + var firstNewLanguage = translatorComp.SpokenLanguages.FirstOrDefault(it => !languageComp.SpokenLanguages.Contains(it)); + + _language.UpdateEntityLanguages(holder, languageComp); + + // Update the current language of the entity if necessary + if (isEnabled && translatorComp.SetLanguageOnInteract && firstNewLanguage is {}) + _language.SetLanguage(holder, firstNewLanguage, languageComp); } else { // This is a standalone translator (e.g. lying on the ground), toggle its state. - component.Enabled = !component.Enabled && hasPower; - _powerCell.SetPowerCellDrawEnabled(translator, !component.Enabled && hasPower); + translatorComp.Enabled = !translatorComp.Enabled && hasPower; + _powerCell.SetPowerCellDrawEnabled(translator, !translatorComp.Enabled && hasPower); } - OnAppearanceChange(translator, component); + OnAppearanceChange(translator, translatorComp); - // HasPower shows a popup when there's no power, so we do not proceed in that case if (hasPower) { var message = Loc.GetString( - component.Enabled + translatorComp.Enabled ? "translator-component-turnon" : "translator-component-shutoff", - ("translator", component.Owner)); - _popup.PopupEntity(message, component.Owner, args.User); + ("translator", translatorComp.Owner)); + _popup.PopupEntity(message, translatorComp.Owner, args.User); } } @@ -178,7 +152,7 @@ private void OnPowerCellSlotEmpty(EntityUid translator, HandheldTranslatorCompon OnAppearanceChange(translator, component); if (Transform(translator).ParentUid is { Valid: true } holder - && EntityManager.HasComponent(holder)) + && TryComp(holder, out var languageComp)) { if (!EntityManager.TryGetComponent(holder, out var intrinsic)) return; @@ -186,11 +160,10 @@ private void OnPowerCellSlotEmpty(EntityUid translator, HandheldTranslatorCompon if (intrinsic.Issuer == component) { intrinsic.Enabled = false; - EntityManager.RemoveComponent(holder, intrinsic); + RemComp(holder, intrinsic); } - _language.EnsureValidLanguage(holder); - RaiseLocalEvent(holder, new LanguagesUpdateEvent(), true); + _language.UpdateEntityLanguages(holder, languageComp); } } @@ -201,25 +174,29 @@ private void UpdateBoundIntrinsicComp(HandheldTranslatorComponent comp, HoldsTra { if (isEnabled) { - intrinsic.SpokenLanguages = new List(comp.SpokenLanguages); - intrinsic.UnderstoodLanguages = new List(comp.UnderstoodLanguages); - intrinsic.DefaultLanguageOverride = comp.DefaultLanguageOverride; + intrinsic.SpokenLanguages = [..comp.SpokenLanguages]; + intrinsic.UnderstoodLanguages = [..comp.UnderstoodLanguages]; } else { intrinsic.SpokenLanguages.Clear(); intrinsic.UnderstoodLanguages.Clear(); - intrinsic.DefaultLanguageOverride = null; } intrinsic.Enabled = isEnabled; intrinsic.Issuer = comp; } - private static void AddIfNotExists(List list, string item) + /// + /// Checks whether any OR all required languages are provided. Used for utility purposes. + /// + public static bool CheckLanguagesMatch(ICollection required, ICollection provided, bool requireAll) { - if (list.Contains(item)) - return; - list.Add(item); + if (required.Count == 0) + return true; + + return requireAll + ? required.All(provided.Contains) + : required.Any(provided.Contains); } } diff --git a/Content.Server/Mind/Commands/MakeSentientCommand.cs b/Content.Server/Mind/Commands/MakeSentientCommand.cs index cacd499ab8d..b58d782d9c5 100644 --- a/Content.Server/Mind/Commands/MakeSentientCommand.cs +++ b/Content.Server/Mind/Commands/MakeSentientCommand.cs @@ -61,10 +61,11 @@ public static void MakeSentient(EntityUid uid, IEntityManager entityManager, boo var language = IoCManager.Resolve().GetEntitySystem(); var speaker = entityManager.EnsureComponent(uid); - // If the speaker knows any language (like monkey or robot), they keep those - // Otherwise, we give them the fallback + + // If the entity already speaks some language (like monkey or robot), we do nothing else + // Otherwise, we give them the fallback language if (speaker.SpokenLanguages.Count == 0) - language.AddLanguage(speaker, SharedLanguageSystem.FallbackLanguagePrototype); + language.AddLanguage(uid, SharedLanguageSystem.FallbackLanguagePrototype); } entityManager.EnsureComponent(uid); diff --git a/Content.Server/Radio/EntitySystems/HeadsetSystem.cs b/Content.Server/Radio/EntitySystems/HeadsetSystem.cs index 53517da6cb4..2500138a238 100644 --- a/Content.Server/Radio/EntitySystems/HeadsetSystem.cs +++ b/Content.Server/Radio/EntitySystems/HeadsetSystem.cs @@ -106,7 +106,7 @@ private void OnHeadsetReceive(EntityUid uid, HeadsetComponent component, ref Rad var parent = Transform(uid).ParentUid; if (TryComp(parent, out ActorComponent? actor)) { - var canUnderstand = _language.CanUnderstand(parent, args.Language); + var canUnderstand = _language.CanUnderstand(parent, args.Language.ID); var msg = new MsgChatMessage { Message = canUnderstand ? args.OriginalChatMsg : args.LanguageObfuscatedChatMsg diff --git a/Content.Server/Radio/EntitySystems/RadioSystem.cs b/Content.Server/Radio/EntitySystems/RadioSystem.cs index 60aa7c2f4fb..7ed7574a9ae 100644 --- a/Content.Server/Radio/EntitySystems/RadioSystem.cs +++ b/Content.Server/Radio/EntitySystems/RadioSystem.cs @@ -60,7 +60,7 @@ private void OnIntrinsicReceive(EntityUid uid, IntrinsicRadioReceiverComponent c // Einstein-Engines - languages mechanic var listener = component.Owner; var msg = args.OriginalChatMsg; - if (listener != null && !_language.CanUnderstand(listener, args.Language)) + if (listener != null && !_language.CanUnderstand(listener, args.Language.ID)) msg = args.LanguageObfuscatedChatMsg; _netMan.ServerSendMessage(new MsgChatMessage { Message = msg}, actor.PlayerSession.Channel); @@ -183,7 +183,7 @@ private string WrapRadioMessage(EntityUid source, RadioChannelPrototype channel, ("verb", Loc.GetString(_random.Pick(speech.SpeechVerbStrings))), ("channel", $"\\[{channel.LocalizedName}\\]"), ("name", name), - ("message", FormattedMessage.EscapeText(message))); + ("message", message)); } /// diff --git a/Content.Shared/Language/Components/LanguageKnowledgeComponent.cs b/Content.Shared/Language/Components/LanguageKnowledgeComponent.cs new file mode 100644 index 00000000000..0632f5d9cb2 --- /dev/null +++ b/Content.Shared/Language/Components/LanguageKnowledgeComponent.cs @@ -0,0 +1,22 @@ +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; + +namespace Content.Shared.Language.Components; + +/// +/// Stores data about entities' intrinsic language knowledge. +/// +[RegisterComponent] +public sealed partial class LanguageKnowledgeComponent : Component +{ + /// + /// List of languages this entity can speak without any external tools. + /// + [DataField("speaks", customTypeSerializer: typeof(PrototypeIdListSerializer), required: true)] + public List SpokenLanguages = new(); + + /// + /// List of languages this entity can understand without any external tools. + /// + [DataField("understands", customTypeSerializer: typeof(PrototypeIdListSerializer), required: true)] + public List UnderstoodLanguages = new(); +} diff --git a/Content.Shared/Language/Components/LanguageSpeakerComponent.cs b/Content.Shared/Language/Components/LanguageSpeakerComponent.cs index 95232ffe6ff..e8ebccb3ddf 100644 --- a/Content.Shared/Language/Components/LanguageSpeakerComponent.cs +++ b/Content.Shared/Language/Components/LanguageSpeakerComponent.cs @@ -1,29 +1,32 @@ -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; - namespace Content.Shared.Language; -[RegisterComponent, AutoGenerateComponentState] +// TODO: either move all language speaker-related components to server side, or make everything else shared. +// The current approach leads to confusion, as the server never informs the client of updates in these components. + +/// +/// Stores the current state of the languages the entity can speak and understand. +/// +/// +/// All fields of this component are populated during a DetermineEntityLanguagesEvent. +/// They are not to be modified externally. +/// +[RegisterComponent] public sealed partial class LanguageSpeakerComponent : Component { /// - /// The current language the entity may use to speak. + /// The current language the entity uses when speaking. /// Other listeners will hear the entity speak in this language. /// - [ViewVariables(VVAccess.ReadWrite)] - [AutoNetworkedField] - public string CurrentLanguage = default!; + [DataField] + public string CurrentLanguage = ""; // The language system will override it on init /// - /// List of languages this entity can speak. + /// List of languages this entity can speak at the current moment. /// - [ViewVariables] - [DataField("speaks", customTypeSerializer: typeof(PrototypeIdListSerializer), required: true)] - public List SpokenLanguages = new(); + public List SpokenLanguages = []; /// - /// List of languages this entity can understand. + /// List of languages this entity can understand at the current moment. /// - [ViewVariables] - [DataField("understands", customTypeSerializer: typeof(PrototypeIdListSerializer), required: true)] - public List UnderstoodLanguages = new(); + public List UnderstoodLanguages = []; } diff --git a/Content.Shared/Language/Components/TranslatorImplantComponent.cs b/Content.Shared/Language/Components/TranslatorImplantComponent.cs new file mode 100644 index 00000000000..cb8c666c82f --- /dev/null +++ b/Content.Shared/Language/Components/TranslatorImplantComponent.cs @@ -0,0 +1,21 @@ +using Content.Shared.Language.Components.Translators; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; + +namespace Content.Shared.Language.Components; + +/// +/// An implant that allows the implantee to speak and understand other languages. +/// +[RegisterComponent] +public sealed partial class TranslatorImplantComponent : BaseTranslatorComponent +{ + /// + /// Whether the implantee knows the languages necessary to speak using this implant. + /// + public bool SpokenRequirementSatisfied = false; + + /// + /// Whether the implantee knows the languages necessary to understand translations of this implant. + /// + public bool UnderstoodRequirementSatisfied = false; +} diff --git a/Content.Shared/Language/Components/TranslatorImplanterComponent.cs b/Content.Shared/Language/Components/TranslatorImplanterComponent.cs deleted file mode 100644 index 401e8a8b8aa..00000000000 --- a/Content.Shared/Language/Components/TranslatorImplanterComponent.cs +++ /dev/null @@ -1,35 +0,0 @@ -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; - -namespace Content.Shared.Language.Components; - -/// -/// An item that, when used on a mob, adds an intrinsic translator to it. -/// -[RegisterComponent] -public sealed partial class TranslatorImplanterComponent : Component -{ - [DataField("spoken", customTypeSerializer: typeof(PrototypeIdListSerializer))] - public List SpokenLanguages = new(); - - [DataField("understood", customTypeSerializer: typeof(PrototypeIdListSerializer))] - public List UnderstoodLanguages = new(); - - /// - /// The list of languages the mob must understand in order for this translator to have effect. - /// Knowing one language is enough. - /// - [DataField("requires", customTypeSerializer: typeof(PrototypeIdListSerializer))] - public List RequiredLanguages = new(); - - /// - /// If true, only allows to use this implanter on mobs. - /// - [DataField] - public bool MobsOnly = true; - - /// - /// Whether this implant has been used already. - /// - [DataField] - public bool Used = false; -} diff --git a/Content.Shared/Language/Components/Translators/BaseTranslatorComponent.cs b/Content.Shared/Language/Components/Translators/BaseTranslatorComponent.cs index a66c9be082e..072480031d5 100644 --- a/Content.Shared/Language/Components/Translators/BaseTranslatorComponent.cs +++ b/Content.Shared/Language/Components/Translators/BaseTranslatorComponent.cs @@ -4,15 +4,6 @@ namespace Content.Shared.Language.Components.Translators; public abstract partial class BaseTranslatorComponent : Component { - // TODO may need to be removed completely, it's a part of legacy code that never ended up being used. - /// - /// The language this translator changes the speaker's language to when they don't specify one. - /// If null, does not modify the default language. - /// - [DataField("defaultLanguage")] - [ViewVariables(VVAccess.ReadWrite)] - public string? DefaultLanguageOverride = null; - /// /// The list of additional languages this translator allows the wielder to speak. /// diff --git a/Content.Shared/Language/Components/Translators/HandheldTranslatorComponent.cs b/Content.Shared/Language/Components/Translators/HandheldTranslatorComponent.cs index f900603f01d..7e3de0eca61 100644 --- a/Content.Shared/Language/Components/Translators/HandheldTranslatorComponent.cs +++ b/Content.Shared/Language/Components/Translators/HandheldTranslatorComponent.cs @@ -7,9 +7,18 @@ namespace Content.Shared.Language.Components.Translators; public sealed partial class HandheldTranslatorComponent : Translators.BaseTranslatorComponent { /// - /// Whether or not interacting with this translator - /// toggles it on or off. + /// Whether interacting with this translator toggles it on and off. /// - [DataField("toggleOnInteract")] + [DataField] public bool ToggleOnInteract = true; + + /// + /// If true, when this translator is turned on, the entities' current spoken language will be set + /// to the first new language added by this translator. + /// + /// + /// This should generally be used for translators that translate speech between two languages. + /// + [DataField] + public bool SetLanguageOnInteract = true; } diff --git a/Content.Shared/Language/LanguagePrototype.cs b/Content.Shared/Language/LanguagePrototype.cs index 801ab8a393b..9342c07e91f 100644 --- a/Content.Shared/Language/LanguagePrototype.cs +++ b/Content.Shared/Language/LanguagePrototype.cs @@ -1,4 +1,3 @@ -using System.Runtime.CompilerServices; using Robust.Shared.Prototypes; namespace Content.Shared.Language; @@ -10,18 +9,10 @@ public sealed class LanguagePrototype : IPrototype public string ID { get; private set; } = default!; /// - /// If true, obfuscated phrases of creatures speaking this language will have their syllables replaced with "replacement" syllables. - /// Otherwise entire sentences will be replaced. + /// Obfuscation method used by this language. By default, uses /// - [DataField(required: true)] - public bool ObfuscateSyllables; - - /// - /// Lists all syllables that are used to obfuscate a message a listener cannot understand if obfuscateSyllables is true. - /// Otherwise uses all possible phrases the creature can make when trying to say anything. - /// - [DataField(required: true)] - public List Replacement = []; + [DataField("obfuscation")] + public ObfuscationMethod Obfuscation = ObfuscationMethod.Default; #region utility /// diff --git a/Content.Shared/Language/ObfuscationMethods.cs b/Content.Shared/Language/ObfuscationMethods.cs new file mode 100644 index 00000000000..51230c47970 --- /dev/null +++ b/Content.Shared/Language/ObfuscationMethods.cs @@ -0,0 +1,184 @@ +using System.Text; +using Content.Shared.Language.Systems; + +namespace Content.Shared.Language; + +[ImplicitDataDefinitionForInheritors] +public abstract partial class ObfuscationMethod +{ + /// + /// The fallback obfuscation method, replaces the message with the string "<?>". + /// + public static readonly ObfuscationMethod Default = new ReplacementObfuscation + { + Replacement = new List { "" } + }; + + /// + /// Obfuscates the provided message and writes the result into the provided StringBuilder. + /// Implementations should use the context's pseudo-random number generator and provide stable obfuscations. + /// + internal abstract void Obfuscate(StringBuilder builder, string message, SharedLanguageSystem context); + + /// + /// Obfuscates the provided message. This method should only be used for debugging purposes. + /// For all other purposes, use instead. + /// + public string Obfuscate(string message) + { + var builder = new StringBuilder(); + Obfuscate(builder, message, IoCManager.Resolve().GetEntitySystem()); + return builder.ToString(); + } +} + +/// +/// The most primitive method of obfuscation - replaces the entire message with one random replacement phrase. +/// Similar to ReplacementAccent. Base for all replacement-based obfuscation methods. +/// +public partial class ReplacementObfuscation : ObfuscationMethod +{ + /// + /// A list of replacement phrases used in the obfuscation process. + /// + [DataField(required: true)] + public List Replacement = []; + + internal override void Obfuscate(StringBuilder builder, string message, SharedLanguageSystem context) + { + var idx = context.PseudoRandomNumber(message.GetHashCode(), 0, Replacement.Count - 1); + builder.Append(Replacement[idx]); + } +} + +/// +/// Obfuscates the provided message by replacing each word with a random number of syllables in the range (min, max), +/// preserving the original punctuation to a resonable extent. +/// +/// +/// The words are obfuscated in a stable manner, such that every particular word will be obfuscated the same way throughout one round. +/// This means that particular words can be memorized within a round, but not across rounds. +/// +public sealed partial class SyllableObfuscation : ReplacementObfuscation +{ + [DataField] + public int MinSyllables = 1; + + [DataField] + public int MaxSyllables = 4; + + internal override void Obfuscate(StringBuilder builder, string message, SharedLanguageSystem context) + { + const char eof = (char) 0; // Special character to mark the end of the message in the code below + + var wordBeginIndex = 0; + var hashCode = 0; + + for (var i = 0; i <= message.Length; i++) + { + var ch = i < message.Length ? char.ToLower(message[i]) : eof; + var isWordEnd = char.IsWhiteSpace(ch) || IsPunctuation(ch) || ch == eof; + + // If this is a normal char, add it to the hash sum + if (!isWordEnd) + hashCode = hashCode * 31 + ch; + + // If a word ends before this character, construct a new word and append it to the new message. + if (isWordEnd) + { + var wordLength = i - wordBeginIndex; + if (wordLength > 0) + { + var newWordLength = context.PseudoRandomNumber(hashCode, MinSyllables, MaxSyllables); + + for (var j = 0; j < newWordLength; j++) + { + var index = context.PseudoRandomNumber(hashCode + j, 0, Replacement.Count - 1); + builder.Append(Replacement[index]); + } + } + + hashCode = 0; + wordBeginIndex = i + 1; + } + + // If this message concludes a word (i.e. is a whitespace or a punctuation mark), append it to the message + if (isWordEnd && ch != eof) + builder.Append(ch); + } + } + + private static bool IsPunctuation(char ch) + { + return ch is '.' or '!' or '?' or ',' or ':'; + } +} + +/// +/// Obfuscates each sentence in the message by concatenating a number of obfuscation phrases. +/// The number of phrases in the obfuscated message is proportional to the length of the original message. +/// +public sealed partial class PhraseObfuscation : ReplacementObfuscation +{ + [DataField] + public int MinPhrases = 1; + + [DataField] + public int MaxPhrases = 4; + + /// + /// A string used to separate individual phrases within one sentence. Default is a space. + /// + [DataField] + public string Separator = " "; + + /// + /// A power to which the number of characters in the original message is raised to determine the number of phrases in the result. + /// Default is 1/3, i.e. the cubic root of the original number. + /// + /// + /// Using the default proportion, you will need at least 27 characters for 2 phrases, at least 64 for 3, at least 125 for 4, etc. + /// Increasing the proportion to 1/4 will result in the numbers changing to 81, 256, 625, etc. + /// + [DataField] + public float Proportion = 1f / 3; + + internal override void Obfuscate(StringBuilder builder, string message, SharedLanguageSystem context) + { + var sentenceBeginIndex = 0; + var hashCode = 0; + + for (var i = 0; i < message.Length; i++) + { + var ch = char.ToLower(message[i]); + if (!IsPunctuation(ch) && i != message.Length - 1) + { + hashCode = hashCode * 31 + ch; + continue; + } + + var length = i - sentenceBeginIndex; + if (length > 0) + { + var newLength = (int) Math.Clamp(Math.Pow(length, Proportion) - 1, MinPhrases, MaxPhrases); + + for (var j = 0; j < newLength; j++) + { + var phraseIdx = context.PseudoRandomNumber(hashCode + j, 0, Replacement.Count - 1); + var phrase = Replacement[phraseIdx]; + builder.Append(phrase); + builder.Append(Separator); + } + } + sentenceBeginIndex = i + 1; + + if (IsPunctuation(ch)) + builder.Append(ch).Append(' '); // TODO: this will turn '...' into '. . . ' + } + } + + private static bool IsPunctuation(char ch) + { + return ch is '.' or '!' or '?'; // Doesn't include mid-sentence punctuation like the comma + } +} diff --git a/Content.Shared/Language/Systems/SharedLanguageSystem.cs b/Content.Shared/Language/Systems/SharedLanguageSystem.cs index e2eeb8bb493..0a03086ebe1 100644 --- a/Content.Shared/Language/Systems/SharedLanguageSystem.cs +++ b/Content.Shared/Language/Systems/SharedLanguageSystem.cs @@ -1,6 +1,6 @@ -using Content.Shared.Actions; +using System.Text; +using Content.Shared.GameTicking; using Robust.Shared.Prototypes; -using Robust.Shared.Random; namespace Content.Shared.Language.Systems; @@ -24,7 +24,7 @@ public abstract class SharedLanguageSystem : EntitySystem public static LanguagePrototype Universal { get; private set; } = default!; [Dependency] protected readonly IPrototypeManager _prototype = default!; - [Dependency] protected readonly IRobustRandom _random = default!; + [Dependency] protected readonly SharedGameTicker _ticker = default!; public override void Initialize() { @@ -36,4 +36,32 @@ public override void Initialize() _prototype.TryIndex(id, out var proto); return proto; } + + /// + /// Obfuscate a message using the given language. + /// + public string ObfuscateSpeech(string message, LanguagePrototype language) + { + var builder = new StringBuilder(); + var method = language.Obfuscation; + method.Obfuscate(builder, message, this); + + return builder.ToString(); + } + + /// + /// Generates a stable pseudo-random number in the range (min, max) (inclusively) for the given seed. + /// One seed always corresponds to one number, however the resulting number also depends on the current round number. + /// This method is meant to be used in to provide stable obfuscation. + /// + internal int PseudoRandomNumber(int seed, int min, int max) + { + // Using RobustRandom or System.Random here is a bad idea because this method can get called hundreds of times per message. + // Each call would require us to allocate a new instance of random, which would lead to lots of unnecessary calculations. + // Instead, we use a simple but effective algorithm derived from the C language. + // It does not produce a truly random number, but for the purpose of obfuscating messages in an RP-based game it's more than alright. + seed = seed ^ (_ticker.RoundId * 127); + var random = seed * 1103515245 + 12345; + return min + Math.Abs(random) % (max - min + 1); + } } diff --git a/Content.Shared/Language/Systems/SharedTranslatorImplanterSystem.cs b/Content.Shared/Language/Systems/SharedTranslatorImplanterSystem.cs deleted file mode 100644 index a13225378cd..00000000000 --- a/Content.Shared/Language/Systems/SharedTranslatorImplanterSystem.cs +++ /dev/null @@ -1,36 +0,0 @@ -using Content.Shared.Examine; -using Content.Shared.Implants.Components; -using Content.Shared.Language.Components; -using Robust.Shared.Serialization; - -namespace Content.Shared.Language.Systems; - -public abstract class SharedTranslatorImplanterSystem : EntitySystem -{ - [Dependency] private readonly SharedAppearanceSystem _appearance = default!; - - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(OnExamined); - } - - private void OnExamined(EntityUid uid, TranslatorImplanterComponent component, ExaminedEvent args) - { - if (!args.IsInDetailsRange) - return; - - var text = !component.Used - ? Loc.GetString("translator-implanter-ready") - : Loc.GetString("translator-implanter-used"); - - args.PushText(text); - } - - protected void OnAppearanceChange(EntityUid implanter, TranslatorImplanterComponent component) - { - var used = component.Used; - _appearance.SetData(implanter, ImplanterVisuals.Full, !used); - } -} diff --git a/Resources/Locale/en-US/language/commands.ftl b/Resources/Locale/en-US/language/commands.ftl index 32fa5415b8c..ba2b3160094 100644 --- a/Resources/Locale/en-US/language/commands.ftl +++ b/Resources/Locale/en-US/language/commands.ftl @@ -1,8 +1,16 @@ command-list-langs-desc = List languages your current entity can speak at the current moment. command-list-langs-help = Usage: {$command} -command-saylang-desc = Send a message in a specific language. -command-saylang-help = Usage: {$command} . Example: {$command} GalacticCommon "Hello World!" +command-saylang-desc = Send a message in a specific language. To choose a language, you can use either the name of the language, or its position in the list of languages. +command-saylang-help = Usage: {$command} . Example: {$command} GalacticCommon "Hello World!". Example: {$command} 1 "Hello World!" -command-language-select-desc = Select the currently spoken language of your entity. -command-language-select-help = Usage: {$command} . Example: {$command} GalacticCommon +command-language-select-desc = Select the currently spoken language of your entity. You can use either the name of the language, or its position in the list of languages. +command-language-select-help = Usage: {$command} . Example: {$command} 1. Example: {$command} GalacticCommon + +command-language-spoken = Spoken: +command-language-understood = Understood: +command-language-current-entry = {$id}. {$language} - {$name} (current) +command-language-entry = {$id}. {$language} - {$name} + +command-language-invalid-number = The language number must be between 0 and {$total}. Alternatively, use the language name. +command-language-invalid-language = The language {$id} does not exist or you cannot speak it. diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/animals.yml index e932974a0f4..dd59d74d3f0 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/animals.yml @@ -66,7 +66,7 @@ - type: Tag tags: - VimPilot - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - Fox understands: @@ -179,7 +179,7 @@ tags: - DoorBumpOpener - VimPilot - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - Dog understands: diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/familiars.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/familiars.yml index fa51b99325c..2dad0fe2e65 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/familiars.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/familiars.yml @@ -95,7 +95,7 @@ factions: - PsionicInterloper - NanoTrasen - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - GalacticCommon understands: diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/nukiemouse.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/nukiemouse.yml index c2ae33ec0ba..8968f0e77ad 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/nukiemouse.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/nukiemouse.yml @@ -96,7 +96,7 @@ spawned: - id: FoodMeat amount: 1 - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - Mouse understands: diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/harpy.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/harpy.yml index e51ae91d12c..9b851ffa522 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/harpy.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/harpy.yml @@ -133,7 +133,7 @@ - FootstepSound - DoorBumpOpener - ShoesRequiredStepTriggerImmune - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - GalacticCommon - SolCommon diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/vulpkanin.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/vulpkanin.yml index 52853d696a2..9e4f80bfb52 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/vulpkanin.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/vulpkanin.yml @@ -97,7 +97,7 @@ Female: FemaleVulpkanin Unsexed: MaleVulpkanin - type: DogVision - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - GalacticCommon - Canilunzt diff --git a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml index 0645e451af2..196abcfab76 100644 --- a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml +++ b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml @@ -213,7 +213,7 @@ visMask: - PsionicInvisibility - Normal - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - GalacticCommon - RobotTalk diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index 7fe105f940c..ec917607abc 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -49,7 +49,7 @@ flavorKind: station-event-random-sentience-flavor-organic - type: Bloodstream bloodMaxVolume: 50 - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - Mouse understands: @@ -243,7 +243,7 @@ - type: EggLayer eggSpawn: - id: FoodEgg - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - Chicken understands: @@ -522,7 +522,7 @@ prob: 0.5 - type: Extractable grindableSolutionName: food - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - Moffic understands: @@ -624,7 +624,7 @@ - type: EggLayer eggSpawn: - id: FoodEgg - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - Duck understands: @@ -879,7 +879,7 @@ interactSuccessSpawn: EffectHearts interactSuccessSound: path: /Audio/Voice/Arachnid/arachnid_chitter.ogg - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - Crab understands: @@ -1127,7 +1127,7 @@ - type: Inventory speciesId: kangaroo templateId: kangaroo - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - Kangaroo understands: @@ -1321,7 +1321,7 @@ - type: Speech speechSounds: Monkey speechVerb: Monkey - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - Monkey understands: @@ -1360,7 +1360,7 @@ - type: Speech speechSounds: Monkey speechVerb: Monkey - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - Monkey understands: @@ -1405,7 +1405,7 @@ - type: NameIdentifier group: Kobold - type: LizardAccent - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - Kobold understands: @@ -1640,7 +1640,7 @@ spawned: - id: FoodMeatRat amount: 1 - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - Mouse understands: @@ -1989,7 +1989,7 @@ path: /Audio/Animals/parrot_raught.ogg - type: Bloodstream bloodMaxVolume: 50 - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - GalacticCommon understands: @@ -2255,7 +2255,7 @@ - type: MeleeChemicalInjector transferAmount: 0.75 solution: melee - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - Xeno understands: @@ -2594,7 +2594,7 @@ - type: Tag tags: - VimPilot - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - Fox understands: @@ -2646,7 +2646,7 @@ spawned: - id: FoodMeat amount: 2 - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - Dog understands: @@ -2804,7 +2804,7 @@ spawned: - id: FoodMeat amount: 3 - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - Cat understands: @@ -2876,7 +2876,7 @@ - type: NpcFactionMember factions: - Syndicate - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - Xeno understands: @@ -3185,7 +3185,7 @@ spawned: - id: FoodMeat amount: 1 - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - Mouse understands: @@ -3298,7 +3298,7 @@ interactSuccessSpawn: EffectHearts interactSuccessSound: path: /Audio/Animals/pig_oink.ogg - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - Pig understands: @@ -3389,7 +3389,7 @@ reformTime: 10 popupText: diona-reform-attempt reformPrototype: MobDionaReformed - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - RootSpeak understands: diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/argocyte.yml b/Resources/Prototypes/Entities/Mobs/NPCs/argocyte.yml index 3bcf8e7a16f..f8d0497b971 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/argocyte.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/argocyte.yml @@ -15,7 +15,7 @@ - type: Sprite sprite: Mobs/Aliens/Argocyte/argocyte_common.rsi - type: SolutionContainerManager - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - Xeno understands: diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml b/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml index 5141811a8ea..6eb43fb89ae 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml @@ -36,7 +36,7 @@ - VimPilot - type: StealTarget stealGroup: AnimalIan - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - Dog understands: @@ -127,7 +127,7 @@ tags: - CannotSuicide - VimPilot - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - Cat understands: @@ -151,7 +151,7 @@ tags: - CannotSuicide - VimPilot - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - Cat understands: @@ -306,7 +306,7 @@ spawned: - id: FoodMeat amount: 2 - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - Dog understands: @@ -411,7 +411,7 @@ spawned: - id: FoodMeat amount: 3 - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - Dog understands: @@ -576,7 +576,7 @@ - VimPilot - type: StealTarget stealGroup: AnimalRenault - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - Fox understands: @@ -629,7 +629,7 @@ - CannotSuicide - Hamster - VimPilot - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - Mouse understands: @@ -807,7 +807,7 @@ attributes: proper: true gender: female - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - Bubblish understands: @@ -847,7 +847,7 @@ attributes: proper: true gender: male - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - Monkey understands: @@ -881,7 +881,7 @@ # - type: AlwaysRevolutionaryConvertible - type: StealTarget stealGroup: AnimalTropico - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - Crab understands: diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml b/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml index 31a32333f3f..42da84323f6 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml @@ -119,7 +119,7 @@ attributes: gender: male - type: PotentialPsionic # Nyano - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - GalacticCommon - Mouse @@ -298,7 +298,7 @@ - type: Food - type: Item size: Tiny # Delta V - Make them eatable and pickable. - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - Mouse understands: diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/shadows.yml b/Resources/Prototypes/Entities/Mobs/NPCs/shadows.yml index 9559ae3a0c0..08cb776c530 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/shadows.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/shadows.yml @@ -50,7 +50,7 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: cat - type: Physics - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - Cat understands: diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml b/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml index e3166c15f6e..f9cf0db5f6f 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml @@ -107,7 +107,7 @@ - type: TypingIndicator proto: robot - type: ZombieImmune - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - GalacticCommon - RobotTalk diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml b/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml index f18b371c4c2..c4d88e80705 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml @@ -112,7 +112,7 @@ successChance: 0.5 interactSuccessString: petting-success-slimes interactFailureString: petting-failure-generic - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - Bubblish understands: diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/space.yml b/Resources/Prototypes/Entities/Mobs/NPCs/space.yml index 9b79d67f408..adf3af93eab 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/space.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/space.yml @@ -165,7 +165,7 @@ - type: FootstepModifier footstepSoundCollection: collection: FootstepBounce - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - Kangaroo understands: @@ -251,7 +251,7 @@ - type: MeleeChemicalInjector solution: melee transferAmount: 4 - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - Xeno understands: @@ -357,7 +357,7 @@ - type: MeleeChemicalInjector solution: melee transferAmount: 6 - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - Xeno understands: diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml b/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml index 26553a2f1f2..397989643e6 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml @@ -125,7 +125,7 @@ chance: -2 - type: Psionic #Nyano - Summary: makes psionic by default. removable: false - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - Xeno understands: @@ -239,7 +239,7 @@ - type: Tag tags: - CannotSuicide - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - GalacticCommon - Xeno diff --git a/Resources/Prototypes/Entities/Mobs/Species/base.yml b/Resources/Prototypes/Entities/Mobs/Species/base.yml index 67212d416fe..da9858105b4 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/base.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/base.yml @@ -219,7 +219,7 @@ price: 1500 # Kidnapping a living person and selling them for cred is a good move. deathPenalty: 0.01 # However they really ought to be living and intact, otherwise they're worth 100x less. - type: CanEscapeInventory # Carrying system from nyanotrasen. - - type: LanguageSpeaker # This is here so all with no LanguageSpeaker at least spawn with the default languages. + - type: LanguageKnowledge # This is here so even if species doesn't have a defined language, they at least speak GC speaks: - GalacticCommon understands: diff --git a/Resources/Prototypes/Entities/Mobs/Species/diona.yml b/Resources/Prototypes/Entities/Mobs/Species/diona.yml index 5cb3de6f168..de9928f0d67 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/diona.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/diona.yml @@ -102,7 +102,7 @@ actionPrototype: DionaGibAction allowedStates: - Dead - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - GalacticCommon - RootSpeak diff --git a/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml b/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml index c5395360187..b38ea2634fd 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml @@ -51,7 +51,7 @@ accent: dwarf - type: Speech speechSounds: Bass - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - GalacticCommon - SolCommon diff --git a/Resources/Prototypes/Entities/Mobs/Species/human.yml b/Resources/Prototypes/Entities/Mobs/Species/human.yml index 7c3f857c001..e00e06279e5 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/human.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/human.yml @@ -17,7 +17,7 @@ - id: FoodMeatHuman amount: 5 - type: PotentialPsionic #Nyano - Summary: makes potentially psionic. - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - GalacticCommon - SolCommon diff --git a/Resources/Prototypes/Entities/Mobs/Species/moth.yml b/Resources/Prototypes/Entities/Mobs/Species/moth.yml index 5959c497186..1c55dcf0df1 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/moth.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/moth.yml @@ -23,7 +23,7 @@ accent: zombieMoth - type: Speech speechVerb: Moth - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - GalacticCommon - Moffic diff --git a/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml b/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml index bdea4499ed1..35f9e9fa393 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml @@ -59,7 +59,7 @@ types: Heat : 1.5 #per second, scales with temperature & other constants - type: Wagging - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - GalacticCommon - Draconic diff --git a/Resources/Prototypes/Entities/Mobs/Species/slime.yml b/Resources/Prototypes/Entities/Mobs/Species/slime.yml index a601010ef94..6c3dc952957 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/slime.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/slime.yml @@ -74,7 +74,7 @@ types: Asphyxiation: -1.0 maxSaturation: 15 - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - GalacticCommon - Bubblish diff --git a/Resources/Prototypes/Entities/Mobs/base.yml b/Resources/Prototypes/Entities/Mobs/base.yml index d5be77eef1c..40cb0da95a1 100644 --- a/Resources/Prototypes/Entities/Mobs/base.yml +++ b/Resources/Prototypes/Entities/Mobs/base.yml @@ -43,6 +43,7 @@ - type: MovementSpeedModifier - type: Polymorphable - type: StatusIcon + - type: LanguageSpeaker # Einstein Engines. This component is required to support speech, although it does not define known languages. - type: RequireProjectileTarget active: False diff --git a/Resources/Prototypes/Entities/Objects/Devices/translator_implants.yml b/Resources/Prototypes/Entities/Objects/Devices/translator_implants.yml index fc947efe9a3..da42b2774b1 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/translator_implants.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/translator_implants.yml @@ -1,132 +1,128 @@ - type: entity - abstract: true - id: BaseTranslatorImplanter - parent: [ BaseItem ] - name: basic translator implant - description: Translates speech. + parent: BaseSubdermalImplant + id: BasicGalacticCommonTranslatorImplant + name: basic common translator implant + description: Provides your illiterate friends the ability to understand the common galactic tongue. + noSpawn: true components: - - type: Sprite - sprite: Objects/Specific/Medical/implanter.rsi - state: implanter0 - layers: - - state: implanter1 - map: [ "implantFull" ] - visible: true - - state: implanter0 - map: [ "implantBroken" ] - - type: Appearance - - type: GenericVisualizer - visuals: - enum.ImplanterVisuals.Full: - implantFull: - True: {visible: true} - False: {visible: false} - implantBroken: - True: {visible: false} - False: {visible: true} - -- type: entity - id: BasicGalaticCommonTranslatorImplanter - parent: [ BaseTranslatorImplanter ] - name: basic Galactic Common translator implant - description: An implant giving the ability to understand Galactic Common. - components: - - type: TranslatorImplanter + - type: TranslatorImplant understood: - GalacticCommon - type: entity - id: AdvancedGalaticCommonTranslatorImplanter - parent: [ BaseTranslatorImplanter ] - name: advanced Galactic Common translator implant - description: An implant giving the ability to understand and speak Galactic Common. + parent: BaseSubdermalImplant + id: GalacticCommonTranslatorImplant + name: advanced common translator implant + description: A more advanced version of the translator implant, teaches your illiterate friends the ability to both speak and understand the galactic tongue! + noSpawn: true components: - - type: TranslatorImplanter - spoken: - - GalacticCommon + - type: TranslatorImplant understood: - GalacticCommon + spoken: + - GalacticCommon - type: entity - id: BubblishTranslatorImplanter - parent: [ BaseTranslatorImplanter ] - name: Bubblish translator implant - description: An implant giving the ability to understand and speak Bubblish. + parent: BaseSubdermalImplant + id: BubblishTranslatorImplant + name: bubblish translator implant + description: An implant that helps you speak and understand the language of slimes! Special vocal chords not included. + noSpawn: true components: - - type: TranslatorImplanter - spoken: - - Bubblish + - type: TranslatorImplant understood: - Bubblish + spoken: + - Bubblish + requires: + - GalacticCommon - type: entity - id: NekomimeticTranslatorImplanter - parent: [ BaseTranslatorImplanter ] - name: Nekomimetic translator implant - description: An implant giving the ability to understand and speak Nekomimetic. Nya~! + parent: BaseSubdermalImplant + id: NekomimeticTranslatorImplant + name: nekomimetic translator implant + description: A translator implant intially designed to help domestic cat owners understand their pets, now granting the ability to understand and speak to Felinids! + noSpawn: true components: - - type: TranslatorImplanter - spoken: - - Nekomimetic + - type: TranslatorImplant understood: - Nekomimetic + spoken: + - Nekomimetic + requires: + - GalacticCommon - type: entity - id: DraconicTranslatorImplanter - parent: [ BaseTranslatorImplanter ] - name: Draconic translator implant - description: An implant giving the ability to understand and speak Draconic. + parent: BaseSubdermalImplant + id: DraconicTranslatorImplant + name: draconic translator implant + description: A translator implant giving the ability to speak to dragons! Subsequently, also allows to communicate with the Unathi. + noSpawn: true components: - - type: TranslatorImplanter - spoken: - - Draconic + - type: TranslatorImplant understood: - Draconic + spoken: + - Draconic + requires: + - GalacticCommon - type: entity - id: CanilunztTranslatorImplanter - parent: [ BaseTranslatorImplanter ] - name: Canilunzt translator implant - description: An implant giving the ability to understand and speak Canilunzt. Yeeps! + parent: BaseSubdermalImplant + id: CanilunztTranslatorImplant + name: canilunzt translator implant + description: A translator implant that helps you communicate with your local yeepers. Yeep! + noSpawn: true components: - - type: TranslatorImplanter - spoken: - - Canilunzt + - type: TranslatorImplant understood: - Canilunzt + spoken: + - Canilunzt + requires: + - GalacticCommon - type: entity - id: SolCommonTranslatorImplanter - parent: [ BaseTranslatorImplanter ] - name: SolCommon translator implant + parent: BaseSubdermalImplant + id: SolCommonTranslatorImplant + name: sol-common translator implant description: An implant giving the ability to understand and speak SolCommon. Raaagh! + noSpawn: true components: - - type: TranslatorImplanter - spoken: - - SolCommon + - type: TranslatorImplant understood: - SolCommon + spoken: + - SolCommon + requires: + - GalacticCommon - type: entity - id: RootSpeakTranslatorImplanter - parent: [ BaseTranslatorImplanter ] - name: RootSpeak translator implant - description: An implant giving the ability to understand and speak RootSpeak. + parent: BaseSubdermalImplant + id: RootSpeakTranslatorImplant + name: root-speak translator implant + description: An implant that lets you speak for the trees. Or to the trees. + noSpawn: true components: - - type: TranslatorImplanter - spoken: - - RootSpeak + - type: TranslatorImplant understood: - RootSpeak + spoken: + - RootSpeak + requires: + - GalacticCommon - type: entity - id: MofficTranslatorImplanter - parent: [ BaseTranslatorImplanter ] + parent: BaseSubdermalImplant + id: MofficTranslatorImplant name: Moffic translator implant - description: An implant giving the ability to understand and speak Moffic. + description: An implant designed to help domesticate mothroaches. Subsequently, allows you to communicate with the moth people. + noSpawn: true components: - - type: TranslatorImplanter - spoken: - - Moffic + - type: TranslatorImplant understood: - Moffic + spoken: + - Moffic + requires: + - GalacticCommon diff --git a/Resources/Prototypes/Entities/Objects/Devices/translators.yml b/Resources/Prototypes/Entities/Objects/Devices/translators.yml index e5ad824c5d9..664626ea4b4 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/translators.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/translators.yml @@ -1,7 +1,7 @@ - type: entity abstract: true id: TranslatorUnpowered - parent: [ BaseItem ] + parent: BaseItem name: translator description: Translates speech. components: @@ -36,7 +36,7 @@ - type: entity abstract: true id: TranslatorEmpty - parent: [ Translator ] + parent: Translator suffix: Empty components: - type: ItemSlots @@ -49,7 +49,7 @@ id: CanilunztTranslator parent: [ TranslatorEmpty ] name: Canilunzt translator - description: Translates speech between Canilunzt and Galactic Common. + description: Translates speech between Canilunzt and Galactic Common, allowing your local yeepers to communicate with the locals and vice versa! components: - type: HandheldTranslator spoken: @@ -66,7 +66,7 @@ id: BubblishTranslator parent: [ TranslatorEmpty ] name: Bubblish translator - description: Translates speech between Bubblish and Galactic Common. + description: Translates speech between Bubblish and Galactic Common, helping communicate with slimes and slime people. components: - type: HandheldTranslator spoken: @@ -83,7 +83,7 @@ id: NekomimeticTranslator parent: [ TranslatorEmpty ] name: Nekomimetic translator - description: Translates speech between Nekomimetic and Galactic Common. Why would you want that? + description: Translates speech between Nekomimetic and Galactic Common, enabling you to communicate with your pet cats. components: - type: HandheldTranslator spoken: @@ -100,7 +100,7 @@ id: DraconicTranslator parent: [ TranslatorEmpty ] name: Draconic translator - description: Translates speech between Draconic and Galactic Common. + description: Translates speech between Draconic and Galactic Common, making it easier to understand your local Uniathi. components: - type: HandheldTranslator spoken: @@ -134,7 +134,7 @@ id: RootSpeakTranslator parent: [ TranslatorEmpty ] name: RootSpeak translator - description: Translates speech between RootSpeak and Galactic Common. Like a true plant? + description: Translates speech between RootSpeak and Galactic Common. You may now speak for the trees. components: - type: HandheldTranslator spoken: @@ -151,7 +151,7 @@ id: MofficTranslator parent: [ TranslatorEmpty ] name: Moffic translator - description: Translates speech between Moffic and Galactic Common. Like a true moth... or bug? + description: Translates speech between Moffic and Galactic Common, helping you understand the buzzes of your pet mothroach! components: - type: HandheldTranslator spoken: @@ -168,7 +168,7 @@ id: XenoTranslator parent: [ TranslatorEmpty ] name: Xeno translator - description: Translates speech between Xeno and Galactic Common. Not sure if that will help. + description: Translates speech between Xeno and Galactic Common. This will probably not help you survive an encounter, though. components: - type: HandheldTranslator spoken: @@ -184,7 +184,7 @@ id: AnimalTranslator parent: [ TranslatorEmpty ] name: Animal translator - description: Translates all the cutes noises that animals make into a more understandable form! + description: Translates all the cutes noises that most animals make into a more understandable form! components: - type: HandheldTranslator understood: @@ -203,3 +203,4 @@ - Kobold requires: - GalacticCommon + setLanguageOnInteract: false diff --git a/Resources/Prototypes/Entities/Objects/Misc/translator_implanters.yml b/Resources/Prototypes/Entities/Objects/Misc/translator_implanters.yml new file mode 100644 index 00000000000..8b5b262ff8a --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Misc/translator_implanters.yml @@ -0,0 +1,77 @@ +- type: entity + id: BaseTranslatorImplanter + abstract: true + parent: BaseImplantOnlyImplanter + name: basic translator implanter + +- type: entity + id: BasicGalaticCommonTranslatorImplanter + parent: BaseTranslatorImplanter + name: basic common translator implanter + components: + - type: Implanter + implant: BasicGalacticCommonTranslatorImplant + +- type: entity + id: AdvancedGalaticCommonTranslatorImplanter + parent: BaseTranslatorImplanter + name: advanced common translator implanter + components: + - type: Implanter + implant: GalacticCommonTranslatorImplant + +- type: entity + id: BubblishTranslatorImplanter + parent: BaseTranslatorImplanter + name: bubblish translator implant + components: + - type: Implanter + implant: BubblishTranslatorImplant + +- type: entity + id: NekomimeticTranslatorImplanter + parent: [ BaseTranslatorImplanter ] + name: nekomimetic translator implant + components: + - type: Implanter + implant: NekomimeticTranslatorImplant + +- type: entity + id: DraconicTranslatorImplanter + parent: [ BaseTranslatorImplanter ] + name: draconic translator implant + components: + - type: Implanter + implant: DraconicTranslatorImplant + +- type: entity + id: CanilunztTranslatorImplanter + parent: [ BaseTranslatorImplanter ] + name: canilunzt translator implant + components: + - type: Implanter + implant: CanilunztTranslatorImplant + +- type: entity + id: SolCommonTranslatorImplanter + parent: [ BaseTranslatorImplanter ] + name: sol-common translator implant + components: + - type: Implanter + implant: SolCommonTranslatorImplant + +- type: entity + id: RootSpeakTranslatorImplanter + parent: [ BaseTranslatorImplanter ] + name: root-speak translator implant + components: + - type: Implanter + implant: RootSpeakTranslatorImplant + +- type: entity + id: MofficTranslatorImplanter + parent: [ BaseTranslatorImplanter ] + name: moffic translator implant + components: + - type: Implanter + implant: MofficTranslatorImplant diff --git a/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml b/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml index 380f7e012d1..2c4fccb8b3e 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml @@ -104,7 +104,7 @@ price: 100 - type: Appearance - type: WiresVisuals - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - GalacticCommon - RobotTalk diff --git a/Resources/Prototypes/Language/languages.yml b/Resources/Prototypes/Language/languages.yml index 90bce1baed2..1a874612c2f 100644 --- a/Resources/Prototypes/Language/languages.yml +++ b/Resources/Prototypes/Language/languages.yml @@ -1,493 +1,558 @@ # The universal language, assumed if the entity has a UniversalLanguageSpeakerComponent. -# Do not use otherwise. Try to use the respective component instead of this language. +# Do not use otherwise. Making an entity explicitly understand/speak this language will NOT have the desired effect. - type: language id: Universal - obfuscateSyllables: false - replacement: - - "*incomprehensible*" + obfuscation: + !type:ReplacementObfuscation + replacement: + - "*incomprehensible*" # Never actually used # The common galactic tongue. - type: language id: GalacticCommon - obfuscateSyllables: true - replacement: - - Blah - - Blah - - Blah - - dingle-doingle - - dingle - - dangle - - jibber-jabber - - jubber - - bleh - - zippity - - zoop - - wibble - - wobble - - wiggle - - yada - - meh - - neh - - nah - - wah + obfuscation: + !type:SyllableObfuscation + minSyllables: 1 + maxSyllables: 3 + replacement: + - blah + - blah + - blah + - dingle-doingle + - dingle + - dangle + - jibber-jabber + - jubber + - bleh + - zippity + - zoop + - wibble + - wobble + - wiggle + - yada + - meh + - neh + - nah + - wah # Spoken by slimes. - type: language id: Bubblish - obfuscateSyllables: true - replacement: - - blob - - plop - - pop - - bop - - boop + obfuscation: + !type:SyllableObfuscation + minSyllables: 1 + maxSyllables: 3 + replacement: + - blob + - plop + - pop + - bop + - boop # Spoken by moths. - type: language id: Moffic - obfuscateSyllables: true - replacement: - - år - - i - - går - - sek - - mo - - ff - - ok - - gj - - ø - - gå - - la - - le - - lit - - ygg - - van - - dår - - næ - - møt - - idd - - hvo - - ja - - på - - han - - så - - ån - - det - - att - - nå - - gö - - bra - - int - - tyc - - om - - när - - två - - må - - dag - - sjä - - vii - - vuo - - eil - - tun - - käyt - - teh - - vä - - hei - - huo - - suo - - ää - - ten - - ja - - heu - - stu - - uhr - - kön - - we - - hön + obfuscation: + !type:SyllableObfuscation + minSyllables: 2 # Replacements are really short + maxSyllables: 4 + replacement: + - år + - i + - går + - sek + - mo + - ff + - ok + - gj + - ø + - gå + - la + - le + - lit + - ygg + - van + - dår + - næ + - møt + - idd + - hvo + - ja + - på + - han + - så + - ån + - det + - att + - nå + - gö + - bra + - int + - tyc + - om + - när + - två + - må + - dag + - sjä + - vii + - vuo + - eil + - tun + - käyt + - teh + - vä + - hei + - huo + - suo + - ää + - ten + - ja + - heu + - stu + - uhr + - kön + - we + - hön - # Spoken by dionas. +# Spoken by dionas. - type: language id: RootSpeak - obfuscateSyllables: true - replacement: - - hs - - zt - - kr - - st - - sh + obfuscation: + !type:SyllableObfuscation + minSyllables: 1 + maxSyllables: 5 + replacement: + - hs + - zt + - kr + - st + - sh # A mess of broken Japanese, spoken by Felinds and Oni - type: language id: Nekomimetic - obfuscateSyllables: true - replacement: - - neko - - nyan - - mimi - - moe - - mofu - - fuwa - - kyaa - - kawaii - - poka - - munya - - puni - - munyu - - ufufu - - icha - - doki - - kyun - - kusu - - nya - - nyaa - - desu - - kis - - ama - - chuu - - baka - - hewo - - boop - - gato - - kit - - sune - - yori - - sou - - baka - - chan - - san - - kun - - mahou - - yatta - - suki - - usagi - - domo - - ori - - uwa - - zaazaa - - shiku - - puru - - ira - - heto - - etto + obfuscation: + !type:SyllableObfuscation + minSyllables: 1 + maxSyllables: 3 # May be too long even, we'll see. + replacement: + - neko + - nyan + - mimi + - moe + - mofu + - fuwa + - kyaa + - kawaii + - poka + - munya + - puni + - munyu + - ufufu + - icha + - doki + - kyun + - kusu + - nya + - nyaa + - desu + - kis + - ama + - chuu + - baka + - hewo + - boop + - gato + - kit + - sune + - yori + - sou + - baka + - chan + - san + - kun + - mahou + - yatta + - suki + - usagi + - domo + - ori + - uwa + - zaazaa + - shiku + - puru + - ira + - heto + - etto # Spoken by the Lizard race. - type: language id: Draconic - obfuscateSyllables: true - replacement: - - za - - az - - ze - - ez - - zi - - iz - - zo - - oz - - zu - - uz - - zs - - sz - - ha - - ah - - he - - eh - - hi - - ih - - ho - - oh - - hu - - uh - - hs - - sh - - la - - al - - le - - el - - li - - il - - lo - - ol - - lu - - ul - - ls - - sl - - ka - - ak - - ke - - ek - - ki - - ik - - ko - - ok - - ku - - uk - - ks - - sk - - sa - - as - - se - - es - - si - - is - - so - - os - - su - - us - - ss - - ss - - ra - - ar - - re - - er - - ri - - ir - - ro - - or - - ru - - ur - - rs - - sr - - a - - a - - e - - e - - i - - i - - o - - o - - u - - u - - s - - s + obfuscation: + !type:SyllableObfuscation + minSyllables: 2 + maxSyllables: 4 + replacement: + - za + - az + - ze + - ez + - zi + - iz + - zo + - oz + - zu + - uz + - zs + - sz + - ha + - ah + - he + - eh + - hi + - ih + - ho + - oh + - hu + - uh + - hs + - sh + - la + - al + - le + - el + - li + - il + - lo + - ol + - lu + - ul + - ls + - sl + - ka + - ak + - ke + - ek + - ki + - ik + - ko + - ok + - ku + - uk + - ks + - sk + - sa + - as + - se + - es + - si + - is + - so + - os + - su + - us + - ss + - ss + - ra + - ar + - re + - er + - ri + - ir + - ro + - or + - ru + - ur + - rs + - sr + - a + - a + - e + - e + - i + - i + - o + - o + - u + - u + - s + - s # Spoken by the Vulpkanin race. - type: language id: Canilunzt - obfuscateSyllables: true - replacement: - - rur - - ya - - cen - - rawr - - bar - - kuk - - tek - - qat - - uk - - wu - - vuh - - tah - - tch - - schz - - auch - - ist - - ein - - entch - - zwichs - - tut - - mir - - wo - - bis - - es - - vor - - nic - - gro - - lll - - enem - - zandt - - tzch - - noch - - hel - - ischt - - far - - wa - - baram - - iereng - - tech - - lach - - sam - - mak - - lich - - gen - - or - - ag - - eck - - gec - - stag - - onn - - bin - - ket - - jarl - - vulf - - einech - - cresthz - - azunein - - ghzth + obfuscation: + !type:SyllableObfuscation + minSyllables: 1 + maxSyllables: 4 + replacement: + - rur + - ya + - cen + - rawr + - bar + - kuk + - tek + - qat + - uk + - wu + - vuh + - tah + - tch + - schz + - auch + - ist + - ein + - entch + - zwichs + - tut + - mir + - wo + - bis + - es + - vor + - nic + - gro + # - lll + - enem + - zandt + - tzch + - noch + - hel + - ischt + - far + - wa + - baram + - iereng + - tech + - lach + - sam + - mak + - lich + - gen + - or + - ag + - eck + - gec + - stag + - onn + - bin + - ket + - jarl + - vulf + - einech + - cresthz + - azunein + - ghzth # The common language of the Sol system. - type: language id: SolCommon - obfuscateSyllables: true - replacement: - - tao - - shi - - tzu - - yi - - com - - be - - is - - i - - op - - vi - - ed - - lec - - mo - - cle - - te - - dis - - e + obfuscation: + !type:SyllableObfuscation + minSyllables: 1 + maxSyllables: 4 + replacement: + - tao + - shi + - tzu + - yi + - com + - be + - is + - i + - op + - vi + - ed + - lec + - mo + - cle + - te + - dis + - e - type: language id: RobotTalk - obfuscateSyllables: true - replacement: - - 0 - - 1 - - 01 - - 10 - - 001 - - 100 - - 011 - - 110 - - 101 - - 010 + obfuscation: + !type:SyllableObfuscation + minSyllables: 1 + maxSyllables: 10 # Crazy + replacement: + - 0 + - 1 # Languages spoken by various critters. - type: language id: Cat - obfuscateSyllables: true - replacement: - - murr - - meow - - purr - - mrow + obfuscation: + !type:SyllableObfuscation + minSyllables: 1 + maxSyllables: 2 + replacement: + - murr + - meow + - purr + - mrow - type: language id: Dog - obfuscateSyllables: true - replacement: - - woof - - bark - - ruff - - bork - - raff - - garr + obfuscation: + !type:SyllableObfuscation + minSyllables: 1 + maxSyllables: 2 + replacement: + - woof + - bark + - ruff + - bork + - raff + - garr - type: language id: Fox - obfuscateSyllables: true - replacement: - - bark - - gecker - - ruff - - raff - - garr + obfuscation: + !type:SyllableObfuscation + minSyllables: 1 + maxSyllables: 2 + replacement: + - ruff + - raff + - garr + - yip + - yap + - myah - type: language id: Xeno - obfuscateSyllables: true - replacement: - - sss - - sSs - - SSS + obfuscation: + !type:SyllableObfuscation + minSyllables: 1 + maxSyllables: 8 # I was crazy once + replacement: + - s + - S - type: language id: Monkey - obfuscateSyllables: true - replacement: - - ok - - ook - - oook - - ooook - - oooook + obfuscation: + !type:SyllableObfuscation + minSyllables: 1 + maxSyllables: 8 # They locked me in a room... + replacement: + - o + - k - type: language id: Mouse - obfuscateSyllables: true - replacement: - - Squeak - - Piep - - Chuu - - Eeee - - Pip - - Fwiep - - Heep + obfuscation: + !type:SyllableObfuscation + minSyllables: 2 + maxSyllables: 3 + replacement: + - squ + - eak + - pi + - ep + - chuu + - ee + - fwi + - he - type: language id: Chicken - obfuscateSyllables: true - replacement: - - Coo - - Coot - - Cooot + obfuscation: + !type:SyllableObfuscation + minSyllables: 1 + maxSyllables: 3 + replacement: + - co + - coo + - ot - type: language id: Duck - obfuscateSyllables: true - replacement: - - Quack - - Quack quack + obfuscation: + !type:SyllableObfuscation + minSyllables: 1 + maxSyllables: 3 + replacement: + - qu + - ack + - quack - type: language id: Cow - obfuscateSyllables: true - replacement: - - Moo - - Mooo + obfuscation: + !type:SyllableObfuscation + minSyllables: 1 + maxSyllables: 3 + replacement: + - moo + - mooo - type: language id: Sheep - obfuscateSyllables: true - replacement: - - Ba - - Baa - - Baaa + obfuscation: + !type:SyllableObfuscation + minSyllables: 1 + maxSyllables: 3 + replacement: + - ba + - baa + - aa - type: language id: Kangaroo - obfuscateSyllables: true - replacement: - - Shreak - - Chuu + obfuscation: + !type:SyllableObfuscation + minSyllables: 1 + maxSyllables: 3 + replacement: + - shre + - ack + - chuu + - choo - type: language id: Pig - obfuscateSyllables: true - replacement: - - Oink - - Oink oink + obfuscation: + !type:SyllableObfuscation + minSyllables: 1 + maxSyllables: 3 + replacement: + - oink # Please someone come up with something better - type: language id: Crab - obfuscateSyllables: true - replacement: - - Click - - Click-clack - - Clack - - Tipi-tap - - Clik-tap - - Cliliick + obfuscation: + !type:SyllableObfuscation + minSyllables: 1 + maxSyllables: 3 + replacement: + - click + - clack + - ti + - pi + - tap + - cli + - ick - type: language id: Kobold - obfuscateSyllables: true - replacement: - - Yip - - Grrar. - - Yap - - Bip - - Screet - - Gronk - - Hiss - - Eeee - - Yip + obfuscation: + !type:SyllableObfuscation + minSyllables: 2 + maxSyllables: 4 + replacement: + - yip + - yap + - gar + - grr + - ar + - scre + - et + - gronk + - hiss + - ss + - ee diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/Oni.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/Oni.yml index ab3f6f3d1c1..e93117b1aad 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/Oni.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/Oni.yml @@ -35,7 +35,7 @@ - MobLayer - type: Stamina critThreshold: 115 - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - GalacticCommon - Nekomimetic diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/felinid.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/felinid.yml index d23607b16d5..285c7340b21 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/felinid.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/felinid.yml @@ -65,7 +65,7 @@ Unsexed: MaleFelinid - type: Felinid - type: NoShoesSilentFootsteps - - type: LanguageSpeaker + - type: LanguageKnowledge speaks: - GalacticCommon - SolCommon From 726fd0f7aaeb1ee6ec21b536dbebe42dc2acb351 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Fri, 5 Jul 2024 23:50:34 +0000 Subject: [PATCH 135/155] Automatic Changelog Update (#459) --- Resources/Changelog/Changelog.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 68ccf158b46..af45d9f81af 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4351,3 +4351,13 @@ Entries: Have fun customizing your characters! id: 6144 time: '2024-07-05T22:53:36.0000000+00:00' +- author: Mnemotechnician + changes: + - type: Tweak + message: Translator implants are now proper implants that can be removed. + - type: Tweak + message: Animalistic languages should now look less messy. + - type: Fix + message: Hopefully fixed language menu desync and other issues. + id: 6145 + time: '2024-07-05T23:49:47.0000000+00:00' From c8a9002efc6ac89c280e95900f2ab70d5d9e89cb Mon Sep 17 00:00:00 2001 From: Spatison <137375981+Spatison@users.noreply.github.com> Date: Sat, 6 Jul 2024 03:19:35 +0300 Subject: [PATCH 136/155] Add Item Transfer System (#476) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Description This PR adds the ability to transfer objects from one player's hand to another player's hand, as in SS13. I have little coding experience, so my solutions may not be ideal. --- # TODO - [x] Make the code work - [x] Add popup - [x] Write a summary of the code - [x] Сorrect inaccuracies

Media

https://youtu.be/zTQWTsYm1gw

--- # Changelog :cl: - add: Added system - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --------- Co-authored-by: Danger Revolution! <142105406+DangerRevolution@users.noreply.github.com> --- Content.Client/Input/ContentContexts.cs | 1 + .../OfferItem/OfferItemIndicatorsOverlay.cs | 72 ++++++++ Content.Client/OfferItem/OfferItemSystem.cs | 51 ++++++ .../Options/UI/Tabs/KeyRebindTab.xaml.cs | 1 + Content.Client/Options/UI/Tabs/MiscTab.xaml | 1 + .../Options/UI/Tabs/MiscTab.xaml.cs | 5 + Content.Server/Alert/Click/AcceptingOffer.cs | 24 +++ Content.Server/OfferItem/OfferItemSystem.cs | 83 ++++++++++ Content.Shared/Alert/AlertType.cs | 3 +- Content.Shared/CCVar/CCVars.cs | 3 + Content.Shared/Input/ContentKeyFunctions.cs | 1 + .../OfferItem/OfferItemComponent.cs | 26 +++ .../SharedOfferItemSystem.Interactions.cs | 74 +++++++++ .../OfferItem/SharedOfferItemSystem.cs | 155 ++++++++++++++++++ Resources/Locale/en-US/alerts/alerts.ftl | 3 + .../en-US/escape-menu/ui/options-menu.ftl | 2 + .../en-US/interaction/offer-item-system.ftl | 13 ++ Resources/Prototypes/Alerts/alerts.yml | 10 ++ .../Prototypes/Entities/Mobs/Species/base.yml | 1 + .../Interface/Alerts/offer_item.rsi/meta.json | 14 ++ .../Alerts/offer_item.rsi/offer_item.png | Bin 0 -> 556 bytes .../Misc/give_item.rsi/give_item.png | Bin 0 -> 7276 bytes .../Interface/Misc/give_item.rsi/meta.json | 14 ++ Resources/keybinds.yml | 3 + 24 files changed, 559 insertions(+), 1 deletion(-) create mode 100644 Content.Client/OfferItem/OfferItemIndicatorsOverlay.cs create mode 100644 Content.Client/OfferItem/OfferItemSystem.cs create mode 100644 Content.Server/Alert/Click/AcceptingOffer.cs create mode 100644 Content.Server/OfferItem/OfferItemSystem.cs create mode 100644 Content.Shared/OfferItem/OfferItemComponent.cs create mode 100644 Content.Shared/OfferItem/SharedOfferItemSystem.Interactions.cs create mode 100644 Content.Shared/OfferItem/SharedOfferItemSystem.cs create mode 100644 Resources/Locale/en-US/interaction/offer-item-system.ftl create mode 100644 Resources/Textures/Interface/Alerts/offer_item.rsi/meta.json create mode 100644 Resources/Textures/Interface/Alerts/offer_item.rsi/offer_item.png create mode 100644 Resources/Textures/Interface/Misc/give_item.rsi/give_item.png create mode 100644 Resources/Textures/Interface/Misc/give_item.rsi/meta.json diff --git a/Content.Client/Input/ContentContexts.cs b/Content.Client/Input/ContentContexts.cs index fa631938100..ca22ab095d6 100644 --- a/Content.Client/Input/ContentContexts.cs +++ b/Content.Client/Input/ContentContexts.cs @@ -68,6 +68,7 @@ public static void SetupContexts(IInputContextContainer contexts) human.AddFunction(ContentKeyFunctions.SmartEquipBelt); human.AddFunction(ContentKeyFunctions.OpenBackpack); human.AddFunction(ContentKeyFunctions.OpenBelt); + human.AddFunction(ContentKeyFunctions.OfferItem); human.AddFunction(ContentKeyFunctions.MouseMiddle); human.AddFunction(ContentKeyFunctions.ArcadeUp); human.AddFunction(ContentKeyFunctions.ArcadeDown); diff --git a/Content.Client/OfferItem/OfferItemIndicatorsOverlay.cs b/Content.Client/OfferItem/OfferItemIndicatorsOverlay.cs new file mode 100644 index 00000000000..16a314a2cf4 --- /dev/null +++ b/Content.Client/OfferItem/OfferItemIndicatorsOverlay.cs @@ -0,0 +1,72 @@ +using System.Numerics; +using Robust.Client.GameObjects; +using Robust.Client.Graphics; +using Robust.Client.Input; +using Robust.Client.UserInterface; +using Robust.Shared.Enums; +using Robust.Shared.Utility; + +namespace Content.Client.OfferItem; + +public sealed class OfferItemIndicatorsOverlay : Overlay +{ + private readonly IInputManager _inputManager; + private readonly IEntityManager _entMan; + private readonly IEyeManager _eye; + private readonly OfferItemSystem _offer; + + private readonly Texture _sight; + + public override OverlaySpace Space => OverlaySpace.ScreenSpace; + + private readonly Color _mainColor = Color.White.WithAlpha(0.3f); + private readonly Color _strokeColor = Color.Black.WithAlpha(0.5f); + private readonly float _scale = 0.6f; // 1 is a little big + + public OfferItemIndicatorsOverlay(IInputManager input, IEntityManager entMan, + IEyeManager eye, OfferItemSystem offerSys) + { + _inputManager = input; + _entMan = entMan; + _eye = eye; + _offer = offerSys; + + var spriteSys = _entMan.EntitySysManager.GetEntitySystem(); + _sight = spriteSys.Frame0(new SpriteSpecifier.Rsi(new ResPath("/Textures/Interface/Misc/give_item.rsi"), + "give_item")); + } + + protected override bool BeforeDraw(in OverlayDrawArgs args) + { + if (!_offer.IsInOfferMode()) + return false; + + return base.BeforeDraw(in args); + } + + protected override void Draw(in OverlayDrawArgs args) + { + var mouseScreenPosition = _inputManager.MouseScreenPosition; + var mousePosMap = _eye.PixelToMap(mouseScreenPosition); + if (mousePosMap.MapId != args.MapId) + return; + + + var mousePos = mouseScreenPosition.Position; + var uiScale = (args.ViewportControl as Control)?.UIScale ?? 1f; + var limitedScale = uiScale > 1.25f ? 1.25f : uiScale; + + DrawSight(_sight, args.ScreenHandle, mousePos, limitedScale * _scale); + } + + private void DrawSight(Texture sight, DrawingHandleScreen screen, Vector2 centerPos, float scale) + { + var sightSize = sight.Size * scale; + var expandedSize = sightSize + new Vector2(7f, 7f); + + screen.DrawTextureRect(sight, + UIBox2.FromDimensions(centerPos - sightSize * 0.5f, sightSize), _strokeColor); + screen.DrawTextureRect(sight, + UIBox2.FromDimensions(centerPos - expandedSize * 0.5f, expandedSize), _mainColor); + } +} diff --git a/Content.Client/OfferItem/OfferItemSystem.cs b/Content.Client/OfferItem/OfferItemSystem.cs new file mode 100644 index 00000000000..51b8dcbc0bc --- /dev/null +++ b/Content.Client/OfferItem/OfferItemSystem.cs @@ -0,0 +1,51 @@ +using Content.Shared.CCVar; +using Content.Shared.OfferItem; +using Robust.Client.Graphics; +using Robust.Client.Input; +using Robust.Client.Player; +using Robust.Shared.Configuration; + +namespace Content.Client.OfferItem; + +public sealed class OfferItemSystem : SharedOfferItemSystem +{ + [Dependency] private readonly IOverlayManager _overlayManager = default!; + [Dependency] private readonly IPlayerManager _playerManager = default!; + [Dependency] private readonly IConfigurationManager _cfg = default!; + [Dependency] private readonly IInputManager _inputManager = default!; + [Dependency] private readonly IEyeManager _eye = default!; + + public override void Initialize() + { + Subs.CVar(_cfg, CCVars.OfferModeIndicatorsPointShow, OnShowOfferIndicatorsChanged, true); + } + public override void Shutdown() + { + _overlayManager.RemoveOverlay(); + + base.Shutdown(); + } + + public bool IsInOfferMode() + { + var entity = _playerManager.LocalEntity; + + if (entity == null) + return false; + + return IsInOfferMode(entity.Value); + } + private void OnShowOfferIndicatorsChanged(bool isShow) + { + if (isShow) + { + _overlayManager.AddOverlay(new OfferItemIndicatorsOverlay( + _inputManager, + EntityManager, + _eye, + this)); + } + else + _overlayManager.RemoveOverlay(); + } +} diff --git a/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs b/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs index 49e8099e0fb..9daca74dd3a 100644 --- a/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs +++ b/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs @@ -183,6 +183,7 @@ void AddCheckBox(string checkBoxName, bool currentState, Action +
public sealed partial class PulledPrecondition : HTNPrecondition { - private SharedPullingSystem _pulling = default!; + private PullingSystem _pulling = default!; [ViewVariables(VVAccess.ReadWrite)] [DataField("isPulled")] public bool IsPulled = true; public override void Initialize(IEntitySystemManager sysManager) { base.Initialize(sysManager); - _pulling = sysManager.GetEntitySystem(); + _pulling = sysManager.GetEntitySystem(); } public override bool IsMet(NPCBlackboard blackboard) diff --git a/Content.Server/Nyanotrasen/Carrying/CarryingSystem.cs b/Content.Server/Nyanotrasen/Carrying/CarryingSystem.cs index 103731b1b04..ff4c097080c 100644 --- a/Content.Server/Nyanotrasen/Carrying/CarryingSystem.cs +++ b/Content.Server/Nyanotrasen/Carrying/CarryingSystem.cs @@ -2,12 +2,10 @@ using System.Threading; using Content.Server.DoAfter; using Content.Server.Body.Systems; -using Content.Server.Hands.Systems; using Content.Server.Resist; using Content.Server.Popups; using Content.Server.Inventory; using Content.Server.Nyanotrasen.Item.PseudoItem; -using Content.Shared.Climbing; // Shared instead of Server using Content.Shared.Mobs; using Content.Shared.DoAfter; using Content.Shared.Buckle.Components; @@ -20,14 +18,14 @@ using Content.Shared.Carrying; using Content.Shared.Movement.Events; using Content.Shared.Movement.Systems; -using Content.Shared.Pulling; -using Content.Shared.Pulling.Components; using Content.Shared.Standing; using Content.Shared.ActionBlocker; using Content.Shared.Inventory.VirtualItem; using Content.Shared.Item; using Content.Shared.Throwing; -using Content.Shared.Physics.Pull; +using Content.Shared.Movement.Pulling.Components; +using Content.Shared.Movement.Pulling.Events; +using Content.Shared.Movement.Pulling.Systems; using Content.Shared.Mobs.Systems; using Content.Shared.Nyanotrasen.Item.PseudoItem; using Content.Shared.Storage; @@ -38,17 +36,16 @@ namespace Content.Server.Carrying { public sealed class CarryingSystem : EntitySystem { - [Dependency] private readonly VirtualItemSystem _virtualItemSystem = default!; + [Dependency] private readonly VirtualItemSystem _virtualItemSystem = default!; [Dependency] private readonly CarryingSlowdownSystem _slowdown = default!; [Dependency] private readonly DoAfterSystem _doAfterSystem = default!; [Dependency] private readonly StandingStateSystem _standingState = default!; [Dependency] private readonly ActionBlockerSystem _actionBlockerSystem = default!; - [Dependency] private readonly SharedPullingSystem _pullingSystem = default!; + [Dependency] private readonly PullingSystem _pullingSystem = default!; [Dependency] private readonly MobStateSystem _mobStateSystem = default!; [Dependency] private readonly EscapeInventorySystem _escapeInventorySystem = default!; [Dependency] private readonly PopupSystem _popupSystem = default!; [Dependency] private readonly MovementSpeedModifierSystem _movementSpeed = default!; - [Dependency] private readonly RespiratorSystem _respirator = default!; [Dependency] private readonly PseudoItemSystem _pseudoItem = default!; public override void Initialize() @@ -280,8 +277,8 @@ private void StartCarryDoAfter(EntityUid carrier, EntityUid carried, CarriableCo private void Carry(EntityUid carrier, EntityUid carried) { - if (TryComp(carried, out var pullable)) - _pullingSystem.TryStopPull(pullable); + if (TryComp(carried, out var pullable)) + _pullingSystem.TryStopPull(carried, pullable); Transform(carrier).AttachToGridOrMap(); Transform(carried).AttachToGridOrMap(); diff --git a/Content.Server/Objectives/Systems/StealConditionSystem.cs b/Content.Server/Objectives/Systems/StealConditionSystem.cs index 02d4ee010b5..0fe6f0947c8 100644 --- a/Content.Server/Objectives/Systems/StealConditionSystem.cs +++ b/Content.Server/Objectives/Systems/StealConditionSystem.cs @@ -6,11 +6,10 @@ using Robust.Shared.Containers; using Robust.Shared.Prototypes; using Robust.Shared.Random; -using Content.Shared.Pulling.Components; -using Content.Shared.Objectives; using Content.Shared.Mind.Components; using Content.Shared.Mobs.Systems; using Content.Shared.Mobs.Components; +using Content.Shared.Movement.Pulling.Components; namespace Content.Server.Objectives.Systems; @@ -100,19 +99,19 @@ private float GetProgress(MindComponent mind, StealConditionComponent condition) var count = 0; //check pulling object - if (TryComp(mind.OwnedEntity, out var pull)) //TO DO: to make the code prettier? don't like the repetition + if (TryComp(mind.OwnedEntity, out var pull)) //TO DO: to make the code prettier? don't like the repetition { - var pullid = pull.Pulling; - if (pullid != null) + var pulledEntity = pull.Pulling; + if (pulledEntity != null) { // check if this is the item - if (CheckStealTarget(pullid.Value, condition)) count++; + if (CheckStealTarget(pulledEntity.Value, condition)) count++; //we don't check the inventories of sentient entity - if (!TryComp(pullid, out var pullMind)) + if (!HasComp(pulledEntity)) { // if it is a container check its contents - if (_containerQuery.TryGetComponent(pullid, out var containerManager)) + if (_containerQuery.TryGetComponent(pulledEntity, out var containerManager)) stack.Push(containerManager); } } diff --git a/Content.Server/Physics/Controllers/PullController.cs b/Content.Server/Physics/Controllers/PullController.cs deleted file mode 100644 index 8f58f807aae..00000000000 --- a/Content.Server/Physics/Controllers/PullController.cs +++ /dev/null @@ -1,207 +0,0 @@ -using System.Numerics; -using Content.Shared.ActionBlocker; -using Content.Shared.Gravity; -using Content.Shared.Pulling; -using Content.Shared.Pulling.Components; -using Content.Shared.Rotatable; -using Robust.Shared.Physics; -using Robust.Shared.Physics.Components; -using Robust.Shared.Physics.Controllers; - -namespace Content.Server.Physics.Controllers -{ - public sealed class PullController : VirtualController - { - // Parameterization for pulling: - // Speeds. Note that the speed is mass-independent (multiplied by mass). - // Instead, tuning to mass is done via the mass values below. - // Note that setting the speed too high results in overshoots (stabilized by drag, but bad) - private const float AccelModifierHigh = 15f; - private const float AccelModifierLow = 60.0f; - // High/low-mass marks. Curve is constant-lerp-constant, i.e. if you can even pull an item, - // you'll always get at least AccelModifierLow and no more than AccelModifierHigh. - private const float AccelModifierHighMass = 70.0f; // roundstart saltern emergency closet - private const float AccelModifierLowMass = 5.0f; // roundstart saltern emergency crowbar - // Used to control settling (turns off pulling). - private const float MaximumSettleVelocity = 0.1f; - private const float MaximumSettleDistance = 0.1f; - // Settle shutdown control. - // Mustn't be too massive, as that causes severe mispredicts *and can prevent it ever resolving*. - // Exists to bleed off "I pulled my crowbar" overshoots. - // Minimum velocity for shutdown to be necessary. This prevents stuff getting stuck b/c too much shutdown. - private const float SettleMinimumShutdownVelocity = 0.25f; - // Distance in which settle shutdown multiplier is at 0. It then scales upwards linearly with closer distances. - private const float SettleShutdownDistance = 1.0f; - // Velocity change of -LinearVelocity * frameTime * this - private const float SettleShutdownMultiplier = 20.0f; - - // How much you must move for the puller movement check to actually hit. - private const float MinimumMovementDistance = 0.005f; - - [Dependency] private readonly ActionBlockerSystem _actionBlockerSystem = default!; - [Dependency] private readonly SharedPullingSystem _pullableSystem = default!; - [Dependency] private readonly SharedGravitySystem _gravity = default!; - [Dependency] private readonly SharedTransformSystem _transform = default!; - - // TODO: Move this stuff to pullingsystem - /// - /// If distance between puller and pulled entity lower that this threshold, - /// pulled entity will not change its rotation. - /// Helps with small distance jittering - /// - private const float ThresholdRotDistance = 1; - - /// - /// If difference between puller and pulled angle lower that this threshold, - /// pulled entity will not change its rotation. - /// Helps with diagonal movement jittering - /// As of further adjustments, should divide cleanly into 90 degrees - /// - private const float ThresholdRotAngle = 22.5f; - - public override void Initialize() - { - UpdatesAfter.Add(typeof(MoverController)); - SubscribeLocalEvent(OnPullerMove); - - base.Initialize(); - } - - private void OnPullerMove(EntityUid uid, SharedPullerComponent component, ref MoveEvent args) - { - if (component.Pulling is not { } pullable || !TryComp(pullable, out var pullableComponent)) - return; - - UpdatePulledRotation(uid, pullable); - - if (args.NewPosition.EntityId == args.OldPosition.EntityId && - (args.NewPosition.Position - args.OldPosition.Position).LengthSquared() < MinimumMovementDistance * MinimumMovementDistance) - return; - - if (TryComp(pullable, out var physics)) - PhysicsSystem.WakeBody(pullable, body: physics); - - _pullableSystem.StopMoveTo(pullableComponent); - } - - private void UpdatePulledRotation(EntityUid puller, EntityUid pulled) - { - // TODO: update once ComponentReference works with directed event bus. - if (!TryComp(pulled, out RotatableComponent? rotatable)) - return; - - if (!rotatable.RotateWhilePulling) - return; - - var xforms = GetEntityQuery(); - var pulledXform = xforms.GetComponent(pulled); - var pullerXform = xforms.GetComponent(puller); - - var pullerData = TransformSystem.GetWorldPositionRotation(pullerXform, xforms); - var pulledData = TransformSystem.GetWorldPositionRotation(pulledXform, xforms); - - var dir = pullerData.WorldPosition - pulledData.WorldPosition; - if (dir.LengthSquared() > ThresholdRotDistance * ThresholdRotDistance) - { - var oldAngle = pulledData.WorldRotation; - var newAngle = Angle.FromWorldVec(dir); - - var diff = newAngle - oldAngle; - if (Math.Abs(diff.Degrees) > ThresholdRotAngle / 2f) - { - // Ok, so this bit is difficult because ideally it would look like it's snapping to sane angles. - // Otherwise PIANO DOOR STUCK! happens. - // But it also needs to work with station rotation / align to the local parent. - // So... - var baseRotation = pulledData.WorldRotation - pulledXform.LocalRotation; - var localRotation = newAngle - baseRotation; - var localRotationSnapped = Angle.FromDegrees(Math.Floor((localRotation.Degrees / ThresholdRotAngle) + 0.5f) * ThresholdRotAngle); - TransformSystem.SetLocalRotation(pulledXform, localRotationSnapped); - } - } - } - - public override void UpdateBeforeSolve(bool prediction, float frameTime) - { - base.UpdateBeforeSolve(prediction, frameTime); - - foreach (var pullable in _pullableSystem.Moving) - { - // There's a 1-frame delay between stopping moving something and it leaving the Moving set. - // This can include if leaving the Moving set due to not being pulled anymore, - // or due to being deleted. - - if (pullable.Deleted) - continue; - - if (pullable.MovingTo == null) - continue; - - if (pullable.Puller is not {Valid: true} puller) - continue; - - var pullableEnt = pullable.Owner; - var pullableXform = Transform(pullableEnt); - var pullerXform = Transform(puller); - - // Now that's over with... - - var pullerPosition = pullerXform.MapPosition; - var movingTo = pullable.MovingTo.Value.ToMap(EntityManager, _transform); - if (movingTo.MapId != pullerPosition.MapId) - { - _pullableSystem.StopMoveTo(pullable); - continue; - } - - if (!TryComp(pullableEnt, out var physics) || - physics.BodyType == BodyType.Static || - movingTo.MapId != pullableXform.MapID) - { - _pullableSystem.StopMoveTo(pullable); - continue; - } - - var movingPosition = movingTo.Position; - var ownerPosition = pullableXform.MapPosition.Position; - - var diff = movingPosition - ownerPosition; - var diffLength = diff.Length(); - - if (diffLength < MaximumSettleDistance && physics.LinearVelocity.Length() < MaximumSettleVelocity) - { - PhysicsSystem.SetLinearVelocity(pullableEnt, Vector2.Zero, body: physics); - _pullableSystem.StopMoveTo(pullable); - continue; - } - - var impulseModifierLerp = Math.Min(1.0f, Math.Max(0.0f, (physics.Mass - AccelModifierLowMass) / (AccelModifierHighMass - AccelModifierLowMass))); - var impulseModifier = MathHelper.Lerp(AccelModifierLow, AccelModifierHigh, impulseModifierLerp); - var multiplier = diffLength < 1 ? impulseModifier * diffLength : impulseModifier; - // Note the implication that the real rules of physics don't apply to pulling control. - var accel = diff.Normalized() * multiplier; - // Now for the part where velocity gets shutdown... - if (diffLength < SettleShutdownDistance && physics.LinearVelocity.Length() >= SettleMinimumShutdownVelocity) - { - // Shutdown velocity increases as we get closer to centre - var scaling = (SettleShutdownDistance - diffLength) / SettleShutdownDistance; - accel -= physics.LinearVelocity * SettleShutdownMultiplier * scaling; - } - - PhysicsSystem.WakeBody(pullableEnt, body: physics); - - var impulse = accel * physics.Mass * frameTime; - PhysicsSystem.ApplyLinearImpulse(pullableEnt, impulse, body: physics); - - // if the puller is weightless or can't move, then we apply the inverse impulse (Newton's third law). - // doing it under gravity produces an unsatisfying wiggling when pulling. - // If player can't move, assume they are on a chair and we need to prevent pull-moving. - if ((_gravity.IsWeightless(puller) && pullerXform.GridUid == null) || !_actionBlockerSystem.CanMove(puller)) - { - PhysicsSystem.WakeBody(puller); - PhysicsSystem.ApplyLinearImpulse(puller, -impulse); - } - } - } - } -} diff --git a/Content.Server/Pulling/PullingSystem.cs b/Content.Server/Pulling/PullingSystem.cs deleted file mode 100644 index 69bb7c93704..00000000000 --- a/Content.Server/Pulling/PullingSystem.cs +++ /dev/null @@ -1,48 +0,0 @@ -using Content.Shared.Input; -using Content.Shared.Pulling; -using Content.Shared.Pulling.Components; -using JetBrains.Annotations; -using Robust.Server.GameObjects; -using Robust.Shared.Input.Binding; -using Robust.Shared.Player; - -namespace Content.Server.Pulling -{ - [UsedImplicitly] - public sealed class PullingSystem : SharedPullingSystem - { - public override void Initialize() - { - base.Initialize(); - - UpdatesAfter.Add(typeof(PhysicsSystem)); - - SubscribeLocalEvent(OnPullableMove); - SubscribeLocalEvent(OnPullableStopMove); - - CommandBinds.Builder - .Bind(ContentKeyFunctions.ReleasePulledObject, InputCmdHandler.FromDelegate(HandleReleasePulledObject)) - .Register(); - } - - private void HandleReleasePulledObject(ICommonSession? session) - { - if (session?.AttachedEntity is not {Valid: true} player) - { - return; - } - - if (!TryGetPulled(player, out var pulled)) - { - return; - } - - if (!EntityManager.TryGetComponent(pulled.Value, out SharedPullableComponent? pullable)) - { - return; - } - - TryStopPull(pullable); - } - } -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactInteractionTriggerSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactInteractionTriggerSystem.cs index 239b6741608..9976d56da0b 100644 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactInteractionTriggerSystem.cs +++ b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactInteractionTriggerSystem.cs @@ -1,6 +1,6 @@ using Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Components; using Content.Shared.Interaction; -using Content.Shared.Physics.Pull; +using Content.Shared.Movement.Pulling.Events; using Content.Shared.Weapons.Melee.Events; namespace Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Systems; @@ -22,7 +22,7 @@ private void OnPull(EntityUid uid, ArtifactInteractionTriggerComponent component if (!component.PullActivation) return; - _artifactSystem.TryActivateArtifact(uid, args.Puller.Owner); + _artifactSystem.TryActivateArtifact(uid, args.PullerUid); } private void OnAttack(EntityUid uid, ArtifactInteractionTriggerComponent component, AttackedEvent args) diff --git a/Content.Server/Zombies/ZombieSystem.Transform.cs b/Content.Server/Zombies/ZombieSystem.Transform.cs index 996d7772239..c87132cc3cb 100644 --- a/Content.Server/Zombies/ZombieSystem.Transform.cs +++ b/Content.Server/Zombies/ZombieSystem.Transform.cs @@ -26,12 +26,12 @@ using Content.Shared.Mobs; using Content.Shared.Mobs.Components; using Content.Shared.Mobs.Systems; +using Content.Shared.Movement.Pulling.Components; using Content.Shared.Movement.Systems; using Content.Shared.Nutrition.AnimalHusbandry; using Content.Shared.Nutrition.Components; using Content.Shared.Popups; using Content.Shared.Roles; -using Content.Shared.Pulling.Components; using Content.Shared.Weapons.Melee; using Content.Shared.Zombies; using Content.Shared.Prying.Components; @@ -59,7 +59,6 @@ public sealed partial class ZombieSystem [Dependency] private readonly IChatManager _chatMan = default!; [Dependency] private readonly MindSystem _mind = default!; [Dependency] private readonly SharedRoleSystem _roles = default!; - [Dependency] private readonly MobThresholdSystem _mobThreshold = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly ActionsSystem _actions = default!; // DeltaV - No psionic zombies @@ -282,7 +281,9 @@ public void ZombifyEntity(EntityUid target, MobStateComponent? mobState = null) RemComp(target, handsComp); } - RemComp(target); + // Sloth: What the fuck? + // How long until compregistry lmao. + RemComp(target); // No longer waiting to become a zombie: // Requires deferral because this is (probably) the event which called ZombifyEntity in the first place. diff --git a/Content.Shared/Administration/AdminFrozenSystem.cs b/Content.Shared/Administration/AdminFrozenSystem.cs index 14438cc5912..4ec9600b0bd 100644 --- a/Content.Shared/Administration/AdminFrozenSystem.cs +++ b/Content.Shared/Administration/AdminFrozenSystem.cs @@ -1,13 +1,10 @@ using Content.Shared.ActionBlocker; using Content.Shared.Interaction.Events; using Content.Shared.Item; -using Content.Shared.Movement; using Content.Shared.Movement.Events; -using Content.Shared.Physics.Pull; -using Content.Shared.Pulling; -using Content.Shared.Pulling.Components; -using Content.Shared.Pulling.Events; -using Content.Shared.Stunnable; +using Content.Shared.Movement.Pulling.Components; +using Content.Shared.Movement.Pulling.Events; +using Content.Shared.Movement.Pulling.Systems; using Content.Shared.Throwing; namespace Content.Shared.Administration; @@ -15,7 +12,7 @@ namespace Content.Shared.Administration; public sealed class AdminFrozenSystem : EntitySystem { [Dependency] private readonly ActionBlockerSystem _blocker = default!; - [Dependency] private readonly SharedPullingSystem _pulling = default!; + [Dependency] private readonly PullingSystem _pulling = default!; public override void Initialize() { @@ -45,9 +42,9 @@ private void OnPullAttempt(EntityUid uid, AdminFrozenComponent component, PullAt private void OnStartup(EntityUid uid, AdminFrozenComponent component, ComponentStartup args) { - if (TryComp(uid, out var pullable)) + if (TryComp(uid, out var pullable)) { - _pulling.TryStopPull(pullable); + _pulling.TryStopPull(uid, pullable); } UpdateCanMove(uid, component, args); diff --git a/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs b/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs index 8172947a039..3355713bb2e 100644 --- a/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs +++ b/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs @@ -10,7 +10,6 @@ using Content.Shared.Mobs.Components; using Content.Shared.Movement.Events; using Content.Shared.Popups; -using Content.Shared.Pulling.Components; using Content.Shared.Standing; using Content.Shared.Storage.Components; using Content.Shared.Stunnable; @@ -19,6 +18,7 @@ using Robust.Shared.Physics.Components; using Robust.Shared.Physics.Events; using Robust.Shared.Utility; +using PullableComponent = Content.Shared.Movement.Pulling.Components.PullableComponent; namespace Content.Shared.Buckle; @@ -348,11 +348,11 @@ public bool TryBuckle(EntityUid buckleUid, EntityUid userUid, EntityUid strapUid RaiseLocalEvent(ev.BuckledEntity, ref ev); RaiseLocalEvent(ev.StrapEntity, ref ev); - if (TryComp(buckleUid, out var ownerPullable)) + if (TryComp(buckleUid, out var ownerPullable)) { if (ownerPullable.Puller != null) { - _pulling.TryStopPull(ownerPullable); + _pulling.TryStopPull(buckleUid, ownerPullable); } } @@ -361,12 +361,12 @@ public bool TryBuckle(EntityUid buckleUid, EntityUid userUid, EntityUid strapUid _physics.ResetDynamics(buckleUid, physics); } - if (!buckleComp.PullStrap && TryComp(strapUid, out var toPullable)) + if (!buckleComp.PullStrap && TryComp(strapUid, out var toPullable)) { if (toPullable.Puller == buckleUid) { // can't pull it and buckle to it at the same time - _pulling.TryStopPull(toPullable); + _pulling.TryStopPull(strapUid, toPullable); } } diff --git a/Content.Shared/Buckle/SharedBuckleSystem.cs b/Content.Shared/Buckle/SharedBuckleSystem.cs index 8f683356637..67218657e52 100644 --- a/Content.Shared/Buckle/SharedBuckleSystem.cs +++ b/Content.Shared/Buckle/SharedBuckleSystem.cs @@ -15,6 +15,7 @@ using Robust.Shared.Physics.Systems; using Robust.Shared.Player; using Robust.Shared.Timing; +using PullingSystem = Content.Shared.Movement.Pulling.Systems.PullingSystem; namespace Content.Shared.Buckle; @@ -35,7 +36,7 @@ public abstract partial class SharedBuckleSystem : EntitySystem [Dependency] private readonly SharedInteractionSystem _interaction = default!; [Dependency] private readonly SharedJointSystem _joints = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; - [Dependency] private readonly SharedPullingSystem _pulling = default!; + [Dependency] private readonly PullingSystem _pulling = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly StandingStateSystem _standing = default!; [Dependency] private readonly SharedPhysicsSystem _physics = default!; diff --git a/Content.Shared/Construction/EntitySystems/AnchorableSystem.cs b/Content.Shared/Construction/EntitySystems/AnchorableSystem.cs index 70bcfbab43f..f06278c6d73 100644 --- a/Content.Shared/Construction/EntitySystems/AnchorableSystem.cs +++ b/Content.Shared/Construction/EntitySystems/AnchorableSystem.cs @@ -6,16 +6,15 @@ using Content.Shared.Database; using Content.Shared.DoAfter; using Content.Shared.Interaction; +using Content.Shared.Movement.Pulling.Components; +using Content.Shared.Movement.Pulling.Systems; using Content.Shared.Popups; -using Content.Shared.Pulling; -using Content.Shared.Pulling.Components; using Content.Shared.Tools; using Content.Shared.Tools.Components; using Robust.Shared.Map; using Robust.Shared.Map.Components; using Robust.Shared.Physics.Components; using Content.Shared.Tag; -using Robust.Shared.Player; using Robust.Shared.Serialization; using Robust.Shared.Utility; using SharedToolSystem = Content.Shared.Tools.Systems.SharedToolSystem; @@ -27,7 +26,7 @@ public sealed partial class AnchorableSystem : EntitySystem [Dependency] private readonly IMapManager _mapManager = default!; [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; - [Dependency] private readonly SharedPullingSystem _pulling = default!; + [Dependency] private readonly PullingSystem _pulling = default!; [Dependency] private readonly SharedToolSystem _tool = default!; [Dependency] private readonly SharedTransformSystem _transformSystem = default!; [Dependency] private readonly TagSystem _tagSystem = default!; @@ -132,9 +131,9 @@ private void OnAnchorComplete(EntityUid uid, AnchorableComponent component, TryA var rot = xform.LocalRotation; xform.LocalRotation = Math.Round(rot / (Math.PI / 2)) * (Math.PI / 2); - if (TryComp(uid, out var pullable) && pullable.Puller != null) + if (TryComp(uid, out var pullable) && pullable.Puller != null) { - _pulling.TryStopPull(pullable); + _pulling.TryStopPull(uid, pullable); } // TODO: Anchoring snaps rn anyway! @@ -175,7 +174,7 @@ private void OnAnchorComplete(EntityUid uid, AnchorableComponent component, TryA public void TryToggleAnchor(EntityUid uid, EntityUid userUid, EntityUid usingUid, AnchorableComponent? anchorable = null, TransformComponent? transform = null, - SharedPullableComponent? pullable = null, + PullableComponent? pullable = null, ToolComponent? usingTool = null) { if (!Resolve(uid, ref transform)) @@ -198,7 +197,7 @@ public void TryToggleAnchor(EntityUid uid, EntityUid userUid, EntityUid usingUid private void TryAnchor(EntityUid uid, EntityUid userUid, EntityUid usingUid, AnchorableComponent? anchorable = null, TransformComponent? transform = null, - SharedPullableComponent? pullable = null, + PullableComponent? pullable = null, ToolComponent? usingTool = null) { if (!Resolve(uid, ref anchorable, ref transform)) diff --git a/Content.Shared/Cuffs/SharedCuffableSystem.cs b/Content.Shared/Cuffs/SharedCuffableSystem.cs index fc005fd30fa..5cade56aca1 100644 --- a/Content.Shared/Cuffs/SharedCuffableSystem.cs +++ b/Content.Shared/Cuffs/SharedCuffableSystem.cs @@ -21,9 +21,8 @@ using Content.Shared.Item; using Content.Shared.Mobs.Systems; using Content.Shared.Movement.Events; -using Content.Shared.Physics.Pull; +using Content.Shared.Movement.Pulling.Events; using Content.Shared.Popups; -using Content.Shared.Pulling.Components; using Content.Shared.Pulling.Events; using Content.Shared.Rejuvenate; using Content.Shared.Stunnable; @@ -36,6 +35,7 @@ using Robust.Shared.Network; using Robust.Shared.Player; using Robust.Shared.Serialization; +using PullableComponent = Content.Shared.Movement.Pulling.Components.PullableComponent; namespace Content.Shared.Cuffs { @@ -70,7 +70,7 @@ public override void Initialize() SubscribeLocalEvent(OnCuffsInsertedIntoContainer); SubscribeLocalEvent(OnRejuvenate); SubscribeLocalEvent(OnStartup); - SubscribeLocalEvent(HandleStopPull); + SubscribeLocalEvent(HandleStopPull); SubscribeLocalEvent(HandleMoveAttempt); SubscribeLocalEvent(OnEquipAttempt); SubscribeLocalEvent(OnUnequipAttempt); @@ -182,7 +182,7 @@ public void UpdateCuffState(EntityUid uid, CuffableComponent component) private void OnBeingPulledAttempt(EntityUid uid, CuffableComponent component, BeingPulledAttemptEvent args) { - if (!TryComp(uid, out var pullable)) + if (!TryComp(uid, out var pullable)) return; if (pullable.Puller != null && !component.CanStillInteract) // If we are being pulled already and cuffed, we can't get pulled again. @@ -214,19 +214,19 @@ private void OnPull(EntityUid uid, CuffableComponent component, PullMessage args private void HandleMoveAttempt(EntityUid uid, CuffableComponent component, UpdateCanMoveEvent args) { - if (component.CanStillInteract || !EntityManager.TryGetComponent(uid, out SharedPullableComponent? pullable) || !pullable.BeingPulled) + if (component.CanStillInteract || !EntityManager.TryGetComponent(uid, out PullableComponent? pullable) || !pullable.BeingPulled) return; args.Cancel(); } - private void HandleStopPull(EntityUid uid, CuffableComponent component, StopPullingEvent args) + private void HandleStopPull(EntityUid uid, CuffableComponent component, AttemptStopPullingEvent args) { if (args.User == null || !Exists(args.User.Value)) return; if (args.User.Value == uid && !component.CanStillInteract) - args.Cancel(); + args.Cancelled = true; } private void AddUncuffVerb(EntityUid uid, CuffableComponent component, GetVerbsEvent args) diff --git a/Content.Shared/Follower/FollowerSystem.cs b/Content.Shared/Follower/FollowerSystem.cs index 5656778a3f9..fc7cccf9bd6 100644 --- a/Content.Shared/Follower/FollowerSystem.cs +++ b/Content.Shared/Follower/FollowerSystem.cs @@ -4,8 +4,8 @@ using Content.Shared.Ghost; using Content.Shared.Hands; using Content.Shared.Movement.Events; +using Content.Shared.Movement.Pulling.Events; using Content.Shared.Movement.Systems; -using Content.Shared.Physics.Pull; using Content.Shared.Tag; using Content.Shared.Verbs; using Robust.Shared.Containers; diff --git a/Content.Shared/Friction/TileFrictionController.cs b/Content.Shared/Friction/TileFrictionController.cs index ba4d9fc24f8..3583947ee36 100644 --- a/Content.Shared/Friction/TileFrictionController.cs +++ b/Content.Shared/Friction/TileFrictionController.cs @@ -2,8 +2,8 @@ using Content.Shared.CCVar; using Content.Shared.Gravity; using Content.Shared.Movement.Events; +using Content.Shared.Movement.Pulling.Components; using Content.Shared.Movement.Systems; -using Content.Shared.Pulling.Components; using JetBrains.Annotations; using Robust.Shared.Configuration; using Robust.Shared.Map; @@ -23,6 +23,12 @@ public sealed class TileFrictionController : VirtualController [Dependency] private readonly SharedMoverController _mover = default!; [Dependency] private readonly SharedPhysicsSystem _physics = default!; + private EntityQuery _frictionQuery; + private EntityQuery _xformQuery; + private EntityQuery _pullerQuery; + private EntityQuery _pullableQuery; + private EntityQuery _gridQuery; + private float _stopSpeed; private float _frictionModifier; public const float DefaultFriction = 0.3f; @@ -33,18 +39,17 @@ public override void Initialize() Subs.CVar(_configManager, CCVars.TileFrictionModifier, value => _frictionModifier = value, true); Subs.CVar(_configManager, CCVars.StopSpeed, value => _stopSpeed = value, true); + _frictionQuery = GetEntityQuery(); + _xformQuery = GetEntityQuery(); + _pullerQuery = GetEntityQuery(); + _pullableQuery = GetEntityQuery(); + _gridQuery = GetEntityQuery(); } public override void UpdateBeforeMapSolve(bool prediction, PhysicsMapComponent mapComponent, float frameTime) { base.UpdateBeforeMapSolve(prediction, mapComponent, frameTime); - var frictionQuery = GetEntityQuery(); - var xformQuery = GetEntityQuery(); - var pullerQuery = GetEntityQuery(); - var pullableQuery = GetEntityQuery(); - var gridQuery = GetEntityQuery(); - foreach (var body in mapComponent.AwakeBodies) { var uid = body.Owner; @@ -60,16 +65,16 @@ public override void UpdateBeforeMapSolve(bool prediction, PhysicsMapComponent m if (body.LinearVelocity.Equals(Vector2.Zero) && body.AngularVelocity.Equals(0f)) continue; - if (!xformQuery.TryGetComponent(uid, out var xform)) + if (!_xformQuery.TryGetComponent(uid, out var xform)) { Log.Error($"Unable to get transform for {ToPrettyString(uid)} in tilefrictioncontroller"); continue; } - var surfaceFriction = GetTileFriction(uid, body, xform, gridQuery, frictionQuery); + var surfaceFriction = GetTileFriction(uid, body, xform); var bodyModifier = 1f; - if (frictionQuery.TryGetComponent(uid, out var frictionComp)) + if (_frictionQuery.TryGetComponent(uid, out var frictionComp)) { bodyModifier = frictionComp.Modifier; } @@ -82,8 +87,8 @@ public override void UpdateBeforeMapSolve(bool prediction, PhysicsMapComponent m // If we're sandwiched between 2 pullers reduce friction // Might be better to make this dynamic and check how many are in the pull chain? // Either way should be much faster for now. - if (pullerQuery.TryGetComponent(uid, out var puller) && puller.Pulling != null && - pullableQuery.TryGetComponent(uid, out var pullable) && pullable.BeingPulled) + if (_pullerQuery.TryGetComponent(uid, out var puller) && puller.Pulling != null && + _pullableQuery.TryGetComponent(uid, out var pullable) && pullable.BeingPulled) { bodyModifier *= 0.2f; } @@ -163,9 +168,7 @@ private void ReduceAngularVelocity(EntityUid uid, bool prediction, PhysicsCompon private float GetTileFriction( EntityUid uid, PhysicsComponent body, - TransformComponent xform, - EntityQuery gridQuery, - EntityQuery frictionQuery) + TransformComponent xform) { // TODO: Make IsWeightless event-based; we already have grid traversals tracked so just raise events if (_gravity.IsWeightless(uid, body, xform)) @@ -175,9 +178,9 @@ private float GetTileFriction( return 0.0f; // If not on a grid then return the map's friction. - if (!gridQuery.TryGetComponent(xform.GridUid, out var grid)) + if (!_gridQuery.TryGetComponent(xform.GridUid, out var grid)) { - return frictionQuery.TryGetComponent(xform.MapUid, out var friction) + return _frictionQuery.TryGetComponent(xform.MapUid, out var friction) ? friction.Modifier : DefaultFriction; } @@ -197,7 +200,7 @@ private float GetTileFriction( while (anc.MoveNext(out var tileEnt)) { - if (frictionQuery.TryGetComponent(tileEnt, out var friction)) + if (_frictionQuery.TryGetComponent(tileEnt, out var friction)) return friction.Modifier; } diff --git a/Content.Shared/Interaction/SharedInteractionSystem.cs b/Content.Shared/Interaction/SharedInteractionSystem.cs index 0e390ecea45..e4864b1f7fc 100644 --- a/Content.Shared/Interaction/SharedInteractionSystem.cs +++ b/Content.Shared/Interaction/SharedInteractionSystem.cs @@ -15,10 +15,10 @@ using Content.Shared.Inventory.Events; using Content.Shared.Item; using Content.Shared.Movement.Components; +using Content.Shared.Movement.Pulling.Components; +using Content.Shared.Movement.Pulling.Systems; using Content.Shared.Physics; using Content.Shared.Popups; -using Content.Shared.Pulling; -using Content.Shared.Pulling.Components; using Content.Shared.Tag; using Content.Shared.Timing; using Content.Shared.Verbs; @@ -60,7 +60,7 @@ public abstract partial class SharedInteractionSystem : EntitySystem [Dependency] private readonly SharedVerbSystem _verbSystem = default!; [Dependency] private readonly SharedPopupSystem _popupSystem = default!; [Dependency] private readonly UseDelaySystem _useDelay = default!; - [Dependency] private readonly SharedPullingSystem _pullSystem = default!; + [Dependency] private readonly PullingSystem _pullSystem = default!; [Dependency] private readonly InventorySystem _inventory = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly TagSystem _tagSystem = default!; @@ -185,10 +185,10 @@ private bool HandleTryPullObject(ICommonSession? session, EntityCoordinates coor if (!InRangeUnobstructed(userEntity.Value, uid, popup: true)) return false; - if (!TryComp(uid, out SharedPullableComponent? pull)) + if (!TryComp(uid, out PullableComponent? pull)) return false; - _pullSystem.TogglePull(userEntity.Value, pull); + _pullSystem.TogglePull(uid, userEntity.Value, pull); return false; } diff --git a/Content.Shared/Movement/Pulling/Components/PullableComponent.cs b/Content.Shared/Movement/Pulling/Components/PullableComponent.cs new file mode 100644 index 00000000000..db889e7e3bd --- /dev/null +++ b/Content.Shared/Movement/Pulling/Components/PullableComponent.cs @@ -0,0 +1,39 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Movement.Pulling.Components; + +/// +/// Specifies an entity as being pullable by an entity with +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +[Access(typeof(Systems.PullingSystem))] +public sealed partial class PullableComponent : Component +{ + /// + /// The current entity pulling this component. + /// + [AutoNetworkedField, DataField] + public EntityUid? Puller; + + /// + /// The pull joint. + /// + [AutoNetworkedField, DataField] + public string? PullJointId; + + public bool BeingPulled => Puller != null; + + /// + /// If the physics component has FixedRotation should we keep it upon being pulled + /// + [Access(typeof(Systems.PullingSystem), Other = AccessPermissions.ReadExecute)] + [ViewVariables(VVAccess.ReadWrite), DataField("fixedRotation")] + public bool FixedRotationOnPull; + + /// + /// What the pullable's fixedrotation was set to before being pulled. + /// + [Access(typeof(Systems.PullingSystem), Other = AccessPermissions.ReadExecute)] + [AutoNetworkedField, DataField] + public bool PrevFixedRotation; +} diff --git a/Content.Shared/Movement/Pulling/Components/PullerComponent.cs b/Content.Shared/Movement/Pulling/Components/PullerComponent.cs new file mode 100644 index 00000000000..1fc9b731bd5 --- /dev/null +++ b/Content.Shared/Movement/Pulling/Components/PullerComponent.cs @@ -0,0 +1,41 @@ +using Content.Shared.Movement.Pulling.Systems; +using Robust.Shared.GameStates; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; + +namespace Content.Shared.Movement.Pulling.Components; + +/// +/// Specifies an entity as being able to pull another entity with +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +[Access(typeof(PullingSystem))] +public sealed partial class PullerComponent : Component +{ + // My raiding guild + /// + /// Next time the puller can throw what is being pulled. + /// Used to avoid spamming it for infinite spin + velocity. + /// + [DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), AutoNetworkedField] + public TimeSpan NextThrow; + + [DataField] + public TimeSpan ThrowCooldown = TimeSpan.FromSeconds(1); + + // Before changing how this is updated, please see SharedPullerSystem.RefreshMovementSpeed + public float WalkSpeedModifier => Pulling == default ? 1.0f : 0.95f; + + public float SprintSpeedModifier => Pulling == default ? 1.0f : 0.95f; + + /// + /// Entity currently being pulled if applicable. + /// + [AutoNetworkedField, DataField] + public EntityUid? Pulling; + + /// + /// Does this entity need hands to be able to pull something? + /// + [DataField] + public bool NeedsHands = true; +} diff --git a/Content.Shared/Movement/Pulling/Events/AttemptPullEvent.cs b/Content.Shared/Movement/Pulling/Events/AttemptPullEvent.cs new file mode 100644 index 00000000000..b0101c46996 --- /dev/null +++ b/Content.Shared/Movement/Pulling/Events/AttemptPullEvent.cs @@ -0,0 +1,13 @@ +using Robust.Shared.Physics.Components; + +namespace Content.Shared.Movement.Pulling.Events; + +/// +/// Raised directed on puller and pullable to determine if it can be pulled. +/// +public sealed class PullAttemptEvent : PullMessage +{ + public PullAttemptEvent(EntityUid pullerUid, EntityUid pullableUid) : base(pullerUid, pullableUid) { } + + public bool Cancelled { get; set; } +} diff --git a/Content.Shared/Movement/Pulling/Events/AttemptStopPullingEvent.cs b/Content.Shared/Movement/Pulling/Events/AttemptStopPullingEvent.cs new file mode 100644 index 00000000000..cd7edc5f623 --- /dev/null +++ b/Content.Shared/Movement/Pulling/Events/AttemptStopPullingEvent.cs @@ -0,0 +1,10 @@ +namespace Content.Shared.Pulling.Events; + +/// +/// Raised when a request is made to stop pulling an entity. +/// +public record struct AttemptStopPullingEvent(EntityUid? User = null) +{ + public readonly EntityUid? User = User; + public bool Cancelled; +} \ No newline at end of file diff --git a/Content.Shared/Pulling/Events/BeingPulledAttemptEvent.cs b/Content.Shared/Movement/Pulling/Events/BeingPulledAttemptEvent.cs similarity index 100% rename from Content.Shared/Pulling/Events/BeingPulledAttemptEvent.cs rename to Content.Shared/Movement/Pulling/Events/BeingPulledAttemptEvent.cs diff --git a/Content.Shared/Movement/Pulling/Events/PullMessage.cs b/Content.Shared/Movement/Pulling/Events/PullMessage.cs new file mode 100644 index 00000000000..a427e448d5c --- /dev/null +++ b/Content.Shared/Movement/Pulling/Events/PullMessage.cs @@ -0,0 +1,13 @@ +namespace Content.Shared.Movement.Pulling.Events; + +public abstract class PullMessage : EntityEventArgs +{ + public readonly EntityUid PullerUid; + public readonly EntityUid PulledUid; + + protected PullMessage(EntityUid pullerUid, EntityUid pulledUid) + { + PullerUid = pullerUid; + PulledUid = pulledUid; + } +} diff --git a/Content.Shared/Movement/Pulling/Events/PullStartedMessage.cs b/Content.Shared/Movement/Pulling/Events/PullStartedMessage.cs new file mode 100644 index 00000000000..29460e1dfc1 --- /dev/null +++ b/Content.Shared/Movement/Pulling/Events/PullStartedMessage.cs @@ -0,0 +1,9 @@ +namespace Content.Shared.Movement.Pulling.Events; + +public sealed class PullStartedMessage : PullMessage +{ + public PullStartedMessage(EntityUid pullerUid, EntityUid pullableUid) : + base(pullerUid, pullableUid) + { + } +} diff --git a/Content.Shared/Movement/Pulling/Events/PullStoppedMessage.cs b/Content.Shared/Movement/Pulling/Events/PullStoppedMessage.cs new file mode 100644 index 00000000000..47aa34562fb --- /dev/null +++ b/Content.Shared/Movement/Pulling/Events/PullStoppedMessage.cs @@ -0,0 +1,13 @@ +using Robust.Shared.Physics.Components; + +namespace Content.Shared.Movement.Pulling.Events; + +/// +/// Raised directed on both puller and pullable. +/// +public sealed class PullStoppedMessage : PullMessage +{ + public PullStoppedMessage(EntityUid pullerUid, EntityUid pulledUid) : base(pullerUid, pulledUid) + { + } +} diff --git a/Content.Shared/Pulling/Events/StartPullAttemptEvent.cs b/Content.Shared/Movement/Pulling/Events/StartPullAttemptEvent.cs similarity index 100% rename from Content.Shared/Pulling/Events/StartPullAttemptEvent.cs rename to Content.Shared/Movement/Pulling/Events/StartPullAttemptEvent.cs diff --git a/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs b/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs new file mode 100644 index 00000000000..33794ba169e --- /dev/null +++ b/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs @@ -0,0 +1,492 @@ +using System.Numerics; +using Content.Shared.ActionBlocker; +using Content.Shared.Administration.Logs; +using Content.Shared.Alert; +using Content.Shared.Buckle.Components; +using Content.Shared.Database; +using Content.Shared.Hands; +using Content.Shared.Hands.EntitySystems; +using Content.Shared.Input; +using Content.Shared.Interaction; +using Content.Shared.Movement.Events; +using Content.Shared.Movement.Pulling.Components; +using Content.Shared.Movement.Pulling.Events; +using Content.Shared.Movement.Systems; +using Content.Shared.Pulling.Events; +using Content.Shared.Throwing; +using Content.Shared.Verbs; +using Robust.Shared.Containers; +using Robust.Shared.Input.Binding; +using Robust.Shared.Map; +using Robust.Shared.Physics; +using Robust.Shared.Physics.Components; +using Robust.Shared.Physics.Events; +using Robust.Shared.Physics.Systems; +using Robust.Shared.Player; +using Robust.Shared.Timing; + +namespace Content.Shared.Movement.Pulling.Systems; + +/// +/// Allows one entity to pull another behind them via a physics distance joint. +/// +public sealed class PullingSystem : EntitySystem +{ + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; + [Dependency] private readonly ActionBlockerSystem _blocker = default!; + [Dependency] private readonly AlertsSystem _alertsSystem = default!; + [Dependency] private readonly MovementSpeedModifierSystem _modifierSystem = default!; + [Dependency] private readonly SharedJointSystem _joints = default!; + [Dependency] private readonly SharedContainerSystem _containerSystem = default!; + [Dependency] private readonly SharedHandsSystem _handsSystem = default!; + [Dependency] private readonly SharedInteractionSystem _interaction = default!; + [Dependency] private readonly SharedPhysicsSystem _physics = default!; + [Dependency] private readonly SharedTransformSystem _xformSys = default!; + [Dependency] private readonly ThrowingSystem _throwing = default!; + + public override void Initialize() + { + base.Initialize(); + + UpdatesAfter.Add(typeof(SharedPhysicsSystem)); + UpdatesOutsidePrediction = true; + + SubscribeLocalEvent(OnPullableMoveInput); + SubscribeLocalEvent(OnPullableCollisionChange); + SubscribeLocalEvent(OnJointRemoved); + SubscribeLocalEvent>(AddPullVerbs); + SubscribeLocalEvent(OnPullableContainerInsert); + + SubscribeLocalEvent(OnPullerContainerInsert); + SubscribeLocalEvent(OnPullerUnpaused); + SubscribeLocalEvent(OnVirtualItemDeleted); + SubscribeLocalEvent(OnRefreshMovespeed); + + CommandBinds.Builder + .Bind(ContentKeyFunctions.MovePulledObject, new PointerInputCmdHandler(OnRequestMovePulledObject)) + .Bind(ContentKeyFunctions.ReleasePulledObject, InputCmdHandler.FromDelegate(OnReleasePulledObject, handle: false)) + .Register(); + } + + private void OnPullerContainerInsert(Entity ent, ref EntGotInsertedIntoContainerMessage args) + { + if (ent.Comp.Pulling == null) return; + + if (!TryComp(ent.Comp.Pulling.Value, out PullableComponent? pulling)) + return; + + TryStopPull(ent.Comp.Pulling.Value, pulling, ent.Owner); + } + + private void OnPullableContainerInsert(Entity ent, ref EntGotInsertedIntoContainerMessage args) + { + TryStopPull(ent.Owner, ent.Comp); + } + + public override void Shutdown() + { + base.Shutdown(); + CommandBinds.Unregister(); + } + + private void OnPullerUnpaused(EntityUid uid, PullerComponent component, ref EntityUnpausedEvent args) + { + component.NextThrow += args.PausedTime; + } + + private void OnVirtualItemDeleted(EntityUid uid, PullerComponent component, VirtualItemDeletedEvent args) + { + // If client deletes the virtual hand then stop the pull. + if (component.Pulling == null) + return; + + if (component.Pulling != args.BlockingEntity) + return; + + if (EntityManager.TryGetComponent(args.BlockingEntity, out PullableComponent? comp)) + { + TryStopPull(args.BlockingEntity, comp, uid); + } + } + + private void AddPullVerbs(EntityUid uid, PullableComponent component, GetVerbsEvent args) + { + if (!args.CanAccess || !args.CanInteract) + return; + + // Are they trying to pull themselves up by their bootstraps? + if (args.User == args.Target) + return; + + //TODO VERB ICONS add pulling icon + if (component.Puller == args.User) + { + Verb verb = new() + { + Text = Loc.GetString("pulling-verb-get-data-text-stop-pulling"), + Act = () => TryStopPull(uid, component, user: args.User), + DoContactInteraction = false // pulling handle its own contact interaction. + }; + args.Verbs.Add(verb); + } + else if (CanPull(args.User, args.Target)) + { + Verb verb = new() + { + Text = Loc.GetString("pulling-verb-get-data-text"), + Act = () => TryStartPull(args.User, args.Target), + DoContactInteraction = false // pulling handle its own contact interaction. + }; + args.Verbs.Add(verb); + } + } + + private void OnRefreshMovespeed(EntityUid uid, PullerComponent component, RefreshMovementSpeedModifiersEvent args) + { + args.ModifySpeed(component.WalkSpeedModifier, component.SprintSpeedModifier); + } + + private void OnPullableMoveInput(EntityUid uid, PullableComponent component, ref MoveInputEvent args) + { + // If someone moves then break their pulling. + if (!component.BeingPulled) + return; + + var entity = args.Entity; + + if (!_blocker.CanMove(entity)) + return; + + TryStopPull(uid, component, user: uid); + } + + private void OnPullableCollisionChange(EntityUid uid, PullableComponent component, ref CollisionChangeEvent args) + { + // IDK what this is supposed to be. + if (!_timing.ApplyingState && component.PullJointId != null && !args.CanCollide) + { + _joints.RemoveJoint(uid, component.PullJointId); + } + } + + private void OnJointRemoved(EntityUid uid, PullableComponent component, JointRemovedEvent args) + { + // Just handles the joint getting nuked without going through pulling system (valid behavior). + + // Not relevant / pullable state handle it. + if (component.Puller != args.OtherEntity || + args.Joint.ID != component.PullJointId || + _timing.ApplyingState) + { + return; + } + + if (args.Joint.ID != component.PullJointId || component.Puller == null) + return; + + StopPulling(uid, component); + } + + /// + /// Forces pulling to stop and handles cleanup. + /// + private void StopPulling(EntityUid pullableUid, PullableComponent pullableComp) + { + if (!_timing.ApplyingState) + { + if (TryComp(pullableUid, out var pullablePhysics)) + { + _physics.SetFixedRotation(pullableUid, pullableComp.PrevFixedRotation, body: pullablePhysics); + } + } + + // No more joints with puller -> force stop pull. + if (TryComp(pullableComp.Puller, out var pullerComp)) + { + var pullerUid = pullableComp.Puller.Value; + _alertsSystem.ClearAlert(pullerUid, AlertType.Pulling); + pullerComp.Pulling = null; + Dirty(pullableComp.Puller.Value, pullerComp); + + // Messaging + var message = new PullStoppedMessage(pullerUid, pullableUid); + _modifierSystem.RefreshMovementSpeedModifiers(pullerUid); + _adminLogger.Add(LogType.Action, LogImpact.Low, $"{ToPrettyString(pullerUid):user} stopped pulling {ToPrettyString(pullableUid):target}"); + + RaiseLocalEvent(pullerUid, message); + RaiseLocalEvent(pullableUid, message); + } + + pullableComp.PullJointId = null; + pullableComp.Puller = null; + Dirty(pullableUid, pullableComp); + + _alertsSystem.ClearAlert(pullableUid, AlertType.Pulled); + } + + public bool IsPulled(EntityUid uid, PullableComponent? component = null) + { + return Resolve(uid, ref component, false) && component.BeingPulled; + } + + private bool OnRequestMovePulledObject(ICommonSession? session, EntityCoordinates coords, EntityUid uid) + { + if (session?.AttachedEntity is not { } player || + !player.IsValid()) + { + return false; + } + + if (!TryComp(player, out var pullerComp)) + return false; + + var pulled = pullerComp.Pulling; + + if (!HasComp(pulled)) + return false; + + if (_containerSystem.IsEntityInContainer(player)) + return false; + + // Cooldown buddy + if (_timing.CurTime < pullerComp.NextThrow) + return false; + + pullerComp.NextThrow = _timing.CurTime + pullerComp.ThrowCooldown; + + // Cap the distance + const float range = 2f; + var fromUserCoords = coords.WithEntityId(player, EntityManager); + var userCoords = new EntityCoordinates(player, Vector2.Zero); + + if (!userCoords.InRange(EntityManager, _xformSys, fromUserCoords, range)) + { + var userDirection = fromUserCoords.Position - userCoords.Position; + fromUserCoords = userCoords.Offset(userDirection.Normalized() * range); + } + + Dirty(player, pullerComp); + _throwing.TryThrow(pulled.Value, fromUserCoords, user: player, strength: 4f, animated: false, recoil: false, playSound: false); + return false; + } + + public bool IsPulling(EntityUid puller, PullerComponent? component = null) + { + return Resolve(puller, ref component, false) && component.Pulling != null; + } + + private void OnReleasePulledObject(ICommonSession? session) + { + if (session?.AttachedEntity is not {Valid: true} player) + { + return; + } + + if (!TryComp(player, out PullerComponent? pullerComp) || + !TryComp(pullerComp.Pulling, out PullableComponent? pullableComp)) + { + return; + } + + TryStopPull(pullerComp.Pulling.Value, pullableComp, user: player); + } + + public bool CanPull(EntityUid puller, EntityUid pullableUid, PullerComponent? pullerComp = null) + { + if (!Resolve(puller, ref pullerComp, false)) + { + return false; + } + + if (pullerComp.NeedsHands && !_handsSystem.TryGetEmptyHand(puller, out _)) + { + return false; + } + + if (!_blocker.CanInteract(puller, pullableUid)) + { + return false; + } + + if (!EntityManager.TryGetComponent(pullableUid, out var physics)) + { + return false; + } + + if (physics.BodyType == BodyType.Static) + { + return false; + } + + if (puller == pullableUid) + { + return false; + } + + if (!_containerSystem.IsInSameOrNoContainer(puller, pullableUid)) + { + return false; + } + + if (EntityManager.TryGetComponent(puller, out BuckleComponent? buckle)) + { + // Prevent people pulling the chair they're on, etc. + if (buckle is { PullStrap: false, Buckled: true } && (buckle.LastEntityBuckledTo == pullableUid)) + { + return false; + } + } + + var getPulled = new BeingPulledAttemptEvent(puller, pullableUid); + RaiseLocalEvent(pullableUid, getPulled, true); + var startPull = new StartPullAttemptEvent(puller, pullableUid); + RaiseLocalEvent(puller, startPull, true); + return !startPull.Cancelled && !getPulled.Cancelled; + } + + public bool TogglePull(EntityUid pullableUid, EntityUid pullerUid, PullableComponent pullable) + { + if (pullable.Puller == pullerUid) + { + return TryStopPull(pullableUid, pullable); + } + + return TryStartPull(pullerUid, pullableUid, pullableComp: pullable); + } + + public bool TogglePull(EntityUid pullerUid, PullerComponent puller) + { + if (!TryComp(puller.Pulling, out var pullable)) + return false; + + return TogglePull(puller.Pulling.Value, pullerUid, pullable); + } + + public bool TryStartPull(EntityUid pullerUid, EntityUid pullableUid, EntityUid? user = null, + PullerComponent? pullerComp = null, PullableComponent? pullableComp = null) + { + if (!Resolve(pullerUid, ref pullerComp, false) || + !Resolve(pullableUid, ref pullableComp, false)) + { + return false; + } + + if (pullerComp.Pulling == pullableUid) + return true; + + if (!CanPull(pullerUid, pullableUid)) + return false; + + if (!EntityManager.TryGetComponent(pullerUid, out var pullerPhysics) || + !EntityManager.TryGetComponent(pullableUid, out var pullablePhysics)) + { + return false; + } + + // 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; + } + + // Is the pullable currently being pulled by something else? + if (pullableComp.Puller != null) + { + // Uhhh + if (pullableComp.Puller == pullerUid) + return false; + + if (!TryStopPull(pullableUid, pullableComp, pullerUid)) + return false; + } + + var pullAttempt = new PullAttemptEvent(pullerUid, pullableUid); + RaiseLocalEvent(pullerUid, pullAttempt); + + if (pullAttempt.Cancelled) + return false; + + RaiseLocalEvent(pullableUid, pullAttempt); + + if (pullAttempt.Cancelled) + return false; + + // Pulling confirmed + + _interaction.DoContactInteraction(pullableUid, pullerUid); + + // Use net entity so it's consistent across client and server. + pullableComp.PullJointId = $"pull-joint-{GetNetEntity(pullableUid)}"; + + pullerComp.Pulling = pullableUid; + pullableComp.Puller = pullerUid; + + // joint state handling will manage its own state + if (!_timing.ApplyingState) + { + // Joint startup + var union = _physics.GetHardAABB(pullerUid).Union(_physics.GetHardAABB(pullableUid, body: pullablePhysics)); + var length = Math.Max((float) union.Size.X, (float) union.Size.Y) * 0.75f; + + var joint = _joints.CreateDistanceJoint(pullableUid, pullerUid, id: pullableComp.PullJointId); + joint.CollideConnected = false; + // This maximum has to be there because if the object is constrained too closely, the clamping goes backwards and asserts. + joint.MaxLength = Math.Max(1.0f, length); + joint.Length = length * 0.75f; + joint.MinLength = 0f; + joint.Stiffness = 1f; + + _physics.SetFixedRotation(pullableUid, pullableComp.FixedRotationOnPull, body: pullablePhysics); + } + + pullableComp.PrevFixedRotation = pullablePhysics.FixedRotation; + + // Messaging + var message = new PullStartedMessage(pullerUid, pullableUid); + _alertsSystem.ShowAlert(pullerUid, AlertType.Pulling); + _alertsSystem.ShowAlert(pullableUid, AlertType.Pulled); + + RaiseLocalEvent(pullerUid, message); + RaiseLocalEvent(pullableUid, message); + + Dirty(pullerUid, pullerComp); + Dirty(pullableUid, pullableComp); + + _adminLogger.Add(LogType.Action, LogImpact.Low, + $"{ToPrettyString(pullerUid):user} started pulling {ToPrettyString(pullableUid):target}"); + return true; + } + + public bool TryStopPull(EntityUid pullableUid, PullableComponent pullable, EntityUid? user = null) + { + var pullerUidNull = pullable.Puller; + + if (pullerUidNull == null) + return false; + + var msg = new AttemptStopPullingEvent(user); + RaiseLocalEvent(pullableUid, msg, true); + + if (msg.Cancelled) + return false; + + // Stop pulling confirmed! + if (!_timing.ApplyingState) + { + // Joint shutdown + if (pullable.PullJointId != null) + { + _joints.RemoveJoint(pullableUid, pullable.PullJointId); + pullable.PullJointId = null; + } + } + + StopPulling(pullableUid, pullable); + return true; + } +} diff --git a/Content.Shared/Movement/Systems/SharedMoverController.cs b/Content.Shared/Movement/Systems/SharedMoverController.cs index 4d9eedbf7c4..ba640408dca 100644 --- a/Content.Shared/Movement/Systems/SharedMoverController.cs +++ b/Content.Shared/Movement/Systems/SharedMoverController.cs @@ -9,7 +9,7 @@ using Content.Shared.Mobs.Systems; using Content.Shared.Movement.Components; using Content.Shared.Movement.Events; -using Content.Shared.Pulling.Components; +using Content.Shared.StepTrigger.Components; using Content.Shared.Tag; using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; @@ -23,7 +23,7 @@ using Robust.Shared.Physics.Systems; using Robust.Shared.Timing; using Robust.Shared.Utility; -using Content.Shared.StepTrigger.Components; // Delta V-NoShoesSilentFootstepsComponent +using PullableComponent = Content.Shared.Movement.Pulling.Components.PullableComponent; namespace Content.Shared.Movement.Systems { @@ -55,7 +55,7 @@ public abstract partial class SharedMoverController : VirtualController protected EntityQuery ModifierQuery; protected EntityQuery PhysicsQuery; protected EntityQuery RelayQuery; - protected EntityQuery PullableQuery; + protected EntityQuery PullableQuery; protected EntityQuery XformQuery; protected EntityQuery CanMoveInAirQuery; protected EntityQuery NoRotateQuery; @@ -87,7 +87,7 @@ public override void Initialize() RelayTargetQuery = GetEntityQuery(); PhysicsQuery = GetEntityQuery(); RelayQuery = GetEntityQuery(); - PullableQuery = GetEntityQuery(); + PullableQuery = GetEntityQuery(); XformQuery = GetEntityQuery(); NoRotateQuery = GetEntityQuery(); CanMoveInAirQuery = GetEntityQuery(); @@ -378,7 +378,7 @@ private bool IsAroundCollider(SharedPhysicsSystem broadPhaseSystem, TransformCom !otherCollider.CanCollide || ((collider.CollisionMask & otherCollider.CollisionLayer) == 0 && (otherCollider.CollisionMask & collider.CollisionLayer) == 0) || - (TryComp(otherCollider.Owner, out SharedPullableComponent? pullable) && pullable.BeingPulled)) + (TryComp(otherCollider.Owner, out PullableComponent? pullable) && pullable.BeingPulled)) { continue; } @@ -440,7 +440,7 @@ private bool TryGetSound( sound = moverModifier.FootstepSoundCollection; return true; } - + // If got the component in yml and no shoes = no sound. Delta V if (_entities.TryGetComponent(uid, out NoShoesSilentFootstepsComponent? _) & !_inventory.TryGetSlotEntity(uid, "shoes", out var _)) diff --git a/Content.Shared/Pulling/Components/PullableComponent.cs b/Content.Shared/Pulling/Components/PullableComponent.cs deleted file mode 100644 index c5c30688699..00000000000 --- a/Content.Shared/Pulling/Components/PullableComponent.cs +++ /dev/null @@ -1,57 +0,0 @@ -using Robust.Shared.GameStates; -using Robust.Shared.Map; -using Robust.Shared.Serialization; - -namespace Content.Shared.Pulling.Components -{ - // Before you try to add another type than SharedPullingStateManagementSystem, consider the can of worms you may be opening! - [NetworkedComponent, AutoGenerateComponentState] - [Access(typeof(SharedPullingStateManagementSystem))] - [RegisterComponent] - public sealed partial class SharedPullableComponent : Component - { - /// - /// The current entity pulling this component. - /// - [DataField, AutoNetworkedField] - public EntityUid? Puller { get; set; } - - /// - /// The pull joint. - /// - [DataField, AutoNetworkedField] - public string? PullJointId { get; set; } - - public bool BeingPulled => Puller != null; - - [Access(typeof(SharedPullingStateManagementSystem), Other = AccessPermissions.ReadExecute)] // FIXME Friends - public EntityCoordinates? MovingTo { get; set; } - - /// - /// If the physics component has FixedRotation should we keep it upon being pulled - /// - [Access(typeof(SharedPullingSystem), Other = AccessPermissions.ReadExecute)] - [ViewVariables(VVAccess.ReadWrite), DataField("fixedRotation")] - public bool FixedRotationOnPull { get; set; } - - /// - /// What the pullable's fixedrotation was set to before being pulled. - /// - [Access(typeof(SharedPullingSystem), Other = AccessPermissions.ReadExecute)] - [ViewVariables] - public bool PrevFixedRotation; - } - - /// - /// Raised when a request is made to stop pulling an entity. - /// - public sealed class StopPullingEvent : CancellableEntityEventArgs - { - public EntityUid? User { get; } - - public StopPullingEvent(EntityUid? uid = null) - { - User = uid; - } - } -} diff --git a/Content.Shared/Pulling/Components/SharedPullerComponent.cs b/Content.Shared/Pulling/Components/SharedPullerComponent.cs deleted file mode 100644 index 57a86e7f7a8..00000000000 --- a/Content.Shared/Pulling/Components/SharedPullerComponent.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Robust.Shared.GameStates; - -namespace Content.Shared.Pulling.Components -{ - [RegisterComponent, NetworkedComponent, AutoGenerateComponentState] - [Access(typeof(SharedPullingStateManagementSystem))] - public sealed partial class SharedPullerComponent : Component - { - // Before changing how this is updated, please see SharedPullerSystem.RefreshMovementSpeed - public float WalkSpeedModifier => Pulling == default ? 1.0f : 0.95f; - - public float SprintSpeedModifier => Pulling == default ? 1.0f : 0.95f; - - [DataField, AutoNetworkedField] - public EntityUid? Pulling { get; set; } - - /// - /// Does this entity need hands to be able to pull something? - /// - [DataField("needsHands")] - public bool NeedsHands = true; - } -} diff --git a/Content.Shared/Pulling/Events/PullAttemptEvent.cs b/Content.Shared/Pulling/Events/PullAttemptEvent.cs deleted file mode 100644 index 6296dc2f14f..00000000000 --- a/Content.Shared/Pulling/Events/PullAttemptEvent.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Robust.Shared.Physics.Components; - -namespace Content.Shared.Physics.Pull -{ - public sealed class PullAttemptEvent : PullMessage - { - public PullAttemptEvent(PhysicsComponent puller, PhysicsComponent pulled) : base(puller, pulled) { } - - public bool Cancelled { get; set; } - } -} diff --git a/Content.Shared/Pulling/Events/PullMessage.cs b/Content.Shared/Pulling/Events/PullMessage.cs deleted file mode 100644 index b11de7c1702..00000000000 --- a/Content.Shared/Pulling/Events/PullMessage.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Robust.Shared.Physics.Components; - -namespace Content.Shared.Physics.Pull -{ - public abstract class PullMessage : EntityEventArgs - { - public readonly PhysicsComponent Puller; - public readonly PhysicsComponent Pulled; - - protected PullMessage(PhysicsComponent puller, PhysicsComponent pulled) - { - Puller = puller; - Pulled = pulled; - } - } -} diff --git a/Content.Shared/Pulling/Events/PullStartedMessage.cs b/Content.Shared/Pulling/Events/PullStartedMessage.cs deleted file mode 100644 index 0ede284bb0c..00000000000 --- a/Content.Shared/Pulling/Events/PullStartedMessage.cs +++ /dev/null @@ -1,12 +0,0 @@ -using Robust.Shared.Physics.Components; - -namespace Content.Shared.Physics.Pull -{ - public sealed class PullStartedMessage : PullMessage - { - public PullStartedMessage(PhysicsComponent puller, PhysicsComponent pulled) : - base(puller, pulled) - { - } - } -} diff --git a/Content.Shared/Pulling/Events/PullStoppedMessage.cs b/Content.Shared/Pulling/Events/PullStoppedMessage.cs deleted file mode 100644 index afcbcb70740..00000000000 --- a/Content.Shared/Pulling/Events/PullStoppedMessage.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Robust.Shared.Physics.Components; - -namespace Content.Shared.Physics.Pull -{ - public sealed class PullStoppedMessage : PullMessage - { - public PullStoppedMessage(PhysicsComponent puller, PhysicsComponent pulled) : base(puller, pulled) - { - } - } -} diff --git a/Content.Shared/Pulling/PullableMoveMessage.cs b/Content.Shared/Pulling/PullableMoveMessage.cs deleted file mode 100644 index 46c6b1291d6..00000000000 --- a/Content.Shared/Pulling/PullableMoveMessage.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Content.Shared.Pulling -{ - public sealed class PullableMoveMessage : EntityEventArgs - { - } -} diff --git a/Content.Shared/Pulling/PullableStopMovingMessage.cs b/Content.Shared/Pulling/PullableStopMovingMessage.cs deleted file mode 100644 index 0233e32f2b4..00000000000 --- a/Content.Shared/Pulling/PullableStopMovingMessage.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Content.Shared.Pulling -{ - public sealed class PullableStopMovingMessage : EntityEventArgs - { - } -} diff --git a/Content.Shared/Pulling/Systems/SharedPullableSystem.cs b/Content.Shared/Pulling/Systems/SharedPullableSystem.cs deleted file mode 100644 index 3dab476337b..00000000000 --- a/Content.Shared/Pulling/Systems/SharedPullableSystem.cs +++ /dev/null @@ -1,28 +0,0 @@ -using Content.Shared.ActionBlocker; -using Content.Shared.Mobs.Systems; -using Content.Shared.Pulling.Components; -using Content.Shared.Movement.Events; - -namespace Content.Shared.Pulling.Systems -{ - public sealed class SharedPullableSystem : EntitySystem - { - [Dependency] private readonly ActionBlockerSystem _blocker = default!; - [Dependency] private readonly MobStateSystem _mobState = default!; - [Dependency] private readonly SharedPullingSystem _pullSystem = default!; - - public override void Initialize() - { - base.Initialize(); - SubscribeLocalEvent(OnRelayMoveInput); - } - - private void OnRelayMoveInput(EntityUid uid, SharedPullableComponent component, ref MoveInputEvent args) - { - var entity = args.Entity; - if (_mobState.IsIncapacitated(entity) || !_blocker.CanMove(entity)) return; - - _pullSystem.TryStopPull(component); - } - } -} diff --git a/Content.Shared/Pulling/Systems/SharedPullerSystem.cs b/Content.Shared/Pulling/Systems/SharedPullerSystem.cs deleted file mode 100644 index e388d7a57c6..00000000000 --- a/Content.Shared/Pulling/Systems/SharedPullerSystem.cs +++ /dev/null @@ -1,90 +0,0 @@ -using Content.Shared.Administration.Logs; -using Content.Shared.Alert; -using Content.Shared.Database; -using Content.Shared.Hands; -using Content.Shared.Movement.Systems; -using Content.Shared.Physics.Pull; -using Content.Shared.Pulling.Components; -using JetBrains.Annotations; - -namespace Content.Shared.Pulling.Systems -{ - [UsedImplicitly] - public sealed class SharedPullerSystem : EntitySystem - { - [Dependency] private readonly SharedPullingStateManagementSystem _why = default!; - [Dependency] private readonly SharedPullingSystem _pullSystem = default!; - [Dependency] private readonly MovementSpeedModifierSystem _movementSpeedModifierSystem = default!; - [Dependency] private readonly AlertsSystem _alertsSystem = default!; - [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; - - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(PullerHandlePullStarted); - SubscribeLocalEvent(PullerHandlePullStopped); - SubscribeLocalEvent(OnVirtualItemDeleted); - SubscribeLocalEvent(OnRefreshMovespeed); - SubscribeLocalEvent(OnPullerShutdown); - } - - private void OnPullerShutdown(EntityUid uid, SharedPullerComponent component, ComponentShutdown args) - { - _why.ForceDisconnectPuller(component); - } - - private void OnVirtualItemDeleted(EntityUid uid, SharedPullerComponent component, VirtualItemDeletedEvent args) - { - if (component.Pulling == null) - return; - - if (component.Pulling == args.BlockingEntity) - { - if (EntityManager.TryGetComponent(args.BlockingEntity, out var comp)) - { - _pullSystem.TryStopPull(comp, uid); - } - } - } - - private void PullerHandlePullStarted( - EntityUid uid, - SharedPullerComponent component, - PullStartedMessage args) - { - if (args.Puller.Owner != uid) - return; - - _alertsSystem.ShowAlert(component.Owner, AlertType.Pulling); - - RefreshMovementSpeed(component); - } - - private void PullerHandlePullStopped( - EntityUid uid, - SharedPullerComponent component, - PullStoppedMessage args) - { - if (args.Puller.Owner != uid) - return; - - var euid = component.Owner; - if (_alertsSystem.IsShowingAlert(euid, AlertType.Pulling)) - _adminLogger.Add(LogType.Action, LogImpact.Low, $"{ToPrettyString(euid):user} stopped pulling {ToPrettyString(args.Pulled.Owner):target}"); - _alertsSystem.ClearAlert(euid, AlertType.Pulling); - - RefreshMovementSpeed(component); - } - - private void OnRefreshMovespeed(EntityUid uid, SharedPullerComponent component, RefreshMovementSpeedModifiersEvent args) - { - args.ModifySpeed(component.WalkSpeedModifier, component.SprintSpeedModifier); - } - - private void RefreshMovementSpeed(SharedPullerComponent component) - { - _movementSpeedModifierSystem.RefreshMovementSpeedModifiers(component.Owner); - } - } -} diff --git a/Content.Shared/Pulling/Systems/SharedPullingStateManagementSystem.cs b/Content.Shared/Pulling/Systems/SharedPullingStateManagementSystem.cs deleted file mode 100644 index 38ed8998898..00000000000 --- a/Content.Shared/Pulling/Systems/SharedPullingStateManagementSystem.cs +++ /dev/null @@ -1,196 +0,0 @@ -using Content.Shared.Physics.Pull; -using Content.Shared.Pulling.Components; -using JetBrains.Annotations; -using Robust.Shared.Map; -using Robust.Shared.Physics; -using Robust.Shared.Physics.Components; -using Robust.Shared.Physics.Systems; -using Robust.Shared.Timing; - -namespace Content.Shared.Pulling -{ - /// - /// This is the core of pulling state management. - /// Because pulling state is such a mess to get right, all writes to pulling state must go through this class. - /// - [UsedImplicitly] - public sealed class SharedPullingStateManagementSystem : EntitySystem - { - [Dependency] private readonly SharedJointSystem _jointSystem = default!; - [Dependency] private readonly SharedPhysicsSystem _physics = default!; - [Dependency] private readonly IGameTiming _timing = default!; - - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(OnShutdown); - } - - private void OnShutdown(EntityUid uid, SharedPullableComponent component, ComponentShutdown args) - { - if (component.Puller != null) - ForceRelationship(null, component); - } - - // A WARNING: - // The following 2 functions are the most internal part of the pulling system's relationship management. - // They do not expect to be cancellable. - private void ForceDisconnect(SharedPullerComponent puller, SharedPullableComponent pullable) - { - var pullerPhysics = EntityManager.GetComponent(puller.Owner); - var pullablePhysics = EntityManager.GetComponent(pullable.Owner); - - // MovingTo shutdown - ForceSetMovingTo(pullable, null); - - // Joint shutdown - if (!_timing.ApplyingState && // During state-handling, joint component will handle its own state. - pullable.PullJointId != null && - TryComp(puller.Owner, out JointComponent? jointComp)) - { - if (jointComp.GetJoints.TryGetValue(pullable.PullJointId, out var j)) - _jointSystem.RemoveJoint(j); - } - pullable.PullJointId = null; - - // State shutdown - puller.Pulling = null; - pullable.Puller = null; - - // Messaging - var message = new PullStoppedMessage(pullerPhysics, pullablePhysics); - - RaiseLocalEvent(puller.Owner, message, broadcast: false); - - if (Initialized(pullable.Owner)) - RaiseLocalEvent(pullable.Owner, message, true); - - // Networking - Dirty(puller); - Dirty(pullable); - } - - public void ForceRelationship(SharedPullerComponent? puller, SharedPullableComponent? pullable) - { - if (_timing.ApplyingState) - return; - ; - if (pullable != null && puller != null && (puller.Pulling == pullable.Owner)) - { - // Already done - return; - } - - // Start by disconnecting the pullable from whatever it is currently connected to. - var pullableOldPullerE = pullable?.Puller; - if (pullableOldPullerE != null) - { - ForceDisconnect(EntityManager.GetComponent(pullableOldPullerE.Value), pullable!); - } - - // Continue with the puller. - var pullerOldPullableE = puller?.Pulling; - if (pullerOldPullableE != null) - { - ForceDisconnect(puller!, EntityManager.GetComponent(pullerOldPullableE.Value)); - } - - // And now for the actual connection (if any). - - if (puller != null && pullable != null) - { - var pullerPhysics = EntityManager.GetComponent(puller.Owner); - var pullablePhysics = EntityManager.GetComponent(pullable.Owner); - pullable.PullJointId = $"pull-joint-{pullable.Owner}"; - - // State startup - puller.Pulling = pullable.Owner; - pullable.Puller = puller.Owner; - - // joint state handling will manage its own state - if (!_timing.ApplyingState) - { - // Joint startup - var union = _physics.GetHardAABB(puller.Owner).Union(_physics.GetHardAABB(pullable.Owner, body: pullablePhysics)); - var length = Math.Max(union.Size.X, union.Size.Y) * 0.75f; - - var joint = _jointSystem.CreateDistanceJoint(pullablePhysics.Owner, pullerPhysics.Owner, id: pullable.PullJointId); - joint.CollideConnected = false; - // This maximum has to be there because if the object is constrained too closely, the clamping goes backwards and asserts. - joint.MaxLength = Math.Max(1.0f, length); - joint.Length = length * 0.75f; - joint.MinLength = 0f; - joint.Stiffness = 1f; - } - - // Messaging - var message = new PullStartedMessage(pullerPhysics, pullablePhysics); - - RaiseLocalEvent(puller.Owner, message, broadcast: false); - RaiseLocalEvent(pullable.Owner, message, true); - - // Networking - Dirty(puller); - Dirty(pullable); - } - } - - // For OnRemove use only. - public void ForceDisconnectPuller(SharedPullerComponent puller) - { - // DO NOT ADD ADDITIONAL LOGIC IN THIS FUNCTION. Do it in ForceRelationship. - ForceRelationship(puller, null); - } - - // For OnRemove use only. - public void ForceDisconnectPullable(SharedPullableComponent pullable) - { - // DO NOT ADD ADDITIONAL LOGIC IN THIS FUNCTION. Do it in ForceRelationship. - ForceRelationship(null, pullable); - } - - public void ForceSetMovingTo(SharedPullableComponent pullable, EntityCoordinates? movingTo) - { - if (_timing.ApplyingState) - return; - - if (pullable.MovingTo == movingTo) - { - return; - } - - // Don't allow setting a MovingTo if there's no puller. - // The other half of this guarantee (shutting down a MovingTo if the puller goes away) is enforced in ForceRelationship. - if (pullable.Puller == null && movingTo != null) - { - return; - } - - pullable.MovingTo = movingTo; - Dirty(pullable); - - if (movingTo == null) - { - RaiseLocalEvent(pullable.Owner, new PullableStopMovingMessage(), true); - } - else - { - RaiseLocalEvent(pullable.Owner, new PullableMoveMessage(), true); - } - } - - /// - /// Changes if the entity needs a hand in order to be able to pull objects. - /// - public void ChangeHandRequirement(EntityUid uid, bool needsHands, SharedPullerComponent? comp) - { - if (!Resolve(uid, ref comp, false)) - return; - - comp.NeedsHands = needsHands; - - Dirty(uid, comp); - } - } -} diff --git a/Content.Shared/Pulling/Systems/SharedPullingSystem.Actions.cs b/Content.Shared/Pulling/Systems/SharedPullingSystem.Actions.cs deleted file mode 100644 index 1e2bb90c61e..00000000000 --- a/Content.Shared/Pulling/Systems/SharedPullingSystem.Actions.cs +++ /dev/null @@ -1,239 +0,0 @@ -using Content.Shared.ActionBlocker; -using Content.Shared.Administration.Logs; -using Content.Shared.Buckle.Components; -using Content.Shared.Database; -using Content.Shared.Hands.EntitySystems; -using Content.Shared.Interaction; -using Content.Shared.Physics.Pull; -using Content.Shared.Pulling.Components; -using Content.Shared.Pulling.Events; -using Robust.Shared.Containers; -using Robust.Shared.Map; -using Robust.Shared.Physics; -using Robust.Shared.Physics.Components; -using Robust.Shared.Physics.Systems; -using Robust.Shared.Timing; -using Robust.Shared.Utility; - -namespace Content.Shared.Pulling -{ - public abstract partial class SharedPullingSystem - { - [Dependency] private readonly ActionBlockerSystem _blocker = default!; - [Dependency] private readonly SharedContainerSystem _containerSystem = default!; - [Dependency] private readonly SharedHandsSystem _handsSystem = default!; - [Dependency] private readonly SharedInteractionSystem _interaction = default!; - [Dependency] private readonly SharedPhysicsSystem _physics = default!; - [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; - [Dependency] private readonly IGameTiming _timing = default!; - - public bool CanPull(EntityUid puller, EntityUid pulled) - { - if (!EntityManager.TryGetComponent(puller, out var comp)) - { - return false; - } - - if (comp.NeedsHands && !_handsSystem.TryGetEmptyHand(puller, out _)) - { - return false; - } - - if (!_blocker.CanInteract(puller, pulled)) - { - return false; - } - - if (!EntityManager.TryGetComponent(pulled, out var physics)) - { - return false; - } - - if (physics.BodyType == BodyType.Static) - { - return false; - } - - if (puller == pulled) - { - return false; - } - - if(_containerSystem.IsEntityInContainer(puller) || _containerSystem.IsEntityInContainer(pulled)) - { - return false; - } - - if (EntityManager.TryGetComponent(puller, out BuckleComponent? buckle)) - { - // Prevent people pulling the chair they're on, etc. - if (buckle is { PullStrap: false, Buckled: true } && (buckle.LastEntityBuckledTo == pulled)) - { - return false; - } - } - - var getPulled = new BeingPulledAttemptEvent(puller, pulled); - RaiseLocalEvent(pulled, getPulled, true); - var startPull = new StartPullAttemptEvent(puller, pulled); - RaiseLocalEvent(puller, startPull, true); - return (!startPull.Cancelled && !getPulled.Cancelled); - } - - public bool TogglePull(EntityUid puller, SharedPullableComponent pullable) - { - if (pullable.Puller == puller) - { - return TryStopPull(pullable); - } - return TryStartPull(puller, pullable.Owner); - } - - // -- Core attempted actions -- - - public bool TryStopPull(SharedPullableComponent pullable, EntityUid? user = null) - { - if (_timing.ApplyingState) - return false; - - if (!pullable.BeingPulled) - { - return false; - } - - var msg = new StopPullingEvent(user); - RaiseLocalEvent(pullable.Owner, msg, true); - - if (msg.Cancelled) return false; - - // Stop pulling confirmed! - - if (TryComp(pullable.Owner, out var pullablePhysics)) - { - _physics.SetFixedRotation(pullable.Owner, pullable.PrevFixedRotation, body: pullablePhysics); - } - - _pullSm.ForceRelationship(null, pullable); - return true; - } - - public bool TryStartPull(EntityUid puller, EntityUid pullable) - { - if (!EntityManager.TryGetComponent(puller, out SharedPullerComponent? pullerComp)) - { - return false; - } - if (!EntityManager.TryGetComponent(pullable, out SharedPullableComponent? pullableComp)) - { - return false; - } - return TryStartPull(pullerComp, pullableComp); - } - - // The main "start pulling" function. - public bool TryStartPull(SharedPullerComponent puller, SharedPullableComponent pullable) - { - if (_timing.ApplyingState) - return false; - - if (puller.Pulling == pullable.Owner) - return true; - - // Pulling a new object : Perform sanity checks. - - if (!CanPull(puller.Owner, pullable.Owner)) - { - return false; - } - - if (!EntityManager.TryGetComponent(puller.Owner, out var pullerPhysics)) - { - return false; - } - - if (!EntityManager.TryGetComponent(pullable.Owner, out var pullablePhysics)) - { - return false; - } - - // Ensure that the puller is not currently pulling anything. - // If this isn't done, then it happens too late, and the start/stop messages go out of order, - // and next thing you know it thinks it's not pulling anything even though it is! - - var oldPullable = puller.Pulling; - if (oldPullable != null) - { - if (EntityManager.TryGetComponent(oldPullable.Value, out SharedPullableComponent? oldPullableComp)) - { - if (!TryStopPull(oldPullableComp)) - { - return false; - } - } - else - { - Log.Warning("Well now you've done it, haven't you? Someone transferred pulling (onto {0}) while presently pulling something that has no Pullable component (on {1})!", pullable.Owner, oldPullable); - return false; - } - } - - // Ensure that the pullable is not currently being pulled. - // Same sort of reasons as before. - - var oldPuller = pullable.Puller; - if (oldPuller != null) - { - if (!TryStopPull(pullable)) - { - return false; - } - } - - // Continue with pulling process. - - var pullAttempt = new PullAttemptEvent(pullerPhysics, pullablePhysics); - - RaiseLocalEvent(puller.Owner, pullAttempt, broadcast: false); - - if (pullAttempt.Cancelled) - { - return false; - } - - RaiseLocalEvent(pullable.Owner, pullAttempt, true); - - if (pullAttempt.Cancelled) - return false; - - _interaction.DoContactInteraction(pullable.Owner, puller.Owner); - - _pullSm.ForceRelationship(puller, pullable); - pullable.PrevFixedRotation = pullablePhysics.FixedRotation; - _physics.SetFixedRotation(pullable.Owner, pullable.FixedRotationOnPull, body: pullablePhysics); - _adminLogger.Add(LogType.Action, LogImpact.Low, - $"{ToPrettyString(puller.Owner):user} started pulling {ToPrettyString(pullable.Owner):target}"); - return true; - } - - public bool TryMoveTo(SharedPullableComponent pullable, EntityCoordinates to) - { - if (pullable.Puller == null) - { - return false; - } - - if (!EntityManager.HasComponent(pullable.Owner)) - { - return false; - } - - _pullSm.ForceSetMovingTo(pullable, to); - return true; - } - - public void StopMoveTo(SharedPullableComponent pullable) - { - _pullSm.ForceSetMovingTo(pullable, null); - } - } -} diff --git a/Content.Shared/Pulling/Systems/SharedPullingSystem.cs b/Content.Shared/Pulling/Systems/SharedPullingSystem.cs deleted file mode 100644 index 0c139ee9e35..00000000000 --- a/Content.Shared/Pulling/Systems/SharedPullingSystem.cs +++ /dev/null @@ -1,243 +0,0 @@ -using System.Diagnostics.CodeAnalysis; -using Content.Shared.Alert; -using Content.Shared.GameTicking; -using Content.Shared.Input; -using Content.Shared.Physics.Pull; -using Content.Shared.Pulling.Components; -using Content.Shared.Verbs; -using JetBrains.Annotations; -using Robust.Shared.Containers; -using Robust.Shared.Input.Binding; -using Robust.Shared.Map; -using Robust.Shared.Physics; -using Robust.Shared.Physics.Events; -using Robust.Shared.Physics.Systems; -using Robust.Shared.Player; - -namespace Content.Shared.Pulling -{ - [UsedImplicitly] - public abstract partial class SharedPullingSystem : EntitySystem - { - [Dependency] private readonly SharedPullingStateManagementSystem _pullSm = default!; - [Dependency] private readonly AlertsSystem _alertsSystem = default!; - [Dependency] private readonly SharedJointSystem _joints = default!; - - /// - /// A mapping of pullers to the entity that they are pulling. - /// - private readonly Dictionary _pullers = - new(); - - private readonly HashSet _moving = new(); - private readonly HashSet _stoppedMoving = new(); - - public IReadOnlySet Moving => _moving; - - public override void Initialize() - { - base.Initialize(); - - UpdatesOutsidePrediction = true; - - SubscribeLocalEvent(Reset); - SubscribeLocalEvent(OnPullStarted); - SubscribeLocalEvent(OnPullStopped); - SubscribeLocalEvent(HandleContainerInsert); - SubscribeLocalEvent(OnJointRemoved); - SubscribeLocalEvent(OnPullableCollisionChange); - - SubscribeLocalEvent(PullableHandlePullStarted); - SubscribeLocalEvent(PullableHandlePullStopped); - - SubscribeLocalEvent>(AddPullVerbs); - - CommandBinds.Builder - .Bind(ContentKeyFunctions.MovePulledObject, new PointerInputCmdHandler(HandleMovePulledObject)) - .Register(); - } - - private void OnPullableCollisionChange(EntityUid uid, SharedPullableComponent component, ref CollisionChangeEvent args) - { - if (component.PullJointId != null && !args.CanCollide) - { - _joints.RemoveJoint(uid, component.PullJointId); - } - } - - private void OnJointRemoved(EntityUid uid, SharedPullableComponent component, JointRemovedEvent args) - { - if (component.Puller != args.OtherEntity) - return; - - // Do we have some other join with our Puller? - // or alternatively: - // TODO track the relevant joint. - - if (TryComp(uid, out JointComponent? joints)) - { - foreach (var jt in joints.GetJoints.Values) - { - if (jt.BodyAUid == component.Puller || jt.BodyBUid == component.Puller) - return; - } - } - - // No more joints with puller -> force stop pull. - _pullSm.ForceDisconnectPullable(component); - } - - private void AddPullVerbs(EntityUid uid, SharedPullableComponent component, GetVerbsEvent args) - { - if (!args.CanAccess || !args.CanInteract) - return; - - // Are they trying to pull themselves up by their bootstraps? - if (args.User == args.Target) - return; - - //TODO VERB ICONS add pulling icon - if (component.Puller == args.User) - { - Verb verb = new() - { - Text = Loc.GetString("pulling-verb-get-data-text-stop-pulling"), - Act = () => TryStopPull(component, args.User), - DoContactInteraction = false // pulling handle its own contact interaction. - }; - args.Verbs.Add(verb); - } - else if (CanPull(args.User, args.Target)) - { - Verb verb = new() - { - Text = Loc.GetString("pulling-verb-get-data-text"), - Act = () => TryStartPull(args.User, args.Target), - DoContactInteraction = false // pulling handle its own contact interaction. - }; - args.Verbs.Add(verb); - } - } - - // Raise a "you are being pulled" alert if the pulled entity has alerts. - private void PullableHandlePullStarted(EntityUid uid, SharedPullableComponent component, PullStartedMessage args) - { - if (args.Pulled.Owner != uid) - return; - - _alertsSystem.ShowAlert(uid, AlertType.Pulled); - } - - private void PullableHandlePullStopped(EntityUid uid, SharedPullableComponent component, PullStoppedMessage args) - { - if (args.Pulled.Owner != uid) - return; - - _alertsSystem.ClearAlert(uid, AlertType.Pulled); - } - - public bool IsPulled(EntityUid uid, SharedPullableComponent? component = null) - { - return Resolve(uid, ref component, false) && component.BeingPulled; - } - - public override void Update(float frameTime) - { - base.Update(frameTime); - - _moving.ExceptWith(_stoppedMoving); - _stoppedMoving.Clear(); - } - - public void Reset(RoundRestartCleanupEvent ev) - { - _pullers.Clear(); - _moving.Clear(); - _stoppedMoving.Clear(); - } - - private void OnPullStarted(PullStartedMessage message) - { - SetPuller(message.Puller.Owner, message.Pulled.Owner); - } - - private void OnPullStopped(PullStoppedMessage message) - { - RemovePuller(message.Puller.Owner); - } - - protected void OnPullableMove(EntityUid uid, SharedPullableComponent component, PullableMoveMessage args) - { - _moving.Add(component); - } - - protected void OnPullableStopMove(EntityUid uid, SharedPullableComponent component, PullableStopMovingMessage args) - { - _stoppedMoving.Add(component); - } - - // TODO: When Joint networking is less shitcodey fix this to use a dedicated joints message. - private void HandleContainerInsert(EntInsertedIntoContainerMessage message) - { - if (TryComp(message.Entity, out SharedPullableComponent? pullable)) - { - TryStopPull(pullable); - } - - if (TryComp(message.Entity, out SharedPullerComponent? puller)) - { - if (puller.Pulling == null) return; - - if (!TryComp(puller.Pulling.Value, out SharedPullableComponent? pulling)) - return; - - TryStopPull(pulling); - } - } - - private bool HandleMovePulledObject(ICommonSession? session, EntityCoordinates coords, EntityUid uid) - { - if (session?.AttachedEntity is not { } player || - !player.IsValid()) - return false; - - if (!TryGetPulled(player, out var pulled)) - return false; - - if (!TryComp(pulled.Value, out SharedPullableComponent? pullable)) - return false; - - if (_containerSystem.IsEntityInContainer(player)) - return false; - - TryMoveTo(pullable, coords); - - return false; - } - - private void SetPuller(EntityUid puller, EntityUid pulled) - { - _pullers[puller] = pulled; - } - - private bool RemovePuller(EntityUid puller) - { - return _pullers.Remove(puller); - } - - public EntityUid GetPulled(EntityUid by) - { - return _pullers.GetValueOrDefault(by); - } - - public bool TryGetPulled(EntityUid by, [NotNullWhen(true)] out EntityUid? pulled) - { - return (pulled = GetPulled(by)) != null; - } - - public bool IsPulling(EntityUid puller) - { - return _pullers.ContainsKey(puller); - } - } -} diff --git a/Content.Shared/Security/Systems/DeployableBarrierSystem.cs b/Content.Shared/Security/Systems/DeployableBarrierSystem.cs index 7b9ce841a99..622edc4b62e 100644 --- a/Content.Shared/Security/Systems/DeployableBarrierSystem.cs +++ b/Content.Shared/Security/Systems/DeployableBarrierSystem.cs @@ -1,6 +1,6 @@ using Content.Shared.Lock; -using Content.Shared.Pulling; -using Content.Shared.Pulling.Components; +using Content.Shared.Movement.Pulling.Components; +using Content.Shared.Movement.Pulling.Systems; using Content.Shared.Security.Components; using Robust.Shared.Physics.Systems; @@ -11,7 +11,7 @@ public sealed class DeployableBarrierSystem : EntitySystem [Dependency] private readonly FixtureSystem _fixtures = default!; [Dependency] private readonly SharedPointLightSystem _pointLight = default!; [Dependency] private readonly SharedPhysicsSystem _physics = default!; - [Dependency] private readonly SharedPullingSystem _pulling = default!; + [Dependency] private readonly PullingSystem _pulling = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; public override void Initialize() @@ -54,8 +54,8 @@ private void ToggleBarrierDeploy(EntityUid uid, bool isDeployed, DeployableBarri _physics.SetHard(uid, fixture, false); } - if (TryComp(uid, out SharedPullableComponent? pullable)) - _pulling.TryStopPull(pullable); + if (TryComp(uid, out PullableComponent? pullable)) + _pulling.TryStopPull(uid, pullable); SharedPointLightComponent? pointLight = null; if (_pointLight.ResolveLight(uid, ref pointLight)) diff --git a/Content.Shared/Teleportation/Systems/SharedPortalSystem.cs b/Content.Shared/Teleportation/Systems/SharedPortalSystem.cs index ebd83624114..8d67aec518a 100644 --- a/Content.Shared/Teleportation/Systems/SharedPortalSystem.cs +++ b/Content.Shared/Teleportation/Systems/SharedPortalSystem.cs @@ -1,9 +1,9 @@ using System.Linq; using Content.Shared.Ghost; +using Content.Shared.Movement.Pulling.Components; +using Content.Shared.Movement.Pulling.Systems; using Content.Shared.Popups; using Content.Shared.Projectiles; -using Content.Shared.Pulling; -using Content.Shared.Pulling.Components; using Content.Shared.Teleportation.Components; using Content.Shared.Verbs; using Robust.Shared.Audio; @@ -28,7 +28,7 @@ public abstract class SharedPortalSystem : EntitySystem [Dependency] private readonly EntityLookupSystem _lookup = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; - [Dependency] private readonly SharedPullingSystem _pulling = default!; + [Dependency] private readonly PullingSystem _pulling = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; private const string PortalFixture = "portalFixture"; @@ -93,15 +93,15 @@ private void OnCollide(EntityUid uid, PortalComponent component, ref StartCollid return; // break pulls before portal enter so we dont break shit - if (TryComp(subject, out var pullable) && pullable.BeingPulled) + if (TryComp(subject, out var pullable) && pullable.BeingPulled) { - _pulling.TryStopPull(pullable); + _pulling.TryStopPull(subject, pullable); } - if (TryComp(subject, out var pulling) - && pulling.Pulling != null && TryComp(pulling.Pulling.Value, out var subjectPulling)) + if (TryComp(subject, out var pullerComp) + && TryComp(pullerComp.Pulling, out var subjectPulling)) { - _pulling.TryStopPull(subjectPulling); + _pulling.TryStopPull(subject, subjectPulling); } // if they came from another portal, just return and wait for them to exit the portal diff --git a/Content.Shared/Throwing/ThrowingSystem.cs b/Content.Shared/Throwing/ThrowingSystem.cs index 01682863389..38772eaf340 100644 --- a/Content.Shared/Throwing/ThrowingSystem.cs +++ b/Content.Shared/Throwing/ThrowingSystem.cs @@ -20,6 +20,11 @@ public sealed class ThrowingSystem : EntitySystem { public const float ThrowAngularImpulse = 5f; + /// + /// Speed cap on rotation in case of click-spam. + /// + public const float ThrowAngularCap = 3f * MathF.PI; + public const float PushbackDefault = 2f; /// @@ -42,15 +47,17 @@ public void TryThrow( float strength = 1.0f, EntityUid? user = null, float pushbackRatio = PushbackDefault, + bool recoil = true, + bool animated = true, bool playSound = true) { - var thrownPos = Transform(uid).MapPosition; - var mapPos = coordinates.ToMap(EntityManager, _transform); + var thrownPos = _transform.GetMapCoordinates(uid); + var mapPos = _transform.ToMapCoordinates(coordinates); if (mapPos.MapId != thrownPos.MapId) return; - TryThrow(uid, mapPos.Position - thrownPos.Position, strength, user, pushbackRatio, playSound); + TryThrow(uid, mapPos.Position - thrownPos.Position, strength, user, pushbackRatio, recoil: recoil, animated: animated, playSound: playSound); } /// @@ -65,6 +72,8 @@ public void TryThrow(EntityUid uid, float strength = 1.0f, EntityUid? user = null, float pushbackRatio = PushbackDefault, + bool recoil = true, + bool animated = true, bool playSound = true) { var physicsQuery = GetEntityQuery(); @@ -72,7 +81,6 @@ public void TryThrow(EntityUid uid, return; var projectileQuery = GetEntityQuery(); - var tagQuery = GetEntityQuery(); TryThrow( uid, @@ -82,8 +90,7 @@ public void TryThrow(EntityUid uid, projectileQuery, strength, user, - pushbackRatio, - playSound); + pushbackRatio, recoil: recoil, animated: animated, playSound: playSound); } /// @@ -101,6 +108,8 @@ public void TryThrow(EntityUid uid, float strength = 1.0f, EntityUid? user = null, float pushbackRatio = PushbackDefault, + bool recoil = true, + bool animated = true, bool playSound = true) { if (strength <= 0 || direction == Vector2Helpers.Infinity || direction == Vector2Helpers.NaN || direction == Vector2.Zero) @@ -116,12 +125,17 @@ public void TryThrow(EntityUid uid, if (projectileQuery.TryGetComponent(uid, out var proj) && !proj.OnlyCollideWhenShot) return; - var comp = new ThrownItemComponent(); - comp.Thrower = user; + var comp = new ThrownItemComponent + { + Thrower = user, + Animate = animated, + }; // Estimate time to arrival so we can apply OnGround status and slow it much faster. var time = direction.Length() / strength; comp.ThrownTime = _gameTiming.CurTime; + // TODO: This is a bandaid, don't do this. + // if you want to force landtime have the caller handle it or add a new method. // did we launch this with something stronger than our hands? if (TryComp(comp.Thrower, out var hands) && strength > hands.ThrowForceMultiplier) comp.LandTime = comp.ThrownTime + TimeSpan.FromSeconds(time); @@ -166,7 +180,8 @@ public void TryThrow(EntityUid uid, if (user == null) return; - _recoil.KickCamera(user.Value, -direction * 0.04f); + if (recoil) + _recoil.KickCamera(user.Value, -direction * 0.04f); // Give thrower an impulse in the other direction if (pushbackRatio != 0.0f && diff --git a/Content.Shared/Throwing/ThrownItemComponent.cs b/Content.Shared/Throwing/ThrownItemComponent.cs index 16c9b13254c..f7defaa4aab 100644 --- a/Content.Shared/Throwing/ThrownItemComponent.cs +++ b/Content.Shared/Throwing/ThrownItemComponent.cs @@ -8,6 +8,12 @@ namespace Content.Shared.Throwing [RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true), AutoGenerateComponentPause] public sealed partial class ThrownItemComponent : Component { + /// + /// Should the in-air throwing animation play. + /// + [DataField, AutoNetworkedField] + public bool Animate = true; + /// /// The entity that threw this entity. /// diff --git a/Content.Shared/Throwing/ThrownItemSystem.cs b/Content.Shared/Throwing/ThrownItemSystem.cs index cc50094e3dd..ef28db26727 100644 --- a/Content.Shared/Throwing/ThrownItemSystem.cs +++ b/Content.Shared/Throwing/ThrownItemSystem.cs @@ -3,8 +3,7 @@ using Content.Shared.Database; using Content.Shared.Gravity; using Content.Shared.Physics; -using Content.Shared.Physics.Pull; -using Robust.Shared.GameStates; +using Content.Shared.Movement.Pulling.Events; using Robust.Shared.Physics; using Robust.Shared.Physics.Components; using Robust.Shared.Physics.Events; @@ -85,8 +84,8 @@ private void OnSleep(EntityUid uid, ThrownItemComponent thrownItem, ref PhysicsS private void HandlePullStarted(PullStartedMessage message) { // TODO: this isn't directed so things have to be done the bad way - if (EntityManager.TryGetComponent(message.Pulled.Owner, out ThrownItemComponent? thrownItemComponent)) - StopThrow(message.Pulled.Owner, thrownItemComponent); + if (EntityManager.TryGetComponent(message.PulledUid, out ThrownItemComponent? thrownItemComponent)) + StopThrow(message.PulledUid, thrownItemComponent); } public void StopThrow(EntityUid uid, ThrownItemComponent thrownItemComponent) From a8911da2f339fd1bd1d34237e69b8e77a364c3c0 Mon Sep 17 00:00:00 2001 From: SimpleStation14 <130339894+SimpleStation14@users.noreply.github.com> Date: Tue, 9 Jul 2024 16:52:39 -0700 Subject: [PATCH 150/155] Mirror: Configuration argument for content packaging (#316) ## Mirror of PR #25569: [Configuration argument for content packaging](https://github.com/space-wizards/space-station-14/pull/25569) from space-wizards [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `9e7b196ffbaa8c0a772d5d7544e51deaa2fe5a26` PR opened by VasilisThePikachu at 2024-02-25 21:40:05 UTC --- PR changed 4 files with 34 additions and 15 deletions. The PR had the following labels: ---

Original Body

> > > > Requires https://github.com/space-wizards/RobustToolbox/pull/4992 > > ## About the PR > > > Needed this for something so here we are. I think someone mentioned they wanted this? Welp its here now > > New argument is ``--configuration`` by default release but you can pass in anything else. Probably debug or tools
Co-authored-by: SimpleStation14 Co-authored-by: VMSolidus --- Content.Packaging/ClientPackaging.cs | 4 ++-- Content.Packaging/CommandLineArgs.cs | 23 +++++++++++++++++++++-- Content.Packaging/Program.cs | 4 ++-- Content.Packaging/ServerPackaging.cs | 18 +++++++++--------- 4 files changed, 34 insertions(+), 15 deletions(-) diff --git a/Content.Packaging/ClientPackaging.cs b/Content.Packaging/ClientPackaging.cs index a989ebd968e..a66d4ec5b91 100644 --- a/Content.Packaging/ClientPackaging.cs +++ b/Content.Packaging/ClientPackaging.cs @@ -13,7 +13,7 @@ public static class ClientPackaging /// /// Be advised this can be called from server packaging during a HybridACZ build. /// - public static async Task PackageClient(bool skipBuild, IPackageLogger logger) + public static async Task PackageClient(bool skipBuild, string configuration, IPackageLogger logger) { logger.Info("Building client..."); @@ -26,7 +26,7 @@ await ProcessHelpers.RunCheck(new ProcessStartInfo { "build", Path.Combine("Content.Client", "Content.Client.csproj"), - "-c", "Release", + "-c", configuration, "--nologo", "/v:m", "/t:Rebuild", diff --git a/Content.Packaging/CommandLineArgs.cs b/Content.Packaging/CommandLineArgs.cs index 9f2b0755357..23f661921e0 100644 --- a/Content.Packaging/CommandLineArgs.cs +++ b/Content.Packaging/CommandLineArgs.cs @@ -31,6 +31,11 @@ public sealed class CommandLineArgs ///
public bool HybridAcz { get; set; } + /// + /// Configuration used for when packaging the server. (Release, Debug, Tools) + /// + public string Configuration { get; set; } + // CommandLineArgs, 3rd of her name. public static bool TryParse(IReadOnlyList args, [NotNullWhen(true)] out CommandLineArgs? parsed) { @@ -39,6 +44,7 @@ public static bool TryParse(IReadOnlyList args, [NotNullWhen(true)] out var skipBuild = false; var wipeRelease = true; var hybridAcz = false; + var configuration = "Release"; List? platforms = null; using var enumerator = args.GetEnumerator(); @@ -89,6 +95,16 @@ public static bool TryParse(IReadOnlyList args, [NotNullWhen(true)] out platforms ??= new List(); platforms.Add(enumerator.Current); } + else if (arg == "--configuration") + { + if (!enumerator.MoveNext()) + { + Console.WriteLine("No configuration provided"); + return false; + } + + configuration = enumerator.Current; + } else if (arg == "--help") { PrintHelp(); @@ -106,7 +122,7 @@ public static bool TryParse(IReadOnlyList args, [NotNullWhen(true)] out return false; } - parsed = new CommandLineArgs(client.Value, skipBuild, wipeRelease, hybridAcz, platforms); + parsed = new CommandLineArgs(client.Value, skipBuild, wipeRelease, hybridAcz, platforms, configuration); return true; } @@ -120,6 +136,7 @@ private static void PrintHelp() --no-wipe-release Don't wipe the release folder before creating files. --hybrid-acz Use HybridACZ for server builds. --platform Platform for server builds. Default will output several x64 targets. + --configuration Configuration to use for building the server (Release, Debug, Tools). Default is Release. "); } @@ -128,12 +145,14 @@ private CommandLineArgs( bool skipBuild, bool wipeRelease, bool hybridAcz, - List? platforms) + List? platforms, + string configuration) { Client = client; SkipBuild = skipBuild; WipeRelease = wipeRelease; HybridAcz = hybridAcz; Platforms = platforms; + Configuration = configuration; } } diff --git a/Content.Packaging/Program.cs b/Content.Packaging/Program.cs index ba5924ec3e9..65c0e0131a4 100644 --- a/Content.Packaging/Program.cs +++ b/Content.Packaging/Program.cs @@ -17,11 +17,11 @@ if (parsed.Client) { - await ClientPackaging.PackageClient(parsed.SkipBuild, logger); + await ClientPackaging.PackageClient(parsed.SkipBuild, parsed.Configuration, logger); } else { - await ServerPackaging.PackageServer(parsed.SkipBuild, parsed.HybridAcz, logger, parsed.Platforms); + await ServerPackaging.PackageServer(parsed.SkipBuild, parsed.HybridAcz, logger, parsed.Configuration, parsed.Platforms); } void WipeBin() diff --git a/Content.Packaging/ServerPackaging.cs b/Content.Packaging/ServerPackaging.cs index ba489629f79..d9ca57c4d11 100644 --- a/Content.Packaging/ServerPackaging.cs +++ b/Content.Packaging/ServerPackaging.cs @@ -69,7 +69,7 @@ public static class ServerPackaging "zh-Hant" }; - public static async Task PackageServer(bool skipBuild, bool hybridAcz, IPackageLogger logger, List? platforms = null) + public static async Task PackageServer(bool skipBuild, bool hybridAcz, IPackageLogger logger, string configuration, List? platforms = null) { if (platforms == null) { @@ -82,7 +82,7 @@ public static async Task PackageServer(bool skipBuild, bool hybridAcz, IPackageL // Rather than hosting the client ZIP on the watchdog or on a separate server, // Hybrid ACZ uses the ACZ hosting functionality to host it as part of the status host, // which means that features such as automatic UPnP forwarding still work properly. - await ClientPackaging.PackageClient(skipBuild, logger); + await ClientPackaging.PackageClient(skipBuild, configuration, logger); } // Good variable naming right here. @@ -91,13 +91,13 @@ public static async Task PackageServer(bool skipBuild, bool hybridAcz, IPackageL if (!platforms.Contains(platform.Rid)) continue; - await BuildPlatform(platform, skipBuild, hybridAcz, logger); + await BuildPlatform(platform, skipBuild, hybridAcz, configuration, logger); } } - private static async Task BuildPlatform(PlatformReg platform, bool skipBuild, bool hybridAcz, IPackageLogger logger) + private static async Task BuildPlatform(PlatformReg platform, bool skipBuild, bool hybridAcz, string configuration, IPackageLogger logger) { - logger.Info($"Building project for {platform}..."); + logger.Info($"Building project for {platform.TargetOs}..."); if (!skipBuild) { @@ -108,7 +108,7 @@ await ProcessHelpers.RunCheck(new ProcessStartInfo { "build", Path.Combine("Content.Server", "Content.Server.csproj"), - "-c", "Release", + "-c", configuration, "--nologo", "/v:m", $"/p:TargetOs={platform.TargetOs}", @@ -118,7 +118,7 @@ await ProcessHelpers.RunCheck(new ProcessStartInfo } }); - await PublishClientServer(platform.Rid, platform.TargetOs); + await PublishClientServer(platform.Rid, platform.TargetOs, configuration); } logger.Info($"Packaging {platform.Rid} server..."); @@ -137,7 +137,7 @@ await ProcessHelpers.RunCheck(new ProcessStartInfo logger.Info($"Finished packaging server in {sw.Elapsed}"); } - private static async Task PublishClientServer(string runtime, string targetOs) + private static async Task PublishClientServer(string runtime, string targetOs, string configuration) { await ProcessHelpers.RunCheck(new ProcessStartInfo { @@ -147,7 +147,7 @@ await ProcessHelpers.RunCheck(new ProcessStartInfo "publish", "--runtime", runtime, "--no-self-contained", - "-c", "Release", + "-c", configuration, $"/p:TargetOs={targetOs}", "/p:FullRelease=True", "/m", From 6720f788d0ca3f44f16998a7b58f0a5c9fc89186 Mon Sep 17 00:00:00 2001 From: SimpleStation14 <130339894+SimpleStation14@users.noreply.github.com> Date: Tue, 9 Jul 2024 17:03:14 -0700 Subject: [PATCH 151/155] Mirror: Fix Scram! Implant Keeping You Pulled to Someone when Teleporting You (#292) ## Mirror of PR #26309: [Fix scram! implant keeping you pulled to someone when teleporting you](https://github.com/space-wizards/space-station-14/pull/26309) from space-wizards [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `eb80d9752e0309f8485478a43bcba6fb15fc3711` PR opened by nikthechampiongr at 2024-03-21 14:19:01 UTC --- PR changed 1 files with 8 additions and 0 deletions. The PR had the following labels: ---

Original Body

> fixes #26301 > > > > ## About the PR > > The scram implant will no longer leave you pulled when teleporting you. > > > I know the entire teleporting system for it needs to be redone and I might do that but please do not make me do it in this pr. > > ## Why / Balance > > It allows your captor to pull you through time and space itself back to where you were like nothing happened. > > ## Technical details > > Scram! tries to unpull you before teleporting you. > > ## Media > > > - [x] I have added screenshots/videos to this PR showcasing its changes ingame, **or** this PR does not require an ingame showcase > > **Changelog** > > > > > :cl: > - fix: Scram! implant no longer allows for someone to keep pulling you when it teleports you.
Co-authored-by: SimpleStation14 Co-authored-by: VMSolidus Co-authored-by: Danger Revolution! <142105406+DangerRevolution@users.noreply.github.com> --- Content.Server/Implants/SubdermalImplantSystem.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Content.Server/Implants/SubdermalImplantSystem.cs b/Content.Server/Implants/SubdermalImplantSystem.cs index 8eb27414481..6b58f6eb092 100644 --- a/Content.Server/Implants/SubdermalImplantSystem.cs +++ b/Content.Server/Implants/SubdermalImplantSystem.cs @@ -19,6 +19,8 @@ using Robust.Shared.Physics.Components; using Robust.Shared.Random; using System.Numerics; +using Content.Shared.Movement.Pulling.Components; +using Content.Shared.Movement.Pulling.Systems; namespace Content.Server.Implants; @@ -34,6 +36,7 @@ public sealed class SubdermalImplantSystem : SharedSubdermalImplantSystem [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly SharedTransformSystem _xform = default!; [Dependency] private readonly ForensicsSystem _forensicsSystem = default!; + [Dependency] private readonly PullingSystem _pullingSystem = default!; private EntityQuery _physicsQuery; @@ -98,6 +101,11 @@ private void OnScramImplant(EntityUid uid, SubdermalImplantComponent component, if (!TryComp(uid, out var implant)) return; + // We need stop the user from being pulled so they don't just get "attached" with whoever is pulling them. + // This can for example happen when the user is cuffed and being pulled. + if (TryComp(ent, out var pull) && _pullingSystem.IsPulled(ent, pull)) + _pullingSystem.TryStopPull(ent, pull); + var xform = Transform(ent); var entityCoords = xform.Coordinates.ToMap(EntityManager, _xform); From 83d6633e80b4288b1b53fbcf5526013ee0f43e76 Mon Sep 17 00:00:00 2001 From: SimpleStation14 <130339894+SimpleStation14@users.noreply.github.com> Date: Tue, 9 Jul 2024 17:03:54 -0700 Subject: [PATCH 152/155] Mirror: Fix Decoy Bomb Uplink Category (#254) ## Mirror of PR #26205: [fix decoy bomb uplink category](https://github.com/space-wizards/space-station-14/pull/26205) from space-wizards [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `21c527d6d09847a742202613d8aefce62c79b334` PR opened by Ilya246 at 2024-03-17 10:11:15 UTC --- PR changed 1 files with 10 additions and 10 deletions. The PR had the following labels: - No C# ---

Original Body

> > > > ## About the PR > moves the decoy syndicate bomb from explosives category to deception category > > ## Why / Balance > PR was made before the uplink categories update so the bomb ended up miscategorised > > ## Technical details > this is a webedit but it should be sufficiently simple to be fine > > ## Media > > not tested > > - [ ] I have added screenshots/videos to this PR showcasing its changes ingame, **or** this PR does not require an ingame showcase
--------- Co-authored-by: SimpleStation14 Co-authored-by: VMSolidus --- Resources/Locale/en-US/store/categories.ftl | 1 + .../Prototypes/Catalog/uplink_catalog.yml | 24 ++++++++++--------- Resources/Prototypes/Store/categories.yml | 5 ++++ 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/Resources/Locale/en-US/store/categories.ftl b/Resources/Locale/en-US/store/categories.ftl index 437fc03ae09..b6abc3e4288 100644 --- a/Resources/Locale/en-US/store/categories.ftl +++ b/Resources/Locale/en-US/store/categories.ftl @@ -12,6 +12,7 @@ store-category-implants = Implants store-category-job = Job store-category-armor = Armor store-category-pointless = Pointless +store-category-deception = Deception # Revenant store-category-abilities = Abilities diff --git a/Resources/Prototypes/Catalog/uplink_catalog.yml b/Resources/Prototypes/Catalog/uplink_catalog.yml index 328ace7ba15..0a3556ca36a 100644 --- a/Resources/Prototypes/Catalog/uplink_catalog.yml +++ b/Resources/Prototypes/Catalog/uplink_catalog.yml @@ -265,16 +265,6 @@ tags: - NukeOpsUplink -- type: listing - id: UplinkSyndicateBombFake - name: uplink-exploding-syndicate-bomb-fake-name - description: uplink-exploding-syndicate-bomb-fake-desc - productEntity: SyndicateBombFake - cost: - Telecrystal: 4 - categories: - - UplinkExplosives - - type: listing id: UplinkClusterGrenade name: uplink-cluster-grenade-name @@ -787,7 +777,19 @@ cost: Telecrystal: 6 categories: - - UplinkBundles + - UplinkBundles + +- type: listing + id: UplinkSyndicateBombFake + name: uplink-exploding-syndicate-bomb-fake-name + description: uplink-exploding-syndicate-bomb-fake-desc + productEntity: SyndicateBombFake + cost: + Telecrystal: 4 + categories: + - UplinkDeception + +# Disruption - type: listing id: UplinkAmmoBundle diff --git a/Resources/Prototypes/Store/categories.yml b/Resources/Prototypes/Store/categories.yml index c16972c8a31..11f8d509af3 100644 --- a/Resources/Prototypes/Store/categories.yml +++ b/Resources/Prototypes/Store/categories.yml @@ -63,6 +63,11 @@ name: store-category-pointless priority: 9 +- type: storeCategory + id: UplinkDeception + name: store-category-deception + priority: 10 + #revenant - type: storeCategory id: RevenantAbilities From 68aa211c39dcccecbcf1d556e6cd1d549dc3bc26 Mon Sep 17 00:00:00 2001 From: SimpleStation14 <130339894+SimpleStation14@users.noreply.github.com> Date: Tue, 9 Jul 2024 17:35:11 -0700 Subject: [PATCH 153/155] Mirror: Fix Cream Pie Bomb when Eaten or Sliced (#172) ## Mirror of PR #25928: [Fix cream pie bomb when eaten or sliced](https://github.com/space-wizards/space-station-14/pull/25928) from space-wizards [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `0d0edbba4a1c2af7ecef3318b5f9fe287a63fab5` PR opened by Slava0135 at 2024-03-08 13:16:38 UTC PR merged by web-flow at 2024-03-13 08:36:08 UTC --- PR changed 4 files with 22 additions and 4 deletions. The PR had the following labels: ---

Original Body

> > > > ## About the PR > > > ## Why / Balance > > > ## Technical details > > > ## Media > > > ![Peek 2024-03-08 15-48](https://github.com/space-wizards/space-station-14/assets/40753025/f7d8aeef-9aca-4b39-a4fe-967b41b26b7f) > > ## Breaking changes > > > **Changelog** > > > :cl: > - fix: Fixed pie bomb not detonating when eaten or sliced (remember to keep hungry mice away from it)! > - tweak: Pie bomb now cannot be ejected or swapped (just hope there is no bomb inside) >
--------- Co-authored-by: Vyacheslav Kovalevsky <40753025+Slava0135@users.noreply.github.com> Co-authored-by: VMSolidus Co-authored-by: Danger Revolution! <142105406+DangerRevolution@users.noreply.github.com> --- .../Nutrition/EntitySystems/CreamPieSystem.cs | 15 +++++++++++---- .../EntitySystems/SliceableFoodSystem.cs | 3 +++ Content.Shared/Nutrition/Events.cs | 6 ++++++ .../Objects/Consumable/Food/Baked/pie.yml | 2 ++ 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/Content.Server/Nutrition/EntitySystems/CreamPieSystem.cs b/Content.Server/Nutrition/EntitySystems/CreamPieSystem.cs index f8d781bcfff..a28679ddbc9 100644 --- a/Content.Server/Nutrition/EntitySystems/CreamPieSystem.cs +++ b/Content.Server/Nutrition/EntitySystems/CreamPieSystem.cs @@ -1,12 +1,11 @@ using Content.Server.Chemistry.Containers.EntitySystems; -using Content.Server.Explosion.Components; using Content.Server.Explosion.EntitySystems; using Content.Server.Fluids.EntitySystems; using Content.Server.Nutrition.Components; using Content.Server.Popups; using Content.Shared.Containers.ItemSlots; using Content.Shared.Explosion.Components; -using Content.Shared.Interaction; +using Content.Shared.Nutrition; using Content.Shared.Nutrition.Components; using Content.Shared.Nutrition.EntitySystems; using Content.Shared.Rejuvenate; @@ -32,7 +31,10 @@ public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnInteractUsing); + // activate BEFORE entity is deleted and trash is spawned + SubscribeLocalEvent(OnConsume, before: [typeof(FoodSystem)]); + SubscribeLocalEvent(OnSlice); + SubscribeLocalEvent(OnRejuvenate); } @@ -56,7 +58,12 @@ protected override void SplattedCreamPie(EntityUid uid, CreamPieComponent creamP EntityManager.QueueDeleteEntity(uid); } - private void OnInteractUsing(Entity entity, ref InteractUsingEvent args) + private void OnConsume(Entity entity, ref ConsumeDoAfterEvent args) + { + ActivatePayload(entity); + } + + private void OnSlice(Entity entity, ref SliceFoodEvent args) { ActivatePayload(entity); } diff --git a/Content.Server/Nutrition/EntitySystems/SliceableFoodSystem.cs b/Content.Server/Nutrition/EntitySystems/SliceableFoodSystem.cs index e92b046f2e3..dc848ccf9f1 100644 --- a/Content.Server/Nutrition/EntitySystems/SliceableFoodSystem.cs +++ b/Content.Server/Nutrition/EntitySystems/SliceableFoodSystem.cs @@ -1,6 +1,7 @@ using Content.Server.Nutrition; // DeltaV using Content.Server.Chemistry.Containers.EntitySystems; using Content.Server.Nutrition.Components; +using Content.Shared.Nutrition; using Content.Shared.Nutrition.Components; using Content.Shared.Chemistry.Components; using Content.Shared.Examine; @@ -67,6 +68,8 @@ private bool TrySliceFood(EntityUid uid, EntityUid user, EntityUid usedItem, FillSlice(sliceUid, lostSolution); _audio.PlayPvs(component.Sound, transform.Coordinates, AudioParams.Default.WithVolume(-2)); + var ev = new SliceFoodEvent(uid, user, usedItem); + RaiseLocalEvent(ev); // Decrease size of item based on count - Could implement in the future // Bug with this currently is the size in a container is not updated diff --git a/Content.Shared/Nutrition/Events.cs b/Content.Shared/Nutrition/Events.cs index e27603763fa..f2936d603d9 100644 --- a/Content.Shared/Nutrition/Events.cs +++ b/Content.Shared/Nutrition/Events.cs @@ -53,3 +53,9 @@ public VapeDoAfterEvent(Solution solution, bool forced) public override DoAfterEvent Clone() => this; } + +/// +/// Raised before food is sliced +/// +[ByRefEvent] +public record struct SliceFoodEvent(); diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/pie.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/pie.yml index fe888595847..8cd1c5dfab6 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/pie.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/pie.yml @@ -156,6 +156,8 @@ path: /Audio/Weapons/Guns/Empty/empty.ogg ejectSound: path: /Audio/Weapons/Guns/Empty/empty.ogg + swap: false + disableEject: true - type: Tag tags: - Fruit From 125896184ed2b37fa3aa60533bf0a67821c7a6d6 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Tue, 9 Jul 2024 20:43:45 -0400 Subject: [PATCH 154/155] Cherry-Pick PR #26312: Fix Puller Being Improperly Unset When Pulling Stops. (#532) ## Mirror of PR #26312: [Fix puller being improperly unset when pulling stops.](https://github.com/space-wizards/space-station-14/pull/26312) from space-wizards [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `a6c018d755ee4f35fb8e3ab597fa90c7592fe920` PR opened by nikthechampiongr at 2024-03-21 15:07:50 UTC --- PR changed 1 files with 8 additions and 6 deletions. The PR had the following labels: ---

Original Body

> fixes #26310 > > > > > ## About the PR > > This pr fixes the bug with people being unable to move while in cuffs if they were previously pulled even if they were no longer being pulled. > > ## Why / Balance > > A security cadet should not be able to merge my legs with the ground by simply touching me while I'm in cuffs. > > ## Technical details > > > When unpulled, the pullableComp has its puller field set to null after the message signifying the pulling has stopped has been sent. Since the component has a field to determine whether its owner is being pulled which is determined by the puller field, systems listening on the event would think that the owner of the component was still being pulled. > > As a result, when the message was fired and the SharedCuffableSystem checked whether it should allow the cuffed person to move it thought they were still being pulled and as such didn't allow them to move. > > I spent some time trying to determine whether setting the puller to null earlier would have other negative effects, however to my understanding of the code and the systems that listen to the message I believe this is now the correct behavior. Still just in case @metalgearsloth please check this out thanks. > ## Media > > > - [x] I have added screenshots/videos to this PR showcasing its changes ingame, **or** this PR does not require an ingame showcase > > > **Changelog** > > > > :cl: > - fix: You can now move again if you stop being pulled while in cuffs.
Co-authored-by: nikthechampiongr <32041239+nikthechampiongr@users.noreply.github.com> --- .../Movement/Pulling/Systems/PullingSystem.cs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs b/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs index 33794ba169e..b347c6da164 100644 --- a/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs +++ b/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs @@ -201,13 +201,18 @@ private void StopPulling(EntityUid pullableUid, PullableComponent pullableComp) } } + var oldPuller = pullableComp.Puller; + pullableComp.PullJointId = null; + pullableComp.Puller = null; + Dirty(pullableUid, pullableComp); + // No more joints with puller -> force stop pull. - if (TryComp(pullableComp.Puller, out var pullerComp)) + if (TryComp(oldPuller, out var pullerComp)) { - var pullerUid = pullableComp.Puller.Value; + var pullerUid = oldPuller.Value; _alertsSystem.ClearAlert(pullerUid, AlertType.Pulling); pullerComp.Pulling = null; - Dirty(pullableComp.Puller.Value, pullerComp); + Dirty(oldPuller.Value, pullerComp); // Messaging var message = new PullStoppedMessage(pullerUid, pullableUid); @@ -218,9 +223,6 @@ private void StopPulling(EntityUid pullableUid, PullableComponent pullableComp) RaiseLocalEvent(pullableUid, message); } - pullableComp.PullJointId = null; - pullableComp.Puller = null; - Dirty(pullableUid, pullableComp); _alertsSystem.ClearAlert(pullableUid, AlertType.Pulled); } From d61e23d0f8ee21ad76667c26c365eee30b47124c Mon Sep 17 00:00:00 2001 From: SimpleStation14 <130339894+SimpleStation14@users.noreply.github.com> Date: Tue, 9 Jul 2024 17:44:17 -0700 Subject: [PATCH 155/155] Mirror: Added 18 New Bounties to Cargo (#239) ## Mirror of PR #26160: [Added 18 new bounties to cargo](https://github.com/space-wizards/space-station-14/pull/26160) from space-wizards [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `4357b9ef08fee0e08c4fdf4eeef714fa8eb38112` PR opened by wafehling at 2024-03-15 20:21:21 UTC --- PR changed 19 files with 373 additions and 22 deletions. The PR had the following labels: ---

Original Body

> ## About the PR > I added 18 new bounties to cargo's bounty system, and tweaked a couple values in the existing system. (6 bounties at once instead of 5, reduced # of headsets needed for bounty to a sane number, fixed a couple inconsistencies) > > ## Why / Balance > > Spice things up, add variety, add a bit of balance. For fun! > > ## Technical details > Pretty much just Yaml/Ftl changes, added new bounty info + tags, Tweaked the active bounty count. > > ## Media > ![NewBounties](https://github.com/space-wizards/space-station-14/assets/1471082/74d61bc7-f438-4e3a-9a8c-bc59c3b1a55d) > > - [X] I have added screenshots/videos to this PR showcasing its changes ingame, **or** this PR does not require an ingame showcase > > ## Breaking changes > None! Nothing got removed, and it's all just surface level yaml work. > > **Changelog** > :cl: > - add: Added 18 new bounties to cargo bounty system. > >
--------- Co-authored-by: SimpleStation14 Co-authored-by: VMSolidus --- .../StationCargoBountyDatabaseComponent.cs | 2 +- Resources/Locale/en-US/cargo/bounties.ftl | 36 +++- .../Prototypes/Catalog/Bounties/bounties.yml | 185 +++++++++++++++++- .../Catalog/Fills/Boxes/general.yml | 3 + .../Entities/Clothing/Head/bandanas.yml | 5 +- .../Entities/Clothing/Masks/bandanas.yml | 1 + .../Entities/Clothing/OuterClothing/vests.yml | 3 + .../Entities/Clothing/Shoes/boots.yml | 8 +- .../Objects/Consumable/Drinks/drinks.yml | 6 + .../Consumable/Drinks/drinks_bottles.yml | 12 ++ .../Objects/Consumable/Drinks/drinks_cans.yml | 9 + .../Entities/Objects/Consumable/Food/meat.yml | 5 + .../Objects/Consumable/Food/produce.yml | 51 ++++- .../Entities/Objects/Consumable/Food/soup.yml | 10 + .../Circuitboards/Machine/production.yml | 17 +- .../Prototypes/Entities/Objects/Fun/toys.yml | 3 + .../Entities/Objects/Misc/bedsheets.yml | 3 + .../Entities/Objects/Weapons/Bombs/funny.yml | 3 + .../Catalog/Cargo/cargo_epistemics.yml | 2 +- Resources/Prototypes/tags.yml | 46 ++++- 20 files changed, 379 insertions(+), 31 deletions(-) diff --git a/Content.Server/Cargo/Components/StationCargoBountyDatabaseComponent.cs b/Content.Server/Cargo/Components/StationCargoBountyDatabaseComponent.cs index 48c58321b38..d26794a6323 100644 --- a/Content.Server/Cargo/Components/StationCargoBountyDatabaseComponent.cs +++ b/Content.Server/Cargo/Components/StationCargoBountyDatabaseComponent.cs @@ -12,7 +12,7 @@ public sealed partial class StationCargoBountyDatabaseComponent : Component /// Maximum amount of bounties a station can have. ///
[DataField, ViewVariables(VVAccess.ReadWrite)] - public int MaxBounties = 5; + public int MaxBounties = 6; /// /// A list of all the bounties currently active for a station. diff --git a/Resources/Locale/en-US/cargo/bounties.ftl b/Resources/Locale/en-US/cargo/bounties.ftl index 63c68de1053..b332517c70d 100644 --- a/Resources/Locale/en-US/cargo/bounties.ftl +++ b/Resources/Locale/en-US/cargo/bounties.ftl @@ -47,8 +47,24 @@ bounty-item-organs = Organ bounty-item-labeler = Hand labeler bounty-item-warm-cloth = Warm clothes bounty-item-battery = Battery -bounty-lasergun = Laser gun -bounty-food = Meat food +bounty-item-lasergun = Laser gun +bounty-item-food = Meat food +bounty-item-fruit = Fruit +bounty-item-vegetable = Vegetable +bounty-item-chili = Bowl of chili +bounty-item-rollerskates = Roller skates +bounty-item-bedsheet = Bedsheet +bounty-item-bandana = Bandana +bounty-item-steak = Steak +bounty-item-banana = Banana +bounty-item-beer = Beer +bounty-item-hi-viz-vest = Hi-viz vest +bounty-item-torch = Torch +bounty-item-medkit-box = Medkit box +bounty-item-cardboard-box = Cardboard box +bounty-item-wine = Wine bottle +bounty-item-cotton-boll = Cotton boll +bounty-item-microwave-machine-board = Microwave machine board bounty-description-artifact = NanoTrasen is in some hot water for stealing artifacts from non-spacefaring planets. Return one and we'll compensate you for it. bounty-description-baseball-bat = Baseball fever is going on at CentCom! Be a dear and ship them some baseball bats, so that management can live out their childhood dream. @@ -100,3 +116,19 @@ bounty-description-warm-cloth = The Unath construction crew freezes and is unabl bounty-description-battery = As the Arachnid settlement prepares for a solar flare, they are requesting a large shipment of power batteries. We're sending out a request for delivery. bounty-description-lasergun = The Salvage Caravan requests a large shipment of laser weapons to mop up a hive of xenomorphs. bounty-description-food = After the rat king invasion, a neighboring unathi station was left completely without food. A large meat food shipment is needed. +bounty-description-fruit = A heroic monkey helped the chaplain catch a troublemaker hiding in the chapel, and the crew wants to reward him for his good work. +bounty-description-vegetable = The new chef is a vegetarian, and botany can't keep up with their demands. We need some additional veggies to help keep things stocked. +bounty-description-chili = Today's the Centcomm Chili Cookoff, and, well, a few of us forgot to make some. Please help cover for us. +bounty-description-rollerskates = CentComm Security is proposing a new strategy for helping officers win foot pursuits. Send them a couple so they cna learn how bad an idea this is. +bounty-description-bedsheet = Someone in Atmos keeps turning down the heater, and we're all shivering in our beds. Please send us some extra sheets to stay warm. +bounty-description-bandana = Bzzzt... Transmission from prison planet OC-1001: We're... reorganizing our command structure. Send us some bandanas so we can tell gan- I mean, departments apart. +bounty-description-steak = The vegetarian cook is refusing to make us anything with meat, and the lizards are getting restless. Can you smuggle us a few steaks to keep them happy? +bounty-description-banana = Hi station! Botany won't gimme any more. They said slipping the HoS out an open airlock wasn't funny! Can you believe it? Help me out! HONK. +bounty-description-beer = Some nefarious agent has stolen every single drink in the bar. Yes, everything. Help tide us over until we can find them. +bounty-description-hi-viz-vest = The clown stole the AME controller and won't back. It's pretty dark in here. Some hi-viz vests would make seeing each other in the dark a little mroe bearable. +bounty-description-torch = The chef made all the monkeys and kobolds at once, and they rebelled and took over the cargo shuttle. They're demanding supplies and free passage to a jungle planet, and we're giving in to their demands. All they need now is a few torches. +bounty-description-medkit-box = CentComm is putting on a play set in a hospital, and needs some props. Just send us some empty medkit boxes, and the show will go on! +bounty-description-cardobard-box = "The Cardborgs Cometh" is a new play premiering tomorrow, and the costuming team is woefully unprepared. Send us some boxes to work with. +bounty-description-wine = The new librarian and the Quartermaster are falling head over heels for each other after she caught him disassembling the bookshelves for wood. Send a couple bottles of wine (Or cans, if you must) to help make the date go well. +bounty-description-cotton-boll = A massive swarm of mothroaches ate all the paper and cloth on the station. Send us some cotton to help keep our winged crewmembers fed. +bounty-description-microwave-machine-board = Mr. Giggles thought it'd be funny to stick forks in all the kitchen microwaves. Help us replace them before the chefs start making clown burgers. diff --git a/Resources/Prototypes/Catalog/Bounties/bounties.yml b/Resources/Prototypes/Catalog/Bounties/bounties.yml index 62a3a4162f3..c8c35aabfe4 100644 --- a/Resources/Prototypes/Catalog/Bounties/bounties.yml +++ b/Resources/Prototypes/Catalog/Bounties/bounties.yml @@ -347,11 +347,11 @@ - type: cargoBounty id: BountyRadio - reward: 7500 + reward: 6500 description: bounty-description-radio entries: - name: bounty-item-radio - amount: 12 + amount: 7 whitelist: components: - Headset @@ -536,7 +536,7 @@ description: bounty-description-lasergun idPrefix: IV entries: - - name: bounty-lasergun + - name: bounty-item-lasergun amount: 6 whitelist: components: @@ -548,8 +548,185 @@ description: bounty-description-food idPrefix: UNTH entries: - - name: bounty-food + - name: bounty-item-food amount: 30 whitelist: tags: - Meat + +- type: cargoBounty + id: BountyFruit + reward: 5000 + description: bounty-description-fruit + entries: + - name: bounty-item-fruit + amount: 12 + whitelist: + tags: + - Fruit + +- type: cargoBounty + id: BountyVegetable + reward: 6000 + description: bounty-description-vegetable + entries: + - name: bounty-item-vegetable + amount: 14 + whitelist: + tags: + - Vegetable + +- type: cargoBounty + id: BountyChili + reward: 5555 + description: bounty-description-chili + entries: + - name: bounty-item-chili + amount: 3 + whitelist: + tags: + - ChiliBowl + +- type: cargoBounty + id: BountyRollerskates + reward: 6500 + description: bounty-description-rollerskates + entries: + - name: bounty-item-rollerskates + amount: 2 + whitelist: + components: + - Skates + +- type: cargoBounty + id: BountyBedsheet + reward: 4100 + description: bounty-description-bedsheet + entries: + - name: bounty-item-bedsheet + amount: 5 + whitelist: + tags: + - Bedsheet + +- type: cargoBounty + id: BountyBandana + reward: 4000 + description: bounty-description-bandana + entries: + - name: bounty-item-bandana + amount: 7 + whitelist: + tags: + - Bandana + +- type: cargoBounty + id: BountySteak + reward: 3200 + description: bounty-description-steak + entries: + - name: bounty-item-steak + amount: 4 + whitelist: + tags: + - Steak + +- type: cargoBounty + id: BountyBanana + reward: 6009 + description: bounty-description-banana + entries: + - name: bounty-item-banana + amount: 9 + whitelist: + tags: + - Banana + +- type: cargoBounty + id: BountyBeer + reward: 3100 + description: bounty-description-beer + entries: + - name: bounty-item-beer + amount: 6 + whitelist: + tags: + - Beer + +- type: cargoBounty + id: BountyHiVizVest + reward: 3030 + description: bounty-description-hi-viz-vest + entries: + - name: bounty-item-hi-viz-vest + amount: 3 + whitelist: + tags: + - HiViz + +- type: cargoBounty + id: BountyTorch + reward: 2220 + description: bounty-description-torch + entries: + - name: bounty-item-torch + amount: 6 + whitelist: + tags: + - Torch + +- type: cargoBounty + id: BountyMedkitBox + reward: 2300 + description: bounty-description-medkit-box + entries: + - name: bounty-item-medkit-box + amount: 4 + whitelist: + tags: + - Medkit + +- type: cargoBounty + id: BountyCardboardBox + reward: 1500 + description: bounty-description-cardobard-box + entries: + - name: bounty-item-cardboard-box + amount: 12 + whitelist: + tags: + - BoxCardboard + +- type: cargoBounty + id: BountyWine + reward: 3000 + description: bounty-description-wine + entries: + - name: bounty-item-wine + amount: 2 + whitelist: + tags: + - Wine + +- type: cargoBounty + id: BountyCottonBoll + reward: 8600 + description: bounty-description-cotton-boll + entries: + - name: bounty-item-cotton-boll + amount: 9 + whitelist: + tags: + - CottonBoll + +- type: cargoBounty + id: BountyMicrowaveMachineBoard + reward: 4000 + description: bounty-description-microwave-machine-board + entries: + - name: bounty-item-microwave-machine-board + amount: 2 + whitelist: + tags: + - MicrowaveMachineBoard + diff --git a/Resources/Prototypes/Catalog/Fills/Boxes/general.yml b/Resources/Prototypes/Catalog/Fills/Boxes/general.yml index 7840602362f..40606bb9f35 100644 --- a/Resources/Prototypes/Catalog/Fills/Boxes/general.yml +++ b/Resources/Prototypes/Catalog/Fills/Boxes/general.yml @@ -14,6 +14,9 @@ - 0,0,2,2 - type: Sprite state: box + - type: Tag + tags: + - BoxCardboard - type: entity name: mousetrap box diff --git a/Resources/Prototypes/Entities/Clothing/Head/bandanas.yml b/Resources/Prototypes/Entities/Clothing/Head/bandanas.yml index 8ee6479ee65..51a56f1f1d6 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/bandanas.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/bandanas.yml @@ -20,6 +20,9 @@ - state: icon_mask map: [ "unfoldedLayer" ] visible: false + - type: Tag + tags: + - Bandana - type: entity parent: [ClothingHeadBandBase, ClothingMaskBandBlack] @@ -69,4 +72,4 @@ - type: entity parent: [ClothingHeadBandBase, ClothingMaskBandBrown] id: ClothingHeadBandBrown - name: brown bandana \ No newline at end of file + name: brown bandana diff --git a/Resources/Prototypes/Entities/Clothing/Masks/bandanas.yml b/Resources/Prototypes/Entities/Clothing/Masks/bandanas.yml index 2d65e67982f..246b47b8003 100644 --- a/Resources/Prototypes/Entities/Clothing/Masks/bandanas.yml +++ b/Resources/Prototypes/Entities/Clothing/Masks/bandanas.yml @@ -24,6 +24,7 @@ visible: false - type: Tag tags: + - Bandana - HidesNose - type: entity diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/vests.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/vests.yml index f49f5f4804b..b867abfeed3 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/vests.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/vests.yml @@ -63,6 +63,9 @@ sprite: Clothing/OuterClothing/Vests/hazard.rsi - type: Clothing sprite: Clothing/OuterClothing/Vests/hazard.rsi + - type: Tag + tags: + - HiViz #(Bartender) vest - type: entity diff --git a/Resources/Prototypes/Entities/Clothing/Shoes/boots.yml b/Resources/Prototypes/Entities/Clothing/Shoes/boots.yml index 241fc45352a..fdc49dc0616 100644 --- a/Resources/Prototypes/Entities/Clothing/Shoes/boots.yml +++ b/Resources/Prototypes/Entities/Clothing/Shoes/boots.yml @@ -202,7 +202,7 @@ - type: FootstepModifier footstepSoundCollection: collection: FootstepSpurs - + - type: entity parent: ClothingShoesBootsCowboyBrown id: ClothingShoesBootsCowboyBlack @@ -212,7 +212,7 @@ sprite: Clothing/Shoes/Boots/cowboybootsblack.rsi - type: Clothing sprite: Clothing/Shoes/Boots/cowboybootsblack.rsi - + - type: entity parent: ClothingShoesBootsCowboyBrown id: ClothingShoesBootsCowboyWhite @@ -222,7 +222,7 @@ sprite: Clothing/Shoes/Boots/cowboybootswhite.rsi - type: Clothing sprite: Clothing/Shoes/Boots/cowboybootswhite.rsi - + - type: entity parent: ClothingShoesBootsCowboyBrown id: ClothingShoesBootsCowboyFancy @@ -231,4 +231,4 @@ - type: Sprite sprite: Clothing/Shoes/Boots/cowboybootsfancy.rsi - type: Clothing - sprite: Clothing/Shoes/Boots/cowboybootsfancy.rsi \ No newline at end of file + sprite: Clothing/Shoes/Boots/cowboybootsfancy.rsi diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml index 0602fcf8f9d..9ed5918574c 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml @@ -369,6 +369,9 @@ - type: Icon sprite: Objects/Consumable/Drinks/beerglass.rsi state: icon + - type: Tag + tags: + - Beer - type: entity parent: DrinkGlass @@ -943,6 +946,9 @@ - type: Icon sprite: Objects/Consumable/Drinks/iced_beerglass.rsi state: icon + - type: Tag + tags: + - Beer - type: entity parent: DrinkGlass diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_bottles.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_bottles.yml index 07828ff5ba5..face999df82 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_bottles.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_bottles.yml @@ -355,6 +355,9 @@ - type: Sprite sprite: Objects/Consumable/Drinks/pwinebottle.rsi - type: Sealable + - type: Tag + tags: + - Wine - type: entity parent: [DrinkBottleVisualsAll, DrinkBottleGlassBaseFull] @@ -501,6 +504,9 @@ - type: Sprite sprite: Objects/Consumable/Drinks/winebottle.rsi - type: Sealable + - type: Tag + tags: + - Wine # Small Bottles @@ -523,6 +529,9 @@ sprite: Objects/Consumable/Drinks/beer.rsi - type: Openable closeable: false + - type: Tag + tags: + - Beer - type: entity parent: [DrinkBottleVisualsAll, DrinkBottleGlassBaseFull] @@ -543,6 +552,9 @@ sprite: Objects/Consumable/Drinks/beer.rsi - type: Openable closeable: false + - type: Tag + tags: + - Beer - type: entity diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cans.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cans.yml index 38ebc132c9f..2aec5761770 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cans.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cans.yml @@ -182,6 +182,9 @@ sprite: Objects/Consumable/Drinks/rootbeer.rsi - type: Item sprite: Objects/Consumable/Drinks/rootbeer.rsi + - type: Tag + tags: + - Beer - type: entity parent: DrinkCanBaseFull @@ -480,6 +483,9 @@ sprite: Objects/Consumable/Drinks/beer_can.rsi - type: Item sprite: Objects/Consumable/Drinks/beer_can.rsi + - type: Tag + tags: + - Beer - type: entity parent: DrinkCanBaseFull @@ -499,3 +505,6 @@ sprite: Objects/Consumable/Drinks/wine_can.rsi - type: Item sprite: Objects/Consumable/Drinks/wine_can.rsi + - type: Tag + tags: + - Wine diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/meat.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/meat.yml index 85de407988b..58af9cf3bd8 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/meat.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/meat.yml @@ -718,6 +718,7 @@ tags: - Cooked - Meat + - Steak - type: Sprite layers: - state: plain-cooked @@ -774,6 +775,7 @@ tags: - Cooked - Meat + - Steak - type: Sprite layers: - state: product-cooked @@ -942,6 +944,7 @@ tags: - Cooked - Meat + - Steak - type: Sprite layers: - state: goliath-cooked @@ -971,6 +974,7 @@ tags: - Cooked - Meat + - Steak - type: Sprite layers: - state: rouny-cooked @@ -996,6 +1000,7 @@ tags: - Cooked - Meat + - Steak - type: Sprite layers: - state: lizard-cooked diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/produce.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/produce.yml index eec7711d4af..21eb0fb9423 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/produce.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/produce.yml @@ -124,6 +124,9 @@ sprite: Objects/Specific/Hydroponics/laughin_pea.rsi - type: Produce seedId: laughinPea + - type: Tag + tags: + - Vegetable - type: entity name: tower-cap log @@ -258,6 +261,7 @@ - type: Tag tags: - Fruit + - Banana - type: entity name: mimana @@ -413,6 +417,7 @@ - type: Tag tags: - Carrot + - Vegetable - type: SolutionContainerManager solutions: food: @@ -458,6 +463,9 @@ sprite: Objects/Specific/Hydroponics/cabbage.rsi - type: Produce seedId: cabbage + - type: Tag + tags: + - Vegetable - type: entity name: garlic @@ -483,6 +491,9 @@ sprite: Objects/Specific/Hydroponics/garlic.rsi - type: Produce seedId: garlic + - type: Tag + tags: + - Vegetable - type: entity name: lemon @@ -658,6 +669,8 @@ - type: Tag tags: - Potato + - Vegetable + - type: entity name: tomato @@ -712,6 +725,7 @@ - type: Tag tags: - Fruit + - Vegetable - type: entity name: blue tomato @@ -756,6 +770,7 @@ - type: Tag tags: - Fruit + - Vegetable - type: entity name: blood tomato @@ -798,6 +813,7 @@ - type: Tag tags: - Fruit # Fuck you they're a fruit + - Vegetable - type: entity name: eggplant @@ -824,6 +840,7 @@ - type: Tag tags: - Fruit + - Vegetable - type: entity name: apple @@ -912,6 +929,7 @@ - type: Tag tags: - Corn + - Vegetable - type: Sprite sprite: Objects/Specific/Hydroponics/corn.rsi - type: Produce @@ -974,6 +992,9 @@ - type: SliceableFood count: 5 slice: FoodOnionSlice + - type: Tag + tags: + - Vegetable - type: entity name: red onion @@ -1002,6 +1023,9 @@ - type: SliceableFood count: 5 slice: FoodOnionRedSlice + - type: Tag + tags: + - Vegetable - type: entity name: chanterelle cluster @@ -1019,6 +1043,9 @@ sprite: Objects/Specific/Hydroponics/chanterelle.rsi - type: Produce seedId: chanterelle + - type: Tag + tags: + - Vegetable # Slices @@ -1129,6 +1156,9 @@ sprite: Objects/Specific/Hydroponics/chili.rsi - type: Produce seedId: chili + - type: Tag + tags: + - Vegetable - type: entity name: chilly pepper @@ -1180,6 +1210,9 @@ seedId: aloe - type: Extractable grindableSolutionName: food + - type: Tag + tags: + - Vegetable - type: entity name: poppy @@ -1459,6 +1492,9 @@ reagents: - ReagentId: MilkSoy Quantity: 5 + - type: Tag + tags: + - Vegetable - type: entity name: spaceman's trumpet @@ -1512,6 +1548,9 @@ reagents: - ReagentId: CarpoToxin Quantity: 2 + - type: Tag + tags: + - Vegetable - type: entity name: watermelon @@ -1604,9 +1643,6 @@ reagents: - ReagentId: JuiceWatermelon Quantity: 4 - - type: Tag - tags: - - Fruit - type: entity name: grapes @@ -1635,6 +1671,9 @@ reagents: - ReagentId: JuiceGrape Quantity: 10 + - type: Tag + tags: + - Fruit - type: entity name: berries @@ -1707,7 +1746,6 @@ tags: - Recyclable - Trash - - Fruit - type: SolutionContainerManager solutions: food: @@ -1746,6 +1784,9 @@ sprite: Objects/Specific/Hydroponics/pea.rsi - type: Produce seedId: pea + - type: Tag + tags: + - Vegetable - type: entity name: pumpkin @@ -1794,6 +1835,7 @@ - type: Tag tags: - Fruit + - Vegetable - type: entity name: cotton boll @@ -1822,3 +1864,4 @@ - type: Tag tags: - ClothMade + - CottonBoll diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/soup.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/soup.yml index 3b080e843b4..6b96f3bcb36 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/soup.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/soup.yml @@ -806,6 +806,10 @@ Quantity: 4 - ReagentId: Allicin Quantity: 3 + - type: Tag + tags: + - ChiliBowl + - type: entity name: cold chili @@ -830,6 +834,9 @@ Quantity: 8 - ReagentId: Vitamin Quantity: 4 + - type: Tag + tags: + - ChiliBowl - type: entity name: chili con carnival @@ -860,6 +867,9 @@ Quantity: 4 - ReagentId: Allicin Quantity: 3 + - type: Tag + tags: + - ChiliBowl - type: entity name: monkey's delight diff --git a/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml b/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml index c2a1fe6e7dc..4cd8a850993 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml @@ -1175,9 +1175,9 @@ materialRequirements: Glass: 2 Cable: 2 - - type: ReverseEngineering # Nyano - recipes: - - MicrowaveMachineCircuitboard + - type: Tag + tags: + - MicrowaveMachineBoard - type: entity id: FatExtractorMachineCircuitboard @@ -1433,7 +1433,7 @@ materialRequirements: Steel: 5 CableHV: 5 - + - type: entity id: ShuttleGunPerforatorCircuitboard parent: BaseMachineCircuitboard @@ -1450,7 +1450,7 @@ materialRequirements: Steel: 10 CableHV: 5 - + - type: entity id: ShuttleGunFriendshipCircuitboard parent: BaseMachineCircuitboard @@ -1466,8 +1466,8 @@ Manipulator: 2 materialRequirements: Steel: 7 - CableHV: 5 - + CableHV: 5 + - type: entity id: ShuttleGunDusterCircuitboard parent: BaseMachineCircuitboard @@ -1485,7 +1485,7 @@ Steel: 10 CableHV: 5 Uranium: 2 - + - type: entity id: ShuttleGunKineticCircuitboard parent: BaseMachineCircuitboard @@ -1502,4 +1502,3 @@ materialRequirements: Steel: 5 CableHV: 2 - \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Objects/Fun/toys.yml b/Resources/Prototypes/Entities/Objects/Fun/toys.yml index 67c6e1194b7..901b52b21b1 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/toys.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/toys.yml @@ -1432,6 +1432,9 @@ reagents: - ReagentId: Nothing Quantity: 100 + - type: Tag + tags: + - Banana - type: entity parent: DrinkBase diff --git a/Resources/Prototypes/Entities/Objects/Misc/bedsheets.yml b/Resources/Prototypes/Entities/Objects/Misc/bedsheets.yml index 209d0b8cc2d..0b9f00be65c 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/bedsheets.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/bedsheets.yml @@ -20,6 +20,9 @@ - neck - type: StaticPrice price: 100 + - type: Tag + tags: + - Bedsheet - type: entity id: BedsheetBlack diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Bombs/funny.yml b/Resources/Prototypes/Entities/Objects/Weapons/Bombs/funny.yml index 4aff7363a45..630354f23d9 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Bombs/funny.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Bombs/funny.yml @@ -117,3 +117,6 @@ - id: TrashBananaPeelExplosive sound: path: /Audio/Effects/unwrap.ogg + - type: Tag + tags: + - Banana diff --git a/Resources/Prototypes/Nyanotrasen/Catalog/Cargo/cargo_epistemics.yml b/Resources/Prototypes/Nyanotrasen/Catalog/Cargo/cargo_epistemics.yml index 4610c0f68c8..d7d0b665381 100644 --- a/Resources/Prototypes/Nyanotrasen/Catalog/Cargo/cargo_epistemics.yml +++ b/Resources/Prototypes/Nyanotrasen/Catalog/Cargo/cargo_epistemics.yml @@ -4,6 +4,6 @@ sprite: Nyanotrasen/Objects/Consumable/Drinks/flaskholywater.rsi state: icon product: CrateHolyWaterKit - cost: 1000 + cost: 3000 category: Epistemics group: market diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml index c6a0ab3f8fd..231326e5b11 100644 --- a/Resources/Prototypes/tags.yml +++ b/Resources/Prototypes/tags.yml @@ -31,18 +31,30 @@ - type: Tag id: Balloon +- type: Tag + id: Banana + - type: Tag id: BananaPeel +- type: Tag + id: Bandana + - type: Tag id: BaseballBat - type: Tag id: BBQsauce +- type: Tag + id: Bedsheet + - type: Tag id: Bee +- type: Tag + id: Beer + - type: Tag id: BikeHorn @@ -202,6 +214,9 @@ - type: Tag id: Bottle +- type: Tag + id: BoxCardboard + - type: Tag id: BoxHug @@ -347,6 +362,9 @@ - type: Tag id: ChemDispensable # container that can go into the chem dispenser +- type: Tag + id: ChiliBowl + - type: Tag id: Cigarette @@ -383,11 +401,14 @@ - type: Tag id: CluwneHorn -- type: Tag #Ohioans die happy +- type: Tag + id: Coldsauce + +- type: Tag id: Corn - type: Tag - id: Coldsauce + id: CottonBoll - type: Tag id: Cow @@ -677,6 +698,9 @@ - type: Tag id: HighSecDoor +- type: Tag + id: HiViz + - type: Tag id: Hoe @@ -764,9 +788,6 @@ - type: Tag id: MacroBomb -- type: Tag - id: MicroBomb - - type: Tag id: MimeBelt @@ -847,6 +868,12 @@ - type: Tag id: Metal +- type: Tag + id: MicroBomb + +- type: Tag + id: MicrowaveMachineBoard + - type: Tag id: MindShield @@ -1142,6 +1169,9 @@ - type: Tag id: StationMapElectronics +- type: Tag + id: Steak + - type: Tag id: SubdermalImplant @@ -1211,6 +1241,9 @@ - type: Tag id: UraniumGlassShard +- type: Tag + id: Vegetable + - type: Tag id: VimPilot @@ -1250,6 +1283,9 @@ - type: Tag id: Window +- type: Tag + id: Wine + - type: Tag id: WizardWand # that evil vvizard vvand