From 28b73d78686cc0b0be3339659aaa713b4cfa08ca Mon Sep 17 00:00:00 2001 From: Leshana Date: Thu, 25 May 2017 23:55:01 -0400 Subject: [PATCH] Adds "firefighter mode" to turbolifts * Adds a priority call mode that allows heads and first responders to cancel all calls and summon the lift to their floor immediately. * Adds a firefighting mode that turns the lift over to manual control, doors only open when manually opened, all call buttons ignored. For use during fires. --- code/modules/turbolift/turbolift.dm | 65 +++++++++++++++++++- code/modules/turbolift/turbolift_console.dm | 48 ++++++++++++++- code/modules/turbolift/turbolift_door.dm | 2 + code/modules/turbolift/turbolift_floor.dm | 3 +- icons/obj/turbolift.dmi | Bin 696 -> 1186 bytes maps/tether/tether_things.dm | 4 ++ 6 files changed, 117 insertions(+), 5 deletions(-) diff --git a/code/modules/turbolift/turbolift.dm b/code/modules/turbolift/turbolift.dm index 0ca172e7e9b..7a670954a0a 100644 --- a/code/modules/turbolift/turbolift.dm +++ b/code/modules/turbolift/turbolift.dm @@ -9,16 +9,74 @@ var/floor_wait_delay = 85 // Time to wait at floor stops. var/obj/structure/lift/panel/control_panel_interior // Lift control panel. var/doors_closing = 0 // Whether doors are in the process of closing + var/list/music = null // Elevator music to set on areas + var/priority_mode = FALSE // Flag to block buttons from calling the elevator if in priority mode. + var/fire_mode = FALSE // Flag to indicate firefighter mode is active. var/tmp/moving_upwards var/tmp/busy /datum/turbolift/proc/emergency_stop() - queued_floors.Cut() + cancel_pending_floors() target_floor = null - open_doors() + if(!fire_mode) + open_doors() + +// Enter priority mode, blocking all calls for awhile +/datum/turbolift/proc/priority_mode(var/time = 30 SECONDS) + priority_mode = TRUE + cancel_pending_floors() + update_ext_panel_icons() + control_panel_interior.audible_message("This turbolift is responding to a priority call. Please exit the lift when it stops and make way.") + spawn(time) + priority_mode = FALSE + update_ext_panel_icons() + +/datum/turbolift/proc/update_fire_mode(var/new_fire_mode) + if(fire_mode == new_fire_mode) + return + fire_mode = new_fire_mode + if(new_fire_mode) + cancel_pending_floors() + + // Turn the lights red and kill the music + for(var/datum/turbolift_floor/F in floors) + var/area/turbolift/A = locate(F.area_ref) + if(new_fire_mode) + if(A.forced_ambience) + A.forced_ambience.Cut() + A.fire_alert() + else + if(music) + A.forced_ambience = music.Copy() + A.fire_reset() + for(var/mob/living/M in mobs_in_area(A)) + if(M.mind) + A.play_ambience(M) + // Disable safeties on the doors during firemode, reset when done + for(var/obj/machinery/door/airlock/door in F.doors) + door.safe = new_fire_mode ? FALSE : initial(door.safe) + + // Disable safeties on the doors during firemode, reset when done + for(var/obj/machinery/door/airlock/door in doors) + door.safe = new_fire_mode ? FALSE : initial(door.safe) + update_ext_panel_icons() + control_panel_interior.update_icon() + +// Cancel all pending calls +/datum/turbolift/proc/cancel_pending_floors() + for(var/datum/turbolift_floor/floor in queued_floors) + if(floor.ext_panel) + floor.ext_panel.reset() + queued_floors.Cut() control_panel_interior.updateDialog() +// Update the icons of all exterior panels (after we change modes etc) +/datum/turbolift/proc/update_ext_panel_icons() + for(var/datum/turbolift_floor/floor in floors) + if(floor.ext_panel) + floor.ext_panel.update_icon() + /datum/turbolift/proc/doors_are_open(var/datum/turbolift_floor/use_floor = current_floor) for(var/obj/machinery/door/airlock/door in (use_floor ? (doors + use_floor.doors) : doors)) if(!door.density) @@ -61,7 +119,8 @@ return 1 else // We failed to close the doors - probably, someone is blocking them; stop trying to move doors_closing = 0 - open_doors() + if(!fire_mode) + open_doors() control_panel_interior.audible_message("\The [current_floor.ext_panel] buzzes loudly.") playsound(control_panel_interior.loc, "sound/machines/buzz-two.ogg", 50, 1) return 0 diff --git a/code/modules/turbolift/turbolift_console.dm b/code/modules/turbolift/turbolift_console.dm index a30aa9be397..e77447c0d2a 100644 --- a/code/modules/turbolift/turbolift_console.dm +++ b/code/modules/turbolift/turbolift_console.dm @@ -54,6 +54,7 @@ desc = "A call button for an elevator. Be sure to hit it three hundred times." icon_state = "button" var/light_up = FALSE + req_access = list(access_eva) var/datum/turbolift_floor/floor /obj/structure/lift/button/Destroy() @@ -66,9 +67,27 @@ light_up = FALSE update_icon() +// Hit it with a PDA or ID to enable priority call mode +/obj/structure/lift/button/attackby(obj/item/W as obj, mob/user as mob) + var/obj/item/weapon/card/id/id = W.GetID() + if(istype(id)) + if(!check_access(id)) + playsound(src.loc, 'sound/machines/buzz-two.ogg', 50, 0) + return + lift.priority_mode() + if(floor == lift.current_floor) + lift.open_doors() + else + lift.queue_move_to(floor) + return + . = ..() + /obj/structure/lift/button/interact(var/mob/user) if(!..()) return + if(lift.fire_mode || lift.priority_mode) + playsound(src.loc, 'sound/machines/buzz-two.ogg', 50, 0) + return light_up() pressed(user) if(floor == lift.current_floor) @@ -83,7 +102,11 @@ update_icon() /obj/structure/lift/button/update_icon() - if(light_up) + if(lift.fire_mode) + icon_state = "button_fire" + else if(lift.priority_mode) + icon_state = "button_pri" + else if(light_up) icon_state = "button_lit" else icon_state = initial(icon_state) @@ -94,7 +117,24 @@ /obj/structure/lift/panel name = "elevator control panel" icon_state = "panel" + req_access = list(access_eva) + req_one_access = list(access_heads, access_atmospherics, access_medical) +// Hit it with a PDA or ID to enable priority call mode +/obj/structure/lift/panel/attackby(obj/item/W as obj, mob/user as mob) + var/obj/item/weapon/card/id/id = W.GetID() + if(istype(id)) + if(!check_access(id)) + playsound(src.loc, 'sound/machines/buzz-two.ogg', 50, 0) + return + lift.update_fire_mode(!lift.fire_mode) + if(lift.fire_mode) + audible_message("Firefighter Mode Activated. Door safeties disabled. Manual control engaged.") + playsound(src.loc, 'sound/machines/airalarm.ogg', 25, 0, 4) + else + audible_message("Firefighter Mode Deactivated. Door safeties enabled. Automatic control engaged.") + return + . = ..() /obj/structure/lift/panel/attack_ghost(var/mob/user) return interact(user) @@ -154,4 +194,10 @@ return 0 +/obj/structure/lift/panel/update_icon() + if(lift.fire_mode) + icon_state = "panel_fire" + else + icon_state = initial(icon_state) + // End panel. \ No newline at end of file diff --git a/code/modules/turbolift/turbolift_door.dm b/code/modules/turbolift/turbolift_door.dm index 79bf1d0c51a..4b83bc60cf9 100644 --- a/code/modules/turbolift/turbolift_door.dm +++ b/code/modules/turbolift/turbolift_door.dm @@ -24,6 +24,8 @@ return FALSE //only the lift machinery is allowed to operate this door /obj/machinery/door/airlock/lift/close(var/forced=0) + if(!safe) + return ..() for(var/turf/turf in locs) for(var/mob/living/LM in turf) if(LM.mob_size <= MOB_TINY) diff --git a/code/modules/turbolift/turbolift_floor.dm b/code/modules/turbolift/turbolift_floor.dm index 46e4dfa0f48..85b4820c7fc 100644 --- a/code/modules/turbolift/turbolift_floor.dm +++ b/code/modules/turbolift/turbolift_floor.dm @@ -30,6 +30,7 @@ //called when a lift arrives at this floor /datum/turbolift_floor/proc/arrived(var/datum/turbolift/lift) - lift.open_doors(src) + if(!lift.fire_mode) + lift.open_doors(src) if(ext_panel) ext_panel.reset() \ No newline at end of file diff --git a/icons/obj/turbolift.dmi b/icons/obj/turbolift.dmi index cffc8aa140cd99b8022154b2578e8f05b43f488f..fce013604c8fe98ce8e4ec4bccbbc724d9d9df6f 100644 GIT binary patch delta 1122 zcmV-o1fBc11)>RmiBL{Q4GJ0x0000DNk~Le0002M0002M1Oos70HE@5GynhqEl^BU zMZmzoPft%SE-qGBG<0@FkCRmZGt2-o$N(_C{{S=L04>r0EC2tB?9*}GxME5k7Qp}j z00DGTPE!Ct=GbNc005hMR9JLGWpiV4X>fFDZ*Bkpc$`y_ZBTz-P?U*XDbVIA_xJ7fQaf*DK!H}G%*j*ub;NRvKQ+R)LaOqn*-QYS@R zXSbkF&Jfwi>{x#q`}zB$1cDyL&d%uZB>6w0< z^2wTVCLcnrmaFBG9+HQZ{tzvh{N|TYi{%C#8=fO z)5IQ7?FiPkFW$-i=3{}G7}2mr|c`)BaE1-w54?^P5K@DJd-ETzVTh~K-@Sij-XFO6|HFIc{Xv@lAzzyRAzzyRAzzyRIea|Zq4$U3`M)1ukpBVSK#>2B zeBJk^bbP+pcSEi;FW**{R8$9 z$rXS{q*Q=?L^2Wj2LU&U>;G}&+un2k;HmK3KlptJ{R1Gt=7;`4AHM(ofr%b&1nGHy zFz#-3c^y662-5TZVBGDv{4~Hs4>yAJygwLsJ1(yg`Ue+|8$2Sp0&V6wn?Rd+&V|rF z2nc_;Lfn-{n7~?)uSOclZ~@3y<6@pl1Q1`v^z=g_fcSa_)HwqrfcSa_vMoY%@Pw+V{jvPopV-`1X?AcS)L2k<|i){--H` z_}EzKuf@;oF)@R`AD-g-@_}-65?}vOq zK)@}+`>R3va>N3{`vVpb9#B|7cz?hGG0pr6jEmhzo&Y=lTPuKkVgAQ_Vg3jFNSs># z0Y4Jwf54B#`M>0EU-&bNABpq7=FfI7{N47My#in?yaJT}fw5qj!u$_bz%!}?>HPr< ocz-<$?+;kO_YoQLe?S-h0Br}47Uj{pDw delta 608 zcmV-m0-yb&3AhDWiBL{Q4GJ0x0000DNk~Le0001h0001B1Oos704G#udH?_b8&FJC zMZmzoPft%SE-qGBG<0@FkCRpZ|BCF>aoxCLX!-{T00001bW%=J06^y0W&i*HdXZ~n zf1i_CLQrWzVqR(vE>+43u6{0HhXMc%=`uia;AA!c00G5GL_t(oh3%F>Zi6roMTt*P zSR`9}0x@g20pbMQAX&8QdeL;vrag8Im`IsHHfSm(iu_qbk<4d2|Jj-(d0C}zy!UsY zcm`Qr@k$^D0t8Hw?k8Z-Hprk6Z8JQ%f6UwA2^f$bh)xvHK>>w?t^nu)1|$X1Kn~;g z0h+vpCh$IysH?iF;3$u^eE=%&Vn|4zrWPiyh0-qZ8Q3okACkUBUW0LykYj_nFO*W0 z?bz*37RX>uW`R0<(EE7xA>#~CKUw030DvRClDhA u2P*&)1!tr9$CrS!)qs12u`kgmmi_>iGlog1Gw_c90000