using Robust.Shared.Prototypes; using Robust.Shared.Utility; namespace Content.Shared.Alert; /// /// An alert popup with associated icon, tooltip, and other data. /// [Prototype] public sealed partial class AlertPrototype : IPrototype { /// /// Type of alert, no 2 alert prototypes should have the same one. /// [IdDataField] public string ID { get; private set; } = default!; /// /// List of icons to use for this alert. Each entry corresponds to a different severity level, starting from the /// minimum and incrementing upwards. If severities are not supported, the first entry is used. /// [DataField(required: true)] public List Icons = new(); /// /// An entity used for displaying the in the UI control. /// [DataField] public EntProtoId AlertViewEntity = "AlertSpriteView"; /// /// Name to show in tooltip window. Accepts formatting. /// [DataField] public string Name { get; private set; } = string.Empty; /// /// Description to show in tooltip window. Accepts formatting. /// [DataField] public string Description { get; private set; } = string.Empty; /// /// Category the alert belongs to. Only one alert of a given category /// can be shown at a time. If one is shown while another is already being shown, /// it will be replaced. This can be useful for categories of alerts which should naturally /// replace each other and are mutually exclusive, for example lowpressure / highpressure, /// hot / cold. If left unspecified, the alert will not replace or be replaced by any other alerts. /// [DataField] public ProtoId? Category { get; private set; } /// /// Key which is unique w.r.t category semantics (alerts with same category have equal keys, /// alerts with no category have different keys). /// public AlertKey AlertKey => new(ID, Category); /// /// -1 (no effect) unless MaxSeverity is specified. Defaults to 1. Minimum severity level supported by this state. /// public short MinSeverity => MaxSeverity == -1 ? (short) -1 : _minSeverity; [DataField("minSeverity")] private short _minSeverity = 1; /// /// Maximum severity level supported by this state. -1 (default) indicates /// no severity levels are supported by the state. /// [DataField] public short MaxSeverity = -1; /// /// Indicates whether this state support severity levels /// public bool SupportsSeverity => MaxSeverity != -1; /// /// Event raised on the user when they click on this alert. /// Can be null. /// [DataField] public BaseAlertEvent? ClickEvent; /// severity level, if supported by this alert /// the icon path to the texture for the provided severity level public SpriteSpecifier GetIcon(short? severity = null) { var minIcons = SupportsSeverity ? MaxSeverity - MinSeverity : 1; if (Icons.Count < minIcons) throw new InvalidOperationException($"Insufficient number of icons given for alert {ID}"); if (!SupportsSeverity) return Icons[0]; if (severity == null) { throw new ArgumentException($"No severity specified but this alert ({AlertKey}) has severity.", nameof(severity)); } if (severity < MinSeverity) { throw new ArgumentOutOfRangeException(nameof(severity), $"Severity below minimum severity in {AlertKey}."); } if (severity > MaxSeverity) { throw new ArgumentOutOfRangeException(nameof(severity), $"Severity above maximum severity in {AlertKey}."); } return Icons[severity.Value - _minSeverity]; } } [ImplicitDataDefinitionForInheritors] public abstract partial class BaseAlertEvent : HandledEntityEventArgs { public EntityUid User; public ProtoId AlertId; protected BaseAlertEvent(EntityUid user, ProtoId alertId) { User = user; AlertId = alertId; } }