From fe822551398ba43724531c0451194b99625ffc14 Mon Sep 17 00:00:00 2001 From: Remuchi <72476615+Remuchi@users.noreply.github.com> Date: Fri, 16 Feb 2024 01:08:30 +0700 Subject: [PATCH] =?UTF-8?q?[Fix]:=20=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=BE=20=D0=BE=D1=82=D0=BE=D0=B1=D1=80=D0=B0?= =?UTF-8?q?=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=83=D1=80=D0=BE=D0=BD=D0=B0?= =?UTF-8?q?=20=D0=B2=20=D0=A3=D0=98=20=D0=B0=D0=BD=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D1=82=D0=BE=D1=80=D0=B0=20=D0=B7=D0=B4=D0=BE=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D1=8C=D1=8F=20(#77)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: возвращено отображение урона в сканере здоровья * add: сканер здоровья только те группы, где есть урон --- .../UI/HealthAnalyzerWindow.xaml.cs | 69 +++++++++------ .../GroupDamageCardComponent.xaml.cs | 86 ++++++++++--------- .../components/health-analyzer-component.ftl | 36 ++++---- 3 files changed, 108 insertions(+), 83 deletions(-) diff --git a/Content.Client/HealthAnalyzer/UI/HealthAnalyzerWindow.xaml.cs b/Content.Client/HealthAnalyzer/UI/HealthAnalyzerWindow.xaml.cs index b12b0c66a2..d0a971e968 100644 --- a/Content.Client/HealthAnalyzer/UI/HealthAnalyzerWindow.xaml.cs +++ b/Content.Client/HealthAnalyzer/UI/HealthAnalyzerWindow.xaml.cs @@ -23,36 +23,55 @@ namespace Content.Client.HealthAnalyzer.UI { var entities = IoCManager.Resolve(); - if (msg.TargetEntity != null && - entities.TryGetComponent(entities.GetEntity(msg.TargetEntity), out var damageable)) + if (msg.TargetEntity == null || !entities.TryGetComponent(entities.GetEntity(msg.TargetEntity), + out DamageableComponent? damageable)) { - EntityNameLabel.Text = Identity.Name(entities.GetEntity(msg.TargetEntity.Value), entities); - TemperatureLabel.Text = float.IsNaN(msg.Temperature) ? Loc.GetString("health-analyzer-window-no-data") : $"{msg.Temperature - 273f:F1} \u00B0C"; - BloodLevelLabel.Text = float.IsNaN(msg.BloodLevel) ? Loc.GetString("health-analyzer-window-no-data") : $"{msg.BloodLevel * 100:F1} %"; - TotalDamageLabel.Text = damageable.TotalDamage.ToString(); + return; + } - entities.TryGetComponent(entities.GetEntity(msg.TargetEntity), out var mobStateComponent); + EntityNameLabel.Text = Identity.Name(entities.GetEntity(msg.TargetEntity.Value), entities); + TemperatureLabel.Text = float.IsNaN(msg.Temperature) + ? Loc.GetString("health-analyzer-window-no-data") + : $"{msg.Temperature - 273f:F1} \u00B0C"; - AliveStatusLabel.Text = mobStateComponent?.CurrentState switch + BloodLevelLabel.Text = float.IsNaN(msg.BloodLevel) + ? Loc.GetString("health-analyzer-window-no-data") + : $"{msg.BloodLevel * 100:F1} %"; + + TotalDamageLabel.Text = damageable.TotalDamage.ToString(); + + entities.TryGetComponent(entities.GetEntity(msg.TargetEntity), + out var mobStateComponent); + + AliveStatusLabel.Text = mobStateComponent?.CurrentState switch + { + Shared.Mobs.MobState.Alive => Loc.GetString( + "health-analyzer-window-entity-current-alive-status-alive-text"), + Shared.Mobs.MobState.Critical => Loc.GetString( + "health-analyzer-window-entity-current-alive-status-critical-text"), + Shared.Mobs.MobState.Dead => Loc.GetString( + "health-analyzer-window-entity-current-alive-status-dead-text"), + _ => Loc.GetString("health-analyzer-window-no-data"), + }; + + IReadOnlyDictionary damagePerGroup = damageable.DamagePerGroup; + IReadOnlyDictionary damagePerType = damageable.Damage.DamageDict; + + DamageGroupsContainer.RemoveAllChildren(); + + // Show the total damage and type breakdown for each damage group. + foreach (var (damageGroupId, damageAmount) in damagePerGroup) + { + if (damageAmount == 0) { - Shared.Mobs.MobState.Alive => Loc.GetString("health-analyzer-window-entity-current-alive-status-alive-text"), - Shared.Mobs.MobState.Critical => Loc.GetString("health-analyzer-window-entity-current-alive-status-critical-text"), - Shared.Mobs.MobState.Dead => Loc.GetString("health-analyzer-window-entity-current-alive-status-dead-text"), - _ => Loc.GetString("health-analyzer-window-no-data"), - }; - - IReadOnlyDictionary damagePerGroup = damageable.DamagePerGroup; - IReadOnlyDictionary damagePerType = damageable.Damage.DamageDict; - - DamageGroupsContainer.RemoveAllChildren(); - - // Show the total damage and type breakdown for each damage group. - foreach (var (damageGroupId, damageAmount) in damagePerGroup) - { - var damageGroupTitle = Loc.GetString("health-analyzer-window-damage-group-" + damageGroupId, ("amount", damageAmount)); - - DamageGroupsContainer.AddChild(new GroupDamageCardComponent(damageGroupTitle, damageGroupId, damagePerType)); + continue; } + + var damageGroupTitle = Loc.GetString("health-analyzer-window-damage-group-" + damageGroupId, + ("amount", damageAmount)); + + DamageGroupsContainer.AddChild(new GroupDamageCardComponent(damageGroupTitle, damageGroupId, + damagePerType)); } } } diff --git a/Content.Client/_White/Medical/BodyScanner/GroupDamageCardComponent.xaml.cs b/Content.Client/_White/Medical/BodyScanner/GroupDamageCardComponent.xaml.cs index f7537014ee..2b0d0eca13 100644 --- a/Content.Client/_White/Medical/BodyScanner/GroupDamageCardComponent.xaml.cs +++ b/Content.Client/_White/Medical/BodyScanner/GroupDamageCardComponent.xaml.cs @@ -11,7 +11,7 @@ namespace Content.Client._White.Medical.BodyScanner [GenerateTypedNameReferences] public sealed partial class GroupDamageCardComponent : Control { - public GroupDamageCardComponent(string title, string damageGroupID, IReadOnlyDictionary damagePerType) + public GroupDamageCardComponent(string title, string damageGroupId, IReadOnlyDictionary damagePerType) { RobustXamlLoader.Load(this); @@ -19,28 +19,35 @@ namespace Content.Client._White.Medical.BodyScanner HashSet shownTypes = new(); var protos = IoCManager.Resolve(); - var group = protos.Index(damageGroupID); + var group = protos.Index(damageGroupId); // Show the damage for each type in that group. foreach (var type in group.DamageTypes) { - if (damagePerType.TryGetValue(type, out var typeAmount)) + 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); - - Label damagePerTypeLabel = new() - { - Text = Loc.GetString("health-analyzer-window-damage-type-" + type, ("amount", typeAmount)), - }; - - SetColorLabel(damagePerTypeLabel, typeAmount.Float()); - - DamageLabelsContainer.AddChild(damagePerTypeLabel); - } + continue; } + + if (typeAmount == 0) + { + continue; + } + + // If damage types are allowed to belong to more than one damage group, they may appear twice here. Mark them as duplicate. + if (!shownTypes.Add(type)) + { + continue; + } + + Label damagePerTypeLabel = new() + { + Text = Loc.GetString("health-analyzer-window-damage-type-" + type, ("amount", typeAmount)), + }; + + SetColorLabel(damagePerTypeLabel, typeAmount.Float()); + + DamageLabelsContainer.AddChild(damagePerTypeLabel); } } @@ -49,35 +56,34 @@ namespace Content.Client._White.Medical.BodyScanner /// /// /// - private void SetColorLabel(Label label, float damage) + private static void SetColorLabel(Label label, float damage) { var startColor = Color.White; var critColor = Color.Yellow; var endColor = Color.Red; - var startDamage = 0f; - var critDamage = 30f; - var endDamage = 100f; + const float startDamage = 0f; + const float critDamage = 30f; + const float endDamage = 100f; - if (damage <= startDamage) + switch (damage) { - label.FontColorOverride = startColor; - } - else if (damage >= endDamage) - { - label.FontColorOverride = endColor; - } - else if (damage >= startDamage && damage <= critDamage) - { - // We need a number from 0 to 100. - damage *= 100f / (critDamage - startDamage); - label.FontColorOverride = GetColorLerp(startColor, critColor, damage); - } - else if (damage >= critDamage && damage <= endDamage) - { - // We need a number from 0 to 100. - damage *= 100f / (endDamage - critDamage); - label.FontColorOverride = GetColorLerp(critColor, endColor, damage); + case <= startDamage: + label.FontColorOverride = startColor; + break; + case >= endDamage: + label.FontColorOverride = endColor; + break; + case >= startDamage and <= critDamage: + // We need a number from 0 to 100. + damage *= 100f / (critDamage - startDamage); + label.FontColorOverride = GetColorLerp(startColor, critColor, damage); + break; + case >= critDamage and <= endDamage: + // We need a number from 0 to 100. + damage *= 100f / (endDamage - critDamage); + label.FontColorOverride = GetColorLerp(critColor, endColor, damage); + break; } } @@ -88,7 +94,7 @@ namespace Content.Client._White.Medical.BodyScanner /// /// /// - private Color GetColorLerp(Color startColor, Color endColor, float percentage) + private static Color GetColorLerp(Color startColor, Color endColor, float percentage) { var t = percentage / 100f; var r = MathHelper.Lerp(startColor.R, endColor.R, t); diff --git a/Resources/Locale/ru-RU/medical/components/health-analyzer-component.ftl b/Resources/Locale/ru-RU/medical/components/health-analyzer-component.ftl index a2dc1b89cb..7b411db488 100644 --- a/Resources/Locale/ru-RU/medical/components/health-analyzer-component.ftl +++ b/Resources/Locale/ru-RU/medical/components/health-analyzer-component.ftl @@ -11,27 +11,27 @@ health-analyzer-window-damage-group-text = {$damageGroup}: {$amount} health-analyzer-window-damage-type-text = {$damageType}: {$amount} health-analyzer-window-damage-type-duplicate-text = {$damageType}: {$amount} (дубликат) -health-analyzer-window-damage-group-Brute = Механические -health-analyzer-window-damage-type-Blunt = Удары -health-analyzer-window-damage-type-Slash = Разрезы -health-analyzer-window-damage-type-Piercing = Уколы +health-analyzer-window-damage-group-Brute = Механические: {$amount} +health-analyzer-window-damage-type-Blunt = Удары: {$amount} +health-analyzer-window-damage-type-Slash = Разрезы: {$amount} +health-analyzer-window-damage-type-Piercing = Уколы: {$amount} -health-analyzer-window-damage-group-Burn = Ожоги -health-analyzer-window-damage-type-Heat = Термические -health-analyzer-window-damage-type-Laser = Лазерный -health-analyzer-window-damage-type-Shock = Электрические -health-analyzer-window-damage-type-Cold = Обморожение -health-analyzer-window-damage-type-Caustic = Кислотные +health-analyzer-window-damage-group-Burn = Ожоги: {$amount} +health-analyzer-window-damage-type-Heat = Термические: {$amount} +health-analyzer-window-damage-type-Laser = Лазерный: {$amount} +health-analyzer-window-damage-type-Shock = Электрические: {$amount} +health-analyzer-window-damage-type-Cold = Обморожение: {$amount} +health-analyzer-window-damage-type-Caustic = Кислотные: {$amount} -health-analyzer-window-damage-group-Airloss = Нехватка воздуха -health-analyzer-window-damage-type-Asphyxiation = Удушение -health-analyzer-window-damage-type-Bloodloss = Кровопотеря +health-analyzer-window-damage-group-Airloss = Нехватка воздуха: {$amount} +health-analyzer-window-damage-type-Asphyxiation = Удушение: {$amount} +health-analyzer-window-damage-type-Bloodloss = Кровопотеря: {$amount} -health-analyzer-window-damage-group-Toxin = Токсины -health-analyzer-window-damage-type-Poison = Яды -health-analyzer-window-damage-type-Radiation = Радиация +health-analyzer-window-damage-group-Toxin = Токсины: {$amount} +health-analyzer-window-damage-type-Poison = Яды: {$amount} +health-analyzer-window-damage-type-Radiation = Радиация: {$amount} -health-analyzer-window-damage-group-Genetic = Генетические -health-analyzer-window-damage-type-Cellular = Клеточные +health-analyzer-window-damage-group-Genetic = Генетические: {$amount} +health-analyzer-window-damage-type-Cellular = Клеточные: {$amount} health-analyzer-window-malnutrition = Тяжёлое недоедание