mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-13 11:43:31 +00:00
Moved organ and blood code to module folder.
Moved most organ and blood procs to that folder. Refactored handle_organs a little. Added comments in some places.
This commit is contained in:
@@ -166,11 +166,6 @@
|
|||||||
#include "code\datums\helper_datums\global_iterator.dm"
|
#include "code\datums\helper_datums\global_iterator.dm"
|
||||||
#include "code\datums\helper_datums\teleport.dm"
|
#include "code\datums\helper_datums\teleport.dm"
|
||||||
#include "code\datums\helper_datums\topic_input.dm"
|
#include "code\datums\helper_datums\topic_input.dm"
|
||||||
#include "code\datums\organs\organ.dm"
|
|
||||||
#include "code\datums\organs\organ_external.dm"
|
|
||||||
#include "code\datums\organs\organ_internal.dm"
|
|
||||||
#include "code\datums\organs\pain.dm"
|
|
||||||
#include "code\datums\organs\wound.dm"
|
|
||||||
#include "code\datums\spells\area_teleport.dm"
|
#include "code\datums\spells\area_teleport.dm"
|
||||||
#include "code\datums\spells\conjure.dm"
|
#include "code\datums\spells\conjure.dm"
|
||||||
#include "code\datums\spells\dumbfire.dm"
|
#include "code\datums\spells\dumbfire.dm"
|
||||||
@@ -1030,6 +1025,12 @@
|
|||||||
#include "code\modules\mob\new_player\preferences_setup.dm"
|
#include "code\modules\mob\new_player\preferences_setup.dm"
|
||||||
#include "code\modules\mob\new_player\skill.dm"
|
#include "code\modules\mob\new_player\skill.dm"
|
||||||
#include "code\modules\mob\new_player\sprite_accessories.dm"
|
#include "code\modules\mob\new_player\sprite_accessories.dm"
|
||||||
|
#include "code\modules\organs\blood.dm"
|
||||||
|
#include "code\modules\organs\organ.dm"
|
||||||
|
#include "code\modules\organs\organ_external.dm"
|
||||||
|
#include "code\modules\organs\organ_internal.dm"
|
||||||
|
#include "code\modules\organs\pain.dm"
|
||||||
|
#include "code\modules\organs\wound.dm"
|
||||||
#include "code\modules\paperwork\clipboard.dm"
|
#include "code\modules\paperwork\clipboard.dm"
|
||||||
#include "code\modules\paperwork\filingcabinet.dm"
|
#include "code\modules\paperwork\filingcabinet.dm"
|
||||||
#include "code\modules\paperwork\folders.dm"
|
#include "code\modules\paperwork\folders.dm"
|
||||||
|
|||||||
@@ -1,20 +0,0 @@
|
|||||||
/datum/organ
|
|
||||||
var/name = "organ"
|
|
||||||
var/mob/living/carbon/human/owner = null
|
|
||||||
var/list/datum/autopsy_data/autopsy_data = list()
|
|
||||||
|
|
||||||
var/list/trace_chemicals = list() // traces of chemicals in the organ,
|
|
||||||
// links chemical IDs to number of ticks for which they'll stay in the blood
|
|
||||||
|
|
||||||
|
|
||||||
///datum/organ/proc/process()
|
|
||||||
// return 0
|
|
||||||
|
|
||||||
///datum/organ/proc/receive_chem(chemical as obj)
|
|
||||||
// return 0
|
|
||||||
|
|
||||||
proc/process()
|
|
||||||
return 0
|
|
||||||
|
|
||||||
proc/receive_chem(chemical as obj)
|
|
||||||
return 0
|
|
||||||
@@ -5,10 +5,6 @@
|
|||||||
icon = 'icons/mob/human.dmi'
|
icon = 'icons/mob/human.dmi'
|
||||||
icon_state = "body_m_s"
|
icon_state = "body_m_s"
|
||||||
|
|
||||||
var/datum/reagents/vessel
|
|
||||||
// TODO: make this actually affect the way the mob is rendered
|
|
||||||
var/pale = 0
|
|
||||||
|
|
||||||
|
|
||||||
/mob/living/carbon/human/dummy
|
/mob/living/carbon/human/dummy
|
||||||
real_name = "Test Dummy"
|
real_name = "Test Dummy"
|
||||||
@@ -24,78 +20,14 @@
|
|||||||
if(!dna)
|
if(!dna)
|
||||||
dna = new /datum/dna(null)
|
dna = new /datum/dna(null)
|
||||||
|
|
||||||
//initialise organs
|
|
||||||
organs = list()
|
|
||||||
organs_by_name["chest"] = new/datum/organ/external/chest()
|
|
||||||
organs_by_name["groin"] = new/datum/organ/external/groin(organs_by_name["chest"])
|
|
||||||
organs_by_name["head"] = new/datum/organ/external/head(organs_by_name["chest"])
|
|
||||||
organs_by_name["l_arm"] = new/datum/organ/external/l_arm(organs_by_name["chest"])
|
|
||||||
organs_by_name["r_arm"] = new/datum/organ/external/r_arm(organs_by_name["chest"])
|
|
||||||
organs_by_name["r_leg"] = new/datum/organ/external/r_leg(organs_by_name["groin"])
|
|
||||||
organs_by_name["l_leg"] = new/datum/organ/external/l_leg(organs_by_name["groin"])
|
|
||||||
organs_by_name["l_hand"] = new/datum/organ/external/l_hand(organs_by_name["l_arm"])
|
|
||||||
organs_by_name["r_hand"] = new/datum/organ/external/r_hand(organs_by_name["r_arm"])
|
|
||||||
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)
|
|
||||||
|
|
||||||
|
|
||||||
for(var/name in organs_by_name)
|
|
||||||
organs += organs_by_name[name]
|
|
||||||
|
|
||||||
for(var/datum/organ/external/O in organs)
|
|
||||||
O.owner = src
|
|
||||||
|
|
||||||
..()
|
..()
|
||||||
|
|
||||||
if(dna)
|
if(dna)
|
||||||
dna.real_name = real_name
|
dna.real_name = real_name
|
||||||
|
|
||||||
prev_gender = gender // Debug for plural genders
|
prev_gender = gender // Debug for plural genders
|
||||||
|
make_organs()
|
||||||
|
make_blood()
|
||||||
vessel = new/datum/reagents(600)
|
|
||||||
vessel.my_atom = src
|
|
||||||
vessel.add_reagent("blood",560)
|
|
||||||
spawn(1)
|
|
||||||
fixblood()
|
|
||||||
|
|
||||||
/mob/living/carbon/human/proc/drip(var/amt as num)
|
|
||||||
if(!amt)
|
|
||||||
return
|
|
||||||
|
|
||||||
var/amm = 0.1 * amt
|
|
||||||
var/turf/T = get_turf(src)
|
|
||||||
var/list/obj/effect/decal/cleanable/blood/drip/nums = list()
|
|
||||||
var/list/iconL = list("1","2","3","4","5")
|
|
||||||
|
|
||||||
vessel.remove_reagent("blood",amm)
|
|
||||||
|
|
||||||
for(var/obj/effect/decal/cleanable/blood/drip/G in T)
|
|
||||||
nums += G
|
|
||||||
iconL.Remove(G.icon_state)
|
|
||||||
|
|
||||||
if (nums.len < 5)
|
|
||||||
var/obj/effect/decal/cleanable/blood/drip/this = new(T)
|
|
||||||
this.icon_state = pick(iconL)
|
|
||||||
this.blood_DNA = list()
|
|
||||||
this.blood_DNA[dna.unique_enzymes] = dna.b_type
|
|
||||||
else
|
|
||||||
for(var/obj/effect/decal/cleanable/blood/drip/G in nums)
|
|
||||||
del G
|
|
||||||
T.add_blood(src)
|
|
||||||
|
|
||||||
|
|
||||||
/mob/living/carbon/human/proc/fixblood()
|
|
||||||
for(var/datum/reagent/blood/B in vessel.reagent_list)
|
|
||||||
if(B.id == "blood")
|
|
||||||
B.data = list("donor"=src,"viruses"=null,"blood_DNA"=dna.unique_enzymes,"blood_type"=dna.b_type,"resistances"=null,"trace_chem"=null, "virus2" = null, "antobodies" = null)
|
|
||||||
|
|
||||||
|
|
||||||
/mob/living/carbon/human/Bump(atom/movable/AM as mob|obj, yes)
|
/mob/living/carbon/human/Bump(atom/movable/AM as mob|obj, yes)
|
||||||
if ((!( yes ) || now_pushing))
|
if ((!( yes ) || now_pushing))
|
||||||
|
|||||||
@@ -47,9 +47,6 @@
|
|||||||
var/icon/stand_icon = null
|
var/icon/stand_icon = null
|
||||||
var/icon/lying_icon = null
|
var/icon/lying_icon = null
|
||||||
|
|
||||||
var/list/organs = list() //Gets filled up in the constructor (human.dm, New() proc, line 24. I'm sick and tired of missing comments. -Agouri
|
|
||||||
var/list/organs_by_name = list() // map organ names to organs
|
|
||||||
|
|
||||||
var/miming = null //Toggle for the mime's abilities.
|
var/miming = null //Toggle for the mime's abilities.
|
||||||
var/special_voice = "" // For changing our voice. Used by a symptom.
|
var/special_voice = "" // For changing our voice. Used by a symptom.
|
||||||
|
|
||||||
|
|||||||
@@ -21,11 +21,6 @@
|
|||||||
#define COLD_GAS_DAMAGE_LEVEL_2 1.5 //Amount of damage applied when the current breath's temperature passes the 200K point
|
#define COLD_GAS_DAMAGE_LEVEL_2 1.5 //Amount of damage applied when the current breath's temperature passes the 200K point
|
||||||
#define COLD_GAS_DAMAGE_LEVEL_3 3 //Amount of damage applied when the current breath's temperature passes the 120K point
|
#define COLD_GAS_DAMAGE_LEVEL_3 3 //Amount of damage applied when the current breath's temperature passes the 120K point
|
||||||
|
|
||||||
var/const/BLOOD_VOLUME_SAFE = 501
|
|
||||||
var/const/BLOOD_VOLUME_OKAY = 336
|
|
||||||
var/const/BLOOD_VOLUME_BAD = 224
|
|
||||||
var/const/BLOOD_VOLUME_SURVIVE = 122
|
|
||||||
|
|
||||||
/mob/living/carbon/human
|
/mob/living/carbon/human
|
||||||
var/oxygen_alert = 0
|
var/oxygen_alert = 0
|
||||||
var/toxins_alert = 0
|
var/toxins_alert = 0
|
||||||
@@ -133,100 +128,6 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
|
|||||||
|
|
||||||
/mob/living/carbon/human
|
/mob/living/carbon/human
|
||||||
|
|
||||||
proc/handle_blood()
|
|
||||||
// take care of blood and blood loss
|
|
||||||
if(stat < 2 && bodytemperature >= 170)
|
|
||||||
var/blood_volume = round(vessel.get_reagent_amount("blood"))
|
|
||||||
if(blood_volume < 560 && blood_volume)
|
|
||||||
var/datum/reagent/blood/B = locate() in vessel.reagent_list //Grab some blood
|
|
||||||
if(B) // Make sure there's some blood at all
|
|
||||||
if(B.data["donor"] != src) //If it's not theirs, then we look for theirs
|
|
||||||
for(var/datum/reagent/blood/D in vessel.reagent_list)
|
|
||||||
if(D.data["donor"] == src)
|
|
||||||
B = D
|
|
||||||
break
|
|
||||||
var/datum/reagent/nutriment/F = locate() in reagents.reagent_list
|
|
||||||
if(F != null)
|
|
||||||
if(F.volume >= 1)
|
|
||||||
// nutriment speeds it up quite a bit
|
|
||||||
B.volume += 0.4
|
|
||||||
F.volume -= 0.1
|
|
||||||
else
|
|
||||||
//At this point, we dun care which blood we are adding to, as long as they get more blood.
|
|
||||||
B.volume = B.volume + 0.1 // regenerate blood VERY slowly
|
|
||||||
|
|
||||||
// Damaged heart virtually reduces the blood volume, as the blood isn't
|
|
||||||
// being pumped properly anymore.
|
|
||||||
var/datum/organ/internal/heart/heart = internal_organs["heart"]
|
|
||||||
switch(heart.damage)
|
|
||||||
if(5 to 10)
|
|
||||||
blood_volume *= 0.8
|
|
||||||
if(11 to 20)
|
|
||||||
blood_volume *= 0.5
|
|
||||||
if(21 to INFINITY)
|
|
||||||
blood_volume *= 0.3
|
|
||||||
|
|
||||||
switch(blood_volume)
|
|
||||||
if(BLOOD_VOLUME_SAFE to 10000)
|
|
||||||
if(pale)
|
|
||||||
pale = 0
|
|
||||||
update_body()
|
|
||||||
if(BLOOD_VOLUME_OKAY to BLOOD_VOLUME_SAFE)
|
|
||||||
if(!pale)
|
|
||||||
pale = 1
|
|
||||||
update_body()
|
|
||||||
var/word = pick("dizzy","woosey","faint")
|
|
||||||
src << "\red You feel [word]"
|
|
||||||
if(prob(1))
|
|
||||||
var/word = pick("dizzy","woosey","faint")
|
|
||||||
src << "\red You feel [word]"
|
|
||||||
if(oxyloss < 20)
|
|
||||||
// hint that they're getting close to suffocation
|
|
||||||
oxyloss += 3
|
|
||||||
if(BLOOD_VOLUME_BAD to BLOOD_VOLUME_OKAY)
|
|
||||||
if(!pale)
|
|
||||||
pale = 1
|
|
||||||
update_body()
|
|
||||||
eye_blurry += 6
|
|
||||||
if(oxyloss < 50)
|
|
||||||
oxyloss += 10
|
|
||||||
oxyloss += 1
|
|
||||||
if(prob(15))
|
|
||||||
Paralyse(rand(1,3))
|
|
||||||
var/word = pick("dizzy","woosey","faint")
|
|
||||||
src << "\red You feel extremely [word]"
|
|
||||||
if(BLOOD_VOLUME_SURVIVE to BLOOD_VOLUME_BAD)
|
|
||||||
oxyloss += 5
|
|
||||||
toxloss += 5
|
|
||||||
if(prob(15))
|
|
||||||
var/word = pick("dizzy","woosey","faint")
|
|
||||||
src << "\red You feel extremely [word]"
|
|
||||||
if(0 to BLOOD_VOLUME_SURVIVE)
|
|
||||||
// There currently is a strange bug here. If the mob is not below -100 health
|
|
||||||
// when death() is called, apparently they will be just fine, and this way it'll
|
|
||||||
// spam deathgasp. Adjusting toxloss ensures the mob will stay dead.
|
|
||||||
toxloss += 300 // just to be safe!
|
|
||||||
death()
|
|
||||||
|
|
||||||
// Without enough blood you slowly go hungry.
|
|
||||||
if(blood_volume < BLOOD_VOLUME_SAFE)
|
|
||||||
if(nutrition >= 300)
|
|
||||||
nutrition -= 10
|
|
||||||
else if(nutrition >= 200)
|
|
||||||
nutrition -= 3
|
|
||||||
|
|
||||||
var/blood_max = 0
|
|
||||||
for(var/datum/organ/external/temp in organs)
|
|
||||||
if(!(temp.status & ORGAN_BLEEDING) || temp.status & ORGAN_ROBOT)
|
|
||||||
continue
|
|
||||||
for(var/datum/wound/W in temp.wounds) if(W.bleeding())
|
|
||||||
blood_max += W.damage / 4
|
|
||||||
if(temp.status & ORGAN_DESTROYED && !(temp.status & ORGAN_GAUZED) && !temp.amputated)
|
|
||||||
blood_max += 20 //Yer missing a fucking limb.
|
|
||||||
if (temp.open)
|
|
||||||
blood_max += 2 //Yer stomach is cut open
|
|
||||||
drip(blood_max)
|
|
||||||
|
|
||||||
proc/handle_disabilities()
|
proc/handle_disabilities()
|
||||||
if (disabilities & EPILEPSY)
|
if (disabilities & EPILEPSY)
|
||||||
if ((prob(1) && paralysis < 1))
|
if ((prob(1) && paralysis < 1))
|
||||||
@@ -293,108 +194,6 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
|
|||||||
src << "\red Your legs won't respond properly, you fall down."
|
src << "\red Your legs won't respond properly, you fall down."
|
||||||
lying = 1
|
lying = 1
|
||||||
|
|
||||||
proc/handle_organs()
|
|
||||||
// take care of organ related updates, such as broken and missing limbs
|
|
||||||
|
|
||||||
// recalculate number of wounds
|
|
||||||
number_wounds = 0
|
|
||||||
for(var/datum/organ/external/E in organs)
|
|
||||||
if(!E)
|
|
||||||
world << name
|
|
||||||
continue
|
|
||||||
number_wounds += E.number_wounds
|
|
||||||
|
|
||||||
var/leg_tally = 2
|
|
||||||
var/canstand_l = 1 //Can stand on left leg
|
|
||||||
var/canstand_r = 1 //Can stand on right leg
|
|
||||||
var/hasleg_l = 1 //Have left leg
|
|
||||||
var/hasleg_r = 1 //Have right leg
|
|
||||||
var/hasarm_l = 1 //Have left arm
|
|
||||||
var/hasarm_r = 1 //Have right arm
|
|
||||||
for(var/datum/organ/external/E in organs)
|
|
||||||
E.process()
|
|
||||||
if(E.status & ORGAN_ROBOT && prob(E.brute_dam + E.burn_dam))
|
|
||||||
if(E.name == "l_hand" || E.name == "l_arm")
|
|
||||||
if(hand && equipped())
|
|
||||||
drop_item()
|
|
||||||
emote("me", 1, "drops what they were holding, their [E.display_name?"[E.display_name]":"[E]"] malfunctioning!")
|
|
||||||
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
|
|
||||||
spark_system.set_up(5, 0, src)
|
|
||||||
spark_system.attach(src)
|
|
||||||
spark_system.start()
|
|
||||||
spawn(10)
|
|
||||||
del(spark_system)
|
|
||||||
else if(E.name == "r_hand" || E.name == "r_arm")
|
|
||||||
if(!hand && equipped())
|
|
||||||
drop_item()
|
|
||||||
emote("me", 1, "drops what they were holding, their [E.display_name?"[E.display_name]":"[E]"] malfunctioning!")
|
|
||||||
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
|
|
||||||
spark_system.set_up(5, 0, src)
|
|
||||||
spark_system.attach(src)
|
|
||||||
spark_system.start()
|
|
||||||
spawn(10)
|
|
||||||
del(spark_system)
|
|
||||||
else if(E.name == "l_leg" || E.name == "l_foot" \
|
|
||||||
|| E.name == "r_leg" || E.name == "r_foot" && !lying)
|
|
||||||
leg_tally-- // let it fail even if just foot&leg
|
|
||||||
if(E.status & ORGAN_BROKEN || (E.status & ORGAN_DESTROYED && !E.amputated))
|
|
||||||
if(E.name == "l_hand" || E.name == "l_arm")
|
|
||||||
if(hand && equipped())
|
|
||||||
if(E.status & ORGAN_SPLINTED && prob(10))
|
|
||||||
drop_item()
|
|
||||||
emote("scream")
|
|
||||||
else
|
|
||||||
drop_item()
|
|
||||||
emote("scream")
|
|
||||||
else if(E.name == "r_hand" || E.name == "r_arm")
|
|
||||||
if(!hand && equipped())
|
|
||||||
if(E.status & ORGAN_SPLINTED && prob(10))
|
|
||||||
drop_item()
|
|
||||||
emote("scream")
|
|
||||||
else
|
|
||||||
drop_item()
|
|
||||||
emote("scream")
|
|
||||||
else if(E.name == "l_leg" || E.name == "l_foot" \
|
|
||||||
|| E.name == "r_leg" || E.name == "r_foot" && !lying)
|
|
||||||
if(!(E.status & ORGAN_SPLINTED))
|
|
||||||
leg_tally-- // let it fail even if just foot&leg
|
|
||||||
|
|
||||||
// standing is poor
|
|
||||||
if(leg_tally <= 0 && !paralysis && !(lying || resting) && prob(5))
|
|
||||||
emote("scream")
|
|
||||||
emote("collapse")
|
|
||||||
paralysis = 10
|
|
||||||
|
|
||||||
|
|
||||||
//Check arms and legs for existence
|
|
||||||
var/datum/organ/external/E
|
|
||||||
E = get_organ("l_leg")
|
|
||||||
if(E.status & ORGAN_DESTROYED && !(E.status & ORGAN_SPLINTED))
|
|
||||||
canstand_l = 0
|
|
||||||
hasleg_l = 0
|
|
||||||
E = get_organ("r_leg")
|
|
||||||
if(E.status & ORGAN_DESTROYED && !(E.status & ORGAN_SPLINTED))
|
|
||||||
canstand_r = 0
|
|
||||||
hasleg_r = 0
|
|
||||||
E = get_organ("l_foot")
|
|
||||||
if(E.status & ORGAN_DESTROYED && !(E.status & ORGAN_SPLINTED))
|
|
||||||
canstand_l = 0
|
|
||||||
E = get_organ("r_foot")
|
|
||||||
if(E.status & ORGAN_DESTROYED && !(E.status & ORGAN_SPLINTED))
|
|
||||||
canstand_r = 0
|
|
||||||
E = get_organ("l_arm")
|
|
||||||
if(E.status & ORGAN_DESTROYED && !(E.status & ORGAN_SPLINTED))
|
|
||||||
hasarm_l = 0
|
|
||||||
E = get_organ("r_arm")
|
|
||||||
if(E.status & ORGAN_DESTROYED && !(E.status & ORGAN_SPLINTED))
|
|
||||||
hasarm_r = 0
|
|
||||||
|
|
||||||
// Can stand if have at least one full leg (with leg and foot parts present)
|
|
||||||
// Has limbs to move around if at least one arm or leg is at least partially there
|
|
||||||
can_stand = canstand_l||canstand_r
|
|
||||||
has_limbs = hasleg_l||hasleg_r||hasarm_l||hasarm_r
|
|
||||||
|
|
||||||
|
|
||||||
proc/handle_mutations_and_radiation()
|
proc/handle_mutations_and_radiation()
|
||||||
if(getFireLoss())
|
if(getFireLoss())
|
||||||
if((COLD_RESISTANCE in mutations) || (prob(1)))
|
if((COLD_RESISTANCE in mutations) || (prob(1)))
|
||||||
@@ -1063,34 +862,10 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
|
|||||||
dizziness = max(0, dizziness - 3)
|
dizziness = max(0, dizziness - 3)
|
||||||
jitteriness = max(0, jitteriness - 3)
|
jitteriness = max(0, jitteriness - 3)
|
||||||
|
|
||||||
|
handle_trace_chems()
|
||||||
|
|
||||||
if(life_tick % 10 == 0)
|
var/datum/organ/internal/liver/liver = internal_organs["liver"]
|
||||||
// handle trace chemicals for autopsy
|
liver.process()
|
||||||
for(var/datum/organ/O in organs)
|
|
||||||
for(var/chemID in O.trace_chemicals)
|
|
||||||
O.trace_chemicals[chemID] = O.trace_chemicals[chemID] - 1
|
|
||||||
if(O.trace_chemicals[chemID] <= 0)
|
|
||||||
O.trace_chemicals.Remove(chemID)
|
|
||||||
for(var/datum/reagent/A in reagents.reagent_list)
|
|
||||||
// add chemistry traces to a random organ
|
|
||||||
var/datum/organ/O = pick(organs)
|
|
||||||
O.trace_chemicals[A.name] = 100
|
|
||||||
|
|
||||||
var/damaged_liver_process_accuracy = 10
|
|
||||||
if(life_tick % damaged_liver_process_accuracy == 0)
|
|
||||||
// Damaged liver means some chemicals are very dangerous
|
|
||||||
var/datum/organ/internal/liver/liver = internal_organs["liver"]
|
|
||||||
if(liver.damage >= liver.min_bruised_damage)
|
|
||||||
for(var/datum/reagent/R in src.reagents.reagent_list)
|
|
||||||
// Ethanol and all drinks are bad
|
|
||||||
if(istype(R, /datum/reagent/ethanol))
|
|
||||||
adjustToxLoss(0.1 * damaged_liver_process_accuracy)
|
|
||||||
|
|
||||||
// Can't cope with toxins at all
|
|
||||||
for(var/toxin in list("toxin", "plasma", "sacid", "pacid", "cyanide", "lexorin", "amatoxin", "chloralhydrate", "carpotoxin", "zombiepowder", "mindbreaker"))
|
|
||||||
if(src.reagents.has_reagent(toxin))
|
|
||||||
adjustToxLoss(0.3 * damaged_liver_process_accuracy)
|
|
||||||
|
|
||||||
|
|
||||||
updatehealth()
|
updatehealth()
|
||||||
|
|
||||||
|
|||||||
148
code/modules/organs/blood.dm
Normal file
148
code/modules/organs/blood.dm
Normal file
@@ -0,0 +1,148 @@
|
|||||||
|
//Blood levels
|
||||||
|
var/const/BLOOD_VOLUME_SAFE = 501
|
||||||
|
var/const/BLOOD_VOLUME_OKAY = 336
|
||||||
|
var/const/BLOOD_VOLUME_BAD = 224
|
||||||
|
var/const/BLOOD_VOLUME_SURVIVE = 122
|
||||||
|
|
||||||
|
/mob/living/carbon/human/var/datum/reagents/vessel //Container for blood and BLOOD ONLY. Do not transfer other chems here.
|
||||||
|
/mob/living/carbon/human/var/var/pale = 0 //Should affect how mob sprite is drawn, but currently doesn't.
|
||||||
|
|
||||||
|
//Initializes blood vessels
|
||||||
|
/mob/living/carbon/human/proc/make_blood()
|
||||||
|
if (vessel)
|
||||||
|
return
|
||||||
|
vessel = new/datum/reagents(600)
|
||||||
|
vessel.my_atom = src
|
||||||
|
vessel.add_reagent("blood",560)
|
||||||
|
spawn(1)
|
||||||
|
fixblood()
|
||||||
|
|
||||||
|
//Resets blood data
|
||||||
|
/mob/living/carbon/human/proc/fixblood()
|
||||||
|
for(var/datum/reagent/blood/B in vessel.reagent_list)
|
||||||
|
if(B.id == "blood")
|
||||||
|
B.data = list( "donor"=src,"viruses"=null,"blood_DNA"=dna.unique_enzymes,"blood_type"=dna.b_type, \
|
||||||
|
"resistances"=null,"trace_chem"=null, "virus2" = null, "antobodies" = null)
|
||||||
|
|
||||||
|
//Makes a blood drop, leaking certain amount of blood from the mob
|
||||||
|
/mob/living/carbon/human/proc/drip(var/amt as num)
|
||||||
|
if(!amt)
|
||||||
|
return
|
||||||
|
|
||||||
|
var/amm = 0.1 * amt
|
||||||
|
var/turf/T = get_turf(src)
|
||||||
|
var/list/obj/effect/decal/cleanable/blood/drip/nums = list()
|
||||||
|
var/list/iconL = list("1","2","3","4","5")
|
||||||
|
|
||||||
|
vessel.remove_reagent("blood",amm)
|
||||||
|
|
||||||
|
for(var/obj/effect/decal/cleanable/blood/drip/G in T)
|
||||||
|
nums += G
|
||||||
|
iconL.Remove(G.icon_state)
|
||||||
|
|
||||||
|
if (nums.len < 5)
|
||||||
|
var/obj/effect/decal/cleanable/blood/drip/this = new(T)
|
||||||
|
this.icon_state = pick(iconL)
|
||||||
|
this.blood_DNA = list()
|
||||||
|
this.blood_DNA[dna.unique_enzymes] = dna.b_type
|
||||||
|
else
|
||||||
|
for(var/obj/effect/decal/cleanable/blood/drip/G in nums)
|
||||||
|
del G
|
||||||
|
T.add_blood(src)
|
||||||
|
|
||||||
|
// Takes care blood loss and regeneration
|
||||||
|
/mob/living/carbon/human/proc/handle_blood()
|
||||||
|
if(stat != DEAD && bodytemperature >= 170) //Dead or cryosleep people do not pump the blood.
|
||||||
|
|
||||||
|
var/blood_volume = round(vessel.get_reagent_amount("blood"))
|
||||||
|
|
||||||
|
//Blood regeneration if there is some space
|
||||||
|
if(blood_volume < 560 && blood_volume)
|
||||||
|
var/datum/reagent/blood/B = locate() in vessel.reagent_list //Grab some blood
|
||||||
|
if(B) // Make sure there's some blood at all
|
||||||
|
if(B.data["donor"] != src) //If it's not theirs, then we look for theirs
|
||||||
|
for(var/datum/reagent/blood/D in vessel.reagent_list)
|
||||||
|
if(D.data["donor"] == src)
|
||||||
|
B = D
|
||||||
|
break
|
||||||
|
|
||||||
|
B.volume += + 0.1 // regenerate blood VERY slowly
|
||||||
|
if (reagents.reagent_list.has_reagent("nutriment")) //Getting food speeds it up
|
||||||
|
B.volume += 0.4
|
||||||
|
reagents.reagent_list.remove_reagent("nutriment", 0.1)
|
||||||
|
if (reagents.reagent_list.has_reagent("iron")) //Hematogen candy anyone?
|
||||||
|
B.volume += 0.8
|
||||||
|
reagents.reagent_list.remove_reagent("iron", 0.1)
|
||||||
|
|
||||||
|
// Damaged heart virtually reduces the blood volume, as the blood isn't
|
||||||
|
// being pumped properly anymore.
|
||||||
|
var/datum/organ/internal/heart/heart = internal_organs["heart"]
|
||||||
|
switch(heart.damage)
|
||||||
|
if(5 to 10)
|
||||||
|
blood_volume *= 0.8
|
||||||
|
if(11 to 20)
|
||||||
|
blood_volume *= 0.5
|
||||||
|
if(21 to INFINITY)
|
||||||
|
blood_volume *= 0.3
|
||||||
|
|
||||||
|
//Effects of bloodloss
|
||||||
|
switch(blood_volume)
|
||||||
|
if(BLOOD_VOLUME_SAFE to 10000)
|
||||||
|
if(pale)
|
||||||
|
pale = 0
|
||||||
|
update_body()
|
||||||
|
if(BLOOD_VOLUME_OKAY to BLOOD_VOLUME_SAFE)
|
||||||
|
if(!pale)
|
||||||
|
pale = 1
|
||||||
|
update_body()
|
||||||
|
var/word = pick("dizzy","woosey","faint")
|
||||||
|
src << "\red You feel [word]"
|
||||||
|
if(prob(1))
|
||||||
|
var/word = pick("dizzy","woosey","faint")
|
||||||
|
src << "\red You feel [word]"
|
||||||
|
if(oxyloss < 20)
|
||||||
|
oxyloss += 3
|
||||||
|
if(BLOOD_VOLUME_BAD to BLOOD_VOLUME_OKAY)
|
||||||
|
if(!pale)
|
||||||
|
pale = 1
|
||||||
|
update_body()
|
||||||
|
eye_blurry += 6
|
||||||
|
if(oxyloss < 50)
|
||||||
|
oxyloss += 10
|
||||||
|
oxyloss += 1
|
||||||
|
if(prob(15))
|
||||||
|
Paralyse(rand(1,3))
|
||||||
|
var/word = pick("dizzy","woosey","faint")
|
||||||
|
src << "\red You feel extremely [word]"
|
||||||
|
if(BLOOD_VOLUME_SURVIVE to BLOOD_VOLUME_BAD)
|
||||||
|
oxyloss += 5
|
||||||
|
toxloss += 5
|
||||||
|
if(prob(15))
|
||||||
|
var/word = pick("dizzy","woosey","faint")
|
||||||
|
src << "\red You feel extremely [word]"
|
||||||
|
if(0 to BLOOD_VOLUME_SURVIVE)
|
||||||
|
// There currently is a strange bug here. If the mob is not below -100 health
|
||||||
|
// when death() is called, apparently they will be just fine, and this way it'll
|
||||||
|
// spam deathgasp. Adjusting toxloss ensures the mob will stay dead.
|
||||||
|
toxloss += 300 // just to be safe!
|
||||||
|
death()
|
||||||
|
|
||||||
|
// Without enough blood you slowly go hungry.
|
||||||
|
if(blood_volume < BLOOD_VOLUME_SAFE)
|
||||||
|
if(nutrition >= 300)
|
||||||
|
nutrition -= 10
|
||||||
|
else if(nutrition >= 200)
|
||||||
|
nutrition -= 3
|
||||||
|
|
||||||
|
//Bleeding out
|
||||||
|
var/blood_max = 0
|
||||||
|
for(var/datum/organ/external/temp in organs)
|
||||||
|
if(!(temp.status & ORGAN_BLEEDING) || temp.status & ORGAN_ROBOT)
|
||||||
|
continue
|
||||||
|
for(var/datum/wound/W in temp.wounds) if(W.bleeding())
|
||||||
|
blood_max += W.damage / 4
|
||||||
|
if(temp.status & ORGAN_DESTROYED && !(temp.status & ORGAN_GAUZED) && !temp.amputated)
|
||||||
|
blood_max += 20 //Yer missing a fucking limb.
|
||||||
|
if (temp.open)
|
||||||
|
blood_max += 2 //Yer stomach is cut open
|
||||||
|
drip(blood_max)
|
||||||
150
code/modules/organs/organ.dm
Normal file
150
code/modules/organs/organ.dm
Normal file
@@ -0,0 +1,150 @@
|
|||||||
|
/datum/organ
|
||||||
|
var/name = "organ"
|
||||||
|
var/mob/living/carbon/human/owner = null
|
||||||
|
|
||||||
|
var/list/datum/autopsy_data/autopsy_data = list()
|
||||||
|
var/list/trace_chemicals = list() // traces of chemicals in the organ,
|
||||||
|
// links chemical IDs to number of ticks for which they'll stay in the blood
|
||||||
|
proc/process()
|
||||||
|
return 0
|
||||||
|
|
||||||
|
proc/receive_chem(chemical as obj)
|
||||||
|
return 0
|
||||||
|
|
||||||
|
//Handles chem traces
|
||||||
|
/mob/living/carbon/human/proc/handle_trace_chems()
|
||||||
|
//New are added for reagents to random organs.
|
||||||
|
for(var/datum/reagent/A in reagents.reagent_list)
|
||||||
|
var/datum/organ/O = pick(organs)
|
||||||
|
O.trace_chemicals[A.name] = 100
|
||||||
|
|
||||||
|
//Adds autopsy data for used_weapon.
|
||||||
|
/datum/organ/proc/add_autopsy_data(var/used_weapon, var/damage)
|
||||||
|
var/datum/autopsy_data/W = autopsy_data[used_weapon]
|
||||||
|
if(!W)
|
||||||
|
W = new()
|
||||||
|
W.weapon = used_weapon
|
||||||
|
autopsy_data[used_weapon] = W
|
||||||
|
|
||||||
|
W.hits += 1
|
||||||
|
W.damage += damage
|
||||||
|
W.time_inflicted = world.time
|
||||||
|
|
||||||
|
/mob/living/carbon/human/var/list/organs = list()
|
||||||
|
/mob/living/carbon/human/var/list/organs_by_name = list() // map organ names to organs
|
||||||
|
|
||||||
|
//Creates and initializes and connects external and internal organs
|
||||||
|
/mob/living/carbon/human/proc/make_organs()
|
||||||
|
if (organs)
|
||||||
|
return
|
||||||
|
organs = list()
|
||||||
|
organs_by_name["chest"] = new/datum/organ/external/chest()
|
||||||
|
organs_by_name["groin"] = new/datum/organ/external/groin(organs_by_name["chest"])
|
||||||
|
organs_by_name["head"] = new/datum/organ/external/head(organs_by_name["chest"])
|
||||||
|
organs_by_name["l_arm"] = new/datum/organ/external/l_arm(organs_by_name["chest"])
|
||||||
|
organs_by_name["r_arm"] = new/datum/organ/external/r_arm(organs_by_name["chest"])
|
||||||
|
organs_by_name["r_leg"] = new/datum/organ/external/r_leg(organs_by_name["groin"])
|
||||||
|
organs_by_name["l_leg"] = new/datum/organ/external/l_leg(organs_by_name["groin"])
|
||||||
|
organs_by_name["l_hand"] = new/datum/organ/external/l_hand(organs_by_name["l_arm"])
|
||||||
|
organs_by_name["r_hand"] = new/datum/organ/external/r_hand(organs_by_name["r_arm"])
|
||||||
|
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)
|
||||||
|
|
||||||
|
for(var/name in organs_by_name)
|
||||||
|
organs += organs_by_name[name]
|
||||||
|
|
||||||
|
for(var/datum/organ/external/O in organs)
|
||||||
|
O.owner = src
|
||||||
|
|
||||||
|
// Takes care of organ related updates, such as broken and missing limbs
|
||||||
|
/mob/living/carbon/human/proc/handle_organs()
|
||||||
|
number_wounds = 0
|
||||||
|
var/leg_tally = 2
|
||||||
|
for(var/datum/organ/external/E in organs)
|
||||||
|
if(!E)
|
||||||
|
continue
|
||||||
|
E.process()
|
||||||
|
number_wounds += E.number_wounds
|
||||||
|
|
||||||
|
//Robotic limb malfunctions
|
||||||
|
var/malfunction = 0
|
||||||
|
if (E.status & ORGAN_ROBOT && prob(E.brute_dam + E.burn_dam))
|
||||||
|
malfunction = 1
|
||||||
|
|
||||||
|
//Broken limbs hurt too
|
||||||
|
var/broken = 0
|
||||||
|
if(E.status & ORGAN_BROKEN && !(E.status & ORGAN_SPLINTED && prob(10)) )
|
||||||
|
broken = 1
|
||||||
|
|
||||||
|
//Special effects for limbs.
|
||||||
|
if(E.name in list("l_hand","l_arm","r_hand","r_arm"))
|
||||||
|
var/obj/item/c_hand //Getting what's in this hand
|
||||||
|
if(E.name == "l_hand" || E.name == "l_arm")
|
||||||
|
c_hand = l_hand
|
||||||
|
if(E.name == "r_hand" || E.name == "r_arm")
|
||||||
|
c_hand = r_hand
|
||||||
|
|
||||||
|
if (c_hand)
|
||||||
|
if (broken||malfunction)
|
||||||
|
u_equip(c_hand)
|
||||||
|
|
||||||
|
if(broken)
|
||||||
|
emote("me", 1, "screams in pain and drops what they were holding in their [E.display_name?"[E.display_name]":"[E]"]!")
|
||||||
|
if(malfunction)
|
||||||
|
emote("me", 1, "drops what they were holding, their [E.display_name?"[E.display_name]":"[E]"] malfunctioning!")
|
||||||
|
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
|
||||||
|
spark_system.set_up(5, 0, src)
|
||||||
|
spark_system.attach(src)
|
||||||
|
spark_system.start()
|
||||||
|
spawn(10)
|
||||||
|
del(spark_system)
|
||||||
|
|
||||||
|
else if(E.name in list("l_leg","l_foot","r_leg","r_foot") && !lying)
|
||||||
|
if (E.status & ORGAN_DESTROYED || malfunction || (broken && !(E.status & ORGAN_SPLINTED)))
|
||||||
|
leg_tally-- // let it fail even if just foot&leg
|
||||||
|
|
||||||
|
// standing is poor
|
||||||
|
if(leg_tally <= 0 && !paralysis && !(lying || resting) && prob(5))
|
||||||
|
emote("scream")
|
||||||
|
emote("collapse")
|
||||||
|
paralysis = 10
|
||||||
|
|
||||||
|
//Check arms and legs for existence
|
||||||
|
var/canstand_l = 1 //Can stand on left leg
|
||||||
|
var/canstand_r = 1 //Can stand on right leg
|
||||||
|
var/hasleg_l = 1 //Have left leg
|
||||||
|
var/hasleg_r = 1 //Have right leg
|
||||||
|
var/hasarm_l = 1 //Have left arm
|
||||||
|
var/hasarm_r = 1 //Have right arm
|
||||||
|
var/datum/organ/external/E
|
||||||
|
E = get_organ("l_leg")
|
||||||
|
if(E.status & ORGAN_DESTROYED && !(E.status & ORGAN_SPLINTED))
|
||||||
|
canstand_l = 0
|
||||||
|
hasleg_l = 0
|
||||||
|
E = get_organ("r_leg")
|
||||||
|
if(E.status & ORGAN_DESTROYED && !(E.status & ORGAN_SPLINTED))
|
||||||
|
canstand_r = 0
|
||||||
|
hasleg_r = 0
|
||||||
|
E = get_organ("l_foot")
|
||||||
|
if(E.status & ORGAN_DESTROYED && !(E.status & ORGAN_SPLINTED))
|
||||||
|
canstand_l = 0
|
||||||
|
E = get_organ("r_foot")
|
||||||
|
if(E.status & ORGAN_DESTROYED && !(E.status & ORGAN_SPLINTED))
|
||||||
|
canstand_r = 0
|
||||||
|
E = get_organ("l_arm")
|
||||||
|
if(E.status & ORGAN_DESTROYED && !(E.status & ORGAN_SPLINTED))
|
||||||
|
hasarm_l = 0
|
||||||
|
E = get_organ("r_arm")
|
||||||
|
if(E.status & ORGAN_DESTROYED && !(E.status & ORGAN_SPLINTED))
|
||||||
|
hasarm_r = 0
|
||||||
|
|
||||||
|
// Can stand if have at least one full leg (with leg and foot parts present)
|
||||||
|
// Has limbs to move around if at least one arm or leg is at least partially there
|
||||||
|
can_stand = canstand_l||canstand_r
|
||||||
|
has_limbs = hasleg_l||hasleg_r||hasarm_l||hasarm_r
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,120 +1,74 @@
|
|||||||
/****************************************************
|
/****************************************************
|
||||||
INTERNAL ORGANS
|
INTERNAL ORGANS
|
||||||
****************************************************/
|
****************************************************/
|
||||||
|
|
||||||
/*
|
/mob/living/carbon/human/var/list/internal_organs = list()
|
||||||
/datum/organ/internal
|
|
||||||
name = "internal"
|
/datum/organ/internal
|
||||||
var/damage = 0
|
// amount of damage to the organ
|
||||||
var/max_damage = 100
|
var/damage = 0
|
||||||
|
var/min_bruised_damage = 10
|
||||||
/datum/organ/internal/skeleton
|
var/min_broken_damage = 30
|
||||||
name = "spooky scary skeleton"
|
var/parent_organ = "chest"
|
||||||
max_damage = 200
|
|
||||||
|
/datum/organ/internal/proc/is_bruised()
|
||||||
/datum/organ/internal/skin
|
return damage >= min_bruised_damage
|
||||||
name = "skin"
|
|
||||||
max_damage = 100
|
/datum/organ/internal/proc/is_broken()
|
||||||
|
return damage >= min_broken_damage
|
||||||
/datum/organ/internal/blood_vessels
|
|
||||||
name = "blood vessels"
|
|
||||||
var/heart = null
|
/datum/organ/internal/New(mob/living/carbon/human/H)
|
||||||
var/lungs = null
|
..()
|
||||||
var/kidneys = null
|
var/datum/organ/external/E = H.organs_by_name[src.parent_organ]
|
||||||
|
if(E.internal_organs == null)
|
||||||
/datum/organ/internal/brain
|
E.internal_organs = list()
|
||||||
name = "brain"
|
E.internal_organs += src
|
||||||
var/head = null
|
H.internal_organs[src.name] = src
|
||||||
|
src.owner = H
|
||||||
/datum/organ/internal/excretory
|
|
||||||
name = "excretory"
|
/datum/organ/internal/proc/take_damage(amount)
|
||||||
var/excretory = 7.0
|
src.damage += amount
|
||||||
var/blood_vessels = null
|
|
||||||
|
var/datum/organ/external/parent = owner.get_organ(parent_organ)
|
||||||
/datum/organ/internal/heart
|
owner.custom_pain("Something inside your [parent.display_name] hurts a lot.", 1)
|
||||||
name = "heart"
|
|
||||||
|
/****************************************************
|
||||||
/datum/organ/internal/immune_system
|
INTERNAL ORGANS DEFINES
|
||||||
name = "immune system"
|
****************************************************/
|
||||||
var/blood_vessels = null
|
|
||||||
var/isys = null
|
/datum/organ/internal/heart
|
||||||
|
name = "heart"
|
||||||
/datum/organ/internal/intestines
|
parent_organ = "chest"
|
||||||
name = "intestines"
|
|
||||||
var/intestines = 3.0
|
|
||||||
var/blood_vessels = null
|
/datum/organ/internal/lungs
|
||||||
|
name = "lungs"
|
||||||
/datum/organ/internal/liver
|
parent_organ = "chest"
|
||||||
name = "liver"
|
|
||||||
var/intestines = null
|
/datum/organ/internal/liver
|
||||||
var/blood_vessels = null
|
name = "liver"
|
||||||
|
parent_organ = "chest"
|
||||||
/datum/organ/internal/lungs
|
var/process_accuracy = 10
|
||||||
name = "lungs"
|
|
||||||
var/lungs = 3.0
|
process()
|
||||||
var/throat = null
|
if(owner.life_tick % process_accuracy == 0)
|
||||||
var/blood_vessels = null
|
// Damaged liver means some chemicals are very dangerous
|
||||||
|
if(src.damage >= src.min_bruised_damage)
|
||||||
/datum/organ/internal/stomach
|
for(var/datum/reagent/R in owner.reagents.reagent_list)
|
||||||
name = "stomach"
|
// Ethanol and all drinks are bad
|
||||||
var/intestines = null
|
if(istype(R, /datum/reagent/ethanol))
|
||||||
|
owner.adjustToxLoss(0.1 * process_accuracy)
|
||||||
/datum/organ/internal/throat
|
|
||||||
name = "throat"
|
// Can't cope with toxins at all
|
||||||
var/lungs = null
|
for(var/toxin in list("toxin", "plasma", "sacid", "pacid", "cyanide", "lexorin", "amatoxin", "chloralhydrate", "carpotoxin", "zombiepowder", "mindbreaker"))
|
||||||
var/stomach = null
|
if(owner.reagents.has_reagent(toxin))
|
||||||
|
owner.adjustToxLoss(0.3 * process_accuracy)
|
||||||
*/
|
|
||||||
|
/datum/organ/internal/kidney
|
||||||
/mob/living/carbon/human/var/list/internal_organs = list()
|
name = "kidney"
|
||||||
|
parent_organ = "chest"
|
||||||
/datum/organ/internal
|
|
||||||
// amount of damage to the organ
|
/datum/organ/internal/brain
|
||||||
var/damage = 0
|
name = "brain"
|
||||||
var/min_bruised_damage = 10
|
|
||||||
var/min_broken_damage = 30
|
|
||||||
var/parent_organ = "chest"
|
|
||||||
|
|
||||||
/datum/organ/internal/proc/is_bruised()
|
|
||||||
return damage >= min_bruised_damage
|
|
||||||
|
|
||||||
/datum/organ/internal/proc/is_broken()
|
|
||||||
return damage >= min_broken_damage
|
|
||||||
|
|
||||||
|
|
||||||
/datum/organ/internal/New(mob/living/carbon/human/H)
|
|
||||||
..()
|
|
||||||
var/datum/organ/external/E = H.organs_by_name[src.parent_organ]
|
|
||||||
if(E.internal_organs == null)
|
|
||||||
E.internal_organs = list()
|
|
||||||
E.internal_organs += src
|
|
||||||
H.internal_organs[src.name] = src
|
|
||||||
src.owner = H
|
|
||||||
|
|
||||||
/datum/organ/internal/proc/take_damage(amount)
|
|
||||||
src.damage += amount
|
|
||||||
|
|
||||||
var/datum/organ/external/parent = owner.get_organ(parent_organ)
|
|
||||||
owner.custom_pain("Something inside your [parent.display_name] hurts a lot.", 1)
|
|
||||||
|
|
||||||
/datum/organ/internal/heart
|
|
||||||
name = "heart"
|
|
||||||
parent_organ = "chest"
|
|
||||||
|
|
||||||
|
|
||||||
/datum/organ/internal/lungs
|
|
||||||
name = "lungs"
|
|
||||||
parent_organ = "chest"
|
|
||||||
|
|
||||||
/datum/organ/internal/liver
|
|
||||||
name = "liver"
|
|
||||||
parent_organ = "chest"
|
|
||||||
|
|
||||||
|
|
||||||
/datum/organ/internal/kidney
|
|
||||||
name = "kidney"
|
|
||||||
parent_organ = "chest"
|
|
||||||
|
|
||||||
/datum/organ/internal/brain
|
|
||||||
name = "brain"
|
|
||||||
parent_organ = "head"
|
parent_organ = "head"
|
||||||
Reference in New Issue
Block a user