diff --git a/Content.Shared/Body/Events/BleedModifierEvent.cs b/Content.Shared/Body/Events/BleedModifierEvent.cs new file mode 100644 index 0000000000..c836738d63 --- /dev/null +++ b/Content.Shared/Body/Events/BleedModifierEvent.cs @@ -0,0 +1,9 @@ +namespace Content.Shared.Body.Events; + +/// +/// Raised on an entity before they bleed to modify the amount. +/// +/// The amount of blood the entity will lose. +/// The amount of bleed reduction that will happen. +[ByRefEvent] +public record struct BleedModifierEvent(float BleedAmount, float BleedReductionAmount); diff --git a/Content.Shared/Body/Systems/SharedBloodstreamSystem.cs b/Content.Shared/Body/Systems/SharedBloodstreamSystem.cs index 182cdb47d3..7db9f42280 100644 --- a/Content.Shared/Body/Systems/SharedBloodstreamSystem.cs +++ b/Content.Shared/Body/Systems/SharedBloodstreamSystem.cs @@ -81,10 +81,14 @@ public abstract class SharedBloodstreamSystem : EntitySystem // as well as stop their bleeding to a certain extent. if (bloodstream.BleedAmount > 0) { + var ev = new BleedModifierEvent(bloodstream.BleedAmount, bloodstream.BleedReductionAmount); + RaiseLocalEvent(uid, ref ev); + // Blood is removed from the bloodstream at a 1-1 rate with the bleed amount - TryModifyBloodLevel((uid, bloodstream), -bloodstream.BleedAmount); + TryModifyBloodLevel((uid, bloodstream), -ev.BleedAmount); + // Bleed rate is reduced by the bleed reduction amount in the bloodstream component. - TryModifyBleedAmount((uid, bloodstream), -bloodstream.BleedReductionAmount); + TryModifyBleedAmount((uid, bloodstream), -ev.BleedReductionAmount); } // deal bloodloss damage if their blood level is below a threshold. diff --git a/Content.Shared/Traits/Assorted/HemophiliaComponent.cs b/Content.Shared/Traits/Assorted/HemophiliaComponent.cs new file mode 100644 index 0000000000..208883f11c --- /dev/null +++ b/Content.Shared/Traits/Assorted/HemophiliaComponent.cs @@ -0,0 +1,16 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Traits.Assorted; + +/// +/// This component is used for the Hemophilia Trait, it reduces the passive bleed stack reduction amount so entities with it bleed for longer. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class HemophiliaComponent : Component +{ + /// + /// What multiplier should be applied to the BleedReduction when an entity bleeds? + /// + [DataField, AutoNetworkedField] + public float HemophiliaBleedReductionMultiplier = 0.33f; +} diff --git a/Content.Shared/Traits/Assorted/HemophiliaSystem.cs b/Content.Shared/Traits/Assorted/HemophiliaSystem.cs new file mode 100644 index 0000000000..53f6609575 --- /dev/null +++ b/Content.Shared/Traits/Assorted/HemophiliaSystem.cs @@ -0,0 +1,16 @@ +using Content.Shared.Body.Events; + +namespace Content.Shared.Traits.Assorted; + +public sealed class HemophiliaSystem : EntitySystem +{ + public override void Initialize() + { + SubscribeLocalEvent(OnBleedModifier); + } + + private void OnBleedModifier(Entity ent, ref BleedModifierEvent args) + { + args.BleedReductionAmount *= ent.Comp.HemophiliaBleedReductionMultiplier; + } +} diff --git a/Resources/Locale/en-US/traits/traits.ftl b/Resources/Locale/en-US/traits/traits.ftl index f4c51d863e..3895ce162d 100644 --- a/Resources/Locale/en-US/traits/traits.ftl +++ b/Resources/Locale/en-US/traits/traits.ftl @@ -66,5 +66,8 @@ trait-spanish-desc = Hola señor, donde esta la biblioteca. trait-painnumbness-name = Numb trait-painnumbness-desc = You lack any sense of feeling pain, being unaware of how hurt you may be. +trait-hemophilia-name = Hemophilia +trait-hemophilia-desc = Your body fails to make blood clots. + trait-impaired-mobility-name = Impaired Mobility trait-impaired-mobility-desc = You have difficulty moving without a mobility aid. diff --git a/Resources/Prototypes/Entities/Mobs/Player/clone.yml b/Resources/Prototypes/Entities/Mobs/Player/clone.yml index 98d99d7321..5c59f82744 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/clone.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/clone.yml @@ -16,6 +16,7 @@ # traits - BlackAndWhiteOverlay - Clumsy + - Hemophilia - ImpairedMobility # - LegsParalyzed (you get healed) - LightweightDrunk diff --git a/Resources/Prototypes/Traits/disabilities.yml b/Resources/Prototypes/Traits/disabilities.yml index 0bb6f0da3c..c5356149f2 100644 --- a/Resources/Prototypes/Traits/disabilities.yml +++ b/Resources/Prototypes/Traits/disabilities.yml @@ -84,6 +84,14 @@ components: - type: PainNumbness +- type: trait + id: Hemophilia + name: trait-hemophilia-name + description: trait-hemophilia-desc + category: Disabilities + components: + - type: Hemophilia + - type: trait id: ImpairedMobility name: trait-impaired-mobility-name