using System.Text; using Robust.Client.AutoGenerated; using Robust.Client.UserInterface.CustomControls; using Robust.Client.UserInterface.XAML; using Content.Shared.Damage.Prototypes; using Content.Shared.FixedPoint; using Robust.Shared.Prototypes; using Content.Shared.Damage; using static Content.Shared.MedicalScanner.SharedHealthAnalyzerComponent; namespace Content.Client.HealthAnalyzer.UI { [GenerateTypedNameReferences] public sealed partial class HealthAnalyzerWindow : DefaultWindow { public HealthAnalyzerWindow() { RobustXamlLoader.Load(this); } public void Populate(HealthAnalyzerScannedUserMessage msg) { var text = new StringBuilder(); var entities = IoCManager.Resolve(); if (msg.TargetEntity != null && entities.TryGetComponent(msg.TargetEntity, out var damageable)) { string entityName = "Unknown"; if (msg.TargetEntity != null && entities.TryGetComponent(msg.TargetEntity.Value, out var metaData)) entityName = metaData.EntityName; IReadOnlyDictionary DamagePerGroup = damageable.DamagePerGroup; IReadOnlyDictionary DamagePerType = damageable.Damage.DamageDict; text.Append($"{Loc.GetString("health-analyzer-window-entity-health-text", ("entityName", entityName))}\n"); text.Append($"{Loc.GetString("health-analyzer-window-entity-damage-total-text", ("amount", damageable.TotalDamage))}\n"); HashSet shownTypes = new(); var protos = IoCManager.Resolve(); // Show the total damage and type breakdown for each damage group. foreach (var (damageGroupId, damageAmount) in DamagePerGroup) { text.Append($"\n{Loc.GetString("health-analyzer-window-damage-group-text", ("damageGroup", damageGroupId), ("amount", damageAmount))}"); // Show the damage for each type in that group. var group = protos.Index(damageGroupId); foreach (var type in group.DamageTypes) { if (DamagePerType.TryGetValue(type, out var typeAmount)) { // If damage types are allowed to belong to more than one damage group, they may appear twice here. Mark them as duplicate. if (!shownTypes.Contains(type)) { shownTypes.Add(type); text.Append($"\n- {Loc.GetString("health-analyzer-window-damage-type-text", ("damageType", type), ("amount", typeAmount))}"); } } } text.AppendLine(); } Diagnostics.Text = text.ToString(); SetSize = (250, 600); } else { Diagnostics.Text = Loc.GetString("health-analyzer-window-no-patient-data-text"); SetSize = (250, 100); } } } }