Skip to content

Commit

Permalink
Cherry-picked commit 8d40bc3 from space-wizards/space-station-14/master
Browse files Browse the repository at this point in the history
  • Loading branch information
SimpleStation14 authored and DoutorWhite committed Mar 18, 2024
1 parent 3bf08c7 commit 3a52964
Show file tree
Hide file tree
Showing 8 changed files with 78 additions and 13 deletions.
25 changes: 16 additions & 9 deletions Content.Client/Overlays/ShowHealthIconsSystem.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
using Content.Shared.Atmos.Rotting;
using Content.Shared.Damage;
using Content.Shared.Inventory.Events;
using Content.Shared.Mobs.Components;
using Content.Shared.Overlays;
using Content.Shared.StatusIcon;
using Content.Shared.StatusIcon.Components;
Expand All @@ -17,9 +19,6 @@ public sealed class ShowHealthIconsSystem : EquipmentHudSystem<ShowHealthIconsCo

public HashSet<string> DamageContainers = new();

[ValidatePrototypeId<StatusIconPrototype>]
private const string HealthIconFine = "HealthIconFine";

public override void Initialize()
{
base.Initialize();
Expand All @@ -45,18 +44,20 @@ protected override void DeactivateInternal()
DamageContainers.Clear();
}

private void OnGetStatusIconsEvent(EntityUid uid, DamageableComponent damageableComponent, ref GetStatusIconsEvent args)
private void OnGetStatusIconsEvent(Entity<DamageableComponent> entity, ref GetStatusIconsEvent args)
{
if (!IsActive || args.InContainer)
return;

var healthIcons = DecideHealthIcons(damageableComponent);
var healthIcons = DecideHealthIcons(entity);

args.StatusIcons.AddRange(healthIcons);
}

private IReadOnlyList<StatusIconPrototype> DecideHealthIcons(DamageableComponent damageableComponent)
private IReadOnlyList<StatusIconPrototype> DecideHealthIcons(Entity<DamageableComponent> entity)
{
var damageableComponent = entity.Comp;

if (damageableComponent.DamageContainerID == null ||
!DamageContainers.Contains(damageableComponent.DamageContainerID))
{
Expand All @@ -66,10 +67,16 @@ private IReadOnlyList<StatusIconPrototype> DecideHealthIcons(DamageableComponent
var result = new List<StatusIconPrototype>();

// Here you could check health status, diseases, mind status, etc. and pick a good icon, or multiple depending on whatever.
if (damageableComponent?.DamageContainerID == "Biological" &&
_prototypeMan.TryIndex<StatusIconPrototype>(HealthIconFine, out var healthyIcon))
if (damageableComponent?.DamageContainerID == "Biological")
{
result.Add(healthyIcon);
if (TryComp<MobStateComponent>(entity, out var state))
{
// Since there is no MobState for a rotting mob, we have to deal with this case first.
if (HasComp<RottingComponent>(entity) && _prototypeMan.TryIndex(damageableComponent.RottingIcon, out var rottingIcon))
result.Add(rottingIcon);
else if (damageableComponent.HealthIcons.TryGetValue(state.CurrentState, out var value) && _prototypeMan.TryIndex(value, out var icon))
result.Add(icon);
}
}

return result;
Expand Down
16 changes: 15 additions & 1 deletion Content.Shared/Damage/Components/DamageableComponent.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
using Content.Shared.Damage.Prototypes;
using Content.Shared.FixedPoint;
using Content.Shared.Mobs;
using Content.Shared.StatusIcon;
using Robust.Shared.GameStates;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List;
Expand Down Expand Up @@ -62,7 +65,18 @@ public sealed partial class DamageableComponent : Component
public FixedPoint2 TotalDamage;

[DataField("radiationDamageTypes", customTypeSerializer: typeof(PrototypeIdListSerializer<DamageTypePrototype>))]
public List<string> RadiationDamageTypeIDs = new() {"Radiation"};
public List<string> RadiationDamageTypeIDs = new() { "Radiation" };

[DataField]
public Dictionary<MobState, ProtoId<StatusIconPrototype>> HealthIcons = new()
{
{ MobState.Alive, "HealthIconFine" },
{ MobState.Critical, "HealthIconCritical" },
{ MobState.Dead, "HealthIconDead" },
};

[DataField]
public ProtoId<StatusIconPrototype> RottingIcon = "HealthIconRotting";
}

[Serializable, NetSerializable]
Expand Down
27 changes: 26 additions & 1 deletion Resources/Prototypes/StatusEffects/health.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,29 @@
icon:
sprite: /Textures/Interface/Misc/health_icons.rsi
state: Fine
locationPreference: Right
locationPreference: Right

- type: statusIcon
id: HealthIconCritical
priority: 1
icon:
sprite: /Textures/Interface/Misc/health_icons.rsi
state: Critical
locationPreference: Right

- type: statusIcon
id: HealthIconDead
priority: 1
icon:
sprite: /Textures/Interface/Misc/health_icons.rsi
state: Dead
locationPreference: Right

- type: statusIcon
id: HealthIconRotting
priority: 1
icon:
sprite: /Textures/Interface/Misc/health_icons.rsi
state: Rotting
locationPreference: Right

Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified Resources/Textures/Interface/Misc/health_icons.rsi/Fine.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
23 changes: 21 additions & 2 deletions Resources/Textures/Interface/Misc/health_icons.rsi/meta.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,29 @@
"y": 8
},
"license": "CC-BY-SA-3.0",
"copyright": "https://github.com/tgstation/tgstation/blob/master/icons/mob/huds/hud.dmi",
"copyright": "Taken from /tg/station at commit https://github.com/tgstation/tgstation/commit/20ae083f140ac5b4da7e8bc40f95349001b6c086",
"states": [
{
"name": "Fine"
},
{
"name": "Critical"
},
{
"name": "Dead",
"delays": [
[
0.125,
0.125,
0.125,
0.125,
0.125,
0.125
]
]
},
{
"name": "Rotting"
}
]
}
}

0 comments on commit 3a52964

Please sign in to comment.