Alarm centralization completion

Fire alarms now handled centrally.
This commit is contained in:
PsiOmega
2015-02-23 13:19:23 +01:00
parent 93b049e7a6
commit a2cd104cc9
10 changed files with 96 additions and 78 deletions

View File

@@ -4,6 +4,7 @@
var/source = null // The source trigger
var/source_name = "" // The name of the source should it be lost (for example a destroyed camera)
var/duration = 0 // How long this source will be alarming, 0 for indefinetely.
var/severity = 1 // How severe the alarm from this source is.
var/start_time = 0 // When this source began alarming.
var/end_time = 0 // Use to set when this trigger should clear, in case the source is lost.
@@ -22,11 +23,11 @@
var/area/last_camera_area //The last area in which cameras where fetched, used to see if the camera list should be updated.
var/end_time //Used to set when this alarm should clear, in case the origin is lost.
/datum/alarm/New(var/atom/origin, var/atom/source, var/duration)
/datum/alarm/New(var/atom/origin, var/atom/source, var/duration, var/severity)
src.origin = origin
cameras() // Sets up both cameras and last alarm area.
set_duration(source, duration)
set_source_data(source, duration, severity)
/datum/alarm/proc/process()
// Has origin gone missing?
@@ -41,7 +42,7 @@
AS.duration = 0
AS.end_time = world.time + ALARM_RESET_DELAY
/datum/alarm/proc/set_duration(var/atom/source, var/duration)
/datum/alarm/proc/set_source_data(var/atom/source, var/duration, var/severity)
var/datum/alarm_source/AS = sources_assoc[source]
if(!AS)
AS = new/datum/alarm_source(source)
@@ -51,6 +52,7 @@
if(AS.duration)
duration = SecondsToTicks(duration)
AS.duration = duration
AS.severity = severity
/datum/alarm/proc/clear(var/source)
var/datum/alarm_source/AS = sources_assoc[source]
@@ -83,22 +85,29 @@
last_camera_area = last_area
return cameras
/datum/alarm/proc/max_severity()
var/max_severity = 0
for(var/datum/alarm_source/AS in sources)
max_severity = max(AS.severity, max_severity)
return max_severity
/******************
* Assisting procs *
******************/
/atom/proc/get_alarm_area()
return get_area(src)
var/area/A = get_area(src)
return A.master
/area/get_alarm_area()
return src
return src.master
/atom/proc/get_alarm_name()
var/area/A = get_area(src)
return A.master.name
/area/get_alarm_name()
return name
return master.name
/mob/get_alarm_name()
return name

View File

@@ -12,7 +12,7 @@
A.process()
check_alarm_cleared(A)
/datum/alarm_handler/proc/triggerAlarm(var/atom/origin, var/atom/source, var/duration = 0)
/datum/alarm_handler/proc/triggerAlarm(var/atom/origin, var/atom/source, var/duration = 0, var/severity = 1)
var/new_alarm
//Proper origin and source mandatory
if(!(origin && source))
@@ -23,16 +23,16 @@
//see if there is already an alarm of this origin
var/datum/alarm/existing = alarms_assoc[origin]
if(existing)
existing.set_duration(source, duration)
existing.set_source_data(source, duration, severity)
else
existing = new/datum/alarm(origin, source, duration)
existing = new/datum/alarm(origin, source, duration, severity)
new_alarm = 1
alarms |= existing
alarms_assoc[origin] = existing
if(new_alarm)
alarms = dd_sortedObjectList(alarms)
notify_listeners(existing, ALARM_RAISED)
on_alarm_change(existing, ALARM_RAISED)
return new_alarm
@@ -51,10 +51,30 @@
if ((alarm.end_time && world.time > alarm.end_time) || !alarm.sources.len)
alarms -= alarm
alarms_assoc -= alarm.origin
notify_listeners(alarm, ALARM_CLEARED)
on_alarm_change(alarm, ALARM_CLEARED)
return 1
return 0
/datum/alarm_handler/proc/on_alarm_change(var/datum/alarm/alarm, var/was_raised)
for(var/obj/machinery/camera/C in alarm.cameras())
if(was_raised)
C.network.Add(category)
invalidateCameraCache()
else
C.network.Remove(category)
notify_listeners(alarm, was_raised)
/datum/alarm_handler/proc/get_alarm_severity_for_origin(var/atom/origin)
if(!origin)
return
origin = origin.get_alarm_origin()
var/datum/alarm/existing = alarms_assoc[origin]
if(!existing)
return
return existing.max_severity()
/atom/proc/get_alarm_origin()
return src

View File

@@ -1,2 +1,2 @@
/datum/alarm_handler/atmosphere
category = "Atmosphere"
category = "Atmosphere Alarms"

View File

@@ -1,2 +1,2 @@
/datum/alarm_handler/camera
category = "Camera"
category = "Camera Alarms"

View File

@@ -1,2 +1,11 @@
/datum/alarm_handler/fire
category = "Fire"
category = "Fire Alarms"
/datum/alarm_handler/fire/on_alarm_change(var/datum/alarm/alarm, var/was_raised)
var/area/A = alarm.origin
if(istype(A))
if(was_raised)
A.fire_alert()
else
A.fire_reset()
..()

View File

@@ -1,2 +1,2 @@
/datum/alarm_handler/motion
category = "Motion"
category = "Motion Alarms"

View File

@@ -1,10 +1,10 @@
/datum/alarm_handler/power
category = "Power"
category = "Power Alarms"
/datum/alarm_handler/power/notify_listeners(var/datum/alarm/alarm, var/was_raised)
..()
/datum/alarm_handler/power/on_alarm_change(var/datum/alarm/alarm, var/was_raised)
var/area/A = alarm.origin
if(istype(A))
A.power_alert(was_raised)
..()
/area/proc/power_alert(var/alarming)