diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index f49d8f76dfb..ec5529c80ce 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -293,7 +293,6 @@ var/splint = "" var/internal_bleeding = "" var/lung_ruptured = "" - var/infection = "" for(var/datum/wound/W in e.wounds) if(W.internal) internal_bleeding = "
Internal bleeding" break @@ -310,12 +309,12 @@ if(e.open) open = "Open:" switch (e.germ_level) - if (150 to 500) - infection = "Light Infection:" - if (500 to INFECTION_LEVEL_TWO) - infection = "Serious Infection:" - if (INFECTION_LEVEL_TWO to INFINITY) - infection = "Septic:" + if (INFECTION_LEVEL_ONE + 50 to INFECTION_LEVEL_TWO) + infected = "Mild Infection:" + if (INFECTION_LEVEL_TWO to INFECTION_LEVEL_THREE) + infected = "Acute Infection:" + if (INFECTION_LEVEL_THREE to INFINITY) + infected = "Septic:" var/unknown_body = 0 for(var/I in e.implants) @@ -340,8 +339,16 @@ mech = "Assisted:" if(i.robotic == 2) 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 += "" - dat += "[i.name]N/A[i.damage]None:[mech]" + dat += "[i.name]N/A[i.damage][infection]:[mech]" dat += "" dat += "" if(occupant.sdisabilities & BLIND) diff --git a/code/modules/events/organ_failure.dm b/code/modules/events/organ_failure.dm index 80e7f807dda..f954891b900 100644 --- a/code/modules/events/organ_failure.dm +++ b/code/modules/events/organ_failure.dm @@ -21,9 +21,23 @@ datum/event/organ_failure/start() while(severity > 0 && candidates.len) var/mob/living/carbon/human/C = candidates[1] - // Bruise one of their organs - var/O = pick(C.internal_organs) - var/datum/organ/internal/I = C.internal_organs[O] - I.damage = I.min_bruised_damage - candidates.Remove(C) - severity-- \ No newline at end of file + var/acute = prob(15) + if (prob(75)) + //internal organ infection + var/O = pick(C.internal_organs) + var/datum/organ/internal/I = C.internal_organs[O] + + 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-- diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index 50c0a7dedfd..b5761df24ca 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -49,13 +49,18 @@ if(damage_this_tick > last_dam) force_process = 1 last_dam = damage_this_tick - if(!force_process && !bad_external_organs.len) - return if(force_process) bad_external_organs.Cut() for(var/datum/organ/external/Ex in organs) 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) if(!E) continue @@ -80,11 +85,8 @@ W.germ_level += 1 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 - - for(var/datum/organ/internal/I in internal_organs) - I.process() // standing is poor if(leg_tally <= 0 && !paralysis && !(lying || resting) && prob(5)) diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 711987871a9..9ebfbb8098f 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -333,7 +333,6 @@ This function completely restores a damaged organ to perfect condition. return //Updating germ levels. Handles organ germ levels and necrosis. -//#define GERM_TRANSFER_AMOUNT germ_level/500 /datum/organ/external/proc/update_germs() 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 (prob(4*antibiotics)) germ_level-- - if(germ_level > INFECTION_LEVEL_ONE) + if(germ_level >= INFECTION_LEVEL_ONE) //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) owner.bodytemperature++ 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) - if(germ_level > INFECTION_LEVEL_TWO && antibiotics < 30) //overdosing is necessary to stop severe infections - germ_level++ - owner.adjustToxLoss(1) -/* - if(germ_level > GANGREN_LEVEL_TERMINAL) + if(germ_level >= INFECTION_LEVEL_TWO) + //spread the infection + for (var/datum/organ/internal/I in internal_organs) + if (I.germ_level < germ_level) + 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)) status |= ORGAN_DEAD owner << "You can't feel your [display_name] anymore..." - owner.update_body(1) - if (prob(10)) //Spreading the fun - if (children) //To child organs - 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) -*/ + + germ_level++ + owner.adjustToxLoss(1) + //Updating wounds. Handles wound natural I had some free spachealing, internal bleedings and infections /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)) /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 /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()) owner.u_equip(c_hand) 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()) owner.u_equip(c_hand) 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) 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 diff --git a/code/modules/organs/organ_internal.dm b/code/modules/organs/organ_internal.dm index e5fd53725e2..7df2bc90e2a 100644 --- a/code/modules/organs/organ_internal.dm +++ b/code/modules/organs/organ_internal.dm @@ -10,7 +10,6 @@ var/min_broken_damage = 30 var/parent_organ = "chest" var/robotic = 0 //For being a robot - var/germ_level = 0 /datum/organ/internal/proc/rejuvenate() damage=0 @@ -22,6 +21,7 @@ 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] @@ -31,6 +31,33 @@ H.internal_organs[src.name] = src 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) if(src.robotic == 2) src.damage += (amount * 0.8) diff --git a/code/setup.dm b/code/setup.dm index 4a671571ea9..520e83afc13 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -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_MOVE_CAP 200 //maximum germ level you can reach by running around #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