mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-27 22:17:32 +01:00
Cleanup of internal organs
Both internal and external organs are a mess, which is making maintaining and updating them nasty, so I'm cleaning them up, this is the first stage mechanical and assisted internal organs are now an object type rather than a var in the organ which makes it much cleaner and easier to adjust removed duplicate list of internal organs as there's no reason to have the same objects in 2 separate lists made New() a lot cleaner and more robust External organs will be next
This commit is contained in:
@@ -69,7 +69,8 @@
|
||||
bad_external_organs += Ex
|
||||
|
||||
//processing internal organs is pretty cheap, do that first.
|
||||
for(var/datum/organ/internal/I in internal_organs)
|
||||
for(var/name in internal_organs_by_name)
|
||||
var/datum/organ/internal/I = internal_organs_by_name[name]
|
||||
I.process()
|
||||
|
||||
//Check arms and legs for existence
|
||||
|
||||
@@ -2,15 +2,15 @@
|
||||
INTERNAL ORGANS
|
||||
****************************************************/
|
||||
|
||||
/mob/living/carbon/human/var/list/internal_organs = list()
|
||||
|
||||
/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/robotic = 0 //For being a robot
|
||||
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
|
||||
@@ -21,21 +21,19 @@
|
||||
/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
|
||||
src.owner = 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 (robotic >= 2 || (owner.species && owner.species.flags & IS_PLANT)) //TODO make robotic internal and external organs separate types of organ instead of a flag
|
||||
if (owner.species && owner.species.flags & IS_PLANT)
|
||||
germ_level = 0
|
||||
return
|
||||
|
||||
@@ -64,49 +62,42 @@
|
||||
take_damage(1,silent=prob(30))
|
||||
|
||||
/datum/organ/internal/proc/take_damage(amount, var/silent=0)
|
||||
if(src.robotic == 2)
|
||||
src.damage += amount * 0.8
|
||||
else
|
||||
src.damage += amount
|
||||
|
||||
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)
|
||||
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
|
||||
|
||||
if(emplevel[1])
|
||||
take_damage(emplevel[severity])
|
||||
|
||||
/datum/organ/internal/proc/mechanize() //Being used to make robutt hearts, etc
|
||||
robotic = 2
|
||||
|
||||
/datum/organ/internal/proc/mechassist() //Used to add things like pacemakers, etc
|
||||
robotic = 1
|
||||
min_bruised_damage = 15
|
||||
min_broken_damage = 35
|
||||
|
||||
/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
|
||||
@@ -116,85 +107,224 @@
|
||||
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"
|
||||
|
||||
process()
|
||||
..()
|
||||
if (germ_level > INFECTION_LEVEL_ONE)
|
||||
if(prob(5))
|
||||
owner.emote("cough") //respitory tract infection
|
||||
/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 += 15
|
||||
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 += 15
|
||||
|
||||
/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
|
||||
|
||||
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()
|
||||
/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
|
||||
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)
|
||||
if(O)
|
||||
O.damage += 0.2 * process_accuracy
|
||||
//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
|
||||
//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)
|
||||
// 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)
|
||||
// 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"
|
||||
|
||||
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/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
|
||||
@@ -102,7 +102,8 @@ mob/living/carbon/human/proc/handle_pain()
|
||||
pain(damaged_organ.display_name, maxdam, 0)
|
||||
|
||||
// Damage to internal organs hurts a lot.
|
||||
for(var/datum/organ/internal/I in internal_organs)
|
||||
for(var/n in internal_organs_by_name)
|
||||
var/datum/organ/internal/I = internal_organs_by_name[n]
|
||||
if(I.damage > 2) if(prob(2))
|
||||
var/datum/organ/external/parent = get_organ(I.parent_organ)
|
||||
src.custom_pain("You feel a sharp pain in your [parent.display_name]", 1)
|
||||
|
||||
Reference in New Issue
Block a user