diff --git a/code/datums/wires/alarm.dm b/code/datums/wires/alarm.dm index 6ebc937265..c34b0291fb 100644 --- a/code/datums/wires/alarm.dm +++ b/code/datums/wires/alarm.dm @@ -46,7 +46,7 @@ var/const/AALARM_WIRE_AALARM = 16 //world << "Syphon Wire Cut" if(AALARM_WIRE_AALARM) - if (A.alarm_area.atmosalert(2)) + if (A.alarm_area.atmosalert(2, A)) A.post_alert(2) A.update_icon() @@ -88,6 +88,6 @@ var/const/AALARM_WIRE_AALARM = 16 if(AALARM_WIRE_AALARM) // world << "Aalarm wire pulsed" - if (A.alarm_area.atmosalert(0)) + if (A.alarm_area.atmosalert(0, A)) A.post_alert(0) A.update_icon() diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index bb0d5787ab..55cfeaccfb 100755 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -110,6 +110,9 @@ var/list/ghostteleportlocs = list() power_environ = 0 ambience = list('sound/ambience/ambispace.ogg','sound/music/title2.ogg','sound/music/space.ogg','sound/music/main.ogg','sound/music/traitor.ogg') +area/space/atmosalert() + return + /area/space/fire_alert() return diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 6e0005fa6e..ae11b5aa48 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -37,10 +37,7 @@ cameras += C return cameras -/area/proc/atmosalert(danger_level, var/set_firelocks=1) -// if(type==/area) //No atmos alarms in space -// return 0 //redudant - +/area/proc/atmosalert(danger_level, var/alarm_source) //Check all the alarms before lowering atmosalm. Raising is perfectly fine. for (var/area/RA in related) for (var/obj/machinery/alarm/AA in RA) @@ -48,37 +45,21 @@ danger_level = max(danger_level, AA.danger_level) if(danger_level != atmosalm) - if (set_firelocks && danger_level < 1 && atmosalm >= 1) + if (danger_level < 1 && atmosalm >= 1) //closing the doors on red and opening on green provides a bit of hysteresis that will hopefully prevent fire doors from opening and closing repeatedly due to noise air_doors_open() - /* - if (danger_level < 2 && atmosalm >= 2) - for(var/area/RA in related) - for(var/obj/machinery/camera/C in RA) - C.network.Remove("Atmosphere Alarms") - for(var/mob/living/silicon/aiPlayer in player_list) - aiPlayer.cancelAlarm("Atmosphere", src, src) - for(var/obj/machinery/computer/station_alert/a in machines) - a.cancelAlarm("Atmosphere", src, src) + else if (danger_level >= 2 && atmosalm < 2) + air_doors_close() - if (danger_level >= 2 && atmosalm < 2) - var/list/cameras = list() - for(var/area/RA in related) - //updateicon() - for(var/obj/machinery/camera/C in RA) - cameras += C - C.network.Add("Atmosphere Alarms") - for(var/mob/living/silicon/aiPlayer in player_list) - aiPlayer.triggerAlarm("Atmosphere", src, cameras, src) - for(var/obj/machinery/computer/station_alert/a in machines) - a.triggerAlarm("Atmosphere", src, cameras, src) - if (set_firelocks) - air_doors_close() + if (danger_level == 0) + atmosphere_alarm.clearAlarm(master, alarm_source) + else + atmosphere_alarm.triggerAlarm(master, alarm_source, severity = danger_level) atmosalm = danger_level for(var/area/RA in related) for (var/obj/machinery/alarm/AA in RA) - AA.update_icon() */ + AA.update_icon() return 1 return 0 diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index ccd88a10fe..0f2af7485f 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -117,14 +117,6 @@ first_run() -//needed to cancel the alarm after it is deleted -/obj/machinery/alarm/proc/delayed_reset() - var/area/A = alarm_area - src = null - spawn(600) - //It makes sense not to touch firelocks here. The alarm itself is gone, we have no idea what the atmos is like. - A.atmosalert(0, set_firelocks=0) - /obj/machinery/alarm/proc/first_run() alarm_area = get_area(src) if (alarm_area.master) @@ -436,7 +428,7 @@ send_signal(device_id, list("power"= 0) ) /obj/machinery/alarm/proc/apply_danger_level(var/new_danger_level) - if (report_danger_level && alarm_area.atmosalert(new_danger_level)) + if (report_danger_level && alarm_area.atmosalert(new_danger_level, src)) post_alert(new_danger_level) update_icon() @@ -454,12 +446,10 @@ if(alert_level==2) alert_signal.data["alert"] = "severe" - atmosphere_alarm.triggerAlarm(src.loc, src) else if (alert_level==1) alert_signal.data["alert"] = "minor" else if (alert_level==0) alert_signal.data["alert"] = "clear" - atmosphere_alarm.clearAlarm(src.loc, src) frequency.post_signal(src, alert_signal) @@ -766,13 +756,13 @@ return 1 if(href_list["atmos_alarm"]) - if (alarm_area.atmosalert(2)) + if (alarm_area.atmosalert(2, src)) apply_danger_level(2) update_icon() return 1 if(href_list["atmos_reset"]) - if (alarm_area.atmosalert(0)) + if (alarm_area.atmosalert(0, src)) apply_danger_level(0) update_icon() return 1 diff --git a/code/modules/alarm/alarm_handler.dm b/code/modules/alarm/alarm_handler.dm index 6ecc60eea2..ef9bfa8bd6 100644 --- a/code/modules/alarm/alarm_handler.dm +++ b/code/modules/alarm/alarm_handler.dm @@ -47,6 +47,12 @@ existing.clear(source) return check_alarm_cleared(existing) +/datum/alarm_handler/proc/major_alarms() + return alarms + +/datum/alarm_handler/proc/minor_alarms() + return alarms + /datum/alarm_handler/proc/check_alarm_cleared(var/datum/alarm/alarm) if ((alarm.end_time && world.time > alarm.end_time) || !alarm.sources.len) alarms -= alarm diff --git a/code/modules/alarm/atmosphere_alarm.dm b/code/modules/alarm/atmosphere_alarm.dm index 153b9b9f04..9751319111 100644 --- a/code/modules/alarm/atmosphere_alarm.dm +++ b/code/modules/alarm/atmosphere_alarm.dm @@ -1,2 +1,19 @@ /datum/alarm_handler/atmosphere category = "Atmosphere Alarms" + +/datum/alarm_handler/atmosphere/triggerAlarm(var/atom/origin, var/atom/source, var/duration = 0, var/severity = 1) + ..() + +/datum/alarm_handler/atmosphere/major_alarms() + var/list/major_alarms = new() + for(var/datum/alarm/A in alarms) + if(A.max_severity() > 1) + major_alarms.Add(A) + return major_alarms + +/datum/alarm_handler/atmosphere/minor_alarms() + var/list/minor_alarms = new() + for(var/datum/alarm/A in alarms) + if(A.max_severity() == 1) + minor_alarms.Add(A) + return minor_alarms diff --git a/code/modules/nano/modules/alarm_monitor.dm b/code/modules/nano/modules/alarm_monitor.dm index f828d9d776..e4de543498 100644 --- a/code/modules/nano/modules/alarm_monitor.dm +++ b/code/modules/nano/modules/alarm_monitor.dm @@ -56,7 +56,7 @@ var/categories[0] for(var/datum/alarm_handler/AH in alarm_handlers) categories[++categories.len] = list("category" = AH.category, "alarms" = list()) - for(var/datum/alarm/A in AH.alarms) + for(var/datum/alarm/A in AH.major_alarms()) var/cameras[0] var/lost_sources[0]