Don't double-dip survival intensity scaling (#25570)

This commit is contained in:
Kara
2024-02-25 15:04:51 -07:00
committed by GitHub
parent 4e16034240
commit de36ebe2df
9 changed files with 12 additions and 63 deletions

View File

@@ -33,7 +33,7 @@ public sealed class AnomalySpawnRule : StationEventSystem<AnomalySpawnRuleCompon
if (grid is null) if (grid is null)
return; return;
var amountToSpawn = Math.Max(1, (int) MathF.Round(GetSeverityModifier() / 2)); var amountToSpawn = 1;
for (var i = 0; i < amountToSpawn; i++) for (var i = 0; i < amountToSpawn; i++)
{ {
_anomaly.SpawnOnRandomGridLocation(grid.Value, component.AnomalySpawnerPrototype); _anomaly.SpawnOnRandomGridLocation(grid.Value, component.AnomalySpawnerPrototype);

View File

@@ -19,7 +19,7 @@ public sealed class BluespaceArtifactRule : StationEventSystem<BluespaceArtifact
{ {
base.Started(uid, component, gameRule, args); base.Started(uid, component, gameRule, args);
var amountToSpawn = Math.Max(1, (int) MathF.Round(GetSeverityModifier() / 1.5f)); var amountToSpawn = 1;
for (var i = 0; i < amountToSpawn; i++) for (var i = 0; i < amountToSpawn; i++)
{ {
if (!TryFindRandomTile(out _, out _, out _, out var coords)) if (!TryFindRandomTile(out _, out _, out _, out var coords))

View File

@@ -25,11 +25,9 @@ public sealed class BureaucraticErrorRule : StationEventSystem<BureaucraticError
if (jobList.Count == 0) if (jobList.Count == 0)
return; return;
var mod = GetSeverityModifier();
// Low chance to completely change up the late-join landscape by closing all positions except infinite slots. // Low chance to completely change up the late-join landscape by closing all positions except infinite slots.
// Lower chance than the /tg/ equivalent of this event. // Lower chance than the /tg/ equivalent of this event.
if (RobustRandom.Prob(Math.Min(0.25f * MathF.Sqrt(mod), 1.0f))) if (RobustRandom.Prob(0.25f))
{ {
var chosenJob = RobustRandom.PickAndTake(jobList); var chosenJob = RobustRandom.PickAndTake(jobList);
_stationJobs.MakeJobUnlimited(chosenStation.Value, chosenJob); // INFINITE chaos. _stationJobs.MakeJobUnlimited(chosenStation.Value, chosenJob); // INFINITE chaos.
@@ -42,8 +40,8 @@ public sealed class BureaucraticErrorRule : StationEventSystem<BureaucraticError
} }
else else
{ {
var lower = (int) (jobList.Count * Math.Min(1.0f, 0.20 * mod)); var lower = (int) (jobList.Count * 0.20);
var upper = (int) (jobList.Count * Math.Min(1.0f, 0.30 * mod)); var upper = (int) (jobList.Count * 0.30);
// Changing every role is maybe a bit too chaotic so instead change 20-30% of them. // Changing every role is maybe a bit too chaotic so instead change 20-30% of them.
var num = RobustRandom.Next(lower, upper); var num = RobustRandom.Next(lower, upper);
for (var i = 0; i < num; i++) for (var i = 0; i < num; i++)

View File

@@ -19,8 +19,6 @@ namespace Content.Server.StationEvents.Events
if (!TryComp<StationEventComponent>(uid, out var stationEvent)) if (!TryComp<StationEventComponent>(uid, out var stationEvent))
return; return;
var mod = MathF.Sqrt(GetSeverityModifier());
// Essentially we'll pick out a target amount of gas to leak, then a rate to leak it at, then work out the duration from there. // Essentially we'll pick out a target amount of gas to leak, then a rate to leak it at, then work out the duration from there.
if (TryFindRandomTile(out component.TargetTile, out var target, out component.TargetGrid, out component.TargetCoords)) if (TryFindRandomTile(out component.TargetTile, out var target, out component.TargetGrid, out component.TargetCoords))
{ {
@@ -29,7 +27,7 @@ namespace Content.Server.StationEvents.Events
component.LeakGas = RobustRandom.Pick(component.LeakableGases); component.LeakGas = RobustRandom.Pick(component.LeakableGases);
// Was 50-50 on using normal distribution. // Was 50-50 on using normal distribution.
var totalGas = RobustRandom.Next(component.MinimumGas, component.MaximumGas) * mod; var totalGas = RobustRandom.Next(component.MinimumGas, component.MaximumGas);
var startAfter = stationEvent.StartDelay; var startAfter = stationEvent.StartDelay;
component.MolesPerSecond = RobustRandom.Next(component.MinimumMolesPerSecond, component.MaximumMolesPerSecond); component.MolesPerSecond = RobustRandom.Next(component.MinimumMolesPerSecond, component.MaximumMolesPerSecond);

View File

@@ -17,8 +17,7 @@ namespace Content.Server.StationEvents.Events
{ {
base.Started(uid, component, gameRule, args); base.Started(uid, component, gameRule, args);
var mod = Math.Sqrt(GetSeverityModifier()); component.WaveCounter = RobustRandom.Next(component.MinimumWaves, component.MaximumWaves);
component.WaveCounter = (int) (RobustRandom.Next(component.MinimumWaves, component.MaximumWaves) * mod);
} }
protected override void ActiveTick(EntityUid uid, MeteorSwarmRuleComponent component, GameRuleComponent gameRule, float frameTime) protected override void ActiveTick(EntityUid uid, MeteorSwarmRuleComponent component, GameRuleComponent gameRule, float frameTime)
@@ -29,8 +28,6 @@ namespace Content.Server.StationEvents.Events
return; return;
} }
var mod = GetSeverityModifier();
component.Cooldown -= frameTime; component.Cooldown -= frameTime;
if (component.Cooldown > 0f) if (component.Cooldown > 0f)
@@ -38,7 +35,7 @@ namespace Content.Server.StationEvents.Events
component.WaveCounter--; component.WaveCounter--;
component.Cooldown += (component.MaximumCooldown - component.MinimumCooldown) * RobustRandom.NextFloat() / mod + component.MinimumCooldown; component.Cooldown += (component.MaximumCooldown - component.MinimumCooldown) * RobustRandom.NextFloat() + component.MinimumCooldown;
Box2? playableArea = null; Box2? playableArea = null;
var mapId = GameTicker.DefaultMap; var mapId = GameTicker.DefaultMap;

View File

@@ -11,7 +11,6 @@ public sealed class RandomSentienceRule : StationEventSystem<RandomSentienceRule
{ {
HashSet<EntityUid> stationsToNotify = new(); HashSet<EntityUid> stationsToNotify = new();
var mod = GetSeverityModifier();
var targetList = new List<Entity<SentienceTargetComponent>>(); var targetList = new List<Entity<SentienceTargetComponent>>();
var query = EntityQueryEnumerator<SentienceTargetComponent>(); var query = EntityQueryEnumerator<SentienceTargetComponent>();
while (query.MoveNext(out var targetUid, out var target)) while (query.MoveNext(out var targetUid, out var target))
@@ -21,7 +20,7 @@ public sealed class RandomSentienceRule : StationEventSystem<RandomSentienceRule
RobustRandom.Shuffle(targetList); RobustRandom.Shuffle(targetList);
var toMakeSentient = (int) (RobustRandom.Next(2, 5) * Math.Sqrt(mod)); var toMakeSentient = RobustRandom.Next(2, 5);
var groups = new HashSet<string>(); var groups = new HashSet<string>();
foreach (var target in targetList) foreach (var target in targetList)

View File

@@ -134,25 +134,5 @@ public abstract partial class StationEventSystem<T> : GameRuleSystem<T> where T
GameTicker.EndGameRule(uid, component); GameTicker.EndGameRule(uid, component);
} }
public float GetSeverityModifier()
{
var ev = new GetSeverityModifierEvent();
RaiseLocalEvent(ev);
return ev.Modifier;
}
#endregion #endregion
} }
/// <summary>
/// Raised broadcast to determine what the severity modifier should be for an event, some positive number that can be multiplied with various things.
/// Handled by usually other game rules (like the ramping scheduler).
/// Most events should try and make use of this if possible.
/// </summary>
public sealed class GetSeverityModifierEvent : EntityEventArgs
{
/// <summary>
/// Should be multiplied/added to rather than set, for commutativity.
/// </summary>
public float Modifier = 1.0f;
}

View File

@@ -28,9 +28,6 @@ public sealed class VentClogRule : StationEventSystem<VentClogRuleComponent>
.Where(x => !x.Abstract) .Where(x => !x.Abstract)
.Select(x => x.ID).ToList(); .Select(x => x.ID).ToList();
// TODO: This is gross, but not much can be done until event refactor, which needs Dynamic.
var mod = (float) Math.Sqrt(GetSeverityModifier());
foreach (var (_, transform) in EntityManager.EntityQuery<GasVentPumpComponent, TransformComponent>()) foreach (var (_, transform) in EntityManager.EntityQuery<GasVentPumpComponent, TransformComponent>())
{ {
if (CompOrNull<StationMemberComponent>(transform.GridUid)?.Station != chosenStation) if (CompOrNull<StationMemberComponent>(transform.GridUid)?.Station != chosenStation)
@@ -40,14 +37,14 @@ public sealed class VentClogRule : StationEventSystem<VentClogRuleComponent>
var solution = new Solution(); var solution = new Solution();
if (!RobustRandom.Prob(Math.Min(0.33f * mod, 1.0f))) if (!RobustRandom.Prob(0.33f))
continue; continue;
var pickAny = RobustRandom.Prob(Math.Min(0.05f * mod, 1.0f)); var pickAny = RobustRandom.Prob(0.05f);
var reagent = RobustRandom.Pick(pickAny ? allReagents : component.SafeishVentChemicals); var reagent = RobustRandom.Pick(pickAny ? allReagents : component.SafeishVentChemicals);
var weak = component.WeakReagents.Contains(reagent); var weak = component.WeakReagents.Contains(reagent);
var quantity = (weak ? component.WeakReagentQuantity : component.ReagentQuantity) * mod; var quantity = weak ? component.WeakReagentQuantity : component.ReagentQuantity;
solution.AddReagent(reagent, quantity); solution.AddReagent(reagent, quantity);
var foamEnt = Spawn("Foam", transform.Coordinates); var foamEnt = Spawn("Foam", transform.Coordinates);

View File

@@ -25,13 +25,6 @@ public sealed class RampingStationEventSchedulerSystem : GameRuleSystem<RampingS
return component.MaxChaos / component.EndTime * roundTime + component.StartingChaos; return component.MaxChaos / component.EndTime * roundTime + component.StartingChaos;
} }
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<GetSeverityModifierEvent>(OnGetSeverityModifier);
}
protected override void Started(EntityUid uid, RampingStationEventSchedulerComponent component, GameRuleComponent gameRule, GameRuleStartedEvent args) protected override void Started(EntityUid uid, RampingStationEventSchedulerComponent component, GameRuleComponent gameRule, GameRuleStartedEvent args)
{ {
base.Started(uid, component, gameRule, args); base.Started(uid, component, gameRule, args);
@@ -73,19 +66,6 @@ public sealed class RampingStationEventSchedulerSystem : GameRuleSystem<RampingS
} }
} }
private void OnGetSeverityModifier(GetSeverityModifierEvent ev)
{
var query = EntityQueryEnumerator<RampingStationEventSchedulerComponent, GameRuleComponent>();
while (query.MoveNext(out var uid, out var scheduler, out var gameRule))
{
if (!GameTicker.IsGameRuleActive(uid, gameRule))
return;
ev.Modifier *= GetChaosModifier(uid, scheduler);
Logger.Info($"Ramping set modifier to {ev.Modifier}");
}
}
private void PickNextEventTime(EntityUid uid, RampingStationEventSchedulerComponent component) private void PickNextEventTime(EntityUid uid, RampingStationEventSchedulerComponent component)
{ {
var mod = GetChaosModifier(uid, component); var mod = GetChaosModifier(uid, component);