diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index 10aa1718dda..26b1d2d44aa 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -726,3 +726,7 @@ #define COMSIG_XENO_TURF_CLICK_CTRL "xeno_turf_click_alt" ///from monkey CtrlClickOn(): (/mob) #define COMSIG_XENO_MONKEY_CLICK_CTRL "xeno_monkey_click_ctrl" + +///SSalarm signals +#define COMSIG_TRIGGERED_ALARM "ssalarm_triggered" +#define COMSIG_CANCELLED_ALARM "ssalarm_cancelled" diff --git a/code/controllers/subsystem/alarm.dm b/code/controllers/subsystem/alarm.dm new file mode 100644 index 00000000000..9e310909120 --- /dev/null +++ b/code/controllers/subsystem/alarm.dm @@ -0,0 +1,32 @@ +SUBSYSTEM_DEF(alarm) + name = "Alarm" + flags = SS_NO_INIT | SS_NO_FIRE + var/alarms = list("Motion" = list(), "Fire" = list(), "Atmosphere" = list(), "Power" = list(), "Camera" = list(), "Burglar" = list()) + +/datum/controller/subsystem/alarm/proc/triggerAlarm(class, area/A, list/O, obj/alarmsource) + var/list/L = alarms[class] + for(var/I in L) + if(I == A.name) + var/list/alarm = L[I] + var/list/sources = alarm[3] + if(!(alarmsource.UID() in sources)) + sources += alarmsource.UID() + return TRUE + L[A.name] = list(get_area_name(A, TRUE), O, list(alarmsource.UID())) + SEND_SIGNAL(SSalarm, COMSIG_TRIGGERED_ALARM, class, A, O, alarmsource) + return TRUE + +/datum/controller/subsystem/alarm/proc/cancelAlarm(class, area/A, obj/origin) + var/list/L = alarms[class] + var/cleared = FALSE + for(var/I in L) + if(I == A.name) + var/list/alarm = L[I] + var/list/srcs = alarm[3] + if(origin.UID() in srcs) + srcs -= origin.UID() + if(srcs.len == 0) + cleared = TRUE + L -= I + + SEND_SIGNAL(SSalarm, COMSIG_CANCELLED_ALARM, class, A, origin, cleared) diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index ef9cce290c2..9e3dd435a28 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -176,26 +176,10 @@ else C.network |= "Power Alarms" - for(var/item in GLOB.silicon_mob_list) - var/mob/living/silicon/aiPlayer = item - if(state == 1) - aiPlayer.cancelAlarm("Power", src, source) - else - aiPlayer.triggerAlarm("Power", src, cameras, source) - - for(var/item in GLOB.alert_consoles) - var/obj/machinery/computer/station_alert/a = item - if(state == 1) - a.cancelAlarm("Power", src, source) - else - a.triggerAlarm("Power", src, cameras, source) - - /* for(var/item in GLOB.alarmdisplay) //TO-DO:TGUI--Uncomment Modular computers - var/datum/computer_file/program/alarm_monitor/p = item - if(state == 1) - p.cancelAlarm("Power", src, source) - else - p.triggerAlarm("Power", src, cameras, source) */ + if(state == 1) + SSalarm.cancelAlarm("Power", src, source) + else + SSalarm.triggerAlarm("Power", src, cameras, source) /** * Generate an atmospheric alert for this area @@ -211,30 +195,16 @@ if(!QDELETED(C)) C.network |= "Atmosphere Alarms" - for(var/item in GLOB.silicon_mob_list) - var/mob/living/silicon/aiPlayer = item - aiPlayer.triggerAlarm("Atmosphere", src, cameras, source) - for(var/item in GLOB.alert_consoles) - var/obj/machinery/computer/station_alert/a = item - a.triggerAlarm("Atmosphere", src, cameras, source) - /* for(var/item in GLOB.alarmdisplay) //TO-DO:TGUI--Uncomment Modular computers - var/datum/computer_file/program/alarm_monitor/p = item - p.triggerAlarm("Atmosphere", src, cameras, source) */ + + SSalarm.triggerAlarm("Atmosphere", src, cameras, source) else if(atmosalm == ATMOS_ALARM_DANGER) for(var/thing in cameras) var/obj/machinery/camera/C = locateUID(thing) if(!QDELETED(C)) C.network -= "Atmosphere Alarms" - for(var/item in GLOB.silicon_mob_list) - var/mob/living/silicon/aiPlayer = item - aiPlayer.cancelAlarm("Atmosphere", src, source) - for(var/item in GLOB.alert_consoles) - var/obj/machinery/computer/station_alert/a = item - a.cancelAlarm("Atmosphere", src, source) - /* for(var/item in GLOB.alarmdisplay) //TO-DO:TGUI--Uncomment Modular computers - var/datum/computer_file/program/alarm_monitor/p = item - p.cancelAlarm("Atmosphere", src, source) */ + + SSalarm.cancelAlarm("Atmosphere", src, source) atmosalm = danger_level return TRUE @@ -284,15 +254,7 @@ if(!QDELETED(C)) C.network |= "Fire Alarms" - for(var/item in GLOB.alert_consoles) - var/obj/machinery/computer/station_alert/a = item - a.triggerAlarm("Fire", src, cameras, source) - for(var/item in GLOB.silicon_mob_list) - var/mob/living/silicon/aiPlayer = item - aiPlayer.triggerAlarm("Fire", src, cameras, source) -/* for(var/item in GLOB.alarmdisplay) //TO-DO:TGUI--Uncomment Modular computers - var/datum/computer_file/program/alarm_monitor/p = item - p.triggerAlarm("Fire", src, cameras, source) */ + SSalarm.triggerAlarm("Fire", src, cameras, source) START_PROCESSING(SSobj, src) @@ -317,15 +279,7 @@ if(!QDELETED(C)) C.network -= "Fire Alarms" - for(var/item in GLOB.silicon_mob_list) - var/mob/living/silicon/aiPlayer = item - aiPlayer.cancelAlarm("Fire", src, source) - for(var/item in GLOB.alert_consoles) - var/obj/machinery/computer/station_alert/a = item - a.cancelAlarm("Fire", src, source) -/* for(var/item in GLOB.alarmdisplay) //TO-DO:TGUI--Uncomment Modular computers - var/datum/computer_file/program/alarm_monitor/p = item - p.cancelAlarm("Fire", src, source) */ + SSalarm.cancelAlarm("Fire", src, source) STOP_PROCESSING(SSobj, src) @@ -386,11 +340,9 @@ for(var/obj/machinery/door/DOOR in src) close_and_lock_door(DOOR) - for(var/i in GLOB.silicon_mob_list) - var/mob/living/silicon/SILICON = i - if(SILICON.triggerAlarm("Burglar", src, cameras, trigger)) - //Cancel silicon alert after 1 minute - addtimer(CALLBACK(SILICON, /mob/living/silicon.proc/cancelAlarm, "Burglar", src, trigger), 600) + if(SSalarm.triggerAlarm("Burglar", src, cameras, trigger)) + //Cancel silicon alert after 1 minute + addtimer(CALLBACK(SSalarm, /datum/controller/subsystem/alarm.proc/cancelAlarm, "Burglar", src, trigger), 600) /** * Trigger the fire alarm visual affects in an area diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 62db9341e5c..6041cdcf119 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -332,13 +332,11 @@ /obj/machinery/camera/proc/triggerCameraAlarm() alarm_on = TRUE - for(var/mob/living/silicon/S in GLOB.silicon_mob_list) - S.triggerAlarm("Camera", get_area(src), list(UID()), src) + SSalarm.triggerAlarm("Camera", get_area(src), list(UID()), src) /obj/machinery/camera/proc/cancelCameraAlarm() alarm_on = FALSE - for(var/mob/living/silicon/S in GLOB.silicon_mob_list) - S.cancelAlarm("Camera", get_area(src), src) + SSalarm.cancelAlarm("Camera", get_area(src), src) /obj/machinery/camera/proc/can_use() if(!status) diff --git a/code/game/machinery/camera/motion.dm b/code/game/machinery/camera/motion.dm index 47e98006e2a..9615d4afcce 100644 --- a/code/game/machinery/camera/motion.dm +++ b/code/game/machinery/camera/motion.dm @@ -44,20 +44,17 @@ /obj/machinery/camera/proc/cancelAlarm() if(detectTime == -1) - for(var/i in GLOB.silicon_mob_list) - var/mob/living/silicon/aiPlayer = i - if(status) - aiPlayer.cancelAlarm("Motion", get_area(src), src) + if(status) + SSalarm.cancelAlarm("Motion", get_area(src), src) detectTime = 0 return TRUE /obj/machinery/camera/proc/triggerAlarm() if(!detectTime) return FALSE - for(var/mob/living/silicon/aiPlayer in GLOB.player_list) - if(status) - aiPlayer.triggerAlarm("Motion", get_area(src), list(UID()), src) - visible_message("A red light flashes on the [src]!") + if(status) + SSalarm.triggerAlarm("Motion", get_area(src), list(UID()), src) + visible_message("A red light flashes on the [src]!") detectTime = -1 return TRUE diff --git a/code/game/machinery/computer/station_alert.dm b/code/game/machinery/computer/station_alert.dm index 679fd0c63b3..244a253d3af 100644 --- a/code/game/machinery/computer/station_alert.dm +++ b/code/game/machinery/computer/station_alert.dm @@ -8,11 +8,13 @@ circuit = /obj/item/circuitboard/stationalert_engineering var/ui_x = 325 var/ui_y = 500 - var/alarms = list("Fire" = list(), "Atmosphere" = list(), "Power" = list()) + var/list/alarms_listend_for = list("Fire", "Atmosphere", "Power") /obj/machinery/computer/station_alert/Initialize(mapload) . = ..() GLOB.alert_consoles += src + RegisterSignal(SSalarm, COMSIG_TRIGGERED_ALARM, .proc/alarm_triggered) + RegisterSignal(SSalarm, COMSIG_CANCELLED_ALARM, .proc/alarm_cancelled) /obj/machinery/computer/station_alert/Destroy() GLOB.alert_consoles -= src @@ -40,53 +42,39 @@ var/list/data = list() data["alarms"] = list() - for(var/class in alarms) + for(var/class in SSalarm.alarms) + if(!(class in alarms_listend_for)) + continue data["alarms"][class] = list() - for(var/area in alarms[class]) + for(var/area in SSalarm.alarms[class]) data["alarms"][class] += area return data -/obj/machinery/computer/station_alert/proc/triggerAlarm(class, area/A, list/O, obj/alarmsource) +/obj/machinery/computer/station_alert/proc/alarm_triggered(src, class, area/A, list/O, obj/alarmsource) + if(!(class in alarms_listend_for)) + return if(alarmsource.z != z) return if(stat & (BROKEN)) return - - var/list/L = alarms[class] - for(var/I in L) - if(I == A.name) - var/list/alarm = L[I] - var/list/sources = alarm[3] - if(!(alarmsource.UID() in sources)) - sources += alarmsource.UID() - return TRUE - L[A.name] = list(get_area_name(A, TRUE), O, list(alarmsource.UID())) update_icon() - return TRUE - -/obj/machinery/computer/station_alert/proc/cancelAlarm(class, area/A, obj/origin) +/obj/machinery/computer/station_alert/proc/alarm_cancelled(src, class, area/A, obj/origin, cleared) + if(!(class in alarms_listend_for)) + return + if(origin.z != z) + return if(stat & (BROKEN)) return - var/list/L = alarms[class] - var/cleared = FALSE - for(var/I in L) - if(I == A.name) - var/list/alarm = L[I] - var/list/srcs = alarm[3] - if(origin.UID() in srcs) - srcs -= origin.UID() - if(srcs.len == 0) - cleared = TRUE - L -= I update_icon() - return !cleared /obj/machinery/computer/station_alert/update_icon() var/active_alarms = FALSE - for(var/cat in alarms) - var/list/L = alarms[cat] + for(var/cat in SSalarm.alarms) + if(!(cat in alarms_listend_for)) + continue + var/list/L = SSalarm.alarms[cat] if(L.len) active_alarms = TRUE if(active_alarms) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 2fc14cb9f7c..c922b2f9148 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -50,7 +50,7 @@ GLOBAL_LIST_INIT(ai_verbs_default, list( var/list/connected_robots = list() var/aiRestorePowerRoutine = 0 //var/list/laws = list() - var/alarms = list("Motion" = list(), "Fire" = list(), "Atmosphere" = list(), "Power" = list(), "Camera" = list(), "Burglar" =list()) + alarms_listend_for = list("Motion", "Fire", "Atmosphere", "Power", "Camera", "Burglar") var/viewalerts = 0 var/icon/holo_icon//Default is assigned when AI is created. var/obj/mecha/controlled_mech //For controlled_mech a mech, to determine whether to relaymove or use the AI eye. @@ -244,9 +244,11 @@ GLOBAL_LIST_INIT(ai_verbs_default, list( /mob/living/silicon/ai/proc/ai_alerts() var/dat = "