using JetBrains.Annotations;
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 class IconSmoothComponent : Component
{
public (EntityUid?, Vector2i)? LastPosition;
///
/// We will smooth with other objects with the same key.
///
[ViewVariables(VVAccess.ReadWrite), DataField("key")]
public string? SmoothKey { get; }
///
/// Prepended to the RSI state.
///
[ViewVariables(VVAccess.ReadWrite), DataField("base")]
public string StateBase { get; } = string.Empty;
///
/// 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,
}
}