diff --git a/Content.Client/Drunk/DrunkOverlay.cs b/Content.Client/Drunk/DrunkOverlay.cs index 1f26e75ffc..c806cdad66 100644 --- a/Content.Client/Drunk/DrunkOverlay.cs +++ b/Content.Client/Drunk/DrunkOverlay.cs @@ -1,5 +1,6 @@ using Content.Shared.Drunk; using Content.Shared.StatusEffect; +using Content.Shared.StatusEffectNew; using Robust.Client.Graphics; using Robust.Client.Player; using Robust.Shared.Enums; @@ -43,19 +44,21 @@ public sealed class DrunkOverlay : Overlay if (playerEntity == null) return; - if (!_entityManager.HasComponent(playerEntity) - || !_entityManager.TryGetComponent(playerEntity, out var status)) + var statusSys = _sysMan.GetEntitySystem(); + if (!statusSys.TryGetMaxTime(playerEntity.Value, out var status)) return; - var statusSys = _sysMan.GetEntitySystem(); - if (!statusSys.TryGetTime(playerEntity.Value, SharedDrunkSystem.DrunkKey, out var time, status)) - return; + var time = status.Item2; - var curTime = _timing.CurTime; - var timeLeft = (float) (time.Value.Item2 - curTime).TotalSeconds; + var power = SharedDrunkSystem.MagicNumber; + if (time != null) + { + var curTime = _timing.CurTime; + power = (float) (time - curTime).Value.TotalSeconds; + } - CurrentBoozePower += 8f * (0.5f*timeLeft - CurrentBoozePower) * args.DeltaSeconds / (timeLeft+1); + CurrentBoozePower += 8f * (power * 0.5f - CurrentBoozePower) * args.DeltaSeconds / (power+1); } protected override bool BeforeDraw(in OverlayDrawArgs args) diff --git a/Content.Client/Drunk/DrunkSystem.cs b/Content.Client/Drunk/DrunkSystem.cs index d9c6bb192f..c5fab75e7d 100644 --- a/Content.Client/Drunk/DrunkSystem.cs +++ b/Content.Client/Drunk/DrunkSystem.cs @@ -1,4 +1,5 @@ using Content.Shared.Drunk; +using Content.Shared.StatusEffectNew; using Robust.Client.Graphics; using Robust.Client.Player; using Robust.Shared.Player; @@ -16,38 +17,41 @@ public sealed class DrunkSystem : SharedDrunkSystem { base.Initialize(); - SubscribeLocalEvent(OnDrunkInit); - SubscribeLocalEvent(OnDrunkShutdown); + SubscribeLocalEvent(OnStatusApplied); + SubscribeLocalEvent(OnStatusRemoved); - SubscribeLocalEvent(OnPlayerAttached); - SubscribeLocalEvent(OnPlayerDetached); + SubscribeLocalEvent>(OnPlayerAttached); + SubscribeLocalEvent>(OnPlayerDetached); _overlay = new(); } - private void OnPlayerAttached(EntityUid uid, DrunkComponent component, LocalPlayerAttachedEvent args) + private void OnStatusApplied(Entity entity, ref StatusEffectAppliedEvent args) { - _overlayMan.AddOverlay(_overlay); + if (!_overlayMan.HasOverlay()) + _overlayMan.AddOverlay(_overlay); } - private void OnPlayerDetached(EntityUid uid, DrunkComponent component, LocalPlayerDetachedEvent args) + private void OnStatusRemoved(Entity entity, ref StatusEffectRemovedEvent args) { + if (Status.HasEffectComp(args.Target)) + return; + + if (_player.LocalEntity != args.Target) + return; + _overlay.CurrentBoozePower = 0; _overlayMan.RemoveOverlay(_overlay); } - private void OnDrunkInit(EntityUid uid, DrunkComponent component, ComponentInit args) + private void OnPlayerAttached(Entity entity, ref StatusEffectRelayedEvent args) { - if (_player.LocalEntity == uid) - _overlayMan.AddOverlay(_overlay); + _overlayMan.AddOverlay(_overlay); } - private void OnDrunkShutdown(EntityUid uid, DrunkComponent component, ComponentShutdown args) + private void OnPlayerDetached(Entity entity, ref StatusEffectRelayedEvent args) { - if (_player.LocalEntity == uid) - { - _overlay.CurrentBoozePower = 0; - _overlayMan.RemoveOverlay(_overlay); - } + _overlay.CurrentBoozePower = 0; + _overlayMan.RemoveOverlay(_overlay); } } diff --git a/Content.Server/Electrocution/ElectrocutionSystem.cs b/Content.Server/Electrocution/ElectrocutionSystem.cs index 1f04421c0f..a162b29e19 100644 --- a/Content.Server/Electrocution/ElectrocutionSystem.cs +++ b/Content.Server/Electrocution/ElectrocutionSystem.cs @@ -418,7 +418,7 @@ public sealed class ElectrocutionSystem : SharedElectrocutionSystem } } - _stuttering.DoStutter(uid, time * StutteringTimeMultiplier, refresh, statusEffects); + _stuttering.DoStutter(uid, time * StutteringTimeMultiplier, refresh); _jittering.DoJitter(uid, time * JitterTimeMultiplier, refresh, JitterAmplitude, JitterFrequency, true, statusEffects); _popup.PopupEntity(Loc.GetString("electrocuted-component-mob-shocked-popup-player"), uid, uid); diff --git a/Content.Server/Speech/Components/StutteringAccentComponent.cs b/Content.Server/Speech/Components/StutteringAccentComponent.cs index e82cd9b12b..dd65ef66e0 100644 --- a/Content.Server/Speech/Components/StutteringAccentComponent.cs +++ b/Content.Server/Speech/Components/StutteringAccentComponent.cs @@ -6,29 +6,25 @@ namespace Content.Server.Speech.Components /// /// Percentage chance that a stutter will occur if it matches. /// - [DataField("matchRandomProb")] - [ViewVariables(VVAccess.ReadWrite)] + [DataField] public float MatchRandomProb = 0.8f; /// /// Percentage chance that a stutter occurs f-f-f-f-four times. /// - [DataField("fourRandomProb")] - [ViewVariables(VVAccess.ReadWrite)] + [DataField] public float FourRandomProb = 0.1f; /// /// Percentage chance that a stutter occurs t-t-t-three times. /// - [DataField("threeRandomProb")] - [ViewVariables(VVAccess.ReadWrite)] + [DataField] public float ThreeRandomProb = 0.2f; /// /// Percentage chance that a stutter cut off. /// - [DataField("cutRandomProb")] - [ViewVariables(VVAccess.ReadWrite)] + [DataField] public float CutRandomProb = 0.05f; } } diff --git a/Content.Server/Speech/EntitySystems/SlurredSystem.cs b/Content.Server/Speech/EntitySystems/SlurredSystem.cs index 5ac1ba037f..8690079de1 100644 --- a/Content.Server/Speech/EntitySystems/SlurredSystem.cs +++ b/Content.Server/Speech/EntitySystems/SlurredSystem.cs @@ -3,8 +3,7 @@ using Content.Server.Speech.Components; using Content.Shared.Drunk; using Content.Shared.Speech; using Content.Shared.Speech.EntitySystems; -using Content.Shared.StatusEffect; -using Robust.Shared.Prototypes; +using Content.Shared.StatusEffectNew; using Robust.Shared.Random; using Robust.Shared.Timing; @@ -12,26 +11,15 @@ namespace Content.Server.Speech.EntitySystems; public sealed class SlurredSystem : SharedSlurredSystem { - [Dependency] private readonly StatusEffectsSystem _statusEffectsSystem = default!; + [Dependency] private readonly StatusEffectsSystem _status = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly IGameTiming _timing = default!; - private static readonly ProtoId SlurKey = "SlurredSpeech"; - public override void Initialize() { SubscribeLocalEvent(OnAccent); - } - public override void DoSlur(EntityUid uid, TimeSpan time, StatusEffectsComponent? status = null) - { - if (!Resolve(uid, ref status, false)) - return; - - if (!_statusEffectsSystem.HasStatusEffect(uid, SlurKey, status)) - _statusEffectsSystem.TryAddStatusEffect(uid, SlurKey, time, true, status); - else - _statusEffectsSystem.TryAddTime(uid, SlurKey, time, status); + SubscribeLocalEvent>(OnAccentRelayed); } /// @@ -39,15 +27,33 @@ public sealed class SlurredSystem : SharedSlurredSystem /// private float GetProbabilityScale(EntityUid uid) { - if (!_statusEffectsSystem.TryGetTime(uid, SharedDrunkSystem.DrunkKey, out var time)) + if (!_status.TryGetMaxTime(uid, out var time)) return 0; - var curTime = _timing.CurTime; - var timeLeft = (float) (time.Value.Item2 - curTime).TotalSeconds; - return Math.Clamp((timeLeft - 80) / 1100, 0f, 1f); + // This is a magic number. Why this value? No clue it was made 3 years before I refactored this. + var magic = SharedDrunkSystem.MagicNumber; + + if (time.Item2 != null) + { + var curTime = _timing.CurTime; + magic = (float) (time.Item2 - curTime).Value.TotalSeconds - 80f; + } + + return Math.Clamp(magic / SharedDrunkSystem.MagicNumber, 0f, 1f); } - private void OnAccent(EntityUid uid, SlurredAccentComponent component, AccentGetEvent args) + private void OnAccent(Entity entity, ref AccentGetEvent args) + { + GetAccent(entity, ref args); + } + + private void OnAccentRelayed(Entity entity, ref StatusEffectRelayedEvent args) + { + var ev = args.Args; + GetAccent(args.Args.Entity, ref ev); + } + + private void GetAccent(EntityUid uid, ref AccentGetEvent args) { var scale = GetProbabilityScale(uid); args.Message = Accentuate(args.Message, scale); diff --git a/Content.Server/Speech/EntitySystems/StutteringSystem.cs b/Content.Server/Speech/EntitySystems/StutteringSystem.cs index f47bff3523..2c78eb181e 100644 --- a/Content.Server/Speech/EntitySystems/StutteringSystem.cs +++ b/Content.Server/Speech/EntitySystems/StutteringSystem.cs @@ -3,14 +3,13 @@ using System.Text.RegularExpressions; using Content.Server.Speech.Components; using Content.Shared.Speech; using Content.Shared.Speech.EntitySystems; -using Content.Shared.StatusEffect; +using Content.Shared.StatusEffectNew; using Robust.Shared.Random; namespace Content.Server.Speech.EntitySystems { public sealed class StutteringSystem : SharedStutteringSystem { - [Dependency] private readonly StatusEffectsSystem _statusEffectsSystem = default!; [Dependency] private readonly IRobustRandom _random = default!; // Regex of characters to stutter. @@ -20,19 +19,36 @@ namespace Content.Server.Speech.EntitySystems public override void Initialize() { SubscribeLocalEvent(OnAccent); + + SubscribeLocalEvent>(OnAccent); } - public override void DoStutter(EntityUid uid, TimeSpan time, bool refresh, StatusEffectsComponent? status = null) + public override void DoStutter(EntityUid uid, TimeSpan time, bool refresh) { - if (!Resolve(uid, ref status, false)) - return; - - _statusEffectsSystem.TryAddStatusEffect(uid, StutterKey, time, refresh, status); + if (refresh) + Status.TryUpdateStatusEffectDuration(uid, Stuttering, time); + else + Status.TryAddStatusEffectDuration(uid, Stuttering, time); } - private void OnAccent(EntityUid uid, StutteringAccentComponent component, AccentGetEvent args) + public override void DoRemoveStutterTime(EntityUid uid, TimeSpan timeRemoved) { - args.Message = Accentuate(args.Message, component); + Status.TryAddTime(uid, Stuttering, -timeRemoved); + } + + public override void DoRemoveStutter(EntityUid uid) + { + Status.TryRemoveStatusEffect(uid, Stuttering); + } + + private void OnAccent(Entity entity, ref AccentGetEvent args) + { + args.Message = Accentuate(args.Message, entity.Comp); + } + + private void OnAccent(Entity entity, ref StatusEffectRelayedEvent args) + { + args.Args.Message = Accentuate(args.Args.Message, entity.Comp); } public string Accentuate(string message, StutteringAccentComponent component) diff --git a/Content.Shared/Body/Components/BloodstreamComponent.cs b/Content.Shared/Body/Components/BloodstreamComponent.cs index 0139932262..51814eaba9 100644 --- a/Content.Shared/Body/Components/BloodstreamComponent.cs +++ b/Content.Shared/Body/Components/BloodstreamComponent.cs @@ -198,12 +198,6 @@ public sealed partial class BloodstreamComponent : Component [ViewVariables] public Entity? TemporarySolution; - /// - /// Variable that stores the amount of status time added by having a low blood level. - /// - [DataField, AutoNetworkedField] - public TimeSpan StatusTime; - /// /// Alert to show when bleeding. /// diff --git a/Content.Shared/Body/Systems/SharedBloodstreamSystem.cs b/Content.Shared/Body/Systems/SharedBloodstreamSystem.cs index ac385040a9..182cdb47d3 100644 --- a/Content.Shared/Body/Systems/SharedBloodstreamSystem.cs +++ b/Content.Shared/Body/Systems/SharedBloodstreamSystem.cs @@ -6,7 +6,6 @@ using Content.Shared.Chemistry.EntitySystems; using Content.Shared.Chemistry.Reaction; using Content.Shared.Chemistry.Reagent; using Content.Shared.Damage; -using Content.Shared.Drunk; using Content.Shared.EntityEffects.Effects; using Content.Shared.FixedPoint; using Content.Shared.Fluids; @@ -16,7 +15,7 @@ using Content.Shared.Mobs.Systems; using Content.Shared.Popups; using Content.Shared.Random.Helpers; using Content.Shared.Rejuvenate; -using Content.Shared.Speech.EntitySystems; +using Content.Shared.StatusEffectNew; using Robust.Shared.Audio.Systems; using Robust.Shared.Containers; using Robust.Shared.Prototypes; @@ -27,17 +26,18 @@ namespace Content.Shared.Body.Systems; public abstract class SharedBloodstreamSystem : EntitySystem { + public static readonly EntProtoId Bloodloss = "StatusEffectBloodloss"; + [Dependency] protected readonly SharedSolutionContainerSystem SolutionContainer = default!; [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly SharedPuddleSystem _puddle = default!; + [Dependency] private readonly StatusEffectsSystem _status = default!; [Dependency] private readonly AlertsSystem _alertsSystem = default!; [Dependency] private readonly MobStateSystem _mobStateSystem = default!; [Dependency] private readonly DamageableSystem _damageableSystem = default!; - [Dependency] private readonly SharedDrunkSystem _drunkSystem = default!; - [Dependency] private readonly SharedStutteringSystem _stutteringSystem = default!; public override void Initialize() { @@ -100,15 +100,7 @@ public abstract class SharedBloodstreamSystem : EntitySystem // Apply dizziness as a symptom of bloodloss. // The effect is applied in a way that it will never be cleared without being healthy. // Multiplying by 2 is arbitrary but works for this case, it just prevents the time from running out - _drunkSystem.TryApplyDrunkenness( - uid, - (float)bloodstream.AdjustedUpdateInterval.TotalSeconds * 2, - applySlur: false); - _stutteringSystem.DoStutter(uid, bloodstream.AdjustedUpdateInterval * 2, refresh: false); - - // storing the drunk and stutter time so we can remove it independently from other effects additions - bloodstream.StatusTime += bloodstream.AdjustedUpdateInterval * 2; - DirtyField(uid, bloodstream, nameof(BloodstreamComponent.StatusTime)); + _status.TrySetStatusEffectDuration(uid, Bloodloss); } else if (!_mobStateSystem.IsDead(uid)) { @@ -118,12 +110,7 @@ public abstract class SharedBloodstreamSystem : EntitySystem bloodstream.BloodlossHealDamage * bloodPercentage, ignoreResistances: true, interruptsDoAfters: false); - // Remove the drunk effect when healthy. Should only remove the amount of drunk and stutter added by low blood level - _drunkSystem.TryRemoveDrunkenessTime(uid, bloodstream.StatusTime.TotalSeconds); - _stutteringSystem.DoRemoveStutterTime(uid, bloodstream.StatusTime.TotalSeconds); - // Reset the drunk and stutter time to zero - bloodstream.StatusTime = TimeSpan.Zero; - DirtyField(uid, bloodstream, nameof(BloodstreamComponent.StatusTime)); + _status.TryRemoveStatusEffect(uid, Bloodloss); } } } diff --git a/Content.Shared/Drunk/DrunkComponent.cs b/Content.Shared/Drunk/DrunkComponent.cs deleted file mode 100644 index 61c195d27e..0000000000 --- a/Content.Shared/Drunk/DrunkComponent.cs +++ /dev/null @@ -1,6 +0,0 @@ -using Robust.Shared.GameStates; - -namespace Content.Shared.Drunk; - -[RegisterComponent, NetworkedComponent] -public sealed partial class DrunkComponent : Component { } diff --git a/Content.Shared/Drunk/DrunkStatusEffectComponent.cs b/Content.Shared/Drunk/DrunkStatusEffectComponent.cs new file mode 100644 index 0000000000..69ad7c3ad9 --- /dev/null +++ b/Content.Shared/Drunk/DrunkStatusEffectComponent.cs @@ -0,0 +1,11 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Drunk; + +/// +/// This is used by a status effect entity to apply the to an entity. +/// +[RegisterComponent, NetworkedComponent] +public sealed partial class DrunkStatusEffectComponent : Component +{ +} diff --git a/Content.Shared/Drunk/DrunkSystem.cs b/Content.Shared/Drunk/DrunkSystem.cs deleted file mode 100644 index 236ce2dcd3..0000000000 --- a/Content.Shared/Drunk/DrunkSystem.cs +++ /dev/null @@ -1,48 +0,0 @@ -using Content.Shared.Speech.EntitySystems; -using Content.Shared.StatusEffect; -using Content.Shared.Traits.Assorted; -using Robust.Shared.Prototypes; - -namespace Content.Shared.Drunk; - -public abstract class SharedDrunkSystem : EntitySystem -{ - public static readonly ProtoId DrunkKey = "Drunk"; - - [Dependency] private readonly StatusEffectsSystem _statusEffectsSystem = default!; - [Dependency] private readonly SharedSlurredSystem _slurredSystem = default!; - - public void TryApplyDrunkenness(EntityUid uid, float boozePower, bool applySlur = true, - StatusEffectsComponent? status = null) - { - if (!Resolve(uid, ref status, false)) - return; - - if (TryComp(uid, out var trait)) - boozePower *= trait.BoozeStrengthMultiplier; - - if (applySlur) - { - _slurredSystem.DoSlur(uid, TimeSpan.FromSeconds(boozePower), status); - } - - if (!_statusEffectsSystem.HasStatusEffect(uid, DrunkKey, status)) - { - _statusEffectsSystem.TryAddStatusEffect(uid, DrunkKey, TimeSpan.FromSeconds(boozePower), true, status); - } - else - { - _statusEffectsSystem.TryAddTime(uid, DrunkKey, TimeSpan.FromSeconds(boozePower), status); - } - } - - public void TryRemoveDrunkenness(EntityUid uid) - { - _statusEffectsSystem.TryRemoveStatusEffect(uid, DrunkKey); - } - public void TryRemoveDrunkenessTime(EntityUid uid, double timeRemoved) - { - _statusEffectsSystem.TryRemoveTime(uid, DrunkKey, TimeSpan.FromSeconds(timeRemoved)); - } - -} diff --git a/Content.Shared/Drunk/SharedDrunkSystem.cs b/Content.Shared/Drunk/SharedDrunkSystem.cs new file mode 100644 index 0000000000..96aff82fa0 --- /dev/null +++ b/Content.Shared/Drunk/SharedDrunkSystem.cs @@ -0,0 +1,50 @@ +using Content.Shared.Speech.EntitySystems; +using Content.Shared.StatusEffectNew; +using Content.Shared.Traits.Assorted; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Drunk; + +public abstract class SharedDrunkSystem : EntitySystem +{ + public static EntProtoId Drunk = "StatusEffectDrunk"; + public static EntProtoId Woozy = "StatusEffectWoozy"; + + /* I have no clue why this magic number was chosen, I copied it from slur system and needed it for the overlay + If you have a more intelligent magic number be my guest to completely explode this value. + There were no comments as to why this value was chosen three years ago. */ + public static float MagicNumber = 1100f; + + [Dependency] protected readonly StatusEffectsSystem Status = default!; + + public override void Initialize() + { + SubscribeLocalEvent(OnLightweightDrinking); + } + + public void TryApplyDrunkenness(EntityUid uid, TimeSpan boozePower) + { + var ev = new DrunkEvent(boozePower); + RaiseLocalEvent(uid, ref ev); + + Status.TryAddStatusEffectDuration(uid, Drunk, ev.Duration); + } + + public void TryRemoveDrunkenness(EntityUid uid) + { + Status.TryRemoveStatusEffect(uid, Drunk); + } + + public void TryRemoveDrunkennessTime(EntityUid uid, TimeSpan boozePower) + { + Status.TryAddTime(uid, Drunk, - boozePower); + } + + private void OnLightweightDrinking(Entity entity, ref DrunkEvent args) + { + args.Duration *= entity.Comp.BoozeStrengthMultiplier; + } + + [ByRefEvent] + public record struct DrunkEvent(TimeSpan Duration); +} diff --git a/Content.Shared/EntityEffects/Effects/Drunk.cs b/Content.Shared/EntityEffects/Effects/Drunk.cs index 5f7f29c342..aa15df8f3d 100644 --- a/Content.Shared/EntityEffects/Effects/Drunk.cs +++ b/Content.Shared/EntityEffects/Effects/Drunk.cs @@ -9,13 +9,7 @@ public sealed partial class Drunk : EntityEffect /// BoozePower is how long each metabolism cycle will make the drunk effect last for. /// [DataField] - public float BoozePower = 3f; - - /// - /// Whether speech should be slurred. - /// - [DataField] - public bool SlurSpeech = true; + public TimeSpan BoozePower = TimeSpan.FromSeconds(3f); protected override string? ReagentEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys) => Loc.GetString("reagent-effect-guidebook-drunk", ("chance", Probability)); @@ -24,11 +18,10 @@ public sealed partial class Drunk : EntityEffect { var boozePower = BoozePower; - if (args is EntityEffectReagentArgs reagentArgs) { + if (args is EntityEffectReagentArgs reagentArgs) boozePower *= reagentArgs.Scale.Float(); - } var drunkSys = args.EntityManager.EntitySysManager.GetEntitySystem(); - drunkSys.TryApplyDrunkenness(args.TargetEntity, boozePower, SlurSpeech); + drunkSys.TryApplyDrunkenness(args.TargetEntity, boozePower); } } diff --git a/Content.Shared/Speech/EntitySystems/SharedSlurredSystem.cs b/Content.Shared/Speech/EntitySystems/SharedSlurredSystem.cs index 8718e054ba..aadda6aa09 100644 --- a/Content.Shared/Speech/EntitySystems/SharedSlurredSystem.cs +++ b/Content.Shared/Speech/EntitySystems/SharedSlurredSystem.cs @@ -1,8 +1,11 @@ using Content.Shared.StatusEffect; +using Robust.Shared.Prototypes; namespace Content.Shared.Speech.EntitySystems; public abstract class SharedSlurredSystem : EntitySystem { + public static readonly EntProtoId Stutter = "StatusEffectSlurred"; + public virtual void DoSlur(EntityUid uid, TimeSpan time, StatusEffectsComponent? status = null) { } } diff --git a/Content.Shared/Speech/EntitySystems/SharedStutteringSystem.cs b/Content.Shared/Speech/EntitySystems/SharedStutteringSystem.cs index 05358a04bb..90cd8bc4de 100644 --- a/Content.Shared/Speech/EntitySystems/SharedStutteringSystem.cs +++ b/Content.Shared/Speech/EntitySystems/SharedStutteringSystem.cs @@ -1,26 +1,24 @@ -using Content.Shared.StatusEffect; +using Content.Shared.StatusEffectNew; using Robust.Shared.Prototypes; namespace Content.Shared.Speech.EntitySystems; public abstract class SharedStutteringSystem : EntitySystem { - public static readonly ProtoId StutterKey = "Stutter"; + public static readonly EntProtoId Stuttering = "StatusEffectStutter"; - [Dependency] private readonly StatusEffectsSystem _statusEffectsSystem = default!; + [Dependency] protected readonly StatusEffectsSystem Status = default!; // For code in shared... I imagine we ain't getting accent prediction anytime soon so let's not bother. - public virtual void DoStutter(EntityUid uid, TimeSpan time, bool refresh, StatusEffectsComponent? status = null) + public virtual void DoStutter(EntityUid uid, TimeSpan time, bool refresh) { } - public virtual void DoRemoveStutterTime(EntityUid uid, double timeRemoved) + public virtual void DoRemoveStutterTime(EntityUid uid, TimeSpan timeRemoved) { - _statusEffectsSystem.TryRemoveTime(uid, StutterKey, TimeSpan.FromSeconds(timeRemoved)); } - public void DoRemoveStutter(EntityUid uid, double timeRemoved) + public virtual void DoRemoveStutter(EntityUid uid) { - _statusEffectsSystem.TryRemoveStatusEffect(uid, StutterKey); } } diff --git a/Content.Shared/StatusEffectNew/Components/StatusEffectComponent.cs b/Content.Shared/StatusEffectNew/Components/StatusEffectComponent.cs index 25f40718e9..67ff8b3e61 100644 --- a/Content.Shared/StatusEffectNew/Components/StatusEffectComponent.cs +++ b/Content.Shared/StatusEffectNew/Components/StatusEffectComponent.cs @@ -1,4 +1,3 @@ -using Content.Shared.Alert; using Content.Shared.Whitelist; using Robust.Shared.GameStates; using Robust.Shared.Prototypes; diff --git a/Content.Shared/StatusEffectNew/StatusEffectSystem.Relay.cs b/Content.Shared/StatusEffectNew/StatusEffectSystem.Relay.cs index 0c4c5cf1f7..3644bed45e 100644 --- a/Content.Shared/StatusEffectNew/StatusEffectSystem.Relay.cs +++ b/Content.Shared/StatusEffectNew/StatusEffectSystem.Relay.cs @@ -1,6 +1,7 @@ using Content.Shared.Movement.Events; using Content.Shared.Movement.Systems; using Content.Shared.Rejuvenate; +using Content.Shared.Speech; using Content.Shared.StatusEffectNew.Components; using Content.Shared.Stunnable; using Robust.Shared.Player; @@ -23,6 +24,8 @@ public sealed partial class StatusEffectsSystem SubscribeLocalEvent(RefRelayStatusEffectEvent); SubscribeLocalEvent(RefRelayStatusEffectEvent); + + SubscribeLocalEvent(RelayStatusEffectEvent); } private void RefRelayStatusEffectEvent(EntityUid uid, StatusEffectContainerComponent component, ref T args) where T : struct diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/asteroid.yml b/Resources/Prototypes/Entities/Mobs/NPCs/asteroid.yml index d2dd761468..909e11e21f 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/asteroid.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/asteroid.yml @@ -19,7 +19,6 @@ group: GenericNumber - type: StatusEffects allowed: - - Stutter - Electrocution - TemporaryBlindness - RadiationProtection diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/elemental.yml b/Resources/Prototypes/Entities/Mobs/NPCs/elemental.yml index ba4c5e3698..eba25717f3 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/elemental.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/elemental.yml @@ -35,7 +35,6 @@ bodyType: KinematicController # Same for all inheritors - type: StatusEffects allowed: - - Stutter - Electrocution - type: Pullable - type: Tag diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml b/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml index 279dbe9f54..fd700d7a4c 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml @@ -15,7 +15,6 @@ bodyType: KinematicController # Same for all inheritors - type: StatusEffects allowed: - - Stutter - Electrocution - type: Repairable doAfterDelay: 8 diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml b/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml index 11c0f0d21d..4090138b57 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml @@ -19,7 +19,6 @@ baseSprintSpeed : 4 - type: StatusEffects allowed: - - Stutter - Electrocution - TemporaryBlindness - Pacified @@ -93,7 +92,6 @@ baseDecayRate: 0.04 - type: StatusEffects allowed: - - Stutter - Electrocution - TemporaryBlindness - Pacified diff --git a/Resources/Prototypes/Entities/Mobs/Player/dragon.yml b/Resources/Prototypes/Entities/Mobs/Player/dragon.yml index b6b344d6b5..441751a80b 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/dragon.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/dragon.yml @@ -100,7 +100,6 @@ types: {} - type: StatusEffects # Overwriting basesimplemob to remove flash, getting flashed as dragon just feelsbad allowed: - - Stutter - Electrocution - TemporaryBlindness - Pacified diff --git a/Resources/Prototypes/Entities/Mobs/Species/base.yml b/Resources/Prototypes/Entities/Mobs/Species/base.yml index 10c39ed7a0..3bb43c26cb 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/base.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/base.yml @@ -120,10 +120,7 @@ - !type:WashCreamPieReaction - type: StatusEffects allowed: - - Stutter - Electrocution - - Drunk - - SlurredSpeech - RatvarianLanguage - PressureImmunity - Muted diff --git a/Resources/Prototypes/Entities/StatusEffects/body.yml b/Resources/Prototypes/Entities/StatusEffects/body.yml new file mode 100644 index 0000000000..3765ebefd4 --- /dev/null +++ b/Resources/Prototypes/Entities/StatusEffects/body.yml @@ -0,0 +1,18 @@ +- type: entity + parent: MobStatusEffectBase + id: BloodstreamStatusEffectBase + abstract: true + components: + - type: StatusEffect + whitelist: + components: + - Bloodstream + +- type: entity + parent: [ BloodstreamStatusEffectBase ] + id: StatusEffectBloodloss + name: bloodloss + components: + - type: StutteringAccent + - type: DrunkStatusEffect + - type: RejuvenateRemovedStatusEffect diff --git a/Resources/Prototypes/Entities/StatusEffects/misc.yml b/Resources/Prototypes/Entities/StatusEffects/misc.yml index 3ce81081c0..14c6b5b649 100644 --- a/Resources/Prototypes/Entities/StatusEffects/misc.yml +++ b/Resources/Prototypes/Entities/StatusEffects/misc.yml @@ -78,3 +78,17 @@ name: hallucinations components: - type: SeeingRainbowsStatusEffect + +# Causes your vision to become blurry and gives me a headache. +- type: entity + parent: MobStatusEffectDebuff + id: StatusEffectWoozy + name: woozy + components: + - type: DrunkStatusEffect + +# Causes you to get drunk +- type: entity + parent: [ StatusEffectWoozy, StatusEffectSlurred ] + id: StatusEffectDrunk + name: drunk diff --git a/Resources/Prototypes/Entities/StatusEffects/speech.yml b/Resources/Prototypes/Entities/StatusEffects/speech.yml new file mode 100644 index 0000000000..17e533b1a8 --- /dev/null +++ b/Resources/Prototypes/Entities/StatusEffects/speech.yml @@ -0,0 +1,27 @@ +- type: entity + parent: MobStatusEffectDebuff + id: SpeechStatusEffectBase + abstract: true + components: + - type: StatusEffect + whitelist: + components: + - MobState + - Speech + requireAll: true + +# Causes you to st-t-u-t-t-t-er randomly when talking. +- type: entity + parent: SpeechStatusEffectBase + id: StatusEffectStutter + name: stutter + components: + - type: StutteringAccent + +# Causes you to schlur your words schwhen talking. +- type: entity + parent: SpeechStatusEffectBase + id: StatusEffectSlurred + name: slurred + components: + - type: SlurredAccent diff --git a/Resources/Prototypes/Reagents/medicine.yml b/Resources/Prototypes/Reagents/medicine.yml index 6ac69c84eb..f0a11706b0 100644 --- a/Resources/Prototypes/Reagents/medicine.yml +++ b/Resources/Prototypes/Reagents/medicine.yml @@ -12,9 +12,9 @@ - !type:GenericStatusEffect key: Stutter component: ScrambledAccent - - !type:Drunk - slurSpeech: false - boozePower: 20 + - !type:ModifyStatusEffect + effectProto: StatusEffectSlurred + time: 20.0 - type: reagent id: Dylovene @@ -104,8 +104,8 @@ metabolisms: Medicine: effects: - - !type:GenericStatusEffect - key: Drunk + - !type:ModifyStatusEffect + effectProto: StatusEffectDrunk time: 6.0 type: Remove - !type:HealthChange @@ -1353,8 +1353,8 @@ key: Jitter time: 2.0 type: Remove - - !type:GenericStatusEffect - key: Drunk + - !type:ModifyStatusEffect + effectProto: StatusEffectDrunk time: 6.0 type: Remove - !type:PopupMessage # we dont have sanity/mood so this will have to do