From f983245c3f6d7bd9ab2dd5e0c0956f6fa3f0c951 Mon Sep 17 00:00:00 2001 From: SamCroswell Date: Mon, 21 Mar 2016 20:31:55 -0400 Subject: [PATCH] Garrotes, Commit 2 --- code/datums/uplink_item.dm | 8 ++ code/game/objects/items/weapons/garrote.dm | 90 +++++++++++++++------ code/modules/crafting/recipes.dm | 10 ++- icons/obj/weapons.dmi | Bin 46891 -> 47616 bytes 4 files changed, 83 insertions(+), 25 deletions(-) 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 e56f92a7cc1f824b04ed9774221e1e4676680f87..728bfaba198f4c5ccacf595db07e583d702f6465 100644 GIT binary patch delta 5509 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 XXrH^+d&eaEJObXgSePy delta 4778 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