diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm
index ad654c1ff77..4bc3c6472b2 100644
--- a/code/defines/obj/weapon.dm
+++ b/code/defines/obj/weapon.dm
@@ -327,18 +327,6 @@
pixel_x = rand(-16,16)
pixel_y = rand(-16,16)
-/obj/item/legcuffs
- name = "legcuffs"
- desc = "Use this to keep prisoners in line."
- gender = PLURAL
- icon = 'icons/obj/items.dmi'
- icon_state = "handcuff"
- flags = CONDUCT
- throwforce = 0
- w_class = ITEMSIZE_NORMAL
- origin_tech = list(TECH_MATERIAL = 1)
- var/breakouttime = 300 //Deciseconds = 30s = 0.5 minute
-
/obj/item/SWF_uplink
name = "station-bounced radio"
desc = "used to comunicate it appears."
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index fe2563c8172..d606eb28ede 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -444,7 +444,7 @@ var/list/global/slot_flags_enumeration = list(
if(!istype(src, /obj/item/handcuffs))
return 0
if(slot_legcuffed)
- if(!istype(src, /obj/item/legcuffs))
+ if(!istype(src, /obj/item/handcuffs))
return 0
if(slot_in_backpack) //used entirely for equipping spawned mobs or at round start
var/allow = 0
diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm
index ea7947c5533..446c59c5341 100644
--- a/code/game/objects/items/weapons/handcuffs.dm
+++ b/code/game/objects/items/weapons/handcuffs.dm
@@ -13,16 +13,16 @@
origin_tech = list(TECH_MATERIAL = 1)
matter = list(DEFAULT_WALL_MATERIAL = 500)
recyclable = TRUE
- var/elastic
+ var/legcuff = FALSE
+ var/elastic = FALSE
var/dispenser = 0
- var/breakouttime = 1200 //Deciseconds = 120s = 2 minutes
+ var/breakouttime = 2 MINUTES
var/cuff_sound = 'sound/weapons/handcuffs.ogg'
var/cuff_type = "handcuffs"
drop_sound = 'sound/items/drop/accessory.ogg'
pickup_sound = 'sound/items/pickup/accessory.ogg'
/obj/item/handcuffs/attack(var/mob/living/carbon/C, var/mob/living/user)
-
if(!user.IsAdvancedToolUser())
return
@@ -31,7 +31,7 @@
place_handcuffs(user, user)
return
- if(!C.handcuffed)
+ if((!legcuff && !C.handcuffed) || (legcuff && !C.legcuffed))
if (C == user)
place_handcuffs(user, user)
return
@@ -57,15 +57,20 @@
if(!istype(H))
return FALSE
- if (!H.has_organ_for_slot(slot_handcuffed))
+ if((!legcuff && !H.has_organ_for_slot(slot_handcuffed)) || (legcuff && !H.has_organ_for_slot(slot_legcuffed)))
if(user)
- to_chat(user, SPAN_DANGER("\The [H] needs at least two wrists before you can cuff them together!"))
+ to_chat(user, SPAN_DANGER("\The [H] needs at least two [legcuff ? "ankles" : "wrists"] before you can cuff them together!"))
return FALSE
- if(istype(H.gloves,/obj/item/clothing/gloves/rig) && !elastic) // Can't cuff someone who's in a deployed hardsuit.
- if(user)
- to_chat(user, SPAN_DANGER("\The [src] won't fit around \the [H.gloves]!"))
- return FALSE
+ if(!elastic) // Can't cuff someone who's in a deployed hardsuit.
+ if(!legcuff && istype(H.gloves, /obj/item/clothing/gloves/rig))
+ if(user)
+ to_chat(user, SPAN_DANGER("\The [src] won't fit around \the [H.gloves]!"))
+ return FALSE
+ if(legcuff && istype(H.shoes, /obj/item/clothing/shoes/magboots/rig))
+ if(user)
+ to_chat(user, SPAN_DANGER("\The [src] won't fit around \the [H.shoes]!"))
+ return FALSE
if(user)
user.visible_message(SPAN_DANGER("\The [user] is attempting to put [cuff_type] on \the [H]!"))
@@ -85,8 +90,9 @@
user.do_attack_animation(H)
user.visible_message(SPAN_DANGER("\The [user] has put [cuff_type] on \the [H]!"))
- target.drop_r_hand()
- target.drop_l_hand()
+ if(!legcuff)
+ target.drop_r_hand()
+ target.drop_l_hand()
// Apply cuffs.
var/obj/item/handcuffs/cuffs = src
@@ -96,8 +102,13 @@
user.drop_from_inventory(cuffs,target)
else
cuffs.forceMove(target)
- target.handcuffed = cuffs
- target.update_inv_handcuffed()
+
+ if(!legcuff)
+ target.handcuffed = cuffs
+ target.update_inv_handcuffed()
+ else
+ target.legcuffed = cuffs
+ target.update_inv_legcuffed()
return TRUE
/mob/living/carbon/human/RestrainedClickOn(var/atom/A)
@@ -137,9 +148,9 @@
slot_l_hand_str = 'icons/mob/items/stacks/lefthand_materials.dmi',
slot_r_hand_str = 'icons/mob/items/stacks/righthand_materials.dmi',
)
- breakouttime = 300 //Deciseconds = 30s
+ breakouttime = 30 SECONDS
cuff_sound = 'sound/weapons/cablecuff.ogg'
- cuff_type = "cable restraints"
+ cuff_type = "cable restraint handcuffs"
var/can_be_cut = TRUE
elastic = TRUE
build_from_parts = TRUE
@@ -155,6 +166,13 @@
color = pick(COLOR_RED, COLOR_BLUE, COLOR_LIME, COLOR_ORANGE, COLOR_WHITE, COLOR_PINK, COLOR_YELLOW, COLOR_CYAN)
add_overlay(overlay_image(icon, "[initial(icon_state)]_end", flags=RESET_COLOR))
+/obj/item/handcuffs/cable/attack_self(mob/user)
+ legcuff = !legcuff
+ cuff_type = "cable restraint [legcuff ? "leg" : "hand"]cuffs"
+ to_chat(user, SPAN_NOTICE("You twist the cable into [cuff_type]."))
+ icon_state = "cable[legcuff ? "leg" : ""]cuff"
+ breakouttime = legcuff ? 10 SECONDS : 30 SECONDS
+
/obj/item/handcuffs/cable/yellow
color = COLOR_YELLOW
@@ -169,6 +187,9 @@
desc = "A set of handcuffs made out of vines. How devilish!"
can_be_cut = FALSE
+/obj/item/handcuffs/cable/green/vines/attack_self(mob/user)
+ return
+
/obj/item/handcuffs/cable/pink
color = COLOR_PINK
@@ -211,14 +232,22 @@
icon_state = "tape_cross"
item_state = null
icon = 'icons/obj/bureaucracy.dmi'
- breakouttime = 200
+ breakouttime = 20 SECONDS
cuff_type = "duct tape"
/obj/item/handcuffs/ziptie
name = "ziptie"
desc = " A sturdy and reliable plastic ziptie for binding the wrists."
icon_state = "ziptie"
- breakouttime = 600
+ breakouttime = 1 MINUTE
cuff_sound = 'sound/weapons/cablecuff.ogg'
cuff_type = "zipties"
elastic = TRUE
+
+/obj/item/handcuffs/legcuffs
+ name = "legcuffs"
+ desc = "Use this to keep prisoners in line."
+ icon_state = "legcuff"
+ legcuff = TRUE
+ breakouttime = 30 SECONDS
+ cuff_type = "legcuffs"
\ No newline at end of file
diff --git a/code/game/objects/structures/trash_pile.dm b/code/game/objects/structures/trash_pile.dm
index 79ea0029347..bbafe855c85 100644
--- a/code/game/objects/structures/trash_pile.dm
+++ b/code/game/objects/structures/trash_pile.dm
@@ -198,7 +198,7 @@
/obj/item/clothing/gloves/brassknuckles = 3,
/obj/item/reagent_containers/syringe/drugs = 3,
/obj/item/handcuffs = 2,
- /obj/item/legcuffs = 2,
+ /obj/item/handcuffs/legcuffs = 2,
/obj/item/grenade/chem_grenade/gas = 2,
/obj/item/clothing/suit/storage/vest/heavy = 1,
/obj/item/device/radiojammer = 1,
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index f2055d9ea3e..3defb0ae007 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -124,10 +124,11 @@
//handcuffed?
if(handcuffed)
- if(istype(handcuffed, /obj/item/handcuffs/cable))
- msg += "[get_pronoun("He")] [get_pronoun("is")] [icon2html(handcuffed, user)] restrained with cable!\n"
- else
- msg += "[get_pronoun("He")] [get_pronoun("is")] [icon2html(handcuffed, user)] handcuffed!\n"
+ msg += "[get_pronoun("He")] [get_pronoun("is")] [icon2html(handcuffed, user)] handcuffed!\n"
+
+ //handcuffed?
+ if(legcuffed)
+ msg += "[get_pronoun("He")] [get_pronoun("is")] [icon2html(legcuffed, user)] legcuffed!\n"
//buckled
if(buckled)
diff --git a/code/modules/mob/living/carbon/resist.dm b/code/modules/mob/living/carbon/resist.dm
index 2964e3613be..0564a058f8b 100644
--- a/code/modules/mob/living/carbon/resist.dm
+++ b/code/modules/mob/living/carbon/resist.dm
@@ -146,7 +146,7 @@
break_legcuffs()
return
- var/obj/item/legcuffs/HC = legcuffed
+ var/obj/item/handcuffs/HC = legcuffed
//A default in case you are somehow legcuffed with something that isn't an obj/item/legcuffs type
var/breakouttime = 1200
diff --git a/html/changelogs/geeves-legcuffs.yml b/html/changelogs/geeves-legcuffs.yml
new file mode 100644
index 00000000000..a1b735224a5
--- /dev/null
+++ b/html/changelogs/geeves-legcuffs.yml
@@ -0,0 +1,8 @@
+author: Geeves
+
+delete-after: True
+
+changes:
+ - bugfix: "Legcuff sprites work again."
+ - tweak: "Legcuffing now works the same as handcuffing."
+ - rscadd: "You can use cable restraints in-hand to turn them into weak legcuffs."
diff --git a/icons/obj/handcuffs.dmi b/icons/obj/handcuffs.dmi
index d88290d948f..50ecc5d5bb1 100644
Binary files a/icons/obj/handcuffs.dmi and b/icons/obj/handcuffs.dmi differ
diff --git a/maps/exodus/exodus-2_centcomm.dmm b/maps/exodus/exodus-2_centcomm.dmm
index 58768b8d801..6402044fabe 100644
--- a/maps/exodus/exodus-2_centcomm.dmm
+++ b/maps/exodus/exodus-2_centcomm.dmm
@@ -2287,7 +2287,6 @@
"amm" = (
/obj/machinery/door/airlock/centcom{
name = "Barracks";
- opacity = 1;
req_access = list(150)
},
/turf/unsimulated/floor{
@@ -2474,7 +2473,6 @@
"amI" = (
/obj/machinery/door/airlock/centcom{
name = "Kitchen";
- opacity = 1;
req_access = list(150)
},
/turf/unsimulated/floor{
@@ -2897,8 +2895,7 @@
/area/antag/mercenary)
"anB" = (
/obj/machinery/door/airlock/centcom{
- name = "Bathroom";
- opacity = 1
+ name = "Bathroom"
},
/turf/unsimulated/floor{
icon_state = "freezerfloor"
@@ -2987,8 +2984,7 @@
/area/antag/mercenary)
"anK" = (
/obj/machinery/door/airlock/centcom{
- name = "Suit Storage";
- opacity = 1
+ name = "Suit Storage"
},
/turf/unsimulated/floor{
icon_state = "dark"
@@ -3580,8 +3576,7 @@
/area/shuttle/mercenary)
"aoR" = (
/obj/machinery/door/airlock/centcom{
- name = "Hardsuit Storage";
- opacity = 1
+ name = "Hardsuit Storage"
},
/turf/unsimulated/floor{
icon_state = "dark"
@@ -3763,7 +3758,6 @@
"apo" = (
/obj/machinery/door/airlock/centcom{
name = "General Access";
- opacity = 1;
req_access = list(101)
},
/turf/simulated/floor/plating,
@@ -5522,7 +5516,6 @@
"avK" = (
/obj/machinery/door/airlock/centcom{
name = "Special Operations";
- opacity = 1;
req_access = list(103)
},
/turf/unsimulated/floor{
@@ -5615,7 +5608,6 @@
"awo" = (
/obj/machinery/door/airlock/centcom{
name = "Armory Special Operations";
- opacity = 1;
req_access = list(103)
},
/turf/unsimulated/floor{
@@ -5626,7 +5618,6 @@
"awp" = (
/obj/machinery/door/airlock/centcom{
name = "Engineering Special Operations";
- opacity = 1;
req_access = list(103)
},
/turf/unsimulated/floor{
@@ -5682,7 +5673,6 @@
"awB" = (
/obj/machinery/door/airlock/centcom{
name = "Special Operations Command";
- opacity = 1;
req_access = list(103)
},
/turf/unsimulated/floor{
@@ -5846,7 +5836,6 @@
"axf" = (
/obj/machinery/door/airlock/centcom{
name = "Medical Special Operations";
- opacity = 1;
req_access = list(103)
},
/turf/unsimulated/floor{
@@ -5920,8 +5909,7 @@
/area/centcom/living)
"axr" = (
/obj/machinery/door/airlock/centcom{
- name = "NMSS Odin CCIA Administration";
- opacity = 1
+ name = "NMSS Odin CCIA Administration"
},
/turf/unsimulated/floor{
icon_state = "floor"
@@ -6342,8 +6330,7 @@
/area/centcom)
"ayx" = (
/obj/machinery/door/airlock/centcom{
- name = "To: NSS Exodus Processing";
- opacity = 1
+ name = "To: NSS Exodus Processing"
},
/turf/unsimulated/floor,
/area/centcom/living)
@@ -7053,8 +7040,7 @@
/area/centcom/creed)
"aAS" = (
/obj/machinery/door/airlock/centcom{
- name = "NMSS Odin Sub-Deck";
- opacity = 1
+ name = "NMSS Odin Sub-Deck"
},
/turf/unsimulated/floor{
icon_state = "bluefull"
@@ -7468,7 +7454,6 @@
"aCv" = (
/obj/machinery/door/airlock/centcom{
name = "Creed's Office";
- opacity = 1;
req_access = list(108,109)
},
/obj/machinery/door/blast/regular{
@@ -7701,7 +7686,6 @@
"aDq" = (
/obj/machinery/door/airlock/centcom{
name = "Special Operations";
- opacity = 1;
req_access = list(103)
},
/turf/unsimulated/floor{
@@ -8435,9 +8419,6 @@
/obj/machinery/atmospherics/pipe/simple/visible,
/turf/simulated/floor/plating,
/area/shuttle/skipjack)
-"aGj" = (
-/turf/simulated/floor/plating,
-/area/shuttle/skipjack)
"aGk" = (
/obj/structure/reagent_dispensers/watertank,
/obj/machinery/light/small{
@@ -8623,7 +8604,6 @@
"aGM" = (
/obj/machinery/door/airlock/centcom{
name = "General Access";
- opacity = 1;
req_access = list(101)
},
/turf/unsimulated/floor{
@@ -8838,7 +8818,7 @@
/area/shuttle/skipjack)
"aHD" = (
/obj/structure/table/standard,
-/obj/item/legcuffs,
+/obj/item/handcuffs/legcuffs,
/turf/simulated/floor/shuttle/black,
/area/shuttle/skipjack)
"aHE" = (
@@ -10168,7 +10148,6 @@
"aLL" = (
/obj/machinery/door/airlock/centcom{
name = "Utility Closet";
- opacity = 1;
req_access = list(109)
},
/obj/structure/sign/christmas/wreath,
@@ -10775,8 +10754,7 @@
/area/centcom/spawning)
"aNg" = (
/obj/machinery/door/airlock/centcom{
- name = "Bluespace Artillery Deck";
- opacity = 1
+ name = "Bluespace Artillery Deck"
},
/obj/machinery/door/blast/regular{
dir = 4;
@@ -10892,7 +10870,6 @@
"aNw" = (
/obj/machinery/door/airlock/centcom{
name = "Aurora II Prepatory Wing";
- opacity = 1;
req_access = list(109)
},
/turf/unsimulated/floor{
@@ -11385,7 +11362,6 @@
"aOD" = (
/obj/machinery/door/airlock/centcom{
name = "Arrivals Processing";
- opacity = 1;
req_access = list(101)
},
/turf/unsimulated/floor{
@@ -11412,8 +11388,7 @@
/area/centcom/holding)
"aOJ" = (
/obj/machinery/door/airlock/centcom{
- name = "Bluespace Artillery Deck";
- opacity = 1
+ name = "Bluespace Artillery Deck"
},
/obj/machinery/door/blast/regular{
dir = 4;
@@ -12269,7 +12244,6 @@
"aQI" = (
/obj/machinery/door/airlock/centcom{
name = "General Access";
- opacity = 1;
req_access = list(101)
},
/obj/machinery/door/blast/regular{
@@ -13848,7 +13822,6 @@
"aUt" = (
/obj/machinery/door/airlock/centcom{
name = "Administration Shuttle";
- opacity = 1;
req_access = list(108,109)
},
/obj/machinery/door/blast/regular{
@@ -13966,7 +13939,6 @@
"aUK" = (
/obj/machinery/door/airlock/centcom{
name = "Holding Cell";
- opacity = 1;
req_access = list(101)
},
/obj/machinery/door/blast/regular{
@@ -14724,7 +14696,6 @@
"aWr" = (
/obj/machinery/door/airlock/centcom{
name = "Bridge";
- opacity = 1;
req_access = list(109)
},
/turf/unsimulated/floor{
@@ -14755,7 +14726,6 @@
"aWv" = (
/obj/machinery/door/airlock/centcom{
name = "Communications Control";
- opacity = 1;
req_access = list(104)
},
/turf/unsimulated/floor{
@@ -14794,8 +14764,7 @@
/area/centcom/ferry)
"aWz" = (
/obj/machinery/door/airlock/centcom{
- name = "Interview Room";
- opacity = 1
+ name = "Interview Room"
},
/turf/unsimulated/floor{
icon_state = "carpet"
@@ -14829,7 +14798,6 @@
"aWC" = (
/obj/machinery/door/airlock/centcom{
name = "Special Operations";
- opacity = 1;
req_access = list(103)
},
/obj/machinery/door/blast/regular{
@@ -14912,7 +14880,6 @@
"aWM" = (
/obj/machinery/door/airlock/centcom{
name = "Teleporter Bay";
- opacity = 1;
req_access = list(107)
},
/turf/unsimulated/floor{
@@ -15680,7 +15647,6 @@
"aYO" = (
/obj/machinery/door/airlock/centcom{
name = "Special Operations";
- opacity = 1;
req_access = list(103)
},
/obj/machinery/door/blast/regular{
@@ -15857,7 +15823,6 @@
"aZi" = (
/obj/machinery/door/airlock/centcom{
name = "Research Facility";
- opacity = 1;
req_access = list(104)
},
/turf/unsimulated/floor{
@@ -16464,7 +16429,6 @@
"crG" = (
/obj/machinery/door/airlock/centcom{
name = "Fore Checkpoint";
- opacity = 1;
req_access = list(101)
},
/turf/unsimulated/floor{
@@ -16526,7 +16490,6 @@
id_tag = "CentComArrivalsForeDrAft";
locked = 1;
name = "Fore Checkpoint";
- opacity = 1;
req_access = list(101)
},
/turf/unsimulated/floor{
@@ -16562,7 +16525,6 @@
"der" = (
/obj/machinery/door/airlock/centcom{
name = "Thunderdome";
- opacity = 1;
req_access = list(101)
},
/obj/machinery/door/blast/regular{
@@ -16830,7 +16792,6 @@
"evz" = (
/obj/machinery/door/airlock/centcom{
name = "Aft Checkpoint";
- opacity = 1;
req_access = list(101)
},
/turf/unsimulated/floor{
@@ -16930,8 +16891,7 @@
/area/centcom/holding)
"eWW" = (
/obj/machinery/door/airlock/centcom{
- name = "Traditional Vaurcesian Cuisine";
- opacity = 1
+ name = "Traditional Vaurcesian Cuisine"
},
/turf/unsimulated/floor{
icon_state = "floor"
@@ -16980,7 +16940,6 @@
"fde" = (
/obj/machinery/door/airlock/centcom{
name = "IAC Regional Outpost A23";
- opacity = 1;
req_access = list(109)
},
/turf/unsimulated/floor{
@@ -17963,7 +17922,6 @@
"iBj" = (
/obj/machinery/door/airlock/centcom{
name = "Romanovich Exploration Guild";
- opacity = 1;
req_access = list(109)
},
/turf/unsimulated/floor{
@@ -18911,7 +18869,6 @@
"oIe" = (
/obj/machinery/door/airlock/centcom{
name = "General Access";
- opacity = 1;
req_access = list(101)
},
/obj/machinery/door/blast/regular{
@@ -18925,7 +18882,6 @@
"oIB" = (
/obj/machinery/door/airlock/centcom{
name = "General Access";
- opacity = 1;
req_access = list(101)
},
/turf/unsimulated/floor{
@@ -19213,8 +19169,7 @@
/area/centcom/spawning)
"qkB" = (
/obj/machinery/door/airlock/centcom{
- name = "Real Fake Doors! and Co";
- opacity = 1
+ name = "Real Fake Doors! and Co"
},
/turf/unsimulated/floor{
icon_state = "floor"
@@ -19499,7 +19454,6 @@
"rzt" = (
/obj/machinery/door/airlock/centcom{
name = "The Big Empty";
- opacity = 1;
req_access = list(109)
},
/turf/unsimulated/floor{
@@ -19844,7 +19798,6 @@
id_tag = "CentComArrivalsAftDrAft";
locked = 1;
name = "Aft Checkpoint";
- opacity = 1;
req_access = list(101)
},
/turf/unsimulated/floor{
@@ -19867,7 +19820,6 @@
"tBx" = (
/obj/machinery/door/airlock/centcom{
name = "General Access";
- opacity = 1;
req_access = newlist()
},
/turf/unsimulated/floor{
@@ -20257,7 +20209,6 @@
"vdL" = (
/obj/machinery/door/airlock/centcom{
name = "Staff Only";
- opacity = 1;
req_access = list(109)
},
/turf/unsimulated/floor{
@@ -20587,7 +20538,6 @@
"xcE" = (
/obj/machinery/door/airlock/centcom{
name = "Security Checkpoint";
- opacity = 1;
req_access = list(109)
},
/turf/unsimulated/floor{
@@ -20687,7 +20637,6 @@
id_tag = "CentComArrivalsAftDrFore";
locked = 1;
name = "Aft Checkpoint";
- opacity = 1;
req_access = list(101)
},
/turf/unsimulated/floor{
@@ -25210,10 +25159,10 @@ aFf
aFw
dJT
aFU
-aGj
-aGj
-aGj
-aGj
+aHl
+aHl
+aHl
+aHl
aHa
aHu
aHC
@@ -25467,10 +25416,10 @@ dJT
dJT
dJT
aFV
-aGj
-aGj
+aHl
+aHl
aGF
-aGj
+aHl
aHb
dJT
xQA
@@ -25724,9 +25673,9 @@ aaM
aaM
dJT
aFW
-aGj
-aGj
-aGj
+aHl
+aHl
+aHl
dJT
dJT
dJT
@@ -25982,8 +25931,8 @@ aaM
dJT
aFX
aGk
-aGj
-aGj
+aHl
+aHl
aGO
aHc
aHc
@@ -28552,8 +28501,8 @@ aaM
dJT
aFZ
aGp
-aGj
-aGj
+aHl
+aHl
aGO
aHj
aHv
@@ -28808,8 +28757,8 @@ aaM
aaM
dJT
aGa
-aGj
-aGj
+aHl
+aHl
aGK
dJT
dJT
@@ -29065,9 +29014,9 @@ dJT
dJT
dJT
aGb
-aGj
+aHl
aGB
-aGj
+aHl
aGS
aHk
dJT
@@ -29323,7 +29272,7 @@ aFB
dJT
aGc
aGq
-aGj
+aHl
aGL
aGT
aGj