From eaecdb433613e5b308a0495f0c83e5967522553c Mon Sep 17 00:00:00 2001 From: Doru991 <75124791+Doru991@users.noreply.github.com> Date: Fri, 15 Sep 2023 06:14:47 +0300 Subject: [PATCH] Cyborg health alert and damage examining (#20084) * Option for alt health alert and no overlay * Fancy borg health indicator * Borg damage examine localization * EENENGHHHH ENNNGHHH * Requested code changes * Legal sound * Revert "Legal sound" This reverts commit 35715c88898aeb78dfe800319852c230395fdd7e. I misunderstood what Sloth meant * Annoying buzzer is back --- .../DamageOverlayUiController.cs | 10 ++++- Content.Shared/Alert/AlertType.cs | 3 +- .../Mobs/Components/MobThresholdsComponent.cs | 37 ++++++++++++++++-- .../Mobs/Systems/MobThresholdSystem.cs | 26 ++++++++---- Resources/Audio/Machines/attributions.yml | 7 +++- Resources/Audio/Machines/warning_buzzer.ogg | Bin 0 -> 29891 bytes .../health-examinable-silicon.ftl | 18 +++++++++ Resources/Prototypes/Alerts/alerts.yml | 19 +++++++++ .../Mobs/Cyborgs/base_borg_chassis.yml | 21 ++++++++++ .../Alerts/borg_alive.rsi/health0.png | Bin 0 -> 331 bytes .../Alerts/borg_alive.rsi/health1.png | Bin 0 -> 351 bytes .../Alerts/borg_alive.rsi/health2.png | Bin 0 -> 379 bytes .../Alerts/borg_alive.rsi/health3.png | Bin 0 -> 412 bytes .../Alerts/borg_alive.rsi/health4.png | Bin 0 -> 484 bytes .../Interface/Alerts/borg_alive.rsi/meta.json | 26 ++++++++++++ 15 files changed, 153 insertions(+), 14 deletions(-) create mode 100644 Resources/Audio/Machines/warning_buzzer.ogg create mode 100644 Resources/Locale/en-US/health-examinable/health-examinable-silicon.ftl create mode 100644 Resources/Textures/Interface/Alerts/borg_alive.rsi/health0.png create mode 100644 Resources/Textures/Interface/Alerts/borg_alive.rsi/health1.png create mode 100644 Resources/Textures/Interface/Alerts/borg_alive.rsi/health2.png create mode 100644 Resources/Textures/Interface/Alerts/borg_alive.rsi/health3.png create mode 100644 Resources/Textures/Interface/Alerts/borg_alive.rsi/health4.png create mode 100644 Resources/Textures/Interface/Alerts/borg_alive.rsi/meta.json diff --git a/Content.Client/UserInterface/Systems/DamageOverlays/DamageOverlayUiController.cs b/Content.Client/UserInterface/Systems/DamageOverlays/DamageOverlayUiController.cs index 4a5731a528..0836314dbc 100644 --- a/Content.Client/UserInterface/Systems/DamageOverlays/DamageOverlayUiController.cs +++ b/Content.Client/UserInterface/Systems/DamageOverlays/DamageOverlayUiController.cs @@ -1,4 +1,4 @@ -using Content.Client.Alerts; +using Content.Client.Alerts; using Content.Shared.Damage; using Content.Shared.FixedPoint; using Content.Shared.Mobs; @@ -79,9 +79,15 @@ public sealed class DamageOverlayUiController : UIController damageable == null && !EntityManager.TryGetComponent(entity, out damageable)) return; - if (!_mobThresholdSystem.TryGetIncapThreshold(entity, out var foundThreshold, thresholds)) return; //this entity cannot die or crit!! + + if (!thresholds.ShowOverlays) + { + ClearOverlay(); + return; //this entity intentionally has no overlays + } + var critThreshold = foundThreshold.Value; _overlay.State = mobState.CurrentState; diff --git a/Content.Shared/Alert/AlertType.cs b/Content.Shared/Alert/AlertType.cs index 8ba35ae282..e0a7ac99f8 100644 --- a/Content.Shared/Alert/AlertType.cs +++ b/Content.Shared/Alert/AlertType.cs @@ -48,7 +48,8 @@ namespace Content.Shared.Alert Debug4, Debug5, Debug6, - SuitPower + SuitPower, + BorgHealth } } diff --git a/Content.Shared/Mobs/Components/MobThresholdsComponent.cs b/Content.Shared/Mobs/Components/MobThresholdsComponent.cs index 49481787d4..e97d3672a2 100644 --- a/Content.Shared/Mobs/Components/MobThresholdsComponent.cs +++ b/Content.Shared/Mobs/Components/MobThresholdsComponent.cs @@ -1,4 +1,5 @@ -using Content.Shared.FixedPoint; +using Content.Shared.Alert; +using Content.Shared.FixedPoint; using Content.Shared.Mobs.Systems; using Robust.Shared.GameStates; using Robust.Shared.Serialization; @@ -9,7 +10,7 @@ namespace Content.Shared.Mobs.Components; [Access(typeof(MobThresholdSystem))] public sealed partial class MobThresholdsComponent : Component { - [DataField("thresholds", required:true)] + [DataField("thresholds", required: true)] public SortedDictionary Thresholds = new(); [DataField("triggersAlerts")] @@ -18,6 +19,24 @@ public sealed partial class MobThresholdsComponent : Component [DataField("currentThresholdState")] public MobState CurrentThresholdState; + /// + /// The health alert that should be displayed for player controlled entities. + /// Used for alternate health alerts (silicons, for example) + /// + [DataField("stateAlertDict")] + public Dictionary StateAlertDict = new() + { + {MobState.Alive, AlertType.HumanHealth}, + {MobState.Critical, AlertType.HumanCrit}, + {MobState.Dead, AlertType.HumanDead}, + }; + + /// + /// Whether or not this entity should display damage overlays (robots don't feel pain, black out etc.) + /// + [DataField("showOverlays")] + public bool ShowOverlays = true; + /// /// Whether or not this entity can be revived out of a dead state. /// @@ -34,13 +53,25 @@ public sealed class MobThresholdsComponentState : ComponentState public MobState CurrentThresholdState; + public Dictionary StateAlertDict = new() + { + {MobState.Alive, AlertType.HumanHealth}, + {MobState.Critical, AlertType.HumanCrit}, + {MobState.Dead, AlertType.HumanDead}, + }; + + public bool ShowOverlays; + public bool AllowRevives; - public MobThresholdsComponentState(Dictionary unsortedThresholds, bool triggersAlerts, MobState currentThresholdState, bool allowRevives) + public MobThresholdsComponentState(Dictionary unsortedThresholds, bool triggersAlerts, MobState currentThresholdState, + Dictionary stateAlertDict, bool showOverlays, bool allowRevives) { UnsortedThresholds = unsortedThresholds; TriggersAlerts = triggersAlerts; CurrentThresholdState = currentThresholdState; + StateAlertDict = stateAlertDict; + ShowOverlays = showOverlays; AllowRevives = allowRevives; } } diff --git a/Content.Shared/Mobs/Systems/MobThresholdSystem.cs b/Content.Shared/Mobs/Systems/MobThresholdSystem.cs index 93e89c32b8..1cb32543eb 100644 --- a/Content.Shared/Mobs/Systems/MobThresholdSystem.cs +++ b/Content.Shared/Mobs/Systems/MobThresholdSystem.cs @@ -1,10 +1,11 @@ -using System.Diagnostics.CodeAnalysis; +using System.Diagnostics.CodeAnalysis; using System.Linq; using Content.Shared.Alert; using Content.Shared.Damage; using Content.Shared.FixedPoint; using Content.Shared.Mobs.Components; using Robust.Shared.GameStates; +using Robust.Shared.Utility; namespace Content.Shared.Mobs.Systems; @@ -34,6 +35,8 @@ public sealed class MobThresholdSystem : EntitySystem args.State = new MobThresholdsComponentState(thresholds, component.TriggersAlerts, component.CurrentThresholdState, + component.StateAlertDict, + component.ShowOverlays, component.AllowRevives); } @@ -341,28 +344,37 @@ public sealed class MobThresholdSystem : EntitySystem if (!threshold.TriggersAlerts) return; + var dict = threshold.StateAlertDict; + var healthAlert = AlertType.HumanHealth; + var critAlert = AlertType.HumanCrit; + var deadAlert = AlertType.HumanDead; + + dict.TryGetValue(MobState.Alive, out healthAlert); + dict.TryGetValue(MobState.Critical, out critAlert); + dict.TryGetValue(MobState.Dead, out deadAlert); + switch (currentMobState) { case MobState.Alive: { - var severity = _alerts.GetMinSeverity(AlertType.HumanHealth); + var severity = _alerts.GetMinSeverity(healthAlert); if (TryGetIncapPercentage(target, damageable.TotalDamage, out var percentage)) { severity = (short) MathF.Floor(percentage.Value.Float() * - _alerts.GetSeverityRange(AlertType.HumanHealth)); - severity += _alerts.GetMinSeverity(AlertType.HumanHealth); + _alerts.GetSeverityRange(healthAlert)); + severity += _alerts.GetMinSeverity(healthAlert); } - _alerts.ShowAlert(target, AlertType.HumanHealth, severity); + _alerts.ShowAlert(target, healthAlert, severity); break; } case MobState.Critical: { - _alerts.ShowAlert(target, AlertType.HumanCrit); + _alerts.ShowAlert(target, critAlert); break; } case MobState.Dead: { - _alerts.ShowAlert(target, AlertType.HumanDead); + _alerts.ShowAlert(target, deadAlert); break; } case MobState.Invalid: diff --git a/Resources/Audio/Machines/attributions.yml b/Resources/Audio/Machines/attributions.yml index 53cbc4748c..bbf4ea9ac0 100644 --- a/Resources/Audio/Machines/attributions.yml +++ b/Resources/Audio/Machines/attributions.yml @@ -41,4 +41,9 @@ - files: ["timer.ogg"] license: "CC-BY-SA-3.0" copyright: "Taken from /tg/station" - source: "https://github.com/tgstation/tgstation/blob/d4f678a1772007ff8d7eddd21cf7218c8e07bfc0/sound/items/timer.ogg" \ No newline at end of file + source: "https://github.com/tgstation/tgstation/blob/d4f678a1772007ff8d7eddd21cf7218c8e07bfc0/sound/items/timer.ogg" + +- files: ["warning_buzzer.ogg"] + license: "CC-BY-SA-3.0" + copyright: "Taken from TG station." + source: "https://github.com/tgstation/tgstation/blob/d4f678a1772007ff8d7eddd21cf7218c8e07bfc0/sound/machines/warning-buzzer.ogg" \ No newline at end of file diff --git a/Resources/Audio/Machines/warning_buzzer.ogg b/Resources/Audio/Machines/warning_buzzer.ogg new file mode 100644 index 0000000000000000000000000000000000000000..55bb179f57d479b1ef3b2bd06d33b6bd76a87666 GIT binary patch literal 29891 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 literal 0 HcmV?d00001 diff --git a/Resources/Locale/en-US/health-examinable/health-examinable-silicon.ftl b/Resources/Locale/en-US/health-examinable/health-examinable-silicon.ftl new file mode 100644 index 0000000000..03eaf07a3b --- /dev/null +++ b/Resources/Locale/en-US/health-examinable/health-examinable-silicon.ftl @@ -0,0 +1,18 @@ +health-examinable-silicon-none = There is no obvious damage to be seen. + +health-examinable-silicon-Blunt-25 = [color=red]{ CAPITALIZE(SUBJECT($target)) } { CONJUGATE-HAVE($target) } minor dents on { POSS-ADJ($target) } chassis.[/color] +health-examinable-silicon-Blunt-50 = [color=crimson]{ CAPITALIZE(POSS-ADJ($target)) } chassis is severely dented![/color] +health-examinable-silicon-Blunt-75 = [color=crimson]{ CAPITALIZE(POSS-ADJ($target)) } chassis is almost completely caved in![/color] + +health-examinable-silicon-Slash-10 = [color=red]{ CAPITALIZE(SUBJECT($target)) } { CONJUGATE-HAVE($target) } some minor scratches.[/color] +health-examinable-silicon-Slash-25 = [color=red]{ CAPITALIZE(SUBJECT($target)) } { CONJUGATE-HAVE($target) } significant scratches on { POSS-ADJ($target) } chassis.[/color] +health-examinable-silicon-Slash-50 = [color=crimson]{ CAPITALIZE(SUBJECT($target)) } { CONJUGATE-HAVE($target) } major gashes across { POSS-ADJ($target) } plating![/color] +health-examinable-silicon-Slash-75 = [color=crimson]{ CAPITALIZE(POSS-ADJ($target)) } chassis is torn up![/color] + +health-examinable-silicon-Piercing-50 = [color=crimson]{ CAPITALIZE(SUBJECT($target)) } { CONJUGATE-HAVE($target) } large holes all over { POSS-ADJ($target) } chassis![/color] + +health-examinable-silicon-Heat-25 = [color=orange]{ CAPITALIZE(SUBJECT($target)) } { CONJUGATE-HAVE($target) } superficial burns across { POSS-ADJ($target) } chassis.[/color] +health-examinable-silicon-Heat-50 = [color=orange]{ CAPITALIZE(POSS-ADJ($target)) } chassis is significantly charred.[/color] +health-examinable-silicon-Heat-75 = [color=orange]{ CAPITALIZE(POSS-ADJ($target)) } chassis is partially melted![/color] + +health-examinable-silicon-Shock-50 = [color=lightgoldenrodyellow]{ CAPITALIZE(POSS-ADJ($target)) } circuits seem partially fried![/color] diff --git a/Resources/Prototypes/Alerts/alerts.yml b/Resources/Prototypes/Alerts/alerts.yml index ce6b2d0510..e71a8ed381 100644 --- a/Resources/Prototypes/Alerts/alerts.yml +++ b/Resources/Prototypes/Alerts/alerts.yml @@ -178,6 +178,25 @@ minSeverity: 0 maxSeverity: 4 +- type: alert + id: BorgHealth + category: Health + icons: + - sprite: /Textures/Interface/Alerts/borg_alive.rsi + state: health0 + - sprite: /Textures/Interface/Alerts/borg_alive.rsi + state: health1 + - sprite: /Textures/Interface/Alerts/borg_alive.rsi + state: health2 + - sprite: /Textures/Interface/Alerts/borg_alive.rsi + state: health3 + - sprite: /Textures/Interface/Alerts/borg_alive.rsi + state: health4 + name: alerts-health-name + description: alerts-health-desc + minSeverity: 0 + maxSeverity: 4 + - type: alert id: BorgBattery category: Battery diff --git a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml index fb58b5a644..25e4271b10 100644 --- a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml +++ b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml @@ -48,6 +48,18 @@ - type: MobThresholds thresholds: 0: Alive + 100: Dead + stateAlertDict: + Alive: BorgHealth + showOverlays: false + - type: HealthExaminable + examinableTypes: + - Blunt + - Slash + - Piercing + - Heat + - Shock + locPrefix: silicon - type: UserInterface interfaces: - key: enum.SiliconLawsUiKey.Key @@ -124,6 +136,15 @@ damageContainer: Inorganic - type: Destructible thresholds: + - trigger: + !type:DamageTrigger + damage: 50 + behaviors: + - !type:PlaySoundBehavior + sound: + path: /Audio/Machines/warning_buzzer.ogg + params: + volume: 5 - trigger: !type:DamageTrigger damage: 100 diff --git a/Resources/Textures/Interface/Alerts/borg_alive.rsi/health0.png b/Resources/Textures/Interface/Alerts/borg_alive.rsi/health0.png new file mode 100644 index 0000000000000000000000000000000000000000..b94d636d0f5f9a3d2f8e1eacc33cf755ac4c798b GIT binary patch literal 331 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCiji0(?STjg5^J6%`vA8gjn3IUbC3aBwhP6AP3)RC@Xvkm4u_@(cbC0Sxz= z_eKK6I14-?iy0XB4uLSEsD@VqP;iB(i(`m||JKQoe9VeG&h4rN|E0y%^A7VkdW2?+ zZM2#Fr{HTdN6f@G$DWCJzR&T}oF0_5>MA=YQ>2vNt>p{vGv1hF{zX#2_^mL@dA{e{ z+9K{V@IJC)3Fx$2|I3?6X@^u4BkzX})(cz;@8&c7ogiz&cuUdxM{SdP!G4DKJnxto z()c@sOIAFYBEVSO^h8u5&DWvD<$yu9)8W#2U0=-ej5aeJKfgQly?$C4Z<x~a)=o(yYtY2yWVWpe(Q*>KtHX?%9!E7OB##_6?D(l1g)W~}RNyvHVY z=-7l42RJ|Sp5UM0^jy0k-)-UJjJBG05>080cK`R>zEZ`!!d`I7Txr1rKz}iKy85}S Ib4q9e0B+=qXaE2J literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Alerts/borg_alive.rsi/health3.png b/Resources/Textures/Interface/Alerts/borg_alive.rsi/health3.png new file mode 100644 index 0000000000000000000000000000000000000000..fd4e7ccde30ca282745241a75cb9d3db18478f44 GIT binary patch literal 412 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCilo1AIbUjg5^J6%`vA8XO!PUPQRw53;}HXy)wf?B(U<@9&?MmUh~~0jTz_ zy{;~h;w=gC3;vG;7;IlCwE-nK3p^r=85sBufiR<}hF1en@TsSZV~B4gtKeA9h9VF1wB}IfT_0x@D1J#c zwK)9fUP5aPUrf71g!aM@t`DqQKTC2ZF)&`&?Am+qSJQ**l80|CI>{r^_SxE5kg4zB q%L}}fzLp-{M+<&`{&%&qj!|~0NaEiJCQ+b=89ZJ6T-G@yGywprqM;)I literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Alerts/borg_alive.rsi/health4.png b/Resources/Textures/Interface/Alerts/borg_alive.rsi/health4.png new file mode 100644 index 0000000000000000000000000000000000000000..449d4428b8efe36edd15e5f6d206ec6bf43d3050 GIT binary patch literal 484 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCijq1AIbUjg5_g%>O{t(D2{Eq1eH}g@NI2Lqn>A!!8B}BL;@k4h{tj3|?Md zGZ`4t($Z!&G%RXp0BZ5(wvGot5&;s?QG8X zTMFwUubpid*z{=_pMPrdvY5P-F0P^>bP0l+XkK D0ztwg literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Alerts/borg_alive.rsi/meta.json b/Resources/Textures/Interface/Alerts/borg_alive.rsi/meta.json new file mode 100644 index 0000000000..048a7bbda1 --- /dev/null +++ b/Resources/Textures/Interface/Alerts/borg_alive.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Original from https://github.com/tgstation/tgstation/blob/42ebbb4202b472cf94561974a30e00a0b00e11bc/icons/mob/screen1_robot.dmi, edited by @Doru991", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "health0" + }, + { + "name": "health1" + }, + { + "name": "health2" + }, + { + "name": "health3" + }, + { + "name": "health4" + } + ] +} -- 2.51.2