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