diff --git a/code/WorkInProgress/Mini/atmos_control.dm b/code/WorkInProgress/Mini/atmos_control.dm
index b89835de9d..bc868b9522 100644
--- a/code/WorkInProgress/Mini/atmos_control.dm
+++ b/code/WorkInProgress/Mini/atmos_control.dm
@@ -156,12 +156,14 @@
src.updateUsrDialog()
return
- if(href_list["atmos_unlock"])
- switch(href_list["atmos_unlock"])
- if("0")
- current.air_doors_close(1)
- if("1")
- current.air_doors_open(1)
+ //commenting this out because it causes compile errors
+ //I tried fixing it but wasn't sucessful.
+ //if(href_list["atmos_unlock"])
+ // switch(href_list["atmos_unlock"])
+ // if("0")
+ // current.alarm_area.air_doors_close()
+ // if("1")
+ // current.alarm_area.air_doors_open()
if(href_list["atmos_alarm"])
if (current.alarm_area.atmosalert(2))
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index 21b86f5bcc..29da204338 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -71,10 +71,28 @@
/area/proc/atmosalert(danger_level)
// if(type==/area) //No atmos alarms in space
// return 0 //redudant
+
+ //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)
+ if ( !(AA.stat & (NOPOWER|BROKEN)) && !AA.shorted)
+ danger_level = max(danger_level, AA.danger_level)
+
if(danger_level != atmosalm)
- //updateicon()
- //mouse_opacity = 0
- if (danger_level==2)
+ 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)
+
+ if (danger_level >= 2 && atmosalm < 2)
var/list/cameras = list()
for(var/area/RA in related)
//updateicon()
@@ -85,18 +103,35 @@
aiPlayer.triggerAlarm("Atmosphere", src, cameras, src)
for(var/obj/machinery/computer/station_alert/a in machines)
a.triggerAlarm("Atmosphere", src, cameras, src)
- else if (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)
+ air_doors_close()
+
atmosalm = danger_level
return 1
return 0
+/area/proc/air_doors_close()
+ if(!src.master.air_doors_activated)
+ src.master.air_doors_activated = 1
+ for(var/obj/machinery/door/firedoor/E in src.master.all_doors)
+ if(!E:blocked)
+ if(E.operating)
+ E:nextstate = CLOSED
+ else if(!E.density)
+ spawn(0)
+ E.close()
+
+/area/proc/air_doors_open()
+ if(src.master.air_doors_activated)
+ src.master.air_doors_activated = 0
+ for(var/obj/machinery/door/firedoor/E in src.master.all_doors)
+ if(!E:blocked)
+ if(E.operating)
+ E:nextstate = OPEN
+ else if(E.density)
+ spawn(0)
+ E.open()
+
+
/area/proc/firealert()
if(name == "Space") //no fire alarms in space
return
diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm
index 0c42cbbad6..ce0f503ee1 100644
--- a/code/game/machinery/alarm.dm
+++ b/code/game/machinery/alarm.dm
@@ -214,8 +214,7 @@
danger_level = overall_danger_level()
if (old_level != danger_level)
- refresh_danger_level()
- update_icon()
+ apply_danger_level(danger_level)
if (old_pressurelevel != pressure_dangerlevel)
if (breach_detected())
@@ -314,7 +313,12 @@
if((stat & (NOPOWER|BROKEN)) || shorted)
icon_state = "alarmp"
return
- switch(max(danger_level, alarm_area.atmosalm))
+
+ var/icon_level = danger_level
+ if (alarm_area.atmosalm)
+ icon_level = max(icon_level, 1) //if there's an atmos alarm but everything is okay locally, no need to go past yellow
+
+ switch(icon_level)
if (0)
icon_state = "alarm0"
if (1)
@@ -434,16 +438,6 @@
if (alarm_area.atmosalert(new_danger_level))
post_alert(new_danger_level)
- for (var/area/A in alarm_area.related)
- for (var/obj/machinery/alarm/AA in A)
- if ( !(AA.stat & (NOPOWER|BROKEN)) && !AA.shorted && AA.danger_level != new_danger_level)
- AA.update_icon()
-
- if(danger_level > 1)
- air_doors_close(0)
- else
- air_doors_open(0)
-
update_icon()
/obj/machinery/alarm/proc/post_alert(alert_level)
@@ -466,71 +460,6 @@
frequency.post_signal(src, alert_signal)
-/obj/machinery/alarm/proc/refresh_danger_level()
- var/level = 0
- for (var/area/A in alarm_area.related)
- for (var/obj/machinery/alarm/AA in A)
- if ( !(AA.stat & (NOPOWER|BROKEN)) && !AA.shorted)
- if (AA.danger_level > level)
- level = AA.danger_level
- apply_danger_level(level)
-
-/obj/machinery/alarm/proc/air_doors_close(manual)
- var/area/A = get_area(src)
- if(!A.master.air_doors_activated)
- A.master.air_doors_activated = 1
- for(var/obj/machinery/door/E in A.master.all_doors)
- if(istype(E,/obj/machinery/door/firedoor))
- if(!E:blocked)
- if(E.operating)
- E:nextstate = CLOSED
- else if(!E.density)
- spawn(0)
- E.close()
- continue
-
-/* if(istype(E, /obj/machinery/door/airlock))
- if((!E:arePowerSystemsOn()) || (E.stat & NOPOWER) || E:air_locked) continue
- if(!E.density)
- spawn(0)
- E.close()
- spawn(10)
- if(E.density)
- E:air_locked = E.req_access
- E:req_access = list(ACCESS_ENGINE, ACCESS_ATMOSPHERICS)
- E.update_icon()
- else if(E.operating)
- spawn(10)
- E.close()
- if(E.density)
- E:air_locked = E.req_access
- E:req_access = list(ACCESS_ENGINE, ACCESS_ATMOSPHERICS)
- E.update_icon()
- else if(!E:locked) //Don't lock already bolted doors.
- E:air_locked = E.req_access
- E:req_access = list(ACCESS_ENGINE, ACCESS_ATMOSPHERICS)
- E.update_icon()*/
-
-/obj/machinery/alarm/proc/air_doors_open(manual)
- var/area/A = get_area(loc)
- if(A.master.air_doors_activated)
- A.master.air_doors_activated = 0
- for(var/obj/machinery/door/E in A.master.all_doors)
- if(istype(E, /obj/machinery/door/firedoor))
- if(!E:blocked)
- if(E.operating)
- E:nextstate = OPEN
- else if(E.density)
- spawn(0)
- E.open()
- continue
-
-/* if(istype(E, /obj/machinery/door/airlock))
- if((!E:arePowerSystemsOn()) || (E.stat & NOPOWER)) continue
- if(!isnull(E:air_locked)) //Don't mess with doors locked for other reasons.
- E:req_access = E:air_locked
- E:air_locked = null
- E.update_icon()*/
///////////
//HACKING//
@@ -785,19 +714,24 @@ Toxins: [phoron_percent]%
output += "Temperature: [environment.temperature]K ([round(environment.temperature - T0C, 0.1)]C)
"
- //Overall status
+ //'Local Status' should report the LOCAL status, damnit.
output += "Local Status: "
switch(max(pressure_dangerlevel,oxygen_dangerlevel,co2_dangerlevel,phoron_dangerlevel,other_dangerlevel,temperature_dangerlevel))
if(2)
- output += "DANGER: Internals Required"
+ output += "DANGER: Internals Required
"
if(1)
- output += "Caution"
+ output += "Caution
"
if(0)
- if(alarm_area.atmosalm)
- output += {"Caution: Atmos alert in area"}
- else
- output += {"Optimal"}
+ output += "Optimal
"
+ output += "Area Status: "
+ if(alarm_area.atmosalm)
+ output += "Atmos alert in area"
+ else if (alarm_area.fire)
+ output += "Fire alarm in area"
+ else
+ output += "No alerts"
+
return output
/obj/machinery/alarm/proc/rcon_text()
@@ -828,9 +762,9 @@ Toxins: [phoron_percent]%
switch(screen)
if (AALARM_SCREEN_MAIN)
if(alarm_area.atmosalm)
- output += "Reset - Atmospheric Alarm