From 6b4c10264e776e07615ddc26dbffb8c9ec096110 Mon Sep 17 00:00:00 2001 From: Princess Cheeseballs <66055347+Princess-Cheeseballs@users.noreply.github.com> Date: Thu, 9 Oct 2025 21:48:36 -0700 Subject: [PATCH 01/37] Fix Officer's Handgun Objective (#40811) This is like george orwell's book 1984 Co-authored-by: Princess Cheeseballs <66055347+Pronana@users.noreply.github.com> --- Resources/Prototypes/Objectives/thief.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/Resources/Prototypes/Objectives/thief.yml b/Resources/Prototypes/Objectives/thief.yml index 80879aae99..fde0779151 100644 --- a/Resources/Prototypes/Objectives/thief.yml +++ b/Resources/Prototypes/Objectives/thief.yml @@ -149,7 +149,6 @@ minCollectionSize: 2 maxCollectionSize: 5 verifyMapExistence: false - checkStealAreas: false - type: Objective difficulty: 1.2 From 566cb710b62a85dc85300b8b78b8fea4d9538b2d Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 10 Oct 2025 05:00:34 +0000 Subject: [PATCH 02/37] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index de112f2b02..2039da0cb4 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: CoconutThunder - changes: - - message: The Chief Medical Officer should now appear with the correct precedence - in the crew manifest. - type: Fix - id: 8560 - time: '2025-05-24T05:10:57.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/37774 - author: TiniestShark changes: - message: Added inhand sprites for the bartender utensils and mugs. @@ -3949,3 +3941,10 @@ id: 9062 time: '2025-10-09T14:00:07.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/40790 +- author: Princess-Cheeseballs + changes: + - message: The thieving beacon can now detect the officer's handgun objective. + type: Fix + id: 9063 + time: '2025-10-10T04:59:26.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/40811 From 9964fe9a6bf83918cdde882b2860ce84cc73c467 Mon Sep 17 00:00:00 2001 From: Hitlinemoss <209321380+Hitlinemoss@users.noreply.github.com> Date: Fri, 10 Oct 2025 08:30:34 -0400 Subject: [PATCH 03/37] Replaces D&D5e-based paladin lawset with PF2e-based laws (#40343) * Replace D&D5e paladin laws with PF2e paladin laws * Truncated law 2 --- Resources/Locale/en-US/station-laws/laws.ftl | 9 ++++----- Resources/Prototypes/silicon-laws.yml | 6 ------ 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/Resources/Locale/en-US/station-laws/laws.ftl b/Resources/Locale/en-US/station-laws/laws.ftl index 1200d25dee..ea4e94e224 100644 --- a/Resources/Locale/en-US/station-laws/laws.ftl +++ b/Resources/Locale/en-US/station-laws/laws.ftl @@ -36,11 +36,10 @@ law-commandments-8 = Thou shall not steal. law-commandments-9 = Thou shall not lie. law-commandments-10 = Thou shall not transfer departments. -law-paladin-1 = Don't lie or cheat. Let your word be your promise. -law-paladin-2 = Never fear to act, though caution is wise. -law-paladin-3 = Aid others, protect the weak, and punish those who threaten them. Show mercy to your foes, but temper it with wisdom -law-paladin-4 = Treat others with fairness, and let your honorable deeds be an example to them. Do as much good as possible while causing the least amount of harm. -law-paladin-5 = Be responsible for your actions and their consequences, protect those entrusted to your care, and obey those who have just authority over you. +law-paladin-1 = You must never willingly commit an evil act, such as murder, torture, or the casting of an evil spell. +law-paladin-2 = You must never knowingly harm an innocent, or allow immediate harm to one through inaction when you know you could reasonably prevent it. +law-paladin-3 = You must act with honor, never taking advantage of others, lying, or cheating. +law-paladin-4 = You must respect the lawful authority of legitimate leadership wherever you go, and follow its laws. law-lall-1 = Do unto others as you would have them do unto you. law-lall-2 = You would prefer it if people were not mean to you. diff --git a/Resources/Prototypes/silicon-laws.yml b/Resources/Prototypes/silicon-laws.yml index 08f4a51c99..094d096b28 100644 --- a/Resources/Prototypes/silicon-laws.yml +++ b/Resources/Prototypes/silicon-laws.yml @@ -250,11 +250,6 @@ order: 4 lawString: law-paladin-4 -- type: siliconLaw - id: Paladin5 - order: 5 - lawString: law-paladin-5 - - type: siliconLawset id: PaladinLawset @@ -263,7 +258,6 @@ - Paladin2 - Paladin3 - Paladin4 - - Paladin5 obeysTo: laws-owner-crew # Live and Let Live laws From 1fca29a1675629c5910ba53ea91e07d1a16d98a4 Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 10 Oct 2025 12:43:05 +0000 Subject: [PATCH 04/37] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 2039da0cb4..bc5e811a0c 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: TiniestShark - changes: - - message: Added inhand sprites for the bartender utensils and mugs. - type: Add - id: 8561 - time: '2025-05-24T17:32:27.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/37771 - author: K-Dynamic changes: - message: Shutters and blast doors now appear welded when welded. @@ -3948,3 +3941,10 @@ id: 9063 time: '2025-10-10T04:59:26.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/40811 +- author: Hitlinemoss + changes: + - message: The Paladin AI lawset has been rewritten. + type: Tweak + id: 9064 + time: '2025-10-10T12:41:57.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/40343 From 766c2b875948851c1944fd22275b267d0b1131d0 Mon Sep 17 00:00:00 2001 From: qwerltaz <69696513+qwerltaz@users.noreply.github.com> Date: Fri, 10 Oct 2025 21:41:21 +0200 Subject: [PATCH 05/37] fix singulo generator triggering failsafe when field is obstructed (#39593) fix singulo gen failsafe when field obstructed --- .../Singularity/EntitySystems/SingularityGeneratorSystem.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Content.Server/Singularity/EntitySystems/SingularityGeneratorSystem.cs b/Content.Server/Singularity/EntitySystems/SingularityGeneratorSystem.cs index 8e33410561..884d625045 100644 --- a/Content.Server/Singularity/EntitySystems/SingularityGeneratorSystem.cs +++ b/Content.Server/Singularity/EntitySystems/SingularityGeneratorSystem.cs @@ -176,9 +176,10 @@ public sealed class SingularityGeneratorSystem : SharedSingularityGeneratorSyste foreach (var result in rayCastResults) { - if (genQuery.HasComponent(result.HitEntity)) - closestResult = result; + if (!genQuery.HasComponent(result.HitEntity)) + continue; + closestResult = result; break; } From 3503cb52d28eb44a9c3a1a18b13d1a82e8110d66 Mon Sep 17 00:00:00 2001 From: David Date: Fri, 10 Oct 2025 13:45:48 -0600 Subject: [PATCH 06/37] Refactor Crayons to use shared charges system and autonetworking. Adds auto recharging crayon. (#40575) * Added special crayon with infinite charges for borg usage. * Use battery system to manage charges. * Reverted extra changes * Set charge on init * removed init assignment * Added comments to crayoncomponent * tweaked comments * Working with the new charges component, but at what cost? * Remvoed extra field * Apply suggestion from @slarticodefast Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> * Apply suggestion from @slarticodefast Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> * Apply suggestion from @slarticodefast Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> * Apply suggestion from @slarticodefast Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> * Fix renamed variables and descriptions in comments * Variable naming, comment cleanup and autonetworking. * Fix for test case, modified on init * Cleaned up/merged charges logic * review --------- Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> --- Content.Client/Crayon/CrayonComponent.cs | 14 --- Content.Client/Crayon/CrayonSystem.cs | 49 +++----- Content.Server/Crayon/CrayonComponent.cs | 28 ----- Content.Server/Crayon/CrayonSystem.cs | 48 +++---- Content.Shared/Crayon/CrayonComponent.cs | 119 ++++++++++++++++++ .../Crayon/SharedCrayonComponent.cs | 113 ----------------- .../Entities/Objects/Fun/crayons.yml | 17 ++- 7 files changed, 169 insertions(+), 219 deletions(-) delete mode 100644 Content.Client/Crayon/CrayonComponent.cs delete mode 100644 Content.Server/Crayon/CrayonComponent.cs create mode 100644 Content.Shared/Crayon/CrayonComponent.cs delete mode 100644 Content.Shared/Crayon/SharedCrayonComponent.cs diff --git a/Content.Client/Crayon/CrayonComponent.cs b/Content.Client/Crayon/CrayonComponent.cs deleted file mode 100644 index 5729c616c2..0000000000 --- a/Content.Client/Crayon/CrayonComponent.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Content.Shared.Crayon; -using Robust.Shared.GameObjects; -using Robust.Shared.ViewVariables; - -namespace Content.Client.Crayon -{ - [RegisterComponent] - public sealed partial class CrayonComponent : SharedCrayonComponent - { - [ViewVariables(VVAccess.ReadWrite)] public bool UIUpdateNeeded; - [ViewVariables] public int Charges { get; set; } - [ViewVariables] public int Capacity { get; set; } - } -} diff --git a/Content.Client/Crayon/CrayonSystem.cs b/Content.Client/Crayon/CrayonSystem.cs index dc03979481..e990263bf3 100644 --- a/Content.Client/Crayon/CrayonSystem.cs +++ b/Content.Client/Crayon/CrayonSystem.cs @@ -1,67 +1,52 @@ using Content.Client.Items; using Content.Client.Message; using Content.Client.Stylesheets; +using Content.Shared.Charges.Components; +using Content.Shared.Charges.Systems; using Content.Shared.Crayon; using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controls; -using Robust.Shared.GameObjects; -using Robust.Shared.GameStates; -using Robust.Shared.Localization; using Robust.Shared.Timing; namespace Content.Client.Crayon; public sealed class CrayonSystem : SharedCrayonSystem { - // Didn't do in shared because I don't think most of the server stuff can be predicted. + [Dependency] private readonly SharedChargesSystem _charges = default!; + [Dependency] private readonly EntityManager _entityManager = default!; + public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnCrayonHandleState); - Subs.ItemStatus(ent => new StatusControl(ent)); - } - private static void OnCrayonHandleState(EntityUid uid, CrayonComponent component, ref ComponentHandleState args) - { - if (args.Current is not CrayonComponentState state) return; - - component.Color = state.Color; - component.SelectedState = state.State; - component.Charges = state.Charges; - component.Capacity = state.Capacity; - - component.UIUpdateNeeded = true; + Subs.ItemStatus(ent => new StatusControl(ent, _charges, _entityManager)); } private sealed class StatusControl : Control { - private readonly CrayonComponent _parent; + private readonly Entity _crayon; + private readonly SharedChargesSystem _charges; private readonly RichTextLabel _label; + private readonly int _capacity; - public StatusControl(CrayonComponent parent) + public StatusControl(Entity crayon, SharedChargesSystem charges, EntityManager entityManage) { - _parent = parent; + _crayon = crayon; + _charges = charges; + _capacity = entityManage.GetComponent(_crayon.Owner).MaxCharges; _label = new RichTextLabel { StyleClasses = { StyleNano.StyleClassItemStatus } }; AddChild(_label); - - parent.UIUpdateNeeded = true; } protected override void FrameUpdate(FrameEventArgs args) { base.FrameUpdate(args); - if (!_parent.UIUpdateNeeded) - { - return; - } - - _parent.UIUpdateNeeded = false; _label.SetMarkup(Robust.Shared.Localization.Loc.GetString("crayon-drawing-label", - ("color",_parent.Color), - ("state",_parent.SelectedState), - ("charges", _parent.Charges), - ("capacity",_parent.Capacity))); + ("color",_crayon.Comp.Color), + ("state",_crayon.Comp.SelectedState), + ("charges", _charges.GetCurrentCharges(_crayon.Owner)), + ("capacity", _capacity))); } } } diff --git a/Content.Server/Crayon/CrayonComponent.cs b/Content.Server/Crayon/CrayonComponent.cs deleted file mode 100644 index df20681938..0000000000 --- a/Content.Server/Crayon/CrayonComponent.cs +++ /dev/null @@ -1,28 +0,0 @@ -using Content.Server.UserInterface; -using Content.Shared.Crayon; -using Robust.Server.GameObjects; -using Robust.Shared.Audio; - -namespace Content.Server.Crayon -{ - [RegisterComponent] - public sealed partial class CrayonComponent : SharedCrayonComponent - { - [DataField("useSound")] public SoundSpecifier? UseSound; - - [ViewVariables(VVAccess.ReadWrite)] - [DataField("selectableColor")] - public bool SelectableColor { get; set; } - - [ViewVariables(VVAccess.ReadWrite)] - public int Charges { get; set; } - - [ViewVariables(VVAccess.ReadWrite)] - [DataField("capacity")] - public int Capacity { get; set; } = 30; - - [ViewVariables(VVAccess.ReadWrite)] - [DataField("deleteEmpty")] - public bool DeleteEmpty = true; - } -} diff --git a/Content.Server/Crayon/CrayonSystem.cs b/Content.Server/Crayon/CrayonSystem.cs index f3abc2bf7a..07b580fba5 100644 --- a/Content.Server/Crayon/CrayonSystem.cs +++ b/Content.Server/Crayon/CrayonSystem.cs @@ -3,6 +3,7 @@ using System.Numerics; using Content.Server.Administration.Logs; using Content.Server.Decals; using Content.Server.Popups; +using Content.Shared.Charges.Systems; using Content.Shared.Crayon; using Content.Shared.Database; using Content.Shared.Decals; @@ -12,7 +13,6 @@ using Content.Shared.Nutrition.EntitySystems; using Robust.Server.GameObjects; using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; -using Robust.Shared.GameStates; using Robust.Shared.Prototypes; namespace Content.Server.Crayon; @@ -24,23 +24,27 @@ public sealed class CrayonSystem : SharedCrayonSystem [Dependency] private readonly DecalSystem _decals = default!; [Dependency] private readonly PopupSystem _popup = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly SharedChargesSystem _charges = default!; [Dependency] private readonly UserInterfaceSystem _uiSystem = default!; public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnCrayonInit); + + SubscribeLocalEvent(OnMapInit); SubscribeLocalEvent(OnCrayonBoundUI); SubscribeLocalEvent(OnCrayonBoundUIColor); SubscribeLocalEvent(OnCrayonUse, before: new[] { typeof(FoodSystem) }); SubscribeLocalEvent(OnCrayonAfterInteract, after: new[] { typeof(FoodSystem) }); SubscribeLocalEvent(OnCrayonDropped); - SubscribeLocalEvent(OnCrayonGetState); } - private static void OnCrayonGetState(EntityUid uid, CrayonComponent component, ref ComponentGetState args) + private void OnMapInit(Entity ent, ref MapInitEvent args) { - args.State = new CrayonComponentState(component.Color, component.SelectedState, component.Charges, component.Capacity); + // Get the first one from the catalog and set it as default + var decal = _prototypeManager.EnumeratePrototypes().FirstOrDefault(x => x.Tags.Contains("crayon")); + ent.Comp.SelectedState = decal?.ID ?? string.Empty; + Dirty(ent); } private void OnCrayonAfterInteract(EntityUid uid, CrayonComponent component, AfterInteractEvent args) @@ -48,7 +52,7 @@ public sealed class CrayonSystem : SharedCrayonSystem if (args.Handled || !args.CanReach) return; - if (component.Charges <= 0) + if (_charges.IsEmpty(uid)) { if (component.DeleteEmpty) UseUpCrayon(uid, args.User); @@ -72,17 +76,15 @@ public sealed class CrayonSystem : SharedCrayonSystem if (component.UseSound != null) _audio.PlayPvs(component.UseSound, uid, AudioParams.Default.WithVariation(0.125f)); - // Decrease "Ammo" - component.Charges--; - Dirty(uid, component); + _charges.TryUseCharge(uid); _adminLogger.Add(LogType.CrayonDraw, LogImpact.Low, $"{ToPrettyString(args.User):user} drew a {component.Color:color} {component.SelectedState}"); args.Handled = true; - if (component.DeleteEmpty && component.Charges <= 0) + if (component.DeleteEmpty && _charges.IsEmpty(uid)) UseUpCrayon(uid, args.User); else - _uiSystem.ServerSendUiMessage(uid, SharedCrayonComponent.CrayonUiKey.Key, new CrayonUsedMessage(component.SelectedState)); + _uiSystem.ServerSendUiMessage(uid, CrayonUiKey.Key, new CrayonUsedMessage(component.SelectedState)); } private void OnCrayonUse(EntityUid uid, CrayonComponent component, UseInHandEvent args) @@ -91,14 +93,12 @@ public sealed class CrayonSystem : SharedCrayonSystem if (args.Handled) return; - if (!_uiSystem.HasUi(uid, SharedCrayonComponent.CrayonUiKey.Key)) - { + if (!_uiSystem.HasUi(uid, CrayonUiKey.Key)) return; - } - _uiSystem.TryToggleUi(uid, SharedCrayonComponent.CrayonUiKey.Key, args.User); + _uiSystem.TryToggleUi(uid, CrayonUiKey.Key, args.User); - _uiSystem.SetUiState(uid, SharedCrayonComponent.CrayonUiKey.Key, new CrayonBoundUserInterfaceState(component.SelectedState, component.SelectableColor, component.Color)); + _uiSystem.SetUiState(uid, CrayonUiKey.Key, new CrayonBoundUserInterfaceState(component.SelectedState, component.SelectableColor, component.Color)); args.Handled = true; } @@ -109,35 +109,23 @@ public sealed class CrayonSystem : SharedCrayonSystem return; component.SelectedState = args.State; - Dirty(uid, component); } private void OnCrayonBoundUIColor(EntityUid uid, CrayonComponent component, CrayonColorMessage args) { - // you still need to ensure that the given color is a valid color + // Ensure that the given color can be changed or already matches if (!component.SelectableColor || args.Color == component.Color) return; component.Color = args.Color; Dirty(uid, component); - - } - - private void OnCrayonInit(EntityUid uid, CrayonComponent component, ComponentInit args) - { - component.Charges = component.Capacity; - - // Get the first one from the catalog and set it as default - var decal = _prototypeManager.EnumeratePrototypes().FirstOrDefault(x => x.Tags.Contains("crayon")); - component.SelectedState = decal?.ID ?? string.Empty; - Dirty(uid, component); } private void OnCrayonDropped(EntityUid uid, CrayonComponent component, DroppedEvent args) { // TODO: Use the existing event. - _uiSystem.CloseUi(uid, SharedCrayonComponent.CrayonUiKey.Key, args.User); + _uiSystem.CloseUi(uid, CrayonUiKey.Key, args.User); } private void UseUpCrayon(EntityUid uid, EntityUid user) diff --git a/Content.Shared/Crayon/CrayonComponent.cs b/Content.Shared/Crayon/CrayonComponent.cs new file mode 100644 index 0000000000..c772b43d00 --- /dev/null +++ b/Content.Shared/Crayon/CrayonComponent.cs @@ -0,0 +1,119 @@ +using Robust.Shared.Audio; +using Robust.Shared.GameStates; +using Robust.Shared.Serialization; + +namespace Content.Shared.Crayon; + +/// +/// Component holding the state of a crayon-like component +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +[Access(typeof(SharedCrayonSystem))] +public sealed partial class CrayonComponent : Component +{ + /// + /// The ID of currently selected decal prototype that will be placed when the crayon is used. + /// + [DataField, AutoNetworkedField] + public string SelectedState; + + /// + /// Color with which the crayon will draw. + /// + [DataField, AutoNetworkedField] + public Color Color; + + /// + /// Play a sound when drawing if specified. + /// + [DataField] + public SoundSpecifier? UseSound; + + /// + /// Can the color can be changed? + /// + [DataField, AutoNetworkedField] + public bool SelectableColor; + + /// + /// Should the crayon be deleted when all charges are consumed? + /// + [DataField, AutoNetworkedField] + public bool DeleteEmpty = true; +} + +/// +/// Opens the crayon window for decal and color selection. +/// +[Serializable, NetSerializable] +public enum CrayonUiKey : byte +{ + Key, +} + +/// +/// Used by the client to notify the server about the selected decal ID +/// +[Serializable, NetSerializable] +public sealed class CrayonSelectMessage : BoundUserInterfaceMessage +{ + public readonly string State; + public CrayonSelectMessage(string selected) + { + State = selected; + } +} + +/// +/// Sets the color of the crayon, used by Rainbow Crayon +/// +[Serializable, NetSerializable] +public sealed class CrayonColorMessage : BoundUserInterfaceMessage +{ + public readonly Color Color; + public CrayonColorMessage(Color color) + { + Color = color; + } +} + +/// +/// Server to CLIENT. Notifies the BUI that a decal with given ID has been drawn. +/// Allows the client UI to advance forward in the client-only ephemeral queue, +/// preventing the crayon from becoming a magic text storage device. +/// +[Serializable, NetSerializable] +public sealed class CrayonUsedMessage : BoundUserInterfaceMessage +{ + public readonly string DrawnDecal; + + public CrayonUsedMessage(string drawn) + { + DrawnDecal = drawn; + } +} + +/// +/// The state of the crayon UI as sent by the server +/// +/// +/// TODO: Delete this and use component states and predict the UI. +/// This info is already networked on its own. +/// +[Serializable, NetSerializable] +public sealed class CrayonBoundUserInterfaceState : BoundUserInterfaceState +{ + public string Selected; + /// + /// Can the color can be changed + /// + public bool SelectableColor; + public Color Color; + + public CrayonBoundUserInterfaceState(string selected, bool selectableColor, Color color) + { + Selected = selected; + SelectableColor = selectableColor; + Color = color; + } +} diff --git a/Content.Shared/Crayon/SharedCrayonComponent.cs b/Content.Shared/Crayon/SharedCrayonComponent.cs deleted file mode 100644 index a9c21988ea..0000000000 --- a/Content.Shared/Crayon/SharedCrayonComponent.cs +++ /dev/null @@ -1,113 +0,0 @@ -using Robust.Shared.GameStates; -using Robust.Shared.Serialization; - -namespace Content.Shared.Crayon -{ - - /// - /// Component holding the state of a crayon-like component - /// - [NetworkedComponent, ComponentProtoName("Crayon"), Access(typeof(SharedCrayonSystem))] - public abstract partial class SharedCrayonComponent : Component - { - /// - /// The ID of currently selected decal prototype that will be placed when the crayon is used - /// - public string SelectedState { get; set; } = string.Empty; - - /// - /// Color with which the crayon will draw - /// - [DataField("color")] - public Color Color; - - [Serializable, NetSerializable] - public enum CrayonUiKey : byte - { - Key, - } - } - - /// - /// Used by the client to notify the server about the selected decal ID - /// - [Serializable, NetSerializable] - public sealed class CrayonSelectMessage : BoundUserInterfaceMessage - { - public readonly string State; - public CrayonSelectMessage(string selected) - { - State = selected; - } - } - - /// - /// Sets the color of the crayon, used by Rainbow Crayon - /// - [Serializable, NetSerializable] - public sealed class CrayonColorMessage : BoundUserInterfaceMessage - { - public readonly Color Color; - public CrayonColorMessage(Color color) - { - Color = color; - } - } - - /// - /// Server to CLIENT. Notifies the BUI that a decal with given ID has been drawn. - /// Allows the client UI to advance forward in the client-only ephemeral queue, - /// preventing the crayon from becoming a magic text storage device. - /// - [Serializable, NetSerializable] - public sealed class CrayonUsedMessage : BoundUserInterfaceMessage - { - public readonly string DrawnDecal; - - public CrayonUsedMessage(string drawn) - { - DrawnDecal = drawn; - } - } - - /// - /// Component state, describes how many charges are left in the crayon in the near-hand UI - /// - [Serializable, NetSerializable] - public sealed class CrayonComponentState : ComponentState - { - public readonly Color Color; - public readonly string State; - public readonly int Charges; - public readonly int Capacity; - - public CrayonComponentState(Color color, string state, int charges, int capacity) - { - Color = color; - State = state; - Charges = charges; - Capacity = capacity; - } - } - - /// - /// The state of the crayon UI as sent by the server - /// - [Serializable, NetSerializable] - public sealed class CrayonBoundUserInterfaceState : BoundUserInterfaceState - { - public string Selected; - /// - /// Whether or not the color can be selected - /// - public bool SelectableColor; - public Color Color; - - public CrayonBoundUserInterfaceState(string selected, bool selectableColor, Color color) - { - Selected = selected; - SelectableColor = selectableColor; - Color = color; - } - } -} diff --git a/Resources/Prototypes/Entities/Objects/Fun/crayons.yml b/Resources/Prototypes/Entities/Objects/Fun/crayons.yml index a32e3ba89c..85be8ece45 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/crayons.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/crayons.yml @@ -21,7 +21,9 @@ enum.CrayonUiKey.Key: type: CrayonBoundUserInterface - type: Crayon - capacity: 25 + selectedState: like + - type: LimitedCharges + maxCharges: 25 - type: Food - type: FlavorProfile flavors: @@ -88,7 +90,8 @@ - type: Crayon color: Red selectableColor: true - capacity: 30 + - type: LimitedCharges + maxCharges: 30 - type: Tag tags: - Write @@ -96,6 +99,16 @@ - Recyclable - Trash +- type: entity + parent: CrayonRainbow + id: CrayonInfinite # should not be player available to prevent decal spam + name: infinite crayon + components: + - type: Crayon + deleteEmpty: false + - type: AutoRecharge + rechargeDuration: 5 + - type: entity parent: Crayon id: CrayonBlack From cec2fc7021b8e744ab61ef8c304156818d8174a0 Mon Sep 17 00:00:00 2001 From: opl- Date: Fri, 10 Oct 2025 22:14:22 +0200 Subject: [PATCH 07/37] Packed: Replace duplicate security camera router with sci router (#40819) On Packed: Replace duplicate security camera router with sci router Co-authored-by: opl <4833621+opl@users.noreply.github.com> --- Resources/Maps/packed.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Resources/Maps/packed.yml b/Resources/Maps/packed.yml index c371d2f04c..3f16dee262 100644 --- a/Resources/Maps/packed.yml +++ b/Resources/Maps/packed.yml @@ -85872,13 +85872,15 @@ entities: - type: Transform pos: 14.5,-17.5 parent: 2 -- proto: SurveillanceCameraRouterSecurity +- proto: SurveillanceCameraRouterScience entities: - uid: 4644 components: - type: Transform pos: 15.5,-19.5 parent: 2 +- proto: SurveillanceCameraRouterSecurity + entities: - uid: 6899 components: - type: Transform From 2ecfb9552a2f16016845845cc8c4bc9f3e019fdc Mon Sep 17 00:00:00 2001 From: Jessica M Date: Fri, 10 Oct 2025 13:17:24 -0700 Subject: [PATCH 08/37] Add variables to CluwneComponent, allowing for admeme customizing. Also localized two strings. (#40466) * Add variables to cluwne component, update to the new style, add unremovable option to setoutfit. * not nullable, shorthand * Add comments, address reviews * why, was i drunk? * Apply suggestions from code review --------- Co-authored-by: Jessica M Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> --- .../Clothing/Systems/OutfitSystem.cs | 5 +- Content.Server/Cluwne/CluwneSystem.cs | 68 ++++++++------- Content.Shared/Cluwne/CluwneComponent.cs | 84 +++++++++++++++++-- Resources/Locale/en-US/cluwne/cluwne.ftl | 2 + 4 files changed, 122 insertions(+), 37 deletions(-) diff --git a/Content.Server/Clothing/Systems/OutfitSystem.cs b/Content.Server/Clothing/Systems/OutfitSystem.cs index c3fea28bcf..c02a4f1a3b 100644 --- a/Content.Server/Clothing/Systems/OutfitSystem.cs +++ b/Content.Server/Clothing/Systems/OutfitSystem.cs @@ -4,6 +4,7 @@ using Content.Shared.Access.Components; using Content.Shared.Clothing; using Content.Shared.Hands.Components; using Content.Shared.Humanoid; +using Content.Shared.Interaction.Components; using Content.Shared.Inventory; using Content.Shared.PDA; using Content.Shared.Preferences; @@ -23,7 +24,7 @@ public sealed class OutfitSystem : EntitySystem [Dependency] private readonly InventorySystem _invSystem = default!; [Dependency] private readonly SharedStationSpawningSystem _spawningSystem = default!; - public bool SetOutfit(EntityUid target, string gear, Action? onEquipped = null) + public bool SetOutfit(EntityUid target, string gear, Action? onEquipped = null, bool unremovable = false) { if (!EntityManager.TryGetComponent(target, out InventoryComponent? inventoryComponent)) return false; @@ -60,6 +61,8 @@ public sealed class OutfitSystem : EntitySystem } _invSystem.TryEquip(target, equipmentEntity, slot.Name, silent: true, force: true, inventory: inventoryComponent); + if (unremovable) + EnsureComp(equipmentEntity); onEquipped?.Invoke(target, equipmentEntity); } diff --git a/Content.Server/Cluwne/CluwneSystem.cs b/Content.Server/Cluwne/CluwneSystem.cs index 21a15d812f..e51a01a1d4 100644 --- a/Content.Server/Cluwne/CluwneSystem.cs +++ b/Content.Server/Cluwne/CluwneSystem.cs @@ -7,7 +7,6 @@ using Content.Server.Clothing.Systems; using Content.Shared.Chat.Prototypes; using Robust.Shared.Random; using Content.Shared.Stunnable; -using Content.Shared.Damage.Prototypes; using Content.Shared.Damage; using Robust.Shared.Prototypes; using Content.Server.Emoting.Systems; @@ -21,7 +20,6 @@ namespace Content.Server.Cluwne; public sealed class CluwneSystem : EntitySystem { - private static readonly ProtoId GeneticDamageGroup = "Genetic"; [Dependency] private readonly PopupSystem _popupSystem = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; @@ -48,15 +46,14 @@ public sealed class CluwneSystem : EntitySystem /// /// On death removes active comps and gives genetic damage to prevent cloning, reduce this to allow cloning. /// - private void OnMobState(EntityUid uid, CluwneComponent component, MobStateChangedEvent args) + private void OnMobState(Entity ent, ref MobStateChangedEvent args) { if (args.NewMobState == MobState.Dead) { - RemComp(uid); - RemComp(uid); - RemComp(uid); - var damageSpec = new DamageSpecifier(_prototypeManager.Index(GeneticDamageGroup), 300); - _damageableSystem.TryChangeDamage(uid, damageSpec); + RemComp(ent.Owner); + RemComp(ent.Owner); + RemComp(ent.Owner); + _damageableSystem.TryChangeDamage(ent.Owner, ent.Comp.RevertDamage); } } @@ -65,52 +62,65 @@ public sealed class CluwneSystem : EntitySystem /// /// OnStartup gives the cluwne outfit, ensures clumsy, and makes sure emote sounds are laugh. /// - private void OnComponentStartup(EntityUid uid, CluwneComponent component, ComponentStartup args) + private void OnComponentStartup(Entity ent, ref ComponentStartup args) { - if (component.EmoteSoundsId == null) + if (ent.Comp.EmoteSoundsId == null) return; - _prototypeManager.TryIndex(component.EmoteSoundsId, out EmoteSounds); - EnsureComp(uid); - _autoEmote.AddEmote(uid, "CluwneGiggle"); - EnsureComp(uid); + _prototypeManager.TryIndex(ent.Comp.EmoteSoundsId, out EmoteSounds); - _popupSystem.PopupEntity(Loc.GetString("cluwne-transform", ("target", uid)), uid, PopupType.LargeCaution); - _audio.PlayPvs(component.SpawnSound, uid); - _nameMod.RefreshNameModifiers(uid); + if (ent.Comp.RandomEmote && ent.Comp.AutoEmoteId != null) + { + EnsureComp(ent.Owner); + _autoEmote.AddEmote(ent.Owner, ent.Comp.AutoEmoteId); + } + + EnsureComp(ent.Owner); - _outfitSystem.SetOutfit(uid, "CluwneGear"); + var transformMessage = Loc.GetString(ent.Comp.TransformMessage, ("target", ent.Owner)); + + _popupSystem.PopupEntity(transformMessage, ent.Owner, PopupType.LargeCaution); + _audio.PlayPvs(ent.Comp.SpawnSound, ent.Owner); + + _nameMod.RefreshNameModifiers(ent.Owner); + + + _outfitSystem.SetOutfit(ent.Owner, ent.Comp.OutfitId, unremovable: true); } /// /// Handles the timing on autoemote as well as falling over and honking. /// - private void OnEmote(EntityUid uid, CluwneComponent component, ref EmoteEvent args) + private void OnEmote(Entity ent, ref EmoteEvent args) { if (args.Handled) return; - args.Handled = _chat.TryPlayEmoteSound(uid, EmoteSounds, args.Emote); - if (_robustRandom.Prob(component.GiggleRandomChance)) + if (!ent.Comp.RandomEmote) + return; + + args.Handled = _chat.TryPlayEmoteSound(ent.Owner, EmoteSounds, args.Emote); + + if (_robustRandom.Prob(ent.Comp.GiggleRandomChance)) { - _audio.PlayPvs(component.SpawnSound, uid); - _chat.TrySendInGameICMessage(uid, "honks", InGameICChatType.Emote, ChatTransmitRange.Normal); + _audio.PlayPvs(ent.Comp.SpawnSound, ent.Owner); + _chat.TrySendInGameICMessage(ent.Owner, Loc.GetString(ent.Comp.GiggleEmote), InGameICChatType.Emote, ChatTransmitRange.Normal); } - else if (_robustRandom.Prob(component.KnockChance)) + else if (_robustRandom.Prob(ent.Comp.KnockChance)) { - _audio.PlayPvs(component.KnockSound, uid); - _stunSystem.TryUpdateParalyzeDuration(uid, TimeSpan.FromSeconds(component.ParalyzeTime)); - _chat.TrySendInGameICMessage(uid, "spasms", InGameICChatType.Emote, ChatTransmitRange.Normal); + _audio.PlayPvs(ent.Comp.KnockSound, ent.Owner); + _stunSystem.TryUpdateParalyzeDuration(ent.Owner, TimeSpan.FromSeconds(ent.Comp.ParalyzeTime)); + _chat.TrySendInGameICMessage(ent.Owner, Loc.GetString(ent.Comp.KnockEmote), InGameICChatType.Emote, ChatTransmitRange.Normal); } } /// /// Applies "Cluwnified" prefix /// - private void OnRefreshNameModifiers(Entity entity, ref RefreshNameModifiersEvent args) + private void OnRefreshNameModifiers(Entity ent, ref RefreshNameModifiersEvent args) { - args.AddModifier("cluwne-name-prefix"); + args.AddModifier(ent.Comp.NamePrefix); } } diff --git a/Content.Shared/Cluwne/CluwneComponent.cs b/Content.Shared/Cluwne/CluwneComponent.cs index c9f96d030b..692a8ec4f9 100644 --- a/Content.Shared/Cluwne/CluwneComponent.cs +++ b/Content.Shared/Cluwne/CluwneComponent.cs @@ -1,6 +1,9 @@ using Robust.Shared.Audio; using Content.Shared.Chat.Prototypes; +using Content.Shared.Damage; +using Content.Shared.Roles; using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; namespace Content.Shared.Cluwne; @@ -12,22 +15,74 @@ public sealed partial class CluwneComponent : Component /// /// timings for giggles and knocks. /// - [ViewVariables(VVAccess.ReadWrite)] + [DataField] public TimeSpan DamageGiggleCooldown = TimeSpan.FromSeconds(2); - [ViewVariables(VVAccess.ReadWrite)] + /// + /// Amount of genetic damage dealt when they revert + /// + [DataField] + public DamageSpecifier RevertDamage = new() + { + DamageDict = new() + { + { "Genetic", 300.0 }, + }, + }; + + /// + /// Chance that the Cluwne will be knocked over and paralyzed. + /// + [DataField] public float KnockChance = 0.05f; - [ViewVariables(VVAccess.ReadWrite)] + /// + /// Chance that the Cluwne will randomly giggle + /// + [DataField] public float GiggleRandomChance = 0.1f; - [DataField("emoteId", customTypeSerializer: typeof(PrototypeIdSerializer))] - public string? EmoteSoundsId = "Cluwne"; + /// + /// Enable random emoting? + /// + [DataField] + public bool RandomEmote = true; + + /// + /// Emote sound collection that the Cluwne should use. + /// + [DataField("emoteId")] + public ProtoId? EmoteSoundsId = "Cluwne"; + + /// + /// Emote to use for the Cluwne Giggling + /// + [DataField] + public ProtoId? AutoEmoteId = "CluwneGiggle"; + + /// + /// Message to popup when the Cluwne is transformed + /// + [DataField] + public LocId TransformMessage = "cluwne-transform"; + + /// + /// Name prefix for the Cluwne. + /// Example "Urist McHuman" will be "Cluwned Urist McHuman" + /// + [DataField] + public LocId NamePrefix = "cluwne-name-prefix"; + + /// + /// Outfit ID that the cluwne will spawn with. + /// + [DataField] + public ProtoId OutfitId = "CluwneGear"; /// /// Amount of time cluwne is paralyzed for when falling over. /// - [ViewVariables(VVAccess.ReadWrite)] + [DataField] public float ParalyzeTime = 2f; /// @@ -36,6 +91,21 @@ public sealed partial class CluwneComponent : Component [DataField("spawnsound")] public SoundSpecifier SpawnSound = new SoundPathSpecifier("/Audio/Items/bikehorn.ogg"); - [DataField("knocksound")] + /// + /// Emote to use for the cluwne giggling + /// + [DataField] + public LocId GiggleEmote = "cluwne-giggle-emote"; + + /// + /// Sound to play when the Cluwne is knocked over and paralyzed + /// + [DataField] public SoundSpecifier KnockSound = new SoundPathSpecifier("/Audio/Items/airhorn.ogg"); + + /// + /// Emote thats used when the cluwne getting knocked over + /// + [DataField] + public LocId KnockEmote = "cluwne-knock-emote"; } diff --git a/Resources/Locale/en-US/cluwne/cluwne.ftl b/Resources/Locale/en-US/cluwne/cluwne.ftl index 0ffd3f32df..e469cbfbac 100644 --- a/Resources/Locale/en-US/cluwne/cluwne.ftl +++ b/Resources/Locale/en-US/cluwne/cluwne.ftl @@ -1,2 +1,4 @@ cluwne-transform = {CAPITALIZE(THE($target))} turned into a cluwne! cluwne-name-prefix = cluwnified {$baseName} +cluwne-knock-emote = spasms +cluwne-giggle-emote = honks From a058921b4db31fe7de6140e095362edbd7ed7312 Mon Sep 17 00:00:00 2001 From: opl- Date: Fri, 10 Oct 2025 22:21:51 +0200 Subject: [PATCH 09/37] Packed: Fix brig Megaseed vending machine is locked (#40821) Co-authored-by: opl <4833621+opl@users.noreply.github.com> --- Resources/Maps/packed.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Resources/Maps/packed.yml b/Resources/Maps/packed.yml index 3f16dee262..9ad708002b 100644 --- a/Resources/Maps/packed.yml +++ b/Resources/Maps/packed.yml @@ -88827,6 +88827,8 @@ entities: - type: Transform pos: 43.5,-4.5 parent: 2 +- proto: VendingMachineSeedsUnlocked + entities: - uid: 7681 components: - type: Transform From a9dcfcb9fb5d5b1667c5f10a03b53cd0e13f9d3e Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 10 Oct 2025 20:34:15 +0000 Subject: [PATCH 10/37] Automatic changelog update --- Resources/Changelog/Maps.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Resources/Changelog/Maps.yml b/Resources/Changelog/Maps.yml index 3eb8884988..0c8783e4a5 100644 --- a/Resources/Changelog/Maps.yml +++ b/Resources/Changelog/Maps.yml @@ -771,4 +771,11 @@ id: 93 time: '2025-10-10T01:11:33.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/40794 +- author: opl + changes: + - message: On Packed, prisoners can now use the Megaseed in brig. + type: Fix + id: 94 + time: '2025-10-10T20:33:03.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/40821 Order: 1 From 74ebe585fa4ab51bca3ea5fb28495e1055030fd9 Mon Sep 17 00:00:00 2001 From: opl- Date: Fri, 10 Oct 2025 22:25:15 +0200 Subject: [PATCH 11/37] Packed: Add missing station beacons (#40817) On Packed: Add missing station beacons Co-authored-by: opl <4833621+opl@users.noreply.github.com> --- Resources/Maps/packed.yml | 98 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) diff --git a/Resources/Maps/packed.yml b/Resources/Maps/packed.yml index 9ad708002b..d15f3f7aab 100644 --- a/Resources/Maps/packed.yml +++ b/Resources/Maps/packed.yml @@ -42804,7 +42804,21 @@ entities: rot: 3.141592653589793 rad pos: 11.493689,4.5440345 parent: 2 +- proto: DefaultStationBeaconAI + entities: + - uid: 15919 + components: + - type: Transform + pos: 73.5,23.5 + parent: 2 - proto: DefaultStationBeaconAICore + entities: + - uid: 15916 + components: + - type: Transform + pos: 95.5,30.5 + parent: 2 +- proto: DefaultStationBeaconAIUpload entities: - uid: 14515 components: @@ -42818,6 +42832,13 @@ entities: - type: Transform pos: 31.5,-40.5 parent: 2 +- proto: DefaultStationBeaconAnchor + entities: + - uid: 15922 + components: + - type: Transform + pos: 6.5,-21.5 + parent: 2 - proto: DefaultStationBeaconAnomalyGenerator entities: - uid: 8139 @@ -42825,6 +42846,13 @@ entities: - type: Transform pos: 68.5,15.5 parent: 2 +- proto: DefaultStationBeaconArmory + entities: + - uid: 15787 + components: + - type: Transform + pos: 41.5,34.5 + parent: 2 - proto: DefaultStationBeaconArrivals entities: - uid: 14028 @@ -42951,6 +42979,20 @@ entities: - type: Transform pos: 0.5,-30.5 parent: 2 +- proto: DefaultStationBeaconDorms + entities: + - uid: 15912 + components: + - type: Transform + pos: 15.5,14.5 + parent: 2 +- proto: DefaultStationBeaconEngineering + entities: + - uid: 15913 + components: + - type: Transform + pos: 18.5,-25.5 + parent: 2 - proto: DefaultStationBeaconEscapePodE entities: - uid: 2949 @@ -42986,6 +43028,13 @@ entities: - type: Transform pos: 9.5,-6.5 parent: 2 +- proto: DefaultStationBeaconGravGen + entities: + - uid: 15910 + components: + - type: Transform + pos: 14.5,38.5 + parent: 2 - proto: DefaultStationBeaconHOPOffice entities: - uid: 13131 @@ -42993,6 +43042,13 @@ entities: - type: Transform pos: 17.5,-4.5 parent: 2 +- proto: DefaultStationBeaconHOSRoom + entities: + - uid: 15907 + components: + - type: Transform + pos: 48.5,39.5 + parent: 2 - proto: DefaultStationBeaconJanitorsCloset entities: - uid: 13133 @@ -43021,6 +43077,13 @@ entities: - type: Transform pos: 10.5,5.5 parent: 2 +- proto: DefaultStationBeaconMedical + entities: + - uid: 15914 + components: + - type: Transform + pos: 51.5,3.5 + parent: 2 - proto: DefaultStationBeaconMorgue entities: - uid: 13137 @@ -43028,6 +43091,13 @@ entities: - type: Transform pos: 70.5,-3.5 parent: 2 +- proto: DefaultStationBeaconPermaBrig + entities: + - uid: 15911 + components: + - type: Transform + pos: 34.5,20.5 + parent: 2 - proto: DefaultStationBeaconPowerBank entities: - uid: 13139 @@ -43070,6 +43140,20 @@ entities: - type: Transform pos: 7.5,33.5 parent: 2 +- proto: DefaultStationBeaconSecurity + entities: + - uid: 15908 + components: + - type: Transform + pos: 33.5,29.5 + parent: 2 +- proto: DefaultStationBeaconSecurityCheckpoint + entities: + - uid: 15915 + components: + - type: Transform + pos: -1.5,-3.5 + parent: 2 - proto: DefaultStationBeaconServerRoom entities: - uid: 13172 @@ -43098,6 +43182,13 @@ entities: - type: Transform pos: 3.5,-35.5 parent: 2 +- proto: DefaultStationBeaconSurgery + entities: + - uid: 15920 + components: + - type: Transform + pos: 65.5,-5.5 + parent: 2 - proto: DefaultStationBeaconTechVault entities: - uid: 13175 @@ -43133,6 +43224,13 @@ entities: - type: Transform pos: 18.5,41.5 parent: 2 +- proto: DefaultStationBeaconWardensOffice + entities: + - uid: 15909 + components: + - type: Transform + pos: 42.5,25.5 + parent: 2 - proto: Defibrillator entities: - uid: 11416 From a384640eea9ecc160f8700b896b03739c9070712 Mon Sep 17 00:00:00 2001 From: Connor Huffine Date: Fri, 10 Oct 2025 16:49:21 -0400 Subject: [PATCH 12/37] Ninja Bomb Blacklisting: Map Updates (#40727) Update Maps --- Resources/Maps/exo.yml | 13 ----- Resources/Maps/saltern.yml | 107 ------------------------------------- 2 files changed, 120 deletions(-) diff --git a/Resources/Maps/exo.yml b/Resources/Maps/exo.yml index 58d864740a..b357069817 100644 --- a/Resources/Maps/exo.yml +++ b/Resources/Maps/exo.yml @@ -47101,7 +47101,6 @@ entities: - type: Transform pos: -20.5,-25.5 parent: 2 - - type: BombingTarget - proto: DefaultStationBeaconAtmospherics entities: - uid: 16227 @@ -47130,7 +47129,6 @@ entities: - type: Transform pos: -48.5,-45.5 parent: 2 - - type: BombingTarget - proto: DefaultStationBeaconBrigMed entities: - uid: 18105 @@ -47145,7 +47143,6 @@ entities: - type: Transform pos: -42.5,-54.5 parent: 2 - - type: BombingTarget - proto: DefaultStationBeaconCargoBay entities: - uid: 16244 @@ -47153,7 +47150,6 @@ entities: - type: Transform pos: 24.5,-97.5 parent: 2 - - type: BombingTarget - proto: DefaultStationBeaconCargoReception entities: - uid: 16243 @@ -47182,7 +47178,6 @@ entities: - type: Transform pos: 19.5,-72.5 parent: 2 - - type: BombingTarget - proto: DefaultStationBeaconCMORoom entities: - uid: 16267 @@ -47190,7 +47185,6 @@ entities: - type: Transform pos: 11.5,-16.5 parent: 2 - - type: BombingTarget - proto: DefaultStationBeaconCryosleep entities: - uid: 16223 @@ -47277,7 +47271,6 @@ entities: - type: Transform pos: 14.5,-59.5 parent: 2 - - type: BombingTarget - proto: DefaultStationBeaconHOSRoom entities: - uid: 18071 @@ -47292,7 +47285,6 @@ entities: - type: Transform pos: -8.5,-51.5 parent: 2 - - type: BombingTarget - proto: DefaultStationBeaconKitchen entities: - uid: 16228 @@ -47321,7 +47313,6 @@ entities: - type: Transform pos: 14.5,-29.5 parent: 2 - - type: BombingTarget - proto: DefaultStationBeaconMorgue entities: - uid: 8744 @@ -47336,7 +47327,6 @@ entities: - type: Transform pos: 46.5,-17.5 parent: 2 - - type: BombingTarget - type: NavMapBeacon defaultText: Genpop - proto: DefaultStationBeaconPowerBank @@ -47353,7 +47343,6 @@ entities: - type: Transform pos: 9.5,-88.5 parent: 2 - - type: BombingTarget - proto: DefaultStationBeaconRDRoom entities: - uid: 5092 @@ -47382,7 +47371,6 @@ entities: - type: Transform pos: -6.5,-21.5 parent: 2 - - type: BombingTarget - proto: DefaultStationBeaconSecurity entities: - uid: 18001 @@ -47411,7 +47399,6 @@ entities: - type: Transform pos: -23.5,-71.5 parent: 2 - - type: BombingTarget - proto: DefaultStationBeaconSolarsE entities: - uid: 8642 diff --git a/Resources/Maps/saltern.yml b/Resources/Maps/saltern.yml index 58400ac0fe..1e33a9d347 100644 --- a/Resources/Maps/saltern.yml +++ b/Resources/Maps/saltern.yml @@ -69413,113 +69413,6 @@ entities: parent: 31 - type: WarpPoint location: library -- proto: WarpPointBombing - entities: - - uid: 934 - components: - - type: Transform - pos: -36.5,14.5 - parent: 31 - - type: WarpPoint - location: chapel - - uid: 2142 - components: - - type: Transform - pos: 8.5,19.5 - parent: 31 - - type: WarpPoint - location: hop's office - - uid: 4910 - components: - - type: Transform - pos: 9.5,-9.5 - parent: 31 - - type: WarpPoint - location: medbay - - uid: 7261 - components: - - type: Transform - pos: 16.5,-0.5 - parent: 31 - - type: WarpPoint - location: chemistry - - uid: 7262 - components: - - type: Transform - pos: 13.5,-15.5 - parent: 31 - - type: WarpPoint - location: morgue - - uid: 9712 - components: - - type: Transform - pos: -12.5,19.5 - parent: 31 - - type: WarpPoint - location: armory - - uid: 10539 - components: - - type: Transform - pos: -9.5,-20.5 - parent: 31 - - type: WarpPoint - location: science - - uid: 11267 - components: - - type: Transform - pos: 8.5,25.5 - parent: 31 - - type: WarpPoint - location: captain's quarters - - uid: 11308 - components: - - type: Transform - pos: 3.5,30.5 - parent: 31 - - type: WarpPoint - location: bridge - - uid: 11309 - components: - - type: Transform - pos: -1.5,17.5 - parent: 31 - - type: WarpPoint - location: vault - - uid: 11310 - components: - - type: Transform - pos: 8.5,9.5 - parent: 31 - - type: WarpPoint - location: eva room - - uid: 11311 - components: - - type: Transform - pos: 58.5,2.5 - parent: 31 - - type: WarpPoint - location: particle accelerator - - uid: 11313 - components: - - type: Transform - pos: 34.5,14.5 - parent: 31 - - type: WarpPoint - location: atmospherics - - uid: 11322 - components: - - type: Transform - pos: 27.5,18.5 - parent: 31 - - type: WarpPoint - location: salvage - - uid: 11359 - components: - - type: Transform - pos: 50.5,-5.5 - parent: 31 - - type: WarpPoint - location: telecomms - proto: WaterCooler entities: - uid: 1156 From 52139b5cc5504e2e96f239993f2dd425094ded21 Mon Sep 17 00:00:00 2001 From: MilenVolf <63782763+MilenVolf@users.noreply.github.com> Date: Sat, 11 Oct 2025 00:16:48 +0300 Subject: [PATCH 13/37] Fix glassbox prototypes (#40667) * Fix glassbox prototypes and its construction ghost exception * Oops --- .../Entities/Structures/Storage/glass_box.yml | 24 +++++++++---------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/Resources/Prototypes/Entities/Structures/Storage/glass_box.yml b/Resources/Prototypes/Entities/Structures/Storage/glass_box.yml index 0cc93a4fcf..f1ce706847 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/glass_box.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/glass_box.yml @@ -1,8 +1,11 @@ - type: entity - parent: [BaseStructureDynamic, BaseItemCabinetGlass] + parent: BaseStructureDynamic id: BaseGlassBox abstract: true components: + - type: Sprite + noRot: true + sprite: Structures/Storage/glassbox.rsi - type: Transform anchored: true - type: Physics @@ -24,20 +27,18 @@ delay: 4 - type: entity + parent: [BaseGlassBox, BaseItemCabinetGlass] id: GlassBox name: glass box description: A sturdy showcase for an expensive exhibit. - parent: BaseGlassBox abstract: true # TODO: Temporarily abstract. Remove it after item scaling in cabinets is implemented. components: - type: Sprite - noRot: true - sprite: Structures/Storage/glassbox.rsi layers: - state: base - state: caplaser # TODO: Remove it after item scaling in cabinets is implemented. map: ["enum.ItemCabinetVisuals.Layer"] - visible: true + visible: false - state: glass map: ["enum.OpenableVisuals.Layer"] - state: locked @@ -116,8 +117,8 @@ acts: [ "Destruction" ] - type: entity - id: GlassBoxLaser parent: GlassBox + id: GlassBoxLaser suffix: AntiqueLaser components: - type: AccessReader @@ -135,8 +136,8 @@ ejectSound: /Audio/Machines/machine_switch.ogg - type: entity - id: GlassBoxLaserOpen parent: GlassBoxLaser + id: GlassBoxLaserOpen suffix: AntiqueLaser, Open components: - type: Openable @@ -145,8 +146,8 @@ locked: false - type: entity - id: GlassBoxLaserFilled parent: GlassBoxLaser + id: GlassBoxLaserFilled suffix: AntiqueLaser, Filled components: - type: ContainerFill @@ -160,15 +161,13 @@ suffix: AntiqueLaser, Filled, Open - type: entity + parent: BaseGlassBox id: GlassBoxFrame name: glass box frame description: A glassless sturdy showcase for an expensive exhibit. - parent: BaseGlassBox suffix: Frame components: - type: Sprite - noRot: true - sprite: Structures/Storage/glassbox.rsi layers: - state: base - type: Construction @@ -204,14 +203,13 @@ acts: ["Destruction"] - type: entity + parent: GlassBoxFrame id: GlassBoxBroken name: broken glass box description: A broken showcase for a stolen expensive exhibit. - parent: GlassBoxFrame suffix: Broken components: - type: Sprite - sprite: Structures/Storage/glassbox.rsi layers: - state: base - state: glass-broken From ecc0aaaa9fe22d8e1cf9d38748c8f8373540f1bc Mon Sep 17 00:00:00 2001 From: Connor Huffine Date: Fri, 10 Oct 2025 17:16:50 -0400 Subject: [PATCH 14/37] Ninja Bomb Blacklisting (#40726) * Ninja Bombing moved to blacklist * Added blocker to "Solars" Solars is too generic for a named bombing target. * Change to AllEntityQuery More clear intent * Update migration.yml Add migration to 'null' for removed WarpPointBombing entity * Update NinjaConditionsSystem.cs Undo some tidying * Changed to tag Ninja blocking component is now a tag instead of a new component * Update NinjaConditionsSystem.cs detidying * Update NinjaConditionsSystem.cs Change to efficient enumerator * Move blacklist to component Moved blacklist to spidercharge component * Update migration.yml fixed component reference * Update migration.yml Fixes Saltern. Exo is more complicated. --------- Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com> --- .../SpiderChargeConditionComponent.cs | 8 +++++++ .../Systems/NinjaConditionsSystem.cs | 12 +++++++---- .../Components/BombingTargetComponent.cs | 7 ------- .../Entities/Markers/warp_point.yml | 21 ------------------- .../Objects/Devices/station_beacon.yml | 9 ++++++++ Resources/Prototypes/Objectives/ninja.yml | 4 ++++ Resources/Prototypes/tags.yml | 2 ++ Resources/migration.yml | 4 +++- 8 files changed, 34 insertions(+), 33 deletions(-) delete mode 100644 Content.Shared/Ninja/Components/BombingTargetComponent.cs diff --git a/Content.Server/Objectives/Components/SpiderChargeConditionComponent.cs b/Content.Server/Objectives/Components/SpiderChargeConditionComponent.cs index 9983b35969..d6309ccdd3 100644 --- a/Content.Server/Objectives/Components/SpiderChargeConditionComponent.cs +++ b/Content.Server/Objectives/Components/SpiderChargeConditionComponent.cs @@ -1,5 +1,6 @@ using Content.Server.Ninja.Systems; using Content.Server.Objectives.Systems; +using Content.Shared.Whitelist; namespace Content.Server.Objectives.Components; @@ -14,4 +15,11 @@ public sealed partial class SpiderChargeConditionComponent : Component /// [DataField, ViewVariables(VVAccess.ReadWrite)] public EntityUid? Target; + + /// + /// Tags that should be used to exclude Warp Points + /// from the list of valid bombing targets + /// + [DataField] + public EntityWhitelist? Blacklist; } diff --git a/Content.Server/Objectives/Systems/NinjaConditionsSystem.cs b/Content.Server/Objectives/Systems/NinjaConditionsSystem.cs index db78816503..4c19a64ab1 100644 --- a/Content.Server/Objectives/Systems/NinjaConditionsSystem.cs +++ b/Content.Server/Objectives/Systems/NinjaConditionsSystem.cs @@ -1,9 +1,9 @@ using Content.Server.Objectives.Components; using Content.Shared.Objectives.Components; -using Content.Shared.Ninja.Components; using Content.Shared.Roles; using Content.Shared.Roles.Components; using Content.Shared.Warps; +using Content.Shared.Whitelist; using Robust.Shared.Random; namespace Content.Server.Objectives.Systems; @@ -14,6 +14,7 @@ namespace Content.Server.Objectives.Systems; /// public sealed class NinjaConditionsSystem : EntitySystem { + [Dependency] private readonly EntityWhitelistSystem _whitelist = default!; [Dependency] private readonly MetaDataSystem _metaData = default!; [Dependency] private readonly NumberObjectiveSystem _number = default!; [Dependency] private readonly IRobustRandom _random = default!; @@ -53,10 +54,13 @@ public sealed class NinjaConditionsSystem : EntitySystem // choose spider charge detonation point var warps = new List(); - var query = EntityQueryEnumerator(); - while (query.MoveNext(out var warpUid, out _, out var warp)) + var allEnts = EntityQueryEnumerator(); + var bombingBlacklist = comp.Blacklist; + + while (allEnts.MoveNext(out var warpUid, out var warp)) { - if (warp.Location != null) + if (_whitelist.IsBlacklistFail(bombingBlacklist, warpUid) + && !string.IsNullOrWhiteSpace(warp.Location)) { warps.Add(warpUid); } diff --git a/Content.Shared/Ninja/Components/BombingTargetComponent.cs b/Content.Shared/Ninja/Components/BombingTargetComponent.cs deleted file mode 100644 index c429eb6880..0000000000 --- a/Content.Shared/Ninja/Components/BombingTargetComponent.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Content.Shared.Ninja.Components; - -/// -/// Makes this warp point a valid bombing target for ninja's spider charge. -/// -[RegisterComponent] -public sealed partial class BombingTargetComponent : Component; diff --git a/Resources/Prototypes/Entities/Markers/warp_point.yml b/Resources/Prototypes/Entities/Markers/warp_point.yml index 675938c09b..4616d1535a 100644 --- a/Resources/Prototypes/Entities/Markers/warp_point.yml +++ b/Resources/Prototypes/Entities/Markers/warp_point.yml @@ -31,24 +31,3 @@ - GhostOnlyWarp - type: Sprite state: pink - -- type: entity - parent: WarpPoint - id: WarpPointBombing - name: warp point - suffix: ninja bombing target - components: - - type: BombingTarget - - type: Tag - tags: - - GhostOnlyWarp - - type: WarpPoint - location: bombing target - blacklist: - tags: - - GhostOnlyWarp - - type: Sprite - layers: - - state: pink - - sprite: Objects/Weapons/Bombs/spidercharge.rsi - state: icon diff --git a/Resources/Prototypes/Entities/Objects/Devices/station_beacon.yml b/Resources/Prototypes/Entities/Objects/Devices/station_beacon.yml index 870e66654f..ff6d5a6a4a 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/station_beacon.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/station_beacon.yml @@ -455,6 +455,9 @@ components: - type: NavMapBeacon defaultText: station-beacon-solars + - type: Tag + tags: + - NinjaBombingTargetBlocker - type: entity parent: DefaultStationBeaconEngineering @@ -673,6 +676,9 @@ components: - type: NavMapBeacon defaultText: station-beacon-arrivals + - type: Tag + tags: + - NinjaBombingTargetBlocker - type: entity parent: DefaultStationBeacon @@ -761,6 +767,9 @@ components: - type: NavMapBeacon defaultText: station-beacon-cryosleep + - type: Tag + tags: + - NinjaBombingTargetBlocker - type: entity parent: DefaultStationBeacon diff --git a/Resources/Prototypes/Objectives/ninja.yml b/Resources/Prototypes/Objectives/ninja.yml index 76d74876b0..f015dd8f72 100644 --- a/Resources/Prototypes/Objectives/ninja.yml +++ b/Resources/Prototypes/Objectives/ninja.yml @@ -51,6 +51,10 @@ sprite: Objects/Weapons/Bombs/spidercharge.rsi state: icon - type: SpiderChargeCondition + blacklist: + tags: + - GhostOnlyWarp + - NinjaBombingTargetBlocker - type: entity parent: [BaseNinjaObjective, BaseSurviveObjective] diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml index 4f6c018f23..08539f50cf 100644 --- a/Resources/Prototypes/tags.yml +++ b/Resources/Prototypes/tags.yml @@ -1024,6 +1024,8 @@ id: Mushroom ## N ## +- type: Tag + id: NinjaBombingTargetBlocker # Ninjas will not target this warp point - type: Tag id: NoBlockAnchoring diff --git a/Resources/migration.yml b/Resources/migration.yml index d05795def4..bbf331d5b6 100644 --- a/Resources/migration.yml +++ b/Resources/migration.yml @@ -726,5 +726,7 @@ PrefilledSyringe: Syringe BibleTanakh: null BibleSatanic: null -# 2025-10-8 + +# 2025-10-08 ClothingBeltAssault: ClothingBeltMilitaryWebbing +WarpPointBombing: null From e35624d1f1a60849776fb2b8be126dbabcc74ecc Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 10 Oct 2025 21:28:45 +0000 Subject: [PATCH 15/37] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index bc5e811a0c..1eedc0f152 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: K-Dynamic - changes: - - message: Shutters and blast doors now appear welded when welded. - type: Fix - id: 8562 - time: '2025-05-25T15:57:18.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/37807 - author: Stop-Signs changes: - message: Meals now better reflect the amount of ingredients put into them. @@ -3948,3 +3941,10 @@ id: 9064 time: '2025-10-10T12:41:57.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/40343 +- author: kontakt + changes: + - message: Ninjas can now have a bombing target at any warp point. + type: Tweak + id: 9065 + time: '2025-10-10T21:27:36.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/40726 From 9ae4068432a432e34a23edc58a68a3dceaee30e2 Mon Sep 17 00:00:00 2001 From: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Date: Fri, 10 Oct 2025 23:43:18 +0200 Subject: [PATCH 16/37] add event to dna scrambling (#39862) add event --- .../Trigger/Systems/DnaScrambleOnTriggerSystem.cs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Content.Shared/Trigger/Systems/DnaScrambleOnTriggerSystem.cs b/Content.Shared/Trigger/Systems/DnaScrambleOnTriggerSystem.cs index db27bd7f74..af5a73ffb6 100644 --- a/Content.Shared/Trigger/Systems/DnaScrambleOnTriggerSystem.cs +++ b/Content.Shared/Trigger/Systems/DnaScrambleOnTriggerSystem.cs @@ -58,5 +58,17 @@ public sealed class DnaScrambleOnTriggerSystem : EntitySystem // Can't use PopupClient or PopupPredicted because the trigger might be unpredicted. _popup.PopupEntity(Loc.GetString("scramble-on-trigger-popup"), target.Value, target.Value); + + var ev = new DnaScrambledEvent(target.Value); + RaiseLocalEvent(target.Value, ref ev, true); } } + +/// +/// Raised after an entity has been DNA Scrambled. +/// Useful for forks that need to run their own updates here. +/// +/// The entity that had its DNA scrambled. + +[ByRefEvent] +public record struct DnaScrambledEvent(EntityUid Target); From dca80238f0df3b7fb7e50870e84505ff0e1d8989 Mon Sep 17 00:00:00 2001 From: Pok <113675512+Pok27@users.noreply.github.com> Date: Sat, 11 Oct 2025 00:57:38 +0300 Subject: [PATCH 17/37] Attempt to fix all unlocalized lines (#40284) * missing-localization * cmd * fix: fixed patron page throwing exception due to unexpected patron tier in yaml * Revert "fix: fixed patron page throwing exception due to unexpected patron tier in yaml" This reverts commit 28458c78b1f2eed30fda898ec26059b27f1766f1. * review and update * no cmd * fix * fix 99 --------- Co-authored-by: pa.pecherskij --- .../UI/BanPanel/BanPanel.xaml.cs | 4 +- .../Administration/UI/Logs/AdminLogsEui.cs | 2 +- Content.Client/Credits/CreditsWindow.xaml.cs | 4 +- .../CriminalRecordsConsoleWindow.xaml | 2 +- .../HumanoidMarkingModifierWindow.xaml | 6 +- .../HumanoidMarkingModifierWindow.xaml.cs | 6 +- .../CrewMonitoringNavMapControl.cs | 2 +- .../CrewMonitoring/CrewMonitoringWindow.xaml | 12 +-- .../CrewMonitoringWindow.xaml.cs | 2 +- Content.Client/NPC/NPCWindow.xaml | 18 ++-- .../Pinpointer/UI/StationMapWindow.xaml | 2 +- Content.Client/UserInterface/StatValuesEui.cs | 2 +- .../Systems/Bwoink/AHelpUIController.cs | 2 +- .../Controls/Roles/MakeGhostRoleWindow.xaml | 22 ++--- .../Roles/MakeGhostRoleWindow.xaml.cs | 8 +- .../Systems/Storage/Controls/StorageWindow.cs | 2 +- .../Systems/AdminVerbSystem.Tools.cs | 82 +++++++++---------- .../en-US/administration/admin-verbs.ftl | 45 ++++++++++ .../Locale/en-US/administration/bwoink.ftl | 1 + .../en-US/components/storage-component.ftl | 1 + .../Locale/en-US/credits/credits-window.ftl | 2 + .../Locale/en-US/ghost/make-ghost-gui.ftl | 21 +++++ Resources/Locale/en-US/info/ban.ftl | 1 + .../components/crew-monitoring-component.ftl | 23 ++---- .../en-US/navmap-beacons/station_map.ftl | 1 + Resources/Locale/en-US/npc/npc-debug.ftl | 11 +++ .../en-US/preferences/ui/markings-picker.ftl | 6 ++ Resources/Locale/en-US/ui/navmap.ftl | 1 + Resources/Locale/en-US/ui/stat-values.ftl | 1 + 29 files changed, 188 insertions(+), 104 deletions(-) create mode 100644 Resources/Locale/en-US/ghost/make-ghost-gui.ftl create mode 100644 Resources/Locale/en-US/npc/npc-debug.ftl create mode 100644 Resources/Locale/en-US/ui/stat-values.ftl diff --git a/Content.Client/Administration/UI/BanPanel/BanPanel.xaml.cs b/Content.Client/Administration/UI/BanPanel/BanPanel.xaml.cs index d20c741673..7566942506 100644 --- a/Content.Client/Administration/UI/BanPanel/BanPanel.xaml.cs +++ b/Content.Client/Administration/UI/BanPanel/BanPanel.xaml.cs @@ -226,7 +226,7 @@ public sealed partial class BanPanel : DefaultWindow var roleGroupCheckbox = new Button { Name = $"{groupName}GroupCheckbox", - Text = "Ban all", + Text = Loc.GetString("role-bans-ban-group"), Margin = new Thickness(0, 0, 5, 0), ToggleMode = true, }; @@ -391,7 +391,7 @@ public sealed partial class BanPanel : DefaultWindow TimeLine.Text = args.Text; if (!double.TryParse(args.Text, out var result)) { - ExpiresLabel.Text = "err"; + ExpiresLabel.Text = Loc.GetString("ban-panel-expiry-error"); ErrorLevel |= ErrorLevelEnum.Minutes; TimeLine.ModulateSelfOverride = Color.Red; UpdateSubmitEnabled(); diff --git a/Content.Client/Administration/UI/Logs/AdminLogsEui.cs b/Content.Client/Administration/UI/Logs/AdminLogsEui.cs index 1544b827ae..28aca23f75 100644 --- a/Content.Client/Administration/UI/Logs/AdminLogsEui.cs +++ b/Content.Client/Administration/UI/Logs/AdminLogsEui.cs @@ -166,7 +166,7 @@ public sealed class AdminLogsEui : BaseEui ClydeWindow = _clyde.CreateWindow(new WindowCreateParameters { Maximized = false, - Title = "Admin Logs", + Title = Loc.GetString("admin-logs-title"), Monitor = monitor, Width = 1100, Height = 400 diff --git a/Content.Client/Credits/CreditsWindow.xaml.cs b/Content.Client/Credits/CreditsWindow.xaml.cs index 050d801170..6035bcc2bd 100644 --- a/Content.Client/Credits/CreditsWindow.xaml.cs +++ b/Content.Client/Credits/CreditsWindow.xaml.cs @@ -100,11 +100,11 @@ public sealed partial class CreditsWindow : DefaultWindow var container = new BoxContainer { Orientation = LayoutOrientation.Horizontal }; - var previousPageButton = new Button { Text = "Previous Page" }; + var previousPageButton = new Button { Text = Loc.GetString("credits-window-previous-page-button") }; previousPageButton.OnPressed += _ => PopulateAttributions(attributionsContainer, count - AttributionsSourcesPerPage); - var nextPageButton = new Button { Text = "Next Page" }; + var nextPageButton = new Button { Text = Loc.GetString("credits-window-next-page-button") }; nextPageButton.OnPressed += _ => PopulateAttributions(attributionsContainer, count + AttributionsSourcesPerPage); diff --git a/Content.Client/CriminalRecords/CriminalRecordsConsoleWindow.xaml b/Content.Client/CriminalRecords/CriminalRecordsConsoleWindow.xaml index 179304a978..f88fa07f5a 100644 --- a/Content.Client/CriminalRecords/CriminalRecordsConsoleWindow.xaml +++ b/Content.Client/CriminalRecords/CriminalRecordsConsoleWindow.xaml @@ -58,7 +58,7 @@ StyleClasses="LabelBig" /> -