diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index ca9b23ef3d3..51d8bb92da0 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -262,6 +262,7 @@ datum/preferences //dat += "Skin pattern: Adjust
" dat += "Needs Glasses: [disabilities == 0 ? "No" : "Yes"]
" dat += "Limbs: Adjust
" + dat += "Internal Organs: Adjust
" //display limbs below var/ind = 0 @@ -286,6 +287,10 @@ datum/preferences organ_name = "left hand" if("r_hand") organ_name = "right hand" + if("heart") + organ_name = "heart" + if("eyes") + organ_name = "eyes" if(status == "cyborg") ++ind @@ -297,6 +302,24 @@ datum/preferences if(ind > 1) dat += ", " dat += "\tAmputated [organ_name]" + else if(status == "mechanical") + ++ind + if(ind > 1) + dat += ", " + dat += "\tMechanical [organ_name]" + else if(status == "assisted") + ++ind + if(ind > 1) + dat += ", " + switch(organ_name) + if("heart") + dat += "\tPacemaker-assisted [organ_name]" + if("voicebox") //on adding voiceboxes for speaking skrell/similar replacements + dat += "\tSurgically altered [organ_name]" + if("eyes") + dat += "\tRetinal overlayed [organ_name]" + else + dat += "\tMechanically assisted [organ_name]" if(!ind) dat += "\[...\]

" else @@ -1048,6 +1071,28 @@ datum/preferences if(second_limb) organ_data[second_limb] = "cyborg" + if("organs") + var/organ_name = input(user, "Which internal function do you want to change?") as null|anything in list("Heart", "Eyes") + if(!organ_name) return + + var/organ = null + switch(organ_name) + if("Heart") + organ = "heart" + if("Eyes") + organ = "eyes" + + var/new_state = input(user, "What state do you wish the organ to be in?") as null|anything in list("Normal","Assisted","Mechanical") + if(!new_state) return + + switch(new_state) + if("Normal") + organ_data[organ] = null + if("Assisted") + organ_data[organ] = "assisted" + if("Mechanical") + organ_data[organ] = "mechanical" + if("skin_style") var/skin_style_name = input(user, "Select a new skin style") as null|anything in list("default1", "default2", "default3") if(!skin_style_name) return @@ -1167,19 +1212,27 @@ datum/preferences character.skills = skills // Destroy/cyborgize organs + for(var/name in organ_data) var/datum/organ/external/O = character.organs_by_name[name] - if(!O) continue - + var/datum/organ/internal/I = character.internal_organs_by_name[name] var/status = organ_data[name] + if(status == "amputated") O.amputated = 1 O.status |= ORGAN_DESTROYED O.destspawn = 1 - else if(status == "cyborg") + if(status == "cyborg") O.status |= ORGAN_ROBOT + if(status == "assisted") + I.mechassist() + else if(status == "mechanical") + I.mechanize() + + else continue + if(underwear > underwear_m.len || underwear < 1) - underwear = 1 //I'm sure this is 100% unnecessary, but I'm paranoid... sue me. + underwear = 0 //I'm sure this is 100% unnecessary, but I'm paranoid... sue me. //HAH NOW NO MORE MAGIC CLONING UNDIES character.underwear = underwear if(backbag > 4 || backbag < 1) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 82ccf014921..2d06c5fee77 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -159,9 +159,9 @@ emp_act for(var/datum/organ/external/O in organs) if(O.status & ORGAN_DESTROYED) continue O.emp_act(severity) - for(var/datum/organ/internal/O in internal_organs) - if(O.robotic == 0) continue - O.emp_act(severity) + for(var/datum/organ/internal/I in O.internal_organs) + if(I.robotic == 0) continue + I.emp_act(severity) ..() diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 4510d0c1a64..d9354dccd63 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -960,6 +960,9 @@ var/datum/organ/internal/liver/liver = internal_organs["liver"] liver.process() + var/datum/organ/internal/eyes/eyes = internal_organs["eyes"] + eyes.process() + updatehealth() return //TODO: DEFERRED @@ -1492,6 +1495,15 @@ if(temp <= PULSE_FAST && temp >= PULSE_NONE) temp++ break + for(var/datum/reagent/R in reagents.reagent_list) //To avoid using fakedeath + if(R.id in heartstopper) + temp = PULSE_NONE + break + for(var/datum/reagent/R in reagents.reagent_list) //Conditional heart-stoppage + if(R.id in cheartstopper) + if(R.volume >= R.overdose) + temp = PULSE_NONE + break return temp diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm index 6be181da089..a0a88e21209 100644 --- a/code/modules/organs/blood.dm +++ b/code/modules/organs/blood.dm @@ -60,7 +60,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 if(heart.min_bruised_damage to heart.min_broken_damage) blood_volume *= 0.6 if(heart.min_broken_damage to INFINITY) - blood_volume *= 0.4 + blood_volume *= 0.3 //Effects of bloodloss switch(blood_volume) @@ -93,7 +93,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 src << "\red You feel extremely [word]" if(BLOOD_VOLUME_SURVIVE to BLOOD_VOLUME_BAD) oxyloss += 5 - toxloss += 1 + toxloss += 3 if(prob(15)) var/word = pick("dizzy","woosey","faint") src << "\red You feel extremely [word]" diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index 15ca30f2cee..89f66c17202 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -35,6 +35,7 @@ /mob/living/carbon/human/var/list/organs = list() /mob/living/carbon/human/var/list/organs_by_name = list() // map organ names to organs +/mob/living/carbon/human/var/list/internal_organs_by_name = list() // so internal organs have less ickiness too //Creates and initializes and connects external and internal organs /mob/living/carbon/human/proc/make_organs() @@ -51,12 +52,12 @@ organs_by_name["l_foot"] = new/datum/organ/external/l_foot(organs_by_name["l_leg"]) organs_by_name["r_foot"] = new/datum/organ/external/r_foot(organs_by_name["r_leg"]) - new/datum/organ/internal/heart(src) - new/datum/organ/internal/lungs(src) - new/datum/organ/internal/liver(src) - new/datum/organ/internal/kidney(src) - new/datum/organ/internal/brain(src) - new/datum/organ/internal/eyes(src) + internal_organs_by_name["heart"] = new/datum/organ/internal/heart(src) + internal_organs_by_name["lungs"] = new/datum/organ/internal/lungs(src) + internal_organs_by_name["liver"] = new/datum/organ/internal/liver(src) + internal_organs_by_name["kidney"] = new/datum/organ/internal/kidney(src) + internal_organs_by_name["brain"] = new/datum/organ/internal/brain(src) + internal_organs_by_name["eyes"] = new/datum/organ/internal/eyes(src) for(var/name in organs_by_name) organs += organs_by_name[name] diff --git a/code/modules/organs/organ_internal.dm b/code/modules/organs/organ_internal.dm index 03a4f96da4b..7fb4eaf4dcf 100644 --- a/code/modules/organs/organ_internal.dm +++ b/code/modules/organs/organ_internal.dm @@ -32,23 +32,47 @@ /datum/organ/internal/proc/take_damage(amount, var/silent=0) if(src.robotic == 2) - src.damage += amount * 0.8 - src.damage += amount + src.damage += (amount * 0.8) + else + src.damage += amount var/datum/organ/external/parent = owner.get_organ(parent_organ) + var/datum/organ/internal/eyes/E + var/datum/organ/internal/heart/H if (!silent) - owner.custom_pain("Something inside your [parent.display_name] hurts a lot.", 1) + if(istype(E)) + owner.custom_pain("Your eyes burn like mad!", 1) + if(istype(H)) + owner.custom_pain("You feel a sudden, stabbing pain inside of your [parent.display_name]!", 1) + else owner.custom_pain("Something inside your [parent.display_name] hurts a lot.", 1) /datum/organ/internal/proc/emp_act(severity) - if(src.robotic == 1) - take_damage(15, 0) - if(severity == 2) - take_damage(5, 0) - if(src.robotic == 2) - take_damage(30, 0) - if(severity == 2) - take_damage(15, 0) + switch(robotic) + if(0) + return + if(1) + switch (severity) + if (1.0) + take_damage(20,0) + return + if (2.0) + take_damage(7,0) + return + if(3.0) + take_damage(3,0) + return + if(2) + switch (severity) + if (1.0) + take_damage(40,0) + return + if (2.0) + take_damage(15,0) + return + if(3.0) + take_damage(10,0) + return /datum/organ/internal/proc/mechanize() //Being used to make robutt hearts, etc robotic = 2 @@ -130,9 +154,7 @@ parent_organ = "head" process() //Eye damage replaces the old eye_stat var. - if(damage > min_bruised_damage) - if(damage > min_broken_damage) - owner.client.screen += global_hud.darkMask - owner.eye_blind = 20 - else - owner.client.screen += global_hud.vimpaired + if(is_bruised()) + owner.eye_blurry = 20 + if(is_broken()) + owner.eye_blind = 20