From 0343a41b4297a3d403ebb8be52ff90ce7e32cb48 Mon Sep 17 00:00:00 2001 From: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Date: Mon, 9 Jun 2025 12:40:48 -0500 Subject: [PATCH] Handrails, visual shuttle buckles, and buckling feedback changes (#91504) ## About The Pull Request 1. Adds Handrails, currently mapper only. [Sprite ported from Baystation](https://github.com/Baystation12/Baystation12/blob/dev/icons/obj/structures/handrail.dmi). This is just a small fluff object designed to be put onto shuttles. Players can click on it (or mouse drop) to buckle to it (grab it), keeping them from being thrown around on shuttle launch. ![image](https://github.com/user-attachments/assets/b5bba651-d6ad-4e12-bb13-988ad5bc64ca) 2. Adds Shuttle chair restraints. [Sprite ported from Aurora](https://github.com/Aurorastation/Aurora.3/blob/master/icons/obj/structure/chairs.dmi), though altered a decent amount. They flip up with no one seated and flip down when someone buckles, but they have no gameplay effects (ie, they don't require a do-after, they don't block hands, etc etc) ![image](https://github.com/user-attachments/assets/4118a174-2443-4da2-8126-649dccfdcb65) ![image](https://github.com/user-attachments/assets/d40fb7b4-f7d2-4052-8f6c-41dfda62cf95) 3. Some objects now have unique feedback messages for buckling - you sit on chairs, or lay down on beds. This message will change depending on if the mob is restrained, so it's a bit more obvious when someone is tied to a chair vs just sitting down. ![image](https://github.com/user-attachments/assets/9ea1da9f-ae25-4008-8ca4-8202f7508290) 4. If you're buckled on a shuttle which has "knockdown" force, you won't be paralyzed - instead, just knocked down and immobilized for a short period (so you can still use your hands / act). ## Why It's Good For The Game 1. Gives mappers some additional fluff for shuttles, especially if their shuttle has knockdown force. 2. Adds muh immersion to shuttle rides. Just a flavor thing. 3. Adds muh immersion to sitting down at the bar. Again just a flavor thing. 4. I did this to make handrails work, but I can find an alternate workaround if so desired. ## Changelog :cl: Melbert, sprites from Baystation / Aurorastation add: Adds grabbable handrails (mapper only for now) image: Adds a visual effect to buckling to shuttle seats qol: Different objects have different chat messages for buckling. qol: If you're buckled in on a violent shuttle ride, you will be knocked down and immobilized, but not fully stunned (ie: can still use hands). /:cl: --------- Co-authored-by: san7890 --- code/game/objects/buckling.dm | 49 ++++-- .../structures/beds_chairs/alien_nest.dm | 28 ++++ .../objects/structures/beds_chairs/bed.dm | 34 ++++ .../objects/structures/beds_chairs/chair.dm | 146 ++++++++++++++++++ .../objects/structures/gym/weight_machine.dm | 34 ++++ code/game/objects/structures/tables_racks.dm | 34 ++++ .../mobile_port/shuttle_move_callbacks.dm | 9 +- icons/obj/chairs.dmi | Bin 22978 -> 12330 bytes icons/obj/handrail.dmi | Bin 0 -> 385 bytes 9 files changed, 316 insertions(+), 18 deletions(-) create mode 100644 icons/obj/handrail.dmi diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index 1b8f8fe87be..1a4d34f0828 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -324,14 +324,23 @@ . = buckle_mob(M, check_loc = check_loc) if(.) - if(M == user) - M.visible_message(span_notice("[M] buckles [M.p_them()]self to [src]."),\ - span_notice("You buckle yourself to [src]."),\ - span_hear("You hear metal clanking.")) - else - M.visible_message(span_warning("[user] buckles [M] to [src]!"),\ - span_warning("[user] buckles you to [src]!"),\ - span_hear("You hear metal clanking.")) + buckle_feedback(M, user) + +/// Feedback displayed to nearby players after a mob is buckled to src. +/atom/movable/proc/buckle_feedback(mob/living/being_buckled, mob/buckler) + if(being_buckled == buckler) + buckler.visible_message( + span_notice("[buckler] buckles [buckler.p_them()]self to [src]."), + span_notice("You buckle yourself to [src]."), + span_hear("You hear metal clanking."), + ) + else + buckler.visible_message( + span_warning("[buckler] buckles [being_buckled] to [src]!"), + span_warning("[buckler] buckles you to [src]!"), + span_hear("You hear metal clanking."), + ) + /** * Handles a user unbuckling a mob from src and sends a visible_message * @@ -346,16 +355,24 @@ return var/mob/living/M = unbuckle_mob(buckled_mob) if(M) - if(M != user) - M.visible_message(span_notice("[user] unbuckles [M] from [src]."),\ - span_notice("[user] unbuckles you from [src]."),\ - span_hear("You hear metal clanking.")) - else - M.visible_message(span_notice("[M] unbuckles [M.p_them()]self from [src]."),\ - span_notice("You unbuckle yourself from [src]."),\ - span_hear("You hear metal clanking.")) + unbuckle_feedback(M, user) add_fingerprint(user) if(isliving(M.pulledby)) var/mob/living/L = M.pulledby L.set_pull_offsets(M, L.grab_state) return M + +/// Feedback displayed to nearby players after a mob is unbuckled from src. +/atom/movable/proc/unbuckle_feedback(mob/living/unbuckled_mob, mob/unbuckler) + if(unbuckled_mob == unbuckler) + unbuckler.visible_message( + span_notice("[unbuckler] unbuckles [unbuckler.p_them()]self from [src]."), + span_notice("You unbuckle yourself from [src]."), + span_hear("You hear metal clanking."), + ) + else + unbuckler.visible_message( + span_notice("[unbuckler] unbuckles [unbuckled_mob] from [src]."), + span_notice("[unbuckler] unbuckles you from [src]."), + span_hear("You hear metal clanking."), + ) diff --git a/code/game/objects/structures/beds_chairs/alien_nest.dm b/code/game/objects/structures/beds_chairs/alien_nest.dm index 47b1ab530d9..1f77227a8be 100644 --- a/code/game/objects/structures/beds_chairs/alien_nest.dm +++ b/code/game/objects/structures/beds_chairs/alien_nest.dm @@ -21,6 +21,34 @@ return ..() +/obj/structure/bed/nest/buckle_feedback(mob/living/being_buckled, mob/buckler) + if(being_buckled == buckler) + being_buckled.visible_message( + span_notice("[buckler] lays down on [src], wrapping [buckler.p_them()]self in a thick, sticky resin."), + span_notice("You lay down on [src], wrapping yourself in a thick, sticky resin."), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + ) + else + being_buckled.visible_message( + span_notice("[buckler] lays [being_buckled] down on [src], wrapping [being_buckled.p_them()] in a thick, sticky resin."), + span_notice("[buckler] lays you down on [src], wrapping you in a thick, sticky resin."), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + ) + +/obj/structure/bed/nest/unbuckle_feedback(mob/living/being_unbuckled, mob/unbuckler) + if(being_unbuckled == unbuckler) + being_unbuckled.visible_message( + span_notice("[unbuckler] pulls [unbuckler.p_them()]self free from the sticky nest!"), + span_notice("You pull yourself free from the sticky nest!"), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + ) + else + being_unbuckled.visible_message( + span_notice("[unbuckler] pulls [being_unbuckled] free from the sticky nest!"), + span_notice("[unbuckler] pulls you free from the sticky nest!"), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + ) + /obj/structure/bed/nest/user_unbuckle_mob(mob/living/captive, mob/living/hero) if(!length(buckled_mobs)) return diff --git a/code/game/objects/structures/beds_chairs/bed.dm b/code/game/objects/structures/beds_chairs/bed.dm index 68833f91c0d..6b687c8a4b0 100644 --- a/code/game/objects/structures/beds_chairs/bed.dm +++ b/code/game/objects/structures/beds_chairs/bed.dm @@ -38,6 +38,40 @@ update_buckle_vars(dir) register_context() +/obj/structure/bed/buckle_feedback(mob/living/being_buckled, mob/buckler) + if(HAS_TRAIT(being_buckled, TRAIT_RESTRAINED)) + return ..() + + if(being_buckled == buckler) + being_buckled.visible_message( + span_notice("[buckler] lays down on [src]."), + span_notice("You lay down on [src]."), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + ) + else + being_buckled.visible_message( + span_notice("[buckler] lays [being_buckled] down on [src]."), + span_notice("[buckler] lays you down on [src]."), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + ) + +/obj/structure/bed/unbuckle_feedback(mob/living/being_unbuckled, mob/unbuckler) + if(HAS_TRAIT(being_unbuckled, TRAIT_RESTRAINED)) + return ..() + + if(being_unbuckled == unbuckler) + being_unbuckled.visible_message( + span_notice("[unbuckler] gets up from [src]."), + span_notice("You get up from [src]."), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + ) + else + being_unbuckled.visible_message( + span_notice("[unbuckler] pulls [being_unbuckled] up from [src]."), + span_notice("[unbuckler] pulls you up from [src]."), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + ) + /obj/structure/bed/examine(mob/user) . = ..() if (can_deconstruct) diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index 6c377582555..f01698e6bb8 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -33,6 +33,40 @@ if(can_buckle && fishing_modifier) AddComponent(/datum/component/adjust_fishing_difficulty, fishing_modifier) +/obj/structure/chair/buckle_feedback(mob/living/being_buckled, mob/buckler) + if(HAS_TRAIT(being_buckled, TRAIT_RESTRAINED)) + return ..() + + if(being_buckled == buckler) + being_buckled.visible_message( + span_notice("[buckler] sits down on [src]."), + span_notice("You sit down on [src]."), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + ) + else + being_buckled.visible_message( + span_notice("[buckler] sits [being_buckled] down on [src]."), + span_notice("[buckler] sits you down on [src]."), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + ) + +/obj/structure/chair/unbuckle_feedback(mob/living/being_unbuckled, mob/unbuckler) + if(HAS_TRAIT(being_unbuckled, TRAIT_RESTRAINED)) + return ..() + + if(being_unbuckled == unbuckler) + being_unbuckled.visible_message( + span_notice("[unbuckler] stands up from [src]."), + span_notice("You stand up from [src]."), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + ) + else + being_unbuckled.visible_message( + span_notice("[unbuckler] stands [being_unbuckled] up from [src]."), + span_notice("[unbuckler] stands you up from [src]."), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + ) + /obj/structure/chair/on_changed_z_level(turf/old_turf, turf/new_turf, same_z_layer, notify_contents) if(same_z_layer || !has_armrest) return ..() @@ -222,6 +256,9 @@ buildstacktype = /obj/item/stack/sheet/mineral/titanium buckle_sound = SFX_SEATBELT_BUCKLE unbuckle_sound = SFX_SEATBELT_UNBUCKLE + resistance_flags = FIRE_PROOF + max_integrity = 120 + custom_materials = list(/datum/material/titanium = SHEET_MATERIAL_AMOUNT) /obj/structure/chair/comfy/shuttle/electrify_self(obj/item/assembly/shock_kit/input_shock_kit, mob/user, list/overlays_from_child_procs) if(!overlays_from_child_procs) @@ -230,6 +267,42 @@ overlays_from_child_procs = list(echair_overlay) . = ..() +/obj/structure/chair/comfy/shuttle/buckle_feedback(mob/living/being_buckled, mob/buckler) + if(being_buckled == buckler) + being_buckled.visible_message( + span_notice("[buckler] sits down on [src], pulling the overhead restraint down to secure [buckler.p_them()]self."), + span_notice("You sit down on [src], pulling the overhead restraint down to secure yourself."), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + ) + else + being_buckled.visible_message( + span_notice("[buckler] sits [being_buckled] down on [src], pulling the overhead restraint down to secure [buckler.p_them()]."), + span_notice("[buckler] sits you down on [src], pulling the overhead restraint down to secure you."), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + ) + +/obj/structure/chair/comfy/shuttle/unbuckle_feedback(mob/living/being_unbuckled, mob/unbuckler) + if(being_unbuckled == unbuckler) + being_unbuckled.visible_message( + span_notice("[unbuckler] flips the overhead restraint up, standing up from [src]."), + span_notice("You flip the overhead restraint up, standing up from [src]."), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + ) + else + being_unbuckled.visible_message( + span_notice("[unbuckler] flips the overhead restraint up, standing [being_unbuckled] up from [src]."), + span_notice("[unbuckler] flips the overhead restraint up, standing you up from [src]."), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + ) + +/obj/structure/chair/comfy/shuttle/update_overlays() + . = ..() + if(has_buckled_mobs()) + . += mutable_appearance(icon, "[icon_state]_down_front", ABOVE_MOB_LAYER + 0.01) + . += mutable_appearance(icon, "[icon_state]_down_behind", src.layer + 0.01) + else + . += mutable_appearance(icon, "[icon_state]_up", src.layer + 0.01) + /obj/structure/chair/comfy/shuttle/tactical name = "tactical chair" @@ -618,3 +691,76 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0) desc = "Oh, so this is like the fucked up Monopoly rules where there are no rules and you can pick up and place the musical chairs as you please." particles = new /particles/musical_notes origin_type = /obj/structure/chair/musical + +/obj/structure/handrail + name = "handrail" + desc = "Hold on tight!" + icon = 'icons/obj/handrail.dmi' + icon_state = "handrail" + anchored = TRUE + can_buckle = TRUE + buckle_lying = NO_BUCKLE_LYING + resistance_flags = FIRE_PROOF + max_integrity = 50 + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT) + layer = OBJ_LAYER + +/obj/structure/handrail/attack_hand(mob/living/user, list/modifiers) + return ..() || mouse_buckle_handling(user, user) + +/obj/structure/handrail/is_user_buckle_possible(mob/living/target, mob/user, check_loc = TRUE) + return ..() && user == target && !HAS_TRAIT(target, TRAIT_HANDS_BLOCKED) + +/obj/structure/handrail/post_buckle_mob(mob/living/buckled_mob) + RegisterSignal(buckled_mob, SIGNAL_ADDTRAIT(TRAIT_HANDS_BLOCKED), PROC_REF(stop_buckle)) + + var/z_offset = 0 + var/w_offset = 0 + if(dir & NORTH) + z_offset = -4 + else if(dir & SOUTH) + z_offset = 8 + if(dir & EAST) + w_offset = -8 + else if(dir & WEST) + w_offset = 8 + + buckled_mob.add_offsets(type, z_add = z_offset, w_add = w_offset) + +/obj/structure/handrail/post_unbuckle_mob(mob/living/unbuckled_mob) + UnregisterSignal(unbuckled_mob, SIGNAL_ADDTRAIT(TRAIT_HANDS_BLOCKED)) + unbuckled_mob.remove_offsets(type) + +/obj/structure/handrail/proc/stop_buckle(mob/living/source, ...) + SIGNAL_HANDLER + source.visible_message( + span_warning("[source] loses [source.p_their()] grip on [src]!"), + span_warning("You lose your grip on [src]!"), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + vision_distance = COMBAT_MESSAGE_RANGE, + ) + unbuckle_mob(source, TRUE, TRUE) + +/obj/structure/handrail/buckle_feedback(mob/living/being_buckled, mob/buckler) + buckler.visible_message( + span_notice("[buckler] grabs [src] tight, keeping [buckler.p_them()]self upright."), + span_notice("You grab [src] tight, keeping yourself upright."), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + vision_distance = COMBAT_MESSAGE_RANGE, + ) + +/obj/structure/handrail/unbuckle_feedback(mob/living/being_unbuckled, mob/unbuckler) + if(being_unbuckled == unbuckler) + being_unbuckled.visible_message( + span_notice("[unbuckler] lets go of [src]."), + span_notice("You let go of [src]."), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + vision_distance = COMBAT_MESSAGE_RANGE, + ) + else + being_unbuckled.visible_message( + span_warning("[unbuckler] forces [being_unbuckled] to let go of [src]!"), + span_warning("[unbuckler] forces you to let go of [src]!"), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + vision_distance = COMBAT_MESSAGE_RANGE, + ) diff --git a/code/game/objects/structures/gym/weight_machine.dm b/code/game/objects/structures/gym/weight_machine.dm index 438196e9b60..c9b59efd89f 100644 --- a/code/game/objects/structures/gym/weight_machine.dm +++ b/code/game/objects/structures/gym/weight_machine.dm @@ -71,6 +71,40 @@ QDEL_NULL(weight_action) return ..() +/obj/structure/weightmachine/buckle_feedback(mob/living/being_buckled, mob/buckler) + if(HAS_TRAIT(being_buckled, TRAIT_RESTRAINED)) + return ..() + + if(being_buckled == buckler) + being_buckled.visible_message( + span_notice("[buckler] lays down on [src]."), + span_notice("You lay down on [src]."), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + ) + else + being_buckled.visible_message( + span_notice("[buckler] lays [being_buckled] down on [src]."), + span_notice("[buckler] lays you down on [src]."), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + ) + +/obj/structure/weightmachine/unbuckle_feedback(mob/living/being_unbuckled, mob/unbuckler) + if(HAS_TRAIT(being_unbuckled, TRAIT_RESTRAINED)) + return ..() + + if(being_unbuckled == unbuckler) + being_unbuckled.visible_message( + span_notice("[unbuckler] gets up from [src]."), + span_notice("You get up from [src]."), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + ) + else + being_unbuckled.visible_message( + span_notice("[unbuckler] pulls [being_unbuckled] up from [src]."), + span_notice("[unbuckler] pulls you up from [src]."), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + ) + /obj/structure/weightmachine/buckle_mob(mob/living/buckled, force, check_loc) . = ..() weight_action.Grant(buckled) diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 553fafe60ce..c07c5c35273 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -1077,6 +1077,40 @@ breath_mask = null return ..() +/obj/structure/table/optable/buckle_feedback(mob/living/being_buckled, mob/buckler) + if(HAS_TRAIT(being_buckled, TRAIT_RESTRAINED)) + return ..() + + if(being_buckled == buckler) + being_buckled.visible_message( + span_notice("[buckler] lays down on [src]."), + span_notice("You lay down on [src]."), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + ) + else + being_buckled.visible_message( + span_notice("[buckler] lays [being_buckled] down on [src]."), + span_notice("[buckler] lays you down on [src]."), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + ) + +/obj/structure/table/optable/unbuckle_feedback(mob/living/being_unbuckled, mob/unbuckler) + if(HAS_TRAIT(being_unbuckled, TRAIT_RESTRAINED)) + return ..() + + if(being_unbuckled == unbuckler) + being_unbuckled.visible_message( + span_notice("[unbuckler] gets up from [src]."), + span_notice("You get up from [src]."), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + ) + else + being_unbuckled.visible_message( + span_notice("[unbuckler] pulls [being_unbuckled] up from [src]."), + span_notice("[unbuckler] pulls you up from [src]."), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + ) + /obj/structure/table/optable/add_context(atom/source, list/context, obj/item/held_item, mob/living/user) . = ..() if(isnull(held_item)) diff --git a/code/modules/shuttle/mobile_port/shuttle_move_callbacks.dm b/code/modules/shuttle/mobile_port/shuttle_move_callbacks.dm index 5c812157c9a..9f15cc0dfb8 100644 --- a/code/modules/shuttle/mobile_port/shuttle_move_callbacks.dm +++ b/code/modules/shuttle/mobile_port/shuttle_move_callbacks.dm @@ -325,8 +325,13 @@ All ShuttleMove procs go here . = ..() var/knockdown = movement_force["KNOCKDOWN"] - if(knockdown) - Paralyze(knockdown) + if(knockdown > 0) + if(buckled) + // If we're buckled, no stun but we'll still be floored and frozen + Knockdown(knockdown) + Immobilize(knockdown * 0.5) + else + Paralyze(knockdown) /mob/living/simple_animal/hostile/megafauna/onShuttleMove(turf/newT, turf/oldT, list/movement_force, move_dir, obj/docking_port/stationary/old_dock, obj/docking_port/mobile/moving_dock) diff --git a/icons/obj/chairs.dmi b/icons/obj/chairs.dmi index 174a6a3e7bbcdb177d77ef1f56585ac858d59830..b1432f16701c2009ecd493b65022ac81c5409a87 100644 GIT binary patch literal 12330 zcmXwf1z1$i_cyV?E+8yROD!yogh)y*-7SdH4N7;*(!DfDEun-W2+}1bozf|#bhFaD z`2D^A=RWtjGv{;8nKSp!J#)^?L~Cg%KEi*DkAZ>lNLfiv2Ll5W^>DufVn0w8s zDjEju?d^i1(o@=O^z`)N;^IHqo?r~w*xcJtKW58logE}9UWU+TPG(cb8~Y!_zY;7WTd1#tX@RN=%&7W zlbvIo)00&9!YEom&8ybWO-92|mzf{U{Of)tn>PxwES)eR1h9~>NbxFXux+G1j2EG;by3k$ux zyk=)-Ul?)ur7K02>L@6|in^?=&4iO`{B<7PPi2wk=( z5N@;7V%e5ktX%!fNpn^nqN~8@^-<-zx!u)$p8@n??-^;X@T3**+|OGc_2;nAgwWnd zfpI%dIv#8Ws2QQKBzR8!z0&#(RE2aC^@DMwQm?E-gr0>nvX!@kDTR2lj$(6uZtgj4 zxEO23Gg0{038U#ZoKh6#Is>UI_#mfT)KAtY1}(7USzunSZl>{mR_QbK&3nexzksQ7 zTcJP1oZqL20$--Tdy`e$RJb?Sn^OPfx}PT$=ZP&%R$8w{Xm@nVB@m-0bdbSN_5z~Z7#L6tWjVN>PtJZ| ztR<;pay^m(_*NQhp|1)C?*Bf3;=bienClX{-tYV^^p`HtO1P2tl8O2V7E31st*^7j z?w1OhS~}g@{t~1<$`>jwg|ndZLUVZ1xxBflM73;+Q?FF3K;}S1FVVFW;~G}tsp;b3_i(ZF+Z}Aby0tp>b~}!V{2~QYYyi+y%nhPNBMh;}h*LXr(V0>=73} z_O%7*koPt(2Bi}tC~b_)f+=yaF$gmK`YqZR0B{G`Z*CMt0~-Q0cxVf>>tj$hfZBxW z{r=y0CD;L_W?Pey1wZhp;JvJ}w5lX`9x}>RJ*;%38-iAs{>D6IMJ!$xVf^R5|2RM1njS{ik(6JRUC#JW1v~@HvULj|Caq zmfevKgp9)l@byCjZXzmQ=^HK|sTK69zI)R4K+ zd!QguJl%RSz+O3N(R1+4n&8I9kyT77#2s03p^1Z2Dks z6()8QRz(phk5tmag1}uydv$zZZr>TCm65NCNJ=nH`llc@%pM=*{G+S5+ororuNb3I zA~HfwpMY{X)Yam`BDE^ck)yKlB!ARl!(}y~s8~=K>SYXxzz3(d1?J4qV-V-e zH=$2dAf*7rfMA8=3jsTg+6Il1DTu@@WOGfAP4eC1tV|aI<4xmxXl)D*=Cqq2oR$31 z`~H@CmJwYwHxoF;dqGYFVJWcu;W}X~opvZ&nd@sz1Q!?<75M()G?1wJS*B*U+&J)p zcyEZ4oHLbt-|IRce*aAqMsSIEjJaj1LQeecD$aS|rR92LZ=!M3G8@_aK0yff=sFQC z4NM~fn_bvvYW1S~8mLS?%iw?{a1#1~h*TbazrlEg#`64i`Toh5qzVs5w|A$#Rdl3e zaseSx3lm?O3HOMFfB9uw#+wONKbhqGgX*V!m_PSv1-~ zD0=rtG)?vdR70G;u&8b#I#o`RdvC@Q4U;1_AzocCcw*Z=b z4H~8|(6w{xDMrn#I0^Okr7Zdd2HYIItl{YI-F>Uu+jFeUBAeTP9IHm)CTVc}?M~TV zN)EQzE*?}GVx3yOsJFroZxwp#Ca_rl**N??@Gma|9q94caW92+Y^*8tpv5)NYJOho?pdo?2evXMztl_tX(8Y zAG1G(M=c&)~~TQ7Jq`$7%kx z_|qMF_B!ORe=Z!4vr_7$n-fzORJCmEt&EL%O}i^J@YSfuZ266tMSQAUXW2S29VN&I1r zm-O`AQkN)r!(OU$OaWOIYwqphLhwf#S#k@E_DyJg=zOvhy%n!8Jp+%Fwge-EcEYhY zAB_vd?V^%Nhbs_%y8B9nv$_#6AU!|>13&CxcS}fs$WVIJolp;q~GCx126!NR`hId2=!LZ zO)?1D-)diX`ew2S^;{L59-J#uCiniWUir=xmi_F_W?y81&}kdt*KSL!Sg;ef23NgE z&~V{hDfJ|Sv52Nkj5<81tz(8^b>(dQE$dEVGQfA9A?W1{!|j)08&2h?0ka-uQdpZS z*7m^{<}ZTJt`nv1E;=t)V6W>(n`an|`zG#=U@qU=Zw}TIwehMngEX~t2RGXtUtnF| zUpaH^6H6EY`{JR**RqL)gRcV~>YRvygoxj{pN!7GYm}_LY45zod_JnqLZ5JzeTH7a zJgErgm=78`mm-QO%HIY{(&yy*ua45x?rj{DMv?EZhwS zVg>2&3phrJA6{jI3eV{u*u^RAG@=zhwqu-xTr zC=L89c?ba=y`nU|fNZ=DPU$~4wbuG}%-mOb*F%#BAUD1zwYVDiR{e<4&c;ST9?5?) zd+9sfe!AM7JMvE0U$TLmvucauS?7h=_it-y7>-# zKVAQ~;sL`2_)e`@x!!(!al7|ks=-}R9GsSSb2R-1a9*lwIM^%wSP)aT?cx|4h5jT8n>5@$J7MVq@d*%)q9Pm)68> zWq4J-tNvdTc!wt0Z9<`+!)>4p_z3*Z_hm_Gdv9hwzWKS4CFBIQ zix5~fGtOWm-k5^MY(jUOIbLEO<4z%BoSR}RyLrYF8{4PX?x*?uLnY>RBLzvZP9zN; zm;C7pL(2^#F0e;%gD+Nl9*x=ovZ- zDp1UhsTJa5rLp$kxG2W%AZg+vpkvAK$pl2e+nwIUedKuvpm=N6Y%HL%C=o+`H=|q7MBb`K+U4yt9G)! z^2-3~>Xu2s(}kg68)5|qe03wI-~fDbcr6aDd`%%}!qztr5IAsSt2!nwFh;`Mx1Xr# zdOpFD1FgKGwBAsDrz8)0PpqJG!%1kkoHHn{q{l*ZGZ~K3d;|#OB(?Gmi1=ji0^mE@ z&JNT3(TSy^<&rYIZdt}S=&p2YHI)qR-sgnFtj*yIz0|v=g!{gt7QqKLggEdf9%RgU z<6CwfE_gs7z5Zm$jPTZ&HiJpS!&gDB+D*=_PIj(s9ekulp6|D?A2u8Y#KH0LwS%x&x9^L(V+ z+p>N!#P2_Xgz`5-qp{29_{1azC3;4bSi7dloViKSYs)uP|MJmE z9Mm21izksT%HM|v4z9yhaME|P)P(j-)$w zP#O8Pt;d1|16civ!zDwJNYBS7fhLTMM4*JkeSdJiXVYk9jY}B9$3WaMdx~3)^?2Z` z=g&qL4zCew)mgP$ih*a zE_h{o<2fGD2%+fLogf0~KdgI09y?n~?!Cj?o4ZO9AUC^>LK=ibT)el2`GmRt(#!`*5&N21v5ySR7GX;4U?C7e+L!4{AoK{~&zik(eqN*&4X(752KW zEdePEKmK8;9-YcMnC%`9butcL5isx2GC3FiRmcABb08g~H^RXkgwP7|co_7r&oSD+ z=pb{fZ>nj>kxSuEsyM7}##3eT61FMp5 zu;s}A2d)HeC=-D}#t>g@Xvo1c^3!%4b#3{_s0A-Sw;&5j7^@~Opv;|bNc(pKR z#IZqAD*>vJE`(@^5028y*i725<~bL(qH#Le!XcIOr{j_ChBiI=E1n-A3udOa2#sZd zb5N$7O<~VJN$g1typ7)~?d(M@^kX1Fg~dJg7u;Vdi?uu0unI9vGIZAKPjtb>91*}j(8Q3Tb-|;xJH2>#sR8BKf?zpQ!WGmX{bBa#YwKpy`?w=j`Q1O znuO7hPmkFde;e8$oLmj_f(ow=1y*$Pi%%8@wSr0gG|tSn?z3@&^xS?PbHKED&mzeH zOByo5#GM;9sl|7!0ko2A5P^&f?oMW5x^@cI88`#;(pta$mZM>w6x_P3J&QExlavRN z<^@P%QSGEoP1=H<^AUeNz>clFOdmqzb30to{i;lSAO-lVSO>_wP()HJ)`IgukDtXc z2Q>D%Z>}((nH~YA!{lg-^&V}p4w2czLY@!gjUn9(I&l9=>X2rkETbtznEpK&V{$PTi4N|MBs*0AjNukwU45ef|GY*k6OxLx0Z-ci- zPO3MpdAWI4`WI#87lb>_x$wU<-SmnDx10u3%vD<3UWXYDes|Xj4Bn$ztrDYMnQyu& zk?Ptd`cIt1r`8kMx+C^&#mcVML;W>(A=dq(=2$kWr`g4F$=IkxHdu7Q6ky^=XH|K1 zuvf2A(dovB|zKsW3z`U<~Jcyev=QEdqEL75TrJi+6{(nS?w0pY->DdZ59}| zu>{K?86TD0{>VQ7@Xi^;4klHl8q>##K<-Zs&Wiz zAM)JG;ZW3iBV{67Rfi2HpKZdWjI^k1JlB6!m6aW`#9>XLn8XD~tAe69H)g%<(=o)8 zXji`=?L)=0B2=?3CQfqwRsW`UWso6MleXwfKlaHGqRIga{b{n=yfhp)XtjeyO7Q1Rf3!Q40(8-S{IHe zb*GYDnBw>3FeRlIOJ7C^BSXtysH%aj3{-OnRx7~pV3m)n!O2W^m-O4s2i24cT2RCR z%aq(8hQrFM+9;lpL}=fa^mIn2**BnN9{dxl$9IaZnZ||KnSM;&gC{W$Nopf$G0(fF zlkH1*7nPskh6JbY|Ar67UdkccZ;jZ>udt|OZwcbBHeCu&Y|BXB5vLyw|4{B^k{N5Yb}BE*#UtqvXX+aax=W;K z0Wu|SXHXo5SF&uE-7*ovJNRi^pyrTDq>c8tm727UXp-t_D~|hnV8?RQL?L@4Lm0*hRMl zpP*xY@QXnfM9eqmFlWkoDsPuChA@=%7fMB-%3?=m=(07S)&E+-2XbbJU_81HZs=F0 ztfumW`B0LII+G+_7usDbP~jV?o%813dUAw}${`5d(rvntnq$m=<;T(Ld}IxoJEoG? zT!$z37oXISCL?dmbWHB3Isc*Y|3j1i#9gdF|44OJuKXv&^>2|Ift63-l4j6Hoqx~P zac_N5d7lj8@8jAaRFLj|hk$-q;@ zRt^lxt-u&6EpTzFt;|>%IL5}oH>GnGvk2n%xHbXepo-93qO-gA^$b`TZ+xS zO!pdN8L%V_E>56W@DK1p7%i_c?*3DP489vnLq!&PZAh$16(?yBEju-mO!7kn(p(si zO;SdzUZtW^6c8V)IwnI=ksw?v#M#LxgQN#+%lsptR-=hDH4`5ZY9F+)#`G&hZVdbR zFrGlk1JgeC1vu3VgHeeK?^u=+LH`jJ^>H<`#d9JJm7)Wv%4*AlQiXoRdQp$YYyqxO ze+N$VN56Dygp{J^+{dZhiNtzp{%GLYU)aknKi^hBR;B7(0sWXI4=;^UrPTPs`i<$? zL(s6}#nGPcpyzn?fdqHvC)0XLd>YO!QA*Y-Oj~q`@C4E+MPde4YM;~!T7f<+4(y+4 zz$^AOJPCPZmzF!x7mO5AgvVL6Y&RzauIpr&BZn*qM5X(cvAMYHndiKlbd%9aW{8G1 z)PWl!M}sEcI|NPUbUJ_4m#b<*#ORU)f=Ax&{e}R2wO_ZqThK;9_L{)WjPdkc5nQoG7w^m$jXvl9_7WU((6vEc};w5{9O)npWxG za5b%X9<&*QqD3`Taq7;tr&hl$_sDL@671-x2>8qNflqWCnje7?Gy%3^9&15nI8{`- zh+nP6@^)(cA$iOgbh1(MeUvf=$e;R=dgJ47FHUQK>k%a`R=@@p-1HX!?vnr3o*wu= zXj87UgZL4k82JoAzXNiR^cfQeN$J%$z?~eNN_2FX>2AiP-!RUdvjy6`pTP)Tv!%4RreX;?u}&-C}I!BbW(I`fFuF74}Nu`0Vp-jJPj8n2awJTsQROj@Mo z5m#xSHL8-|Y`zD6Vk#wb^9-ZzMe%a5#+xXr@hT!|e!__|uE3JZ6&E}s7)AbkCH{P~4H#Ln^HO&vBH>%;4_j_|SCHFq~ zQo0^)fxo7jUJ$3&u=XuTdbsRTf~HmH`_KJpXlOLsgYl*O50zj+LDSc z;JwnH0qTd8Khfldon6tiKAZ|DIjXD=iPQ?V#tHg@YW+z{)w&lSQXN`1MH0C0{Vu;M zb~p8DnBVQPN+JZ%u8mOQl}Q19_TOprdOAHIN(<3F@GzK}p_(=rR0c=WQH3hengh=L zwILxMA+2e)qeun(*Q0qK2FN@k&uWPQ72)hGa4=dkB>ym^pv2A@lMq)K@PlC}Z|~Gd zYu`4P`C>jYgpH{*#}JD!M>CZ2`7(O7@Cq89uLL+}tcTuXnc-S+ycj|65kgF>_^x9%b++x>DoDHb z=ILmC$n!TW%u&p)t!Zp4QjE%2ZWR&}ky;2Pym8W=Z1BtMUpKa7BJhyCW6ScK{cSNi zh%PQdUySgRHFN383Uuf!4-M3$(V<*AbcERC-K>KyYdJjKJ)^DM6%oZ z-)Th3r8bA5z|vZCR6CVpz#aJGr6Lk$HLokK;&p;#;7NuE^^P-^UEEh~+@~GPsixA? zmSEA371a-)9M@7yZOp-dTDFI*KUvH_w3`^7D5u5G#-yRnOp7EU`;uV+L~1Jt6R?P{j0%HUghBc?k-@l#hd65CG?u286f!FqHvxZ-orP#Gz48 z{sk5!TYRf+NU3QX@YM%^CoHHb74@RnTKmOF7)nw--(Mj2U=R>)D1(GW0WfW8vXLQ? zS#^C{hlZJ!p^#FW{2s@7+k?VD6>t_1#~$rqAg}cxDvfdWhKmtZ-v!*kQg; z(95 z1_99LMliExv3SSc!nO)pjFR_@w?z=pc$bp*4IX6w#Qp&IG$r4h@frfC)b^`bOgZZAQ{Ma{Vq(f@jfDUCT z6JH98&978&X4%_z8e;H~;r_scL$i8Tx2fU(5x#8bwodR{KOeP>5U zd1AeO*bAS;Y>v0PPpDt6MdDOr3;RE0I;w)%eVxqP78h)i{O}xs5}t$_DA(4$vuC}2 z5swr3GRF{^l2-7uh?d9B$v>$!jK)YeB}U+LnxV|s)rjRg{gP(#q6H2*xZs*+(`k%2 zSo-DwvLR?9zt`P85C&6vE#8 z+Z8ki&xaNe{NmTm0Hudu87w~=*tj1GVqd{R)vqYN}ean#d>;}1+l?I^m#z%VtM$;d_VO;cjL(Jsz}trN5Hc%d#(kYAsOPy2;F{#{r%3w@|6%;fSf^sSu zoYw7kR&G$qAMolLE}O-aF+`<5h3|dWZ_2z4p98>afbjRs2*TIXt!sOa_!kX17m9vv zdI_m8e(Ryn_AXLXIl(Oaqdo*5P}C>`&)1L3@6&)LSV=~MZ&rK%q%W;?J}P(ou#3>h zSfF`ADu;OUskw*ql6MV&!(VN({6fl2C48(cjmKt14k;OpkuihHs4=(0ysCdi1n9u= z#7g+}Cw;O%2~Xwqr`P70jP-8p+lcqSqjgmP=nB23*90}Z77;-{j3mXHOjK|oLQJVf z@TBqXThCBP<&=iE>gQwpd=^i{V^ACl3T6|Ovi;^=FWf^Aw!J1PD7i{j(kM12?m0hvwJXLGC3H#)ujYMlCE4kIga8OK zFOk*V4MOsf3L2TmKespa$sp%G_$n*-?|_WPILj{ZwKgCrchQ2ON9WL`RsCvOp^saJ zdT?%&;4IY4RDW!NOuU%8vi>8 zqa5PtX<%p``WA#QQE8#X60CgutZVQ-M9Pxi#IO%LGXljEm;mMx^eE4v?ofedRn&;ZD#(1xZII2>{#4l>0-K6y33 zWd-0l*KCZNh)c4~eMik3t(?>KNf;%N+yvAkALR3uT)N49mU z7uK%wofdKB)eTJM38>KI9>=ah<5XjR@;J*$%)Yg{j?e|Mg=TzVgjrW2N?-2L2+19aX%hyOxzC|zNirayxRu{1@!#Ow;)9uXSX0WTD+hsG;KIQugIZc?+M z)BdH`;EDj6tB*6zxS_4LGe^X1X2H%!kMABWw?yPQh%KP=qN4f}^Bp&7#C#pE&qwY? zcK34wk0#rS0{pM{7jio!7Z)q>oN4IZ!fFd{Mf zsN!n+uVX&_rJ@$U0{U;yLqer|*vS+Isj9ivXa3Gi{LRZNm7eIPIn+H{{rapgD?fK> z#u+WrGDrGw$gffx%WIp=GGn=j3jWF$Rom6Xs7A;zaiFS+G`*gXp|ac(qZDO%=aUaP z8mwghkA)_VG&3~x7>B{E+CCq4u{3`&?HHPq@YLL6tl)R8IIjJMpvw2x^RZWK;W z55Br$?H0~nRF}N!>n{xC=_?GfrU4~&_fT)V!?eP<_ODb<$L$wLwxQVw(f?)c3kF3X zB?2)n>PE4tCo84H2)&de>Y8c7`laKb6**>A_gDKuSv%j~t_waVo*2ZgSdw`EXb>AG zKu%r((K7!hgmA|ISB$UT|C&I#fZ9x>*R)XC1a_K(srIMq9(O`-oSB##hbVoCD&VcM z);!u58he%2f#KvpbS>8JzsPJ$+eRIBzpolA%Ib?jCHG68t&NOjvK5ST#n@dRsBu(j zN^%7#i{koXZfr!9rZss+qiTD}3FL zqgg!$Vn~*wHZ2<|52Wua4wBEDSAHguB2J3vgN5b_V_$tYbB3OM^*=N3_%)nxr5)mY zor6@qjgf*!Yc6h%!?2syTDU5$h_-s0uLl%y+V_ZSwz0t{baB`7^>7(VFo}=@7|5UN|>(>qF3Y`X8&_u09xV=*h z;}Lyb>(?#aG8EQQtJYIJld63da@h~^Rre*$CTG!BvE0{ZY*#{wH=_e2T{%5pE0YXg zKl@Ag5U>iOJ^2sUT5|Y?42{U(AKwt{NU2c6A9&#>C|KVC_ipUcE2Q{65#{4zxSSB74pC2 zya94Pk6lZcZY^bsqD)QAw<9h$B3?Z=7O?Iw+)5Gzv`V=XMg!Up3ptc2ALFZYIX{P`8n`)Vs~0lB*}rmg%#U4SycbEXLRN|OQ3(pTsK*tCA;-xn>t=*cDK zDmaiTKgR<45Se3h4c7bk#6by|{7X@5_8Y)3l^?|I`KX23l{mMpl1Gu^13mU>T@F_@ z)Gn&J^n@{mCqalI=1F-#UjmAet~fU0eugM=mO literal 22978 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 Y?vIN;FV;|kw3&gH#troXHOr9y0X9TH1^@s6 diff --git a/icons/obj/handrail.dmi b/icons/obj/handrail.dmi new file mode 100644 index 0000000000000000000000000000000000000000..b2fb153e07d46ee2dd22e0ce61e8a06d32c86089 GIT binary patch literal 385 zcmV-{0e=38P)H05ey;B9;IE00DGTPE!Ct=GbNc003=zR9JLGWpiV4X>fFDZ*Bkp zc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LY zR3K9+BQY?O(p3`+M(y+AUsqcrzFOQDH6!S_-{k(wtw`OARKhlp5c z$2_P6kL%(yA(RCag3S!;tDH|b-lB@RZE6J#k0(xBy2Goq zp4x~6-IN!q5cLXXMgkYp*umV5l}}V*PJ$k7kt@ItmX8rwByjSBK6J1TgB&q#4=Xea f!8WLG`Xsyoe5?`?j1;PC00000NkvXXu0mjf+%1^+ literal 0 HcmV?d00001