From 3923733113a9cb9bf3fe04d4ce463e19f6ef5e82 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Fri, 12 Feb 2021 14:28:51 +1100 Subject: [PATCH] Gas leak event (#3097) * Gas leak event * 5% spark chance * HotspotExpose Co-authored-by: Metal Gear Sloth --- Content.Server/StationEvents/GasLeak.cs | 202 +++++++++++++++++++++ Resources/Audio/Announcements/bloblarm.ogg | Bin 0 -> 19497 bytes 2 files changed, 202 insertions(+) create mode 100644 Content.Server/StationEvents/GasLeak.cs create mode 100644 Resources/Audio/Announcements/bloblarm.ogg diff --git a/Content.Server/StationEvents/GasLeak.cs b/Content.Server/StationEvents/GasLeak.cs new file mode 100644 index 0000000000..86571b9acd --- /dev/null +++ b/Content.Server/StationEvents/GasLeak.cs @@ -0,0 +1,202 @@ +using Content.Server.GameObjects.Components.Atmos; +using Content.Server.Interfaces.GameTicking; +using Content.Shared.Atmos; +using Robust.Server.GameObjects.EntitySystems; +using Robust.Shared.GameObjects; +using Robust.Shared.GameObjects.Components.Map; +using Robust.Shared.GameObjects.Systems; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.Interfaces.Map; +using Robust.Shared.Interfaces.Random; +using Robust.Shared.IoC; +using Robust.Shared.Log; +using Robust.Shared.Map; +using Robust.Shared.Maths; +using Robust.Shared.Random; + +#nullable enable +namespace Content.Server.StationEvents +{ + internal sealed class GasLeak : StationEvent + { + public override string Name => "GasLeak"; + + public override string? StartAnnouncement => + "Attention crew, there is a gas leak on the station. We advise you to avoid the area and wear suit internals in the meantime."; + + // Sourced from https://github.com/vgstation-coders/vgstation13/blob/2c5a491446ab824a8fbbf39bcf656b590e0228df/sound/misc/bloblarm.ogg + public override string? StartAudio => "/Audio/Announcements/bloblarm.ogg"; + + protected override string? EndAnnouncement => "The source of the gas leak has been fixed. Please be cautious around areas with gas remaining."; + + private static readonly Gas[] LeakableGases = { + Gas.Phoron, + Gas.Tritium, + }; + + public override int EarliestStart => 10; + + public override int MinimumPlayers => 5; + + /// + /// Give people time to get their internals on. + /// + protected override float StartAfter => 20f; + + /// + /// Don't know how long the event will be until we calculate the leak amount. + /// + protected override float EndAfter { get; set; } = float.MaxValue; + + /// + /// Running cooldown of how much time until another leak. + /// + private float _timeUntilLeak; + + /// + /// How long between more gas being added to the tile. + /// + private const float LeakCooldown = 1.0f; + + // Event variables + + private IEntity? _targetGrid; + + private Vector2i _targetTile; + + private EntityCoordinates _targetCoords; + + private bool _foundTile; + + private Gas _leakGas; + + private float _molesPerSecond; + + private const int MinimumMolesPerSecond = 20; + + /// + /// Don't want to make it too fast to give people time to flee. + /// + private const int MaximumMolesPerSecond = 50; + + private const int MinimumGas = 250; + + private const int MaximumGas = 1000; + + private const float SparkChance = 0.05f; + + public override void Startup() + { + base.Startup(); + var robustRandom = IoCManager.Resolve(); + + // 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 _targetTile, robustRandom)) + { + _foundTile = true; + + _leakGas = robustRandom.Pick(LeakableGases); + // Was 50-50 on using normal distribution. + var totalGas = (float) robustRandom.Next(MinimumGas, MaximumGas); + _molesPerSecond = robustRandom.Next(MinimumMolesPerSecond, MaximumMolesPerSecond); + EndAfter = totalGas / _molesPerSecond + StartAfter; + Logger.InfoS("stationevents", $"Leaking {totalGas} of {_leakGas} over {EndAfter - StartAfter} seconds at {_targetTile}"); + } + + // Look technically if you wanted to guarantee a leak you'd do this in announcement but having the announcement + // there just to fuck with people even if there is no valid tile is funny. + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + + if (!Started || !Running) return; + + _timeUntilLeak -= frameTime; + + if (_timeUntilLeak > 0f) return; + _timeUntilLeak += LeakCooldown; + + if (!_foundTile || + _targetGrid == null || + _targetGrid.Deleted || + !_targetGrid.TryGetComponent(out GridAtmosphereComponent? gridAtmos)) + { + Running = false; + return; + } + + var atmos = gridAtmos.GetTile(_targetTile); + + atmos?.Air?.AdjustMoles(_leakGas, LeakCooldown * _molesPerSecond); + atmos?.Invalidate(); + } + + public override void Shutdown() + { + base.Shutdown(); + + Spark(); + + _foundTile = false; + _targetGrid = null; + _targetTile = default; + _targetCoords = default; + _leakGas = Gas.Oxygen; + EndAfter = float.MaxValue; + } + + private void Spark() + { + var robustRandom = IoCManager.Resolve(); + if (robustRandom.NextFloat() <= SparkChance) + { + if (!_foundTile || + _targetGrid == null || + _targetGrid.Deleted || + !_targetGrid.TryGetComponent(out GridAtmosphereComponent? gridAtmos)) + { + return; + } + + var atmos = gridAtmos.GetTile(_targetTile); + // Don't want it to be so obnoxious as to instantly murder anyone in the area but enough that + // it COULD start potentially start a bigger fire. + atmos?.HotspotExpose(700f, 50f, true); + EntitySystem.Get().PlayAtCoords("/Audio/Effects/sparks4.ogg", _targetCoords); + } + } + + private bool TryFindRandomTile(out Vector2i tile, IRobustRandom? robustRandom = null) + { + tile = default; + var defaultGridId = IoCManager.Resolve().DefaultGridId; + + if (!IoCManager.Resolve().TryGetGrid(defaultGridId, out var grid) || + !IoCManager.Resolve().TryGetEntity(grid.GridEntityId, out _targetGrid)) return false; + + _targetGrid.EnsureComponent(out GridAtmosphereComponent gridAtmos); + robustRandom ??= IoCManager.Resolve(); + var found = false; + var gridBounds = grid.WorldBounds; + var gridPos = grid.WorldPosition; + + for (var i = 0; i < 10; i++) + { + var randomX = robustRandom.Next((int) gridBounds.Left, (int) gridBounds.Right); + var randomY = robustRandom.Next((int) gridBounds.Bottom, (int) gridBounds.Top); + + tile = new Vector2i(randomX - (int) gridPos.X, randomY - (int) gridPos.Y); + if (gridAtmos.IsSpace(tile) || gridAtmos.IsAirBlocked(tile)) continue; + found = true; + _targetCoords = grid.GridTileToLocal(tile); + break; + } + + if (!found) return false; + + return true; + } + } +} diff --git a/Resources/Audio/Announcements/bloblarm.ogg b/Resources/Audio/Announcements/bloblarm.ogg new file mode 100644 index 0000000000000000000000000000000000000000..50ba29739f5d2ee6f76686c0a5d019b3493a590f GIT binary patch literal 19497 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 literal 0 HcmV?d00001