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