From 05eeff6df2b8e9abfa5b971d779d693f6c68d240 Mon Sep 17 00:00:00 2001
From: CRUNCH <143041327+CRUNCH-Borg@users.noreply.github.com>
Date: Thu, 9 Apr 2026 03:50:24 +0100
Subject: [PATCH] Fixes a Bunch of RCL Bugs (#31698)
* RCL cable migration
* e
* Pain and death
* merge master fixes
* e
* aaaaaa
* Update RCL.dm
* AaaaAAAAA
* Update cable_coil.dm
* Update cable_coil.dm
* returns throwforce
* removes color feature
---------
Signed-off-by: CRUNCH <143041327+CRUNCH-Borg@users.noreply.github.com>
---
_maps/map_files/generic/centcomm.dmm | 12 +-
_maps/map_files/stations/boxstation.dmm | 2 +-
_maps/map_files/stations/cerestation.dmm | 4 +-
_maps/map_files/stations/deltastation.dmm | 2 +-
_maps/map_files/stations/emeraldstation.dmm | 2 +-
_maps/map_files/stations/metastation.dmm | 2 +-
code/game/objects/items/RCL.dm | 295 ++++++++++--------
.../objects/items/weapons/storage/belt.dm | 4 +-
code/game/turfs/turf.dm | 8 +-
.../mob/living/silicon/robot/robot_modules.dm | 12 +-
code/modules/power/cables/cable.dm | 8 +-
code/modules/power/cables/cable_coil.dm | 56 ++--
.../research/designs/autolathe_designs.dm | 2 +-
code/modules/surgery/robotics.dm | 8 +-
14 files changed, 222 insertions(+), 195 deletions(-)
diff --git a/_maps/map_files/generic/centcomm.dmm b/_maps/map_files/generic/centcomm.dmm
index 5a1e80fe9dc..2a7d47458cd 100644
--- a/_maps/map_files/generic/centcomm.dmm
+++ b/_maps/map_files/generic/centcomm.dmm
@@ -9138,12 +9138,12 @@
/turf/simulated/floor/mineral/plastitanium/red,
/area/shuttle/administration)
"GV" = (
-/obj/item/rcl,
-/obj/item/rcl,
-/obj/item/rcl,
-/obj/item/rcl,
-/obj/item/rcl,
-/obj/item/rcl,
+/obj/item/stack/cable_coil/rcl,
+/obj/item/stack/cable_coil/rcl,
+/obj/item/stack/cable_coil/rcl,
+/obj/item/stack/cable_coil/rcl,
+/obj/item/stack/cable_coil/rcl,
+/obj/item/stack/cable_coil/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 eac977c5f2a..925a0e56ca7 100644
--- a/_maps/map_files/stations/boxstation.dmm
+++ b/_maps/map_files/stations/boxstation.dmm
@@ -38331,7 +38331,7 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
},
-/obj/item/rcl,
+/obj/item/stack/cable_coil/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 f2f3fbae544..1043b494cc1 100644
--- a/_maps/map_files/stations/cerestation.dmm
+++ b/_maps/map_files/stations/cerestation.dmm
@@ -20046,7 +20046,7 @@
/obj/effect/turf_decal/tiles/department/engineering/side{
dir = 8
},
-/obj/item/rcl,
+/obj/item/stack/cable_coil/rcl,
/turf/simulated/floor/plasteel,
/area/station/engineering/break_room)
"dfG" = (
@@ -40927,7 +40927,7 @@
/obj/structure/cable/yellow{
icon_state = "4-8"
},
-/obj/item/rcl,
+/obj/item/stack/cable_coil/rcl,
/turf/simulated/floor/plasteel,
/area/station/engineering/break_room)
"hMA" = (
diff --git a/_maps/map_files/stations/deltastation.dmm b/_maps/map_files/stations/deltastation.dmm
index 0c1d1f51b1f..a02db374a66 100644
--- a/_maps/map_files/stations/deltastation.dmm
+++ b/_maps/map_files/stations/deltastation.dmm
@@ -52499,7 +52499,7 @@
"foI" = (
/obj/structure/table/reinforced,
/obj/effect/turf_decal/tiles/neutral,
-/obj/item/rcl,
+/obj/item/stack/cable_coil/rcl,
/turf/simulated/floor/plasteel,
/area/station/engineering/break_room)
"foU" = (
diff --git a/_maps/map_files/stations/emeraldstation.dmm b/_maps/map_files/stations/emeraldstation.dmm
index 6b091b03416..621a20add1f 100644
--- a/_maps/map_files/stations/emeraldstation.dmm
+++ b/_maps/map_files/stations/emeraldstation.dmm
@@ -40262,7 +40262,7 @@
pixel_x = -3;
pixel_y = 3
},
-/obj/item/rcl,
+/obj/item/stack/cable_coil/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 b4ebbfdb6c2..cea14149751 100644
--- a/_maps/map_files/stations/metastation.dmm
+++ b/_maps/map_files/stations/metastation.dmm
@@ -71546,7 +71546,7 @@
/obj/effect/turf_decal/tiles/department/engineering/side{
dir = 8
},
-/obj/item/rcl,
+/obj/item/stack/cable_coil/rcl,
/turf/simulated/floor/plasteel/dark,
/area/station/engineering/equipmentstorage)
"rye" = (
diff --git a/code/game/objects/items/RCL.dm b/code/game/objects/items/RCL.dm
index f8a417c578f..1ec65f4369c 100644
--- a/code/game/objects/items/RCL.dm
+++ b/code/game/objects/items/RCL.dm
@@ -1,148 +1,170 @@
-/obj/item/rcl
+/obj/item/stack/cable_coil/rcl
name = "rapid cable layer (RCL)"
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
+ belt_icon = null
origin_tech = "engineering=4;materials=2"
materials = list(MAT_METAL = 5000)
+ destroy_upon_empty = FALSE
+ max_amount = RCL_MAX_SPOOL_SIZE
+ amount = RCL_MAX_SPOOL_SIZE
+ color = null
+ /// Are we rapidly laying cable?
var/active = FALSE
+ var/spool_color
+ /// Remembers the last cable structure that got laid down to aid in further cable laying.
var/obj/structure/cable/last
- var/obj/item/stack/cable_coil/random/rcl_spool/loaded
- new_attack_chain = TRUE
-/obj/item/rcl/Initialize(mapload)
+/obj/item/stack/cable_coil/rcl/examine(mob/user)
. = ..()
- 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("It can stack [RCL_MAX_SPOOL_SIZE] lengths of cable around its spool.")
. += 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 ..()
+/obj/item/stack/cable_coil/rcl/Initialize(mapload)
+ . = ..()
+ // Do not craft from an RCL.
+ recipes = null
+ color_rainbow()
+ AddComponent(/datum/component/two_handed)
+ w_class = WEIGHT_CLASS_NORMAL
+ refresh_icon()
- var/obj/item/stack/cable_coil/coil = used
- 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
-
- if(isstorage(target) || istable(target))
- return ..()
-
- 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_OVERLAYS)
- user.update_inv_l_hand()
- user.update_inv_r_hand()
-
-/obj/item/rcl/screwdriver_act(mob/user, obj/item/I)
- if(!loaded)
- to_chat(user, SPAN_WARNING("There's no cable to remove!"))
- return
- . = TRUE
- 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)
- 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)
- else
- new /obj/item/stack/cable_coil/extra_insulated(user.loc, diff)
- loaded.use(diff)
- refresh_icon(user)
-
-/obj/item/rcl/Destroy()
- QDEL_NULL(loaded)
+/obj/item/stack/cable_coil/rcl/Destroy()
last = null
active = FALSE
return ..()
-/obj/item/rcl/update_overlays()
+/obj/item/stack/cable_coil/rcl/screwdriver_act(mob/user, obj/item/I)
+ if(!amount)
+ to_chat(user, SPAN_WARNING("There's no cable to remove!"))
+ return
+
+ if(!I.use_tool(src, user, FALSE, volume = I.tool_volume))
+ return ITEM_INTERACT_COMPLETE
+
+ 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(amount)
+ var/delta = 30
+ if(amount < 30)
+ delta = amount
+ if(cable_merge_id == CABLE_LOW_POWER)
+ var/obj/item/stack/cable_coil/dropped_coil = new /obj/item/stack/cable_coil(user.loc, delta)
+ dropped_coil.color = get_cable_color()
+ use(delta, FALSE)
+ else
+ new /obj/item/stack/cable_coil/extra_insulated(user.loc, delta)
+ use(delta, FALSE)
+ refresh_icon(user)
+ return ITEM_INTERACT_COMPLETE
+
+/obj/item/stack/cable_coil/rcl/item_interaction(mob/living/user, obj/item/used, list/modifiers)
+ if(!istype(used, /obj/item/stack/cable_coil))
+ return ..()
+
+ // Another RCL is stealing cable from us, let its `interact_with_atom()` fire.
+ if(istype(used, /obj/item/stack/cable_coil/rcl))
+ return NONE
+
+ load_cable(user, used)
+ return ITEM_INTERACT_COMPLETE
+
+/obj/item/stack/cable_coil/rcl/interact_with_atom(atom/target, mob/living/user, list/modifiers)
+ if(!istype(target, /obj/item/stack/cable_coil))
+ ..()
+ is_empty(user)
+ return ITEM_INTERACT_COMPLETE
+
+ load_cable(user, target)
+ return ITEM_INTERACT_COMPLETE
+
+/obj/item/stack/cable_coil/rcl/proc/load_cable(mob/living/user, obj/item/used)
+ var/obj/item/stack/cable_coil/used_coil = used
+ if(get_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(!get_amount())
+ spool_color = used_coil.get_cable_color()
+ cable_type = used_coil.cable_type
+ cable_merge_id = used_coil.cable_merge_id
+ // Robot RCL can freely swap between cable types anyway, allow them to eat the cable.
+ else if((cable_merge_id != used_coil.cable_merge_id) && !is_robot_module())
+ to_chat(user, SPAN_WARNING("These coils are of different types!"))
+ return ITEM_INTERACT_COMPLETE
+
+ var/delta = (RCL_MAX_SPOOL_SIZE - get_amount())
+ add(min(used_coil.get_amount(), delta))
+ used_coil.use(min(used_coil.get_amount(), delta), used_coil.destroy_upon_empty)
+ refresh_icon(user)
+ to_chat(user, SPAN_NOTICE("You add the cables to [src]. It now contains [get_amount()]."))
+ return ITEM_INTERACT_COMPLETE
+
+/obj/item/stack/cable_coil/rcl/get_cable_color()
+ return spool_color
+
+/obj/item/stack/cable_coil/rcl/proc/refresh_icon(mob/user)
+ if(color)
+ spool_color = color
+ color = null
+ update_icon(UPDATE_ICON_STATE|UPDATE_OVERLAYS)
+ if(user)
+ user.update_inv_l_hand()
+ user.update_inv_r_hand()
+
+/obj/item/stack/cable_coil/rcl/update_overlays()
. = ..()
overlays.Cut()
- if(!loaded.amount)
+ if(!get_amount())
return
var/coil_size
- switch(loaded.amount)
+ switch(get_amount())
if(61 to INFINITY)
coil_size = "full"
if(31 to 60)
coil_size = "mid"
if(1 to 30)
coil_size = "low"
-
- if(loaded.cable_merge_id == CABLE_LOW_POWER)
+ if(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
+ cable_overlay.color = get_cable_color()
overlays += cable_overlay
- else if(loaded.cable_type == /obj/structure/cable/extra_insulated)
+ else if(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]"
+/obj/item/stack/cable_coil/rcl/update_icon_state()
+ icon_state = "rcl"
+ if(cable_merge_id == CABLE_LOW_POWER)
+ inhand_icon_state = "rcl[amount ? "_[get_cable_color()]" : null]"
+ else if(cable_type == /obj/structure/cable/extra_insulated)
+ inhand_icon_state = "rcl[amount ? "_hd" : null]"
else
- inhand_icon_state = "rcl[loaded.amount ? "_hd_connected" : null]"
+ inhand_icon_state = "rcl[amount ? "_hd_connected" : null]"
-/obj/item/rcl/proc/is_empty(mob/user, loud = 1)
+/obj/item/stack/cable_coil/rcl/update_name()
+ . = ..()
+ name = initial(name)
+
+/obj/item/stack/cable_coil/rcl/proc/is_empty(mob/user, loud = 1)
refresh_icon(user)
- if(!loaded.amount)
+ if(!get_amount())
if(loud)
to_chat(user, SPAN_WARNING("The last of the cables unreel from [src]!"))
return TRUE
return FALSE
-/obj/item/rcl/dropped(mob/wearer)
+/obj/item/stack/cable_coil/rcl/dropped(mob/wearer)
..()
active = FALSE
last = null
-/obj/item/rcl/activate_self(mob/user)
+/obj/item/stack/cable_coil/rcl/activate_self(mob/user)
if(..())
return FINISH_ATTACK
@@ -157,93 +179,104 @@
if(C.d1 == 0 || C.d2 == 0)
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)
+/obj/item/stack/cable_coil/rcl/on_mob_move(direct, mob/user)
if(active && isturf(user.loc))
trigger(user)
-/obj/item/rcl/proc/trigger(mob/user)
+/obj/item/stack/cable_coil/rcl/proc/trigger(mob/user)
if(is_empty(user, 0))
to_chat(user, SPAN_WARNING("[src] is empty!"))
return
+
if(last)
if(get_dist(last, user) == 1) //hacky, but it works
var/turf/T = get_turf(user)
if(!isturf(T) || T.intact || !T.can_have_cabling())
last = null
return
+
if(get_dir(last, user) == last.d2)
//Did we just walk backwards? Well, that's the one direction we CAN'T complete a stub.
last = null
return
- loaded.cable_join(last, user)
+
+ cable_join(last, user)
if(is_empty(user))
return //If we've run out, display message and exit
+
else
last = null
- last = loaded.place_turf(get_turf(loc), user, turn(user.dir, 180))
+ last = place_turf(get_turf(loc), user, turn(user.dir, 180))
is_empty(user) //If we've run out, display message
-/obj/item/rcl/empty/Initialize(mapload)
+/obj/item/stack/cable_coil/rcl/empty/Initialize(mapload)
..()
- loaded.use(RCL_MAX_SPOOL_SIZE, FALSE)
- update_icon(UPDATE_ICON_STATE|UPDATE_OVERLAYS)
+ use(RCL_MAX_SPOOL_SIZE, FALSE)
+ refresh_icon()
-/obj/item/rcl/robot
+/obj/item/stack/cable_coil/rcl/AltClick(mob/living/user)
+ return
+
+/obj/item/stack/cable_coil/rcl/update_wclass()
+ return
+
+/obj/item/stack/cable_coil/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."
+ energy_type = /datum/robot_storage/material/cable
+ is_cyborg = TRUE
/// Tells us if we're laying basic or insulated cable.
var/heavy_mode = FALSE
-/obj/item/rcl/robot/examine(mob/user)
+// update_icon() refuses to add the cable overlay on Initialize(), I'm convinced it's an issue with energy stacks.
+// Energy stacks cannot be avoided because the icon of a stack refuses to render otherwise for reasons beyond my comprehension.
+/obj/item/stack/cable_coil/rcl/robot/Initialize(mapload)
+ ..()
+ var/image/cable_overlay = image('icons/obj/rcl.dmi', icon_state = "rcl_full")
+ cable_overlay.color = spool_color
+ overlays += cable_overlay
+
+/obj/item/stack/cable_coil/rcl/robot/examine(mob/user)
. = ..()
. += 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)
+/obj/item/stack/cable_coil/rcl/robot/screwdriver_act(mob/user, obj/item/I)
return
-/obj/item/rcl/robot/AltClick(mob/user, modifiers)
+/obj/item/stack/cable_coil/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"
+ cable_type = /obj/structure/cable
+ cable_merge_id = CABLE_LOW_POWER
+ spool_color = "red"
else
- loaded.cable_type = /obj/structure/cable/extra_insulated
- loaded.cable_merge_id = CABLE_HIGH_POWER
- loaded.color = null
+ cable_type = /obj/structure/cable/extra_insulated
+ cable_merge_id = CABLE_HIGH_POWER
+ spool_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)
+ refresh_icon()
-/obj/item/rcl/robot/CtrlClick(mob/user, modifiers)
+/obj/item/stack/cable_coil/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"))
+ var/new_cable_color = tgui_input_list(user, "Pick a cable color.", "Cable Color", list("pink","red","orange","yellow","green","blue","cyan","white"))
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)
+ 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
+ if(cable_type == /obj/structure/cable/extra_insulated/pre_connect)
+ 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
+ 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
- destroy_upon_empty = FALSE
- max_amount = RCL_MAX_SPOOL_SIZE
- amount = RCL_MAX_SPOOL_SIZE
+ refresh_icon()
diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm
index a64349785c6..759e0b49860 100644
--- a/code/game/objects/items/weapons/storage/belt.dm
+++ b/code/game/objects/items/weapons/storage/belt.dm
@@ -95,7 +95,7 @@
/obj/item/robotanalyzer,
/obj/item/rpd/bluespace,
/obj/item/hammer,
- /obj/item/rcl,
+ /obj/item/stack/cable_coil/rcl,
/obj/item/melee/sickly_blade/lock,
)
@@ -143,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/rcl(src)
+ new /obj/item/stack/cable_coil/rcl(src)
new /obj/item/extinguisher/mini(src)
new /obj/item/analyzer(src)
update_icon()
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 463178b2b90..4a64f667931 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -569,14 +569,14 @@ GLOBAL_LIST_EMPTY(station_turfs)
return ITEM_INTERACT_COMPLETE
C.place_turf(src, user)
return ITEM_INTERACT_COMPLETE
- else if(istype(used, /obj/item/rcl))
- var/obj/item/rcl/R = used
- if(R.loaded)
+ else if(istype(used, /obj/item/stack/cable_coil/rcl))
+ var/obj/item/stack/cable_coil/rcl/R = used
+ if(R.get_amount())
for(var/obj/structure/cable/LC in src)
if(LC.d1 == 0 || LC.d2 == 0)
LC.item_interaction(user, R)
return ITEM_INTERACT_COMPLETE
- R.loaded.place_turf(src, user)
+ R.place_turf(src, user)
R.is_empty(user)
return ITEM_INTERACT_COMPLETE
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index d2206599d4a..b1ca8a390a5 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -470,7 +470,7 @@
/obj/item/stack/rods/cyborg,
/obj/item/stack/tile/plasteel/cyborg,
/obj/item/stack/tile/catwalk/cyborg,
- /obj/item/rcl/robot,
+ /obj/item/stack/cable_coil/rcl/robot,
/obj/item/stack/sheet/glass/cyborg,
/obj/item/stack/sheet/rglass/cyborg,
/obj/item/inflatable/cyborg,
@@ -766,7 +766,7 @@
/obj/item/stack/rods/cyborg,
/obj/item/stack/tile/plasteel/cyborg,
/obj/item/stack/tile/catwalk/cyborg,
- /obj/item/rcl/robot,
+ /obj/item/stack/cable_coil/rcl/robot,
/obj/item/stack/sheet/glass/cyborg/drone,
/obj/item/stack/sheet/rglass/cyborg/drone,
/obj/item/stack/sheet/wood/cyborg,
@@ -876,7 +876,7 @@
/obj/item/stack/sheet/metal/cyborg,
/obj/item/stack/rods/cyborg,
/obj/item/stack/tile/plasteel/cyborg,
- /obj/item/rcl/robot,
+ /obj/item/stack/cable_coil/rcl/robot,
/obj/item/stack/sheet/glass/cyborg,
/obj/item/stack/sheet/rglass/cyborg
)
@@ -1121,3 +1121,9 @@
statpanel_name = "Metal"
stack = /obj/item/stack/sheet/metal
add_to_storage = TRUE
+
+/datum/robot_storage/material/cable
+ name = "Cable Storage"
+ statpanel_name = "Cable"
+ max_amount = 90
+ stack = /obj/item/stack/cable_coil/rcl
diff --git a/code/modules/power/cables/cable.dm b/code/modules/power/cables/cable.dm
index 2f4681e6eb6..f915cac1852 100644
--- a/code/modules/power/cables/cable.dm
+++ b/code/modules/power/cables/cable.dm
@@ -105,10 +105,10 @@ By design, d1 is the smallest direction and d2 is the highest
return
coil.cable_join(src, user)
- else if(istype(W, /obj/item/rcl))
- var/obj/item/rcl/R = W
- if(R.loaded)
- R.loaded.cable_join(src, user)
+ else if(istype(W, /obj/item/stack/cable_coil/rcl))
+ var/obj/item/stack/cable_coil/rcl/R = W
+ if(R.amount)
+ R.cable_join(src, user)
R.is_empty(user)
else if(istype(W, /obj/item/toy/crayon))
diff --git a/code/modules/power/cables/cable_coil.dm b/code/modules/power/cables/cable_coil.dm
index 0f3e52dc851..00163390c05 100644
--- a/code/modules/power/cables/cable_coil.dm
+++ b/code/modules/power/cables/cable_coil.dm
@@ -8,6 +8,7 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe/cable_restrain
/obj/item/stack/cable_coil
name = "cable coil"
+ desc = "A low-cost superconducting cable."
singular_name = "cable"
icon = 'icons/obj/power.dmi'
icon_state = "coil"
@@ -46,6 +47,10 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe/cable_restrain
new_stack.color = color
return new_stack
+/// Used to decouple the physical color of the cable from the logical color. Used by RCL to stop its spool holder from being colored in.
+/obj/item/stack/cable_coil/proc/get_cable_color()
+ return color
+
/obj/item/stack/cable_coil/update_name()
. = ..()
if(amount > 2)
@@ -67,17 +72,6 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe/cable_restrain
else
w_class = WEIGHT_CLASS_SMALL
-/obj/item/stack/cable_coil/examine(mob/user)
- . = ..()
- if(!in_range(user, src))
- return
- if(get_amount() == 1)
- . += "A short piece of power cable."
- else if(get_amount() == 2)
- . += "A piece of power cable."
- else
- . += "A coil of power cables."
-
/obj/item/stack/cable_coil/can_merge(obj/item/stack/check, inhand = FALSE)
. = FALSE
if(istype(check, merge_type))
@@ -145,27 +139,24 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe/cable_restrain
C.color = color
return C
-// Items usable on a cable coil :
-// - Wirecutters : cut them duh !
-// - Cable coil : merge cables
/obj/item/stack/cable_coil/item_interaction(mob/living/user, obj/item/used, list/modifiers)
if(istype(used, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/C = used
- // Cable merging is handled by parent proc
if(C.cable_merge_id != cable_merge_id)
to_chat(user, "These coils are of different types.")
return ITEM_INTERACT_COMPLETE
- if(C.get_amount() >= MAXCOIL)
+ if(C.get_amount() >= C.max_amount)
to_chat(user, "The coil is as long as it will get.")
return ITEM_INTERACT_COMPLETE
- if((C.get_amount() + get_amount() <= MAXCOIL))
+ // Cable merging is handled by parent proc.
+ if((C.get_amount() + get_amount() <= C.max_amount))
to_chat(user, "You join the cable coils together.")
- return ITEM_INTERACT_COMPLETE
+ return ..()
to_chat(user, "You transfer [get_amount_transferred()] length\s of cable from one coil to the other.")
- return ITEM_INTERACT_COMPLETE
+ return ..()
if(istype(used, /obj/item/toy/crayon))
var/obj/item/toy/crayon/C = used
@@ -180,8 +171,7 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe/cable_restrain
/obj/item/stack/cable_coil/proc/get_new_cable(location)
var/obj/structure/cable/C = new cable_type(location)
- C.cable_color(color)
-
+ C.cable_color(get_cable_color())
return C
/// called when cable_coil is clicked on a turf/simulated/floor
@@ -319,9 +309,7 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe/cable_restrain
to_chat(user, SPAN_WARNING("There's already a cable at that position!"))
return
-
- C.cable_color(color)
-
+ C.cable_color(get_cable_color())
C.d1 = nd1
C.d2 = nd2
@@ -382,30 +370,30 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe/cable_restrain
/obj/item/stack/cable_coil/ten
amount = 10
-/obj/item/stack/cable_coil/yellow
- color = COLOR_YELLOW
-
-/obj/item/stack/cable_coil/blue
- color = COLOR_BLUE
-
-/obj/item/stack/cable_coil/green
- color = COLOR_GREEN
-
/obj/item/stack/cable_coil/pink
color = COLOR_PINK
+/obj/item/stack/cable_coil/yellow
+ color = COLOR_YELLOW
+
/obj/item/stack/cable_coil/orange
color = COLOR_ORANGE
+/obj/item/stack/cable_coil/green
+ color = COLOR_GREEN
+
/obj/item/stack/cable_coil/cyan
color = COLOR_CYAN
+/obj/item/stack/cable_coil/blue
+ color = COLOR_BLUE
+
/obj/item/stack/cable_coil/white
color = COLOR_WHITE
/obj/item/stack/cable_coil/random/Initialize(mapload)
. = ..()
- color = pick(COLOR_RED, COLOR_BLUE, COLOR_GREEN, COLOR_WHITE, COLOR_PINK, COLOR_YELLOW, COLOR_CYAN, COLOR_ORANGE)
+ color = pick(COLOR_RED, COLOR_PINK, COLOR_ORANGE, COLOR_YELLOW, COLOR_GREEN, COLOR_CYAN, COLOR_BLUE, COLOR_WHITE)
/obj/item/stack/cable_coil/extra_insulated
name = "heavy duty cable coil"
diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm
index a95a34d5d9b..6d32e53cadb 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/empty
+ build_path = /obj/item/stack/cable_coil/rcl/empty
category = list("initial", "Construction")
//hacked autolathe recipes
diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm
index 202582115b1..58446181fcb 100644
--- a/code/modules/surgery/robotics.dm
+++ b/code/modules/surgery/robotics.dm
@@ -280,10 +280,10 @@
if(C.get_amount() < 3)
to_chat(user, SPAN_WARNING("You need three or more cable pieces to repair this damage."))
return SURGERY_BEGINSTEP_SKIP
- C.use(3)
+ C.use(3, C.destroy_upon_empty)
user.visible_message(
- "[user] begins to splice new cabling into [target]'s [affected.name].",
- "You begin to splice new cabling into [target]'s [affected.name].",
+ SPAN_NOTICE("[user] begins to splice new cabling into [target]'s [affected.name]."),
+ SPAN_NOTICE("You begin to splice new cabling into [target]'s [affected.name]."),
chat_message_type = MESSAGE_TYPE_COMBAT
)
return ..()
@@ -294,7 +294,7 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message(
SPAN_NOTICE("[user] finishes splicing cable into [target]'s [affected.name]."),
- SPAN_NOTICE("You finishes splicing new cable into [target]'s [affected.name]."),
+ SPAN_NOTICE("You finish splicing new cable into [target]'s [affected.name]."),
chat_message_type = MESSAGE_TYPE_COMBAT
)
affected.heal_damage(0, rand(30, 50), 1, 1)