mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-13 03:33:21 +00:00
Infections now spread between organs
Infections can now spread between internal and external organs. Also changes the organ_failure random event to cause an infection instead.
This commit is contained in:
@@ -293,7 +293,6 @@
|
|||||||
var/splint = ""
|
var/splint = ""
|
||||||
var/internal_bleeding = ""
|
var/internal_bleeding = ""
|
||||||
var/lung_ruptured = ""
|
var/lung_ruptured = ""
|
||||||
var/infection = ""
|
|
||||||
for(var/datum/wound/W in e.wounds) if(W.internal)
|
for(var/datum/wound/W in e.wounds) if(W.internal)
|
||||||
internal_bleeding = "<br>Internal bleeding"
|
internal_bleeding = "<br>Internal bleeding"
|
||||||
break
|
break
|
||||||
@@ -310,12 +309,12 @@
|
|||||||
if(e.open)
|
if(e.open)
|
||||||
open = "Open:"
|
open = "Open:"
|
||||||
switch (e.germ_level)
|
switch (e.germ_level)
|
||||||
if (150 to 500)
|
if (INFECTION_LEVEL_ONE + 50 to INFECTION_LEVEL_TWO)
|
||||||
infection = "Light Infection:"
|
infected = "Mild Infection:"
|
||||||
if (500 to INFECTION_LEVEL_TWO)
|
if (INFECTION_LEVEL_TWO to INFECTION_LEVEL_THREE)
|
||||||
infection = "Serious Infection:"
|
infected = "Acute Infection:"
|
||||||
if (INFECTION_LEVEL_TWO to INFINITY)
|
if (INFECTION_LEVEL_THREE to INFINITY)
|
||||||
infection = "Septic:"
|
infected = "Septic:"
|
||||||
|
|
||||||
var/unknown_body = 0
|
var/unknown_body = 0
|
||||||
for(var/I in e.implants)
|
for(var/I in e.implants)
|
||||||
@@ -340,8 +339,16 @@
|
|||||||
mech = "Assisted:"
|
mech = "Assisted:"
|
||||||
if(i.robotic == 2)
|
if(i.robotic == 2)
|
||||||
mech = "Mechanical:"
|
mech = "Mechanical:"
|
||||||
|
|
||||||
|
var/infection = "None"
|
||||||
|
switch (i.germ_level)
|
||||||
|
if (1 to INFECTION_LEVEL_TWO)
|
||||||
|
infection = "Mild Infection:"
|
||||||
|
if (INFECTION_LEVEL_TWO to INFINITY)
|
||||||
|
infection = "Acute Infection:"
|
||||||
|
|
||||||
dat += "<tr>"
|
dat += "<tr>"
|
||||||
dat += "<td>[i.name]</td><td>N/A</td><td>[i.damage]</td><td>None:[mech]</td><td></td>"
|
dat += "<td>[i.name]</td><td>N/A</td><td>[i.damage]</td><td>[infection]:[mech]</td><td></td>"
|
||||||
dat += "</tr>"
|
dat += "</tr>"
|
||||||
dat += "</table>"
|
dat += "</table>"
|
||||||
if(occupant.sdisabilities & BLIND)
|
if(occupant.sdisabilities & BLIND)
|
||||||
|
|||||||
@@ -21,9 +21,23 @@ datum/event/organ_failure/start()
|
|||||||
while(severity > 0 && candidates.len)
|
while(severity > 0 && candidates.len)
|
||||||
var/mob/living/carbon/human/C = candidates[1]
|
var/mob/living/carbon/human/C = candidates[1]
|
||||||
|
|
||||||
// Bruise one of their organs
|
var/acute = prob(15)
|
||||||
var/O = pick(C.internal_organs)
|
if (prob(75))
|
||||||
var/datum/organ/internal/I = C.internal_organs[O]
|
//internal organ infection
|
||||||
I.damage = I.min_bruised_damage
|
var/O = pick(C.internal_organs)
|
||||||
candidates.Remove(C)
|
var/datum/organ/internal/I = C.internal_organs[O]
|
||||||
severity--
|
|
||||||
|
if (acute)
|
||||||
|
I.germ_level = max(INFECTION_LEVEL_TWO, I.germ_level)
|
||||||
|
else
|
||||||
|
I.germ_level = max(rand(INFECTION_LEVEL_ONE,INFECTION_LEVEL_ONE*2), I.germ_level)
|
||||||
|
else
|
||||||
|
//external organ infection
|
||||||
|
var/datum/organ/external/O = pick(C.organs)
|
||||||
|
|
||||||
|
if (acute)
|
||||||
|
O.germ_level = max(INFECTION_LEVEL_TWO, O.germ_level)
|
||||||
|
else
|
||||||
|
O.germ_level = max(rand(INFECTION_LEVEL_ONE,INFECTION_LEVEL_ONE*2), O.germ_level)
|
||||||
|
|
||||||
|
severity--
|
||||||
|
|||||||
@@ -49,13 +49,18 @@
|
|||||||
if(damage_this_tick > last_dam)
|
if(damage_this_tick > last_dam)
|
||||||
force_process = 1
|
force_process = 1
|
||||||
last_dam = damage_this_tick
|
last_dam = damage_this_tick
|
||||||
if(!force_process && !bad_external_organs.len)
|
|
||||||
return
|
|
||||||
if(force_process)
|
if(force_process)
|
||||||
bad_external_organs.Cut()
|
bad_external_organs.Cut()
|
||||||
for(var/datum/organ/external/Ex in organs)
|
for(var/datum/organ/external/Ex in organs)
|
||||||
bad_external_organs += Ex
|
bad_external_organs += Ex
|
||||||
|
|
||||||
|
//processing internal organs is pretty cheap, do that first.
|
||||||
|
for(var/datum/organ/internal/I in internal_organs)
|
||||||
|
I.process()
|
||||||
|
|
||||||
|
if(!force_process && !bad_external_organs.len)
|
||||||
|
return
|
||||||
|
|
||||||
for(var/datum/organ/external/E in bad_external_organs)
|
for(var/datum/organ/external/E in bad_external_organs)
|
||||||
if(!E)
|
if(!E)
|
||||||
continue
|
continue
|
||||||
@@ -80,11 +85,8 @@
|
|||||||
W.germ_level += 1
|
W.germ_level += 1
|
||||||
|
|
||||||
if(E.name in list("l_leg","l_foot","r_leg","r_foot") && !lying)
|
if(E.name in list("l_leg","l_foot","r_leg","r_foot") && !lying)
|
||||||
if (!E.is_usable() || malfunction || (broken && !(E.status & ORGAN_SPLINTED)))
|
if (!E.is_usable() || E.is_malfunctioning() || (E.is_broken() && !(E.status & ORGAN_SPLINTED)))
|
||||||
leg_tally-- // let it fail even if just foot&leg
|
leg_tally-- // let it fail even if just foot&leg
|
||||||
|
|
||||||
for(var/datum/organ/internal/I in internal_organs)
|
|
||||||
I.process()
|
|
||||||
|
|
||||||
// standing is poor
|
// standing is poor
|
||||||
if(leg_tally <= 0 && !paralysis && !(lying || resting) && prob(5))
|
if(leg_tally <= 0 && !paralysis && !(lying || resting) && prob(5))
|
||||||
|
|||||||
@@ -333,7 +333,6 @@ This function completely restores a damaged organ to perfect condition.
|
|||||||
return
|
return
|
||||||
|
|
||||||
//Updating germ levels. Handles organ germ levels and necrosis.
|
//Updating germ levels. Handles organ germ levels and necrosis.
|
||||||
//#define GERM_TRANSFER_AMOUNT germ_level/500
|
|
||||||
/datum/organ/external/proc/update_germs()
|
/datum/organ/external/proc/update_germs()
|
||||||
|
|
||||||
if(status & (ORGAN_ROBOT|ORGAN_DESTROYED)) //Robotic limbs shouldn't be infected, nor should nonexistant limbs.
|
if(status & (ORGAN_ROBOT|ORGAN_DESTROYED)) //Robotic limbs shouldn't be infected, nor should nonexistant limbs.
|
||||||
@@ -356,34 +355,41 @@ This function completely restores a damaged organ to perfect condition.
|
|||||||
if (germ_level > 0 && antibiotics > 5)
|
if (germ_level > 0 && antibiotics > 5)
|
||||||
if (prob(4*antibiotics)) germ_level--
|
if (prob(4*antibiotics)) germ_level--
|
||||||
|
|
||||||
if(germ_level > INFECTION_LEVEL_ONE)
|
if(germ_level >= INFECTION_LEVEL_ONE)
|
||||||
//having an infection raises your body temperature
|
//having an infection raises your body temperature
|
||||||
var/temperature_increase = (owner.species.heat_level_1 - owner.species.body_temperature - 1)* min(germ_level/INFECTION_LEVEL_TWO, 1)
|
var/temperature_increase = (owner.species.heat_level_1 - owner.species.body_temperature - 1)* min(germ_level/INFECTION_LEVEL_THREE, 1)
|
||||||
if (owner.bodytemperature < temperature_increase)
|
if (owner.bodytemperature < temperature_increase)
|
||||||
owner.bodytemperature++
|
owner.bodytemperature++
|
||||||
|
|
||||||
if(prob(round(germ_level/10))) //aiming for a light infection to become serious after 40 minutes, standing still
|
if(prob(round(germ_level/10))) //aiming for a light infection to become serious after 40 minutes, standing still
|
||||||
germ_level += 1
|
germ_level++
|
||||||
owner.adjustToxLoss(1)
|
owner.adjustToxLoss(1)
|
||||||
|
|
||||||
if(germ_level > INFECTION_LEVEL_TWO && antibiotics < 30) //overdosing is necessary to stop severe infections
|
if(germ_level >= INFECTION_LEVEL_TWO)
|
||||||
germ_level++
|
//spread the infection
|
||||||
owner.adjustToxLoss(1)
|
for (var/datum/organ/internal/I in internal_organs)
|
||||||
/*
|
if (I.germ_level < germ_level)
|
||||||
if(germ_level > GANGREN_LEVEL_TERMINAL)
|
I.germ_level++
|
||||||
|
|
||||||
|
if (children) //To child organs
|
||||||
|
for (var/datum/organ/external/child in children)
|
||||||
|
if (child.germ_level < germ_level && !(child.status & ORGAN_ROBOT))
|
||||||
|
if (child.germ_level < INFECTION_LEVEL_ONE*2 || prob(30))
|
||||||
|
child.germ_level++
|
||||||
|
|
||||||
|
if (parent)
|
||||||
|
if (parent.germ_level < germ_level && !(parent.status & ORGAN_ROBOT))
|
||||||
|
if (parent.germ_level < INFECTION_LEVEL_ONE*2 || prob(30))
|
||||||
|
parent.germ_level++
|
||||||
|
|
||||||
|
if(germ_level >= INFECTION_LEVEL_THREE && antibiotics < 30) //overdosing is necessary to stop severe infections
|
||||||
if (!(status & ORGAN_DEAD))
|
if (!(status & ORGAN_DEAD))
|
||||||
status |= ORGAN_DEAD
|
status |= ORGAN_DEAD
|
||||||
owner << "<span class='notice'>You can't feel your [display_name] anymore...</span>"
|
owner << "<span class='notice'>You can't feel your [display_name] anymore...</span>"
|
||||||
owner.update_body(1)
|
|
||||||
if (prob(10)) //Spreading the fun
|
germ_level++
|
||||||
if (children) //To child organs
|
owner.adjustToxLoss(1)
|
||||||
for (var/datum/organ/external/child in children)
|
|
||||||
if (!(child.status & (ORGAN_DEAD|ORGAN_DESTROYED|ORGAN_ROBOT)))
|
|
||||||
child.germ_level += round(GERM_TRANSFER_AMOUNT)
|
|
||||||
if (parent)
|
|
||||||
if (!(parent.status & (ORGAN_DEAD|ORGAN_DESTROYED|ORGAN_ROBOT)))
|
|
||||||
parent.germ_level += round(GERM_TRANSFER_AMOUNT)
|
|
||||||
*/
|
|
||||||
|
|
||||||
//Updating wounds. Handles wound natural I had some free spachealing, internal bleedings and infections
|
//Updating wounds. Handles wound natural I had some free spachealing, internal bleedings and infections
|
||||||
/datum/organ/external/proc/update_wounds()
|
/datum/organ/external/proc/update_wounds()
|
||||||
@@ -717,7 +723,7 @@ This function completely restores a damaged organ to perfect condition.
|
|||||||
return ((status & ORGAN_BROKEN) && !(status & ORGAN_SPLINTED))
|
return ((status & ORGAN_BROKEN) && !(status & ORGAN_SPLINTED))
|
||||||
|
|
||||||
/datum/organ/external/proc/is_malfunctioning()
|
/datum/organ/external/proc/is_malfunctioning()
|
||||||
return ((status & ORGAN_ROBOT) && prob(E.brute_dam + E.burn_dam))
|
return ((status & ORGAN_ROBOT) && prob(brute_dam + burn_dam))
|
||||||
|
|
||||||
//for arms and hands
|
//for arms and hands
|
||||||
/datum/organ/external/proc/process_grasp(var/obj/item/c_hand, var/hand_name)
|
/datum/organ/external/proc/process_grasp(var/obj/item/c_hand, var/hand_name)
|
||||||
@@ -727,7 +733,7 @@ This function completely restores a damaged organ to perfect condition.
|
|||||||
if(is_broken())
|
if(is_broken())
|
||||||
owner.u_equip(c_hand)
|
owner.u_equip(c_hand)
|
||||||
var/emote_scream = pick("screams in pain and", "lets out a sharp cry and", "cries out and")
|
var/emote_scream = pick("screams in pain and", "lets out a sharp cry and", "cries out and")
|
||||||
owner.emote("me", 1, "[(species && species.flags & NO_PAIN) ? "" : emote_scream ] drops what they were holding in their [hand_name]!")
|
owner.emote("me", 1, "[(owner.species && owner.species.flags & NO_PAIN) ? "" : emote_scream ] drops what they were holding in their [hand_name]!")
|
||||||
if(is_malfunctioning())
|
if(is_malfunctioning())
|
||||||
owner.u_equip(c_hand)
|
owner.u_equip(c_hand)
|
||||||
owner.emote("me", 1, "drops what they were holding, their [hand_name] malfunctioning!")
|
owner.emote("me", 1, "drops what they were holding, their [hand_name] malfunctioning!")
|
||||||
@@ -738,10 +744,6 @@ This function completely restores a damaged organ to perfect condition.
|
|||||||
spawn(10)
|
spawn(10)
|
||||||
del(spark_system)
|
del(spark_system)
|
||||||
|
|
||||||
//legs
|
|
||||||
//returns 1 if this organ can support standing
|
|
||||||
/datum/organ/external/proc/can_support_standing()
|
|
||||||
if (!E.is_usable() || malfunction || (broken && !(E.status & ORGAN_SPLINTED)))
|
|
||||||
|
|
||||||
/****************************************************
|
/****************************************************
|
||||||
ORGAN DEFINES
|
ORGAN DEFINES
|
||||||
|
|||||||
@@ -10,7 +10,6 @@
|
|||||||
var/min_broken_damage = 30
|
var/min_broken_damage = 30
|
||||||
var/parent_organ = "chest"
|
var/parent_organ = "chest"
|
||||||
var/robotic = 0 //For being a robot
|
var/robotic = 0 //For being a robot
|
||||||
var/germ_level = 0
|
|
||||||
|
|
||||||
/datum/organ/internal/proc/rejuvenate()
|
/datum/organ/internal/proc/rejuvenate()
|
||||||
damage=0
|
damage=0
|
||||||
@@ -22,6 +21,7 @@
|
|||||||
return damage >= min_broken_damage
|
return damage >= min_broken_damage
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/datum/organ/internal/New(mob/living/carbon/human/H)
|
/datum/organ/internal/New(mob/living/carbon/human/H)
|
||||||
..()
|
..()
|
||||||
var/datum/organ/external/E = H.organs_by_name[src.parent_organ]
|
var/datum/organ/external/E = H.organs_by_name[src.parent_organ]
|
||||||
@@ -31,6 +31,33 @@
|
|||||||
H.internal_organs[src.name] = src
|
H.internal_organs[src.name] = src
|
||||||
src.owner = H
|
src.owner = H
|
||||||
|
|
||||||
|
/datum/organ/internal/process()
|
||||||
|
|
||||||
|
//Process infections
|
||||||
|
if (!germ_level)
|
||||||
|
return
|
||||||
|
|
||||||
|
var/antibiotics = owner.reagents.get_reagent_amount("spaceacillin")
|
||||||
|
|
||||||
|
if (germ_level > 0 && antibiotics > 5)
|
||||||
|
if (prob(4*antibiotics)) germ_level--
|
||||||
|
if (antibiotics > 30) germ_level--
|
||||||
|
|
||||||
|
if (germ_level >= INFECTION_LEVEL_ONE/2)
|
||||||
|
if(prob(round(germ_level/6))) //aiming for germ level to go from ambient to INFECTION_LEVEL_TWO in an average of 15 minutes
|
||||||
|
germ_level++
|
||||||
|
if(prob(1))
|
||||||
|
take_damage(1,silent=0)
|
||||||
|
|
||||||
|
if (germ_level >= INFECTION_LEVEL_TWO)
|
||||||
|
var/datum/organ/external/parent = owner.get_organ(parent_organ)
|
||||||
|
if (parent.germ_level < germ_level && ( parent.germ_level < INFECTION_LEVEL_ONE*2 || prob(30) ))
|
||||||
|
parent.germ_level++
|
||||||
|
|
||||||
|
if (prob(5)) //about once every 20 seconds
|
||||||
|
take_damage(1,silent=prob(30))
|
||||||
|
|
||||||
|
|
||||||
/datum/organ/internal/proc/take_damage(amount, var/silent=0)
|
/datum/organ/internal/proc/take_damage(amount, var/silent=0)
|
||||||
if(src.robotic == 2)
|
if(src.robotic == 2)
|
||||||
src.damage += (amount * 0.8)
|
src.damage += (amount * 0.8)
|
||||||
|
|||||||
@@ -772,5 +772,6 @@ var/list/RESTRICTED_CAMERA_NETWORKS = list( //Those networks can only be accesse
|
|||||||
#define GERM_LEVEL_AMBIENT 110 //maximum germ level you can reach by standing still
|
#define GERM_LEVEL_AMBIENT 110 //maximum germ level you can reach by standing still
|
||||||
#define GERM_LEVEL_MOVE_CAP 200 //maximum germ level you can reach by running around
|
#define GERM_LEVEL_MOVE_CAP 200 //maximum germ level you can reach by running around
|
||||||
#define INFECTION_LEVEL_ONE 100
|
#define INFECTION_LEVEL_ONE 100
|
||||||
#define INFECTION_LEVEL_TWO 1000
|
#define INFECTION_LEVEL_TWO 500
|
||||||
|
#define INFECTION_LEVEL_THREE 1000
|
||||||
#define INFECTION_LEVEL_TERMINAL 2500
|
#define INFECTION_LEVEL_TERMINAL 2500
|
||||||
|
|||||||
Reference in New Issue
Block a user