Tram door/panel hotfix [NO GBP] (#79093)

## About The Pull Request

- The actions to open/close and lock/unlock are supposed to match
closets, but I got it backwards. Swaps them around.
- The lock now works as expected no matter if your ID card is in hand,
in a wallet, or in your PDA.
- Moves early return for when welder has no fuel.
- There was no indication spoilers were tampered/malfunctioning. Added
an overlay, examine text, context hint, and welder action so it's more
apparent to players.
- Fixing an emagged spoiler is now multitool-weld, to match the overlay.
- Added some missing var docs.
- Improved the wording of some tram error messages about why it's broken
(ie: no power.)
- Fixed crossing signals not showing correct status/examine text when
broken/no power


![image](https://github.com/tgstation/tgstation/assets/83487515/a5539303-88a4-469b-afaf-65c8d67ce2e8)

## Changelog

🆑 LT3
fix: Fixed tram cabinet LMB/RMB actions being reversed
fix: Tram cabinet can now read IDs inside PDAs and wallets
fix: Crossing signals now correctly indicate broken/no power
fix: Trying to repair tram (weld) without welding fuel fails
fix: You can actually unbolt the tram controller from the wall
qol: Tram spoilers now have visual and examine hints about being
malfunctioning/emagged
qol: Improved some tram error messages
/🆑

---------

Co-authored-by: Jacquerel <hnevard@gmail.com>
This commit is contained in:
lessthanthree
2023-10-21 22:37:41 +00:00
committed by GitHub
co-authored by Jacquerel
parent f081befc3f
commit 1abede91a1
11 changed files with 204 additions and 91 deletions
@@ -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
+90 -57
View File
@@ -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!")
+1 -1
View File
@@ -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
@@ -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)
+19 -11
View File
@@ -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()
+69 -8
View File
@@ -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."
Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.2 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 38 KiB

@@ -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}
@@ -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}