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