From 411bd2b05b4648ffe661700d483831848ae75235 Mon Sep 17 00:00:00 2001 From: Neerti Date: Sat, 4 Mar 2017 21:16:27 -0500 Subject: [PATCH] Ports Turbolifts from Bay. --- code/controllers/master_controller.dm | 7 + code/modules/materials/materials.dm | 6 + code/modules/shuttles/shuttle_emergency.dm | 2 +- code/modules/turbolift/_turbolift.dm | 12 ++ code/modules/turbolift/turbolift.dm | 122 +++++++++++ code/modules/turbolift/turbolift_areas.dm | 11 + code/modules/turbolift/turbolift_console.dm | 155 +++++++++++++ code/modules/turbolift/turbolift_door.dm | 44 ++++ code/modules/turbolift/turbolift_floor.dm | 33 +++ code/modules/turbolift/turbolift_map.dm | 228 ++++++++++++++++++++ code/modules/turbolift/turbolift_process.dm | 35 +++ code/modules/turbolift/turbolift_turfs.dm | 2 + icons/obj/doors/doorlift.dmi | Bin 0 -> 12345 bytes icons/obj/turbolift.dmi | Bin 0 -> 696 bytes icons/obj/turbolift_preview_3x3.dmi | Bin 0 -> 26009 bytes icons/obj/turbolift_preview_5x5.dmi | Bin 0 -> 38472 bytes maps/example/example-1.dmm | 5 +- maps/example/example-2.dmm | 4 +- maps/example/example.dm | 2 + maps/example/example_areas.dm | 13 ++ maps/example/example_elevator.dm | 11 + polaris.dme | 9 + 22 files changed, 696 insertions(+), 5 deletions(-) create mode 100644 code/modules/turbolift/_turbolift.dm create mode 100644 code/modules/turbolift/turbolift.dm create mode 100644 code/modules/turbolift/turbolift_areas.dm create mode 100644 code/modules/turbolift/turbolift_console.dm create mode 100644 code/modules/turbolift/turbolift_door.dm create mode 100644 code/modules/turbolift/turbolift_floor.dm create mode 100644 code/modules/turbolift/turbolift_map.dm create mode 100644 code/modules/turbolift/turbolift_process.dm create mode 100644 code/modules/turbolift/turbolift_turfs.dm create mode 100644 icons/obj/doors/doorlift.dmi create mode 100644 icons/obj/turbolift.dmi create mode 100644 icons/obj/turbolift_preview_3x3.dmi create mode 100644 icons/obj/turbolift_preview_5x5.dmi create mode 100644 maps/example/example_areas.dm create mode 100644 maps/example/example_elevator.dm diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm index 682b0fb3d03..62209a1014c 100644 --- a/code/controllers/master_controller.dm +++ b/code/controllers/master_controller.dm @@ -76,5 +76,12 @@ datum/controller/game_controller/proc/setup_objects() //Set up spawn points. populate_spawn_points() + admin_notice("Initializing turbolifts", R_DEBUG) + for(var/thing in turbolifts) + if(!deleted(thing)) + var/obj/turbolift_map_holder/lift = thing + lift.initialize() + sleep(-1) + admin_notice("Initializations complete.", R_DEBUG) sleep(-1) diff --git a/code/modules/materials/materials.dm b/code/modules/materials/materials.dm index fb3af280150..e032ae48930 100644 --- a/code/modules/materials/materials.dm +++ b/code/modules/materials/materials.dm @@ -586,6 +586,12 @@ var/list/name_to_material hardness = 500 weight = 500 +// Likewise. +/material/alienalloy/elevatorium + name = "elevatorium" + display_name = "elevator panelling" + icon_colour = "#666666" + /material/wood name = "wood" stack_type = /obj/item/stack/material/wood diff --git a/code/modules/shuttles/shuttle_emergency.dm b/code/modules/shuttles/shuttle_emergency.dm index 3238d9b2f40..bd2eaaa770d 100644 --- a/code/modules/shuttles/shuttle_emergency.dm +++ b/code/modules/shuttles/shuttle_emergency.dm @@ -31,7 +31,7 @@ if (emergency_shuttle.evac) priority_announcement.Announce(replacetext(replacetext(using_map.emergency_shuttle_leaving_dock, "%dock_name%", "[using_map.dock_name]"), "%ETD%", "[estimated_time] minute\s")) else - priority_announcement.Announce(replacetext(replacetext(using_map.shuttle_leaving_dock, "%dock_name%", "[using_map.dock_name]"), "%ETD%", "[estimated_time] minute\s")) + priority_announcement.Announce(replacetext(replacetext(using_map.shuttle_leaving_dock, "%dock_name%", "[using_map.dock_name]"), "%ETA%", "[estimated_time] minute\s")) /datum/shuttle/ferry/emergency/can_launch(var/user) if (istype(user, /obj/machinery/computer/shuttle_control/emergency)) diff --git a/code/modules/turbolift/_turbolift.dm b/code/modules/turbolift/_turbolift.dm new file mode 100644 index 00000000000..088bf39c8c4 --- /dev/null +++ b/code/modules/turbolift/_turbolift.dm @@ -0,0 +1,12 @@ +/* + * Turbolifts! Sort of like multishuttles-lite. + * + * How-to: Map /obj/turbolift_map_holder in at the bottom of the shaft, give it a depth + * value equivalent to the number of floors it should span (inclusive of the first), + * and at runtime it will update the map, set areas and create control panels and + * wifi-set doors appropriate to itself. You will save time at init if you map the + * elevator shaft in properly before runtime, but ultimately you're just avoiding a + * bunch of ChangeTurf() calls. + */ + +var/list/turbolifts = list() \ No newline at end of file diff --git a/code/modules/turbolift/turbolift.dm b/code/modules/turbolift/turbolift.dm new file mode 100644 index 00000000000..7d2f3c11a83 --- /dev/null +++ b/code/modules/turbolift/turbolift.dm @@ -0,0 +1,122 @@ +// Lift master datum. One per turbolift. +/datum/turbolift + var/datum/turbolift_floor/target_floor // Where are we going? + var/datum/turbolift_floor/current_floor // Where is the lift currently? + var/list/doors = list() // Doors inside the lift structure. + var/list/queued_floors = list() // Where are we moving to next? + var/list/floors = list() // All floors in this system. + var/move_delay = 30 // Time between floor changes. + 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/tmp/moving_upwards + var/tmp/busy + +/datum/turbolift/proc/emergency_stop() + queued_floors.Cut() + target_floor = null + open_doors() + +/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) + return 1 + return 0 + +/datum/turbolift/proc/open_doors(var/datum/turbolift_floor/use_floor = current_floor) + for(var/obj/machinery/door/airlock/door in (use_floor ? (doors + use_floor.doors) : doors)) + //door.command("open") + spawn(0) + door.open() + return + +/datum/turbolift/proc/close_doors(var/datum/turbolift_floor/use_floor = current_floor) + for(var/obj/machinery/door/airlock/door in (use_floor ? (doors + use_floor.doors) : doors)) + //door.command("close") + spawn(0) + door.close() + return + +/datum/turbolift/proc/do_move() + + var/current_floor_index = floors.Find(current_floor) + + if(!target_floor) + if(!queued_floors || !queued_floors.len) + return 0 + target_floor = queued_floors[1] + queued_floors -= target_floor + if(current_floor_index < floors.Find(target_floor)) + moving_upwards = 1 + else + moving_upwards = 0 + + if(doors_are_open()) + if(!doors_closing) + close_doors() + doors_closing = 1 + return 1 + else // We failed to close the doors - probably, someone is blocking them; stop trying to move + doors_closing = 0 + 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 + + doors_closing = 0 // The doors weren't open, so they are done closing + + var/area/turbolift/origin = locate(current_floor.area_ref) + + if(target_floor == current_floor) + + playsound(control_panel_interior.loc, origin.arrival_sound, 50, 1) + target_floor.arrived(src) + target_floor = null + + sleep(15) + control_panel_interior.visible_message("The elevator announces, \"[origin.lift_announce_str]\"") + sleep(floor_wait_delay) + + return 1 + + // Work out where we're headed. + var/datum/turbolift_floor/next_floor + if(moving_upwards) + next_floor = floors[current_floor_index+1] + else + next_floor = floors[current_floor_index-1] + + var/area/turbolift/destination = locate(next_floor.area_ref) + + if(!istype(origin) || !istype(destination) || (origin == destination)) + return 0 + + for(var/turf/T in destination) + for(var/atom/movable/AM in T) + if(istype(AM, /mob/living)) + var/mob/living/M = AM + M.gib() + else if(AM.simulated) + qdel(AM) + + origin.move_contents_to(destination) + + if((locate(/obj/machinery/power) in destination) || (locate(/obj/structure/cable) in destination)) + makepowernets() + + current_floor = next_floor + control_panel_interior.visible_message("The elevator [moving_upwards ? "rises" : "descends"] smoothly.") + + return 1 + +/datum/turbolift/proc/queue_move_to(var/datum/turbolift_floor/floor) + if(!floor || !(floor in floors) || (floor in queued_floors)) + return // STOP PRESSING THE BUTTON. + floor.pending_move(src) + queued_floors |= floor + turbolift_controller.lift_is_moving(src) + +// TODO: dummy machine ('lift mechanism') in powered area for functionality/blackout checks. +/datum/turbolift/proc/is_functional() + return 1 \ No newline at end of file diff --git a/code/modules/turbolift/turbolift_areas.dm b/code/modules/turbolift/turbolift_areas.dm new file mode 100644 index 00000000000..dbf568aec2e --- /dev/null +++ b/code/modules/turbolift/turbolift_areas.dm @@ -0,0 +1,11 @@ +// Used for creating the exchange areas. +/area/turbolift + name = "Turbolift" + base_turf = /turf/simulated/open + requires_power = 0 + sound_env = SMALL_ENCLOSED + + var/lift_floor_label = null + var/lift_floor_name = null + var/lift_announce_str = "Ding!" + var/arrival_sound = 'sound/machines/ding.ogg' diff --git a/code/modules/turbolift/turbolift_console.dm b/code/modules/turbolift/turbolift_console.dm new file mode 100644 index 00000000000..4cbee6a7737 --- /dev/null +++ b/code/modules/turbolift/turbolift_console.dm @@ -0,0 +1,155 @@ +// Base type, do not use. +/obj/structure/lift + name = "turbolift control component" + icon = 'icons/obj/turbolift.dmi' + anchored = 1 + density = 0 + layer = 4 + + var/datum/turbolift/lift + +/obj/structure/lift/set_dir(var/newdir) + . = ..() + pixel_x = 0 + pixel_y = 0 + if(dir & NORTH) + pixel_y = -32 + else if(dir & SOUTH) + pixel_y = 32 + else if(dir & EAST) + pixel_x = -32 + else if(dir & WEST) + pixel_x = 32 + +/obj/structure/lift/proc/pressed(var/mob/user) + if(!istype(user, /mob/living/silicon)) + if(user.a_intent == I_HURT) + user.visible_message("\The [user] hammers on the lift button!") + else + user.visible_message("\The [user] presses the lift button.") + + +/obj/structure/lift/New(var/newloc, var/datum/turbolift/_lift) + lift = _lift + return ..(newloc) + +/obj/structure/lift/attack_ai(var/mob/user) + return attack_hand(user) + +/obj/structure/lift/attack_generic(var/mob/user) + return attack_hand(user) + +/obj/structure/lift/attack_hand(var/mob/user) + return interact(user) + +/obj/structure/lift/interact(var/mob/user) + if(!lift.is_functional()) + return 0 + return 1 +// End base. + +// Button. No HTML interface, just calls the associated lift to its floor. +/obj/structure/lift/button + name = "elevator button" + desc = "A call button for an elevator. Be sure to hit it three hundred times." + icon_state = "button" + var/light_up = FALSE + var/datum/turbolift_floor/floor + +/obj/structure/lift/button/Destroy() + if(floor && floor.ext_panel == src) + floor.ext_panel = null + floor = null + return ..() + +/obj/structure/lift/button/proc/reset() + light_up = FALSE + update_icon() + +/obj/structure/lift/button/interact(var/mob/user) + if(!..()) + return + light_up() + pressed(user) + if(floor == lift.current_floor) + lift.open_doors() + spawn(3) + reset() + return + lift.queue_move_to(floor) + +/obj/structure/lift/button/proc/light_up() + light_up = TRUE + update_icon() + +/obj/structure/lift/button/update_icon() + if(light_up) + icon_state = "button_lit" + else + icon_state = initial(icon_state) + +// End button. + +// Panel. Lists floors (HTML), moves with the elevator, schedules a move to a given floor. +/obj/structure/lift/panel + name = "elevator control panel" + icon_state = "panel" + + +/obj/structure/lift/panel/attack_ghost(var/mob/user) + return interact(user) + +/obj/structure/lift/panel/interact(var/mob/user) + if(!..()) + return + + var/dat = list() + dat += "
Lift panel
" + + //the floors list stores levels in order of increasing Z + //therefore, to display upper levels at the top of the menu and + //lower levels at the bottom, we need to go through the list in reverse + for(var/i in lift.floors.len to 1 step -1) + var/datum/turbolift_floor/floor = lift.floors[i] + var/label = floor.label? floor.label : "Level #[i]" + dat += "" + dat += "[label]: [floor.name]
" + + dat += "
" + if(lift.doors_are_open()) + dat += "Close Doors
" + else + dat += "Open Doors
" + dat += "Emergency Stop" + dat += "
" + + var/datum/browser/popup = new(user, "turbolift_panel", "Lift Panel", 230, 260) + popup.set_content(jointext(dat, null)) + popup.open() + return + +/obj/structure/lift/panel/Topic(href, href_list) + . = ..() + if(.) + return + + var/panel_interact + if(href_list["move_to_floor"]) + lift.queue_move_to(locate(href_list["move_to_floor"])) + panel_interact = 1 + if(href_list["open_doors"]) + panel_interact = 1 + lift.open_doors() + if(href_list["close_doors"]) + panel_interact = 1 + lift.close_doors() + if(href_list["emergency_stop"]) + panel_interact = 1 + lift.emergency_stop() + + if(panel_interact) + pressed(usr) + + return 0 + +// End panel. \ No newline at end of file diff --git a/code/modules/turbolift/turbolift_door.dm b/code/modules/turbolift/turbolift_door.dm new file mode 100644 index 00000000000..79bf1d0c51a --- /dev/null +++ b/code/modules/turbolift/turbolift_door.dm @@ -0,0 +1,44 @@ +/obj/machinery/door/airlock/lift + name = "Elevator Door" + desc = "Ding." + req_access = list(access_maint_tunnels) + opacity = 0 + autoclose = 0 + glass = 1 + icon = 'icons/obj/doors/doorlift.dmi' + + var/datum/turbolift/lift + var/datum/turbolift_floor/floor + +/obj/machinery/door/airlock/lift/Destroy() + if(lift) + lift.doors -= src + if(floor) + floor.doors -= src + return ..() + +/obj/machinery/door/airlock/lift/bumpopen(var/mob/user) + return // No accidental sprinting into open elevator shafts. + +/obj/machinery/door/airlock/lift/allowed(mob/M) + return FALSE //only the lift machinery is allowed to operate this door + +/obj/machinery/door/airlock/lift/close(var/forced=0) + for(var/turf/turf in locs) + for(var/mob/living/LM in turf) + if(LM.mob_size <= MOB_TINY) + var/moved = 0 + for(dir in shuffle(cardinal.Copy())) + var/dest = get_step(LM,dir) + if(!(locate(/obj/machinery/door/airlock/lift) in dest)) + if(LM.Move(dest)) + moved = 1 + LM.visible_message("\The [LM] scurries away from the closing doors.") + break + if(!moved) // nowhere to go.... + LM.gib() + else // the mob is too big to just move, so we need to give up what we're doing + audible_message("\The [src]'s motors grind as they quickly reverse direction, unable to safely close.") + cur_command = null // the door will just keep trying otherwise + return 0 + return ..() \ No newline at end of file diff --git a/code/modules/turbolift/turbolift_floor.dm b/code/modules/turbolift/turbolift_floor.dm new file mode 100644 index 00000000000..7761f092843 --- /dev/null +++ b/code/modules/turbolift/turbolift_floor.dm @@ -0,0 +1,33 @@ +// Simple holder for each floor in the lift. +/datum/turbolift_floor + var/area_ref + var/label + var/name + var/announce_str + var/arrival_sound + + var/list/doors = list() + var/obj/structure/lift/button/ext_panel + +/datum/turbolift_floor/proc/set_area_ref(var/ref) + var/area/turbolift/A = locate(ref) + if(!istype(A)) + log_debug("Turbolift floor area was of the wrong type: ref=[ref]") + return + + area_ref = ref + label = A.lift_floor_label + name = A.lift_floor_name ? A.lift_floor_name : A.name + announce_str = A.lift_announce_str + arrival_sound = A.arrival_sound + +//called when a lift has queued this floor as a destination +/datum/turbolift_floor/proc/pending_move(var/datum/turbolift/lift) + if(ext_panel) + ext_panel.light_up() + +//called when a lift arrives at this floor +/datum/turbolift_floor/proc/arrived(var/datum/turbolift/lift) + lift.open_doors(src) + if(ext_panel) + ext_panel.reset() \ No newline at end of file diff --git a/code/modules/turbolift/turbolift_map.dm b/code/modules/turbolift/turbolift_map.dm new file mode 100644 index 00000000000..2e2498f88db --- /dev/null +++ b/code/modules/turbolift/turbolift_map.dm @@ -0,0 +1,228 @@ +// Map object. +/obj/turbolift_map_holder + name = "turbolift map placeholder" + icon = 'icons/obj/turbolift_preview_3x3.dmi' + dir = SOUTH // Direction of the holder determines the placement of the lift control panel and doors. + var/depth = 1 // Number of floors to generate, including the initial floor. + var/lift_size_x = 2 // Number of turfs on each axis to generate in addition to the first + var/lift_size_y = 2 // ie. a 3x3 lift would have a value of 2 in each of these variables. + + // Various turf and door types used when generating the turbolift floors. + var/wall_type = /turf/simulated/wall/elevator + var/floor_type = /turf/simulated/floor/tiled/dark + var/door_type = /obj/machinery/door/airlock/lift + + var/list/areas_to_use = list() + +/obj/turbolift_map_holder/Destroy() + turbolifts -= src + return ..() + +/obj/turbolift_map_holder/New() + turbolifts += src + ..() + +/obj/turbolift_map_holder/initialize() + + // Create our system controller. + var/datum/turbolift/lift = new() + + // Holder values since we're moving this object to null ASAP. + var/ux = x + var/uy = y + var/uz = z + var/udir = dir + forceMove(null) + + // These modifiers are used in relation to the origin + // to place the system control panels and doors. + var/int_panel_x + var/int_panel_y + var/ext_panel_x + var/ext_panel_y + var/door_x1 + var/door_y1 + var/door_x2 + var/door_y2 + var/light_x1 + var/light_x2 + var/light_y1 + var/light_y2 + + var/az = 1 + var/ex = (ux+lift_size_x) + var/ey = (uy+lift_size_y) + var/ez = (uz+(depth-1)) + + switch(dir) + + if(NORTH) + + int_panel_x = ux + Floor(lift_size_x/2) + int_panel_y = uy + 1 + ext_panel_x = ux + ext_panel_y = ey + 2 + + door_x1 = ux + 1 + door_y1 = ey + door_x2 = ex - 1 + door_y2 = ey + 1 + + light_x1 = ux + 1 + light_y1 = uy + 1 + light_x2 = ux + lift_size_x - 1 + light_y2 = uy + 1 + + if(SOUTH) + + int_panel_x = ux + Floor(lift_size_x/2) + int_panel_y = ey - 1 + ext_panel_x = ex + ext_panel_y = uy - 2 + + door_x1 = ux + 1 + door_y1 = uy - 1 + door_x2 = ex - 1 + door_y2 = uy + + light_x1 = ux + 1 + light_y1 = uy + 2 + light_x2 = ux + lift_size_x - 1 + light_y2 = uy + lift_size_y - 1 + + if(EAST) + + int_panel_x = ux+1 + int_panel_y = uy + Floor(lift_size_y/2) + ext_panel_x = ex+2 + ext_panel_y = ey + + door_x1 = ex + door_y1 = uy + 1 + door_x2 = ex + 1 + door_y2 = ey - 1 + + light_x1 = ux + 1 + light_y1 = uy + 1 + light_x2 = ux + 1 + light_y2 = uy + lift_size_x - 1 + + if(WEST) + + int_panel_x = ex-1 + int_panel_y = uy + Floor(lift_size_y/2) + ext_panel_x = ux-2 + ext_panel_y = uy + + door_x1 = ux - 1 + door_y1 = uy + 1 + door_x2 = ux + door_y2 = ey - 1 + + light_x1 = ux + lift_size_x - 1 + light_y1 = uy + 1 + light_x2 = ux + lift_size_x - 1 + light_y2 = uy + lift_size_y - 1 + + // Generate each floor and store it in the controller datum. + for(var/cz = uz;cz<=ez;cz++) + + var/datum/turbolift_floor/cfloor = new() + lift.floors += cfloor + + var/list/floor_turfs = list() + // Update the appropriate turfs. + for(var/tx = ux to ex) + for(var/ty = uy to ey) + + var/turf/checking = locate(tx,ty,cz) + + if(!istype(checking)) + log_debug("[name] cannot find a component turf at [tx],[ty] on floor [cz]. Aborting.") + qdel(src) + return + + // Update path appropriately if needed. + var/swap_to = /turf/simulated/open + if(cz == uz) // Elevator. + if((tx == ux || ty == uy || tx == ex || ty == ey) && !(tx >= door_x1 && tx <= door_x2 && ty >= door_y1 && ty <= door_y2)) + swap_to = wall_type + else + swap_to = floor_type + + if(checking.type != swap_to) + checking.ChangeTurf(swap_to) + // Let's make absolutely sure that we have the right turf. + checking = locate(tx,ty,cz) + + // Clear out contents. + for(var/atom/movable/thing in checking.contents) + if(thing.simulated) + qdel(thing) + + if(tx >= ux && tx <= ex && ty >= uy && ty <= ey) + floor_turfs += checking + + // Place exterior doors. + for(var/tx = door_x1 to door_x2) + for(var/ty = door_y1 to door_y2) + var/turf/checking = locate(tx,ty,cz) + var/internal = 1 + if(!(checking in floor_turfs)) + internal = 0 + if(checking.type != floor_type) + checking.ChangeTurf(floor_type) + checking = locate(tx,ty,cz) + for(var/atom/movable/thing in checking.contents) + if(thing.simulated) + qdel(thing) + if(checking.type == floor_type) // Don't build over empty space on lower levels. + var/obj/machinery/door/airlock/lift/newdoor = new door_type(checking) + if(internal) + lift.doors += newdoor + newdoor.lift = cfloor + else + cfloor.doors += newdoor + newdoor.floor = cfloor + + // Place exterior control panel. + var/turf/placing = locate(ext_panel_x, ext_panel_y, cz) + var/obj/structure/lift/button/panel_ext = new(placing, lift) + panel_ext.floor = cfloor + panel_ext.set_dir(udir) + cfloor.ext_panel = panel_ext + + // Place lights + var/turf/placing1 = locate(light_x1, light_y1, cz) + var/turf/placing2 = locate(light_x2, light_y2, cz) + var/obj/machinery/light/light1 = new(placing1, light) + var/obj/machinery/light/light2 = new(placing2, light) + if(udir == NORTH || udir == SOUTH) + light1.set_dir(WEST) + light2.set_dir(EAST) + else + light1.set_dir(SOUTH) + light2.set_dir(NORTH) + + // Update area. + if(az > areas_to_use.len) + log_debug("Insufficient defined areas in turbolift datum, aborting.") + qdel(src) + return + + var/area_path = areas_to_use[az] + for(var/thing in floor_turfs) + new area_path(thing) + var/area/A = locate(area_path) + cfloor.set_area_ref("\ref[A]") + az++ + + // Place lift panel. + var/turf/T = locate(int_panel_x, int_panel_y, uz) + lift.control_panel_interior = new(T, lift) + lift.control_panel_interior.set_dir(udir) + lift.current_floor = lift.floors[uz] + + lift.open_doors() + + qdel(src) // We're done. diff --git a/code/modules/turbolift/turbolift_process.dm b/code/modules/turbolift/turbolift_process.dm new file mode 100644 index 00000000000..83ce1b9faf0 --- /dev/null +++ b/code/modules/turbolift/turbolift_process.dm @@ -0,0 +1,35 @@ +var/datum/controller/process/turbolift/turbolift_controller + +/datum/controller/process/turbolift + var/list/moving_lifts = list() + +/datum/controller/process/turbolift/New() + ..() + turbolift_controller = src + +/datum/controller/process/turbolift/setup() + name = "turbolift controller" + schedule_interval = 10 + +/datum/controller/process/turbolift/doWork() + for(var/liftref in moving_lifts) + if(world.time < moving_lifts[liftref]) + continue + var/datum/turbolift/lift = locate(liftref) + if(lift.busy) + continue + spawn(0) + lift.busy = 1 + if(!lift.do_move()) + moving_lifts[liftref] = null + moving_lifts -= liftref + if(lift.target_floor) + lift.target_floor.ext_panel.reset() + lift.target_floor = null + else + lift_is_moving(lift) + lift.busy = 0 + SCHECK + +/datum/controller/process/turbolift/proc/lift_is_moving(var/datum/turbolift/lift) + moving_lifts["\ref[lift]"] = world.time + lift.move_delay diff --git a/code/modules/turbolift/turbolift_turfs.dm b/code/modules/turbolift/turbolift_turfs.dm new file mode 100644 index 00000000000..632160efaa1 --- /dev/null +++ b/code/modules/turbolift/turbolift_turfs.dm @@ -0,0 +1,2 @@ +/turf/simulated/wall/elevator/New(var/newloc) + ..(newloc,"elevatorium") diff --git a/icons/obj/doors/doorlift.dmi b/icons/obj/doors/doorlift.dmi new file mode 100644 index 0000000000000000000000000000000000000000..5617a988f7877ee7c2ca53d9558c670636b4cbcd GIT binary patch literal 12345 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 literal 0 HcmV?d00001 diff --git a/icons/obj/turbolift.dmi b/icons/obj/turbolift.dmi new file mode 100644 index 0000000000000000000000000000000000000000..cffc8aa140cd99b8022154b2578e8f05b43f488f GIT binary patch literal 696 zcmV;p0!RIcP)>7Hbaq9LlU4u!itN*I-MC_C`UeOA0004WQchCV=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+ z(=$pSoZ^zil2jm5DXFxiBtK7yi!&v&s2HS+i!-e#F*g;&HbhqzpOaZaP-#J8UTO|5 zRmuvkelB2#0ssx^GC*?RWHtZ*0mVr~K~z|U?Uq4qgD?<9iBC{iBwKp|F>AO1;so3v zS+whV(R9tGJ$4P4NSQ%4XeuR&{8>bi%x66R*_tGIS*35h_jjOp23cM4N+1RT1Wc0d zCt%Pv$e+u;cqkRFIm6wpBdg@mpE=mG{L1<^nbM&a0K@b7ovRP}C|x-pI64WXtLFnpC!sXX2Tm_|g>5#VaBNeY z52Bt@yWxuBpe0f($uZcQlVTZUaQ$Rf0Ne_gTi6@s7BVRBE6CuM?3i)j0uqNF^+2V! zWXFut?Cu2&4oyKBbGe)+gZ=5G^}PWG$5w#0p!(jJ$x|G(E=y#9z@a3nao^IFXN3$< z$@DBJ4Mxuf#{MA{1i(>0<(EE7xA>#~CKUw030DvRClDhA2P*&)1!tr9$CrS!)qs12 eu`kgmmi_>iGlog1Gw_c90000>c literal 0 HcmV?d00001 diff --git a/icons/obj/turbolift_preview_3x3.dmi b/icons/obj/turbolift_preview_3x3.dmi new file mode 100644 index 0000000000000000000000000000000000000000..f0f1ec491e17c79f11abc4edfb7d1a0150d3352b GIT binary patch literal 26009 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 literal 0 HcmV?d00001 diff --git a/icons/obj/turbolift_preview_5x5.dmi b/icons/obj/turbolift_preview_5x5.dmi new file mode 100644 index 0000000000000000000000000000000000000000..e054a6b9aacc0635c8288ae7da2c4b9d3bb36f9a GIT binary patch literal 38472 zcmeFZRa9Kh+V0yp!66VdXh?8(Yb=luBxr)WyE{#Ax8T7wcz|HRJ-ADP26wkcy3ZtQ zt#9vh_P575H|JuH@xNeTvujq(s`=JaZ#};Xf3GNujX{P10)epKzL8b|fe^$WztB;E zzl_8cmIB{wywpCrNSitvJ6SroSlZixKpq*a{nZ%$)PyMGzpjah7xKk_FB8ZK%!84& zgw%3kZy%CJ-GqkiPMK{^E((4R`hGIJ{WPteXTs5ENu8uBSaWY(^A=IcTBUj#HH4;a z?ob{(Dqg5@rVCYxs?VClX&msX;zN5sB~N3fcytDF1fviFsR+hy(^)x?Ci z`-fRD^M~!hB<2s5gs+scq8OC(a^{zpQCEAypNc>?K7+7Ar9gQW+m+ST)ty^gTa^@& z=pdFM#MNYNyFVAZQ@humPTK>J?uq;hv_RcsM^?j9aLjYz`YQ4aQExYW)3Gd3;cLxh zR|YOfeD(uSXojG3i1!NIPiJn^mv7Tdsubt=XN9^yn?48zno+xIEWiq=jk5$sKLnA-GQj+P9 zdA`2bT^k^J-(=)@=c)T8BuGD$AD)bcDCa)Z{kPS0*=>+3sa3d$1kO%L^3=NIt1_o!SH zue?v;=ikLeZ5mveZWlPMNpZX_DgLOdz2Hnwh}AuRnLawJFQ3~6^tC=dlq+^ePcc8E7FV&|CmMsoGqM3870#)(Y)^$G(m!%v? zBLA5LG4>UGU}J|CV|@E%Rk%@Mb{?_4WmVaZK2qSQ2)>+_WX*Pe9xcQ0Ha^ z-gfOcHNubd-oCC8K3$^Qbo9`H=75S6Ln%54fuE&7tA&qpmMt9MNVo@jS8aC=UZQPx zo9yPUuDl=Ys6W6~9$Hu4wGX|675T+aw#4jD+VITVy7rul*evv&i;xLhK;jow9g!uz zo&0Xue{TZI6Z4+oDJJZ&wZE~%vV32X3iMFnh{8Sf3k)fip)D91z(mit>MGyCtY#<@C$g_x*jU51!w?!G8c>i(Pw4ll)f;- zOaCIm?5LIetWqi-8hLvlhu{N`g%K7l^92aB0`ZxQ-uB{fnG)5@x1Y)^`$A#3{S;Kzk48m)Be;+l=tw z_OMLsLFR71fo%zr;5s(&m(dbGg;pBV`9ba2nG*a$ z33!Q9BP>-aG#iib^1?bha?La^ZhdKUR+hGYNRj_q+_%1H5C#b-QVrERQly}hV24ic z@u@p=x>soBTK#IQd`I$H-~oYmp=j>-sSN(ZAeb3ZEKu=(!_q(9FMzVdS zSg(NwtJ*fQ)4*T7LY#0k?Wt@mCCXYVe>aafdbw7TU%S#sDLx89v{$BIl~QeMSK&|! zcN4qr?}A@?xhwmI3$A$_9rf0Yfe14}-fpPH&XF7M7HS;OaCjGJ(Gkh&M{=l~^%rRz z1nvKG>(nBN_NmT#D;s;;r^sSUhiq;$J&wA040$X2V@ayarLA_vd2xRn-qhOl&&kka zR^Zg@=C`*-TbhMhrxv}n7jCOu`1SI{_(*G}$5l6vqhL;dc6 z6BM_4<*kM-K@w%j%TnJgs_`4!gmA*5VaLwBw&~6{{g96q!;+WPYl+RZS&r~V?S()f zrD0>LFk*-zRhbdqjj`4xS!RW;h8FgVahrx+S7J2G?U8I^Ih2oi(g9W#GVaZRR5v#6 zck^yZcJBUEH&`KbrM!{V{J&05HsPn>#y>mCdbg7)h^sA_Hny%`)fM;} zgrZt#7BX4)>N5vy=WOeRwWIotg%(=538HYaXMhC)k^kB({&|i!Fuwn|!@!;}tUA zkZ#U8IT2s(k+&((VRNzWhF8rrAS@{YR0I`ifzddb)(}GcijZE1jR~9j6A}9u{!P0& z#}K+bw=Uh-rm}(Q>Kdd5OESFIZ}2%u8s{}oy5h|8`z(l$OjpM+cc0cR*zR2lC7T*9 zT*Y|bRT3_HMAILly^KuhO|MQzvZ5e;g)DHM~Q$p^|ZBh=Vd(4 zx9K5I*M`yS&C)SxzOi7gTxX|Xd`u2r7f?;^u;GjQ8=_mXpXdCtDT2IXB#rHFwzL1u zoQOE<`%!a#d2jXRBpL!U59sKx*=ro_vELkGsu3pFwmWqM+lZJ3Elr?MZiP zMR-E(K5K{+8Y8ye{qvRAJcG+?Nv|G5+G7=LC^8kd)71?GD2y~`)lgz61i4bMUyl9j z8R?^|FIi!!~Vf$oYz}ppM~vF%2x&0E;S;TXPu|5UMiCq%*dl2k(8Mg zV2I~V?VgCPT=-D|-^a52zHm{` zW;7$8$Iw%$PSR*>GqlLv5Qcag6RTc^hl~(Hh$Ui@yAq8qC-Tp1be#2l=!7(r50D)*)@jzU38F=UL6iTLbKn zc&pbO4xw)tPg?xb)q6=VIGBGi=gw$h7q4{Jmo|2DQj=gA9~HNq6^c4%!v<5nrgOTJ zgn0Og*J*UR-lop{UgH}~1G7U@3_0kN3FagbjzcCaq|0Xdc(8tt2<69*d6jV%-UD-W z#2uA~zgJl=e>+rRc6PRLw>Epz91MqEh#j|XQz}BBR3A$gqC$+*-I5{<$L*^6NL9I3 z8`&zZFo>pdmcEn5^p*2o4?HBXSF1FTdLv+$MKID=%wnuR*DyTa%I=jIXjk*6mwWNe ziWjw&O;UV?bkb`6ex10TqY!j-lh#l?2j3uH?l|^6`|NW%q`#Gq3(jcUt9bT!bJ%HQ zcCm65r$eg;@mqIqLzWEF84{NUd`T{ckniMt@SEN-B}e#<_R$X`J6X+|*51XTj(^8J zMEipYo2u2AzVBaLVW;g7J2`~=4dIpUpJ@jh?@1Hv8~>n!^v;dJok}h1OZR)BVu?%v zRepb*dG?+iImoxp^l2L)cxA~tnnV+S=G($2oa{t(%v&08NZ0 zjxn%Vf#ZHZyiiQo`2hyw<{{@(Z12yN+Si<>(9+MJJDmKg?E?+(FK&eFMBC@rE}6O+ zeRcj~7F@w{H0GOZw$!)lF4$7-%$Ev`%zsTX4!dX1My@dQZ--YDl^*=I4qezXi@`f| z8!h0shoM9vJ&rnTnUD}F$i6UeQwZds%Ci2$d`nARTyvej_x_|OY9K-g=ZdbY-JD~S z%b#C@N9hc_YFm-z*$owJ_WR~_k#LjCDPniLQf*zAo4XL5Tsk_!&K2tS z1?C$X9iJl+_m<7)su8R9V$hSW@@e36AD>-2Z%698({14x zd$^izt}^6Q4$-f{9N3%)oN z0*h*sY*=$U(wZ(lUcUe>aR&=l1{H ziM3z6Ywvj|R>YT~E+|mZ&vpIUIljAod!h=yd*`!}tH1q0>_%eQdrZ`s@lS2zQf}yX zG73F#z&?&RdH{#k@N*ez`lKxkR_%4aIZ@#H&}UBUNbNC!$#6m`bL+^NI^Mnd)?(vb z8)3yyx@9vY2Ts1V6FGCoQ@?)yK0R6gkC->Nwm#C)Zq~|eca7hlo7=ImfBFMwsgp0+ zv~W%b@^HB;A%SP#^xN-<6l)5ZZVhGMmd#ygp82zH<)sW#@m%*iw_hfXbJj$tnF^Kq z`nk2O3adgk*TU2Lm%)p5>AhFM=0=4yQoz3q%ceT5*dHaHrXa=ldv08r6o&`Uz zy*RumAJ>e_W6Q^vPJiGhfw+pJsFYY=`NRx4w98 z?H0SUo-?=K58;If1R`V|pWDN4tD2mVn$Gso@_{MJ@oZyYXTI7vL)bk=uc0~Ll`m4G ztk;4kPos==QIF?Ce9(FyxqZgFkT~;4QNCdg`GcwdGmYC^c1%y)g*!bp8x8h%3AA9r*l; zE({WM_i0c3j*&m|-w*ok>Wc4`V#exl8h6WiW%EZ}U4NHCYr_6+)2WsXtF+MY>Mc`vrY(UH&di`6)!x z6Bh-=g!sS z-r1KcWuy1wLS(kcUUgfN<6~b zuA4fhFO-%e-PWD1WEKK%yn^%4UHE0j)!R<(x>U|T@jRHX{!TEXWm`E>>@+p9@p%d* zN2om|-dM5s;j0Wk77~p##ds-eFL5T=9=bik9+bMbQ`&02-dB()tt_4TQ(Ph?lc_B6 zQz8LPkDC0KZO@N&Z|z$0&ViNJFh}Z4kEbU+N7NFos2(9|ZYpZ7iwp)qvAWi)N+SCd1Rq9w3qia6;rmY?zfpZ6G^0}#!dV7#z`^ALZmfJW@6%;`O`CDGp`5sGl74ZIgzPyG$k(Pv7! z@gO2us)(<*$GRj2AlojOXvn6W;#>-t-OzY1+~{YFg}KpYT$&GR`3V`P`ib}SDnqYG z#S8GN3Er?+7?kRo=OzYZ-!$PNJ`FR;5PQd^8D6EvDV6+_@TfO`dM?iNfSWrrb^(27$9PKf=LWjNn{yErEyATVMIMosA(kULA z$dzS9pWHwdf)_#(zFE*EYetMG2lD|6=5URB=@2bnTdRpTyf2JMO!~Vgff&7y(d7)(|)T=3nIchFc;{K z9MxAV2#mlZd21dMMEyQ6tVZkEM-FAe-ox}D&fvkpWP)0iw4j7ImY2hg+!3SMuaYGZ zO7ZaMNHs4`Y2=V|;NS)ST_!79(9(xo85X+gZ$D3}h%(!y7c09rR*$CXbL-a2d)dqe zQ6>Dj7n(lLD2r0-w#vaaJ02H{WF_9bo}pR%Gbg#Tn(A~#W$#Jz#|;GJ;UDr7;{{+3 z3;`x3KFTC-CZNSf4f{mi{agy3Zh=zwtr#{*~YvCFkNIG$Y2Gh#{m7RPe!HFIFCqhIKDiAM}(H{83z z33SL&%8#maP%*k+ym4d48y?EZEsR*fjTps+4y*(Ta0l2fs3ujjSkH;~w0707Q1quw z-h1)I#G5r0xW3urwB9xO6M>BP+R>pX1PEKK5PvggC$}C6CIeBr(IlhwaT-eBi;1$Y zngdmFDfd%}H-A@N)L2rbGka<%z#>x6`^qK_m&4pIDM5rC%B=GaMW;ezoABG0kD_-Y zXy_kOM$1{KQa*V50keb<%F*?m>bdJeeReyB8WW=-iK6-E#^0!m_FOWJKZ4>`m>%N* zRpS*S={w&{TBa%Q7h`dq3rQHP9@V>4a6J^RgoI2A?BKfueQ z3M)aJrt)x0+P31{7tcKWs9}^XyD(|Up8N8btYF-UQakAWA-+X?99 z-4+eR->yM;Gr#2-#>eB0va&MaS@kM*`QHj~c|*QRl>z)WXhga+2h-J&gV`zfDYRHJ zp?lwIuLIONw?31u)@p3)#+ zYO!)-y_E~MBzZF>KV&WljT{BLw(GXF6CAvN7b^QphJ6I3C*u$xd_6|EH$k4Dn^33I zPLd<@Ws{}|vwR~+6ecL2yzBb3ZG)W;t2;Hw?M?W&5oa)7s-(Q@4lo{4J}mohl6C zOXfL3#g-&#&=VE#jJ#*Oi(gk9wK6qc@dh6-XPRogw8qc`B8rsel3~K|)9)NF(q81F zcQ<0IFIXZe7pin#1F2YQ`N1b8&p`!ZPXnsW6q4?t#=yJpl!t-8T@jhO@d7g+{mIUH z$oQ~zFb9@#u_f18s*0k@8~SMWU~!WkMBq)`dCwL!P4EFzC2q@jIyCAR0{R+}VmHT2 zv2PqbxQGRY24pfBM6b0|CvgjzgdkZTF;E2R&Uy;Y_cL|qP1PhPa}z^L?&=6~-!e|g zGg+0zBogFnu|nU0v?MhN-f8zS_8|IxoA2((olK=EdOBI;-8!I%`W^_YjvU^f-0$=% z$mk=)=}n|xST3$d8tpUe9@LiQl{6_PBnUgs?$Jf_M3t;VLVR%>QCa*Ozu%vT6=?EJN>eHWUS^6#*k}A;pJrx)ZpVfG zTYhW*Qr^&{C`BlA%2Qks@SB2V@#apU1esWUO+IzQ*X!>VosU zRJp$mTu02ge{bM=INc@T^kBe~o~4K(!9Y)ozQ&E65YL8=SguvEp-=rKFd4FZ@3ozl z+4jV?<9+s+*2;_=3VU}QNAnk1#!ux4{?}FF zih2{ai+(B&BXYx%n|6BagyWK~E}k-BAsf2XbA7F|V&KXmTCn>OMXQ~=VVLAIt%_%V zW%ACYmp44bmCf2VWeXrm0xLnyLpsYVD-N3oFuVmVZInp@#H>sz?Dp7c zkZGnc5tcnf>P)Kk^2i`=q<(H{kD{F!P-*JkYVuE|1_hqHCL!4A+&&GC;&$WuI%=0@ z#`LOC2n)Y|wuIva_{jw;v^YNHUKM5DrcUKdqt>(6`8?Ce$6#$=n-GfT5bG}GNIv|)n{?}_=8e|8dh11PK!<_&&Ltnj-mWB5Ue1BVEM(8KV~Iw zK;!k&r1GL+O`s&lFKC>Z3QcuU9=g3q3^$ea{}(;{Gs0f=)V`D^pE|W*Lb>VZUn%^$ zsEn0IndjH!|DuFb4-C)|NRgej@uzh0xDPGTU(Q(ZCe!t3;|EexMx`PnGq-;n0LO}K zfE!*hE$yQy~Z7BPqoy-qV8UBEk|GD@BnlnqTrnSIK<4xa~od4CA?C zAbe}|3F~PKAZpLzfDy0h_u-8YYc&^ow*wPrgxK*)&z(B5f>eh?TawKc7c7MvjG9BNa=|}kZ4+eZPNq-h{PIpO3#;QP_^WTVH zHK7`Y>YPs{ZkfR<7=CNplIZf(2?^9#Q?2tMhVM(%wtlz&TS}h!z8>t+@C!3x`btq^ z^#VWLfY4{9e_Gz<0V_()HR#k(N)zl4Y|%cqBnjQSnK0Q;Nxxz&{)D?5@Ck>}RAfeu z#U6|`WkUD@LvqP`bd5>i?=+Gs^yX>1L_yl>ZZ6BelrN5H{Qp+@mfU-AI4bOPw%szd zFj3u#P4aMt5rt@Bp$CBQU+=#4skQx&R;L+Z-n!dWd++L!w5qE4?zVGzk42{rQ7%v1 zg_#jhtcU>*SmquR(8vgv_xOl(yTkEs6jvkHoE?*9GEFsPZgs4a`hChm+B$@%@j=-qR(=fBa~2GZ!(c zPir@qyIly`Zzi8M$6)GHVJAmM7`53})R4XOce!MOrXZm?zx+w5u$;TC!0YqXRbwV> zmr1RUfrkWV3O>VN`XUAbj-b|L(kDb!ae^ym8i@2`cN}bK}}EY zx|4V-uelJ(QkejT6kvR-crE*P*I?{R?Id|@wXL^Oa;TNTQoyI(?@P6*4~kT#)9!{O z#Q`g)ggF-GOW$4d8WUE;f;RP$D&GH}Byi+t+_-RNB}iqZm;|ij1D^iNmlE<9Rh%+I3e$74*`uVr8cln@TylM~+>+=_g?^lp+ z2GH|l^U7rEnUZ*Jb;1PjrsABK@SIawruJX@4CvdCgm6ANj3dbHHNv3b2u|G_Hzeuf zOw#g1!Pn>c6)i>Zia5m4iy`$3; zi34p1Rjh>kadhT${KrurQqzJx6{Slc@3vkbNa_n=i&5!qQ&(_Kh~tYe=2cAz2)q7u zG(qIP^6}FcBw~D;g!1?$*`4?pw5#kr^%1ATo<$`k1zsD%h+F2Plj;+ zT-z0|T^rO4WY>5q13OWI1y%VST7yKc(#D39O8Ch*NE`sd;T(3|8VlUY;IHk4eBe9D z*=Kmo$-izw>|P4`QlTNYY{geK&;Nbl>e;4EmTpLvDoDi%@P)NNxBbE+iL*?7ZKFr8 z_(nTu(24VIP-r)Sd>82i14k$Gr~iWEwHQZl!X*`%}#^YR(%=20Mv z7Aj+Aws94r_+iJ%AIA(ohAkf}Y<&KFPox$msdqp0{?QrQD_Tb{{@+%T~%OpB6}?<29JKDjPT?-_|bYxbJ?!Y?95V*`HhaIUe3L_G(eezU9%2 z&b{f-ai;$aX8IMND9%^27M>;@T?XnppS@$8x~a*mRM)P$P&=*#I1@(DqkXq!`=}YZ z)7?H0+j^*r6@tX(#-`lB@@;?Tiv_TA(W)1#55LrpJ!W4MjW9O<0-JqpRYzuhhzhyV zZXfkNZbB=bTc^Vnl`d5I10W*{!FT4WcEW%73O)|Aq6E>b!}wZF z8;{npw64w}z@?Is3wZ3n7DvItpWVmizPTS<>Vfa4?AHNfC{{=7^-@3N?qQ{<^+$+$ z1;-BVTJ+>^u^wT+oluZRC#D`K?j;t<54M?z&b?by$Z0d2zx}Ke7x5%MlyWW9@76YL zvC4Z&+q@AHIlD)u(c43cwMAx^ynyE@6P3Gfq^_XB)p+c2eo=bJbvj0i3uS-$uU8GN zw^by(DU26(Xb;tVv``DQQa+BZSl_+R6hc18WoDDdwzZRXib7v{F=B1U=Ra7E_AC2K`xeWXD|#0XQ6GS-83kN!eu`W# z_!+Vx`la1GTE3Fy5GVmdC;(o}&cRL+X>azyx4Ig*x=OVZFEF-6k>v2DCEm2!Iq%$( z-;{xGdJ++D+U6b@fYQkKe=*BHdQn+d^@LqSqh$iAQ$J7(HRv`7x@_!FTr=CZ2m0B6 zk@{V_Uvrwmpe)UjgxKQZ8EID5+uj*^_6 z(|}%3Jsc$>3IJD4QZ-J0VP(@DT()%Fb;@{YzKZ49Yuf<0a+k7UVr9&>W~$74i)~;t z*2p_FJ*gGP68;69MZ;~G<$HQLLi~4ypt2+;pt^1qk`2cvODoq%fNOLNe5!19IY3Y! z@x^;9&BOEt@PV@5M6N(b7*S5nj^PNXqj(FYs~11i%xiKA7H60M#00xpreSV-a|OO9 zXjeP?@#h1y{lOZ>71(@?Q*BL@vCKDP#RnMN|F*O@jT)nSB21=C0dU%uYrA+OwcRDH zjLA~@r9L{dfsWPxVT5tA4S}ZI7YiS6^!CS`4w}d!$1(XI`)!ty2+(Pb2uY%+9}oRS+z)=x<#o?DL>jlKSdD(x&$l_EpC^r9J&x$3=X`dYQ2w4~ zd2+HB7x9O0sMg4alYNJ~&lq!2d9FA31R+B&mbhgV#m3h5)V|6SyZy5CL*X^_rxdQ^ z8qvy7{klpm(}ixVBi{I-+gH|ap#6G3YC27#+e$gn~v{YWPF zZB>8K*aFu2+MiM|dN~Rn6_k0q1|X6FRDtcnu3`TeTFWWPLVYz$q*tqA+00zTx*yCa(P-OgqKm%4x_a~72|V4h1yUABnQ zwO{l8CN9;j6a&qE+EGLip`RgQ;fP+`kxrUR%kGCwWu51ypi> z!HlD-1?G@$nq*Uj-qq)VP9~L4MciSCzEo|eV{m!An~xgL=hAKt5H;7E+xV}ZlrCYh z`%OgN>|ge;CVjrUUr2+zh1dU2fCh^3tJ)ZV&l~~vfB_IQ66id4NpxW2#r0K(o}uQm zn00xDUUP`I=iH+#a4L?Ze((c}>fx_FP06alP-7-qG+|#>+zzNLuOPSzY1vq4!|s1> zG$)T*Dcc=U(bO$#Pwh}YwLim#PF)w{cM=T`j~vU0{*Zvic4(H_#$7P;m989hpVd2t z-~JJ(QH6Ojul{Qy*--TLcMi=JVV~wS!&TQbS-$c{O0VFfvzK40L`VqH?S2kbD|?BK z&U@Tpp733XDZHbi0gi4AktalP`GHhkI^ZGFSE{~)O>y8AsAw)6nJ%%C`^%1->~8vy zOmf&+R@eb@ynobz>yyV|VBM@VljyOWsx>3u)KD*!_GtERxNlx!i&^IYfD7Gg&&&Yk z|G{4Ti(hB713=gn`>Ff`pZSd;X^3rwFjEr3a&VM*PC&R zc>u+D^A^I9SC0wA7k2W>U_{tT#p4vla8#(`zic7xZAvu7p=rtQs2l6n{K+zvr<`or z;!U9tDXHG6=t?*DnAp%xwe>ytcYNBFVv9?+WAM z-ytsv(T0}{>xU?<WhEElIn=Cx(iw-`!0R<>YpEP zS@3QTGNM_PEuqo?VW@4rZw_N%?>AGWa9&dlff5mSldl%@sq5hk5f=9rrKecEEnPvu zjLz_qO+8+S#8N$}fK+#gdxxhI(JzJl$kVl}5&R#NqSBePjNp_OlbYrKx0 z!#gM}SMr~Dp! zDc{u~YWJZ6Zo}FG_9NVQ<1)H6!Dl0h- z>TTD5u+?crce2g#lVf{5h-Fq(G|`=ktc3s3-TsdkAoRt;004rV_UOX~Vy;z4m8q9| zjxW6a1wUl5#W8`3=OP8Uo8UJcjVYh>W%d3ikv=Ly;tQT<-HfNr-n;?Gi8EkHx#n%( z%6m90+)0X6Bq_e^xShGX4S;<|Jjy#=XW?fz{Q!!tBy#rV?@B5X2LLgym?6P_RVmE> zwP?h6|6G32s=-}^-xdE#MP~awK*9@Tdu-s7MWZ%k2z=ruS%t!4eo-?eVW>}SY_dZ< zZ_}8#KjQ6_4}wHIZ+U=A;}@Gg=|I`78PCoW{>MVCLBR9O1o_l#=Rw@oY*|Ur|M1XO zF+-peATMru-P_6MT%q&*;L*c|mC@VZWT7}zibFa-JmQD6wMAez>-XCL17}a=9p%30 z`D#1cI|lBxH(hD!_h;J=XQ3V%y>hP*Lj@k)oho+TM0MJ1|FbjUQVO_{h=6Vid4v<$ zkJJ#hf)5V`1Uth4^8Re#)h7XOqyxKII~$vCO`(B)(|Y1bXa~T72XBeqFE4tY?LPur zw6yMzoNPFOC(R|o(Ogsu*_68Mfd1L>wHUlv2`&fADDL>L(+HNHOCh^_*J72)#|Jw8 zk3-`&;cUcT*hH@H<5|l6hc5jRwY4RQx6hw#-Y`So!7^_OVZGrgtx)bEU`e z=AU(r+vq3-MLlR|*=9Zm}qMEQzw z;6|I8NHBIDr?PfTgR#KFUBadOSgK(Bk=)*U;HR|fdFKkbL7Ueu?L*+-X zTaNJAfB!4zuP2k~6zLVo$=OOCS)rN8v}U=$ec!JP0?QWZ*M~iT^WE{yj~e$>@dr(E|z+0vtahuT)kMI{Mv$#?Be!8w~7(C zq;*wp|MB6~-m7AKtF23dwWb(v0h9)ol)vcn$oc*2T^n0gk^4rVs@H=62vhp69)uhj zxTuG7V7dE@Ec>v}x!2dbiIOw{7gcR!dH?NY^V6~CQOh=Ul^#@jc*xCG2ARgif${HP zM(4mG62aSjd#R#`j_j^>^;*Ca1@~qbbps}w`AYuO-e0xm*XoK%GmpJ{*E;66uLt~4 z^0!07^Jp>=w@ndv$fJFefa$ac4%@*+7596VQ}XlQ8K*``Zh*Q1))6j3&jG2se(IsL zN!VX)+&?MzhzfnU2Vp3QoFZ2Nl-0E^3^4kz^1!>P?nprYA*JBH#|zi3R{{S{F>M2f zkf>&F_d>4O@4MQLlNt`%h;9rax5X+Y2AUeBfqzf_7}=vzg|GDt>GkavXBoNL9!5~U zh@gEurbDO>!x=cZW2=o@p4+vc%$){V53uA}?AjQ}C zMOWS_A@PIKa%pTBqyyVOL}t8m1P>!eaX(Z-%!rq+${<@BpNODI1qB+>HBY-ZOk8bk z|1ib1l~)*f7bNbsULFGr_p)p&3w1Vif&n;(GHQrn&-J*932_oc1IoDR45YxExqgr> zdawA7@1M3dEX(CjtmdxVU;~jCp#uoLjoZYKcBpQ`ki{7XLPi3CB7qUz=| zQ`KdiG7t6UQtX6kUxTea@ES0B?r`}-N3~u28l4`vn=x8a8fRD@xQWnPf7HvA{aRFg zQJ=^)bE8R=9&AW5{W(ynCb>yHw4y{=N)B-SkWkb6kB9(cLn;H4#i&_~k5TH~l*1YM+Mo`Bx z!DEjY8*mVTMj2q$E?erlM#8bTIa%!et0q=qs>O}he-Aye6LbvF_qlFv0tOiB>hg6v zL=hU@Z~S-w#^#T1a-GG+9v*D3CB4Dw`uf4G!go6E50_ZCNW)gqjz+y6%VFK*L)+9(FPeL;&Z9F_ysdhfH^7xANzLN48oCPw=iF?;M+M=&+<0__xF!z&URT} zdNYQaKTG^Y!SqhXw}^~oV3X=)k+a645=n@(cw9@Ua?qO~ybu~`d}Z2lO%yc~7!c0X zpfvOV`+mLbjGGNxSE996fIZy5maZ6ZTalP0bGgO&WO=@5maB@{z7@v%Lo zlDqHQ!u=ieUFryt-wC$8nF!_MsNqC2$r@L;=TX_b22M2LHggV!fFV!1?WSD&cxJ1* zPw9XHQoPw(IYk| z0j3SF$Cmi@lx?~p3ZrIF87-Ti7YS5s z`fbC&yO_aLr2jAuWd4ptuTPe}kNyBD$DYT`*7=t)!#O4w)aUmc1@60u8WmmqZ7|oi zbK&;Sm|uv$0zm#fKEA`B#b?oGPtEsf0gc+wehNOjhFmgIU!nLNtW%i_P#~UE$3ilW z{h&i7uf`nj$l-LrnKQqBpey$TJHx5!)r}nnI(NmiTi~)*2I!ebk(D^ zKyUkTeSAXCy_o>&DrlV{oER^%dA*(8t9OB`lZK;J07-uNJo$|1E54+wn?AXOOLkXY z1qXxm!1emwZoW2G4I@p`J*P_h3KH(gtb2QQw%3R9n?(AX-hObjshrmX!Y6Q_qfSAX zLnx&o$vC;dbm_~7ws(ZDU78;}dJeC{^U&u=yIVBv-WotR+HocL5BXq7jd**jyi}C`6_S+7rnmE{Zz^3^<$>Bc-a-#-uL>h z3H}MKD2p`prYrzt_L~KW(}vmK_Z4lyyl*5*@m$i(lGq=~5i%6?a4Pu+I^-A3nT8}q z&oy|>W@-Hax)BRML?TC1WRk-OLGEpiOkouM*PVM%O4i-Wz&~Nx9(QBsWmLECOOe~p zn#NSB(y&n3h>(K9zN*tFs~2lFgms0l{7g=#g87(tBQ?C6{BU4MAR$98(zq6xIj~hC;E%t?} z{c*V6JQC(W1>TMMa-XNoM3~2Y$5#%L_t6JQ5Z<*1IMj6TXzQ)ue0`SPMg3+I-BGTH z1+x_JzZzK*=Iq7czr8`De%fy-WOT5)BmaP5D4Qj)`b_hJX)g3n>zvT!9_DxG`8yVJnQNc!ohlf(5sl4^lFfblz zzLSXDChXFvy^q9(6sZW5bPkIzO)OiM!|1OIpfwP0TmMiXA9a{*-0>&DpA%<3m5EMI zoSwQXf{j_j8z^#EUg`Qc_Nchn+s&;m;oAp$GsT(dtBZ@Nl_Tf+G3Q&6ZKzoM`N{g6 z7-s;=1oqe*<|S=g=GvPtS!oj7EQ?;5yMbsoKa)O~XRO*oF0s7yddv7ZzcZ9FrwLWg z_3*fMaTMtAoKg^vjMHFEV0{iBV0^~(^s}l(2x-I2DMgCY#0xB`VUjWv8JwAMCy&dQ zUV57i?Ord}@5P)pXXL3w{I#p{NuNz|bL$>!?kI?0CH!I+`nziL$!fbvEsvddq zRx;vw__qa}$^Dy1`u;>DLb^8zFX#o)g4Tl0R7BLFx-#hLrkA7RWiT^-f55H})*|-i@ zs)Zcei8N5IL`K`nZZEwd&u|6xCue}Rkc0e z;s{ZmT6nObEOl6$SvS92_7iUQ-77hyqG#BdNc|@G9Sf8{)8%Z%LaKvd7*_hV<^G=i z*XddnLc+u{tFf^Ttcg4=Jza(um4qQFKU66>twbijC*OLmX1#8XKp+>Fk+MmRuu!y= zqygK9>a{wMWi7I$Z^L8_EqTa%>?p>=H0lydStAQ*W}-~~r^@|vO1ifMcC9ga3~6z{ z0MP=_t$f;tmNT4YtPmNdz;ClD=KAhxKKsqOd`O4<^|`>HkVq5*bb(-p*8Lkl^^Vmk7!lhWV~7bj0I4EpVETp< z6?G6K;K-^Wg!Zbw*FISCQ^~0)AuHxgtO^2ea|E&nH?NxdpR|6e%^wP1K&cT!nnCi1 zE77G}45S!I1CCmT;&?%X7-XP!k6TMcq0^oXkJA(HHY#kcCz<^*xumadl5V`WzcWuP zhuhBC@X=*r%Hr)eYeQA3zzMx)U?%Bd^j#`fU9gSHu+&?z>@mW2x3f>1&VpnkW(11G zR4VG~+@=Ie6mNvU@zPQy>pid+{j(EobEir|r_#%iPL#K4KYh*)&&Reefc+GEy@j7+ zD|Z4Q_~}i4ZH#t}i{;D7=F4Pl2b(WCZ2eD_MB)!10K?U|b~g0ccyeysGe!{_sjoY{ zvJ3AxW@}Bf&hkX{H-}xu3&yqsADgcg-XESSLC9@(QF|dXFMM8Zx$E<7hRu}EXjW1z zwWJ9_zC&&#f8h+I@KT&F-Gvl-OrzIobZ)IFA2%{Y*GtJR74fdw6{5{Q$r?P z;XY?4-MH7Msx{`L2}%flRJu<)eorZx&y=b^9=rhjm%!im?#gjJ znqTJnW>&k_#epY^fkXSc_5ht!Tk^}3!nspJ$A?&#QNit?R~dK{6Ja0Nr+8Kzam!1Y z>TO@;o;dbD@2}Kt767s>2m%6}j?&xD^=dZ0{>Io#rAp^Cp2d>m{>l%K(WF-~Czo zcKaVNFHpVT!~Q^g}zg;(EG1U)+K_1b27Wpuq_)!6mpuaCdiicL*NbJ-CP9 zkVXTI6KoE@XP%jNX3aZy*4%Y3|1@iLpXxeQr>pkfpZ(pH2NcB$goaOQ9Y}<%(QQw1 z&vll&)Ylu#cIY17-X?psSm%L|1BbZJE#Ezxk@h_<*P1TetTg#O|IKT8ZU}f?{_N0@ z@nSItFBSsDOGI9u5s??yT$^ApOiDuX+k3s$X@tPyVmF%A8F=01Lmf6rloz@0{{arO zx=hZ0Nx@;%ytwau6$D0?C@05kI11;j7^a@bPN<&GoRln!^4Ph7Una5OSK!*M_14&? zX@O`w1CPL+9piu>J;2=+RWXp>_rdc$H!pnI5q-_xy6CoB|9&y>Zmo@#!PakYidU!U z3rc-27_RO4d243C|GHrma9C30O7}^6+w9&C4h|CKWE|?OlQIG;N%S9xLOTd{C|EPh zvLh<%4oqR;ZU&hH`~v-mO#A%l=<%eXFqHQk(x*~S4n9}eKEKuSp^RLo2sKM7I_#a- z%+q(&t7Cdj^gm=bIp{Mqp6r9yJKb5e41L`$evywcS(k~6juyqMn!KMWDJQP>Rj{GPlLZsea?z3 zPn}qY6JxVMXFUCOqStyZ^)#GjIsge}hnvEu!z#_Vz+s4Kc#75QF7hNkKln@_P)RZh zukH5B>D}%QRxrUg$IU)q-IeVOJHKjC@2roFbpq^jsu-@_oOk?f_=rkvf{QKgs6jCL zu35`Xv*xm;(_eijS`a&<7N?nh+rsu*o0& z9Q~aYfqiAdds-N6g9#IJ{u&x7RH%_jt(hqZg3vG7x&?T8O(xIUTsF!S5eWw3{hv$= z6vKcYZtE{UK|F)jM7dJ&2FpY(moW}?8}1;o0t1HxHFGK|z0L_>$(B}P>nTHX=tAnX zhsKPe;1tG^il`-%T;O`Uy3Kx5$c9Zai2_wnHt8pt#V-{)@SP_5EPA3_cvFITW>-~_ zjB2Y9A3}oU^`f=$%85SKQ+Hgiw(}3Y$Ov7)CUHp+KJ{4bL>ZiU@WuxxB=T6N>tJ`s zypCi$&`2%B?S0Z~gfex6sqIRMw9XAn8O7J0pcMTsO3vNwexf=3dMI6`h&W7FoCSS& zK<*DYb9`r zx(mcGotm9o&g)$4uTD2crIv}e#cK@h5AaQL5)+&%wZ*CFCdhGb{h;lE3nJ?PrNDq) z2PHom^PP|zew#ir;rywh(S}e37!2}pnF#2+bP*ms3{>46Fe=KJcS1)`nih|2eyb9y zoBH_bNeRE%%>cV6CWdM~s%Te$hq*1vbluW3waff6`Fu0m$*(-ODG&PfCjazjJ2bat z!b~;S6Rwv?ys&U&-3b?=B2t#LP$YjaKPdrJlH`V)RR@l>8vGc@1*l7@6qYF++*LJe zd4Kxzfl%%fsM%$iHt}sSZZfxxLGyb`UNuOKoWKsVDms+HE`2`F>jA;EN@$hX_5V^s zl)7eV0kbc}+0kA@@VU?qzuQ$w>T#z<(d1AifuZT@hNJ z*GU*npYfaP0|Uw995eyw?oZRoj+aQN-gQ;-4E=Y5B(Pqh5SY83q)rK5bio zlugJ!c4$x?78JkYpp)?B1Cb0SKli}I=xS(A(8)vBh~})i8;e!vO(~Q1icRAY_tKuJtfgiZtTx%C88mYD7db(o${FQYODEp-3#yqp|KK z!uRGo`C0Vb`TWX2903=t(YLOASaIf4BBr9>J&4xPqv~_BO=BU*bL(~)pQj%D9!IR` z>r&*h*7`0fWN&ej zO7~0DxQ|ID%@QhM(SBL!ZO#&#LHq}rya8&d>pw-j$I=sY*wtgsjksYjh=l<_@nr`p z%|5x0Qr$86)1!)tGX?LZuALL}g)h!xt^`lI-c_u!q!mJwhvj|bjmq#MkxlwmGp2$g zPfaB|(5xV|V(u~StXH4czWFeQu2&ytuS=985@D4YBKB^Qqf(PWTT`;Zd}K8&55AAX zwaPxXX}Z&B`Q*aT?~?G>m$60HY*a?ynO#U+j2M}pSSKg}9&8^Z#f|aSBfmP=Jd%+R zA?%qhW>mChpLr9AGQYbKb-Wj;$bKD{3|LT8Q@3eBrhe4RH0|wC(R3*c$lA zrmnWmlG7xJ8RPKYVQKAIY3Rq28LaHie!gZ%qAILlm>@!P{ArZwG7R?vU-I;P4|L2WMsXgiD9DU;OL8pDmqgnkiq2P)V&5-SzFpRt*tb<*fl zDFwVI87L+(JFLucYmcPE66B{yZ$2}-E{La5GgU{N@TE*>>KT}Ra%g39MUhegZU{wm zs1X@kqg0OtXu78NLLw5Y%YK2z@Amo8<09ML>4dq>><@o!XLDSJMEcd5QldGwhMgev zoYgRoVt#e@nHLTz>eee!9a_+z7mMYAL(K+{)vJs76UZO5P{r#5hq=NC;yTSIF+m<5 zKH&E$)010~z8AMGFD_$49ZjyfUi7_Xc$u9=cj$T%uu&4m8RWv^fZ2Is+4MkJnn0dR zuPNc-jMZRJtNrnbgx*ApA?NB#+Pps(2GDk!axxiqL|K;(48N}*??Qz}hv93TdSBl={Ye2teNA3uD{H;b zCP749Qk)Y9uidQd&LZYTgGO(`ru=9y9A4v~jbLRB;>X=>sxfJJ960R!dbS&arNp<7 zC}6%)rymm&W45drQuA|>>Dq)6{Ka3qs24Km&4bS&&%Je4dH8LzL_y#0~rQp4cFr{LFDWka$ zx5YM&#PNkmp?k}8I4Fb$%9rf%yCUQm; zqb63PbhxT-ygl|GkNqXrDZyd{0yWohl&o})=0ed#5*~@JoX0N?DUi4a7zadU?e)_!hY`q=S^QhhVl^Nphmpdu1 z4>-Dpm{{@hD^Php$t`3Hkv&Q($2t|T%tlV?uQndfLHo(daE$`8C%mK*&oSgJON9S_l~Z9`<6dRI74S+y`E>`rzkgpx^;i=b=G=(1&fP|e*pygm(POY z9L3SBpSchGP^Bgo=xQC$KqhDA_G}#zpP2aI4-lC>uCCkt(KH>z=ddDc?bu9_vqkK_ znYmq0Oe}1@9@(NCr|w1U&n_hZ%5f3jjxY?2r*RFnwCrGwrVZ+KaCJ?|6?AvLQsjLW z1J6&>GDnB@G7NLCri=D0nyAJWgDF2AcajYwbbH^~SEb6WKt|cCGU3j-hyk7?^7aT6cIuhLF*RjjH}#lSG|?wVo|IYA zB^H{8;5F2mEw5zDUsV=FWAeTdt{eJg2C63>ic=w5u%^r_4zXR|rW@wnWMgW%Mqh~u z@{)fCOOlA~Qv@wqCX$jaWIkRB(}xfLI~TxLlt2u}%^AqW^byG~+&?mZa=mt&KVAyA zdzFYBd*=4ZudeTidYfKgU^BJ0-|qQFL(2*H$auts;4_ktF!%5j@5a#E(DkDYu+7Ob ze))+Zfc0awC{JO3U~%!alL*uzS*M^b72%@=VnUEj;=qCEjzbGS_ZPT|0G_ljsr?8S z_Qk?3k)I}fFkv8}gM(et`b$1W4UHwzjhzz79`j&kvCJyb+77#03I>}+j;S9>)$h6s zi0=5{PF%HpYInQ(QlZK3{_Lf&un$bEv8yX~0MJpIU@~<69#I%S0}Xzwo8uU)5Sjd4 zV;q5?uZ4CU7p>V5x}1etbH<3?C3X-^q?-n#;e&Ugxxwt=0)8y7$pkP2_(Ua^I`6Wg z=5?_7R}M?irBv8Z+4K%Td=HyG+LY=6NLDF z^E=yuzxPYi_%LZ_lDT}i=i|1Rx<;XHB@KRXFyLQi7_D6%ta88SHY_0c$Q~=5TRJ$X zprBMV#u5K=#gk*rU9{e4r=;605GgsM-z(zzK|@D+;-Kg#MC=1g{*3fSRL~0b5~Zuo z*a3nrGdBJ1GG$%3ggqYiO6TH_TY;X0L9i%W=e@s3=H%-S=WOovky$ra{n3oQVjIF( zY3M<=q8lD=yJ^z}P?cNFQUWdp5ABaJll)KG_=*;YyR+?|cTCY?LL`S`$*EjSpvA}t z!w{8q%At?Vp8^8|haSi$@rNl4J9gkmo@ho@D!Y#W7I zW6@Nz=vpC+qOpgksW@fPc|~rW=YMFK@Yyc*mugxwn_Sf%cu3Fdq;G|-c4=DMhbDby zRImPVey3b;NX?*xnTaA~-6=OsIDTs_=KegC%i6HlDWKak*)K)x69Z-*i2n9Bw!Oj9=_T=75 zC*qY~kCZF_^+*>E%lUA^S|=^};N;2Eo(@tKRR0}A4pB8ULkxX3smO}!$kC_nlhAk} zEMy@z1_ITN4@1m(>j#(mU1cRD=~C7P)4#`dZIBnG@9nqcd4KhZZu;_`cOPQj0%2Z* zF?KuUJ$T5aNT+7;I9@~F)CFbHTyXFnHj<}puM$GcdEP)XQ%+^u+~lC%HTX4g@do&5 zJNTS@_HcR_;_bO%o)$V`g3(!$B7G&T@ItgWwnLB@aet-l(Co`|ym(Ktr{g|hk7 z+iN6@`ujRK zKZkO~IfzGzxNUd&ME}%K8FMBkK?G@U?c%U^=gHUaxlf2cp%LYwWlg>^3C-QX<0dkq z3x{~DKC7c8P1Cyy1e)bXr1^*n7QDe&~h}Ml8DO?9*8FqBV;#zG~%S5lNdSC9;Ix==9UzJ2@ZnAWXvu z3c!-W?WSh_(GZ$J6ql&d?}_Qkm6DBXdjZu zNRE($Zq@lhJ|=I)y9JC6)j6`>;RXk_hZ&ab;x?f*XqH!{B?mH}>q{Sn|c z83wIBHhy_%#9QdeJ2K#hr8v?5ag4+8)4@?qs^CC+tu zlxJlZ5fS<9-cU#VGujtRT0T0g!M=0620_@bh1UF|@xsG3uvSKsk0KKUC6J}UzawA6 zeFQm^QpA&EfPalwWrdu6=)BjmW+mGkjW_$h;WnB>NM|c2OzcclQvEQ5dGcbs7g=jR z>mKO9i3J58O$UC@azMmrzMH9RFmt32A+IXByu9i)8;$OTlacmri-~o50NI;aTN5tf z8x^R>k%;JgDI<);B%>z~z{de72KRCenw z2ZUwHnk|A#%7`Ni58PFOoiPl$E?Wk0QR`_J*LKNoeDlA}k)=;k3(J&4W1xLsv6VI_ z0dI>*Sl74gJo>37tW81QF!Y#bJ?$QqLw>sQq`5nnPNT+_EmP+}{7jlvnmU#kYv;bZl*|K}vWx0qSRrG;Brud>#(8Qp5s7T8G)q?`qhBjPFB)xdf zmS)HGFS!P=snX0%1(sZ4$#SI#D4i-h+Y$p|f!7i&<^5+oy@Zs=AGBKl22kp~QhNE_ z68rSj9S?m$8ZRnv@|{{f{R>6+XNPv!(bi7YT|=jbgK_pFn?s?GKy|%(mfz>s{@d>9 z1{2&fLePDjuYbpKMz_2snNQbp-F_b}2F&UUFkn)i=6WtSyNaw@r*ph#w;|7;jElGv zcrp2#AA&+NmGBsT*%vBK{vg7^k)$^SnCinoO#BOdn7VTE)3T=mQ&~eFx1rj905l=+ z7j=Nx5(w@?oNjccN3(Q92z%c`IEt~1a*^d@w#d8Ob^krC2HxX+@E3SIZSwrn4!S?J z5Y0}Y*w;v9b=dr|<#)gc;lrO-{?1PG@Z1L^SYz0mr)A&?yTC<&k8gA^ky@kEL?gf= zlJ0|a@pza8v7F~8P_0=DP^vs5a|O2+hbqAUJvX?t zBe&2V=A&^ThM$`C+nuSs@BWytHJYc$QE#@{>t8;Woz%k{ovifcoqFFsfGX7)i1-}I ztU5V{*V?QPSk1P2D!x6$ z@@|;{=2O?p$opTncmAU9Ugt(higjyM8B&wHpEg_VkkQaw98HQW?EGuCS<9F@phH?A zhY+w6WHZW=D~{x@udl1fQcVNCl7H#&6=0>2#{@Xx7=8mDxEBl@sgkMeixe=&ZKItU zb=Wa(o~|FJR?G3X&K=Tjy2q_@tS))f;e4}O&-Z3&+=j95Vw>zO!5)INuo>(QV8VA{JQtnU9SC{-Y=K0c6vV4D>Tg-<&EvntM4yN`nozw;p?{FIq#|3fcBHy z!HOnNlfmIVOn;47&9}iim$e=|Fy7}lM0kW|olm=F-T1W%lRmOO4a!fO4;Sxb(e5k` zOT36kjh387nIpoLk-zi}ctQg!EcF>-&&-PISq~4-NcY{ZWVZPT7nc2BCRBVIe?F~j z@*`ln&ROZsh^JdUf0g^`S#oFYXad6MV_LuCcrlq^--D1kFRZlYa!w#L~F-Kj3t&~%+U{DIk~Tn6U_sHC|$3E={uezQAE$ds43CSx{&Ba zxC$f>{mW zU%>H!JOttf8f(svXL=rM(mf7xiRvx`=8!sPuRqf>HqzRUYKCq(g$TL)_j8J}* zp#S7RkDbmm`n5<0Kjg^1s;2AG)nlP%mRsz>;DuqC4}yyB4PXM%+PR_wIL|99@xnLoRtq!a<2InP0xd zn|-;T5edQh5RTo12(~G>*U$-o!n&Nfr~C-v`vec7d_SBIsF^brZ)^V;W%MW;IyXoqFerKBpS!*4cZ$~V2i_>Qflai z>qr}PIwq6FU^V=)O95GD+T=QZQFD?j4{(_gw^PgGY^>bLR{aDjqVl-9gKyn%5OH|= z(Vrche|yi&^q`8~`%Vl_vT+fwRI-0!aqqUMl;8~tQ@~w6g9a^jGEK_vGi&=`KF;|a zf||VRcV`4huO9OUZ^W)1@^$L_(yUl4RWS8ez(Qz>3mj?+zp*B{D!<=cf4*DURCKrZK<^67B(sw1X!vMQQnjdP?`b^Ks>@##NOHqZiB8UJ^JZ1 z(7_^SO9!O?VfbqUGBE=CwNQu3(Bc(f(V0udRcSMj%VL(9@3yl5JLaC(&5xVuk73(h zZmtWv+t*?WlT^sM+G(;as{M@=QOukpJl8@HX@zQTCpm7LuuTTxub0Uy+dL9wW$Uim zN8Y$--y)18=kv53Acle=DKL>bSCyKRO*i1d+aK^ri$^3|fQaoR5NN1)4II1^+jvr@ zfy&9t0_cl5-5TgGmBi1=hrlaeKp?-Q8+%mwr^``1GOCD-UhcYYVy-b^d@IgWP%5pM zniNNBTvE>YSg6ST*mmpWUOX+1>Ep^}Q_fZg3Z8MNn_OC;)?Ff1rWa-3711xRA(*}I zC=&-JM7865aj|9Z7l{Qq(+Mb`V4R4PiC?j%z9f77T6VHcFtc3;fW+>1lmx0@9q}Ok z#rKd&RC`OlKyzoyI&C{e3RL$^@IA402RZ_cT_?ijq(+4&&3_`!is&YCC@aMCRc*tY z&w!a&pRoWU@_5dCFYsgc1(Y|U;~Np7k;9Nyd9U{Q%|yrAPF>m=-wBngkF8%GDALnz-Y z(PIG!PMZ1bg@h|}d{G5{hjjN^ktG4J^j8wit$o(S&`FzBWNfljCI^P-% z-s%FL?{;dJ8LN#_w;`gAoSCmtOvM$}>jV)>jICCG^)_r*s_z}|UqFt&=&pC7O}Nr+ zQNx3I;pqlwMj{ya8@STvr()<6Mfw)lL(otI5PouqvX86iCW6G=p-y~x>ZRp>nzX>- zVPPJ7H!C_W$CdbHnF-_wAb0SHO@-zc?H)7gmN#sYX>A^MDTC3ex-;b78=h0fuFarQ zt@#ZOu2O>`hDk@ZmLph$q`)9^H}j)kik^*u#=}#~it~)`9puG>P5l&;>h+@XYvz^c zlhcp>(#0=j1pI$yDy9`oQ{{l%$Oa#sNZpv+6*qwL`E|tAjF$L(_5H%af{LWs`rN=_D=~lXWc|=x6;Yc{29RMXCj~uI%dXyN zxhR~5l5W&1-(F#?RnGp7zY2boUKe-jCw6t3)LFMYLl+CoV~Cf=Qi|tNR7n8zFWR{ zMt+Q#4QF+I|E02EULaff4rMDoM~uiVLeFltwD|Z7@Ysv0zEb`qiA0;2H7<208i(z| zN+MZHG3P&moiA*=7t!)2AFwJJJi9hDUKJ6^@wpuLxqEp8oP_O?rD{rA{FzeUr$YbZ zC^xF4uYRm{Thqco$%>yXHjv)|F!OyU+R*Im&@!oQor5Q>hVn@%LWOBpy_(A>pVz=Y z_bv2KoA1Msuq3P7Yn2-r?kNJFw5jASf-WU%l4sinSz|B~UVKIQap5+DKE!_UBwWOj z1dPk)yf`{D0nio#0Jg*d33k7;?W1sI!*3b)1j&?IviS11dM?CweOev1Q2P!K>D;$m z(6kKQa4hoNaEClQl~jX^adw{me7~B8@jp8}R9RQ5@pUfwC-re2a9OaRK0YD&a1}C2 zN-X&52w^<=0(j!|S9@}{L&p(XRQgvDD;=gM4f?wNo+ofAZn8B|EGfV07OWYfO7(w( zF+kM;Y$Vu!!x&^S8OuzX_a<_Al!@heUdI*qcBFpyJ9#5pe`6iYa%N%V3GH^}DU8)*PrPWLA{ zUW~z60O5EpJILwHF;Byv{R-J0!SaMjj7Cr`mh$sau=q0xWTC-mERJ&%qFg@sge8@0 zfdzB(9Yx-iw(C~>>hR=Lug>Z86E3rIz7xJ<6A(b^o6Z$XCL)uJJ4Xx5*U|u@`&q!S zL;{6L~PE{INQ#7PqyU8$OeHXI;u1wy47iwk)+q>4sg@SszHFJ?f zt)M)UFavVZOIK|VId6NzBY}~@PwUEl=wQeZXmXp6A0Kw{div4?|3GXnXFKE_JOOR` z`>jc*F%x_-amLipsQ97I<_g$#{e2%YgR!ufKKBr zrf5`|YvY>VEZ`*6+>JtWFiG5&t+qlN;K$A-R}^*d2u`ze;Hb zZCu?9c+5mSuSY~N{EJ|hhkS+Vz<#l)wA9MgypshTY|n~49H~M}9TzWm;CP;*PoJ>4 zG^p$8_BC*X(<$q#_RTWI_1FZp$V<{D6O+v^qr}BD=B_-|WyL2C==Pl}==W~Hrk!ZW zRMTiWO1K~VPs7m)j;U{Bl!2_Ds#ZYl$D!|npq>j2�cwrsGDB4d0LrSxPvWLTt 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 J>%@(M{tImI!0iA4 literal 0 HcmV?d00001 diff --git a/maps/example/example-1.dmm b/maps/example/example-1.dmm index 6c5d1ead2d9..26c7e4bd46f 100644 --- a/maps/example/example-1.dmm +++ b/maps/example/example-1.dmm @@ -36,6 +36,7 @@ "J" = (/obj/machinery/light,/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled/dark,/area/aisat) "K" = (/obj/structure/cable/yellow,/obj/structure/cable/yellow{d1 = 16; d2 = 0; icon_state = "16-0"},/turf/simulated/floor/plating,/area/aisat) "L" = (/turf/simulated/floor/tiled/red,/area/aisat) +"M" = (/obj/turbolift_map_holder/example{dir = 1; icon = 'icons/obj/turbolift_preview_5x5.dmi'},/turf/simulated/floor/tiled/red,/area/aisat) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -61,13 +62,13 @@ aaaaaaaabhhFFFhGhhhhhEbaaaaaaaaa aaaaaaaabnbFFFhnhhhhhEbaaaaaaaaa aaaaaaaabHbhhhhIhhhhhEbaaaaaaaaa aaaaaaaabbbhJhhnhhJhhKbaaaaaaaaa -aaaaaaaabbbbbLLLLLbbbbbaaaaaaaaa +aaaaaaaabbbbbbnnnbbbbbbaaaaaaaaa aaaaaaaaaaaabLLLLLbaaaaaaaaaaaaa aaaaaaaaaaaabLLLLLbaaaaaaaaaaaaa aaaaaaaaaaaabLLLLLbaaaaaaaaaaaaa aaaaaaaaaaaabLLLLLbaaaaaaaaaaaaa +aaaaaaaaaaaabMLLLLbaaaaaaaaaaaaa aaaaaaaaaaaabbbbbbbaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "} diff --git a/maps/example/example-2.dmm b/maps/example/example-2.dmm index f108e93b91a..9c0fd272dcc 100644 --- a/maps/example/example-2.dmm +++ b/maps/example/example-2.dmm @@ -57,7 +57,8 @@ aaaaaaaaccciiiioiiiiiDcaaaaaaaaa aaaaaaaacEciiiioiiiiiDcaaaaaaaaa aaaaaaaacEciiiiFiiiiiDcaaaaaaaaa aaaaaaaaciiiGiioiiGiiHcaaaaaaaaa -aaaaaaaacccccEEEEEcccccaaaaaaaaa +aaaaaaaaccccccoooccccccaaaaaaaaa +aaaaaaaaaaaacEEEEEcaaaaaaaaaaaaa aaaaaaaaaaaacEEEEEcaaaaaaaaaaaaa aaaaaaaaaaaacEEEEEcaaaaaaaaaaaaa aaaaaaaaaaaacEEEEEcaaaaaaaaaaaaa @@ -65,5 +66,4 @@ aaaaaaaaaaaacEEEEEcaaaaaaaaaaaaa aaaaaaaaaaaacccccccaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "} diff --git a/maps/example/example.dm b/maps/example/example.dm index d5e18ea3665..a103a326257 100644 --- a/maps/example/example.dm +++ b/maps/example/example.dm @@ -4,6 +4,8 @@ #include "example-2.dmm" #include "example_defines.dm" + #include "example_elevator.dm" + #include "example_areas.dm" #define USING_MAP_DATUM /datum/map/example diff --git a/maps/example/example_areas.dm b/maps/example/example_areas.dm new file mode 100644 index 00000000000..8e01e14055c --- /dev/null +++ b/maps/example/example_areas.dm @@ -0,0 +1,13 @@ +// Elevator areas. +/area/turbolift/example_top + name = "lift (top floor)" + lift_floor_label = "Floor 2" + lift_floor_name = "Top Floor" + lift_announce_str = "Arriving at Top Floor." + +/area/turbolift/example_ground + name = "lift (ground floor)" + lift_floor_label = "Floor 1" + lift_floor_name = "First Floor" + lift_announce_str = "Arriving at First Floor." + base_turf = /turf/simulated/floor \ No newline at end of file diff --git a/maps/example/example_elevator.dm b/maps/example/example_elevator.dm new file mode 100644 index 00000000000..4e279f3df7c --- /dev/null +++ b/maps/example/example_elevator.dm @@ -0,0 +1,11 @@ +/obj/turbolift_map_holder/example + name = "Example turbolift map placeholder" + depth = 2 + lift_size_x = 4 + lift_size_y = 4 + icon = 'icons/obj/turbolift_preview_5x5.dmi' + + areas_to_use = list( + /area/turbolift/example_ground, + /area/turbolift/example_top + ) \ No newline at end of file diff --git a/polaris.dme b/polaris.dme index 45b45aaa9ec..d34d6834fd2 100644 --- a/polaris.dme +++ b/polaris.dme @@ -2055,6 +2055,15 @@ #include "code\modules\tables\rack.dm" #include "code\modules\tables\tables.dm" #include "code\modules\tables\update_triggers.dm" +#include "code\modules\turbolift\_turbolift.dm" +#include "code\modules\turbolift\turbolift.dm" +#include "code\modules\turbolift\turbolift_areas.dm" +#include "code\modules\turbolift\turbolift_console.dm" +#include "code\modules\turbolift\turbolift_door.dm" +#include "code\modules\turbolift\turbolift_floor.dm" +#include "code\modules\turbolift\turbolift_map.dm" +#include "code\modules\turbolift\turbolift_process.dm" +#include "code\modules\turbolift\turbolift_turfs.dm" #include "code\modules\vehicles\cargo_train.dm" #include "code\modules\vehicles\train.dm" #include "code\modules\vehicles\vehicle.dm"