diff --git a/Content.Client/Administration/Systems/AdminSystem.cs b/Content.Client/Administration/Systems/AdminSystem.cs index f7451d2304..db1b721343 100644 --- a/Content.Client/Administration/Systems/AdminSystem.cs +++ b/Content.Client/Administration/Systems/AdminSystem.cs @@ -10,16 +10,9 @@ public sealed partial class AdminSystem : EntitySystem { public event Action>? PlayerListChanged; - private Dictionary? _playerList; - public IReadOnlyList PlayerList - { - get - { - if (_playerList != null) return _playerList.Values.ToList(); - - return new List(); - } - } + public Dictionary PlayerInfos = new(); + public IReadOnlyList PlayerList => + PlayerInfos != null ? PlayerInfos.Values.ToList() : new List(); public override void Initialize() { @@ -40,15 +33,15 @@ private void OnPlayerInfoChanged(PlayerInfoChangedEvent ev) { if(ev.PlayerInfo == null) return; - if (_playerList == null) _playerList = new(); + if (PlayerInfos == null) PlayerInfos = new(); - _playerList[ev.PlayerInfo.SessionId] = ev.PlayerInfo; - PlayerListChanged?.Invoke(_playerList.Values.ToList()); + PlayerInfos[ev.PlayerInfo.SessionId] = ev.PlayerInfo; + PlayerListChanged?.Invoke(PlayerInfos.Values.ToList()); } private void OnPlayerListChanged(FullPlayerListEvent msg) { - _playerList = msg.PlayersInfo.ToDictionary(x => x.SessionId, x => x); + PlayerInfos = msg.PlayersInfo.ToDictionary(x => x.SessionId, x => x); PlayerListChanged?.Invoke(msg.PlayersInfo); } } diff --git a/Content.Client/Administration/Systems/BwoinkSystem.cs b/Content.Client/Administration/Systems/BwoinkSystem.cs index 5166dc8416..a3b295d6b6 100644 --- a/Content.Client/Administration/Systems/BwoinkSystem.cs +++ b/Content.Client/Administration/Systems/BwoinkSystem.cs @@ -1,7 +1,10 @@ #nullable enable +using Content.Client.UserInterface.Systems.Bwoink; using Content.Shared.Administration; using JetBrains.Annotations; +using Robust.Client.Audio; using Robust.Shared.Network; +using Robust.Shared.Player; using Robust.Shared.Timing; namespace Content.Client.Administration.Systems @@ -10,6 +13,8 @@ namespace Content.Client.Administration.Systems public sealed class BwoinkSystem : SharedBwoinkSystem { [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly AudioSystem _audio = default!; + [Dependency] private readonly AdminSystem _adminSystem = default!; public event EventHandler? OnBwoinkTextMessageRecieved; private (TimeSpan Timestamp, bool Typing) _lastTypingUpdateSent; @@ -21,6 +26,10 @@ protected override void OnBwoinkTextMessage(BwoinkTextMessage message, EntitySes public void Send(NetUserId channelId, string text, bool playSound) { + var info = _adminSystem.PlayerInfos.GetValueOrDefault(channelId)?.Connected ?? true; + _audio.PlayGlobal(info ? AHelpUIController.AHelpSendSound : AHelpUIController.AHelpErrorSound, + Filter.Local(), false); + // Reuse the channel ID as the 'true sender'. // Server will ignore this and if someone makes it not ignore this (which is bad, allows impersonation!!!), that will help. RaiseNetworkEvent(new BwoinkTextMessage(channelId, channelId, text, playSound: playSound)); @@ -31,9 +40,7 @@ public void SendInputTextUpdated(NetUserId channel, bool typing) { if (_lastTypingUpdateSent.Typing == typing && _lastTypingUpdateSent.Timestamp + TimeSpan.FromSeconds(1) > _timing.RealTime) - { return; - } _lastTypingUpdateSent = (_timing.RealTime, typing); RaiseNetworkEvent(new BwoinkClientTypingUpdated(channel, typing)); diff --git a/Content.Client/DeltaV/Lamiae/ClientLamiaVisuals.cs b/Content.Client/DeltaV/Lamiae/ClientLamiaVisuals.cs deleted file mode 100644 index 046f6a7a3c..0000000000 --- a/Content.Client/DeltaV/Lamiae/ClientLamiaVisuals.cs +++ /dev/null @@ -1,42 +0,0 @@ -/* -* Delta-V - This file is licensed under AGPLv3 -* Copyright (c) 2024 Delta-V Contributors -* See AGPLv3.txt for details. -*/ - -using Robust.Client.GameObjects; -using System.Numerics; -using Content.Shared.SegmentedEntity; - -namespace Content.Client.DeltaV.Lamiae; - -public sealed class ClientLamiaVisualSystem : VisualizerSystem -{ - - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(OnAppearanceChange); - } - private void OnAppearanceChange(EntityUid uid, SegmentedEntitySegmentComponent component, ref AppearanceChangeEvent args) - { - if (args.Sprite == null) return; - - if (AppearanceSystem.TryGetData(uid, ScaleVisuals.Scale, out var scale) && TryComp(uid, out var sprite)) - { - sprite.Scale = new Vector2(scale, scale); - } - - if (AppearanceSystem.TryGetData(uid, SegmentedEntitySegmentVisualLayers.Armor, out var worn) - && AppearanceSystem.TryGetData(uid, SegmentedEntitySegmentVisualLayers.ArmorRsi, out var path)) - { - var valid = !string.IsNullOrWhiteSpace(path); - if (valid) - { - args.Sprite.LayerSetRSI(SegmentedEntitySegmentVisualLayers.Armor, path); - } - args.Sprite.LayerSetVisible(SegmentedEntitySegmentVisualLayers.Armor, worn); - } - } -} diff --git a/Content.Client/DeltaV/Lamiae/LamiaSegmentVisualsComponent.cs b/Content.Client/DeltaV/Lamiae/LamiaSegmentVisualsComponent.cs deleted file mode 100644 index e2c1139f23..0000000000 --- a/Content.Client/DeltaV/Lamiae/LamiaSegmentVisualsComponent.cs +++ /dev/null @@ -1,11 +0,0 @@ -/* -* Delta-V - This file is licensed under AGPLv3 -* Copyright (c) 2024 Delta-V Contributors -* See AGPLv3.txt for details. -*/ - -namespace Content.Client.DeltaV.Lamiae; - -[RegisterComponent] -public sealed partial class SegmentedEntitySegmentVisualsComponent : Component -{} diff --git a/Content.Client/DeltaV/Lamiae/SnakeOverlay.cs b/Content.Client/DeltaV/Lamiae/SnakeOverlay.cs new file mode 100644 index 0000000000..a8ed98c336 --- /dev/null +++ b/Content.Client/DeltaV/Lamiae/SnakeOverlay.cs @@ -0,0 +1,184 @@ +/* +* This file is licensed under AGPLv3 +* Copyright (c) 2024 Rane +* See AGPLv3.txt for details. +*/ + +using Content.Shared.SegmentedEntity; +using Content.Shared.Humanoid; +using Content.Shared.Humanoid.Markings; +using Content.Client.Resources; +using Robust.Client.ResourceManagement; +using Robust.Client.Graphics; +using Robust.Shared.Enums; +using System.Numerics; +using System.Linq; + + +namespace Content.Client.DeltaV.Lamiae; + +/// +/// This draws lamia segments directly from polygons instead of sprites. This is a very novel approach as of the time this is being written (August 2024) but it wouldn't surprise me +/// if there's a better way to do this at some point. Currently we have a very heavy restriction on the tools we can make, forcing me to make several helpers that may be redundant later. +/// This will be overcommented because I know you haven't seen code like this before and you might want to copy it. +/// This is an expansion on some techniques I discovered in (https://github.com/Elijahrane/Delta-v/blob/49d76c437740eab79fc622ab50d628b926e6ddcb/Content.Client/DeltaV/Arcade/S3D/Renderer/S3DRenderer.cs) +/// +public sealed class SnakeOverlay : Overlay +{ + private readonly IResourceCache _resourceCache; + private readonly IEntityManager _entManager; + private readonly SharedTransformSystem _transform; + private readonly SharedHumanoidAppearanceSystem _humanoid = default!; + + // Look through these carefully. WorldSpace is useful for debugging. Note that this defaults to "screen space" which breaks when you try and get the world handle. + public override OverlaySpace Space => OverlaySpace.WorldSpaceEntities; + + // Overlays are strange and you need this pattern where you define readonly deps above, and then make a constructor with this pattern. Anything that creates this overlay will then + // have to provide all the deps. + public SnakeOverlay(IEntityManager entManager, IResourceCache resourceCache) + { + _resourceCache = resourceCache; + // we get ent manager from SnakeOverlaySystem turning this on and passing it + _entManager = entManager; + // with ent manager we can fetch our other entity systems + _transform = _entManager.EntitySysManager.GetEntitySystem(); + _humanoid = _entManager.EntitySysManager.GetEntitySystem(); + + // draw at drawdepth 3 + ZIndex = 3; + } + + // This step occurs each frame. For some overlays you may want to conisder limiting how often they update, but for player entities that move around fast we'll just do it every frame. + protected override void Draw(in OverlayDrawArgs args) + { + // load the handle, the "pen" we draw with + var handle = args.WorldHandle; + + // Get all lamiae the client knows of and their transform in a way we can enumerate over + var enumerator = _entManager.AllEntityQueryEnumerator(); + + // I go over the collection above, pulling out an EntityUid and the two components I need for each. + while (enumerator.MoveNext(out var uid, out var lamia, out var xform)) + { + // Skip ones that are off-map. "Map" in this context means interconnected stuff you can travel between by moving, rather than needing e.g. FTL to load a new map. + if (xform.MapID != args.MapId) + continue; + + // Skip ones where they are not loaded properly, uninitialized, or w/e + if (lamia.Segments.Count < lamia.NumberOfSegments) + { + _entManager.Dirty(uid, lamia); // pls give me an update... + continue; + } + + // By the way, there's a hack to mitigate overdraw somewhat. Check out whatever is going on with the variable called "bounds" in DoAfterOverlay. + // I won't do it here because (1) it's ugly and (2) theoretically these entities can be fucking huge and you'll see the tail end of them when they are way off screen. + // On a PVS level I think segmented entities should be all-or-nothing when it comes to PVS range, that is you either load all of their segments or none. + + // Color.White is drawing without modifying color. For clothed tails, we should use White. For skin, we should use the color of the marking. + // TODO: Better way to cache this + if (_entManager.TryGetComponent(uid, out var humanoid)) + { + if (humanoid.MarkingSet.TryGetCategory(MarkingCategories.Tail, out var tailMarkings)) + { + var col = tailMarkings.First().MarkingColors.First(); + DrawLamia(handle, lamia, col); + } + } + else + { + DrawLamia(handle, lamia, Color.White); + } + } + } + + // This is where we do the actual drawing. + private void DrawLamia(DrawingHandleWorld handle, SegmentedEntityComponent lamia, Color color) + { + // We're going to store all our verticies in here and then draw them + List verts = new List(); + + // Radius of the initial segment + float radius = lamia.InitialRadius; + + // We're storing the left and right verticies of the last segment so we can start drawing from there without gaps + Vector2? lastPtCW = null; + Vector2? lastPtCCW = null; + + var tex = _resourceCache.GetTexture(lamia.TexturePath); + + int i = 1; + // do each segment except the last one normally + while (i < lamia.Segments.Count - 1) + { + // get centerpoints of last segment and this one + var origin = _transform.GetWorldPosition(_entManager.GetEntity(lamia.Segments[i - 1])); + var destination = _transform.GetWorldPosition(_entManager.GetEntity(lamia.Segments[i])); + + // get direction between the two points and normalize it + var connectorVec = destination - origin; + connectorVec = connectorVec.Normalized(); + + //get one rotated 90 degrees clockwise + var offsetVecCW = new Vector2(connectorVec.Y, 0 - connectorVec.X); + + //and counterclockwise + var offsetVecCCW = new Vector2(0 - connectorVec.Y, connectorVec.X); + + /// tri 1: line across first segment and corner of second + if (lastPtCW == null) + { + verts.Add(new DrawVertexUV2D(origin + offsetVecCW * radius, Vector2.Zero)); + } + else + { + verts.Add(new DrawVertexUV2D((Vector2) lastPtCW, Vector2.Zero)); + } + + if (lastPtCCW == null) + { + verts.Add(new DrawVertexUV2D(origin + offsetVecCCW * radius, new Vector2(1, 0))); + } + else + { + verts.Add(new DrawVertexUV2D((Vector2) lastPtCCW, new Vector2(1, 0))); + } + + verts.Add(new DrawVertexUV2D(destination + offsetVecCW * radius, new Vector2(0, 1))); + + // tri 2: line across second segment and corner of first + if (lastPtCCW == null) + { + verts.Add(new DrawVertexUV2D(origin + offsetVecCCW * radius, new Vector2(1, 0))); + } + else + { + verts.Add(new DrawVertexUV2D((Vector2) lastPtCCW, new Vector2(1, 0))); + } + + lastPtCW = destination + offsetVecCW * radius; + verts.Add(new DrawVertexUV2D((Vector2) lastPtCW, new Vector2(0, 1))); + lastPtCCW = destination + offsetVecCCW * radius; + verts.Add(new DrawVertexUV2D((Vector2) lastPtCCW, new Vector2(1, 1))); + + // slim down a bit for next segment + radius *= lamia.SlimFactor; + + i++; + } + + // draw tail (1 tri) + if (lastPtCW != null && lastPtCCW != null) + { + verts.Add(new DrawVertexUV2D((Vector2) lastPtCW, new Vector2(0, 0))); + verts.Add(new DrawVertexUV2D((Vector2) lastPtCCW, new Vector2(1, 0))); + + var destination = _transform.GetWorldPosition(_entManager.GetEntity(lamia.Segments.Last())); + + verts.Add(new DrawVertexUV2D(destination, new Vector2(0.5f, 1f))); + } + + // Draw all of the triangles we just pit in at once + handle.DrawPrimitives(DrawPrimitiveTopology.TriangleList, texture: tex, verts.ToArray().AsSpan(), color); + } +} \ No newline at end of file diff --git a/Content.Client/DeltaV/Lamiae/SnakeOverlaySystem.cs b/Content.Client/DeltaV/Lamiae/SnakeOverlaySystem.cs new file mode 100644 index 0000000000..6be1a18dc1 --- /dev/null +++ b/Content.Client/DeltaV/Lamiae/SnakeOverlaySystem.cs @@ -0,0 +1,32 @@ +/* +* This file is licensed under AGPLv3 +* Copyright (c) 2024 Rane +* See AGPLv3.txt for details. +*/ + +using Robust.Client.Graphics; +using Robust.Client.ResourceManagement; + +namespace Content.Client.DeltaV.Lamiae; + +/// +/// This system turns on our always-on overlay. I have no opinion on this design pattern or the existence of this file. +/// It also fetches the deps it needs. +/// +public sealed class SnakeOverlaySystem : EntitySystem +{ + [Dependency] private readonly IOverlayManager _overlay = default!; + [Dependency] private readonly IResourceCache _resourceCache = default!; + + public override void Initialize() + { + base.Initialize(); + _overlay.AddOverlay(new SnakeOverlay(EntityManager, _resourceCache)); + } + + public override void Shutdown() + { + base.Shutdown(); + _overlay.RemoveOverlay(); + } +} \ No newline at end of file diff --git a/Content.Client/Eye/PenLight/UI/PenLightBoundUserInterface.cs b/Content.Client/Eye/PenLight/UI/PenLightBoundUserInterface.cs new file mode 100644 index 0000000000..c488753115 --- /dev/null +++ b/Content.Client/Eye/PenLight/UI/PenLightBoundUserInterface.cs @@ -0,0 +1,47 @@ +using Content.Shared.Medical; +using JetBrains.Annotations; +using Robust.Client.GameObjects; + +namespace Content.Client.Eye.PenLight.UI +{ + [UsedImplicitly] + public sealed class PenLightBoundUserInterface : BoundUserInterface + { + [ViewVariables] + private PenLightWindow? _window; + + public PenLightBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey) { } + + protected override void Open() + { + base.Open(); + _window = new PenLightWindow + { + Title = EntMan.GetComponent(Owner).EntityName, + }; + _window.OnClose += Close; + _window.OpenCentered(); + } + + protected override void ReceiveMessage(BoundUserInterfaceMessage message) + { + if (_window == null + || message is not PenLightUserMessage cast) + return; + + _window.Diagnose(cast); + } + + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + if (!disposing) + return; + + if (_window != null) + _window.OnClose -= Close; + + _window?.Dispose(); + } + } +} diff --git a/Content.Client/Eye/PenLight/UI/PenLightWindow.xaml b/Content.Client/Eye/PenLight/UI/PenLightWindow.xaml new file mode 100644 index 0000000000..149b8a1382 --- /dev/null +++ b/Content.Client/Eye/PenLight/UI/PenLightWindow.xaml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/Content.Client/Eye/PenLight/UI/PenLightWindow.xaml.cs b/Content.Client/Eye/PenLight/UI/PenLightWindow.xaml.cs new file mode 100644 index 0000000000..809a569fa4 --- /dev/null +++ b/Content.Client/Eye/PenLight/UI/PenLightWindow.xaml.cs @@ -0,0 +1,78 @@ +using Content.Client.UserInterface.Controls; +using Content.Shared.Damage; +using Content.Shared.IdentityManagement; +using Content.Shared.Medical; +using Robust.Client.AutoGenerated; +using Robust.Client.UserInterface.XAML; +using System.Text; + + +namespace Content.Client.Eye.PenLight.UI +{ + [GenerateTypedNameReferences] + public sealed partial class PenLightWindow : FancyWindow + { + private readonly IEntityManager _entityManager; + private const int LightHeight = 150; + private const int LightWidth = 900; + + public PenLightWindow() + { + RobustXamlLoader.Load(this); + + var dependencies = IoCManager.Instance!; + _entityManager = dependencies.Resolve(); + } + public void Diagnose(PenLightUserMessage msg) + { + var target = _entityManager.GetEntity(msg.TargetEntity); + + if (target == null || !_entityManager.TryGetComponent(target, out var damageable)) + { + NoPatientDataText.Visible = true; + ExamDataLabel.Text = string.Empty; + return; + } + + NoPatientDataText.Visible = false; + + + string entityName = Loc.GetString("pen-light-window-entity-unknown-text"); + if (_entityManager.HasComponent(target.Value)) + entityName = Identity.Name(target.Value, _entityManager); + + var sb = new StringBuilder(); + sb.AppendLine(Loc.GetString("pen-light-window-entity-eyes-text", ("entityName", entityName))); + + // Check if Blind and return early if true + if (msg.Blind == true) + { + sb.AppendLine(Loc.GetString("pen-light-exam-blind-text")); + ExamDataLabel.Text = sb.ToString(); + SetHeight = LightHeight; + SetWidth = LightWidth; + return; + } + // EyeDamage + if (msg.EyeDamage == true) + sb.AppendLine(Loc.GetString("pen-light-exam-eyedamage-text")); + + // Drunk + if (msg.Drunk == true) + sb.AppendLine(Loc.GetString("pen-light-exam-drunk-text")); + + // Hallucinating + if (msg.SeeingRainbows == true) + sb.AppendLine(Loc.GetString("pen-light-exam-hallucinating-text")); + + // Healthy + if (msg.Healthy == true) + sb.AppendLine(Loc.GetString("pen-light-exam-healthy-text")); + + ExamDataLabel.Text = sb.ToString(); + + SetHeight = LightHeight; + SetWidth = LightWidth; + } + } +} \ No newline at end of file diff --git a/Content.Client/UserInterface/Systems/Bwoink/AHelpUIController.cs b/Content.Client/UserInterface/Systems/Bwoink/AHelpUIController.cs index 2c913a2d58..2d2be1babc 100644 --- a/Content.Client/UserInterface/Systems/Bwoink/AHelpUIController.cs +++ b/Content.Client/UserInterface/Systems/Bwoink/AHelpUIController.cs @@ -33,7 +33,6 @@ namespace Content.Client.UserInterface.Systems.Bwoink; public sealed class AHelpUIController: UIController, IOnSystemChanged, IOnStateChanged, IOnStateChanged { [Dependency] private readonly IClientAdminManager _adminManager = default!; - [Dependency] private readonly IConfigurationManager _config = default!; [Dependency] private readonly IPlayerManager _playerManager = default!; [Dependency] private readonly IClyde _clyde = default!; [Dependency] private readonly IUserInterfaceManager _uiManager = default!; @@ -43,9 +42,14 @@ public sealed class AHelpUIController: UIController, IOnSystemChanged UIManager.GetActiveUIWidgetOrNull()?.AHelpButton; private Button? LobbyAHelpButton => (UIManager.ActiveScreen as LobbyGui)?.AHelpButton; public IAHelpUIHandler? UIHelper; + private bool _discordRelayActive; private bool _hasUnreadAHelp; - private string? _aHelpSound; + + public const string AHelpErrorSound = "/Audio/Admin/ahelp_error.ogg"; + public const string AHelpReceiveSound = "/Audio/Admin/ahelp_receive.ogg"; + public const string AHelpSendSound = "/Audio/Admin/ahelp_send.ogg"; + public override void Initialize() { @@ -55,9 +59,9 @@ public override void Initialize() SubscribeNetworkEvent(PeopleTypingUpdated); _adminManager.AdminStatusUpdated += OnAdminStatusUpdated; - _config.OnValueChanged(CCVars.AHelpSound, v => _aHelpSound = v, true); } + public void UnloadButton() { if (GameAHelpButton != null) @@ -112,14 +116,10 @@ public void OnSystemUnloaded(BwoinkSystem system) private void SetAHelpPressed(bool pressed) { if (GameAHelpButton != null) - { GameAHelpButton.Pressed = pressed; - } if (LobbyAHelpButton != null) - { LobbyAHelpButton.Pressed = pressed; - } UIManager.ClickSound(); UnreadAHelpRead(); @@ -130,22 +130,18 @@ private void ReceivedBwoink(object? sender, SharedBwoinkSystem.BwoinkTextMessage Logger.InfoS("c.s.go.es.bwoink", $"@{message.UserId}: {message.Text}"); var localPlayer = _playerManager.LocalSession; if (localPlayer == null) - { return; - } - if (message.PlaySound && localPlayer.UserId != message.TrueSender) + + EnsureUIHelper(); + + if (message.PlaySound && localPlayer.UserId != message.TrueSender && !UIHelper!.IsOpen) { - if (_aHelpSound != null) - _audio.PlayGlobal(_aHelpSound, Filter.Local(), false); + _audio.PlayGlobal(AHelpReceiveSound, Filter.Local(), false); _clyde.RequestWindowAttention(); } - EnsureUIHelper(); - if (!UIHelper!.IsOpen) - { UnreadAHelpReceived(); - } UIHelper!.Receive(message); } diff --git a/Content.Client/Weapons/Melee/MeleeWeaponSystem.cs b/Content.Client/Weapons/Melee/MeleeWeaponSystem.cs index cf987e62c7..98528c691d 100644 --- a/Content.Client/Weapons/Melee/MeleeWeaponSystem.cs +++ b/Content.Client/Weapons/Melee/MeleeWeaponSystem.cs @@ -222,7 +222,7 @@ private void ClientHeavyAttack(EntityUid user, EntityCoordinates coordinates, En var userPos = TransformSystem.GetWorldPosition(userXform); var direction = targetMap.Position - userPos; - var distance = MathF.Min(component.Range, direction.Length()); + var distance = MathF.Min(component.Range * component.HeavyRangeModifier, direction.Length()); // This should really be improved. GetEntitiesInArc uses pos instead of bounding boxes. // Server will validate it with InRangeUnobstructed. diff --git a/Content.IntegrationTests/Tests/Nyanotrasen/Oracle/OracleTest.cs b/Content.IntegrationTests/Tests/Nyanotrasen/Oracle/OracleTest.cs deleted file mode 100644 index c925db3ba2..0000000000 --- a/Content.IntegrationTests/Tests/Nyanotrasen/Oracle/OracleTest.cs +++ /dev/null @@ -1,72 +0,0 @@ -#nullable enable -using NUnit.Framework; -using System.Threading.Tasks; -using Content.Shared.Item; -using Content.Shared.Mobs.Components; -using Content.Server.Research.Oracle; -using Content.Shared.Chemistry.Components; -using Robust.Shared.GameObjects; -using Robust.Shared.Map; -using Robust.Shared.Prototypes; - - -/// -/// The oracle's request pool is huge. -/// We need to test everything that the oracle could request can be turned in. -/// -namespace Content.IntegrationTests.Tests.Oracle -{ - [TestFixture] - [TestOf(typeof(OracleSystem))] - public sealed class OracleTest - { - [Test] - public async Task AllOracleItemsCanBeTurnedIn() - { - await using var pairTracker = await PoolManager.GetServerClient(); - var server = pairTracker.Server; - // Per RobustIntegrationTest.cs, wait until state is settled to access it. - await server.WaitIdleAsync(); - - var mapManager = server.ResolveDependency(); - var prototypeManager = server.ResolveDependency(); - var entityManager = server.ResolveDependency(); - var entitySystemManager = server.ResolveDependency(); - - var oracleSystem = entitySystemManager.GetEntitySystem(); - var oracleComponent = new OracleComponent(); - - var testMap = await pairTracker.CreateTestMap(); - - await server.WaitAssertion(() => - { - var allProtos = oracleSystem.GetAllProtos(oracleComponent); - var coordinates = testMap.GridCoords; - - Assert.That((allProtos.Count > 0), "Oracle has no valid prototypes!"); - - foreach (var proto in allProtos) - { - var spawned = entityManager.SpawnEntity(proto, coordinates); - - Assert.That(entityManager.HasComponent(spawned), - $"Oracle can request non-item {proto}"); - - Assert.That(!entityManager.HasComponent(spawned), - $"Oracle can request reagent container {proto} that will conflict with the fountain"); - - Assert.That(!entityManager.HasComponent(spawned), - $"Oracle can request mob {proto} that could potentially have a player-set name."); - } - - // Because Server/Client pairs can be re-used between Tests, we - // need to clean up anything that might affect other tests, - // otherwise this pair cannot be considered clean, and the - // CleanReturnAsync call would need to be removed. - mapManager.DeleteMap(testMap.MapId); - }); - - await pairTracker.CleanReturnAsync(); - } - } -} diff --git a/Content.Server/Atmos/EntitySystems/BarotraumaSystem.cs b/Content.Server/Atmos/EntitySystems/BarotraumaSystem.cs index fc77a1c8d9..948373940e 100644 --- a/Content.Server/Atmos/EntitySystems/BarotraumaSystem.cs +++ b/Content.Server/Atmos/EntitySystems/BarotraumaSystem.cs @@ -153,9 +153,6 @@ public float GetFeltLowPressure(EntityUid uid, BarotraumaComponent barotrauma, f return Math.Min(modified, Atmospherics.OneAtmosphere); } - /// - /// Returns adjusted pressure after having applied resistances from equipment and innate (if any), to check against a high pressure hazard threshold - /// public float GetFeltHighPressure(EntityUid uid, BarotraumaComponent barotrauma, float environmentPressure) { if (barotrauma.HasImmunity) @@ -226,69 +223,58 @@ public override void Update(float frameTime) pressure = MathF.Max(mixture.Pressure, 1f); } - switch (pressure) + pressure = pressure switch { - // Low pressure. - case <= Atmospherics.WarningLowPressure: - pressure = GetFeltLowPressure(uid, barotrauma, pressure); - - if (pressure > Atmospherics.WarningLowPressure) - goto default; - - // Deal damage and ignore resistances. Resistance to pressure damage should be done via pressure protection gear. - _damageableSystem.TryChangeDamage(uid, barotrauma.Damage * Atmospherics.LowPressureDamage, true, false); + // Adjust pressure based on equipment. Works differently depending on if it's "high" or "low". + <= Atmospherics.WarningLowPressure => GetFeltLowPressure(uid, barotrauma, pressure), + >= Atmospherics.WarningHighPressure => GetFeltHighPressure(uid, barotrauma, pressure), + _ => pressure + }; + if (pressure <= Atmospherics.HazardLowPressure) + { + // Deal damage and ignore resistances. Resistance to pressure damage should be done via pressure protection gear. + _damageableSystem.TryChangeDamage(uid, barotrauma.Damage * Atmospherics.LowPressureDamage, true, false); + if (!barotrauma.TakingDamage) + { + barotrauma.TakingDamage = true; + _adminLogger.Add(LogType.Barotrauma, $"{ToPrettyString(uid):entity} started taking low pressure damage"); + } - if (!barotrauma.TakingDamage) - { - barotrauma.TakingDamage = true; - _adminLogger.Add(LogType.Barotrauma, $"{ToPrettyString(uid):entity} started taking low pressure damage"); - } + _alertsSystem.ShowAlert(uid, AlertType.LowPressure, 2); + } + else if (pressure >= Atmospherics.HazardHighPressure) + { + var damageScale = MathF.Min(((pressure / Atmospherics.HazardHighPressure) - 1) * Atmospherics.PressureDamageCoefficient, Atmospherics.MaxHighPressureDamage); - if (pressure <= Atmospherics.HazardLowPressure) - { - _alertsSystem.ShowAlert(uid, AlertType.LowPressure, 2); + _damageableSystem.TryChangeDamage(uid, barotrauma.Damage * damageScale, true, false); + if (!barotrauma.TakingDamage) + { + barotrauma.TakingDamage = true; + _adminLogger.Add(LogType.Barotrauma, $"{ToPrettyString(uid):entity} started taking high pressure damage"); + } + _alertsSystem.ShowAlert(uid, AlertType.HighPressure, 2); + } + else + { + // Within safe pressure limits + if (barotrauma.TakingDamage) + { + barotrauma.TakingDamage = false; + _adminLogger.Add(LogType.Barotrauma, $"{ToPrettyString(uid):entity} stopped taking pressure damage"); + } + // Set correct alert. + switch (pressure) + { + case <= Atmospherics.WarningLowPressure: + _alertsSystem.ShowAlert(uid, AlertType.LowPressure, 1); break; - } - - _alertsSystem.ShowAlert(uid, AlertType.LowPressure, 1); - break; - - // High pressure. - case >= Atmospherics.WarningHighPressure: - pressure = GetFeltHighPressure(uid, barotrauma, pressure); - - if (pressure < Atmospherics.WarningHighPressure) - goto default; - - var damageScale = MathF.Min((pressure / Atmospherics.HazardHighPressure) * Atmospherics.PressureDamageCoefficient, Atmospherics.MaxHighPressureDamage); - - // Deal damage and ignore resistances. Resistance to pressure damage should be done via pressure protection gear. - _damageableSystem.TryChangeDamage(uid, barotrauma.Damage * damageScale, true, false); - - if (!barotrauma.TakingDamage) - { - barotrauma.TakingDamage = true; - _adminLogger.Add(LogType.Barotrauma, $"{ToPrettyString(uid):entity} started taking high pressure damage"); - } - - if (pressure >= Atmospherics.HazardHighPressure) - { - _alertsSystem.ShowAlert(uid, AlertType.HighPressure, 2); + case >= Atmospherics.WarningHighPressure: + _alertsSystem.ShowAlert(uid, AlertType.HighPressure, 1); break; - } - - _alertsSystem.ShowAlert(uid, AlertType.HighPressure, 1); - break; - - // Normal pressure. - default: - if (barotrauma.TakingDamage) - { - barotrauma.TakingDamage = false; - _adminLogger.Add(LogType.Barotrauma, $"{ToPrettyString(uid):entity} stopped taking pressure damage"); - } - _alertsSystem.ClearAlertCategory(uid, AlertCategory.Pressure); - break; + default: + _alertsSystem.ClearAlertCategory(uid, AlertCategory.Pressure); + break; + } } } } diff --git a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCanisterSystem.cs b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCanisterSystem.cs index 3e4340bf1d..d53e29c949 100644 --- a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCanisterSystem.cs +++ b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCanisterSystem.cs @@ -15,6 +15,7 @@ using Content.Shared.Database; using Content.Shared.Interaction; using Content.Shared.Lock; +using Content.Server.Silicons.Borgs.Components; using Robust.Server.GameObjects; using Robust.Shared.Audio.Systems; using Robust.Shared.Containers; @@ -91,6 +92,10 @@ private void DirtyUI(EntityUid uid, if (canister.GasTankSlot.Item != null) { var tank = canister.GasTankSlot.Item.Value; + if (TryComp(tank, out var jetpack) && jetpack.JetpackUid.HasValue) + { + tank = jetpack.JetpackUid.Value; + } var tankComponent = Comp(tank); tankLabel = Name(tank); tankPressure = tankComponent.Air.Pressure; @@ -163,7 +168,12 @@ private void OnCanisterUpdated(EntityUid uid, GasCanisterComponent canister, ref { if (canister.GasTankSlot.Item != null) { - var gasTank = Comp(canister.GasTankSlot.Item.Value); + var tank = canister.GasTankSlot.Item; + if (TryComp(tank, out var jetpack) && jetpack.JetpackUid.HasValue) + { + tank = jetpack.JetpackUid.Value; + } + var gasTank = Comp(tank.Value); _atmos.ReleaseGasTo(canister.Air, gasTank.Air, canister.ReleasePressure); } else @@ -233,7 +243,19 @@ private void OnCanisterInsertAttempt(EntityUid uid, GasCanisterComponent compone if (args.Slot.ID != component.ContainerName || args.User == null) return; - if (!TryComp(args.Item, out var gasTank) || gasTank.IsValveOpen) + var tank = args.Item; + + if (TryComp(tank, out var jetpack)) + { + if (!jetpack.JetpackUid.HasValue) + { + args.Cancelled = true; + return; + } + tank = jetpack.JetpackUid.Value; + } + + if (!TryComp(tank, out var gasTank) || gasTank.IsValveOpen) { args.Cancelled = true; return; diff --git a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasThermoMachineSystem.cs b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasThermoMachineSystem.cs index 9b61044f03..720fd5b5b9 100644 --- a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasThermoMachineSystem.cs +++ b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasThermoMachineSystem.cs @@ -143,7 +143,7 @@ private bool IsHeater(GasThermoMachineComponent comp) private void OnToggleMessage(EntityUid uid, GasThermoMachineComponent thermoMachine, GasThermomachineToggleMessage args) { - var powerState = _power.TogglePower(uid); + var powerState = _power.TryTogglePower(uid); _adminLogger.Add(LogType.AtmosPowerChanged, $"{ToPrettyString(args.Session.AttachedEntity)} turned {(powerState ? "On" : "Off")} {ToPrettyString(uid)}"); DirtyUI(uid, thermoMachine); } diff --git a/Content.Server/Atmos/Portable/SpaceHeaterSystem.cs b/Content.Server/Atmos/Portable/SpaceHeaterSystem.cs index fff15f696c..8094b0e1a6 100644 --- a/Content.Server/Atmos/Portable/SpaceHeaterSystem.cs +++ b/Content.Server/Atmos/Portable/SpaceHeaterSystem.cs @@ -98,7 +98,7 @@ private void OnToggle(EntityUid uid, SpaceHeaterComponent spaceHeater, SpaceHeat if (!Resolve(uid, ref powerReceiver)) return; - _power.TogglePower(uid); + _power.TryTogglePower(uid); UpdateAppearance(uid); DirtyUI(uid, spaceHeater); diff --git a/Content.Server/Body/Components/BloodstreamComponent.cs b/Content.Server/Body/Components/BloodstreamComponent.cs index 1d8aa9ffd3..dd93da9598 100644 --- a/Content.Server/Body/Components/BloodstreamComponent.cs +++ b/Content.Server/Body/Components/BloodstreamComponent.cs @@ -1,5 +1,6 @@ using Content.Server.Body.Systems; using Content.Server.Chemistry.EntitySystems; +using Content.Server.Traits.Assorted; using Content.Shared.Chemistry.Components; using Content.Shared.Chemistry.Reagent; using Content.Shared.Damage; @@ -11,7 +12,7 @@ namespace Content.Server.Body.Components { - [RegisterComponent, Access(typeof(BloodstreamSystem), typeof(ReactionMixerSystem))] + [RegisterComponent, Access(typeof(BloodstreamSystem), typeof(ReactionMixerSystem), typeof(BloodDeficiencySystem), typeof(HemophiliaSystem))] public sealed partial class BloodstreamComponent : Component { public static string DefaultChemicalsSolutionName = "chemicals"; @@ -171,5 +172,18 @@ public sealed partial class BloodstreamComponent : Component /// [ViewVariables(VVAccess.ReadWrite)] public TimeSpan StatusTime; + + /// + /// If this is true, the entity will not passively regenerate blood, + /// and instead will slowly lose blood. + /// + [DataField] + public bool HasBloodDeficiency = false; + + /// + /// How much reagent of blood should be removed with blood deficiency in each update interval? + /// + [DataField] + public FixedPoint2 BloodDeficiencyLossAmount; } } diff --git a/Content.Server/Body/Components/MetabolizerComponent.cs b/Content.Server/Body/Components/MetabolizerComponent.cs index 90c99df7db..7fe7d23cf3 100644 --- a/Content.Server/Body/Components/MetabolizerComponent.cs +++ b/Content.Server/Body/Components/MetabolizerComponent.cs @@ -1,4 +1,5 @@ using Content.Server.Body.Systems; +using Content.Server.Traits.Assorted; using Content.Shared.Body.Prototypes; using Content.Shared.FixedPoint; using Robust.Shared.Prototypes; @@ -44,7 +45,7 @@ public sealed partial class MetabolizerComponent : Component /// List of metabolizer types that this organ is. ex. Human, Slime, Felinid, w/e. /// [DataField] - [Access(typeof(MetabolizerSystem), Other = AccessPermissions.ReadExecute)] // FIXME Friends + [Access(typeof(MetabolizerSystem), typeof(LiquorLifelineSystem), Other = AccessPermissions.ReadExecute)] // FIXME Friends public HashSet>? MetabolizerTypes = null; /// diff --git a/Content.Server/Body/Systems/BloodstreamSystem.cs b/Content.Server/Body/Systems/BloodstreamSystem.cs index 9e29fdf756..b37ac5efeb 100644 --- a/Content.Server/Body/Systems/BloodstreamSystem.cs +++ b/Content.Server/Body/Systems/BloodstreamSystem.cs @@ -118,8 +118,14 @@ public override void Update(float frameTime) if (!_solutionContainerSystem.ResolveSolution(uid, bloodstream.BloodSolutionName, ref bloodstream.BloodSolution, out var bloodSolution)) continue; - // Adds blood to their blood level if it is below the maximum; Blood regeneration. Must be alive. - if (bloodSolution.Volume < bloodSolution.MaxVolume && !_mobStateSystem.IsDead(uid)) + // Removes blood for Blood Deficiency constantly. + if (bloodstream.HasBloodDeficiency) + { + if (!_mobStateSystem.IsDead(uid)) + RemoveBlood(uid, bloodstream.BloodDeficiencyLossAmount, bloodstream); + } + // Adds blood to their blood level if it is below the maximum. + else if (bloodSolution.Volume < bloodSolution.MaxVolume && !_mobStateSystem.IsDead(uid)) { TryModifyBloodLevel(uid, bloodstream.BloodRefreshAmount, bloodstream); } @@ -242,20 +248,29 @@ private void OnHealthBeingExamined(Entity ent, ref HealthB if (ent.Comp.BleedAmount > ent.Comp.MaxBleedAmount / 2) { args.Message.PushNewline(); - args.Message.AddMarkup(Loc.GetString("bloodstream-component-profusely-bleeding", ("target", ent.Owner))); + if (!args.IsSelfAware) + args.Message.AddMarkup(Loc.GetString("bloodstream-component-profusely-bleeding", ("target", ent.Owner))); + else + args.Message.AddMarkup(Loc.GetString("bloodstream-component-selfaware-profusely-bleeding")); } // Shows bleeding message when bleeding, but less than profusely. else if (ent.Comp.BleedAmount > 0) { args.Message.PushNewline(); - args.Message.AddMarkup(Loc.GetString("bloodstream-component-bleeding", ("target", ent.Owner))); + if (!args.IsSelfAware) + args.Message.AddMarkup(Loc.GetString("bloodstream-component-bleeding", ("target", ent.Owner))); + else + args.Message.AddMarkup(Loc.GetString("bloodstream-component-selfaware-bleeding")); } // If the mob's blood level is below the damage threshhold, the pale message is added. if (GetBloodLevelPercentage(ent, ent) < ent.Comp.BloodlossThreshold) { args.Message.PushNewline(); - args.Message.AddMarkup(Loc.GetString("bloodstream-component-looks-pale", ("target", ent.Owner))); + if (!args.IsSelfAware) + args.Message.AddMarkup(Loc.GetString("bloodstream-component-looks-pale", ("target", ent.Owner))); + else + args.Message.AddMarkup(Loc.GetString("bloodstream-component-selfaware-looks-pale")); } } @@ -463,4 +478,16 @@ public void ChangeBloodReagent(EntityUid uid, string reagent, BloodstreamCompone if (currentVolume > 0) _solutionContainerSystem.TryAddReagent(component.BloodSolution.Value, component.BloodReagent, currentVolume, out _); } + + /// + /// Remove blood from an entity, without spilling it. + /// + private void RemoveBlood(EntityUid uid, FixedPoint2 amount, BloodstreamComponent? component = null) + { + if (!Resolve(uid, ref component, logMissing: false) + || !_solutionContainerSystem.ResolveSolution(uid, component.BloodSolutionName, ref component.BloodSolution, out var bloodSolution)) + return; + + bloodSolution.RemoveReagent(component.BloodReagent, amount); + } } diff --git a/Content.Server/Botany/Components/TeleportingTraitComponent.cs b/Content.Server/Botany/Components/TeleportingTraitComponent.cs new file mode 100644 index 0000000000..b5f79ac8c7 --- /dev/null +++ b/Content.Server/Botany/Components/TeleportingTraitComponent.cs @@ -0,0 +1,31 @@ +namespace Content.Server.Botany +{ + [RegisterComponent] + + public sealed partial class TeleportingTraitComponent : Component + { + /// + /// Teleportation radius of produce. + /// + [DataField] + public float ProduceTeleportRadius; + + /// + /// How much to divide the potency. + /// + [DataField] + public float PotencyDivide = 10f; + + /// + /// Potency of fruit. + /// + [DataField] + public float Potency; + + /// + /// Chance of deletion. + /// + [DataField] + public float DeletionChance = .5f; + } +} diff --git a/Content.Server/Botany/SeedPrototype.cs b/Content.Server/Botany/SeedPrototype.cs index 1a3c0473a4..2644da2a3b 100644 --- a/Content.Server/Botany/SeedPrototype.cs +++ b/Content.Server/Botany/SeedPrototype.cs @@ -205,6 +205,11 @@ public partial class SeedData /// [DataField("ligneous")] public bool Ligneous; + /// + /// If true, teleports both fruit and player if slippable. + /// + [DataField] public bool Teleporting; + // No, I'm not removing these. // if you re-add these, make sure that they get cloned. //public PlantSpread Spread { get; set; } @@ -215,7 +220,6 @@ public partial class SeedData //public bool Hematophage { get; set; } //public bool Thorny { get; set; } //public bool Stinging { get; set; } - // public bool Teleporting { get; set; } // public PlantJuicy Juicy { get; set; } #endregion @@ -295,6 +299,7 @@ public SeedData Clone() Slip = Slip, Sentient = Sentient, Ligneous = Ligneous, + Teleporting = Teleporting, PlantRsi = PlantRsi, PlantIconState = PlantIconState, @@ -358,6 +363,7 @@ public SeedData SpeciesChange(SeedData other) Slip = Slip, Sentient = Sentient, Ligneous = Ligneous, + Teleporting = Teleporting, PlantRsi = other.PlantRsi, PlantIconState = other.PlantIconState, diff --git a/Content.Server/Botany/Systems/BotanySystem.Seed.cs b/Content.Server/Botany/Systems/BotanySystem.Seed.cs index f64fcb3c43..82190d1c44 100644 --- a/Content.Server/Botany/Systems/BotanySystem.Seed.cs +++ b/Content.Server/Botany/Systems/BotanySystem.Seed.cs @@ -207,6 +207,11 @@ public IEnumerable GenerateProduct(SeedData proto, EntityCoordinates var collisionWake = EnsureComp(entity); _colWakeSystem.SetEnabled(entity, false, collisionWake); } + if (proto.Teleporting) + { + var teleporting = EnsureComp(entity); + TeleportingTraitSystem.SetPotencyRadius(proto.Potency, teleporting); + } } return products; diff --git a/Content.Server/Botany/Systems/MutationSystem.cs b/Content.Server/Botany/Systems/MutationSystem.cs index c7ce5d47ef..4780f8b331 100644 --- a/Content.Server/Botany/Systems/MutationSystem.cs +++ b/Content.Server/Botany/Systems/MutationSystem.cs @@ -40,7 +40,7 @@ public void MutateSeed(ref SeedData seed, float severity) } // Add up everything in the bits column and put the number here. - const int totalbits = 275; + const int totalbits = 285; // Tolerances (55) MutateFloat(ref seed.NutrientConsumption , 0.05f, 1.2f, 5, totalbits, severity); @@ -66,11 +66,12 @@ public void MutateSeed(ref SeedData seed, float severity) // Kill the plant (30) MutateBool(ref seed.Viable , false, 30, totalbits, severity); - // Fun (90) + // Fun (100) MutateBool(ref seed.Seedless , true , 10, totalbits, severity); MutateBool(ref seed.Slip , true , 10, totalbits, severity); MutateBool(ref seed.Sentient , true , 10, totalbits, severity); MutateBool(ref seed.Ligneous , true , 10, totalbits, severity); + MutateBool(ref seed.Teleporting , true , 10, totalbits, severity); MutateBool(ref seed.Bioluminescent, true , 10, totalbits, severity); MutateBool(ref seed.TurnIntoKudzu , true , 10, totalbits, severity); MutateBool(ref seed.CanScream , true , 10, totalbits, severity); @@ -120,6 +121,7 @@ public SeedData Cross(SeedData a, SeedData b) CrossBool(ref result.Slip, a.Slip); CrossBool(ref result.Sentient, a.Sentient); CrossBool(ref result.Ligneous, a.Ligneous); + CrossBool(ref result.Teleporting, a.Teleporting); CrossBool(ref result.Bioluminescent, a.Bioluminescent); CrossBool(ref result.TurnIntoKudzu, a.TurnIntoKudzu); CrossBool(ref result.CanScream, a.CanScream); diff --git a/Content.Server/Botany/Systems/TeleportingTraitSystem.cs b/Content.Server/Botany/Systems/TeleportingTraitSystem.cs new file mode 100644 index 0000000000..7aa9a6a82a --- /dev/null +++ b/Content.Server/Botany/Systems/TeleportingTraitSystem.cs @@ -0,0 +1,51 @@ +using Robust.Shared.Random; +using Content.Shared.Slippery; +using Content.Server.Fluids.EntitySystems; +using Content.Shared.Chemistry.Components; +using Content.Shared.Popups; + +namespace Content.Server.Botany.Systems; + +public sealed class TeleportingTraitSystem : EntitySystem +{ + [Dependency] private readonly SharedTransformSystem _xform = default!; + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly PuddleSystem _puddle = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(Teleport); + } + + // sets the potency and the radius + public static void SetPotencyRadius(float seedPotency, TeleportingTraitComponent comp) + { + comp.Potency = seedPotency; + comp.ProduceTeleportRadius = comp.Potency / comp.PotencyDivide; + } + + // teleports both the produce and the foolish fool who slipped on it to a random postion limited by the radius + private void Teleport(EntityUid uid, TeleportingTraitComponent comp, ref SlipEvent args) + { + var coordinates = Transform(uid).Coordinates; + _xform.SetCoordinates(uid, coordinates.Offset(_random.NextVector2(comp.ProduceTeleportRadius))); + _popup.PopupEntity(Loc.GetString("teleporting-trait-component-slipped"), args.Slipped, args.Slipped, PopupType.SmallCaution); + _xform.SetCoordinates(args.Slipped, coordinates.Offset(_random.NextVector2(comp.ProduceTeleportRadius))); + VanishProbablity(uid, comp); + } + + // chance of being deleted and then spawnin the goop + private void VanishProbablity(EntityUid uid, TeleportingTraitComponent comp) + { + if (!_random.Prob(comp.DeletionChance)) + return; + Solution vanishSolution = new(); + vanishSolution.AddReagent("Slime", comp.Potency / 2); + _puddle.TrySpillAt(uid, vanishSolution, out _); + QueueDel(uid); + } +} + diff --git a/Content.Server/Carrying/CarryingSystem.cs b/Content.Server/Carrying/CarryingSystem.cs index 84890c229e..13338ea2b7 100644 --- a/Content.Server/Carrying/CarryingSystem.cs +++ b/Content.Server/Carrying/CarryingSystem.cs @@ -131,7 +131,7 @@ private void OnVirtualItemDeleted(EntityUid uid, CarryingComponent component, Vi /// Basically using virtual item passthrough to throw the carried person. A new age! /// Maybe other things besides throwing should use virt items like this... /// - private void OnThrow(EntityUid uid, CarryingComponent component, BeforeThrowEvent args) + private void OnThrow(EntityUid uid, CarryingComponent component, ref BeforeThrowEvent args) { if (!TryComp(args.ItemUid, out var virtItem) || !HasComp(virtItem.BlockingEntity)) @@ -139,9 +139,8 @@ private void OnThrow(EntityUid uid, CarryingComponent component, BeforeThrowEven args.ItemUid = virtItem.BlockingEntity; - var multiplier = _contests.MassContest(uid, virtItem.BlockingEntity, false, 2f) + args.ThrowStrength *= _contests.MassContest(uid, virtItem.BlockingEntity, false, 2f) * _contests.StaminaContest(uid, virtItem.BlockingEntity); - args.ThrowStrength = 5f * multiplier; } private void OnParentChanged(EntityUid uid, CarryingComponent component, ref EntParentChangedMessage args) @@ -181,11 +180,10 @@ private void OnMoveInput(EntityUid uid, BeingCarriedComponent component, ref Mov || !args.HasDirectionalMovement) return; + // Check if the victim is in any way incapacitated, and if not make an escape attempt. + // Escape time scales with the inverse of a mass contest. Being lighter makes escape harder. if (_actionBlockerSystem.CanInteract(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, _contests.MassContest(component.Carrier, uid, false, 2f)); - } + _escapeInventorySystem.AttemptEscape(uid, component.Carrier, escape, _contests.MassContest(uid, component.Carrier, false, 2f)); } private void OnMoveAttempt(EntityUid uid, BeingCarriedComponent component, UpdateCanMoveEvent args) @@ -313,7 +311,11 @@ public void DropCarried(EntityUid carrier, EntityUid carried) private void ApplyCarrySlowdown(EntityUid carrier, EntityUid carried) { - var modifier = _contests.MassContest(carrier, carried, true); + var massRatio = _contests.MassContest(carrier, carried, true); + var massRatioSq = MathF.Pow(massRatio, 2); + var modifier = 1 - 0.15f / massRatioSq; + modifier = Math.Max(0.1f, modifier); + var slowdownComp = EnsureComp(carrier); _slowdown.SetModifier(carrier, modifier, modifier, slowdownComp); } @@ -328,10 +330,6 @@ public bool CanCarry(EntityUid carrier, EntityUid carried, CarriableComponent? c || !TryComp(carrier, out var hands) || hands.CountFreeHands() < carriedComp.FreeHandsRequired) return false; - - // if (_respirator.IsReceivingCPR(carried)) - // return false; - return true; } diff --git a/Content.Server/Construction/Components/WelderRefinableComponent.cs b/Content.Server/Construction/Components/WelderRefinableComponent.cs index 9d8958f761..dc3074f195 100644 --- a/Content.Server/Construction/Components/WelderRefinableComponent.cs +++ b/Content.Server/Construction/Components/WelderRefinableComponent.cs @@ -1,5 +1,6 @@ using Content.Shared.Tools; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; +using Content.Shared.Storage; +using Robust.Shared.Prototypes; namespace Content.Server.Construction.Components { @@ -10,13 +11,13 @@ namespace Content.Server.Construction.Components [RegisterComponent] public sealed partial class WelderRefinableComponent : Component { - [DataField("refineResult")] - public HashSet? RefineResult = new(); + [DataField] + public List RefineResult = new(); - [DataField("refineTime")] + [DataField] public float RefineTime = 2f; - [DataField("qualityNeeded", customTypeSerializer:typeof(PrototypeIdSerializer))] - public string QualityNeeded = "Welding"; + [DataField] + public ProtoId QualityNeeded = "Welding"; } } diff --git a/Content.Server/Construction/RefiningSystem.cs b/Content.Server/Construction/RefiningSystem.cs index b9d80c7170..d4df8b0916 100644 --- a/Content.Server/Construction/RefiningSystem.cs +++ b/Content.Server/Construction/RefiningSystem.cs @@ -1,11 +1,8 @@ using Content.Server.Construction.Components; using Content.Server.Stack; using Content.Shared.Construction; -using Content.Shared.DoAfter; using Content.Shared.Interaction; -using Content.Shared.Stacks; -using Content.Shared.Tools; -using Robust.Shared.Serialization; +using Content.Shared.Storage; using SharedToolSystem = Content.Shared.Tools.Systems.SharedToolSystem; namespace Content.Server.Construction @@ -13,7 +10,6 @@ namespace Content.Server.Construction public sealed class RefiningSystem : EntitySystem { [Dependency] private readonly SharedToolSystem _toolSystem = default!; - [Dependency] private readonly StackSystem _stackSystem = default!; public override void Initialize() { base.Initialize(); @@ -39,14 +35,9 @@ private void OnDoAfter(EntityUid uid, WelderRefinableComponent component, Welder EntityManager.DeleteEntity(uid); // spawn each result after refine - foreach (var result in component.RefineResult!) + foreach (var ent in EntitySpawnCollection.GetSpawns(component.RefineResult)) { - var droppedEnt = EntityManager.SpawnEntity(result, resultPosition); - - // TODO: If something has a stack... Just use a prototype with a single thing in the stack. - // This is not a good way to do it. - if (TryComp(droppedEnt, out var stack)) - _stackSystem.SetCount(droppedEnt, 1, stack); + Spawn(ent, resultPosition); } } } diff --git a/Content.Server/DeltaV/NPC/Roboisseur/RoboisseurSystem.cs b/Content.Server/DeltaV/NPC/Roboisseur/RoboisseurSystem.cs index b4e99e6199..ee1c458223 100644 --- a/Content.Server/DeltaV/NPC/Roboisseur/RoboisseurSystem.cs +++ b/Content.Server/DeltaV/NPC/Roboisseur/RoboisseurSystem.cs @@ -58,7 +58,7 @@ public override void Update(float frameTime) } else if (CheckTier(roboisseur.DesiredPrototype.ID, roboisseur) > 2) message = Loc.GetString(_random.Pick(roboisseur.DemandMessagesTier2), ("item", roboisseur.DesiredPrototype.Name)); - _chat.TrySendInGameICMessage(roboisseur.Owner, message, InGameICChatType.Speak, false); + _chat.TrySendInGameICMessage(roboisseur.Owner, message, InGameICChatType.Speak, true); } if (roboisseur.Accumulator >= roboisseur.ResetTime.TotalSeconds) @@ -100,7 +100,7 @@ private void OnInteractHand(EntityUid uid, RoboisseurComponent component, Intera if (CheckTier(component.DesiredPrototype.ID, component) > 1) message = Loc.GetString(_random.Pick(component.DemandMessagesTier2), ("item", component.DesiredPrototype.Name)); - _chat.TrySendInGameICMessage(component.Owner, message, InGameICChatType.Speak, false); + _chat.TrySendInGameICMessage(component.Owner, message, InGameICChatType.Speak, true); } private void OnInteractUsing(EntityUid uid, RoboisseurComponent component, InteractUsingEvent args) diff --git a/Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs b/Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs index f9403f33b9..d6647bbf2e 100644 --- a/Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs +++ b/Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs @@ -235,7 +235,7 @@ private void OnUiButtonPressed(EntityUid uid, SharedDisposalUnitComponent compon _adminLogger.Add(LogType.Action, LogImpact.Low, $"{ToPrettyString(player):player} hit flush button on {ToPrettyString(uid)}, it's now {(component.Engaged ? "on" : "off")}"); break; case SharedDisposalUnitComponent.UiButton.Power: - _power.TogglePower(uid, user: args.Session.AttachedEntity); + _power.TryTogglePower(uid, user: args.Session.AttachedEntity); break; default: throw new ArgumentOutOfRangeException($"{ToPrettyString(player):player} attempted to hit a nonexistant button on {ToPrettyString(uid)}"); diff --git a/Content.Server/Emp/EmpSystem.cs b/Content.Server/Emp/EmpSystem.cs index 7c1a6f9b5d..3a1d2d2819 100644 --- a/Content.Server/Emp/EmpSystem.cs +++ b/Content.Server/Emp/EmpSystem.cs @@ -1,7 +1,7 @@ using Content.Server.Explosion.EntitySystems; +using Content.Server.Power.Components; using Content.Server.Power.EntitySystems; using Content.Server.Radio; -using Content.Server.SurveillanceCamera; using Content.Shared.Emp; using Content.Shared.Examine; using Robust.Shared.Map; @@ -22,8 +22,6 @@ public override void Initialize() SubscribeLocalEvent(OnRadioSendAttempt); SubscribeLocalEvent(OnRadioReceiveAttempt); - SubscribeLocalEvent(OnApcToggleMainBreaker); - SubscribeLocalEvent(OnCameraSetActive); } /// @@ -75,7 +73,19 @@ public void DoEmpEffects(EntityUid uid, float energyConsumption, float duration) if (ev.Disabled) { var disabled = EnsureComp(uid); - disabled.DisabledUntil = Timing.CurTime + TimeSpan.FromSeconds(duration); + // couldnt use null-coalescing operator here sadge + if (disabled.DisabledUntil == TimeSpan.Zero) + { + disabled.DisabledUntil = Timing.CurTime; + } + disabled.DisabledUntil = disabled.DisabledUntil + TimeSpan.FromSeconds(duration); + + /// i tried my best to go through the Pow3r server code but i literally couldn't find in relation to PowerNetworkBatteryComponent that uses the event system + /// the code is otherwise too esoteric for my innocent eyes + if (TryComp(uid, out var powerNetBattery)) + { + powerNetBattery.CanCharge = false; + } } } @@ -91,6 +101,11 @@ public override void Update(float frameTime) RemComp(uid); var ev = new EmpDisabledRemoved(); RaiseLocalEvent(uid, ref ev); + + if (TryComp(uid, out var powerNetBattery)) + { + powerNetBattery.CanCharge = true; + } } } } @@ -115,16 +130,6 @@ private void OnRadioReceiveAttempt(EntityUid uid, EmpDisabledComponent component { args.Cancelled = true; } - - private void OnApcToggleMainBreaker(EntityUid uid, EmpDisabledComponent component, ref ApcToggleMainBreakerAttemptEvent args) - { - args.Cancelled = true; - } - - private void OnCameraSetActive(EntityUid uid, EmpDisabledComponent component, ref SurveillanceCameraSetActiveAttemptEvent args) - { - args.Cancelled = true; - } } /// diff --git a/Content.Server/Eye/Blinding/EyeProtection/EyeProtectionSystem.cs b/Content.Server/Eye/Blinding/EyeProtection/EyeProtectionSystem.cs index 2d54c03b51..744483cfb8 100644 --- a/Content.Server/Eye/Blinding/EyeProtection/EyeProtectionSystem.cs +++ b/Content.Server/Eye/Blinding/EyeProtection/EyeProtectionSystem.cs @@ -11,7 +11,7 @@ public sealed class EyeProtectionSystem : EntitySystem { [Dependency] private readonly StatusEffectsSystem _statusEffectsSystem = default!; [Dependency] private readonly BlindableSystem _blindingSystem = default!; - + public override void Initialize() { base.Initialize(); diff --git a/Content.Server/Forensics/Components/FiberComponent.cs b/Content.Server/Forensics/Components/FiberComponent.cs index 2086c95870..4cbb1e7be7 100644 --- a/Content.Server/Forensics/Components/FiberComponent.cs +++ b/Content.Server/Forensics/Components/FiberComponent.cs @@ -12,5 +12,8 @@ public sealed partial class FiberComponent : Component [DataField] public string? FiberColor; + + [DataField] + public string? Fiberprint; } } diff --git a/Content.Server/Forensics/Systems/ForensicsSystem.cs b/Content.Server/Forensics/Systems/ForensicsSystem.cs index a081429fd3..1663c20fed 100644 --- a/Content.Server/Forensics/Systems/ForensicsSystem.cs +++ b/Content.Server/Forensics/Systems/ForensicsSystem.cs @@ -23,6 +23,7 @@ public sealed class ForensicsSystem : EntitySystem public override void Initialize() { SubscribeLocalEvent(OnInteract); + SubscribeLocalEvent(OnFiberInit); SubscribeLocalEvent(OnFingerprintInit); SubscribeLocalEvent(OnDNAInit); @@ -39,6 +40,11 @@ private void OnInteract(EntityUid uid, FingerprintComponent component, ContactIn ApplyEvidence(uid, args.Other); } + private void OnFiberInit(EntityUid uid, FiberComponent component, MapInitEvent args) + { + component.Fiberprint = GenerateFingerprint(length: 7); + } + private void OnFingerprintInit(EntityUid uid, FingerprintComponent component, MapInitEvent args) { component.Fingerprint = GenerateFingerprint(); @@ -150,9 +156,9 @@ private void OnCleanForensicsDoAfter(EntityUid uid, ForensicsComponent component targetComp.Residues.Add(string.IsNullOrEmpty(residue.ResidueColor) ? Loc.GetString("forensic-residue", ("adjective", residue.ResidueAdjective)) : Loc.GetString("forensic-residue-colored", ("color", residue.ResidueColor), ("adjective", residue.ResidueAdjective))); } - public string GenerateFingerprint() + public string GenerateFingerprint(int length = 16) { - var fingerprint = new byte[16]; + var fingerprint = new byte[Math.Clamp(length, 0, 255)]; _random.NextBytes(fingerprint); return Convert.ToHexString(fingerprint); } @@ -179,7 +185,12 @@ private void ApplyEvidence(EntityUid user, EntityUid target) if (_inventory.TryGetSlotEntity(user, "gloves", out var gloves)) { if (TryComp(gloves, out var fiber) && !string.IsNullOrEmpty(fiber.FiberMaterial)) - component.Fibers.Add(string.IsNullOrEmpty(fiber.FiberColor) ? Loc.GetString("forensic-fibers", ("material", fiber.FiberMaterial)) : Loc.GetString("forensic-fibers-colored", ("color", fiber.FiberColor), ("material", fiber.FiberMaterial))); + { + var fiberLocale = string.IsNullOrEmpty(fiber.FiberColor) + ? Loc.GetString("forensic-fibers", ("material", fiber.FiberMaterial)) + : Loc.GetString("forensic-fibers-colored", ("color", fiber.FiberColor), ("material", fiber.FiberMaterial)); + component.Fibers.Add(fiberLocale + " ; " + fiber.Fiberprint); + } if (HasComp(gloves)) return; diff --git a/Content.Server/GameTicking/Rules/ZombieRuleSystem.cs b/Content.Server/GameTicking/Rules/ZombieRuleSystem.cs index e8dc37dc1e..5714337d4d 100644 --- a/Content.Server/GameTicking/Rules/ZombieRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/ZombieRuleSystem.cs @@ -43,6 +43,7 @@ public sealed class ZombieRuleSystem : GameRuleSystem [Dependency] private readonly AntagSelectionSystem _antagSelection = default!; [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly AnnouncerSystem _announcer = default!; + [Dependency] private readonly GameTicker _gameTicker = default!; public override void Initialize() { @@ -89,7 +90,7 @@ private void OnRoundEndText(RoundEndTextAppendEvent ev) ("username", player.Value))); } - var healthy = GetHealthyHumans(); + var healthy = GetHealthyHumans(true); // Gets a bunch of the living players and displays them if they're under a threshold. // InitialInfected is used for the threshold because it scales with the player count well. if (healthy.Count <= 0 || healthy.Count > 2 * zombie.InitialInfectedNames.Count) @@ -185,7 +186,7 @@ private void OnZombifySelf(EntityUid uid, PendingZombieComponent component, Zomb /// Include healthy players that are not on the station grid /// Should dead zombies be included in the count /// - private float GetInfectedFraction(bool includeOffStation = true, bool includeDead = false) + private float GetInfectedFraction(bool includeOffStation = false, bool includeDead = true) { var players = GetHealthyHumans(includeOffStation); var zombieCount = 0; @@ -205,14 +206,14 @@ private float GetInfectedFraction(bool includeOffStation = true, bool includeDea /// Flying off via a shuttle disqualifies you. /// /// - private List GetHealthyHumans(bool includeOffStation = true) + private List GetHealthyHumans(bool includeOffStation = false) { var healthy = new List(); var stationGrids = new HashSet(); if (!includeOffStation) { - foreach (var station in _station.GetStationsSet()) + foreach (var station in _gameTicker.GetSpawnableStations()) { if (TryComp(station, out var data) && _station.GetLargestGrid(data) is { } grid) stationGrids.Add(grid); @@ -223,13 +224,11 @@ private List GetHealthyHumans(bool includeOffStation = true) var zombers = GetEntityQuery(); while (players.MoveNext(out var uid, out _, out _, out var mob, out var xform)) { - if (!_mobState.IsAlive(uid, mob)) - continue; - - if (zombers.HasComponent(uid)) - continue; - - if (!includeOffStation && !stationGrids.Contains(xform.GridUid ?? EntityUid.Invalid)) + if (!_mobState.IsAlive(uid, mob) + || HasComp(uid) //Do not include infected players in the "Healthy players" list. + || HasComp(uid) + || zombers.HasComponent(uid) + || !includeOffStation && !stationGrids.Contains(xform.GridUid ?? EntityUid.Invalid)) continue; healthy.Add(uid); diff --git a/Content.Server/Gravity/GravityGeneratorSystem.cs b/Content.Server/Gravity/GravityGeneratorSystem.cs index b0c4bb56ff..ec5646457e 100644 --- a/Content.Server/Gravity/GravityGeneratorSystem.cs +++ b/Content.Server/Gravity/GravityGeneratorSystem.cs @@ -1,6 +1,7 @@ using Content.Server.Administration.Logs; using Content.Server.Audio; using Content.Server.Power.Components; +using Content.Server.Emp; using Content.Shared.Database; using Content.Shared.Gravity; using Content.Shared.Interaction; @@ -28,6 +29,8 @@ public override void Initialize() SubscribeLocalEvent(OnInteractHand); SubscribeLocalEvent( OnSwitchGenerator); + + SubscribeLocalEvent(OnEmpPulse); } private void OnParentChanged(EntityUid uid, GravityGeneratorComponent component, ref EntParentChangedMessage args) @@ -289,5 +292,28 @@ private void OnSwitchGenerator( { SetSwitchedOn(uid, component, args.On, session:args.Session); } + + private void OnEmpPulse(EntityUid uid, GravityGeneratorComponent component, EmpPulseEvent args) + { + /// i really don't think that the gravity generator should use normalised 0-1 charge + /// as opposed to watts charge that every other battery uses + + ApcPowerReceiverComponent? powerReceiver = null; + if (!Resolve(uid, ref powerReceiver, false)) + return; + + var ent = (uid, component, powerReceiver); + + // convert from normalised energy to watts and subtract + float maxEnergy = component.ActivePowerUse / component.ChargeRate; + float currentEnergy = maxEnergy * component.Charge; + currentEnergy = Math.Max(0, currentEnergy - args.EnergyConsumption); + + // apply renormalised energy to charge variable + component.Charge = currentEnergy / maxEnergy; + + // update power state + UpdateState(ent); + } } } diff --git a/Content.Server/HealthExaminable/HealthExaminableComponent.cs b/Content.Server/HealthExaminable/HealthExaminableComponent.cs index 3f434a93cf..04053aed70 100644 --- a/Content.Server/HealthExaminable/HealthExaminableComponent.cs +++ b/Content.Server/HealthExaminable/HealthExaminableComponent.cs @@ -1,4 +1,4 @@ -using Content.Shared.Damage.Prototypes; +using Content.Shared.Damage.Prototypes; using Content.Shared.FixedPoint; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Set; @@ -7,8 +7,12 @@ namespace Content.Server.HealthExaminable; [RegisterComponent, Access(typeof(HealthExaminableSystem))] public sealed partial class HealthExaminableComponent : Component { + // + // The thresholds for determining the examine text for certain amounts of damage. + // These are calculated as a percentage of the entity's critical threshold. + // public List Thresholds = new() - { FixedPoint2.New(10), FixedPoint2.New(25), FixedPoint2.New(50), FixedPoint2.New(75) }; + { FixedPoint2.New(0.10), FixedPoint2.New(0.25), FixedPoint2.New(0.50), FixedPoint2.New(0.75) }; [DataField("examinableTypes", required: true, customTypeSerializer:typeof(PrototypeIdHashSetSerializer))] public HashSet ExaminableTypes = default!; diff --git a/Content.Server/HealthExaminable/HealthExaminableSystem.cs b/Content.Server/HealthExaminable/HealthExaminableSystem.cs index ed69a1c096..89291726fb 100644 --- a/Content.Server/HealthExaminable/HealthExaminableSystem.cs +++ b/Content.Server/HealthExaminable/HealthExaminableSystem.cs @@ -1,15 +1,20 @@ -using Content.Shared.Damage; +using Content.Server.Traits.Assorted; +using Content.Shared.Damage; using Content.Shared.Examine; using Content.Shared.FixedPoint; using Content.Shared.IdentityManagement; +using Content.Shared.Mobs.Components; +using Content.Shared.Mobs.Systems; using Content.Shared.Verbs; using Robust.Shared.Utility; +using System.Linq; namespace Content.Server.HealthExaminable; public sealed class HealthExaminableSystem : EntitySystem { [Dependency] private readonly ExamineSystemShared _examineSystem = default!; + [Dependency] private readonly MobThresholdSystem _threshold = default!; public override void Initialize() { @@ -29,7 +34,13 @@ private void OnGetExamineVerbs(EntityUid uid, HealthExaminableComponent componen { Act = () => { - var markup = CreateMarkup(uid, component, damage); + FormattedMessage markup; + if (uid == args.User + && TryComp(uid, out var selfAware)) + markup = CreateMarkupSelfAware(uid, selfAware, component, damage); + else + markup = CreateMarkup(uid, component, damage); + _examineSystem.SendExamineTooltip(args.User, uid, markup, false, false); }, Text = Loc.GetString("health-examinable-verb-text"), @@ -47,6 +58,9 @@ private FormattedMessage CreateMarkup(EntityUid uid, HealthExaminableComponent c var msg = new FormattedMessage(); var first = true; + + var adjustedThresholds = GetAdjustedThresholds(uid, component.Thresholds); + foreach (var type in component.ExaminableTypes) { if (!damage.Damage.DamageDict.TryGetValue(type, out var dmg)) @@ -58,7 +72,7 @@ private FormattedMessage CreateMarkup(EntityUid uid, HealthExaminableComponent c FixedPoint2 closest = FixedPoint2.Zero; string chosenLocStr = string.Empty; - foreach (var threshold in component.Thresholds) + foreach (var threshold in adjustedThresholds) { var str = $"health-examinable-{component.LocPrefix}-{type}-{threshold}"; var tempLocStr = Loc.GetString($"health-examinable-{component.LocPrefix}-{type}-{threshold}", ("target", Identity.Entity(uid, EntityManager))); @@ -94,10 +108,100 @@ private FormattedMessage CreateMarkup(EntityUid uid, HealthExaminableComponent c } // Anything else want to add on to this? - RaiseLocalEvent(uid, new HealthBeingExaminedEvent(msg), true); + RaiseLocalEvent(uid, new HealthBeingExaminedEvent(msg, false), true); return msg; } + + private FormattedMessage CreateMarkupSelfAware(EntityUid target, SelfAwareComponent selfAware, HealthExaminableComponent component, DamageableComponent damage) + { + var msg = new FormattedMessage(); + + var first = true; + + foreach (var type in selfAware.AnalyzableTypes) + { + if (!damage.Damage.DamageDict.TryGetValue(type, out var typeDmgUnrounded)) + continue; + + var typeDmg = (int) Math.Round(typeDmgUnrounded.Float(), 0); + if (typeDmg <= 0) + continue; + + var damageString = Loc.GetString( + "health-examinable-selfaware-type-text", + ("damageType", Loc.GetString($"health-examinable-selfaware-type-{type}")), + ("amount", typeDmg) + ); + + if (!first) + msg.PushNewline(); + else + first = false; + msg.AddMarkup(damageString); + } + + var adjustedThresholds = GetAdjustedThresholds(target, selfAware.Thresholds); + + foreach (var group in selfAware.DetectableGroups) + { + if (!damage.DamagePerGroup.TryGetValue(group, out var groupDmg) + || groupDmg == FixedPoint2.Zero) + continue; + + FixedPoint2 closest = FixedPoint2.Zero; + + string chosenLocStr = string.Empty; + foreach (var threshold in adjustedThresholds) + { + var locName = $"health-examinable-selfaware-group-{group}-{threshold}"; + var locStr = Loc.GetString(locName); + + var locDoesNotExist = locStr == locName; + if (locDoesNotExist) + continue; + + if (groupDmg > threshold && threshold > closest) + { + chosenLocStr = locStr; + closest = threshold; + } + } + + if (closest == FixedPoint2.Zero) + continue; + + if (!first) + msg.PushNewline(); + else + first = false; + msg.AddMarkup(chosenLocStr); + } + + if (msg.IsEmpty) + msg.AddMarkup(Loc.GetString($"health-examinable-selfaware-none")); + + // Event listeners can know if the examination is Self-Aware. + RaiseLocalEvent(target, new HealthBeingExaminedEvent(msg, true), true); + + return msg; + } + + /// + /// Return thresholds as percentages of an entity's critical threshold. + /// + private List GetAdjustedThresholds(EntityUid uid, List thresholdPercentages) + { + FixedPoint2 critThreshold = 0; + if (TryComp(uid, out var threshold)) + critThreshold = _threshold.GetThresholdForState(uid, Shared.Mobs.MobState.Critical, threshold); + + // Fallback to 100 crit threshold if none found + if (critThreshold == 0) + critThreshold = 100; + + return thresholdPercentages.Select(percentage => critThreshold * percentage).ToList(); + } } /// @@ -108,9 +212,11 @@ private FormattedMessage CreateMarkup(EntityUid uid, HealthExaminableComponent c public sealed class HealthBeingExaminedEvent { public FormattedMessage Message; + public bool IsSelfAware; - public HealthBeingExaminedEvent(FormattedMessage message) + public HealthBeingExaminedEvent(FormattedMessage message, bool isSelfAware) { Message = message; + IsSelfAware = isSelfAware; } } diff --git a/Content.Server/Language/Commands/AdminLanguageCommand.cs b/Content.Server/Language/Commands/AdminLanguageCommand.cs new file mode 100644 index 0000000000..f02d9c7f40 --- /dev/null +++ b/Content.Server/Language/Commands/AdminLanguageCommand.cs @@ -0,0 +1,75 @@ +using Content.Server.Administration; +using Content.Shared.Administration; +using Content.Shared.Language; +using Content.Shared.Language.Components; +using Content.Shared.Language.Systems; +using Robust.Shared.Toolshed; +using Robust.Shared.Toolshed.Syntax; +using Robust.Shared.Toolshed.TypeParsers; + +namespace Content.Server.Language.Commands; + +[ToolshedCommand(Name = "language"), AdminCommand(AdminFlags.Admin)] +public sealed class AdminLanguageCommand : ToolshedCommand +{ + private LanguageSystem? _languagesField; + private LanguageSystem Languages => _languagesField ??= GetSys(); + + [CommandImplementation("add")] + public EntityUid AddLanguage( + [CommandInvocationContext] IInvocationContext ctx, + [PipedArgument] EntityUid input, + [CommandArgument] ValueRef> @ref, + [CommandArgument] bool canSpeak = true, + [CommandArgument] bool canUnderstand = true + ) + { + var language = @ref.Evaluate(ctx)!; + + if (language == SharedLanguageSystem.UniversalPrototype) + { + EnsureComp(input); + Languages.UpdateEntityLanguages(input); + } + else + { + EnsureComp(input); + Languages.AddLanguage(input, language, canSpeak, canUnderstand); + } + + return input; + } + + [CommandImplementation("rm")] + public EntityUid RemoveLanguage( + [CommandInvocationContext] IInvocationContext ctx, + [PipedArgument] EntityUid input, + [CommandArgument] ValueRef> @ref, + [CommandArgument] bool removeSpeak = true, + [CommandArgument] bool removeUnderstand = true + ) + { + var language = @ref.Evaluate(ctx)!; + if (language == SharedLanguageSystem.UniversalPrototype && HasComp(input)) + { + RemComp(input); + EnsureComp(input); + } + // We execute this branch even in case of universal so that it gets removed if it was added manually to the LanguageKnowledge + Languages.RemoveLanguage(input, language, removeSpeak, removeUnderstand); + + return input; + } + + [CommandImplementation("lsspoken")] + public IEnumerable ListSpoken([PipedArgument] EntityUid input) + { + return Languages.GetSpokenLanguages(input); + } + + [CommandImplementation("lsunderstood")] + public IEnumerable ListUnderstood([PipedArgument] EntityUid input) + { + return Languages.GetUnderstoodLanguages(input); + } +} diff --git a/Content.Server/Language/Commands/AdminTranslatorCommand.cs b/Content.Server/Language/Commands/AdminTranslatorCommand.cs new file mode 100644 index 0000000000..8a7984bc36 --- /dev/null +++ b/Content.Server/Language/Commands/AdminTranslatorCommand.cs @@ -0,0 +1,155 @@ +using System.Diagnostics.CodeAnalysis; +using Content.Server.Administration; +using Content.Shared.Administration; +using Content.Shared.Language; +using Content.Shared.Language.Components; +using Content.Shared.Language.Components.Translators; +using Content.Shared.Language.Systems; +using Robust.Server.Containers; +using Robust.Shared.Toolshed; +using Robust.Shared.Toolshed.Syntax; +using Robust.Shared.Toolshed.TypeParsers; + +namespace Content.Server.Language.Commands; + +[ToolshedCommand(Name = "translator"), AdminCommand(AdminFlags.Admin)] +public sealed class AdminTranslatorCommand : ToolshedCommand +{ + private LanguageSystem? _languagesField; + private ContainerSystem? _containersField; + + private ContainerSystem Containers => _containersField ??= GetSys(); + private LanguageSystem Languages => _languagesField ??= GetSys(); + + [CommandImplementation("addlang")] + public EntityUid AddLanguage( + [CommandInvocationContext] IInvocationContext ctx, + [PipedArgument] EntityUid input, + [CommandArgument] ValueRef> @ref, + [CommandArgument] bool addSpeak = true, + [CommandArgument] bool addUnderstand = true + ) + { + var language = @ref.Evaluate(ctx)!; + // noob trap - needs a universallanguagespeakercomponent + if (language == SharedLanguageSystem.UniversalPrototype) + throw new ArgumentException(Loc.GetString("command-language-error-this-will-not-work")); + + if (!TryGetTranslatorComp(input, out var translator)) + throw new ArgumentException(Loc.GetString("command-language-error-not-a-translator", ("entity", input))); + + if (addSpeak && !translator.SpokenLanguages.Contains(language)) + translator.SpokenLanguages.Add(language); + if (addUnderstand && !translator.UnderstoodLanguages.Contains(language)) + translator.UnderstoodLanguages.Add(language); + + UpdateTranslatorHolder(input); + + return input; + } + + [CommandImplementation("rmlang")] + public EntityUid RemoveLanguage( + [CommandInvocationContext] IInvocationContext ctx, + [PipedArgument] EntityUid input, + [CommandArgument] ValueRef> @ref, + [CommandArgument] bool removeSpeak = true, + [CommandArgument] bool removeUnderstand = true + ) + { + var language = @ref.Evaluate(ctx)!; + if (!TryGetTranslatorComp(input, out var translator)) + throw new ArgumentException(Loc.GetString("command-language-error-not-a-translator", ("entity", input))); + + if (removeSpeak) + translator.SpokenLanguages.Remove(language); + if (removeUnderstand) + translator.UnderstoodLanguages.Remove(language); + + UpdateTranslatorHolder(input); + + return input; + } + + [CommandImplementation("addrequired")] + public EntityUid AddRequiredLanguage( + [CommandInvocationContext] IInvocationContext ctx, + [PipedArgument] EntityUid input, + [CommandArgument] ValueRef> @ref) + { + var language = @ref.Evaluate(ctx)!; + if (!TryGetTranslatorComp(input, out var translator)) + throw new ArgumentException(Loc.GetString("command-language-error-not-a-translator", ("entity", input))); + + if (!translator.RequiredLanguages.Contains(language)) + { + translator.RequiredLanguages.Add(language); + UpdateTranslatorHolder(input); + } + + return input; + } + + [CommandImplementation("rmrequired")] + public EntityUid RemoveRequiredLanguage( + [CommandInvocationContext] IInvocationContext ctx, + [PipedArgument] EntityUid input, + [CommandArgument] ValueRef> @ref) + { + var language = @ref.Evaluate(ctx)!; + if (!TryGetTranslatorComp(input, out var translator)) + throw new ArgumentException(Loc.GetString("command-language-error-not-a-translator", ("entity", input))); + + if (translator.RequiredLanguages.Remove(language)) + UpdateTranslatorHolder(input); + + return input; + } + + [CommandImplementation("lsspoken")] + public IEnumerable ListSpoken([PipedArgument] EntityUid input) + { + if (!TryGetTranslatorComp(input, out var translator)) + return []; + return translator.SpokenLanguages; + } + + [CommandImplementation("lsunderstood")] + public IEnumerable ListUnderstood([PipedArgument] EntityUid input) + { + if (!TryGetTranslatorComp(input, out var translator)) + return []; + return translator.UnderstoodLanguages; + } + + [CommandImplementation("lsrequired")] + public IEnumerable ListRequired([PipedArgument] EntityUid input) + { + if (!TryGetTranslatorComp(input, out var translator)) + return []; + return translator.RequiredLanguages; + } + + private bool TryGetTranslatorComp(EntityUid uid, [NotNullWhen(true)] out BaseTranslatorComponent? translator) + { + if (TryComp(uid, out var handheld)) + translator = handheld; + else if (TryComp(uid, out var implant)) + translator = implant; + else if (TryComp(uid, out var intrinsic)) + translator = intrinsic; + else + translator = null; + + return translator != null; + } + + private void UpdateTranslatorHolder(EntityUid translator) + { + if (!Containers.TryGetContainingContainer(translator, out var cont) + || cont.Owner is not { Valid: true } holder) + return; + + Languages.UpdateEntityLanguages(holder); + } +} diff --git a/Content.Server/Medical/PenLightSystem.cs b/Content.Server/Medical/PenLightSystem.cs new file mode 100644 index 0000000000..f48a84d047 --- /dev/null +++ b/Content.Server/Medical/PenLightSystem.cs @@ -0,0 +1,118 @@ +using Content.Server.DoAfter; +using Content.Server.PowerCell; +using Content.Shared.Damage; +using Content.Shared.DoAfter; +using Content.Shared.Drugs; +using Content.Shared.Drunk; +using Content.Shared.Eye.Blinding.Components; +using Content.Shared.Interaction; +using Content.Shared.Medical; +using Content.Shared.Mobs.Systems; +using Content.Shared.Traits.Assorted.Components; +using Robust.Server.GameObjects; +using Robust.Shared.Player; +using Robust.Shared.Timing; + +namespace Content.Server.Medical; +/// +/// This stores the eye exam system for +/// +public sealed class PenLightSystem : EntitySystem +{ + [Dependency] private readonly IEntityManager _entityManager = default!; + [Dependency] private readonly DoAfterSystem _doAfter = default!; + [Dependency] private readonly PowerCellSystem _powerCell = default!; + [Dependency] private readonly UserInterfaceSystem _uiSystem = default!; + /// + public override void Initialize() + { + SubscribeLocalEvent(OnAfterInteract); + SubscribeLocalEvent(OnDoAfter); + } + + private void OnAfterInteract(EntityUid uid, PenLightComponent component, AfterInteractEvent args) + { + if (args.Handled + || args.Target is not { } target) + return; + + args.Handled = TryStartExam(uid, target, args.User, component); + } + + private void OnDoAfter(Entity uid, ref PenLightDoAfterEvent args) + { + if (args.Handled + || args.Cancelled + || args.Target == null + || !_powerCell.HasDrawCharge(uid, user: args.User)) + return; + + OpenUserInterface(args.User, uid); + Diagnose(uid, args.Target.Value); + args.Handled = true; + } + + + /// + /// Actually handles the exam interaction. + /// + public bool TryStartExam(EntityUid uid, EntityUid target, EntityUid user, PenLightComponent? component = null) + { + if (!Resolve(uid, ref component)) + return false; + + return _doAfter.TryStartDoAfter(new DoAfterArgs(EntityManager, user, component.ExamSpeed, new PenLightDoAfterEvent(), + uid, target, uid) + { + BlockDuplicate = true, + BreakOnUserMove = true, + BreakOnTargetMove = true, + BreakOnHandChange = true, + NeedHand = true + }); + } + private void OpenUserInterface(EntityUid user, EntityUid penlight) + { + if (!TryComp(user, out var actor) + || !_uiSystem.TryGetUi(penlight, PenLightUiKey.Key, out var ui)) + return; + + _uiSystem.OpenUi(ui, actor.PlayerSession); + } + + /// + /// Runs the checks for the different types of eye damage + /// + private void Diagnose(EntityUid penlight, EntityUid target) + { + if (!_uiSystem.TryGetUi(penlight, PenLightUiKey.Key, out var ui) + || !HasComp(target)) + return; + // Blind + var blind = _entityManager.HasComponent(target); + + // Drunk + var drunk = _entityManager.HasComponent(target); + + // EyeDamage + var eyeDamage = false; + if (TryComp(target, out var eyeDam)) + { + eyeDamage = eyeDam.EyeDamage > 0 && eyeDam.EyeDamage < 6; //6 means perma-blind + } + + // Hallucinating + var seeingRainbows = _entityManager.HasComponent(target); + + // Healthy + var healthy = !(blind || drunk || eyeDamage || seeingRainbows); + + _uiSystem.SendUiMessage(ui, new PenLightUserMessage(GetNetEntity(target), + blind, + drunk, + eyeDamage, + healthy, + seeingRainbows + )); + } +} diff --git a/Content.Server/Nutrition/EntitySystems/DrinkSystem.cs b/Content.Server/Nutrition/EntitySystems/DrinkSystem.cs index 47e7fa6802..2249926baa 100644 --- a/Content.Server/Nutrition/EntitySystems/DrinkSystem.cs +++ b/Content.Server/Nutrition/EntitySystems/DrinkSystem.cs @@ -7,6 +7,7 @@ using Content.Server.Inventory; using Content.Server.Nutrition.Components; using Content.Server.Popups; +using Content.Server.Traits.Assorted.Components; using Content.Shared.Administration.Logs; using Content.Shared.Body.Components; using Content.Shared.CCVar; @@ -279,9 +280,13 @@ private bool TryDrink(EntityUid user, EntityUid target, DrinkComponent drink, En var flavors = _flavorProfile.GetLocalizedFlavorsMessage(user, drinkSolution); + var drinkDelay = drink.Delay; + if (TryComp(target, out var delayModifier)) + drinkDelay *= delayModifier.DrinkDelayMultiplier; + var doAfterEventArgs = new DoAfterArgs(EntityManager, user, - forceDrink ? drink.ForceFeedDelay : drink.Delay, + forceDrink ? drink.ForceFeedDelay : drinkDelay, new ConsumeDoAfterEvent(drink.Solution, flavors), eventTarget: item, target: target, diff --git a/Content.Server/Nutrition/EntitySystems/FoodSystem.cs b/Content.Server/Nutrition/EntitySystems/FoodSystem.cs index 06d1c4b42d..84355f03c1 100644 --- a/Content.Server/Nutrition/EntitySystems/FoodSystem.cs +++ b/Content.Server/Nutrition/EntitySystems/FoodSystem.cs @@ -6,6 +6,7 @@ using Content.Shared.Nutrition.Components; using Content.Server.Popups; using Content.Server.Stack; +using Content.Server.Traits.Assorted.Components; using Content.Shared.Administration.Logs; using Content.Shared.Body.Components; using Content.Shared.Body.Organ; @@ -176,9 +177,13 @@ private void OnFeedFood(Entity entity, ref AfterInteractEvent arg _adminLogger.Add(LogType.Ingestion, LogImpact.Low, $"{ToPrettyString(target):target} is eating {ToPrettyString(food):food} {SolutionContainerSystem.ToPrettyString(foodSolution)}"); } + var foodDelay = foodComp.Delay; + if (TryComp(target, out var delayModifier)) + foodDelay *= delayModifier.FoodDelayMultiplier; + var doAfterArgs = new DoAfterArgs(EntityManager, user, - forceFeed ? foodComp.ForceFeedDelay : foodComp.Delay, + forceFeed ? foodComp.ForceFeedDelay : foodDelay, new ConsumeDoAfterEvent(foodComp.Solution, flavors), eventTarget: food, target: target, diff --git a/Content.Server/Nyanotrasen/Abilities/Boxer/BoxingSystem.cs b/Content.Server/Nyanotrasen/Abilities/Boxer/BoxingSystem.cs index 8bb68cb6f5..6f533c3419 100644 --- a/Content.Server/Nyanotrasen/Abilities/Boxer/BoxingSystem.cs +++ b/Content.Server/Nyanotrasen/Abilities/Boxer/BoxingSystem.cs @@ -14,7 +14,7 @@ public override void Initialize() base.Initialize(); SubscribeLocalEvent(OnInit); SubscribeLocalEvent(OnMeleeHit); - SubscribeLocalEvent(OnStamHit); + SubscribeLocalEvent(OnStamHit); } private void OnInit(EntityUid uid, BoxerComponent component, ComponentInit args) @@ -27,7 +27,7 @@ private void OnMeleeHit(EntityUid uid, BoxerComponent component, MeleeHitEvent a args.ModifiersList.Add(component.UnarmedModifiers); } - private void OnStamHit(EntityUid uid, BoxingGlovesComponent component, StaminaMeleeHitEvent args) + private void OnStamHit(EntityUid uid, BoxingGlovesComponent component, TakeStaminaDamageEvent args) { if (!_containerSystem.TryGetContainingContainer(uid, out var equipee)) return; diff --git a/Content.Server/Nyanotrasen/Abilities/Oni/OniSystem.cs b/Content.Server/Nyanotrasen/Abilities/Oni/OniSystem.cs index 6fdb27097e..4fc078e85b 100644 --- a/Content.Server/Nyanotrasen/Abilities/Oni/OniSystem.cs +++ b/Content.Server/Nyanotrasen/Abilities/Oni/OniSystem.cs @@ -21,7 +21,7 @@ public override void Initialize() SubscribeLocalEvent(OnEntRemoved); SubscribeLocalEvent(OnOniMeleeHit); SubscribeLocalEvent(OnHeldMeleeHit); - SubscribeLocalEvent(OnStamHit); + SubscribeLocalEvent(OnStamHit); } private void OnEntInserted(EntityUid uid, OniComponent component, EntInsertedIntoContainerMessage args) @@ -68,7 +68,7 @@ private void OnHeldMeleeHit(EntityUid uid, HeldByOniComponent component, MeleeHi args.ModifiersList.Add(oni.MeleeModifiers); } - private void OnStamHit(EntityUid uid, HeldByOniComponent component, StaminaMeleeHitEvent args) + private void OnStamHit(EntityUid uid, HeldByOniComponent component, TakeStaminaDamageEvent args) { if (!TryComp(component.Holder, out var oni)) return; diff --git a/Content.Server/Nyanotrasen/Research/Oracle/OracleComponent.cs b/Content.Server/Nyanotrasen/Research/Oracle/OracleComponent.cs deleted file mode 100644 index e238d5c7a1..0000000000 --- a/Content.Server/Nyanotrasen/Research/Oracle/OracleComponent.cs +++ /dev/null @@ -1,87 +0,0 @@ -using Content.Shared.Chemistry.Reagent; -using Robust.Shared.Prototypes; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; - -namespace Content.Server.Research.Oracle; - -[RegisterComponent] -public sealed partial class OracleComponent : Component -{ - public const string SolutionName = "fountain"; - - [ViewVariables] - [DataField("accumulator")] - public float Accumulator; - - [ViewVariables] - [DataField("resetTime")] - public TimeSpan ResetTime = TimeSpan.FromMinutes(10); - - [DataField("barkAccumulator")] - public float BarkAccumulator; - - [DataField("barkTime")] - public TimeSpan BarkTime = TimeSpan.FromMinutes(1); - - [DataField("rejectAccumulator")] - public float RejectAccumulator; - - [DataField("rejectTime")] - public TimeSpan RejectTime = TimeSpan.FromSeconds(5); - - [ViewVariables(VVAccess.ReadWrite)] - public EntityPrototype DesiredPrototype = default!; - - [ViewVariables(VVAccess.ReadWrite)] - public EntityPrototype? LastDesiredPrototype = default!; - - [DataField("rewardReagents", customTypeSerializer: typeof(PrototypeIdListSerializer))] - public IReadOnlyList RewardReagents = new[] - { - "LotophagoiOil", "LotophagoiOil", "LotophagoiOil", "LotophagoiOil", "LotophagoiOil", "Wine", "Blood", "Ichor" - }; - - [DataField("demandMessages")] - public IReadOnlyList DemandMessages = new[] - { - "oracle-demand-1", - "oracle-demand-2", - "oracle-demand-3", - "oracle-demand-4", - "oracle-demand-5", - "oracle-demand-6", - "oracle-demand-7", - "oracle-demand-8", - "oracle-demand-9", - "oracle-demand-10", - "oracle-demand-11", - "oracle-demand-12" - }; - - [DataField("rejectMessages")] - public IReadOnlyList RejectMessages = new[] - { - "ἄγνοια", - "υλικό", - "ἀγνωσία", - "γήινος", - "σάκλας" - }; - - [DataField("blacklistedPrototypes")] - [ViewVariables(VVAccess.ReadOnly)] - public IReadOnlyList BlacklistedPrototypes = new[] - { - "Drone", - "QSI", - "HandTeleporter", - "BluespaceBeaker", - "ClothingBackpackHolding", - "ClothingBackpackSatchelHolding", - "ClothingBackpackDuffelHolding", - "TrashBagOfHolding", - "BluespaceCrystal", - "InsulativeHeadcage", - "CrystalNormality", - }; -} diff --git a/Content.Server/Nyanotrasen/Research/Oracle/OracleSystem.cs b/Content.Server/Nyanotrasen/Research/Oracle/OracleSystem.cs deleted file mode 100644 index c3eced61da..0000000000 --- a/Content.Server/Nyanotrasen/Research/Oracle/OracleSystem.cs +++ /dev/null @@ -1,256 +0,0 @@ -using System.Linq; -using Content.Server.Botany; -using Content.Server.Chat.Managers; -using Content.Server.Chat.Systems; -using Content.Server.Chemistry.Containers.EntitySystems; -using Content.Server.Fluids.EntitySystems; -using Content.Server.Psionics; -using Content.Shared.Psionics.Abilities; -using Content.Shared.Chat; -using Content.Shared.Chemistry.Components; -using Content.Shared.Chemistry.Reagent; -using Content.Shared.Interaction; -using Content.Shared.Mobs.Components; -using Content.Shared.Psionics.Glimmer; -using Content.Shared.Research.Prototypes; -using Robust.Shared.Player; -using Robust.Shared.Prototypes; -using Robust.Shared.Random; - -namespace Content.Server.Research.Oracle; - -public sealed class OracleSystem : EntitySystem -{ - [Dependency] private readonly IPrototypeManager _prototypeManager = default!; - [Dependency] private readonly IRobustRandom _random = default!; - [Dependency] private readonly ChatSystem _chat = default!; - [Dependency] private readonly IChatManager _chatManager = default!; - [Dependency] private readonly SolutionContainerSystem _solutionSystem = default!; - [Dependency] private readonly GlimmerSystem _glimmerSystem = default!; - [Dependency] private readonly PuddleSystem _puddleSystem = default!; - - public override void Update(float frameTime) - { - base.Update(frameTime); - foreach (var oracle in EntityQuery()) - { - oracle.Accumulator += frameTime; - oracle.BarkAccumulator += frameTime; - oracle.RejectAccumulator += frameTime; - if (oracle.BarkAccumulator >= oracle.BarkTime.TotalSeconds) - { - oracle.BarkAccumulator = 0; - var message = Loc.GetString(_random.Pick(oracle.DemandMessages), ("item", oracle.DesiredPrototype.Name)) - .ToUpper(); - _chat.TrySendInGameICMessage(oracle.Owner, message, InGameICChatType.Speak, false); - } - - if (oracle.Accumulator >= oracle.ResetTime.TotalSeconds) - { - oracle.LastDesiredPrototype = oracle.DesiredPrototype; - NextItem(oracle); - } - } - } - - public override void Initialize() - { - base.Initialize(); - SubscribeLocalEvent(OnInit); - SubscribeLocalEvent(OnInteractHand); - SubscribeLocalEvent(OnInteractUsing); - } - - private void OnInit(EntityUid uid, OracleComponent component, ComponentInit args) - { - NextItem(component); - } - - private void OnInteractHand(EntityUid uid, OracleComponent component, InteractHandEvent args) - { - if (!HasComp(args.User) || HasComp(args.User)) - return; - - if (!TryComp(args.User, out var actor)) - return; - - var message = Loc.GetString("oracle-current-item", ("item", component.DesiredPrototype.Name)); - - var messageWrap = Loc.GetString("chat-manager-send-telepathic-chat-wrap-message", - ("telepathicChannelName", Loc.GetString("chat-manager-telepathic-channel-name")), ("message", message)); - - _chatManager.ChatMessageToOne(ChatChannel.Telepathic, - message, messageWrap, uid, false, actor.PlayerSession.ConnectedClient, Color.PaleVioletRed); - - if (component.LastDesiredPrototype != null) - { - var message2 = Loc.GetString("oracle-previous-item", ("item", component.LastDesiredPrototype.Name)); - var messageWrap2 = Loc.GetString("chat-manager-send-telepathic-chat-wrap-message", - ("telepathicChannelName", Loc.GetString("chat-manager-telepathic-channel-name")), - ("message", message2)); - - _chatManager.ChatMessageToOne(ChatChannel.Telepathic, - message2, messageWrap2, uid, false, actor.PlayerSession.ConnectedClient, Color.PaleVioletRed); - } - } - - private void OnInteractUsing(EntityUid uid, OracleComponent component, InteractUsingEvent args) - { - if (HasComp(args.Used)) - return; - - if (!TryComp(args.Used, out var meta)) - return; - - if (meta.EntityPrototype == null) - return; - - var validItem = CheckValidity(meta.EntityPrototype, component.DesiredPrototype); - - var nextItem = true; - - if (component.LastDesiredPrototype != null && - CheckValidity(meta.EntityPrototype, component.LastDesiredPrototype)) - { - nextItem = false; - validItem = true; - component.LastDesiredPrototype = null; - } - - if (!validItem) - { - if (!HasComp(args.Used) && - component.RejectAccumulator >= component.RejectTime.TotalSeconds) - { - component.RejectAccumulator = 0; - _chat.TrySendInGameICMessage(uid, _random.Pick(component.RejectMessages), InGameICChatType.Speak, true); - } - return; - } - - EntityManager.QueueDeleteEntity(args.Used); - - EntityManager.SpawnEntity("ResearchDisk5000", Transform(args.User).Coordinates); - - DispenseLiquidReward(uid, component); - - var i = _random.Next(1, 4); - - while (i != 0) - { - EntityManager.SpawnEntity("MaterialBluespace1", Transform(args.User).Coordinates); - i--; - } - - if (nextItem) - NextItem(component); - } - - private bool CheckValidity(EntityPrototype given, EntityPrototype target) - { - // 1: directly compare Names - // name instead of ID because the oracle asks for them by name - // this could potentially lead to like, labeller exploits maybe but so far only mob names can be fully player-set. - if (given.Name == target.Name) - return true; - - return false; - } - - private void DispenseLiquidReward(EntityUid uid, OracleComponent component) - { - if (!_solutionSystem.TryGetSolution(uid, OracleComponent.SolutionName, out var fountainSol)) - return; - - var allReagents = _prototypeManager.EnumeratePrototypes() - .Where(x => !x.Abstract) - .Select(x => x.ID).ToList(); - - var amount = 20 + _random.Next(1, 30) + _glimmerSystem.GlimmerOutput / 10f; - amount = (float) Math.Round(amount); - - var sol = new Solution(); - var reagent = ""; - - if (_random.Prob(0.2f)) - reagent = _random.Pick(allReagents); - else - reagent = _random.Pick(component.RewardReagents); - - sol.AddReagent(reagent, amount); - - _solutionSystem.TryMixAndOverflow(fountainSol.Value, sol, fountainSol.Value.Comp.Solution.MaxVolume, out var overflowing); - - if (overflowing != null && overflowing.Volume > 0) - _puddleSystem.TrySpillAt(uid, overflowing, out var _); - } - - private void NextItem(OracleComponent component) - { - component.Accumulator = 0; - component.BarkAccumulator = 0; - component.RejectAccumulator = 0; - var protoString = GetDesiredItem(component); - if (_prototypeManager.TryIndex(protoString, out var proto)) - component.DesiredPrototype = proto; - else - Logger.Error("Oracle can't index prototype " + protoString); - } - - private string GetDesiredItem(OracleComponent component) - { - return _random.Pick(GetAllProtos(component)); - } - - - public List GetAllProtos(OracleComponent component) - { - var allTechs = _prototypeManager.EnumeratePrototypes(); - var allRecipes = new List(); - - foreach (var tech in allTechs) - { - foreach (var recipe in tech.RecipeUnlocks) - { - var recipeProto = _prototypeManager.Index(recipe); - allRecipes.Add(recipeProto.Result); - } - } - - var allPlants = _prototypeManager.EnumeratePrototypes().Select(x => x.ProductPrototypes[0]) - .ToList(); - var allProtos = allRecipes.Concat(allPlants).ToList(); - var blacklist = component.BlacklistedPrototypes.ToList(); - - foreach (var proto in allProtos) - { - if (!_prototypeManager.TryIndex(proto, out var entityProto)) - { - blacklist.Add(proto); - continue; - } - - if (!entityProto.Components.ContainsKey("Item")) - { - blacklist.Add(proto); - continue; - } - - if (entityProto.Components.ContainsKey("SolutionTransfer")) - { - blacklist.Add(proto); - continue; - } - - if (entityProto.Components.ContainsKey("MobState")) - blacklist.Add(proto); - } - - foreach (var proto in blacklist) - { - allProtos.Remove(proto); - } - - return allProtos; - } -} diff --git a/Content.Server/Power/Components/ActiveChargerComponent.cs b/Content.Server/Power/Components/ActiveChargerComponent.cs deleted file mode 100644 index f3d863c9e4..0000000000 --- a/Content.Server/Power/Components/ActiveChargerComponent.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Content.Shared.Containers.ItemSlots; -using Content.Shared.Power; - -namespace Content.Server.Power.Components -{ - [RegisterComponent] - public sealed partial class ActiveChargerComponent : Component - { - } -} diff --git a/Content.Server/Power/Components/ChargingComponent.cs b/Content.Server/Power/Components/ChargingComponent.cs new file mode 100644 index 0000000000..db7c14f708 --- /dev/null +++ b/Content.Server/Power/Components/ChargingComponent.cs @@ -0,0 +1,19 @@ +using Content.Shared.Containers.ItemSlots; +using Content.Shared.Power; + +namespace Content.Server.Power.Components +{ + [RegisterComponent] + public sealed partial class ChargingComponent : Component + { + /// + ///References the entity of the charger that is currently powering this battery + /// + public EntityUid ChargerUid; + + /// + ///References the component of the charger that is currently powering this battery + /// + public ChargerComponent ChargerComponent; + } +} diff --git a/Content.Server/Power/EntitySystems/ApcSystem.cs b/Content.Server/Power/EntitySystems/ApcSystem.cs index 95b5d74a94..f345c9e88e 100644 --- a/Content.Server/Power/EntitySystems/ApcSystem.cs +++ b/Content.Server/Power/EntitySystems/ApcSystem.cs @@ -7,6 +7,7 @@ using Content.Shared.APC; using Content.Shared.Emag.Components; using Content.Shared.Emag.Systems; +using Content.Shared.Emp; using Content.Shared.Popups; using Robust.Server.GameObjects; using Robust.Shared.Audio; @@ -37,6 +38,7 @@ public override void Initialize() SubscribeLocalEvent(OnEmagged); SubscribeLocalEvent(OnEmpPulse); + SubscribeLocalEvent(OnEmpDisabledRemoved); } public override void Update(float deltaTime) @@ -163,7 +165,7 @@ public void UpdateUIState(EntityUid uid, private ApcChargeState CalcChargeState(EntityUid uid, PowerState.Battery battery) { - if (HasComp(uid)) + if (HasComp(uid) || HasComp(uid)) return ApcChargeState.Emag; if (battery.CurrentStorage / battery.Capacity > ApcComponent.HighPowerThreshold) @@ -190,15 +192,16 @@ private ApcExternalPowerState CalcExtPowerState(EntityUid uid, PowerState.Batter return ApcExternalPowerState.Good; } - + private void OnEmpPulse(EntityUid uid, ApcComponent component, ref EmpPulseEvent args) { - if (component.MainBreakerEnabled) - { - args.Affected = true; - args.Disabled = true; - ApcToggleBreaker(uid, component); - } + EnsureComp(uid, out var emp); //event calls before EmpDisabledComponent is added, ensure it to force sprite update + UpdateApcState(uid); + } + + private void OnEmpDisabledRemoved(EntityUid uid, ApcComponent component, ref EmpDisabledRemoved args) + { + UpdateApcState(uid); } } diff --git a/Content.Server/Power/EntitySystems/BatterySystem.cs b/Content.Server/Power/EntitySystems/BatterySystem.cs index 0a0f2068b5..1c5d83b094 100644 --- a/Content.Server/Power/EntitySystems/BatterySystem.cs +++ b/Content.Server/Power/EntitySystems/BatterySystem.cs @@ -1,5 +1,6 @@ using Content.Server.Cargo.Systems; using Content.Server.Emp; +using Content.Shared.Emp; using Content.Server.Power.Components; using Content.Shared.Examine; using Content.Shared.Rejuvenate; @@ -20,6 +21,7 @@ public override void Initialize() SubscribeLocalEvent(OnBatteryRejuvenate); SubscribeLocalEvent(CalculateBatteryPrice); SubscribeLocalEvent(OnEmpPulse); + SubscribeLocalEvent(OnEmpDisabledRemoved); SubscribeLocalEvent(PreSync); SubscribeLocalEvent(PostSync); @@ -85,7 +87,7 @@ public override void Update(float frameTime) { if (!comp.AutoRecharge) continue; if (batt.IsFullyCharged) continue; - SetCharge(uid, batt.CurrentCharge + comp.AutoRechargeRate * frameTime, batt); + TrySetCharge(uid, batt.CurrentCharge + comp.AutoRechargeRate * frameTime, batt); } } @@ -100,9 +102,21 @@ private void CalculateBatteryPrice(EntityUid uid, BatteryComponent component, re private void OnEmpPulse(EntityUid uid, BatteryComponent component, ref EmpPulseEvent args) { args.Affected = true; + args.Disabled = true; UseCharge(uid, args.EnergyConsumption, component); } + // if a disabled battery is put into a recharged, + // allow the recharger to start recharging again after the disable ends + private void OnEmpDisabledRemoved(EntityUid uid, BatteryComponent component, ref EmpDisabledRemoved args) + { + if (!TryComp(uid, out var charging)) + return; + + var ev = new ChargerUpdateStatusEvent(); + RaiseLocalEvent(charging.ChargerUid, ref ev); + } + public float UseCharge(EntityUid uid, float value, BatteryComponent? battery = null) { if (value <= 0 || !Resolve(uid, ref battery) || battery.CurrentCharge == 0) @@ -157,6 +171,18 @@ public bool TryUseCharge(EntityUid uid, float value, BatteryComponent? battery = return true; } + /// + /// Like SetCharge, but checks for conditions like EmpDisabled before executing + /// + public bool TrySetCharge(EntityUid uid, float value, BatteryComponent? battery = null) + { + if (!Resolve(uid, ref battery, false) || TryComp(uid, out var emp)) + return false; + + SetCharge(uid, value, battery); + return true; + } + /// /// Returns whether the battery is at least 99% charged, basically full. /// @@ -165,6 +191,10 @@ public bool IsFull(EntityUid uid, BatteryComponent? battery = null) if (!Resolve(uid, ref battery)) return false; + // If the battery is full, remove its charging component. + if (TryComp(uid, out _)) + RemComp(uid); + return battery.CurrentCharge / battery.MaxCharge >= 0.99f; } } diff --git a/Content.Server/Power/EntitySystems/ChargerSystem.cs b/Content.Server/Power/EntitySystems/ChargerSystem.cs index db16dfa008..ae6b024162 100644 --- a/Content.Server/Power/EntitySystems/ChargerSystem.cs +++ b/Content.Server/Power/EntitySystems/ChargerSystem.cs @@ -1,13 +1,16 @@ using Content.Server.Power.Components; +using Content.Server.Emp; using Content.Server.PowerCell; using Content.Shared.Examine; using Content.Shared.Power; using Content.Shared.PowerCell.Components; +using Content.Shared.Emp; using JetBrains.Annotations; using Robust.Shared.Containers; using System.Diagnostics.CodeAnalysis; using Content.Shared.Storage.Components; using Robust.Server.Containers; +using Content.Shared.Whitelist; namespace Content.Server.Power.EntitySystems; @@ -28,6 +31,11 @@ public override void Initialize() SubscribeLocalEvent(OnInsertAttempt); SubscribeLocalEvent(OnEntityStorageInsertAttempt); SubscribeLocalEvent(OnChargerExamine); + + SubscribeLocalEvent(OnUpdateStatus); + + SubscribeLocalEvent(OnEmpPulse); + SubscribeLocalEvent(OnEmpDisabledRemoved); } private void OnStartup(EntityUid uid, ChargerComponent component, ComponentStartup args) @@ -40,21 +48,58 @@ private void OnChargerExamine(EntityUid uid, ChargerComponent component, Examine args.PushMarkup(Loc.GetString("charger-examine", ("color", "yellow"), ("chargeRate", (int) component.ChargeRate))); } + private void StartChargingBattery(EntityUid uid, ChargerComponent component, EntityUid target) + { + bool charge = true; + + if (HasComp(uid)) + charge = false; + else + if (!TryComp(target, out var battery)) + charge = false; + else + if (Math.Abs(battery.MaxCharge - battery.CurrentCharge) < 0.01) + charge = false; + + // wrap functionality in an if statement instead of returning... + if (charge) + { + var charging = EnsureComp(target); + charging.ChargerUid = uid; + charging.ChargerComponent = component; + } + + // ...so the status always updates (for insertin a power cell) + UpdateStatus(uid, component); + } + + private void StopChargingBattery(EntityUid uid, ChargerComponent component, EntityUid target) + { + if (HasComp(target)) + RemComp(target); + UpdateStatus(uid, component); + } + public override void Update(float frameTime) { - var query = EntityQueryEnumerator(); - while (query.MoveNext(out var uid, out _, out var charger, out var containerComp)) + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var charging)) { - if (!_container.TryGetContainer(uid, charger.SlotId, out var container, containerComp)) + if (!TryComp(charging.ChargerUid, out var chargerComponent)) continue; - if (charger.Status == CellChargerStatus.Empty || charger.Status == CellChargerStatus.Charged || container.ContainedEntities.Count == 0) + if (charging.ChargerComponent.Status == CellChargerStatus.Off || charging.ChargerComponent.Status == CellChargerStatus.Empty) continue; - foreach (var contained in container.ContainedEntities) - { - TransferPower(uid, contained, charger, frameTime); - } + if (HasComp(charging.ChargerUid)) + continue; + + if (!TryComp(uid, out var battery)) + continue; + + if (Math.Abs(battery.MaxCharge - battery.CurrentCharge) < 0.01) + StopChargingBattery(charging.ChargerUid, charging.ChargerComponent, uid); + TransferPower(charging.ChargerUid, uid, charging.ChargerComponent, frameTime); } } @@ -71,7 +116,7 @@ private void OnInserted(EntityUid uid, ChargerComponent component, EntInsertedIn if (args.Container.ID != component.SlotId) return; - UpdateStatus(uid, component); + StartChargingBattery(uid, component, args.Entity); } private void OnRemoved(EntityUid uid, ChargerComponent component, EntRemovedFromContainerMessage args) @@ -79,7 +124,7 @@ private void OnRemoved(EntityUid uid, ChargerComponent component, EntRemovedFrom if (args.Container.ID != component.SlotId) return; - UpdateStatus(uid, component); + StopChargingBattery(uid, component, args.Entity); } /// @@ -112,6 +157,11 @@ private void OnEntityStorageInsertAttempt(EntityUid uid, ChargerComponent compon args.Cancelled = true; } + private void OnUpdateStatus(EntityUid uid, ChargerComponent component, ref ChargerUpdateStatusEvent args) + { + UpdateStatus(uid, component); + } + private void UpdateStatus(EntityUid uid, ChargerComponent component) { var status = GetStatus(uid, component); @@ -126,15 +176,6 @@ private void UpdateStatus(EntityUid uid, ChargerComponent component) component.Status = status; - if (component.Status == CellChargerStatus.Charging) - { - AddComp(uid); - } - else - { - RemComp(uid); - } - switch (component.Status) { case CellChargerStatus.Off: @@ -146,7 +187,7 @@ private void UpdateStatus(EntityUid uid, ChargerComponent component) _appearance.SetData(uid, CellVisual.Light, CellChargerStatus.Empty, appearance); break; case CellChargerStatus.Charging: - receiver.Load = component.ChargeRate; + receiver.Load = component.ChargeRate; //does not scale with multiple slotted batteries _appearance.SetData(uid, CellVisual.Light, CellChargerStatus.Charging, appearance); break; case CellChargerStatus.Charged: @@ -157,6 +198,42 @@ private void UpdateStatus(EntityUid uid, ChargerComponent component) throw new ArgumentOutOfRangeException(); } } + + private void OnEmpPulse(EntityUid uid, ChargerComponent component, ref EmpPulseEvent args) + { + // we don't care if we haven't been disabled + if (!args.Disabled) + return; + + // if the recharger is hit by an emp pulse, + // stop recharging contained batteries to save resources + if (!_container.TryGetContainer(uid, component.SlotId, out var container)) + return; + + foreach (var containedEntity in container.ContainedEntities) + { + if (!SearchForBattery(containedEntity, out _, out _)) + continue; + + StopChargingBattery(uid, component, containedEntity); + } + } + + private void OnEmpDisabledRemoved(EntityUid uid, ChargerComponent component, ref EmpDisabledRemoved args) + { + // if an emp disable subsides, + // attempt to start charging all batteries + if (!_container.TryGetContainer(uid, component.SlotId, out var container)) + return; + + foreach (var containedEntity in container.ContainedEntities) + { + if (!SearchForBattery(containedEntity, out _, out _)) + continue; + + StartChargingBattery(uid, component, containedEntity); + } + } private CellChargerStatus GetStatus(EntityUid uid, ChargerComponent component) { @@ -178,13 +255,28 @@ private CellChargerStatus GetStatus(EntityUid uid, ChargerComponent component) if (container.ContainedEntities.Count == 0) return CellChargerStatus.Empty; - if (!SearchForBattery(container.ContainedEntities[0], out _, out var heldBattery)) - return CellChargerStatus.Off; + var statusOut = CellChargerStatus.Off; - if (Math.Abs(heldBattery.MaxCharge - heldBattery.CurrentCharge) < 0.01) - return CellChargerStatus.Charged; + foreach (var containedEntity in container.ContainedEntities) + { + // if none of the slotted items are actually batteries, represent the charger as off + if (!SearchForBattery(containedEntity, out _, out _)) + continue; - return CellChargerStatus.Charging; + // if all batteries are either EMP'd or fully charged, represent the charger as fully charged + statusOut = CellChargerStatus.Charged; + if (HasComp(containedEntity)) + continue; + + if (!HasComp(containedEntity)) + continue; + + // if we have atleast one battery being charged, represent the charger as charging; + statusOut = CellChargerStatus.Charging; + break; + } + + return statusOut; } private void TransferPower(EntityUid uid, EntityUid targetEntity, ChargerComponent component, float frameTime) @@ -201,11 +293,11 @@ private void TransferPower(EntityUid uid, EntityUid targetEntity, ChargerCompone if (!SearchForBattery(targetEntity, out var batteryUid, out var heldBattery)) return; - _battery.SetCharge(batteryUid.Value, heldBattery.CurrentCharge + component.ChargeRate * frameTime, heldBattery); + _battery.TrySetCharge(batteryUid.Value, heldBattery.CurrentCharge + component.ChargeRate * frameTime, heldBattery); // Just so the sprite won't be set to 99.99999% visibility if (heldBattery.MaxCharge - heldBattery.CurrentCharge < 0.01) { - _battery.SetCharge(batteryUid.Value, heldBattery.MaxCharge, heldBattery); + _battery.TrySetCharge(batteryUid.Value, heldBattery.MaxCharge, heldBattery); } UpdateStatus(uid, component); @@ -223,3 +315,6 @@ private bool SearchForBattery(EntityUid uid, [NotNullWhen(true)] out EntityUid? return true; } } + +[ByRefEvent] +public record struct ChargerUpdateStatusEvent(); \ No newline at end of file diff --git a/Content.Server/Power/EntitySystems/PowerReceiverSystem.cs b/Content.Server/Power/EntitySystems/PowerReceiverSystem.cs index 048fda2355..2157a53a53 100644 --- a/Content.Server/Power/EntitySystems/PowerReceiverSystem.cs +++ b/Content.Server/Power/EntitySystems/PowerReceiverSystem.cs @@ -1,6 +1,7 @@ using Content.Server.Administration.Logs; using Content.Server.Administration.Managers; using Content.Server.Power.Components; +using Content.Server.Emp; using Content.Shared.Administration; using Content.Shared.Database; using Content.Shared.Examine; @@ -11,6 +12,7 @@ using Robust.Server.GameObjects; using Robust.Shared.Audio; using Robust.Shared.Utility; +using Content.Shared.Emp; namespace Content.Server.Power.EntitySystems { @@ -38,6 +40,9 @@ public override void Initialize() SubscribeLocalEvent>(OnGetVerbs); SubscribeLocalEvent>(AddSwitchPowerVerb); + SubscribeLocalEvent(OnEmpPulse); + SubscribeLocalEvent(OnEmpEnd); + _recQuery = GetEntityQuery(); _provQuery = GetEntityQuery(); } @@ -131,7 +136,7 @@ private void AddSwitchPowerVerb(EntityUid uid, PowerSwitchComponent component, G { Act = () => { - TogglePower(uid, user: args.User); + TryTogglePower(uid, user: args.User); }, Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/VerbIcons/Spare/poweronoff.svg.192dpi.png")), Text = Loc.GetString("power-switch-component-toggle-verb"), @@ -192,5 +197,36 @@ public bool TogglePower(EntityUid uid, bool playSwitchSound = true, ApcPowerRece return !receiver.PowerDisabled; // i.e. PowerEnabled } + + public bool TryTogglePower(EntityUid uid, bool playSwitchSound = true, ApcPowerReceiverComponent? receiver = null, EntityUid? user = null) + { + if (HasComp(uid)) + return false; + + return TogglePower(uid, playSwitchSound, receiver, user); + } + + public void SetLoad(ApcPowerReceiverComponent comp, float load) + { + comp.Load = load; + } + + private void OnEmpPulse(EntityUid uid, ApcPowerReceiverComponent component, ref EmpPulseEvent args) + { + if (!component.PowerDisabled) + { + args.Affected = true; + args.Disabled = true; + TogglePower(uid, false); + } + } + + private void OnEmpEnd(EntityUid uid, ApcPowerReceiverComponent component, ref EmpDisabledRemoved args) + { + if (component.PowerDisabled) + { + TogglePower(uid, false); + } + } } } diff --git a/Content.Server/Power/PowerWireAction.cs b/Content.Server/Power/PowerWireAction.cs index 785eac91db..374c1c41ac 100644 --- a/Content.Server/Power/PowerWireAction.cs +++ b/Content.Server/Power/PowerWireAction.cs @@ -1,6 +1,7 @@ using Content.Server.Electrocution; using Content.Server.Power.Components; using Content.Server.Wires; +using Content.Shared.Emp; using Content.Shared.Power; using Content.Shared.Wires; @@ -78,6 +79,9 @@ private void SetPower(EntityUid owner, bool pulsed) return; } + if (EntityManager.TryGetComponent(owner, out var emp)) + return; + power.PowerDisabled = false; } } diff --git a/Content.Server/Psionics/PsionicsSystem.cs b/Content.Server/Psionics/PsionicsSystem.cs index 6799b0bd3f..1ee1bdd3e7 100644 --- a/Content.Server/Psionics/PsionicsSystem.cs +++ b/Content.Server/Psionics/PsionicsSystem.cs @@ -45,7 +45,7 @@ public override void Initialize() base.Initialize(); SubscribeLocalEvent(OnStartup); SubscribeLocalEvent(OnMeleeHit); - SubscribeLocalEvent(OnStamHit); + SubscribeLocalEvent(OnStamHit); SubscribeLocalEvent(OnInit); SubscribeLocalEvent(OnStartup); @@ -109,14 +109,12 @@ private void OnRemove(EntityUid uid, PsionicComponent component, ComponentRemove _npcFactonSystem.RemoveFaction(uid, "PsionicInterloper"); } - private void OnStamHit(EntityUid uid, AntiPsionicWeaponComponent component, StaminaMeleeHitEvent args) + private void OnStamHit(EntityUid uid, AntiPsionicWeaponComponent component, TakeStaminaDamageEvent args) { var bonus = false; - foreach (var stam in args.HitList) - { - if (HasComp(stam.Entity)) - bonus = true; - } + + if (HasComp(args.Target)) + bonus = true; if (!bonus) return; diff --git a/Content.Server/Radiation/Systems/GeigerSystem.cs b/Content.Server/Radiation/Systems/GeigerSystem.cs index f889336a06..06e5911cb7 100644 --- a/Content.Server/Radiation/Systems/GeigerSystem.cs +++ b/Content.Server/Radiation/Systems/GeigerSystem.cs @@ -6,8 +6,8 @@ using Content.Shared.Radiation.Components; using Content.Shared.Radiation.Systems; using Robust.Server.Audio; -using Robust.Server.GameObjects; using Robust.Server.Player; +using Robust.Shared.Player; namespace Content.Server.Radiation.Systems; @@ -152,19 +152,19 @@ private void UpdateSound(EntityUid uid, GeigerComponent? component = null) component.Stream = _audio.Stop(component.Stream); - if (!component.Sounds.TryGetValue(component.DangerLevel, out var sounds)) - return; - - if (component.User == null) - return; - - if (!_player.TryGetSessionByEntity(component.User.Value, out var session)) - return; - - var sound = _audio.GetSound(sounds); - var param = sounds.Params.WithLoop(true).WithVolume(-4f); - - component.Stream = _audio.PlayGlobal(sound, session, param)?.Entity; + if (component.Sounds.TryGetValue(component.DangerLevel, out var sounds)) + { + var sound = _audio.GetSound(sounds); + + if (component.LocalSoundOnly + && component.User is not null + && _player.TryGetSessionByEntity(component.User.Value, out var session)) + { + component.Stream = _audio.PlayGlobal(sound, session, component.AudioParameters)?.Entity; + return; + } + component.Stream = _audio.PlayEntity(sound, Filter.Pvs(uid), uid, true, component.AudioParameters)?.Entity; + } } public static GeigerDangerLevel RadsToLevel(float rads) diff --git a/Content.Server/Research/Oracle/OracleComponent.cs b/Content.Server/Research/Oracle/OracleComponent.cs new file mode 100644 index 0000000000..6196ce9506 --- /dev/null +++ b/Content.Server/Research/Oracle/OracleComponent.cs @@ -0,0 +1,73 @@ +using Content.Shared.Random; +using Robust.Shared.Prototypes; + +namespace Content.Server.Research.Oracle; + +[RegisterComponent] +public sealed partial class OracleComponent : Component +{ + public const string SolutionName = "fountain"; + + [DataField(required: true)] + public ProtoId DemandTypes; + + [DataField] + public List> BlacklistedDemands = new(); + + [DataField(required: true)] + public List> RewardEntities; + + [DataField(required: true)] + public ProtoId RewardReagents; + + /// + /// The chance to dispense a completely random chemical instead of what's listed in + /// + [DataField] + public float AbnormalReagentChance = 0.2f; + + [DataField] + public TimeSpan + NextDemandTime = TimeSpan.Zero, + NextBarkTime = TimeSpan.Zero, + NextRejectTime = TimeSpan.Zero; + + [DataField] + public TimeSpan + DemandDelay = TimeSpan.FromMinutes(10), + BarkDelay = TimeSpan.FromMinutes(2), + RejectDelay = TimeSpan.FromSeconds(10); + + [ViewVariables(VVAccess.ReadWrite)] + public EntityPrototype DesiredPrototype = default!; + + [ViewVariables(VVAccess.ReadWrite)] + public EntityPrototype? LastDesiredPrototype = default!; + + [DataField("demandMessages")] + public IReadOnlyList DemandMessages = new[] + { + "oracle-demand-1", + "oracle-demand-2", + "oracle-demand-3", + "oracle-demand-4", + "oracle-demand-5", + "oracle-demand-6", + "oracle-demand-7", + "oracle-demand-8", + "oracle-demand-9", + "oracle-demand-10", + "oracle-demand-11", + "oracle-demand-12" + }; + + [DataField("rejectMessages")] + public IReadOnlyList RejectMessages = new[] + { + "ἄγνοια", + "υλικό", + "ἀγνωσία", + "γήινος", + "σάκλας" + }; +} diff --git a/Content.Server/Research/Oracle/OracleSystem.cs b/Content.Server/Research/Oracle/OracleSystem.cs new file mode 100644 index 0000000000..7fd85dbbdc --- /dev/null +++ b/Content.Server/Research/Oracle/OracleSystem.cs @@ -0,0 +1,288 @@ +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using Content.Server.Botany; +using Content.Server.Chat.Managers; +using Content.Server.Chat.Systems; +using Content.Server.Chemistry.Containers.EntitySystems; +using Content.Server.Fluids.EntitySystems; +using Content.Server.Psionics; +using Content.Server.Research.Systems; +using Content.Shared.Psionics.Abilities; +using Content.Shared.Chat; +using Content.Shared.Chemistry.Components; +using Content.Shared.Chemistry.Reagent; +using Content.Shared.Interaction; +using Content.Shared.Mobs.Components; +using Content.Shared.Psionics.Glimmer; +using Content.Shared.Random.Helpers; +using Content.Shared.Research.Components; +using Content.Shared.Research.Prototypes; +using Content.Shared.Throwing; +using Robust.Shared.Map; +using Robust.Shared.Network; +using Robust.Shared.Player; +using Robust.Shared.Prototypes; +using Robust.Shared.Random; +using Robust.Shared.Timing; + +namespace Content.Server.Research.Oracle; + +public sealed class OracleSystem : EntitySystem +{ + [Dependency] private readonly ChatSystem _chat = default!; + [Dependency] private readonly IChatManager _chatMan = default!; + [Dependency] private readonly GlimmerSystem _glimmer = default!; + [Dependency] private readonly IPrototypeManager _protoMan = default!; + [Dependency] private readonly PuddleSystem _puddles = default!; + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly ResearchSystem _research = default!; + [Dependency] private readonly SolutionContainerSystem _solutions = default!; + [Dependency] private readonly ThrowingSystem _throwing = default!; + [Dependency] private readonly IGameTiming _timing = default!; + + public override void Update(float frameTime) + { + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var comp)) + { + if (_timing.CurTime >= comp.NextDemandTime) + { + // Might be null if this is the first tick. In that case this will simply initialize it. + var last = (EntityPrototype?) comp.DesiredPrototype; + if (NextItem((uid, comp))) + comp.LastDesiredPrototype = last; + } + + if (_timing.CurTime >= comp.NextBarkTime) + { + comp.NextBarkTime = _timing.CurTime + comp.BarkDelay; + + var message = Loc.GetString(_random.Pick(comp.DemandMessages), ("item", comp.DesiredPrototype.Name)).ToUpper(); + _chat.TrySendInGameICMessage(uid, message, InGameICChatType.Speak, false); + } + } + + query.Dispose(); + } + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnInteractHand); + SubscribeLocalEvent(OnInteractUsing); + } + + private void OnInteractHand(Entity oracle, ref InteractHandEvent args) + { + if (!HasComp(args.User) || HasComp(args.User) + || !TryComp(args.User, out var actor)) + return; + + SendTelepathicInfo(oracle, actor.PlayerSession.Channel, + Loc.GetString("oracle-current-item", ("item", oracle.Comp.DesiredPrototype.Name))); + + if (oracle.Comp.LastDesiredPrototype != null) + SendTelepathicInfo(oracle, actor.PlayerSession.Channel, + Loc.GetString("oracle-previous-item", ("item", oracle.Comp.LastDesiredPrototype.Name))); + } + + private void OnInteractUsing(Entity oracle, ref InteractUsingEvent args) + { + if (args.Handled) + return; + + if (HasComp(args.Used) || !TryComp(args.Used, out var meta) || meta.EntityPrototype == null) + return; + + var requestValid = IsCorrectItem(meta.EntityPrototype, oracle.Comp.DesiredPrototype); + var updateRequest = true; + + if (oracle.Comp.LastDesiredPrototype != null && + IsCorrectItem(meta.EntityPrototype, oracle.Comp.LastDesiredPrototype)) + { + updateRequest = false; + requestValid = true; + oracle.Comp.LastDesiredPrototype = null; + } + + if (!requestValid) + { + if (!HasComp(args.Used) && + _timing.CurTime >= oracle.Comp.NextRejectTime) + { + oracle.Comp.NextRejectTime = _timing.CurTime + oracle.Comp.RejectDelay; + _chat.TrySendInGameICMessage(oracle, _random.Pick(oracle.Comp.RejectMessages), InGameICChatType.Speak, true); + } + + return; + } + + DispenseRewards(oracle, Transform(args.User).Coordinates); + QueueDel(args.Used); + + if (updateRequest) + NextItem(oracle); + } + + private void SendTelepathicInfo(Entity oracle, INetChannel client, string message) + { + var messageWrap = Loc.GetString("chat-manager-send-telepathic-chat-wrap-message", + ("telepathicChannelName", Loc.GetString("chat-manager-telepathic-channel-name")), + ("message", message)); + + _chatMan.ChatMessageToOne(ChatChannel.Telepathic, + message, messageWrap, oracle, false, client, Color.PaleVioletRed); + } + + private bool IsCorrectItem(EntityPrototype given, EntityPrototype target) + { + // Nyano, what is this shit? + // Why are we comparing by name instead of prototype id? + // Why is this ever necessary? + // What were you trying to accomplish?! + if (given.Name == target.Name) + return true; + + return false; + } + + private void DispenseRewards(Entity oracle, EntityCoordinates throwTarget) + { + foreach (var rewardRandom in oracle.Comp.RewardEntities) + { + // Spawn each reward next to oracle and throw towards the target + var rewardProto = _protoMan.Index(rewardRandom).Pick(_random); + var reward = EntityManager.SpawnNextToOrDrop(rewardProto, oracle); + _throwing.TryThrow(reward, throwTarget, recoil: false); + } + + DispenseLiquidReward(oracle); + } + + private void DispenseLiquidReward(Entity oracle) + { + if (!_solutions.TryGetSolution(oracle.Owner, OracleComponent.SolutionName, out var fountainSol)) + return; + + // Why is this hardcoded? + var amount = MathF.Round(20 + _random.Next(1, 30) + _glimmer.GlimmerOutput / 10f); + var temporarySol = new Solution(); + var reagent = _protoMan.Index(oracle.Comp.RewardReagents).Pick(_random); + + if (_random.Prob(oracle.Comp.AbnormalReagentChance)) + { + var allReagents = _protoMan.EnumeratePrototypes() + .Where(x => !x.Abstract) + .Select(x => x.ID).ToList(); + + reagent = _random.Pick(allReagents); + } + + temporarySol.AddReagent(reagent, amount); + _solutions.TryMixAndOverflow(fountainSol.Value, temporarySol, fountainSol.Value.Comp.Solution.MaxVolume, out var overflowing); + + if (overflowing != null && overflowing.Volume > 0) + _puddles.TrySpillAt(oracle, overflowing, out var _); + } + + private bool NextItem(Entity oracle) + { + oracle.Comp.NextBarkTime = oracle.Comp.NextRejectTime = TimeSpan.Zero; + oracle.Comp.NextDemandTime = _timing.CurTime + oracle.Comp.DemandDelay; + + var protoId = GetDesiredItem(oracle); + if (protoId != null && _protoMan.TryIndex(protoId, out var proto)) + { + oracle.Comp.DesiredPrototype = proto; + return true; + } + + return false; + } + + // TODO: find a way to not just use string literals here (weighted random doesn't support enums) + private string? GetDesiredItem(Entity oracle) + { + var demand = _protoMan.Index(oracle.Comp.DemandTypes).Pick(_random); + + string? proto; + if (demand == "tech" && GetRandomTechProto(oracle, out proto)) + return proto; + + // This is also a fallback for when there's no research server to form an oracle tech request. + if (demand is "plant" or "tech" && GetRandomPlantProto(oracle, out proto)) + return proto; + + return null; + } + + private bool GetRandomTechProto(Entity oracle, [NotNullWhen(true)] out string? proto) + { + // Try to find the most advanced server. + var database = _research.GetServerIds() + .Select(x => _research.TryGetServerById(x, out var serverUid, out _) ? serverUid : null) + .Where(x => x != null && Transform(x.Value).GridUid == Transform(oracle).GridUid) + .Select(x => + { + TryComp(x!.Value, out var comp); + return new Entity(x.Value, comp); + }) + .Where(x => x.Comp != null) + .OrderByDescending(x => + _research.GetDisciplineTiers(x.Comp!).Select(pair => pair.Value).Max()) + .FirstOrDefault(EntityUid.Invalid); + + if (database.Owner == EntityUid.Invalid) + { + Log.Warning($"Cannot find an applicable server on grid {Transform(oracle).GridUid} to form an oracle request."); + proto = null; + return false; + } + + // Select a technology that's either already unlocked, or can be unlocked from current research + var techs = _protoMan.EnumeratePrototypes() + .Where(x => !x.Hidden) + .Where(x => + _research.IsTechnologyUnlocked(database.Owner, x, database.Comp) + || _research.IsTechnologyAvailable(database.Comp!, x)) + .SelectMany(x => x.RecipeUnlocks) + .Select(x => _protoMan.Index(x).Result) + .Where(x => IsDemandValid(oracle, x)) + .ToList(); + + // Unlikely. + if (techs.Count == 0) + { + proto = null; + return false; + } + + proto = _random.Pick(techs); + return true; + } + + private bool GetRandomPlantProto(Entity oracle, [NotNullWhen(true)] out string? proto) + { + var allPlants = _protoMan.EnumeratePrototypes() + .Select(x => x.ProductPrototypes.FirstOrDefault()) + .Where(x => IsDemandValid(oracle, x)) + .ToList(); + + if (allPlants.Count == 0) + { + proto = null; + return false; + } + + proto = _random.Pick(allPlants)!; + return true; + } + + private bool IsDemandValid(Entity oracle, ProtoId? id) + { + if (id == null || oracle.Comp.BlacklistedDemands.Contains(id.Value)) + return false; + + return _protoMan.TryIndex(id, out var proto) && proto.Components.ContainsKey("Item"); + } +} diff --git a/Content.Server/Silicons/Borgs/BorgSystem.Modules.cs b/Content.Server/Silicons/Borgs/BorgSystem.Modules.cs index cc57c34c47..7ede234242 100644 --- a/Content.Server/Silicons/Borgs/BorgSystem.Modules.cs +++ b/Content.Server/Silicons/Borgs/BorgSystem.Modules.cs @@ -2,6 +2,7 @@ using Content.Shared.Hands.Components; using Content.Shared.Interaction.Components; using Content.Shared.Silicons.Borgs.Components; +using Content.Server.Silicons.Borgs.Components; using Robust.Shared.Containers; namespace Content.Server.Silicons.Borgs; @@ -190,6 +191,10 @@ private void ProvideItems(EntityUid chassis, EntityUid uid, BorgChassisComponent if (!component.ItemsCreated) { item = Spawn(itemProto, xform.Coordinates); + if (TryComp(uid, out var module)) + { + module.JetpackUid = item; + } } else { diff --git a/Content.Server/Silicons/Borgs/Components/BorgJetpackComponent.cs b/Content.Server/Silicons/Borgs/Components/BorgJetpackComponent.cs new file mode 100644 index 0000000000..3a71dd3a50 --- /dev/null +++ b/Content.Server/Silicons/Borgs/Components/BorgJetpackComponent.cs @@ -0,0 +1,12 @@ +using Robust.Shared.GameStates; + +namespace Content.Server.Silicons.Borgs.Components; + +/// +/// Server side indicator for a jetpack module. Used as conditional for inserting in canisters. +/// +[RegisterComponent] +public sealed partial class BorgJetpackComponent : Component +{ + public EntityUid? JetpackUid = null; +} \ No newline at end of file diff --git a/Content.Server/Standing/LayingDownSystem.cs b/Content.Server/Standing/LayingDownSystem.cs index 69787ae830..73a929fdfc 100644 --- a/Content.Server/Standing/LayingDownSystem.cs +++ b/Content.Server/Standing/LayingDownSystem.cs @@ -48,7 +48,7 @@ private void OnRefreshMovementSpeed(EntityUid uid, LayingDownComponent component if (TryComp(uid, out var standingState) && standingState.Standing) return; - args.ModifySpeed(component.DownedSpeedMultiplier, component.DownedSpeedMultiplier); + args.ModifySpeed(component.DownedSpeedMultiplier, component.DownedSpeedMultiplier, bypassImmunity: true); } private void OnParentChanged(EntityUid uid, LayingDownComponent component, EntParentChangedMessage args) diff --git a/Content.Server/StationEvents/EventManagerSystem.cs b/Content.Server/StationEvents/EventManagerSystem.cs index d33a373b37..c6e9beeaca 100644 --- a/Content.Server/StationEvents/EventManagerSystem.cs +++ b/Content.Server/StationEvents/EventManagerSystem.cs @@ -162,7 +162,7 @@ public TimeSpan TimeSinceLastEvent(EntityPrototype stationEvent) private bool CanRun(EntityPrototype prototype, StationEventComponent stationEvent, int playerCount, TimeSpan currentTime) { - if (GameTicker.IsGameRuleActive(prototype.ID)) + if (GameTicker.IsGameRuleAdded(prototype.ID)) return false; if (stationEvent.MaxOccurrences.HasValue && GetOccurrences(prototype) >= stationEvent.MaxOccurrences.Value) diff --git a/Content.Server/Supermatter/Systems/SupermatterSystem.Processing.cs b/Content.Server/Supermatter/Systems/SupermatterSystem.Processing.cs new file mode 100644 index 0000000000..7a62eba6f7 --- /dev/null +++ b/Content.Server/Supermatter/Systems/SupermatterSystem.Processing.cs @@ -0,0 +1,412 @@ +using Content.Shared.Atmos; +using Content.Shared.Radiation.Components; +using Content.Shared.Supermatter.Components; +using System.Text; +using Content.Shared.Chat; +using System.Linq; +using Content.Shared.Audio; +using Content.Shared.CCVar; + +namespace Content.Server.Supermatter.Systems; + +public sealed partial class SupermatterSystem +{ + /// + /// Handle power and radiation output depending on atmospheric things. + /// + private void ProcessAtmos(EntityUid uid, SupermatterComponent sm) + { + var mix = _atmosphere.GetContainingMixture(uid, true, true); + + if (mix is not { }) + return; + + var absorbedGas = mix.Remove(sm.GasEfficiency * mix.TotalMoles); + var moles = absorbedGas.TotalMoles; + + if (!(moles > 0f)) + return; + + var gases = sm.GasStorage; + var facts = sm.GasDataFields; + + // Lets get the proportions of the gasses in the mix for scaling stuff later + // They range between 0 and 1 + gases = gases.ToDictionary( + gas => gas.Key, + gas => Math.Clamp(absorbedGas.GetMoles(gas.Key) / moles, 0, 1) + ); + + // No less then zero, and no greater then one, we use this to do explosions and heat to power transfer. + var powerRatio = gases.Sum(gas => gases[gas.Key] * facts[gas.Key].PowerMixRatio); + + // Minimum value of -10, maximum value of 23. Affects plasma, o2 and heat output. + var heatModifier = gases.Sum(gas => gases[gas.Key] * facts[gas.Key].HeatPenalty); + + // Minimum value of -10, maximum value of 23. Affects plasma, o2 and heat output. + var transmissionBonus = gases.Sum(gas => gases[gas.Key] * facts[gas.Key].TransmitModifier); + + var h2OBonus = 1 - gases[Gas.WaterVapor] * 0.25f; + + powerRatio = Math.Clamp(powerRatio, 0, 1); + heatModifier = Math.Max(heatModifier, 0.5f); + transmissionBonus *= h2OBonus; + + // Effects the damage heat does to the crystal + sm.DynamicHeatResistance = 1f; + + // More moles of gases are harder to heat than fewer, so let's scale heat damage around them + sm.MoleHeatPenaltyThreshold = (float) Math.Max(moles * sm.MoleHeatPenalty, 0.25); + + // Ramps up or down in increments of 0.02 up to the proportion of CO2 + // Given infinite time, powerloss_dynamic_scaling = co2comp + // Some value from 0-1 + if (moles > sm.PowerlossInhibitionMoleThreshold && gases[Gas.CarbonDioxide] > sm.PowerlossInhibitionGasThreshold) + { + var co2powerloss = Math.Clamp(gases[Gas.CarbonDioxide] - sm.PowerlossDynamicScaling, -0.02f, 0.02f); + sm.PowerlossDynamicScaling = Math.Clamp(sm.PowerlossDynamicScaling + co2powerloss, 0f, 1f); + } + else + sm.PowerlossDynamicScaling = Math.Clamp(sm.PowerlossDynamicScaling - 0.05f, 0f, 1f); + + // Ranges from 0~1(1 - (0~1 * 1~(1.5 * (mol / 500)))) + // We take the mol count, and scale it to be our inhibitor + var powerlossInhibitor = + Math.Clamp( + 1 + - sm.PowerlossDynamicScaling + * Math.Clamp( + moles / sm.PowerlossInhibitionMoleBoostThreshold, + 1f, 1.5f), + 0f, 1f); + + if (sm.MatterPower != 0) // We base our removed power off 1/10 the matter_power. + { + var removedMatter = Math.Max(sm.MatterPower / sm.MatterPowerConversion, 40); + // Adds at least 40 power + sm.Power = Math.Max(sm.Power + removedMatter, 0); + // Removes at least 40 matter power + sm.MatterPower = Math.Max(sm.MatterPower - removedMatter, 0); + } + + // Based on gas mix, makes the power more based on heat or less effected by heat + var tempFactor = powerRatio > 0.8 ? 50f : 30f; + + // If there is more pluox and N2 then anything else, we receive no power increase from heat + sm.Power = Math.Max(absorbedGas.Temperature * tempFactor / Atmospherics.T0C * powerRatio + sm.Power, 0); + + // Irradiate stuff + if (TryComp(uid, out var rad)) + rad.Intensity = + sm.Power + * Math.Max(0, 1f + transmissionBonus / 10f) + * 0.003f + * _config.GetCVar(CCVars.SupermatterRadsModifier); + + // Power * 0.55 * 0.8~1 + var energy = sm.Power * sm.ReactionPowerModifier; + + // Keep in mind we are only adding this temperature to (efficiency)% of the one tile the rock is on. + // An increase of 4°C at 25% efficiency here results in an increase of 1°C / (#tilesincore) overall. + // Power * 0.55 * 1.5~23 / 5 + absorbedGas.Temperature += energy * heatModifier * sm.ThermalReleaseModifier; + absorbedGas.Temperature = Math.Max(0, + Math.Min(absorbedGas.Temperature, sm.HeatThreshold * heatModifier)); + + // Release the waste + absorbedGas.AdjustMoles(Gas.Plasma, Math.Max(energy * heatModifier * sm.PlasmaReleaseModifier, 0f)); + absorbedGas.AdjustMoles(Gas.Oxygen, Math.Max((energy + absorbedGas.Temperature * heatModifier - Atmospherics.T0C) * sm.OxygenReleaseEfficiencyModifier, 0f)); + + _atmosphere.Merge(mix, absorbedGas); + + var powerReduction = (float) Math.Pow(sm.Power / 500, 3); + + // After this point power is lowered + // This wraps around to the begining of the function + sm.Power = Math.Max(sm.Power - Math.Min(powerReduction * powerlossInhibitor, sm.Power * 0.83f * powerlossInhibitor), 0f); + } + + /// + /// Shoot lightning bolts depensing on accumulated power. + /// + private void SupermatterZap(EntityUid uid, SupermatterComponent sm) + { + // Divide power by its' threshold to get a value from 0-1, then multiply by the amount of possible lightnings + var zapPower = sm.Power / sm.PowerPenaltyThreshold * sm.LightningPrototypes.Length; + var zapPowerNorm = (int) Math.Clamp(zapPower, 0, sm.LightningPrototypes.Length - 1); + _lightning.ShootRandomLightnings(uid, 3.5f, sm.Power > sm.PowerPenaltyThreshold ? 3 : 1, sm.LightningPrototypes[zapPowerNorm]); + } + + /// + /// Handles environmental damage. + /// + private void HandleDamage(EntityUid uid, SupermatterComponent sm) + { + var xform = Transform(uid); + var indices = _xform.GetGridOrMapTilePosition(uid, xform); + + sm.DamageArchived = sm.Damage; + + var mix = _atmosphere.GetContainingMixture(uid, true, true); + + // We're in space or there is no gas to process + if (!xform.GridUid.HasValue || mix is not { } || mix.TotalMoles == 0f) + { + sm.Damage += Math.Max(sm.Power / 1000 * sm.DamageIncreaseMultiplier, 0.1f); + return; + } + + // Absorbed gas from surrounding area + var absorbedGas = mix.Remove(sm.GasEfficiency * mix.TotalMoles); + var moles = absorbedGas.TotalMoles; + + var totalDamage = 0f; + + var tempThreshold = Atmospherics.T0C + sm.HeatPenaltyThreshold; + + // Temperature start to have a positive effect on damage after 350 + var tempDamage = + Math.Max( + Math.Clamp(moles / 200f, .5f, 1f) + * absorbedGas.Temperature + - tempThreshold + * sm.DynamicHeatResistance, + 0f) + * sm.MoleHeatThreshold + / 150f + * sm.DamageIncreaseMultiplier; + totalDamage += tempDamage; + + // Power only starts affecting damage when it is above 5000 + var powerDamage = Math.Max(sm.Power - sm.PowerPenaltyThreshold, 0f) / 500f * sm.DamageIncreaseMultiplier; + totalDamage += powerDamage; + + // Mol count only starts affecting damage when it is above 1800 + var moleDamage = Math.Max(moles - sm.MolePenaltyThreshold, 0) / 80 * sm.DamageIncreaseMultiplier; + totalDamage += moleDamage; + + // Healing damage + if (moles < sm.MolePenaltyThreshold) + { + // There's a very small float so that it doesn't divide by 0 + var healHeatDamage = Math.Min(absorbedGas.Temperature - tempThreshold, 0.001f) / 150; + totalDamage += healHeatDamage; + } + + // Check for space tiles next to SM + //TODO: Change moles out for checking if adjacent tiles exist + var enumerator = _atmosphere.GetAdjacentTileMixtures(xform.GridUid.Value, indices, false, false); + while (enumerator.MoveNext(out var ind)) + { + if (ind.TotalMoles != 0) + continue; + + var integrity = GetIntegrity(sm); + + var factor = integrity switch + { + < 10 => 0.0005f, + < 25 => 0.0009f, + < 45 => 0.005f, + < 75 => 0.002f, + _ => 0f + }; + + totalDamage += Math.Clamp(sm.Power * factor * sm.DamageIncreaseMultiplier, 0, sm.MaxSpaceExposureDamage); + + break; + } + + var damage = Math.Min(sm.DamageArchived + sm.DamageHardcap * sm.DamageDelaminationPoint, totalDamage); + + // Prevent it from going negative + sm.Damage = Math.Clamp(damage, 0, float.PositiveInfinity); + } + + /// + /// Handles core damage announcements + /// + private void AnnounceCoreDamage(EntityUid uid, SupermatterComponent sm) + { + var message = string.Empty; + var global = false; + + var integrity = GetIntegrity(sm).ToString("0.00"); + + // Special cases + if (sm.Damage < sm.DamageDelaminationPoint && sm.Delamming) + { + message = Loc.GetString("supermatter-delam-cancel", ("integrity", integrity)); + sm.DelamAnnounced = false; + global = true; + } + + if (sm.Delamming && !sm.DelamAnnounced) + { + var sb = new StringBuilder(); + var loc = string.Empty; + + switch (sm.PreferredDelamType) + { + case DelamType.Cascade: loc = "supermatter-delam-cascade"; break; + case DelamType.Singulo: loc = "supermatter-delam-overmass"; break; + case DelamType.Tesla: loc = "supermatter-delam-tesla"; break; + default: loc = "supermatter-delam-explosion"; break; + } + + var station = _station.GetOwningStation(uid); + if (station != null) + _alert.SetLevel((EntityUid) station, sm.AlertCodeDeltaId, true, true, true, false); + + sb.AppendLine(Loc.GetString(loc)); + sb.AppendLine(Loc.GetString("supermatter-seconds-before-delam", ("seconds", sm.DelamTimer))); + + message = sb.ToString(); + global = true; + sm.DelamAnnounced = true; + + SendSupermatterAnnouncement(uid, message, global); + return; + } + + // Ignore the 0% integrity alarm + if (sm.Delamming) + return; + + // We are not taking consistent damage, Engineers aren't needed + if (sm.Damage <= sm.DamageArchived) + return; + + if (sm.Damage >= sm.DamageWarningThreshold) + { + message = Loc.GetString("supermatter-warning", ("integrity", integrity)); + if (sm.Damage >= sm.DamageEmergencyThreshold) + { + message = Loc.GetString("supermatter-emergency", ("integrity", integrity)); + global = true; + } + } + + SendSupermatterAnnouncement(uid, message, global); + } + + /// If true, sends a station announcement + /// Localisation string for a custom announcer name + public void SendSupermatterAnnouncement(EntityUid uid, string message, bool global = false, string? customSender = null) + { + if (global) + { + var sender = Loc.GetString(customSender != null ? customSender : "supermatter-announcer"); + _chat.DispatchStationAnnouncement(uid, message, sender, colorOverride: Color.Yellow); + return; + } + + _chat.TrySendInGameICMessage(uid, message, InGameICChatType.Speak, hideChat: false, checkRadioPrefix: true); + } + + /// + /// Returns the integrity rounded to hundreds, e.g. 100.00% + /// + public float GetIntegrity(SupermatterComponent sm) + { + var integrity = sm.Damage / sm.DamageDelaminationPoint; + integrity = (float) Math.Round(100 - integrity * 100, 2); + integrity = integrity < 0 ? 0 : integrity; + return integrity; + } + + /// + /// Decide on how to delaminate. + /// + public DelamType ChooseDelamType(EntityUid uid, SupermatterComponent sm) + { + if (_config.GetCVar(CCVars.SupermatterDoForceDelam)) + return _config.GetCVar(CCVars.SupermatterForcedDelamType); + + var mix = _atmosphere.GetContainingMixture(uid, true, true); + + if (mix is { }) + { + var absorbedGas = mix.Remove(sm.GasEfficiency * mix.TotalMoles); + var moles = absorbedGas.TotalMoles; + + if (_config.GetCVar(CCVars.SupermatterDoSingulooseDelam) + && moles >= sm.MolePenaltyThreshold * _config.GetCVar(CCVars.SupermatterSingulooseMolesModifier)) + return DelamType.Singulo; + } + + if (_config.GetCVar(CCVars.SupermatterDoTeslooseDelam) + && sm.Power >= sm.PowerPenaltyThreshold * _config.GetCVar(CCVars.SupermatterTesloosePowerModifier)) + return DelamType.Tesla; + + //TODO: Add resonance cascade when there's crazy conditions or a destabilizing crystal + + return DelamType.Explosion; + } + + /// + /// Handle the end of the station. + /// + private void HandleDelamination(EntityUid uid, SupermatterComponent sm) + { + var xform = Transform(uid); + + sm.PreferredDelamType = ChooseDelamType(uid, sm); + + if (!sm.Delamming) + { + sm.Delamming = true; + AnnounceCoreDamage(uid, sm); + } + + if (sm.Damage < sm.DamageDelaminationPoint && sm.Delamming) + { + sm.Delamming = false; + AnnounceCoreDamage(uid, sm); + } + + sm.DelamTimerAccumulator++; + + if (sm.DelamTimerAccumulator < sm.DelamTimer) + return; + + switch (sm.PreferredDelamType) + { + case DelamType.Cascade: + Spawn(sm.KudzuSpawnPrototype, xform.Coordinates); + break; + + case DelamType.Singulo: + Spawn(sm.SingularitySpawnPrototype, xform.Coordinates); + break; + + case DelamType.Tesla: + Spawn(sm.TeslaSpawnPrototype, xform.Coordinates); + break; + + default: + _explosion.TriggerExplosive(uid); + break; + } + } + + /// + /// Swaps out ambience sounds when the SM is delamming or not. + /// + private void HandleSoundLoop(EntityUid uid, SupermatterComponent sm) + { + var ambient = Comp(uid); + + if (ambient == null) + return; + + if (sm.Delamming && sm.CurrentSoundLoop != sm.DelamSound) + sm.CurrentSoundLoop = sm.DelamSound; + + else if (!sm.Delamming && sm.CurrentSoundLoop != sm.CalmSound) + sm.CurrentSoundLoop = sm.CalmSound; + + if (ambient.Sound != sm.CurrentSoundLoop) + _ambient.SetSound(uid, sm.CurrentSoundLoop, ambient); + } +} \ No newline at end of file diff --git a/Content.Server/Supermatter/Systems/SupermatterSystem.cs b/Content.Server/Supermatter/Systems/SupermatterSystem.cs index cfce8b989d..1f54b8c8a4 100644 --- a/Content.Server/Supermatter/Systems/SupermatterSystem.cs +++ b/Content.Server/Supermatter/Systems/SupermatterSystem.cs @@ -8,8 +8,6 @@ using Content.Shared.Interaction; using Content.Shared.Projectiles; using Content.Shared.Mobs.Components; -using Content.Shared.Radiation.Components; -using Content.Server.Audio; using Content.Server.Atmos.EntitySystems; using Content.Server.Chat.Systems; using Content.Server.Explosion.EntitySystems; @@ -17,21 +15,16 @@ using Content.Server.Lightning; using Content.Server.AlertLevel; using Content.Server.Station.Systems; -using System.Text; using Content.Server.Kitchen.Components; -using Content.Shared.Chat; using Content.Shared.DoAfter; using Content.Shared.Examine; using Content.Server.DoAfter; using Content.Server.Popups; -using System.Linq; using Content.Shared.Audio; -using System.Configuration; -using Content.Shared.CCVar; namespace Content.Server.Supermatter.Systems; -public sealed class SupermatterSystem : EntitySystem +public sealed partial class SupermatterSystem : EntitySystem { [Dependency] private readonly AtmosphereSystem _atmosphere = default!; [Dependency] private readonly ChatSystem _chat = default!; @@ -89,7 +82,7 @@ public void Cycle(EntityUid uid, SupermatterComponent sm) ProcessAtmos(uid, sm); HandleDamage(uid, sm); - if (sm.Damage >= sm.DelaminationPoint || sm.Delamming) + if (sm.Damage >= sm.DamageDelaminationPoint || sm.Delamming) HandleDelamination(uid, sm); HandleSoundLoop(uid, sm); @@ -103,411 +96,16 @@ public void Cycle(EntityUid uid, SupermatterComponent sm) if (sm.YellAccumulator >= sm.YellTimer) { sm.YellAccumulator -= sm.YellTimer; - HandleAnnouncements(uid, sm); + AnnounceCoreDamage(uid, sm); } } - #region Processing - - /// - /// Handle power and radiation output depending on atmospheric things. - /// - private void ProcessAtmos(EntityUid uid, SupermatterComponent sm) - { - var mix = _atmosphere.GetContainingMixture(uid, true, true); - - if (mix is not { }) - return; - - var absorbedGas = mix.Remove(sm.GasEfficiency * mix.TotalMoles); - var moles = absorbedGas.TotalMoles; - - if (!(moles > 0f)) - return; - - var gases = sm.GasStorage; - var facts = sm.GasDataFields; - - //Lets get the proportions of the gasses in the mix for scaling stuff later - //They range between 0 and 1 - gases = gases.ToDictionary( - gas => gas.Key, - gas => Math.Clamp(absorbedGas.GetMoles(gas.Key) / moles, 0, 1) - ); - - //No less then zero, and no greater then one, we use this to do explosions and heat to power transfer. - var powerRatio = gases.Sum(gas => gases[gas.Key] * facts[gas.Key].PowerMixRatio); - - // Minimum value of -10, maximum value of 23. Affects plasma, o2 and heat output. - var heatModifier = gases.Sum(gas => gases[gas.Key] * facts[gas.Key].HeatPenalty); - - // Minimum value of -10, maximum value of 23. Affects plasma, o2 and heat output. - var transmissionBonus = gases.Sum(gas => gases[gas.Key] * facts[gas.Key].TransmitModifier); - - var h2OBonus = 1 - gases[Gas.WaterVapor] * 0.25f; - - powerRatio = Math.Clamp(powerRatio, 0, 1); - heatModifier = Math.Max(heatModifier, 0.5f); - transmissionBonus *= h2OBonus; - - // Effects the damage heat does to the crystal - sm.DynamicHeatResistance = 1f; - - // more moles of gases are harder to heat than fewer, - // so let's scale heat damage around them - sm.MoleHeatPenaltyThreshold = (float) Math.Max(moles * sm.MoleHeatPenalty, 0.25); - - // Ramps up or down in increments of 0.02 up to the proportion of co2 - // Given infinite time, powerloss_dynamic_scaling = co2comp - // Some value between 0 and 1 - if (moles > sm.PowerlossInhibitionMoleThreshold && gases[Gas.CarbonDioxide] > sm.PowerlossInhibitionGasThreshold) - { - var co2powerloss = Math.Clamp(gases[Gas.CarbonDioxide] - sm.PowerlossDynamicScaling, -0.02f, 0.02f); - sm.PowerlossDynamicScaling = Math.Clamp(sm.PowerlossDynamicScaling + co2powerloss, 0f, 1f); - } - else - { - sm.PowerlossDynamicScaling = Math.Clamp(sm.PowerlossDynamicScaling - 0.05f, 0f, 1f); - } - - // Ranges from 0 to 1(1-(value between 0 and 1 * ranges from 1 to 1.5(mol / 500))) - // We take the mol count, and scale it to be our inhibitor - var powerlossInhibitor = - Math.Clamp( - 1 - sm.PowerlossDynamicScaling * - Math.Clamp(moles / sm.PowerlossInhibitionMoleBoostThreshold, 1f, 1.5f), - 0f, 1f); - - if (sm.MatterPower != 0) //We base our removed power off one 10th of the matter_power. - { - var removedMatter = Math.Max(sm.MatterPower / sm.MatterPowerConversion, 40); - //Adds at least 40 power - sm.Power = Math.Max(sm.Power + removedMatter, 0); - //Removes at least 40 matter power - sm.MatterPower = Math.Max(sm.MatterPower - removedMatter, 0); - } - - //based on gas mix, makes the power more based on heat or less effected by heat - var tempFactor = powerRatio > 0.8 ? 50f : 30f; - - //if there is more pluox and n2 then anything else, we receive no power increase from heat - sm.Power = Math.Max(absorbedGas.Temperature * tempFactor / Atmospherics.T0C * powerRatio + sm.Power, 0); - - //Radiate stuff - if (TryComp(uid, out var rad)) - rad.Intensity = sm.Power * Math.Max(0, 1f + transmissionBonus / 10f) * 0.003f * _config.GetCVar(CCVars.SupermatterRadsModifier); - - //Power * 0.55 * a value between 1 and 0.8 - var energy = sm.Power * sm.ReactionPowerModifier; - - // Keep in mind we are only adding this temperature to (efficiency)% of the one tile the rock - // is on. An increase of 4*C @ 25% efficiency here results in an increase of 1*C / (#tilesincore) overall. - // Power * 0.55 * (some value between 1.5 and 23) / 5 - absorbedGas.Temperature += energy * heatModifier * sm.ThermalReleaseModifier; - absorbedGas.Temperature = Math.Max(0, - Math.Min(absorbedGas.Temperature, sm.HeatThreshold * heatModifier)); - - // Release the waste - absorbedGas.AdjustMoles(Gas.Plasma, Math.Max(energy * heatModifier * sm.PlasmaReleaseModifier, 0f)); - absorbedGas.AdjustMoles(Gas.Oxygen, Math.Max((energy + absorbedGas.Temperature * heatModifier - Atmospherics.T0C) * sm.OxygenReleaseEfficiencyModifier, 0f)); - - _atmosphere.Merge(mix, absorbedGas); - - var powerReduction = (float) Math.Pow(sm.Power / 500, 3); - - // After this point power is lowered - // This wraps around to the begining of the function - sm.Power = Math.Max(sm.Power - Math.Min(powerReduction * powerlossInhibitor, sm.Power * 0.83f * powerlossInhibitor), 0f); - } - - /// - /// Shoot lightning bolts depensing on accumulated power. - /// - private void SupermatterZap(EntityUid uid, SupermatterComponent sm) - { - // Divide power by it's threshold to get a value from 0 to 1, then multiply by the amount of possible lightnings - var zapPower = sm.Power / sm.PowerPenaltyThreshold * sm.LightningPrototypes.Length; - var zapPowerNorm = (int) Math.Clamp(zapPower, 0, sm.LightningPrototypes.Length - 1); - _lightning.ShootRandomLightnings(uid, 3.5f, sm.Power > sm.PowerPenaltyThreshold ? 3 : 1, sm.LightningPrototypes[zapPowerNorm]); - } - - /// - /// Handles environmental damage. - /// - private void HandleDamage(EntityUid uid, SupermatterComponent sm) - { - var xform = Transform(uid); - var indices = _xform.GetGridOrMapTilePosition(uid, xform); - - sm.DamageArchived = sm.Damage; - - var mix = _atmosphere.GetContainingMixture(uid, true, true); - - // We're in space or there is no gas to process - if (!xform.GridUid.HasValue || mix is not { } || mix.TotalMoles == 0f) - { - sm.Damage += Math.Max(sm.Power / 1000 * sm.DamageIncreaseMultiplier, 0.1f); - return; - } - - // Absorbed gas from surrounding area - var absorbedGas = mix.Remove(sm.GasEfficiency * mix.TotalMoles); - var moles = absorbedGas.TotalMoles; - - var totalDamage = 0f; - - var tempThreshold = Atmospherics.T0C + sm.HeatPenaltyThreshold; - - // Temperature start to have a positive effect on damage after 350 - var tempDamage = Math.Max(Math.Clamp(moles / 200f, .5f, 1f) * absorbedGas.Temperature - tempThreshold * sm.DynamicHeatResistance, 0f) * sm.MoleHeatThreshold / 150f * sm.DamageIncreaseMultiplier; - totalDamage += tempDamage; - - // Power only starts affecting damage when it is above 5000 - var powerDamage = Math.Max(sm.Power - sm.PowerPenaltyThreshold, 0f) / 500f * sm.DamageIncreaseMultiplier; - totalDamage += powerDamage; - - // Molar count only starts affecting damage when it is above 1800 - var moleDamage = Math.Max(moles - sm.MolePenaltyThreshold, 0) / 80 * sm.DamageIncreaseMultiplier; - totalDamage += moleDamage; - - // Healing damage - if (moles < sm.MolePenaltyThreshold) - { - // left there a very small float value so that it doesn't eventually divide by 0. - var healHeatDamage = Math.Min(absorbedGas.Temperature - tempThreshold, 0.001f) / 150; - totalDamage += healHeatDamage; - } - - // Check for space tiles next to SM - // TODO: change moles out for checking if adjacent tiles exist - var enumerator = _atmosphere.GetAdjacentTileMixtures(xform.GridUid.Value, indices, false, false); - while (enumerator.MoveNext(out var ind)) - { - if (ind.TotalMoles != 0) - continue; - - var integrity = GetIntegrity(sm); - - var factor = integrity switch - { - < 10 => 0.0005f, - < 25 => 0.0009f, - < 45 => 0.005f, - < 75 => 0.002f, - _ => 0f - }; - - totalDamage += Math.Clamp(sm.Power * factor * sm.DamageIncreaseMultiplier, 0, sm.MaxSpaceExposureDamage); - - break; - } - - var damage = Math.Min(sm.DamageArchived + sm.DamageHardcap * sm.DelaminationPoint, totalDamage); - - // prevent it from going negative - sm.Damage = Math.Clamp(damage, 0, float.PositiveInfinity); - } - - /// - /// Handles announcements. - /// - private void HandleAnnouncements(EntityUid uid, SupermatterComponent sm) - { - var message = string.Empty; - var global = false; - - var integrity = GetIntegrity(sm).ToString("0.00"); - - // Special cases - if (sm.Damage < sm.DelaminationPoint && sm.Delamming) - { - message = Loc.GetString("supermatter-delam-cancel", ("integrity", integrity)); - sm.DelamAnnounced = false; - global = true; - } - if (sm.Delamming && !sm.DelamAnnounced) - { - var sb = new StringBuilder(); - var loc = string.Empty; - - switch (sm.PreferredDelamType) - { - case DelamType.Explosion: - default: loc = "supermatter-delam-explosion"; break; - - case DelamType.Singulo: loc = "supermatter-delam-overmass"; break; - - case DelamType.Tesla: loc = "supermatter-delam-tesla"; break; - - case DelamType.Cascade: loc = "supermatter-delam-cascade"; break; - } - - var station = _station.GetOwningStation(uid); - if (station != null) - _alert.SetLevel((EntityUid) station, sm.AlertCodeDeltaId, true, true, true, false); - - sb.AppendLine(Loc.GetString(loc)); - sb.AppendLine(Loc.GetString("supermatter-seconds-before-delam", ("seconds", sm.DelamTimer))); - - message = sb.ToString(); - global = true; - sm.DelamAnnounced = true; - - SupermatterAnnouncement(uid, message, global); - return; - } - - // ignore the 0% integrity alarm - if (sm.Delamming) - return; - - // We are not taking consistent damage. Engis not needed. - if (sm.Damage <= sm.DamageArchived) - return; - - if (sm.Damage >= sm.WarningPoint) - { - message = Loc.GetString("supermatter-warning", ("integrity", integrity)); - if (sm.Damage >= sm.EmergencyPoint) - { - message = Loc.GetString("supermatter-emergency", ("integrity", integrity)); - global = true; - } - } - SupermatterAnnouncement(uid, message, global); - } - - /// - /// Help the SM announce something. - /// - /// If true, does the station announcement. - /// If true, sends the announcement from Central Command. - public void SupermatterAnnouncement(EntityUid uid, string message, bool global = false, string? customSender = null) - { - if (global) - { - var sender = customSender != null ? customSender : Loc.GetString("supermatter-announcer"); - _chat.DispatchStationAnnouncement(uid, message, sender, colorOverride: Color.Yellow); - return; - } - _chat.TrySendInGameICMessage(uid, message, InGameICChatType.Speak, hideChat: false, checkRadioPrefix: true); - } - - /// - /// Returns the integrity rounded to hundreds, e.g. 100.00% - /// - public float GetIntegrity(SupermatterComponent sm) - { - var integrity = sm.Damage / sm.DelaminationPoint; - integrity = (float) Math.Round(100 - integrity * 100, 2); - integrity = integrity < 0 ? 0 : integrity; - return integrity; - } - - /// - /// Decide on how to delaminate. - /// - public DelamType ChooseDelamType(EntityUid uid, SupermatterComponent sm) - { - if (_config.GetCVar(CCVars.DoForceDelam)) - return _config.GetCVar(CCVars.ForcedDelamType); - - var mix = _atmosphere.GetContainingMixture(uid, true, true); - - if (mix is { }) - { - var absorbedGas = mix.Remove(sm.GasEfficiency * mix.TotalMoles); - var moles = absorbedGas.TotalMoles; - - if (_config.GetCVar(CCVars.DoSingulooseDelam) - && moles >= sm.MolePenaltyThreshold * _config.GetCVar(CCVars.SingulooseMolesModifier)) - return DelamType.Singulo; - } - if (_config.GetCVar(CCVars.DoTeslooseDelam) - && sm.Power >= sm.PowerPenaltyThreshold * _config.GetCVar(CCVars.TesloosePowerModifier)) - return DelamType.Tesla; - - // TODO: add resonance cascade when there's crazy conditions or a destabilizing crystal - - return DelamType.Explosion; - } - - /// - /// Handle the end of the station. - /// - private void HandleDelamination(EntityUid uid, SupermatterComponent sm) - { - var xform = Transform(uid); - - sm.PreferredDelamType = ChooseDelamType(uid, sm); - - if (!sm.Delamming) - { - sm.Delamming = true; - HandleAnnouncements(uid, sm); - } - if (sm.Damage < sm.DelaminationPoint && sm.Delamming) - { - sm.Delamming = false; - HandleAnnouncements(uid, sm); - } - - sm.DelamTimerAccumulator++; - - if (sm.DelamTimerAccumulator < sm.DelamTimer) - return; - - switch (sm.PreferredDelamType) - { - case DelamType.Explosion: - default: - _explosion.TriggerExplosive(uid); - break; - - case DelamType.Singulo: - Spawn(sm.SingularitySpawnPrototype, xform.Coordinates); - break; - - case DelamType.Tesla: - Spawn(sm.TeslaSpawnPrototype, xform.Coordinates); - break; - - case DelamType.Cascade: - Spawn(sm.SupermatterKudzuSpawnPrototype, xform.Coordinates); - break; - } - } - - /// - /// Swaps out ambience sounds whether the SM is delamming or not. - /// - private void HandleSoundLoop(EntityUid uid, SupermatterComponent sm) - { - var ambient = Comp(uid); - - if (ambient == null) - return; - - if (sm.Delamming && sm.CurrentSoundLoop != sm.DelamSound) - sm.CurrentSoundLoop = sm.DelamSound; - - else if (!sm.Delamming && sm.CurrentSoundLoop != sm.CalmSound) - sm.CurrentSoundLoop = sm.CalmSound; - - if (ambient.Sound != sm.CurrentSoundLoop) - _ambient.SetSound(uid, sm.CurrentSoundLoop, ambient); - } - - #endregion - - #region Event Handlers - private void OnMapInit(EntityUid uid, SupermatterComponent sm, MapInitEvent args) { // Set the Sound _ambient.SetAmbience(uid, true); - //Add Air to the initialized SM in the Map so it doesnt delam on default + // Add Air to the initialized SM in the Map so it doesn't delam on its' own var mix = _atmosphere.GetContainingMixture(uid, true, true); mix?.AdjustMoles(Gas.Oxygen, Atmospherics.OxygenMolesStandard); mix?.AdjustMoles(Gas.Nitrogen, Atmospherics.NitrogenMolesStandard); @@ -520,14 +118,15 @@ private void OnCollideEvent(EntityUid uid, SupermatterComponent sm, ref StartCol var target = args.OtherEntity; if (args.OtherBody.BodyType == BodyType.Static - || HasComp(target) - || _container.IsEntityInContainer(uid)) + || HasComp(target) + || _container.IsEntityInContainer(uid)) return; if (!HasComp(target)) { EntityManager.SpawnEntity(sm.CollisionResultPrototype, Transform(target).Coordinates); _audio.PlayPvs(sm.DustSound, uid); + sm.Power += args.OtherBody.Mass; } EntityManager.QueueDeleteEntity(target); @@ -590,13 +189,13 @@ private void OnGetSliver(EntityUid uid, SupermatterComponent sm, ref Supermatter if (args.Cancelled) return; - // your criminal actions will not go unnoticed - sm.Damage += sm.DelaminationPoint / 10; + // Your criminal actions will not go unnoticed + sm.Damage += sm.DamageDelaminationPoint / 10; var integrity = GetIntegrity(sm).ToString("0.00"); - SupermatterAnnouncement(uid, Loc.GetString("supermatter-announcement-cc-tamper", ("integrity", integrity)), true, "Central Command"); + SendSupermatterAnnouncement(uid, Loc.GetString("supermatter-announcement-cc-tamper", ("integrity", integrity)), true, "Central Command"); - Spawn(sm.SupermatterSliverPrototype, _transform.GetMapCoordinates(args.User)); + Spawn(sm.SliverPrototype, _transform.GetMapCoordinates(args.User)); _popup.PopupClient(Loc.GetString("supermatter-tamper-end"), uid, args.User); sm.DelamTimer /= 2; @@ -604,12 +203,7 @@ private void OnGetSliver(EntityUid uid, SupermatterComponent sm, ref Supermatter private void OnExamine(EntityUid uid, SupermatterComponent sm, ref ExaminedEvent args) { - // get all close and personal to it if (args.IsInDetailsRange) - { args.PushMarkup(Loc.GetString("supermatter-examine-integrity", ("integrity", GetIntegrity(sm).ToString("0.00")))); - } } - - #endregion } diff --git a/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraSystem.cs b/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraSystem.cs index 410ba9f754..ec3d33157a 100644 --- a/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraSystem.cs +++ b/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraSystem.cs @@ -1,7 +1,6 @@ using Content.Server.DeviceNetwork; using Content.Server.DeviceNetwork.Components; using Content.Server.DeviceNetwork.Systems; -using Content.Server.Emp; using Content.Server.Power.Components; using Content.Shared.ActionBlocker; using Content.Shared.DeviceNetwork; @@ -59,9 +58,6 @@ public override void Initialize() SubscribeLocalEvent(OnSetName); SubscribeLocalEvent(OnSetNetwork); SubscribeLocalEvent>(AddVerbs); - - SubscribeLocalEvent(OnEmpPulse); - SubscribeLocalEvent(OnEmpDisabledRemoved); } private void OnPacketReceived(EntityUid uid, SurveillanceCameraComponent component, DeviceNetworkPacketEvent args) @@ -400,21 +396,6 @@ private void UpdateVisuals(EntityUid uid, SurveillanceCameraComponent? component _appearance.SetData(uid, SurveillanceCameraVisualsKey.Key, key, appearance); } - - private void OnEmpPulse(EntityUid uid, SurveillanceCameraComponent component, ref EmpPulseEvent args) - { - if (component.Active) - { - args.Affected = true; - args.Disabled = true; - SetActive(uid, false); - } - } - - private void OnEmpDisabledRemoved(EntityUid uid, SurveillanceCameraComponent component, ref EmpDisabledRemoved args) - { - SetActive(uid, true); - } } public sealed class OnSurveillanceCameraViewerAddEvent : EntityEventArgs diff --git a/Content.Server/Traits/Assorted/ConsumeDelayModifierComponent.cs b/Content.Server/Traits/Assorted/ConsumeDelayModifierComponent.cs new file mode 100644 index 0000000000..aa551a79f7 --- /dev/null +++ b/Content.Server/Traits/Assorted/ConsumeDelayModifierComponent.cs @@ -0,0 +1,22 @@ +using Robust.Shared.GameStates; + +namespace Content.Server.Traits.Assorted.Components; + +/// +/// This is used for any trait that modifies how fast an entity consumes food and drinks. +/// +[RegisterComponent] +public sealed partial class ConsumeDelayModifierComponent : Component +{ + /// + /// What to multiply the eating delay by. + /// + [DataField] + public float FoodDelayMultiplier { get; set; } = 1f; + + /// + /// What to multiply the drinking delay by. + /// + [DataField] + public float DrinkDelayMultiplier { get; set; } = 1f; +} diff --git a/Content.Server/Traits/Assorted/LanguageKnowledgeModifierComponent.cs b/Content.Server/Traits/Assorted/LanguageKnowledgeModifierComponent.cs new file mode 100644 index 0000000000..170dae40fa --- /dev/null +++ b/Content.Server/Traits/Assorted/LanguageKnowledgeModifierComponent.cs @@ -0,0 +1,23 @@ +using Content.Shared.Language; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; + +namespace Content.Server.Traits.Assorted; + +/// +/// Used for traits that modify entities' language knowledge. +/// +[RegisterComponent] +public sealed partial class LanguageKnowledgeModifierComponent : Component +{ + /// + /// List of languages this entity will learn to speak. + /// + [DataField("speaks")] + public List NewSpokenLanguages = new(); + + /// + /// List of languages this entity will learn to understand. + /// + [DataField("understands")] + public List NewUnderstoodLanguages = new(); +} diff --git a/Content.Server/Traits/Assorted/LanguageKnowledgeModifierSystem.cs b/Content.Server/Traits/Assorted/LanguageKnowledgeModifierSystem.cs new file mode 100644 index 0000000000..9053c9404f --- /dev/null +++ b/Content.Server/Traits/Assorted/LanguageKnowledgeModifierSystem.cs @@ -0,0 +1,35 @@ +using System.Linq; +using Content.Server.Language; +using Content.Shared.Language.Components; + +namespace Content.Server.Traits.Assorted; + +public sealed class LanguageKnowledgeModifierSystem : EntitySystem +{ + [Dependency] private readonly LanguageSystem _languages = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnStartup); + } + + private void OnStartup(Entity entity, ref ComponentInit args) + { + if (!TryComp(entity, out var knowledge)) + { + Log.Warning($"Entity {entity.Owner} does not have a LanguageKnowledge but has a LanguageKnowledgeModifier!"); + return; + } + + foreach (var spokenLanguage in entity.Comp.NewSpokenLanguages) + { + _languages.AddLanguage(entity, spokenLanguage, true, false, knowledge); + } + + foreach (var understoodLanguage in entity.Comp.NewUnderstoodLanguages) + { + _languages.AddLanguage(entity, understoodLanguage, false, true, knowledge); + } + } +} diff --git a/Content.Server/Traits/Assorted/LayingDownModifierComponent.cs b/Content.Server/Traits/Assorted/LayingDownModifierComponent.cs new file mode 100644 index 0000000000..22660ff448 --- /dev/null +++ b/Content.Server/Traits/Assorted/LayingDownModifierComponent.cs @@ -0,0 +1,22 @@ +using Robust.Shared.GameStates; + +namespace Content.Server.Traits.Assorted; + +/// +/// This is used for traits that modify values related to the Laying Down system. +/// +[RegisterComponent] +public sealed partial class LayingDownModifierComponent : Component +{ + /// + /// What to multiply the cooldown of laying down and standing up by. + /// + [DataField] + public float LayingDownCooldownMultiplier = 1f; + + /// + /// What to multiply the speed multiplier when lying down by. + /// + [DataField] + public float DownedSpeedMultiplierMultiplier = 1f; +} diff --git a/Content.Server/Traits/Assorted/LayingDownModifierSystem.cs b/Content.Server/Traits/Assorted/LayingDownModifierSystem.cs new file mode 100644 index 0000000000..dc6dcd2de3 --- /dev/null +++ b/Content.Server/Traits/Assorted/LayingDownModifierSystem.cs @@ -0,0 +1,22 @@ +using Content.Server.Traits.Assorted; +using Content.Server.Standing; + +namespace Content.Shared.Traits.Assorted.Systems; + +public sealed class LayingDownModifierSystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnStartup); + } + + private void OnStartup(EntityUid uid, LayingDownModifierComponent component, ComponentStartup args) + { + if (!TryComp(uid, out var layingDown)) + return; + + layingDown.Cooldown *= component.LayingDownCooldownMultiplier; + layingDown.DownedSpeedMultiplier *= component.DownedSpeedMultiplierMultiplier; + } +} diff --git a/Content.Server/Traits/Assorted/LiquorLifelineComponent.cs b/Content.Server/Traits/Assorted/LiquorLifelineComponent.cs new file mode 100644 index 0000000000..124d0fa3d7 --- /dev/null +++ b/Content.Server/Traits/Assorted/LiquorLifelineComponent.cs @@ -0,0 +1,11 @@ +using Content.Shared.Damage; + +namespace Content.Server.Traits.Assorted; + +/// +/// This is used for the Liquor Lifeline trait. +/// +[RegisterComponent] +public sealed partial class LiquorLifelineComponent : Component +{ +} diff --git a/Content.Server/Traits/Assorted/LiquorLifelineSystem.cs b/Content.Server/Traits/Assorted/LiquorLifelineSystem.cs new file mode 100644 index 0000000000..49618548d3 --- /dev/null +++ b/Content.Server/Traits/Assorted/LiquorLifelineSystem.cs @@ -0,0 +1,39 @@ +using Content.Server.Body.Components; +using Content.Server.Body.Systems; +using Content.Shared.Body.Components; + +namespace Content.Server.Traits.Assorted; + +public sealed class LiquorLifelineSystem : EntitySystem +{ + [Dependency] private readonly BodySystem _bodySystem = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnSpawn); + } + + private void OnSpawn(Entity entity, ref ComponentInit args) + { + if (!TryComp(entity, out var body)) + return; + + if (!_bodySystem.TryGetBodyOrganComponents(entity, out var metabolizers, body)) + return; + + foreach (var (metabolizer, _) in metabolizers) + { + if (metabolizer.MetabolizerTypes is null + || metabolizer.MetabolismGroups is null) + continue; + + foreach (var metabolismGroup in metabolizer.MetabolismGroups) + { + // Add the LiquorLifeline metabolizer type to the liver and equivalent organs. + if (metabolismGroup.Id == "Alcohol") + metabolizer.MetabolizerTypes.Add("LiquorLifeline"); + } + } + } +} diff --git a/Content.Server/Traits/Assorted/OniDamageModifierComponent.cs b/Content.Server/Traits/Assorted/OniDamageModifierComponent.cs new file mode 100644 index 0000000000..d6cf032aab --- /dev/null +++ b/Content.Server/Traits/Assorted/OniDamageModifierComponent.cs @@ -0,0 +1,16 @@ +using Content.Shared.Damage; + +namespace Content.Server.Traits.Assorted; + +/// +/// This is used for traits that modify Oni damage modifiers. +/// +[RegisterComponent] +public sealed partial class OniDamageModifierComponent : Component +{ + /// + /// Which damage modifiers to override. + /// + [DataField("modifiers", required: true)] + public DamageModifierSet MeleeModifierReplacers = default!; +} diff --git a/Content.Server/Traits/Assorted/OniDamageModifierSystem.cs b/Content.Server/Traits/Assorted/OniDamageModifierSystem.cs new file mode 100644 index 0000000000..9d70105376 --- /dev/null +++ b/Content.Server/Traits/Assorted/OniDamageModifierSystem.cs @@ -0,0 +1,31 @@ +using Content.Server.Abilities.Oni; +using Content.Shared.Damage; + +namespace Content.Server.Traits.Assorted; + +public sealed class OniDamageModifierSystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnStartup); + } + + private void OnStartup(EntityUid uid, OniDamageModifierComponent component, ComponentStartup args) + { + if (!TryComp(uid, out var oni)) + return; + + foreach (var (key, value) in component.MeleeModifierReplacers.Coefficients) + { + oni.MeleeModifiers.Coefficients[key] = value; + + } + + foreach (var (key, value) in component.MeleeModifierReplacers.FlatReduction) + { + oni.MeleeModifiers.FlatReduction[key] = value; + + } + } +} diff --git a/Content.Server/Traits/Assorted/SelfAwareComponent.cs b/Content.Server/Traits/Assorted/SelfAwareComponent.cs new file mode 100644 index 0000000000..03f5cd1550 --- /dev/null +++ b/Content.Server/Traits/Assorted/SelfAwareComponent.cs @@ -0,0 +1,31 @@ +using Content.Shared.Damage.Prototypes; +using Content.Shared.FixedPoint; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Set; + +namespace Content.Server.Traits.Assorted; + +/// +/// This is used for the Self-Aware trait to enhance the information received from HealthExaminableSystem. +/// +[RegisterComponent] +public sealed partial class SelfAwareComponent : Component +{ + // + // Damage types that an entity is able to precisely analyze like a health analyzer when they examine themselves. + // + [DataField(required: true, customTypeSerializer:typeof(PrototypeIdHashSetSerializer))] + public HashSet AnalyzableTypes = default!; + + // + // Damage groups that an entity is able to detect the presence of when they examine themselves. + // + [DataField(required: true, customTypeSerializer:typeof(PrototypeIdHashSetSerializer))] + public HashSet DetectableGroups = default!; + + // + // The thresholds for determining the examine text of DetectableGroups for certain amounts of damage. + // These are calculated as a percentage of the entity's critical threshold. + // + public List Thresholds = new() + { FixedPoint2.New(0.10), FixedPoint2.New(0.25), FixedPoint2.New(0.40), FixedPoint2.New(0.60) }; +} diff --git a/Content.Server/Traits/BloodDeficiencyComponent.cs b/Content.Server/Traits/BloodDeficiencyComponent.cs new file mode 100644 index 0000000000..616f60cd83 --- /dev/null +++ b/Content.Server/Traits/BloodDeficiencyComponent.cs @@ -0,0 +1,14 @@ +namespace Content.Server.Traits.Assorted; + +/// +/// This is used for the Blood Deficiency trait. +/// +[RegisterComponent] +public sealed partial class BloodDeficiencyComponent : Component +{ + // + // How much reagent of blood should be removed in each update interval? + // + [DataField(required: true)] + public float BloodLossAmount; +} diff --git a/Content.Server/Traits/BloodDeficiencySystem.cs b/Content.Server/Traits/BloodDeficiencySystem.cs new file mode 100644 index 0000000000..f1ae490995 --- /dev/null +++ b/Content.Server/Traits/BloodDeficiencySystem.cs @@ -0,0 +1,23 @@ +using Content.Server.Body.Systems; +using Content.Server.Body.Components; +using Content.Shared.Damage; + +namespace Content.Server.Traits.Assorted; + +public sealed class BloodDeficiencySystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnStartup); + } + + private void OnStartup(EntityUid uid, BloodDeficiencyComponent component, ComponentStartup args) + { + if (!TryComp(uid, out var bloodstream)) + return; + + bloodstream.HasBloodDeficiency = true; + bloodstream.BloodDeficiencyLossAmount = component.BloodLossAmount; + } +} diff --git a/Content.Server/Traits/HemophiliaComponent.cs b/Content.Server/Traits/HemophiliaComponent.cs new file mode 100644 index 0000000000..e8f1f57c6e --- /dev/null +++ b/Content.Server/Traits/HemophiliaComponent.cs @@ -0,0 +1,21 @@ +using Content.Shared.Damage; +namespace Content.Server.Traits.Assorted; + +/// +/// This is used for the Hemophilia trait. +/// +[RegisterComponent] +public sealed partial class HemophiliaComponent : Component +{ + // + // What the BleedReductionAmount should be multiplied by. + // + [DataField(required: true)] + public float BleedReductionModifier = 1f; + + /// + /// The damage increase from this trait. + /// + [DataField(required: true)] + public DamageModifierSet DamageModifiers = default!; +} diff --git a/Content.Server/Traits/HemophiliaSystem.cs b/Content.Server/Traits/HemophiliaSystem.cs new file mode 100644 index 0000000000..c70c7de37c --- /dev/null +++ b/Content.Server/Traits/HemophiliaSystem.cs @@ -0,0 +1,28 @@ +using Content.Server.Body.Systems; +using Content.Server.Body.Components; +using Content.Shared.Damage; + +namespace Content.Server.Traits.Assorted; + +public sealed class HemophiliaSystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnStartup); + SubscribeLocalEvent(OnDamageModify); + } + + private void OnStartup(EntityUid uid, HemophiliaComponent component, ComponentStartup args) + { + if (!TryComp(uid, out var bloodstream)) + return; + + bloodstream.BleedReductionAmount *= component.BleedReductionModifier; + } + + private void OnDamageModify(EntityUid uid, HemophiliaComponent component, DamageModifyEvent args) + { + args.Damage = DamageSpecifier.ApplyModifierSet(args.Damage, component.DamageModifiers); + } +} diff --git a/Content.Server/VendingMachines/VendingMachineSystem.cs b/Content.Server/VendingMachines/VendingMachineSystem.cs index 7c9aed188f..36fa69313e 100644 --- a/Content.Server/VendingMachines/VendingMachineSystem.cs +++ b/Content.Server/VendingMachines/VendingMachineSystem.cs @@ -49,7 +49,6 @@ public override void Initialize() SubscribeLocalEvent(OnEmagged); SubscribeLocalEvent(OnDamage); SubscribeLocalEvent(OnVendingPrice); - SubscribeLocalEvent(OnEmpPulse); SubscribeLocalEvent(OnActivatableUIOpenAttempt); @@ -496,15 +495,5 @@ private void OnPriceCalculation(EntityUid uid, VendingMachineRestockComponent co args.Price += priceSets.Max(); } - - private void OnEmpPulse(EntityUid uid, VendingMachineComponent component, ref EmpPulseEvent args) - { - if (!component.Broken && this.IsPowered(uid, EntityManager)) - { - args.Affected = true; - args.Disabled = true; - component.NextEmpEject = _timing.CurTime; - } - } } } diff --git a/Content.Shared/Access/Components/IdCardConsoleComponent.cs b/Content.Shared/Access/Components/IdCardConsoleComponent.cs index 417b77855c..c994d83d9c 100644 --- a/Content.Shared/Access/Components/IdCardConsoleComponent.cs +++ b/Content.Shared/Access/Components/IdCardConsoleComponent.cs @@ -89,6 +89,9 @@ public WriteToTargetIdMessage(string fullName, string jobTitle, List - /// The amount of pressure damage someone takes is equal to (pressure / HAZARD_HIGH_PRESSURE)*PRESSURE_DAMAGE_COEFFICIENT, + /// /// The amount of pressure damage someone takes is equal to ((pressure / HAZARD_HIGH_PRESSURE) - 1)*PRESSURE_DAMAGE_COEFFICIENT /// with the maximum of MaxHighPressureDamage. /// public const float PressureDamageCoefficient = 4; diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index 3d90512a03..70e3f27d76 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -826,8 +826,6 @@ public static readonly CVarDef CVarDef.Create("audio.admin_chat_sound_path", "/Audio/Items/pop.ogg", CVar.ARCHIVE | CVar.CLIENT | CVar.REPLICATED); public static readonly CVarDef AdminChatSoundVolume = CVarDef.Create("audio.admin_chat_sound_volume", -5f, CVar.ARCHIVE | CVar.CLIENT | CVar.REPLICATED); - public static readonly CVarDef AHelpSound = - CVarDef.Create("audio.ahelp_sound", "/Audio/Effects/adminhelp.ogg", CVar.ARCHIVE | CVar.CLIENTONLY); /* * HUD @@ -2302,6 +2300,55 @@ public static readonly CVarDef public static readonly CVarDef StationGoalsChance = CVarDef.Create("game.station_goals_chance", 1f, CVar.SERVERONLY); + + #region CPR System + /// + /// Controls whether the entire CPR system runs. When false, nobody can perform CPR. You should probably remove the trait too + /// if you are wishing to permanently disable the system on your server. + /// + public static readonly CVarDef EnableCPR = + CVarDef.Create("cpr.enable", true, CVar.REPLICATED | CVar.SERVER); + + /// + /// Toggles whether or not CPR reduces rot timers(As an abstraction of delaying brain death, the IRL actual purpose of CPR) + /// + public static readonly CVarDef CPRReducesRot = + CVarDef.Create("cpr.reduces_rot", true, CVar.REPLICATED | CVar.SERVER); + + /// + /// Toggles whether or not CPR heals airloss, included for completeness sake. I'm not going to stop you if your intention is to make CPR do nothing. + /// I guess it might be funny to troll your players with? I won't judge. + /// + public static readonly CVarDef CPRHealsAirloss = + CVarDef.Create("cpr.heals_airloss", true, CVar.REPLICATED | CVar.SERVER); + + /// + /// The chance for a patient to be resuscitated when CPR is successfully performed. + /// Setting this above 0 isn't very realistic, but people who see CPR in movies and TV will expect CPR to work this way. + /// + public static readonly CVarDef CPRResuscitationChance = + CVarDef.Create("cpr.resuscitation_chance", 0.05f, CVar.REPLICATED | CVar.SERVER); + + /// + /// By default, CPR reduces rot timers by an amount of seconds equal to the time spent performing CPR. This is an optional multiplier that can increase or decrease the amount + /// of rot reduction. Set it to 2 for if you want 3 seconds of CPR to reduce 6 seconds of rot. + /// + /// + /// If you're wondering why there isn't a CVar for setting the duration of the doafter, that's because it's not actually possible to have a timespan in cvar form + /// Curiously, it's also not possible for **shared** systems to set variable timespans. Which is where this system lives. + /// + public static readonly CVarDef CPRRotReductionMultiplier = + CVarDef.Create("cpr.rot_reduction_multiplier", 1f, CVar.REPLICATED | CVar.SERVER); + + /// + /// By default, CPR heals airloss by 1 point for every second spent performing CPR. Just like above, this directly multiplies the healing amount. + /// Set it to 2 to get 6 points of airloss healing for every 3 seconds of CPR. + /// + public static readonly CVarDef CPRAirlossReductionMultiplier = + CVarDef.Create("cpr.airloss_reduction_multiplier", 1f, CVar.REPLICATED | CVar.SERVER); + + #endregion + #region Contests System /// @@ -2352,68 +2399,19 @@ public static readonly CVarDef #endregion - #region CPR System - - // REGION: CPR System - /// - /// Controls whether the entire CPR system runs. When false, nobody can perform CPR. You should probably remove the trait too - /// if you are wishing to permanently disable the system on your server. - /// - public static readonly CVarDef EnableCPR = - CVarDef.Create("cpr.enable", true, CVar.REPLICATED | CVar.SERVER); - - /// - /// Toggles whether or not CPR reduces rot timers(As an abstraction of delaying brain death, the IRL actual purpose of CPR) - /// - public static readonly CVarDef CPRReducesRot = - CVarDef.Create("cpr.reduces_rot", true, CVar.REPLICATED | CVar.SERVER); - - /// - /// Toggles whether or not CPR heals airloss, included for completeness sake. I'm not going to stop you if your intention is to make CPR do nothing. - /// I guess it might be funny to troll your players with? I won't judge. - /// - public static readonly CVarDef CPRHealsAirloss = - CVarDef.Create("cpr.heals_airloss", true, CVar.REPLICATED | CVar.SERVER); - - /// - /// The chance for a patient to be resuscitated when CPR is successfully performed. - /// Setting this above 0 isn't very realistic, but people who see CPR in movies and TV will expect CPR to work this way. - /// - public static readonly CVarDef CPRResuscitationChance = - CVarDef.Create("cpr.resuscitation_chance", 0.01f, CVar.REPLICATED | CVar.SERVER); - - /// - /// By default, CPR reduces rot timers by an amount of seconds equal to the time spent performing CPR. This is an optional multiplier that can increase or decrease the amount - /// of rot reduction. Set it to 2 for if you want 3 seconds of CPR to reduce 6 seconds of rot. - /// - /// - /// If you're wondering why there isn't a CVar for setting the duration of the doafter, that's because it's not actually possible to have a timespan in cvar form - /// Curiously, it's also not possible for **shared** systems to set variable timespans. Which is where this system lives. - /// - public static readonly CVarDef CPRRotReductionMultiplier = - CVarDef.Create("cpr.rot_reduction_multiplier", 1f, CVar.REPLICATED | CVar.SERVER); - - /// - /// By default, CPR heals airloss by 1 point for every second spent performing CPR. Just like above, this directly multiplies the healing amount. - /// Set it to 2 to get 6 points of airloss healing for every 3 seconds of CPR. - /// - public static readonly CVarDef CPRAirlossReductionMultiplier = - CVarDef.Create("cpr.airloss_reduction_multiplier", 1f, CVar.REPLICATED | CVar.SERVER); - #endregion - #region Supermatter System /// /// With completely default supermatter values, Singuloose delamination will occur if engineers inject at least 900 moles of coolant per tile /// in the crystal chamber. For reference, a gas canister contains 1800 moles of air. This Cvar directly multiplies the amount of moles required to singuloose. /// - public static readonly CVarDef SingulooseMolesModifier = + public static readonly CVarDef SupermatterSingulooseMolesModifier = CVarDef.Create("supermatter.singuloose_moles_modifier", 1f, CVar.SERVER); /// /// Toggles whether or not Singuloose delaminations can occur. If both Singuloose and Tesloose are disabled, it will always delam into a Nuke. /// - public static readonly CVarDef DoSingulooseDelam = + public static readonly CVarDef SupermatterDoSingulooseDelam = CVarDef.Create("supermatter.do_singuloose", true, CVar.SERVER); /// @@ -2421,25 +2419,25 @@ public static readonly CVarDef /// The actual reasons for being at least this amount vary by how the core was screwed up, but traditionally it's caused by "The core is on fire". /// This Cvar multiplies said power threshold for the purpose of determining if the delam is a Tesloose. /// - public static readonly CVarDef TesloosePowerModifier = + public static readonly CVarDef SupermatterTesloosePowerModifier = CVarDef.Create("supermatter.tesloose_power_modifier", 1f, CVar.SERVER); /// /// Toggles whether or not Tesloose delaminations can occur. If both Singuloose and Tesloose are disabled, it will always delam into a Nuke. /// - public static readonly CVarDef DoTeslooseDelam = + public static readonly CVarDef SupermatterDoTeslooseDelam = CVarDef.Create("supermatter.do_tesloose", true, CVar.SERVER); /// /// When true, bypass the normal checks to determine delam type, and instead use the type chosen by supermatter.forced_delam_type /// - public static readonly CVarDef DoForceDelam = + public static readonly CVarDef SupermatterDoForceDelam = CVarDef.Create("supermatter.do_force_delam", false, CVar.SERVER); /// /// If supermatter.do_force_delam is true, this determines the delamination type, bypassing the normal checks. /// - public static readonly CVarDef ForcedDelamType = + public static readonly CVarDef SupermatterForcedDelamType = CVarDef.Create("supermatter.forced_delam_type", DelamType.Singulo, CVar.SERVER); /// diff --git a/Content.Shared/Nyanotrasen/Carrying/CarryingDoAfterEvent.cs b/Content.Shared/Carrying/CarryingDoAfterEvent.cs similarity index 91% rename from Content.Shared/Nyanotrasen/Carrying/CarryingDoAfterEvent.cs rename to Content.Shared/Carrying/CarryingDoAfterEvent.cs index 6acd6b775f..fb7225461c 100644 --- a/Content.Shared/Nyanotrasen/Carrying/CarryingDoAfterEvent.cs +++ b/Content.Shared/Carrying/CarryingDoAfterEvent.cs @@ -4,7 +4,5 @@ namespace Content.Shared.Carrying { [Serializable, NetSerializable] - public sealed partial class CarryDoAfterEvent : SimpleDoAfterEvent - { - } + public sealed partial class CarryDoAfterEvent : SimpleDoAfterEvent { } } diff --git a/Content.Shared/Nyanotrasen/Carrying/CarryingSlowdownComponent.cs b/Content.Shared/Carrying/CarryingSlowdownComponent.cs similarity index 80% rename from Content.Shared/Nyanotrasen/Carrying/CarryingSlowdownComponent.cs rename to Content.Shared/Carrying/CarryingSlowdownComponent.cs index aabde66af0..597edc2a79 100644 --- a/Content.Shared/Nyanotrasen/Carrying/CarryingSlowdownComponent.cs +++ b/Content.Shared/Carrying/CarryingSlowdownComponent.cs @@ -7,10 +7,10 @@ namespace Content.Shared.Carrying public sealed partial class CarryingSlowdownComponent : Component { - [DataField("walkModifier", required: true)] [ViewVariables(VVAccess.ReadWrite)] + [DataField(required: true)] public float WalkModifier = 1.0f; - [DataField("sprintModifier", required: true)] [ViewVariables(VVAccess.ReadWrite)] + [DataField(required: true)] public float SprintModifier = 1.0f; } diff --git a/Content.Shared/Nyanotrasen/Carrying/CarryingSlowdownSystem.cs b/Content.Shared/Carrying/CarryingSlowdownSystem.cs similarity index 85% rename from Content.Shared/Nyanotrasen/Carrying/CarryingSlowdownSystem.cs rename to Content.Shared/Carrying/CarryingSlowdownSystem.cs index 9b9c8cec10..04b714fdd7 100644 --- a/Content.Shared/Nyanotrasen/Carrying/CarryingSlowdownSystem.cs +++ b/Content.Shared/Carrying/CarryingSlowdownSystem.cs @@ -31,13 +31,12 @@ private void OnGetState(EntityUid uid, CarryingSlowdownComponent component, ref private void OnHandleState(EntityUid uid, CarryingSlowdownComponent component, ref ComponentHandleState args) { - if (args.Current is CarryingSlowdownComponentState state) - { - component.WalkModifier = state.WalkModifier; - component.SprintModifier = state.SprintModifier; + if (args.Current is not CarryingSlowdownComponentState state) + return; - _movementSpeed.RefreshMovementSpeedModifiers(uid); - } + component.WalkModifier = state.WalkModifier; + component.SprintModifier = state.SprintModifier; + _movementSpeed.RefreshMovementSpeedModifiers(uid); } private void OnRefreshMoveSpeed(EntityUid uid, CarryingSlowdownComponent component, RefreshMovementSpeedModifiersEvent args) { diff --git a/Content.Shared/Climbing/Systems/ClimbSystem.cs b/Content.Shared/Climbing/Systems/ClimbSystem.cs index 8f6e8046aa..521f5ace99 100644 --- a/Content.Shared/Climbing/Systems/ClimbSystem.cs +++ b/Content.Shared/Climbing/Systems/ClimbSystem.cs @@ -13,6 +13,7 @@ using Content.Shared.Physics; using Content.Shared.Popups; using Content.Shared.Stunnable; +using Content.Shared.Traits.Assorted.Components; using Content.Shared.Verbs; using Robust.Shared.Audio.Systems; using Robust.Shared.Physics; @@ -216,7 +217,11 @@ public bool TryClimb( if (ev.Cancelled) return false; - var args = new DoAfterArgs(EntityManager, user, comp.ClimbDelay, new ClimbDoAfterEvent(), + var climbDelay = comp.ClimbDelay; + if (user == entityToMove && TryComp(user, out var delayModifier)) + climbDelay *= delayModifier.ClimbDelayMultiplier; + + var args = new DoAfterArgs(EntityManager, user, climbDelay, new ClimbDoAfterEvent(), entityToMove, target: climbable, used: entityToMove) diff --git a/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs b/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs index 087e2eceda..b407b867f7 100644 --- a/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs +++ b/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs @@ -28,6 +28,10 @@ public abstract class ClothingSystem : EntitySystem [ValidatePrototypeId] private const string NoseTag = "HidesNose"; + [ValidatePrototypeId] + + private const string BeardTag = "HidesBeard"; + public override void Initialize() { base.Initialize(); @@ -106,7 +110,7 @@ private void ToggleVisualLayer(EntityUid equipee, HumanoidVisualLayers layer, st { if (_tagSystem.HasTag(item, tag)) { - if (tag == NoseTag) //Special check needs to be made for NoseTag, due to masks being toggleable + if (tag == NoseTag || tag == BeardTag) // Special check for NoseTag or BeardTag, due to masks being toggleable { if (TryComp(item, out MaskComponent? mask) && TryComp(item, out ClothingComponent? clothing)) { @@ -139,6 +143,8 @@ protected virtual void OnGotEquipped(EntityUid uid, ClothingComponent component, ToggleVisualLayer(args.Equipee, HumanoidVisualLayers.Hair, HairTag); if ((new string[] { "mask", "head" }).Contains(args.Slot) && _tagSystem.HasTag(args.Equipment, NoseTag)) ToggleVisualLayer(args.Equipee, HumanoidVisualLayers.Snout, NoseTag); + if ((new string[] { "mask", "head" }).Contains(args.Slot) && _tagSystem.HasTag(args.Equipment, BeardTag)) + ToggleVisualLayer(args.Equipee, HumanoidVisualLayers.FacialHair, BeardTag); } protected virtual void OnGotUnequipped(EntityUid uid, ClothingComponent component, GotUnequippedEvent args) @@ -148,6 +154,8 @@ protected virtual void OnGotUnequipped(EntityUid uid, ClothingComponent componen ToggleVisualLayer(args.Equipee, HumanoidVisualLayers.Hair, HairTag); if ((new string[] { "mask", "head" }).Contains(args.Slot) && _tagSystem.HasTag(args.Equipment, NoseTag)) ToggleVisualLayer(args.Equipee, HumanoidVisualLayers.Snout, NoseTag); + if ((new string[] { "mask", "head" }).Contains(args.Slot) && _tagSystem.HasTag(args.Equipment, BeardTag)) + ToggleVisualLayer(args.Equipee, HumanoidVisualLayers.FacialHair, BeardTag); } private void OnGetState(EntityUid uid, ClothingComponent component, ref ComponentGetState args) @@ -166,6 +174,7 @@ private void OnMaskToggled(Entity ent, ref ItemMaskToggledEve //TODO: sprites for 'pulled down' state. defaults to invisible due to no sprite with this prefix SetEquippedPrefix(ent, args.IsToggled ? args.equippedPrefix : null, ent); ToggleVisualLayer(args.Wearer, HumanoidVisualLayers.Snout, NoseTag); + ToggleVisualLayer(args.Wearer, HumanoidVisualLayers.FacialHair, BeardTag); } private void OnPickedUp(Entity ent, ref GettingPickedUpAttemptEvent args) diff --git a/Content.Shared/Damage/Events/StaminaMeleeHitEvent.cs b/Content.Shared/Damage/Events/TakeStaminaDamageEvent.cs similarity index 67% rename from Content.Shared/Damage/Events/StaminaMeleeHitEvent.cs rename to Content.Shared/Damage/Events/TakeStaminaDamageEvent.cs index c5ed0ddb60..6fca9dc2ef 100644 --- a/Content.Shared/Damage/Events/StaminaMeleeHitEvent.cs +++ b/Content.Shared/Damage/Events/TakeStaminaDamageEvent.cs @@ -1,5 +1,5 @@ using Content.Shared.Damage.Components; -using Robust.Shared.Collections; +using Content.Shared.Inventory; namespace Content.Shared.Damage.Events; @@ -7,12 +7,14 @@ namespace Content.Shared.Damage.Events; /// The components in the list are going to be hit, /// give opportunities to change the damage or other stuff. /// -public sealed class StaminaMeleeHitEvent : HandledEntityEventArgs +public sealed class TakeStaminaDamageEvent : HandledEntityEventArgs, IInventoryRelayEvent { + public SlotFlags TargetSlots { get; } = ~SlotFlags.POCKET; + /// /// List of hit stamina components. /// - public List<(EntityUid Entity, StaminaComponent Component)> HitList; + public EntityUid Target; /// /// The multiplier. Generally, try to use *= or /= instead of overwriting. @@ -24,8 +26,8 @@ public sealed class StaminaMeleeHitEvent : HandledEntityEventArgs /// public float FlatModifier = 0; - public StaminaMeleeHitEvent(List<(EntityUid Entity, StaminaComponent Component)> hitList) + public TakeStaminaDamageEvent(EntityUid target) { - HitList = hitList; + Target = target; } } diff --git a/Content.Shared/Damage/Systems/StaminaSystem.cs b/Content.Shared/Damage/Systems/StaminaSystem.cs index a92abeeefc..54a88205b2 100644 --- a/Content.Shared/Damage/Systems/StaminaSystem.cs +++ b/Content.Shared/Damage/Systems/StaminaSystem.cs @@ -166,20 +166,20 @@ private void OnMeleeHit(EntityUid uid, StaminaDamageOnHitComponent component, Me toHit.Add((ent, stam)); } - var hitEvent = new StaminaMeleeHitEvent(toHit); - RaiseLocalEvent(uid, hitEvent); + foreach (var (ent, comp) in toHit) + { + var hitEvent = new TakeStaminaDamageEvent(ent); + RaiseLocalEvent(uid, hitEvent); - if (hitEvent.Handled) - return; + if (hitEvent.Handled) + return; - var damage = component.Damage; + var damage = component.Damage; - damage *= hitEvent.Multiplier; + damage *= hitEvent.Multiplier; - damage += hitEvent.FlatModifier; + damage += hitEvent.FlatModifier; - foreach (var (ent, comp) in toHit) - { TakeStaminaDamage(ent, damage / toHit.Count, comp, source: args.User, with: args.Weapon, sound: component.Sound); } } @@ -204,12 +204,27 @@ private void OnThrowHit(EntityUid uid, StaminaDamageOnCollideComponent component private void OnCollide(EntityUid uid, StaminaDamageOnCollideComponent component, EntityUid target) { + if (!TryComp(target, out var stamComp)) + return; + var ev = new StaminaDamageOnHitAttemptEvent(); RaiseLocalEvent(uid, ref ev); if (ev.Cancelled) return; - TakeStaminaDamage(target, component.Damage, source: uid, sound: component.Sound); + var hitEvent = new TakeStaminaDamageEvent(target); + RaiseLocalEvent(target, hitEvent); + + if (hitEvent.Handled) + return; + + var damage = component.Damage; + + damage *= hitEvent.Multiplier; + + damage += hitEvent.FlatModifier; + + TakeStaminaDamage(target, damage, source: uid, sound: component.Sound); } private void SetStaminaAlert(EntityUid uid, StaminaComponent? component = null) diff --git a/Content.Shared/Humanoid/SkinColor.cs b/Content.Shared/Humanoid/SkinColor.cs index 55fab4af5b..dcc5c2d764 100644 --- a/Content.Shared/Humanoid/SkinColor.cs +++ b/Content.Shared/Humanoid/SkinColor.cs @@ -136,7 +136,7 @@ public static Color TintedHues(Color color) /// The skin color to blend with /// Blending factor (0.0 to 1.0) /// Tinted hue color - public static Color TintedHuesSkin(Color color, Color skinColor, float blendFactor = 0.5f) + public static Color TintedHuesSkin(Color color, Color skinColor, float blendFactor = 0.0f) { blendFactor = MathHelper.Clamp(blendFactor, 0.0f, 1.0f); diff --git a/Content.Shared/Inventory/InventorySystem.Relay.cs b/Content.Shared/Inventory/InventorySystem.Relay.cs index c43a588507..3308e881c5 100644 --- a/Content.Shared/Inventory/InventorySystem.Relay.cs +++ b/Content.Shared/Inventory/InventorySystem.Relay.cs @@ -1,5 +1,6 @@ using Content.Shared.Chemistry; using Content.Shared.Damage; +using Content.Shared.Damage.Events; using Content.Shared.Electrocution; using Content.Shared.Explosion; using Content.Shared.Eye.Blinding.Systems; @@ -20,6 +21,7 @@ public partial class InventorySystem public void InitializeRelay() { SubscribeLocalEvent(RelayInventoryEvent); + SubscribeLocalEvent(RelayInventoryEvent); SubscribeLocalEvent(RelayInventoryEvent); SubscribeLocalEvent(RelayInventoryEvent); SubscribeLocalEvent(RelayInventoryEvent); diff --git a/Content.Shared/Medical/PenLightComponent.cs b/Content.Shared/Medical/PenLightComponent.cs new file mode 100644 index 0000000000..50dacae3dc --- /dev/null +++ b/Content.Shared/Medical/PenLightComponent.cs @@ -0,0 +1,33 @@ +using Content.Shared.DoAfter; +using Robust.Shared.GameStates; +using Robust.Shared.Serialization; +namespace Content.Shared.Medical; + +/// +/// This for penlights; a tool used to check for eye damage. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentPause] +public sealed partial class PenLightComponent : Component +{ + /// + /// Cooldown Time, exams take a bit + /// + [AutoPausedField] + public TimeSpan? NextExamTime; + + /// + /// The min time between exams + /// + [DataField] + public TimeSpan ExamDelay = TimeSpan.FromSeconds(3); + + /// + /// How long the doafter for the exam takes + /// + [DataField(required: true)] + public float ExamSpeed { get; set; } + +} + +[Serializable, NetSerializable] +public sealed partial class PenLightDoAfterEvent : SimpleDoAfterEvent { } \ No newline at end of file diff --git a/Content.Shared/Medical/PenLightUiKey.cs b/Content.Shared/Medical/PenLightUiKey.cs new file mode 100644 index 0000000000..52fc6ce340 --- /dev/null +++ b/Content.Shared/Medical/PenLightUiKey.cs @@ -0,0 +1,9 @@ +using Robust.Shared.Serialization; + +namespace Content.Shared.Medical; + +[Serializable, NetSerializable] +public enum PenLightUiKey : byte +{ + Key +} diff --git a/Content.Shared/Medical/PenLightUserMessage.cs b/Content.Shared/Medical/PenLightUserMessage.cs new file mode 100644 index 0000000000..42502b2171 --- /dev/null +++ b/Content.Shared/Medical/PenLightUserMessage.cs @@ -0,0 +1,24 @@ +using Robust.Shared.Serialization; + +namespace Content.Shared.Medical; +[Serializable, NetSerializable] +public sealed class PenLightUserMessage : BoundUserInterfaceMessage +{ + public readonly NetEntity? TargetEntity; + public bool? Blind; + public bool? Drunk; + public bool? EyeDamage; + public bool? Healthy; + public bool? SeeingRainbows; + + public PenLightUserMessage(NetEntity? targetEntity, bool? blind, bool? drunk, bool? eyeDamage, bool? healthy, bool? seeingRainbows) + { + TargetEntity = targetEntity; + Blind = blind; + Drunk = drunk; + EyeDamage = eyeDamage; + Healthy = healthy; + SeeingRainbows = seeingRainbows; + } +} + diff --git a/Content.Shared/Movement/Systems/MovementSpeedModifierSystem.cs b/Content.Shared/Movement/Systems/MovementSpeedModifierSystem.cs index 7c793d5eb8..67a238cf60 100644 --- a/Content.Shared/Movement/Systems/MovementSpeedModifierSystem.cs +++ b/Content.Shared/Movement/Systems/MovementSpeedModifierSystem.cs @@ -1,5 +1,6 @@ using Content.Shared.Inventory; using Content.Shared.Movement.Components; +using Content.Shared.Traits.Assorted.Components; using Robust.Shared.Timing; namespace Content.Shared.Movement.Systems @@ -16,7 +17,11 @@ public void RefreshMovementSpeedModifiers(EntityUid uid, MovementSpeedModifierCo if (_timing.ApplyingState) return; - var ev = new RefreshMovementSpeedModifiersEvent(); + var isImmune = false; + if (HasComp(uid)) + isImmune = true; + + var ev = new RefreshMovementSpeedModifiersEvent(isImmune); RaiseLocalEvent(uid, ev); if (MathHelper.CloseTo(ev.WalkSpeedModifier, move.WalkSpeedModifier) && @@ -64,10 +69,24 @@ public sealed class RefreshMovementSpeedModifiersEvent : EntityEventArgs, IInven public float WalkSpeedModifier { get; private set; } = 1.0f; public float SprintSpeedModifier { get; private set; } = 1.0f; - public void ModifySpeed(float walk, float sprint) + /// + /// Whether this entity is immune to most movement speed modifiers. + /// Bypassable by setting bypassImmunity to true. + /// /// Should it shows examine message with current radiation level? /// - [ViewVariables(VVAccess.ReadWrite)] [DataField] public bool ShowExamine; /// /// Should it shows item control when equipped by player? /// - [ViewVariables(VVAccess.ReadWrite)] [DataField] public bool ShowControl; @@ -55,7 +53,7 @@ public sealed partial class GeigerComponent : Component /// /// Current radiation level in rad per second. /// - [ViewVariables(VVAccess.ReadOnly), AutoNetworkedField] + [DataField, AutoNetworkedField] public float CurrentRadiation; /// @@ -66,8 +64,6 @@ public sealed partial class GeigerComponent : Component /// /// Current player that equipped geiger counter. - /// Because sound is annoying, geiger counter clicks will play - /// only for player that equipped it. /// [ViewVariables(VVAccess.ReadOnly), AutoNetworkedField] public EntityUid? User; @@ -83,6 +79,19 @@ public sealed partial class GeigerComponent : Component /// Played only for current user. /// public EntityUid? Stream; + + /// + /// Controls whether the geiger counter plays only for the local player, or plays for everyone nearby. + /// Useful for things like hardsuits with integrated geigers. Alternatively, to create stationary radiation alarm objects. + /// + [DataField] + public bool LocalSoundOnly = false; + + /// + /// Used for all geiger counter audio controls, allowing entities to override default audio parameters. + /// + [DataField] + public AudioParams AudioParameters; } [Serializable, NetSerializable] diff --git a/Content.Shared/SegmentedEntity/SegmentedEntityComponent.cs b/Content.Shared/SegmentedEntity/SegmentedEntityComponent.cs index ee217771d4..83f2450539 100644 --- a/Content.Shared/SegmentedEntity/SegmentedEntityComponent.cs +++ b/Content.Shared/SegmentedEntity/SegmentedEntityComponent.cs @@ -4,19 +4,25 @@ * See AGPLv3.txt for details. */ +using Robust.Shared.GameStates; +using Robust.Shared.Serialization; +using Robust.Shared.Utility; + namespace Content.Shared.SegmentedEntity { /// /// Controls initialization of any Multi-segmented entity /// - [RegisterComponent] + [RegisterComponent, NetworkedComponent] + [AutoGenerateComponentState] public sealed partial class SegmentedEntityComponent : Component { /// /// A list of each UID attached to the Lamia, in order of spawn /// [DataField("segments")] - public List Segments = new(); + [AutoNetworkedField] + public List Segments = new(); /// /// A clamped variable that represents the number of segments to be spawned @@ -24,6 +30,18 @@ public sealed partial class SegmentedEntityComponent : Component [DataField("numberOfSegments")] public int NumberOfSegments = 18; + /// + /// How wide the initial segment should be. + /// + [DataField("initialRadius")] + public float InitialRadius = 0.3f; + + /// + /// Texture of the segment. + /// + [DataField("texturePath", required: true)] + public string TexturePath; + /// /// If UseTaperSystem is true, this constant represents the rate at which a segmented entity will taper towards the tip. Tapering is on a logarithmic scale, and will asymptotically approach 0. /// @@ -39,11 +57,17 @@ public sealed partial class SegmentedEntityComponent : Component /// /// Represents the segment prototype to be spawned /// - [DataField("SegmentId")] + [DataField("segmentId")] public string SegmentId = "LamiaSegment"; /// - /// Toggles the tapering system on and off. When false, segmented entities will have a constant width. + /// How much to slim each successive segment. + /// + [DataField("slimFactor")] + public float SlimFactor = 0.93f; + + /// + /// Set to 1f for constant width /// [DataField("useTaperSystem")] public bool UseTaperSystem = true; diff --git a/Content.Shared/SegmentedEntity/SegmentedEntitySegmentVisuals.cs b/Content.Shared/SegmentedEntity/SegmentedEntitySegmentVisuals.cs deleted file mode 100644 index f1e6a20211..0000000000 --- a/Content.Shared/SegmentedEntity/SegmentedEntitySegmentVisuals.cs +++ /dev/null @@ -1,18 +0,0 @@ -/* -* Delta-V - This file is licensed under AGPLv3 -* Copyright (c) 2024 Delta-V Contributors -* See AGPLv3.txt for details. -*/ - -using Robust.Shared.Serialization; - -namespace Content.Shared.SegmentedEntity -{ - [Serializable, NetSerializable] - public enum SegmentedEntitySegmentVisualLayers - { - Tail, - Armor, - ArmorRsi, - } -} diff --git a/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs b/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs index 497dd31d59..3ff7002fcf 100644 --- a/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs +++ b/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs @@ -2,7 +2,6 @@ using Content.Shared.Damage; using Content.Shared.Explosion; using Content.Shared.Humanoid; -using Content.Shared.Humanoid.Markings; using Content.Shared.Clothing.Components; using Content.Shared.Inventory.Events; using Content.Shared.Tag; @@ -14,15 +13,14 @@ using Robust.Shared.Physics.Components; using System.Numerics; using Robust.Shared.Network; +using Robust.Shared.GameStates; namespace Content.Shared.SegmentedEntity { public sealed partial class LamiaSystem : EntitySystem { [Dependency] private readonly TagSystem _tagSystem = default!; - [Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] private readonly DamageableSystem _damageableSystem = default!; - [Dependency] private readonly SharedHumanoidAppearanceSystem _humanoid = default!; [Dependency] private readonly SharedJointSystem _jointSystem = default!; [Dependency] private readonly INetManager _net = default!; @@ -49,7 +47,6 @@ public override void Initialize() SubscribeLocalEvent(OnSnekBoom); SubscribeLocalEvent(HandleDamageTransfer); SubscribeLocalEvent(HandleSegmentDamage); - SubscribeLocalEvent(OnSegmentSpawned); } public override void Update(float frameTime) { @@ -108,7 +105,7 @@ private void OnShutdown(EntityUid uid, SegmentedEntityComponent component, Compo foreach (var segment in component.Segments) { - QueueDel(segment); + QueueDel(GetEntity(segment)); } component.Segments.Clear(); @@ -141,7 +138,7 @@ public void OnStoreSnekAttempt(EntityUid uid, SegmentedEntityComponent comp, ref private void OnJointRemoved(EntityUid uid, SegmentedEntityComponent component, JointRemovedEvent args) { - if (!component.Segments.Contains(args.OtherEntity)) + if (!component.Segments.Contains(GetNetEntity(args.OtherEntity))) return; DeleteSegments(component); @@ -153,7 +150,7 @@ private void DeleteSegments(SegmentedEntityComponent component) return; //Client is not allowed to predict QueueDel, it'll throw an error(but won't crash in Release build) foreach (var segment in component.Segments) - QueueDel(segment); + QueueDel(GetEntity(segment)); component.Segments.Clear(); } @@ -182,6 +179,8 @@ private void SpawnSegments(EntityUid uid, SegmentedEntityComponent component) addTo = segment; i++; } + + Dirty(uid, component); } private EntityUid AddSegment(EntityUid segmentuid, EntityUid parentuid, SegmentedEntityComponent segmentedComponent, int segmentNumber) @@ -235,41 +234,10 @@ private EntityUid AddSegment(EntityUid segmentuid, EntityUid parentuid, Segmente EnsureComp(segment); //Not temporary, segments must never be allowed to go through portals for physics limitation reasons _segments.Enqueue((segmentComponent, parentuid)); - segmentedComponent.Segments.Add(segment); + segmentedComponent.Segments.Add(GetNetEntity(segment)); return segment; } - /// - /// Handles transferring marking selections to the tail segments. Every tail marking must be repeated 2 times in order for this script to work. - /// - /// - /// - /// - // TODO: Please for the love of god don't make me write a test to validate that every marking also has its matching segment states. - // Future contributors will just find out when their game crashes because they didn't make a marking-segment. - private void OnSegmentSpawned(EntityUid uid, SegmentedEntitySegmentComponent component, SegmentSpawnedEvent args) - { - component.Lamia = args.Lamia; - - if (!TryComp(uid, out var species)) return; - if (!TryComp(args.Lamia, out var humanoid)) return; - if (!TryComp(uid, out var appearance)) return; - var humanoidFactor = (humanoid.Height + humanoid.Width) / 2; - - _appearance.SetData(uid, ScaleVisuals.Scale, component.ScaleFactor * humanoidFactor, appearance); - - if (humanoid.MarkingSet.TryGetCategory(MarkingCategories.Tail, out var tailMarkings)) - { - foreach (var markings in tailMarkings) - { - var segmentId = species.Species; - var markingId = markings.MarkingId; - string segmentmarking = $"{markingId}-{segmentId}"; - _humanoid.AddMarking(uid, segmentmarking, markings.MarkingColors); - } - } - } - private void HandleSegmentDamage(EntityUid uid, SegmentedEntitySegmentComponent component, DamageModifyEvent args) { if (args.Origin == component.Lamia) @@ -297,13 +265,7 @@ private void OnDidEquipEvent(EntityUid equipee, SegmentedEntityComponent compone if (!TryComp(args.Equipment, out var clothing)) return; if (args.Slot == "outerClothing" && _tagSystem.HasTag(args.Equipment, LamiaHardsuitTag)) { - foreach (var uid in component.Segments) - { - if (!TryComp(uid, out var appearance)) return; - _appearance.SetData(uid, SegmentedEntitySegmentVisualLayers.Armor, true, appearance); - if (clothing.RsiPath == null) return; - _appearance.SetData(uid, SegmentedEntitySegmentVisualLayers.ArmorRsi, clothing.RsiPath, appearance); - } + // TODO: Switch segment sprite } } @@ -316,11 +278,7 @@ private void OnDidUnequipEvent(EntityUid equipee, SegmentedEntityComponent compo { if (args.Slot == "outerClothing" && _tagSystem.HasTag(args.Equipment, LamiaHardsuitTag)) { - foreach (var uid in component.Segments) - { - if (!TryComp(uid, out var appearance)) return; - _appearance.SetData(uid, SegmentedEntitySegmentVisualLayers.Armor, false, appearance); - } + // TODO: Revert to default segment sprite } } @@ -331,7 +289,7 @@ private void OnShootHitscan(EntityUid uid, SegmentedEntityComponent component, r var entityList = new List(); foreach (var entity in args.RayCastResults) { - if (!component.Segments.Contains(entity.HitEntity)) + if (!component.Segments.Contains(GetNetEntity(entity.HitEntity))) entityList.Add(entity); } args.RayCastResults = entityList; diff --git a/Content.Shared/Stunnable/StaminaDamageResistanceComponent.cs b/Content.Shared/Stunnable/StaminaDamageResistanceComponent.cs new file mode 100644 index 0000000000..dc291bbe8b --- /dev/null +++ b/Content.Shared/Stunnable/StaminaDamageResistanceComponent.cs @@ -0,0 +1,12 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Stunnable; + +[RegisterComponent, NetworkedComponent] +public sealed partial class StaminaDamageResistanceComponent : Component +{ + /// + /// 1 - no reduction, 0 - full reduction + /// + [DataField] public float Coefficient = 1; +} diff --git a/Content.Shared/Stunnable/StaminaDamageResistanceSystem.cs b/Content.Shared/Stunnable/StaminaDamageResistanceSystem.cs new file mode 100644 index 0000000000..7632eed504 --- /dev/null +++ b/Content.Shared/Stunnable/StaminaDamageResistanceSystem.cs @@ -0,0 +1,26 @@ +using Content.Shared.Damage.Events; +using Content.Shared.Examine; +using Content.Shared.Inventory; + +namespace Content.Shared.Stunnable; + +public sealed partial class StaminaDamageResistanceSystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent>(OnStaminaMeleeHit); + SubscribeLocalEvent(OnExamine); + } + + private void OnStaminaMeleeHit(Entity ent, ref InventoryRelayedEvent args) + { + args.Args.Multiplier *= ent.Comp.Coefficient; + } + private void OnExamine(Entity ent, ref ExaminedEvent args) + { + var percentage = (1 - ent.Comp.Coefficient) * 100; + args.PushMarkup(Loc.GetString("armor-examine-stamina", ("num", percentage))); + } +} diff --git a/Content.Shared/Supermatter/Components/SupermatterComponent.cs b/Content.Shared/Supermatter/Components/SupermatterComponent.cs index 9c72e72105..168c041bf7 100644 --- a/Content.Shared/Supermatter/Components/SupermatterComponent.cs +++ b/Content.Shared/Supermatter/Components/SupermatterComponent.cs @@ -19,23 +19,15 @@ public sealed partial class SupermatterComponent : Component public bool Activated = false; [DataField] - public string SupermatterSliverPrototype = "SupermatterSliver"; + public string SliverPrototype = "SupermatterSliver"; /// - /// Affects delamination timer. If removed - delamination timer is divided by 2. + /// Affects delamination timer. + /// If removed - delamination timer is divided by 2. /// [DataField] public bool SliverRemoved = false; - [DataField] - public EntityWhitelist Whitelist = new(); - - /// - /// The ID of the projectile fired by Emitter machines. - /// - [DataField] - public string IdTag = "EmitterBolt"; - public string[] LightningPrototypes = { "Lightning", @@ -51,7 +43,7 @@ public sealed partial class SupermatterComponent : Component public string TeslaSpawnPrototype = "TeslaEnergyBall"; [DataField] - public string SupermatterKudzuSpawnPrototype = "SupermatterKudzu"; + public string KudzuSpawnPrototype = "SupermatterKudzu"; /// /// What spawns in the place of an unfortunate entity that got removed by the SM. @@ -90,26 +82,27 @@ public sealed partial class SupermatterComponent : Component public float GasEfficiency = 0.15f; /// - /// Based on co2 percentage, slowly moves between 0 and 1. We use it to calc the powerloss_inhibitor + /// Based on CO2 percentage, this slowly moves between 0 and 1. + /// We use it to calculate the powerloss_inhibitor. /// [DataField] public float PowerlossDynamicScaling; /// - /// Affects the amount of damage and minimum point at which the sm takes heat damage + /// Affects the amount of damage and minimum point at which the SM takes heat damage /// [DataField] public float DynamicHeatResistance = 1; /// /// Multiplier on damage the core takes from absorbing hot gas. - /// Default is ~1/350 + /// Default is ~1/350. /// [DataField] public float MoleHeatPenalty = 0.00286f; /// - /// Inverse of MoleHeatPenalty + /// Inverse of /// [DataField] public float MoleHeatThreshold = 350f; @@ -191,21 +184,20 @@ public sealed partial class SupermatterComponent : Component #region Thresholds /// - /// The amount of heat we apply scaled + /// The heat threshold in Kelvin, after which the supermatter begins taking damage. /// [DataField] public float HeatThreshold = 2500f; /// - /// Higher == Higher percentage of inhibitor gas needed - /// before the charge inertia chain reaction effect starts. + /// Percentage of inhibitor gas needed before the charge inertia chain reaction effect starts. /// [DataField] public float PowerlossInhibitionGasThreshold = 0.20f; /// - /// Higher == More moles of the gas are needed before the charge inertia chain reaction effect starts. - /// Scales powerloss inhibition down until this amount of moles is reached + /// Moles of the gas needed before the charge inertia chain reaction effect starts. + /// Scales powerloss inhibition down until this amount of moles is reached. /// [DataField] public float PowerlossInhibitionMoleThreshold = 20f; @@ -236,7 +228,8 @@ public sealed partial class SupermatterComponent : Component public float PowerPenaltyThreshold = 4000f; /// - /// Maximum safe operational temperature in degrees Celsius. Supermatter begins taking damage above this temperature. + /// Maximum safe operational temperature in degrees Celsius. + /// Supermatter begins taking damage above this temperature. /// [DataField] public float HeatPenaltyThreshold = 40f; @@ -246,13 +239,14 @@ public sealed partial class SupermatterComponent : Component #region Damage /// - /// The amount of damage we have currently + /// The amount of damage taken /// [DataField] public float Damage = 0f; /// - /// The damage we had before this cycle. Used to limit the damage we can take each cycle, and for safe alert + /// The damage from before this cycle. + /// Used to limit the damage we can take each cycle, and for safe alert. /// [DataField] public float DamageArchived = 0f; @@ -270,28 +264,28 @@ public sealed partial class SupermatterComponent : Component public float DamageIncreaseMultiplier = 0.25f; /// - /// If spaced sm wont take more than 2 damage per cycle + /// Max space damage the SM will take per cycle /// [DataField] public float MaxSpaceExposureDamage = 2; /// - /// The point at which we should start sending messeges about the damage. + /// The point at which we should start sending radio messages about the damage. /// [DataField] - public float WarningPoint = 50; + public float DamageWarningThreshold = 50; /// - /// The point at which we start sending announcements. + /// The point at which we start sending station announcements about the damage. /// [DataField] - public float EmergencyPoint = 500; + public float DamageEmergencyThreshold = 500; /// - /// The point at which we begin delaminating. + /// The point at which the SM begins delaminating. /// [DataField] - public int DelaminationPoint = 900; + public int DamageDelaminationPoint = 900; [DataField] public bool Delamming = false; @@ -317,37 +311,37 @@ public sealed partial class SupermatterComponent : Component #region Gases /// - /// Is used to store gas + /// How much gas is in the SM /// [DataField] public Dictionary GasStorage = new Dictionary() { - {Gas.Oxygen, 0f}, - {Gas.Nitrogen, 0f}, - {Gas.CarbonDioxide, 0f}, - {Gas.Plasma, 0f}, - {Gas.Tritium, 0f}, - {Gas.WaterVapor, 0f}, - {Gas.Frezon, 0f}, - {Gas.Ammonia, 0f}, - {Gas.NitrousOxide, 0f}, + { Gas.Oxygen, 0f }, + { Gas.Nitrogen, 0f }, + { Gas.CarbonDioxide, 0f }, + { Gas.Plasma, 0f }, + { Gas.Tritium, 0f }, + { Gas.WaterVapor, 0f }, + { Gas.Frezon, 0f }, + { Gas.Ammonia, 0f }, + { Gas.NitrousOxide, 0f }, }; /// - /// Stores each gas facts + /// Stores information about how every gas interacts with the SM /// - // todo: replace this with serializable GasFact array something + //TODO: Replace this with serializable GasFact array something public readonly Dictionary GasDataFields = new() { - [Gas.Oxygen] = (TransmitModifier: 1.5f, HeatPenalty: 1f, PowerMixRatio: 1f), - [Gas.Nitrogen] = (TransmitModifier: 0f, HeatPenalty: -1.5f, PowerMixRatio: -1f), - [Gas.CarbonDioxide] = (TransmitModifier: 0f, HeatPenalty: 0.1f, PowerMixRatio: 1f), - [Gas.Plasma] = (TransmitModifier: 4f, HeatPenalty: 15f, PowerMixRatio: 1f), - [Gas.Tritium] = (TransmitModifier: 30f, HeatPenalty: 10f, PowerMixRatio: 1f), - [Gas.WaterVapor] = (TransmitModifier: 2f, HeatPenalty: 12f, PowerMixRatio: 1f), - [Gas.Frezon] = (TransmitModifier: 3f, HeatPenalty: -10f, PowerMixRatio: -1f), - [Gas.Ammonia] = (TransmitModifier: 0f, HeatPenalty: .5f, PowerMixRatio: 1f), - [Gas.NitrousOxide] = (TransmitModifier: 0f, HeatPenalty: -5f, PowerMixRatio: -1f), + { Gas.Oxygen, (1.5f, 1f, 1f) }, + { Gas.Nitrogen, (0f, -1.5f, -1f) }, + { Gas.CarbonDioxide, (0f, 0.1f, 1f) }, + { Gas.Plasma, (4f, 15f, 1f) }, + { Gas.Tritium, (30f, 10f, 1f) }, + { Gas.WaterVapor, (2f, 12f, 1f) }, + { Gas.Frezon, (3f, -10f, -1f) }, + { Gas.Ammonia, (0f, .5f, 1f) }, + { Gas.NitrousOxide, (0f, -5f, -1f) }, }; #endregion @@ -359,7 +353,7 @@ public enum SupermatterSound : sbyte Delam = 1 } -public enum DelamType : sbyte +public enum DelamType : int { Explosion = 0, Singulo = 1, diff --git a/Content.Shared/Traits/Assorted/Components/ClimbDelayModifierComponent.cs b/Content.Shared/Traits/Assorted/Components/ClimbDelayModifierComponent.cs new file mode 100644 index 0000000000..c04657a487 --- /dev/null +++ b/Content.Shared/Traits/Assorted/Components/ClimbDelayModifierComponent.cs @@ -0,0 +1,16 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Traits.Assorted.Components; + +/// +/// This is used for any trait that modifies climbing speed. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class ClimbDelayModifierComponent : Component +{ + /// + /// What to multiply the climbing delay by. + /// + [DataField, AutoNetworkedField] + public float ClimbDelayMultiplier = 1f; +} diff --git a/Content.Shared/Traits/Assorted/Components/FootstepVolumeModifierComponent.cs b/Content.Shared/Traits/Assorted/Components/FootstepVolumeModifierComponent.cs new file mode 100644 index 0000000000..8c7e763692 --- /dev/null +++ b/Content.Shared/Traits/Assorted/Components/FootstepVolumeModifierComponent.cs @@ -0,0 +1,22 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Traits.Assorted.Components; + +/// +/// This is used for any trait that modifies footstep volumes. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class FootstepVolumeModifierComponent : Component +{ + /// + /// What to add to the volume of sprinting, in terms of decibels. + /// + [DataField, AutoNetworkedField] + public float SprintVolumeModifier; + + /// + /// What to add to the volume of walking, in terms of decibels. + /// + [DataField, AutoNetworkedField] + public float WalkVolumeModifier; +} diff --git a/Content.Shared/Traits/Assorted/Components/SpeedModifierImmunityComponent.cs b/Content.Shared/Traits/Assorted/Components/SpeedModifierImmunityComponent.cs new file mode 100644 index 0000000000..e9bec98fd8 --- /dev/null +++ b/Content.Shared/Traits/Assorted/Components/SpeedModifierImmunityComponent.cs @@ -0,0 +1,12 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Traits.Assorted.Components; + +/// +/// This is used to make an entity's movement speed constant and +/// never affected by almost all movement speed modifiers. +/// +[RegisterComponent, NetworkedComponent] +public sealed partial class SpeedModifierImmunityComponent : Component +{ +} diff --git a/Content.Shared/Traits/Assorted/Components/StaminaCritModifierComponent.cs b/Content.Shared/Traits/Assorted/Components/StaminaCritModifierComponent.cs new file mode 100644 index 0000000000..28c8ab9b08 --- /dev/null +++ b/Content.Shared/Traits/Assorted/Components/StaminaCritModifierComponent.cs @@ -0,0 +1,16 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Traits.Assorted.Components; + +/// +/// This is used for any trait that modifies stamina CritThreshold +/// +[RegisterComponent, NetworkedComponent] +public sealed partial class StaminaCritModifierComponent : Component +{ + /// + /// The amount that an entity's stamina critical threshold will be incremented by. + /// + [DataField] + public int CritThresholdModifier { get; private set; } = 0; +} diff --git a/Content.Shared/Traits/Assorted/Components/TraitSpeedModifierComponent.cs b/Content.Shared/Traits/Assorted/Components/TraitSpeedModifierComponent.cs new file mode 100644 index 0000000000..85dc52a21f --- /dev/null +++ b/Content.Shared/Traits/Assorted/Components/TraitSpeedModifierComponent.cs @@ -0,0 +1,16 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Traits.Assorted.Components; + +/// +/// This component is used for traits that modify movement speed. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class TraitSpeedModifierComponent : Component +{ + [DataField, AutoNetworkedField] + public float WalkModifier = 1.0f; + + [DataField, AutoNetworkedField] + public float SprintModifier = 1.0f; +} diff --git a/Content.Shared/Traits/Assorted/Systems/TraitSpeedModifierSystem.cs b/Content.Shared/Traits/Assorted/Systems/TraitSpeedModifierSystem.cs new file mode 100644 index 0000000000..9817ebc156 --- /dev/null +++ b/Content.Shared/Traits/Assorted/Systems/TraitSpeedModifierSystem.cs @@ -0,0 +1,31 @@ +using Content.Shared.Movement.Components; +using Content.Shared.Movement.Systems; +using Content.Shared.Traits.Assorted.Components; + +namespace Content.Shared.Traits.Assorted.Systems; + +public sealed class TraitSpeedModifierSystem : EntitySystem +{ + [Dependency] private readonly MovementSpeedModifierSystem _movement = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnStartup); + SubscribeLocalEvent(OnRefreshMovementSpeed); + } + + private void OnRefreshMovementSpeed(EntityUid uid, TraitSpeedModifierComponent component, RefreshMovementSpeedModifiersEvent args) + { + args.ModifySpeed(component.WalkModifier, component.SprintModifier, bypassImmunity: true); + } + + private void OnStartup(EntityUid uid, TraitSpeedModifierComponent component, ComponentStartup args) + { + if (!TryComp(uid, out var move)) + return; + + _movement.RefreshMovementSpeedModifiers(uid, move); + } +} diff --git a/Content.Shared/Traits/Assorted/Systems/TraitStatModifierSystem.cs b/Content.Shared/Traits/Assorted/Systems/TraitStatModifierSystem.cs index fa7cc7fce0..85ecf151dd 100644 --- a/Content.Shared/Traits/Assorted/Systems/TraitStatModifierSystem.cs +++ b/Content.Shared/Traits/Assorted/Systems/TraitStatModifierSystem.cs @@ -3,6 +3,7 @@ using Content.Shared.Mobs.Systems; using Content.Shared.Traits.Assorted.Components; using Content.Shared.Weapons.Melee.Events; +using Content.Shared.Damage.Components; namespace Content.Shared.Traits.Assorted.Systems; @@ -15,6 +16,7 @@ public override void Initialize() base.Initialize(); SubscribeLocalEvent(OnCritStartup); SubscribeLocalEvent(OnDeadStartup); + SubscribeLocalEvent(OnStaminaCritStartup); SubscribeLocalEvent(OnAdrenalineGetDamage); SubscribeLocalEvent(OnPainToleranceGetDamage); } @@ -39,6 +41,14 @@ private void OnDeadStartup(EntityUid uid, DeadModifierComponent component, Compo _threshold.SetMobStateThreshold(uid, deadThreshold + component.DeadThresholdModifier, Mobs.MobState.Dead); } + private void OnStaminaCritStartup(EntityUid uid, StaminaCritModifierComponent component, ComponentStartup args) + { + if (!TryComp(uid, out var stamina)) + return; + + stamina.CritThreshold += component.CritThresholdModifier; + } + private void OnAdrenalineGetDamage(EntityUid uid, AdrenalineComponent component, ref GetMeleeDamageEvent args) { var modifier = _contests.HealthContest(uid, component.BypassClamp, component.RangeModifier); @@ -50,4 +60,4 @@ private void OnPainToleranceGetDamage(EntityUid uid, PainToleranceComponent comp var modifier = _contests.StaminaContest(uid, component.BypassClamp, component.RangeModifier); args.Damage *= component.Inverse ? 1 / modifier : modifier; } -} \ No newline at end of file +} diff --git a/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs b/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs index d30e27e98c..2708a07c6e 100644 --- a/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs +++ b/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs @@ -133,7 +133,6 @@ public sealed partial class MeleeWeaponComponent : Component [DataField, AutoNetworkedField] public int MaxTargets = 5; - // Sounds /// diff --git a/Resources/Audio/Admin/ahelp_error.ogg b/Resources/Audio/Admin/ahelp_error.ogg new file mode 100755 index 0000000000..bcdb326790 Binary files /dev/null and b/Resources/Audio/Admin/ahelp_error.ogg differ diff --git a/Resources/Audio/Admin/ahelp_receive.ogg b/Resources/Audio/Admin/ahelp_receive.ogg new file mode 100755 index 0000000000..eb31b3a8ab Binary files /dev/null and b/Resources/Audio/Admin/ahelp_receive.ogg differ diff --git a/Resources/Audio/Admin/ahelp_send.ogg b/Resources/Audio/Admin/ahelp_send.ogg new file mode 100755 index 0000000000..427605cfb8 Binary files /dev/null and b/Resources/Audio/Admin/ahelp_send.ogg differ diff --git a/Resources/Audio/Admin/attributions.yml b/Resources/Audio/Admin/attributions.yml new file mode 100644 index 0000000000..8df7e38c57 --- /dev/null +++ b/Resources/Audio/Admin/attributions.yml @@ -0,0 +1,9 @@ +- files: [ "ahelp_error" ] + license: "CC-BY-NC-SA-3.0" + copyright: "CM-SS13" + source: "https://github.com/cmss13-devs/cmss13/commit/497204fb1660977fb6bf1fe8de153c65c8299d7d" + +- files: [ "ahelp_receive", "ahelp_send" ] + license: "CC-BY-NC-SA-3.0" + copyright: "CM-SS13" + source: "https://github.com/cmss13-devs/cmss13/commit/21e6447cc08aea502f671c819fdbcecbb85e6028" diff --git a/Resources/Audio/DeltaV/Items/gavel.ogg b/Resources/Audio/DeltaV/Items/gavel.ogg new file mode 100644 index 0000000000..c6061cbb3d Binary files /dev/null and b/Resources/Audio/DeltaV/Items/gavel.ogg differ diff --git a/Resources/Audio/Effects/adminhelp.ogg b/Resources/Audio/Effects/adminhelp.ogg deleted file mode 100644 index 704c0fd6d2..0000000000 Binary files a/Resources/Audio/Effects/adminhelp.ogg and /dev/null differ diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 6450dd4211..9fa7017cc1 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4799,3 +4799,416 @@ Entries: message: Vulpkanins can wag their tails now id: 6201 time: '2024-08-01T23:06:24.0000000+00:00' +- author: angelofallars + changes: + - type: Add + message: >- + Added the combat knife to the SecTech, and the ability to manufacture + combat knives in the SecLathe and emagged autolathes. + - type: Add + message: >- + Added a 1-point combat knife to Loadouts for Felinid/Harpy security + jobs. + - type: Tweak + message: Made the security belt and security webbing able to hold combat knives. + - type: Tweak + message: 'Prison Guards now start with combat boots with a combat knife. ' + id: 6202 + time: '2024-08-02T07:08:07.0000000+00:00' +- author: rosieposieeee + changes: + - type: Add + message: >- + Added breaching charges to the SecTech vendor for Security, to break + through walls. + id: 6203 + time: '2024-08-02T07:09:44.0000000+00:00' +- author: DEATHB4DEFEAT + changes: + - type: Tweak + message: >- + The AdminHelp sound has changed to three that play under different + circumstances + id: 6204 + time: '2024-08-02T07:14:01.0000000+00:00' +- author: Mnemotechnician + changes: + - type: Fix + message: >- + Reverted the station event scheduler rework due to it absolutely + breaking the game. + id: 6205 + time: '2024-08-02T22:52:41.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: 'Supermatter Engines have been implemented. ' + id: 6206 + time: '2024-08-03T00:41:54.0000000+00:00' +- author: Tilkku + changes: + - type: Tweak + message: Rouny Sprite Changed + id: 6207 + time: '2024-08-03T11:04:01.0000000+00:00' +- author: VMSolidus + changes: + - type: Tweak + message: >- + Due to budget cuts, Nanotrasen has ceased stocking Clothesmate vendors + with more clothing than the average cargo tech can afford. Civilians are + advised to bring their own clothes to the station if they wish to wear + anything other than grey. + id: 6208 + time: '2024-08-04T00:23:53.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: >- + SweatMAX, "hot foods", Mars Mart, and Nippon-tan vendors have all been + added to vendor spawners. + id: 6209 + time: '2024-08-04T06:26:34.0000000+00:00' +- author: Skubman + changes: + - type: Add + message: >- + Add the Voracious trait, a 1-point trait that makes you eat and drink + twice as fast. + id: 6210 + time: '2024-08-04T09:30:31.0000000+00:00' +- author: VMSolidus + changes: + - type: Fix + message: >- + Zombie events have had their Anti-Stalling mechanic improved. Dead + (Player) Zombies, Infected Players, and Initial Infected are all counted + as zombies for the purpose of determine if the shuttle should be called. + Additionally, any player who leaves the station is no longer counted as + a healthy crewman for the automatic shuttle call. + id: 6211 + time: '2024-08-04T14:14:12.0000000+00:00' +- author: Skubman + changes: + - type: Tweak + message: Rename the trait "Heavyweight Drunk" into "Alcohol Tolerance". + id: 6212 + time: '2024-08-05T03:30:41.0000000+00:00' +- author: Skubman + changes: + - type: Add + message: >- + Add the Light Step trait, a 1-point trait that makes your footsteps + quieter. + id: 6213 + time: '2024-08-05T15:29:07.0000000+00:00' +- author: Skubman + changes: + - type: Add + message: >- + Add a new 1-point trait called Sign Language, a trait that allows you to + communicate in Galactic Sign Language. + id: 6214 + time: '2024-08-05T16:55:31.0000000+00:00' +- author: Mnemotechnician + changes: + - type: Tweak + message: >- + Oracle requests are now more likely to be aligned with the current + research. + id: 6215 + time: '2024-08-05T17:10:42.0000000+00:00' +- author: VMSolidus + changes: + - type: Tweak + message: >- + The Carrying system has been reworked as a means of better supporting + having extremely large species and characters. 10kg Harpies should no + longer be oppressed by 2000kg Lamia with infinitely short carry + attempts. + id: 6216 + time: '2024-08-05T17:11:37.0000000+00:00' +- author: Rane + changes: + - type: Add + message: Lamiae should now be rendered much better. + id: 6217 + time: '2024-08-05T17:15:51.0000000+00:00' +- author: gluesniffler + changes: + - type: Add + message: Added an unlockable PKA and Jetpack module to Salvage Cyborgs + id: 6218 + time: '2024-08-06T01:14:31.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: Arachne have been reimplemented! + - type: Add + message: Oneirophages are back! + id: 6219 + time: '2024-08-06T04:52:32.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: >- + CPR has been added to the game. People with CPR training can now perform + CPR on anyone who is in either crit or dead states. + - type: Add + message: >- + CPR Training has been added to the game as a new positive trait. All + medical staff start with this trait for free. + id: 6220 + time: '2024-08-06T05:28:54.0000000+00:00' +- author: Skubman + changes: + - type: Add + message: >- + Add the Self-Aware trait, a 2-point trait that allows you to examine + your Brute/Burn damage numbers like a health analyzer, and estimate your + toxin/airloss damage. + id: 6221 + time: '2024-08-06T08:05:59.0000000+00:00' +- author: TJohnson + changes: + - type: Tweak + message: >- + Removed overlay restriction for vulps, you can now have as many overlay + markings as you want! + id: 6222 + time: '2024-08-06T19:05:46.0000000+00:00' +- author: whateverusername0 + changes: + - type: Add + message: Added different stamina damage resistance to hardsuits. + id: 6223 + time: '2024-08-06T19:08:48.0000000+00:00' +- author: Skubman + changes: + - type: Add + message: >- + Add the Blood Deficiency trait, a new negative trait that makes you + slowly lose blood over time. You must routinely receive blood loss + treatment to live, and even normally non-lethal bleeding can make you + start dying slowly. + id: 6224 + time: '2024-08-06T19:12:34.0000000+00:00' +- author: Skubman + changes: + - type: Add + message: >- + Add three new 1-point traits for Onis that allow you to specialize in + Slash or Piercing damage or be a melee weapons generalist. + id: 6225 + time: '2024-08-06T19:50:20.0000000+00:00' +- author: Skubman + changes: + - type: Add + message: >- + Add Parkour Training, a 3-point trait that makes you faster with + climbing tables and crawling. + id: 6226 + time: '2024-08-06T20:37:00.0000000+00:00' +- author: WarMechanic + changes: + - type: Tweak + message: >- + EMP Grenades can now disable basically any electrical device, and stack + in disable duration. + id: 6227 + time: '2024-08-06T20:47:49.0000000+00:00' +- author: Mnemotechnician + changes: + - type: Add + message: >- + Admin tooling: added several admin commands to help manipulate entities' + languages. + id: 6228 + time: '2024-08-06T21:22:11.0000000+00:00' +- author: Tilkku + changes: + - type: Add + message: Added Pen Lights + - type: Add + message: Eye Examination + id: 6229 + time: '2024-08-06T21:51:21.0000000+00:00' +- author: WarMechanic + changes: + - type: Add + message: >- + Gloves now have unique fingerprints. Items can be traced back to gloves, + which can then be traced back to people. + id: 6230 + time: '2024-08-06T22:03:36.0000000+00:00' +- author: Skubman + changes: + - type: Fix + message: Passive blood regeneration now works again. + id: 6231 + time: '2024-08-07T06:07:35.0000000+00:00' +- author: Fansana + changes: + - type: Fix + message: Barotrauma admin log spam + id: 6232 + time: '2024-08-07T17:31:55.0000000+00:00' +- author: Mnemotechnician + changes: + - type: Add + message: Mr. Butlertron can now suffer for its crimes. + id: 6233 + time: '2024-08-07T22:38:04.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: >- + The following new markings have been added for Harpies: Bat Wings, + Simple Bionic Wings, Haven Tail, Swallow tail, and Long Forked Tail + id: 6234 + time: '2024-08-07T23:11:41.0000000+00:00' +- author: DangerRevolution + changes: + - type: Add + message: Readded Psionic Relay Orb + id: 6235 + time: '2024-08-07T23:16:30.0000000+00:00' +- author: Skubman + changes: + - type: Add + message: >- + Add two new negative traits: Sluggish (+1) and Snail-Paced (+2) that + make you move slower, and climb tables slower. + id: 6236 + time: '2024-08-07T23:38:33.0000000+00:00' +- author: Skubman + changes: + - type: Add + message: >- + Add the Hemophilia trait, a new negative trait for 1 point that makes + you bleed twice as long and makes you take 10% more Blunt damage. + id: 6237 + time: '2024-08-07T23:39:52.0000000+00:00' +- author: SleepyScarecrow + changes: + - type: Fix + message: Fixed the RegenMesh recipe + id: 6238 + time: '2024-08-07T23:51:29.0000000+00:00' +- author: dootythefrooty + changes: + - type: Add + message: >- + Added Bluespace Slips, a plant trait that teleports you randomly if you + slip. + id: 6239 + time: '2024-08-07T23:54:13.0000000+00:00' +- author: BlueHNT + changes: + - type: Tweak + message: >- + Tweaked the formatting for WelderRefinable refineResult to use + EntitySpawnEntry format + id: 6240 + time: '2024-08-08T00:16:02.0000000+00:00' +- author: VMSolidus + changes: + - type: Fix + message: Moths can now once again be colorful. + id: 6241 + time: '2024-08-08T00:18:08.0000000+00:00' +- author: ShatteredSwords + changes: + - type: Tweak + message: Skeleton ghost role description has been adjusted to be less evil. + id: 6242 + time: '2024-08-09T10:52:49.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: >- + Geiger Counters other than ones installed in Hardsuits now generate an + audible sound when active and exposed to radiation. + - type: Add + message: Wall mounted geiger counters have been added to the game. + id: 6243 + time: '2024-08-09T11:13:13.0000000+00:00' +- author: Skubman + changes: + - type: Add + message: >- + Dionas have been given a 25% slower movement speed. In exchange for + that, they gain absolute slip immunity and movement speed modifier + immunity. This makes them immune to slowdown from things like + duffelbags, hardsuits, and spider webs. + - type: Fix + message: >- + Sluggish and Snail-Paced will now properly apply their movement + penalties upon joining. + id: 6244 + time: '2024-08-09T17:28:01.0000000+00:00' +- author: ODJ + changes: + - type: Tweak + message: >- + Melee Weapons now feel different across the board, from the Wrench to + the Chainsaw, try out their normal swings and their heavy attacks! + id: 6245 + time: '2024-08-10T12:00:06.0000000+00:00' +- author: Rane + changes: + - type: Tweak + message: >- + Renamed "Psionic Mantis" to "Mantis", as it was originally going to be + called. + id: 6246 + time: '2024-08-10T12:03:12.0000000+00:00' +- author: Skubman + changes: + - type: Add + message: >- + Add Liquor Lifeline (-3 points), a new positive trait that makes you + slowly heal Brute and Burn damage when drunk, healing more the drunker + you are. The trait also gives you the benefits of Alcohol Tolerance. + - type: Tweak + message: >- + The cost of the Alcohol Tolerance trait has been reduced from -2 points + to -1 point. + - type: Add + message: Dwarves receive the Liquor Lifeline trait for free. + id: 6247 + time: '2024-08-10T20:59:22.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: >- + Being injured now lets you deal up to 20% more damage in melee combat to + simulate the adrenaline rush from taking a hit. + - type: Add + message: >- + Taking stamina damage now makes you deal less damage in melee. Up to 25% + less for Light Attacks, and 50% less for Power Attacks + - type: Add + message: >- + Wide Swing has been reworked as "Power Attack". Power attacks cost 20 + stamina(by default) to perform, and their effects can differ from Light + attacks on a per-weapon basis. Individual weapons can also have + different stamina costs to power attack with. + id: 6248 + time: '2024-08-10T21:30:42.0000000+00:00' +- author: Rane + changes: + - type: Remove + message: >- + Removed the spammable hugging on click. Consider using emotes for this + instead. + id: 6249 + time: '2024-08-10T21:34:22.0000000+00:00' +- author: VMSolidus and Skubman + changes: + - type: Add + message: >- + 11 new Physical Traits have been added to the game! 6 positive traits, + and 5 negative traits. + id: 6250 + time: '2024-08-10T21:36:09.0000000+00:00' diff --git a/Resources/Credits/GitHub.txt b/Resources/Credits/GitHub.txt index e6c7690ad3..6e47a71e43 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, beck-thompson, BGare, BingoJohnson-zz, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, Boaz1111, BobdaBiscuit, brainfood1183, BramvanZijp, Brandon-Huu, Bribrooo, Bright0, brndd, BubblegumBlue, BYONDFuckery, c4llv07e, CaasGit, CakeQ, CaptainSqrBeard, Carbonhell, Carolyn3114, CatTheSystem, Centronias, chairbender, Charlese2, Cheackraze, cheesePizza2, Chief-Engineer, chromiumboy, Chronophylos, clement-or, Clyybber, CodedCrow, ColdAutumnRain, Colin-Tel, collinlunn, ComicIronic, coolmankid12345, corentt, crazybrain23, creadth, CrigCrag, Crotalus, CrudeWax, CrzyPotato, Cyberboss, d34d10cc, Daemon, daerSeebaer, dahnte, dakamakat, dakimasu, DamianX, DangerRevolution, daniel-cr, Darkenson, DawBla, dch-GH, Deahaka, DEATHB4DEFEAT, DeathCamel58, deathride58, DebugOk, Decappi, Deeeeja, deepdarkdepths, Delete69, deltanedas, DeltaV-Bot, DerbyX, DoctorBeard, DogZeroX, dontbetank, 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, Froffy025, Fromoriss, FungiFellow, GalacticChimp, gbasood, Geekyhobo, Genkail, geraeumig, Ghagliiarghii, Git-Nivrak, github-actions[bot], gituhabu, GNF54, Golinth, GoodWheatley, graevy, GreyMario, Guess-My-Name, gusxyz, h3half, Hanzdegloker, Hardly3D, harikattar, Hebiman, Henry12116, HerCoyote23, Hmeister-real, HoofedEar, hord-brayden, hubismal, Hugal31, Huxellberger, Hyenh, iacore, IamVelcroboy, icekot8, igorsaux, ike709, Illiux, Ilya246, IlyaElDunaev, Injazz, Insineer, IntegerTempest, Interrobang01, IProduceWidgets, ItsMeThom, Jackal298, Jackrost, jamessimo, janekvap, JerryImMouse, Jessetriesagain, jessicamaybe, Jezithyr, jicksaw, JiimBob, JoeHammad1844, JohnGinnane, johnku1, joshepvodka, jproads, Jrpl, juliangiebel, JustArt1m, JustCone14, JustinTrotter, KaiShibaa, kalane15, kalanosh, Kelrak, kerisargit, keronshb, KIBORG04, Killerqu00, KingFroozy, kira-er, Kit0vras, KittenColony, Ko4ergaPunk, komunre, koteq, Krunklehorn, kxvvv, Lamrr, LankLTE, lapatison, Leander-0, leonardo-dabepis, LetterN, Level10Cybermancer, lever1209, liltenhead, LittleBuilderJane, Lomcastar, LordCarve, LordEclipse, LovelyLophi, Lukasz825700516, lunarcomets, luringens, lvvova1, lzimann, lzk228, MACMAN2003, Macoron, MagnusCrowe, ManelNavola, Matz05, MehimoNemo, MeltedPixel, MemeProof, Menshin, Mervill, metalgearsloth, mhamsterr, MilenVolf, Minty642, Mirino97, mirrorcult, misandrie, MishaUnity, MisterMecky, Mith-randalf, Mnemotechnician, Moneyl, Moomoobeef, moony, Morb0, Mr0maks, musicmanvr, Myakot, Myctai, N3X15, Nairodian, Naive817, namespace-Memory, NickPowers43, nikthechampiongr, Nimfar11, Nirnael, nmajask, nok-ko, notafet, notquitehadouken, noudoit, noverd, nuke-haus, NULL882, OCOtheOmega, OctoRocket, OldDanceJacket, onoira, osjarw, Owai-Seek, pali6, Pangogie, patrikturi, PaulRitter, Peptide90, peptron1, Phantom-Lily, PHCodes, PixelTheKermit, PJB3005, Plykiya, pofitlo, pointer-to-null, PolterTzi, PoorMansDreams, potato1234x, ProfanedBane, PrPleGoo, ps3moira, Pspritechologist, Psychpsyo, psykzz, PuroSlavKing, quatre, QuietlyWhisper, qwerltaz, Radosvik, Radrark, Rainbeon, Rainfey, Rane, ravage123321, rbertoche, Redict, RedlineTriad, RednoWCirabrab, RemberBM, RemieRichards, RemTim, rene-descartes2021, RiceMar1244, RieBi, Rinkashikachi, Rockdtben, rolfero, rosieposieeee, Saakra, Samsterious, SaphireLattice, ScalyChimp, scrato, Scribbles0, Serkket, SethLafuente, ShadowCommander, Shadowtheprotogen546, SignalWalker, SimpleStation14, Simyon264, Sirionaut, siyengar04, Skarletto, Skrauz, Skyedra, SlamBamActionman, slarticodefast, Slava0135, Snowni, snowsignal, SonicHDC, SoulSloth, SpaceManiac, SpeltIncorrectyl, spoogemonster, ssdaniel24, Stealthbomber16, stellar-novas, StrawberryMoses, superjj18, SweptWasTaken, Szunti, TadJohnson00, takemysoult, TaralGit, Tayrtahn, tday93, TekuNut, TemporalOroboros, tentekal, tgrkzus, thatrandomcanadianguy, TheArturZh, theashtronaut, thedraccx, themias, Theomund, theOperand, TheShuEd, TimrodDX, Titian3, tkdrg, tmtmtl30, TokenStyle, tom-leys, tomasalves8, Tomeno, Tornado-Technology, tosatur, Tryded, TsjipTsjip, Tunguso4ka, TurboTrackerss14, Tyler-IN, Tyzemol, UbaserB, UKNOWH, UnicornOnLSD, Uriende, UristMcDorf, Vaaankas, Varen, VasilisThePikachu, veliebm, Veritius, Vermidia, Verslebas, VigersRay, Visne, VMSolidus, volundr-, Voomra, Vordenburg, vulppine, wafehling, WarMechanic, waylon531, weaversam8, Willhelm53, wixoaGit, WlarusFromDaSpace, wrexbe, xRiriq, yathxyz, Ygg01, YotaXP, YuriyKiss, zach-hill, Zandario, Zap527, Zealith-Gamer, 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, angelofallars, ArchPigeon, Arendian, arimah, Arteben, AruMoon, as334, AsikKEsel, asperger-sind, aspiringLich, avghdev, AzzyIsNotHere, BananaFlambe, BasedUser, beck-thompson, BGare, BingoJohnson-zz, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, Boaz1111, BobdaBiscuit, brainfood1183, BramvanZijp, Brandon-Huu, Bribrooo, Bright0, brndd, BubblegumBlue, BYONDFuckery, c4llv07e, CaasGit, CakeQ, CaptainSqrBeard, Carbonhell, Carolyn3114, CatTheSystem, Centronias, chairbender, Charlese2, Cheackraze, cheesePizza2, Chief-Engineer, chromiumboy, Chronophylos, clement-or, Clyybber, CodedCrow, ColdAutumnRain, Colin-Tel, collinlunn, ComicIronic, coolmankid12345, corentt, crazybrain23, creadth, CrigCrag, Crotalus, CrudeWax, CrzyPotato, Cyberboss, d34d10cc, Daemon, daerSeebaer, dahnte, dakamakat, dakimasu, DamianX, DangerRevolution, daniel-cr, Darkenson, DawBla, dch-GH, Deahaka, DEATHB4DEFEAT, DeathCamel58, deathride58, DebugOk, Decappi, Deeeeja, deepdarkdepths, Delete69, deltanedas, DeltaV-Bot, DerbyX, DoctorBeard, DogZeroX, dontbetank, 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, Froffy025, Fromoriss, FungiFellow, GalacticChimp, gbasood, Geekyhobo, Genkail, geraeumig, Ghagliiarghii, Git-Nivrak, github-actions[bot], gituhabu, GNF54, Golinth, GoodWheatley, graevy, GreyMario, Guess-My-Name, gusxyz, h3half, Hanzdegloker, Hardly3D, harikattar, Hebiman, Henry12116, HerCoyote23, Hmeister-real, HoofedEar, Hoolny, hord-brayden, hubismal, Hugal31, Huxellberger, Hyenh, iacore, IamVelcroboy, icekot8, igorsaux, ike709, Illiux, Ilya246, IlyaElDunaev, Injazz, Insineer, Interrobang01, IProduceWidgets, ItsMeThom, Jackal298, Jackrost, jamessimo, janekvap, JerryImMouse, Jessetriesagain, jessicamaybe, Jezithyr, jicksaw, JiimBob, JoeHammad1844, JohnGinnane, johnku1, joshepvodka, jproads, Jrpl, juliangiebel, JustArt1m, JustCone14, JustinTrotter, KaiShibaa, kalane15, kalanosh, Kelrak, kerisargit, keronshb, KIBORG04, Killerqu00, KingFroozy, kira-er, Kit0vras, KittenColony, Ko4ergaPunk, komunre, koteq, Krunklehorn, kxvvv, Lamrr, LankLTE, lapatison, Leander-0, leonardo-dabepis, LetterN, Level10Cybermancer, lever1209, liltenhead, LittleBuilderJane, Lomcastar, LordCarve, LordEclipse, LovelyLophi, Lukasz825700516, lunarcomets, luringens, lvvova1, lzimann, lzk228, MACMAN2003, Macoron, MagnusCrowe, ManelNavola, Matz05, MehimoNemo, MeltedPixel, MemeProof, Menshin, Mervill, metalgearsloth, mhamsterr, MilenVolf, Minty642, Mirino97, mirrorcult, misandrie, MishaUnity, MisterMecky, Mith-randalf, Mnemotechnician, Moneyl, Moomoobeef, moony, Morb0, Mr0maks, musicmanvr, Myakot, Myctai, N3X15, Nairodian, Naive817, namespace-Memory, NickPowers43, nikthechampiongr, Nimfar11, Nirnael, nmajask, nok-ko, notafet, notquitehadouken, noudoit, noverd, nuke-haus, NULL882, OCOtheOmega, OctoRocket, OldDanceJacket, onoira, osjarw, Owai-Seek, pali6, Pangogie, patrikturi, PaulRitter, Peptide90, peptron1, Phantom-Lily, PHCodes, PixelTheKermit, PJB3005, Plykiya, pofitlo, pointer-to-null, PolterTzi, PoorMansDreams, potato1234x, ProfanedBane, PrPleGoo, ps3moira, Pspritechologist, Psychpsyo, psykzz, PuroSlavKing, quatre, QuietlyWhisper, qwerltaz, Radosvik, Radrark, Rainbeon, Rainfey, Rane, ravage123321, rbertoche, Redict, RedlineTriad, RednoWCirabrab, RemberBM, RemieRichards, RemTim, rene-descartes2021, RiceMar1244, RieBi, Rinkashikachi, Rockdtben, rolfero, rosieposieeee, Saakra, Samsterious, SaphireLattice, ScalyChimp, scrato, Scribbles0, Serkket, ShadowCommander, Shadowtheprotogen546, SignalWalker, SimpleStation14, Simyon264, Sirionaut, siyengar04, Skarletto, Skrauz, Skyedra, SlamBamActionman, slarticodefast, Slava0135, Snowni, snowsignal, SonicHDC, SoulSloth, SpaceManiac, SpeltIncorrectyl, spoogemonster, ssdaniel24, stalengd, Stealthbomber16, stellar-novas, StrawberryMoses, superjj18, SweptWasTaken, Szunti, TadJohnson00, takemysoult, TaralGit, Tayrtahn, tday93, TekuNut, TemporalOroboros, tentekal, tgrkzus, thatrandomcanadianguy, TheArturZh, theashtronaut, thedraccx, themias, Theomund, theOperand, TheShuEd, TimrodDX, Titian3, tkdrg, Tmanzxd, tmtmtl30, TokenStyle, tom-leys, tomasalves8, Tomeno, Tornado-Technology, tosatur, Tryded, TsjipTsjip, Tunguso4ka, TurboTrackerss14, Tyler-IN, Tyzemol, UbaserB, UKNOWH, UnicornOnLSD, Uriende, UristMcDorf, Vaaankas, Varen, VasilisThePikachu, veliebm, Veritius, Vermidia, Verslebas, VigersRay, Visne, VMSolidus, volundr-, Voomra, Vordenburg, vulppine, wafehling, WarMechanic, waylon531, weaversam8, Willhelm53, wixoaGit, WlarusFromDaSpace, wrexbe, xRiriq, yathxyz, Ygg01, YotaXP, YuriyKiss, zach-hill, Zandario, Zap527, Zealith-Gamer, ZelteHonor, zerorulez, zionnBE, zlodo, ZNixian, ZoldorfTheWizard, Zumorica, Zymem diff --git a/Resources/Locale/en-US/armor/armor-examine.ftl b/Resources/Locale/en-US/armor/armor-examine.ftl index d49a1373f2..6dc511e66e 100644 --- a/Resources/Locale/en-US/armor/armor-examine.ftl +++ b/Resources/Locale/en-US/armor/armor-examine.ftl @@ -17,3 +17,4 @@ armor-damage-type-cold = Cold armor-damage-type-poison = Poison armor-damage-type-shock = Shock armor-damage-type-structural = Structural +armor-examine-stamina = Reduces your stamina damage by [color=cyan]{$num}%[/color]. \ No newline at end of file diff --git a/Resources/Locale/en-US/bloodstream/bloodstream.ftl b/Resources/Locale/en-US/bloodstream/bloodstream.ftl index 7d8f98c308..65e475f1ab 100644 --- a/Resources/Locale/en-US/bloodstream/bloodstream.ftl +++ b/Resources/Locale/en-US/bloodstream/bloodstream.ftl @@ -3,3 +3,7 @@ bloodstream-component-bleeding = [color=red]{CAPITALIZE(SUBJECT($target))} {CONJ bloodstream-component-profusely-bleeding = [color=crimson]{CAPITALIZE(SUBJECT($target))} {CONJUGATE-BE($target)} profusely bleeding![/color] bloodstream-component-wounds-cauterized = You feel your wounds painfully close! + +bloodstream-component-selfaware-looks-pale = [color=bisque]You feel dizzy from blood loss.[/color] +bloodstream-component-selfaware-bleeding = [color=red]You are bleeding.[/color] +bloodstream-component-selfaware-profusely-bleeding = [color=crimson]You are profusely bleeding![/color] diff --git a/Resources/Locale/en-US/botany/components/teleporting-trait-component.ftl b/Resources/Locale/en-US/botany/components/teleporting-trait-component.ftl new file mode 100644 index 0000000000..c38b8605f2 --- /dev/null +++ b/Resources/Locale/en-US/botany/components/teleporting-trait-component.ftl @@ -0,0 +1 @@ +teleporting-trait-component-slipped = You slip through bluespace! diff --git a/Resources/Locale/en-US/deltav/devices/device-network.ftl b/Resources/Locale/en-US/deltav/devices/device-network.ftl new file mode 100644 index 0000000000..644d2e240a --- /dev/null +++ b/Resources/Locale/en-US/deltav/devices/device-network.ftl @@ -0,0 +1,2 @@ +device-frequency-prototype-name-surveillance-camera-justice = Justice Cameras + diff --git a/Resources/Locale/en-US/deltav/headset/headset-component.ftl b/Resources/Locale/en-US/deltav/headset/headset-component.ftl index d3c3f2e735..9801bce3ab 100644 --- a/Resources/Locale/en-US/deltav/headset/headset-component.ftl +++ b/Resources/Locale/en-US/deltav/headset/headset-component.ftl @@ -1 +1,3 @@ +chat-radio-justice = Justice chat-radio-prison = Prison + diff --git a/Resources/Locale/en-US/deltav/job/department-desc.ftl b/Resources/Locale/en-US/deltav/job/department-desc.ftl new file mode 100644 index 0000000000..530a1b0a5a --- /dev/null +++ b/Resources/Locale/en-US/deltav/job/department-desc.ftl @@ -0,0 +1,2 @@ +department-Justice-description = Uphold justice on the station. + diff --git a/Resources/Locale/en-US/deltav/job/department.ftl b/Resources/Locale/en-US/deltav/job/department.ftl index fc6d81e938..2653e8f46c 100644 --- a/Resources/Locale/en-US/deltav/job/department.ftl +++ b/Resources/Locale/en-US/deltav/job/department.ftl @@ -1,2 +1,4 @@ department-Epistemics = Epistemics department-Logistics = Logistics +department-Justice = Justice + diff --git a/Resources/Locale/en-US/deltav/job/job-description.ftl b/Resources/Locale/en-US/deltav/job/job-description.ftl index 5bc7be8311..9e99f5838e 100644 --- a/Resources/Locale/en-US/deltav/job/job-description.ftl +++ b/Resources/Locale/en-US/deltav/job/job-description.ftl @@ -1 +1,5 @@ job-description-medical-borg = Half-human, Half-machine. Follow your laws, serve the crew, and assist the medical department. +job-description-chief-justice = Manage the justice department, act as a judge, and ensure everyone recieves fair and just treatment. +job-description-clerk = Organize trials, notarize documents, review charges, and act as a judge if needed. +job-description-prosecutor = Take statements from security and prepare cases against those accused of commiting crimes. +job-description-courier = Deliver mail and other packages from and to logistics. Avoid dogs. diff --git a/Resources/Locale/en-US/deltav/job/job-names.ftl b/Resources/Locale/en-US/deltav/job/job-names.ftl index dc7940ba98..175da8ba69 100644 --- a/Resources/Locale/en-US/deltav/job/job-names.ftl +++ b/Resources/Locale/en-US/deltav/job/job-names.ftl @@ -1 +1,6 @@ job-name-medical-borg = Medical Cyborg +job-name-chief-justice = Chief Justice +job-name-clerk = Clerk +job-name-prosecutor = Prosecutor +job-name-lawyer = Attorney +job-name-courier = Courier diff --git a/Resources/Locale/en-US/deltav/job/job-supervisors.ftl b/Resources/Locale/en-US/deltav/job/job-supervisors.ftl new file mode 100644 index 0000000000..f1c0ade32a --- /dev/null +++ b/Resources/Locale/en-US/deltav/job/job-supervisors.ftl @@ -0,0 +1,2 @@ +job-supervisors-cj = the chief justice + diff --git a/Resources/Locale/en-US/deltav/misc/pda.ftl b/Resources/Locale/en-US/deltav/misc/pda.ftl new file mode 100644 index 0000000000..a64a4e3423 --- /dev/null +++ b/Resources/Locale/en-US/deltav/misc/pda.ftl @@ -0,0 +1,4 @@ +ent-HoSPDA = head of security pda + .desc = Smells like donuts and gunpowder residue. +ent-LawyerPDA = attorney pda + .desc = For attornies to poach dubious clients. diff --git a/Resources/Locale/en-US/deltav/navmap-beacons/station-beacons.ftl b/Resources/Locale/en-US/deltav/navmap-beacons/station-beacons.ftl index 7b2d06a04e..8d2571920f 100644 --- a/Resources/Locale/en-US/deltav/navmap-beacons/station-beacons.ftl +++ b/Resources/Locale/en-US/deltav/navmap-beacons/station-beacons.ftl @@ -30,3 +30,7 @@ station-beacon-boxing-ring = Boxing station-beacon-park = Park station-beacon-corpsman = Corpsman + +station-beacon-justice = Justice +station-beacon-chiefjustice = Chief Justice +station-beacon-prosecutor = Prosecutor diff --git a/Resources/Locale/en-US/deltav/paper/stamp-component.ftl b/Resources/Locale/en-US/deltav/paper/stamp-component.ftl index 8c591e771f..cfa5279baa 100644 --- a/Resources/Locale/en-US/deltav/paper/stamp-component.ftl +++ b/Resources/Locale/en-US/deltav/paper/stamp-component.ftl @@ -1,2 +1,5 @@ stamp-component-stamped-name-lawyer = Lawyer -stamp-component-stamped-name-psychologist = Psychologist \ No newline at end of file +stamp-component-stamped-name-psychologist = Psychologist +stamp-component-stamped-name-notary = NOTARY +stamp-component-stamped-name-chiefjustice = Chief Justice + diff --git a/Resources/Locale/en-US/deltav/prototypes/access/accesses.ftl b/Resources/Locale/en-US/deltav/prototypes/access/accesses.ftl index 84245872f5..3ebfe8bf1b 100644 --- a/Resources/Locale/en-US/deltav/prototypes/access/accesses.ftl +++ b/Resources/Locale/en-US/deltav/prototypes/access/accesses.ftl @@ -1,3 +1,6 @@ -id-card-access-level-orders = Orders -id-card-access-level-mantis = Psionic Mantis +id-card-access-level-orders = Orders +id-card-access-level-mantis = Mantis +id-card-access-level-chief-justice = Chief Justice +id-card-access-level-prosecutor = Prosecutor +id-card-access-level-justice = Justice id-card-access-level-corpsman = Corpsman diff --git a/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl b/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl index 7b25eb660b..9260db903f 100644 --- a/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl +++ b/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl @@ -161,7 +161,7 @@ ghost-role-information-skeleton-biker-name = Skeleton Biker ghost-role-information-skeleton-biker-description = Ride around on your sweet ride. ghost-role-information-closet-skeleton-name = Closet Skeleton -ghost-role-information-closet-skeleton-description = Wreak havoc! You are a primordial force with no allegiance. Live happily with the crew or wage sweet skeletal war. +ghost-role-information-closet-skeleton-description = You are a closet skeleton! You are a primordial force of chaos with no allegiance! You can either join the crew and use your skeletal antics to help them, or be a a prankster, and hinder their efforts! ghost-role-information-onestar-mecha-name = Onestar Mecha ghost-role-information-onestar-mecha-description = You are an experimental mecha created by who-knows-what, all you know is that you have weapons and you detect fleshy moving targets nearby... diff --git a/Resources/Locale/en-US/health-examinable/health-examinable-selfaware.ftl b/Resources/Locale/en-US/health-examinable/health-examinable-selfaware.ftl new file mode 100644 index 0000000000..897c3f718d --- /dev/null +++ b/Resources/Locale/en-US/health-examinable/health-examinable-selfaware.ftl @@ -0,0 +1,22 @@ +health-examinable-selfaware-none = You feel healthy and well. + +health-examinable-selfaware-type-text = You have {$damageType}, around [bold]{$amount}[/bold]. + +health-examinable-selfaware-type-Blunt = [color=red]Blunt[/color] trauma +health-examinable-selfaware-type-Slash = [color=red]Slash[/color] wounds +health-examinable-selfaware-type-Piercing = [color=red]Piercing[/color] wounds + +health-examinable-selfaware-type-Heat = [color=orange]Heat[/color] burns +health-examinable-selfaware-type-Shock = [color=lightgoldenrodyellow]Shock[/color] burns +health-examinable-selfaware-type-Cold = [color=lightblue]Cold[/color] burns +health-examinable-selfaware-type-Caustic = [color=yellowgreen]Caustic[/color] burns + +health-examinable-selfaware-group-Toxin-10 = [color=green]You feel sick.[/color] +health-examinable-selfaware-group-Toxin-25 = [color=green]You feel nauseated.[/color] +health-examinable-selfaware-group-Toxin-40 = [color=green]You feel very unwell![/color] +health-examinable-selfaware-group-Toxin-60 = [color=green]You feel gravely ill![/color] + +health-examinable-selfaware-group-Airloss-10 = [color=lightblue]You feel lightheaded.[/color] +health-examinable-selfaware-group-Airloss-25 = [color=lightblue]You feel faint and woozy.[/color] +health-examinable-selfaware-group-Airloss-40 = [color=lightblue]You're struggling to breathe![/color] +health-examinable-selfaware-group-Airloss-60 = [color=lightblue]You're suffocating badly![/color] diff --git a/Resources/Locale/en-US/interaction/interaction-popup-component.ftl b/Resources/Locale/en-US/interaction/interaction-popup-component.ftl index bb56233ff1..a6eacf13c5 100644 --- a/Resources/Locale/en-US/interaction/interaction-popup-component.ftl +++ b/Resources/Locale/en-US/interaction/interaction-popup-component.ftl @@ -77,12 +77,6 @@ comp-window-knock = *knock knock* fence-rattle-success = *rattle* -## Hugging players - -hugging-success-generic = You hug {THE($target)}. -hugging-success-generic-others = { CAPITALIZE(THE($user)) } hugs {THE($target)}. -hugging-success-generic-target = { CAPITALIZE(THE($user)) } hugs you. - ## Other petting-success-tesla = You pet {THE($target)}, violating the laws of nature and physics. diff --git a/Resources/Locale/en-US/job/job-names.ftl b/Resources/Locale/en-US/job/job-names.ftl index ab82435934..7407774ef2 100644 --- a/Resources/Locale/en-US/job/job-names.ftl +++ b/Resources/Locale/en-US/job/job-names.ftl @@ -24,7 +24,8 @@ job-name-centcomoff = CentCom Official job-name-reporter = Reporter job-name-musician = Musician job-name-librarian = Librarian -job-name-lawyer = Lawyer +# DeltaV - Changed Lawyer to Attorney +# job-name-lawyer = Lawyer job-name-mime = Mime job-name-ce = Chief Engineer job-name-janitor = Janitor diff --git a/Resources/Locale/en-US/language/commands.ftl b/Resources/Locale/en-US/language/commands.ftl index ba2b316009..65959e3f28 100644 --- a/Resources/Locale/en-US/language/commands.ftl +++ b/Resources/Locale/en-US/language/commands.ftl @@ -14,3 +14,21 @@ 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. + +# toolshed + +command-description-language-add = Adds a new language to the piped entity. The two last arguments indicate whether it should be spoken/understood. Example: 'self language:add "Canilunzt" true true' +command-description-language-rm = Removes a language from the piped entity. Works similarly to language:add. Example: 'self language:rm "GalacticCommon" true true'. +command-description-language-lsspoken = Lists all languages the entity can speak. Example: 'self language:lsspoken' +command-description-language-lsunderstood = Lists all languages the entity can understand. Example: 'self language:lssunderstood' + +command-description-translator-addlang = Adds a new target language to the piped translator entity. See language:add for details. +command-description-translator-rmlang = Removes a target language from the piped translator entity. See language:rm for details. +command-description-translator-addrequired = Adds a new required language to the piped translator entity. Example: 'ent 1234 translator:addrequired "GalacticCommon"' +command-description-translator-rmrequired = Removes a required language from the piped translator entity. Example: 'ent 1234 translator:rmrequired "GalacticCommon"' +command-description-translator-lsspoken = Lists all spoken languages for the piped translator entity. Example: 'ent 1234 translator:lsspoken' +command-description-translator-lsunderstood = Lists all understood languages for the piped translator entity. Example: 'ent 1234 translator:lssunderstood' +command-description-translator-lsrequired = Lists all required languages for the piped translator entity. Example: 'ent 1234 translator:lsrequired' + +command-language-error-this-will-not-work = This will not work. +command-language-error-not-a-translator = Entity {$entity} is not a translator. diff --git a/Resources/Locale/en-US/language/languages.ftl b/Resources/Locale/en-US/language/languages.ftl index 14d477b784..4b0c1248f2 100644 --- a/Resources/Locale/en-US/language/languages.ftl +++ b/Resources/Locale/en-US/language/languages.ftl @@ -28,6 +28,9 @@ language-Moffic-description = The language of the mothpeople borders on complete 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-Sign-name = Galactic Sign Language +language-Sign-description = GSL for short, this sign language is prevalent among mute and deaf people. + language-Cat-name = Cat language-Cat-description = Meow @@ -72,6 +75,3 @@ language-Kobold-description = Hiss! language-Hissing-name = Hissing language-Hissing-description = Hiss! - -language-Sign-name = Sign Language -language-Sign-description = The standard Galactic sign language, used by those that are unable to speak Galactic Common or at all. diff --git a/Resources/Locale/en-US/markings/harpy.ftl b/Resources/Locale/en-US/markings/harpy.ftl index 6d6ba75a93..724207c3ef 100644 --- a/Resources/Locale/en-US/markings/harpy.ftl +++ b/Resources/Locale/en-US/markings/harpy.ftl @@ -40,6 +40,14 @@ marking-HarpyWingTipsClassic = Classic Wings with Feather Tips marking-HarpyWingTipsClassic-harpy_wingtip_1 = Main marking-HarpyWingTipsClassic-harpy_wingtip_2 = Feathertips +marking-HarpyWingBat = Bat Wings (Whitescale) +marking-HarpyWingBat-bat_wings_tone_1 = Limbs +marking-HarpyWingBat-bat_wings_tone_2 = Membrane + +marking-HarpyWingBionic = Simple Bionic Wings (Whitescale) +marking-HarpyWingBionic-bionic_wings_tone_1 = Wings +marking-HarpyWingBionic-bionic_wings_tone_2 = Lights (Unshaded) + marking-HarpyEarsDefault = Feather Tufts marking-HarpyEarsDefault-harpy_ears_default = Tufts @@ -65,6 +73,16 @@ marking-HarpyTailPeacock = Peacock Tail marking-HarpyTailPeacock-peacock_tail_feathers = Feathers marking-HarpyTailPeacock-peacock_tail_eyes = Eyes +marking-HarpyTailHaven = Haven Tail (Whitescale) +marking-HarpyTailHaven-haven_tone_1 = Outer Feathers +marking-HarpyTailHaven-haven_tone_2 = Inner Feathers + +marking-HarpyTailForkedLong = Long Forked Tail (Whitescale) +marking-HarpyTailForkedLong-forked_long = Tail + +marking-HarpyTailSwallow = Swallow Tail (Whitescale) +marking-HarpyTailForkedLong-forked_long = Tail + marking-HarpyChestDefault = Wing & Groin Under-Clothes marking-HarpyChestDefault-upper = Wing Under-Clothes marking-HarpyChestDefault-lower = Groin Under-Clothes diff --git a/Resources/Locale/en-US/medical/components/penlight.ftl b/Resources/Locale/en-US/medical/components/penlight.ftl new file mode 100644 index 0000000000..f0639ad738 --- /dev/null +++ b/Resources/Locale/en-US/medical/components/penlight.ftl @@ -0,0 +1,11 @@ +penlight-off = The pen light is off. +pen-light-exam-title = Pen Light +pen-light-window-entity-eyes-text = {$entityName}'s conditions: +pen-light-window-no-patient-data-text = No patient data. +pen-light-window-entity-unknown-text = unknown + +pen-light-exam-blind-text = The patient's eyes are glassy and unfocused. They can't follow the light at all. +pen-light-exam-drunk-text = The patient's eyes are slow to follow the light, droopy. +pen-light-exam-eyedamage-text = The patient's eyes are partially focused, though they struggle to look at the light for too long. +pen-light-exam-hallucinating-text = The patient's eyes are wandering around, with dilated pupils. They don't focus on the light. +pen-light-exam-healthy-text = The patient follows the light perfectly with no stuttering. \ No newline at end of file diff --git a/Resources/Locale/en-US/nyanotrasen/job/job-names.ftl b/Resources/Locale/en-US/nyanotrasen/job/job-names.ftl index bc99a777f1..8660d21461 100644 --- a/Resources/Locale/en-US/nyanotrasen/job/job-names.ftl +++ b/Resources/Locale/en-US/nyanotrasen/job/job-names.ftl @@ -3,8 +3,8 @@ job-name-guard = Prison Guard job-name-mail-carrier = Courier job-name-martialartist = Martial Artist job-name-prisoner = Prisoner -job-name-mantis = Psionic Mantis +job-name-mantis = Mantis # Role timers JobMailCarrier = Courier -JobForensicMantis = Psionic Mantis +JobForensicMantis = Mantis diff --git a/Resources/Locale/en-US/nyanotrasen/paper/stamp-component.ftl b/Resources/Locale/en-US/nyanotrasen/paper/stamp-component.ftl index 0434e6d26a..381278f8cf 100644 --- a/Resources/Locale/en-US/nyanotrasen/paper/stamp-component.ftl +++ b/Resources/Locale/en-US/nyanotrasen/paper/stamp-component.ftl @@ -1 +1 @@ -stamp-component-stamped-name-mantis = Psionic Mantis +stamp-component-stamped-name-mantis = Mantis diff --git a/Resources/Locale/en-US/objectives/conditions/steal.ftl b/Resources/Locale/en-US/objectives/conditions/steal.ftl index 8547a01db2..0709bf6e5e 100644 --- a/Resources/Locale/en-US/objectives/conditions/steal.ftl +++ b/Resources/Locale/en-US/objectives/conditions/steal.ftl @@ -11,4 +11,4 @@ objective-condition-thief-animal-description = The {$itemName} would be a great objective-condition-thief-multiply-description = I need to get {$count} {MAKEPLURAL($itemName)} and take them with me. objective-condition-steal-smsliver-title = Cut off a sliver from the supermatter crystal. -objective-condition-steal-smsliver-description = Use any cutting tool that comes in handy. A scalpel is more recommended. Also, don't die of radiation poisoning. \ No newline at end of file +objective-condition-steal-smsliver-description = Use any cutting tool that comes in handy. A scalpel is more recommended. Also, don't die of radiation poisoning. diff --git a/Resources/Locale/en-US/reagents/meta/physical-desc.ftl b/Resources/Locale/en-US/reagents/meta/physical-desc.ftl index 50ea5f590c..064b21eaa9 100644 --- a/Resources/Locale/en-US/reagents/meta/physical-desc.ftl +++ b/Resources/Locale/en-US/reagents/meta/physical-desc.ftl @@ -1,101 +1,101 @@ -reagent-physical-desc-skunky = skunky -reagent-physical-desc-soapy = soapy -reagent-physical-desc-ferrous = ferrous -reagent-physical-desc-nothing = nothing +reagent-physical-desc-abrasive = abrasive +reagent-physical-desc-acidic = acidic reagent-physical-desc-acrid = acrid -reagent-physical-desc-thick-and-grainy = thick and grainy -reagent-physical-desc-necrotic = necrotic -reagent-physical-desc-oily = oily -reagent-physical-desc-glowing = glowing -reagent-physical-desc-heterogeneous = heterogeneous -reagent-physical-desc-mucus-like = mucus-like -reagent-physical-desc-cold = cold +reagent-physical-desc-alkaline = alkaline +reagent-physical-desc-aromatic = aromatic reagent-physical-desc-bee-guts = bee guts -reagent-physical-desc-tangy = tangy -reagent-physical-desc-fizzy = fizzy -reagent-physical-desc-fuzzy = fuzzy -reagent-physical-desc-spicy = spicy -reagent-physical-desc-abrasive = abrasive -reagent-physical-desc-chalky = chalky -reagent-physical-desc-roaring = roaring -reagent-physical-desc-robust = robust -reagent-physical-desc-sickly = sickly -reagent-physical-desc-murky = murky -reagent-physical-desc-bubbling = bubbling -reagent-physical-desc-wormy = wormy -reagent-physical-desc-frosty = frosty reagent-physical-desc-blazing = blazing -reagent-physical-desc-translucent = translucent -reagent-physical-desc-sugary = sugary -reagent-physical-desc-putrid = putrid -reagent-physical-desc-saucey = saucey -reagent-physical-desc-salty = salty -reagent-physical-desc-milky = milky -reagent-physical-desc-refreshing = refreshing -reagent-physical-desc-soothing = soothing -reagent-physical-desc-starchy = starchy -reagent-physical-desc-starry = starry -reagent-physical-desc-tart = tart -reagent-physical-desc-aromatic = aromatic -reagent-physical-desc-thick = thick -reagent-physical-desc-syrupy = syrupy -reagent-physical-desc-grainy = grainy -reagent-physical-desc-foamy = foamy -reagent-physical-desc-tropical = tropical +reagent-physical-desc-bubbling = bubbling +reagent-physical-desc-bubbly = bubbly +reagent-physical-desc-burning = burning +reagent-physical-desc-buzzy = buzzy +reagent-physical-desc-chalky = chalky +reagent-physical-desc-chewy = chewy +reagent-physical-desc-citric = citric +reagent-physical-desc-cloudy = cloudy +reagent-physical-desc-clumpy = clumpy reagent-physical-desc-coarse = coarse -reagent-physical-desc-opaque = opaque -reagent-physical-desc-pulpy = pulpy -reagent-physical-desc-reasonably-metallic = reasonably metallic -reagent-physical-desc-metallic = metallic -reagent-physical-desc-gaseous = gaseous -reagent-physical-desc-ground-brass = ground brass -reagent-physical-desc-dark-brown = dark brown +reagent-physical-desc-cold = cold +reagent-physical-desc-creamy = creamy +reagent-physical-desc-crisp = crisp reagent-physical-desc-crystalline = crystalline -reagent-physical-desc-viscous = viscous -reagent-physical-desc-shiny = shiny +reagent-physical-desc-dark-brown = dark brown reagent-physical-desc-dark-red = dark-red +reagent-physical-desc-electric = electric +reagent-physical-desc-energizing = energizing +reagent-physical-desc-enigmatic = enigmatic +reagent-physical-desc-ethereal = ethereal +reagent-physical-desc-exhilarating = exhilarating +reagent-physical-desc-exotic-smelling = exotic smelling +reagent-physical-desc-ferrous = ferrous +reagent-physical-desc-fibrous = fibrous +reagent-physical-desc-fizzy = fizzy +reagent-physical-desc-fizzy-and-creamy = fizzy and creamy +reagent-physical-desc-fluffy = fluffy +reagent-physical-desc-foamy = foamy +reagent-physical-desc-frosty = frosty +reagent-physical-desc-funny = funny +reagent-physical-desc-fuzzy = fuzzy +reagent-physical-desc-gaseous = gaseous +reagent-physical-desc-glittery = glittery +reagent-physical-desc-gloopy = gloopy +reagent-physical-desc-glowing = glowing +reagent-physical-desc-grainy = grainy +reagent-physical-desc-ground-brass = ground brass +reagent-physical-desc-heterogeneous = heterogeneous +reagent-physical-desc-holy = holy +reagent-physical-desc-inky = inky reagent-physical-desc-ionizing = ionizing +reagent-physical-desc-lemony-fresh = lemony fresh +reagent-physical-desc-metallic = metallic +reagent-physical-desc-milky = milky +reagent-physical-desc-mucus-like = mucus-like +reagent-physical-desc-murky = murky +reagent-physical-desc-necrotic = necrotic +reagent-physical-desc-neural = neural reagent-physical-desc-nondescript = nondescript -reagent-physical-desc-burning = burning +reagent-physical-desc-nothing = nothing +reagent-physical-desc-odorless = odorless +reagent-physical-desc-oily = oily +reagent-physical-desc-opaque = opaque +reagent-physical-desc-overpowering = overpowering reagent-physical-desc-porous = porous reagent-physical-desc-powdery = powdery -reagent-physical-desc-creamy = creamy -reagent-physical-desc-sticky = sticky -reagent-physical-desc-bubbly = bubbly +reagent-physical-desc-pulpy = pulpy +reagent-physical-desc-pungent = pungent +reagent-physical-desc-putrid = putrid +reagent-physical-desc-reasonably-metallic = reasonably metallic +reagent-physical-desc-reflective = reflective +reagent-physical-desc-refreshing = refreshing +reagent-physical-desc-roaring = roaring +reagent-physical-desc-robust = robust reagent-physical-desc-rocky = rocky -reagent-physical-desc-lemony-fresh = lemony fresh +reagent-physical-desc-salty = salty +reagent-physical-desc-saucey = saucey +reagent-physical-desc-shiny = shiny +reagent-physical-desc-sickly = sickly +reagent-physical-desc-skunky = skunky +reagent-physical-desc-slimy = slimy reagent-physical-desc-soapy = soapy -reagent-physical-desc-crisp = crisp -reagent-physical-desc-citric = citric -reagent-physical-desc-acidic = acidic -reagent-physical-desc-buzzy = buzzy -reagent-physical-desc-fibrous = fibrous -reagent-physical-desc-strong-smelling = strong smelling -reagent-physical-desc-fizzy-and-creamy = fizzy and creamy -reagent-physical-desc-overpowering = overpowering +reagent-physical-desc-soapy = soapy +reagent-physical-desc-soothing = soothing reagent-physical-desc-sour = sour -reagent-physical-desc-pungent = pungent -reagent-physical-desc-clumpy = clumpy +reagent-physical-desc-spicy = spicy +reagent-physical-desc-starchy = starchy +reagent-physical-desc-starry = starry +reagent-physical-desc-sticky = sticky +reagent-physical-desc-strong-smelling = strong smelling reagent-physical-desc-strong-smelling = strong-smelling -reagent-physical-desc-odorless = odorless -reagent-physical-desc-gloopy = gloopy -reagent-physical-desc-cloudy = cloudy +reagent-physical-desc-sugary = sugary reagent-physical-desc-sweet = sweet -reagent-physical-desc-electric = electric -reagent-physical-desc-chewy = chewy -reagent-physical-desc-volatile = volatile -reagent-physical-desc-inky = inky -reagent-physical-desc-enigmatic = enigmatic -reagent-physical-desc-exotic-smelling = exotic smelling -reagent-physical-desc-ethereal = ethereal -reagent-physical-desc-glittery = glittery -reagent-physical-desc-energizing = energizing -reagent-physical-desc-exhilarating = exhilarating +reagent-physical-desc-syrupy = syrupy +reagent-physical-desc-tangy = tangy +reagent-physical-desc-tart = tart +reagent-physical-desc-thick = thick +reagent-physical-desc-thick-and-grainy = thick and grainy +reagent-physical-desc-translucent = translucent +reagent-physical-desc-tropical = tropical reagent-physical-desc-vibrant = vibrant -reagent-physical-desc-fluffy = fluffy -reagent-physical-desc-funny = funny -reagent-physical-desc-alkaline = alkaline -reagent-physical-desc-reflective = reflective -reagent-physical-desc-holy = holy -reagent-physical-desc-slimy = slimy -reagent-physical-desc-neural = neural +reagent-physical-desc-viscous = viscous +reagent-physical-desc-volatile = volatile +reagent-physical-desc-wormy = wormy diff --git a/Resources/Locale/en-US/research/technologies.ftl b/Resources/Locale/en-US/research/technologies.ftl index a68f9e80b4..96cb203911 100644 --- a/Resources/Locale/en-US/research/technologies.ftl +++ b/Resources/Locale/en-US/research/technologies.ftl @@ -16,6 +16,7 @@ research-technology-shuttlecraft = Shuttlecraft research-technology-ripley-aplu = Ripley APLU research-technology-advanced-atmospherics = Advanced Atmospherics research-technology-advanced-tools = Advanced Tools +research-technology-mechanized-salvaging = Mechanized Salvaging research-technology-super-powercells = Super Powercells research-technology-bluespace-storage = Bluespace Storage research-technology-portable-fission = Portable Fission diff --git a/Resources/Locale/en-US/station-events/events/anomaly-spawn.ftl b/Resources/Locale/en-US/station-events/events/anomaly-spawn.ftl index 543bef949a..30fe4971eb 100644 --- a/Resources/Locale/en-US/station-events/events/anomaly-spawn.ftl +++ b/Resources/Locale/en-US/station-events/events/anomaly-spawn.ftl @@ -1,4 +1,4 @@ -station-event-anomaly-spawn-announcement = Our readings have detected a dangerous interspacial anomaly. Please inform the research team of { $sighting }. +anomaly-spawn-event-announcement = Our readings have detected a dangerous interspacial anomaly. Please inform the research team of { $sighting }. anomaly-spawn-sighting-1 = low pulsating sounds heard throughout the station anomaly-spawn-sighting-2 = strange sources of light diff --git a/Resources/Locale/en-US/supermatter/supermatter.ftl b/Resources/Locale/en-US/supermatter/supermatter.ftl index b656fcd128..52593f5524 100644 --- a/Resources/Locale/en-US/supermatter/supermatter.ftl +++ b/Resources/Locale/en-US/supermatter/supermatter.ftl @@ -1,19 +1,19 @@ supermatter-announcer = Automatic Supermatter Engine supermatter-examine-integrity = - It's integrity is [color=yellow]{$integrity}%[/color]. -supermatter-warning = + Its' integrity is [color=yellow]{$integrity}%[/color]. +supermatter-announcement-warning = Warning! Crystal hyperstructure integrity faltering! Integrity: {$integrity}%. -supermatter-emergency = +supermatter-announcement-emergency = DANGER! Crystal hyperstructure integrity reaching critical levels! Integrity: {$integrity}%. -supermatter-delam-explosion = +supermatter-announcement-delam-explosion = CRYSTAL DELAMINATION IMMINENT! The crystal has reached critical integrity failure! Emergency causality destabilization field has been engaged. -supermatter-delam-overmass = +supermatter-announcement-delam-overmass = CRYSTAL DELAMINATION IMMINENT! Crystal hyperstructure integrity has reached critical mass failure! Singularity formation imminent! -supermatter-delam-tesla = +supermatter-announcement-delam-tesla = CRYSTAL DELAMINATION IMMINENT! Crystal hyperstructure integrity has reached critical power surge failure! Energy ball formation imminent! -supermatter-delam-cascade = +supermatter-announcement-delam-cascade = CRYSTAL DELAMINATION IMMINENT! Harmonic frequency limits exceeded, casualty destabilization field could not be engaged! -supermatter-delam-cancel = +supermatter-announcement-delam-cancel = Crystalline hyperstructure returning to safe operating parameters. Failsafe has been Disengaged. Integrity: {$integrity}%. supermatter-seconds-before-delam = Estimated time before delamination: {$seconds} seconds. diff --git a/Resources/Locale/en-US/traits/traits.ftl b/Resources/Locale/en-US/traits/traits.ftl index e1b76f3479..1ae4e278f0 100644 --- a/Resources/Locale/en-US/traits/traits.ftl +++ b/Resources/Locale/en-US/traits/traits.ftl @@ -8,15 +8,38 @@ trait-description-Narcolepsy = You fall asleep randomly trait-name-Pacifist = Pacifist trait-description-Pacifist = You cannot attack or hurt any living beings. +trait-name-SelfAware = Self-Aware +trait-description-SelfAware = + You possess a keen intuition of your body and senses. + You can accurately examine the severity of your wounds and burns like a health analyzer, + and can gauge if you have toxin or airloss damage. + trait-name-LightweightDrunk = Lightweight Drunk trait-description-LightweightDrunk = Alcohol has a stronger effect on you -trait-name-HeavyweightDrunk = Heavyweight Drunk -trait-description-HeavyweightDrunk = Alcohols are afraid of you +trait-name-HeavyweightDrunk = Alcohol Tolerance +trait-description-HeavyweightDrunk = + Alcohol is afraid of you. + +trait-name-LiquorLifeline = Liquor Lifeline +trait-description-LiquorLifeline = + Forget the doctor — just hit the bar for your "ethanol prescription"! + While drunk, you slowly heal [color=red]Brute[/color], [color=orange]Heat[/color], [color=orange]Shock[/color], and [color=orange]Cold[/color] damage, scaling with how drunk you are. + You also gain the benefits of [color=lightblue]Alcohol Tolerance[/color]. trait-name-Muted = Muted trait-description-Muted = You can't speak +trait-name-BloodDeficiency = Blood Deficiency +trait-description-BloodDeficiency = + Your body loses more blood than it can replenish. + You lose blood over time, and when left untreated you will eventually die from blood loss. + +trait-name-Hemophilia = Hemophilia +trait-description-Hemophilia = + Your body's ability to form blood clots is impaired. + You bleed twice as long, and you have easy bruising, taking 10% more Blunt damage. + trait-name-Paracusia = Paracusia trait-description-Paracusia = You hear sounds that aren't really there @@ -127,3 +150,58 @@ trait-description-MartialArtist = You have received formal training in unarmed combat, whether with Fists, Feet, or Claws. Your unarmed melee attacks have a small range increase, and deal 50% more damage. This does not apply to any form of armed melee, only the weapons you were naturally born with. + +trait-name-Vigor = Vigor +trait-description-Vigor = + Whether by pure determination, fitness, or bionic augmentations, your endurance is enhanced. + Your stamina is increased by 10 points. + +trait-name-Lethargy = Lethargy +trait-description-Lethargy = + You become tired faster than others, making you more vulnerable to exhaustion and fatigue. + Your stamina is decreased by 15 points. + +trait-name-SignLanguage = Sign Language +trait-description-SignLanguage = + You can understand and use Galactic Sign Language (GSL). + If you are mute for any reason, you can still communicate with sign language. + +trait-name-Voracious = Voracious +trait-description-Voracious = + Nothing gets between you and your food. + Your endless consumption of food and drinks is twice as fast. + +trait-name-ParkourTraining = Parkour Training +trait-description-ParkourTraining = + Whether as a hobby, lifestyle, or professional training, you are trained in the discipline of parkour. + You're faster with climbing, crawling, lying down, and getting up. + +trait-name-Sluggish = Sluggish +trait-description-Sluggish = + You navigate the world slower than others, perhaps due to a medical condition, inactivity, or age. + You move slower, and it takes longer for you to climb, lie down and get up. + +trait-name-SnailPaced = Snail-Paced +trait-description-SnailPaced = + You walk at a snail's pace, perhaps due to a medical condition, mobility impairment, or age. + You move substantially slower, and it takes far longer for you to climb, lie down and get up. + +trait-name-LightStep = Light Step +trait-description-LightStep = + You move with a gentle step, making your footsteps quieter. + +trait-name-Swashbuckler = Swashbuckler +trait-description-Swashbuckler = + You are an expert in swordsmanship, wielding swords, knives, and other blades with unrivaled finesse. + Your melee Slash bonus is increased to 35%, but your melee Blunt bonus is reduced to 20%. + +trait-name-Spearmaster = Spearmaster +trait-description-Spearmaster = + You have an outstanding proficiency with spears, wielding them as an extension of your body. + Your melee Piercing bonus is increased to 35%, but your melee Blunt bonus is reduced to 20%. + +trait-name-WeaponsGeneralist = Weapons Generalist +trait-description-WeaponsGeneralist = + You are a jack of all trades with melee weapons, enabling you to be versatile with your weapon arsenal. + Your melee damage bonus for all Brute damage types (Blunt, Slash, Piercing) becomes 25%. + diff --git a/Resources/Maps/edge.yml b/Resources/Maps/edge.yml index c943a1d655..89783b610f 100644 --- a/Resources/Maps/edge.yml +++ b/Resources/Maps/edge.yml @@ -96720,7 +96720,7 @@ entities: - type: Transform pos: -40.5,-2.5 parent: 2 -- proto: supermatter +- proto: Supermatter entities: - uid: 12741 components: diff --git a/Resources/Maps/hammurabi.yml b/Resources/Maps/hammurabi.yml index 022c647ba7..0afaa64934 100644 --- a/Resources/Maps/hammurabi.yml +++ b/Resources/Maps/hammurabi.yml @@ -26862,7 +26862,7 @@ entities: - uid: 18085 components: - type: MetaData - name: psionic mantis office/epistemics hall APC + name: mantis office/epistemics hall APC - type: Transform pos: -31.5,-37.5 parent: 1 diff --git a/Resources/Maps/packedsm.yml b/Resources/Maps/packedsm.yml index ec8ca8e2a4..cd07a28651 100644 --- a/Resources/Maps/packedsm.yml +++ b/Resources/Maps/packedsm.yml @@ -71402,7 +71402,7 @@ entities: - type: Transform pos: 38.5,21.5 parent: 2 -- proto: supermatter +- proto: Supermatter entities: - uid: 13539 components: diff --git a/Resources/Prototypes/Access/misc.yml b/Resources/Prototypes/Access/misc.yml index 99ad59700e..f402c7544a 100644 --- a/Resources/Prototypes/Access/misc.yml +++ b/Resources/Prototypes/Access/misc.yml @@ -34,7 +34,7 @@ - Atmospherics - Mail # Nyanotrasen - MailCarrier, see Resources/Prototypes/Nyanotrasen/Roles/Jobs/Cargo/mail-carrier.yml - Orders # DeltaV - Orders, see Resources/Prototypes/DeltaV/Access/cargo.yml - - Mantis # DeltaV - Psionic Mantis, see Resources/Prototypes/DeltaV/Access/epistemics.yml + - Mantis # DeltaV - Mantis, see Resources/Prototypes/DeltaV/Access/epistemics.yml - Paramedic # DeltaV - Add Paramedic access - Psychologist # DeltaV - Add Psychologist access - Boxer # DeltaV - Add Boxer access @@ -44,4 +44,7 @@ - Musician # DeltaV - Add Musician access - Reporter # DeltaV - Add Reporter access - Zookeeper # DeltaV - Add Zookeeper access + - Justice # DeltaV - Add Justice dept access + - ChiefJustice # DeltaV - Add Chief Justice access + - Prosecutor # DeltaV - Add Prosecutor access - Corpsman # DeltaV - Add Corpsman access diff --git a/Resources/Prototypes/Access/research.yml b/Resources/Prototypes/Access/research.yml index f0de2c93db..3e3b0432b4 100644 --- a/Resources/Prototypes/Access/research.yml +++ b/Resources/Prototypes/Access/research.yml @@ -11,4 +11,4 @@ tags: - ResearchDirector - Research - - Mantis # DeltaV - Psionic Mantis, see Resources/Prototypes/DeltaV/Access/epistemics.yml + - Mantis # DeltaV - Mantis, see Resources/Prototypes/DeltaV/Access/epistemics.yml diff --git a/Resources/Prototypes/Atmospherics/thresholds.yml b/Resources/Prototypes/Atmospherics/thresholds.yml index 9b09d64a10..22ca42869e 100644 --- a/Resources/Prototypes/Atmospherics/thresholds.yml +++ b/Resources/Prototypes/Atmospherics/thresholds.yml @@ -12,13 +12,14 @@ - type: alarmThreshold id: stationPressure upperBound: !type:AlarmThresholdSetting - threshold: 550 # as defined in Atmospherics.cs + threshold: 550 # HazardHighPressure from Atmospherics.cs lowerBound: !type:AlarmThresholdSetting - threshold: 20 # as defined in Atmospherics.cs + # Actual low pressure damage threshold is at 20 kPa, but below ~85 kPa you can't breathe due to lack of oxygen. + threshold: 20 upperWarnAround: !type:AlarmThresholdSetting - threshold: 0.7 + threshold: 0.7 # 385 kPa, WarningHighPressure from Atmospherics.cs lowerWarnAround: !type:AlarmThresholdSetting - threshold: 2.5 + threshold: 1.05 # ~90 kPa # a reminder that all of these are percentages (where 1 is 100%), # so 0.01 is 1%, diff --git a/Resources/Prototypes/Body/Organs/dwarf.yml b/Resources/Prototypes/Body/Organs/dwarf.yml index 8da0cb1666..497bc190cd 100644 --- a/Resources/Prototypes/Body/Organs/dwarf.yml +++ b/Resources/Prototypes/Body/Organs/dwarf.yml @@ -1,4 +1,4 @@ -- type: entity +- type: entity id: OrganDwarfHeart parent: OrganHumanHeart name: dwarf heart @@ -12,7 +12,7 @@ name: dwarf liver components: - type: Metabolizer - metabolizerTypes: [Dwarf] + metabolizerTypes: [Dwarf, LiquorLifeline] - type: entity id: OrganDwarfStomach diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml b/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml index 93c60e4caa..7062b2eb15 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: 4500 + cost: 1500 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 2c4c27137f..bc8f73d618 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml @@ -1,116 +1,25 @@ - type: vendingMachineInventory id: ClothesMateInventory startingInventory: - ClothingBackpack: 5 - ClothingBackpackDuffel: 5 - ClothingBackpackSatchel: 3 + # STOP! ADD NOTHING TO THIS! GO PUT YOUR CLOTHES IN LOADOUTS INSTEAD! + ClothingBackpack: 2 + ClothingBackpackDuffel: 2 + ClothingBackpackSatchel: 2 ClothingBackpackSatchelLeather: 2 - ClothingRandomSpawner: 8 - ClothingHeadHatBeret: 4 + ClothingRandomSpawner: 6 ClothingHeadBandBlack: 2 - ClothingHeadBandBlue: 2 - ClothingHeadBandGreen: 2 - ClothingHeadBandRed: 2 - ClothingHeadBandSkull: 2 - ClothingHeadHatGreyFlatcap: 3 - ClothingHeadHatBrownFlatcap: 3 - ClothingUniformJumpsuitColorGrey: 8 - ClothingUniformJumpskirtColorGrey: 8 - ClothingUniformJumpsuitColorWhite: 3 - ClothingUniformJumpskirtColorWhite: 3 - ClothingUniformJumpsuitColorBlack: 3 - ClothingUniformJumpskirtColorBlack: 3 - ClothingUniformJumpsuitColorBlue: 2 - ClothingUniformJumpskirtColorBlue: 2 - ClothingUniformJumpsuitColorYellow: 2 - ClothingUniformJumpskirtColorYellow: 2 - ClothingUniformJumpsuitColorGreen: 2 - ClothingUniformJumpskirtColorGreen: 2 - ClothingUniformJumpsuitColorOrange: 2 - ClothingUniformJumpskirtColorOrange: 2 - ClothingUniformJumpsuitColorRed: 2 - ClothingUniformJumpskirtColorRed: 2 - ClothingUniformJumpsuitColorPurple: 2 - ClothingUniformJumpskirtColorPurple: 2 - ClothingUniformJumpsuitColorPink: 2 - ClothingUniformJumpskirtColorPink: 2 - ClothingUniformJumpsuitColorDarkBlue: 2 - ClothingUniformJumpskirtColorDarkBlue: 2 - ClothingUniformJumpsuitColorDarkGreen: 2 - ClothingUniformJumpskirtColorDarkGreen: 2 - ClothingUniformJumpsuitColorTeal: 2 - ClothingUniformJumpskirtColorTeal: 2 - ClothingUniformJumpsuitHawaiBlack: 2 - ClothingUniformJumpsuitHawaiBlue: 2 - ClothingUniformJumpsuitHawaiRed: 2 - ClothingUniformJumpsuitHawaiYellow: 2 - ClothingUniformJumpsuitFlannel: 2 - ClothingUniformJumpsuitCasualBlue: 2 - ClothingUniformJumpskirtCasualBlue: 2 - ClothingUniformJumpsuitCasualPurple: 2 - ClothingUniformJumpskirtCasualPurple: 2 - ClothingUniformJumpsuitCasualRed: 2 - ClothingUniformJumpskirtCasualRed: 2 - ClothingUniformJumpsuitTshirtJeans: 2 # Nyano - Clothing addition - ClothingUniformJumpsuitTshirtJeansGray: 2 # Nyano - Clothing addition - ClothingUniformJumpsuitTshirtJeansPeach: 2 # Nyano - Clothing addition - ClothingUniformJumpsuitJeansGreen: 2 # Nyano - Clothing addition - ClothingUniformJumpsuitJeansRed: 2 # Nyano - Clothing addition - ClothingUniformJumpsuitJeansBrown: 2 # Nyano - Clothing addition - ClothingUniformJumpsuitLostTourist: 2 # Nyano - Clothing addition - ClothingShoesColorBlack: 8 - ClothingShoesColorBrown: 4 - ClothingShoesColorWhite: 3 - ClothingShoesColorBlue: 2 - ClothingShoesColorYellow: 2 - ClothingShoesColorGreen: 2 - ClothingShoesColorOrange: 2 - ClothingShoesColorRed: 2 - ClothingShoesColorPurple: 2 - ClothingHeadHatGreysoft: 8 - ClothingHeadHatMimesoft: 3 - ClothingHeadHatBluesoft: 2 - ClothingHeadHatYellowsoft: 2 - ClothingHeadHatGreensoft: 2 - ClothingHeadHatOrangesoft: 2 - ClothingHeadHatRedsoft: 2 - ClothingHeadHatBlacksoft: 2 - ClothingHeadHatPurplesoft: 2 + ClothingHeadHatGreyFlatcap: 2 + ClothingUniformJumpsuitColorGrey: 2 + ClothingUniformJumpskirtColorGrey: 2 + ClothingShoesColorBlack: 4 + ClothingHeadHatGreysoft: 2 ClothingHeadHatCorpsoft: 2 - ClothingOuterWinterCoat: 2 # Nyano - Clothing addition - ClothingOuterWinterCoatLong: 2 # Nyano - Clothing addition - ClothingOuterWinterCoatPlaid: 2 # Nyano - Clothing addition - ClothingOuterCoatHyenhSweater: 2 # Nyano - Clothing addition - ClothingOuterCoatLettermanBlue: 2 # Nyano - Clothing addition - 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 - 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 - ClothingHeadRastaHat: 2 + ClothingOuterWinterCoat: 2 + ClothingOuterCorporateJacket: 2 ClothingBeltStorageWaistbag: 3 ClothingEyesGlasses: 6 ClothingHandsGlovesColorBlack: 4 - ClothingHandsGlovesColorGray: 4 - ClothingHandsGlovesColorBrown: 2 - ClothingHandsGlovesColorWhite: 2 - ClothingHandsGlovesColorRed: 2 - ClothingHandsGlovesColorBlue: 2 - ClothingHandsGlovesColorGreen: 2 - ClothingHandsGlovesColorOrange: 2 - ClothingHandsGlovesColorPurple: 2 - ClothingEyesGlassesCheapSunglasses: 3 + ClothingEyesGlassesCheapSunglasses: 2 contrabandInventory: ClothingMaskNeckGaiter: 2 ClothingUniformJumpsuitTacticool: 1 diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/sec.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/sec.yml index c071305b77..01b58ae40f 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/sec.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/sec.yml @@ -14,6 +14,7 @@ ClothingEyesHudSecurity: 2 ClothingEyesEyepatchHudSecurity: 2 ClothingBeltSecurityWebbing: 5 + CombatKnife: 3 Zipties: 12 RiotShield: 2 RiotLaserShield: 2 @@ -21,8 +22,9 @@ ClothingHeadHelmetInsulated: 2 # Nyanotrasen - Insulative headgear ClothingHeadCage: 2 # Nyanotrasen - Insulative headgear ClothingOuterArmorPlateCarrier: 2 # DeltaV - moved body armour from SecDrobe to SecTech - ClothingOuterArmorDuraVest: 2 + ClothingOuterArmorDuraVest: 2 ClothingHeadHelmetBasic: 2 # DeltaV - added helmets to the SecTech. Another line of defense between the tide and your grey matter. + BreachingCharge: 8 # security officers need to follow a diet regimen! contrabandInventory: FoodDonutHomer: 12 diff --git a/Resources/Prototypes/Chemistry/metabolizer_types.yml b/Resources/Prototypes/Chemistry/metabolizer_types.yml index 4d48dab992..316b8f02b5 100644 --- a/Resources/Prototypes/Chemistry/metabolizer_types.yml +++ b/Resources/Prototypes/Chemistry/metabolizer_types.yml @@ -48,3 +48,7 @@ - type: metabolizerType id: Vampiric name: vampiric + +- type: metabolizerType + id: LiquorLifeline + name: liquorlifeline diff --git a/Resources/Prototypes/DeltaV/Access/justice.yml b/Resources/Prototypes/DeltaV/Access/justice.yml new file mode 100644 index 0000000000..33a2844ed2 --- /dev/null +++ b/Resources/Prototypes/DeltaV/Access/justice.yml @@ -0,0 +1,20 @@ +- type: accessLevel + id: ChiefJustice + name: id-card-access-level-cj + +- type: accessLevel + id: Justice + name: id-card-access-level-justice + +- type: accessLevel + id: Prosecutor + name: id-card-access-level-prosecutor + +- type: accessGroup + id: Justice + tags: + - Justice + - Prosecutor + - ChiefJustice + - Lawyer + diff --git a/Resources/Prototypes/DeltaV/Access/misc.yml b/Resources/Prototypes/DeltaV/Access/misc.yml index df3f60a4f8..ad42935662 100644 --- a/Resources/Prototypes/DeltaV/Access/misc.yml +++ b/Resources/Prototypes/DeltaV/Access/misc.yml @@ -47,3 +47,6 @@ - Musician - Reporter - Zookeeper + - Justice + - Prosecutor + diff --git a/Resources/Prototypes/DeltaV/Catalog/Fills/Boxes/general.yml b/Resources/Prototypes/DeltaV/Catalog/Fills/Boxes/general.yml index 804a4727ee..0fa57aa880 100644 --- a/Resources/Prototypes/DeltaV/Catalog/Fills/Boxes/general.yml +++ b/Resources/Prototypes/DeltaV/Catalog/Fills/Boxes/general.yml @@ -16,3 +16,29 @@ whitelist: components: - EncryptionKey + +- type: entity + name: justice encryption key box + parent: BoxEncryptionKeyPassenger + id: BoxEncryptionKeyJustice + description: A box of spare encryption keys. + components: + - type: StorageFill + contents: + - id: EncryptionKeyJustice + amount: 4 + +#- type: entity +# name: syndicate radio implanter box +# parent: BoxCardboard +# id: BoxSyndicateRadioImplanter +# description: Contains cranial radio implants favored by Syndicate agents. +# components: +# - type: Sprite +# layers: +# - state: box_of_doom +# - state: implant +# - type: StorageFill +# contents: +# - id: SyndicateRadioImplanter +# amount: 2 diff --git a/Resources/Prototypes/DeltaV/Catalog/Fills/Boxes/pda.yml b/Resources/Prototypes/DeltaV/Catalog/Fills/Boxes/pda.yml index b6140daae5..b8aff63ece 100644 --- a/Resources/Prototypes/DeltaV/Catalog/Fills/Boxes/pda.yml +++ b/Resources/Prototypes/DeltaV/Catalog/Fills/Boxes/pda.yml @@ -74,3 +74,16 @@ amount: 1 - id: MailCarrierPDA amount: 1 + +- type: entity + name: justice PDA box + parent: BoxPDA + id: BoxPDAJustice + description: A box of spare PDA microcomputers for the justice department. + components: + - type: StorageFill + contents: + - id: LawyerPDA + amount: 2 + - id: ProsecutorPDA + - id: ClerkPDA diff --git a/Resources/Prototypes/DeltaV/Catalog/Fills/Lockers/chiefjustice.yml b/Resources/Prototypes/DeltaV/Catalog/Fills/Lockers/chiefjustice.yml new file mode 100644 index 0000000000..0f7eb99d45 --- /dev/null +++ b/Resources/Prototypes/DeltaV/Catalog/Fills/Lockers/chiefjustice.yml @@ -0,0 +1,21 @@ +- type: entity + parent: LockerChiefJustice + id: LockerChiefJusticeFilled + suffix: Filled + components: + - type: StorageFill + contents: + - id: ClothingHeadsetAltJustice + - id: ClothingNeckCloakCJ + - id: ClothingUniformJumpsuitChiefJusticeFormal + - id: ClothingUniformJumpsuitChiefJusticeWhite + - id: PaperStationWarrant + amount: 10 + - id: BoxPDAJustice + - id: BoxEncryptionKeyJustice + - id: ChiefJusticeIDCard + - id: DoorRemoteJustice + - id: Gavel + - id: RubberStampChiefJustice + - id: LunchboxCommandFilledRandom # Delta-V Lunchboxes! + prob: 0.3 diff --git a/Resources/Prototypes/DeltaV/Catalog/Fills/Lockers/clerk.yml b/Resources/Prototypes/DeltaV/Catalog/Fills/Lockers/clerk.yml new file mode 100644 index 0000000000..9e48c28c70 --- /dev/null +++ b/Resources/Prototypes/DeltaV/Catalog/Fills/Lockers/clerk.yml @@ -0,0 +1,14 @@ +- type: entity + parent: LockerClerk + id: LockerClerkFilled + suffix: Filled + components: + - type: StorageFill + contents: + - id: ClothingOuterClerkVest + - id: PaperStationWarrant + amount: 10 + - id: BoxEncryptionKeyJustice + - id: ClerkIDCard + - id: RubberStampNotary + diff --git a/Resources/Prototypes/DeltaV/Device/devicenet_frequencies.yml b/Resources/Prototypes/DeltaV/Device/devicenet_frequencies.yml new file mode 100644 index 0000000000..34f213077c --- /dev/null +++ b/Resources/Prototypes/DeltaV/Device/devicenet_frequencies.yml @@ -0,0 +1,5 @@ +- type: deviceFrequency + id: SurveillanceCameraJustice + name: device-frequency-prototype-name-surveillance-camera-justice + frequency: 1420 + diff --git a/Resources/Prototypes/DeltaV/Entities/Clothing/Ears/headsets.yml b/Resources/Prototypes/DeltaV/Entities/Clothing/Ears/headsets.yml index c65dd62312..b32cab7b21 100644 --- a/Resources/Prototypes/DeltaV/Entities/Clothing/Ears/headsets.yml +++ b/Resources/Prototypes/DeltaV/Entities/Clothing/Ears/headsets.yml @@ -42,6 +42,45 @@ sprite: DeltaV/Clothing/Ears/Headsets/syndicate_listening.rsi - type: Clothing sprite: DeltaV/Clothing/Ears/Headsets/syndicate_listening.rsi + +- type: entity + parent: ClothingHeadset + id: ClothingHeadsetJustice + name: justice headset + description: This is used by the justice department. + components: + - type: ContainerFill + containers: + key_slots: + - EncryptionKeyJustice + - EncryptionKeyPrison + - EncryptionKeySecurity + - EncryptionKeyCommon + - type: Sprite + sprite: DeltaV/Clothing/Ears/Headsets/justice.rsi + state: icon + - type: Clothing + sprite: DeltaV/Clothing/Ears/Headsets/justice.rsi + +- type: entity + parent: ClothingHeadset + id: ClothingHeadsetAltJustice + name: chief justice's headset + description: The headset used by the chief justice. + components: + - type: ContainerFill + containers: + key_slots: + - EncryptionKeyJustice + - EncryptionKeyPrison + - EncryptionKeySecurity + - EncryptionKeyCommon + - EncryptionKeyCommand + - type: Sprite + sprite: DeltaV/Clothing/Ears/Headsets/justice.rsi + state: icon_alt + - type: Clothing + sprite: DeltaV/Clothing/Ears/Headsets/justice.rsi - type: entity parent: ClothingHeadset @@ -75,3 +114,4 @@ sprite: Clothing/Ears/Headsets/security.rsi - type: Clothing sprite: Clothing/Ears/Headsets/security.rsi + diff --git a/Resources/Prototypes/DeltaV/Entities/Clothing/Head/hats.yml b/Resources/Prototypes/DeltaV/Entities/Clothing/Head/hats.yml index 1c5cef39af..bdb5ad85d9 100644 --- a/Resources/Prototypes/DeltaV/Entities/Clothing/Head/hats.yml +++ b/Resources/Prototypes/DeltaV/Entities/Clothing/Head/hats.yml @@ -192,3 +192,15 @@ sprite: DeltaV/Clothing/Head/Hats/beret_corpsman.rsi - type: Clothing sprite: DeltaV/Clothing/Head/Hats/beret_corpsman.rsi + +- type: entity + parent: ClothingHeadBase + id: ClothingHeadHatCJToque + name: chief justice's toque + description: A standard-issue judicial hat. Wigs are old-fashioned anyway. + components: + - type: Sprite + sprite: DeltaV/Clothing/Head/Hats/cj_toque.rsi + - type: Clothing + sprite: DeltaV/Clothing/Head/Hats/cj_toque.rsi + diff --git a/Resources/Prototypes/DeltaV/Entities/Clothing/Neck/cloaks.yml b/Resources/Prototypes/DeltaV/Entities/Clothing/Neck/cloaks.yml index 5ff195cfda..a5a9200b56 100644 --- a/Resources/Prototypes/DeltaV/Entities/Clothing/Neck/cloaks.yml +++ b/Resources/Prototypes/DeltaV/Entities/Clothing/Neck/cloaks.yml @@ -31,3 +31,15 @@ sprite: DeltaV/Clothing/Neck/Cloaks/salvage.rsi - type: Clothing sprite: DeltaV/Clothing/Neck/Cloaks/salvage.rsi + +- type: entity + parent: ClothingNeckBase + id: ClothingNeckCloakCJ + name: chief justice's cloak + description: A hefty cloak adorned with a modest insignia and grand fur trim. + components: + - type: Sprite + sprite: DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi + - type: StealTarget + stealGroup: HeadCloak + diff --git a/Resources/Prototypes/DeltaV/Entities/Clothing/Neck/misc.yml b/Resources/Prototypes/DeltaV/Entities/Clothing/Neck/misc.yml new file mode 100644 index 0000000000..7ec38bb144 --- /dev/null +++ b/Resources/Prototypes/DeltaV/Entities/Clothing/Neck/misc.yml @@ -0,0 +1,13 @@ +- type: entity + parent: ClothingNeckBase + id: ClothingNeckProsecutorbadge + name: prosecutor badge + description: A badge to show that the owner is a 'legitimate' prosecutor who passed the NT bar exam required to practice law. + components: + - type: Sprite + sprite: DeltaV/Clothing/Neck/Misc/prosecutorbadge.rsi + - type: Clothing + sprite: DeltaV/Clothing/Neck/Misc/prosecutorbadge.rsi + - type: TypingIndicatorClothing + proto: lawyer + diff --git a/Resources/Prototypes/DeltaV/Entities/Clothing/OuterClothing/coats.yml b/Resources/Prototypes/DeltaV/Entities/Clothing/OuterClothing/coats.yml index e0a38b169f..e0f3e7f298 100644 --- a/Resources/Prototypes/DeltaV/Entities/Clothing/OuterClothing/coats.yml +++ b/Resources/Prototypes/DeltaV/Entities/Clothing/OuterClothing/coats.yml @@ -123,3 +123,17 @@ sprite: DeltaV/Clothing/OuterClothing/Coats/repcoat.rsi - type: TemperatureProtection coefficient: 0.1 + +- type: entity + parent: ClothingOuterStorageBase + id: ClothingOuterChiefJustice + name: chief justice's robes + description: Heavy black robes with magenta and gold trim. It smells old. + components: + - type: Sprite + sprite: DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi + - type: Clothing + sprite: DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi + - type: TemperatureProtection + coefficient: 0.1 + diff --git a/Resources/Prototypes/DeltaV/Entities/Clothing/OuterClothing/vests.yml b/Resources/Prototypes/DeltaV/Entities/Clothing/OuterClothing/vests.yml index cdc7958407..445158f89b 100644 --- a/Resources/Prototypes/DeltaV/Entities/Clothing/OuterClothing/vests.yml +++ b/Resources/Prototypes/DeltaV/Entities/Clothing/OuterClothing/vests.yml @@ -37,3 +37,15 @@ Heat: 0.9 - type: ExplosionResistance damageCoefficient: 0.9 + +- type: entity + parent: ClothingOuterBase + id: ClothingOuterClerkVest + name: clerk's vest + description: a silken magenta vest with a pocket to put your notary stamp. + components: + - type: Sprite + sprite: DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi + - type: Clothing + sprite: DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi + diff --git a/Resources/Prototypes/DeltaV/Entities/Clothing/Uniforms/jumpskirts.yml b/Resources/Prototypes/DeltaV/Entities/Clothing/Uniforms/jumpskirts.yml index 4c02763764..9e80bc4ff2 100644 --- a/Resources/Prototypes/DeltaV/Entities/Clothing/Uniforms/jumpskirts.yml +++ b/Resources/Prototypes/DeltaV/Entities/Clothing/Uniforms/jumpskirts.yml @@ -93,3 +93,37 @@ sprite: DeltaV/Clothing/Uniforms/Jumpskirt/centcom_officer.rsi - type: Clothing sprite: DeltaV/Clothing/Uniforms/Jumpskirt/centcom_officer.rsi + +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpskirtChiefJustice + name: chief justice's jumpskirt + description: A fancy black jumpskirt with a lace cravat to make it even more fancy. Proper judicial attire. + components: + - type: Sprite + sprite: DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi + - type: Clothing + sprite: DeltaV/Clothing/Uniform/Jumpskirt/cj.rsi + +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpskirtClerk + name: clerk's dress skirt + description: A modest dress skirt for the person with the power to notarize anything. + components: + - type: Sprite + sprite: DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi + - type: Clothing + sprite: DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi + +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpskirtProsecutor + name: prosecutor's dress skirt + description: A red suit and skirt with a fancy cravat. Perfect for a prosecutor. + components: + - type: Sprite + sprite: DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi + - type: Clothing + sprite: DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi + diff --git a/Resources/Prototypes/DeltaV/Entities/Clothing/Uniforms/jumpsuits.yml b/Resources/Prototypes/DeltaV/Entities/Clothing/Uniforms/jumpsuits.yml index 8a0a500e6f..9382502e74 100644 --- a/Resources/Prototypes/DeltaV/Entities/Clothing/Uniforms/jumpsuits.yml +++ b/Resources/Prototypes/DeltaV/Entities/Clothing/Uniforms/jumpsuits.yml @@ -244,6 +244,50 @@ - type: Clothing sprite: DeltaV/Clothing/Uniforms/Jumpsuit/kilt.rsi +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpsuitChiefJustice + name: chief justice's jumpsuit + description: A fancy black jumpsuit with a lace cravat to make it even more fancy. Proper judicial attire. + components: + - type: Sprite + sprite: DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi + - type: Clothing + sprite: DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi + +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpsuitChiefJusticeFormal + name: chief justice's formal jumpsuit + description: A fancy double-breasted suit with golden accoutrements. Sharp and authoritative. + components: + - type: Sprite + sprite: DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi + - type: Clothing + sprite: DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi + +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpsuitChiefJusticeWhite + name: chief justice's white jumpsuit + description: A modest, white office shirt with hard-earned rank epaulets. + components: + - type: Sprite + sprite: DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi + - type: Clothing + sprite: DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi + +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpsuitClerk + name: clerk's suit + description: A modest suit for the person with the power to notarize anything. + components: + - type: Sprite + sprite: DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi + - type: Clothing + sprite: DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi + - type: entity parent: ClothingUniformBase id: ClothingUniformJumpsuitChemShirt @@ -254,3 +298,15 @@ sprite: DeltaV/Clothing/Uniforms/Jumpsuit/chemshirtsuit.rsi - type: Clothing sprite: DeltaV/Clothing/Uniforms/Jumpsuit/chemshirtsuit.rsi + +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpsuitProsecutor + name: prosecutor's suit + description: A red suit with a fancy cravat. Perfect for a prosecutor. + components: + - type: Sprite + sprite: DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi + - type: Clothing + sprite: DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi + diff --git a/Resources/Prototypes/DeltaV/Entities/Markers/Spawners/jobs.yml b/Resources/Prototypes/DeltaV/Entities/Markers/Spawners/jobs.yml index e662ecca74..12747abbcf 100644 --- a/Resources/Prototypes/DeltaV/Entities/Markers/Spawners/jobs.yml +++ b/Resources/Prototypes/DeltaV/Entities/Markers/Spawners/jobs.yml @@ -13,3 +13,55 @@ state: medical - sprite: Mobs/Silicon/chassis.rsi state: medical_e + +- type: entity + id: SpawnPointChiefJustice + parent: SpawnPointJobBase + name: chiefjustice + components: + - type: SpawnPoint + job_id: ChiefJustice + - type: Sprite + layers: + - state: green + - sprite: DeltaV/Markers/jobs.rsi + state: chiefjustice + +- type: entity + id: SpawnPointClerk + parent: SpawnPointJobBase + name: clerk + components: + - type: SpawnPoint + job_id: Clerk + - type: Sprite + layers: + - state: green + - sprite: DeltaV/Markers/jobs.rsi + state: clerk + +- type: entity + id: SpawnPointProsecutor + parent: SpawnPointJobBase + name: prosecutor + components: + - type: SpawnPoint + job_id: Prosecutor + - type: Sprite + layers: + - state: green + - sprite: DeltaV/Markers/jobs.rsi + state: prosecutor + +- type: entity + id: SpawnPointCourier + parent: SpawnPointJobBase + name: courier + components: + - type: SpawnPoint + job_id: Courier + - type: Sprite + layers: + - state: green + - sprite: DeltaV/Markers/jobs.rsi + state: courier diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Player/vulpkanin.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Player/vulpkanin.yml index ea2357a5c0..d5dbb5f7ee 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Player/vulpkanin.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Player/vulpkanin.yml @@ -5,11 +5,6 @@ id: MobVulpkanin components: - type: CombatMode - - type: InteractionPopup - successChance: 1 - interactSuccessString: hugging-success-generic - interactSuccessSound: /Audio/Effects/thudswoosh.ogg - messagePerceivedByOthers: hugging-success-generic-others - type: MindContainer showExamineInfo: true - type: Input diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml index eb8d0f03f0..49951d7842 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml @@ -61,6 +61,7 @@ noRot: true drawdepth: Mobs scale: 1, 1 + offset: 0, 0.4 layers: #TODO: manually fix these layers - map: [ "enum.HumanoidVisualLayers.Chest" ] color: "#e8b59b" @@ -196,6 +197,7 @@ - MobLayer - type: SegmentedEntity numberOfSegments: 18 + texturePath: /Textures/Nyanotrasen/Mobs/Species/lamia.rsi/segment.png - type: Speech speechSounds: Alto - type: Vocal diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Devices/door_remote.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Devices/door_remote.yml new file mode 100644 index 0000000000..27fa0a3653 --- /dev/null +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Devices/door_remote.yml @@ -0,0 +1,15 @@ +- type: entity + parent: DoorRemoteDefault + id: DoorRemoteJustice + name: justice door remote + components: + - type: Sprite + layers: + - state: door_remotebase + - state: door_remotelightscolour + color: "#6b2833" + - state: door_remotescreencolour + color: "#6b2833" + - type: Access + groups: + - Justice diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Devices/encryption_keys.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Devices/encryption_keys.yml index c41c235c13..67b723e431 100644 --- a/Resources/Prototypes/DeltaV/Entities/Objects/Devices/encryption_keys.yml +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Devices/encryption_keys.yml @@ -1,3 +1,19 @@ +- type: entity + parent: EncryptionKey + id: EncryptionKeyJustice + name: justice encryption key + description: An encryption key used by the justice department. + components: + - type: EncryptionKey + channels: + - Justice + defaultChannel: Justice + - type: Sprite + layers: + - state: crypt_gray + - sprite: DeltaV/Objects/Devices/encryption_keys.rsi + state: justice_label + - type: entity parent: EncryptionKey id: EncryptionKeyPrison diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Devices/pda.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Devices/pda.yml index d9607390cd..d5f121bb0b 100644 --- a/Resources/Prototypes/DeltaV/Entities/Objects/Devices/pda.yml +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Devices/pda.yml @@ -41,6 +41,123 @@ scanningEndSound: path: "/Audio/Items/Medical/healthscanner.ogg" +- type: entity + parent: BasePDA + id: ChiefJusticePDA + name: chief justice PDA + description: Whosoever bears this PDA is the law. + components: + - type: Sprite + sprite: DeltaV/Objects/Devices/pda.rsi + layers: + - map: [ "enum.PdaVisualLayers.Base" ] + - state: "light_overlay" + map: [ "enum.PdaVisualLayers.Flashlight" ] + shader: "unshaded" + visible: false + - state: "id_overlay" + map: [ "enum.PdaVisualLayers.IdLight" ] + shader: "unshaded" + visible: false + - type: Pda + id: ChiefJusticeIDCard + state: pda-chiefjustice + penSlot: + startingItem: LuxuryPen + priority: -1 + whitelist: + tags: + - Write + - type: PdaBorderColor + borderColor: "#470823" + - type: Icon + sprite: DeltaV/Objects/Devices/pda.rsi + state: pda-chiefjustice + - type: CartridgeLoader + preinstalled: + - CrewManifestCartridge + - NotekeeperCartridge + - NewsReaderCartridge + - CrimeAssistCartridge + +- type: entity + parent: BasePDA + id: ClerkPDA + name: clerk PDA + description: It has the stamp to prove it's been officially notarized! + components: + - type: Sprite + sprite: DeltaV/Objects/Devices/pda.rsi + layers: + - map: [ "enum.PdaVisualLayers.Base" ] + - state: "light_overlay" + map: [ "enum.PdaVisualLayers.Flashlight" ] + shader: "unshaded" + visible: false + - state: "id_overlay" + map: [ "enum.PdaVisualLayers.IdLight" ] + shader: "unshaded" + visible: false + - type: Pda + id: ClerkIDCard + state: pda-clerk + penSlot: + startingItem: LuxuryPen + priority: -1 + whitelist: + tags: + - Write + - type: PdaBorderColor + borderColor: "#611528" + - type: Icon + sprite: DeltaV/Objects/Devices/pda.rsi + state: pda-clerk + - type: CartridgeLoader + preinstalled: + - CrewManifestCartridge + - NotekeeperCartridge + - NewsReaderCartridge + - CrimeAssistCartridge + +- type: entity + parent: BasePDA + id: ProsecutorPDA + name: prosecutor PDA + description: Sharp. Looks like it could prosecute you all on its own. + components: + - type: Sprite + sprite: DeltaV/Objects/Devices/pda.rsi + layers: + - map: [ "enum.PdaVisualLayers.Base" ] + - state: "light_overlay" + map: [ "enum.PdaVisualLayers.Flashlight" ] + shader: "unshaded" + visible: false + - state: "id_overlay" + map: [ "enum.PdaVisualLayers.IdLight" ] + shader: "unshaded" + visible: false + - type: Pda + id: ProsecutorIDCard + state: pda-prosecutor + penSlot: + startingItem: LuxuryPen + priority: -1 + whitelist: + tags: + - Write + - type: PdaBorderColor + borderColor: "#6f6192" + - type: Icon + sprite: DeltaV/Objects/Devices/pda.rsi + state: pda-prosecutor + - type: CartridgeLoader # DeltaV - Crime Assist + preinstalled: + - CrewManifestCartridge + - NotekeeperCartridge + - NewsReaderCartridge + - CrimeAssistCartridge + - type: entity parent: SyndiPDA id: SyndiListeningPostPDA diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Devices/station_beacon.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Devices/station_beacon.yml index d1e26bf27f..bd3975767b 100644 --- a/Resources/Prototypes/DeltaV/Entities/Objects/Devices/station_beacon.yml +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Devices/station_beacon.yml @@ -134,3 +134,28 @@ components: - type: NavMapBeacon text: station-beacon-corpsman + +#Justice +- type: entity + parent: DefaultStationBeacon + id: DefaultStationBeaconJustice + suffix: Justice + components: + - type: NavMapBeacon + text: station-beacon-justice + +- type: entity + parent: DefaultStationBeaconJustice + id: DefaultStationBeaconChiefJustice + suffix: Chief Justice + components: + - type: NavMapBeacon + text: station-beacon-chiefjustice + +- type: entity + parent: DefaultStationBeaconJustice + id: DefaultStationBeaconProsecutor + suffix: Prosecutor + components: + - type: NavMapBeacon + text: station-beacon-prosecutor diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Misc/paper.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Misc/paper.yml new file mode 100644 index 0000000000..53f4d188d4 --- /dev/null +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Misc/paper.yml @@ -0,0 +1,25 @@ +- type: entity + name: station warrant + parent: Paper + id: PaperStationWarrant + description: 'A paper warrant issued by the justice department.' + components: + - type: Sprite + sprite: Objects/Misc/bureaucracy.rsi + layers: + - state: paper + color: "#e0bc99" + - state: paper_words + map: ["enum.PaperVisualLayers.Writing"] + color: "#e0bc99" + visible: false + - state: paper_stamp-generic + map: ["enum.PaperVisualLayers.Stamp"] + visible: false + - type: PaperVisuals + headerImagePath: "/Textures/DeltaV/Interface/Paper/paper_heading_warrant.svg.200dpi.png" + headerMargin: 0.0, 0.0, 10.0, 16.0 + backgroundImagePath: "/Textures/Interface/Paper/paper_background_default.svg.96dpi.png" + backgroundModulate: "#e0bc99" + backgroundPatchMargin: 16.0, 16.0, 16.0, 16.0 + contentMargin: 32.0, 16.0, 32.0, 0.0 diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Misc/rubber_stamp.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Misc/rubber_stamp.yml index 2494de534e..764d053393 100644 --- a/Resources/Prototypes/DeltaV/Entities/Objects/Misc/rubber_stamp.yml +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Misc/rubber_stamp.yml @@ -25,3 +25,33 @@ - type: Sprite sprite: DeltaV/Objects/Misc/stamps.rsi state: stamp-lawyer + +- type: entity + name: notary stamp + parent: RubberStampBase + id: RubberStampNotary + description: An old-fashioned seal for marking important documents, made of polished bronze. + components: + - type: Stamp + stampedName: stamp-component-stamped-name-notary + stampedColor: "#a81f3d" + stampState: "paper_stamp-notary" + - type: Sprite + sprite: DeltaV/Objects/Misc/stamps.rsi + state: stamp-notary + - type: StealTarget + stealGroup: RubberStampNotary + +- type: entity + name: chief justice stamp + parent: RubberStampBase + id: RubberStampChiefJustice + components: + - type: Stamp + stampedName: stamp-component-stamped-name-chiefjustice + stampedColor: "#6b2833" + stampState: "paper_stamp-notary" + - type: Sprite + sprite: DeltaV/Objects/Misc/stamps.rsi + state: stamp-cj + diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Justice/gavel.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Justice/gavel.yml new file mode 100644 index 0000000000..52f5286e34 --- /dev/null +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Justice/gavel.yml @@ -0,0 +1,21 @@ +- type: entity + parent: BaseItem + id: Gavel + name: gavel + description: A hardwood mallet made to keep order in the court. + components: + - type: Sprite + sprite: DeltaV/Objects/Specific/Justice/gavel.rsi + layers: + - state: icon + - type: MeleeWeapon + wideAnimationRotation: -90 + damage: + types: + Blunt: 2 + - type: Item + size: Small + sprite: DeltaV/Objects/Specific/Justice/gavel.rsi + - type: Tag + tags: + - Gavel diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Justice/gavelblock.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Justice/gavelblock.yml new file mode 100644 index 0000000000..a74ae7a9ff --- /dev/null +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Justice/gavelblock.yml @@ -0,0 +1,19 @@ +- type: entity + parent: BaseItem + id: GavelBlock + name: gavel block + description: A hardwood block that, when hit with a gavel, emits an aura of authority. + components: + - type: Sprite + sprite: DeltaV/Objects/Specific/Justice/gavelblock.rsi + layers: + - state: icon + - type: Item + size: Small + - type: Clickable + - type: EmitSoundOnInteractUsing + sound: + path: /Audio/DeltaV/Items/gavel.ogg + whitelist: + tags: + - Gavel diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Justice/trialtimer.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Justice/trialtimer.yml new file mode 100644 index 0000000000..3e847b3a84 --- /dev/null +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Justice/trialtimer.yml @@ -0,0 +1,24 @@ +- type: entity + id: TrialTimer + parent: SignalTimer + name: trial timer + description: A fancy timer with a screen, designed to keep trials within their time limit. + components: + - type: SignalTimer + canEditLabel: true + - type: TextScreenVisuals + color: "#b03060" + textOffset: 1,8 + timerOffset: 1,8 + textLength: 5 + rows: 1 + - type: Sprite + drawdepth: SmallObjects + sprite: DeltaV/Objects/Specific/Justice/trialtimer.rsi + state: trialtimer + noRot: true + - type: Construction + graph: Timer + node: screen + + diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml index 0383143c26..f5fad8c21c 100644 --- a/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml @@ -9,7 +9,6 @@ components: - type: Damageable - type: StandingState - - type: Appearance - type: Clickable - type: InteractionOutline - type: PsionicInsulation #Not a brain, target the lamia instead @@ -29,7 +28,6 @@ - MobLayer - type: Transform anchored: false - - type: SegmentedEntitySegmentVisuals - type: Tag tags: - HideContextMenu @@ -45,17 +43,7 @@ description: A tail segment, hopefully attached to a lamia. components: - type: Sprite - sprite: Nyanotrasen/Mobs/Species/lamia.rsi - drawdepth: SmallMobs - layers: - - map: [ "enum.HumanoidVisualLayers.Tail" ] - - map: [ "enum.SegmentedEntitySegmentVisualLayers.Armor" ] - sprite: Clothing/OuterClothing/Hardsuits/basic.rsi - state: segment - visible: false - - type: Clickable - type: Tag tags: + - HideContextMenu - DoorBumpOpener - - type: HumanoidAppearance - species: LamiaSegment diff --git a/Resources/Prototypes/DeltaV/Entities/Structures/Doors/Airlocks/access.yml b/Resources/Prototypes/DeltaV/Entities/Structures/Doors/Airlocks/access.yml index fc9f2902ad..f6e7bcf257 100644 --- a/Resources/Prototypes/DeltaV/Entities/Structures/Doors/Airlocks/access.yml +++ b/Resources/Prototypes/DeltaV/Entities/Structures/Doors/Airlocks/access.yml @@ -15,6 +15,88 @@ - type: AccessReader access: [["Mantis"]] +- type: entity + parent: AirlockCommand + id: AirlockChiefJusticeLocked + suffix: Chief Justice, Locked + components: + - type: ContainerFill + containers: + board: [ DoorElectronicsChiefJustice ] + +- type: entity + parent: AirlockCommandGlass + id: AirlockChiefJusticeGlassLocked + suffix: ChiefJustice, Locked + components: + - type: ContainerFill + containers: + board: [ DoorElectronicsChiefJustice ] + +- type: entity + parent: AirlockJustice + id: AirlockJusticeLocked + suffix: Justice, Locked + components: + - type: ContainerFill + containers: + board: [ DoorElectronicsJustice ] + +- type: entity + parent: AirlockJusticeGlass + id: AirlockJusticeGlassLocked + suffix: Justice, Locked + components: + - type: ContainerFill + containers: + board: [ DoorElectronicsJustice ] + +- type: entity + parent: AirlockJustice + id: AirlockProsecutorLocked + suffix: Prosecutor, Locked + components: + - type: ContainerFill + containers: + board: [ DoorElectronicsProsecutor ] + +- type: entity + parent: AirlockJusticeGlass + id: AirlockProsecutorGlassLocked + suffix: Prosecutor, Locked + components: + - type: ContainerFill + containers: + board: [ DoorElectronicsProsecutor ] + +# Maintenance +- type: entity + parent: AirlockMaint + id: AirlockMaintChiefJusticeLocked + suffix: ChiefJustice, Locked + components: + - type: ContainerFill + containers: + board: [ DoorElectronicsChiefJustice ] + +- type: entity + parent: AirlockMaint + id: AirlockMaintJusticeLocked + suffix: Justice, Locked + components: + - type: ContainerFill + containers: + board: [ DoorElectronicsJustice ] + +- type: entity + parent: AirlockMaint + id: AirlockMaintProsecutorLocked + suffix: Prosecutor, Locked + components: + - type: ContainerFill + containers: + board: [ DoorElectronicsProsecutor ] + - type: entity parent: AirlockSecurity id: AirlockCorpsmanLocked diff --git a/Resources/Prototypes/DeltaV/Entities/Structures/Doors/Airlocks/airlocks.yml b/Resources/Prototypes/DeltaV/Entities/Structures/Doors/Airlocks/airlocks.yml new file mode 100644 index 0000000000..93a8cec851 --- /dev/null +++ b/Resources/Prototypes/DeltaV/Entities/Structures/Doors/Airlocks/airlocks.yml @@ -0,0 +1,22 @@ +- type: entity + parent: Airlock + id: AirlockJustice + suffix: Justice + components: + - type: Sprite + sprite: DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi + - type: PaintableAirlock + department: Justice + +# Glass + +- type: entity + parent: AirlockGlass + id: AirlockJusticeGlass + suffix: Justice + components: + - type: Sprite + sprite: DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi + - type: PaintableAirlock + department: Justice + diff --git a/Resources/Prototypes/DeltaV/Entities/Structures/Doors/Windoors/windoor.yml b/Resources/Prototypes/DeltaV/Entities/Structures/Doors/Windoors/windoor.yml index d27a8d8e70..07938a3bf3 100644 --- a/Resources/Prototypes/DeltaV/Entities/Structures/Doors/Windoors/windoor.yml +++ b/Resources/Prototypes/DeltaV/Entities/Structures/Doors/Windoors/windoor.yml @@ -21,3 +21,39 @@ components: - type: AccessReader access: [["Paramedic"]] + +- type: entity + parent: WindoorSecure + id: WindoorSecureChiefJusticeLocked + suffix: ChiefJustice, Locked + components: + - type: ContainerFill + containers: + board: [ DoorElectronicsChiefJustice ] + +- type: entity + parent: WindoorSecure + id: WindoorSecureJusticeLocked + suffix: Justice, Locked + components: + - type: ContainerFill + containers: + board: [ DoorElectronicsJustice ] + +- type: entity + parent: WindoorSecure + id: WindoorSecureProsecutorLocked + suffix: Prosecutor, Locked + components: + - type: ContainerFill + containers: + board: [ DoorElectronicsProsecutor ] + +- type: entity + parent: WindoorSecure + id: WindoorSecureLawyerLocked + suffix: Lawyer, Locked + components: + - type: ContainerFill + containers: + board: [ DoorElectronicsLawyer ] diff --git a/Resources/Prototypes/DeltaV/Entities/Structures/Storage/Closets/Lockers/lockers.yml b/Resources/Prototypes/DeltaV/Entities/Structures/Storage/Closets/Lockers/lockers.yml new file mode 100644 index 0000000000..b49002ab22 --- /dev/null +++ b/Resources/Prototypes/DeltaV/Entities/Structures/Storage/Closets/Lockers/lockers.yml @@ -0,0 +1,25 @@ +- type: entity + id: LockerChiefJustice + parent: LockerBaseSecure + name: chief justice's locker + components: + - type: Appearance + - type: EntityStorageVisuals + stateBaseClosed: cj + stateDoorOpen: cj_open + stateDoorClosed: cj_door + - type: AccessReader + access: [["ChiefJustice"]] + +- type: entity + id: LockerClerk + parent: LockerBaseSecure + name: clerk's locker + components: + - type: Appearance + - type: EntityStorageVisuals + stateBaseClosed: clerk + stateDoorOpen: clerk_open + stateDoorClosed: clerk_door + - type: AccessReader + access: [["Justice"]] diff --git a/Resources/Prototypes/DeltaV/Entities/Structures/Wallmounts/Signs/signs.yml b/Resources/Prototypes/DeltaV/Entities/Structures/Wallmounts/Signs/signs.yml index 6129ff6c41..3b5329e230 100644 --- a/Resources/Prototypes/DeltaV/Entities/Structures/Wallmounts/Signs/signs.yml +++ b/Resources/Prototypes/DeltaV/Entities/Structures/Wallmounts/Signs/signs.yml @@ -17,3 +17,25 @@ - type: Sprite sprite: DeltaV/Structures/Wallmounts/signs.rsi state: direction_mail + +- type: entity + parent: BaseSignDirectional + id: SignDirectionalJustice + name: justice department sign + description: A direction sign, pointing out which way the Justice department is. + components: + - type: Sprite + sprite: DeltaV/Structures/Wallmounts/signs.rsi + state: direction_justice + +- type: entity + parent: BaseSignDirectional + id: SignDirectionaCourt + name: court room sign + description: A direction sign, pointing out which way the court room is. + components: + - type: Sprite + sprite: DeltaV/Structures/Wallmounts/signs.rsi + state: direction_court + + diff --git a/Resources/Prototypes/DeltaV/NPC/roboisseur.yml b/Resources/Prototypes/DeltaV/NPC/roboisseur.yml index 2c0b3aee8a..e7f0b5bcd0 100644 --- a/Resources/Prototypes/DeltaV/NPC/roboisseur.yml +++ b/Resources/Prototypes/DeltaV/NPC/roboisseur.yml @@ -4,12 +4,22 @@ name: Mr. Butlertron description: It asks for food to deliver to exotic customers across the cosmos. Powered by the latest technology in bluespace food delivery. components: + - type: Anchorable + - type: Pullable - type: Sprite noRot: true drawdepth: Mobs sprite: DeltaV/Structures/Machines/roboisseur.rsi layers: - state: roboisseur-1 + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 1000 + behaviors: + - !type:DoActsBehavior + acts: [ "Destruction" ] - type: Roboisseur - type: Speech speechSounds: Pai diff --git a/Resources/Prototypes/DeltaV/Objectives/stealTargetGroups.yml b/Resources/Prototypes/DeltaV/Objectives/stealTargetGroups.yml index cf7d4f90d6..b311330873 100644 --- a/Resources/Prototypes/DeltaV/Objectives/stealTargetGroups.yml +++ b/Resources/Prototypes/DeltaV/Objectives/stealTargetGroups.yml @@ -18,3 +18,12 @@ sprite: sprite: DeltaV/Objects/Weapons/Guns/Battery/multiphase_energygun.rsi state: base + +- type: stealTargetGroup + id: RubberStampNotary + name: notary stamp + sprite: + sprite: DeltaV/Objects/Misc/stamps.rsi + state: stamp-notary + + diff --git a/Resources/Prototypes/DeltaV/Objectives/traitor.yml b/Resources/Prototypes/DeltaV/Objectives/traitor.yml index 4fa25f2698..d27ec220fa 100644 --- a/Resources/Prototypes/DeltaV/Objectives/traitor.yml +++ b/Resources/Prototypes/DeltaV/Objectives/traitor.yml @@ -32,3 +32,16 @@ - type: StealCondition stealGroup: WeaponEnergyGunMultiphase owner: job-name-hos + +- type: entity # Clerk steal objective. + noSpawn: true + parent: BaseTraitorStealObjective + id: ClerkNotaryStealObjective + components: + - type: NotJobRequirement + job: Clerk + - type: StealCondition + stealGroup: RubberStampNotary + owner: job-name-clerk + + diff --git a/Resources/Prototypes/DeltaV/Roles/Jobs/Justice/chief_justice.yml b/Resources/Prototypes/DeltaV/Roles/Jobs/Justice/chief_justice.yml new file mode 100644 index 0000000000..2a879472e8 --- /dev/null +++ b/Resources/Prototypes/DeltaV/Roles/Jobs/Justice/chief_justice.yml @@ -0,0 +1,59 @@ +- type: job + id: ChiefJustice + name: job-name-chief-justice + description: job-description-chief-justice + playTimeTracker: JobChiefJustice + requirements: + - !type:CharacterPlaytimeRequirement + tracker: JobClerk + min: 36000 # 10 hours + - !type:CharacterPlaytimeRequirement + tracker: JobLawyer + min: 36000 # 10 hours + - !type:CharacterPlaytimeRequirement + tracker: JobProsecutor + min: 36000 # 10 hours + - !type:CharacterOverallTimeRequirement + min: 90000 # 25 hours + - !type:WhitelistRequirement # whitelist requirement because I don't want any dingus judges + weight: 20 + startingGear: CJGear + icon: "JobIconChiefJustice" + requireAdminNotify: true + supervisors: job-supervisors-captain + canBeAntag: false + access: + - Command + - ChiefJustice + - Justice + - Security + - Maintenance + - External + special: + - !type:AddImplantSpecial + implants: [ MindShieldImplant ] + - !type:AddComponentSpecial + components: + - type: CommandStaff + - !type:AddComponentSpecial + components: + - type: PsionicBonusChance #Nyano - Summary: makes it more likely to become psionic. + flatBonus: 0.025 + +- type: startingGear + id: CJGear + equipment: + jumpsuit: ClothingUniformJumpsuitChiefJustice + back: ClothingBackpackFilled # TODO- make Justice department bags + shoes: ClothingShoesLeather + head: ClothingHeadHatCJToque + outerClothing: ClothingOuterChiefJustice + id: ChiefJusticePDA + ears: ClothingHeadsetAltJustice + gloves: ClothingHandsGlovesColorWhite + # Todo - pocket1: Gavel + innerClothingSkirt: ClothingUniformJumpskirtChiefJustice + satchel: ClothingBackpackSatchelFilled # TODO- make Justice departmebt bags + duffelbag: ClothingBackpackDuffelFilled + + diff --git a/Resources/Prototypes/DeltaV/Roles/Jobs/Justice/clerk.yml b/Resources/Prototypes/DeltaV/Roles/Jobs/Justice/clerk.yml new file mode 100644 index 0000000000..c2032b67eb --- /dev/null +++ b/Resources/Prototypes/DeltaV/Roles/Jobs/Justice/clerk.yml @@ -0,0 +1,41 @@ +- type: job + id: Clerk + name: job-name-clerk + description: job-description-clerk + playTimeTracker: JobClerk + antagAdvantage: 2 + requirements: + - !type:CharacterDepartmentTimeRequirement + department: Security + min: 36000 # 10 hrs + - !type:CharacterPlaytimeRequirement + tracker: JobLawyer + min: 36000 # 10 hours + - !type:CharacterPlaytimeRequirement + tracker: JobProsecutor + min: 36000 # 10 hours + + + startingGear: ClerkGear + icon: "JobIconClerk" + requireAdminNotify: true + supervisors: job-supervisors-cj + canBeAntag: false + access: + - Justice + - Security + - Maintenance + +- type: startingGear + id: ClerkGear + equipment: + jumpsuit: ClothingUniformJumpsuitClerk + back: ClothingBackpackFilled + shoes: ClothingShoesBootsLaceup + id: ClerkPDA + ears: ClothingHeadsetJustice + innerClothingSkirt: ClothingUniformJumpskirtClerk + satchel: ClothingBackpackSatchelFilled + duffelbag: ClothingBackpackDuffelFilled + + diff --git a/Resources/Prototypes/DeltaV/Roles/Jobs/Justice/prosecutor.yml b/Resources/Prototypes/DeltaV/Roles/Jobs/Justice/prosecutor.yml new file mode 100644 index 0000000000..e0cebc4417 --- /dev/null +++ b/Resources/Prototypes/DeltaV/Roles/Jobs/Justice/prosecutor.yml @@ -0,0 +1,34 @@ +- type: job + id: Prosecutor + name: job-name-prosecutor + description: job-description-prosecutor + playTimeTracker: JobProsecutor + requirements: + - !type:CharacterOverallTimeRequirement + min: 36000 # 10 hrs + startingGear: ProsecutorGear + icon: "JobIconProsecutor" + supervisors: job-supervisors-cj + access: + - Prosecutor + - Justice + - Security + - Maintenance + +- type: startingGear + id: ProsecutorGear + equipment: + jumpsuit: ClothingUniformJumpsuitProsecutor + neck: ClothingNeckProsecutorbadge + back: ClothingBackpackLawyerFilled + shoes: ClothingShoesBootsLaceup + id: ProsecutorPDA + ears: ClothingHeadsetSecurity + # TODO add copy of space law + inhand: + - BriefcaseBrownFilled + innerClothingSkirt: ClothingUniformJumpskirtProsecutor + satchel: ClothingBackpackSatchelFilled + duffelbag: ClothingBackpackDuffelFilled + + diff --git a/Resources/Prototypes/DeltaV/Roles/Jobs/Security/brigmedic.yml b/Resources/Prototypes/DeltaV/Roles/Jobs/Security/brigmedic.yml index cd590ca5bb..dd8b77acbc 100644 --- a/Resources/Prototypes/DeltaV/Roles/Jobs/Security/brigmedic.yml +++ b/Resources/Prototypes/DeltaV/Roles/Jobs/Security/brigmedic.yml @@ -26,6 +26,9 @@ special: - !type:AddImplantSpecial implants: [ MindShieldImplant ] + - !type:AddComponentSpecial + components: + - type: CPRTraining - type: startingGear id: CorpsmanGear # see Prototypes/Roles/Jobs/Fun/misc_startinggear.yml for "BrigmedicGear" diff --git a/Resources/Prototypes/DeltaV/Roles/Jobs/departments.yml b/Resources/Prototypes/DeltaV/Roles/Jobs/departments.yml new file mode 100644 index 0000000000..c4d5fbfe20 --- /dev/null +++ b/Resources/Prototypes/DeltaV/Roles/Jobs/departments.yml @@ -0,0 +1,11 @@ +- type: department + id: Justice + description: department-justice-description + color: "#701442" + roles: + - ChiefJustice + - Clerk + - Prosecutor + - Lawyer + + diff --git a/Resources/Prototypes/DeltaV/Roles/play_time_trackers.yml b/Resources/Prototypes/DeltaV/Roles/play_time_trackers.yml index d3b983f01c..4ab6f3eed4 100644 --- a/Resources/Prototypes/DeltaV/Roles/play_time_trackers.yml +++ b/Resources/Prototypes/DeltaV/Roles/play_time_trackers.yml @@ -3,3 +3,6 @@ - type: playTimeTracker id: JobMedicalBorg + +- type: playTimeTracker + id: JobCourier diff --git a/Resources/Prototypes/DeltaV/Species/lamia.yml b/Resources/Prototypes/DeltaV/Species/lamia.yml index a6cfbf90fe..ed2ff0448a 100644 --- a/Resources/Prototypes/DeltaV/Species/lamia.yml +++ b/Resources/Prototypes/DeltaV/Species/lamia.yml @@ -17,19 +17,6 @@ sexes: - Female -- type: species - id: LamiaSegment - name: LamiaSegment - roundStart: false - prototype: LamiaSegment - dollPrototype: MobLamiaDummy - sprites: MobLamiaSegmentSprites - markingLimits: MobLamiaSegmentMarkingLimits - skinColoration: HumanToned - sexes: - - Female - - - type: markingPoints id: MobLamiaMarkingLimits points: @@ -41,13 +28,6 @@ required: true defaultMarkings: [ LamiaBottom ] -- type: markingPoints - id: MobLamiaSegmentMarkingLimits - points: - Tail: - points: 1 - required: false - - type: speciesBaseSprites id: MobLamiaSprites @@ -61,8 +41,3 @@ LHand: MobHumanLHand RHand: MobHumanRHand Tail: MobHumanoidAnyMarking - -- type: speciesBaseSprites - id: MobLamiaSegmentSprites - sprites: - Tail: MobHumanoidAnyMarking diff --git a/Resources/Prototypes/DeltaV/Species/vulpkanin.yml b/Resources/Prototypes/DeltaV/Species/vulpkanin.yml index 8a3cd4c47c..e139279dd5 100644 --- a/Resources/Prototypes/DeltaV/Species/vulpkanin.yml +++ b/Resources/Prototypes/DeltaV/Species/vulpkanin.yml @@ -62,9 +62,6 @@ points: 1 required: true defaultMarkings: [ VulpEar ] - Overlay: - points: 2 - required: false - type: humanoidBaseSprite id: MobVulpkaninHead diff --git a/Resources/Prototypes/DeltaV/StatusEffects/job.yml b/Resources/Prototypes/DeltaV/StatusEffects/job.yml index 949ac6a99e..894e1586b4 100644 --- a/Resources/Prototypes/DeltaV/StatusEffects/job.yml +++ b/Resources/Prototypes/DeltaV/StatusEffects/job.yml @@ -4,3 +4,24 @@ icon: sprite: /Textures/DeltaV/Interface/Misc/job_icons.rsi state: MedicalBorg + +- type: statusIcon + parent: JobIcon + id: JobIconChiefJustice + icon: + sprite: /Textures/DeltaV/Interface/Misc/job_icons.rsi + state: ChiefJustice + +- type: statusIcon + parent: JobIcon + id: JobIconClerk + icon: + sprite: /Textures/DeltaV/Interface/Misc/job_icons.rsi + state: Clerk + +- type: statusIcon + parent: JobIcon + id: JobIconProsecutor + icon: + sprite: /Textures/DeltaV/Interface/Misc/job_icons.rsi + state: Prosecutor #need prosecutor diff --git a/Resources/Prototypes/DeltaV/radio_channels.yml b/Resources/Prototypes/DeltaV/radio_channels.yml index 639eea09b3..53490d90fa 100644 --- a/Resources/Prototypes/DeltaV/radio_channels.yml +++ b/Resources/Prototypes/DeltaV/radio_channels.yml @@ -1,6 +1,15 @@ +- type: radioChannel + id: Justice + name: chat-radio-justice + keycode: "j" + frequency: 1420 + color: "#701442" + - type: radioChannel id: Prison name: chat-radio-prison keycode: 'p' frequency: 1601 - color: "#FFA500" \ No newline at end of file + color: "#FFA500" + + diff --git a/Resources/Prototypes/DeltaV/tags.yml b/Resources/Prototypes/DeltaV/tags.yml index 6a1efcfa69..36ea3e56a4 100644 --- a/Resources/Prototypes/DeltaV/tags.yml +++ b/Resources/Prototypes/DeltaV/tags.yml @@ -15,6 +15,12 @@ - type: Tag id: ForensicBeltEquip +- type: Tag + id: Gavel + +- type: Tag + id: GasPipeHalf #Craftable Musket + - type: Tag id: HandLabeler diff --git a/Resources/Prototypes/Entities/Clothing/Belt/belts.yml b/Resources/Prototypes/Entities/Clothing/Belt/belts.yml index d90945a7eb..359165cfc5 100644 --- a/Resources/Prototypes/Entities/Clothing/Belt/belts.yml +++ b/Resources/Prototypes/Entities/Clothing/Belt/belts.yml @@ -472,6 +472,7 @@ - Sidearm - MagazinePistol - MagazineMagnum + - CombatKnife components: - Stunbaton - FlashOnTrigger diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml index 5e6f600df1..997390c8f6 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml @@ -143,6 +143,11 @@ - type: Clothing equipDelay: 2.5 # Hardsuits are heavy and take a while to put on/off. unequipDelay: 2.5 + - type: Geiger + attachedToSuit: true + localSoundOnly: true + - type: StaminaDamageResistance + coefficient: 0.75 # 25% - type: entity abstract: true diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml index e0d8e7290d..70ab301646 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml @@ -100,6 +100,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitEngineering + - type: StaminaDamageResistance + coefficient: 0.75 # 25% #Spationaut Hardsuit - type: entity @@ -221,6 +223,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitSecurity + - type: StaminaDamageResistance + coefficient: 0.75 # 25% #Brigmedic Hardsuit - type: entity @@ -248,6 +252,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitBrigmedic + - type: StaminaDamageResistance + coefficient: 0.75 # 25% #Warden's Hardsuit - type: entity @@ -278,6 +284,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitWarden + - type: StaminaDamageResistance + coefficient: 0.65 # 35% #Captain's Hardsuit - type: entity @@ -310,6 +318,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitCap + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #Chief Engineer's Hardsuit - type: entity @@ -345,6 +355,8 @@ - type: ClothingGrantComponent component: - type: SupermatterImmune + - type: StaminaDamageResistance + coefficient: 0.65 # 35% #Chief Medical Officer's Hardsuit - type: entity @@ -412,6 +424,8 @@ price: 750 - type: StealTarget stealGroup: ClothingOuterHardsuitRd + - type: StaminaDamageResistance + coefficient: 0.75 # 25% as in "shock resistance" :trollface: #Head of Security's Hardsuit - type: entity @@ -443,6 +457,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitSecurityRed + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #Luxury Mining Hardsuit - type: entity @@ -520,6 +536,8 @@ - Hardsuit - WhitelistChameleon - HidesHarpyWings + - type: StaminaDamageResistance + coefficient: 0.5 # 50% # Syndicate Medic Hardsuit - type: entity @@ -539,6 +557,8 @@ - Hardsuit - WhitelistChameleon - HidesHarpyWings + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #Syndicate Elite Hardsuit - type: entity @@ -575,6 +595,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitSyndieElite + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #Syndicate Commander Hardsuit - type: entity @@ -607,6 +629,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitSyndieCommander + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #Cybersun Juggernaut Hardsuit - type: entity @@ -639,6 +663,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitCybersun + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #Wizard Hardsuit - type: entity @@ -671,6 +697,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitWizard + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #Ling Space Suit - type: entity @@ -766,6 +794,8 @@ clothingPrototype: ClothingHeadHelmetHardsuitPirateCap - type: StaticPrice price: 0 + - type: StaminaDamageResistance + coefficient: 0.75 # 25% #CENTCOMM / ERT HARDSUITS #ERT Leader Hardsuit @@ -781,6 +811,8 @@ sprite: Clothing/OuterClothing/Hardsuits/ERTSuits/ertleader.rsi - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitERTLeader + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #ERT Chaplain Hardsuit - type: entity @@ -795,6 +827,8 @@ sprite: Clothing/OuterClothing/Hardsuits/ERTSuits/ertchaplain.rsi - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitERTChaplain + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #ERT Engineer Hardsuit - type: entity @@ -809,6 +843,8 @@ sprite: Clothing/OuterClothing/Hardsuits/ERTSuits/ertengineer.rsi - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitERTEngineer + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #ERT Medic Hardsuit - type: entity @@ -823,6 +859,8 @@ sprite: Clothing/OuterClothing/Hardsuits/ERTSuits/ertmedical.rsi - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitERTMedical + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #ERT Security Hardsuit - type: entity @@ -841,6 +879,8 @@ tags: - Hardsuit - WhitelistChameleon + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #ERT Janitor Hardsuit - type: entity @@ -855,6 +895,8 @@ sprite: Clothing/OuterClothing/Hardsuits/ERTSuits/ertjanitor.rsi - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitERTJanitor + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #Deathsquad - type: entity @@ -889,6 +931,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitDeathsquad + - type: StaminaDamageResistance + coefficient: 0.1 # 90% #CBURN Hardsuit - type: entity diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/suits.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/suits.yml index 57ca67e55d..9f0a01cc48 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/suits.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/suits.yml @@ -39,6 +39,17 @@ sprite: Clothing/OuterClothing/Suits/janitor_bombsuit.rsi - type: Clothing sprite: Clothing/OuterClothing/Suits/janitor_bombsuit.rsi + - type: ClothingSpeedModifier + walkModifier: 0.8 + sprintModifier: 0.8 + - type: ExplosionResistance + damageCoefficient: 0.15 + - type: GroupExamine + - type: Tag + tags: + - Hardsuit + - WhitelistChameleon + - FullBodyOuter - type: entity parent: ClothingOuterBaseLarge diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/harpy.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/harpy.yml index 697781be93..2629d83651 100644 --- a/Resources/Prototypes/Entities/Mobs/Customization/Markings/harpy.yml +++ b/Resources/Prototypes/Entities/Mobs/Customization/Markings/harpy.yml @@ -253,6 +253,56 @@ - sprite: Mobs/Customization/Harpy/harpy_tails48x48.rsi state: peacock_tail_eyes +- type: marking + id: HarpyTailHaven + bodyPart: Tail + markingCategory: Tail + speciesRestriction: [Harpy] + coloring: + default: + type: + !type:CategoryColoring + category: Hair + fallbackTypes: + - !type:SimpleColoring + sprites: + - sprite: Mobs/Customization/Harpy/harpy_tails.rsi + state: haven_tone_1 + - sprite: Mobs/Customization/Harpy/harpy_tails.rsi + state: haven_tone_2 + +- type: marking + id: HarpyTailForkedLong + bodyPart: Tail + markingCategory: Tail + speciesRestriction: [Harpy] + coloring: + default: + type: + !type:CategoryColoring + category: Hair + fallbackTypes: + - !type:SimpleColoring + sprites: + - sprite: Mobs/Customization/Harpy/harpy_tails.rsi + state: forked_long + +- type: marking + id: HarpyTailSwallow + bodyPart: Tail + markingCategory: Tail + speciesRestriction: [Harpy] + coloring: + default: + type: + !type:CategoryColoring + category: Hair + fallbackTypes: + - !type:SimpleColoring + sprites: + - sprite: Mobs/Customization/Harpy/harpy_tails.rsi + state: swallow_tail + - type: marking id: HarpyWing2ToneClassic bodyPart: RArm @@ -310,6 +360,29 @@ - sprite: Mobs/Customization/Harpy/harpy_wings.rsi state: harpy_wingtip_2 +- type: marking + id: HarpyWingBat + bodyPart: RArm + markingCategory: Arms + speciesRestriction: [Harpy] + sprites: + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi + state: bat_wings_tone_1 + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi + state: bat_wings_tone_2 + +- type: marking + id: HarpyWingBionic + bodyPart: RArm + markingCategory: Arms + speciesRestriction: [Harpy] + sprites: + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi + state: bionic_wings_tone_1 + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi + state: bionic_wings_tone_2 + shader: unshaded + - type: marking id: HarpyChestDefault bodyPart: Chest diff --git a/Resources/Prototypes/Entities/Mobs/Player/arachne.yml b/Resources/Prototypes/Entities/Mobs/Player/arachne.yml index bebf42f31b..cd4123fa80 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/arachne.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/arachne.yml @@ -5,11 +5,6 @@ id: MobArachne components: - type: CombatMode - - type: InteractionPopup - successChance: 1 - interactSuccessString: hugging-success-generic - interactSuccessSound: /Audio/Effects/thudswoosh.ogg - messagePerceivedByOthers: hugging-success-generic-others - type: MindContainer showExamineInfo: true - type: Input diff --git a/Resources/Prototypes/Entities/Mobs/Player/harpy.yml b/Resources/Prototypes/Entities/Mobs/Player/harpy.yml index e2541def03..12df7ff103 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/harpy.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/harpy.yml @@ -5,11 +5,6 @@ id: MobHarpy components: - type: CombatMode - - type: InteractionPopup - successChance: 1 - interactSuccessString: hugging-success-generic - interactSuccessSound: /Audio/Effects/thudswoosh.ogg - messagePerceivedByOthers: hugging-success-generic-others - type: MindContainer showExamineInfo: true - type: Input diff --git a/Resources/Prototypes/Entities/Mobs/Player/skeleton.yml b/Resources/Prototypes/Entities/Mobs/Player/skeleton.yml index f9132ce0ea..5c2a88c106 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/skeleton.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/skeleton.yml @@ -2,12 +2,6 @@ save: false parent: BaseMobSkeletonPerson id: MobSkeletonPerson - components: - - type: InteractionPopup - successChance: 1 - interactSuccessString: hugging-success-generic - interactSuccessSound: /Audio/Effects/thudswoosh.ogg - messagePerceivedByOthers: hugging-success-generic-others - type: entity name: skeleton pirate diff --git a/Resources/Prototypes/Entities/Mobs/Species/base.yml b/Resources/Prototypes/Entities/Mobs/Species/base.yml index c4906f6f97..9fb241c40d 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/base.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/base.yml @@ -180,11 +180,6 @@ - type: Dna - type: MindContainer showExamineInfo: true - - type: InteractionPopup - successChance: 1 - interactSuccessString: hugging-success-generic - interactSuccessSound: /Audio/Effects/thudswoosh.ogg - messagePerceivedByOthers: hugging-success-generic-others - type: CanHostGuardian - type: NpcFactionMember factions: diff --git a/Resources/Prototypes/Entities/Mobs/Species/diona.yml b/Resources/Prototypes/Entities/Mobs/Species/diona.yml index e1628c620a..42383d9a42 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/diona.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/diona.yml @@ -109,6 +109,11 @@ understands: - GalacticCommon - RootSpeak + - type: TraitSpeedModifier + sprintModifier: 0.75 + walkModifier: 0.75 + - type: SpeedModifierImmunity + - type: NoSlip - type: entity parent: BaseSpeciesDummy diff --git a/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml b/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml index b38ea2634f..055c6522dd 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml @@ -58,6 +58,8 @@ understands: - GalacticCommon - SolCommon + - type: LightweightDrunk + boozeStrengthMultiplier: 0.5 - type: entity parent: BaseSpeciesDummy diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_bottles.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_bottles.yml index fc35fae1af..a6752286dd 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_bottles.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_bottles.yml @@ -47,6 +47,15 @@ components: - type: Sprite state: icon + - type: MeleeWeapon + bluntStaminaDamageFactor: 2.0 + damage: + types: + Blunt: 7.5 + heavyRangeModifier: 1.5 + heavyStaminaCost: 5 + maxTargets: 1 + angle: 25 - type: DamageOnLand damage: types: @@ -54,7 +63,7 @@ - type: DamageOtherOnHit damage: types: - Blunt: 4 + Blunt: 5 - type: Damageable damageContainer: Inorganic - type: Destructible diff --git a/Resources/Prototypes/Entities/Objects/Devices/Electronics/door_access.yml b/Resources/Prototypes/Entities/Objects/Devices/Electronics/door_access.yml index e3944296ea..b793416064 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/Electronics/door_access.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/Electronics/door_access.yml @@ -294,3 +294,27 @@ components: - type: AccessReader access: [["Research"], ["Medical"]] + +- type: entity + parent: DoorElectronics + id: DoorElectronicsChiefJustice + suffix: ChiefJustice, Locked + components: + - type: AccessReader + access: [["ChiefJustice"]] + +- type: entity + parent: DoorElectronics + id: DoorElectronicsJustice + suffix: Justice, Locked + components: + - type: AccessReader + access: [["Justice"]] + +- type: entity + parent: DoorElectronics + id: DoorElectronicsProsecutor + suffix: Prosecutor, Locked + components: + - type: AccessReader + access: [["Prosecutor"]] \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Objects/Devices/encryption_keys.yml b/Resources/Prototypes/Entities/Objects/Devices/encryption_keys.yml index 66374b6662..a95cbd35cd 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/encryption_keys.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/encryption_keys.yml @@ -67,6 +67,7 @@ - Common - Command - Engineering + - Justice # Delta V- adds Justice department - Medical - Science - Security diff --git a/Resources/Prototypes/Entities/Objects/Devices/pda.yml b/Resources/Prototypes/Entities/Objects/Devices/pda.yml index 95ea490f8a..43bcfb8582 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/pda.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/pda.yml @@ -151,6 +151,12 @@ - type: Pda id: MedicalInternIDCard state: pda-internmed + penSlot: # Pen Lights + startingItem: PenLightBase + priority: -1 + whitelist: + tags: + - Write - type: PdaBorderColor borderColor: "#717059" accentVColor: "#447987" @@ -520,6 +526,12 @@ - type: Pda id: CMOIDCard state: pda-cmo + penSlot: # Fancy Pen Light + startingItem: CMOPenLight + priority: -1 + whitelist: + tags: + - Write - type: PdaBorderColor borderColor: "#d7d7d0" accentHColor: "#447987" @@ -536,6 +548,12 @@ - type: Pda id: MedicalIDCard state: pda-medical + penSlot: # Pen Lights + startingItem: PenLightBase + priority: -1 + whitelist: + tags: + - Write - type: PdaBorderColor borderColor: "#d7d7d0" accentVColor: "#447987" @@ -554,6 +572,12 @@ - type: Pda id: ParamedicIDCard state: pda-paramedic + penSlot: # Pen Lights + startingItem: PenLightBase + priority: -1 + whitelist: + tags: + - Write - type: PdaBorderColor borderColor: "#d7d7d0" accentVColor: "#2a4b5b" @@ -569,6 +593,12 @@ - type: Pda id: ChemistIDCard state: pda-chemistry + penSlot: # Pen Lights + startingItem: PenLightBase + priority: -1 + whitelist: + tags: + - Write - type: PdaBorderColor borderColor: "#d7d7d0" accentVColor: "#B34200" @@ -903,6 +933,12 @@ - type: Pda id: PsychologistIDCard state: pda-medical + penSlot: # Pen Lights + startingItem: PenLightBase + priority: -1 + whitelist: + tags: + - Write - type: PdaBorderColor borderColor: "#d7d7d0" accentVColor: "#447987" @@ -988,6 +1024,12 @@ - type: Pda id: BrigmedicIDCard state: pda-brigmedic + penSlot: # Pen Lights + startingItem: PenLightBase + priority: -1 + whitelist: + tags: + - Write - type: PdaBorderColor borderColor: "#A32D26" accentHColor: "#d7d7d0" @@ -1065,6 +1107,12 @@ - type: Pda id: SeniorPhysicianIDCard state: pda-seniorphysician + penSlot: # Pen Lights + startingItem: PenLightBase + priority: -1 + whitelist: + tags: + - Write - type: PdaBorderColor borderColor: "#d7d7d0" accentHColor: "#447987" @@ -1115,6 +1163,12 @@ - type: Pda id: SyndicateIDCard state: pda-syndi-agent + penSlot: # Pen Lights + startingItem: PenLightBase + priority: -1 + whitelist: + tags: + - Write - type: PdaBorderColor borderColor: "#891417" - type: Icon diff --git a/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_string.yml b/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_string.yml index fab8b56b06..947a973bbf 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_string.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_string.yml @@ -14,6 +14,19 @@ - type: Sprite sprite: Objects/Fun/Instruments/eguitar.rsi state: icon + - type: MeleeWeapon + soundHit: + path: /Audio/Nyanotrasen/Weapons/electricguitarhit.ogg + range: 1.85 + damage: + types: + Blunt: 6 + Shock: 1 + bluntStaminaDamageFactor: 1.5 + heavyRateModifier: 0.75 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 10 + angle: 75 - type: Item size: Normal sprite: Objects/Fun/Instruments/eguitar.rsi @@ -43,6 +56,19 @@ - type: Sprite sprite: Objects/Fun/Instruments/bassguitar.rsi state: icon + - type: MeleeWeapon + soundHit: + path: /Audio/Nyanotrasen/Weapons/electricguitarhit.ogg + range: 1.85 + damage: + types: + Blunt: 6 + Shock: 1 + bluntStaminaDamageFactor: 1.5 + heavyRateModifier: 0.75 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 10 + angle: 75 - type: Item size: Normal sprite: Objects/Fun/Instruments/bassguitar.rsi @@ -71,6 +97,27 @@ - type: Sprite sprite: Objects/Fun/Instruments/rockguitar.rsi state: icon + - type: MeleeWeapon + soundHit: + path: /Audio/Nyanotrasen/Weapons/electricguitarhit.ogg + range: 1.85 + attackRate: 1.25 + wideAnimationRotation: 45 + damage: + types: + Blunt: 6 + Shock: 1 + bluntStaminaDamageFactor: 1.5 + heavyRateModifier: 0.75 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 15 + angle: 160 + - type: Wieldable + - type: IncreaseDamageOnWield + damage: + types: + Blunt: 2 + Shock: 1 - type: Item size: Normal sprite: Objects/Fun/Instruments/rockguitar.rsi @@ -82,18 +129,6 @@ - type: Tag tags: - StringInstrument - - type: MeleeWeapon - wideAnimationRotation: 45 - damage: - types: - Blunt: 6 - Slash: 2 - - type: Wieldable - - type: IncreaseDamageOnWield #they don't call it an axe for nothing - damage: - types: - Blunt: 4 - Slash: 2 - type: entity parent: BaseHandheldInstrument @@ -145,14 +180,20 @@ types: Blunt: 20 - type: MeleeWeapon + range: 1.5 wideAnimationRotation: 45 damage: types: - Blunt: 5 + Blunt: 7 + bluntStaminaDamageFactor: 2 + heavyRateModifier: 0.75 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 10 + angle: 75 - type: IncreaseDamageOnWield damage: types: - Blunt: 15 + Blunt: 2 - type: entity parent: BaseHandheldInstrument @@ -186,10 +227,15 @@ - type: MeleeWeapon soundHit: path: /Audio/SimpleStation14/Weapons/Melee/banjohit.ogg + range: 1.5 damage: types: Blunt: 7 - bluntStaminaDamageFactor: 1.5 + bluntStaminaDamageFactor: 2 + heavyRateModifier: 0.75 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 10 + angle: 75 - type: entity parent: BaseHandheldInstrument diff --git a/Resources/Prototypes/Entities/Objects/Fun/toys.yml b/Resources/Prototypes/Entities/Objects/Fun/toys.yml index 094f434c39..66d6713fb2 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/toys.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/toys.yml @@ -628,6 +628,16 @@ - type: Sprite sprite: Objects/Fun/ducky.rsi state: icon + - type: MeleeWeapon + attackRate: 1.5 + range: 1.3 + damage: + types: + Blunt: 0.1 + heavyDamageBaseModifier: 2 + heavyStaminaCost: 5 + maxTargets: 8 + angle: 25 - type: Clothing quickEquip: false sprite: Objects/Fun/ducky.rsi diff --git a/Resources/Prototypes/Entities/Objects/Materials/bluespace.yml b/Resources/Prototypes/Entities/Objects/Materials/bluespace.yml new file mode 100644 index 0000000000..f93534ecd5 --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Materials/bluespace.yml @@ -0,0 +1,56 @@ +- type: entity + parent: MaterialBase + id: MaterialBluespace + suffix: Full + name: bluespace crystal + components: + - type: Sprite + sprite: Nyanotrasen/Objects/Materials/materials.rsi + layers: + - state: bluespace_3 + map: ["base"] + - type: Appearance + - type: Material + - type: PhysicalComposition + materialComposition: + Bluespace: 100 + - type: Tag + tags: + - BluespaceCrystal + - RawMaterial + - type: Stack + stackType: Bluespace + baseLayer: base + layerStates: + - bluespace + - bluespace_2 + - bluespace_3 + count: 5 + - type: Item + size: Small + +- type: entity + parent: MaterialBluespace + id: MaterialBluespace1 + suffix: 1 + components: + - type: Sprite + state: bluespace + - type: Stack + count: 1 + +- type: entity + parent: MaterialBluespace1 + id: MaterialBluespace3 + suffix: 3 + components: + - type: Stack + count: 3 + +- type: entity + parent: MaterialBluespace1 + id: MaterialBluespace5 + suffix: 5 + components: + - type: Stack + count: 5 diff --git a/Resources/Prototypes/Entities/Objects/Materials/shards.yml b/Resources/Prototypes/Entities/Objects/Materials/shards.yml index 5fcb006cfa..6cdc066cf1 100644 --- a/Resources/Prototypes/Entities/Objects/Materials/shards.yml +++ b/Resources/Prototypes/Entities/Objects/Materials/shards.yml @@ -89,7 +89,7 @@ color: "#bbeeff" - type: WelderRefinable refineResult: - - SheetGlass1 + - id: SheetGlass1 - type: DamageUserOnTrigger damage: types: @@ -120,8 +120,8 @@ color: "#96cdef" - type: WelderRefinable refineResult: - - SheetGlass1 - - PartRodMetal1 + - id: SheetGlass1 + - id: PartRodMetal1 - type: DamageUserOnTrigger damage: types: @@ -152,8 +152,8 @@ color: "#FF72E7" - type: WelderRefinable refineResult: - - SheetGlass1 - - SheetPlasma1 + - id: SheetGlass1 + - id: SheetPlasma1 - type: DamageUserOnTrigger damage: types: @@ -186,8 +186,8 @@ color: "#8eff7a" - type: WelderRefinable refineResult: - - SheetGlass1 - - SheetUranium1 + - id: SheetGlass1 + - id: SheetUranium1 - type: DamageUserOnTrigger damage: types: @@ -221,8 +221,8 @@ color: "#e0aa36" - type: WelderRefinable refineResult: - - SheetGlass1 - - SheetBrass1 + - id: SheetGlass1 + - id: SheetBrass1 - type: DamageUserOnTrigger damage: types: diff --git a/Resources/Prototypes/Entities/Objects/Misc/briefcases.yml b/Resources/Prototypes/Entities/Objects/Misc/briefcases.yml index 762204701c..760a0bafb6 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/briefcases.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/briefcases.yml @@ -9,6 +9,18 @@ - type: Storage grid: - 0,0,5,3 + - type: MeleeWeapon + bluntStaminaDamageFactor: 3.0 + attackRate: 0.9 + range: 1.75 + damage: + types: + Blunt: 3.5 + heavyRateModifier: 0.8 + heavyRangeModifier: 0.8 + heavyDamageBaseModifier: 2 + heavyStaminaCost: 5 + maxTargets: 8 - type: Tag tags: - Briefcase diff --git a/Resources/Prototypes/Entities/Objects/Misc/broken_bottle.yml b/Resources/Prototypes/Entities/Objects/Misc/broken_bottle.yml index b7c73f5e0c..f8dbabd07a 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/broken_bottle.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/broken_bottle.yml @@ -7,9 +7,16 @@ - type: Sharp - type: MeleeWeapon attackRate: 1.5 + range: 1.3 damage: types: - Slash: 5 + Slash: 4 + heavyRateModifier: 0.8 + heavyRangeModifier: 0.8 + heavyDamageBaseModifier: 1.5 + heavyStaminaCost: 5 + maxTargets: 3 + angle: 75 soundHit: path: /Audio/Weapons/bladeslice.ogg - type: Sprite @@ -28,4 +35,4 @@ - type: SpaceGarbage - type: WelderRefinable refineResult: - - SheetGlass1 + - id: SheetGlass1 diff --git a/Resources/Prototypes/Entities/Objects/Misc/fire_extinguisher.yml b/Resources/Prototypes/Entities/Objects/Misc/fire_extinguisher.yml index bae33f27f1..f1802e426f 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/fire_extinguisher.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/fire_extinguisher.yml @@ -38,9 +38,16 @@ hasSafety: true - type: MeleeWeapon wideAnimationRotation: 180 + attackRate: 0.8 + bluntStaminaDamageFactor: 2.5 + range: 1.75 damage: types: - Blunt: 10 + Blunt: 8 + heavyRateModifier: 0.8 + heavyDamageBaseModifier: 2 + heavyStaminaCost: 15 + maxTargets: 8 soundHit: path: /Audio/Weapons/smash.ogg - type: Tool diff --git a/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml b/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml index f797ad5cea..7041be7b20 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml @@ -449,7 +449,7 @@ - type: entity parent: IDCardStandard id: LawyerIDCard - name: lawyer ID card + name: attorney ID card # DeltaV - Changed Lawyer to Attorney components: - type: Sprite layers: @@ -462,6 +462,55 @@ - type: PresetIdCard job: Lawyer +- type: entity + parent: IDCardStandard + id: ChiefJusticeIDCard + name: chief justice ID card + components: + - type: PresetIdCard + job: ChiefJustice + - type: Sprite + layers: + - state: default + - state: department + color: "#878787" + - state: subdepartment + color: "#CB0000" + - state: lawyer + + +- type: entity + parent: IDCardStandard + id: ClerkIDCard + name: clerk ID card + components: + - type: PresetIdCard + job: Clerk + - type: Sprite + layers: + - state: default + - state: department + color: "#878787" + - state: subdepartment + color: "#CB0000" + - state: lawyer + +- type: entity + parent: IDCardStandard + id: ProsecutorIDCard + name: presecutor ID card + components: + - type: PresetIdCard + job: Prosecutor + - type: Sprite + layers: + - state: default + - state: department + color: "#878787" + - state: subdepartment + color: "#CB0000" + - state: lawyer + - type: entity parent: IDCardStandard id: HoPIDCard @@ -822,6 +871,9 @@ - JobIconMartialArtist # Nyanotrasen - MartialArtist, see Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/martialartist.yml - JobIconGladiator # Nyanotrasen - Gladiator, see Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/gladiator.yml - JobIconForensicMantis # Nyanotrasen - ForensicMantis, see Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml + - JobIconClerk # Delta V - Added justice dept + - JobIconChiefJustice # Delta V - Added justice dept + - JobIconProsecutor # Delta V - Added justice dept - JobIconVisitor - type: ActivatableUI key: enum.AgentIDCardUiKey.Key @@ -1084,3 +1136,4 @@ - state: senior - type: PresetIdCard job: SeniorOfficer + diff --git a/Resources/Prototypes/Entities/Objects/Misc/supermatter_sliver.yml b/Resources/Prototypes/Entities/Objects/Misc/supermatter_sliver.yml index e524a4fbf8..d62935523d 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/supermatter_sliver.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/supermatter_sliver.yml @@ -2,7 +2,7 @@ parent: BaseItem id: SupermatterSliver name: supermatter sliver - description: A shard from the station's supermatter crystal. Highly radioactive. + description: A shard from the station's Supermatter crystal. Highly radioactive. components: - type: PointLight enabled: true @@ -22,4 +22,4 @@ - type: Tag tags: - HighRiskItem - - type: SupermatterImmune \ No newline at end of file + - type: SupermatterImmune diff --git a/Resources/Prototypes/Entities/Objects/Power/lights.yml b/Resources/Prototypes/Entities/Objects/Power/lights.yml index c8089cd22d..b18a0feaa5 100644 --- a/Resources/Prototypes/Entities/Objects/Power/lights.yml +++ b/Resources/Prototypes/Entities/Objects/Power/lights.yml @@ -68,7 +68,7 @@ - type: SpaceGarbage - type: WelderRefinable refineResult: - - SheetGlass1 + - id: SheetGlass1 - type: entity parent: BaseLightbulb @@ -276,8 +276,8 @@ node: icon - type: WelderRefinable refineResult: - - SheetGlass1 - - ShardCrystalCyan + - id: SheetGlass1 + - id: ShardCrystalCyan - type: entity parent: LightTubeCrystalCyan @@ -296,8 +296,8 @@ node: icon - type: WelderRefinable refineResult: - - SheetGlass1 - - ShardCrystalBlue + - id: SheetGlass1 + - id: ShardCrystalBlue - type: entity parent: LightTubeCrystalCyan @@ -316,8 +316,8 @@ node: icon - type: WelderRefinable refineResult: - - SheetGlass1 - - ShardCrystalPink + - id: SheetGlass1 + - id: ShardCrystalPink - type: entity parent: LightTubeCrystalCyan @@ -336,8 +336,8 @@ node: icon - type: WelderRefinable refineResult: - - SheetGlass1 - - ShardCrystalOrange + - id: SheetGlass1 + - id: ShardCrystalOrange - type: entity parent: LightTubeCrystalCyan @@ -356,8 +356,8 @@ node: icon - type: WelderRefinable refineResult: - - SheetGlass1 - - ShardCrystalRed + - id: SheetGlass1 + - id: ShardCrystalRed - type: entity parent: LightTubeCrystalCyan @@ -376,5 +376,5 @@ node: icon - type: WelderRefinable refineResult: - - SheetGlass1 - - ShardCrystalGreen + - id: SheetGlass1 + - id: ShardCrystalGreen diff --git a/Resources/Prototypes/Entities/Objects/Specific/Chapel/bibles.yml b/Resources/Prototypes/Entities/Objects/Specific/Chapel/bibles.yml index 1162a3ec71..9ab53cebc9 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Chapel/bibles.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Chapel/bibles.yml @@ -45,8 +45,12 @@ - type: MeleeWeapon # Nyanotrasen - Bibles do Holy damage damage: types: - Blunt: 3 - Holy: 10 + Blunt: 4 + Holy: 20 + heavyRateModifier: 0.8 + heavyDamageBaseModifier: 1 + heavyStaminaCost: 5 + maxTargets: 3 - type: Tag tags: - Book diff --git a/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/tools.yml b/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/tools.yml index 727c75c879..37b8daddc2 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/tools.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/tools.yml @@ -16,7 +16,14 @@ swingLeft: true damage: types: - Slash: 6 + Slash: 3.5 + Blunt: 3 + heavyRateModifier: 1 + heavyRangeModifier: 1 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 5 + maxTargets: 5 + angle: 100 - type: Item sprite: Objects/Tools/Hydroponics/hoe.rsi @@ -34,9 +41,16 @@ state: icon - type: MeleeWeapon wideAnimationRotation: 90 + attackRate: 0.8 damage: types: - Slash: 7 + Pierce: 7 + heavyRateModifier: 0.9 + heavyRangeModifier: 1.25 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 5 + maxTargets: 1 + angle: 20 - type: Item sprite: Objects/Tools/Hydroponics/clippers.rsi storedRotation: -90 @@ -53,9 +67,16 @@ state: icon - type: MeleeWeapon wideAnimationRotation: 135 + range: 1.85 damage: types: - Slash: 10 + Slash: 7 + heavyRateModifier: 0.8 + heavyRangeModifier: 1.25 + heavyDamageBaseModifier: 1.5 + heavyStaminaCost: 5 + maxTargets: 1 + angle: 120 - type: Item size: Normal - type: Clothing @@ -81,10 +102,13 @@ - type: MeleeWeapon wideAnimationRotation: 135 swingLeft: true + attackRate: 1.25 + range: 1.25 damage: types: - Slash: 8 - Piercing: 2 + Slash: 10 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 5 - type: Item sprite: Objects/Tools/Hydroponics/hatchet.rsi @@ -104,14 +128,19 @@ wideAnimationRotation: 45 damage: types: - Blunt: 8 - Piercing: 2 # I guess you can stab it into them? + Blunt: 6 + Slash: 2 # I guess you can stab it into them? + heavyRateModifier: 0.8 + heavyRangeModifier: 1.25 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 5 + angle: 80 soundHit: collection: MetalThud - type: Item sprite: Objects/Tools/Hydroponics/spade.rsi - type: Shovel - speedModifier: 0.75 # slower at digging than a full-sized shovel + speedModifier: 0.85 # slower at digging than a full-sized shovel - type: entity name: plant bag diff --git a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml index b192401c8b..de5c33671a 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml @@ -8,9 +8,17 @@ sprite: Objects/Specific/Janitorial/mop.rsi state: mop - type: MeleeWeapon + range: 1.85 damage: types: - Blunt: 10 + Blunt: 2 + bluntStaminaDamageFactor: 3 + heavyRateModifier: 0.8 + heavyRangeModifier: 1.25 + heavyDamageBaseModifier: 1.25 + heavyStaminaCost: 10 + maxTargets: 2 + angle: 180 soundHit: collection: MetalThud - type: Spillable @@ -48,9 +56,17 @@ sprite: Objects/Specific/Janitorial/advmop.rsi state: advmop - type: MeleeWeapon + range: 1.85 damage: types: - Blunt: 10 + Blunt: 2 + bluntStaminaDamageFactor: 3 + heavyRateModifier: 0.8 + heavyRangeModifier: 1.25 + heavyDamageBaseModifier: 1.25 + heavyStaminaCost: 10 + maxTargets: 2 + angle: 180 soundHit: collection: MetalThud - type: Spillable diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/surgery.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/surgery.yml index aa0cf46187..c81768da4d 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/surgery.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/surgery.yml @@ -50,9 +50,15 @@ - 0,0,1,0 - 1,1,1,1 - type: MeleeWeapon + attackRate: 0.75 + range: 1.3 damage: types: - Piercing: 10 + Piercing: 8 + heavyDamageBaseModifier: 1.5 + heavyStaminaCost: 5 + maxTargets: 1 + angle: 20 soundHit: path: /Audio/Items/drill_hit.ogg - type: StaticPrice @@ -80,10 +86,16 @@ - type: MeleeWeapon wideAnimationRotation: 90 swingLeft: true - attackRate: 1.5 + attackRate: 1.25 + range: 1.25 damage: types: - Slash: 8 + Slash: 7.5 + heavyRateModifier: 0.8 + heavyDamageBaseModifier: 1.25 + heavyStaminaCost: 5 + maxTargets: 1 + angle: 20 soundHit: path: /Audio/Weapons/bladeslice.ogg @@ -111,7 +123,7 @@ - type: MeleeWeapon damage: types: - Slash: 12 + Slash: 8 - type: entity name: laser scalpel @@ -121,6 +133,11 @@ components: - type: Sprite state: laser + - type: MeleeWeapon + damage: + types: + Slash: 6.5 + Heat: 1 - type: Item heldPrefix: laser @@ -179,7 +196,19 @@ qualities: - Sawing speed: 1.0 -# No melee for regular saw because have you ever seen someone use a band saw as a weapon? It's dumb. + - type: MeleeWeapon + attackRate: 0.75 + range: 1.35 + damage: + types: + Blunt: 2.5 + Slash: 6.5 + heavyRateModifier: 0.8 + heavyDamageBaseModifier: 1.0 + heavyStaminaCost: 20 + maxTargets: 8 + angle: 20 +# ~~No melee for regular saw because have you ever seen someone use a band saw as a weapon? It's dumb.~~ No, I'm going to saw through your bones. - type: entity name: choppa @@ -192,9 +221,17 @@ - type: Item heldPrefix: improv - type: MeleeWeapon + attackRate: 0.85 damage: - groups: - Brute: 10 + types: + Blunt: 3 + Slash: 7 + bluntStaminaDamageFactor: 3 + heavyRateModifier: 0.8 + heavyDamageBaseModifier: 1.0 + heavyStaminaCost: 20 + maxTargets: 8 + angle: 20 soundHit: path: /Audio/Weapons/bladeslice.ogg - type: Tool @@ -214,9 +251,18 @@ heldPrefix: electric storedRotation: 90 - type: MeleeWeapon + attackRate: 1.15 + range: 1.4 + bluntStaminaDamageFactor: 3.0 damage: - groups: - Brute: 15 + types: + Blunt: 4.5 + Slash: 5.5 + heavyRateModifier: 0.5 + heavyDamageBaseModifier: 1 + heavyStaminaCost: 15 + maxTargets: 8 + angle: 360 soundHit: path: /Audio/Items/drill_hit.ogg - type: Tool @@ -236,10 +282,18 @@ heldPrefix: advanced storedRotation: 90 - type: MeleeWeapon - attackRate: 1.5 + attackRate: 1.25 + range: 1.4 + bluntStaminaDamageFactor: 5.0 damage: - groups: - Brute: 15 + types: + Blunt: 4.5 + Slash: 7.5 + heavyRateModifier: 0.5 + heavyDamageBaseModifier: 1 + heavyStaminaCost: 15 + maxTargets: 8 + angle: 360 soundHit: path: /Audio/Items/drill_hit.ogg - type: Tool diff --git a/Resources/Prototypes/Entities/Objects/Specific/Research/disk.yml b/Resources/Prototypes/Entities/Objects/Specific/Research/disk.yml index fa1b75530b..862716c512 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Research/disk.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Research/disk.yml @@ -36,6 +36,15 @@ - type: ResearchDisk points: 10000 +- type: entity + parent: ResearchDisk + id: ResearchDisk20000 + name: research point disk (20000) + description: A disk for the R&D server containing 20000 points. + components: + - type: ResearchDisk + points: 20000 + - type: entity parent: ResearchDisk id: ResearchDiskDebug diff --git a/Resources/Prototypes/Entities/Objects/Specific/Research/misc.yml b/Resources/Prototypes/Entities/Objects/Specific/Research/misc.yml new file mode 100644 index 0000000000..79c475900a --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Specific/Research/misc.yml @@ -0,0 +1,9 @@ +- type: entity + parent: PonderingOrb + id: PonderingOrbTelepathic + name: telepathic relay orb + description: Relays messages intercepted from Psionics. + components: + - type: TelepathicRepeater + - type: Psionic + - type: Speech \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml b/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml index d37523bd73..a7cf7ad5c8 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml @@ -210,6 +210,34 @@ - Crowbar - RadioHandheld +- type: entity + id: BorgModuleJetpack + parent: [ BaseBorgModuleCargo, BaseProviderBorgModule ] + name: jetpack cyborg module + description: A piece of tech that gives cyborgs new abilities. Needs to be loaded by a cyborg before you can refill the jetpack. + components: + - type: Sprite + layers: + - state: cargo + - state: icon-jetpack + - type: BorgJetpack + - type: ItemBorgModule + items: + - JetpackMicroFilled + +- type: entity + id: BorgModulePka + parent: [ BaseBorgModuleCargo, BaseProviderBorgModule ] + name: proto kinetic accelerator cyborg module + components: + - type: Sprite + layers: + - state: cargo + - state: icon-pka + - type: ItemBorgModule + items: + - WeaponProtoKineticAccelerator + - type: entity id: BorgModuleGrapplingGun parent: [ BaseBorgModuleCargo, BaseProviderBorgModule ] diff --git a/Resources/Prototypes/Entities/Objects/Tools/access_configurator.yml b/Resources/Prototypes/Entities/Objects/Tools/access_configurator.yml index 16be537891..9504ec144a 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/access_configurator.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/access_configurator.yml @@ -58,6 +58,9 @@ - Service - Theatre - Zookeeper #Delta V: Add Zookeeper Access + - ChiefJustice #Delta V: Add Chief Justice Access + - Prosecutor #Delta V: Add Prosecutor Access + - Justice #Delta V: Add Justice Access privilegedIdSlot: name: id-card-console-privileged-id ejectSound: /Audio/Machines/id_swipe.ogg diff --git a/Resources/Prototypes/Entities/Objects/Tools/flashlights.yml b/Resources/Prototypes/Entities/Objects/Tools/flashlights.yml index d22e919092..2b75a7e3dd 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/flashlights.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/flashlights.yml @@ -54,6 +54,14 @@ shader: unshaded visible: false map: [ "light" ] + - type: MeleeWeapon + attackRate: 0.8 + bluntStaminaDamageFactor: 1.5 + damage: + types: + Blunt: 6 + soundHit: + collection: MetalThud - type: Item sprite: Objects/Tools/flashlight.rsi storedRotation: -90 @@ -108,9 +116,15 @@ map: [ "light" ] - type: MeleeWeapon wideAnimationRotation: 90 + attackRate: 0.8 damage: types: - Blunt: 10 + Blunt: 6.5 + bluntStaminaDamageFactor: 1.5 + heavyRateModifier: 0.9 + heavyStaminaCost: 5 + maxTargets: 1 + angle: 20 soundHit: collection: MetalThud - type: Item diff --git a/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml b/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml index 2f281e141a..f739de251c 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml @@ -34,9 +34,16 @@ - type: MeleeWeapon wideAnimationRotation: 45 attackRate: 0.8 + range: 1.75 damage: types: - Blunt: 10 + Blunt: 8 + bluntStaminaDamageFactor: 2.5 + heavyRateModifier: 0.8 + heavyDamageBaseModifier: 1.5 + heavyStaminaCost: 15 + maxTargets: 1 + angle: 140 - type: PhysicalComposition materialComposition: Steel: 185 diff --git a/Resources/Prototypes/Entities/Objects/Tools/jaws_of_life.yml b/Resources/Prototypes/Entities/Objects/Tools/jaws_of_life.yml index 8e2b759797..36d2f1308f 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/jaws_of_life.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/jaws_of_life.yml @@ -44,9 +44,18 @@ changeSound: /Audio/Items/change_jaws.ogg - type: MeleeWeapon wideAnimationRotation: 90 + attackRate: 0.75 + range: 1.75 damage: types: Blunt: 10 + Slash: 2 + bluntStaminaDamageFactor: 2.0 + heavyRateModifier: 0.8 + heavyDamageBaseModifier: 1.5 + heavyStaminaCost: 10 + maxTargets: 1 + angle: 20 soundHit: collection: MetalThud @@ -87,4 +96,5 @@ - type: MeleeWeapon damage: types: - Blunt: 14 + Blunt: 12 + Slash: 2 diff --git a/Resources/Prototypes/Entities/Objects/Tools/jetpacks.yml b/Resources/Prototypes/Entities/Objects/Tools/jetpacks.yml index d0ac9c7a78..a4c103847f 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/jetpacks.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/jetpacks.yml @@ -295,3 +295,43 @@ moles: - 1.025689525 # oxygen - 1.025689525 # nitrogen + +#Empty micro - Used in the Cyborg module, visually the same as mini jetpack. +- type: entity + id: JetpackMicro + parent: BaseJetpack + name: micro jetpack + suffix: Empty + components: + - type: Item + sprite: Objects/Tanks/Jetpacks/mini.rsi + - type: Sprite + sprite: Objects/Tanks/Jetpacks/mini.rsi + - type: Clothing + sprite: Objects/Tanks/Jetpacks/mini.rsi + slots: + - Back + - suitStorage + - Belt + - type: GasTank + outputPressure: 42.6 + air: + volume: 0.75 + + +# Filled micro +- type: entity + id: JetpackMicroFilled + parent: JetpackMicro + name: micro jetpack + suffix: Filled + components: + - type: GasTank + outputPressure: 42.6 + air: + # 2 minutes of thrust + volume: 0.75 + temperature: 293.15 + moles: + - 0.153853429 # oxygen + - 0.153853429 # nitrogen diff --git a/Resources/Prototypes/Entities/Objects/Tools/penlight.yml b/Resources/Prototypes/Entities/Objects/Tools/penlight.yml new file mode 100644 index 0000000000..7f8a9b262c --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Tools/penlight.yml @@ -0,0 +1,90 @@ +- type: entity + name: Pen Light + parent: Pen + id: PenLightBase + description: A pen-sized light, used by medical staff. + components: + - type: HandheldLight + addPrefix: false + - type: Sprite + sprite: Objects/Tools/penlight.rsi + layers: + - state: world + - state: world-on + shader: unshaded + visible: false + map: [ "light" ] + - type: Item + sprite: Objects/Tools/penlight.rsi + heldPrefix: off + - type: PointLight + enabled: false + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true + radius: 2 + netsync: false + - type: PenLight + examSpeed: 3 #time in seconds + - type: Appearance + - type: UserInterface + interfaces: + - key: enum.PenLightUiKey.Key + type: PenLightBoundUserInterface + - type: ToggleableLightVisuals + - type: ContainerContainer + containers: + cell_slot: !type:ContainerSlot {} + - type: PowerCellSlot + cellSlotId: cell_slot + - type: ItemSlots + slots: + cell_slot: + name: power-cell-slot-component-slot-name-default + startingItem: PowerCellSmall + - type: Tag + tags: + - Flashlight + - Write + - Pen + +- type: entity + name: Chief Medical Officer's Pen Light + parent: PenLightBase + id: CMOPenLight + description: A pen-sized light, this one belonging to the Chief Medical Officer. When you get promoted you get a better pen. + components: + - type: HandheldLight + addPrefix: false + - type: Sprite + sprite: Objects/Tools/cmopenlight.rsi + layers: + - state: world + - state: world-on + shader: unshaded + visible: false + map: [ "light" ] + - type: Item + sprite: Objects/Tools/cmopenlight.rsi + heldPrefix: off + - type: PointLight + enabled: false + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true + radius: 2 + netsync: false + - type: PenLight + examSpeed: 1.5 #time in seconds + - type: Appearance + - type: ToggleableLightVisuals + - type: PowerCellSlot + cellSlotId: cell_slot + - type: ItemSlots + slots: + cell_slot: + name: power-cell-slot-component-slot-name-default + startingItem: PowerCellSmall + - type: Tag + tags: + - Flashlight + - Write + - Pen diff --git a/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml b/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml index 9e35443cd4..6702ae39d6 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml @@ -21,9 +21,15 @@ - type: Item size: Ginormous - type: MeleeWeapon + attackRate: 0.9 + range: 1.75 damage: types: - Blunt: 12 + Blunt: 9 + bluntStaminaDamageFactor: 2.0 + heavyRateModifier: 0.8 + heavyStaminaCost: 10 + angle: 80.5 soundHit: path: "/Audio/Weapons/smash.ogg" - type: Tag @@ -134,7 +140,7 @@ - type: MeleeWeapon damage: types: - Blunt: 20 + Blunt: 11.5 - type: entity name: golden toolbox @@ -147,6 +153,10 @@ state: icon - type: Item sprite: Objects/Tools/Toolboxes/toolbox_gold.rsi + - type: MeleeWeapon + damage: + types: + Blunt: 12 - type: entity id: ToolboxThief diff --git a/Resources/Prototypes/Entities/Objects/Tools/tools.yml b/Resources/Prototypes/Entities/Objects/Tools/tools.yml index d135b2f29b..a6926f1d8c 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/tools.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/tools.yml @@ -31,10 +31,16 @@ - state: cutters-cutty-thingy - type: MeleeWeapon wideAnimationRotation: -90 + attackRate: 0.9 + range: 1.6 damage: types: - Piercing: 2 - attackRate: 2 #open and close that shit on their arm like hell! because you sure aren't doing any damage with this + Blunt: 6.5 + heavyRateModifier: 0.9 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 5 + maxTargets: 4 + angle: 60 soundHit: path: "/Audio/Items/wirecutter.ogg" - type: Tool @@ -91,10 +97,15 @@ storedRotation: -90 - type: MeleeWeapon wideAnimationRotation: -90 - attackRate: 1 + attackRate: 1.35 damage: types: Piercing: 6 + heavyRateModifier: 0.75 + heavyDamageBaseModifier: 1.5 + heavyStaminaCost: 5 + maxTargets: 1 + angle: 20 soundHit: path: "/Audio/Weapons/bladeslice.ogg" - type: Tool @@ -146,10 +157,16 @@ state: storage - type: MeleeWeapon wideAnimationRotation: 135 - attackRate: 1.5 + attackRate: 0.9 + range: 1.6 damage: types: - Blunt: 4.5 + Blunt: 6.5 + bluntStaminaDamageFactor: 1.5 + heavyRateModifier: 0.75 + heavyDamageBaseModifier: 1.75 + heavyStaminaCost: 5 + angle: 100 soundHit: collection: MetalThud - type: Tool @@ -198,9 +215,12 @@ state: storage - type: MeleeWeapon wideAnimationRotation: -135 + attackRate: 1.25 damage: types: - Blunt: 8 + Blunt: 6 + bluntStaminaDamageFactor: 2 + heavyStaminaCost: 5 soundHit: collection: MetalThud - type: Tool @@ -252,6 +272,16 @@ - state: icon - state: green-unlit shader: unshaded + - type: MeleeWeapon + attackRate: 0.75 + damage: + types: + Shock: 2 + heavyRateModifier: 0.9 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 5 + maxTargets: 1 + angle: 20 - type: Item size: Small - type: Clothing @@ -391,10 +421,16 @@ price: 100 - type: MeleeWeapon wideAnimationRotation: -90 - attackRate: 1.5 + attackRate: 0.9 + range: 1.4 damage: types: - Piercing: 10 + Piercing: 8 + heavyRateModifier: 0.9 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 5 + maxTargets: 1 + angle: 20 soundHit: path: "/Audio/Items/drill_hit.ogg" @@ -600,9 +636,16 @@ state: icon - type: MeleeWeapon wideAnimationRotation: 45 + attackRate: 0.8 + range: 2.0 damage: types: - Blunt: 14 + Blunt: 8 + bluntStaminaDamageFactor: 1.5 + heavyRateModifier: 0.9 + heavyDamageBaseModifier: 1.5 + heavyStaminaCost: 10 + angle: 100 soundHit: collection: MetalThud - type: Item @@ -642,9 +685,16 @@ - Belt - type: MeleeWeapon wideAnimationRotation: -135 + attackRate: 0.9 damage: types: Blunt: 7 + bluntStaminaDamageFactor: 2.0 + heavyRateModifier: 0.8 + heavyDamageBaseModifier: 1.5 + heavyStaminaCost: 5 + maxTargets: 1 + angle: 20 soundHit: collection: MetalThud - type: Tool diff --git a/Resources/Prototypes/Entities/Objects/Tools/welders.yml b/Resources/Prototypes/Entities/Objects/Tools/welders.yml index 8251be4433..c279bb0bde 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/welders.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/welders.yml @@ -55,7 +55,7 @@ collection: MetalThud activatedDamage: types: - Heat: 8 + Heat: 7 - type: ItemToggleSize activatedSize: Large - type: ItemToggleHot @@ -75,7 +75,7 @@ wideAnimationRotation: -90 damage: types: - Blunt: 5 #i mean... i GUESS you could use it like that + Blunt: 6 #i mean... i GUESS you could use it like that soundHit: collection: MetalThud - type: RefillableSolution diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Bombs/plastic.yml b/Resources/Prototypes/Entities/Objects/Weapons/Bombs/plastic.yml index 62f81fa546..b39c8af9b2 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Bombs/plastic.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Bombs/plastic.yml @@ -1,4 +1,4 @@ -- type: entity +- type: entity id: BasePlasticExplosive parent: BaseItem abstract: true @@ -106,3 +106,32 @@ maxIntensity: 30 canCreateVacuum: false - type: ExplodeOnTrigger + +- type: entity + name: breaching charge + description: A breaching explosive for security officers to break through walls. + parent: SeismicCharge + id: BreachingCharge + components: + - type: Sprite + sprite: Objects/Weapons/Bombs/breaching.rsi + state: icon + layers: + - state: icon + map: ["base"] + - type: OnUseTimerTrigger + delay: 10 + delayOptions: [10, 15, 20, 25] + initialBeepDelay: 0 + beepSound: + path: /Audio/Effects/Cargo/buzz_two.ogg + params: + volume: -6 + startOnStick: true + canToggleStartOnStick: true + - type: Explosive + explosionType: DemolitionCharge + totalIntensity: 10 + intensitySlope: 10 + maxIntensity: 10 + canCreateVacuum: false diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/baseball_bat.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/baseball_bat.yml index 834d35a529..8780d377e0 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/baseball_bat.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/baseball_bat.yml @@ -9,17 +9,24 @@ state: icon - type: MeleeWeapon wideAnimationRotation: -135 + range: 1.6 damage: types: - Blunt: 10 + Blunt: 7.5 Structural: 5 + bluntStaminaDamageFactor: 2.0 + heavyRateModifier: 0.5 + heavyDamageBaseModifier: 1.75 + heavyStaminaCost: 15 + maxTargets: 2 + angle: 120 soundHit: collection: MetalThud - type: Wieldable - type: IncreaseDamageOnWield damage: types: - Blunt: 5 + Blunt: 4 Structural: 10 - type: Item size: Normal diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/chainsaw.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/chainsaw.yml index bfdd94add6..b2727b334c 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/chainsaw.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/chainsaw.yml @@ -15,7 +15,6 @@ state: icon - type: MeleeWeapon autoAttack: true - angle: 0 wideAnimationRotation: -135 attackRate: 4 damage: @@ -23,6 +22,11 @@ Slash: 2 Blunt: 2 Structural: 4 + heavyRateModifier: 0.5 + heavyDamageBaseModifier: 1.0 + heavyStaminaCost: 15 + maxTargets: 20 + angle: 160 soundHit: path: /Audio/Weapons/chainsaw.ogg params: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/cult.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/cult.yml index ecb6479de7..5e9d789b65 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/cult.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/cult.yml @@ -10,10 +10,14 @@ state: icon - type: MeleeWeapon wideAnimationRotation: -135 - attackRate: 1.5 + attackRate: 1.25 + range: 1.4 damage: types: - Slash: 12 + Slash: 8 + heavyRateModifier: 0.9 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 5 - type: Item size: Normal - type: Clothing @@ -35,9 +39,14 @@ - type: MeleeWeapon wideAnimationRotation: -135 attackRate: 0.75 + range: 1.75 damage: types: - Slash: 16 + Slash: 12 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 10 + maxTargets: 6 + angle: 90 - type: Item size: Normal - type: Clothing @@ -62,19 +71,24 @@ - type: MeleeWeapon wideAnimationRotation: -135 attackRate: 0.75 + range: 1.75 damage: types: - Blunt: 10 - Slash: 10 + Blunt: 2 + Slash: 13 Structural: 5 + heavyRateModifier: 0.9 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 10 + angle: 100 soundHit: collection: MetalThud - type: Wieldable - type: IncreaseDamageOnWield damage: types: - Blunt: 5 - Slash: 5 + Blunt: 2 + Slash: 3 Structural: 10 - type: Item size: Ginormous diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml index bc376df5ea..0cbc824365 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml @@ -35,8 +35,8 @@ variation: 0.125 activatedDamage: types: - Slash: 15 - Heat: 15 + Slash: 8 + Heat: 10 Structural: 20 - type: Sprite sprite: Objects/Weapons/Melee/e_sword.rsi @@ -49,7 +49,7 @@ map: [ "blade" ] - type: MeleeWeapon wideAnimationRotation: -135 - attackRate: 1 + attackRate: 1.25 damage: types: Blunt: 4.5 @@ -106,8 +106,8 @@ variation: 0.250 activatedDamage: types: - Slash: 10 - Heat: 10 + Slash: 4 + Heat: 8 deactivatedSecret: true - type: ItemToggleActiveSound activeSound: @@ -245,8 +245,8 @@ variation: 0.250 activatedDamage: types: - Slash: 12 - Heat: 12 + Slash: 8 + Heat: 13 Structural: 15 - type: ItemToggleActiveSound activeSound: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/fireaxe.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/fireaxe.yml index 93765ec40c..b30a285579 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/fireaxe.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/fireaxe.yml @@ -18,16 +18,20 @@ damage: types: # axes are kinda like sharp hammers, you know? - Blunt: 5 - Slash: 10 + Blunt: 4 + Slash: 6 Structural: 10 + heavyDamageBaseModifier: 1.0 + heavyStaminaCost: 10 + angle: 100 soundHit: collection: MetalThud - type: Wieldable - type: IncreaseDamageOnWield damage: types: - Slash: 10 + Blunt: 2 + Slash: 5 Structural: 40 - type: Item size: Ginormous diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml index 9cd1bb2940..68f8863d11 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml @@ -12,9 +12,16 @@ - Knife - type: MeleeWeapon wideAnimationRotation: -135 + attackRate: 1.25 + range: 1.4 damage: types: - Slash: 10 + Slash: 8 + heavyRateModifier: 0.8 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 5 + maxTargets: 3 + angle: 40 soundHit: path: /Audio/Weapons/bladeslice.ogg - type: Sprite @@ -60,10 +67,11 @@ state: butch - type: MeleeWeapon wideAnimationRotation: -115 - attackRate: 1.5 + attackRate: 1 damage: types: - Slash: 13 + Slash: 8 + Blunt: 1 - type: Item size: Normal sprite: Objects/Weapons/Melee/cleaver.rsi @@ -87,15 +95,16 @@ - type: MeleeWeapon wideAnimationRotation: -135 attackRate: 1.5 + range: 1.4 damage: types: - Slash: 12 + Slash: 9 - type: EmbeddableProjectile sound: /Audio/Weapons/star_hit.ogg - type: DamageOtherOnHit damage: types: - Slash: 10 + Slash: 9 - type: Item sprite: Objects/Weapons/Melee/combat_knife.rsi - type: DisarmMalus @@ -110,6 +119,13 @@ - type: Sprite sprite: Objects/Weapons/Melee/survival_knife.rsi state: icon + - type: MeleeWeapon + wideAnimationRotation: -135 + attackRate: 1.25 + range: 1.5 + damage: + types: + Slash: 8 - type: Item sprite: Objects/Weapons/Melee/survival_knife.rsi @@ -124,9 +140,10 @@ state: icon - type: MeleeWeapon attackRate: 1.0 + range: 1.75 damage: types: - Slash: 15 + Slash: 10 - type: Item sprite: Objects/Weapons/Melee/kukri_knife.rsi @@ -186,7 +203,8 @@ sprite: Objects/Weapons/Melee/shiv.rsi state: icon - type: MeleeWeapon - attackRate: 1.5 + attackRate: 1.75 + range: 0.75 damage: types: Slash: 5.5 @@ -205,7 +223,6 @@ graph: ReinforcedShiv node: icon - type: MeleeWeapon - attackRate: 1.5 damage: types: Slash: 7 #each "tier" grants an additional 2 damage @@ -224,10 +241,9 @@ graph: PlasmaShiv node: icon - type: MeleeWeapon - attackRate: 1.5 damage: types: - Slash: 9 + Slash: 8.5 - type: Item sprite: Objects/Weapons/Melee/plasma_shiv.rsi - type: Sprite @@ -243,10 +259,9 @@ graph: UraniumShiv node: icon - type: MeleeWeapon - attackRate: 1.5 damage: types: - Slash: 7 + Slash: 6.5 Radiation: 4 - type: Item sprite: Objects/Weapons/Melee/uranium_shiv.rsi diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/mining.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/mining.yml index ccf45bf59a..a1addba262 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/mining.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/mining.yml @@ -43,12 +43,18 @@ capacity: 1 count: 1 - type: MeleeWeapon - attackRate: 1.5 + attackRate: 0.75 + range: 1.75 wideAnimationRotation: -135 damage: types: - Blunt: 10 - Slash: 5 + Blunt: 8 + Slash: 4 + bluntStaminaDamageFactor: 2.0 + heavyRateModifier: 0.75 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 10 + angle: 120 soundHit: collection: MetalThud - type: Wieldable @@ -79,10 +85,16 @@ - type: MeleeWeapon autoAttack: true wideAnimationRotation: -135 - attackRate: 2 + attackRate: 1.25 + range: 1.4 damage: types: - Slash: 15 + Slash: 9 + heavyRateModifier: 0.9 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 5 + maxTargets: 2 + angle: 20 - type: Tag tags: - Knife diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/pickaxe.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/pickaxe.yml index 324d4ee878..6ba659ccb4 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/pickaxe.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/pickaxe.yml @@ -11,21 +11,27 @@ sprite: Objects/Weapons/Melee/pickaxe.rsi state: pickaxe - type: MeleeWeapon - attackRate: 0.7 + attackRate: 0.75 + range: 1.75 wideAnimationRotation: -135 soundHit: path: "/Audio/Weapons/smash.ogg" params: volume: -3 damage: - groups: - Brute: 5 + types: + Blunt: 6 + Pierce: 3 + bluntStaminaDamageFactor: 2.0 + heavyDamageBaseModifier: 1.75 + heavyStaminaCost: 5 + maxTargets: 2 + angle: 60 - type: Wieldable - type: IncreaseDamageOnWield damage: - groups: - Brute: 10 types: + Blunt: 5 Structural: 30 - type: Item size: Normal @@ -52,16 +58,24 @@ state: handdrill - type: MeleeWeapon autoAttack: true - angle: 0 wideAnimationRotation: -90 soundHit: path: "/Audio/Items/drill_hit.ogg" - attackRate: 3.5 + attackRate: 0.5 + range: 1.4 damage: - groups: - Brute: 3 types: + Blunt: 9 + Slash: 3 Structural: 12 + bluntStaminaDamageFactor: 4.0 + heavyRateModifier: 1 + heavyRangeModifier: 2 + heavyDamageBaseModifier: 1 + heavyStaminaCost: 10 + maxTargets: 3 + angle: 20 + - type: ReverseEngineering # Nyano difficulty: 2 recipes: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/sledgehammer.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/sledgehammer.yml index 0c75015d9a..ecc84e5007 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/sledgehammer.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/sledgehammer.yml @@ -9,10 +9,18 @@ state: icon - type: MeleeWeapon wideAnimationRotation: -135 + attackRate: 0.8 + range: 1.75 damage: types: - Blunt: 10 + Blunt: 6 Structural: 10 + bluntStaminaDamageFactor: 2.0 + heavyRateModifier: 0.75 + heavyDamageBaseModifier: 1.75 + heavyStaminaCost: 15 + maxTargets: 10 + angle: 120 soundHit: collection: MetalThud - type: Wieldable diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/spear.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/spear.yml index 0def916ddc..576d0b2a0c 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/spear.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/spear.yml @@ -35,17 +35,24 @@ visible: false - type: MeleeWeapon wideAnimationRotation: -135 + range: 1.75 damage: types: - Piercing: 12 - angle: 0 + Piercing: 7 + Slash: 1 + heavyRateModifier: 0.75 + heavyRangeModifier: 1.25 + heavyDamageBaseModifier: 1.0 + heavyStaminaCost: 5 + maxTargets: 3 + angle: 20 animation: WeaponArcThrust soundHit: path: /Audio/Weapons/bladeslice.ogg - type: DamageOtherOnHit damage: types: - Piercing: 15 + Piercing: 10 - type: Item size: Ginormous - type: Clothing @@ -75,7 +82,8 @@ - type: IncreaseDamageOnWield damage: types: - Piercing: 4 + Piercing: 3 + Slash: 3 - type: Damageable damageContainer: Inorganic - type: Destructible @@ -124,11 +132,12 @@ wideAnimationRotation: -135 damage: types: - Piercing: 15 + Piercing: 8.5 + Slash: 1 - type: DamageOtherOnHit damage: types: - Piercing: 18 + Piercing: 12 - type: Construction graph: SpearReinforced @@ -144,11 +153,12 @@ wideAnimationRotation: -135 damage: types: - Piercing: 18 + Piercing: 9.5 + Slash: 1.5 - type: DamageOtherOnHit damage: types: - Piercing: 21 + Piercing: 14 - type: Construction graph: SpearPlasma @@ -164,13 +174,13 @@ wideAnimationRotation: -135 damage: types: - Piercing: 10 + Piercing: 8 Radiation: 8 - type: DamageOtherOnHit damage: types: - Piercing: 12 - Radiation: 9 + Piercing: 8 + Radiation: 8 - type: Construction graph: SpearUranium diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/stunprod.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/stunprod.yml index b0b166f6ce..d8955b4def 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/stunprod.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/stunprod.yml @@ -30,16 +30,23 @@ energyPerUse: 70 - type: MeleeWeapon wideAnimationRotation: -135 + attackRate: 0.8 + range: 1.4 damage: types: - Blunt: 9 + Blunt: 7.5 + bluntStaminaDamageFactor: 2.0 + heavyRateModifier: 0.8 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 5 + maxTargets: 3 angle: 60 animation: WeaponArcThrust - type: StaminaDamageOnHit - damage: 20 + damage: 22 sound: /Audio/Weapons/egloves.ogg - type: StaminaDamageOnCollide - damage: 20 + damage: 22 sound: /Audio/Weapons/egloves.ogg - type: Battery maxCharge: 360 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/sword.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/sword.yml index 17e31e5893..82b99ce37e 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/sword.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/sword.yml @@ -10,12 +10,19 @@ state: icon - type: MeleeWeapon wideAnimationRotation: -135 - attackRate: 1.5 + attackRate: 1.25 + range: 1.75 soundHit: path: /Audio/SimpleStation14/Weapons/Melee/rapierhit.ogg damage: types: Slash: 17 #cmon, it has to be at least BETTER than the rest. + heavyRateModifier: 0.8 + heavyRangeModifier: 1 + heavyDamageBaseModifier: 1 + heavyStaminaCost: 5 + maxTargets: 7 + angle: 80 - type: Reflect enabled: true reflectProb: .5 @@ -43,11 +50,18 @@ state: icon - type: MeleeWeapon wideAnimationRotation: -135 + attackRate: 1.5 soundHit: path: /Audio/SimpleStation14/Weapons/Melee/rapierhit.ogg damage: types: - Slash: 15 + Slash: 12 + heavyRateModifier: 0.5 + heavyRangeModifier: 3 #Superior Japanese folded steel + heavyDamageBaseModifier: 1.25 + heavyStaminaCost: 10 + maxTargets: 1 + angle: 20 - type: Item size: Normal sprite: DeltaV/Objects/Weapons/Melee/katana.rsi #DeltaV @@ -66,7 +80,7 @@ wideAnimationRotation: -60 damage: types: - Slash: 30 + Slash: 25 - type: Item size: Normal sprite: Objects/Weapons/Melee/energykatana.rsi @@ -99,9 +113,15 @@ state: icon - type: MeleeWeapon wideAnimationRotation: -135 + attackRate: 0.8 damage: types: Slash: 15 + heavyRateModifier: 0.8 + heavyRangeModifier: 1.25 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 10 + angle: 80 soundHit: path: /Audio/Weapons/bladeslice.ogg - type: Item @@ -121,10 +141,19 @@ state: icon - type: MeleeWeapon wideAnimationRotation: -135 - attackRate: 0.75 + attackRate: 0.65 + range: 1.85 damage: types: - Slash: 20 + Slash: 19 + Blunt: 1 + bluntStaminaDamageFactor: 25.0 + heavyRateModifier: 0.5 + heavyRangeModifier: 1 + heavyDamageBaseModifier: 1 + heavyStaminaCost: 20 + maxTargets: 10 + angle: 200 soundHit: path: /Audio/Weapons/bladeslice.ogg - type: Item @@ -150,9 +179,16 @@ state: icon - type: MeleeWeapon wideAnimationRotation: -135 + attackRate: 1.25 damage: types: - Slash: 16 + Slash: 12 + heavyRateModifier: 0.8 + heavyRangeModifier: 1.2 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 10 + maxTargets: 3 + angle: 40 soundHit: path: /Audio/Weapons/bladeslice.ogg - type: Item diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/white_cane.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/white_cane.yml index 6b24c96e30..123de813cb 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/white_cane.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/white_cane.yml @@ -12,16 +12,23 @@ sprite: Objects/Weapons/Melee/white_cane.rsi - type: MeleeWeapon wideAnimationRotation: 45 + attackRate: 0.9 + range: 1.6 damage: types: - Blunt: 5 - - type: StaminaDamageOnHit - damage: 5 + Blunt: 6 + bluntStaminaDamageFactor: 2.5 + heavyRateModifier: 0.5 + heavyRangeModifier: 1.75 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 0 + maxTargets: 1 + angle: 20 - type: Wieldable - type: IncreaseDamageOnWield damage: types: - Blunt: 3 + Blunt: 2 - type: UseDelay delay: 1 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml index 1cad73e30e..f25023b454 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml @@ -314,7 +314,7 @@ sprite: Objects/Weapons/Grenades/empgrenade.rsi - type: EmpOnTrigger range: 4 - energyConsumption: 50000 + energyConsumption: 2700000 - type: DeleteOnTrigger - type: Appearance - type: TimerTriggerVisuals diff --git a/Resources/Prototypes/Entities/Objects/Weapons/security.yml b/Resources/Prototypes/Entities/Objects/Weapons/security.yml index 9ac737e9cb..a952713dd5 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/security.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/security.yml @@ -35,6 +35,10 @@ types: Blunt: 7 bluntStaminaDamageFactor: 2.0 + heavyRateModifier: 0.75 + heavyDamageBaseModifier: 1.75 + heavyStaminaCost: 5 + maxTargets: 3 angle: 60 animation: WeaponArcSlash - type: StaminaDamageOnHit @@ -93,12 +97,16 @@ state: icon - type: MeleeWeapon wideAnimationRotation: -135 + attackRate: 0.8 damage: types: - Blunt: 20 + Blunt: 15 soundHit: collection: MetalThud - bluntStaminaDamageFactor: 1.5 + bluntStaminaDamageFactor: 2 + heavyRateModifier: 1 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 10 - type: Item size: Normal - type: Clothing diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml index 928e2b58f9..65e69ef223 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml @@ -11,7 +11,7 @@ layoutId: AirlockService - type: entity - parent: AirlockServiceLocked + parent: AirlockJustice # DeltaV - Lawyer is in Justice Dept id: AirlockLawyerLocked suffix: Lawyer, Locked components: @@ -421,8 +421,8 @@ layoutId: AirlockService - type: entity - parent: AirlockServiceGlassLocked - id: AirlockLawyerGlassLocked + parent: AirlockJusticeGlass + id: AirlockLawyerGlassLocked # DeltaV - Lawyer is in Justice Dept suffix: Lawyer, Locked components: - type: ContainerFill diff --git a/Resources/Prototypes/Entities/Structures/Doors/airlock_groups.yml b/Resources/Prototypes/Entities/Structures/Doors/airlock_groups.yml index dfb37f4986..2cb30277d2 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/airlock_groups.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/airlock_groups.yml @@ -13,6 +13,7 @@ science: Structures/Doors/Airlocks/Standard/science.rsi security: Structures/Doors/Airlocks/Standard/security.rsi virology: Structures/Doors/Airlocks/Standard/virology.rsi + justice: DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi # Delta V - Add Justice Dept - type: AirlockGroup id: Glass @@ -28,6 +29,7 @@ medical: Structures/Doors/Airlocks/Glass/medical.rsi security: Structures/Doors/Airlocks/Glass/security.rsi virology: Structures/Doors/Airlocks/Glass/virology.rsi + justice: DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi # Delta V - Add Justice Dept - type: AirlockGroup id: Windoor diff --git a/Resources/Prototypes/Entities/Structures/Furniture/dresser.yml b/Resources/Prototypes/Entities/Structures/Furniture/dresser.yml index 2caa4010ca..1d0a25ed85 100644 --- a/Resources/Prototypes/Entities/Structures/Furniture/dresser.yml +++ b/Resources/Prototypes/Entities/Structures/Furniture/dresser.yml @@ -51,6 +51,8 @@ parent: Dresser suffix: Filled components: + - type: StaticPrice + price: 15 - type: StorageFill contents: - id: ClothingNeckLGBTPin diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml index 5f5d4aebe3..4a854cd96a 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml @@ -169,6 +169,7 @@ - ShellTranquilizer - CartridgeLightRifle - CartridgeRifle + - CombatKnife - MagazineBoxPistol - MagazineBoxMagnum - MagazineBoxRifle @@ -593,6 +594,8 @@ - BorgModuleAdvancedTool - BorgModuleGPS - BorgModuleRCD + - BorgModuleJetpack + - BorgModulePka - BorgModuleArtifact - BorgModuleAnomaly - BorgModuleGardening @@ -706,6 +709,7 @@ runningState: icon staticRecipes: - ClothingEyesHudSecurity + - CombatKnife - Flash - Handcuffs - Zipties diff --git a/Resources/Prototypes/Entities/Structures/Machines/telecomms.yml b/Resources/Prototypes/Entities/Structures/Machines/telecomms.yml index 6cc1fc7981..2a7d827522 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/telecomms.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/telecomms.yml @@ -80,3 +80,85 @@ - EncryptionKeySecurity - EncryptionKeyService - EncryptionKeyCommand + - EncryptionKeyJustice #DeltaV - Justice dept + +- type: entity + parent: TelecomServer + id: TelecomServerFilledCommon + suffix: Common + components: + - type: ContainerFill + containers: + key_slots: + - EncryptionKeyCommon + +- type: entity + parent: TelecomServer + id: TelecomServerFilledCargo + suffix: Cargo + components: + - type: ContainerFill + containers: + key_slots: + - EncryptionKeyCargo + +- type: entity + parent: TelecomServer + id: TelecomServerFilledEngineering + suffix: Engineering + components: + - type: ContainerFill + containers: + key_slots: + - EncryptionKeyEngineering + +- type: entity + parent: TelecomServer + id: TelecomServerFilledMedical + suffix: Medical + components: + - type: ContainerFill + containers: + key_slots: + - EncryptionKeyMedical + +- type: entity + parent: TelecomServer + id: TelecomServerFilledScience + suffix: Science + components: + - type: ContainerFill + containers: + key_slots: + - EncryptionKeyScience + +- type: entity + parent: TelecomServer + id: TelecomServerFilledSecurity + suffix: Security + components: + - type: ContainerFill + containers: + key_slots: + - EncryptionKeySecurity + - EncryptionKeyJustice #DeltaV - Justice dept + +- type: entity + parent: TelecomServer + id: TelecomServerFilledService + suffix: Service + components: + - type: ContainerFill + containers: + key_slots: + - EncryptionKeyService + +- type: entity + parent: TelecomServer + id: TelecomServerFilledCommand + suffix: Command + components: + - type: ContainerFill + containers: + key_slots: + - EncryptionKeyCommand diff --git a/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml b/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml index fcc6e4974c..02cdd80af3 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml @@ -322,7 +322,7 @@ parent: VendingMachine id: VendingMachineClothing name: ClothesMate - description: A vending machine for clothing. + description: A vending machine for dispensing the cheapest clothing Nanotrasen can buy. components: - type: VendingMachine pack: ClothesMateInventory diff --git a/Resources/Prototypes/Entities/Structures/Power/Generation/Supermatter/supermatter.yml b/Resources/Prototypes/Entities/Structures/Power/Generation/Supermatter/supermatter.yml index 1f3708ce65..6fc3429600 100644 --- a/Resources/Prototypes/Entities/Structures/Power/Generation/Supermatter/supermatter.yml +++ b/Resources/Prototypes/Entities/Structures/Power/Generation/Supermatter/supermatter.yml @@ -6,12 +6,6 @@ mode: SnapgridCenter components: - type: Supermatter - whitelist: - tags: - - EmitterBolt - components: - - Body - - Item - type: RadiationSource - type: AmbientSound range: 5 diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Structures/Research/oracle.yml b/Resources/Prototypes/Entities/Structures/Specific/oracle.yml similarity index 56% rename from Resources/Prototypes/Nyanotrasen/Entities/Structures/Research/oracle.yml rename to Resources/Prototypes/Entities/Structures/Specific/oracle.yml index 8470737c70..754ab82c00 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Structures/Research/oracle.yml +++ b/Resources/Prototypes/Entities/Structures/Specific/oracle.yml @@ -13,7 +13,6 @@ - state: oracle-0 - map: ["enum.SolutionContainerLayers.Fill"] state: oracle-0 - - type: Oracle - type: Speech speechSounds: Tenor - type: PotentialPsionic @@ -45,6 +44,46 @@ - type: SpriteFade - type: Tag tags: [] - - type: GuideHelp - guides: - - Psionics + - type: Oracle + demandTypes: OracleDemandTypes + rewardReagents: OracleRewardReagents + rewardEntities: + - OracleRewardDisks + - OracleRewardCrystals + demandBlacklist: + tags: + - Bluespace + components: + - MobState + demandWhitelist: + components: + - Item + + +- type: weightedRandomEntity + id: OracleRewardDisks + weights: + ResearchDisk5000: 20 + ResearchDisk10000: 5 + ResearchDisk20000: 1 + +- type: weightedRandomEntity + id: OracleRewardCrystals + weights: + MaterialBluespace1: 3 + MaterialBluespace3: 10 + MaterialBluespace5: 2 + +- type: weightedRandom + id: OracleRewardReagents + weights: + LotophagoiOil: 7 + Ichor: 2 + Wine: 1.2 + Blood: 0.8 + +- type: weightedRandom + id: OracleDemandTypes + weights: + tech: 3 + plant: 1 # Plants are very annoying to procure most of the time diff --git a/Resources/Prototypes/Entities/Structures/Storage/Canisters/gas_canisters.yml b/Resources/Prototypes/Entities/Structures/Storage/Canisters/gas_canisters.yml index cd44f5f585..52b008c7f2 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Canisters/gas_canisters.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Canisters/gas_canisters.yml @@ -98,6 +98,7 @@ whitelist: components: - GasTank + - BorgJetpack - type: StaticPrice price: 1000 - type: AccessReader diff --git a/Resources/Prototypes/Entities/Structures/Wallmounts/radalarm.yml b/Resources/Prototypes/Entities/Structures/Wallmounts/radalarm.yml new file mode 100644 index 0000000000..44bbe3e617 --- /dev/null +++ b/Resources/Prototypes/Entities/Structures/Wallmounts/radalarm.yml @@ -0,0 +1,51 @@ +- type: entity + id: GeigerCounterWallMount + name: wall-mounted Geiger counter + description: A stationary device that emits a warning tone when it detects radiation pulses. + placement: + mode: SnapgridCenter + snap: + - Wallmount + components: + - type: InteractionOutline + - type: Clickable + - type: Rotatable + rotateWhileAnchored: false + rotateWhilePulling: true + - type: WallMount + - type: Transform + noRot: false + anchored: true + - type: Sprite + noRot: true + drawdepth: WallMountedItems + sprite: Structures/Wallmounts/radalarm.rsi + layers: + - state: geiger_base + - state: geiger_on_idle + map: ["enum.GeigerLayers.Screen"] + shader: unshaded + visible: false + - type: Geiger + showControl: true + showExamine: true + localSoundOnly: false + audioParameters: + volume: -4 + maxDistance: 10 + rolloffFactor: 4 + - type: Appearance + - type: GenericVisualizer + visuals: + enum.GeigerVisuals.IsEnabled: + GeigerLayers.Screen: + True: { visible: True } + False: { visible: False } + enum.GeigerVisuals.DangerLevel: + GeigerLayers.Screen: + None: {state: geiger_on_idle} + Low: {state: geiger_on_low} + Med: {state: geiger_on_med} + High: {state: geiger_on_high} + Extreme: {state: geiger_on_ext} + diff --git a/Resources/Prototypes/Entities/Supermatter/supermatter.yml b/Resources/Prototypes/Entities/Supermatter/supermatter.yml deleted file mode 100644 index 6d63f16208..0000000000 --- a/Resources/Prototypes/Entities/Supermatter/supermatter.yml +++ /dev/null @@ -1,74 +0,0 @@ -- type: entity - id: supermatter - name: Supermatter - description: A strangely translucent and iridescent crystal. - placement: - mode: SnapgridCenter - components: - - type: Supermatter - whitelist: - tags: - - EmitterBolt - components: - - Body - - Item - - type: RadiationSource - - type: AmbientSound - range: 5 - volume: -5 - sound: - path: /Audio/Supermatter/calm.ogg - - type: Physics - - type: Speech - speechSounds: Pai - - type: Fixtures - fixtures: - fix1: - shape: - !type:PhysShapeAabb - bounds: "-0.25,-0.25,0.25,0.25" - mask: - - Impassable - - MidImpassable - - HighImpassable - - LowImpassable - - InteractImpassable - - Opaque - layer: - - MidImpassable - - HighImpassable - - BulletImpassable - - InteractImpassable - - type: Transform - anchored: true - noRot: true - - type: CollisionWake - enabled: false - - type: Clickable - - type: InteractionOutline - - type: Sprite - drawdepth: WallMountedItems - sprite: Supermatter/supermatter.rsi - state: supermatter - - type: Icon - sprite: Supermatter/supermatter.rsi - state: supermatter - - type: PointLight - enabled: true - radius: 10 - energy: 5 - color: "#d9ce00" - - type: Explosive - explosionType: Supermatter - maxIntensity: 10000 - intensitySlope: 10 - totalIntensity: 10000 - - type: IntrinsicRadioReceiver - channels: - - Engineering - - type: IntrinsicRadioTransmitter - channels: - - Engineering - - type: ActiveRadio - channels: - - Engineering diff --git a/Resources/Prototypes/Guidebook/engineering.yml b/Resources/Prototypes/Guidebook/engineering.yml index ef502d8ab4..eaa486e96c 100644 --- a/Resources/Prototypes/Guidebook/engineering.yml +++ b/Resources/Prototypes/Guidebook/engineering.yml @@ -13,9 +13,9 @@ id: Construction name: guide-entry-construction text: "/ServerInfo/Guidebook/Engineering/Construction.xml" - children: + children: - AirlockSecurity - + - type: guideEntry id: AirlockSecurity name: guide-entry-airlock-security @@ -96,4 +96,4 @@ - type: guideEntry id: Supermatter name: guide-entry-sm - text: "/ServerInfo/Guidebook/Engineering/Supermatter.xml" \ No newline at end of file + text: "/ServerInfo/Guidebook/Engineering/Supermatter.xml" diff --git a/Resources/Prototypes/Loadouts/Jobs/security.yml b/Resources/Prototypes/Loadouts/Jobs/security.yml index c6a78ad5d2..f1c6473037 100644 --- a/Resources/Prototypes/Loadouts/Jobs/security.yml +++ b/Resources/Prototypes/Loadouts/Jobs/security.yml @@ -363,6 +363,22 @@ items: - ClothingBeltSecurityWebbingFilled +# Equipment +- type: loadout + id: LoadoutSecurityCombatKnife + category: Jobs + cost: 1 + requirements: + - !type:CharacterSpeciesRequirement + species: + - Diona + - Harpy + - !type:CharacterDepartmentRequirement + departments: + - Security + items: + - CombatKnife + # TODO: Make this replace the secoff handgun and make it cheaper # # Species # - type: loadout diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Belt/belts.yml b/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Belt/belts.yml index 4f2ac846ef..8847f8d03a 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Belt/belts.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Belt/belts.yml @@ -1,7 +1,7 @@ - type: entity parent: ClothingBeltStorageBase id: ClothingBeltMantis - name: psionic mantis' belt # DeltaV - Rename Forensic Mantis to Psionic Mantis + name: mantis' belt description: Perfect for storing all of your equipment. components: - type: Sprite diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Head/hats.yml b/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Head/hats.yml index 781e42c172..6f778fa7f9 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Head/hats.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Head/hats.yml @@ -129,7 +129,7 @@ - type: entity parent: ClothingHeadBase id: ClothingHeadHatFezMantis - name: psionic mantis' fez # DeltaV - Rename Forensic Mantis to Psionic Mantis + name: mantis' fez description: A fine red fez with a gold tassel. components: - type: Sprite diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Clothing/OuterClothing/coats.yml b/Resources/Prototypes/Nyanotrasen/Entities/Clothing/OuterClothing/coats.yml index a16f6cd221..75f8c7ddd0 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Clothing/OuterClothing/coats.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Clothing/OuterClothing/coats.yml @@ -1,7 +1,7 @@ - type: entity parent: ClothingOuterStorageBase id: ClothingOuterCoatMantis - name: psionic mantis' jacket # DeltaV - Rename Forensic Mantis to Psionic Mantis + name: mantis' jacket description: Modeled after an ancient infantry uniform, this jacket may guard you against the unknown in your journey for the truth. components: - type: Sprite diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Clothing/OuterClothing/wintercoats.yml b/Resources/Prototypes/Nyanotrasen/Entities/Clothing/OuterClothing/wintercoats.yml index b83cd75fc1..748ae0e9a4 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Clothing/OuterClothing/wintercoats.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Clothing/OuterClothing/wintercoats.yml @@ -47,7 +47,7 @@ - type: entity parent: ClothingOuterWinterCoat id: ClothingOuterWinterCoatMantis - name: psionic mantis' winter coat # DeltaV - Rename Forensic Mantis to Psionic Mantis + name: mantis' winter coat description: Solve cold cases in style. components: - type: Sprite diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Shoes/boots.yml b/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Shoes/boots.yml index 4b1cec27f6..207abcba80 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Shoes/boots.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Shoes/boots.yml @@ -1,7 +1,7 @@ - type: entity parent: ClothingShoesBaseButcherable id: ClothingShoesBootsMantis - name: psionic mantis' boots # DeltaV - Rename Forensic Mantis to Psionic Mantis + name: mantis' boots description: Soft, comfortable, and good for rough terrain. components: - type: Sprite diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Uniforms/jumpsuits.yml b/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Uniforms/jumpsuits.yml index 11f6d32b5c..b238ef7b06 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Uniforms/jumpsuits.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Uniforms/jumpsuits.yml @@ -72,7 +72,7 @@ - type: entity parent: ClothingUniformBase id: ClothingUniformJumpsuitMantis - name: psionic mantis' uniform # DeltaV - Rename Forensic Mantis to Psionic Mantis + name: mantis' uniform description: Modeled after an ancient infantry uniform, this uniform has superior mobility for tense situations. components: - type: Sprite @@ -83,7 +83,7 @@ - type: entity parent: ClothingUniformSkirtBase id: ClothingUniformSkirtMantis - name: psionic mantis' jumpskirt # DeltaV - Rename Forensic Mantis to Psionic Mantis + name: mantis' jumpskirt description: Adapted from an ancient infantry uniform, this jumpskirt has superior mobility for tense situations. components: - type: Sprite diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/jobs.yml b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/jobs.yml index ebe73808e5..62a24bd75b 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/jobs.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/jobs.yml @@ -65,7 +65,7 @@ - type: entity id: SpawnPointForensicMantis parent: SpawnPointJobBase - name: psionic mantis # DeltaV - Rename Forensic Mantis to Psionic Mantis + name: mantis components: - type: SpawnPoint job_id: ForensicMantis diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/Oni.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/Oni.yml index 1166d8a29f..8e9e2c62df 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/Oni.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/Oni.yml @@ -5,11 +5,6 @@ id: MobOni components: - type: CombatMode - - type: InteractionPopup - successChance: 1 - interactSuccessString: hugging-success-generic - interactSuccessSound: /Audio/Effects/thudswoosh.ogg - messagePerceivedByOthers: hugging-success-generic-others - type: MindContainer showExamineInfo: true - type: Input diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/felinid.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/felinid.yml index 94ac8403ad..f3dbd396e5 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/felinid.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/felinid.yml @@ -5,11 +5,6 @@ id: MobFelinid components: - type: CombatMode - - type: InteractionPopup - successChance: 1 - interactSuccessString: hugging-success-generic - interactSuccessSound: /Audio/Effects/thudswoosh.ogg - messagePerceivedByOthers: hugging-success-generic-others - type: MindContainer showExamineInfo: true - type: Input diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Devices/Misc/identification_cards.yml b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Devices/Misc/identification_cards.yml index 94efc40530..4338b83685 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Devices/Misc/identification_cards.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Devices/Misc/identification_cards.yml @@ -82,7 +82,7 @@ - type: entity parent: IDCardStandard id: ForensicMantisIDCard - name: psionic mantis ID card # DeltaV - Rename Forensic Mantis to Psionic Mantis + name: mantis ID card components: - type: Sprite layers: diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Devices/pda.yml b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Devices/pda.yml index 4e6115ba33..d898124b77 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Devices/pda.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Devices/pda.yml @@ -99,7 +99,7 @@ - type: entity parent: BasePDA id: ForensicMantisPDA - name: psionic mantis PDA # DeltaV - Rename Forensic Mantis to Psionic Mantis + name: mantis PDA description: Smells like illegal substances. components: - type: Pda diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Materials/materials.yml b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Materials/materials.yml index 75bb4727da..5aed17363b 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Materials/materials.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Materials/materials.yml @@ -1,47 +1,3 @@ -- type: entity - parent: MaterialBase - id: MaterialBluespace - suffix: Full - name: bluespace crystal - components: - - type: Sprite - sprite: Nyanotrasen/Objects/Materials/materials.rsi - layers: - - state: bluespace_3 - map: ["base"] - - type: Appearance - - type: Material - - type: PhysicalComposition - materialComposition: - Bluespace: 100 - - type: Tag - tags: - - BluespaceCrystal - - RawMaterial - - type: Stack - stackType: Bluespace - baseLayer: base - layerStates: - - bluespace - - bluespace_2 - - bluespace_3 - count: 5 - - type: Item - size: Small - -- type: entity - parent: MaterialBluespace - id: MaterialBluespace1 - suffix: 1 - components: - - type: Sprite - state: bluespace - - type: Stack - stackType: Bluespace - count: 1 - - type: Item - size: Tiny - - type: entity parent: BaseItem id: HideMothroach diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Misc/paper.yml b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Misc/paper.yml index 22361c9aef..b381aaa0c7 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Misc/paper.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Misc/paper.yml @@ -1,5 +1,5 @@ - type: entity - name: psionic mantis' seal # DeltaV - Rename Forensic Mantis to Psionic Mantis + name: mantis' seal parent: RubberStampBase id: RubberStampMantis suffix: DO NOT MAP diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Structures/Storage/Closets/Lockers/lockers.yml b/Resources/Prototypes/Nyanotrasen/Entities/Structures/Storage/Closets/Lockers/lockers.yml index 2744f965e0..fe25a9cc53 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Structures/Storage/Closets/Lockers/lockers.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Structures/Storage/Closets/Lockers/lockers.yml @@ -2,7 +2,7 @@ id: LockerForensicMantis parent: LockerDetective suffix: Empty - name: psionic mantis' cabinet # DeltaV - Rename Forensic Mantis to Psionic Mantis + name: mantis' cabinet description: You'll never know what's inside until you collapse the quantum superposition of all possible mysteries. components: # Because it holds a traitor objective, StrongMetallic, diff --git a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Security/prisonguard.yml b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Security/prisonguard.yml index 8dfcd14a87..924f0e2418 100644 --- a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Security/prisonguard.yml +++ b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Security/prisonguard.yml @@ -30,7 +30,7 @@ equipment: jumpsuit: ClothingUniformJumpsuitPrisonGuard back: ClothingBackpackSecurityFilled - shoes: ClothingShoesBootsJack + shoes: ClothingShoesBootsCombatFilled eyes: ClothingEyesGlassesSecurity head: ClothingHeadPrisonGuard id: PrisonGuardPDA diff --git a/Resources/Prototypes/Palettes/departmental.yml b/Resources/Prototypes/Palettes/departmental.yml index bf08e46d1c..cf79349157 100644 --- a/Resources/Prototypes/Palettes/departmental.yml +++ b/Resources/Prototypes/Palettes/departmental.yml @@ -1,4 +1,4 @@ -- type: palette +- type: palette id: Departmental name: Departmental colors: @@ -10,6 +10,7 @@ bar: "#79150096" science: "#D381C996" logistics: "#A4610696" # DeltaV - Logistics Department replacing Cargo + justice: "#6b2833DD" #DeltaV - Added Justice Department janitor: "#8c347f96" chemistry: "#fa750096" virology: "#43990996" diff --git a/Resources/Prototypes/Reagents/Consumable/Drink/alcohol.yml b/Resources/Prototypes/Reagents/Consumable/Drink/alcohol.yml index 12f5a80185..e31087c309 100644 --- a/Resources/Prototypes/Reagents/Consumable/Drink/alcohol.yml +++ b/Resources/Prototypes/Reagents/Consumable/Drink/alcohol.yml @@ -164,41 +164,95 @@ conditions: - !type:ReagentThreshold min: 15 - - !type:OrganType - type: Dwarf - shouldHave: false damage: types: Poison: 1 - # dwarves take less toxin damage and heal a marginal amount of brute - - !type:HealthChange + - !type:ChemVomit + probability: 0.04 conditions: - !type:ReagentThreshold - min: 15 + reagent: Ethanol + min: 12 + # dwarves immune to vomiting from alcohol - !type:OrganType type: Dwarf - damage: + shouldHave: false + # Drunken Resilience + - !type:HealthChange + conditions: + - !type:OrganType + type: LiquorLifeline + - !type:ReagentThreshold + reagent: Ethanol + min: 0.10 + max: 0.49 + damage: # NOTE: all damage sets for LiquorLifeline are halved due to + groups: # LightweightDrunkComponent making ethanol half as potent + Brute: -0.4 types: - Poison: 0.2 + Heat: -0.13 + Shock: -0.13 + Cold: -0.13 - !type:HealthChange conditions: + - !type:OrganType + type: LiquorLifeline - !type:ReagentThreshold - min: 15 + reagent: Ethanol + min: 0.50 + max: 6.99 + damage: + groups: + Brute: -0.8 + types: + Heat: -0.26 + Shock: -0.26 + Cold: -0.26 + - !type:HealthChange + conditions: - !type:OrganType - type: Dwarf + type: LiquorLifeline + - !type:ReagentThreshold + reagent: Ethanol + min: 7.00 + max: 10.99 damage: groups: - Brute: -1 - - !type:ChemVomit - probability: 0.04 + Brute: -1.6 + types: + Heat: -0.53 + Shock: -0.53 + Cold: -0.53 + - !type:HealthChange conditions: + - !type:OrganType + type: LiquorLifeline - !type:ReagentThreshold reagent: Ethanol - min: 12 - # dwarves immune to vomiting from alcohol + min: 11 + max: 14.99 + damage: + groups: + Brute: -3.2 + types: + Heat: -1.06 + Shock: -1.06 + Cold: -1.06 + - !type:HealthChange + conditions: - !type:OrganType - type: Dwarf - shouldHave: false + type: LiquorLifeline + - !type:ReagentThreshold + reagent: Ethanol + min: 15 # Overdose threshold + damage: + groups: + Brute: -4.8 + Burn: -4.8 + types: + Heat: -1.60 + Shock: -1.60 + Cold: -1.60 - !type:Drunk boozePower: 2 diff --git a/Resources/Prototypes/Nyanotrasen/Reagents/psionic.yml b/Resources/Prototypes/Reagents/psionic.yml similarity index 100% rename from Resources/Prototypes/Nyanotrasen/Reagents/psionic.yml rename to Resources/Prototypes/Reagents/psionic.yml diff --git a/Resources/Prototypes/Recipes/Cooking/medical_recipes.yml b/Resources/Prototypes/Recipes/Cooking/medical_recipes.yml index 9d1947f03e..03ca520358 100644 --- a/Resources/Prototypes/Recipes/Cooking/medical_recipes.yml +++ b/Resources/Prototypes/Recipes/Cooking/medical_recipes.yml @@ -2,7 +2,7 @@ id: RecipeAloeCream name: aloe cream recipe result: AloeCream - time: 10 + time: 15 solids: FoodAloe: 1 diff --git a/Resources/Prototypes/Recipes/Lathes/robotics.yml b/Resources/Prototypes/Recipes/Lathes/robotics.yml index 44a9e2f0f2..2dc0a65748 100644 --- a/Resources/Prototypes/Recipes/Lathes/robotics.yml +++ b/Resources/Prototypes/Recipes/Lathes/robotics.yml @@ -612,3 +612,27 @@ Steel: 250 Glass: 250 Plastic: 250 + +- type: latheRecipe + id: BorgModulePka + result: BorgModulePka + category: Robotics + completetime: 3 + materials: + Steel: 1000 + Glass: 500 + Plastic: 500 + Silver: 100 + +- type: latheRecipe + id: BorgModuleJetpack + result: BorgModuleJetpack + category: Robotics + completetime: 3 + materials: + Steel: 250 + Glass: 250 + Plastic: 250 + Gold: 100 + Plasma: 1000 + diff --git a/Resources/Prototypes/Recipes/Lathes/security.yml b/Resources/Prototypes/Recipes/Lathes/security.yml index ffa74d460f..08e11e4ff8 100644 --- a/Resources/Prototypes/Recipes/Lathes/security.yml +++ b/Resources/Prototypes/Recipes/Lathes/security.yml @@ -30,6 +30,15 @@ Steel: 300 Plastic: 300 +- type: latheRecipe + id: CombatKnife + result: CombatKnife + category: Weapons + completetime: 2 + materials: + Steel: 250 + Plastic: 100 + - type: latheRecipe id: WeaponLaserCarbine result: WeaponLaserCarbine diff --git a/Resources/Prototypes/Research/industrial.yml b/Resources/Prototypes/Research/industrial.yml index d3bc03bfbf..3cee547c06 100644 --- a/Resources/Prototypes/Research/industrial.yml +++ b/Resources/Prototypes/Research/industrial.yml @@ -179,6 +179,19 @@ - BorgModuleAdvancedTool - BorgModuleRCD +- type: technology + id: MechanizedSalvaging + name: research-technology-mechanized-salvaging + icon: + sprite: Mobs/Silicon/chassis.rsi + state: miner + discipline: Industrial + tier: 2 + cost: 10000 + recipeUnlocks: + - BorgModulePka + - BorgModuleJetpack + # Tier 3 - type: technology diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/lawyer.yml b/Resources/Prototypes/Roles/Jobs/Civilian/lawyer.yml index a80d0d37ed..8f8d8e700f 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/lawyer.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/lawyer.yml @@ -12,7 +12,7 @@ # time: 14400 # 4 hours startingGear: LawyerGear icon: "JobIconLawyer" - supervisors: job-supervisors-hop + supervisors: job-supervisors-cj # Delta V - Change supervisor to chief justice access: - Service - Lawyer diff --git a/Resources/Prototypes/Roles/Jobs/Security/detective.yml b/Resources/Prototypes/Roles/Jobs/Security/detective.yml index e293e14981..fe841aa4da 100644 --- a/Resources/Prototypes/Roles/Jobs/Security/detective.yml +++ b/Resources/Prototypes/Roles/Jobs/Security/detective.yml @@ -17,6 +17,8 @@ - Maintenance - Service - Detective + - External + - Cryogenics special: - !type:AddImplantSpecial implants: [ MindShieldImplant ] diff --git a/Resources/Prototypes/Roles/Jobs/departments.yml b/Resources/Prototypes/Roles/Jobs/departments.yml index 483f8fcb98..084fe1a813 100644 --- a/Resources/Prototypes/Roles/Jobs/departments.yml +++ b/Resources/Prototypes/Roles/Jobs/departments.yml @@ -23,7 +23,7 @@ - Clown - HeadOfPersonnel - Janitor - - Lawyer + # - Lawyer # DeltaV - Move Lawyer into Justice - Librarian - Mime - Musician diff --git a/Resources/Prototypes/Roles/play_time_trackers.yml b/Resources/Prototypes/Roles/play_time_trackers.yml index 35b9235770..27043cfbfe 100644 --- a/Resources/Prototypes/Roles/play_time_trackers.yml +++ b/Resources/Prototypes/Roles/play_time_trackers.yml @@ -37,12 +37,18 @@ - type: playTimeTracker id: JobChiefEngineer +- type: playTimeTracker + id: JobChiefJustice + - type: playTimeTracker id: JobChiefMedicalOfficer - type: playTimeTracker id: JobClown +- type: playTimeTracker + id: JobClerk + - type: playTimeTracker id: JobDetective @@ -100,6 +106,9 @@ - type: playTimeTracker id: JobPsychologist +- type: playTimeTracker + id: JobProsecutor + - type: playTimeTracker id: JobQuartermaster diff --git a/Resources/Prototypes/StatusEffects/job.yml b/Resources/Prototypes/StatusEffects/job.yml index aec3f5e69d..a63e87ea7f 100644 --- a/Resources/Prototypes/StatusEffects/job.yml +++ b/Resources/Prototypes/StatusEffects/job.yml @@ -121,8 +121,8 @@ parent: JobIcon id: JobIconLawyer icon: - sprite: /Textures/Interface/Misc/job_icons.rsi - state: Lawyer + sprite: /Textures/DeltaV/Interface/Misc/job_icons.rsi # DeltaV - Move Lawyer into Justice + state: Lawyer # DeltaV - Move Lawyer into Justice - type: statusIcon parent: JobIcon diff --git a/Resources/Prototypes/Traits/disabilities.yml b/Resources/Prototypes/Traits/disabilities.yml index eb96d37e01..ca2453e41a 100644 --- a/Resources/Prototypes/Traits/disabilities.yml +++ b/Resources/Prototypes/Traits/disabilities.yml @@ -94,3 +94,80 @@ - MedicalBorg components: - type: Snoring + +- type: trait + id: Sluggish + category: Physical + points: 1 + requirements: + - !type:CharacterTraitRequirement + inverted: true + traits: + - ParkourTraining + - SnailPaced + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + components: + - type: TraitSpeedModifier + sprintModifier: 0.85 + walkModifier: 0.85 + - type: ClimbDelayModifier + climbDelayMultiplier: 1.35 + - type: LayingDownModifier + layingDownCooldownMultiplier: 1.2 + +- type: trait + id: SnailPaced + category: Physical + points: 2 + requirements: + - !type:CharacterTraitRequirement + inverted: true + traits: + - ParkourTraining + - Sluggish + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + components: + - type: TraitSpeedModifier + sprintModifier: 0.7 + walkModifier: 0.7 + - type: ClimbDelayModifier + climbDelayMultiplier: 1.66 + - type: LayingDownModifier + layingDownCooldownMultiplier: 1.6 + +- type: trait + id: BloodDeficiency + category: Physical + points: 2 + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - Borg + - MedicalBorg + components: + - type: BloodDeficiency # 0.07 = start taking bloodloss damage at around ~21.4 minutes, + bloodLossAmount: 0.07 # then become crit ~10 minutes later + +- type: trait + id: Hemophilia + category: Physical + points: 1 + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - Borg + - MedicalBorg + components: + - type: Hemophilia + bleedReductionModifier: 0.5 + damageModifiers: + coefficients: + Blunt: 1.1 diff --git a/Resources/Prototypes/Traits/inconveniences.yml b/Resources/Prototypes/Traits/inconveniences.yml index 2dcc30cd97..5e1e4e4b3f 100644 --- a/Resources/Prototypes/Traits/inconveniences.yml +++ b/Resources/Prototypes/Traits/inconveniences.yml @@ -1,4 +1,4 @@ -- type: trait +- type: trait id: LightweightDrunk category: Physical requirements: @@ -11,6 +11,11 @@ inverted: true traits: - HeavyweightDrunk + - LiquorLifeline + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Dwarf components: - type: LightweightDrunk boozeStrengthMultiplier: 2 diff --git a/Resources/Prototypes/Traits/physical.yml b/Resources/Prototypes/Traits/physical.yml index d39bd67020..85d074ffe9 100644 --- a/Resources/Prototypes/Traits/physical.yml +++ b/Resources/Prototypes/Traits/physical.yml @@ -1,7 +1,7 @@ - type: trait id: WillToLive category: Physical - points: -1 + points: -2 requirements: - !type:CharacterJobRequirement inverted: true @@ -37,7 +37,7 @@ - type: trait id: Tenacity category: Physical - points: -1 + points: -2 requirements: - !type:CharacterJobRequirement inverted: true @@ -70,10 +70,54 @@ - type: CritModifier critThresholdModifier: -10 +- type: trait + id: Vigor + category: Physical + points: -3 + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - Borg + - MedicalBorg + - !type:CharacterTraitRequirement + inverted: true + traits: + - Lethargy + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Oni + components: + - type: StaminaCritModifier + critThresholdModifier: 10 + +- type: trait + id: Lethargy + category: Physical + points: 1 + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - Borg + - MedicalBorg + - !type:CharacterTraitRequirement + inverted: true + traits: + - Vigor + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Felinid + components: + - type: StaminaCritModifier + critThresholdModifier: -15 + - type: trait id: HighAdrenaline category: Physical - points: -2 + points: -3 requirements: - !type:CharacterJobRequirement inverted: true @@ -110,7 +154,7 @@ - type: trait id: Masochism category: Physical - points: -2 + points: -3 requirements: - !type:CharacterJobRequirement inverted: true @@ -161,4 +205,4 @@ coefficients: Blunt: 1.5 Slash: 1.5 - Piercing: 1.5 \ No newline at end of file + Piercing: 1.5 diff --git a/Resources/Prototypes/Traits/skills.yml b/Resources/Prototypes/Traits/skills.yml index e7b155c8c1..d965d4be07 100644 --- a/Resources/Prototypes/Traits/skills.yml +++ b/Resources/Prototypes/Traits/skills.yml @@ -1,7 +1,9 @@ - type: trait id: CPRTraining - category: Uncategorized + category: Mental points: -2 + components: + - type: CPRTraining requirements: - !type:CharacterJobRequirement inverted: true @@ -11,24 +13,68 @@ - MedicalIntern - Paramedic - ChiefMedicalOfficer - - Borg - - MedicalBorg + - Brigmedic + +- type: trait + id: SelfAware + category: Mental + points: -2 components: - - type: CPRTraining + - type: SelfAware + analyzableTypes: + - Blunt + - Slash + - Piercing + - Heat + - Shock + - Cold + - Caustic + detectableGroups: + - Airloss + - Toxin - type: trait id: HeavyweightDrunk category: Physical - points: -2 + points: -1 requirements: - !type:CharacterTraitRequirement inverted: true traits: - LightweightDrunk + - LiquorLifeline + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Dwarf components: - type: LightweightDrunk boozeStrengthMultiplier: 0.5 +- type: trait + id: LiquorLifeline + category: Physical + points: -3 + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - Borg + - MedicalBorg + - !type:CharacterTraitRequirement + inverted: true + traits: + - LightweightDrunk + - HeavyweightDrunk + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Dwarf + components: + - type: LiquorLifeline + - type: LightweightDrunk + boozeStrengthMultiplier: 0.5 + - type: trait id: Thieving category: Physical @@ -44,3 +90,58 @@ inverted: true species: - Felinid + +- type: trait + id: SignLanguage + category: Visual + points: -1 + components: + - type: LanguageKnowledgeModifier + speaks: + - Sign + understands: + - Sign + +- type: trait + id: Voracious + category: Physical + points: -1 + components: + - type: ConsumeDelayModifier + foodDelayMultiplier: 0.5 + drinkDelayMultiplier: 0.5 + +- type: trait + id: ParkourTraining + category: Physical + points: -3 + requirements: + - !type:CharacterTraitRequirement + inverted: true + traits: + - Sluggish + - SnailPaced + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + components: + - type: ClimbDelayModifier + climbDelayMultiplier: 0.70 + - type: LayingDownModifier + layingDownCooldownMultiplier: 0.8 + downedSpeedMultiplierMultiplier: 1.25 + +- type: trait + id: LightStep + category: Auditory + points: -1 + components: + - type: FootstepVolumeModifier + sprintVolumeModifier: -10 + walkVolumeModifier: -10 + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Felinid diff --git a/Resources/Prototypes/Traits/species.yml b/Resources/Prototypes/Traits/species.yml new file mode 100644 index 0000000000..2c29825228 --- /dev/null +++ b/Resources/Prototypes/Traits/species.yml @@ -0,0 +1,62 @@ +- type: trait + id: Swashbuckler + category: Physical + points: -1 + components: + - type: OniDamageModifier + modifiers: + coefficients: + Blunt: 1.2 + Slash: 1.35 + Piercing: 1.2 + requirements: + - !type:CharacterSpeciesRequirement + species: + - Oni + - !type:CharacterTraitRequirement + inverted: true + traits: + - Spearmaster + - WeaponsGeneralist + +- type: trait + id: Spearmaster + category: Physical + points: -1 + components: + - type: OniDamageModifier + modifiers: + coefficients: + Blunt: 1.2 + Slash: 1.2 + Piercing: 1.35 + requirements: + - !type:CharacterSpeciesRequirement + species: + - Oni + - !type:CharacterTraitRequirement + inverted: true + traits: + - Swashbuckler + - WeaponsGeneralist + +- type: trait + id: WeaponsGeneralist + category: Physical + points: -1 + components: + - type: OniDamageModifier + modifiers: + coefficients: + Blunt: 1.25 + Slash: 1.25 + Piercing: 1.25 + requirements: + - !type:CharacterSpeciesRequirement + species: + - Oni + - !type:CharacterTraitRequirement + inverted: true + traits: + - Swashbuckler + - Spearmaster diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml index 5903adb595..2351ab7bd0 100644 --- a/Resources/Prototypes/tags.yml +++ b/Resources/Prototypes/tags.yml @@ -707,6 +707,9 @@ - type: Tag id: HidesNose # for non-standard noses. +- type: Tag + id: HidesBeard # for full coverage helmet / masks where beard shouldn't show + - type: Tag id: HighRiskItem diff --git a/Resources/ServerInfo/Guidebook/Engineering/Supermatter.xml b/Resources/ServerInfo/Guidebook/Engineering/Supermatter.xml index ab67ce41c6..6e89df4432 100644 --- a/Resources/ServerInfo/Guidebook/Engineering/Supermatter.xml +++ b/Resources/ServerInfo/Guidebook/Engineering/Supermatter.xml @@ -16,9 +16,9 @@ 1. The Supermatter crystal is [color=red]VERY DANGEROUS[/color]. Activating the crystal should be the last step in setting up any form of Supermatter based power! - 2. [color=red]PUT YOUR GOD DAMN RADIATION SUIT ON[/color]!! + 2. [color=red]PUT YOUR RADIATION SUIT ON[/color]. - 3. Most of setting up the Supermatter involves a gas loop that is designed to cool down the Supermatter chamber. Please have at least some knowledge of gases and their atmospheric properties. + 3. Most the Supermatter setup involves a gas loop that is designed to cool down the Supermatter chamber. Please have at least some knowledge of gases and their atmospheric properties. 4. Anything that bumps into the Supermatter is [color=red]fundamentally annihilated[/color]. [color=red]Do not touch it[/color]. This means weld and bolt the door to the chamber. @@ -28,9 +28,9 @@ 1. [color=#bffffe]Frezon[/color]. Aside from cooling down the Supermatter, it basically stops power and waste production, which may come handy if the Supermatter is close to delaminating and you need to shut it down fast. - 2. [color=#c20000]Nitrogen[/color]. N2 is the basic gas most Supermatter setups will run exclusively, being bog simple to set up for. It dampens the power generation from heat, and reduces the amount of plasma the SM belches out, making it good for when you aren't trying to do something silly. + 2. [color=#c20000]Nitrogen[/color]. N2 is the basic gas most Supermatter setups will run exclusively, being very simple to set up for. It dampens the power generation from heat, and reduces the amount of plasma the SM belches out, making it good for when you aren't trying to do something silly. - 3. [color=#b16d6d]Nitrous oxide[/color]. Reinforces the heat resistance of the crystal, allowing for much hotter setups than usual. Hovewer, at high temperatures it will decompose into Nitrogen and Oxygen. While N2 is good, O2 certainly is not. This O2 will also react with the Plasma to create Tritium and then... a Tritium fire. + 3. [color=#b16d6d]Nitrous oxide[/color]. Reinforces the heat resistance of the crystal, allowing for much hotter setups than usual. However, at high temperatures it will decompose into Nitrogen and Oxygen. While N2 is good, O2 certainly is not. This O2 will also react with the Plasma to create Tritium and then a Tritium fire. 4. [color=#62d5ca]Oxygen[/color]. Provides a boost to power transmission without actively increasing the waste gas amount or temperature. Pretty risky to use, as any disruption of the cooling loop will soon cause a plasma fire in the crystal chamber. Even just a high concentration of O2 will activate and continuously power the crystal. @@ -40,13 +40,13 @@ [color=red]7[/color]. [color=#ff9d00]Plasma[/color]. Very similar to Oxygen but provides a higher power boost as well as a much higher waste and heat penalty. The extreme pressures and volumes of gas produced by this gas are very likely to clog pipes and overheat the chamber. - [color=red]8[/color]. [color=#08a800]Tritium[/color]. Increases the power production of the Supermatter by up to 3 times, there is one slight issue with it. It is dangerous. It is very dangerous. Tritium is a horrifyingly irritable and jumpy gas. While it isn't as harmful to the heat level as Plasma is (just barely), it also has the second worst heat capacity of all gasses while Plasma has the second highest. This means that Plasma can be kept happy with enough cooling, whereas Tritium eagerly goes from a safe space loop into a burning hellfire. Add to this the byproduct of large amounts of Oxygen production (not exclusive to Tritium. An issue in a Plasma engine too), and you have a tritium fire and a very hot crystal. Do not use this gas unless you have a very strong understanding of atmospherics and the Supermatter, and are willing to get creative. + [color=red]8[/color]. [color=#08a800]Tritium[/color]. Increases the power production of the Supermatter by up to 3 times, there is one slight issue with it. It is dangerous. It is very dangerous. Tritium is a horrifyingly irritable and jumpy gas. While it isn't as harmful to the heat level as Plasma is (just barely), it also has the second worst heat capacity of all gasses while Plasma has the second highest. This means that Plasma can be kept happy with enough cooling, whereas Tritium eagerly goes from a safe space loop into a burning hellfire. Add to this the byproduct of large amounts of Oxygen production (not exclusive to Tritium, an issue in a Plasma engine too), and you have a tritium fire and a very hot crystal. Do not use this gas unless you have a very strong understanding of atmospherics and the Supermatter, and are willing to get creative. ## Practical guide to the Supermatter Now, forget about everything you've just read and get to setting up the most basic loop there is: the Nitrogen loop. - The atmospheric setup in it's most basic form should look like this: + The atmospheric setup in its' most basic form should look like this: (We did not have enough budget for images, here is a text representation) @@ -54,7 +54,7 @@ 2. Every gas gets pumped out of the chamber by using scrubbers set on Siphon on the other side. - 3. The output gets cooled down, filtered and excess nitrogen gets either outted into space or rerouted into the input. + 3. The output gets filtered, cooled down, and excess nitrogen gets either routed into space or rerouted into the input. That's basically it. I hope you understand at least something in this example. Now get to it! diff --git a/Resources/ServerInfo/Rules.txt b/Resources/ServerInfo/Rules.txt index ae0395b100..6cb661eadd 100644 --- a/Resources/ServerInfo/Rules.txt +++ b/Resources/ServerInfo/Rules.txt @@ -65,7 +65,7 @@ This is the "short" form of the rules, which has all the information any regular - Detainees that die in your custody must be cloned unless they have been (legally) executed or have committed suicide. - Executions must be for a capital crime, used only as a last resort, and MUST be authorized by the highest ranking member of Security, who will answer to the use of execution. - Detainees in the brig have the right to know what they are being charged with. - + [color=#a4885c]4.2.[/color] Security (and Command where applicable) should try to remain non-lethal and effect arrests. Security/Command will be expected to answer for use of lethal force. Security/Command will be expected to effect arrests on criminals and prevent them from dying while in custody, even if lethal force is used. In the following special circumstances, lethal force may be used by Security: @@ -79,25 +79,25 @@ In the following special circumstances, lethal force may be used by Security: - Do not escalate situations needlessly. Very few things are deserving of a fight to the death. - Antagonistic ghost roles, and pest ghost roles like mice are always fair game for attacking. Don't grief crew-aligned ghost roles like familiars, drones, or pets without provocation. - If a fight results in someone being critically injured, seek medical help for them. If they die, do not destroy or otherwise hide their body. - + [color=#a4885c]4.4[/color] All constructed/summoned beings that have laws are bound by those laws and must abide by them. - If a being has a master, they MUST follow their master's orders. - Your master is held accountable if they order you to do something malicious. *This does not apply to breaking server rules. If you are ordered to do something that would break a server rule, disregard it and inform an admin. - Not having orders, or being given free will by your master does NOT give you permission to self-antag or grief the crew. - + [color=#a4885c]4.5[/color] Follow Antagonist Guidelines - The damage antagonists cause should be roughly proportional to their objectives, and contribute towards achieving them in some way. However antagonists have leniency in regards to what they can and can’t do. If you are concerned as to whether or not what you're about to do is allowed, feel free to ahelp and ask an admin. - Other antagonists are not necessarily your friends. Traitors, rat kings, and possibly even space dragons are free agents, but no one should be working together with xenomorphs or zombies. - Exploits, arrivals camping, unnecessary round extensions, and other extremely lame behavior are forbidden. - Ghost roles have their own independent rules that must be followed. [color=#ff0000]Breaking these rules can result in a ban, whitelist removal, or both.[/color] - + [color=#a4885c]4.6[/color] Don't rush for or prepare equipment unrelated to your job for no purpose other than to have it "just in case" (referred to as "Powergaming"). - A medical doctor does not need insulated gloves, and the Head of Personnel does not need to give themselves armory access so they can go grab a gun. Have an actual reason for needing these things. - Don't manufacture weapons, bombs, or deadly poisons before you know of any reason you would need them. - Don't preemptively hide antagonist objectives or preemptively secure them with higher security than normally required. - Don't manufacture or prepare things for the "end of the round" when the shuttle docks with Central Command. - + [color=#a4885c]4.7[/color] Psionics - Players that have psionic powers are allowed to use them at-will to accomplish their roleplay goals. It should be noted that in-character consequences can happen as a result of their use, including being stripped of psionic powers or even death. - As a psionic mantis, it is not your goal to hunt down psionics. Do not mindbreak others against their will solely because they have psionic powers. diff --git a/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/alt-equipped-EARS.png b/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/alt-equipped-EARS.png new file mode 100644 index 0000000000..9522966b6c Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/alt-equipped-EARS.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/equipped-EARS.png b/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/equipped-EARS.png new file mode 100644 index 0000000000..0633bb3644 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/equipped-EARS.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/icon.png new file mode 100644 index 0000000000..0ce0c363f8 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/icon_alt.png b/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/icon_alt.png new file mode 100644 index 0000000000..2142eee039 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/icon_alt.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/meta.json new file mode 100644 index 0000000000..116c0e53e7 --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/meta.json @@ -0,0 +1,25 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/f8f4aeda930fcd0805ca4cc76d9bc9412a5b3428 | Modified by leonardo_dabepis (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "icon_alt" + }, + { + "name": "equipped-EARS", + "directions": 4 + }, + { + "name": "alt-equipped-EARS", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/equipped-HELMET.png b/Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/equipped-HELMET.png new file mode 100644 index 0000000000..2fc2172afa Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/equipped-HELMET.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/icon.png new file mode 100644 index 0000000000..3a06285c67 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/inhand-left.png b/Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/inhand-left.png new file mode 100644 index 0000000000..60426ff87f Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/inhand-left.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/inhand-right.png b/Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/inhand-right.png new file mode 100644 index 0000000000..d6ed79e225 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/inhand-right.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/meta.json new file mode 100644 index 0000000000..9d421b646b --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC0-1.0", + "copyright": "Spritework by leonardo_dabepis (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-HELMET", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/equipped-NECK.png b/Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/equipped-NECK.png new file mode 100644 index 0000000000..49bc499a87 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/equipped-NECK.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/icon.png new file mode 100644 index 0000000000..ce23046a1f Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/inhand-left.png b/Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/inhand-left.png new file mode 100644 index 0000000000..80531e8b56 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/inhand-left.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/inhand-right.png b/Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/inhand-right.png new file mode 100644 index 0000000000..0bd0f37f11 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/inhand-right.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/meta.json new file mode 100644 index 0000000000..a0670a97c9 --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC0-1.0", + "copyright": "Spritework by leonardo_dabepis (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-NECK", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Clothing/Neck/Misc/prosecutorbadge.rsi/equipped-NECK.png b/Resources/Textures/DeltaV/Clothing/Neck/Misc/prosecutorbadge.rsi/equipped-NECK.png new file mode 100644 index 0000000000..ce4e527400 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Neck/Misc/prosecutorbadge.rsi/equipped-NECK.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Neck/Misc/prosecutorbadge.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/Neck/Misc/prosecutorbadge.rsi/icon.png new file mode 100644 index 0000000000..d3f712e8d7 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Neck/Misc/prosecutorbadge.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Neck/Misc/prosecutorbadge.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/Neck/Misc/prosecutorbadge.rsi/meta.json new file mode 100644 index 0000000000..7f12698657 --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/Neck/Misc/prosecutorbadge.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "sprites by leonardo_dabepis (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-NECK", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Clothing/Neck/mantles/cjmantle.rsi/equipped-NECK.png b/Resources/Textures/DeltaV/Clothing/Neck/mantles/cjmantle.rsi/equipped-NECK.png new file mode 100644 index 0000000000..9a881bf0dd Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Neck/mantles/cjmantle.rsi/equipped-NECK.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Neck/mantles/cjmantle.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/Neck/mantles/cjmantle.rsi/icon.png new file mode 100644 index 0000000000..7fd93b7fd5 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Neck/mantles/cjmantle.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Neck/mantles/cjmantle.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/Neck/mantles/cjmantle.rsi/meta.json new file mode 100644 index 0000000000..a04b75dd78 --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/Neck/mantles/cjmantle.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC0-1.0", + "copyright": "sprites by leonardo_dabepis (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-NECK", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 0000000000..7d77d8b53f Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/equipped-OUTERCLOTHING.png differ diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/icon.png new file mode 100644 index 0000000000..eb6ff72244 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/inhand-left.png b/Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/inhand-left.png new file mode 100644 index 0000000000..f7b9b21ebd Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/inhand-left.png differ diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/inhand-right.png b/Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/inhand-right.png new file mode 100644 index 0000000000..5d366f23d9 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/inhand-right.png differ diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/meta.json new file mode 100644 index 0000000000..11ac46694c --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC0-1.0", + "copyright": "sprites by leonardo_dabepis (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 0000000000..a5575e393c Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/equipped-OUTERCLOTHING.png differ diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/icon.png new file mode 100644 index 0000000000..443dbf1af9 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/inhand-left.png b/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/inhand-left.png new file mode 100644 index 0000000000..cf49f4588a Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/inhand-left.png differ diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/inhand-right.png b/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/inhand-right.png new file mode 100644 index 0000000000..c2e88069f8 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/inhand-right.png differ diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/meta.json new file mode 100644 index 0000000000..11ac46694c --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC0-1.0", + "copyright": "sprites by leonardo_dabepis (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/equipped-INNERCLOTHING.png new file mode 100644 index 0000000000..24c2af227b Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/equipped-INNERCLOTHING.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/icon.png new file mode 100644 index 0000000000..77371a3ba8 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/inhand-left.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/inhand-left.png new file mode 100644 index 0000000000..9b19bead35 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/inhand-left.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/inhand-right.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/inhand-right.png new file mode 100644 index 0000000000..571ae1697c Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/inhand-right.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/meta.json new file mode 100644 index 0000000000..faf5084407 --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC0-1.0", + "copyright": "sprites by leonardo_dabepis (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-INNERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/equipped-INNERCLOTHING.png new file mode 100644 index 0000000000..64e6927cf6 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/equipped-INNERCLOTHING.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/icon.png new file mode 100644 index 0000000000..58a60bc768 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/inhand-left.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/inhand-left.png new file mode 100644 index 0000000000..5dcb8e026e Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/inhand-left.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/inhand-right.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/inhand-right.png new file mode 100644 index 0000000000..5e7d377451 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/inhand-right.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/meta.json new file mode 100644 index 0000000000..faf5084407 --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC0-1.0", + "copyright": "sprites by leonardo_dabepis (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-INNERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/equipped-INNERCLOTHING.png new file mode 100644 index 0000000000..a1ae36f210 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/equipped-INNERCLOTHING.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/icon.png new file mode 100644 index 0000000000..5130d57e8c Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/inhand-left.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/inhand-left.png new file mode 100644 index 0000000000..d04680f3ca Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/inhand-left.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/inhand-right.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/inhand-right.png new file mode 100644 index 0000000000..af7f24e84e Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/inhand-right.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/meta.json new file mode 100644 index 0000000000..322f9da00e --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Heavily modified by leonardo_dabepis (Discord), original sprite taken from tgstation at commit https://github.com/tgstation/tgstation/commit/3a72dd925f7d6aeec620fe83bc4f88a3d7e5f693", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-INNERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/equipped-INNERCLOTHING.png new file mode 100644 index 0000000000..b2e475bdbe Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/equipped-INNERCLOTHING.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/icon.png new file mode 100644 index 0000000000..03f703a26c Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/inhand-left.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/inhand-left.png new file mode 100644 index 0000000000..9b19bead35 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/inhand-left.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/inhand-right.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/inhand-right.png new file mode 100644 index 0000000000..571ae1697c Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/inhand-right.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/meta.json new file mode 100644 index 0000000000..faf5084407 --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC0-1.0", + "copyright": "sprites by leonardo_dabepis (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-INNERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/equipped-INNERCLOTHING.png new file mode 100644 index 0000000000..e735c5a2b2 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/equipped-INNERCLOTHING.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/icon.png new file mode 100644 index 0000000000..bf6ed67bc8 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/inhand-left.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/inhand-left.png new file mode 100644 index 0000000000..aa33404831 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/inhand-left.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/inhand-right.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/inhand-right.png new file mode 100644 index 0000000000..deb205205a Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/inhand-right.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/meta.json new file mode 100644 index 0000000000..0445151280 --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC0-1.0", + "copyright": "Taken from https://github.com/ParadiseSS13/Paradise/", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-INNERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/equipped-INNERCLOTHING.png new file mode 100644 index 0000000000..9caa2e705e Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/equipped-INNERCLOTHING.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/icon.png new file mode 100644 index 0000000000..0f2a20fa1a Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/inhand-left.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/inhand-left.png new file mode 100644 index 0000000000..4e73693046 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/inhand-left.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/inhand-right.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/inhand-right.png new file mode 100644 index 0000000000..567d302dc5 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/inhand-right.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/meta.json new file mode 100644 index 0000000000..0445151280 --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC0-1.0", + "copyright": "Taken from https://github.com/ParadiseSS13/Paradise/", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-INNERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/equipped-INNERCLOTHING.png new file mode 100644 index 0000000000..330926db8c Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/equipped-INNERCLOTHING.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/icon.png new file mode 100644 index 0000000000..337c3132ca Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/inhand-left.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/inhand-left.png new file mode 100644 index 0000000000..5dcb8e026e Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/inhand-left.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/inhand-right.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/inhand-right.png new file mode 100644 index 0000000000..5e7d377451 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/inhand-right.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/meta.json new file mode 100644 index 0000000000..faf5084407 --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC0-1.0", + "copyright": "sprites by leonardo_dabepis (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-INNERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/equipped-INNERCLOTHING.png new file mode 100644 index 0000000000..f21dce44e2 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/equipped-INNERCLOTHING.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/icon.png new file mode 100644 index 0000000000..0d2266c7ff Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/inhand-left.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/inhand-left.png new file mode 100644 index 0000000000..d04680f3ca Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/inhand-left.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/inhand-right.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/inhand-right.png new file mode 100644 index 0000000000..af7f24e84e Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/inhand-right.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/meta.json new file mode 100644 index 0000000000..322f9da00e --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Heavily modified by leonardo_dabepis (Discord), original sprite taken from tgstation at commit https://github.com/tgstation/tgstation/commit/3a72dd925f7d6aeec620fe83bc4f88a3d7e5f693", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-INNERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/ChiefJustice.png b/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/ChiefJustice.png new file mode 100644 index 0000000000..6cba0e4a93 Binary files /dev/null and b/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/ChiefJustice.png differ diff --git a/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/Clerk.png b/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/Clerk.png new file mode 100644 index 0000000000..90e01b97cd Binary files /dev/null and b/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/Clerk.png differ diff --git a/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/Lawyer.png b/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/Lawyer.png new file mode 100644 index 0000000000..9ef5c30527 Binary files /dev/null and b/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/Lawyer.png differ diff --git a/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/Prosecutor.png b/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/Prosecutor.png new file mode 100644 index 0000000000..997b29b2a4 Binary files /dev/null and b/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/Prosecutor.png differ diff --git a/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/meta.json b/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/meta.json index 3f3c6b04e2..09d18e3ab7 100644 --- a/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/meta.json +++ b/Resources/Textures/DeltaV/Interface/Misc/job_icons.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/d917f4c2a088419d5c3aec7656b7ff8cebd1822e | nyanoPrisonGuard, nyanoMartialArtist, nyanoGladiator made by Floofers", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/d917f4c2a088419d5c3aec7656b7ff8cebd1822e | nyanoPrisonGuard, nyanoMartialArtist, nyanoGladiator made by Floofers | ChiefJustice, Clerk by leonardo_dabepis (Discord)", "size": { "x": 8, "y": 8 @@ -27,6 +27,18 @@ }, { "name": "MedicalBorg" + }, + { + "name": "ChiefJustice" + }, + { + "name": "Clerk" + }, + { + "name": "Prosecutor" + }, + { + "name": "Lawyer" } ] } diff --git a/Resources/Textures/DeltaV/Interface/Paper/paper_heading_warrant.svg b/Resources/Textures/DeltaV/Interface/Paper/paper_heading_warrant.svg new file mode 100644 index 0000000000..74e0876fb9 --- /dev/null +++ b/Resources/Textures/DeltaV/Interface/Paper/paper_heading_warrant.svg @@ -0,0 +1,127 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + diff --git a/Resources/Textures/DeltaV/Interface/Paper/paper_heading_warrant.svg.200dpi.png b/Resources/Textures/DeltaV/Interface/Paper/paper_heading_warrant.svg.200dpi.png new file mode 100644 index 0000000000..d13d8cf76b Binary files /dev/null and b/Resources/Textures/DeltaV/Interface/Paper/paper_heading_warrant.svg.200dpi.png differ diff --git a/Resources/Textures/DeltaV/Interface/Paper/paper_heading_warrant.svg.200dpi.png.yml b/Resources/Textures/DeltaV/Interface/Paper/paper_heading_warrant.svg.200dpi.png.yml new file mode 100644 index 0000000000..5c43e23305 --- /dev/null +++ b/Resources/Textures/DeltaV/Interface/Paper/paper_heading_warrant.svg.200dpi.png.yml @@ -0,0 +1,2 @@ +sample: + filter: true diff --git a/Resources/Textures/DeltaV/Markers/jobs.rsi/chiefjustice.png b/Resources/Textures/DeltaV/Markers/jobs.rsi/chiefjustice.png new file mode 100644 index 0000000000..b69ced20cf Binary files /dev/null and b/Resources/Textures/DeltaV/Markers/jobs.rsi/chiefjustice.png differ diff --git a/Resources/Textures/DeltaV/Markers/jobs.rsi/clerk.png b/Resources/Textures/DeltaV/Markers/jobs.rsi/clerk.png new file mode 100644 index 0000000000..5e6ce9fece Binary files /dev/null and b/Resources/Textures/DeltaV/Markers/jobs.rsi/clerk.png differ diff --git a/Resources/Textures/DeltaV/Markers/jobs.rsi/meta.json b/Resources/Textures/DeltaV/Markers/jobs.rsi/meta.json index 7e31fd2911..a7534b9ee5 100644 --- a/Resources/Textures/DeltaV/Markers/jobs.rsi/meta.json +++ b/Resources/Textures/DeltaV/Markers/jobs.rsi/meta.json @@ -7,12 +7,21 @@ "y": 32 }, "states": [ + { + "name": "chiefjustice" + }, + { + "name": "clerk" + }, { "name": "nyanogladiator" }, { "name": "nyanoprisonguard" }, + { + "name": "prosecutor" + }, { "name": "nyanomailcarrier" }, diff --git a/Resources/Textures/DeltaV/Markers/jobs.rsi/prosecutor.png b/Resources/Textures/DeltaV/Markers/jobs.rsi/prosecutor.png new file mode 100644 index 0000000000..e384f90fb1 Binary files /dev/null and b/Resources/Textures/DeltaV/Markers/jobs.rsi/prosecutor.png differ diff --git a/Resources/Textures/DeltaV/Objects/Devices/encryption_keys.rsi/justice_label.png b/Resources/Textures/DeltaV/Objects/Devices/encryption_keys.rsi/justice_label.png new file mode 100644 index 0000000000..962d09200d Binary files /dev/null and b/Resources/Textures/DeltaV/Objects/Devices/encryption_keys.rsi/justice_label.png differ diff --git a/Resources/Textures/DeltaV/Objects/Devices/encryption_keys.rsi/meta.json b/Resources/Textures/DeltaV/Objects/Devices/encryption_keys.rsi/meta.json index 440000d647..eb55c2b4e7 100644 --- a/Resources/Textures/DeltaV/Objects/Devices/encryption_keys.rsi/meta.json +++ b/Resources/Textures/DeltaV/Objects/Devices/encryption_keys.rsi/meta.json @@ -1,13 +1,14 @@ { "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Created by DangerRevolution for Space Station 14.", + "license": "CC0-1.0", + "copyright": "justice_label by leonardo_dabepis (Discord) | prisoner_label, crypt_orange Created by DangerRevolution for Space Station 14.", "size": { "x": 32, "y": 32 }, "states": [ - {"name": "prisoner_label"}, + {"name": "justice_label"}, + {"name": "prisoner_label"}, {"name": "crypt_orange"} ] -} \ No newline at end of file +} diff --git a/Resources/Textures/DeltaV/Objects/Devices/pda.rsi/meta.json b/Resources/Textures/DeltaV/Objects/Devices/pda.rsi/meta.json index 24d83ed6a0..176af07719 100644 --- a/Resources/Textures/DeltaV/Objects/Devices/pda.rsi/meta.json +++ b/Resources/Textures/DeltaV/Objects/Devices/pda.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/59f2a4e10e5ba36033c9734ddebfbbdc6157472d | pda-corpsman from yogstation at https://github.com/yogstation13/Yogstation/commit/a75671b22476ed8e117229f38501b9b63f8d6bc1 | pda-martialartist by Floofers", + "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/59f2a4e10e5ba36033c9734ddebfbbdc6157472d | pda-corpsman from yogstation at https://github.com/yogstation13/Yogstation/commit/a75671b22476ed8e117229f38501b9b63f8d6bc1 | pda-martialartist by Floofers | pda-chiefjustice and pda-clerk by leonardo_dabepis (Discord) | pda-prosecutor by Timemaster99 (Discord)", "size": { "x": 32, "y": 32 @@ -31,6 +31,15 @@ }, { "name": "pda-corpsman" + }, + { + "name": "pda-chiefjustice" + }, + { + "name": "pda-clerk" + }, + { + "name": "pda-prosecutor" } ] } diff --git a/Resources/Textures/DeltaV/Objects/Devices/pda.rsi/pda-chiefjustice.png b/Resources/Textures/DeltaV/Objects/Devices/pda.rsi/pda-chiefjustice.png new file mode 100644 index 0000000000..ec2543a97c Binary files /dev/null and b/Resources/Textures/DeltaV/Objects/Devices/pda.rsi/pda-chiefjustice.png differ diff --git a/Resources/Textures/DeltaV/Objects/Devices/pda.rsi/pda-clerk.png b/Resources/Textures/DeltaV/Objects/Devices/pda.rsi/pda-clerk.png new file mode 100644 index 0000000000..6f690e235d Binary files /dev/null and b/Resources/Textures/DeltaV/Objects/Devices/pda.rsi/pda-clerk.png differ diff --git a/Resources/Textures/DeltaV/Objects/Devices/pda.rsi/pda-prosecutor.png b/Resources/Textures/DeltaV/Objects/Devices/pda.rsi/pda-prosecutor.png new file mode 100644 index 0000000000..e44dcea1b5 Binary files /dev/null and b/Resources/Textures/DeltaV/Objects/Devices/pda.rsi/pda-prosecutor.png differ diff --git a/Resources/Textures/DeltaV/Objects/Misc/bureaucracy.rsi/meta.json b/Resources/Textures/DeltaV/Objects/Misc/bureaucracy.rsi/meta.json index 75c5548e64..5e2c34d530 100644 --- a/Resources/Textures/DeltaV/Objects/Misc/bureaucracy.rsi/meta.json +++ b/Resources/Textures/DeltaV/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 | modified by Floofers", + "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/e1142f20f5e4661cb6845cfcf2dd69f864d67432 | modified by Floofers. Stamp icon taken from tgstation at https://github.com/tgstation/tgstation/commit/fb1012102257b7b0a08d861fd2b8ba963c416e93, modified by leonardo_dabepis (Discord)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/DeltaV/Objects/Misc/stamps.rsi/meta.json b/Resources/Textures/DeltaV/Objects/Misc/stamps.rsi/meta.json index 31a3b1bee3..d17e01e8bd 100644 --- a/Resources/Textures/DeltaV/Objects/Misc/stamps.rsi/meta.json +++ b/Resources/Textures/DeltaV/Objects/Misc/stamps.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Stamp sprites taken from tgstation at commit https://github.com/tgstation/tgstation/commit/fb1012102257b7b0a08d861fd2b8ba963c416e93, modified by Guess-My-Name.", + "copyright": "Stamp sprites taken from tgstation at commit https://github.com/tgstation/tgstation/commit/fb1012102257b7b0a08d861fd2b8ba963c416e93, modified by Guess-My-Name. CJ stamp modified by Timemaster99 (Discord)", "size": { "x": 32, "y": 32 @@ -10,8 +10,14 @@ { "name": "stamp-lawyer" }, + { + "name": "stamp-notary" + }, { "name": "stamp-psychologist" + }, + { + "name": "stamp-cj" } ] } diff --git a/Resources/Textures/DeltaV/Objects/Misc/stamps.rsi/stamp-cj.png b/Resources/Textures/DeltaV/Objects/Misc/stamps.rsi/stamp-cj.png new file mode 100644 index 0000000000..3ca58c4bc6 Binary files /dev/null and b/Resources/Textures/DeltaV/Objects/Misc/stamps.rsi/stamp-cj.png differ diff --git a/Resources/Textures/DeltaV/Objects/Misc/stamps.rsi/stamp-notary.png b/Resources/Textures/DeltaV/Objects/Misc/stamps.rsi/stamp-notary.png new file mode 100644 index 0000000000..b726cab3d3 Binary files /dev/null and b/Resources/Textures/DeltaV/Objects/Misc/stamps.rsi/stamp-notary.png differ diff --git a/Resources/Textures/DeltaV/Objects/Specific/Justice/gavel.rsi/icon.png b/Resources/Textures/DeltaV/Objects/Specific/Justice/gavel.rsi/icon.png new file mode 100644 index 0000000000..3cf56d4537 Binary files /dev/null and b/Resources/Textures/DeltaV/Objects/Specific/Justice/gavel.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Objects/Specific/Justice/gavel.rsi/inhand-left.png b/Resources/Textures/DeltaV/Objects/Specific/Justice/gavel.rsi/inhand-left.png new file mode 100644 index 0000000000..a41d27bcc7 Binary files /dev/null and b/Resources/Textures/DeltaV/Objects/Specific/Justice/gavel.rsi/inhand-left.png differ diff --git a/Resources/Textures/DeltaV/Objects/Specific/Justice/gavel.rsi/inhand-right.png b/Resources/Textures/DeltaV/Objects/Specific/Justice/gavel.rsi/inhand-right.png new file mode 100644 index 0000000000..cbabf3b291 Binary files /dev/null and b/Resources/Textures/DeltaV/Objects/Specific/Justice/gavel.rsi/inhand-right.png differ diff --git a/Resources/Textures/DeltaV/Objects/Specific/Justice/gavel.rsi/meta.json b/Resources/Textures/DeltaV/Objects/Specific/Justice/gavel.rsi/meta.json new file mode 100644 index 0000000000..39ff0ed9d9 --- /dev/null +++ b/Resources/Textures/DeltaV/Objects/Specific/Justice/gavel.rsi/meta.json @@ -0,0 +1,22 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Sprites sourced from https://github.com/tgstation/tgstation/pull/8495. In-hand sprites edited by Timemaster99 (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Objects/Specific/Justice/gavelblock.rsi/icon.png b/Resources/Textures/DeltaV/Objects/Specific/Justice/gavelblock.rsi/icon.png new file mode 100644 index 0000000000..c1254bb808 Binary files /dev/null and b/Resources/Textures/DeltaV/Objects/Specific/Justice/gavelblock.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Objects/Specific/Justice/gavelblock.rsi/meta.json b/Resources/Textures/DeltaV/Objects/Specific/Justice/gavelblock.rsi/meta.json new file mode 100644 index 0000000000..5abad9b422 --- /dev/null +++ b/Resources/Textures/DeltaV/Objects/Specific/Justice/gavelblock.rsi/meta.json @@ -0,0 +1,14 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Sprites sourced from https://github.com/tgstation/tgstation/pull/8495", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + } + ] +} diff --git a/Resources/Textures/DeltaV/Objects/Specific/Justice/trialtimer.rsi/meta.json b/Resources/Textures/DeltaV/Objects/Specific/Justice/trialtimer.rsi/meta.json new file mode 100644 index 0000000000..8081065c32 --- /dev/null +++ b/Resources/Textures/DeltaV/Objects/Specific/Justice/trialtimer.rsi/meta.json @@ -0,0 +1,14 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Original screen timer sprite by brainfood1183 (Github) for Space Station 14, modified by Leonardo_dabepis (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "trialtimer" + } + ] +} diff --git a/Resources/Textures/DeltaV/Objects/Specific/Justice/trialtimer.rsi/trialtimer.png b/Resources/Textures/DeltaV/Objects/Specific/Justice/trialtimer.rsi/trialtimer.png new file mode 100644 index 0000000000..34c8f1b90a Binary files /dev/null and b/Resources/Textures/DeltaV/Objects/Specific/Justice/trialtimer.rsi/trialtimer.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/assembly.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/assembly.png new file mode 100644 index 0000000000..056fcc5c14 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/assembly.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/bolted_unlit.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/bolted_unlit.png new file mode 100644 index 0000000000..6857f2a241 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/bolted_unlit.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/closed.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/closed.png new file mode 100644 index 0000000000..04842eb1c7 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/closed.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/closed_unlit.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/closed_unlit.png new file mode 100644 index 0000000000..c78d01c42d Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/closed_unlit.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/closing.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/closing.png new file mode 100644 index 0000000000..fd27f05b3a Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/closing.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/closing_unlit.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/closing_unlit.png new file mode 100644 index 0000000000..2a71f76d5d Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/closing_unlit.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/deny_unlit.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/deny_unlit.png new file mode 100644 index 0000000000..7c56263f83 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/deny_unlit.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/emergency_unlit.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/emergency_unlit.png new file mode 100644 index 0000000000..817f2fb3f9 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/emergency_unlit.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/meta.json b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/meta.json new file mode 100644 index 0000000000..e4c020ff61 --- /dev/null +++ b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/meta.json @@ -0,0 +1,195 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c6e3401f2e7e1e55c57060cdf956a98ef1fefc24 and recolored by leonardo_dabepis (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "assembly" + }, + { + "name": "bolted_unlit" + }, + { + "name": "closed" + }, + { + "name": "closed_unlit" + }, + { + "name": "closing", + "delays": [ + [ + 0.1, + 0.1, + 0.07, + 0.07, + 0.07, + 0.2 + ] + ] + }, + { + "name": "closing_unlit", + "delays": [ + [ + 0.1, + 0.1, + 0.07, + 0.07, + 0.07, + 0.2 + ] + ] + }, + { + "name": "deny_unlit", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "open", + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "opening", + "delays": [ + [ + 0.1, + 0.1, + 0.07, + 0.07, + 0.07, + 0.2 + ] + ] + }, + { + "name": "opening_unlit", + "delays": [ + [ + 0.1, + 0.1, + 0.07, + 0.07, + 0.07, + 0.2 + ] + ] + }, + { + "name": "panel_closing", + "delays": [ + [ + 0.1, + 0.1, + 0.07, + 0.07, + 0.07, + 0.2 + ] + ] + }, + { + "name": "panel_open", + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "panel_opening", + "delays": [ + [ + 0.1, + 0.1, + 0.07, + 0.07, + 0.07, + 0.2 + ] + ] + }, + { + "name": "sparks", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "sparks_broken", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "sparks_damaged", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 1.7 + ] + ] + }, + { + "name": "sparks_open", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "welded" + }, + { + "name": "emergency_unlit", + "delays": [ + [ + 0.4, + 0.4 + ] + ] + } + ] +} diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/open.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/open.png new file mode 100644 index 0000000000..10d823bfe8 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/open.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/opening.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/opening.png new file mode 100644 index 0000000000..540ccf3de4 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/opening.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/opening_unlit.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/opening_unlit.png new file mode 100644 index 0000000000..84933bd5ed Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/opening_unlit.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/panel_closing.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/panel_closing.png new file mode 100644 index 0000000000..db7be0bc4a Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/panel_closing.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/panel_open.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/panel_open.png new file mode 100644 index 0000000000..24eb2aedc2 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/panel_open.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/panel_opening.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/panel_opening.png new file mode 100644 index 0000000000..fc90acd637 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/panel_opening.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/sparks.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/sparks.png new file mode 100644 index 0000000000..dd67e88a31 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/sparks.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/sparks_broken.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/sparks_broken.png new file mode 100644 index 0000000000..fb5d774588 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/sparks_broken.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/sparks_damaged.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/sparks_damaged.png new file mode 100644 index 0000000000..f16a028dee Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/sparks_damaged.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/sparks_open.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/sparks_open.png new file mode 100644 index 0000000000..630eabb976 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/sparks_open.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/welded.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/welded.png new file mode 100644 index 0000000000..a0040dfdc7 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/welded.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/assembly.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/assembly.png new file mode 100644 index 0000000000..35efd5f6dd Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/assembly.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/bolted_unlit.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/bolted_unlit.png new file mode 100644 index 0000000000..6857f2a241 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/bolted_unlit.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/closed.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/closed.png new file mode 100644 index 0000000000..64e00a086d Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/closed.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/closed_unlit.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/closed_unlit.png new file mode 100644 index 0000000000..c78d01c42d Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/closed_unlit.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/closing.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/closing.png new file mode 100644 index 0000000000..2a33b5d48a Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/closing.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/closing_unlit.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/closing_unlit.png new file mode 100644 index 0000000000..2a71f76d5d Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/closing_unlit.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/deny_unlit.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/deny_unlit.png new file mode 100644 index 0000000000..7c56263f83 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/deny_unlit.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/emergency_unlit.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/emergency_unlit.png new file mode 100644 index 0000000000..817f2fb3f9 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/emergency_unlit.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/meta.json b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/meta.json new file mode 100644 index 0000000000..e4c020ff61 --- /dev/null +++ b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/meta.json @@ -0,0 +1,195 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c6e3401f2e7e1e55c57060cdf956a98ef1fefc24 and recolored by leonardo_dabepis (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "assembly" + }, + { + "name": "bolted_unlit" + }, + { + "name": "closed" + }, + { + "name": "closed_unlit" + }, + { + "name": "closing", + "delays": [ + [ + 0.1, + 0.1, + 0.07, + 0.07, + 0.07, + 0.2 + ] + ] + }, + { + "name": "closing_unlit", + "delays": [ + [ + 0.1, + 0.1, + 0.07, + 0.07, + 0.07, + 0.2 + ] + ] + }, + { + "name": "deny_unlit", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "open", + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "opening", + "delays": [ + [ + 0.1, + 0.1, + 0.07, + 0.07, + 0.07, + 0.2 + ] + ] + }, + { + "name": "opening_unlit", + "delays": [ + [ + 0.1, + 0.1, + 0.07, + 0.07, + 0.07, + 0.2 + ] + ] + }, + { + "name": "panel_closing", + "delays": [ + [ + 0.1, + 0.1, + 0.07, + 0.07, + 0.07, + 0.2 + ] + ] + }, + { + "name": "panel_open", + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "panel_opening", + "delays": [ + [ + 0.1, + 0.1, + 0.07, + 0.07, + 0.07, + 0.2 + ] + ] + }, + { + "name": "sparks", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "sparks_broken", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "sparks_damaged", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 1.7 + ] + ] + }, + { + "name": "sparks_open", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "welded" + }, + { + "name": "emergency_unlit", + "delays": [ + [ + 0.4, + 0.4 + ] + ] + } + ] +} diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/open.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/open.png new file mode 100644 index 0000000000..0c731ca796 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/open.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/opening.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/opening.png new file mode 100644 index 0000000000..e8e146a32d Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/opening.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/opening_unlit.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/opening_unlit.png new file mode 100644 index 0000000000..84933bd5ed Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/opening_unlit.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/panel_closing.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/panel_closing.png new file mode 100644 index 0000000000..db7be0bc4a Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/panel_closing.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/panel_open.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/panel_open.png new file mode 100644 index 0000000000..24eb2aedc2 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/panel_open.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/panel_opening.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/panel_opening.png new file mode 100644 index 0000000000..fc90acd637 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/panel_opening.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/sparks.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/sparks.png new file mode 100644 index 0000000000..dd67e88a31 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/sparks.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/sparks_broken.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/sparks_broken.png new file mode 100644 index 0000000000..fb5d774588 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/sparks_broken.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/sparks_damaged.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/sparks_damaged.png new file mode 100644 index 0000000000..f16a028dee Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/sparks_damaged.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/sparks_open.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/sparks_open.png new file mode 100644 index 0000000000..630eabb976 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/sparks_open.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/welded.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/welded.png new file mode 100644 index 0000000000..a0040dfdc7 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/welded.png differ diff --git a/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/direction_court.png b/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/direction_court.png new file mode 100644 index 0000000000..dcb76fc263 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/direction_court.png differ diff --git a/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/direction_justice.png b/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/direction_justice.png new file mode 100644 index 0000000000..ef94a9998f Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/direction_justice.png differ diff --git a/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/meta.json b/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/meta.json index 0d38f6d859..ab3feb6715 100644 --- a/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/meta.json +++ b/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "directional sprites taken from https://github.com/space-wizards/space-station-14/commit/c1556214de46d66fe4057500e269b17438dc96ca | direction_mail modified by Hyenh, direction_logi modified by Floofers", + "copyright": "directional sprites taken from https://github.com/space-wizards/space-station-14/commit/c1556214de46d66fe4057500e269b17438dc96ca | direction_mail modified by Hyenh, direction_logi modified by Floofers | direction_court, direction_justice by leonardo_dabepis (Discord)", "size": { "x": 32, "y": 32 @@ -14,6 +14,14 @@ { "name": "direction_mail", "directions": 4 + }, + { + "name": "direction_court", + "directions": 4 + }, + { + "name": "direction_justice", + "directions": 4 } ] } \ No newline at end of file diff --git a/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/crit.png b/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/crit.png index 0be8b9b1dd..23a7ec0af6 100644 Binary files a/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/crit.png and b/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/crit.png differ diff --git a/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/dead.png b/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/dead.png index 2761d22dbf..cd355b6152 100644 Binary files a/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/dead.png and b/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/dead.png differ diff --git a/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/meta.json b/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/meta.json index ce2209e72d..cc020d01c4 100644 --- a/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/meta.json +++ b/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/meta.json @@ -1,24 +1,24 @@ { - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "https://github.com/tgstation/TerraGov-Marine-Corps/blob/a2034543920664ddf0c0f3c681bf1d8003dc2ade/icons/Xeno/2x2_Xenos.dmi", - "size": { - "x": 64, - "y": 64 - }, - "states": [ - { - "name": "running", - "directions": 4 + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "DakoDragon, discord ID: 56038550335922176", + "size": { + "x": 64, + "y": 64 }, - { - "name": "sleeping" - }, - { - "name": "dead" - }, - { - "name": "crit" - } - ] + "states": [ + { + "name": "running", + "directions": 4 + }, + { + "name": "sleeping" + }, + { + "name": "dead" + }, + { + "name": "crit" + } + ] } diff --git a/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/running.png b/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/running.png index 2bbe1c603e..1438285113 100644 Binary files a/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/running.png and b/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/running.png differ diff --git a/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/sleeping.png b/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/sleeping.png index 06ff2250d0..9221665dd8 100644 Binary files a/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/sleeping.png and b/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/sleeping.png differ diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/forked_long.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/forked_long.png new file mode 100644 index 0000000000..280768b40a Binary files /dev/null and b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/forked_long.png differ diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/haven_tone_1.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/haven_tone_1.png new file mode 100644 index 0000000000..e818e7dd11 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/haven_tone_1.png differ diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/haven_tone_2.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/haven_tone_2.png new file mode 100644 index 0000000000..fe98ec53eb Binary files /dev/null and b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/haven_tone_2.png differ diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/meta.json b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/meta.json index f33401617c..94795a626e 100644 --- a/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/meta.json +++ b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Phoenix and Rooster by @leonardo_dabepis, Finch & Forked Tailfin by @stillxicarus", + "copyright": "Phoenix and Rooster by @leonardo_dabepis, Finch & Forked Tailfin by @stillxicarus, haven & forked_long & swallow by @Kilath", "size": { "x": 32, "y": 32 @@ -22,6 +22,22 @@ { "name": "whitescale_forked_tailfin", "directions": 4 + }, + { + "name": "haven_tone_1", + "directions": 4 + }, + { + "name": "haven_tone_2", + "directions": 4 + }, + { + "name": "forked_long", + "directions": 4 + }, + { + "name": "swallow_tail", + "directions": 4 } ] } diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/swallow_tail.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/swallow_tail.png new file mode 100644 index 0000000000..f9187b66f8 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/swallow_tail.png differ diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/bat_wings_tone_1.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/bat_wings_tone_1.png new file mode 100644 index 0000000000..a147739cc9 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/bat_wings_tone_1.png differ diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/bat_wings_tone_2.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/bat_wings_tone_2.png new file mode 100644 index 0000000000..b2170ff803 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/bat_wings_tone_2.png differ diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/bionic_wings_tone_1.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/bionic_wings_tone_1.png new file mode 100644 index 0000000000..752d6cc9a2 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/bionic_wings_tone_1.png differ diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/bionic_wings_tone_2.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/bionic_wings_tone_2.png new file mode 100644 index 0000000000..528b5cbfa0 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/bionic_wings_tone_2.png differ diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/meta.json b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/meta.json index 7737af0afc..c8bf28767a 100644 --- a/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/meta.json +++ b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/meta.json @@ -5,7 +5,7 @@ "y": 32 }, "license": "CC-BY-SA-3.0", - "copyright": "classicharpy Taken from S.P.L.U.R.T at commit https://github.com/SPLURT-Station/S.P.L.U.R.T-Station-13/commit/285f6f86ac41a6246f250993486effeab8581c2c, edited by @raistlin_jag | harpyfolded, harpy, and owl by @stillxicarus", + "copyright": "classicharpy Taken from S.P.L.U.R.T at commit https://github.com/SPLURT-Station/S.P.L.U.R.T-Station-13/commit/285f6f86ac41a6246f250993486effeab8581c2c, edited by @raistlin_jag | harpyfolded, harpy, and owl by @stillxicarus, bat wings by @Kilath", "states": [ { "name": "huescale_harpy", @@ -78,6 +78,22 @@ { "name": "whitescale_harpy_wing_owl", "directions": 4 + }, + { + "name": "bat_wings_tone_1", + "directions": 4 + }, + { + "name": "bat_wings_tone_2", + "directions": 4 + }, + { + "name": "bionic_wings_tone_1", + "directions": 4 + }, + { + "name": "bionic_wings_tone_2", + "directions": 4 } ] } diff --git a/Resources/Textures/Nyanotrasen/Mobs/Species/lamia.rsi/meta.json b/Resources/Textures/Nyanotrasen/Mobs/Species/lamia.rsi/meta.json index ebfd0e2dc7..01a2143a39 100644 --- a/Resources/Textures/Nyanotrasen/Mobs/Species/lamia.rsi/meta.json +++ b/Resources/Textures/Nyanotrasen/Mobs/Species/lamia.rsi/meta.json @@ -10,6 +10,9 @@ { "name": "placeholder" }, + { + "name": "segment" + }, { "name": "bottom", "directions": 4 diff --git a/Resources/Textures/Nyanotrasen/Mobs/Species/lamia.rsi/segment.png b/Resources/Textures/Nyanotrasen/Mobs/Species/lamia.rsi/segment.png new file mode 100644 index 0000000000..09fa419f45 Binary files /dev/null and b/Resources/Textures/Nyanotrasen/Mobs/Species/lamia.rsi/segment.png differ diff --git a/Resources/Textures/Objects/Misc/bureaucracy.rsi/meta.json b/Resources/Textures/Objects/Misc/bureaucracy.rsi/meta.json index b57f9844bc..dc7906e859 100644 --- a/Resources/Textures/Objects/Misc/bureaucracy.rsi/meta.json +++ b/Resources/Textures/Objects/Misc/bureaucracy.rsi/meta.json @@ -260,6 +260,9 @@ { "name": "paper_stamp-psychologist" }, + { + "name": "paper_stamp-notary" + }, { "name": "paper_stamp-signature" } diff --git a/Resources/Textures/Objects/Misc/bureaucracy.rsi/paper_stamp-notary.png b/Resources/Textures/Objects/Misc/bureaucracy.rsi/paper_stamp-notary.png new file mode 100644 index 0000000000..603351ace5 Binary files /dev/null and b/Resources/Textures/Objects/Misc/bureaucracy.rsi/paper_stamp-notary.png differ diff --git a/Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/icon-jetpack.png b/Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/icon-jetpack.png new file mode 100644 index 0000000000..ec7033ec2f Binary files /dev/null and b/Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/icon-jetpack.png differ diff --git a/Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/icon-pka.png b/Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/icon-pka.png new file mode 100644 index 0000000000..db086b229e Binary files /dev/null and b/Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/icon-pka.png differ diff --git a/Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/meta.json b/Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/meta.json index 2499244135..ce8f8187b7 100644 --- a/Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/meta.json @@ -61,6 +61,9 @@ { "name": "icon-harvesting" }, + { + "name": "icon-jetpack" + }, { "name": "icon-light-replacer" }, @@ -79,6 +82,9 @@ { "name": "icon-pen" }, + { + "name": "icon-pka" + }, { "name": "icon-radiation" }, diff --git a/Resources/Textures/Objects/Tools/cmopenlight.rsi/meta.json b/Resources/Textures/Objects/Tools/cmopenlight.rsi/meta.json new file mode 100644 index 0000000000..8f4b8ba253 --- /dev/null +++ b/Resources/Textures/Objects/Tools/cmopenlight.rsi/meta.json @@ -0,0 +1,17 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "MistakeNot4892, https://github.com/NebulaSS13/Nebula/blob/dev/icons/obj/lighting/penlight.dmi", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "world" + }, + { + "name": "world-on" + } + ] +} diff --git a/Resources/Textures/Objects/Tools/cmopenlight.rsi/world-on.png b/Resources/Textures/Objects/Tools/cmopenlight.rsi/world-on.png new file mode 100644 index 0000000000..fbd87cad20 Binary files /dev/null and b/Resources/Textures/Objects/Tools/cmopenlight.rsi/world-on.png differ diff --git a/Resources/Textures/Objects/Tools/cmopenlight.rsi/world.png b/Resources/Textures/Objects/Tools/cmopenlight.rsi/world.png new file mode 100644 index 0000000000..40edaedd9e Binary files /dev/null and b/Resources/Textures/Objects/Tools/cmopenlight.rsi/world.png differ diff --git a/Resources/Textures/Objects/Tools/penlight.rsi/meta.json b/Resources/Textures/Objects/Tools/penlight.rsi/meta.json new file mode 100644 index 0000000000..8f4b8ba253 --- /dev/null +++ b/Resources/Textures/Objects/Tools/penlight.rsi/meta.json @@ -0,0 +1,17 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "MistakeNot4892, https://github.com/NebulaSS13/Nebula/blob/dev/icons/obj/lighting/penlight.dmi", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "world" + }, + { + "name": "world-on" + } + ] +} diff --git a/Resources/Textures/Objects/Tools/penlight.rsi/world-on.png b/Resources/Textures/Objects/Tools/penlight.rsi/world-on.png new file mode 100644 index 0000000000..afb10cdad4 Binary files /dev/null and b/Resources/Textures/Objects/Tools/penlight.rsi/world-on.png differ diff --git a/Resources/Textures/Objects/Tools/penlight.rsi/world.png b/Resources/Textures/Objects/Tools/penlight.rsi/world.png new file mode 100644 index 0000000000..4cf616bf95 Binary files /dev/null and b/Resources/Textures/Objects/Tools/penlight.rsi/world.png differ diff --git a/Resources/Textures/Objects/Weapons/Bombs/breaching.rsi/icon.png b/Resources/Textures/Objects/Weapons/Bombs/breaching.rsi/icon.png new file mode 100644 index 0000000000..5bd58663b6 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Bombs/breaching.rsi/icon.png differ diff --git a/Resources/Textures/Objects/Weapons/Bombs/breaching.rsi/inhand-left.png b/Resources/Textures/Objects/Weapons/Bombs/breaching.rsi/inhand-left.png new file mode 100644 index 0000000000..4ea978c699 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Bombs/breaching.rsi/inhand-left.png differ diff --git a/Resources/Textures/Objects/Weapons/Bombs/breaching.rsi/inhand-right.png b/Resources/Textures/Objects/Weapons/Bombs/breaching.rsi/inhand-right.png new file mode 100644 index 0000000000..2b675ecabf Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Bombs/breaching.rsi/inhand-right.png differ diff --git a/Resources/Textures/Objects/Weapons/Bombs/breaching.rsi/meta.json b/Resources/Textures/Objects/Weapons/Bombs/breaching.rsi/meta.json new file mode 100644 index 0000000000..678ffd9abd --- /dev/null +++ b/Resources/Textures/Objects/Weapons/Bombs/breaching.rsi/meta.json @@ -0,0 +1,31 @@ + { + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "made by rosieposieeee (github) for ss14", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "primed", + "delays": [ + [ + 0.1, + 0.1 + ] + ] + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Objects/Weapons/Bombs/breaching.rsi/primed.png b/Resources/Textures/Objects/Weapons/Bombs/breaching.rsi/primed.png new file mode 100644 index 0000000000..135cc2d349 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Bombs/breaching.rsi/primed.png differ diff --git a/Resources/Textures/Structures/Storage/closet.rsi/cj.png b/Resources/Textures/Structures/Storage/closet.rsi/cj.png new file mode 100644 index 0000000000..c57b4b8899 Binary files /dev/null and b/Resources/Textures/Structures/Storage/closet.rsi/cj.png differ diff --git a/Resources/Textures/Structures/Storage/closet.rsi/cj_door.png b/Resources/Textures/Structures/Storage/closet.rsi/cj_door.png new file mode 100644 index 0000000000..f406e39807 Binary files /dev/null and b/Resources/Textures/Structures/Storage/closet.rsi/cj_door.png differ diff --git a/Resources/Textures/Structures/Storage/closet.rsi/cj_open.png b/Resources/Textures/Structures/Storage/closet.rsi/cj_open.png new file mode 100644 index 0000000000..8ba72a5bcc Binary files /dev/null and b/Resources/Textures/Structures/Storage/closet.rsi/cj_open.png differ diff --git a/Resources/Textures/Structures/Storage/closet.rsi/clerk.png b/Resources/Textures/Structures/Storage/closet.rsi/clerk.png new file mode 100644 index 0000000000..d941ab4bf5 Binary files /dev/null and b/Resources/Textures/Structures/Storage/closet.rsi/clerk.png differ diff --git a/Resources/Textures/Structures/Storage/closet.rsi/clerk_door.png b/Resources/Textures/Structures/Storage/closet.rsi/clerk_door.png new file mode 100644 index 0000000000..e31a6468b9 Binary files /dev/null and b/Resources/Textures/Structures/Storage/closet.rsi/clerk_door.png differ diff --git a/Resources/Textures/Structures/Storage/closet.rsi/clerk_open.png b/Resources/Textures/Structures/Storage/closet.rsi/clerk_open.png new file mode 100644 index 0000000000..ab865e6cbe Binary files /dev/null and b/Resources/Textures/Structures/Storage/closet.rsi/clerk_open.png differ diff --git a/Resources/Textures/Structures/Storage/closet.rsi/meta.json b/Resources/Textures/Structures/Storage/closet.rsi/meta.json index c52bc13540..d3802637c0 100644 --- a/Resources/Textures/Structures/Storage/closet.rsi/meta.json +++ b/Resources/Textures/Structures/Storage/closet.rsi/meta.json @@ -4,7 +4,7 @@ "x": 32, "y": 32 }, - "copyright": "Taken from tgstation, brigmedic locker is a resprited CMO locker by PuroSlavKing (Github), n2_door state modified by Flareguy from fire_door, using sprites from /vg/station at https://github.com/vgstation-coders/vgstation13/commit/02b9f6894af4419c9f7e699a22c402b086d8067e", + "copyright": "Taken from tgstation, brigmedic locker is a resprited CMO locker by PuroSlavKing (Github), CJ and Clerk lockers edited by Timemaster99 (Discord), n2_door state modified by Flareguy from fire_door, using sprites from /vg/station at https://github.com/vgstation-coders/vgstation13/commit/02b9f6894af4419c9f7e699a22c402b086d8067e", "license": "CC-BY-SA-3.0", "states": [ { @@ -163,6 +163,24 @@ { "name": "chemical_door" }, + { + "name": "cj" + }, + { + "name": "cj_door" + }, + { + "name": "cj_open" + }, + { + "name": "clerk" + }, + { + "name": "clerk_door" + }, + { + "name": "clerk_open" + }, { "name": "cmo" }, diff --git a/Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_base.png b/Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_base.png new file mode 100644 index 0000000000..778c427735 Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_base.png differ diff --git a/Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_on_ext.png b/Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_on_ext.png new file mode 100644 index 0000000000..7b7f3f4e76 Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_on_ext.png differ diff --git a/Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_on_high.png b/Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_on_high.png new file mode 100644 index 0000000000..7b7f3f4e76 Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_on_high.png differ diff --git a/Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_on_idle.png b/Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_on_idle.png new file mode 100644 index 0000000000..4038e10088 Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_on_idle.png differ diff --git a/Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_on_low.png b/Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_on_low.png new file mode 100644 index 0000000000..a09613ad52 Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_on_low.png differ diff --git a/Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_on_med.png b/Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_on_med.png new file mode 100644 index 0000000000..33d354a6a6 Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_on_med.png differ diff --git a/Resources/Textures/Structures/Wallmounts/radalarm.rsi/meta.json b/Resources/Textures/Structures/Wallmounts/radalarm.rsi/meta.json new file mode 100644 index 0000000000..2ef22994bc --- /dev/null +++ b/Resources/Textures/Structures/Wallmounts/radalarm.rsi/meta.json @@ -0,0 +1,35 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Made by @dootythefrooty (Discord)", + "states": [ + { + "name": "geiger_base", + "directions": 4 + }, + { + "name": "geiger_on_idle", + "directions": 4 + }, + { + "name": "geiger_on_low", + "directions": 4 + }, + { + "name": "geiger_on_med", + "directions": 4 + }, + { + "name": "geiger_on_high", + "directions": 4 + }, + { + "name": "geiger_on_ext", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Supermatter/supermatter.rsi/meta.json b/Resources/Textures/Supermatter/supermatter.rsi/meta.json index d0a000ae2b..33b0dd6788 100644 --- a/Resources/Textures/Supermatter/supermatter.rsi/meta.json +++ b/Resources/Textures/Supermatter/supermatter.rsi/meta.json @@ -9,13 +9,7 @@ "states": [ { "name": "supermatter", - "delays": [ - [ - 0.08, - 0.08, - 0.08 - ] - ] + "delays": [ [ 0.08, 0.08, 0.08 ] ] } ] }