diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index c42ad887141..37f2b52023c 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -98,7 +98,12 @@ var/request_console_name /// Whether request consoles in this area can send announcements. var/request_console_announces = FALSE - + /// Fire alarm camera network + var/fire_cam_network = "Fire Alarms Debug" + /// Power alarm camera network + var/power_cam_network = "Power Alarms Debug" + /// Atmosphere alarm camera network + var/atmos_cam_network = "Atmosphere Alarms Debug" /* Lighting Vars */ @@ -235,11 +240,11 @@ return for(var/thing in cameras) var/obj/machinery/camera/C = locateUID(thing) - if(!QDELETED(C) && is_station_level(C.z)) + if(!QDELETED(C)) if(state) - C.network -= "Power Alarms" + C.network -= power_cam_network else - C.network |= "Power Alarms" + C.network |= power_cam_network if(state) GLOB.alarm_manager.cancel_alarm("Power", src, source) @@ -257,8 +262,8 @@ for(var/thing in cameras) var/obj/machinery/camera/C = locateUID(thing) - if(!QDELETED(C) && is_station_level(C.z)) - C.network |= "Atmosphere Alarms" + if(!QDELETED(C)) + C.network |= atmos_cam_network GLOB.alarm_manager.trigger_alarm("Atmosphere", src, cameras, source) @@ -266,8 +271,8 @@ else if(atmosalm == ATMOS_ALARM_DANGER) for(var/thing in cameras) var/obj/machinery/camera/C = locateUID(thing) - if(!QDELETED(C) && is_station_level(C.z)) - C.network -= "Atmosphere Alarms" + if(!QDELETED(C)) + C.network -= atmos_cam_network GLOB.alarm_manager.cancel_alarm("Atmosphere", src, source) @@ -329,8 +334,8 @@ for(var/thing in cameras) var/obj/machinery/camera/C = locateUID(thing) - if(!QDELETED(C) && is_station_level(C.z)) - C.network |= "Fire Alarms" + if(!QDELETED(C)) + C.network |= fire_cam_network GLOB.alarm_manager.trigger_alarm("Fire", src, cameras, source) @@ -355,8 +360,8 @@ for(var/thing in cameras) var/obj/machinery/camera/C = locateUID(thing) - if(!QDELETED(C) && is_station_level(C.z)) - C.network -= "Fire Alarms" + if(!QDELETED(C)) + C.network -= fire_cam_network GLOB.alarm_manager.cancel_alarm("Fire", src, source) @@ -546,3 +551,18 @@ /area/drop_location() CRASH("Bad op: area/drop_location() called") + +/// Returns highest area type in the hirarchy of a given ruin or /area/station if it is given a station area. +/// For an example the top parent of area/ruin/space/bar/backroom is area/ruin/space/bar +/area/proc/get_top_parent_type() + var/top_parent_type = type + + if(parent_type in subtypesof(/area/ruin)) + // figure out which ruin we are on + while(!(type2parent(top_parent_type) in GLOB.ruin_prototypes)) + top_parent_type = type2parent(top_parent_type) + else if(parent_type in subtypesof(/area/station)) + top_parent_type = /area/station + else + top_parent_type = null + return top_parent_type diff --git a/code/game/area/ss13_areas/station_area.dm b/code/game/area/ss13_areas/station_area.dm new file mode 100644 index 00000000000..6e88b147b82 --- /dev/null +++ b/code/game/area/ss13_areas/station_area.dm @@ -0,0 +1,4 @@ +/area/station + fire_cam_network = "Fire Alarms" + atmos_cam_network = "Atmosphere Alarms" + power_cam_network = "Power Alarms" diff --git a/code/game/machinery/computer/atmos_alert.dm b/code/game/machinery/computer/atmos_alert.dm index 93435e09ba4..ae795b6b92e 100644 --- a/code/game/machinery/computer/atmos_alert.dm +++ b/code/game/machinery/computer/atmos_alert.dm @@ -7,33 +7,33 @@ light_color = LIGHT_COLOR_CYAN // List of alarms and their state in areas. This is sent to TGUI var/list/alarm_cache + var/parent_area_type /obj/machinery/computer/atmos_alert/Initialize(mapload) . = ..() alarm_cache = list() alarm_cache["minor"] = list() alarm_cache["priority"] = list() + var/area/machine_area = get_area(src) + parent_area_type = machine_area.get_top_parent_type() /obj/machinery/computer/atmos_alert/process() // This is relatively cheap because the areas list is pretty small - for(var/area/A as anything in GLOB.all_areas) - if(!A.master_air_alarm) - continue // No alarm - if(A.master_air_alarm.z != z) - continue // Not on our z-level - if(!A.master_air_alarm.report_danger_level) + for(var/obj/machinery/alarm/air_alarm as anything in GLOB.air_alarms) + if(!((get_area(air_alarm)).type in typesof(parent_area_type)) || air_alarm.z != z) + continue // Not an area we monitor, or outside our z-level + if(!air_alarm.report_danger_level) continue - - switch(A.atmosalm) + switch(air_alarm.alarm_area.atmosalm) if(ATMOS_ALARM_DANGER) - alarm_cache["priority"] |= A.name - alarm_cache["minor"] -= A.name + alarm_cache["priority"] |= air_alarm.alarm_area.name + alarm_cache["minor"] -= air_alarm.alarm_area.name if(ATMOS_ALARM_WARNING) - alarm_cache["priority"] -= A.name - alarm_cache["minor"] |= A.name + alarm_cache["priority"] -= air_alarm.alarm_area.name + alarm_cache["minor"] |= air_alarm.alarm_area.name else - alarm_cache["priority"] -= A.name - alarm_cache["minor"] -= A.name + alarm_cache["priority"] -= air_alarm.alarm_area.name + alarm_cache["minor"] -= air_alarm.alarm_area.name update_icon() diff --git a/code/game/machinery/computer/atmos_controllers.dm b/code/game/machinery/computer/atmos_controllers.dm index cb1d2638e43..9e005b49b46 100644 --- a/code/game/machinery/computer/atmos_controllers.dm +++ b/code/game/machinery/computer/atmos_controllers.dm @@ -506,10 +506,15 @@ GLOBAL_LIST_EMPTY(gas_sensors) circuit = /obj/item/circuitboard/atmoscontrol req_access = list(ACCESS_ATMOSPHERICS) var/datum/ui_module/atmos_control/atmos_control + var/parent_area_type /obj/machinery/computer/atmoscontrol/Initialize(mapload) . = ..() atmos_control = new(src) + var/area/machine_area = get_area(src) + parent_area_type = machine_area.get_top_parent_type() + atmos_control.parent_area_type = parent_area_type + atmos_control.z_level = z /obj/machinery/computer/atmoscontrol/Destroy() QDEL_NULL(atmos_control) @@ -529,6 +534,7 @@ GLOBAL_LIST_EMPTY(gas_sensors) /obj/machinery/computer/atmoscontrol/ui_interact(mob/user, datum/tgui/ui = null) atmos_control.ui_interact(user, ui) + #undef SENSOR_PRESSURE #undef SENSOR_TEMPERATURE #undef SENSOR_O2 diff --git a/code/game/machinery/computer/camera_console.dm b/code/game/machinery/computer/camera_console.dm index bc7f2429707..b53aeb6d3b7 100644 --- a/code/game/machinery/computer/camera_console.dm +++ b/code/game/machinery/computer/camera_console.dm @@ -302,9 +302,17 @@ icon_keyboard = "power_key" icon_screen = "engie_cams" light_color = "#FAC54B" - network = list("Power Alarms","Atmosphere Alarms","Fire Alarms") + network = list() circuit = /obj/item/circuitboard/camera/engineering +/obj/machinery/computer/security/engineering/Initialize() + . = ..() + network = list() + var/area/console_area = get_area(src) + network += console_area.fire_cam_network + network += console_area.power_cam_network + network += console_area.atmos_cam_network + /obj/machinery/computer/security/telescreen/engine name = "engine monitor" desc = "A telescreen that connects to the engine's camera network."; diff --git a/code/game/machinery/computer/station_alert.dm b/code/game/machinery/computer/station_alert.dm index 70eca5d3982..5075852969d 100644 --- a/code/game/machinery/computer/station_alert.dm +++ b/code/game/machinery/computer/station_alert.dm @@ -7,12 +7,19 @@ light_color = LIGHT_COLOR_CYAN circuit = /obj/item/circuitboard/stationalert_engineering var/list/alarms_listend_for = list("Fire", "Atmosphere", "Power") + var/parent_area_type + var/list/areas = list() /obj/machinery/computer/station_alert/Initialize(mapload) . = ..() RegisterSignal(GLOB.alarm_manager, COMSIG_TRIGGERED_ALARM, PROC_REF(alarm_triggered)) RegisterSignal(GLOB.alarm_manager, COMSIG_CANCELLED_ALARM, PROC_REF(alarm_cancelled)) + var/area/machine_area = get_area(src) + parent_area_type = machine_area.get_top_parent_type() + if(parent_area_type) + areas = typesof(parent_area_type) + /obj/machinery/computer/station_alert/attack_ai(mob/user) add_fingerprint(user) @@ -46,7 +53,7 @@ for(var/area in GLOB.alarm_manager.alarms[class]) for(var/thing in GLOB.alarm_manager.alarms[class][area][3]) var/atom/A = locateUID(thing) - if(atoms_share_level(A, src)) + if(A && ((get_area(A)).type in areas) && A.z == z) data["alarms"][class] += area return data diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index 899cf969e00..b56a3151cdc 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -62,6 +62,12 @@ GLOBAL_LIST_EMPTY(gravity_generators) list(1, 1, 1), list(1, MACH_CENTER, 1), )) + + var/area/machine_area = get_area(src) + parent_area_type = machine_area.get_top_parent_type() + if(parent_area_type) + areas = typesof(parent_area_type) + update_gen_list() set_power() @@ -86,6 +92,8 @@ GLOBAL_LIST_EMPTY(gravity_generators) var/current_overlay = null var/construction_state = GRAV_NEEDS_WELDING var/overlay_state = "activated" + var/parent_area_type + var/areas = list() /obj/machinery/gravity_generator/main/examine(mob/user) . = ..() @@ -267,24 +275,21 @@ GLOBAL_LIST_EMPTY(gravity_generators) change_power_mode(on ? ACTIVE_POWER_USE : IDLE_POWER_USE) if(gravity) // If we turned on - if(generators_in_level() == 0) // And there's no other gravity generators on this z level + if(generators_in_area() == 0) // And there's no other gravity generators on this z level alert = TRUE investigate_log("was brought online and is now producing gravity for this level.", "gravity") message_admins("The gravity generator was brought online. ([src_area.name])") for(var/area/A in world) - if(!is_station_level(A.z)) - continue - A.gravitychange(TRUE, A) + if((A.type in areas) && A.z == z) + A.gravitychange(TRUE, A) - else if(generators_in_level() == 1) // Turned off, and there is only one gravity generator on the Z level + else if(generators_in_area() == 1) // Turned off, and there is only one gravity generator on the Z level alert = TRUE investigate_log("was brought offline and there is now no gravity for this level.", "gravity") message_admins("The gravity generator was brought offline with no backup generator. ([src_area.name])") for(var/area/A in world) - if(!is_station_level(A.z)) - continue - A.gravitychange(FALSE, A) - + if((A.type in areas) && A.z == z) + A.gravitychange(FALSE, A) update_icon() update_gen_list() if(alert) @@ -339,7 +344,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) radiation_pulse(get_turf(L), 600, 2) /** - * Shake everyone on the z level and play an alarm to let them know that gravity was enagaged/disenagaged. + * Shake everyone on the area list and play an alarm to let them know that gravity was enagaged/disenagaged. */ /obj/machinery/gravity_generator/main/proc/shake_everyone() var/turf/our_turf = get_turf(src) @@ -348,30 +353,27 @@ GLOBAL_LIST_EMPTY(gravity_generators) for(var/shaken in GLOB.mob_list) var/mob/M = shaken var/turf/their_turf = get_turf(M) - if(their_turf?.z == our_turf.z) + if(their_turf && ((get_area(their_turf)).type in typesof(parent_area_type)) && (M.z == z)) M.update_gravity(M.mob_has_gravity()) if(M.client) shake_camera(M, 15, 1) M.playsound_local(our_turf, null, 100, TRUE, 0.5, S = alert_sound) -// TODO: Make the gravity generator cooperate with the space manager -/obj/machinery/gravity_generator/main/proc/generators_in_level() - var/turf/T = get_turf(src) - if(!T) - return FALSE - if(GLOB.gravity_generators["[T.z]"]) - return length(GLOB.gravity_generators["[T.z]"]) - return FALSE - /obj/machinery/gravity_generator/main/proc/update_gen_list() - var/turf/T = get_turf(src) - if(T) - if(!GLOB.gravity_generators["[T.z]"]) - GLOB.gravity_generators["[T.z]"] = list() + if(parent_area_type) + if(!GLOB.gravity_generators["[parent_area_type]"]) + GLOB.gravity_generators["[parent_area_type]"] = list() if(on) - GLOB.gravity_generators["[T.z]"] |= src + GLOB.gravity_generators["[parent_area_type]"] |= src else - GLOB.gravity_generators["[T.z]"] -= src + GLOB.gravity_generators["[parent_area_type]"] -= src + +/obj/machinery/gravity_generator/main/proc/generators_in_area() + if(!parent_area_type) + return FALSE + if(GLOB.gravity_generators["[parent_area_type]"]) + return length(GLOB.gravity_generators["[parent_area_type]"]) + return FALSE // Misc @@ -384,7 +386,6 @@ GLOBAL_LIST_EMPTY(gravity_generators) animate(src, transform = M * 40, time = 0.8 SECONDS, alpha = 128) QDEL_IN(src, 0.8 SECONDS) - /obj/item/paper/gravity_gen name = "paper - 'Generate your own gravity!'" info = {"