diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index c730a175b95..a0d9749744c 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -76,14 +76,6 @@
/mob/living/carbon/attack_paw(mob/M as mob)
if(!istype(M, /mob/living/carbon)) return
- if (hasorgans(M))
- var/datum/organ/external/temp = M:organs_by_name["r_hand"]
- if (M.hand)
- temp = M:organs_by_name["l_hand"]
- if(temp && !temp.is_usable())
- M << "\red You can't use your [temp.display_name]"
- return
-
for(var/datum/disease/D in viruses)
if(D.spread_by_touch())
diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm
index 4ce561eff16..92fb75a1c17 100644
--- a/code/modules/mob/living/carbon/human/human_attackhand.dm
+++ b/code/modules/mob/living/carbon/human/human_attackhand.dm
@@ -3,6 +3,13 @@
M << "No attacking people at spawn, you jackass."
return
+ var/datum/organ/external/temp = M:organs_by_name["r_hand"]
+ if (M.hand)
+ temp = M:organs_by_name["l_hand"]
+ if(temp && !temp.is_usable())
+ M << "\red You can't use your [temp.display_name]."
+ return
+
..()
if((M != src) && check_shields(0, M.name))
diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm
index c12dc980240..e33d788fd97 100644
--- a/code/modules/mob/living/carbon/human/human_damage.dm
+++ b/code/modules/mob/living/carbon/human/human_damage.dm
@@ -63,6 +63,35 @@
if(HULK in mutations) return
..()
+/mob/living/carbon/human/adjustCloneLoss(var/amount)
+ ..()
+ var/heal_prob = max(0, 80 - getCloneLoss())
+ var/mut_prob = min(80, getCloneLoss()+10)
+ if (amount > 0)
+ if (prob(mut_prob))
+ var/list/datum/organ/external/candidates = list()
+ for (var/datum/organ/external/O in organs)
+ if(!(O.status & ORGAN_MUTATED))
+ candidates |= O
+ if (candidates.len)
+ var/datum/organ/external/O = pick(candidates)
+ O.mutate()
+ src << "Something is not right with your [O.display_name]..."
+ return
+ else
+ if (prob(heal_prob))
+ for (var/datum/organ/external/O in organs)
+ if (O.status & ORGAN_MUTATED)
+ O.unmutate()
+ src << "Your [O.display_name] is shaped normally again."
+ return
+
+ if (getCloneLoss() < 1)
+ for (var/datum/organ/external/O in organs)
+ world << "[O.display_name]!"
+ if (O.status & ORGAN_MUTATED)
+ O.unmutate()
+ src << "Your [O.display_name] is shaped normally again."
////////////////////////////////////////////
//Returns a list of damaged organs
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 18f4d643c7f..c765bf9711f 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -235,8 +235,9 @@ proc/get_damage_icon_part(damage_state, body_part)
var/g = "m"
if(gender == FEMALE) g = "f"
+ var/datum/organ/external/chest = get_organ("chest")
+ stand_icon = chest.get_icon(g)
if(!skeleton)
- stand_icon = new /icon(race_icon, "torso_[g][fat?"_fat":""]")
if(husk)
stand_icon.ColorTone(husk_color_mod)
else if(hulk)
@@ -244,8 +245,6 @@ proc/get_damage_icon_part(damage_state, body_part)
stand_icon.MapColors(rgb(TONE[1],0,0),rgb(0,TONE[2],0),rgb(0,0,TONE[3]))
else if(plant)
stand_icon.ColorTone(plant_color_mod)
- else
- stand_icon = new /icon(race_icon, "torso")
var/datum/organ/external/head = get_organ("head")
var/has_head = 0
@@ -254,7 +253,11 @@ proc/get_damage_icon_part(damage_state, body_part)
for(var/datum/organ/external/part in organs)
if(!istype(part, /datum/organ/external/chest) && !(part.status & ORGAN_DESTROYED))
- var/icon/temp = part.get_icon()
+ var/icon/temp
+ if (istype(part, /datum/organ/external/groin) || istype(part, /datum/organ/external/head))
+ temp = part.get_icon(g)
+ else
+ temp = part.get_icon()
if(part.status & ORGAN_ROBOT)
temp.GrayScale()
diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm
index e7c71525826..8495094abdf 100644
--- a/code/modules/organs/organ_external.dm
+++ b/code/modules/organs/organ_external.dm
@@ -549,7 +549,10 @@
/datum/organ/external/proc/mutate()
src.status |= ORGAN_MUTATED
- owner << "Something is not right with your [display_name]..."
+ owner.update_body()
+
+/datum/organ/external/proc/unmutate()
+ src.status &= ~ORGAN_MUTATED
owner.update_body()
/datum/organ/external/proc/get_damage() //returns total damage
@@ -561,11 +564,12 @@
return 1
return 0
-/datum/organ/external/get_icon()
+/datum/organ/external/get_icon(gender="")
if (status & ORGAN_MUTATED)
- . = new /icon(owner.deform_icon, "[icon_name]")
+ return new /icon(owner.deform_icon, "[icon_name][gender ? "_[gender]" : ""]")
else
- . = new /icon(owner.race_icon, "[icon_name]")
+ return new /icon(owner.race_icon, "[icon_name][gender ? "_[gender]" : ""]")
+
/datum/organ/external/proc/is_usable()
return !(status & (ORGAN_DESTROYED|ORGAN_MUTATED|ORGAN_DEAD))
@@ -576,28 +580,21 @@
/datum/organ/external/chest
name = "chest"
- icon_name = "chest"
+ icon_name = "torso"
display_name = "chest"
max_damage = 150
min_broken_damage = 75
body_part = UPPER_TORSO
+
/datum/organ/external/groin
name = "groin"
- icon_name = "diaper"
+ icon_name = "groin"
display_name = "groin"
max_damage = 115
min_broken_damage = 70
body_part = LOWER_TORSO
-/datum/organ/external/groin/get_icon()
- var/g = "m"
- if(owner.gender == FEMALE) g = "f"
- if (status & ORGAN_MUTATED)
- . = new /icon(owner.deform_icon, "[icon_name]_[g]")
- else
- . = new /icon(owner.race_icon, "[icon_name]_[g]")
-
/datum/organ/external/l_arm
name = "l_arm"
display_name = "left arm"
diff --git a/icons/mob/human_races/r_def_human.dmi b/icons/mob/human_races/r_def_human.dmi
index 4bdcb4ee0d8..e622ef14b5a 100644
Binary files a/icons/mob/human_races/r_def_human.dmi and b/icons/mob/human_races/r_def_human.dmi differ