#nullable enable using System; using Content.Client.UserInterface; using Content.Client.Utility; using Content.Shared.Alert; using OpenToolkit.Mathematics; using Robust.Client.Interfaces.ResourceManagement; using Robust.Client.UserInterface.Controls; namespace Content.Client.GameObjects.Components.Mobs { public class AlertControl : BaseButton { public AlertPrototype Alert { get; } /// /// Total duration of the cooldown in seconds. Null if no duration / cooldown. /// public int? TotalDuration { get; set; } private short? _severity; private readonly TextureRect _icon; private CooldownGraphic _cooldownGraphic; private readonly IResourceCache _resourceCache; /// /// Creates an alert control reflecting the indicated alert + state /// /// alert to display /// severity of alert, null if alert doesn't have severity levels /// resourceCache to use to load alert icon textures public AlertControl(AlertPrototype alert, short? severity, IResourceCache resourceCache) { _resourceCache = resourceCache; Alert = alert; _severity = severity; var texture = _resourceCache.GetTexture(alert.GetIconPath(_severity)); _icon = new TextureRect { TextureScale = (2, 2), Texture = texture }; Children.Add(_icon); _cooldownGraphic = new CooldownGraphic(); Children.Add(_cooldownGraphic); } /// /// Change the alert severity, changing the displayed icon /// public void SetSeverity(short? severity) { if (_severity != severity) { _severity = severity; _icon.Texture = _resourceCache.GetTexture(Alert.GetIconPath(_severity)); } } /// /// Updates the displayed cooldown amount, doing nothing if alertCooldown is null /// /// cooldown start and end /// current game time public void UpdateCooldown((TimeSpan Start, TimeSpan End)? alertCooldown, in TimeSpan curTime) { if (!alertCooldown.HasValue) { _cooldownGraphic.Progress = 0; _cooldownGraphic.Visible = false; TotalDuration = null; } else { var start = alertCooldown.Value.Start; var end = alertCooldown.Value.End; var length = (end - start).TotalSeconds; var progress = (curTime - start).TotalSeconds / length; var ratio = (progress <= 1 ? (1 - progress) : (curTime - end).TotalSeconds * -5); TotalDuration = (int?) Math.Round(length); _cooldownGraphic.Progress = MathHelper.Clamp((float)ratio, -1, 1); _cooldownGraphic.Visible = ratio > -1f; } } } }