diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm
index 803c1c0399d..9471954e314 100644
--- a/code/datums/uplink_item.dm
+++ b/code/datums/uplink_item.dm
@@ -518,6 +518,14 @@ var/list/uplink_items = list()
/datum/uplink_item/stealthy_weapons
category = "Stealthy and Inconspicuous Weapons"
+/datum/uplink_item/stealthy_weapons/garrote
+ name = "Fiber Wire Garrote"
+ desc = "A length of fiber wire between two wooden handles, perfect for the discrete assassin. This weapon, when used on a target from behind \
+ will instantly put them in your grasp and silence them, as well as causing rapid suffocation. Does not work on those who do not need to breathe."
+ reference = "GAR"
+ item = /obj/item/weapon/twohanded/garrote
+ cost = 12
+
/datum/uplink_item/stealthy_weapons/martialarts
name = "Martial Arts Scroll"
desc = "This scroll contains the secrets of an ancient martial arts technique. You will master unarmed combat, \
diff --git a/code/game/objects/items/weapons/garrote.dm b/code/game/objects/items/weapons/garrote.dm
index bfd76ed0f97..00140497b49 100644
--- a/code/game/objects/items/weapons/garrote.dm
+++ b/code/game/objects/items/weapons/garrote.dm
@@ -1,9 +1,17 @@
-/obj/item/weapon/twohanded/garrote
+/*
+ * Contains:
+ * Traitor fiber wire
+ * Improvised garrotes
+ */
+
+/obj/item/weapon/twohanded/garrote // 12TC traitor item
name = "fiber wire"
- desc = "A length of razor-thin wire with a wooden handle on either end.
You suspect you'd have to be behind the target to use this weapon effectively."
+ desc = "A length of razor-thin wire with an elegant wooden handle on either end.
You suspect you'd have to be behind the target to use this weapon effectively."
icon_state = "garrot_wrap"
w_class = 1
var/mob/living/carbon/human/strangling
+ var/improvised = 0
+ var/garrote_time
/obj/item/weapon/twohanded/garrote/update_icon()
if(strangling) // If we're strangling someone we want our icon to stay wielded
@@ -12,9 +20,22 @@
icon_state = "garrot_[wielded ? "un" : ""]wrap"
+/obj/item/weapon/twohanded/garrote/improvised // Made via tablecrafting
+ name = "garrote"
+ desc = "A length of cable with a shoddily-carved wooden handle tied to either end.
You suspect you'd have to be behind the target to use this weapon effectively."
+ icon_state = "garrot_I_wrap"
+ improvised = 1
+
+/obj/item/weapon/twohanded/garrote/improvised/update_icon()
+ if(strangling)
+ icon_state = "garrot_I_unwrap"
+ return
+
+ icon_state = "garrot_I_[wielded ? "un" : ""]wrap"
+
/obj/item/weapon/twohanded/garrote/wield(mob/living/carbon/user)
if(strangling)
- user.visible_message("[user] removes the [src] from [strangling]'s neck.", \
+ user.visible_message("[user] removes the [src] from [strangling]'s neck.", \
"You remove the [src] from [strangling]'s neck.")
strangling = null
@@ -25,6 +46,14 @@
..()
/obj/item/weapon/twohanded/garrote/attack(mob/living/carbon/M as mob, mob/user as mob)
+ if(garrote_time > world.time) // Cooldown
+ return
+
+ if(!istype(user, /mob/living/carbon/human)) // spap_hand is a proc of /mob/living, user is simply /mob
+ return
+
+ var/mob/living/carbon/human/U = user
+
if(!wielded)
user << "You must use both hands to garrote [M]!"
return
@@ -33,22 +62,22 @@
user << "You don't think that garroting [M] would be very effective..."
return
- if(M == user)
- user << "You decide against strangling yourself for the time being."
+ if(M == U)
+ U.suicide() // This will display a prompt for confirmation first.
+ return
- if(M.dir != user.dir)
+ if(M.dir != U.dir)
user << "You cannot use [src] on [M] from that angle!"
return
+ if(improvised && ((M.head && (M.head.flags & HEADCOVERSMOUTH)) || (M.wear_mask && (M.wear_mask.flags & MASKCOVERSMOUTH)))) // Improvised garrotes are blocked by mouth-covering items.
+ user << "[M]'s neck is blocked by something they're wearing!"
+
if(strangling)
user << "You cannot use [src] on two people at once!"
return
- unwield(user)
-
- if(!istype(user, /mob/living/carbon/human)) // spap_hand is a proc of /mob/living, user is simply /mob
- return
- var/mob/living/carbon/human/U = user
+ unwield(U)
U.swap_hand() // For whatever reason the grab will not properly work if we don't have the free hand active.
M.grabbedby(U, 1)
@@ -56,18 +85,23 @@
U.swap_hand()
if(G && istype(G))
- G.state = GRAB_NECK
- G.hud.icon_state = "kill"
- G.hud.name = "kill"
+ if(improvised) // Improvised garrotes start you off with a passive grab, but keep you stunned like an agressive grab.
+ M.Stun(4)
+ else
+ G.state = GRAB_NECK
+ G.hud.icon_state = "kill"
+ G.hud.name = "kill"
+ M.silent += 1
+ garrote_time = world.time + 10
processing_objects.Add(src)
strangling = M
update_icon()
playsound(src.loc, 'sound/weapons/cablecuff.ogg', 15, 1, -1)
- M.visible_message("[user] comes from behind and begins garroting [M] with the [src]!", \
- "[user]\ begins garroting you with the [src]! You are unable to speak!", \
+ M.visible_message("[U] comes from behind and begins garroting [M] with the [src]!", \
+ "[U]\ begins garroting you with the [src]![improvised ? "" : " You are unable to speak!"]", \
"You hear struggling and wire strain against flesh!")
return
@@ -81,7 +115,6 @@
return
var/mob/living/carbon/human/user = loc
- var/mob/living/carbon/human/target = strangling
var/obj/item/weapon/grab/G
if(src == user.r_hand && istype(user.l_hand, /obj/item/weapon/grab))
@@ -91,8 +124,8 @@
G = user.r_hand
else
- user.visible_message("[user] loses his grip on [target]'s neck.", \
- "You lose your grip on [target]'s neck.")
+ user.visible_message("[user] loses his grip on [strangling]'s neck.", \
+ "You lose your grip on [strangling]'s neck.")
strangling = null
update_icon()
@@ -101,8 +134,8 @@
return
if(!G.affecting)
- user.visible_message("[user] loses his grip on [target]'s neck.", \
- "You lose your grip on [target]'s neck.")
+ user.visible_message("[user] loses his grip on [strangling]'s neck.", \
+ "You lose your grip on [strangling]'s neck.")
strangling = null
update_icon()
@@ -110,9 +143,18 @@
return
- strangling.silent += 1
- strangling.adjustOxyLoss(2)
- strangling.apply_damage(2, BRUTE, "head", sharp = 1, edge = 1, used_weapon = "Razor Wire") // Razor sharp wire, causes bleeding in the neck but only if the head is unarmored.
+ if(G.state < GRAB_NECK) // Only possible with improvised garrotes, essentially this will stun people as if they were aggressively grabbed. Allows for resisting out if you're quick, but not running away.
+ strangling.Stun(4)
+
+ if(improvised)
+ strangling.stuttering = max(strangling.stuttering, 3)
+ strangling.apply_damage(2, OXY, "head")
+ return
+
+
+ strangling.silent = max(strangling.silent, 3) // Non-improvised effects
+ strangling.apply_damage(4, OXY, "head")
+
/obj/item/weapon/twohanded/garrote/suicide_act(mob/user)
user.visible_message("[user] is wrapping the [src] around \his neck and pulling the handles! It looks like \he's trying to commit suicide.")
diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm
index fa0a59010d4..db39efa3845 100644
--- a/code/modules/crafting/recipes.dm
+++ b/code/modules/crafting/recipes.dm
@@ -192,4 +192,12 @@
result = /obj/item/weapon/soap/ducttape
time = 100
reqs = list(/obj/item/stack/tape_roll = 1,
- /datum/reagent/liquidgibs = 10)
\ No newline at end of file
+ /datum/reagent/liquidgibs = 10)
+
+/datum/table_recipe/garrote
+ name = "Makeshift Garrote"
+ result = /obj/item/weapon/twohanded/garrote/improvised
+ time = 15
+ reqs = list(/obj/item/stack/sheet/wood = 1,
+ /obj/item/stack/cable_coil = 5)
+ tools = list(/obj/item/weapon/kitchen/knife) // Gotta carve the wood into handles
\ No newline at end of file
diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi
index e56f92a7cc1..728bfaba198 100644
Binary files a/icons/obj/weapons.dmi and b/icons/obj/weapons.dmi differ