Files
Paradise/code/modules/organs/organ_internal.dm
T
2014-12-09 03:47:46 -05:00

330 lines
8.4 KiB
Plaintext

/****************************************************
INTERNAL ORGANS
****************************************************/
/datum/organ/internal
// amount of damage to the organ
var/damage = 0
var/min_bruised_damage = 10
var/min_broken_damage = 30
var/parent_organ = "chest"
var/desc = ""
var/list/emplevel = list(0,0,0) // [1] is the highest amount of emp damage, [3] is the least
var/damagelevel = 1
/datum/organ/internal/proc/rejuvenate()
damage=0
/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)
..()
if(H)
var/datum/organ/internal/check = H.internal_organs_by_name[name]
if(check)
remove(H)
add(H)
/datum/organ/internal/process()
//Process infections
if (owner.species && owner.species.flags & IS_PLANT)
germ_level = 0
return
if(owner.bodytemperature >= 170) //cryo stops germs from moving and doing their bad stuffs
//** Handle antibiotics and curing infections
handle_antibiotics()
//** Handle the effects of infections
var/antibiotics = owner.reagents.get_reagent_amount("spaceacillin")
if (germ_level > 0 && germ_level < INFECTION_LEVEL_ONE/2 && prob(30))
germ_level--
if (germ_level >= INFECTION_LEVEL_ONE/2)
//aiming for germ level to go from ambient to INFECTION_LEVEL_TWO in an average of 15 minutes
if(antibiotics < 5 && prob(round(germ_level/6)))
germ_level++
if (germ_level >= INFECTION_LEVEL_TWO)
var/datum/organ/external/parent = owner.get_organ(parent_organ)
//spread germs
if (antibiotics < 5 && parent.germ_level < germ_level && ( parent.germ_level < INFECTION_LEVEL_ONE*2 || prob(30) ))
parent.germ_level++
if (prob(3)) //about once every 30 seconds
take_damage(1,silent=prob(30))
/datum/organ/internal/proc/take_damage(amount, var/silent=0)
damage += amount * damagelevel
var/datum/organ/external/parent = owner.get_organ(parent_organ)
if (!silent)
owner.custom_pain("Something inside your [parent.display_name] hurts a lot.", 1)
/datum/organ/internal/proc/emp_act(severity)
if(emplevel[1])
take_damage(emplevel[severity])
/datum/organ/internal/proc/mechanize() //Being used to make robutt hearts, etc
/datum/organ/internal/proc/mechassist() //Used to add things like pacemakers, etc
/datum/organ/internal/proc/remove(var/mob/living/carbon/human/H)
if(H)
var/datum/organ/internal/toremove = H.internal_organs_by_name[name]
if(toremove)
var/datum/organ/external/E = H.organs_by_name[toremove.parent_organ]
for (var/datum/organ/internal/I in E.internal_organs)
if (I == toremove)
I = null
return
/datum/organ/internal/proc/add(var/mob/living/carbon/human/H)
var/datum/organ/external/P = H.organs_by_name[parent_organ]
if(P)
if(P.internal_organs == null)
P.internal_organs = list()
P.internal_organs += src
H.internal_organs_by_name[name] = src
owner = H
return
/****************************************************
INTERNAL ORGANS DEFINES
****************************************************/
/datum/organ/internal/heart
name = "heart"
parent_organ = "chest"
/datum/organ/internal/heart/robotic
damagelevel = 0.8
emplevel = list(40,15,10)
desc = "Mechanical"
/datum/organ/internal/heart/robotic/process()
germ_level = 0
return
/datum/organ/internal/heart/mechanize()
new /datum/organ/internal/heart/robotic(owner)
return
/datum/organ/internal/heart/assisted
min_bruised_damage = 15
min_broken_damage = 35
emplevel = list(20,7,3)
desc = "Assisted"
/datum/organ/internal/heart/mechassist()
new /datum/organ/internal/heart/assisted(owner)
return
/datum/organ/internal/lungs
name = "lungs"
parent_organ = "chest"
/datum/organ/internal/lungs/process()
..()
if (germ_level > INFECTION_LEVEL_ONE)
if(prob(5))
owner.emote("cough") //respitory tract infection
if(is_bruised())
if(prob(2))
spawn owner.emote("me", 1, "coughs up blood!")
owner.drip(10)
if(prob(4))
spawn owner.emote("me", 1, "gasps for air!")
owner.losebreath += 5
/datum/organ/internal/lungs/robotic
damagelevel = 0.8
emplevel = list(40,15,10)
desc = "Mechanical"
/datum/organ/internal/lungs/robotic/process()
germ_level = 0
return
/datum/organ/internal/lungs/mechanize()
new /datum/organ/internal/lungs/robotic(owner)
return
/datum/organ/internal/lungs/assisted
min_bruised_damage = 15
min_broken_damage = 35
emplevel = list(20,7,3)
desc = "Assisted"
/datum/organ/internal/lungs/mechassist()
new /datum/organ/internal/lungs/assisted(owner)
return
/datum/organ/internal/liver
name = "liver"
parent_organ = "chest"
var/process_accuracy = 10
/datum/organ/internal/liver/process()
..()
if (germ_level > INFECTION_LEVEL_ONE)
if(prob(1))
owner << "\red Your skin itches."
if (germ_level > INFECTION_LEVEL_TWO)
if(prob(1))
spawn owner.vomit()
if(owner.life_tick % process_accuracy == 0)
if(src.damage < 0)
src.damage = 0
//High toxins levels are dangerous
if(owner.getToxLoss() >= 60 && !owner.reagents.has_reagent("anti_toxin"))
//Healthy liver suffers on its own
if (src.damage < min_broken_damage)
src.damage += 0.2 * process_accuracy
//Damaged one shares the fun
else
var/datum/organ/internal/O = pick(owner.internal_organs_by_name)
if(O)
O.damage += 0.2 * process_accuracy
//Detox can heal small amounts of damage
if (src.damage && src.damage < src.min_bruised_damage && owner.reagents.has_reagent("anti_toxin"))
src.damage -= 0.2 * process_accuracy
// Damaged liver means some chemicals are very dangerous
if(src.damage >= src.min_bruised_damage)
for(var/datum/reagent/R in owner.reagents.reagent_list)
// Ethanol and all drinks are bad
if(istype(R, /datum/reagent/ethanol))
owner.adjustToxLoss(0.1 * 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(owner.reagents.has_reagent(toxin))
owner.adjustToxLoss(0.3 * process_accuracy)
/datum/organ/internal/liver/robotic
damagelevel = 0.8
emplevel = list(40,15,10)
/datum/organ/internal/liver/robotic/process()
germ_level = 0
return
/datum/organ/internal/liver/mechanize()
new /datum/organ/internal/liver/robotic(owner)
return
/datum/organ/internal/liver/assisted
min_bruised_damage = 15
min_broken_damage = 35
emplevel = list(20,7,3)
desc = "Assisted"
/datum/organ/internal/liver/mechassist()
new /datum/organ/internal/liver/assisted(owner)
return
/datum/organ/internal/kidney
name = "kidney"
parent_organ = "chest"
/datum/organ/internal/kidney/robotic
damagelevel = 0.8
emplevel = list(40,15,10)
desc = "Mechanical"
/datum/organ/internal/kidney/robotic/process()
germ_level = 0
return
/datum/organ/internal/kidney/mechanize()
new /datum/organ/internal/kidney/robotic(owner)
return
/datum/organ/internal/kidney/assisted
min_bruised_damage = 15
min_broken_damage = 35
emplevel = list(20,7,3)
desc = "Assisted"
/datum/organ/internal/kidney/mechassist()
new /datum/organ/internal/kidney/assisted(owner)
return
/datum/organ/internal/brain
name = "brain"
parent_organ = "head"
/datum/organ/internal/brain/robotic
damagelevel = 0.8
emplevel = list(40,15,10)
desc = "Mechanical"
/datum/organ/internal/brain/robotic/process()
germ_level = 0
return
/datum/organ/internal/brain/mechanize()
new /datum/organ/internal/brain/robotic(owner)
return
/datum/organ/internal/brain/assisted
min_bruised_damage = 15
min_broken_damage = 35
emplevel = list(20,7,3)
desc = "Assisted"
/datum/organ/internal/brain/mechassist()
new /datum/organ/internal/brain/assisted(owner)
return
/datum/organ/internal/eyes
name = "eyes"
parent_organ = "head"
/datum/organ/internal/eyes/process() //Eye damage replaces the old eye_stat var.
..()
if(is_bruised())
owner.eye_blurry = 20
if(is_broken())
owner.eye_blind = 20
/datum/organ/internal/eyes/robotic
damagelevel = 0.8
emplevel = list(40,15,10)
desc = "Mechanical"
/datum/organ/internal/eyes/robotic/process()
germ_level = 0
if(is_bruised())
owner.eye_blurry = 20
if(is_broken())
owner.eye_blind = 20
/datum/organ/internal/eyes/mechanize()
new /datum/organ/internal/eyes/robotic(owner)
return
/datum/organ/internal/eyes/assisted
min_bruised_damage = 15
min_broken_damage = 35
emplevel = list(20,7,3)
desc = "Assisted"
/datum/organ/internal/eyes/mechassist()
new /datum/organ/internal/eyes/assisted(owner)
return