diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm
index 5e7fb5d0bd3..0cc712799c7 100644
--- a/code/_globalvars/lists/objects.dm
+++ b/code/_globalvars/lists/objects.dm
@@ -43,3 +43,5 @@ var/global/list/global_radios = list() //list of all radios, across all z-lev
var/global/list/meteor_list = list() //list of all meteors
var/global/list/poi_list = list() //list of points of interest for observe/follow
var/global/list/active_jammers = list() // List of active radio jammers
+
+var/global/list/active_diseases = list() //List of Active disease in all mobs; purely for quick referencing.
\ No newline at end of file
diff --git a/code/controllers/Processes/diseases.dm b/code/controllers/Processes/diseases.dm
deleted file mode 100644
index d0bec749ac8..00000000000
--- a/code/controllers/Processes/diseases.dm
+++ /dev/null
@@ -1,43 +0,0 @@
-var/datum/controller/process/diseases/disease_master
-
-/datum/controller/process/diseases
- var/list/currentrun = list()
- var/list/processing_diseases = list()
-
-/datum/controller/process/diseases/setup()
- name = "disease"
- schedule_interval = 20 // every 2 seconds
- start_delay = 7
- log_startup_progress("Disease controller starting.")
-
- register_diseases() //register all pre-round diseases created
-
-/datum/controller/process/diseases/statProcess()
- ..()
- stat(null, "[processing_diseases.len] diseases")
-
-
-/datum/controller/process/diseases/doWork()
- src.currentrun = processing_diseases.Copy()
- //cache for sanic speed (lists are references anyways)
- var/list/currentrun = src.currentrun
-
- while(currentrun.len)
- var/datum/disease/thing = currentrun[1]
- currentrun.Cut(1, 2)
- if(thing)
- try
- thing.process()
- catch(var/exception/e)
- catchException(e, thing)
- SCHECK
- else
- catchBadType(thing)
- processing_diseases.Remove(thing)
-
-DECLARE_GLOBAL_CONTROLLER(diseases, disease_master)
-
-/datum/controller/process/diseases/proc/register_diseases()
- for(var/datum/disease/D in world)
- if(!processing_diseases.Find(D))
- D.register()
diff --git a/code/controllers/verbs.dm b/code/controllers/verbs.dm
index fe8d1cbb133..1cc9787420d 100644
--- a/code/controllers/verbs.dm
+++ b/code/controllers/verbs.dm
@@ -72,9 +72,6 @@
if("Vote")
debug_variables(vote)
feedback_add_details("admin_verb","DVote")
- if("Diseases")
- debug_variables(disease_master)
- feedback_add_details("admin_verb","DDiseases")
if("Fires")
debug_variables(fire_master)
feedback_add_details("admin_verb","DFires")
diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm
index 0252977dcf4..48e4366c825 100644
--- a/code/datums/diseases/_MobProcs.dm
+++ b/code/datums/diseases/_MobProcs.dm
@@ -1,6 +1,7 @@
/mob/proc/HasDisease(datum/disease/D)
- for(var/datum/disease/DD in viruses)
+ for(var/thing in viruses)
+ var/datum/disease/DD = thing
if(D.IsSame(DD))
return 1
return 0
@@ -35,7 +36,7 @@
var/datum/disease/DD = new D.type(1, D, 0)
viruses += DD
DD.affected_mob = src
- DD.holder = src
+ active_diseases += DD //Add it to the active diseases list, now that it's actually in a mob and being processed.
//Copy properties over. This is so edited diseases persist.
var/list/skipped = list("affected_mob","holder","carrier","stage","type","parent_type","vars","transformed")
@@ -133,8 +134,11 @@
/mob/living/carbon/human/CanContractDisease(datum/disease/D)
- if(species.virus_immune)
+ if(species.virus_immune && !D.bypasses_immunity)
return 0
+ for(var/thing in D.required_organs)
+ if(!((locate(thing) in bodyparts) || (locate(thing) in internal_organs)))
+ return 0
return ..()
/mob/living/carbon/human/monkey/CanContractDisease(datum/disease/D)
diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm
index 42a3a634500..571a0d7aa7b 100644
--- a/code/datums/diseases/_disease.dm
+++ b/code/datums/diseases/_disease.dm
@@ -50,21 +50,23 @@ var/list/diseases = subtypesof(/datum/disease)
var/stage_prob = 4
//Other
- var/longevity = 150 //Time in ticks disease stays in objects, Syringes and such are infinite.
var/list/viable_mobtypes = list() //typepaths of viable mobs
var/mob/living/carbon/affected_mob = null
- var/atom/movable/holder = null
var/list/cures = list() //list of cures if the disease has the CURABLE flag, these are reagent ids
var/infectivity = 65
var/cure_chance = 8
- var/carrier = 0 //If our host is only a carrier
+ var/carrier = FALSE //If our host is only a carrier
+ var/bypasses_immunity = FALSE //Does it skip species virus immunity check? Some things may diseases and not viruses
var/permeability_mod = 1
var/severity = NONTHREAT
var/list/required_organs = list()
var/needs_all_cures = TRUE
var/list/strain_data = list() //dna_spread special bullshit
-
+/datum/disease/Destroy()
+ affected_mob = null
+ active_diseases.Remove(src)
+ return ..()
/datum/disease/proc/stage_act()
var/cure = has_cure()
@@ -97,13 +99,15 @@ var/list/diseases = subtypesof(/datum/disease)
if(!. || (needs_all_cures && . < cures.len))
return 0
-/datum/disease/proc/spread(atom/source, force_spread = 0)
+/datum/disease/proc/spread(force_spread = 0)
+ if(!affected_mob)
+ return
+
if((spread_flags & SPECIAL || spread_flags & NON_CONTAGIOUS || spread_flags & BLOOD) && !force_spread)
return
- if(affected_mob)
- if(affected_mob.reagents.has_reagent("spaceacillin") || (affected_mob.satiety > 0 && prob(affected_mob.satiety/10)))
- return
+ if(affected_mob.reagents.has_reagent("spaceacillin") || (affected_mob.satiety > 0 && prob(affected_mob.satiety/10)))
+ return
var/spread_range = 1
@@ -113,15 +117,9 @@ var/list/diseases = subtypesof(/datum/disease)
if(spread_flags & AIRBORNE)
spread_range++
- if(!source)
- if(affected_mob)
- source = affected_mob
- else
- return
-
- var/turf/T = source.loc
+ var/turf/T = affected_mob.loc
if(istype(T))
- for(var/mob/living/carbon/C in oview(spread_range, source))
+ for(var/mob/living/carbon/C in oview(spread_range, affected_mob))
var/turf/V = get_turf(C)
if(V)
while(TRUE)
@@ -134,30 +132,6 @@ var/list/diseases = subtypesof(/datum/disease)
V = Temp
-/datum/disease/proc/process()
- if(!holder)
- disease_master.processing_diseases -= src
- return
-
- if(prob(infectivity))
- spread(holder)
-
- if(affected_mob)
- for(var/datum/disease/D in affected_mob.viruses)
- if(D != src)
- if(IsSame(D))
- qdel(D)
-
- if(holder == affected_mob)
- if(affected_mob.stat != DEAD)
- stage_act()
-
- if(!affected_mob)
- if(prob(70))
- if(--longevity<=0)
- cure()
-
-
/datum/disease/proc/cure()
if(affected_mob)
if(disease_flags & CAN_RESIST)
@@ -166,24 +140,6 @@ var/list/diseases = subtypesof(/datum/disease)
remove_virus()
qdel(src)
-
-/datum/disease/New()
- if(required_organs && required_organs.len)
- if(ishuman(affected_mob))
- var/mob/living/carbon/human/H = affected_mob
- for(var/obj/item/organ/O in required_organs)
- if(!locate(O) in H.bodyparts)
- if(!locate(O) in H.internal_organs)
- cure()
- return
-
- if(disease_master)
- register()
-
-/datum/disease/proc/register()
- disease_master.processing_diseases += src
-
-
/datum/disease/proc/IsSame(datum/disease/D)
if(istype(src, D.type))
return 1
@@ -199,13 +155,6 @@ var/list/diseases = subtypesof(/datum/disease)
/datum/disease/proc/GetDiseaseID()
return type
-
-/datum/disease/Destroy()
- if(disease_master && disease_master.processing_diseases.Find(src))
- disease_master.processing_diseases.Remove(src)
- return ..()
-
-
/datum/disease/proc/IsSpreadByTouch()
if(spread_flags & CONTACT_FEET || spread_flags & CONTACT_HANDS || spread_flags & CONTACT_GENERAL)
return 1
diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm
index ba180af970e..71c1bd74a28 100644
--- a/code/datums/diseases/advance/advance.dm
+++ b/code/datums/diseases/advance/advance.dm
@@ -46,13 +46,6 @@ var/list/advance_cures = list(
*/
/datum/disease/advance/New(var/process = 1, var/datum/disease/advance/D)
-
- // Setup our dictionary if it hasn't already.
- if(!dictionary_symptoms.len)
- for(var/symp in list_symptoms)
- var/datum/symptom/S = new symp
- dictionary_symptoms[S.id] = symp
-
if(!istype(D))
D = null
// Generate symptoms if we weren't given any.
@@ -96,7 +89,7 @@ var/list/advance_cures = list(
if(!(istype(D, /datum/disease/advance)))
return 0
- if(src.GetDiseaseID() != D.GetDiseaseID())
+ if(GetDiseaseID() != D.GetDiseaseID())
return 0
return 1
@@ -121,7 +114,7 @@ var/list/advance_cures = list(
// Mix the symptoms of two diseases (the src and the argument)
/datum/disease/advance/proc/Mix(datum/disease/advance/D)
- if(!(src.IsSame(D)))
+ if(!(IsSame(D)))
var/list/possible_symptoms = shuffle(D.symptoms)
for(var/datum/symptom/S in possible_symptoms)
AddSymptom(new S.type)
@@ -161,7 +154,6 @@ var/list/advance_cures = list(
return generated
/datum/disease/advance/proc/Refresh(new_name = 0)
-// to_chat(world, "[src.name] \ref[src] - REFRESH!")
var/list/properties = GenerateProperties()
AssignProperties(properties)
id = null
@@ -402,7 +394,7 @@ var/list/advance_cures = list(
D.AssignName(new_name)
D.Refresh()
- for(var/datum/disease/advance/AD in disease_master.processing)
+ for(var/datum/disease/advance/AD in active_diseases)
AD.Refresh()
for(var/mob/living/carbon/human/H in shuffle(living_mob_list))
@@ -417,12 +409,6 @@ var/list/advance_cures = list(
name_symptoms += S.name
message_admins("[key_name_admin(user)] has triggered a custom virus outbreak of [D.name]! It has these symptoms: [english_list(name_symptoms)]")
-/*
-/mob/verb/test()
-
- for(var/datum/disease/D in disease_master.processing)
- to_chat(src, "[D.name] - [D.holder]")
-*/
/datum/disease/advance/proc/totalStageSpeed()
diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm
index 007bbc92f0b..56be430f85d 100644
--- a/code/datums/diseases/advance/symptoms/heal.dm
+++ b/code/datums/diseases/advance/symptoms/heal.dm
@@ -67,7 +67,8 @@ Bonus
/datum/symptom/heal/metabolism/Heal(mob/living/M, datum/disease/advance/A)
var/cured = 0
- for(var/datum/disease/D in M.viruses)
+ for(var/thing in M.viruses)
+ var/datum/disease/D = thing
if(D != A)
cured = 1
cured_diseases += D.GetDiseaseID()
diff --git a/code/datums/diseases/advance/symptoms/sneeze.dm b/code/datums/diseases/advance/symptoms/sneeze.dm
index 9413eea5db5..0a31a4acae6 100644
--- a/code/datums/diseases/advance/symptoms/sneeze.dm
+++ b/code/datums/diseases/advance/symptoms/sneeze.dm
@@ -35,5 +35,5 @@ Bonus
M.emote("sniff")
else
M.emote("sneeze")
- A.spread(A.holder, 5)
+ A.spread(5)
return
\ No newline at end of file
diff --git a/code/datums/diseases/advance/symptoms/symptoms.dm b/code/datums/diseases/advance/symptoms/symptoms.dm
index 1246b68fd0f..74da571836b 100644
--- a/code/datums/diseases/advance/symptoms/symptoms.dm
+++ b/code/datums/diseases/advance/symptoms/symptoms.dm
@@ -1,7 +1,6 @@
// Symptoms are the effects that engineered advanced diseases do.
var/list/list_symptoms = subtypesof(/datum/symptom)
-var/list/dictionary_symptoms = list()
var/global/const/SYMPTOM_ACTIVATION_PROB = 3
@@ -22,7 +21,7 @@ var/global/const/SYMPTOM_ACTIVATION_PROB = 3
/datum/symptom/New()
var/list/S = list_symptoms
for(var/i = 1; i <= S.len; i++)
- if(src.type == S[i])
+ if(type == S[i])
id = "[i]"
return
CRASH("We couldn't assign an ID!")
diff --git a/code/datums/diseases/appendicitis.dm b/code/datums/diseases/appendicitis.dm
index 3c94ad8f801..d06c49de9c8 100644
--- a/code/datums/diseases/appendicitis.dm
+++ b/code/datums/diseases/appendicitis.dm
@@ -8,11 +8,11 @@
permeability_mod = 1
desc = "If left untreated the subject will become very weak, and may vomit often."
severity = "Dangerous!"
- longevity = 1000
disease_flags = CAN_CARRY|CAN_RESIST
spread_flags = NON_CONTAGIOUS
visibility_flags = HIDDEN_PANDEMIC
required_organs = list(/obj/item/organ/internal/appendix)
+ bypasses_immunity = TRUE
/datum/disease/appendicitis/stage_act()
..()
diff --git a/code/datums/diseases/brainrot.dm b/code/datums/diseases/brainrot.dm
index 38907524200..bb95e4aa733 100644
--- a/code/datums/diseases/brainrot.dm
+++ b/code/datums/diseases/brainrot.dm
@@ -9,7 +9,7 @@
viable_mobtypes = list(/mob/living/carbon/human)
cure_chance = 15//higher chance to cure, since two reagents are required
desc = "This disease destroys the braincells, causing brain fever, brain necrosis and general intoxication."
- required_organs = list(/obj/item/organ/external/head)
+ required_organs = list(/obj/item/organ/internal/brain)
severity = DANGEROUS
/datum/disease/brainrot/stage_act() //Removed toxloss because damaging diseases are pretty horrible. Last round it killed the entire station because the cure didn't work -- Urist -ACTUALLY Removed rather than commented out, I don't see it returning - RR
diff --git a/code/datums/diseases/dna_spread.dm b/code/datums/diseases/dna_spread.dm
index f73154a0e20..7c5cde5b330 100644
--- a/code/datums/diseases/dna_spread.dm
+++ b/code/datums/diseases/dna_spread.dm
@@ -23,8 +23,8 @@
//Absorbs the target DNA.
strain_data["dna"] = new affected_mob.dna.type
affected_mob.dna.copy_dna(strain_data["dna"])
- src.carrier = 1
- src.stage = 4
+ carrier = TRUE
+ stage = 4
return
switch(stage)
diff --git a/code/datums/diseases/kuru.dm b/code/datums/diseases/kuru.dm
index bfd5af91a29..55fd4490d8e 100644
--- a/code/datums/diseases/kuru.dm
+++ b/code/datums/diseases/kuru.dm
@@ -1,4 +1,5 @@
/datum/disease/kuru
+ form = "Disease"
name = "Space Kuru"
max_stages = 4
stage_prob = 5
@@ -10,6 +11,7 @@
desc = "Uncontrollable laughing."
severity = BIOHAZARD
spread_flags = NON_CONTAGIOUS
+ bypasses_immunity = TRUE //Kuru is a prion disorder, not a virus
/datum/disease/kuru/stage_act()
..()
diff --git a/code/datums/diseases/pierrot_throat.dm b/code/datums/diseases/pierrot_throat.dm
index 677bbbb2967..2bf0ca308a8 100644
--- a/code/datums/diseases/pierrot_throat.dm
+++ b/code/datums/diseases/pierrot_throat.dm
@@ -10,7 +10,6 @@
permeability_mod = 0.75
desc = "If left untreated the subject will probably drive others to insanity."
severity = MEDIUM
- longevity = 400
/datum/disease/pierrot_throat/stage_act()
..()
diff --git a/code/datums/diseases/rhumba_beat.dm b/code/datums/diseases/rhumba_beat.dm
index ec58f4f6034..fc26f005340 100644
--- a/code/datums/diseases/rhumba_beat.dm
+++ b/code/datums/diseases/rhumba_beat.dm
@@ -12,21 +12,17 @@
/datum/disease/rhumba_beat/stage_act()
..()
+ if(affected_mob.ckey == "rosham")
+ cure()
+ return
switch(stage)
- if(1)
- if(affected_mob.ckey == "rosham")
- src.cure()
if(2)
- if(affected_mob.ckey == "rosham")
- src.cure()
if(prob(45))
affected_mob.adjustToxLoss(5)
affected_mob.updatehealth()
if(prob(1))
to_chat(affected_mob, "You feel strange...")
if(3)
- if(affected_mob.ckey == "rosham")
- src.cure()
if(prob(5))
to_chat(affected_mob, "You feel the urge to dance...")
else if(prob(5))
@@ -34,8 +30,6 @@
else if(prob(10))
to_chat(affected_mob, "You feel the need to chick chicky boom...")
if(4)
- if(affected_mob.ckey == "rosham")
- src.cure()
if(prob(10))
affected_mob.emote("gasp")
to_chat(affected_mob, "You feel a burning beat inside...")
@@ -43,10 +37,6 @@
affected_mob.adjustToxLoss(5)
affected_mob.updatehealth()
if(5)
- if(affected_mob.ckey == "rosham")
- src.cure()
to_chat(affected_mob, "Your body is unable to contain the Rhumba Beat...")
if(prob(50))
- affected_mob.gib()
- else
- return
\ No newline at end of file
+ affected_mob.gib()
\ No newline at end of file
diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm
index e3482955865..7b4b0a27393 100644
--- a/code/datums/diseases/transformation.dm
+++ b/code/datums/diseases/transformation.dm
@@ -78,7 +78,6 @@
permeability_mod = 1
cure_chance = 1
disease_flags = CAN_CARRY|CAN_RESIST
- longevity = 30
desc = "Monkeys with this disease will bite humans, causing humans to mutate into a monkey."
severity = BIOHAZARD
stage_prob = 4
diff --git a/code/datums/diseases/tuberculosis.dm b/code/datums/diseases/tuberculosis.dm
index 4cd027a7d7d..9aad7ff6d17 100644
--- a/code/datums/diseases/tuberculosis.dm
+++ b/code/datums/diseases/tuberculosis.dm
@@ -1,4 +1,5 @@
/datum/disease/tuberculosis
+ form = "Disease"
name = "Fungal tuberculosis"
max_stages = 5
spread_text = "Airborne"
@@ -8,8 +9,9 @@
viable_mobtypes = list(/mob/living/carbon/human)
cure_chance = 5//like hell are you getting out of hell
desc = "A rare highly transmittable virulent virus. Few samples exist, rumoured to be carefully grown and cultured by clandestine bio-weapon specialists. Causes fever, blood vomiting, lung damage, weight loss, and fatigue."
- required_organs = list(/obj/item/organ/external/head)
+ required_organs = list(/obj/item/organ/internal/lungs)
severity = DANGEROUS
+ bypasses_immunity = TRUE //Fungal and bacterial in nature; also infects the lungs
/datum/disease/tuberculosis/stage_act() //it begins
..()
diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm
index 5d6b9da47bc..7052b62e97f 100644
--- a/code/game/data_huds.dm
+++ b/code/game/data_huds.dm
@@ -63,7 +63,8 @@
//called when a carbon changes virus
/mob/living/carbon/proc/check_virus()
- for(var/datum/disease/D in viruses)
+ for(var/thing in viruses)
+ var/datum/disease/D = thing
if((!(D.visibility_flags & HIDDEN_SCANNER)) && (D.severity != NONTHREAT))
return 1
return 0
diff --git a/code/game/gamemodes/changeling/powers/panacea.dm b/code/game/gamemodes/changeling/powers/panacea.dm
index 8ae82a0e788..5b11d2ba656 100644
--- a/code/game/gamemodes/changeling/powers/panacea.dm
+++ b/code/game/gamemodes/changeling/powers/panacea.dm
@@ -33,7 +33,10 @@
user.reagents.add_reagent("potass_iodide", 10)
user.reagents.add_reagent("charcoal", 20)
- for(var/datum/disease/D in user.viruses)
+ for(var/thing in user.viruses)
+ var/datum/disease/D = thing
+ if(D.severity == NONTHREAT)
+ continue
D.cure()
feedback_add_details("changeling_powers","AP")
diff --git a/code/game/gamemodes/miniantags/abduction/gland.dm b/code/game/gamemodes/miniantags/abduction/gland.dm
index e58665c514e..c65e2c96198 100644
--- a/code/game/gamemodes/miniantags/abduction/gland.dm
+++ b/code/game/gamemodes/miniantags/abduction/gland.dm
@@ -134,10 +134,9 @@
to_chat(owner, "You feel sick.")
var/virus_type = pick(/datum/disease/beesease, /datum/disease/brainrot, /datum/disease/magnitis)
var/datum/disease/D = new virus_type()
- D.carrier = 1
+ D.carrier = TRUE
owner.viruses += D
D.affected_mob = owner
- D.holder = owner
owner.med_hud_set_status()
diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm
index 6d7264e9256..23f82947e6c 100644
--- a/code/game/machinery/adv_med.dm
+++ b/code/game/machinery/adv_med.dm
@@ -345,7 +345,14 @@
occupantData["health"] = H.health
occupantData["maxHealth"] = H.maxHealth
- occupantData["hasVirus"] = H.viruses.len
+ var/found_disease = FALSE
+ for(var/thing in H.viruses)
+ var/datum/disease/D = thing
+ if(D.visibility_flags & HIDDEN_SCANNER || D.visibility_flags & HIDDEN_PANDEMIC)
+ continue
+ found_disease = TRUE
+ break
+ occupantData["hasVirus"] = found_disease
occupantData["bruteLoss"] = H.getBruteLoss()
occupantData["oxyLoss"] = H.getOxyLoss()
@@ -499,8 +506,15 @@
t1 = "*dead*"
dat += "[occupant.health > 50 ? "" : ""]\tHealth %: [occupant.health], ([t1])
"
- if(occupant.viruses.len)
- dat += "Viral pathogen detected in blood stream.
"
+ var/found_disease = FALSE
+ for(var/thing in occupant.viruses)
+ var/datum/disease/D = thing
+ if(D.visibility_flags & HIDDEN_SCANNER || D.visibility_flags & HIDDEN_PANDEMIC)
+ continue
+ found_disease = TRUE
+ break
+ if(found_disease)
+ dat += "Disease detected in occupant.
"
var/extra_font = null
extra_font = (occupant.getBruteLoss() < 60 ? "" : "")
diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm
index 37063b8a90b..aa7e8f8fe22 100644
--- a/code/game/objects/effects/decals/Cleanable/humans.dm
+++ b/code/game/objects/effects/decals/Cleanable/humans.dm
@@ -15,7 +15,6 @@ var/global/list/image/splatter_cache=list()
icon_state = "mfloor1"
random_icon_states = list("mfloor1", "mfloor2", "mfloor3", "mfloor4", "mfloor5", "mfloor6", "mfloor7")
var/base_icon = 'icons/effects/blood.dmi'
- var/list/viruses = list()
blood_DNA = list()
var/basecolor="#A10808" // Color when wet.
var/amount = 5
@@ -223,13 +222,9 @@ var/global/list/image/splatter_cache=list()
for(var/i = 0, i < pick(1, 200; 2, 150; 3, 50; 4), i++)
sleep(3)
if(i > 0)
- var/obj/effect/decal/cleanable/blood/b = new /obj/effect/decal/cleanable/blood/splatter(src.loc)
+ var/obj/effect/decal/cleanable/blood/b = new /obj/effect/decal/cleanable/blood/splatter(loc)
b.basecolor = src.basecolor
b.update_icon()
- for(var/datum/disease/D in src.viruses)
- var/datum/disease/ND = D.Copy(1)
- b.viruses += ND
- ND.holder = b
if(step_to(src, get_step(src, direction), 0))
break
diff --git a/code/game/objects/effects/gibs.dm b/code/game/objects/effects/gibs.dm
index 5c5005fb6fd..39cafaa51ed 100644
--- a/code/game/objects/effects/gibs.dm
+++ b/code/game/objects/effects/gibs.dm
@@ -1,29 +1,28 @@
-/proc/gibs(atom/location, var/list/viruses, var/datum/dna/MobDNA) //CARN MARKER
- new /obj/effect/gibspawner/generic(get_turf(location),viruses,MobDNA)
+/proc/gibs(atom/location, datum/dna/MobDNA) //CARN MARKER
+ new /obj/effect/gibspawner/generic(get_turf(location), MobDNA)
-/proc/hgibs(atom/location, var/list/viruses, var/datum/dna/MobDNA)
- new /obj/effect/gibspawner/human(get_turf(location),viruses,MobDNA)
+/proc/hgibs(atom/location, datum/dna/MobDNA)
+ new /obj/effect/gibspawner/human(get_turf(location), MobDNA)
-/proc/xgibs(atom/location, var/list/viruses)
- new /obj/effect/gibspawner/xeno(get_turf(location),viruses)
+/proc/xgibs(atom/location)
+ new /obj/effect/gibspawner/xeno(get_turf(location))
-/proc/robogibs(atom/location, var/list/viruses)
- new /obj/effect/gibspawner/robot(get_turf(location),viruses)
+/proc/robogibs(atom/location)
+ new /obj/effect/gibspawner/robot(get_turf(location))
/obj/effect/gibspawner
var/sparks = 0 //whether sparks spread on Gib()
- var/virusProb = 20 //the chance for viruses to spread on the gibs
var/list/gibtypes = list()
var/list/gibamounts = list()
var/list/gibdirections = list() //of lists
- New(location, var/list/viruses, var/datum/dna/MobDNA)
+ New(location, datum/dna/MobDNA)
..()
if(istype(loc,/turf)) //basically if a badmin spawns it
- Gib(loc,viruses,MobDNA)
+ Gib(loc, MobDNA)
- proc/Gib(atom/location, var/list/viruses = list(), var/datum/dna/MobDNA = null)
+ proc/Gib(atom/location, datum/dna/MobDNA = null)
if(gibtypes.len != gibamounts.len || gibamounts.len != gibdirections.len)
to_chat(world, "Gib list length mismatch!")
return
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index e31c49f9392..f1766b59369 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -184,7 +184,8 @@ REAGENT SCANNER
if(istype(M, /mob/living/carbon))
if(upgraded)
chemscan(user, M)
- for(var/datum/disease/D in M.viruses)
+ for(var/thing in M.viruses)
+ var/datum/disease/D = thing
if(!(D.visibility_flags & HIDDEN_SCANNER))
to_chat(user, "Warning: [D.form] detected\nName: [D.name].\nType: [D.spread_text].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure_text]")
if(M.getStaminaLoss())
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index af865f7f5c8..6b5f6f16249 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -687,7 +687,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
message_admins("[key_name_admin(usr)] has gibbed [key_name_admin(M)]", 1)
if(istype(M, /mob/dead/observer))
- gibs(M.loc, M.viruses)
+ gibs(M.loc)
return
M.gib()
diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm
index 069ef9865af..75219d4ec9e 100644
--- a/code/modules/events/disease_outbreak.dm
+++ b/code/modules/events/disease_outbreak.dm
@@ -25,15 +25,15 @@
continue
if(!is_station_level(T.z))
continue
- var/foundAlready = 0 // don't infect someone that already has the virus
- for(var/datum/disease/D in H.viruses)
- foundAlready = 1
+ var/foundAlready = FALSE // don't infect someone that already has the virus
+ for(var/thing in H.viruses)
+ foundAlready = TRUE
break
if(H.stat == DEAD || foundAlready)
continue
var/datum/disease/D
D = new virus_type()
- D.carrier = 1
+ D.carrier = TRUE
H.AddDisease(D)
break
diff --git a/code/modules/events/spontaneous_appendicitis.dm b/code/modules/events/spontaneous_appendicitis.dm
index fca585f8baa..237db170612 100644
--- a/code/modules/events/spontaneous_appendicitis.dm
+++ b/code/modules/events/spontaneous_appendicitis.dm
@@ -4,13 +4,12 @@
continue
if(!H.client)
continue
- if(H.species.virus_immune) //don't count things that are virus immune; they'll just get picked and auto-cure
- continue
if(!H.get_int_organ(/obj/item/organ/internal/appendix))
continue
- var/foundAlready = 0 //don't infect someone that already has the virus
- for(var/datum/disease/D in H.viruses)
- foundAlready = 1
+ var/foundAlready = FALSE //don't infect someone that already has appendicitis
+ for(var/datum/disease/appendicitis/A in H.viruses)
+ foundAlready = TRUE
+ break
if(H.stat == DEAD || foundAlready)
continue
diff --git a/code/modules/mob/death.dm b/code/modules/mob/death.dm
index 11e51987285..cf3e4c320b5 100644
--- a/code/modules/mob/death.dm
+++ b/code/modules/mob/death.dm
@@ -16,7 +16,7 @@
animation.master = src
// flick("gibbed-m", animation)
- gibs(loc, viruses, dna)
+ gibs(loc, dna)
dead_mob_list -= src
if(client)
respawnable_list += src
diff --git a/code/modules/mob/living/carbon/alien/death.dm b/code/modules/mob/living/carbon/alien/death.dm
index 645259b1fda..2229d4c9d0c 100644
--- a/code/modules/mob/living/carbon/alien/death.dm
+++ b/code/modules/mob/living/carbon/alien/death.dm
@@ -14,7 +14,7 @@
playsound(src.loc, 'sound/goonstation/effects/gib.ogg', 50, 1)
flick("gibbed-a", animation)
- xgibs(loc, viruses)
+ xgibs(loc)
dead_mob_list -= src
spawn(15)
diff --git a/code/modules/mob/living/carbon/brain/death.dm b/code/modules/mob/living/carbon/brain/death.dm
index d6a07d48f7e..8303c3ef04a 100644
--- a/code/modules/mob/living/carbon/brain/death.dm
+++ b/code/modules/mob/living/carbon/brain/death.dm
@@ -29,7 +29,7 @@
animation.master = src
// flick("gibbed-m", animation)
- gibs(loc, viruses, dna)
+ gibs(loc, dna)
dead_mob_list -= src
if(container && istype(container, /obj/item/device/mmi))
diff --git a/code/modules/mob/living/carbon/carbon_defenses.dm b/code/modules/mob/living/carbon/carbon_defenses.dm
index c5c1e4917e4..a570ad50cb3 100644
--- a/code/modules/mob/living/carbon/carbon_defenses.dm
+++ b/code/modules/mob/living/carbon/carbon_defenses.dm
@@ -30,11 +30,13 @@
if(!iscarbon(user))
return
- for(var/datum/disease/D in viruses)
+ for(var/thing in viruses)
+ var/datum/disease/D = thing
if(D.IsSpreadByTouch())
user.ContractDisease(D)
- for(var/datum/disease/D in user.viruses)
+ for(var/thing in user.viruses)
+ var/datum/disease/D = thing
if(D.IsSpreadByTouch())
ContractDisease(D)
return 0
diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm
index 9b035dce404..d0468fb12b6 100644
--- a/code/modules/mob/living/carbon/human/death.dm
+++ b/code/modules/mob/living/carbon/human/death.dm
@@ -37,7 +37,7 @@
if(!isSynthetic())
flick("gibbed-h", animation)
- hgibs(loc, viruses, dna)
+ hgibs(loc, dna)
else
new /obj/effect/decal/cleanable/blood/gibs/robot(loc)
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index b448732fe8c..d204992e6dc 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -195,6 +195,15 @@
return
+/mob/living/carbon/handle_diseases()
+ for(var/thing in viruses)
+ var/datum/disease/D = thing
+ if(prob(D.infectivity))
+ D.spread()
+
+ if(stat != DEAD)
+ D.stage_act()
+
//remember to remove the "proc" of the child procs of these.
/mob/living/carbon/proc/handle_changeling()
diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm
index b85146b8b63..8db2b9f54a2 100644
--- a/code/modules/mob/living/life.dm
+++ b/code/modules/mob/living/life.dm
@@ -15,20 +15,22 @@
blinded = null
if(stat != DEAD)
- //Breathing, if applicable
- handle_breathing()
+ //Chemicals in the body
+ handle_chemicals_in_body()
//Mutations and radiation
handle_mutations_and_radiation()
- //Chemicals in the body
- handle_chemicals_in_body()
+ //Breathing, if applicable
+ handle_breathing()
//Random events (vomiting etc)
handle_random_events()
. = 1
+ handle_diseases()
+
//Handle temperature/pressure differences between body and environment
if(environment)
handle_environment(environment)
@@ -69,6 +71,9 @@
/mob/living/proc/handle_chemicals_in_body()
return
+/mob/living/proc/handle_diseases()
+ return
+
/mob/living/proc/handle_random_events()
return
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 7215c05a8e2..d2a1941fda5 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -502,7 +502,8 @@
var/mob/living/carbon/C = src
C.handcuffed = initial(C.handcuffed)
- for(var/datum/disease/D in C.viruses)
+ for(var/thing in C.viruses)
+ var/datum/disease/D = thing
D.cure(0)
// restore all of the human's blood and reset their shock stage
diff --git a/code/modules/mob/living/silicon/death.dm b/code/modules/mob/living/silicon/death.dm
index 6dc6ae21c46..b5c658c6c62 100644
--- a/code/modules/mob/living/silicon/death.dm
+++ b/code/modules/mob/living/silicon/death.dm
@@ -14,7 +14,7 @@
playsound(src.loc, 'sound/goonstation/effects/robogib.ogg', 50, 1)
// flick("gibbed-r", animation)
- robogibs(loc, viruses)
+ robogibs(loc)
dead_mob_list -= src
spawn(15)
diff --git a/code/modules/mob/living/silicon/robot/death.dm b/code/modules/mob/living/silicon/robot/death.dm
index 4b7d0a04a27..99b79d35360 100644
--- a/code/modules/mob/living/silicon/robot/death.dm
+++ b/code/modules/mob/living/silicon/robot/death.dm
@@ -14,7 +14,7 @@
playsound(src.loc, 'sound/goonstation/effects/robogib.ogg', 50, 1)
flick("gibbed-r", animation)
- robogibs(loc, viruses)
+ robogibs(loc)
living_mob_list -= src
dead_mob_list -= src
diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm
index 50475fe45db..2d863b99b4a 100644
--- a/code/modules/mob/living/simple_animal/bot/medbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/medbot.dm
@@ -398,7 +398,8 @@
return 1
if(treat_virus)
- for(var/datum/disease/D in C.viruses)
+ for(var/thing in C.viruses)
+ var/datum/disease/D = thing
//the medibot can't detect viruses that are undetectable to Health Analyzers or Pandemic machines.
if(D.visibility_flags & HIDDEN_SCANNER || D.visibility_flags & HIDDEN_PANDEMIC)
return 0
@@ -451,7 +452,8 @@
else
if(treat_virus)
var/virus = 0
- for(var/datum/disease/D in C.viruses)
+ for(var/thing in C.viruses)
+ var/datum/disease/D = thing
//detectable virus
if((!(D.visibility_flags & HIDDEN_SCANNER)) || (!(D.visibility_flags & HIDDEN_PANDEMIC)))
if(D.severity != NONTHREAT) //virus is harmful
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index 25131513c4d..e275d855328 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -145,7 +145,7 @@
//List of active diseases
- var/list/viruses = list() // replaces var/datum/disease/virus
+ var/list/viruses = list() // list of all diseases in a mob
var/list/resistances = list()
mouse_drag_pointer = MOUSE_ACTIVE_POINTER
diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm
index 1aa72ac0918..625849b8dbc 100644
--- a/code/modules/reagents/chemistry/machinery/pandemic.dm
+++ b/code/modules/reagents/chemistry/machinery/pandemic.dm
@@ -159,7 +159,7 @@
if(archive_diseases[id])
var/datum/disease/advance/A = archive_diseases[id]
A.AssignName(new_name)
- for(var/datum/disease/advance/AD in disease_master.processing)
+ for(var/datum/disease/advance/AD in active_diseases)
AD.Refresh()
updateUsrDialog()
@@ -205,7 +205,8 @@
var/list/vir = Blood.data["viruses"]
if(vir.len)
var/i = 0
- for(var/datum/disease/D in Blood.data["viruses"])
+ for(var/thing in Blood.data["viruses"])
+ var/datum/disease/D = thing
i++
if(!(D.visibility_flags & HIDDEN_PANDEMIC))
diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm
index cdc214c3089..3af09377b21 100644
--- a/code/modules/reagents/chemistry/reagents.dm
+++ b/code/modules/reagents/chemistry/reagents.dm
@@ -7,7 +7,6 @@
var/list/data = null
var/volume = 0
var/metabolization_rate = REAGENTS_METABOLISM
- //var/list/viruses = list()
var/color = "#000000" // rgb: 0, 0, 0 (does not support alpha channels - yet!)
var/shock_reduction = 0
var/heart_rate_increase = 0
diff --git a/code/modules/reagents/chemistry/reagents/admin.dm b/code/modules/reagents/chemistry/reagents/admin.dm
index b94998221ef..d4902cfc147 100644
--- a/code/modules/reagents/chemistry/reagents/admin.dm
+++ b/code/modules/reagents/chemistry/reagents/admin.dm
@@ -46,13 +46,11 @@
M.SetConfused(0)
M.SetSleeping(0)
M.SetJitter(0)
- for(var/datum/disease/D in M.viruses)
+ for(var/thing in M.viruses)
+ var/datum/disease/D = thing
if(D.severity == NONTHREAT)
continue
- D.spread_text = "Remissive"
- D.stage--
- if(D.stage < 1)
- D.cure()
+ D.cure(0)
..()
/datum/reagent/medicine/adminordrazine/nanites
diff --git a/code/modules/reagents/chemistry/reagents/water.dm b/code/modules/reagents/chemistry/reagents/water.dm
index 773d03c6006..52002d6b939 100644
--- a/code/modules/reagents/chemistry/reagents/water.dm
+++ b/code/modules/reagents/chemistry/reagents/water.dm
@@ -196,7 +196,8 @@
/datum/reagent/blood/reaction_mob(mob/living/M, method=TOUCH, volume)
if(data && data["viruses"])
- for(var/datum/disease/D in data["viruses"])
+ for(var/thing in data["viruses"])
+ var/datum/disease/D = thing
if(D.spread_flags & SPECIAL || D.spread_flags & NON_CONTAGIOUS)
continue
@@ -254,22 +255,12 @@
blood_prop = new(T)
blood_prop.blood_DNA[data["blood_DNA"]] = data["blood_type"]
- for(var/datum/disease/D in data["viruses"])
- var/datum/disease/newVirus = D.Copy(1)
- blood_prop.viruses += newVirus
- newVirus.holder = blood_prop
-
else if(istype(data["donor"], /mob/living/carbon/alien))
var/obj/effect/decal/cleanable/blood/xeno/blood_prop = locate() in T
if(!blood_prop)
blood_prop = new(T)
blood_prop.blood_DNA["UNKNOWN DNA STRUCTURE"] = "X*"
- for(var/datum/disease/D in data["viruses"])
- var/datum/disease/newVirus = D.Copy(1)
- blood_prop.viruses += newVirus
- newVirus.holder = blood_prop
-
/datum/reagent/vaccine
//data must contain virus type
name = "Vaccine"
@@ -278,7 +269,8 @@
/datum/reagent/vaccine/reaction_mob(mob/living/M, method=TOUCH, volume)
if(islist(data) && (method == INGEST))
- for(var/datum/disease/D in M.viruses)
+ for(var/thing in M.viruses)
+ var/datum/disease/D = thing
if(D.GetDiseaseID() in data)
D.cure()
M.resistances |= data
diff --git a/code/modules/surgery/organs/blood.dm b/code/modules/surgery/organs/blood.dm
index 9eefe264524..5912f198072 100644
--- a/code/modules/surgery/organs/blood.dm
+++ b/code/modules/surgery/organs/blood.dm
@@ -167,7 +167,8 @@
B.data["donor"] = src
B.data["viruses"] = list()
- for(var/datum/disease/D in viruses)
+ for(var/thing in viruses)
+ var/datum/disease/D = thing
B.data["viruses"] += D.Copy()
if(resistances && resistances.len)
B.data["resistances"] = resistances.Copy()
diff --git a/paradise.dme b/paradise.dme
index 7bdd5955a53..30b195886dc 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -173,7 +173,6 @@
#include "code\controllers\voting.dm"
#include "code\controllers\Processes\air.dm"
#include "code\controllers\Processes\alarm.dm"
-#include "code\controllers\Processes\diseases.dm"
#include "code\controllers\Processes\event.dm"
#include "code\controllers\Processes\fast_process.dm"
#include "code\controllers\Processes\fires.dm"