using Content.Shared.Alert; using Content.Shared.FixedPoint; namespace Content.Shared._Offbrand.Wounds; public sealed class HeartrateAlertsSystem : EntitySystem { [Dependency] private readonly AlertsSystem _alerts = default!; [Dependency] private readonly HeartSystem _heart = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnMapInit); SubscribeLocalEvent(OnComponentShutdown); SubscribeLocalEvent(OnAfterStrainChanged); SubscribeLocalEvent(OnHeartStopped); SubscribeLocalEvent(OnHeartStarted); } private void UpdateAlert(Entity ent) { var heartrate = Comp(ent); if (heartrate.Running) { var range = _alerts.GetSeverityRange(ent.Comp.StrainAlert); var min = _alerts.GetMinSeverity(ent.Comp.StrainAlert); var max = _alerts.GetMaxSeverity(ent.Comp.StrainAlert); var severity = Math.Min(min + (short)Math.Round(range * _heart.Strain((ent.Owner, heartrate))), max); _alerts.ShowAlert(ent.Owner, ent.Comp.StrainAlert, (short)severity); } else { _alerts.ShowAlert(ent.Owner, ent.Comp.StoppedAlert); } } private void OnMapInit(Entity ent, ref MapInitEvent args) { UpdateAlert(ent); } private void OnAfterStrainChanged(Entity ent, ref AfterStrainChangedEvent args) { UpdateAlert(ent); } private void OnComponentShutdown(Entity ent, ref ComponentShutdown args) { _alerts.ClearAlertCategory(ent.Owner, ent.Comp.AlertCategory); } private void OnHeartStopped(Entity ent, ref HeartStoppedEvent args) { UpdateAlert(ent); } private void OnHeartStarted(Entity ent, ref HeartStartedEvent args) { UpdateAlert(ent); } }