using Content.Shared.Damage; using Content.Shared.Examine; using Content.Shared.FixedPoint; using Content.Shared.IdentityManagement; using Content.Shared.Verbs; using Robust.Shared.Utility; namespace Content.Shared.HealthExaminable; public sealed class HealthExaminableSystem : EntitySystem { [Dependency] private readonly ExamineSystemShared _examineSystem = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent>(OnGetExamineVerbs); } private void OnGetExamineVerbs(EntityUid uid, HealthExaminableComponent component, GetVerbsEvent args) { if (!TryComp(uid, out var damage)) return; var detailsRange = _examineSystem.IsInDetailsRange(args.User, uid); var verb = new ExamineVerb() { Act = () => { var markup = CreateMarkup(uid, component, damage); _examineSystem.SendExamineTooltip(args.User, uid, markup, false, false); }, Text = Loc.GetString("health-examinable-verb-text"), Category = VerbCategory.Examine, Disabled = !detailsRange, Message = detailsRange ? null : Loc.GetString("health-examinable-verb-disabled"), Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/VerbIcons/rejuvenate.svg.192dpi.png")) }; args.Verbs.Add(verb); } public FormattedMessage CreateMarkup(EntityUid uid, HealthExaminableComponent component, DamageableComponent damage) { var msg = new FormattedMessage(); var first = true; foreach (var type in component.ExaminableTypes) { if (!damage.Damage.DamageDict.TryGetValue(type, out var dmg)) continue; if (dmg == FixedPoint2.Zero) continue; FixedPoint2 closest = FixedPoint2.Zero; string chosenLocStr = string.Empty; foreach (var threshold in component.Thresholds) { var str = $"health-examinable-{component.LocPrefix}-{type}-{threshold}"; var tempLocStr = Loc.GetString($"health-examinable-{component.LocPrefix}-{type}-{threshold}", ("target", Identity.Entity(uid, EntityManager))); // i.e., this string doesn't exist, because theres nothing for that threshold if (tempLocStr == str) continue; if (dmg > threshold && threshold > closest) { chosenLocStr = tempLocStr; closest = threshold; } } if (closest == FixedPoint2.Zero) continue; if (!first) { msg.PushNewline(); } else { first = false; } msg.AddMarkupOrThrow(chosenLocStr); } if (msg.IsEmpty) { msg.AddMarkupOrThrow(Loc.GetString($"health-examinable-{component.LocPrefix}-none")); } // Anything else want to add on to this? RaiseLocalEvent(uid, new HealthBeingExaminedEvent(msg), true); return msg; } } /// /// A class raised on an entity whose health is being examined /// in order to add special text that is not handled by the /// damage thresholds. /// public sealed class HealthBeingExaminedEvent { public FormattedMessage Message; public HealthBeingExaminedEvent(FormattedMessage message) { Message = message; } }