diff --git a/Content.Server/Body/Components/BloodstreamComponent.cs b/Content.Server/Body/Components/BloodstreamComponent.cs index 1d8aa9ffd3d..7a4af3e4cc1 100644 --- a/Content.Server/Body/Components/BloodstreamComponent.cs +++ b/Content.Server/Body/Components/BloodstreamComponent.cs @@ -1,5 +1,6 @@ using Content.Server.Body.Systems; using Content.Server.Chemistry.EntitySystems; +using Content.Server.Traits.Assorted; using Content.Shared.Chemistry.Components; using Content.Shared.Chemistry.Reagent; using Content.Shared.Damage; @@ -11,7 +12,7 @@ namespace Content.Server.Body.Components { - [RegisterComponent, Access(typeof(BloodstreamSystem), typeof(ReactionMixerSystem))] + [RegisterComponent, Access(typeof(BloodstreamSystem), typeof(ReactionMixerSystem), typeof(BloodDeficiencySystem))] public sealed partial class BloodstreamComponent : Component { public static string DefaultChemicalsSolutionName = "chemicals"; @@ -171,5 +172,17 @@ public sealed partial class BloodstreamComponent : Component /// [ViewVariables(VVAccess.ReadWrite)] public TimeSpan StatusTime; + + /// + /// If this is true, the entity will not passively regenerate blood, + /// and instead will slowly lose blood. + /// + public bool HasBloodDeficiency = false; + + /// + /// How much reagent of blood should be removed with blood deficiency in each update interval? + /// + [DataField] + public FixedPoint2 BloodDeficiencyLossAmount; } } diff --git a/Content.Server/Body/Systems/BloodstreamSystem.cs b/Content.Server/Body/Systems/BloodstreamSystem.cs index 0edb190c16e..fafc649eb29 100644 --- a/Content.Server/Body/Systems/BloodstreamSystem.cs +++ b/Content.Server/Body/Systems/BloodstreamSystem.cs @@ -118,11 +118,14 @@ public override void Update(float frameTime) if (!_solutionContainerSystem.ResolveSolution(uid, bloodstream.BloodSolutionName, ref bloodstream.BloodSolution, out var bloodSolution)) continue; - // Adds blood to their blood level if it is below the maximum; Blood regeneration. Must be alive. - if (bloodSolution.Volume < bloodSolution.MaxVolume && !_mobStateSystem.IsDead(uid)) - { - TryModifyBloodLevel(uid, bloodstream.BloodRefreshAmount, bloodstream); - } + // Removes blood for Blood Deficiency constantly. + if (bloodstream.HasBloodDeficiency) + if (!_mobStateSystem.IsDead(uid)) + RemoveBlood(uid, bloodstream.BloodDeficiencyLossAmount, bloodstream); + // Adds blood to their blood level if it is below the maximum. + else if (bloodSolution.Volume < bloodSolution.MaxVolume) + if (!_mobStateSystem.IsDead(uid)) + TryModifyBloodLevel(uid, bloodstream.BloodRefreshAmount, bloodstream); // Removes blood from the bloodstream based on bleed amount (bleed rate) // as well as stop their bleeding to a certain extent. @@ -472,4 +475,16 @@ public void ChangeBloodReagent(EntityUid uid, string reagent, BloodstreamCompone if (currentVolume > 0) _solutionContainerSystem.TryAddReagent(component.BloodSolution.Value, component.BloodReagent, currentVolume, out _); } + + /// + /// Remove blood from an entity, without spilling it. + /// + private void RemoveBlood(EntityUid uid, FixedPoint2 amount, BloodstreamComponent? component = null) + { + if (!Resolve(uid, ref component, logMissing: false) + || !_solutionContainerSystem.ResolveSolution(uid, component.BloodSolutionName, ref component.BloodSolution, out var bloodSolution)) + return; + + bloodSolution.RemoveReagent(component.BloodReagent, amount); + } } diff --git a/Content.Server/Nyanotrasen/Abilities/Boxer/BoxingSystem.cs b/Content.Server/Nyanotrasen/Abilities/Boxer/BoxingSystem.cs index 8bb68cb6f55..6f533c34199 100644 --- a/Content.Server/Nyanotrasen/Abilities/Boxer/BoxingSystem.cs +++ b/Content.Server/Nyanotrasen/Abilities/Boxer/BoxingSystem.cs @@ -14,7 +14,7 @@ public override void Initialize() base.Initialize(); SubscribeLocalEvent(OnInit); SubscribeLocalEvent(OnMeleeHit); - SubscribeLocalEvent(OnStamHit); + SubscribeLocalEvent(OnStamHit); } private void OnInit(EntityUid uid, BoxerComponent component, ComponentInit args) @@ -27,7 +27,7 @@ private void OnMeleeHit(EntityUid uid, BoxerComponent component, MeleeHitEvent a args.ModifiersList.Add(component.UnarmedModifiers); } - private void OnStamHit(EntityUid uid, BoxingGlovesComponent component, StaminaMeleeHitEvent args) + private void OnStamHit(EntityUid uid, BoxingGlovesComponent component, TakeStaminaDamageEvent args) { if (!_containerSystem.TryGetContainingContainer(uid, out var equipee)) return; diff --git a/Content.Server/Nyanotrasen/Abilities/Oni/OniSystem.cs b/Content.Server/Nyanotrasen/Abilities/Oni/OniSystem.cs index 6fdb27097e9..4fc078e85bc 100644 --- a/Content.Server/Nyanotrasen/Abilities/Oni/OniSystem.cs +++ b/Content.Server/Nyanotrasen/Abilities/Oni/OniSystem.cs @@ -21,7 +21,7 @@ public override void Initialize() SubscribeLocalEvent(OnEntRemoved); SubscribeLocalEvent(OnOniMeleeHit); SubscribeLocalEvent(OnHeldMeleeHit); - SubscribeLocalEvent(OnStamHit); + SubscribeLocalEvent(OnStamHit); } private void OnEntInserted(EntityUid uid, OniComponent component, EntInsertedIntoContainerMessage args) @@ -68,7 +68,7 @@ private void OnHeldMeleeHit(EntityUid uid, HeldByOniComponent component, MeleeHi args.ModifiersList.Add(oni.MeleeModifiers); } - private void OnStamHit(EntityUid uid, HeldByOniComponent component, StaminaMeleeHitEvent args) + private void OnStamHit(EntityUid uid, HeldByOniComponent component, TakeStaminaDamageEvent args) { if (!TryComp(component.Holder, out var oni)) return; diff --git a/Content.Server/Nyanotrasen/Psionics/PsionicsSystem.cs b/Content.Server/Nyanotrasen/Psionics/PsionicsSystem.cs index 5a96af2e96b..33505e3f6fc 100644 --- a/Content.Server/Nyanotrasen/Psionics/PsionicsSystem.cs +++ b/Content.Server/Nyanotrasen/Psionics/PsionicsSystem.cs @@ -51,7 +51,7 @@ public override void Initialize() base.Initialize(); SubscribeLocalEvent(OnStartup); SubscribeLocalEvent(OnMeleeHit); - SubscribeLocalEvent(OnStamHit); + SubscribeLocalEvent(OnStamHit); SubscribeLocalEvent(OnInit); SubscribeLocalEvent(OnRemove); @@ -110,14 +110,12 @@ private void OnRemove(EntityUid uid, PsionicComponent component, ComponentRemove _npcFactonSystem.RemoveFaction(uid, "PsionicInterloper"); } - private void OnStamHit(EntityUid uid, AntiPsionicWeaponComponent component, StaminaMeleeHitEvent args) + private void OnStamHit(EntityUid uid, AntiPsionicWeaponComponent component, TakeStaminaDamageEvent args) { var bonus = false; - foreach (var stam in args.HitList) - { - if (HasComp(stam.Entity)) - bonus = true; - } + + if (HasComp(args.Target)) + bonus = true; if (!bonus) return; diff --git a/Content.Server/Traits/BloodDeficiencyComponent.cs b/Content.Server/Traits/BloodDeficiencyComponent.cs new file mode 100644 index 00000000000..616f60cd834 --- /dev/null +++ b/Content.Server/Traits/BloodDeficiencyComponent.cs @@ -0,0 +1,14 @@ +namespace Content.Server.Traits.Assorted; + +/// +/// This is used for the Blood Deficiency trait. +/// +[RegisterComponent] +public sealed partial class BloodDeficiencyComponent : Component +{ + // + // How much reagent of blood should be removed in each update interval? + // + [DataField(required: true)] + public float BloodLossAmount; +} diff --git a/Content.Server/Traits/BloodDeficiencySystem.cs b/Content.Server/Traits/BloodDeficiencySystem.cs new file mode 100644 index 00000000000..f1ae4909956 --- /dev/null +++ b/Content.Server/Traits/BloodDeficiencySystem.cs @@ -0,0 +1,23 @@ +using Content.Server.Body.Systems; +using Content.Server.Body.Components; +using Content.Shared.Damage; + +namespace Content.Server.Traits.Assorted; + +public sealed class BloodDeficiencySystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnStartup); + } + + private void OnStartup(EntityUid uid, BloodDeficiencyComponent component, ComponentStartup args) + { + if (!TryComp(uid, out var bloodstream)) + return; + + bloodstream.HasBloodDeficiency = true; + bloodstream.BloodDeficiencyLossAmount = component.BloodLossAmount; + } +} diff --git a/Content.Shared/Damage/Events/StaminaMeleeHitEvent.cs b/Content.Shared/Damage/Events/TakeStaminaDamageEvent.cs similarity index 67% rename from Content.Shared/Damage/Events/StaminaMeleeHitEvent.cs rename to Content.Shared/Damage/Events/TakeStaminaDamageEvent.cs index c5ed0ddb602..6fca9dc2ef3 100644 --- a/Content.Shared/Damage/Events/StaminaMeleeHitEvent.cs +++ b/Content.Shared/Damage/Events/TakeStaminaDamageEvent.cs @@ -1,5 +1,5 @@ using Content.Shared.Damage.Components; -using Robust.Shared.Collections; +using Content.Shared.Inventory; namespace Content.Shared.Damage.Events; @@ -7,12 +7,14 @@ namespace Content.Shared.Damage.Events; /// The components in the list are going to be hit, /// give opportunities to change the damage or other stuff. /// -public sealed class StaminaMeleeHitEvent : HandledEntityEventArgs +public sealed class TakeStaminaDamageEvent : HandledEntityEventArgs, IInventoryRelayEvent { + public SlotFlags TargetSlots { get; } = ~SlotFlags.POCKET; + /// /// List of hit stamina components. /// - public List<(EntityUid Entity, StaminaComponent Component)> HitList; + public EntityUid Target; /// /// The multiplier. Generally, try to use *= or /= instead of overwriting. @@ -24,8 +26,8 @@ public sealed class StaminaMeleeHitEvent : HandledEntityEventArgs /// public float FlatModifier = 0; - public StaminaMeleeHitEvent(List<(EntityUid Entity, StaminaComponent Component)> hitList) + public TakeStaminaDamageEvent(EntityUid target) { - HitList = hitList; + Target = target; } } diff --git a/Content.Shared/Damage/Systems/StaminaSystem.cs b/Content.Shared/Damage/Systems/StaminaSystem.cs index de5338615ee..5c46e6055d1 100644 --- a/Content.Shared/Damage/Systems/StaminaSystem.cs +++ b/Content.Shared/Damage/Systems/StaminaSystem.cs @@ -166,20 +166,20 @@ private void OnMeleeHit(EntityUid uid, StaminaDamageOnHitComponent component, Me toHit.Add((ent, stam)); } - var hitEvent = new StaminaMeleeHitEvent(toHit); - RaiseLocalEvent(uid, hitEvent); + foreach (var (ent, comp) in toHit) + { + var hitEvent = new TakeStaminaDamageEvent(ent); + RaiseLocalEvent(uid, hitEvent); - if (hitEvent.Handled) - return; + if (hitEvent.Handled) + return; - var damage = component.Damage; + var damage = component.Damage; - damage *= hitEvent.Multiplier; + damage *= hitEvent.Multiplier; - damage += hitEvent.FlatModifier; + damage += hitEvent.FlatModifier; - foreach (var (ent, comp) in toHit) - { TakeStaminaDamage(ent, damage / toHit.Count, comp, source: args.User, with: args.Weapon, sound: component.Sound); } } @@ -204,12 +204,27 @@ private void OnThrowHit(EntityUid uid, StaminaDamageOnCollideComponent component private void OnCollide(EntityUid uid, StaminaDamageOnCollideComponent component, EntityUid target) { + if (!TryComp(target, out var stamComp)) + return; + var ev = new StaminaDamageOnHitAttemptEvent(); RaiseLocalEvent(uid, ref ev); if (ev.Cancelled) return; - TakeStaminaDamage(target, component.Damage, source: uid, sound: component.Sound); + var hitEvent = new TakeStaminaDamageEvent(target); + RaiseLocalEvent(target, hitEvent); + + if (hitEvent.Handled) + return; + + var damage = component.Damage; + + damage *= hitEvent.Multiplier; + + damage += hitEvent.FlatModifier; + + TakeStaminaDamage(target, damage, source: uid, sound: component.Sound); } private void SetStaminaAlert(EntityUid uid, StaminaComponent? component = null) diff --git a/Content.Shared/Inventory/InventorySystem.Relay.cs b/Content.Shared/Inventory/InventorySystem.Relay.cs index c43a5885077..3308e881c52 100644 --- a/Content.Shared/Inventory/InventorySystem.Relay.cs +++ b/Content.Shared/Inventory/InventorySystem.Relay.cs @@ -1,5 +1,6 @@ using Content.Shared.Chemistry; using Content.Shared.Damage; +using Content.Shared.Damage.Events; using Content.Shared.Electrocution; using Content.Shared.Explosion; using Content.Shared.Eye.Blinding.Systems; @@ -20,6 +21,7 @@ public partial class InventorySystem public void InitializeRelay() { SubscribeLocalEvent(RelayInventoryEvent); + SubscribeLocalEvent(RelayInventoryEvent); SubscribeLocalEvent(RelayInventoryEvent); SubscribeLocalEvent(RelayInventoryEvent); SubscribeLocalEvent(RelayInventoryEvent); diff --git a/Content.Shared/Stunnable/StaminaDamageResistanceComponent.cs b/Content.Shared/Stunnable/StaminaDamageResistanceComponent.cs new file mode 100644 index 00000000000..dc291bbe8ba --- /dev/null +++ b/Content.Shared/Stunnable/StaminaDamageResistanceComponent.cs @@ -0,0 +1,12 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Stunnable; + +[RegisterComponent, NetworkedComponent] +public sealed partial class StaminaDamageResistanceComponent : Component +{ + /// + /// 1 - no reduction, 0 - full reduction + /// + [DataField] public float Coefficient = 1; +} diff --git a/Content.Shared/Stunnable/StaminaDamageResistanceSystem.cs b/Content.Shared/Stunnable/StaminaDamageResistanceSystem.cs new file mode 100644 index 00000000000..7632eed504d --- /dev/null +++ b/Content.Shared/Stunnable/StaminaDamageResistanceSystem.cs @@ -0,0 +1,26 @@ +using Content.Shared.Damage.Events; +using Content.Shared.Examine; +using Content.Shared.Inventory; + +namespace Content.Shared.Stunnable; + +public sealed partial class StaminaDamageResistanceSystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent>(OnStaminaMeleeHit); + SubscribeLocalEvent(OnExamine); + } + + private void OnStaminaMeleeHit(Entity ent, ref InventoryRelayedEvent args) + { + args.Args.Multiplier *= ent.Comp.Coefficient; + } + private void OnExamine(Entity ent, ref ExaminedEvent args) + { + var percentage = (1 - ent.Comp.Coefficient) * 100; + args.PushMarkup(Loc.GetString("armor-examine-stamina", ("num", percentage))); + } +} diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 01f1a833faf..7b3e9c5f2cc 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4969,3 +4969,27 @@ Entries: toxin/airloss damage. id: 6221 time: '2024-08-06T08:05:59.0000000+00:00' +- author: TJohnson + changes: + - type: Tweak + message: >- + Removed overlay restriction for vulps, you can now have as many overlay + markings as you want! + id: 6222 + time: '2024-08-06T19:05:46.0000000+00:00' +- author: whateverusername0 + changes: + - type: Add + message: Added different stamina damage resistance to hardsuits. + id: 6223 + time: '2024-08-06T19:08:48.0000000+00:00' +- author: Skubman + changes: + - type: Add + message: >- + Add the Blood Deficiency trait, a new negative trait that makes you + slowly lose blood over time. You must routinely receive blood loss + treatment to live, and even normally non-lethal bleeding can make you + start dying slowly. + id: 6224 + time: '2024-08-06T19:12:34.0000000+00:00' diff --git a/Resources/Locale/en-US/armor/armor-examine.ftl b/Resources/Locale/en-US/armor/armor-examine.ftl index d49a1373f28..6dc511e66e5 100644 --- a/Resources/Locale/en-US/armor/armor-examine.ftl +++ b/Resources/Locale/en-US/armor/armor-examine.ftl @@ -17,3 +17,4 @@ armor-damage-type-cold = Cold armor-damage-type-poison = Poison armor-damage-type-shock = Shock armor-damage-type-structural = Structural +armor-examine-stamina = Reduces your stamina damage by [color=cyan]{$num}%[/color]. \ No newline at end of file diff --git a/Resources/Locale/en-US/traits/traits.ftl b/Resources/Locale/en-US/traits/traits.ftl index 07ef099f832..bf0a44e767e 100644 --- a/Resources/Locale/en-US/traits/traits.ftl +++ b/Resources/Locale/en-US/traits/traits.ftl @@ -23,6 +23,11 @@ trait-description-HeavyweightDrunk = Alcohol is afraid of you. trait-name-Muted = Muted trait-description-Muted = You can't speak +trait-name-BloodDeficiency = Blood Deficiency +trait-description-BloodDeficiency = + Your body loses more blood than it can replenish. + You lose blood over time, and when left untreated you will eventually die from blood loss. + trait-name-Paracusia = Paracusia trait-description-Paracusia = You hear sounds that aren't really there diff --git a/Resources/Prototypes/DeltaV/Species/vulpkanin.yml b/Resources/Prototypes/DeltaV/Species/vulpkanin.yml index 8a3cd4c47ce..e139279dd5c 100644 --- a/Resources/Prototypes/DeltaV/Species/vulpkanin.yml +++ b/Resources/Prototypes/DeltaV/Species/vulpkanin.yml @@ -62,9 +62,6 @@ points: 1 required: true defaultMarkings: [ VulpEar ] - Overlay: - points: 2 - required: false - type: humanoidBaseSprite id: MobVulpkaninHead diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml index 36327fe1f78..d6a2cd446be 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml @@ -142,6 +142,8 @@ - type: Clothing equipDelay: 2.5 # Hardsuits are heavy and take a while to put on/off. unequipDelay: 2.5 + - type: StaminaDamageResistance + coefficient: 0.75 # 25% - type: entity abstract: true diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml index e0d8e7290da..70ab3016469 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml @@ -100,6 +100,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitEngineering + - type: StaminaDamageResistance + coefficient: 0.75 # 25% #Spationaut Hardsuit - type: entity @@ -221,6 +223,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitSecurity + - type: StaminaDamageResistance + coefficient: 0.75 # 25% #Brigmedic Hardsuit - type: entity @@ -248,6 +252,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitBrigmedic + - type: StaminaDamageResistance + coefficient: 0.75 # 25% #Warden's Hardsuit - type: entity @@ -278,6 +284,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitWarden + - type: StaminaDamageResistance + coefficient: 0.65 # 35% #Captain's Hardsuit - type: entity @@ -310,6 +318,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitCap + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #Chief Engineer's Hardsuit - type: entity @@ -345,6 +355,8 @@ - type: ClothingGrantComponent component: - type: SupermatterImmune + - type: StaminaDamageResistance + coefficient: 0.65 # 35% #Chief Medical Officer's Hardsuit - type: entity @@ -412,6 +424,8 @@ price: 750 - type: StealTarget stealGroup: ClothingOuterHardsuitRd + - type: StaminaDamageResistance + coefficient: 0.75 # 25% as in "shock resistance" :trollface: #Head of Security's Hardsuit - type: entity @@ -443,6 +457,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitSecurityRed + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #Luxury Mining Hardsuit - type: entity @@ -520,6 +536,8 @@ - Hardsuit - WhitelistChameleon - HidesHarpyWings + - type: StaminaDamageResistance + coefficient: 0.5 # 50% # Syndicate Medic Hardsuit - type: entity @@ -539,6 +557,8 @@ - Hardsuit - WhitelistChameleon - HidesHarpyWings + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #Syndicate Elite Hardsuit - type: entity @@ -575,6 +595,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitSyndieElite + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #Syndicate Commander Hardsuit - type: entity @@ -607,6 +629,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitSyndieCommander + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #Cybersun Juggernaut Hardsuit - type: entity @@ -639,6 +663,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitCybersun + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #Wizard Hardsuit - type: entity @@ -671,6 +697,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitWizard + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #Ling Space Suit - type: entity @@ -766,6 +794,8 @@ clothingPrototype: ClothingHeadHelmetHardsuitPirateCap - type: StaticPrice price: 0 + - type: StaminaDamageResistance + coefficient: 0.75 # 25% #CENTCOMM / ERT HARDSUITS #ERT Leader Hardsuit @@ -781,6 +811,8 @@ sprite: Clothing/OuterClothing/Hardsuits/ERTSuits/ertleader.rsi - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitERTLeader + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #ERT Chaplain Hardsuit - type: entity @@ -795,6 +827,8 @@ sprite: Clothing/OuterClothing/Hardsuits/ERTSuits/ertchaplain.rsi - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitERTChaplain + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #ERT Engineer Hardsuit - type: entity @@ -809,6 +843,8 @@ sprite: Clothing/OuterClothing/Hardsuits/ERTSuits/ertengineer.rsi - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitERTEngineer + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #ERT Medic Hardsuit - type: entity @@ -823,6 +859,8 @@ sprite: Clothing/OuterClothing/Hardsuits/ERTSuits/ertmedical.rsi - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitERTMedical + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #ERT Security Hardsuit - type: entity @@ -841,6 +879,8 @@ tags: - Hardsuit - WhitelistChameleon + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #ERT Janitor Hardsuit - type: entity @@ -855,6 +895,8 @@ sprite: Clothing/OuterClothing/Hardsuits/ERTSuits/ertjanitor.rsi - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitERTJanitor + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #Deathsquad - type: entity @@ -889,6 +931,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitDeathsquad + - type: StaminaDamageResistance + coefficient: 0.1 # 90% #CBURN Hardsuit - type: entity diff --git a/Resources/Prototypes/Traits/disabilities.yml b/Resources/Prototypes/Traits/disabilities.yml index eb96d37e01a..afdd27f339d 100644 --- a/Resources/Prototypes/Traits/disabilities.yml +++ b/Resources/Prototypes/Traits/disabilities.yml @@ -94,3 +94,17 @@ - MedicalBorg components: - type: Snoring + +- type: trait + id: BloodDeficiency + category: Physical + points: 2 + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - Borg + - MedicalBorg + components: + - type: BloodDeficiency # 0.07 = start taking bloodloss damage at around ~21.4 minutes, + bloodLossAmount: 0.07 # then become crit ~10 minutes later