/datum/alarm var/area/area //the area associated with the alarm. Used to identify the alarm var/list/sources //list of things triggering the alarm. Used to determine when the alarm should be cleared. var/list/cameras //list of cameras that can be switched to, if the player has that capability. /datum/alarm/New(area/A, list/sourcelist=list(), list/cameralist=list()) area = A sources = sourcelist cameras = cameralist /mob/living/silicon var/alarms = list("Motion"=list(), "Fire"=list(), "Atmosphere"=list(), "Power"=list(), "Camera"=list()) //each sublist stores alarms keyed by the area name var/list/alarms_to_show = list() var/list/alarms_to_clear = list() var/list/alarm_types_show = list("Motion" = 0, "Fire" = 0, "Atmosphere" = 0, "Power" = 0, "Camera" = 0) var/list/alarm_types_clear = list("Motion" = 0, "Fire" = 0, "Atmosphere" = 0, "Power" = 0, "Camera" = 0) /mob/living/silicon/proc/triggerAlarm(var/class, area/A, list/cameralist, var/source) var/list/alarmlist = alarms[class] //see if there is already an alarm of this class for this area if (A.name in alarmlist) var/datum/alarm/existing = alarmlist[A.name] existing.sources += source existing.cameras |= cameralist else alarmlist[A.name] = new /datum/alarm(A, list(source), cameralist) /mob/living/silicon/proc/cancelAlarm(var/class, area/A as area, var/source) var/cleared = 0 var/list/alarmlist = alarms[class] if (A.name in alarmlist) var/datum/alarm/alarm = alarmlist[A.name] alarm.sources -= source if (!(alarm.sources.len)) cleared = 1 alarmlist -= A.name return !cleared /mob/living/silicon/proc/queueAlarm(var/message, var/type, var/incoming = 1) var/in_cooldown = (alarms_to_show.len > 0 || alarms_to_clear.len > 0) if(incoming) alarms_to_show += message alarm_types_show[type] += 1 else alarms_to_clear += message alarm_types_clear[type] += 1 if(!in_cooldown) spawn(10 * 10) // 10 seconds if(alarms_to_show.len < 5) for(var/msg in alarms_to_show) src << msg else if(alarms_to_show.len) var/msg = "--- " if(alarm_types_show["Motion"]) msg += "MOTION: [alarm_types_show["Motion"]] alarms detected. - " if(alarm_types_show["Fire"]) msg += "FIRE: [alarm_types_show["Fire"]] alarms detected. - " if(alarm_types_show["Atmosphere"]) msg += "ATMOSPHERE: [alarm_types_show["Atmosphere"]] alarms detected. - " if(alarm_types_show["Power"]) msg += "POWER: [alarm_types_show["Power"]] alarms detected. - " if(alarm_types_show["Camera"]) msg += "CAMERA: [alarm_types_show["Power"]] alarms detected. - " msg += "\[Show Alerts\]" src << msg if(alarms_to_clear.len < 3) for(var/msg in alarms_to_clear) src << msg else if(alarms_to_clear.len) var/msg = "--- " if(alarm_types_clear["Motion"]) msg += "MOTION: [alarm_types_clear["Motion"]] alarms cleared. - " if(alarm_types_clear["Fire"]) msg += "FIRE: [alarm_types_clear["Fire"]] alarms cleared. - " if(alarm_types_clear["Atmosphere"]) msg += "ATMOSPHERE: [alarm_types_clear["Atmosphere"]] alarms cleared. - " if(alarm_types_clear["Power"]) msg += "POWER: [alarm_types_clear["Power"]] alarms cleared. - " if(alarm_types_show["Camera"]) msg += "CAMERA: [alarm_types_show["Power"]] alarms detected. - " msg += "\[Show Alerts\]" src << msg alarms_to_show = list() alarms_to_clear = list() for(var/i = 1; i < alarm_types_show.len; i++) alarm_types_show[i] = 0 for(var/i = 1; i < alarm_types_clear.len; i++) alarm_types_clear[i] = 0