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
" + output += "Reset - Area Atmospheric Alarm
" else - output += "Activate - Atmospheric Alarm
" + output += "Activate - Area Atmospheric Alarm
" output += {" Scrubbers Control
@@ -1093,9 +1027,9 @@ table tr:first-child th:first-child { border: none;} if(href_list["atmos_unlock"]) switch(href_list["atmos_unlock"]) if("0") - air_doors_close(1) + alarm_area.air_doors_close() if("1") - air_doors_open(1) + alarm_area.air_doors_open() if(href_list["atmos_alarm"]) if (alarm_area.atmosalert(2))