From 4fc5079cdc3dbb9f0961fb241f61a018778b8d2c Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Thu, 27 Jan 2022 03:21:18 +0100 Subject: [PATCH] [MIRROR] Moves atmos checking from Fire Alarms to Fire Locks, Fire Locks now close on their own rather than area-based, a bunch of related stuff. [MDB IGNORE] (#10893) * Moves atmos checking from Fire Alarms to Fire Locks, Fire Locks now close on their own rather than area-based, a bunch of related stuff. * Weeeee Co-authored-by: zxaber <37497534+zxaber@users.noreply.github.com> Co-authored-by: Gandalf <9026500+Gandalf2k15@users.noreply.github.com> --- code/__DEFINES/alarm.dm | 2 +- code/__DEFINES/firealarm.dm | 13 + code/__DEFINES/~skyrat_defines/signals.dm | 9 - .../datums/looping_sounds/machinery_sounds.dm | 16 + code/game/area/areas.dm | 111 +---- code/game/machinery/doors/firedoor.dm | 384 ++++++++++++++---- code/game/machinery/firealarm.dm | 185 ++++----- .../objects/effects/spawners/structure.dm | 2 +- code/game/objects/items/emags.dm | 4 +- .../traitor/equipment/Malf_Modules.dm | 12 +- icons/obj/doors/doorfire.dmi | Bin 7657 -> 7949 bytes icons/obj/doors/doorfireglass.dmi | Bin 5367 -> 5428 bytes icons/obj/doors/edge_Doorfire.dmi | Bin 17604 -> 20141 bytes .../aesthetics/firealarm/code/firealarm.dm | 197 --------- .../aesthetics/firedoor/code/firedoor.dm | 107 ----- .../aesthetics/firedoor/icons/firedoor.dmi | Bin 3279 -> 7854 bytes .../firedoor/icons/firedoor_glass.dmi | Bin 6533 -> 7893 bytes tgstation.dme | 1 + 18 files changed, 458 insertions(+), 585 deletions(-) create mode 100644 code/__DEFINES/firealarm.dm diff --git a/code/__DEFINES/alarm.dm b/code/__DEFINES/alarm.dm index f5142f5a167..2c38e3f3f59 100644 --- a/code/__DEFINES/alarm.dm +++ b/code/__DEFINES/alarm.dm @@ -1,7 +1,7 @@ //A set of defines to be used by the alarm datums ///Sent by air alarms, indecates something wrong with thier attached atmosphere #define ALARM_ATMOS "Atmosphere" -///Sent by fire alarms when they are toggled +///Sent by firelocks when they detect fire, and by fire alarms when a user pulls them #define ALARM_FIRE "Fire" ///Sent by apcs when their power starts to fail #define ALARM_POWER "Power" diff --git a/code/__DEFINES/firealarm.dm b/code/__DEFINES/firealarm.dm new file mode 100644 index 00000000000..f2a561d12d2 --- /dev/null +++ b/code/__DEFINES/firealarm.dm @@ -0,0 +1,13 @@ +//A set of defines to be sent by fire alarms. The signals are sent to the alarm's area, but are read and used by the firelocks of the area, and are used for mass changes in fire detection. +///Sent when a fire alarm is emagged +#define FIRE_DETECT_EMAG "fire_detect_emag" +///Sent when the fire detection of an area is disabled +#define FIRE_DETECT_STOP "fire_detect_stop" +///Sent when the fire detection of an area is enabled +#define FIRE_DETECT_START "fire_detect_start" +///Designates a fire lock should be closed due to HEAT +#define FIRELOCK_ALARM_TYPE_HOT "firelock_alarm_type_hot" +///Designates a fire lock should be closed due to COLD +#define FIRELOCK_ALARM_TYPE_COLD "firelock_alarm_type_cold" +///Designates a fire lock should be closed due unknown reasons (IE fire alarm was pulled) +#define FIRELOCK_ALARM_TYPE_GENERIC "firelock_alarm_type_generic" diff --git a/code/__DEFINES/~skyrat_defines/signals.dm b/code/__DEFINES/~skyrat_defines/signals.dm index 720efee1aad..144f46b3356 100644 --- a/code/__DEFINES/~skyrat_defines/signals.dm +++ b/code/__DEFINES/~skyrat_defines/signals.dm @@ -59,15 +59,6 @@ ///from base of /obj/effect/abstract/liquid_turf/Initialize() (/obj/effect/abstract/liquid_turf/liquids) #define COMSIG_TURF_LIQUIDS_CREATION "turf_liquids_creation" -// Firealarm signals -/// /obj/machinery/firealarm/proc/trigger_effects(manual = FALSE) -#define COMSIG_FIREALARM_TRIGGERED_ON "firealarm_triggered_on" -#define COMSIG_FIREALARM_TRIGGER_DOORS "firealarm_trigger_doors" -/// /obj/machinery/firealarm/proc/untrigger_effects() -#define COMSIG_FIREALARM_TRIGGERED_OFF "firealarm_triggered_off" -/// /obj/machinery/door/firedoor/proc/trigger_hot() -#define COMSIG_FIREDOOR_CLOSED_FIRE "firedoor_closed_fire" - //when someone casts their fishing rod #define COMSIG_START_FISHING "start_fishing" //when someone pulls back their fishing rod diff --git a/code/datums/looping_sounds/machinery_sounds.dm b/code/datums/looping_sounds/machinery_sounds.dm index 7a7a53bcec1..1142c23d2d9 100644 --- a/code/datums/looping_sounds/machinery_sounds.dm +++ b/code/datums/looping_sounds/machinery_sounds.dm @@ -64,6 +64,8 @@ mid_length = 18 volume = 50 +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /datum/looping_sound/oven start_sound = 'sound/machines/oven/oven_loop_start.ogg' //my immersions start_length = 12 @@ -98,6 +100,7 @@ volume = 85 vary = TRUE +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /datum/looping_sound/server mid_sounds = list('sound/machines/tcomms/tcomms_mid1.ogg'=1,'sound/machines/tcomms/tcomms_mid2.ogg'=1,'sound/machines/tcomms/tcomms_mid3.ogg'=1,'sound/machines/tcomms/tcomms_mid4.ogg'=1,\ @@ -108,6 +111,8 @@ falloff_exponent = 5 volume = 50 +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /datum/looping_sound/computer start_sound = 'sound/machines/computer/computer_start.ogg' start_length = 7.2 SECONDS @@ -121,6 +126,8 @@ extra_range = -12 falloff_distance = 1 //Instant falloff after initial tile +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /datum/looping_sound/gravgen mid_sounds = list('sound/machines/gravgen/gravgen_mid1.ogg'=1,'sound/machines/gravgen/gravgen_mid2.ogg'=1,'sound/machines/gravgen/gravgen_mid3.ogg'=1,'sound/machines/gravgen/gravgen_mid4.ogg'=1,) mid_length = 1.8 SECONDS @@ -129,6 +136,15 @@ falloff_distance = 5 falloff_exponent = 20 +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/datum/looping_sound/firealarm + mid_sounds = list('sound/machines/FireAlarm.ogg'=1) + mid_length = 9.7 SECONDS + volume = 75 + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /datum/looping_sound/gravgen/kinesis volume = 20 falloff_distance = 2 diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index f9e68cf6e56..b252b2739a4 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -17,11 +17,17 @@ ///Do we have an active fire alarm? var/fire = FALSE - ///How many fire alarm sources do we have? - var/triggered_firealarms = 0 + ///A var for whether the area allows for detecting fires/etc. Disabled or enabled at a fire alarm, checked by fire locks. + var/fire_detect = TRUE + ///A list of all fire locks in this area. Used by fire alarm panels when resetting fire locks or activating all in an area + var/list/firedoors + ///A list of firelocks currently active. Used by fire alarms when setting their icons. + var/list/active_firelocks + ///A list of all fire alarms in this area. Used by fire locks and burglar alarms to tell the fire alarm to change its icon. + var/list/firealarms ///Alarm type to count of sources. Not usable for ^ because we handle fires differently var/list/active_alarms = list() - ///We use this just for fire alarms, because they're area based right now so one alarm going poof shouldn't prevent you from clearing your alarms listing + ///We use this just for fire alarms, because they're area based right now so one alarm going poof shouldn't prevent you from clearing your alarms listing. Fire alarms and fire locks will set and clear alarms. var/datum/alarm_handler/alarm_manager var/lightswitch = TRUE @@ -65,10 +71,7 @@ var/list/ambientsounds flags_1 = CAN_BE_DIRTY_1 - var/list/firedoors var/list/cameras - //var/list/firealarms SKYRAT EDIT REMOVAL - var/firedoors_last_closed_on = 0 ///Typepath to limit the areas (subtypes included) that atoms in this area can smooth with. Used for shuttles. var/area/area_limited_icon_smoothing @@ -240,84 +243,6 @@ GLOBAL_LIST_EMPTY(teleportlocs) STOP_PROCESSING(SSobj, src) QDEL_NULL(alarm_manager) return ..() -/* SKYRAT EDIT REMOVAL -/** - * Try to close all the firedoors in the area - */ -/area/proc/ModifyFiredoors(opening) - if(firedoors) - firedoors_last_closed_on = world.time - for(var/FD in firedoors) - var/obj/machinery/door/firedoor/D = FD - if (D.being_held_open) - continue - var/cont = !D.welded - if(cont && opening) //don't open if adjacent area is on fire - for(var/I in D.affecting_areas) - var/area/A = I - if(A.fire) - cont = FALSE - break - if(cont && D.is_operational) - if(D.operating) - D.nextstate = opening ? FIREDOOR_OPEN : FIREDOOR_CLOSED - else if(!(D.density ^ opening)) - INVOKE_ASYNC(D, (opening ? /obj/machinery/door/firedoor.proc/open : /obj/machinery/door/firedoor.proc/close)) - -/** - * Generate a firealarm alert for this area - * - * Sends to all ai players, alert consoles, drones and alarm monitor programs in the world - * - * Also starts the area processing on SSobj - */ -/area/proc/firealert(obj/source) - if (!fire) - set_fire_alarm_effect() - ModifyFiredoors(FALSE) - for(var/item in firealarms) - var/obj/machinery/firealarm/F = item - F.update_appearance() - alarm_manager.send_alarm(ALARM_FIRE, source) - START_PROCESSING(SSobj, src) - -/** - * Reset the firealarm alert for this area - * - * resets the alert sent to all ai players, alert consoles, drones and alarm monitor programs - * in the world - * - * Also cycles the icons of all firealarms and deregisters the area from processing on SSOBJ - */ -/area/proc/firereset(obj/source) - var/should_reset_alarms = fire - if(source) - if(istype(source, /obj/machinery/firealarm)) - var/obj/machinery/firealarm/alarm = source - if(alarm.triggered) - alarm.triggered = FALSE - triggered_firealarms -= 1 - if(triggered_firealarms > 0) - should_reset_alarms = FALSE - should_reset_alarms = should_reset_alarms & power_environ //No resetting if there's no power - - if (should_reset_alarms) // if there's a source, make sure there's no fire alarms left - unset_fire_alarm_effects() - ModifyFiredoors(TRUE) - for(var/item in firealarms) - var/obj/machinery/firealarm/F = item - F.update_appearance() - alarm_manager.clear_alarm(ALARM_FIRE, source) - STOP_PROCESSING(SSobj, src) - -/** - * If 100 ticks has elapsed, toggle all the firedoors closed again - */ -/area/process() - if(!triggered_firealarms) - firereset() //If there are no breaches or fires, and this alert was caused by a breach or fire, die - if(firedoors_last_closed_on + 100 < world.time) //every 10 seconds - ModifyFiredoors(FALSE) /** * Close and lock a door passed into this proc @@ -352,15 +277,14 @@ GLOBAL_LIST_EMPTY(teleportlocs) * Updates the fire light on fire alarms in the area and sets all lights to emergency mode */ /area/proc/set_fire_alarm_effect() + if(fire) + return fire = TRUE - if(!triggered_firealarms) //If there aren't any fires/breaches - triggered_firealarms = INFINITY //You're not allowed to naturally die mouse_opacity = MOUSE_OPACITY_TRANSPARENT - for(var/alarm in firealarms) - var/obj/machinery/firealarm/F = alarm - F.update_fire_light(fire) for(var/obj/machinery/light/L in src) L.update() + for(var/obj/machinery/firealarm/firepanel in firealarms) + firepanel.set_status() /** * unset the fire alarm visual affects in an area @@ -369,15 +293,12 @@ GLOBAL_LIST_EMPTY(teleportlocs) */ /area/proc/unset_fire_alarm_effects() fire = FALSE - triggered_firealarms = 0 mouse_opacity = MOUSE_OPACITY_TRANSPARENT - for(var/alarm in firealarms) - var/obj/machinery/firealarm/F = alarm - F.update_fire_light(fire) - F.triggered = FALSE for(var/obj/machinery/light/L in src) L.update() -*/ + for(var/obj/machinery/firealarm/firepanel in firealarms) + firepanel.set_status() + /** * Update the icon state of the area * diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 4827f5a3a35..e641fbf588e 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -1,11 +1,12 @@ #define CONSTRUCTION_PANEL_OPEN 1 //Maintenance panel is open, still functioning #define CONSTRUCTION_NO_CIRCUIT 2 //Circuit board removed, can safely weld apart #define DEFAULT_STEP_TIME 20 /// default time for each step +#define DETECT_COOLDOWN_STEP_TIME 5 SECONDS ///Wait time before we can detect an issue again, after a recent clear. /obj/machinery/door/firedoor name = "firelock" desc = "Apply crowbar." - icon = 'icons/obj/doors/Doorfireglass.dmi' //ICON OVERRIDEN IN SKYRAT AESTHETICS - SEE MODULE + icon = 'icons/obj/doors/Doorfireglass.dmi' icon_state = "door_open" opacity = FALSE density = FALSE @@ -21,16 +22,76 @@ assemblytype = /obj/structure/firelock_frame armor = list(MELEE = 10, BULLET = 30, LASER = 20, ENERGY = 20, BOMB = 30, BIO = 100, FIRE = 95, ACID = 70) interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_REQUIRES_SILICON | INTERACT_MACHINE_OPEN - var/nextstate = null + + COOLDOWN_DECLARE(detect_cooldown) + + ///Trick to get the glowing overlay visible from a distance + luminosity = 1 + ///X offset for the overlay lights, so that they line up with the thin border firelocks + var/light_xoffset = 0 + ///Y offset for the overlay lights, so that they line up with the thin border firelocks + var/light_yoffset = 0 + var/boltslocked = TRUE + ///List of areas we handle. See CalculateAffectingAreas() var/list/affecting_areas + ///For the few times we affect only the area we're actually in. Set during Init. If we get moved, we don't update, but this is consistant with fire alarms and also kinda funny so call it intentional. + var/area/my_area + ///Tracks if the firelock is being held open by a crowbar. If so, we don't close until they walk away var/being_held_open = FALSE + + ///Type of alarm when active. See code/defines/firealarm.dm for the list. This var being null means there is no alarm. + var/alarm_type = null + ///The merger_id and merger_typecache variables are used to make rows of firelocks activate at the same time. + var/merger_id = "firelocks" + var/static/list/merger_typecache + ///Overlay object for the warning lights. This and some plane settings allows the lights to glow in the dark. + var/mutable_appearance/warn_lights + + ///looping sound datum for our fire alarm siren. + var/datum/looping_sound/firealarm/soundloop + ///Keeps track of if we're playing the alarm sound loop (as only one firelock per group should be). Used during power changes. + var/is_playing_alarm = FALSE + var/knock_sound = 'sound/effects/glassknock.ogg' var/bash_sound = 'sound/effects/glassbash.ogg' + /obj/machinery/door/firedoor/Initialize(mapload) . = ..() + COOLDOWN_START(src, detect_cooldown, DETECT_COOLDOWN_STEP_TIME) + soundloop = new(src, FALSE) + AddElement(/datum/element/atmos_sensitive, mapload) CalculateAffectingAreas() + my_area = get_area(src) + var/static/list/loc_connections = list( + COMSIG_TURF_EXPOSE = .proc/check_atmos, + ) + + AddElement(/datum/element/connect_loc, loc_connections) + if(!merger_typecache) + merger_typecache = typecacheof(/obj/machinery/door/firedoor) + + check_atmos() + + return INITIALIZE_HINT_LATELOAD + +/obj/machinery/door/firedoor/LateInitialize() + . = ..() + GetMergeGroup(merger_id, allowed_types = merger_typecache) + +/** + * Sets the offset for the warning lights. + * + * Used for special firelocks with light overlays that don't line up to their sprite. + */ +/obj/machinery/door/firedoor/proc/adjust_lights_starting_offset() + return + +/obj/machinery/door/firedoor/Destroy() + remove_from_areas() + QDEL_NULL(soundloop) + return ..() /obj/machinery/door/firedoor/examine(mob/user) . = ..() @@ -39,39 +100,152 @@ else if(!welded) . += span_notice("It is closed, but could be pried open.") . += span_notice("Hold the firelock temporarily open by prying it with left-click and standing next to it.") - //. += span_notice("Prying by right-clicking the firelock will open it permanently.") SKYRAT EDIT REMOVAL + . += span_notice("Prying by right-clicking the firelock will open it permanently.") . += span_notice("Deconstruction would require it to be welded shut.") else if(boltslocked) . += span_notice("It is welded shut. The floor bolts have been locked by screws.") else . += span_notice("The bolt locks have been unscrewed, but the bolts themselves are still wrenched to the floor.") -/* //SKYRAT EDIT REMOVAL BEGIN +/** + * Calculates what areas we should worry about. + * + * This proc builds a list of areas we are in and areas we border + * and writes it to affecting_areas. + */ /obj/machinery/door/firedoor/proc/CalculateAffectingAreas() + var/list/new_affecting_areas = get_adjacent_open_areas(src) | get_area(src) + if(compare_list(new_affecting_areas, affecting_areas)) + return //No changes needed + remove_from_areas() - affecting_areas = get_adjacent_open_areas(src) | get_area(src) - for(var/I in affecting_areas) - var/area/A = I - LAZYADD(A.firedoors, src) -*/ //SKYRAT EDIT END + affecting_areas = new_affecting_areas + for(var/area/place in affecting_areas) + LAZYADD(place.firedoors, src) + if(alarm_type) + if(place == get_area(src)) + LAZYADD(place.active_firelocks, src) //We only add ourselves to our own area's active firelocks... + for(var/obj/machinery/firealarm/fire_panel in place.firealarms) + fire_panel.set_status() //...but all adjacent fire alarms are notified -/obj/machinery/door/firedoor/closed - icon_state = "door_closed" - density = TRUE - -/* //SKYRAT EDIT REMOVAL BEGIN -//see also turf/AfterChange for adjacency shennanigans +/** + * Removes us from any lists of areas in the affecting_areas list, then clears affecting_areas + * + * Undoes everything done in the CalculateAffectingAreas() proc, to clean up prior to deletion. + * Calls reset() first, in case any alarms need to be cleared first. + */ /obj/machinery/door/firedoor/proc/remove_from_areas() - if(affecting_areas) - for(var/I in affecting_areas) - var/area/A = I - LAZYREMOVE(A.firedoors, src) + if(!affecting_areas) + return + for(var/area/place in affecting_areas) + LAZYREMOVE(place.firedoors, src) + LAZYREMOVE(place.active_firelocks, src) + if(LAZYLEN(place.active_firelocks)) //if we were the last firelock still active in this particular area + continue + for(var/obj/machinery/firealarm/fire_panel in place.firealarms) + fire_panel.set_status() -/obj/machinery/door/firedoor/Destroy() - remove_from_areas() - affecting_areas.Cut() - return ..() -*/ //SKYRAT EDIT REMOVAL END +/obj/machinery/door/firedoor/proc/check_atmos(datum/source) + if(!COOLDOWN_FINISHED(src, detect_cooldown)) + return + if(alarm_type) + return + for(var/area/place in affecting_areas) + if(!place.fire_detect) //if any area is set to disable detection + return + + var/turf/my_turf = source + if(!my_turf) + my_turf = get_turf(src) + + var/datum/gas_mixture/environment = my_turf.return_air() + var/result + + if(environment?.temperature >= BODYTEMP_HEAT_DAMAGE_LIMIT || environment?.volume > WARNING_HIGH_PRESSURE) //SKYRAT EDIT CHANGE - BETTER LOCKS + result = FIRELOCK_ALARM_TYPE_HOT + if(environment?.temperature <= BODYTEMP_COLD_DAMAGE_LIMIT || environment?.volume < WARNING_LOW_PRESSURE) //SKYRAT EDIT CHANGE - BETTER LOCKS + result = FIRELOCK_ALARM_TYPE_COLD + if(!result) + return + + start_activation_process(result) + +/** + * Begins activation process of us and our neighbors. + * + * This proc will call activate() on every fire lock (including us) listed + * in the merge group datum. Returns without doing anything if our alarm_type + * was already set, as that means that we're already active. + * + * Arguments: + * code should be one of three defined alarm types, or can be not supplied. Will dictate the color of the fire alarm lights, and defults to "firelock_alarm_type_generic" + */ +/obj/machinery/door/firedoor/proc/start_activation_process(code = FIRELOCK_ALARM_TYPE_GENERIC) + if(alarm_type) + return //We're already active + soundloop.start() + is_playing_alarm = TRUE + var/datum/merger/merge_group = GetMergeGroup(merger_id, merger_typecache) + for(var/obj/machinery/door/firedoor/buddylock as anything in merge_group.members) + buddylock.activate(code) + + +/** + * Proc that handles activation of the firelock and all this details + * + * Sets the alarm_type variable based on the single arg, which is in turn + * used by several procs to understand the intended state of the fire lock. + * Also calls set_status() on all fire alarms in all affected areas, tells + * the area the firelock sits in to report the event (AI, alarm consoles, etc) + * and finally calls correct_state(), which will handle opening or closing + * this fire lock. + */ +/obj/machinery/door/firedoor/proc/activate(code = FIRELOCK_ALARM_TYPE_GENERIC) + SIGNAL_HANDLER + if(alarm_type) + return //Already active + alarm_type = code + for(var/area/place in affecting_areas) + LAZYADD(place.active_firelocks, src) + if(LAZYLEN(place.active_firelocks) == 1) //if we're the first to activate in this particular area + for(var/obj/machinery/firealarm/fire_panel in place.firealarms) + fire_panel.set_status() + if(alarm_type != FIRELOCK_ALARM_TYPE_GENERIC) //Generic alarms tend to activate all firelocks in an area, which otherwise makes the red lighting spread like a virus. Anyway, fire alarms already do this for manual pulls. + place.set_fire_alarm_effect() //bathe in red + if(place == my_area) + place.alarm_manager.send_alarm(ALARM_FIRE, place) //We'll limit our reporting to just the area we're on. If the issue affects bordering areas, they can report it themselves + update_icon() //Sets the door lights even if the door doesn't move. + correct_state() + +/** + * Proc that handles reset steps + * + * Clears the alarm state and attempts to open the firelock. + */ +/obj/machinery/door/firedoor/proc/reset() + SIGNAL_HANDLER + alarm_type = null + for(var/area/place in affecting_areas) + LAZYREMOVE(place.active_firelocks, src) + if(!LAZYLEN(place.active_firelocks)) //if we were the last firelock still active in this particular area + for(var/obj/machinery/firealarm/fire_panel in place.firealarms) + fire_panel.set_status() + place.unset_fire_alarm_effects() + COOLDOWN_START(src, detect_cooldown, DETECT_COOLDOWN_STEP_TIME) + soundloop.stop() + is_playing_alarm = FALSE + update_icon() //Sets the door lights even if the door doesn't move. + correct_state() + +/obj/machinery/door/firedoor/emag_act(mob/user, obj/item/card/emag/doorjack/digital_crowbar) + if(obj_flags & EMAGGED) + return + if(!isAI(user)) //Skip doorjack-specific code + if(!user || digital_crowbar.charges < 1) + return + digital_crowbar.use_charge(user) + obj_flags |= EMAGGED + INVOKE_ASYNC(src, .proc/open) /obj/machinery/door/firedoor/Bumped(atom/movable/AM) if(panel_open || operating) @@ -85,7 +259,13 @@ /obj/machinery/door/firedoor/power_change() . = ..() - INVOKE_ASYNC(src, .proc/latetoggle) + update_icon() + correct_state() + if(machine_stat & NOPOWER) + soundloop.stop() + else if(is_playing_alarm) + soundloop.start() + /obj/machinery/door/firedoor/attack_hand(mob/living/user, list/modifiers) . = ..() @@ -143,6 +323,7 @@ user.visible_message(span_danger("[user] [welded?"welds":"unwelds"] [src]."), span_notice("You [welded ? "weld" : "unweld"] [src].")) log_game("[key_name(user)] [welded ? "welded":"unwelded"] firedoor [src] with [W] at [AREACOORD(src)]") update_appearance() + correct_state() /// We check for adjacency when using the primary attack. /obj/machinery/door/firedoor/try_to_crowbar(obj/item/acting_object, mob/user) @@ -170,6 +351,8 @@ if(density) open() + if(alarm_type) + addtimer(CALLBACK(src, .proc/correct_state), 2 SECONDS, TIMER_UNIQUE) else close() @@ -180,7 +363,7 @@ if(!QDELETED(user) && Adjacent(user) && isliving(user) && (living_user.body_position == STANDING_UP)) return being_held_open = FALSE - INVOKE_ASYNC(src, .proc/close) + correct_state() UnregisterSignal(user, COMSIG_MOVABLE_MOVED) UnregisterSignal(user, COMSIG_LIVING_SET_BODY_POSITION) UnregisterSignal(user, COMSIG_PARENT_QDELETING) @@ -193,6 +376,8 @@ return TRUE if(density) open() + if(alarm_type) + addtimer(CALLBACK(src, .proc/correct_state), 2 SECONDS, TIMER_UNIQUE) else close() return TRUE @@ -206,6 +391,8 @@ to_chat(user, span_warning("[src] refuses to budge!")) return open() + if(alarm_type) + addtimer(CALLBACK(src, .proc/correct_state), 2 SECONDS, TIMER_UNIQUE) /obj/machinery/door/firedoor/do_animate(animation) switch(animation) @@ -214,54 +401,77 @@ if("closing") flick("door_closing", src) -/*SKYRAT EDIT REMOVAL /obj/machinery/door/firedoor/update_icon_state() . = ..() icon_state = "[base_icon_state]_[density ? "closed" : "open"]" -*/ /obj/machinery/door/firedoor/update_overlays() . = ..() - if(!welded) + if(welded) + . += density ? "welded" : "welded_open" + if(alarm_type && powered()) + var/mutable_appearance/hazards + hazards = mutable_appearance(icon, "[(obj_flags & EMAGGED) ? "firelock_alarm_type_emag" : alarm_type]") + hazards.pixel_x = light_xoffset + hazards.pixel_y = light_yoffset + . += hazards + hazards = emissive_appearance(icon, "[(obj_flags & EMAGGED) ? "firelock_alarm_type_emag" : alarm_type]", alpha = src.alpha) + hazards.pixel_x = light_xoffset + hazards.pixel_y = light_yoffset + . += hazards + +/** + * Corrects the current state of the door, based on if alarm_type is set. + * + * This proc is called after weld and power restore events. Gives the + * illusion that the door is constantly attempting to move without actually + * having to process it. Timers also call this, so that if alarm_type + * changes during the timer, the door doesn't close or open incorrectly. + */ +/obj/machinery/door/firedoor/proc/correct_state() + if(obj_flags & EMAGGED || being_held_open) + return //Unmotivated, indifferent, we have no real care what state we're in anymore. + if(alarm_type && !density) //We should be closed but we're not + INVOKE_ASYNC(src, .proc/close) + return + if(!alarm_type && density) //We should be open but we're not + INVOKE_ASYNC(src, .proc/open) return - . += density ? "welded" : "welded_open" /obj/machinery/door/firedoor/open() + if(welded) + return + var/alarm = alarm_type . = ..() - latetoggle() + if(alarm != alarm_type) //Something changed while we were sleeping + correct_state() //So we should re-evaluate our state /obj/machinery/door/firedoor/close() if(HAS_TRAIT(loc, TRAIT_FIREDOOR_STOP)) return + var/alarm = alarm_type . = ..() - latetoggle() + if(alarm != alarm_type) //Something changed while we were sleeping + correct_state() //So we should re-evaluate our state /obj/machinery/door/firedoor/deconstruct(disassembled = TRUE) if(!(flags_1 & NODECONSTRUCT_1)) - var/turf/T = get_turf(src) + var/turf/targetloc = get_turf(src) if(disassembled || prob(40)) - var/obj/structure/firelock_frame/F = new assemblytype(T) + var/obj/structure/firelock_frame/unbuilt_lock = new assemblytype(targetloc) if(disassembled) - F.constructionStep = CONSTRUCTION_PANEL_OPEN + unbuilt_lock.constructionStep = CONSTRUCTION_PANEL_OPEN else - F.constructionStep = CONSTRUCTION_NO_CIRCUIT - F.update_integrity(F.max_integrity * 0.5) - F.update_appearance() + unbuilt_lock.constructionStep = CONSTRUCTION_NO_CIRCUIT + unbuilt_lock.update_integrity(unbuilt_lock.max_integrity * 0.5) + unbuilt_lock.update_appearance() else - new /obj/item/electronics/firelock (T) + new /obj/item/electronics/firelock (targetloc) qdel(src) - -/obj/machinery/door/firedoor/proc/latetoggle() - if(operating || machine_stat & NOPOWER || !nextstate) - return - switch(nextstate) - if(FIREDOOR_OPEN) - nextstate = null - open() - if(FIREDOOR_CLOSED) - nextstate = null - close() +/obj/machinery/door/firedoor/closed + icon_state = "door_closed" + density = TRUE /obj/machinery/door/firedoor/border_only icon = 'icons/obj/doors/edge_Doorfire.dmi' @@ -281,6 +491,25 @@ ) AddElement(/datum/element/connect_loc, loc_connections) + adjust_lights_starting_offset() + +/obj/machinery/door/firedoor/border_only/adjust_lights_starting_offset() + light_xoffset = 0 + light_yoffset = 0 + switch(dir) + if(NORTH) + light_yoffset = 2 + if(SOUTH) + light_yoffset = -2 + if(EAST) + light_xoffset = 2 + if(WEST) + light_xoffset = -2 + update_icon() + +/obj/machinery/door/firedoor/border_only/Moved() + . = ..() + adjust_lights_starting_offset() /obj/machinery/door/firedoor/border_only/CanAllowThrough(atom/movable/mover, border_dir) . = ..() @@ -306,7 +535,7 @@ /obj/machinery/door/firedoor/heavy name = "heavy firelock" - icon = 'icons/obj/doors/Doorfire.dmi' //ICON OVERRIDEN IN SKYRAT AESTHETICS - SEE MODULE + icon = 'icons/obj/doors/Doorfire.dmi' //SKYRAT EDIT - ICON OVERRIDEN IN AESTHETICS MODULE glass = FALSE explosion_block = 2 assemblytype = /obj/structure/firelock_frame/heavy @@ -321,7 +550,7 @@ /obj/structure/firelock_frame name = "firelock frame" desc = "A partially completed firelock." - icon = 'icons/obj/doors/Doorfire.dmi' //ICON OVERRIDEN IN SKYRAT AESTHETICS - SEE MODULE + icon = 'icons/obj/doors/Doorfire.dmi' //SKYRAT EDIT - ICON OVERRIDEN IN AESTHETICS MODULE icon_state = "frame1" base_icon_state = "frame" anchored = FALSE @@ -343,14 +572,14 @@ icon_state = "[base_icon_state][constructionStep]" return ..() -/obj/structure/firelock_frame/attackby(obj/item/C, mob/user) +/obj/structure/firelock_frame/attackby(obj/item/attacking_object, mob/user) switch(constructionStep) if(CONSTRUCTION_PANEL_OPEN) - if(C.tool_behaviour == TOOL_CROWBAR) - C.play_tool_sound(src) + if(attacking_object.tool_behaviour == TOOL_CROWBAR) + attacking_object.play_tool_sound(src) user.visible_message(span_notice("[user] begins removing the circuit board from [src]..."), \ span_notice("You begin prying out the circuit board from [src]...")) - if(!C.use_tool(src, user, DEFAULT_STEP_TIME)) + if(!attacking_object.use_tool(src, user, DEFAULT_STEP_TIME)) return if(constructionStep != CONSTRUCTION_PANEL_OPEN) return @@ -361,14 +590,14 @@ constructionStep = CONSTRUCTION_NO_CIRCUIT update_appearance() return - if(C.tool_behaviour == TOOL_WRENCH) + if(attacking_object.tool_behaviour == TOOL_WRENCH) if(locate(/obj/machinery/door/firedoor) in get_turf(src)) to_chat(user, span_warning("There's already a firelock there.")) return - C.play_tool_sound(src) + attacking_object.play_tool_sound(src) user.visible_message(span_notice("[user] starts bolting down [src]..."), \ span_notice("You begin bolting [src]...")) - if(!C.use_tool(src, user, DEFAULT_STEP_TIME)) + if(!attacking_object.use_tool(src, user, DEFAULT_STEP_TIME)) return if(locate(/obj/machinery/door/firedoor) in get_turf(src)) return @@ -381,61 +610,61 @@ new /obj/machinery/door/firedoor(get_turf(src)) qdel(src) return - if(istype(C, /obj/item/stack/sheet/plasteel)) - var/obj/item/stack/sheet/plasteel/P = C + if(istype(attacking_object, /obj/item/stack/sheet/plasteel)) + var/obj/item/stack/sheet/plasteel/plasteel_sheet = attacking_object if(reinforced) to_chat(user, span_warning("[src] is already reinforced.")) return - if(P.get_amount() < 2) + if(plasteel_sheet.get_amount() < 2) to_chat(user, span_warning("You need more plasteel to reinforce [src].")) return user.visible_message(span_notice("[user] begins reinforcing [src]..."), \ span_notice("You begin reinforcing [src]...")) playsound(get_turf(src), 'sound/items/deconstruct.ogg', 50, TRUE) if(do_after(user, DEFAULT_STEP_TIME, target = src)) - if(constructionStep != CONSTRUCTION_PANEL_OPEN || reinforced || P.get_amount() < 2 || !P) + if(constructionStep != CONSTRUCTION_PANEL_OPEN || reinforced || plasteel_sheet.get_amount() < 2 || !plasteel_sheet) return user.visible_message(span_notice("[user] reinforces [src]."), \ span_notice("You reinforce [src].")) playsound(get_turf(src), 'sound/items/deconstruct.ogg', 50, TRUE) - P.use(2) + plasteel_sheet.use(2) reinforced = 1 return if(CONSTRUCTION_NO_CIRCUIT) - if(istype(C, /obj/item/electronics/firelock)) - user.visible_message(span_notice("[user] starts adding [C] to [src]..."), \ + if(istype(attacking_object, /obj/item/electronics/firelock)) + user.visible_message(span_notice("[user] starts adding [attacking_object] to [src]..."), \ span_notice("You begin adding a circuit board to [src]...")) playsound(get_turf(src), 'sound/items/deconstruct.ogg', 50, TRUE) if(!do_after(user, DEFAULT_STEP_TIME, target = src)) return if(constructionStep != CONSTRUCTION_NO_CIRCUIT) return - qdel(C) + qdel(attacking_object) user.visible_message(span_notice("[user] adds a circuit to [src]."), \ - span_notice("You insert and secure [C].")) + span_notice("You insert and secure [attacking_object].")) playsound(get_turf(src), 'sound/items/deconstruct.ogg', 50, TRUE) constructionStep = CONSTRUCTION_PANEL_OPEN return - if(C.tool_behaviour == TOOL_WELDER) - if(!C.tool_start_check(user, amount=1)) + if(attacking_object.tool_behaviour == TOOL_WELDER) + if(!attacking_object.tool_start_check(user, amount=1)) return user.visible_message(span_notice("[user] begins cutting apart [src]'s frame..."), \ span_notice("You begin slicing [src] apart...")) - if(C.use_tool(src, user, DEFAULT_STEP_TIME, volume=50, amount=1)) + if(attacking_object.use_tool(src, user, DEFAULT_STEP_TIME, volume=50, amount=1)) if(constructionStep != CONSTRUCTION_NO_CIRCUIT) return user.visible_message(span_notice("[user] cuts apart [src]!"), \ span_notice("You cut [src] into metal.")) - var/turf/T = get_turf(src) - new /obj/item/stack/sheet/iron(T, 3) + var/turf/tagetloc = get_turf(src) + new /obj/item/stack/sheet/iron(tagetloc, 3) if(reinforced) - new /obj/item/stack/sheet/plasteel(T, 2) + new /obj/item/stack/sheet/plasteel(tagetloc, 2) qdel(src) return - if(istype(C, /obj/item/electroadaptive_pseudocircuit)) - var/obj/item/electroadaptive_pseudocircuit/P = C - if(!P.adapt_circuit(user, DEFAULT_STEP_TIME * 0.5)) + if(istype(attacking_object, /obj/item/electroadaptive_pseudocircuit)) + var/obj/item/electroadaptive_pseudocircuit/raspberrypi = attacking_object + if(!raspberrypi.adapt_circuit(user, DEFAULT_STEP_TIME * 0.5)) return user.visible_message(span_notice("[user] fabricates a circuit and places it into [src]."), \ span_notice("You adapt a firelock circuit and slot it into the assembly.")) @@ -471,3 +700,4 @@ #undef CONSTRUCTION_PANEL_OPEN #undef CONSTRUCTION_NO_CIRCUIT +#undef DETECT_COOLDOWN_STEP_TIME diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index 0bf94df8f17..69f0af98c1f 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -1,5 +1,3 @@ -#define FIREALARM_COOLDOWN 80 //SKYRAT EDIT CHANGE - ORIGINAL: 96 - AESTHETIC // This define is based on the current FireAlarm.ogg, and is placed to match the running time at 9 seconds 600 milliseconds (9.6 seconds) - /obj/item/electronics/firealarm name = "fire alarm electronics" desc = "A fire alarm circuit. Can handle heat levels up to 40 degrees celsius." @@ -7,7 +5,7 @@ /obj/item/wallframe/firealarm name = "fire alarm frame" desc = "Used for building fire alarms." - icon = 'icons/obj/monitors.dmi' //ICON OVERRIDEN IN SKYRAT AESTHETICS - SEE MODULE + icon = 'icons/obj/monitors.dmi' icon_state = "fire_bitem" result_path = /obj/machinery/firealarm pixel_shift = 26 @@ -15,7 +13,7 @@ /obj/machinery/firealarm name = "fire alarm" desc = "\"Pull this in case of emergency\". Thus, keep pulling it forever." - icon = 'icons/obj/monitors.dmi' //ICON OVERRIDEN IN SKYRAT AESTHETICS - SEE MODULE + icon = 'icons/obj/monitors.dmi' icon_state = "fire0" max_integrity = 250 integrity_failure = 0.4 @@ -32,15 +30,13 @@ //Trick to get the glowing overlay visible from a distance luminosity = 1 + ///Buildstate for contruction steps. 2 = complete, 1 = no wires, 0 = circuit gone + var/buildstage = 2 + ///Our home area, set in Init. Due to loading step order, this seems to be null very early in the server setup process, which is why some procs use `my_area?` for var or list checks. + var/area/my_area = null + ///looping sound datum for our fire alarm siren. + var/datum/looping_sound/firealarm/soundloop - var/detecting = 1 - var/buildstage = 2 // 2 = complete, 1 = no wires, 0 = circuit gone - COOLDOWN_DECLARE(last_alarm) - var/area/myarea = null - //Has this firealarm been triggered by its enviroment? - var/triggered = FALSE - -/* SKYRAT EDIT REMOVAL /obj/machinery/firealarm/Initialize(mapload, dir, building) . = ..() if(building) @@ -49,18 +45,34 @@ if(name == initial(name)) name = "[get_area_name(src)] [initial(name)]" update_appearance() - myarea = get_area(src) - LAZYADD(myarea.firealarms, src) + my_area = get_area(src) + LAZYADD(my_area.firealarms, src) AddElement(/datum/element/atmos_sensitive, mapload) RegisterSignal(SSsecurity_level, COMSIG_SECURITY_LEVEL_CHANGED, .proc/check_security_level) - + soundloop = new(src, FALSE) /obj/machinery/firealarm/Destroy() - myarea.firereset(src) - LAZYREMOVE(myarea.firealarms, src) + if(my_area) + LAZYREMOVE(my_area.firealarms, src) + my_area = null + QDEL_NULL(soundloop) return ..() -*/ + +/** + * Sets the sound state, and then calls update_icon() + * + * This proc exists to be called by areas and firelocks + * so that it may update its icon and start or stop playing + * the alarm sound based on the state of an area variable. + */ +/obj/machinery/firealarm/proc/set_status() + if( (my_area.fire || LAZYLEN(my_area.active_firelocks)) && !(obj_flags & EMAGGED) ) + set_light(l_power = 0.8) + else + soundloop.stop() + set_light(l_power = 0) + update_icon() /obj/machinery/firealarm/update_icon_state() if(panel_open) @@ -87,12 +99,11 @@ . += mutable_appearance(icon, "fire_[SEC_LEVEL_GREEN]") . += emissive_appearance(icon, "fire_[SEC_LEVEL_GREEN]", alpha = src.alpha) - var/area/area = get_area(src) - - if(!detecting || !area.fire) - . += "fire_off" - . += mutable_appearance(icon, "fire_off") - . += emissive_appearance(icon, "fire_off", alpha = src.alpha) + if(!(my_area?.fire || LAZYLEN(my_area?.active_firelocks))) + if(my_area?.fire_detect) //If this is false, leave the green light missing. A good hint to anyone paying attention. + . += "fire_off" + . += mutable_appearance(icon, "fire_off") + . += emissive_appearance(icon, "fire_off", alpha = src.alpha) else if(obj_flags & EMAGGED) . += "fire_emagged" . += mutable_appearance(icon, "fire_emagged") @@ -102,7 +113,7 @@ . += mutable_appearance(icon, "fire_on") . += emissive_appearance(icon, "fire_on", alpha = src.alpha) - if(!panel_open && detecting && triggered) //It just looks horrible with the panel open + if(!panel_open && my_area?.fire_detect && my_area?.fire) //It just looks horrible with the panel open . += "fire_detected" . += mutable_appearance(icon, "fire_detected") . += emissive_appearance(icon, "fire_detected", alpha = src.alpha) //Pain @@ -123,30 +134,9 @@ update_appearance() if(user) user.visible_message(span_warning("Sparks fly out of [src]!"), - span_notice("You emag [src], disabling its thermal sensors.")) + span_notice("You override [src], disabling the speaker.")) playsound(src, "sparks", 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - -/* SKYRAT EDIT REMOVAL -/obj/machinery/firealarm/should_atmos_process(datum/gas_mixture/air, exposed_temperature) - return (exposed_temperature > T0C + 200 || exposed_temperature < BODYTEMP_COLD_DAMAGE_LIMIT) && !(obj_flags & EMAGGED) && !machine_stat - -/obj/machinery/firealarm/atmos_expose(datum/gas_mixture/air, exposed_temperature) - if(!detecting) - return - if(!triggered) - triggered = TRUE - myarea.triggered_firealarms += 1 - update_appearance() - alarm() - -/obj/machinery/firealarm/atmos_end() - if(!detecting) - return - if(triggered) - triggered = FALSE - myarea.triggered_firealarms -= 1 - update_appearance() -*/ + set_status() /** * Signal handler for checking if we should update fire alarm appearance accordingly to a newly set security level @@ -161,45 +151,69 @@ if(is_station_level(z)) update_appearance() -/*SKYRAT EDIT REMOVAL +/** + * Sounds the fire alarm and closes all firelocks in the area. Also tells the area to color the lights red. + * + * Arguments: + * * mob/user is the user that pulled the alarm. + */ /obj/machinery/firealarm/proc/alarm(mob/user) - if(!is_operational || !COOLDOWN_FINISHED(src, last_alarm)) + if(!is_operational) return - COOLDOWN_START(src, last_alarm, FIREALARM_COOLDOWN) - var/area/area = get_area(src) - area.firealert(src) - //playsound(loc, 'sound/machines/FireAlarm.ogg', 96) ORIGINAL - playsound(loc, alarm_sound, 75) //SKYRAT EDIT CHANGE - AESTHETICS + + if(my_area.fire) + return //area alarm already active + my_area.alarm_manager.send_alarm(ALARM_FIRE, my_area) + my_area.set_fire_alarm_effect() + for(var/obj/machinery/door/firedoor/firelock in my_area.firedoors) + firelock.activate(FIRELOCK_ALARM_TYPE_GENERIC) if(user) log_game("[user] triggered a fire alarm at [COORD(src)]") + soundloop.start() //Manually pulled fire alarms will make the sound, rather than the doors. +/** + * Resets all firelocks in the area. Also tells the area to disable alarm lighting, if it was enabled. + * + * Arguments: + * * mob/user is the user that reset the alarm. + */ /obj/machinery/firealarm/proc/reset(mob/user) if(!is_operational) return - var/area/area = get_area(src) - area.firereset() + my_area.unset_fire_alarm_effects() + for(var/obj/machinery/door/firedoor/firelock in my_area.firedoors) + firelock.reset() + my_area.alarm_manager.clear_alarm(ALARM_FIRE, my_area) if(user) log_game("[user] reset a fire alarm at [COORD(src)]") + soundloop.stop() /obj/machinery/firealarm/attack_hand(mob/user, list/modifiers) if(buildstage != 2) return . = ..() add_fingerprint(user) - var/area/area = get_area(src) - if(area.fire) - reset(user) - else - alarm(user) -*/ + alarm(user) + +/obj/machinery/firealarm/attack_hand_secondary(mob/user, list/modifiers) + if(buildstage != 2) + return ..() + add_fingerprint(user) + reset(user) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN /obj/machinery/firealarm/attack_ai(mob/user) return attack_hand(user) +/obj/machinery/firealarm/attack_ai_secondary(mob/user) + return attack_hand_secondary(user) + /obj/machinery/firealarm/attack_robot(mob/user) return attack_hand(user) -/*SKYRAT EDIT REMOVAL +/obj/machinery/firealarm/attack_robot_secondary(mob/user) + return attack_hand_secondary(user) + /obj/machinery/firealarm/attackby(obj/item/tool, mob/living/user, params) add_fingerprint(user) @@ -227,15 +241,7 @@ switch(buildstage) if(2) - if(tool.tool_behaviour == TOOL_MULTITOOL) - detecting = !detecting - if (src.detecting) - user.visible_message(span_notice("[user] reconnects [src]'s detecting unit!"), span_notice("You reconnect [src]'s detecting unit.")) - else - user.visible_message(span_notice("[user] disconnects [src]'s detecting unit!"), span_notice("You disconnect [src]'s detecting unit.")) - return - - else if(tool.tool_behaviour == TOOL_WIRECUTTER) + if(tool.tool_behaviour == TOOL_WIRECUTTER) buildstage = 1 tool.play_tool_sound(src) new /obj/item/stack/cable_coil(user.loc, 5) @@ -302,9 +308,7 @@ tool.play_tool_sound(src) qdel(src) return - return ..() -*/ /obj/machinery/firealarm/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) if((buildstage == 0) && (the_rcd.upgrade & RCD_UPGRADE_SIMPLE_CIRCUITS)) @@ -331,16 +335,12 @@ /obj/machinery/firealarm/singularity_pull(S, current_size) if (current_size >= STAGE_FIVE) // If the singulo is strong enough to pull anchored objects, the fire alarm experiences integrity failure deconstruct() - ..() + return ..() -/* SKYRAT EDIT REMOVAL /obj/machinery/firealarm/atom_break(damage_flag) if(buildstage == 0) //can't break the electronics if there isn't any inside. return - . = ..() - if(.) - LAZYREMOVE(myarea.firealarms, src) -*/ + return ..() /obj/machinery/firealarm/deconstruct(disassembled = TRUE) if(!(flags_1 & NODECONSTRUCT_1)) @@ -352,18 +352,16 @@ new /obj/item/stack/cable_coil(loc, 3) qdel(src) -/obj/machinery/firealarm/proc/update_fire_light(fire) - if(fire == !!light_power) - return // do nothing if we're already active - if(fire) - set_light(l_power = 0.8) - else - set_light(l_power = 0) - // Allows users to examine the state of the thermal sensor /obj/machinery/firealarm/examine(mob/user) . = ..() - . += "A light on the side indicates the thermal sensor is [detecting ? "enabled" : "disabled"]." + if((my_area?.fire || LAZYLEN(my_area?.active_firelocks))) + . += "The local area hazard light is flashing." + . += "Left-Click to activate all firelocks in this area." + . += "Right-Click or Alt-Click to reset firelocks in this area." + else + . += "The local area thermal detection light is [my_area.fire_detect ? "lit" : "unlit"]." + . += "Left-Click to activate all firelocks in this area." // Allows Silicons to disable thermal sensor /obj/machinery/firealarm/BorgCtrlClick(mob/living/silicon/robot/user) @@ -376,8 +374,11 @@ if(obj_flags & EMAGGED) to_chat(user, span_warning("The control circuitry of [src] appears to be malfunctioning.")) return - detecting = !detecting - to_chat(user, span_notice("You [ detecting ? "enable" : "disable" ] [src]'s detecting unit!")) + my_area.fire_detect = !my_area.fire_detect + for(var/obj/machinery/firealarm/fire_panel in my_area.firealarms) + fire_panel.update_icon() + to_chat(user, span_notice("You [ my_area.fire_detect ? "enable" : "disable" ] the local firelock thermal sensors!")) + log_game("[user] has [ my_area.fire_detect ? "enabled" : "disabled" ] firelock sensors using [src] at [COORD(src)]") MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/firealarm, 26) diff --git a/code/game/objects/effects/spawners/structure.dm b/code/game/objects/effects/spawners/structure.dm index 2b307cf0689..09368b8a170 100644 --- a/code/game/objects/effects/spawners/structure.dm +++ b/code/game/objects/effects/spawners/structure.dm @@ -91,7 +91,7 @@ again. /obj/effect/spawner/structure/window/reinforced name = "reinforced window spawner" icon_state = "rwindow_spawner" - spawn_list = list(/obj/machinery/door/firedoor/onetile, /obj/structure/grille, /obj/structure/window/reinforced/fulltile) //SKYRAT EDIT CHANGE + spawn_list = list(/obj/machinery/door/firedoor, /obj/structure/grille, /obj/structure/window/reinforced/fulltile) //SKYRAT EDIT CHANGE /obj/effect/spawner/structure/window/hollow/reinforced name = "hollow reinforced window spawner" diff --git a/code/game/objects/items/emags.dm b/code/game/objects/items/emags.dm index 011f2ca655d..5af3ce53824 100644 --- a/code/game/objects/items/emags.dm +++ b/code/game/objects/items/emags.dm @@ -61,7 +61,7 @@ /obj/item/card/emag/Initialize(mapload) . = ..() - type_blacklist = list(typesof(/obj/machinery/door/airlock), typesof(/obj/machinery/door/window/)) //list of all typepaths that require a specialized emag to hack. + type_blacklist = list(typesof(/obj/machinery/door/airlock), typesof(/obj/machinery/door/window/), typesof(/obj/machinery/door/firedoor)) //list of all typepaths that require a specialized emag to hack. /obj/item/card/emag/attack() return @@ -101,7 +101,7 @@ /obj/item/card/emag/doorjack/Initialize(mapload) . = ..() - type_whitelist = list(typesof(/obj/machinery/door/airlock), typesof(/obj/machinery/door/window/)) //list of all acceptable typepaths that this device can affect + type_whitelist = list(typesof(/obj/machinery/door/airlock), typesof(/obj/machinery/door/window/), typesof(/obj/machinery/door/firedoor)) //list of all acceptable typepaths that this device can affect /obj/item/card/emag/doorjack/proc/use_charge(mob/user) charges -- diff --git a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm index c2a91e71b42..78f825fb7fe 100644 --- a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm +++ b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm @@ -697,11 +697,15 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) uses = 1 /datum/action/innate/ai/break_fire_alarms/Activate() - for(var/obj/machinery/firealarm/F in GLOB.machines) - if(!is_station_level(F.z)) + for(var/obj/machinery/firealarm/bellman in GLOB.machines) + if(!is_station_level(bellman.z)) continue - F.obj_flags |= EMAGGED - F.update_appearance() + bellman.obj_flags |= EMAGGED + bellman.update_appearance() + for(var/obj/machinery/door/firedoor/firelock in GLOB.machines) + if(!is_station_level(firelock.z)) + continue + firelock.emag_act(owner_AI, src) to_chat(owner, span_notice("All thermal sensors on the station have been disabled. Fire alerts will no longer be recognized.")) owner.playsound_local(owner, 'sound/machines/terminal_off.ogg', 50, 0) diff --git a/icons/obj/doors/doorfire.dmi b/icons/obj/doors/doorfire.dmi index 472415ec798e37ad4400e83407d0cd478cd9a139..d0f7fb60ec544ee1da762d7188d9dd8a7e16c60a 100644 GIT binary patch literal 7949 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]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 literal 7657 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 diff --git a/icons/obj/doors/doorfireglass.dmi b/icons/obj/doors/doorfireglass.dmi index f00e6c2857eea7d51312bfb0da2d61dec4d23c17..243bb091f46b76e2adb33f7621896c01478bed9c 100644 GIT binary patch literal 5428 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 BODYTEMP_HEAT_DAMAGE_LIMIT || pressure > WARNING_HIGH_PRESSURE) - hot_or_cold = TRUE - trigger_hot() - close() - -/obj/machinery/door/firedoor/proc/firealarm_on() - SIGNAL_HANDLER - INVOKE_ASYNC(src, .proc/close) - -/obj/machinery/door/firedoor/proc/firealarm_off() - SIGNAL_HANDLER - INVOKE_ASYNC(src, .proc/open) - -/obj/machinery/door/firedoor/proc/trigger_hot() - SEND_SIGNAL(src, COMSIG_FIREDOOR_CLOSED_FIRE) - -/obj/machinery/door/firedoor/proc/CalculateAffectingAreas() - for(var/turf/adjacent_turf in range(1, src)) - RegisterSignal(adjacent_turf, COMSIG_TURF_EXPOSE, .proc/atmos_changed, override = TRUE) - - var/my_area = get_area(src) - - for(var/obj/machinery/firealarm/iterating_alarm in my_area) - iterating_alarm.RegisterSignal(src, COMSIG_FIREDOOR_CLOSED_FIRE, /obj/machinery/firealarm.proc/trigger_effects, override = TRUE) //We trigger the alarms automatically. - -/obj/machinery/door/firedoor/update_icon_state() - . = ..() - if(density) - icon_state = "[base_icon_state]_closed[has_hotcold_sprite ? (hot_or_cold ? "_hot" : "_cold") : ""]" - else - icon_state = "[base_icon_state]_open" - -/obj/machinery/door/firedoor/onetile/CalculateAffectingAreas() - RegisterSignal(loc, COMSIG_TURF_EXPOSE, .proc/atmos_changed, override = TRUE) - - var/my_area = get_area(src) - - for(var/obj/machinery/firealarm/iterating_alarm in my_area) - iterating_alarm.RegisterSignal(src, COMSIG_FIREDOOR_CLOSED_FIRE, /obj/machinery/firealarm.proc/trigger_effects, override = TRUE) //We trigger the alarms automatically. - -/obj/machinery/door/firedoor/attackby(obj/item/C, mob/user, params) - if(C.GetID()) - if(allowed(user)) - toggle_close_override(user) - return ..() - - -/obj/machinery/door/firedoor/CtrlClick(mob/user) - if(!user.canUseTopic(src, !issilicon(user))) - return - toggle_close_override(user) - -/obj/machinery/door/firedoor/proc/toggle_close_override(mob/user) - stay_open = !stay_open - balloon_alert(user, "close override [stay_open ? "engaged" : "disengaged"]") - addtimer(CALLBACK(src, .proc/close_override_reset), FIREDOOR_CLOSE_OVERRIDE_RESET_TIME) - -/obj/machinery/door/firedoor/proc/close_override_reset() - stay_open = FALSE - -/obj/machinery/door/firedoor/examine(mob/user) - . = ..() - if(issilicon(user)) - . += span_notice("You can override the closing mechanism by Ctrl+Clicking on the firelock.") - else - . += span_notice("You can override the closing mechanism by swiping your ID on it, providing it has Atmospherics Access.") - . += span_notice("It's close override mechanism is [stay_open ? "engaged" : "disengaged"].") - -/obj/effect/spawner/structure/window/reinforced/no_firelock - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/fulltile) - -#undef FIREDOOR_CLOSE_OVERRIDE_RESET_TIME diff --git a/modular_skyrat/modules/aesthetics/firedoor/icons/firedoor.dmi b/modular_skyrat/modules/aesthetics/firedoor/icons/firedoor.dmi index ab7389472281de16047732d7c680006e3120f08b..ff3df706eb369f4cd9a98ce90397e73d9bc29aa1 100644 GIT binary patch literal 7854 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 kkMYc! literal 3279 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 diff --git a/modular_skyrat/modules/aesthetics/firedoor/icons/firedoor_glass.dmi b/modular_skyrat/modules/aesthetics/firedoor/icons/firedoor_glass.dmi index b94ec448eac50795ede9c405122c2b9551da241a..3aadeda915c806d38d75c328330f15f89e7dddf1 100644 GIT binary patch literal 7893 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 diff --git a/tgstation.dme b/tgstation.dme index 46541af0cb3..b877dc929e4 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -71,6 +71,7 @@ #include "code\__DEFINES\explosions.dm" #include "code\__DEFINES\exports.dm" #include "code\__DEFINES\fantasy_affixes.dm" +#include "code\__DEFINES\firealarm.dm" #include "code\__DEFINES\flags.dm" #include "code\__DEFINES\food.dm" #include "code\__DEFINES\footsteps.dm"