From b1584793bf520c91bca8bb990edaeee76bb98ee5 Mon Sep 17 00:00:00 2001 From: Flipp Syder <76629141+vulppine@users.noreply.github.com> Date: Sat, 1 Jan 2022 20:56:24 -0800 Subject: [PATCH] Adds fire/air alarms (#5018) Co-authored-by: Vera Aguilera Puerto <6766154+Zumorica@users.noreply.github.com> Co-authored-by: E F R <602406+Efruit@users.noreply.github.com> Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Co-authored-by: metalgearsloth --- .../Atmos/Monitor/AtmosMonitorVisualizer.cs | 67 +++ .../Monitor/UI/AirAlarmBoundUserInterface.cs | 87 +++ .../Atmos/Monitor/UI/AirAlarmWindow.xaml | 75 +++ .../Atmos/Monitor/UI/AirAlarmWindow.xaml.cs | 196 +++++++ .../Atmos/Monitor/UI/Widgets/PumpControl.xaml | 36 ++ .../Monitor/UI/Widgets/PumpControl.xaml.cs | 103 ++++ .../Monitor/UI/Widgets/ScrubberControl.xaml | 35 ++ .../UI/Widgets/ScrubberControl.xaml.cs | 123 ++++ .../Monitor/UI/Widgets/ThresholdControl.xaml | 18 + .../UI/Widgets/ThresholdControl.xaml.cs | 294 ++++++++++ Content.Client/Entry/IgnoredComponents.cs | 4 + .../Tests/Atmos/AlarmThresholdTest.cs | 97 ++++ .../Monitor/Components/AirAlarmComponent.cs | 224 ++++++++ .../Components/AtmosAlarmableComponent.cs | 48 ++ .../Components/AtmosMonitorComponent.cs | 114 ++++ .../Monitor/Components/FireAlarmComponent.cs | 170 ++++++ .../Atmos/Monitor/Systems/AirAlarmModes.cs | 242 ++++++++ .../Atmos/Monitor/Systems/AirAlarmSystem.cs | 541 ++++++++++++++++++ .../Monitor/Systems/AtmosAlarmableSystem.cs | 43 ++ .../Monitor/Systems/AtmosMonitoringSystem.cs | 488 ++++++++++++++++ .../Atmos/Monitor/Systems/FireAlarmSystem.cs | 42 ++ .../GasDualPortVentPumpComponent.cs | 2 +- .../GasDualPortVentPumpSystem.cs | 2 +- .../Unary/Components/GasVentPumpComponent.cs | 39 +- .../Components/GasVentScrubberComponent.cs | 48 +- .../Unary/EntitySystems/GasVentPumpSystem.cs | 64 +++ .../EntitySystems/GasVentScrubberSystem.cs | 61 ++ .../Doors/Systems/FirelockSystem.cs | 34 +- .../Monitor/AtmosAlarmThresholdPrototype.cs | 257 +++++++++ .../Atmos/Monitor/AtmosMonitorAlarmType.cs | 13 + .../Components/SharedAirAlarmComponent.cs | 135 +++++ .../Components/SharedFireAlarmComponent.cs | 12 + .../Components/SharedVentPumpComponent.cs | 77 +++ .../Components/SharedVentScrubberComponent.cs | 77 +++ Resources/Audio/Machines/alarm.ogg | Bin 108421 -> 86089 bytes Resources/Locale/en-US/atmos/air-alarm-ui.ftl | 57 ++ .../Prototypes/Atmospherics/thresholds.yml | 31 + .../Devices/Electronics/atmos_alarms.yml | 23 + .../Structures/Doors/Firelocks/firelock.yml | 10 + .../Structures/Piping/Atmospherics/unary.yml | 18 + .../Structures/Wallmounts/air_alarm.yml | 90 +++ .../Structures/Wallmounts/fire_alarm.yml | 73 +++ .../Construction/Graphs/air_alarms.yml | 157 +++++ .../Recipes/Construction/atmos_alarms.yml | 35 ++ Resources/Prototypes/tags.yml | 6 + .../Wallmounts/air_monitors.rsi/alarm0.png | Bin 0 -> 2670 bytes .../Wallmounts/air_monitors.rsi/alarm1.png | Bin 0 -> 2102 bytes .../Wallmounts/air_monitors.rsi/alarm2.png | Bin 0 -> 2144 bytes .../Wallmounts/air_monitors.rsi/alarm_b1.png | Bin 0 -> 1309 bytes .../Wallmounts/air_monitors.rsi/alarm_b2.png | Bin 0 -> 1383 bytes .../air_monitors.rsi/alarm_bitem.png | Bin 0 -> 387 bytes .../Wallmounts/air_monitors.rsi/alarmp.png | Bin 0 -> 1250 bytes .../Wallmounts/air_monitors.rsi/alarmx.png | Bin 0 -> 1597 bytes .../Wallmounts/air_monitors.rsi/auth_off.png | Bin 0 -> 231 bytes .../Wallmounts/air_monitors.rsi/auth_on.png | Bin 0 -> 434 bytes .../Wallmounts/air_monitors.rsi/fire0.png | Bin 0 -> 835 bytes .../Wallmounts/air_monitors.rsi/fire_0.png | Bin 0 -> 200 bytes .../Wallmounts/air_monitors.rsi/fire_1.png | Bin 0 -> 222 bytes .../Wallmounts/air_monitors.rsi/fire_2.png | Bin 0 -> 264 bytes .../Wallmounts/air_monitors.rsi/fire_3.png | Bin 0 -> 351 bytes .../Wallmounts/air_monitors.rsi/fire_b0.png | Bin 0 -> 851 bytes .../Wallmounts/air_monitors.rsi/fire_b1.png | Bin 0 -> 929 bytes .../Wallmounts/air_monitors.rsi/fire_b2.png | Bin 0 -> 1205 bytes .../air_monitors.rsi/fire_bitem.png | Bin 0 -> 317 bytes .../air_monitors.rsi/fire_detected.png | Bin 0 -> 427 bytes .../air_monitors.rsi/fire_emagged.png | Bin 0 -> 798 bytes .../Wallmounts/air_monitors.rsi/fire_off.png | Bin 0 -> 203 bytes .../Wallmounts/air_monitors.rsi/fire_on.png | Bin 0 -> 380 bytes .../air_monitors.rsi/fire_overlay.png | Bin 0 -> 247 bytes .../Wallmounts/air_monitors.rsi/firex.png | Bin 0 -> 1451 bytes .../Wallmounts/air_monitors.rsi/meta.json | 1 + 71 files changed, 4340 insertions(+), 29 deletions(-) create mode 100644 Content.Client/Atmos/Monitor/AtmosMonitorVisualizer.cs create mode 100644 Content.Client/Atmos/Monitor/UI/AirAlarmBoundUserInterface.cs create mode 100644 Content.Client/Atmos/Monitor/UI/AirAlarmWindow.xaml create mode 100644 Content.Client/Atmos/Monitor/UI/AirAlarmWindow.xaml.cs create mode 100644 Content.Client/Atmos/Monitor/UI/Widgets/PumpControl.xaml create mode 100644 Content.Client/Atmos/Monitor/UI/Widgets/PumpControl.xaml.cs create mode 100644 Content.Client/Atmos/Monitor/UI/Widgets/ScrubberControl.xaml create mode 100644 Content.Client/Atmos/Monitor/UI/Widgets/ScrubberControl.xaml.cs create mode 100644 Content.Client/Atmos/Monitor/UI/Widgets/ThresholdControl.xaml create mode 100644 Content.Client/Atmos/Monitor/UI/Widgets/ThresholdControl.xaml.cs create mode 100644 Content.IntegrationTests/Tests/Atmos/AlarmThresholdTest.cs create mode 100644 Content.Server/Atmos/Monitor/Components/AirAlarmComponent.cs create mode 100644 Content.Server/Atmos/Monitor/Components/AtmosAlarmableComponent.cs create mode 100644 Content.Server/Atmos/Monitor/Components/AtmosMonitorComponent.cs create mode 100644 Content.Server/Atmos/Monitor/Components/FireAlarmComponent.cs create mode 100644 Content.Server/Atmos/Monitor/Systems/AirAlarmModes.cs create mode 100644 Content.Server/Atmos/Monitor/Systems/AirAlarmSystem.cs create mode 100644 Content.Server/Atmos/Monitor/Systems/AtmosAlarmableSystem.cs create mode 100644 Content.Server/Atmos/Monitor/Systems/AtmosMonitoringSystem.cs create mode 100644 Content.Server/Atmos/Monitor/Systems/FireAlarmSystem.cs create mode 100644 Content.Shared/Atmos/Monitor/AtmosAlarmThresholdPrototype.cs create mode 100644 Content.Shared/Atmos/Monitor/AtmosMonitorAlarmType.cs create mode 100644 Content.Shared/Atmos/Monitor/Components/SharedAirAlarmComponent.cs create mode 100644 Content.Shared/Atmos/Monitor/Components/SharedFireAlarmComponent.cs create mode 100644 Content.Shared/Atmos/Piping/Unary/Components/SharedVentPumpComponent.cs create mode 100644 Content.Shared/Atmos/Piping/Unary/Components/SharedVentScrubberComponent.cs create mode 100644 Resources/Locale/en-US/atmos/air-alarm-ui.ftl create mode 100644 Resources/Prototypes/Atmospherics/thresholds.yml create mode 100644 Resources/Prototypes/Entities/Objects/Devices/Electronics/atmos_alarms.yml create mode 100644 Resources/Prototypes/Entities/Structures/Wallmounts/air_alarm.yml create mode 100644 Resources/Prototypes/Entities/Structures/Wallmounts/fire_alarm.yml create mode 100644 Resources/Prototypes/Recipes/Construction/Graphs/air_alarms.yml create mode 100644 Resources/Prototypes/Recipes/Construction/atmos_alarms.yml create mode 100644 Resources/Textures/Structures/Wallmounts/air_monitors.rsi/alarm0.png create mode 100644 Resources/Textures/Structures/Wallmounts/air_monitors.rsi/alarm1.png create mode 100644 Resources/Textures/Structures/Wallmounts/air_monitors.rsi/alarm2.png create mode 100644 Resources/Textures/Structures/Wallmounts/air_monitors.rsi/alarm_b1.png create mode 100644 Resources/Textures/Structures/Wallmounts/air_monitors.rsi/alarm_b2.png create mode 100644 Resources/Textures/Structures/Wallmounts/air_monitors.rsi/alarm_bitem.png create mode 100644 Resources/Textures/Structures/Wallmounts/air_monitors.rsi/alarmp.png create mode 100644 Resources/Textures/Structures/Wallmounts/air_monitors.rsi/alarmx.png create mode 100644 Resources/Textures/Structures/Wallmounts/air_monitors.rsi/auth_off.png create mode 100644 Resources/Textures/Structures/Wallmounts/air_monitors.rsi/auth_on.png create mode 100644 Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire0.png create mode 100644 Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_0.png create mode 100644 Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_1.png create mode 100644 Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_2.png create mode 100644 Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_3.png create mode 100644 Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_b0.png create mode 100644 Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_b1.png create mode 100644 Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_b2.png create mode 100644 Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_bitem.png create mode 100644 Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_detected.png create mode 100644 Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_emagged.png create mode 100644 Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_off.png create mode 100644 Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_on.png create mode 100644 Resources/Textures/Structures/Wallmounts/air_monitors.rsi/fire_overlay.png create mode 100644 Resources/Textures/Structures/Wallmounts/air_monitors.rsi/firex.png create mode 100644 Resources/Textures/Structures/Wallmounts/air_monitors.rsi/meta.json diff --git a/Content.Client/Atmos/Monitor/AtmosMonitorVisualizer.cs b/Content.Client/Atmos/Monitor/AtmosMonitorVisualizer.cs new file mode 100644 index 0000000000..dc86118e1e --- /dev/null +++ b/Content.Client/Atmos/Monitor/AtmosMonitorVisualizer.cs @@ -0,0 +1,67 @@ +using System.Collections.Generic; +using Content.Shared.Atmos.Monitor; +using Robust.Client.GameObjects; +using Robust.Client.Graphics; +using Robust.Shared.GameObjects; +using Robust.Shared.IoC; +using Robust.Shared.Maths; +using Robust.Shared.Serialization.Manager.Attributes; + +namespace Content.Client.Atmos.Monitor +{ + public class AtmosMonitorVisualizer : AppearanceVisualizer + { + [Dependency] IEntityManager _entityManager = default!; + [DataField("layerMap")] + private string _layerMap { get; } = string.Empty; + + [DataField("alarmStates")] + private readonly Dictionary _alarmStates = new(); + + [DataField("hideOnDepowered")] + private readonly List? _hideOnDepowered; + + // eh... + [DataField("setOnDepowered")] + private readonly Dictionary? _setOnDepowered; + + public override void InitializeEntity(EntityUid entity) + { + base.InitializeEntity(entity); + + IoCManager.InjectDependencies(this); + } + + public override void OnChangeData(AppearanceComponent component) + { + if (!_entityManager.TryGetComponent(component.Owner, out var sprite)) + return; + + if (!sprite.LayerMapTryGet(_layerMap, out int layer)) + return; + + if (component.TryGetData("powered", out var powered)) + { + if (_hideOnDepowered != null) + foreach (var visLayer in _hideOnDepowered) + if (sprite.LayerMapTryGet(visLayer, out int powerVisibilityLayer)) + sprite.LayerSetVisible(powerVisibilityLayer, powered); + + if (_setOnDepowered != null && !powered) + foreach (var (setLayer, state) in _setOnDepowered) + if (sprite.LayerMapTryGet(setLayer, out int setStateLayer)) + sprite.LayerSetState(setStateLayer, new RSI.StateId(state)); + } + + if (component.TryGetData("offset", out Vector2 offset)) + { + sprite.Offset = offset; + } + + if (component.TryGetData("alarmType", out var alarmType) + && powered) + if (_alarmStates.TryGetValue(alarmType, out var state)) + sprite.LayerSetState(layer, new RSI.StateId(state)); + } + } +} diff --git a/Content.Client/Atmos/Monitor/UI/AirAlarmBoundUserInterface.cs b/Content.Client/Atmos/Monitor/UI/AirAlarmBoundUserInterface.cs new file mode 100644 index 0000000000..0c28dd3b0e --- /dev/null +++ b/Content.Client/Atmos/Monitor/UI/AirAlarmBoundUserInterface.cs @@ -0,0 +1,87 @@ +using Content.Shared.Atmos; +using Content.Shared.Atmos.Monitor; +using Content.Shared.Atmos.Monitor.Components; +using Robust.Client.GameObjects; +using Robust.Shared.GameObjects; +using Robust.Shared.IoC; +using Robust.Shared.Log; + +namespace Content.Client.Atmos.Monitor.UI +{ + public class AirAlarmBoundUserInterface : BoundUserInterface + { + private AirAlarmWindow? _window; + + public AirAlarmBoundUserInterface(ClientUserInterfaceComponent owner, object uiKey) : base(owner, uiKey) + {} + + protected override void Open() + { + base.Open(); + + _window = new AirAlarmWindow(); + + if (State != null) UpdateState(State); + + _window.OpenCentered(); + + _window.OnClose += Close; + _window.AtmosDeviceDataChanged += OnDeviceDataChanged; + _window.AtmosAlarmThresholdChanged += OnThresholdChanged; + _window.AirAlarmModeChanged += OnAirAlarmModeChanged; + _window.ResyncAllRequested += ResyncAllDevices; + } + + private void ResyncAllDevices() + { + SendMessage(new AirAlarmResyncAllDevicesMessage()); + } + + private void OnDeviceDataChanged(string address, IAtmosDeviceData data) + { + SendMessage(new AirAlarmUpdateDeviceDataMessage(address, data)); + } + + private void OnAirAlarmModeChanged(AirAlarmMode mode) + { + SendMessage(new AirAlarmUpdateAlarmModeMessage(mode)); + } + + private void OnThresholdChanged(AtmosMonitorThresholdType type, AtmosAlarmThreshold threshold, Gas? gas = null) + { + SendMessage(new AirAlarmUpdateAlarmThresholdMessage(type, threshold, gas)); + } + + protected override void ReceiveMessage(BoundUserInterfaceMessage message) + { + if (_window == null) + return; + + switch (message) + { + case AirAlarmSetAddressMessage addrMsg: + _window.SetAddress(addrMsg.Address); + break; + case AirAlarmUpdateDeviceDataMessage deviceMsg: + _window.UpdateDeviceData(deviceMsg.Address, deviceMsg.Data); + break; + case AirAlarmUpdateAlarmModeMessage alarmMsg: + _window.UpdateModeSelector(alarmMsg.Mode); + break; + case AirAlarmUpdateAlarmThresholdMessage thresholdMsg: + _window.UpdateThreshold(ref thresholdMsg); + break; + case AirAlarmUpdateAirDataMessage airDataMsg: + _window.UpdateGasData(ref airDataMsg.AirData); + break; + } + } + + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + + if (disposing) _window?.Dispose(); + } + } +} diff --git a/Content.Client/Atmos/Monitor/UI/AirAlarmWindow.xaml b/Content.Client/Atmos/Monitor/UI/AirAlarmWindow.xaml new file mode 100644 index 0000000000..a75894647a --- /dev/null +++ b/Content.Client/Atmos/Monitor/UI/AirAlarmWindow.xaml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +