diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm
index 5546a0db02..9508341c04 100644
--- a/code/game/objects/items/weapons/handcuffs.dm
+++ b/code/game/objects/items/weapons/handcuffs.dm
@@ -92,6 +92,28 @@
return
return
+var/last_chew = 0
+/mob/living/carbon/human/RestrainedClickOn(var/atom/A)
+ if (A != src) return ..()
+ if (last_chew + 26 > world.time) return
+
+ var/mob/living/carbon/human/H = A
+ if (H.a_intent != "hurt") return
+ if (H.zone_sel.selecting != "mouth") return
+
+ var/datum/organ/external/O = H.organs_by_name[H.hand?"l_hand":"r_hand"]
+ if (!O) return
+
+ var/s = "\red [H.name] chews on \his [O.display_name]!"
+ H.visible_message(s, "\red You chew on your [O.display_name]!")
+ H.attack_log += text("\[[time_stamp()]\] [s] ([H.ckey])")
+ log_attack("[s] ([H.ckey])")
+
+ if(O.take_damage(3,0,1,"teeth marks"))
+ H:UpdateDamageIcon()
+
+ last_chew = world.time
+
/obj/item/weapon/handcuffs/cable
name = "cable restraints"
desc = "Looks like some cables tied together. Could be used to tie something up."
@@ -123,4 +145,4 @@
color = "#FFFFFF"
/obj/item/weapon/handcuffs/cyborg
- dispenser = 1
\ No newline at end of file
+ dispenser = 1
diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm
index 8ba5c0939a..466986b008 100644
--- a/code/modules/organs/organ_external.dm
+++ b/code/modules/organs/organ_external.dm
@@ -570,11 +570,32 @@ This function completely restores a damaged organ to perfect condition.
owner.update_body(1)
+ // OK so maybe your limb just flew off, but if it was attached to a pair of cuffs then hooray! Freedom!
+ release_restraints()
/****************************************************
HELPERS
****************************************************/
+/datum/organ/external/proc/release_restraints()
+ if (owner.handcuffed && body_part in list(ARM_LEFT, ARM_RIGHT, HAND_LEFT, HAND_RIGHT))
+ owner.visible_message(\
+ "\The [owner.handcuffed.name] falls off of [owner.name].",\
+ "\The [owner.handcuffed.name] falls off you.")
+
+ owner.handcuffed.loc = owner.loc
+ owner.handcuffed = null
+ owner.update_inv_handcuffed()
+
+ if (owner.legcuffed && body_part in list(FOOT_LEFT, FOOT_RIGHT, LEG_LEFT, LEG_RIGHT))
+ owner.visible_message(\
+ "\The [owner.legcuffed.name] falls off of [owner.name].",\
+ "\The [owner.legcuffed.name] falls off you.")
+
+ owner.legcuffed.loc = owner.loc
+ owner.legcuffed = null
+ owner.update_inv_legcuffed()
+
/datum/organ/external/proc/bandage()
var/rval = 0
src.status &= ~ORGAN_BLEEDING
@@ -603,7 +624,10 @@ This function completely restores a damaged organ to perfect condition.
/datum/organ/external/proc/fracture()
if(status & ORGAN_BROKEN)
return
- owner.visible_message("\red You hear a loud cracking sound coming from \the [owner].","\red Something feels like it shattered in your [display_name]!","You hear a sickening crack.")
+ owner.visible_message(\
+ "\red You hear a loud cracking sound coming from \the [owner].",\
+ "\red Something feels like it shattered in your [display_name]!",\
+ "You hear a sickening crack.")
if(owner.species && !(owner.species.flags & NO_PAIN))
owner.emote("scream")
@@ -612,6 +636,10 @@ This function completely restores a damaged organ to perfect condition.
broken_description = pick("broken","fracture","hairline fracture")
perma_injury = brute_dam
+ // Fractures have a chance of getting you out of restraints
+ if (prob(25))
+ release_restraints()
+
/datum/organ/external/proc/robotize()
src.status &= ~ORGAN_BROKEN
src.status &= ~ORGAN_BLEEDING