using JetBrains.Annotations; using Robust.Client.Graphics; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; 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 { [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; } } /// /// Controls the mode with which icon smoothing is calculated. /// [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, /// /// 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, /// /// Where this component contributes to our neighbors being calculated but we do not update our own sprite. /// NoSprite, } }