From 2416ae715c072878ab1960fafecdca671d04e0c3 Mon Sep 17 00:00:00 2001 From: Nanai Date: Wed, 13 Nov 2013 19:22:10 -0500 Subject: [PATCH] Full Eye and Robot Organ Implementation Tested work to implement eyes ad internal organs and the charpref selectable robotic organ replacements for heart and eyes, both for assisted and fully mechanical variants! --- code/modules/client/preferences.dm | 61 +++++++++++++++++-- .../mob/living/carbon/human/human_defense.dm | 6 +- code/modules/mob/living/carbon/human/life.dm | 12 ++++ code/modules/organs/blood.dm | 4 +- code/modules/organs/organ.dm | 13 ++-- code/modules/organs/organ_internal.dm | 56 +++++++++++------ 6 files changed, 120 insertions(+), 32 deletions(-) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index ca9b23ef3d..51d8bb92da 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 82ccf01492..2d06c5fee7 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 4510d0c1a6..d9354dccd6 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 6be181da08..a0a88e2120 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 15ca30f2ce..89f66c1720 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 03a4f96da4..7fb4eaf4dc 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