From 87877363a3d1b8d9a68f2b0bcdb024c0997d8bb1 Mon Sep 17 00:00:00 2001
From: Toastical <20125180+Toastical@users.noreply.github.com>
Date: Sun, 17 May 2026 14:56:53 +0300
Subject: [PATCH] Add fire alarm functionality to air alarms (#31970)
* Add fire alarm functionality to air alarms
* prettier
---
code/game/area/areas.dm | 19 +++++++++++--------
.../atmospherics/machinery/airalarm.dm | 9 +++++++++
tgui/packages/tgui/interfaces/AirAlarm.jsx | 11 ++++++++++-
tgui/public/tgui.bundle.js | 2 +-
4 files changed, 31 insertions(+), 10 deletions(-)
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index 60946d79b4d..903ac6d5cb7 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -341,10 +341,7 @@
if(!fire)
set_fire_alarm_effect()
ModifyFiredoors(FALSE)
- for(var/item in firealarms)
- var/obj/machinery/firealarm/F = item
- F.update_icon()
- GLOB.firealarm_soundloop.start(F)
+ start_alarm_sounds()
if(!firealarm_sound_stop_timer)
firealarm_sound_stop_timer = addtimer(CALLBACK(src, PROC_REF(stop_alarm_sounds)), 4 MINUTES, TIMER_STOPPABLE | TIMER_UNIQUE)
@@ -357,10 +354,19 @@
START_PROCESSING(SSobj, src)
+/area/proc/start_alarm_sounds()
+ for(var/obj/machinery/firealarm/F in firealarms)
+ F.update_icon()
+ GLOB.firealarm_soundloop.start(F)
+ for(var/obj/machinery/alarm/A in air_alarms)
+ GLOB.firealarm_soundloop.start(A)
+
/area/proc/stop_alarm_sounds()
for(var/obj/machinery/firealarm/F in firealarms)
F.update_icon()
GLOB.firealarm_soundloop.stop(F)
+ for(var/obj/machinery/alarm/A in air_alarms)
+ GLOB.firealarm_soundloop.stop(A)
/**
* Reset the firealarm alert for this area
*
@@ -376,10 +382,7 @@
if(firealarm_sound_stop_timer)
deltimer(firealarm_sound_stop_timer)
firealarm_sound_stop_timer = null
- for(var/item in firealarms)
- var/obj/machinery/firealarm/F = item
- F.update_icon()
- GLOB.firealarm_soundloop.stop(F, TRUE)
+ stop_alarm_sounds()
for(var/thing in cameras)
var/obj/machinery/camera/C = locateUID(thing)
diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm
index 4b17269260a..afc7063ab01 100644
--- a/code/modules/atmospherics/machinery/airalarm.dm
+++ b/code/modules/atmospherics/machinery/airalarm.dm
@@ -706,6 +706,9 @@ GLOBAL_LIST_INIT(aalarm_modes, list(
data["alarmActivated"] = alarmActivated || danger_level == ATMOS_ALARM_DANGER
data["thresholds"] = generate_thresholds_menu()
+ var/area/area_loc = get_area(src)
+ data["fireAlarmActivated"] = area_loc.fire
+
// Locked when:
// Not sent from atmos console AND
// Not silicon AND locked.
@@ -891,6 +894,12 @@ GLOBAL_LIST_INIT(aalarm_modes, list(
if(RCON_YES)
rcon_setting = RCON_YES
+ if("set_fire_alarm")
+ var/area/area_loc = get_area(src)
+ if(area_loc.fire)
+ area_loc.firereset(src)
+ else
+ area_loc.firealert(src)
if("command")
if(!is_authenticated(usr, active_ui))
diff --git a/tgui/packages/tgui/interfaces/AirAlarm.jsx b/tgui/packages/tgui/interfaces/AirAlarm.jsx
index 177a66bcf0a..f3de1160605 100644
--- a/tgui/packages/tgui/interfaces/AirAlarm.jsx
+++ b/tgui/packages/tgui/interfaces/AirAlarm.jsx
@@ -48,7 +48,7 @@ const Danger2Colour = (danger) => {
const AirStatus = (props) => {
const { act, data } = useBackend();
- const { air, mode, atmos_alarm, locked, alarmActivated, rcon, target_temp } = data;
+ const { air, mode, atmos_alarm, locked, alarmActivated, fireAlarmActivated, rcon, target_temp } = data;
let areaStatus;
if (air.danger.overall === 0) {
@@ -162,6 +162,15 @@ const AirStatus = (props) => {
)}
+
+ {!locked && (
+