diff --git a/Content.Server/Body/Systems/MetabolizerSystem.cs b/Content.Server/Body/Systems/MetabolizerSystem.cs index 2c6c93fcbe..144f4987fb 100644 --- a/Content.Server/Body/Systems/MetabolizerSystem.cs +++ b/Content.Server/Body/Systems/MetabolizerSystem.cs @@ -152,10 +152,13 @@ namespace Content.Server.Body.Systems if (entry.MetabolismRate > mostToRemove) mostToRemove = entry.MetabolismRate; + mostToRemove *= group.MetabolismRateModifier; mostToRemove = FixedPoint2.Clamp(mostToRemove, 0, reagent.Quantity); + float scale = (float) mostToRemove / (float) entry.MetabolismRate; + // if it's possible for them to be dead, and they are, // then we shouldn't process any effects, but should probably // still remove reagents @@ -167,7 +170,7 @@ namespace Content.Server.Body.Systems var actualEntity = organ?.Body ?? solutionEntityUid.Value; var args = new ReagentEffectArgs(actualEntity, (meta).Owner, solution, proto, mostToRemove, - EntityManager, null, entry); + EntityManager, null, scale); // do all effects, if conditions apply foreach (var effect in entry.Effects) diff --git a/Content.Server/Chemistry/ReagentEffects/AdjustReagent.cs b/Content.Server/Chemistry/ReagentEffects/AdjustReagent.cs index fb0fa48e65..7e716928ec 100644 --- a/Content.Server/Chemistry/ReagentEffects/AdjustReagent.cs +++ b/Content.Server/Chemistry/ReagentEffects/AdjustReagent.cs @@ -32,12 +32,16 @@ namespace Content.Server.Chemistry.ReagentEffects if (args.Source != null) { var solutionSys = args.EntityManager.EntitySysManager.GetEntitySystem(); + var amount = Amount; + + amount *= args.Scale; + if (Reagent != null) { - if (Amount < 0 && args.Source.ContainsReagent(Reagent)) - solutionSys.TryRemoveReagent(args.SolutionEntity, args.Source, Reagent, -Amount); - if (Amount > 0) - solutionSys.TryAddReagent(args.SolutionEntity, args.Source, Reagent, Amount, out _); + if (amount < 0 && args.Source.ContainsReagent(Reagent)) + solutionSys.TryRemoveReagent(args.SolutionEntity, args.Source, Reagent, -amount); + if (amount > 0) + solutionSys.TryAddReagent(args.SolutionEntity, args.Source, Reagent, amount, out _); } else if (Group != null) { @@ -47,10 +51,10 @@ namespace Content.Server.Chemistry.ReagentEffects var proto = prototypeMan.Index(quant.ReagentId); if (proto.Metabolisms != null && proto.Metabolisms.ContainsKey(Group)) { - if (Amount < 0) - solutionSys.TryRemoveReagent(args.SolutionEntity, args.Source, quant.ReagentId, Amount); - if (Amount > 0) - solutionSys.TryAddReagent(args.SolutionEntity, args.Source, quant.ReagentId, Amount, out _); + if (amount < 0) + solutionSys.TryRemoveReagent(args.SolutionEntity, args.Source, quant.ReagentId, amount); + if (amount > 0) + solutionSys.TryAddReagent(args.SolutionEntity, args.Source, quant.ReagentId, amount, out _); } } } diff --git a/Content.Server/Chemistry/ReagentEffects/AdjustTemperature.cs b/Content.Server/Chemistry/ReagentEffects/AdjustTemperature.cs index 81a0ddcbda..45c07fa2a3 100644 --- a/Content.Server/Chemistry/ReagentEffects/AdjustTemperature.cs +++ b/Content.Server/Chemistry/ReagentEffects/AdjustTemperature.cs @@ -14,7 +14,11 @@ namespace Content.Server.Chemistry.ReagentEffects if (args.EntityManager.TryGetComponent(args.SolutionEntity, out TemperatureComponent? temp)) { var sys = args.EntityManager.EntitySysManager.GetEntitySystem(); - sys.ChangeHeat(args.SolutionEntity, Amount, true, temp); + var amount = Amount; + + amount *= args.Scale; + + sys.ChangeHeat(args.SolutionEntity, amount, true, temp); } } } diff --git a/Content.Server/Chemistry/ReagentEffects/ChemCauseDisease.cs b/Content.Server/Chemistry/ReagentEffects/ChemCauseDisease.cs index 360cab1e92..c5d908a79b 100644 --- a/Content.Server/Chemistry/ReagentEffects/ChemCauseDisease.cs +++ b/Content.Server/Chemistry/ReagentEffects/ChemCauseDisease.cs @@ -27,6 +27,9 @@ namespace Content.Server.Chemistry.ReagentEffects public override void Effect(ReagentEffectArgs args) { + if (args.Scale != 1f) + return; + EntitySystem.Get().TryAddDisease(args.SolutionEntity, Disease); } } diff --git a/Content.Server/Chemistry/ReagentEffects/ChemCauseRandomDisease.cs b/Content.Server/Chemistry/ReagentEffects/ChemCauseRandomDisease.cs index c53796dd94..877f8d6e94 100644 --- a/Content.Server/Chemistry/ReagentEffects/ChemCauseRandomDisease.cs +++ b/Content.Server/Chemistry/ReagentEffects/ChemCauseRandomDisease.cs @@ -24,6 +24,9 @@ namespace Content.Server.Chemistry.ReagentEffects if (args.EntityManager.TryGetComponent(args.SolutionEntity, out var diseased)) return; + if (args.Scale != 1f) + return; + var random = IoCManager.Resolve(); EntitySystem.Get().TryAddDisease(args.SolutionEntity, random.Pick(Diseases)); diff --git a/Content.Server/Chemistry/ReagentEffects/ChemCleanBoodstream.cs b/Content.Server/Chemistry/ReagentEffects/ChemCleanBoodstream.cs index 80f4480acd..c8027ec2c5 100644 --- a/Content.Server/Chemistry/ReagentEffects/ChemCleanBoodstream.cs +++ b/Content.Server/Chemistry/ReagentEffects/ChemCleanBoodstream.cs @@ -17,8 +17,12 @@ namespace Content.Server.Chemistry.ReactionEffects if (args.Source == null) return; + var cleanseRate = CleanseRate; + + cleanseRate *= args.Scale; + var bloodstreamSys = EntitySystem.Get(); - bloodstreamSys.FlushChemicals(args.SolutionEntity, args.Reagent.ID, CleanseRate); + bloodstreamSys.FlushChemicals(args.SolutionEntity, args.Reagent.ID, cleanseRate); } } } diff --git a/Content.Server/Chemistry/ReagentEffects/ChemCureDisease.cs b/Content.Server/Chemistry/ReagentEffects/ChemCureDisease.cs index 3f34d9c254..0c2dcb4a44 100644 --- a/Content.Server/Chemistry/ReagentEffects/ChemCureDisease.cs +++ b/Content.Server/Chemistry/ReagentEffects/ChemCureDisease.cs @@ -18,7 +18,11 @@ namespace Content.Server.Chemistry.ReagentEffects public override void Effect(ReagentEffectArgs args) { - var ev = new CureDiseaseAttemptEvent(CureChance); + var cureChance = CureChance; + + cureChance *= args.Scale; + + var ev = new CureDiseaseAttemptEvent(cureChance); args.EntityManager.EventBus.RaiseLocalEvent(args.SolutionEntity, ev, false); } } diff --git a/Content.Server/Chemistry/ReagentEffects/ChemHealEyeDamage.cs b/Content.Server/Chemistry/ReagentEffects/ChemHealEyeDamage.cs index 24cb696874..fb6d648402 100644 --- a/Content.Server/Chemistry/ReagentEffects/ChemHealEyeDamage.cs +++ b/Content.Server/Chemistry/ReagentEffects/ChemHealEyeDamage.cs @@ -18,6 +18,9 @@ namespace Content.Server.Chemistry.ReagentEffects public override void Effect(ReagentEffectArgs args) { + if (args.Scale != 1f) + return; + args.EntityManager.EntitySysManager.GetEntitySystem().AdjustEyeDamage(args.SolutionEntity, Amount); } } diff --git a/Content.Server/Chemistry/ReagentEffects/ChemMiasmaPoolSource.cs b/Content.Server/Chemistry/ReagentEffects/ChemMiasmaPoolSource.cs index f964a1be9e..dc8a8bfa39 100644 --- a/Content.Server/Chemistry/ReagentEffects/ChemMiasmaPoolSource.cs +++ b/Content.Server/Chemistry/ReagentEffects/ChemMiasmaPoolSource.cs @@ -15,6 +15,9 @@ namespace Content.Server.Chemistry.ReagentEffects { public override void Effect(ReagentEffectArgs args) { + if (args.Scale != 1f) + return; + string disease = EntitySystem.Get().RequestPoolDisease(); EntitySystem.Get().TryAddDisease(args.SolutionEntity, disease); diff --git a/Content.Server/Chemistry/ReagentEffects/ChemVomit.cs b/Content.Server/Chemistry/ReagentEffects/ChemVomit.cs index d53d14e782..8e923e06bf 100644 --- a/Content.Server/Chemistry/ReagentEffects/ChemVomit.cs +++ b/Content.Server/Chemistry/ReagentEffects/ChemVomit.cs @@ -19,6 +19,9 @@ namespace Content.Server.Chemistry.ReagentEffects public override void Effect(ReagentEffectArgs args) { + if (args.Scale != 1f) + return; + var vomitSys = args.EntityManager.EntitySysManager.GetEntitySystem(); vomitSys.Vomit(args.SolutionEntity, ThirstAmount, HungerAmount); diff --git a/Content.Server/Chemistry/ReagentEffects/Drunk.cs b/Content.Server/Chemistry/ReagentEffects/Drunk.cs index 36702c42b9..d844d43d2e 100644 --- a/Content.Server/Chemistry/ReagentEffects/Drunk.cs +++ b/Content.Server/Chemistry/ReagentEffects/Drunk.cs @@ -19,7 +19,11 @@ public sealed class Drunk : ReagentEffect public override void Effect(ReagentEffectArgs args) { + var boozePower = BoozePower; + + boozePower *= args.Scale; + var drunkSys = args.EntityManager.EntitySysManager.GetEntitySystem(); - drunkSys.TryApplyDrunkenness(args.SolutionEntity, BoozePower, SlurSpeech); + drunkSys.TryApplyDrunkenness(args.SolutionEntity, boozePower, SlurSpeech); } } diff --git a/Content.Server/Chemistry/ReagentEffects/HealthChange.cs b/Content.Server/Chemistry/ReagentEffects/HealthChange.cs index b18ecdefde..ec5ffa32ab 100644 --- a/Content.Server/Chemistry/ReagentEffects/HealthChange.cs +++ b/Content.Server/Chemistry/ReagentEffects/HealthChange.cs @@ -34,8 +34,8 @@ namespace Content.Server.Chemistry.ReagentEffects public override void Effect(ReagentEffectArgs args) { var scale = ScaleByQuantity ? args.Quantity : FixedPoint2.New(1); - if (args.MetabolismEffects != null) - scale *= (args.Quantity / args.MetabolismEffects.MetabolismRate); + scale *= args.Scale; + EntitySystem.Get().TryChangeDamage(args.SolutionEntity, Damage * scale, IgnoreResistances); } } diff --git a/Content.Server/Chemistry/ReagentEffects/ModifyBleedAmount.cs b/Content.Server/Chemistry/ReagentEffects/ModifyBleedAmount.cs index 468cbddbba..a80a4d8868 100644 --- a/Content.Server/Chemistry/ReagentEffects/ModifyBleedAmount.cs +++ b/Content.Server/Chemistry/ReagentEffects/ModifyBleedAmount.cs @@ -18,6 +18,8 @@ public sealed class ModifyBleedAmount : ReagentEffect { var sys = EntitySystem.Get(); var amt = Scaled ? Amount * args.Quantity.Float() : Amount; + amt *= args.Scale; + sys.TryModifyBleedAmount(args.SolutionEntity, amt, blood); } } diff --git a/Content.Server/Chemistry/ReagentEffects/ModifyBloodLevel.cs b/Content.Server/Chemistry/ReagentEffects/ModifyBloodLevel.cs index 5b0ffe5c40..f5125fcce3 100644 --- a/Content.Server/Chemistry/ReagentEffects/ModifyBloodLevel.cs +++ b/Content.Server/Chemistry/ReagentEffects/ModifyBloodLevel.cs @@ -19,6 +19,8 @@ public sealed class ModifyBloodLevel : ReagentEffect { var sys = EntitySystem.Get(); var amt = Scaled ? Amount * args.Quantity : Amount; + amt *= args.Scale; + sys.TryModifyBloodLevel(args.SolutionEntity, amt, blood); } } diff --git a/Content.Server/Chemistry/ReagentEffects/MovespeedModifier.cs b/Content.Server/Chemistry/ReagentEffects/MovespeedModifier.cs index b779255f88..9026c03a60 100644 --- a/Content.Server/Chemistry/ReagentEffects/MovespeedModifier.cs +++ b/Content.Server/Chemistry/ReagentEffects/MovespeedModifier.cs @@ -43,7 +43,11 @@ namespace Content.Server.Chemistry.ReagentEffects status.WalkSpeedModifier = WalkSpeedModifier; status.SprintSpeedModifier = SprintSpeedModifier; - IncreaseTimer(status, StatusLifetime); + // only going to scale application time + var statusLifetime = StatusLifetime; + statusLifetime *= args.Scale; + + IncreaseTimer(status, statusLifetime); if (modified) EntitySystem.Get().RefreshMovementSpeedModifiers(args.SolutionEntity); diff --git a/Content.Server/Chemistry/ReagentEffects/Paralyze.cs b/Content.Server/Chemistry/ReagentEffects/Paralyze.cs index 0e4d78c015..60ffe022f1 100644 --- a/Content.Server/Chemistry/ReagentEffects/Paralyze.cs +++ b/Content.Server/Chemistry/ReagentEffects/Paralyze.cs @@ -14,7 +14,10 @@ public sealed class Paralyze : ReagentEffect public override void Effect(ReagentEffectArgs args) { - EntitySystem.Get().TryParalyze(args.SolutionEntity, TimeSpan.FromSeconds(ParalyzeTime), Refresh); + var paralyzeTime = ParalyzeTime; + paralyzeTime *= args.Scale; + + EntitySystem.Get().TryParalyze(args.SolutionEntity, TimeSpan.FromSeconds(paralyzeTime), Refresh); } } diff --git a/Content.Server/Chemistry/ReagentEffects/StatusEffects/GenericStatusEffect.cs b/Content.Server/Chemistry/ReagentEffects/StatusEffects/GenericStatusEffect.cs index 668686af8e..8727ae2511 100644 --- a/Content.Server/Chemistry/ReagentEffects/StatusEffects/GenericStatusEffect.cs +++ b/Content.Server/Chemistry/ReagentEffects/StatusEffects/GenericStatusEffect.cs @@ -40,17 +40,21 @@ namespace Content.Server.Chemistry.ReagentEffects.StatusEffects public override void Effect(ReagentEffectArgs args) { var statusSys = args.EntityManager.EntitySysManager.GetEntitySystem(); + + var time = Time; + time *= args.Scale; + if (Type == StatusEffectMetabolismType.Add && Component != String.Empty) { - statusSys.TryAddStatusEffect(args.SolutionEntity, Key, TimeSpan.FromSeconds(Time), Refresh, Component); + statusSys.TryAddStatusEffect(args.SolutionEntity, Key, TimeSpan.FromSeconds(time), Refresh, Component); } else if (Type == StatusEffectMetabolismType.Remove) { - statusSys.TryRemoveTime(args.SolutionEntity, Key, TimeSpan.FromSeconds(Time)); + statusSys.TryRemoveTime(args.SolutionEntity, Key, TimeSpan.FromSeconds(time)); } else if (Type == StatusEffectMetabolismType.Set) { - statusSys.TrySetTime(args.SolutionEntity, Key, TimeSpan.FromSeconds(Time)); + statusSys.TrySetTime(args.SolutionEntity, Key, TimeSpan.FromSeconds(time)); } } } diff --git a/Content.Server/Chemistry/ReagentEffects/StatusEffects/Jitter.cs b/Content.Server/Chemistry/ReagentEffects/StatusEffects/Jitter.cs index a6aa96af79..bd060c439a 100644 --- a/Content.Server/Chemistry/ReagentEffects/StatusEffects/Jitter.cs +++ b/Content.Server/Chemistry/ReagentEffects/StatusEffects/Jitter.cs @@ -27,8 +27,11 @@ namespace Content.Server.Chemistry.ReagentEffects.StatusEffects public override void Effect(ReagentEffectArgs args) { + var time = Time; + time *= args.Scale; + args.EntityManager.EntitySysManager.GetEntitySystem() - .DoJitter(args.SolutionEntity, TimeSpan.FromSeconds(Time), Refresh, Amplitude, Frequency); + .DoJitter(args.SolutionEntity, TimeSpan.FromSeconds(time), Refresh, Amplitude, Frequency); } } } diff --git a/Content.Shared/Chemistry/Reaction/SharedChemicalReactionSystem.cs b/Content.Shared/Chemistry/Reaction/SharedChemicalReactionSystem.cs index 2bf1129f9e..6eea76926c 100644 --- a/Content.Shared/Chemistry/Reaction/SharedChemicalReactionSystem.cs +++ b/Content.Shared/Chemistry/Reaction/SharedChemicalReactionSystem.cs @@ -200,7 +200,7 @@ namespace Content.Shared.Chemistry.Reaction { var args = new ReagentEffectArgs(owner, null, solution, randomReagent, - unitReactions, EntityManager, null, null); + unitReactions, EntityManager, null, 1f); foreach (var effect in reaction.Effects) { diff --git a/Content.Shared/Chemistry/ReactiveSystem.cs b/Content.Shared/Chemistry/ReactiveSystem.cs index 3232ed161b..dc629bc8e9 100644 --- a/Content.Shared/Chemistry/ReactiveSystem.cs +++ b/Content.Shared/Chemistry/ReactiveSystem.cs @@ -47,7 +47,7 @@ namespace Content.Shared.Chemistry // If we have a source solution, use the reagent quantity we have left. Otherwise, use the reaction volume specified. var args = new ReagentEffectArgs(uid, null, source, reagent, - source?.GetReagentQuantity(reagent.ID) ?? reactVolume, EntityManager, method, null); + source?.GetReagentQuantity(reagent.ID) ?? reactVolume, EntityManager, method, 1f); // First, check if the reagent wants to apply any effects. if (reagent.ReactiveEffects != null && reactive.ReactiveGroups != null) diff --git a/Content.Shared/Chemistry/Reagent/ReagentEffect.cs b/Content.Shared/Chemistry/Reagent/ReagentEffect.cs index 9b2aa19c7b..5b22ae4a8a 100644 --- a/Content.Shared/Chemistry/Reagent/ReagentEffect.cs +++ b/Content.Shared/Chemistry/Reagent/ReagentEffect.cs @@ -83,6 +83,6 @@ namespace Content.Shared.Chemistry.Reagent FixedPoint2 Quantity, IEntityManager EntityManager, ReactionMethod? Method, - ReagentEffectsEntry? MetabolismEffects + float Scale ); } diff --git a/Content.Shared/Chemistry/Reagent/ReagentPrototype.cs b/Content.Shared/Chemistry/Reagent/ReagentPrototype.cs index 3e09a6f4f5..2e3ad8bc17 100644 --- a/Content.Shared/Chemistry/Reagent/ReagentPrototype.cs +++ b/Content.Shared/Chemistry/Reagent/ReagentPrototype.cs @@ -133,7 +133,7 @@ namespace Content.Shared.Chemistry.Reagent var entMan = IoCManager.Resolve(); var random = IoCManager.Resolve(); - var args = new ReagentEffectArgs(plantHolder.Value, null, solution, this, amount.Quantity, entMan, null, null); + var args = new ReagentEffectArgs(plantHolder.Value, null, solution, this, amount.Quantity, entMan, null, 1f); foreach (var plantMetabolizable in PlantMetabolisms) { if (!plantMetabolizable.ShouldApply(args, random)) diff --git a/Resources/Prototypes/Reagents/Consumable/Drink/alcohol.yml b/Resources/Prototypes/Reagents/Consumable/Drink/alcohol.yml index 54eaba8bce..3dcb0748ce 100644 --- a/Resources/Prototypes/Reagents/Consumable/Drink/alcohol.yml +++ b/Resources/Prototypes/Reagents/Consumable/Drink/alcohol.yml @@ -122,7 +122,7 @@ Alcohol: effects: - !type:Drunk - boozePower: 3 + boozePower: 20 - type: reagent id: Gin