diff --git a/Content.Server/Disease/DiseaseSystem.cs b/Content.Server/Disease/DiseaseSystem.cs index f55ee6b03da5..98d85a4347f6 100644 --- a/Content.Server/Disease/DiseaseSystem.cs +++ b/Content.Server/Disease/DiseaseSystem.cs @@ -115,7 +115,9 @@ public override void Update(float frameTime) { foreach (var effect in disease.Effects) { - if (_random.Prob(effect.Probability)) + if (disease.DiseaseSeverity <= effect.MaxSeverity + && disease.DiseaseSeverity >= effect.MinSeverity + && _random.Prob(effect.Probability)) effect.Effect(args); } } diff --git a/Content.Server/Disease/Effects/DiseaseAddComp.cs b/Content.Server/Disease/Effects/DiseaseAddComp.cs new file mode 100644 index 000000000000..0746d03071e6 --- /dev/null +++ b/Content.Server/Disease/Effects/DiseaseAddComp.cs @@ -0,0 +1,22 @@ +using Content.Shared.Disease; +using JetBrains.Annotations; + +namespace Content.Server.Disease.Effects; + +[UsedImplicitly] +public sealed class DiseaseAddComp : DiseaseEffect +{ + [DataField("comp")] + public string? Comp = null; + public override void Effect(DiseaseEffectArgs args) + { + if (Comp == null) return; + + EntityUid uid = args.DiseasedEntity; + Component newComponent = (Component) IoCManager.Resolve().GetComponent(Comp); + newComponent.Owner = uid; + + if (!args.EntityManager.HasComponent(uid, newComponent.GetType())) + args.EntityManager.AddComponent(uid, newComponent); + } +} diff --git a/Content.Shared/Disease/DiseaseEffect.cs b/Content.Shared/Disease/DiseaseEffect.cs index bc40bfc978c1..63e5556a54dd 100644 --- a/Content.Shared/Disease/DiseaseEffect.cs +++ b/Content.Shared/Disease/DiseaseEffect.cs @@ -1,4 +1,5 @@ using JetBrains.Annotations; +using Robust.Shared.Utility; namespace Content.Shared.Disease { @@ -15,6 +16,38 @@ public abstract class DiseaseEffect /// What effect the disease will have. /// public abstract void Effect(DiseaseEffectArgs args); + + /// + /// What is the minimal severity needed for this effect to occur? + /// + [DataField("minSeverity")] + public float MinSeverity + { + get => _minSeverity; + set + { + DebugTools.Assert(value > 1f || value < 0f ,"MinSeverity have been attempted to be set out of range"); + _minSeverity = Math.Clamp(value, 0.0f, 1.0f); + } + } + + private float _minSeverity = 0.0f; + + /// + /// What is the maximum severity that this effect can occur? + /// + [DataField("maxSeverity")] + public float MaxSeverity + { + get => _maxSeverity; + set + { + DebugTools.Assert(value > 1f || value < 0f ,"MaxSeverity have been attempted to be set out of range"); + _maxSeverity = Math.Clamp(value, 0.0f, 1.0f); + } + } + + private float _maxSeverity = 1.0f; } /// /// What you have to work with in any disease effect/cure. diff --git a/Content.Shared/Disease/DiseasePrototype.cs b/Content.Shared/Disease/DiseasePrototype.cs index c846f563430e..daea932c483b 100644 --- a/Content.Shared/Disease/DiseasePrototype.cs +++ b/Content.Shared/Disease/DiseasePrototype.cs @@ -36,6 +36,17 @@ public sealed class DiseasePrototype : IPrototype, IInheritingPrototype /// it needs something to control its tickrate /// public float Accumulator = 0f; + + /// + /// This controls the progression of the disease, used to stage disease effects + /// + [ViewVariables(VVAccess.ReadWrite)] + public float DiseaseSeverity + { + get => _diseaseServerity; + set => _diseaseServerity = Math.Clamp(value, 0f, 1f); + } + private float _diseaseServerity = 0f; /// /// List of effects the disease has that will /// run every second (by default anyway)