From ca2efb626e91c29adaea7272839681b536f43cfe Mon Sep 17 00:00:00 2001 From: Princess Cheeseballs <66055347+Princess-Cheeseballs@users.noreply.github.com> Date: Sat, 18 Jul 2026 03:30:21 -0700 Subject: [PATCH] Icon Smooth Cleanup (#44748) * Iconsmooth cleanup * better comment --- .../IconSmoothing/IconSmoothComponent.cs | 151 +++++++++--------- .../IconSmoothing/IconSmoothSystem.cs | 9 +- 2 files changed, 83 insertions(+), 77 deletions(-) diff --git a/Content.Client/IconSmoothing/IconSmoothComponent.cs b/Content.Client/IconSmoothing/IconSmoothComponent.cs index 7898e9dc1e..8881ef4733 100644 --- a/Content.Client/IconSmoothing/IconSmoothComponent.cs +++ b/Content.Client/IconSmoothing/IconSmoothComponent.cs @@ -1,84 +1,91 @@ using JetBrains.Annotations; using Robust.Client.Graphics; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; +using Robust.Shared.Prototypes; -namespace Content.Client.IconSmoothing +namespace Content.Client.IconSmoothing; + +/// +/// Makes sprites of other grid-aligned entities like us connect. +/// +/// +/// The system is based on Baystation12's smoothwalling, and thus will work with those. +/// To use, set base equal to the prefix of the corner states in the sprite base RSI. +/// Any objects with the same key will connect. +/// +[RegisterComponent] +public sealed partial class IconSmoothComponent : Component +{ + [DataField] + public bool Enabled = true; + + public (EntityUid?, Vector2i)? LastPosition; + + /// + /// Objects with this key can smooth with us, and vice versa. + /// TODO: YAML HELL, Make smoothing one way. + /// + [DataField("key", required: true)] + public string SmoothKey { get; private set; } + + /// + /// We will attempt to smooth with any objects that contain these keys. + /// Only works one way, objects with these keys will not smooth with us + /// + [DataField] + public List AdditionalKeys = new(); + + /// + /// Index override for our iconsmooth layers. If null, layers will appear on top. + /// + [DataField] + public int? Index; + + /// + /// Prepended to the RSI state. + /// + [DataField("base")] + public string StateBase { get; set; } = string.Empty; + + [DataField] + public ProtoId? Shader; + + /// + /// Mode that controls how the icon should be selected. + /// + [DataField] + public IconSmoothingMode Mode = IconSmoothingMode.Corners; + + /// + /// Used by to reduce redundant updates. + /// + internal int UpdateGeneration { get; set; } +} + +/// +/// Controls the mode with which icon smoothing is calculated. +/// +[PublicAPI] +public enum IconSmoothingMode : byte { /// - /// Makes sprites of other grid-aligned entities like us connect. + /// Each icon is made up of 4 corners, each of which can get a different state depending on + /// adjacent entities clockwise, counter-clockwise and diagonal with the corner. /// - /// - /// The system is based on Baystation12's smoothwalling, and thus will work with those. - /// To use, set base equal to the prefix of the corner states in the sprite base RSI. - /// Any objects with the same key will connect. - /// - [RegisterComponent] - public sealed partial class IconSmoothComponent : Component - { - [ViewVariables(VVAccess.ReadWrite), DataField("enabled")] - public bool Enabled = true; - - public (EntityUid?, Vector2i)? LastPosition; - - /// - /// We will smooth with other objects with the same key. - /// - [ViewVariables(VVAccess.ReadWrite), DataField("key")] - public string? SmoothKey { get; private set; } - - /// - /// Additional keys to smooth with. - /// - [DataField] - public List AdditionalKeys = new(); - - /// - /// Prepended to the RSI state. - /// - [ViewVariables(VVAccess.ReadWrite), DataField("base")] - public string StateBase { get; set; } = string.Empty; - - [DataField("shader", customTypeSerializer:typeof(PrototypeIdSerializer))] - public string? Shader; - - /// - /// Mode that controls how the icon should be selected. - /// - [ViewVariables(VVAccess.ReadWrite), DataField("mode")] - public IconSmoothingMode Mode = IconSmoothingMode.Corners; - - /// - /// Used by to reduce redundant updates. - /// - internal int UpdateGeneration { get; set; } - } + Corners, /// - /// Controls the mode with which icon smoothing is calculated. + /// There are 16 icons, only one of which is used at once. + /// The icon selected is a bit field made up of the cardinal direction flags that have adjacent entities. /// - [PublicAPI] - public enum IconSmoothingMode : byte - { - /// - /// Each icon is made up of 4 corners, each of which can get a different state depending on - /// adjacent entities clockwise, counter-clockwise and diagonal with the corner. - /// - Corners, + CardinalFlags, - /// - /// There are 16 icons, only one of which is used at once. - /// The icon selected is a bit field made up of the cardinal direction flags that have adjacent entities. - /// - CardinalFlags, + /// + /// The icon represents a triangular sprite with only 2 states, representing South / East being occupied or not. + /// + Diagonal, - /// - /// The icon represents a triangular sprite with only 2 states, representing South / East being occupied or not. - /// - Diagonal, - - /// - /// Where this component contributes to our neighbors being calculated but we do not update our own sprite. - /// - NoSprite, - } + /// + /// Where this component contributes to our neighbors being calculated but we do not update our own sprite. + /// + NoSprite, } diff --git a/Content.Client/IconSmoothing/IconSmoothSystem.cs b/Content.Client/IconSmoothing/IconSmoothSystem.cs index 1028554f4d..9367f80838 100644 --- a/Content.Client/IconSmoothing/IconSmoothSystem.cs +++ b/Content.Client/IconSmoothing/IconSmoothSystem.cs @@ -88,13 +88,13 @@ namespace Content.Client.IconSmoothing _sprite.LayerMapRemove(sprite, CornerLayers.SW); var state0 = $"{component.StateBase}0"; - _sprite.LayerMapSet(sprite, CornerLayers.SE, _sprite.AddRsiLayer(sprite, state0)); + _sprite.LayerMapSet(sprite, CornerLayers.SE, _sprite.AddRsiLayer(sprite, state0, index: component.Index)); _sprite.LayerSetDirOffset(sprite, CornerLayers.SE, DirectionOffset.None); - _sprite.LayerMapSet(sprite, CornerLayers.NE, _sprite.AddRsiLayer(sprite, state0)); + _sprite.LayerMapSet(sprite, CornerLayers.NE, _sprite.AddRsiLayer(sprite, state0, index: component.Index)); _sprite.LayerSetDirOffset(sprite, CornerLayers.NE, DirectionOffset.CounterClockwise); - _sprite.LayerMapSet(sprite, CornerLayers.NW, _sprite.AddRsiLayer(sprite, state0)); + _sprite.LayerMapSet(sprite, CornerLayers.NW, _sprite.AddRsiLayer(sprite, state0, index: component.Index)); _sprite.LayerSetDirOffset(sprite, CornerLayers.NW, DirectionOffset.Flip); - _sprite.LayerMapSet(sprite, CornerLayers.SW, _sprite.AddRsiLayer(sprite, state0)); + _sprite.LayerMapSet(sprite, CornerLayers.SW, _sprite.AddRsiLayer(sprite, state0, index: component.Index)); _sprite.LayerSetDirOffset(sprite, CornerLayers.SW, DirectionOffset.Clockwise); } @@ -369,7 +369,6 @@ namespace Content.Client.IconSmoothing while (candidates.MoveNext(out var entity)) { if (_iconSmoothQuery.TryGetComponent(entity, out var other) && - other.SmoothKey != null && (other.SmoothKey == smooth.SmoothKey || smooth.AdditionalKeys.Contains(other.SmoothKey)) && other.Enabled) {