From 4383df09ae5809090a1d49680193e7ebefdd4ec0 Mon Sep 17 00:00:00 2001 From: zxaber <37497534+zxaber@users.noreply.github.com> Date: Sat, 22 Jan 2022 01:36:03 -0800 Subject: [PATCH] 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. (#62055) Moves hot/cold checks to the fire locks Makes detection due to above only close the affected Fire Lock and its neighbors (via merge code stolen from tanks) Fire Alarms still can lock an area down if clicked by a user, right clicking is now the reset function. Resetting also resets all Fire Locks closed by their own detection. Gives Fire Locks an overlay of lights that display the reason it closed (Orange for Hot, Cyan for Cold, White for unknown/Fire Alarm Pulled) Emagging a Fire Alarm now emags all Fire Locks in the area, which accomplishes the same effect as before (disables atmos monitoring). Pulling a Fire Alarm will make emagged Fire Locks in the area display a corrupted warning light pattern, making finding and replacing emagged Fire Locks somewhat easier. Silicons can disable atmos sensors in an area by CTRL-Clicking a Fire Alarm, much like before. but now the Fire Alarms in the area will change their sprite to hint at this (the normally-green light will turn off). Makes a breach or fire not cause Fire Lock Hell anymore. Only the Fire Locks facing an issue will tend to close, leaving the rest of the area mostly unaffected. This needs some work done to make it detect based on edges, but it's a decent enough start to live with if we're all killed by meteors (Lemon) --- code/__DEFINES/alarm.dm | 2 +- code/__DEFINES/firealarm.dm | 13 + .../datums/looping_sounds/machinery_sounds.dm | 16 + code/game/area/areas.dm | 109 +---- code/game/machinery/doors/firedoor.dm | 371 ++++++++++++++---- code/game/machinery/firealarm.dm | 169 ++++---- 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 tgstation.dme | 1 + 12 files changed, 450 insertions(+), 247 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/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 147f7aa93d1..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 - 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 @@ -241,84 +244,6 @@ GLOBAL_LIST_EMPTY(teleportlocs) QDEL_NULL(alarm_manager) return ..() -/** - * 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,14 +293,11 @@ 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 af8d6d56b9a..36a22bc1559 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -1,6 +1,7 @@ #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" @@ -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) . = ..() @@ -46,29 +107,145 @@ else . += span_notice("The bolt locks have been unscrewed, but the bolts themselves are still wrenched to the floor.") +/** + * 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) - -/obj/machinery/door/firedoor/closed - icon_state = "door_closed" - density = TRUE - -//see also turf/AfterChange for adjacency shennanigans + 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 +/** + * 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 ..() +/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 >= FIRE_MINIMUM_TEMPERATURE_TO_EXIST) + result = FIRELOCK_ALARM_TYPE_HOT + if(environment?.temperature <= BODYTEMP_COLD_DAMAGE_LIMIT) + 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) @@ -82,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) . = ..() @@ -140,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) @@ -167,6 +351,8 @@ if(density) open() + if(alarm_type) + addtimer(CALLBACK(src, .proc/correct_state), 2 SECONDS, TIMER_UNIQUE) else close() @@ -177,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) @@ -190,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 @@ -203,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) @@ -217,46 +407,71 @@ /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' @@ -276,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) . = ..() @@ -338,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 @@ -356,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 @@ -376,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.")) @@ -466,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 0027c08338d..69f0af98c1f 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -1,5 +1,3 @@ -#define FIREALARM_COOLDOWN 96 // 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." @@ -32,13 +30,12 @@ //Trick to get the glowing overlay visible from a distance luminosity = 1 - - 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 + ///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 /obj/machinery/firealarm/Initialize(mapload, dir, building) . = ..() @@ -48,17 +45,35 @@ 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) icon_state = "fire_b[buildstage]" @@ -84,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") @@ -99,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 @@ -120,28 +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) - -/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 @@ -156,41 +151,69 @@ if(is_station_level(z)) update_appearance() +/** + * 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) + + 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) +/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) @@ -218,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) @@ -293,7 +308,6 @@ tool.play_tool_sound(src) qdel(src) return - return ..() /obj/machinery/firealarm/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) @@ -321,14 +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 ..() /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)) @@ -340,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) @@ -364,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/items/emags.dm b/code/game/objects/items/emags.dm index f38a5d59660..502a03b13fe 100644 --- a/code/game/objects/items/emags.dm +++ b/code/game/objects/items/emags.dm @@ -57,7 +57,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 @@ -95,7 +95,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 88fbc34a969..e577684864a 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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]^qPpIh9Nb23EGG)+Tt~|ekpm4TI9e!Sgtaf55Uie{ zmG_hba~sZ)lOugPHX74wJFbRq^0?o3H5v8C>e4M@wrjH%&R&i>}At&WU`V z!M#JG|FCT9&I5Hz7yRND_N_&d)$Z66e??=o5|xut7jgWV;ju%pfn+k$B9SG@!RUbz zuV_C&h==XY6SbR{Axw{PUC&^h`JA~aAfA;e}ixz!jBr}D9|GZvrM2@KRVJl zZwrL69b}>p24rTIM0y#s0AGpOBC;zOUx)Id>)+C2aaf{(#&3cT4uad)7@2#~u;?jr z)TfOF%#wzrst;}7^uXg@$`5{D!W=dj_RL`>-e0OYJ}5uwUiE~UJvMTAn=Q0dZdoCNNpSbf-O6{@9AET zWxrDOK1=O>CPbHl-Ym?&c!Jg^VOE*ff9siux`yu^E$_KOj5?{{N)=^FT{Sy)d*SD2>#$8{Nq;u;7J9I{}g=KcrJNv|| zhN&F-+`;mhP`u_s<3NgT|3q!=r>Z#PLthCdBv+6IvTfX6wSHlUl3GC$aEg9}*!33h zDAu?lh(_|I?*2hbAP+RS%_kMLTV|Rq=IHKSXz@nh!h7m-PU<2GpnvkFymm4P0bEq1E%zbV=m0IJ#2fgjNr;9(;z7Z%MZ-O5Y!(pkl=!TPY?ptW& z+=Z5bnh*Zju`tpU^_7r;kNEacS8RW(k|XDr4^-~SN_Oipyq%NTnwmdL4yJZpNdWpS z2RZ{;XNm_NA)u3VdHa`=;h_dd)*RQ@K2O<7%|d)?Ofx{|+*|z=qP^jX022mXLw>a+ zLX1fThCi|8__p+`1A47ulFdB7>PdM0f!Ur4G@i~UdTwT?@wLOY9jv~`!uX%+HUB+B zGfqsMeF9o?++m8JnVycHsrdTEc_r&VH8WIo%l_*Q0j@`BI>pxQ<<`x8!}cdmRaaxn z0d{03L*ru1d-t04h}F1T-k7Wh>CeETnHWV-)B42Yn=Xff2|UFJo6$-aw9Lz5cYIsc z#9G7zAZe`V1rrCeLCg$7iX8kY=p5&ycKV@&n_Qu6t<`}5ltuup5}V-~$#iy_P)=EM ze2#MBBb5UO83(!KU@=+n9{fA&9kux>xZ~CC5yPS z+>?dGke+2`r-61)cv%l54lld;G6Y^`n(dRo?lb%K>9eQ1y?q}_)_M&rd>3htMp{A1 z@+VS(Hbbo6v5(gs(FEa{N|J~|mB&@Pn8oU;F9z}Kvj^+hnLh%XpIB{?yz>W-KyNhA zRXY*5VKG2*%3Wo&kO}L0M<)sB`7V?kPBa#E4qD9F`OVpT7GYMLR^i%TE@Ej`H9PE} zeHCfx+Vz^fq_y>uc9JL~YB$#LM6Z^@S);PdT(EHvBxZjdH7E9XplMy+54_JOSo)yY zI6`Sxs@i#fGfVBy$kw>~2D)6-tdmzO4_gkg-tpnL=epQGmHdZpVHK13gl=_g;SsSn zY%ALI7w&IKcEL(o?-JrsltD*5Y2LK<$7q|t2&G750wgWMn1bN-@qEone*P3(^grdx z(va`6`rx>0L0NZUgVf{S#o{eh4EZJS8yn0M)w=3e44;3MdBpH4yzq^B-ohyeKSu=G zjK#@~W36PQAJvlc2huj70&5B+;K^4R&jPaT#IeKEM0_Zo!)H=Yfs8#! z3Rm$-SxwhDM+?rcYtzlS|yQd#Lmp1(?mMye<%oTQ(>g>KJt4jj1doq=&DRUCD^ z!a?{uFF!q*IR!R2@+QgMRgAwO0lo!9y^=WcV^M>h0_okOHqlhEQ{z^dh{XMuc7F*v zl1k7cX3||n=IfFgoGArY{y8ysUie-2YETcpPkw%QZ!sn0+qT}3$Zm_(a52e1LzOaO zrCV+)SvfGGug{jmV!h;aB^WoAeGM%Ixb{qNj&uDVA|2;)cX=$GN%^(b(dckaDOtN* zTx=rn2v9HDcA8jeGGI&!_E-Ob@K5x z5XCbYxko;xyM{6w(PJ`RgD(NqY!uP6L7NwHcQ%<}IS9D2D*HqLQ`o-7l_(iR7DAPM7fDeSn=JfT&}bxxtye*2zOI(vsU#n?*W z>CR<4y)rITRLgk%HNmkwZjsoQ6ycDnV{ZTNy|VBN@?6)H#e<9o2RI8`6HeUd5I_|yM2fhYXX8xS(Wn(A|rzLbcl|x zFPTaOkFr@*6NU`gnbFm>6BZzVZ`YEV2HEROX4VO4pUQBkyp+0}Y)9lJveS;j-kE9) z)v{+;94=xK6Gq^%ymUV6M*PZjs+i!cf972099)lEePDfaThr{9vi~BBYVwd|h9J6H zT%zsk?vLrrn+WEf%54v2EORUAF}j^knV20x+X23xZu(4c`M~YsmMF()kOWrd7{oWDugCv<<+;``Bc3PQDxey#bjI zBHav!qpM#bnJUjLzM<0KgugCgfuND@c%)%Eti$uJwB0javAT$xh{;cbtaQ&KcaPM_7-NHlm!a)V$nz2US)D`(KLZJ);8D zJV%oW;HL{oE(56#r4RH5cF4{2mF(oZ40Du-wZjcC!3KE8kz`j>#~@BTX;haOil;rk zGR&6nukc&f<~?;ld+g`WJP6mPG{N^0j$uFaer4h1slQLqt%L(ur{1p|v4@mdZuw7h z$H$X$4hmpgQHp5i`EaBY!`*-N>jPNBk%9nv6<)UBGndaXAVbg5(ef(Oh12{mnDyMs zbit<^1*CJ6K{n)IoB!?`5HsnKp;3H)h2!-V-|!P*NU2fsIu9uF27sRL>EQnZ{LgCt zx3+lwUuU`0%)a@Uz*u+_fd4;+s0~Q-dju>?9CIbw^ZiUdF#Lqc+_6 z<-pKOjZ84-bwA`+eSkXmr_le?YW@et>KgFMkqcRT4YmOzG3^nsoAH59Yqg>X)}dVzi$Jy)b6R4saS{p7dA7U&j0`b 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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