diff --git a/code/game/gamemodes/changeling/powers/escape_restraints.dm b/code/game/gamemodes/changeling/powers/escape_restraints.dm index 4e6ed4e5cf..6ec204b6e8 100644 --- a/code/game/gamemodes/changeling/powers/escape_restraints.dm +++ b/code/game/gamemodes/changeling/powers/escape_restraints.dm @@ -21,7 +21,7 @@ if(world.time < changeling.next_escape) to_chat(src, "We are still recovering from our last escape...") return 0 - if(!(C.handcuffed || C.legcuffed)) // No need to waste chems if there's nothing to break out of + if(!(C.handcuffed || C.legcuffed || istype(C.wear_suit,/obj/item/clothing/suit/straight_jacket))) // No need to waste chems if there's nothing to break out of to_chat(C, "We are are not restrained in a way we can escape...") return 0 @@ -53,6 +53,12 @@ W.dropped(C) if(W) W.layer = initial(W.layer) + if(C.wear_suit && istype(C.wear_suit, /obj/item/clothing/suit/straight_jacket)) + var/obj/item/clothing/suit/straight_jacket/SJ = C.wear_suit + SJ.loc = C.loc + SJ.dropped(C) + C.wear_suit = null + escape_cooldown *= 1.5 // Straight jackets are tedious compared to cuffs. if(src.mind.changeling.recursive_enhancement) escape_cooldown *= 0.5 diff --git a/code/game/gamemodes/changeling/powers/revive.dm b/code/game/gamemodes/changeling/powers/revive.dm index 0da6c3c3d5..844d7466cf 100644 --- a/code/game/gamemodes/changeling/powers/revive.dm +++ b/code/game/gamemodes/changeling/powers/revive.dm @@ -45,6 +45,36 @@ BITSET(H.hud_updateflag, STATUS_HUD) BITSET(H.hud_updateflag, LIFE_HUD) + if(H.handcuffed) + var/obj/item/weapon/W = H.handcuffed + H.handcuffed = null + if(H.buckled && H.buckled.buckle_require_restraints) + H.buckled.unbuckle_mob() + H.update_inv_handcuffed() + if (H.client) + H.client.screen -= W + if(W) + W.loc = H.loc + W.dropped(H) + if(W) + W.layer = initial(W.layer) + if(H.legcuffed) + var/obj/item/weapon/W = H.legcuffed + H.legcuffed = null + H.update_inv_legcuffed() + if(H.client) + H.client.screen -= W + if(W) + W.loc = H.loc + W.dropped(H) + if(W) + W.layer = initial(W.layer) + if(H.wear_suit && istype(H.wear_suit, /obj/item/clothing/suit/straight_jacket)) + var/obj/item/clothing/suit/straight_jacket/SJ = H.wear_suit + SJ.loc = H.loc + SJ.dropped(H) + H.wear_suit = null + C.halloss = 0 C.shock_stage = 0 //Pain C << "We have regenerated." diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 988be655cb..87365674b4 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -224,6 +224,8 @@ body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL|HIDETIE|HIDEHOLSTER + var/resist_time = 4800 // Eight minutes. + /obj/item/clothing/suit/straight_jacket/attack_hand(mob/living/user as mob) if(ishuman(user)) var/mob/living/carbon/human/H = user diff --git a/code/modules/mob/living/carbon/human/human_resist.dm b/code/modules/mob/living/carbon/human/human_resist.dm new file mode 100644 index 0000000000..05b51cd097 --- /dev/null +++ b/code/modules/mob/living/carbon/human/human_resist.dm @@ -0,0 +1,112 @@ +/mob/living/carbon/human/process_resist() + //drop && roll + if(on_fire && !buckled) + adjust_fire_stacks(-1.2) + Weaken(3) + spin(32,2) + visible_message( + "[src] rolls on the floor, trying to put themselves out!", + "You stop, drop, and roll!" + ) + sleep(30) + if(fire_stacks <= 0) + visible_message( + "[src] has successfully extinguished themselves!", + "You extinguish yourself." + ) + ExtinguishMob() + return TRUE + + if(handcuffed) + spawn() escape_handcuffs() + else if(legcuffed) + spawn() escape_legcuffs() + else if(wear_suit && istype(wear_suit, /obj/item/clothing/suit/straight_jacket)) + spawn() escape_straight_jacket() + else + ..() + +/mob/living/carbon/human/proc/escape_straight_jacket() + setClickCooldown(100) + + if(can_break_straight_jacket()) + break_straight_jacket() + return + + var/mob/living/carbon/human/H = src + var/obj/item/clothing/suit/straight_jacket/SJ = H.wear_suit + + var/breakouttime = SJ.resist_time // Configurable per-jacket! + + var/attack_type = 0 + + if(H.gloves && istype(H.gloves,/obj/item/clothing/gloves/gauntlets/rig)) + breakouttime /= 2 // Pneumatic force goes a long way. + else if(H.species.unarmed_types) + for(var/datum/unarmed_attack/U in H.species.unarmed_types) + if(istype(U, /datum/unarmed_attack/claws)) + breakouttime /= 1.5 + attack_type = 1 + break + else if(istype(U, /datum/unarmed_attack/bite/sharp)) + breakouttime /= 1.25 + attack_type = 2 + break + + switch(attack_type) + if(0) + visible_message( + "\The [src] struggles to remove \the [SJ]!", + "You struggle to remove \the [SJ]. (This will take around [round(breakouttime / 600)] minutes and you need to stand still.)" + ) + if(1) + visible_message( + "\The [src] starts clawing at \the [SJ]!", + "You claw at \the [SJ]. (This will take around [round(breakouttime / 600)] minutes and you need to stand still.)" + ) + if(2) + visible_message( + "\The [src] starts gnawing on \the [SJ]!", + "You gnaw on \the [SJ]. (This will take around [round(breakouttime / 600)] minutes and you need to stand still.)" + ) + + if(do_after(src, breakouttime, incapacitation_flags = INCAPACITATION_DISABLED & INCAPACITATION_KNOCKDOWN)) + if(!wear_suit) + return + visible_message( + "\The [src] manages to remove \the [wear_suit]!", + "You successfully remove \the [wear_suit]." + ) + drop_from_inventory(wear_suit) + +/mob/living/carbon/human/proc/can_break_straight_jacket() + if((HULK in mutations) || species.can_shred(src,1)) + return 1 + return ..() + +/mob/living/carbon/human/proc/break_straight_jacket() + visible_message( + "[src] is trying to rip \the [wear_suit]!", + "You attempt to rip your [wear_suit.name] apart. (This will take around 5 seconds and you need to stand still)" + ) + + if(do_after(src, 20 SECONDS, incapacitation_flags = INCAPACITATION_DEFAULT & ~INCAPACITATION_RESTRAINED)) // Same scaling as breaking cuffs, 5 seconds to 120 seconds, 20 seconds to 480 seconds. + if(!wear_suit || buckled) + return + + visible_message( + "[src] manages to rip \the [wear_suit]!", + "You successfully rip your [wear_suit.name]." + ) + + say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!", "RAAAAAAAARGH!", "HNNNNNNNNNGGGGGGH!", "GWAAAAAAAARRRHHH!", "AAAAAAARRRGH!" )) + + qdel(wear_suit) + wear_suit = null + if(buckled && buckled.buckle_require_restraints) + buckled.unbuckle_mob() + +/mob/living/carbon/human/can_break_cuffs() + if(species.can_shred(src,1)) + return 1 + return ..() diff --git a/code/modules/mob/living/carbon/resist.dm b/code/modules/mob/living/carbon/resist.dm index a86189d5f5..1607559336 100644 --- a/code/modules/mob/living/carbon/resist.dm +++ b/code/modules/mob/living/carbon/resist.dm @@ -153,11 +153,6 @@ legcuffed = null update_inv_legcuffed() -/mob/living/carbon/human/can_break_cuffs() - if(species.can_shred(src,1)) - return 1 - return ..() - /mob/living/carbon/escape_buckle() if(!buckled) return diff --git a/polaris.dme b/polaris.dme index 0ee029a873..8718ffca81 100644 --- a/polaris.dme +++ b/polaris.dme @@ -1906,6 +1906,7 @@ #include "code\modules\mob\living\carbon\human\human_movement.dm" #include "code\modules\mob\living\carbon\human\human_organs.dm" #include "code\modules\mob\living\carbon\human\human_powers.dm" +#include "code\modules\mob\living\carbon\human\human_resist.dm" #include "code\modules\mob\living\carbon\human\human_species.dm" #include "code\modules\mob\living\carbon\human\inventory.dm" #include "code\modules\mob\living\carbon\human\life.dm"