From a840bd1cb1307fead534cb5af97fd29b806177de Mon Sep 17 00:00:00 2001 From: Kano <89972582+kano-dot@users.noreply.github.com> Date: Sat, 9 Aug 2025 15:21:52 +0300 Subject: [PATCH] Adds an engineering cart (#21110) ## About PR Sprites are ported from Paradise Station, made by McRamon. This cart is capable of holding the following: - 2x sheet stacks of each steel, glass and plasteel. - mechanical, electrical and emergency toolboxes, one each. - light replacer The one that spawns in engineering begins with all 3 toolboxes. This cart costs 15 plasteel to craft, 100 credits to order from cargo. Removes relevant toolboxes this cart spawns with in the department. ## Images Screenshot_4 https://github.com/user-attachments/assets/88e596ed-06e3-4047-89a8-452d1b13f466 ### Asset Licenses The following assets that **have not** been created by myself are included in this PR: | Path | Original Author | License | | --- | --- | --- | | icons/obj/engicart.dmi | McRamon (Paradise Station) | CC BY-SA 3.0 | --- aurorastation.dme | 1 + code/game/machinery/doors/door.dm | 2 +- code/game/objects/structures/engicart.dm | 445 ++++++++++++++++++ code/modules/cargo/items/engineering.dm | 14 + code/modules/materials/material_recipes.dm | 1 + code/modules/mob/mob_movement.dm | 2 +- .../kano-dot-engineering-cartening.yml | 6 + icons/obj/engicart.dmi | Bin 0 -> 1481 bytes maps/sccv_horizon/sccv_horizon.dmm | 36 +- 9 files changed, 484 insertions(+), 23 deletions(-) create mode 100644 code/game/objects/structures/engicart.dm create mode 100644 html/changelogs/kano-dot-engineering-cartening.yml create mode 100644 icons/obj/engicart.dmi diff --git a/aurorastation.dme b/aurorastation.dme index 82f6b3ebbe6..25e6325166e 100644 --- a/aurorastation.dme +++ b/aurorastation.dme @@ -1407,6 +1407,7 @@ #include "code\game\objects\structures\displaycase.dm" #include "code\game\objects\structures\door_assembly.dm" #include "code\game\objects\structures\ECD.dm" +#include "code\game\objects\structures\engicart.dm" #include "code\game\objects\structures\extinguisher.dm" #include "code\game\objects\structures\fireaxe_cabinet.dm" #include "code\game\objects\structures\flags_banners.dm" diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 4a0925f3091..cd0805f2661 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -194,7 +194,7 @@ else do_animate("deny") return - if(istype(bumped_atom, /obj/structure/janitorialcart)) + if(istype(bumped_atom, /obj/structure/janitorialcart) || istype(bumped_atom, /obj/structure/engineeringcart)) var/obj/structure/janitorialcart/cart = bumped_atom if(density) if(cart.pulling && (src.allowed(cart.pulling))) diff --git a/code/game/objects/structures/engicart.dm b/code/game/objects/structures/engicart.dm new file mode 100644 index 00000000000..70b76778cc1 --- /dev/null +++ b/code/game/objects/structures/engicart.dm @@ -0,0 +1,445 @@ +/obj/structure/engineeringcart + name = "engineering cart" + desc = "A cart for your engineering-related storage needs." + icon = 'icons/obj/engicart.dmi' + icon_state = "cart" + anchored = FALSE + density = TRUE + climbable = TRUE + build_amt = 15 + material = DEFAULT_TABLE_REINF_MATERIAL + slowdown = 0 + var/has_items = FALSE + + var/list/my_glass = list() + var/list/my_metal = list() + var/list/my_plasteel = list() + /// Used for displaying and handling radial menu. Collective list of every single item this object contains. + var/list/storage_contents = list() + var/obj/item/device/lightreplacer/my_lightreplacer = null + var/obj/item/storage/toolbox/mechanical/my_blue_toolbox = null + var/obj/item/storage/toolbox/electrical/my_yellow_toolbox = null + var/obj/item/storage/toolbox/emergency/my_red_toolbox = null + var/driving + var/mob/living/pulling + /// Amount of stacks the cart is capable to store. + var/stack_capacity = 2 + + var/static/list/allowed_types = typecacheof(list( + /obj/item/stack/material/glass, + /obj/item/stack/material/steel, + /obj/item/stack/material/plasteel, + /obj/item/device/lightreplacer, + /obj/item/storage/toolbox/mechanical, + /obj/item/storage/toolbox/electrical, + /obj/item/storage/toolbox/emergency + )) + +/obj/structure/engineeringcart/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "You can use steel, plasteel, glass sheets, toolboxes and light replacers on the cart to store them." + . += "\ + You can CTRL-Click to start dragging this cart. This object has a special dragging behaviour: when dragged, character's movement \ + directs the cart and the character is subsequently pulled by it. \ + " + +/obj/structure/engineeringcart/disassembly_hints(mob/user, distance, is_adjacent) + . += ..() + . += "An empty engineering cart can be taken apart with a wrench or a welder. Or a plasma cutter, if you're that hardcore." + +/obj/structure/engineeringcart/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(distance <= 1) + if(locate(/obj/item/stack/material) in storage_contents) + var/metal_amount + var/plasteel_amount + var/glass_amount + var/obj/item/stack/material/steel/S + var/obj/item/stack/material/plasteel/P + var/obj/item/stack/material/glass/G + if(LAZYLEN(my_metal)) + for(var/I in my_metal) // we already handle the type-check in `atttackby()` so it's safe to assume the lists contain what they're intended to + S = I + metal_amount += S.amount + . += "[icon2html(S, user)] This cart contains [metal_amount] sheet\s of steel!" + if(LAZYLEN(my_plasteel)) + for(var/I in my_plasteel) + P = I + plasteel_amount += P.amount + . += "[icon2html(P, user)] This cart contains [plasteel_amount] sheet\s of plasteel!" + if(LAZYLEN(my_glass)) + for(var/I in my_glass) + G = I + glass_amount += G.amount + . += "[icon2html(G, user)] This cart contains [glass_amount] sheet\s of glass!" + else + . += "[icon2html(src, user)] There is no material in this cart!" + +/obj/structure/engineeringcart/proc/get_storage_contents_list() + storage_contents.Cut() + var/list/lists_to_check = list( + my_glass, my_metal, my_plasteel + ) + for(var/list/list_to_check in lists_to_check) + if(list_to_check?.len) //null check + storage_contents += list_to_check + + var/list/non_sheet_objects = list(my_lightreplacer, my_blue_toolbox, my_yellow_toolbox, my_red_toolbox) + + for(var/obj/O in non_sheet_objects) + if(O) + storage_contents += O + +/obj/structure/engineeringcart/Destroy() + QDEL_NULL(my_glass) + QDEL_NULL(my_metal) + QDEL_NULL(my_plasteel) + QDEL_NULL(my_lightreplacer) + QDEL_NULL(my_blue_toolbox) + QDEL_NULL(my_yellow_toolbox) + QDEL_NULL(my_red_toolbox) + return ..() + +/obj/structure/engineeringcart/attackby(obj/item/attacking_item, mob/user) + if(is_type_in_typecache(attacking_item, allowed_types)) + var/should_store = FALSE + var/storage_is_full = FALSE + if(istype(attacking_item, /obj/item/stack/material)) //---- stack materials + switch(attacking_item.type) + if(/obj/item/stack/material/glass, /obj/item/stack/material/glass/full) + if(my_glass.len < stack_capacity) + my_glass += attacking_item + should_store = TRUE + else + storage_is_full = TRUE + + if(/obj/item/stack/material/steel, /obj/item/stack/material/steel/full) + if(my_metal.len < stack_capacity) + my_metal += attacking_item + should_store = TRUE + else + storage_is_full = TRUE + + if(/obj/item/stack/material/plasteel, /obj/item/stack/material/plasteel/full) + if(my_plasteel.len < stack_capacity) + my_plasteel += attacking_item + should_store = TRUE + else + storage_is_full = TRUE + + handle_storing(attacking_item, user, should_store, storage_is_full) + return TRUE + + if(istype(attacking_item, /obj/item/storage/toolbox)) //---- toolboxes + switch(attacking_item.type) + if(/obj/item/storage/toolbox/mechanical) + if(!my_blue_toolbox) + my_blue_toolbox = attacking_item + should_store = TRUE + else + storage_is_full = TRUE + + if(/obj/item/storage/toolbox/electrical) + if(!my_yellow_toolbox) + my_yellow_toolbox = attacking_item + should_store = TRUE + else + storage_is_full = TRUE + + if(/obj/item/storage/toolbox/emergency) + if(!my_red_toolbox) + my_red_toolbox = attacking_item + should_store = TRUE + else + storage_is_full = TRUE + + handle_storing(attacking_item, user, should_store, storage_is_full) + return TRUE + + if(istype(attacking_item, /obj/item/device/lightreplacer)) //---- light replacer + if(!my_lightreplacer) + my_lightreplacer = attacking_item + should_store = TRUE + else + storage_is_full = TRUE + + handle_storing(attacking_item, user, should_store, storage_is_full) + return TRUE + + else if (!has_items && (attacking_item.iswrench() || attacking_item.iswelder() || istype(attacking_item, /obj/item/gun/energy/plasmacutter))) + take_apart(user, attacking_item) + return + ..() + +// copied from janicart code +/obj/structure/engineeringcart/proc/take_apart(var/mob/user = null, var/obj/I) + if(has_items) + spill() + + if(user) + + if(iswelder(I)) + var/obj/item/welder = I + welder.play_tool_sound(get_turf(src), 50) + + user.visible_message("[user] starts taking apart the [src]...", SPAN_NOTICE("You start disassembling the [src]...")) + if (!do_after(user, 30, do_flags = DO_DEFAULT & ~DO_USER_SAME_HAND)) + return + + dismantle() + +/obj/structure/engineeringcart/ex_act(severity) + spill(100 / severity) + ..() + +/obj/structure/engineeringcart/proc/spill(var/chance = 100) + var/turf/dropspot = get_turf(src) + if(LAZYLEN(my_glass) && prob(chance)) + var/obj/item/stack/material/glass/G + for(var/I in my_glass) + G = I + G.forceMove(dropspot) + G.tumble(1) + my_glass -= G + my_glass.Cut() + + if(LAZYLEN(my_metal) && prob(chance)) + var/obj/item/stack/material/glass/M + for(var/I in my_metal) + M = I + M.forceMove(dropspot) + M.tumble(1) + my_metal -= M + my_metal.Cut() + + if(LAZYLEN(my_plasteel) && prob(chance)) + var/obj/item/stack/material/glass/P + for(var/I in my_plasteel) + P = I + P.forceMove(dropspot) + P.tumble(1) + my_plasteel -= P + my_plasteel.Cut() + + if(my_lightreplacer && prob(chance)) + my_lightreplacer.forceMove(dropspot) + my_lightreplacer.tumble(2) + my_lightreplacer = null + + if(my_blue_toolbox && prob(chance)) + my_blue_toolbox.forceMove(dropspot) + my_blue_toolbox.tumble(2) + my_blue_toolbox = null + + if(my_yellow_toolbox && prob(chance)) + my_yellow_toolbox.forceMove(dropspot) + my_yellow_toolbox.tumble(2) + my_yellow_toolbox = null + + if(my_red_toolbox && prob(chance)) + my_red_toolbox.forceMove(dropspot) + my_red_toolbox.tumble(2) + my_red_toolbox = null + + update_icon() + +/obj/structure/engineeringcart/proc/handle_storing(var/attacking_item, var/mob/user, var/should_store, var/storage_is_full) + if(should_store) + user.drop_from_inventory(attacking_item, src) + get_storage_contents_list() + update_icon() + to_chat(user, SPAN_NOTICE("You put [attacking_item] into [src].")) + else if(storage_is_full) + to_chat(user, SPAN_WARNING("There isn't any space to store [attacking_item] in [src]!")) + else + to_chat(user, SPAN_WARNING("You can't store this here!")) + +/obj/structure/engineeringcart/attack_hand(mob/user) + if(!isliving(user)) + return + + if(LAZYLEN(storage_contents)) + for(var/obj/O in storage_contents) + storage_contents[O] = image(O.icon, O.icon_state) + + var/obj/item/chosen_item = show_radial_menu(user, src, storage_contents, require_near = TRUE, tooltips = TRUE) + + if(isnull(chosen_item)) + return + if(chosen_item in storage_contents) + switch(chosen_item.type) + if(/obj/item/stack/material/glass, /obj/item/stack/material/glass/full) + if(my_glass.len) + user.put_in_hands(chosen_item) + to_chat(user, SPAN_NOTICE("You take [my_glass[chosen_item]] from [src].")) + my_glass -= chosen_item + if(/obj/item/stack/material/steel, /obj/item/stack/material/steel/full) + if(my_metal.len) + user.put_in_hands(chosen_item) + to_chat(user, SPAN_NOTICE("You take [my_metal[chosen_item]] from [src].")) + my_metal -= chosen_item + if(/obj/item/stack/material/plasteel, /obj/item/stack/material/plasteel/full) + if(my_plasteel.len) + user.put_in_hands(chosen_item) + to_chat(user, SPAN_NOTICE("You take [my_plasteel[chosen_item]] from [src].")) + my_plasteel -= chosen_item + if(/obj/item/device/lightreplacer) + if(my_lightreplacer) + user.put_in_hands(my_lightreplacer) + to_chat(user, SPAN_NOTICE("You take [my_lightreplacer] from [src].")) + my_lightreplacer = null + if(/obj/item/storage/toolbox/mechanical) + if(my_blue_toolbox) + user.put_in_hands(my_blue_toolbox) + to_chat(user, SPAN_NOTICE("You take [my_blue_toolbox] from [src].")) + my_blue_toolbox = null + if(/obj/item/storage/toolbox/electrical) + if(my_yellow_toolbox) + user.put_in_hands(my_yellow_toolbox) + to_chat(user, SPAN_NOTICE("You take [my_yellow_toolbox] from [src].")) + my_yellow_toolbox = null + if(/obj/item/storage/toolbox/emergency) + if(my_red_toolbox) + user.put_in_hands(my_red_toolbox) + to_chat(user, SPAN_NOTICE("You take [my_red_toolbox] from [src].")) + my_red_toolbox = null + + get_storage_contents_list() + update_icon() + else + to_chat(user, SPAN_WARNING("\The [chosen_item] is not in the cart anymore!")) + +/obj/structure/engineeringcart/update_icon() + ClearOverlays() + has_items = FALSE + if(my_plasteel.len) + AddOverlays("cart_plasteel") + has_items = TRUE + if(my_metal.len) + AddOverlays("cart_metal") + has_items = TRUE + if(my_glass.len) + AddOverlays("cart_glass") + has_items = TRUE + if(my_lightreplacer) + AddOverlays("cart_flashlight") + has_items = TRUE + if(my_blue_toolbox) + AddOverlays("cart_bluetoolbox") + has_items = TRUE + if(my_yellow_toolbox) + AddOverlays("cart_yellowtoolbox") + has_items = TRUE + if(my_red_toolbox) + AddOverlays("cart_redtoolbox") + has_items = TRUE + + +/// For future reference, this kind of pulling functions are dependant on a type-check in `mob_movement.dm` line:332 +/obj/structure/engineeringcart/relaymove(mob/living/user, direction) + . = ..() + + if(user.stat || user.stunned || user.weakened || user.paralysis || user.lying || user.restrained()) + if(user==pulling) + pulling = null + user.pulledby = null + to_chat(user, SPAN_WARNING("You lost your grip!")) + return + if(user.pulling && (user == pulling)) + pulling = null + user.pulledby = null + return + if(pulling && (get_dist(src, pulling) > 1)) + pulling = null + user.pulledby = null + if(user==pulling) + return + if(pulling && (get_dir(src.loc, pulling.loc) == direction)) + to_chat(user, SPAN_WARNING("You cannot go there.")) + return + + driving = 1 + var/turf/T = null + if(pulling) + T = pulling.loc + if(get_dist(src, pulling) >= 1) + step(pulling, get_dir(pulling.loc, src.loc)) + step(src, direction) + set_dir(direction) + if(pulling) + if(pulling.loc == src.loc) + pulling.forceMove(T) + else + spawn(0) + if(get_dist(src, pulling) > 1) + pulling = null + user.pulledby = null + pulling.set_dir(get_dir(pulling, src)) + driving = 0 + +/obj/structure/engineeringcart/Move() + . = ..() + if (pulling && (get_dist(src, pulling) > 1)) + pulling.pulledby = null + to_chat(pulling, SPAN_WARNING("You lost your grip!")) + pulling = null + if(has_gravity()) + playsound(src, 'sound/effects/roll.ogg', 50, 1) + +/obj/structure/engineeringcart/CtrlClick(var/mob/user) + if(in_range(src, user)) + if(!ishuman(user)) return + if(!pulling) + pulling = user + user.pulledby = src + if(user.pulling) + user.stop_pulling() + user.set_dir(get_dir(user, src)) + to_chat(user, "You grip \the [name]'s handles.") + else + to_chat(usr, "You let go of \the [name]'s handles.") + pulling.pulledby = null + pulling = null + return + +/obj/structure/engineeringcart/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) + if(air_group || (height==0)) + return TRUE + if(mover?.movement_type & PHASING) + return TRUE + if(istype(mover) && mover.pass_flags & PASSTABLE) + return TRUE + if(istype(mover, /mob/living) && mover == pulling) + return TRUE + else + if(istype(mover, /obj/projectile)) + return prob(30) + else + return !density + +/obj/structure/engineeringcart/half_filled + +/obj/structure/engineeringcart/half_filled/Initialize() + . = ..() + my_blue_toolbox = new /obj/item/storage/toolbox/mechanical(src) + my_yellow_toolbox = new /obj/item/storage/toolbox/electrical(src) + my_red_toolbox = new /obj/item/storage/toolbox/emergency(src) + get_storage_contents_list() + update_icon() + +/obj/structure/engineeringcart/full + +/obj/structure/engineeringcart/full/Initialize() + . = ..() + my_lightreplacer = new /obj/item/device/lightreplacer(src) + my_blue_toolbox = new /obj/item/storage/toolbox/mechanical(src) + my_yellow_toolbox = new /obj/item/storage/toolbox/electrical(src) + my_red_toolbox = new /obj/item/storage/toolbox/emergency(src) + my_glass += new /obj/item/stack/material/glass/full(src) + my_glass += new /obj/item/stack/material/glass/full(src) + my_metal += new /obj/item/stack/material/steel/full(src) + my_metal += new /obj/item/stack/material/steel/full(src) + my_plasteel += new /obj/item/stack/material/plasteel/full(src) + my_plasteel += new /obj/item/stack/material/plasteel/full(src) + get_storage_contents_list() + update_icon() diff --git a/code/modules/cargo/items/engineering.dm b/code/modules/cargo/items/engineering.dm index 11d721efa1f..793d8ff94b2 100644 --- a/code/modules/cargo/items/engineering.dm +++ b/code/modules/cargo/items/engineering.dm @@ -895,3 +895,17 @@ container_type = "crate" groupable = FALSE spawn_amount = 1 + +/singleton/cargo_item/engineeringcart + category = "engineering" + name = "engineering cart" + supplier = "hephaestus" + description = "A cart for your engineering-related storage needs." + price = 100 + items = list( + /obj/structure/engineeringcart + ) + access = ACCESS_ENGINE + container_type = "crate" + groupable = TRUE + spawn_amount = 1 diff --git a/code/modules/materials/material_recipes.dm b/code/modules/materials/material_recipes.dm index a6abafdb868..26c452f42f3 100644 --- a/code/modules/materials/material_recipes.dm +++ b/code/modules/materials/material_recipes.dm @@ -72,6 +72,7 @@ list( new /datum/stack_recipe("key", /obj/item/key, 1, time = 10, one_per_turf = 0, on_floor = 1), new /datum/stack_recipe("custodial cart", /obj/structure/janitorialcart, BUILD_AMT, time = 120, one_per_turf = 1, on_floor = 1), + new /datum/stack_recipe("engineering cart", /obj/structure/engineeringcart, BUILD_AMT, time = 120, one_per_turf = 1, on_floor = 1), new /datum/stack_recipe("steel closet", /obj/structure/closet, BUILD_AMT, time = 15, one_per_turf = 1, on_floor = 1), new /datum/stack_recipe("canister", /obj/machinery/portable_atmospherics/canister, 10, time = 15, one_per_turf = 1, on_floor = 1), new /datum/stack_recipe("target stake", /obj/structure/target_stake, BUILD_AMT, time = 15, one_per_turf = 1, on_floor = 1), diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 3756eb4f261..59fb6e6773c 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -329,7 +329,7 @@ //Wheelchair pushing goes here for now. //TODO: Fuck wheelchairs. - if(istype(mob.pulledby, /obj/structure/bed/stool/chair/office/wheelchair) || istype(mob.pulledby, /obj/structure/janitorialcart)) + if(istype(mob.pulledby, /obj/structure/bed/stool/chair/office/wheelchair) || istype(mob.pulledby, /obj/structure/janitorialcart) || istype(mob.pulledby, /obj/structure/engineeringcart)) var/obj/structure/S = mob.pulledby move_delay += S.slowdown return mob.pulledby.relaymove(mob, direct) diff --git a/html/changelogs/kano-dot-engineering-cartening.yml b/html/changelogs/kano-dot-engineering-cartening.yml new file mode 100644 index 00000000000..f41b77050f0 --- /dev/null +++ b/html/changelogs/kano-dot-engineering-cartening.yml @@ -0,0 +1,6 @@ +author: Kano + +delete-after: True + +changes: + - rscadd: "Added an engineering cart. Its sprites are ported from Paradise Station." diff --git a/icons/obj/engicart.dmi b/icons/obj/engicart.dmi new file mode 100644 index 0000000000000000000000000000000000000000..a73dbf5923d086a50b7486c1428937288490a295 GIT binary patch literal 1481 zcmYjR2~ZMP80J#(Oe>EZLen*m)GQ*@w8%X2Li0+~v?NX2yk!yGge*LEH?_@N$#cC* zQ7BE(qE)f=%A;0Y+gQ(nOcE6(l@u0hn%RHmy>I?+-uKP-&ztwMy)iDTO1eq_06^9C zw4;vP#WT>sFmE@{eLeO;3GO$A;Jzbm)VM&K?J>frwtoOP0 zx*o%JESeb^A-$-BMc`i%HfQ$0+;ogB)M1vEHiREZzm-&I?$(CE_8mdm&orWoVl-C= z<5+q7&xS+}3_P%m%nyG!S@epJv_d#IoYMBXmXeZMR#t9mY8DfH)!*BIi= zB>5<=rH4vqJe$-Zj2oa84g6DCIAF35#utF*y^fSM)kMF*WXFgkY+`hLa&%lQ0FY9A z_x4jYwv~$0`*#N_esEz0XpJi2qDa8D=P?Ft5F<-UyYcnx?1vKvO0X{yYjZ@kANmzr)h&@0#c}!Q5-_fCiO#lv4cE1tl!A#|M?5bgHWDMC4_70s{ zgcI0kb(QK8!luqfUM8j&O_;O5L_GI+Qz_wh8}Dr6X8P1Up-oN^fV8o+vhO6HJOBWQ zg{$L9zm(#I!k+_Xt#od>hQFGnL(}CBnxxY!8kHBN@tnu2rJua+{MDGstIWhA`i_j` zAE_A!8>?W=B{f&5pHaZ~1~VT$;12PE)z9@k;%mk)D}~UZu26MbZW(uTmeqLQ$QD1* zc|pH@^R3VaE-5R1qz}M`^k*ib>gPyKz&c$2iSc&5yNdnEGmT}GVe~37N3Ua9blm~( zq(gpbDvboGq}fuu_M@}m3MS*G(hShUbW$25pLhk*pDfdMDjSf`Y12EQt>x|jV6}@r%2QqxaSAh^-;NBo zhKW~_*`j8<5Sv`RNw9sXY3_8I`^ouy5(1cE>TF0***Y5`+^=O|>6HcY;PpK2f@oq7i1;KCP8j4fYJMGoHtNH7}3VBRJl)JVw`uEGuKA{?S5<$`Mp4(1lD+yTY0)KA>YBZ|luXE(`l1l%9_SRI<-^S^&uR?T3ilFM| zzUfl2CF4f38y(!K%M%|KlU|`2OUw+LF7~;I!gEn_#MlPkV8&9MKG`>rW=&PIrZi(> zp0THn1F&|?fSC`TMd)EVZl13xQMICCh|H0$zSX1FalTAJJD&fiM5rX$sB)Un9WJWb z@;@WY5E|7&fcml1QEcJwfj1;nBe@QQ?W>cDhGJ!2y&1qM1wMSV_ud*mMpwUK?Wd zX&ie|1hqIl!4Au%j2Zgv(SK>NDHB-!0yfWbiPErh=#~%%cwXHjb0e(8oE^!^B+p31 z2ugKq+ZiZ(sNahGj<6vVHsvggePg!0`b^x&G{)8r%etl(ura|Nh4g z8M(DF1b!_T#=|=bhCSz9S~jkpXGV&s&W99XLCnY|x5^YqPW=~CGKtDqWOUEht=dY0 z@ihMek+k8OTpitw@wOc&-A$yKA^re>)OF<7=^EuvzS8HN$l*Z(&{JJt9sjG20rfV2 z5qg2iiB{16V#V1?3xk%M{4e+P3Gy2fs)3{RPQbW0@we=H_N`5+@>}HFq_Kfa+M!@vJR`K4bM`P*(+mx#l#*yxDA^krvlelF7 literal 0 HcmV?d00001 diff --git a/maps/sccv_horizon/sccv_horizon.dmm b/maps/sccv_horizon/sccv_horizon.dmm index 94c35d12a87..76de371a331 100644 --- a/maps/sccv_horizon/sccv_horizon.dmm +++ b/maps/sccv_horizon/sccv_horizon.dmm @@ -29291,6 +29291,10 @@ /obj/item/stack/material/plastic/full, /obj/item/stack/material/wood/full, /obj/effect/floor_decal/industrial/outline/yellow, +/obj/machinery/camera/network/engineering{ + c_tag = "Engineering - Equipment Storage"; + dir = 8 + }, /turf/simulated/floor/tiled, /area/horizon/engineering/storage_eva) "edk" = ( @@ -48586,6 +48590,9 @@ icon_state = "0-4" }, /obj/machinery/power/apc/north, +/obj/machinery/light{ + dir = 8 + }, /turf/simulated/floor/tiled, /area/horizon/engineering/hallway/fore) "gRg" = ( @@ -57892,7 +57899,6 @@ /obj/structure/cable/green{ icon_state = "4-8" }, -/obj/machinery/light, /obj/effect/floor_decal/corner/yellow{ dir = 10 }, @@ -109962,9 +109968,6 @@ /obj/effect/floor_decal/spline/plain, /obj/structure/table/reinforced/steel, /obj/item/storage/toolbox/electrical{ - pixel_y = 8 - }, -/obj/item/storage/toolbox/mechanical{ pixel_y = 1 }, /turf/simulated/floor/carpet/rubber, @@ -146493,9 +146496,6 @@ /obj/item/storage/toolbox/electrical{ pixel_y = 4 }, -/obj/item/storage/toolbox/electrical{ - pixel_y = -1 - }, /obj/item/device/multitool{ pixel_x = -4 }, @@ -155812,15 +155812,13 @@ /turf/simulated/floor/tiled/dark, /area/horizon/shuttle/mining) "wgu" = ( -/obj/random/pottedplant, -/obj/effect/floor_decal/corner/dark_green/full{ - dir = 8 +/obj/machinery/light, +/obj/effect/floor_decal/industrial/outline/engineering, +/obj/structure/engineeringcart/half_filled{ + dir = 4 }, -/obj/machinery/light{ - dir = 1 - }, -/turf/simulated/floor/tiled, -/area/horizon/engineering/hallway/fore) +/turf/simulated/floor/tiled/dark/full, +/area/horizon/engineering/storage_eva) "wgy" = ( /obj/effect/floor_decal/spline/fancy/wood{ dir = 1 @@ -168520,10 +168518,6 @@ }, /area/centcom/holding) "xUV" = ( -/obj/machinery/camera/network/engineering{ - c_tag = "Engineering - Equipment Storage"; - dir = 8 - }, /obj/effect/floor_decal/corner/yellow/full{ dir = 4 }, @@ -264830,7 +264824,7 @@ hBD cFv wPF iii -tcG +wgu wVZ wVZ nWO @@ -265088,7 +265082,7 @@ ede gIA xGY tcG -wgu +wVZ oPY ipB xlm