Skip to content

Commit

Permalink
Rewrites alarm handler for multi z functionality
Browse files Browse the repository at this point in the history
  • Loading branch information
Hubblenaut committed Jan 26, 2018
1 parent dad855d commit a8c062a
Show file tree
Hide file tree
Showing 5 changed files with 44 additions and 37 deletions.
15 changes: 6 additions & 9 deletions code/game/machinery/computer/atmos_alert.dm
Expand Up @@ -28,10 +28,10 @@ var/global/list/minor_air_alarms = list()
var/major_alarms[0]
var/minor_alarms[0]

for(var/datum/alarm/alarm in atmosphere_alarm.major_alarms())
for(var/datum/alarm/alarm in atmosphere_alarm.major_alarms(get_z(src)))
major_alarms[++major_alarms.len] = list("name" = sanitize(alarm.alarm_name()), "ref" = "\ref[alarm]")

for(var/datum/alarm/alarm in atmosphere_alarm.minor_alarms())
for(var/datum/alarm/alarm in atmosphere_alarm.minor_alarms(get_z(src)))
minor_alarms[++minor_alarms.len] = list("name" = sanitize(alarm.alarm_name()), "ref" = "\ref[alarm]")

data["priority_alarms"] = major_alarms
Expand All @@ -46,15 +46,12 @@ var/global/list/minor_air_alarms = list()

/obj/machinery/computer/atmos_alert/update_icon()
if(!(stat & (NOPOWER|BROKEN)))
var/list/alarms = atmosphere_alarm.major_alarms()
if(alarms.len)
if(atmosphere_alarm.has_major_alarms(get_z(src)))
icon_screen = "alert:2"
else if (atmosphere_alarm.has_minor_alarms(get_z(src)))
icon_screen = "alert:1"
else
alarms = atmosphere_alarm.minor_alarms()
if(alarms.len)
icon_screen = "alert:1"
else
icon_screen = initial(icon_screen)
icon_screen = initial(icon_screen)
..()

/obj/machinery/computer/atmos_alert/OnTopic(user, href_list)
Expand Down
3 changes: 1 addition & 2 deletions code/game/machinery/computer/station_alert.dm
Expand Up @@ -59,7 +59,6 @@
icon_screen = initial(icon_screen)
if(!(stat & (BROKEN|NOPOWER)))
if(alarm_monitor)
var/list/alarms = alarm_monitor.major_alarms()
if(alarms.len)
if(alarm_monitor.has_major_alarms(get_z(src)))
icon_screen = "alert:2"
..()
31 changes: 23 additions & 8 deletions code/modules/alarm/alarm_handler.dm
Expand Up @@ -5,6 +5,7 @@
var/category = ""
var/list/datum/alarm/alarms = new // All alarms, to handle cases when an origin has been deleted with one or more active alarms
var/list/datum/alarm/alarms_assoc = new // Associative list of alarms, to efficiently acquire them based on origin.
var/list/datum/alarm/alarms_by_z = new // Associative list of alarms based on origin z level
var/list/listeners = new // A list of all objects interested in alarm changes.

/datum/alarm_handler/proc/process()
Expand All @@ -30,6 +31,7 @@

alarms |= existing
alarms_assoc[origin] = existing
LAZYADD(alarms_by_z["[existing.alarm_z()]"], existing)
if(new_alarm)
alarms = dd_sortedObjectList(alarms)
on_alarm_change(existing, ALARM_RAISED)
Expand All @@ -47,21 +49,34 @@
existing.clear(source)
return check_alarm_cleared(existing)

/datum/alarm_handler/proc/major_alarms()
return alarms
// Returns alarms in connected z levels to z_level. If none is given, returns all.
/datum/alarm_handler/proc/alarms(var/z_level)
if(z_level)
. = list()
for(var/z in GetConnectedZlevels(z_level))
. += alarms_by_z["[z]"] || list()
else
return alarms

/datum/alarm_handler/proc/has_major_alarms()
if(alarms && alarms.len)
return 1
return 0
// Returns major alarms in connected z levels to z_level. If none is given, returns all.
/datum/alarm_handler/proc/major_alarms(var/z_level)
return alarms(z_level)

/datum/alarm_handler/proc/has_major_alarms(var/z_level)
return !!length(major_alarms(z_level))

// Returns minor alarms in connected z levels to z_level. If none is given, returns all.
/datum/alarm_handler/proc/minor_alarms(var/z_level)
return alarms(z_level)

/datum/alarm_handler/proc/minor_alarms()
return alarms
/datum/alarm_handler/proc/has_minor_alarms(var/z_level)
return !!length(minor_alarms(z_level))

/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
alarms_assoc -= alarm.origin
alarms_by_z["[alarm.alarm_z()]"] -= alarm
on_alarm_change(alarm, ALARM_CLEARED)
return 1
return 0
Expand Down
18 changes: 8 additions & 10 deletions code/modules/alarm/atmosphere_alarm.dm
Expand Up @@ -4,16 +4,14 @@
/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)
/datum/alarm_handler/atmosphere/major_alarms(var/z_level)
. = list()
for(var/datum/alarm/A in ..())
if(A.max_severity() > 1)
major_alarms.Add(A)
return major_alarms
. += A

/datum/alarm_handler/atmosphere/minor_alarms()
var/list/minor_alarms = new()
for(var/datum/alarm/A in alarms)
/datum/alarm_handler/atmosphere/minor_alarms(var/z_level)
. = list()
for(var/datum/alarm/A in ..())
if(A.max_severity() == 1)
minor_alarms.Add(A)
return minor_alarms
. += A
Expand Up @@ -4,7 +4,6 @@
nanomodule_path = /datum/nano_module/alarm_monitor/engineering
ui_header = "alarm_green.gif"
program_icon_state = "alert-green"
program_key_state = "atmos_key"
program_menu_icon = "alert"
extended_desc = "This program provides visual interface for the alarm system."
requires_ntnet = 1
Expand All @@ -27,6 +26,7 @@
ui_header = "alarm_green.gif"
update_computer_icon()
has_alert = 0
return 1

/datum/nano_module/alarm_monitor
name = "Alarm monitor"
Expand Down Expand Up @@ -64,29 +64,29 @@
/datum/nano_module/alarm_monitor/proc/all_alarms()
var/list/all_alarms = new()
for(var/datum/alarm_handler/AH in alarm_handlers)
all_alarms += AH.alarms
all_alarms += AH.alarms(get_host_z())

return all_alarms

/datum/nano_module/alarm_monitor/proc/major_alarms()
var/list/all_alarms = new()
for(var/datum/alarm_handler/AH in alarm_handlers)
all_alarms += AH.major_alarms()
all_alarms += AH.major_alarms(get_host_z())

return all_alarms

// Modified version of above proc that uses slightly less resources, returns 1 if there is a major alarm, 0 otherwise.
/datum/nano_module/alarm_monitor/proc/has_major_alarms()
for(var/datum/alarm_handler/AH in alarm_handlers)
if(AH.has_major_alarms())
if(AH.has_major_alarms(get_host_z()))
return 1

return 0

/datum/nano_module/alarm_monitor/proc/minor_alarms()
var/list/all_alarms = new()
for(var/datum/alarm_handler/AH in alarm_handlers)
all_alarms += AH.minor_alarms()
all_alarms += AH.minor_alarms(get_host_z())

return all_alarms

Expand All @@ -107,9 +107,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.major_alarms())
if(!AreConnectedZLevels(get_host_z(), A.alarm_z()))
continue
for(var/datum/alarm/A in AH.major_alarms(get_host_z()))

var/cameras[0]
var/lost_sources[0]
Expand Down

0 comments on commit a8c062a

Please sign in to comment.