diff --git a/_maps/map_files/generic/centcomm.dmm b/_maps/map_files/generic/centcomm.dmm
index 9425580a44c..ac60ce1a351 100644
--- a/_maps/map_files/generic/centcomm.dmm
+++ b/_maps/map_files/generic/centcomm.dmm
@@ -9330,12 +9330,12 @@
/turf/simulated/floor/mineral/plastitanium/red,
/area/shuttle/administration)
"GV" = (
-/obj/item/rcl/pre_loaded,
-/obj/item/rcl/pre_loaded,
-/obj/item/rcl/pre_loaded,
-/obj/item/rcl/pre_loaded,
-/obj/item/rcl/pre_loaded,
-/obj/item/rcl/pre_loaded,
+/obj/item/rcl,
+/obj/item/rcl,
+/obj/item/rcl,
+/obj/item/rcl,
+/obj/item/rcl,
+/obj/item/rcl,
/obj/structure/shelf/engineering,
/turf/simulated/floor/plasteel/dark,
/area/centcom/specops)
diff --git a/_maps/map_files/stations/boxstation.dmm b/_maps/map_files/stations/boxstation.dmm
index fec16adddc3..47652584299 100644
--- a/_maps/map_files/stations/boxstation.dmm
+++ b/_maps/map_files/stations/boxstation.dmm
@@ -38372,6 +38372,7 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
},
+/obj/item/rcl,
/turf/simulated/floor/plasteel,
/area/station/engineering/equipmentstorage)
"cRR" = (
diff --git a/_maps/map_files/stations/cerestation.dmm b/_maps/map_files/stations/cerestation.dmm
index d9dd1b8f755..17bb7566e2f 100644
--- a/_maps/map_files/stations/cerestation.dmm
+++ b/_maps/map_files/stations/cerestation.dmm
@@ -20046,6 +20046,7 @@
/obj/effect/turf_decal/tiles/department/engineering/side{
dir = 8
},
+/obj/item/rcl,
/turf/simulated/floor/plasteel,
/area/station/engineering/break_room)
"dfG" = (
@@ -40934,10 +40935,10 @@
/area/station/security/execution)
"hMv" = (
/obj/structure/table,
-/obj/item/storage/fancy/cigarettes/cigpack_robust,
/obj/structure/cable/yellow{
icon_state = "4-8"
},
+/obj/item/rcl,
/turf/simulated/floor/plasteel,
/area/station/engineering/break_room)
"hMA" = (
@@ -62077,6 +62078,10 @@
/obj/structure/cable{
icon_state = "4-8"
},
+/obj/item/storage/fancy/cigarettes/cigpack_robust{
+ pixel_x = -8;
+ pixel_y = 11
+ },
/turf/simulated/floor/plasteel,
/area/station/engineering/break_room)
"mkh" = (
diff --git a/_maps/map_files/stations/deltastation.dmm b/_maps/map_files/stations/deltastation.dmm
index dc2a3bc8c14..876a947d379 100644
--- a/_maps/map_files/stations/deltastation.dmm
+++ b/_maps/map_files/stations/deltastation.dmm
@@ -52482,6 +52482,12 @@
},
/turf/simulated/floor/plasteel,
/area/station/security/permabrig)
+"foI" = (
+/obj/structure/table/reinforced,
+/obj/effect/turf_decal/tiles/neutral,
+/obj/item/rcl,
+/turf/simulated/floor/plasteel,
+/area/station/engineering/break_room)
"foU" = (
/obj/structure/table/reinforced,
/obj/item/radio/intercom{
@@ -124261,7 +124267,7 @@ bwX
bIA
bIA
bEV
-xbY
+foI
ttF
bQp
bIA
diff --git a/_maps/map_files/stations/emeraldstation.dmm b/_maps/map_files/stations/emeraldstation.dmm
index 3f1289891ae..7f32ff1617f 100644
--- a/_maps/map_files/stations/emeraldstation.dmm
+++ b/_maps/map_files/stations/emeraldstation.dmm
@@ -40363,6 +40363,7 @@
pixel_x = -3;
pixel_y = 3
},
+/obj/item/rcl,
/turf/simulated/floor/plasteel,
/area/station/engineering/equipmentstorage)
"idP" = (
diff --git a/_maps/map_files/stations/metastation.dmm b/_maps/map_files/stations/metastation.dmm
index 475c39f6203..22990c84e84 100644
--- a/_maps/map_files/stations/metastation.dmm
+++ b/_maps/map_files/stations/metastation.dmm
@@ -71554,10 +71554,10 @@
/area/station/engineering/atmos)
"rxV" = (
/obj/structure/table/reinforced,
-/obj/effect/spawner/random/trash,
/obj/effect/turf_decal/tiles/department/engineering/side{
dir = 8
},
+/obj/item/rcl,
/turf/simulated/floor/plasteel/dark,
/area/station/engineering/equipmentstorage)
"rye" = (
diff --git a/code/__DEFINES/construction_defines.dm b/code/__DEFINES/construction_defines.dm
index 70b09adcc0b..509116e9702 100644
--- a/code/__DEFINES/construction_defines.dm
+++ b/code/__DEFINES/construction_defines.dm
@@ -91,3 +91,5 @@
#define MAX_STACK_SIZE 50
/// maximum amount of cable in a coil
#define MAXCOIL 30
+/// maximum amount of cable in a RCL spool
+#define RCL_MAX_SPOOL_SIZE 90
diff --git a/code/game/objects/items/RCL.dm b/code/game/objects/items/RCL.dm
index 5b504446ad8..5113276a52c 100644
--- a/code/game/objects/items/RCL.dm
+++ b/code/game/objects/items/RCL.dm
@@ -1,49 +1,67 @@
/obj/item/rcl
name = "rapid cable layer (RCL)"
- desc = "A device used to rapidly deploy cables. It has screws on the side which can be removed to slide off the cables."
- icon = 'icons/obj/tools.dmi'
- icon_state = "rcl-0"
- inhand_icon_state = "rcl-0"
- force = 5 //Plastic is soft
+ desc = "An electrician's best friend, this plastic spool can hold a large amount of cable and rapidly lay it down."
+ icon = 'icons/obj/rcl.dmi'
+ icon_state = "rcl"
+ inhand_icon_state = "rcl"
throwforce = 5
- throw_speed = 1
origin_tech = "engineering=4;materials=2"
materials = list(MAT_METAL = 5000)
- var/max_amount = 90
var/active = FALSE
- var/obj/structure/cable/last = null
- var/obj/item/stack/cable_coil/loaded = null
+ var/obj/structure/cable/last
+ var/obj/item/stack/cable_coil/random/rcl_spool/loaded
new_attack_chain = TRUE
/obj/item/rcl/Initialize(mapload)
. = ..()
+ loaded = new()
AddComponent(/datum/component/two_handed)
+ update_icon(UPDATE_ICON_STATE|UPDATE_OVERLAYS)
+
+/obj/item/rcl/examine(mob/user)
+ . = ..()
+ if(loaded.amount)
+ . += SPAN_NOTICE("It contains [loaded.amount]/[RCL_MAX_SPOOL_SIZE] cables.")
+ else
+ . += SPAN_WARNING("It's empty!")
+ . += SPAN_NOTICE("Use in-hand to swap to [active ? "standard" : "Rapid Cable Laying"] mode.")
/obj/item/rcl/item_interaction(mob/living/user, obj/item/used, list/modifiers)
if(!istype(used, /obj/item/stack/cable_coil))
return ..()
var/obj/item/stack/cable_coil/coil = used
- if(!loaded)
- if(!user.transfer_item_to(coil, src))
- to_chat(user, SPAN_WARNING("[coil] is stuck to your hand!"))
- return ITEM_INTERACT_COMPLETE
- loaded = coil
- loaded.max_amount = max_amount //We store a lot.
- else
- if(loaded.amount >= max_amount)
- to_chat(user, SPAN_WARNING("You cannot fit any more cable on [src]!"))
- return ITEM_INTERACT_COMPLETE
-
- var/amount = min(loaded.amount + coil.get_amount(), max_amount)
- coil.use(amount - loaded.amount)
- loaded.amount = amount
- refresh_icon(user)
- to_chat(user, SPAN_NOTICE("You add the cables to [src]. It now contains [loaded.amount]."))
+ if(loaded.amount >= RCL_MAX_SPOOL_SIZE)
+ to_chat(user, SPAN_WARNING("You cannot fit any more cable on [src]!"))
return ITEM_INTERACT_COMPLETE
+ // When loading an empty cable spool, turn it into either standard or heavy based on what we're loading.
+ if(!loaded.amount)
+ loaded.color = coil.color
+ loaded.cable_type = coil.cable_type
+ loaded.cable_merge_id = coil.cable_merge_id
+ else if(loaded.cable_merge_id != coil.cable_merge_id)
+ to_chat(user, SPAN_WARNING("These coils are of different types!"))
+ return ITEM_INTERACT_COMPLETE
+
+ var/amount = min(loaded.amount + coil.get_amount(), RCL_MAX_SPOOL_SIZE)
+ coil.use(amount - loaded.amount)
+ loaded.amount = amount
+ refresh_icon(user)
+ to_chat(user, SPAN_NOTICE("You add the cables to [src]. It now contains [loaded.amount]."))
+ return ITEM_INTERACT_COMPLETE
+
+/obj/item/rcl/interact_with_atom(atom/target, mob/living/user, list/modifiers)
+ if(istype(target, /obj/item/stack/cable_coil))
+ var/obj/item/stack/cable_coil/C = target
+ C.melee_attack_chain(user, src, list2params(modifiers))
+ return ITEM_INTERACT_COMPLETE
+
+ loaded.melee_attack_chain(user, target, list2params(modifiers))
+ return ITEM_INTERACT_COMPLETE
+
/obj/item/rcl/proc/refresh_icon(mob/user)
- update_icon(UPDATE_ICON_STATE)
+ update_icon(UPDATE_ICON_STATE|UPDATE_OVERLAYS)
user.update_inv_l_hand()
user.update_inv_r_hand()
@@ -55,57 +73,64 @@
if(!I.use_tool(src, user, FALSE, volume = I.tool_volume))
return
to_chat(user, SPAN_NOTICE("You loosen the securing screws on the side, allowing you to lower the guiding edge and retrieve the wires."))
- while(loaded.amount > 30) //There are only two kinds of situations: "nodiff" (60,90), or "diff" (31-59, 61-89)
- var/diff = loaded.amount % 30
- if(diff)
+ while(loaded.amount)
+ var/diff = 30
+ if(loaded.amount < 30)
+ diff = loaded.amount
+ if(loaded.cable_merge_id == CABLE_LOW_POWER)
+ var/obj/item/stack/cable_coil/dropped_coil = new /obj/item/stack/cable_coil(user.loc, diff)
+ dropped_coil.color = loaded.color
loaded.use(diff)
- new /obj/item/stack/cable_coil(user.loc, diff)
else
- loaded.use(30)
- new /obj/item/stack/cable_coil(user.loc, 30)
- loaded.max_amount = initial(loaded.max_amount)
- loaded.forceMove(user.loc)
- user.put_in_hands(loaded)
- loaded = null
+ new /obj/item/stack/cable_coil/extra_insulated(user.loc, diff)
+ loaded.use(diff)
refresh_icon(user)
-/obj/item/rcl/examine(mob/user)
- . = ..()
- if(loaded)
- . += SPAN_NOTICE("It contains [loaded.amount]/[max_amount] cables.")
- else
- . += SPAN_WARNING("It's empty!")
-
/obj/item/rcl/Destroy()
QDEL_NULL(loaded)
last = null
active = FALSE
return ..()
-/obj/item/rcl/update_icon_state()
- if(!loaded)
- icon_state = "rcl-0"
- inhand_icon_state = "rcl-0"
+/obj/item/rcl/update_overlays()
+ . = ..()
+ overlays.Cut()
+ if(!loaded.amount)
return
+
+ var/coil_size
switch(loaded.amount)
if(61 to INFINITY)
- icon_state = "rcl-30"
+ coil_size = "full"
if(31 to 60)
- icon_state = "rcl-20"
+ coil_size = "mid"
if(1 to 30)
- icon_state = "rcl-10"
- else
- icon_state = "rcl-0"
- inhand_icon_state = "rcl[loaded.amount ? "" : "-0"]"
+ coil_size = "low"
+
+ if(loaded.cable_merge_id == CABLE_LOW_POWER)
+ var/image/cable_overlay = image('icons/obj/rcl.dmi', icon_state = "rcl_[coil_size]")
+ cable_overlay.color = loaded.color
+ overlays += cable_overlay
+ else if(loaded.cable_type == /obj/structure/cable/extra_insulated)
+ overlays += "rcl_[coil_size]_hd"
+ else
+ overlays += "rcl_[coil_size]_hd_connected"
+
+
+/obj/item/rcl/update_icon_state()
+ . = ..()
+ if(loaded.cable_merge_id == CABLE_LOW_POWER)
+ inhand_icon_state = "rcl[loaded.amount ? "_[loaded.color]" : null]"
+ else if(loaded.cable_type == /obj/structure/cable/extra_insulated)
+ inhand_icon_state = "rcl[loaded.amount ? "_hd" : null]"
+ else
+ inhand_icon_state = "rcl[loaded.amount ? "_hd_connected" : null]"
/obj/item/rcl/proc/is_empty(mob/user, loud = 1)
refresh_icon(user)
- if(!loaded || !loaded.amount)
+ if(!loaded.amount)
if(loud)
to_chat(user, SPAN_WARNING("The last of the cables unreel from [src]!"))
- if(loaded)
- qdel(loaded)
- loaded = null
return TRUE
return FALSE
@@ -118,7 +143,10 @@
if(..())
return FINISH_ATTACK
- active = HAS_TRAIT(src, TRAIT_WIELDED)
+ if(iscarbon(user))
+ active = HAS_TRAIT(src, TRAIT_WIELDED)
+ else
+ active = !active
if(!active)
last = null
else if(!last)
@@ -127,6 +155,8 @@
last = C
break
+ to_chat(user, SPAN_NOTICE("You [active ? "prepare to rapidly lay cable" : "stop rapidly laying cable"]."))
+
/obj/item/rcl/on_mob_move(direct, mob/user)
if(active && isturf(user.loc))
trigger(user)
@@ -153,9 +183,64 @@
last = loaded.place_turf(get_turf(loc), user, turn(user.dir, 180))
is_empty(user) //If we've run out, display message
-/obj/item/rcl/pre_loaded/Initialize(mapload) // Comes preloaded with cable, for testing stuff
+/obj/item/rcl/empty/Initialize(mapload)
+ ..()
+ loaded.use(RCL_MAX_SPOOL_SIZE, FALSE)
+ update_icon(UPDATE_ICON_STATE|UPDATE_OVERLAYS)
+
+/obj/item/rcl/robot
+ name = "robotic rapid cable layer (RRCL)"
+ desc = "A Rapid Cable Layer used to hold a spool of cable for engineering and construction robots."
+ /// Tells us if we're laying basic or insulated cable.
+ var/heavy_mode = FALSE
+
+/obj/item/rcl/robot/examine(mob/user)
. = ..()
- loaded = new()
- loaded.max_amount = max_amount
- loaded.amount = max_amount
- update_icon(UPDATE_ICON_STATE)
+ . += SPAN_NOTICE("[src] is currently dispensing [heavy_mode ? "heavy duty cable" : "standard cable"].")
+ . += SPAN_NOTICE("Alt-Click to swap between laying standard and heavy duty cable.")
+ . += SPAN_NOTICE("Ctrl-Click to [heavy_mode ? "toggle cable connectivity" : "select cable color"].")
+
+/obj/item/rcl/robot/screwdriver_act(mob/user, obj/item/I)
+ return
+
+/obj/item/rcl/robot/AltClick(mob/user, modifiers)
+ if(..())
+ return ITEM_INTERACT_COMPLETE
+
+ if(heavy_mode)
+ loaded.cable_type = /obj/structure/cable
+ loaded.cable_merge_id = CABLE_LOW_POWER
+ loaded.color = "red"
+ else
+ loaded.cable_type = /obj/structure/cable/extra_insulated
+ loaded.cable_merge_id = CABLE_HIGH_POWER
+ loaded.color = null
+ heavy_mode = !heavy_mode
+ to_chat(user, SPAN_NOTICE("You start dispensing [heavy_mode ? "heavy-duty cable" : "standard cable"]."))
+ update_icon(UPDATE_ICON_STATE|UPDATE_OVERLAYS)
+
+/obj/item/rcl/robot/CtrlClick(mob/user, modifiers)
+ if(!heavy_mode)
+ var/new_cable_color = tgui_input_list(user, "Pick a cable color.", "Cable Color", list("white","red","orange","yellow","green","blue","cyan","pink"))
+ if(!new_cable_color)
+ return
+
+ to_chat(user, SPAN_NOTICE("[src] is now dispensing [new_cable_color] cable."))
+ // For reasons beyond my comprehension, BYOND cannot comprehend the fact that green is equal to itself unless you explicitly tell it so.
+ if(new_cable_color == "green")
+ new_cable_color = COLOR_GREEN
+ loaded.cable_color(new_cable_color)
+ else
+ if(loaded.cable_type == /obj/structure/cable/extra_insulated/pre_connect)
+ loaded.cable_type = /obj/structure/cable/extra_insulated
+ to_chat(user, SPAN_NOTICE("[src] is now dispensing closed-connection heavy duty cable"))
+ else
+ loaded.cable_type = /obj/structure/cable/extra_insulated/pre_connect
+ to_chat(user, SPAN_NOTICE("[src] is now dispensing open-connection heavy duty cable"))
+
+ update_icon(UPDATE_ICON_STATE|UPDATE_OVERLAYS)
+
+/obj/item/stack/cable_coil/random/rcl_spool
+ rcl_spool = TRUE
+ max_amount = RCL_MAX_SPOOL_SIZE
+ amount = RCL_MAX_SPOOL_SIZE
diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm
index 30149f2fc53..2016a8feebc 100644
--- a/code/game/objects/items/weapons/storage/belt.dm
+++ b/code/game/objects/items/weapons/storage/belt.dm
@@ -95,7 +95,8 @@
/obj/item/robotanalyzer,
/obj/item/rpd/bluespace,
/obj/item/hammer,
- /obj/item/melee/sickly_blade/lock
+ /obj/item/rcl,
+ /obj/item/melee/sickly_blade/lock,
)
/obj/item/storage/belt/utility/full/populate_contents()
@@ -134,6 +135,7 @@
name = "advanced toolbelt"
desc = "Holds tools, looks snazzy, and fits nicely into a bag."
icon_state = "utility_ce"
+ max_combined_w_class = 20
storable = TRUE
/obj/item/storage/belt/utility/chief/full/populate_contents()
@@ -141,7 +143,7 @@
new /obj/item/crowbar/power(src)
new /obj/item/weldingtool/experimental(src)//This can be changed if this is too much
new /obj/item/multitool(src)
- new /obj/item/stack/cable_coil/random(src, 30)
+ new /obj/item/rcl(src)
new /obj/item/extinguisher/mini(src)
new /obj/item/analyzer(src)
update_icon()
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index cb407277c39..d2206599d4a 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -23,7 +23,7 @@
var/list/malf_modules = list()
/// A list of modules that require special recharge handling. Examples include things like flashes, sprays and welding tools.
var/list/special_rechargables = list()
- /// A list of all "energy stacks", i.e cables, brute kits, splints, etc.
+ /// A list of all "energy stacks", i.e rods, brute kits, splints, etc.
var/list/storages = list()
/// A list of all "material stacks", i.e. metal, glass, and reinforced glass
var/list/material_storages = list()
@@ -470,8 +470,7 @@
/obj/item/stack/rods/cyborg,
/obj/item/stack/tile/plasteel/cyborg,
/obj/item/stack/tile/catwalk/cyborg,
- /obj/item/stack/cable_coil/cyborg,
- /obj/item/stack/cable_coil/extra_insulated/cyborg,
+ /obj/item/rcl/robot,
/obj/item/stack/sheet/glass/cyborg,
/obj/item/stack/sheet/rglass/cyborg,
/obj/item/inflatable/cyborg,
@@ -767,8 +766,7 @@
/obj/item/stack/rods/cyborg,
/obj/item/stack/tile/plasteel/cyborg,
/obj/item/stack/tile/catwalk/cyborg,
- /obj/item/stack/cable_coil/cyborg,
- /obj/item/stack/cable_coil/extra_insulated/cyborg,
+ /obj/item/rcl/robot,
/obj/item/stack/sheet/glass/cyborg/drone,
/obj/item/stack/sheet/rglass/cyborg/drone,
/obj/item/stack/sheet/wood/cyborg,
@@ -878,7 +876,7 @@
/obj/item/stack/sheet/metal/cyborg,
/obj/item/stack/rods/cyborg,
/obj/item/stack/tile/plasteel/cyborg,
- /obj/item/stack/cable_coil/cyborg,
+ /obj/item/rcl/robot,
/obj/item/stack/sheet/glass/cyborg,
/obj/item/stack/sheet/rglass/cyborg
)
@@ -1052,10 +1050,6 @@
statpanel_name = "Wooden tiles"
max_amount = 60
-/datum/robot_storage/energy/cable
- name = "Cable Synthesizer"
- statpanel_name = "Cable"
-
// For the medical stacks, even though the recharge rate is 0, it will be set to 1 by default because of a `max()` proc.
// It will always take ~12 seconds to fully recharge these stacks beacuse of this. This time does not apply to the syndicate storages.
/datum/robot_storage/energy/medical
diff --git a/code/modules/power/cables/cable_coil.dm b/code/modules/power/cables/cable_coil.dm
index c219137c60f..c9d34f91394 100644
--- a/code/modules/power/cables/cable_coil.dm
+++ b/code/modules/power/cables/cable_coil.dm
@@ -24,6 +24,8 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe/cable_restrain
slot_flags = ITEM_SLOT_BELT
attack_verb = list("whipped", "lashed", "disciplined", "flogged")
usesound = 'sound/items/deconstruct.ogg'
+ /// Used for RCL cable spools to stop the stack from being eaten.
+ var/rcl_spool = FALSE
/// Type of cable this coil makes
var/cable_type = /obj/structure/cable
/// Bitflag of the types of cable we can add cable to with this coil.
@@ -66,7 +68,7 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe/cable_restrain
/obj/item/stack/cable_coil/examine(mob/user)
. = ..()
- if(!in_range(user, src) || is_cyborg)
+ if(!in_range(user, src))
return
if(get_amount() == 1)
. += "A short piece of power cable."
@@ -125,7 +127,7 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe/cable_restrain
else
break
while(cable_used <= MAXCABLEPERHEAL && E.burn_dam && amount >= 1)
- use(1)
+ use(1, rcl_spool)
cable_used += 1
E.heal_damage(0, HEALPERCABLE, 0, TRUE)
H.UpdateDamageIcon()
@@ -215,7 +217,7 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe/cable_restrain
if(IS_DIR_DIAGONAL(C.d2))// if the cable is layed diagonally, check the others 2 possible directions
C.merge_diagonal_networks(C.d2)
- use(1)
+ use(1, rcl_spool)
if(C.shock(user, 50))
if(prob(50)) //fail
@@ -281,7 +283,7 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe/cable_restrain
if(IS_DIR_DIAGONAL(NC.d2)) // if the cable is layed diagonally, check the others 2 possible directions
NC.merge_diagonal_networks(NC.d2)
- use(1)
+ use(1, rcl_spool)
if(NC.shock(user, 50))
if(prob(50)) //fail
@@ -327,7 +329,7 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe/cable_restrain
if(C.d2 & (C.d2 - 1))// if the cable is layed diagonally, check the others 2 possible directions
C.merge_connected_networks(C.d2)
- use(1)
+ use(1, rcl_spool)
if(C.shock(user, 50))
if(prob(50)) //fail
@@ -428,28 +430,5 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe/cable_restrain
update_appearance(UPDATE_NAME|UPDATE_ICON_STATE)
update_wclass()
-/obj/item/stack/cable_coil/cyborg
- energy_type = /datum/robot_storage/energy/cable
- is_cyborg = TRUE
-
-/obj/item/stack/cable_coil/cyborg/update_icon_state()
- return // icon_state should always be a full cable
-
-/obj/item/stack/cable_coil/cyborg/attack_self__legacy__attackchain(mob/user)
- var/cablecolor = tgui_input_list(usr, "Pick a cable color.", "Cable Color", list("red","yellow","green","blue","pink","orange","cyan","white"))
- cable_color(cablecolor)
- update_icon()
-
-/obj/item/stack/cable_coil/extra_insulated/cyborg
- energy_type = /datum/robot_storage/energy/cable
- is_cyborg = TRUE
-
-/obj/item/stack/cable_coil/extra_insulated/cyborg/attack_self__legacy__attackchain(mob/user)
- toggle_connection(user)
- update_icon()
-
-/obj/item/stack/cable_coil/extra_insulated/cyborg/update_icon_state()
- return // icon_state should always be a full cable
-
#undef HEALPERCABLE
#undef MAXCABLEPERHEAL
diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm
index 159601b2981..a95a34d5d9b 100644
--- a/code/modules/research/designs/autolathe_designs.dm
+++ b/code/modules/research/designs/autolathe_designs.dm
@@ -830,7 +830,7 @@
id = "rcl"
build_type = AUTOLATHE
materials = list(MAT_METAL = 5000)
- build_path = /obj/item/rcl
+ build_path = /obj/item/rcl/empty
category = list("initial", "Construction")
//hacked autolathe recipes
diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi
index b4c199debda..b23f728169a 100644
Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ
diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi
index d18662385a2..9597990a09d 100644
Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ
diff --git a/icons/obj/rcl.dmi b/icons/obj/rcl.dmi
new file mode 100644
index 00000000000..f59c1e00817
Binary files /dev/null and b/icons/obj/rcl.dmi differ