diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 2d1b433a8e2..ed255a80ce6 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -30,7 +30,7 @@ /tools/UpdatePaths @Jolly-66 # LT3 -/code/modules/industrial_lift/ @lessthnthree +/code/modules/transport/ @lessthnthree /modular_skyrat/master_files/code/controllers/subsystem/ @lessthnthree /modular_skyrat/modules/advanced_engineering/ @lessthnthree /modular_skyrat/modules/airlock_override/ @lessthnthree diff --git a/code/modules/transport/_transport_machinery.dm b/code/modules/transport/_transport_machinery.dm index 33824d288a1..2d10b4ada5d 100644 --- a/code/modules/transport/_transport_machinery.dm +++ b/code/modules/transport/_transport_machinery.dm @@ -132,6 +132,7 @@ QDEL_LAZYLIST(methods_to_fix) malfunctioning = FALSE set_machine_stat(machine_stat & ~EMAGGED) + set_is_operational(TRUE) update_appearance() return TRUE diff --git a/code/modules/transport/tram/tram_controller.dm b/code/modules/transport/tram/tram_controller.dm index e04e1bd26b6..c20fb1bfef4 100644 --- a/code/modules/transport/tram/tram_controller.dm +++ b/code/modules/transport/tram/tram_controller.dm @@ -73,7 +73,7 @@ */ /datum/tram_mfg_info/New(specific_transport_id) if(GLOB.round_id) - serial_number = "LT306TG[add_leading(GLOB.round_id, 6, 0)]" + serial_number = "LT306TG[add_leading(GLOB.round_id, 6, "0")]" else serial_number = "LT306TG[rand(000000, 999999)]" @@ -724,10 +724,9 @@ context[SCREENTIP_CONTEXT_RMB] = panel_open ? "close panel" : "open panel" if(!held_item) - context[SCREENTIP_CONTEXT_RMB] = cover_open ? "close cabinet" : "open cabinet" + context[SCREENTIP_CONTEXT_LMB] = cover_open ? "access controls" : "open cabinet" + context[SCREENTIP_CONTEXT_RMB] = cover_open ? "close cabinet" : "toggle lock" - if(istype(held_item, /obj/item/card/id/) && allowed(user) && !cover_open) - context[SCREENTIP_CONTEXT_LMB] = cover_locked ? "unlock cabinet" : "lock cabinet" if(panel_open) if(held_item?.tool_behaviour == TOOL_WRENCH) @@ -748,6 +747,7 @@ . += span_notice("The door appears to be [cover_locked ? "locked. Swipe an ID card to unlock" : "unlocked. Swipe an ID card to lock"].") if(panel_open) . += span_notice("It is secured to the tram wall with [EXAMINE_HINT("bolts.")]") + . += span_notice("The maintenance panel can be closed with a [EXAMINE_HINT("screwdriver.")]") else . += span_notice("The maintenance panel can be opened with a [EXAMINE_HINT("screwdriver.")]") @@ -756,35 +756,108 @@ . += span_notice("The [EXAMINE_HINT("red stop button")] immediately stops the tram, requiring a reset afterwards.") . += span_notice("The cabinet can be closed with a [EXAMINE_HINT("Right-click.")]") else - . += span_notice("The cabinet can be opened with a [EXAMINE_HINT("Right-click.")]") + . += span_notice("The cabinet can be opened with a [EXAMINE_HINT("Left-click.")]") /obj/machinery/transport/tram_controller/attackby(obj/item/weapon, mob/living/user, params) - if(!user.combat_mode) - if(weapon && istype(weapon, /obj/item/card/id) && !cover_open) - return try_toggle_lock(user) + if(user.combat_mode || cover_open) + return ..() + + var/obj/item/card/id/id_card = user.get_id_in_hand() + if(!isnull(id_card)) + try_toggle_lock(user, id_card) + return return ..() +/obj/machinery/transport/tram_controller/attack_hand(mob/living/user, params) + . = ..() + if(cover_open) + return + + if(cover_locked) + var/obj/item/card/id/id_card = user.get_idcard(TRUE) + if(isnull(id_card)) + balloon_alert(user, "access denied!") + return + + try_toggle_lock(user, id_card) + return + + toggle_door() + +/obj/machinery/transport/tram_controller/attack_hand_secondary(mob/living/user, params) + . = ..() + + if(!cover_open) + var/obj/item/card/id/id_card = user.get_idcard(TRUE) + if(isnull(id_card)) + balloon_alert(user, "access denied!") + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + + try_toggle_lock(user, id_card) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + + toggle_door() + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + +/obj/machinery/transport/tram_controller/proc/toggle_door() + if(!cover_open) + playsound(loc, 'sound/machines/closet_open.ogg', 35, TRUE, -3) + else + playsound(loc, 'sound/machines/closet_close.ogg', 50, TRUE, -3) + cover_open = !cover_open + update_appearance() + +/obj/machinery/transport/tram_controller/proc/try_toggle_lock(mob/living/user, obj/item/card/id_card, params) + if(isnull(id_card)) + id_card = user.get_idcard(TRUE) + if(obj_flags & EMAGGED) + balloon_alert(user, "access controller damaged!") + return FALSE + + if(check_access(id_card)) + cover_locked = !cover_locked + balloon_alert(user, "controls [cover_locked ? "locked" : "unlocked"]") + update_appearance() + return TRUE + + balloon_alert(user, "access denied!") + return FALSE + /obj/machinery/transport/tram_controller/wrench_act_secondary(mob/living/user, obj/item/tool) . = ..() - if(panel_open) + if(panel_open && cover_open) balloon_alert(user, "unsecuring...") tool.play_tool_sound(src) - if(tool.use_tool(src, user, 6 SECONDS)) - playsound(loc, 'sound/items/deconstruct.ogg', 50, vary = TRUE) - balloon_alert(user, "unsecured") - deconstruct() + if(!tool.use_tool(src, user, 6 SECONDS)) + return + playsound(loc, 'sound/items/deconstruct.ogg', 50, vary = TRUE) + balloon_alert(user, "unsecured") + deconstruct() + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + +/obj/machinery/transport/tram_controller/screwdriver_act_secondary(mob/living/user, obj/item/tool) + . = ..() + if(!cover_open) + return + + tool.play_tool_sound(src) + panel_open = !panel_open + balloon_alert(user, "[panel_open ? "mounting bolts exposed" : "mounting bolts hidden"]") + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN /obj/machinery/transport/tram_controller/deconstruct(disassembled = TRUE) if(flags_1 & NODECONSTRUCT_1) return + + var/turf/drop_location = find_obstruction_free_location(1, src) + if(disassembled) - new /obj/item/wallframe/tram/controller(drop_location()) + new /obj/item/wallframe/tram/controller(drop_location) else - new /obj/item/stack/sheet/mineral/titanium(drop_location(), 2) - new /obj/item/stack/sheet/iron(drop_location(), 1) - new /obj/item/shard(drop_location()) + new /obj/item/stack/sheet/mineral/titanium(drop_location, 2) + new /obj/item/stack/sheet/iron(drop_location, 1) qdel(src) /** @@ -877,46 +950,6 @@ return update_appearance() -/obj/machinery/transport/tram_controller/attack_hand(mob/living/user, params) - . = ..() - if(!cover_open && cover_locked) - balloon_alert(user, "it's locked! swipe ID!") - return - -/obj/machinery/transport/tram_controller/attack_hand_secondary(mob/living/user, params) - . = ..() - - if(!cover_open && cover_locked) - balloon_alert(user, "it's locked! swipe ID!") - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - - toggle_door() - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - -/obj/machinery/transport/tram_controller/proc/toggle_door() - if(!cover_open) - playsound(loc, 'sound/machines/closet_open.ogg', 35, TRUE, -3) - else - playsound(loc, 'sound/machines/closet_close.ogg', 50, TRUE, -3) - cover_open = !cover_open - update_appearance() - -/obj/machinery/transport/tram_controller/proc/try_toggle_lock(mob/living/user, item, params) - var/obj/item/card/id/id_card = user.get_idcard(TRUE) - if(obj_flags & EMAGGED) - balloon_alert(user, "access controller damaged!") - return FALSE - - else if(check_access(id_card)) - cover_locked = !cover_locked - balloon_alert(user, "controls [cover_locked ? "locked" : "unlocked"]") - update_appearance() - return TRUE - - else - balloon_alert(user, "access denied") - return FALSE - /obj/machinery/transport/tram_controller/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) balloon_alert(user, "already fried!") diff --git a/code/modules/transport/tram/tram_controls.dm b/code/modules/transport/tram/tram_controls.dm index e62943c6623..2ecdad304bb 100644 --- a/code/modules/transport/tram/tram_controls.dm +++ b/code/modules/transport/tram/tram_controls.dm @@ -241,7 +241,7 @@ if(INVALID_PLATFORM) say("Configuration error. Please contact the nearest engineer.") if(INTERNAL_ERROR) - say("Tram controller error. Please contact the nearest engineer.") + say("Tram controller error. Please contact the nearest engineer or crew member with telecommunications access to reset the controller.") else return diff --git a/code/modules/transport/tram/tram_machinery.dm b/code/modules/transport/tram/tram_machinery.dm index 32887dffec7..7371447d082 100644 --- a/code/modules/transport/tram/tram_machinery.dm +++ b/code/modules/transport/tram/tram_machinery.dm @@ -58,17 +58,17 @@ if(BROKEN_BEYOND_REPAIR) say("The tram has suffered a catastrophic failure. Please seek alternate modes of travel.") if(NOT_IN_SERVICE) //tram has no power or other fault, but it's not broken forever - say("The tram is not in service. Please contact the nearest engineer.") + say("The tram is not in service due to loss of power or system problems. Please contact the nearest engineer to check power and controller.") if(INVALID_PLATFORM) //engineer needs to fix button say("Button configuration error. Please contact the nearest engineer.") if(TRANSPORT_IN_USE) say("The tram is tramversing the station, please wait.") if(INTERNAL_ERROR) - say("Tram controller error. Please contact the nearest engineer.") + say("Tram controller error. Please contact the nearest engineer or crew member with telecommunications access to reset the controller.") if(NO_CALL_REQUIRED) //already here say("The tram is already here. Please board the tram and select a destination.") else - say("Tram controller error. Please contact the nearest engineer.") + say("Tram controller error. Please contact the nearest engineer or crew member with telecommunications access to reset the controller.") /obj/item/assembly/control/transport/call_button/activate() if(cooldown) diff --git a/code/modules/transport/tram/tram_signals.dm b/code/modules/transport/tram/tram_signals.dm index 57cb89f3629..9983b32fe33 100644 --- a/code/modules/transport/tram/tram_signals.dm +++ b/code/modules/transport/tram/tram_signals.dm @@ -151,7 +151,7 @@ . += span_notice("It can be flipped or rotated with a [EXAMINE_HINT("wrench.")]") switch(operating_status) if(TRANSPORT_REMOTE_WARNING) - . += span_notice("The yellow [EXAMINE_HINT("remote warning")] light is on.") + . += span_notice("The orange [EXAMINE_HINT("remote warning")] light is on.") . += span_notice("The status display reads: Check track sensor.") if(TRANSPORT_REMOTE_FAULT) . += span_notice("The blue [EXAMINE_HINT("remote fault")] light is on.") @@ -250,19 +250,24 @@ SIGNAL_HANDLER if(machine_stat & BROKEN || machine_stat & NOPOWER) + operating_status = TRANSPORT_LOCAL_FAULT + update_appearance() return if(prob(TRANSPORT_BREAKDOWN_RATE)) + operating_status = TRANSPORT_LOCAL_FAULT local_fault() return - operating_status = TRANSPORT_SYSTEM_NORMAL - var/datum/transport_controller/linear/tram/tram = transport_ref?.resolve() var/obj/machinery/transport/guideway_sensor/linked_sensor = sensor_ref?.resolve() - if(isnull(tram) || tram.controller_status & COMM_ERROR) + if(malfunctioning) + operating_status = TRANSPORT_LOCAL_FAULT + else if(isnull(tram) || tram.controller_status & COMM_ERROR) operating_status = TRANSPORT_REMOTE_FAULT + else + operating_status = TRANSPORT_SYSTEM_NORMAL if(isnull(linked_sensor)) link_sensor() @@ -271,14 +276,17 @@ /obj/machinery/transport/crossing_signal/on_set_machine_stat() . = ..() - if(machine_stat & BROKEN) - operating_status = TRANSPORT_REMOTE_FAULT + if(machine_stat & BROKEN || machine_stat & NOPOWER) + operating_status = TRANSPORT_LOCAL_FAULT else operating_status = TRANSPORT_SYSTEM_NORMAL /obj/machinery/transport/crossing_signal/on_set_is_operational() . = ..() - + if(!is_operational) + operating_status = TRANSPORT_LOCAL_FAULT + else + operating_status = TRANSPORT_SYSTEM_NORMAL update_operating() /obj/machinery/transport/crossing_signal/proc/comms_change(source, controller, new_status) @@ -529,7 +537,7 @@ . += span_notice("It can be rotated with a [EXAMINE_HINT("wrench.")]") switch(operating_status) if(TRANSPORT_REMOTE_WARNING) - . += span_notice("The yellow [EXAMINE_HINT("remote warning")] light is on.") + . += span_notice("The orange [EXAMINE_HINT("remote warning")] light is on.") . += span_notice("The status display reads: Check paired sensor.") if(TRANSPORT_REMOTE_FAULT) . += span_notice("The blue [EXAMINE_HINT("remote fault")] light is on.") @@ -603,10 +611,8 @@ /obj/machinery/transport/guideway_sensor/update_overlays() . = ..() - if(machine_stat & NOPOWER) - return - if(machine_stat & BROKEN) + if(machine_stat & BROKEN || machine_stat & NOPOWER || malfunctioning) operating_status = TRANSPORT_LOCAL_FAULT . += mutable_appearance(icon, "sensor-[TRANSPORT_LOCAL_FAULT]") . += emissive_appearance(icon, "sensor-[TRANSPORT_LOCAL_FAULT]", src, alpha = src.alpha) @@ -649,9 +655,11 @@ SIGNAL_HANDLER if(machine_stat & BROKEN) + update_appearance() return if(prob(TRANSPORT_BREAKDOWN_RATE)) + operating_status = TRANSPORT_LOCAL_FAULT local_fault() var/obj/machinery/transport/guideway_sensor/buddy = paired_sensor?.resolve() diff --git a/code/modules/transport/tram/tram_structures.dm b/code/modules/transport/tram/tram_structures.dm index 03b36c1f528..c6291f775b3 100644 --- a/code/modules/transport/tram/tram_structures.dm +++ b/code/modules/transport/tram/tram_structures.dm @@ -40,14 +40,22 @@ explosion_block = 3 receive_ricochet_chance_mod = 1.2 rad_insulation = RAD_MEDIUM_INSULATION + /// What state of de/construction it's in var/state = TRAM_SCREWED_TO_FRAME + /// Mineral to return when deconstructed var/mineral = /obj/item/stack/sheet/titaniumglass + /// Amount of mineral to return when deconstructed var/mineral_amount = 2 + /// Type of structure made out of girder var/tram_wall_type = /obj/structure/tram + /// Type of girder made when deconstructed var/girder_type = /obj/structure/girder/tram var/mutable_appearance/damage_overlay + /// Sound when it breaks var/break_sound = SFX_SHATTER + /// Sound when hit without combat mode var/knock_sound = 'sound/effects/glassknock.ogg' + /// Sound when hit with combat mode var/bash_sound = 'sound/effects/glassbash.ogg' /obj/structure/tram/split @@ -459,18 +467,20 @@ desc = "Nanotrasen bought the luxury package under the impression titanium spoilers make the tram go faster. They're just for looks, or potentially stabbing anybody who gets in the way." icon_state = "tram-spoiler-retracted" max_integrity = 400 - ///Position of the spoiler - var/deployed = FALSE - ///Weakref to the tram piece we control - var/datum/weakref/tram_ref - ///The tram we're attached to - var/tram_id = TRAMSTATION_LINE_1 obj_flags = CAN_BE_HIT mineral = /obj/item/stack/sheet/mineral/titanium girder_type = /obj/structure/girder/tram/corner smoothing_flags = NONE smoothing_groups = null canSmoothWith = null + /// Position of the spoiler + var/deployed = FALSE + /// Malfunctioning due to tampering or emag + var/malfunctioning = FALSE + /// Weakref to the tram piece we control + var/datum/weakref/tram_ref + /// The tram we're attached to + var/tram_id = TRAMSTATION_LINE_1 /obj/structure/tram/spoiler/Initialize(mapload) . = ..() @@ -485,15 +495,33 @@ if(held_item?.tool_behaviour == TOOL_MULTITOOL && (obj_flags & EMAGGED)) context[SCREENTIP_CONTEXT_LMB] = "repair" + if(held_item?.tool_behaviour == TOOL_WELDER && atom_integrity >= max_integrity) + context[SCREENTIP_CONTEXT_LMB] = "[malfunctioning ? "repair" : "lock"]" + return CONTEXTUAL_SCREENTIP_SET +/obj/structure/tram/spoiler/examine(mob/user) + . = ..() + if(obj_flags & EMAGGED) + . += span_warning("The electronics panel is sparking occasionally. It can be reset with a [EXAMINE_HINT("multitool.")]") + + if(malfunctioning) + . += span_warning("The spoiler is [EXAMINE_HINT("welded")] in place!") + else + . += span_notice("The spoiler can be locked in to place with a [EXAMINE_HINT("welder.")]") + /obj/structure/tram/spoiler/proc/set_spoiler(source, controller, controller_active, controller_status, travel_direction) SIGNAL_HANDLER var/spoiler_direction = travel_direction - if(obj_flags & EMAGGED || controller_status & COMM_ERROR) + if(obj_flags & EMAGGED && !malfunctioning) + malfunctioning = TRUE + + if(malfunctioning || controller_status & COMM_ERROR) if(!deployed) // Bring out the blades + if(malfunctioning) + visible_message(span_danger("\the [src] locks up due to its servo overheating!")) do_sparks(3, cardinal_only = FALSE, source = src) deploy_spoiler() return @@ -523,6 +551,7 @@ flick("tram-spoiler-deploying", src) icon_state = "tram-spoiler-deployed" deployed = TRUE + update_appearance() /obj/structure/tram/spoiler/proc/retract_spoiler() if(!deployed) @@ -530,11 +559,12 @@ flick("tram-spoiler-retracting", src) icon_state = "tram-spoiler-retracted" deployed = FALSE + update_appearance() /obj/structure/tram/spoiler/emag_act(mob/user) if(obj_flags & EMAGGED) return - to_chat(user, span_warning("You short-circuit the [src]'s locking mechanism!"), type = MESSAGE_TYPE_INFO) + to_chat(user, span_warning("You short-circuit the [src]'s servo to overheat!"), type = MESSAGE_TYPE_INFO) playsound(src, SFX_SPARKS, 100, vary = TRUE, extrarange = SHORT_RANGE_SOUND_EXTRARANGE) do_sparks(5, cardinal_only = FALSE, source = src) obj_flags |= EMAGGED @@ -550,6 +580,37 @@ return FALSE +/obj/structure/tram/spoiler/welder_act(mob/living/user, obj/item/tool) + if(!tool.tool_start_check(user, amount = 1)) + return FALSE + + if(atom_integrity >= max_integrity) + to_chat(user, span_warning("You begin to weld \the [src], [malfunctioning ? "repairing damage" : "preventing retraction"].")) + if(!tool.use_tool(src, user, 4 SECONDS, volume = 50)) + return + malfunctioning = !malfunctioning + user.visible_message(span_warning("[user] [malfunctioning ? "welds \the [src] in place" : "repairs \the [src]"] with [tool]."), \ + span_warning("You finish welding \the [src], [malfunctioning ? "locking it in place." : "it can move freely again!"]"), null, COMBAT_MESSAGE_RANGE) + + if(malfunctioning) + deploy_spoiler() + + update_appearance() + return TOOL_ACT_TOOLTYPE_SUCCESS + + to_chat(user, span_notice("You begin repairing [src]...")) + if(!tool.use_tool(src, user, 4 SECONDS, volume = 50)) + return + atom_integrity = max_integrity + to_chat(user, span_notice("You repair [src].")) + update_appearance() + return TOOL_ACT_TOOLTYPE_SUCCESS + +/obj/structure/tram/spoiler/update_overlays() + . = ..() + if(deployed && malfunctioning) + . += mutable_appearance(icon, "tram-spoiler-welded") + /obj/structure/chair/sofa/bench/tram name = "bench" desc = "Perfectly designed to be comfortable to sit on, and hellish to sleep on." diff --git a/icons/obj/tram/crossing_signal.dmi b/icons/obj/tram/crossing_signal.dmi index b532ca1e175..bfcda58c7f3 100644 Binary files a/icons/obj/tram/crossing_signal.dmi and b/icons/obj/tram/crossing_signal.dmi differ diff --git a/icons/obj/tram/tram_sensor.dmi b/icons/obj/tram/tram_sensor.dmi index de50b20e701..5146e79c4ac 100644 Binary files a/icons/obj/tram/tram_sensor.dmi and b/icons/obj/tram/tram_sensor.dmi differ diff --git a/icons/obj/tram/tram_structure.dmi b/icons/obj/tram/tram_structure.dmi index 8840f3a4f2c..9fd919163d1 100644 Binary files a/icons/obj/tram/tram_structure.dmi and b/icons/obj/tram/tram_structure.dmi differ diff --git a/tools/UpdatePaths/Scripts/77777_Tram_2023.txt b/tools/UpdatePaths/Scripts/77777_Tram_2023.txt deleted file mode 100644 index f3ac42e09f5..00000000000 --- a/tools/UpdatePaths/Scripts/77777_Tram_2023.txt +++ /dev/null @@ -1,11 +0,0 @@ -#comment Repathing for Transport Subsystem - -/obj/structure/industrial_lift : /obj/structure/transport/linear{@OLD} -/obj/structure/industrial_lift/public : /obj/structure/transport/linear/public{@OLD} -/obj/structure/industrial_lift/debug : /obj/structure/transport/linear/debug{@OLD} -/obj/structure/industrial_lift/tram : /obj/structure/transport/linear/tram{@OLD} -/obj/effect/landmark/lift_id : /obj/effect/landmark/transport/transport_id{@OLD} -/obj/effect/landmark/tram/nav/immovable_rod : /obj/effect/landmark/transport/nav_beacon/tram/nav/immovable_rod{@OLD} -/turf/open/floor/noslip/tram_plate : /turf/open/floor/tram/plate{@OLD} -/turf/open/floor/noslip/tram_plate/energized : /turf/open/floor/tram/plate/energized{@OLD} -/turf/open/floor/noslip/tram_platform : /turf/open/floor/tram{@OLD} \ No newline at end of file diff --git a/tools/UpdatePaths/Scripts/79093_tram_and_elevators_repath.txt b/tools/UpdatePaths/Scripts/79093_tram_and_elevators_repath.txt new file mode 100644 index 00000000000..7f2995fe464 --- /dev/null +++ b/tools/UpdatePaths/Scripts/79093_tram_and_elevators_repath.txt @@ -0,0 +1,21 @@ +#comment Repathing for Transport Subsystem + +/obj/structure/industrial_lift{specific_lift_id=@ANY} : /obj/structure/transport/linear{@OLD; specific_lift_id=@SKIP; specific_transport_id=@OLD:specific_lift_id} +/obj/structure/industrial_lift/public{specific_lift_id=@ANY} : /obj/structure/transport/linear/public{@OLD; specific_lift_id=@SKIP; specific_transport_id=@OLD:specific_lift_id} +/obj/structure/industrial_lift/debug{specific_lift_id=@ANY} : /obj/structure/transport/linear/debug{@OLD; specific_lift_id=@SKIP; specific_transport_id=@OLD:specific_lift_id} +/obj/structure/industrial_lift/tram{specific_lift_id=@ANY} : /obj/structure/transport/linear/tram{@OLD; specific_lift_id=@SKIP; specific_transport_id=@OLD:specific_lift_id} +/obj/effect/landmark/lift_id{specific_lift_id=@ANY} : /obj/effect/landmark/transport/transport_id{@OLD; specific_lift_id=@SKIP; specific_transport_id=@OLD:specific_lift_id} +/obj/effect/landmark/tram/nav/immovable_rod{specific_lift_id=@ANY} : /obj/effect/landmark/transport/nav_beacon/tram/nav/immovable_rod{@OLD; specific_lift_id=@SKIP; specific_transport_id=@OLD:specific_lift_id} +/turf/open/floor/noslip/tram_plate : /turf/open/floor/tram/plate{@OLD} +/turf/open/floor/noslip/tram_plate/energized : /turf/open/floor/tram/plate/energized{@OLD} +/turf/open/floor/noslip/tram_platform : /turf/open/floor/tram{@OLD} +/obj/machinery/door/window/elevator/left{elevator_linked_id=@ANY} : /obj/machinery/door/window/elevator/left{@OLD; elevator_linked_id=@SKIP; transport_linked_id=@OLD:elevator_linked_id} +/obj/machinery/door/window/elevator/left/directional/north{elevator_linked_id=@ANY} : /obj/machinery/door/window/elevator/left/directional/north{@OLD; elevator_linked_id=@SKIP; transport_linked_id=@OLD:elevator_linked_id} +/obj/machinery/door/window/elevator/left/directional/south{elevator_linked_id=@ANY} : /obj/machinery/door/window/elevator/left/directional/south{@OLD; elevator_linked_id=@SKIP; transport_linked_id=@OLD:elevator_linked_id} +/obj/machinery/door/window/elevator/left/directional/east{elevator_linked_id=@ANY} : /obj/machinery/door/window/elevator/left/directional/east{@OLD; elevator_linked_id=@SKIP; transport_linked_id=@OLD:elevator_linked_id} +/obj/machinery/door/window/elevator/left/directional/west{elevator_linked_id=@ANY} : /obj/machinery/door/window/elevator/left/directional/west{@OLD; elevator_linked_id=@SKIP; transport_linked_id=@OLD:elevator_linked_id} +/obj/machinery/door/window/elevator/right{elevator_linked_id=@ANY} : /obj/machinery/door/window/elevator/right{@OLD; elevator_linked_id=@SKIP; transport_linked_id=@OLD:elevator_linked_id} +/obj/machinery/door/window/elevator/right/directional/north{elevator_linked_id=@ANY} : /obj/machinery/door/window/elevator/right/directional/north{@OLD; elevator_linked_id=@SKIP; transport_linked_id=@OLD:elevator_linked_id} +/obj/machinery/door/window/elevator/right/directional/south{elevator_linked_id=@ANY} : /obj/machinery/door/window/elevator/right/directional/south{@OLD; elevator_linked_id=@SKIP; transport_linked_id=@OLD:elevator_linked_id} +/obj/machinery/door/window/elevator/right/directional/east{elevator_linked_id=@ANY} : /obj/machinery/door/window/elevator/right/directional/east{@OLD; elevator_linked_id=@SKIP; transport_linked_id=@OLD:elevator_linked_id} +/obj/machinery/door/window/elevator/right/directional/west{elevator_linked_id=@ANY} : /obj/machinery/door/window/elevator/right/directional/west{@OLD; elevator_linked_id=@SKIP; transport_linked_id=@OLD:elevator_linked_id}