diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index a905e5d90aa..a0d9749744c 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -54,8 +54,8 @@ var/datum/organ/external/temp = M:organs_by_name["r_hand"] if (M.hand) temp = M:organs_by_name["l_hand"] - if(temp && temp.status & ORGAN_DESTROYED) - M << "\red Yo- wait a minute." + if(temp && !temp.is_usable()) + M << "\red You can't use your [temp.display_name]" return for(var/datum/disease/D in viruses) @@ -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.status & ORGAN_DESTROYED) - M << "\red Yo- wait a minute." - return - for(var/datum/disease/D in viruses) if(D.spread_by_touch()) @@ -187,6 +179,8 @@ status += "numb" if(org.status & ORGAN_DESTROYED) status = "MISSING!" + if(org.status & ORGAN_MUTATED) + status = "weirdly shapen." if(status == "") status = "OK" src.show_message(text("\t []My [] is [].",status=="OK"?"\blue ":"\red ",org.display_name,status),1) 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..38c5f9d59ab 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 da0a999fdf5..c765bf9711f 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -126,7 +126,8 @@ Please contact me on #coderbus IRC. ~Carn x var/list/overlays_lying[TOTAL_LAYERS] var/list/overlays_standing[TOTAL_LAYERS] var/previous_damage_appearance // store what the body last looked like, so we only have to update it if something changed - var/race_icon + var/icon/race_icon + var/icon/deform_icon //UPDATES OVERLAYS FROM OVERLAYS_LYING/OVERLAYS_STANDING //this proc is messy as I was forced to include some old laggy cloaking code to it so that I don't break cloakers @@ -234,18 +235,16 @@ 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) -// stand_icon.ColorTone(hulk_color_mod) var/list/TONE = ReadRGB(hulk_color_mod) 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 @@ -255,28 +254,22 @@ 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 - if(istype(part, /datum/organ/external/groin)) - if(skeleton) - temp = new /icon(race_icon, "groin") - else - temp = new /icon(race_icon, "groin_[g]") - else if(istype(part, /datum/organ/external/head)) - if(skeleton) - temp = new /icon(race_icon, "head") - else - temp = new /icon(race_icon, "head_[g]") + if (istype(part, /datum/organ/external/groin) || istype(part, /datum/organ/external/head)) + temp = part.get_icon(g) else - temp = new /icon(race_icon, "[part.icon_name]") + temp = part.get_icon() + if(part.status & ORGAN_ROBOT) temp.GrayScale() + if(part.status & ORGAN_DEAD) temp.ColorTone(necrosis_color_mod) temp.SetIntensity(0.7) + else if(!skeleton) if(husk) temp.ColorTone(husk_color_mod) else if(hulk) -// temp.ColorTone(hulk_color_mod) var/list/TONE = ReadRGB(hulk_color_mod) temp.MapColors(rgb(TONE[1],0,0),rgb(0,TONE[2],0),rgb(0,0,TONE[3])) else if(plant) @@ -442,12 +435,16 @@ proc/get_damage_icon_part(damage_state, body_part) switch(dna.mutantrace) if("tajaran") race_icon = 'icons/mob/human_races/r_tajaran.dmi' + deform_icon = 'icons/mob/human_races/r_def_tajaran.dmi' if("lizard") race_icon = 'icons/mob/human_races/r_lizard.dmi' + deform_icon = 'icons/mob/human_races/r_def_lizard.dmi' if("skrell") race_icon = 'icons/mob/human_races/r_skrell.dmi' + deform_icon = 'icons/mob/human_races/r_def_skrell.dmi' else race_icon = 'icons/mob/human_races/r_human.dmi' + deform_icon = 'icons/mob/human_races/r_def_human.dmi' else icon = 'icons/mob/human_races/r_human.dmi' diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index e0d73cfdbb0..160554d4181 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -11,6 +11,9 @@ proc/receive_chem(chemical as obj) return 0 +/datum/organ/proc/get_icon() + return icon('icons/mob/human.dmi',"blank") + //Handles chem traces /mob/living/carbon/human/proc/handle_trace_chems() //New are added for reagents to random organs. diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 8e646c830f6..8495094abdf 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -547,6 +547,14 @@ if(T) T.robotize() +/datum/organ/external/proc/mutate() + src.status |= ORGAN_MUTATED + owner.update_body() + +/datum/organ/external/proc/unmutate() + src.status &= ~ORGAN_MUTATED + owner.update_body() + /datum/organ/external/proc/get_damage() //returns total damage return max(brute_dam + burn_dam - perma_injury, perma_injury) //could use health? @@ -556,21 +564,32 @@ return 1 return 0 +/datum/organ/external/get_icon(gender="") + if (status & ORGAN_MUTATED) + return new /icon(owner.deform_icon, "[icon_name][gender ? "_[gender]" : ""]") + else + return new /icon(owner.race_icon, "[icon_name][gender ? "_[gender]" : ""]") + + +/datum/organ/external/proc/is_usable() + return !(status & (ORGAN_DESTROYED|ORGAN_MUTATED|ORGAN_DEAD)) + /**************************************************** ORGAN DEFINES ****************************************************/ /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 @@ -653,27 +672,37 @@ body_part = HEAD var/disfigured = 0 - take_damage(brute, burn, sharp, used_weapon = null, list/forbidden_limbs = list()) - ..(brute, burn, sharp, used_weapon, forbidden_limbs) - if (!disfigured) - if (brute_dam > 40) - if (prob(50)) - disfigure("brute") - if (burn_dam > 40) - disfigure("burn") +/datum/organ/external/head/get_icon() + if (!owner) + return ..() + 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]") - proc/disfigure(var/type = "brute") - if (disfigured) - return - if(type == "brute") - owner.visible_message("\red You hear a sickening cracking sound coming from \the [owner]'s face.", \ - "\red Your face becomes unrecognizible mangled mess!", \ - "\red You hear a sickening crack.") - else - owner.visible_message("\red [owner]'s face melts away, turning into mangled mess!", \ - "\red Your face melts off!", \ - "\red You hear a sickening sizzle.") - disfigured = 1 +/datum/organ/external/head/take_damage(brute, burn, sharp, used_weapon = null, list/forbidden_limbs = list()) + ..(brute, burn, sharp, used_weapon, forbidden_limbs) + if (!disfigured) + if (brute_dam > 40) + if (prob(50)) + disfigure("brute") + if (burn_dam > 40) + disfigure("burn") + +/datum/organ/external/head/proc/disfigure(var/type = "brute") + if (disfigured) + return + if(type == "brute") + owner.visible_message("\red You hear a sickening cracking sound coming from \the [owner]'s face.", \ + "\red Your face becomes unrecognizible mangled mess!", \ + "\red You hear a sickening crack.") + else + owner.visible_message("\red [owner]'s face melts away, turning into mangled mess!", \ + "\red Your face melts off!", \ + "\red You hear a sickening sizzle.") + disfigured = 1 /**************************************************** EXTERNAL ORGAN ITEMS diff --git a/code/setup.dm b/code/setup.dm index 9f319d3c82e..fcfb61e9195 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -583,6 +583,7 @@ var/list/TAGGERLOCATIONS = list("Disposals", #define ORGAN_SPLINTED 256 #define SALVED 512 #define ORGAN_DEAD 1024 +#define ORGAN_MUTATED 2048 #define ROUNDSTART_LOGOUT_REPORT_TIME 6000 //Amount of time (in deciseconds) after the rounds starts, that the player disconnect report is issued. diff --git a/html/changelog.html b/html/changelog.html index efa20e78e37..5fec8533dfa 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -57,7 +57,28 @@ Stuff which is in development and not yet visible to players or just code relate (ie. code improvements for expandability, etc.) should not be listed here. They should be listed in the changelog upon commit though. Thanks. --> -