Scale other needed metabolism reagents (#12005)

Closes https://github.com/space-wizards/space-station-14/issues/7434
This commit is contained in:
Rane
2022-12-21 09:51:49 -05:00
committed by GitHub
parent 571802f75d
commit 8613d40aa1
23 changed files with 82 additions and 26 deletions

View File

@@ -152,10 +152,13 @@ namespace Content.Server.Body.Systems
if (entry.MetabolismRate > mostToRemove) if (entry.MetabolismRate > mostToRemove)
mostToRemove = entry.MetabolismRate; mostToRemove = entry.MetabolismRate;
mostToRemove *= group.MetabolismRateModifier; mostToRemove *= group.MetabolismRateModifier;
mostToRemove = FixedPoint2.Clamp(mostToRemove, 0, reagent.Quantity); 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, // if it's possible for them to be dead, and they are,
// then we shouldn't process any effects, but should probably // then we shouldn't process any effects, but should probably
// still remove reagents // still remove reagents
@@ -167,7 +170,7 @@ namespace Content.Server.Body.Systems
var actualEntity = organ?.Body ?? solutionEntityUid.Value; var actualEntity = organ?.Body ?? solutionEntityUid.Value;
var args = new ReagentEffectArgs(actualEntity, (meta).Owner, solution, proto, mostToRemove, var args = new ReagentEffectArgs(actualEntity, (meta).Owner, solution, proto, mostToRemove,
EntityManager, null, entry); EntityManager, null, scale);
// do all effects, if conditions apply // do all effects, if conditions apply
foreach (var effect in entry.Effects) foreach (var effect in entry.Effects)

View File

@@ -32,12 +32,16 @@ namespace Content.Server.Chemistry.ReagentEffects
if (args.Source != null) if (args.Source != null)
{ {
var solutionSys = args.EntityManager.EntitySysManager.GetEntitySystem<SolutionContainerSystem>(); var solutionSys = args.EntityManager.EntitySysManager.GetEntitySystem<SolutionContainerSystem>();
var amount = Amount;
amount *= args.Scale;
if (Reagent != null) if (Reagent != null)
{ {
if (Amount < 0 && args.Source.ContainsReagent(Reagent)) if (amount < 0 && args.Source.ContainsReagent(Reagent))
solutionSys.TryRemoveReagent(args.SolutionEntity, args.Source, Reagent, -Amount); solutionSys.TryRemoveReagent(args.SolutionEntity, args.Source, Reagent, -amount);
if (Amount > 0) if (amount > 0)
solutionSys.TryAddReagent(args.SolutionEntity, args.Source, Reagent, Amount, out _); solutionSys.TryAddReagent(args.SolutionEntity, args.Source, Reagent, amount, out _);
} }
else if (Group != null) else if (Group != null)
{ {
@@ -47,10 +51,10 @@ namespace Content.Server.Chemistry.ReagentEffects
var proto = prototypeMan.Index<ReagentPrototype>(quant.ReagentId); var proto = prototypeMan.Index<ReagentPrototype>(quant.ReagentId);
if (proto.Metabolisms != null && proto.Metabolisms.ContainsKey(Group)) if (proto.Metabolisms != null && proto.Metabolisms.ContainsKey(Group))
{ {
if (Amount < 0) if (amount < 0)
solutionSys.TryRemoveReagent(args.SolutionEntity, args.Source, quant.ReagentId, Amount); solutionSys.TryRemoveReagent(args.SolutionEntity, args.Source, quant.ReagentId, amount);
if (Amount > 0) if (amount > 0)
solutionSys.TryAddReagent(args.SolutionEntity, args.Source, quant.ReagentId, Amount, out _); solutionSys.TryAddReagent(args.SolutionEntity, args.Source, quant.ReagentId, amount, out _);
} }
} }
} }

View File

@@ -14,7 +14,11 @@ namespace Content.Server.Chemistry.ReagentEffects
if (args.EntityManager.TryGetComponent(args.SolutionEntity, out TemperatureComponent? temp)) if (args.EntityManager.TryGetComponent(args.SolutionEntity, out TemperatureComponent? temp))
{ {
var sys = args.EntityManager.EntitySysManager.GetEntitySystem<TemperatureSystem>(); var sys = args.EntityManager.EntitySysManager.GetEntitySystem<TemperatureSystem>();
sys.ChangeHeat(args.SolutionEntity, Amount, true, temp); var amount = Amount;
amount *= args.Scale;
sys.ChangeHeat(args.SolutionEntity, amount, true, temp);
} }
} }
} }

View File

@@ -27,6 +27,9 @@ namespace Content.Server.Chemistry.ReagentEffects
public override void Effect(ReagentEffectArgs args) public override void Effect(ReagentEffectArgs args)
{ {
if (args.Scale != 1f)
return;
EntitySystem.Get<DiseaseSystem>().TryAddDisease(args.SolutionEntity, Disease); EntitySystem.Get<DiseaseSystem>().TryAddDisease(args.SolutionEntity, Disease);
} }
} }

View File

@@ -24,6 +24,9 @@ namespace Content.Server.Chemistry.ReagentEffects
if (args.EntityManager.TryGetComponent<DiseasedComponent>(args.SolutionEntity, out var diseased)) if (args.EntityManager.TryGetComponent<DiseasedComponent>(args.SolutionEntity, out var diseased))
return; return;
if (args.Scale != 1f)
return;
var random = IoCManager.Resolve<IRobustRandom>(); var random = IoCManager.Resolve<IRobustRandom>();
EntitySystem.Get<DiseaseSystem>().TryAddDisease(args.SolutionEntity, random.Pick(Diseases)); EntitySystem.Get<DiseaseSystem>().TryAddDisease(args.SolutionEntity, random.Pick(Diseases));

View File

@@ -17,8 +17,12 @@ namespace Content.Server.Chemistry.ReactionEffects
if (args.Source == null) if (args.Source == null)
return; return;
var cleanseRate = CleanseRate;
cleanseRate *= args.Scale;
var bloodstreamSys = EntitySystem.Get<BloodstreamSystem>(); var bloodstreamSys = EntitySystem.Get<BloodstreamSystem>();
bloodstreamSys.FlushChemicals(args.SolutionEntity, args.Reagent.ID, CleanseRate); bloodstreamSys.FlushChemicals(args.SolutionEntity, args.Reagent.ID, cleanseRate);
} }
} }
} }

View File

@@ -18,7 +18,11 @@ namespace Content.Server.Chemistry.ReagentEffects
public override void Effect(ReagentEffectArgs args) 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); args.EntityManager.EventBus.RaiseLocalEvent(args.SolutionEntity, ev, false);
} }
} }

View File

@@ -18,6 +18,9 @@ namespace Content.Server.Chemistry.ReagentEffects
public override void Effect(ReagentEffectArgs args) public override void Effect(ReagentEffectArgs args)
{ {
if (args.Scale != 1f)
return;
args.EntityManager.EntitySysManager.GetEntitySystem<SharedBlindingSystem>().AdjustEyeDamage(args.SolutionEntity, Amount); args.EntityManager.EntitySysManager.GetEntitySystem<SharedBlindingSystem>().AdjustEyeDamage(args.SolutionEntity, Amount);
} }
} }

View File

@@ -15,6 +15,9 @@ namespace Content.Server.Chemistry.ReagentEffects
{ {
public override void Effect(ReagentEffectArgs args) public override void Effect(ReagentEffectArgs args)
{ {
if (args.Scale != 1f)
return;
string disease = EntitySystem.Get<MiasmaSystem>().RequestPoolDisease(); string disease = EntitySystem.Get<MiasmaSystem>().RequestPoolDisease();
EntitySystem.Get<DiseaseSystem>().TryAddDisease(args.SolutionEntity, disease); EntitySystem.Get<DiseaseSystem>().TryAddDisease(args.SolutionEntity, disease);

View File

@@ -19,6 +19,9 @@ namespace Content.Server.Chemistry.ReagentEffects
public override void Effect(ReagentEffectArgs args) public override void Effect(ReagentEffectArgs args)
{ {
if (args.Scale != 1f)
return;
var vomitSys = args.EntityManager.EntitySysManager.GetEntitySystem<VomitSystem>(); var vomitSys = args.EntityManager.EntitySysManager.GetEntitySystem<VomitSystem>();
vomitSys.Vomit(args.SolutionEntity, ThirstAmount, HungerAmount); vomitSys.Vomit(args.SolutionEntity, ThirstAmount, HungerAmount);

View File

@@ -19,7 +19,11 @@ public sealed class Drunk : ReagentEffect
public override void Effect(ReagentEffectArgs args) public override void Effect(ReagentEffectArgs args)
{ {
var boozePower = BoozePower;
boozePower *= args.Scale;
var drunkSys = args.EntityManager.EntitySysManager.GetEntitySystem<SharedDrunkSystem>(); var drunkSys = args.EntityManager.EntitySysManager.GetEntitySystem<SharedDrunkSystem>();
drunkSys.TryApplyDrunkenness(args.SolutionEntity, BoozePower, SlurSpeech); drunkSys.TryApplyDrunkenness(args.SolutionEntity, boozePower, SlurSpeech);
} }
} }

View File

@@ -34,8 +34,8 @@ namespace Content.Server.Chemistry.ReagentEffects
public override void Effect(ReagentEffectArgs args) public override void Effect(ReagentEffectArgs args)
{ {
var scale = ScaleByQuantity ? args.Quantity : FixedPoint2.New(1); var scale = ScaleByQuantity ? args.Quantity : FixedPoint2.New(1);
if (args.MetabolismEffects != null) scale *= args.Scale;
scale *= (args.Quantity / args.MetabolismEffects.MetabolismRate);
EntitySystem.Get<DamageableSystem>().TryChangeDamage(args.SolutionEntity, Damage * scale, IgnoreResistances); EntitySystem.Get<DamageableSystem>().TryChangeDamage(args.SolutionEntity, Damage * scale, IgnoreResistances);
} }
} }

View File

@@ -18,6 +18,8 @@ public sealed class ModifyBleedAmount : ReagentEffect
{ {
var sys = EntitySystem.Get<BloodstreamSystem>(); var sys = EntitySystem.Get<BloodstreamSystem>();
var amt = Scaled ? Amount * args.Quantity.Float() : Amount; var amt = Scaled ? Amount * args.Quantity.Float() : Amount;
amt *= args.Scale;
sys.TryModifyBleedAmount(args.SolutionEntity, amt, blood); sys.TryModifyBleedAmount(args.SolutionEntity, amt, blood);
} }
} }

View File

@@ -19,6 +19,8 @@ public sealed class ModifyBloodLevel : ReagentEffect
{ {
var sys = EntitySystem.Get<BloodstreamSystem>(); var sys = EntitySystem.Get<BloodstreamSystem>();
var amt = Scaled ? Amount * args.Quantity : Amount; var amt = Scaled ? Amount * args.Quantity : Amount;
amt *= args.Scale;
sys.TryModifyBloodLevel(args.SolutionEntity, amt, blood); sys.TryModifyBloodLevel(args.SolutionEntity, amt, blood);
} }
} }

View File

@@ -43,7 +43,11 @@ namespace Content.Server.Chemistry.ReagentEffects
status.WalkSpeedModifier = WalkSpeedModifier; status.WalkSpeedModifier = WalkSpeedModifier;
status.SprintSpeedModifier = SprintSpeedModifier; status.SprintSpeedModifier = SprintSpeedModifier;
IncreaseTimer(status, StatusLifetime); // only going to scale application time
var statusLifetime = StatusLifetime;
statusLifetime *= args.Scale;
IncreaseTimer(status, statusLifetime);
if (modified) if (modified)
EntitySystem.Get<MovementSpeedModifierSystem>().RefreshMovementSpeedModifiers(args.SolutionEntity); EntitySystem.Get<MovementSpeedModifierSystem>().RefreshMovementSpeedModifiers(args.SolutionEntity);

View File

@@ -14,7 +14,10 @@ public sealed class Paralyze : ReagentEffect
public override void Effect(ReagentEffectArgs args) public override void Effect(ReagentEffectArgs args)
{ {
EntitySystem.Get<StunSystem>().TryParalyze(args.SolutionEntity, TimeSpan.FromSeconds(ParalyzeTime), Refresh); var paralyzeTime = ParalyzeTime;
paralyzeTime *= args.Scale;
EntitySystem.Get<StunSystem>().TryParalyze(args.SolutionEntity, TimeSpan.FromSeconds(paralyzeTime), Refresh);
} }
} }

View File

@@ -40,17 +40,21 @@ namespace Content.Server.Chemistry.ReagentEffects.StatusEffects
public override void Effect(ReagentEffectArgs args) public override void Effect(ReagentEffectArgs args)
{ {
var statusSys = args.EntityManager.EntitySysManager.GetEntitySystem<StatusEffectsSystem>(); var statusSys = args.EntityManager.EntitySysManager.GetEntitySystem<StatusEffectsSystem>();
var time = Time;
time *= args.Scale;
if (Type == StatusEffectMetabolismType.Add && Component != String.Empty) 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) 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) else if (Type == StatusEffectMetabolismType.Set)
{ {
statusSys.TrySetTime(args.SolutionEntity, Key, TimeSpan.FromSeconds(Time)); statusSys.TrySetTime(args.SolutionEntity, Key, TimeSpan.FromSeconds(time));
} }
} }
} }

View File

@@ -27,8 +27,11 @@ namespace Content.Server.Chemistry.ReagentEffects.StatusEffects
public override void Effect(ReagentEffectArgs args) public override void Effect(ReagentEffectArgs args)
{ {
var time = Time;
time *= args.Scale;
args.EntityManager.EntitySysManager.GetEntitySystem<SharedJitteringSystem>() args.EntityManager.EntitySysManager.GetEntitySystem<SharedJitteringSystem>()
.DoJitter(args.SolutionEntity, TimeSpan.FromSeconds(Time), Refresh, Amplitude, Frequency); .DoJitter(args.SolutionEntity, TimeSpan.FromSeconds(time), Refresh, Amplitude, Frequency);
} }
} }
} }

View File

@@ -200,7 +200,7 @@ namespace Content.Shared.Chemistry.Reaction
{ {
var args = new ReagentEffectArgs(owner, null, solution, var args = new ReagentEffectArgs(owner, null, solution,
randomReagent, randomReagent,
unitReactions, EntityManager, null, null); unitReactions, EntityManager, null, 1f);
foreach (var effect in reaction.Effects) foreach (var effect in reaction.Effects)
{ {

View File

@@ -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. // 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, 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. // First, check if the reagent wants to apply any effects.
if (reagent.ReactiveEffects != null && reactive.ReactiveGroups != null) if (reagent.ReactiveEffects != null && reactive.ReactiveGroups != null)

View File

@@ -83,6 +83,6 @@ namespace Content.Shared.Chemistry.Reagent
FixedPoint2 Quantity, FixedPoint2 Quantity,
IEntityManager EntityManager, IEntityManager EntityManager,
ReactionMethod? Method, ReactionMethod? Method,
ReagentEffectsEntry? MetabolismEffects float Scale
); );
} }

View File

@@ -133,7 +133,7 @@ namespace Content.Shared.Chemistry.Reagent
var entMan = IoCManager.Resolve<IEntityManager>(); var entMan = IoCManager.Resolve<IEntityManager>();
var random = IoCManager.Resolve<IRobustRandom>(); var random = IoCManager.Resolve<IRobustRandom>();
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) foreach (var plantMetabolizable in PlantMetabolisms)
{ {
if (!plantMetabolizable.ShouldApply(args, random)) if (!plantMetabolizable.ShouldApply(args, random))

View File

@@ -122,7 +122,7 @@
Alcohol: Alcohol:
effects: effects:
- !type:Drunk - !type:Drunk
boozePower: 3 boozePower: 20
- type: reagent - type: reagent
id: Gin id: Gin