diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm
index b9df144ace..f0ba15446c 100644
--- a/code/_onclick/other_mobs.dm
+++ b/code/_onclick/other_mobs.dm
@@ -100,7 +100,8 @@
"[name] bites [ML]!")
if(armor >= 2)
return
- for(var/datum/disease/D in viruses)
+ for(var/thing in viruses)
+ var/datum/disease/D = thing
ML.ForceContractDisease(D)
else
ML.visible_message("[src] has attempted to bite [ML]!")
diff --git a/code/controllers/subsystem/disease.dm b/code/controllers/subsystem/disease.dm
index 5499680a2f..451bd05606 100644
--- a/code/controllers/subsystem/disease.dm
+++ b/code/controllers/subsystem/disease.dm
@@ -1,11 +1,8 @@
SUBSYSTEM_DEF(disease)
name = "Disease"
- flags = SS_KEEP_TIMING|SS_NO_INIT
- runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
-
- var/list/currentrun = list()
- var/list/processing = list()
+ flags = SS_NO_FIRE
+ var/list/active_diseases = list() //List of Active disease in all mobs; purely for quick referencing.
var/list/diseases
var/list/archive_diseases = list()
@@ -15,27 +12,5 @@ SUBSYSTEM_DEF(disease)
if(!diseases)
diseases = subtypesof(/datum/disease)
-/datum/controller/subsystem/disease/Recover()
- currentrun = SSdisease.currentrun
- processing = SSdisease.processing
- diseases = SSdisease.diseases
- archive_diseases = SSdisease.archive_diseases
-
/datum/controller/subsystem/disease/stat_entry(msg)
- ..("P:[processing.len]")
-
-/datum/controller/subsystem/disease/fire(resumed = 0)
- if(!resumed)
- src.currentrun = processing.Copy()
- //cache for sanic speed (lists are references anyways)
- var/list/currentrun = src.currentrun
-
- while(currentrun.len)
- var/datum/thing = currentrun[currentrun.len]
- currentrun.len--
- if(thing)
- thing.process()
- else
- processing.Remove(thing)
- if (MC_TICK_CHECK)
- return
+ ..("P:[active_diseases.len]")
\ No newline at end of file
diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm
index 77b8aeed6a..84d177a390 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
@@ -39,7 +40,7 @@
var/datum/disease/DD = new D.type(1, D, 0)
viruses += DD
DD.affected_mob = src
- DD.holder = src
+ SSdisease.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")
@@ -147,6 +148,9 @@
/mob/living/carbon/human/CanContractDisease(datum/disease/D)
- if(dna && (VIRUSIMMUNE in dna.species.species_traits))
+ if(dna && (VIRUSIMMUNE in dna.species.species_traits) && !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 ..()
\ No newline at end of file
diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm
index cc11d0e6d2..13ad3ece4e 100644
--- a/code/datums/diseases/_disease.dm
+++ b/code/datums/diseases/_disease.dm
@@ -46,21 +46,23 @@
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
+ SSdisease.active_diseases.Remove(src)
+ return ..()
/datum/disease/proc/stage_act()
var/cure = has_cure()
@@ -93,13 +95,16 @@
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
@@ -109,15 +114,9 @@
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)
@@ -129,29 +128,6 @@
break
V = Temp
-/datum/disease/process()
- if(!holder)
- SSdisease.processing -= 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)
@@ -161,20 +137,6 @@
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
-
- SSdisease.processing += src
-
-
/datum/disease/proc/IsSame(datum/disease/D)
if(istype(src, D.type))
return 1
@@ -191,11 +153,6 @@
return type
-/datum/disease/Destroy()
- SSdisease.processing.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 3aa4dab99b..623b436893 100644
--- a/code/datums/diseases/advance/advance.dm
+++ b/code/datums/diseases/advance/advance.dm
@@ -91,7 +91,7 @@
if(!(istype(D, /datum/disease/advance)))
return 0
- if(src.GetDiseaseID() != D.GetDiseaseID())
+ if(GetDiseaseID() != D.GetDiseaseID())
return 0
return 1
@@ -116,7 +116,7 @@
// 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)
@@ -156,7 +156,6 @@
return generated
/datum/disease/advance/proc/Refresh(new_name = 0)
- //to_chat(world, "[src.name] \ref[src] - REFRESH!")
GenerateProperties()
AssignProperties()
id = null
@@ -395,7 +394,7 @@
D.AssignName(new_name)
D.Refresh()
- for(var/datum/disease/advance/AD in SSdisease.processing)
+ for(var/datum/disease/advance/AD in SSdisease.active_diseases)
AD.Refresh()
for(var/mob/living/carbon/human/H in shuffle(GLOB.living_mob_list))
@@ -410,13 +409,6 @@
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 SSdisease.processing)
- to_chat(src, "[D.name] - [D.holder]")
-*/
-
/datum/disease/advance/proc/totalStageSpeed()
return properties["stage_rate"]
diff --git a/code/datums/diseases/advance/symptoms/sneeze.dm b/code/datums/diseases/advance/symptoms/sneeze.dm
index 9413eea5db..11d8b714ba 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 44d7db5709..bd5d09afa3 100644
--- a/code/datums/diseases/advance/symptoms/symptoms.dm
+++ b/code/datums/diseases/advance/symptoms/symptoms.dm
@@ -18,7 +18,7 @@
/datum/symptom/New()
var/list/S = SSdisease.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 eba5e1173b..8c681b8ec3 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/appendix)
+ bypasses_immunity = TRUE // Immunity is based on not having an appendix; this isn't a virus
/datum/disease/appendicitis/stage_act()
..()
diff --git a/code/datums/diseases/brainrot.dm b/code/datums/diseases/brainrot.dm
index a58f85a494..e830cafbef 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/bodypart/head)
+ required_organs = list(/obj/item/organ/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 69b30589ac..2b77885359 100644
--- a/code/datums/diseases/dna_spread.dm
+++ b/code/datums/diseases/dna_spread.dm
@@ -25,8 +25,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/pierrot_throat.dm b/code/datums/diseases/pierrot_throat.dm
index b2195a9527..75f63edf43 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 d33446cadf..9cbb829061 100644
--- a/code/datums/diseases/rhumba_beat.dm
+++ b/code/datums/diseases/rhumba_beat.dm
@@ -13,7 +13,7 @@
/datum/disease/rhumba_beat/stage_act()
..()
if(affected_mob.ckey == "rosham")
- src.cure()
+ cure()
return
switch(stage)
if(2)
diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm
index 03b746a3bd..e5746c3f8b 100644
--- a/code/datums/diseases/transformation.dm
+++ b/code/datums/diseases/transformation.dm
@@ -73,7 +73,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 4b57c2655b..c8e2a4609b 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/bodypart/head)
+ required_organs = list(/obj/item/organ/lungs)
severity = DANGEROUS
+ bypasses_immunity = TRUE // TB primarily impacts the lungs; it's also bacterial or fungal in nature; viral immunity should do nothing.
/datum/disease/tuberculosis/stage_act() //it begins
..()
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index f23f01d068..b484e1e480 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -629,10 +629,11 @@
text = "[text]: "
if (ishuman(current))
text += "healthy|infected|HUMAN|other"
- else if (ismonkey(current))
- var/found = 0
- for(var/datum/disease/D in current.viruses)
- if(istype(D, /datum/disease/transformation/jungle_fever)) found = 1
+ else if(ismonkey(current))
+ var/found = FALSE
+ for(var/datum/disease/transformation/jungle_fever/JF in current.viruses)
+ found = TRUE
+ break
if(found)
text += "healthy|INFECTED|human|other"
@@ -1342,7 +1343,8 @@
src = M.mind
//to_chat(world, "DEBUG: \"healthy\": M=[M], M.mind=[M.mind], src=[src]!")
else if (istype(M) && length(M.viruses))
- for(var/datum/disease/D in M.viruses)
+ for(var/thing in M.viruses)
+ var/datum/disease/D = thing
D.cure(0)
if("infected")
if (check_rights(R_ADMIN, 0))
@@ -1362,10 +1364,9 @@
var/mob/living/carbon/human/H = current
var/mob/living/carbon/monkey/M = current
if (istype(M))
- for(var/datum/disease/D in M.viruses)
- if (istype(D,/datum/disease/transformation/jungle_fever))
- D.cure(0)
- sleep(0) //because deleting of virus is doing throught spawn(0)
+ for(var/datum/disease/transformation/jungle_fever/JF in M.viruses)
+ JF.cure(0)
+ sleep(0) //because deleting of virus is doing throught spawn(0) //What
log_admin("[key_name(usr)] attempting to humanize [key_name(current)]")
message_admins("[key_name_admin(usr)] attempting to humanize [key_name_admin(current)]")
H = M.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_DEFAULTMSG)
diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm
index 2e5854509a..4e4c35a937 100644
--- a/code/game/data_huds.dm
+++ b/code/game/data_huds.dm
@@ -62,7 +62,8 @@
//called when a carbon changes virus
/mob/living/carbon/proc/check_virus()
var/threat = 0
- for(var/datum/disease/D in viruses)
+ for(var/thing in viruses)
+ var/datum/disease/D = thing
if(!(D.visibility_flags & HIDDEN_SCANNER))
if (D.severity != NONTHREAT) //a buffing virus gets an icon
threat = 2
diff --git a/code/game/gamemodes/changeling/powers/panacea.dm b/code/game/gamemodes/changeling/powers/panacea.dm
index 40ce63a60e..c961406810 100644
--- a/code/game/gamemodes/changeling/powers/panacea.dm
+++ b/code/game/gamemodes/changeling/powers/panacea.dm
@@ -41,6 +41,9 @@
user.reagents.add_reagent("antihol", 10)
user.reagents.add_reagent("mannitol", 25)
- 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()
return TRUE
diff --git a/code/game/gamemodes/miniantags/abduction/gland.dm b/code/game/gamemodes/miniantags/abduction/gland.dm
index 13e86dd5d3..6a0993db54 100644
--- a/code/game/gamemodes/miniantags/abduction/gland.dm
+++ b/code/game/gamemodes/miniantags/abduction/gland.dm
@@ -133,10 +133,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/gamemodes/miniantags/monkey/monkey.dm b/code/game/gamemodes/miniantags/monkey/monkey.dm
index 20ba54afc4..da9f4b61f1 100644
--- a/code/game/gamemodes/miniantags/monkey/monkey.dm
+++ b/code/game/gamemodes/miniantags/monkey/monkey.dm
@@ -60,7 +60,6 @@
var/datum/disease/D = new /datum/disease/transformation/jungle_fever
D.visibility_flags = HIDDEN_SCANNER|HIDDEN_PANDEMIC
- D.holder = carriermind.current
D.affected_mob = carriermind.current
carriermind.current.viruses += D
..()
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index 5e876d3b92..4785fab384 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -365,7 +365,7 @@
fl.forceMove(T)
unattached_flesh.Cut()
mess = FALSE
- new /obj/effect/gibspawner/generic(loc)
+ new /obj/effect/gibspawner/generic(get_turf(src))
audible_message("You hear a splat.")
icon_state = "pod_0"
return
diff --git a/code/game/objects/effects/decals/cleanable/aliens.dm b/code/game/objects/effects/decals/cleanable/aliens.dm
index 3ab96f6df5..26b5bca1ec 100644
--- a/code/game/objects/effects/decals/cleanable/aliens.dm
+++ b/code/game/objects/effects/decals/cleanable/aliens.dm
@@ -6,17 +6,10 @@
icon = 'icons/effects/blood.dmi'
icon_state = "xfloor1"
random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7")
- var/list/viruses = list()
blood_DNA = list("UNKNOWN DNA" = "X*")
bloodiness = MAX_SHOE_BLOODINESS
blood_state = BLOOD_STATE_XENO
-/obj/effect/decal/cleanable/xenoblood/Destroy()
- for(var/datum/disease/D in viruses)
- D.cure(0)
- viruses = null
- return ..()
-
/obj/effect/decal/cleanable/xenoblood/xsplatter
random_icon_states = list("xgibbl1", "xgibbl2", "xgibbl3", "xgibbl4", "xgibbl5")
@@ -34,13 +27,9 @@
var/direction = pick(directions)
for(var/i = 0, i < pick(1, 200; 2, 150; 3, 50), i++)
sleep(2)
- if (i > 0)
- var/obj/effect/decal/cleanable/xenoblood/b = new /obj/effect/decal/cleanable/xenoblood/xsplatter(src.loc)
- 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))
+ if(i > 0)
+ new /obj/effect/decal/cleanable/xenoblood/xsplatter(loc)
+ if(!step_to(src, get_step(src, direction), 0))
break
/obj/effect/decal/cleanable/xenoblood/xgibs/ex_act()
diff --git a/code/game/objects/effects/decals/cleanable/humans.dm b/code/game/objects/effects/decals/cleanable/humans.dm
index 8248776a95..5127aa2285 100644
--- a/code/game/objects/effects/decals/cleanable/humans.dm
+++ b/code/game/objects/effects/decals/cleanable/humans.dm
@@ -4,17 +4,10 @@
icon = 'icons/effects/blood.dmi'
icon_state = "floor1"
random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7")
- var/list/viruses = list()
blood_DNA = list()
blood_state = BLOOD_STATE_HUMAN
bloodiness = MAX_SHOE_BLOODINESS
-/obj/effect/decal/cleanable/blood/Destroy()
- for(var/datum/disease/D in viruses)
- D.cure(0)
- viruses = null
- return ..()
-
/obj/effect/decal/cleanable/blood/replace_decal(obj/effect/decal/cleanable/blood/C)
if (C.blood_DNA)
blood_DNA |= C.blood_DNA.Copy()
@@ -70,15 +63,11 @@
/obj/effect/decal/cleanable/blood/gibs/proc/streak(list/directions)
set waitfor = 0
var/direction = pick(directions)
- for (var/i = 0, i < pick(1, 200; 2, 150; 3, 50), i++)
+ for(var/i = 0, i < pick(1, 200; 2, 150; 3, 50), i++)
sleep(2)
- if (i > 0)
- var/obj/effect/decal/cleanable/blood/b = new /obj/effect/decal/cleanable/blood/splatter(src.loc)
- 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))
+ if(i > 0)
+ new /obj/effect/decal/cleanable/blood/splatter(loc)
+ if(!step_to(src, get_step(src, direction), 0))
break
/obj/effect/decal/cleanable/blood/gibs/up
diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm
index f1b0a9ce40..98a9782600 100644
--- a/code/game/objects/effects/decals/cleanable/misc.dm
+++ b/code/game/objects/effects/decals/cleanable/misc.dm
@@ -80,9 +80,8 @@
icon = 'icons/effects/blood.dmi'
icon_state = "vomit_1"
random_icon_states = list("vomit_1", "vomit_2", "vomit_3", "vomit_4")
- var/list/viruses = list()
-/obj/effect/decal/cleanable/vomit/attack_hand(var/mob/user)
+/obj/effect/decal/cleanable/vomit/attack_hand(mob/user)
if(ishuman(user))
var/mob/living/carbon/human/H = user
if(isflyperson(H))
@@ -98,12 +97,6 @@
reagents.trans_to(H, reagents.total_volume)
qdel(src)
-/obj/effect/decal/cleanable/vomit/Destroy()
- for(var/datum/disease/D in viruses)
- D.cure(0)
- viruses = null
- return ..()
-
/obj/effect/decal/cleanable/vomit/old
name = "crusty dried vomit"
desc = "You try not to look at the chunks, and fail."
diff --git a/code/game/objects/effects/decals/cleanable/robots.dm b/code/game/objects/effects/decals/cleanable/robots.dm
index 862d21ad6b..e91c273903 100644
--- a/code/game/objects/effects/decals/cleanable/robots.dm
+++ b/code/game/objects/effects/decals/cleanable/robots.dm
@@ -43,7 +43,6 @@
desc = "It's black and greasy. Looks like Beepsky made another mess."
icon = 'icons/mob/robots.dmi'
icon_state = "floor1"
- var/viruses = list()
random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7")
blood_state = BLOOD_STATE_OIL
bloodiness = MAX_SHOE_BLOODINESS
@@ -52,11 +51,5 @@
..()
reagents.add_reagent("oil", 30)
-/obj/effect/decal/cleanable/oil/Destroy()
- for(var/datum/disease/D in viruses)
- D.cure(0)
- viruses = null
- return ..()
-
/obj/effect/decal/cleanable/oil/streak
random_icon_states = list("streak1", "streak2", "streak3", "streak4", "streak5")
diff --git a/code/game/objects/effects/spawners/gibspawner.dm b/code/game/objects/effects/spawners/gibspawner.dm
index 06beef6940..b25b9f7d8f 100644
--- a/code/game/objects/effects/spawners/gibspawner.dm
+++ b/code/game/objects/effects/spawners/gibspawner.dm
@@ -6,8 +6,8 @@
var/list/gibamounts = list() //amount to spawn for each gib decal type we'll spawn.
var/list/gibdirections = list() //of lists of possible directions to spread each gib decal type towards.
-/obj/effect/gibspawner/Initialize(mapload, list/viruses, datum/dna/MobDNA)
- ..()
+/obj/effect/gibspawner/Initialize(mapload, datum/dna/MobDNA)
+ . = ..()
if(gibtypes.len != gibamounts.len || gibamounts.len != gibdirections.len)
to_chat(world, "Gib list length mismatch!")
@@ -29,13 +29,6 @@
var/mob/living/carbon/digester = loc
digester.stomach_contents += gib
- if(viruses && viruses.len > 0)
- for(var/datum/disease/D in viruses)
- if(prob(virusProb))
- var/datum/disease/viruus = D.Copy(1)
- gib.viruses += viruus
- viruus.holder = gib
-
if(MobDNA)
gib.blood_DNA[MobDNA.unique_enzymes] = MobDNA.blood_type
else if(istype(src, /obj/effect/gibspawner/generic)) // Probably a monkey
@@ -56,7 +49,7 @@
/obj/effect/gibspawner/generic/Initialize()
playsound(src, 'sound/effects/blobattack.ogg', 40, 1)
gibdirections = list(list(WEST, NORTHWEST, SOUTHWEST, NORTH),list(EAST, NORTHEAST, SOUTHEAST, SOUTH), list())
- ..()
+ . = ..()
/obj/effect/gibspawner/human
gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/up,/obj/effect/decal/cleanable/blood/gibs/down,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs/body,/obj/effect/decal/cleanable/blood/gibs/limb,/obj/effect/decal/cleanable/blood/gibs/core)
@@ -65,7 +58,7 @@
/obj/effect/gibspawner/human/Initialize()
playsound(src, 'sound/effects/blobattack.ogg', 50, 1)
gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs, list())
- ..()
+ . = ..()
/obj/effect/gibspawner/humanbodypartless //only the gibs that don't look like actual full bodyparts (except torso).
@@ -75,7 +68,7 @@
/obj/effect/gibspawner/humanbodypartless/Initialize()
playsound(src, 'sound/effects/blobattack.ogg', 50, 1)
gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, list())
- ..()
+ . = ..()
/obj/effect/gibspawner/xeno
@@ -85,7 +78,7 @@
/obj/effect/gibspawner/xeno/Initialize()
playsound(src, 'sound/effects/blobattack.ogg', 60, 1)
gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs, list())
- ..()
+ . = ..()
/obj/effect/gibspawner/xenobodypartless //only the gibs that don't look like actual full bodyparts (except torso).
@@ -96,7 +89,7 @@
/obj/effect/gibspawner/xenobodypartless/Initialize()
playsound(src, 'sound/effects/blobattack.ogg', 60, 1)
gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, list())
- ..()
+ . = ..()
/obj/effect/gibspawner/larva
gibtypes = list(/obj/effect/decal/cleanable/xenoblood/xgibs/larva, /obj/effect/decal/cleanable/xenoblood/xgibs/larva, /obj/effect/decal/cleanable/xenoblood/xgibs/larva/body, /obj/effect/decal/cleanable/xenoblood/xgibs/larva/body)
@@ -105,7 +98,7 @@
/obj/effect/gibspawner/larva/Initialize()
playsound(src, 'sound/effects/blobattack.ogg', 60, 1)
gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST), list(), GLOB.alldirs)
- ..()
+ . = ..()
/obj/effect/gibspawner/larvabodypartless
gibtypes = list(/obj/effect/decal/cleanable/xenoblood/xgibs/larva, /obj/effect/decal/cleanable/xenoblood/xgibs/larva, /obj/effect/decal/cleanable/xenoblood/xgibs/larva)
@@ -114,7 +107,7 @@
/obj/effect/gibspawner/larvabodypartless/Initialize()
playsound(src, 'sound/effects/blobattack.ogg', 60, 1)
gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST), list())
- ..()
+ . = ..()
/obj/effect/gibspawner/robot
sparks = 1
@@ -124,4 +117,4 @@
/obj/effect/gibspawner/robot/Initialize()
gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs)
gibamounts[6] = pick(0,1,2)
- ..()
+ . = ..()
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index 70b6d54f73..968f361544 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -171,7 +171,8 @@ MASS SPECTROMETER
if(tdelta < (DEFIB_TIME_LIMIT * 10))
to_chat(user, "Subject died [tdelta / 10] seconds ago, defibrillation may be possible!")
- 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]")
diff --git a/code/game/objects/items/weapons/melee/misc.dm b/code/game/objects/items/weapons/melee/misc.dm
index e10d04611a..6285dcaa13 100644
--- a/code/game/objects/items/weapons/melee/misc.dm
+++ b/code/game/objects/items/weapons/melee/misc.dm
@@ -160,7 +160,7 @@
if (B && !QDELETED(B))
H.internal_organs -= B
qdel(B)
- new /obj/effect/gibspawner/generic(H.loc, H.viruses, H.dna)
+ new /obj/effect/gibspawner/generic(get_turf(H), H.dna)
return (BRUTELOSS)
/obj/item/weapon/melee/classic_baton/telescopic/attack_self(mob/user)
diff --git a/code/modules/admin/secrets.dm b/code/modules/admin/secrets.dm
index ffad361db8..1b00e01d4e 100644
--- a/code/modules/admin/secrets.dm
+++ b/code/modules/admin/secrets.dm
@@ -149,8 +149,9 @@
var/choice = input("Are you sure you want to cure all disease?") in list("Yes", "Cancel")
if(choice == "Yes")
message_admins("[key_name_admin(usr)] has cured all diseases.")
- for(var/datum/disease/D in SSdisease.processing)
- D.cure(D)
+ for(var/thing in SSdisease.active_diseases)
+ var/datum/disease/D = thing
+ D.cure(0)
if("set_name")
if(!check_rights(R_ADMIN))
return
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 9a8e7c8278..90ac9416d9 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -615,7 +615,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)]")
if(isobserver(M))
- new /obj/effect/gibspawner/generic(M.loc, M.viruses)
+ new /obj/effect/gibspawner/generic(get_turf(M))
return
if(confirm == "Yes")
M.gib()
diff --git a/code/modules/clothing/ears/ears.dm b/code/modules/clothing/ears/ears.dm
index 906bde2a87..4061c4db03 100644
--- a/code/modules/clothing/ears/ears.dm
+++ b/code/modules/clothing/ears/ears.dm
@@ -47,4 +47,4 @@
H.update_inv_ears()
H.update_inv_neck()
H.update_inv_head()
- to_chat(owner, "You turn the music [headphones_on? "on. Untz Untz Untz!" : "off."]")
+ to_chat(owner, "You turn the music [headphones_on? "on. Untz Untz Untz!" : "off."]")
\ No newline at end of file
diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm
index fc86356adf..dbac242321 100644
--- a/code/modules/events/disease_outbreak.dm
+++ b/code/modules/events/disease_outbreak.dm
@@ -27,11 +27,17 @@
continue
if(T.z != ZLEVEL_STATION)
continue
- var/foundAlready = 0 // don't infect someone that already has the virus
- for(var/datum/disease/D in H.viruses)
- foundAlready = 1
+ if(!H.client)
+ continue
+ if(H.stat == DEAD)
+ continue
+ if(VIRUSIMMUNE in H.dna.species.species_traits) //Don't pick someone who's virus immune, only for it to not do anything.
+ continue
+ var/foundAlready = FALSE // don't infect someone that already has a disease
+ for(var/thing in H.viruses)
+ foundAlready = TRUE
break
- if(H.stat == DEAD || foundAlready)
+ if(foundAlready)
continue
var/datum/disease/D
@@ -45,6 +51,6 @@
DS.strain_data["SE"] = H.dna.struc_enzymes
else
D = new virus_type()
- D.carrier = 1
+ D.carrier = TRUE
H.AddDisease(D)
break
\ No newline at end of file
diff --git a/code/modules/events/shuttle_loan.dm b/code/modules/events/shuttle_loan.dm
index 60d7535e5a..f19471fffc 100644
--- a/code/modules/events/shuttle_loan.dm
+++ b/code/modules/events/shuttle_loan.dm
@@ -132,7 +132,7 @@
new /obj/structure/spider/stickyweb(T)
if(ANTIDOTE_NEEDED)
- var/virus_type = pick(/datum/disease/beesease, /datum/disease/brainrot, /datum/disease/fluspanish)
+ var/obj/item/weapon/reagent_containers/glass/bottle/virus_type = pick(/obj/item/weapon/reagent_containers/glass/bottle/beesease, /obj/item/weapon/reagent_containers/glass/bottle/brainrot, /obj/item/weapon/reagent_containers/glass/bottle/fluspanish)
var/turf/T
for(var/i=0, i<10, i++)
if(prob(15))
@@ -142,11 +142,7 @@
else if(prob(25))
shuttle_spawns.Add(/obj/item/weapon/shard)
T = pick_n_take(empty_shuttle_turfs)
- var/obj/effect/decal/cleanable/blood/b = new(T)
- var/datum/disease/D = new virus_type()
- D.longevity = 1000
- b.viruses += D
- D.holder = b
+ new virus_type(T)
shuttle_spawns.Add(/obj/structure/closet/crate)
shuttle_spawns.Add(/obj/item/weapon/reagent_containers/glass/bottle/pierrot_throat)
shuttle_spawns.Add(/obj/item/weapon/reagent_containers/glass/bottle/magnitis)
diff --git a/code/modules/events/shuttle_loan.dm.rej b/code/modules/events/shuttle_loan.dm.rej
new file mode 100644
index 0000000000..98a7e42033
--- /dev/null
+++ b/code/modules/events/shuttle_loan.dm.rej
@@ -0,0 +1,10 @@
+diff a/code/modules/events/shuttle_loan.dm b/code/modules/events/shuttle_loan.dm (rejected hunks)
+@@ -21,7 +21,7 @@
+ var/thanks_msg = "The cargo shuttle should return in five minutes. Have some supply points for your trouble."
+
+ /datum/round_event/shuttle_loan/start()
+- dispatch_type = ANTIDOTE_NEEDED /*pick(HIJACK_SYNDIE, RUSKY_PARTY, SPIDER_GIFT, DEPARTMENT_RESUPPLY, ANTIDOTE_NEEDED, PIZZA_DELIVERY) */
++ dispatch_type = pick(HIJACK_SYNDIE, RUSKY_PARTY, SPIDER_GIFT, DEPARTMENT_RESUPPLY, ANTIDOTE_NEEDED, PIZZA_DELIVERY)
+
+ /datum/round_event/shuttle_loan/announce()
+ SSshuttle.shuttle_loan = src
diff --git a/code/modules/events/spontaneous_appendicitis.dm b/code/modules/events/spontaneous_appendicitis.dm
index eb66be3038..a441210432 100644
--- a/code/modules/events/spontaneous_appendicitis.dm
+++ b/code/modules/events/spontaneous_appendicitis.dm
@@ -8,10 +8,17 @@
/datum/round_event/spontaneous_appendicitis/start()
for(var/mob/living/carbon/human/H in shuffle(GLOB.living_mob_list))
- var/foundAlready = 0 //don't infect someone that already has the virus
- for(var/datum/disease/D in H.viruses)
- foundAlready = 1
- if(H.stat == 2 || foundAlready)
+ if(!H.client)
+ continue
+ if(H.stat == DEAD)
+ continue
+ if(!H.getorgan(/obj/item/organ/appendix)) //Don't give the disease to some who lacks it, only for it to be auto-cured
+ continue
+ var/foundAlready = FALSE //don't infect someone that already has appendicitis
+ for(var/datum/disease/appendicitis/A in H.viruses)
+ foundAlready = TRUE
+ break
+ if(foundAlready)
continue
var/datum/disease/D = new /datum/disease/appendicitis
diff --git a/code/modules/food_and_drinks/kitchen_machinery/processor.dm b/code/modules/food_and_drinks/kitchen_machinery/processor.dm
index 09a0560357..d20b74210b 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/processor.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/processor.dm
@@ -162,7 +162,8 @@
//set reagent data
B.data["donor"] = O
- for(var/datum/disease/D in O.viruses)
+ for(var/thing in O.viruses)
+ var/datum/disease/D = thing
if(!(D.spread_flags & SPECIAL))
B.data["viruses"] += D.Copy()
if(O.has_dna())
diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm
index 69eacbb69e..8e547eeb12 100644
--- a/code/modules/mob/living/blood.dm
+++ b/code/modules/mob/living/blood.dm
@@ -137,7 +137,8 @@
if(blood_id == C.get_blood_id())//both mobs have the same blood substance
if(blood_id == "blood") //normal blood
if(blood_data["viruses"])
- for(var/datum/disease/D in blood_data["viruses"])
+ for(var/thing in blood_data["viruses"])
+ var/datum/disease/D = thing
if((D.spread_flags & SPECIAL) || (D.spread_flags & NON_CONTAGIOUS))
continue
C.ForceContractDisease(D)
@@ -162,7 +163,8 @@
blood_data["donor"] = src
blood_data["viruses"] = list()
- for(var/datum/disease/D in viruses)
+ for(var/thing in viruses)
+ var/datum/disease/D = thing
blood_data["viruses"] += D.Copy()
blood_data["blood_DNA"] = copytext(dna.unique_enzymes,1,0)
diff --git a/code/modules/mob/living/carbon/alien/death.dm b/code/modules/mob/living/carbon/alien/death.dm
index 46facdc454..a31dba9fa9 100644
--- a/code/modules/mob/living/carbon/alien/death.dm
+++ b/code/modules/mob/living/carbon/alien/death.dm
@@ -1,8 +1,8 @@
/mob/living/carbon/alien/spawn_gibs(with_bodyparts)
if(with_bodyparts)
- new /obj/effect/gibspawner/xeno(loc,viruses)
+ new /obj/effect/gibspawner/xeno(get_turf(src))
else
- new /obj/effect/gibspawner/xenobodypartless(loc,viruses)
+ new /obj/effect/gibspawner/xenobodypartless(get_turf(src))
/mob/living/carbon/alien/gib_animation()
new /obj/effect/temp_visual/gib_animation(loc, "gibbed-a")
diff --git a/code/modules/mob/living/carbon/alien/larva/death.dm b/code/modules/mob/living/carbon/alien/larva/death.dm
index 585e5779c6..f49e545dfa 100644
--- a/code/modules/mob/living/carbon/alien/larva/death.dm
+++ b/code/modules/mob/living/carbon/alien/larva/death.dm
@@ -8,9 +8,9 @@
/mob/living/carbon/alien/larva/spawn_gibs(with_bodyparts)
if(with_bodyparts)
- new /obj/effect/gibspawner/larva(loc,viruses)
+ new /obj/effect/gibspawner/larva(get_turf(src))
else
- new /obj/effect/gibspawner/larvabodypartless(loc,viruses)
+ new /obj/effect/gibspawner/larvabodypartless(get_turf(src))
/mob/living/carbon/alien/larva/gib_animation()
new /obj/effect/temp_visual/gib_animation(loc, "gibbed-l")
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 4415c0d7ab..c71751ab2f 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -716,8 +716,9 @@
var/obj/item/organ/brain/B = getorgan(/obj/item/organ/brain)
if(B)
B.damaged_brain = 0
- for(var/datum/disease/D in viruses)
- if (D.severity != NONTHREAT)
+ for(var/thing in viruses)
+ var/datum/disease/D = thing
+ if(D.severity != NONTHREAT)
D.cure(0)
if(admin_revive)
regenerate_limbs()
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index 780fabe64d..599c3a43cd 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -107,11 +107,13 @@
/mob/living/carbon/attack_hand(mob/living/carbon/human/user)
- 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)
@@ -124,11 +126,13 @@
/mob/living/carbon/attack_paw(mob/living/carbon/monkey/M)
- for(var/datum/disease/D in viruses)
+ for(var/thing in viruses)
+ var/datum/disease/D = thing
if(D.IsSpreadByTouch())
M.ContractDisease(D)
- for(var/datum/disease/D in M.viruses)
+ for(var/thing in M.viruses)
+ var/datum/disease/D = thing
if(D.IsSpreadByTouch())
ContractDisease(D)
@@ -137,7 +141,8 @@
return 0
if(..()) //successful monkey bite.
- for(var/datum/disease/D in M.viruses)
+ for(var/thing in M.viruses)
+ var/datum/disease/D = thing
ForceContractDisease(D)
return 1
diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm
index 4547390f56..a1b67fbee1 100644
--- a/code/modules/mob/living/carbon/human/death.dm
+++ b/code/modules/mob/living/carbon/human/death.dm
@@ -6,9 +6,9 @@
/mob/living/carbon/human/spawn_gibs(with_bodyparts)
if(with_bodyparts)
- new /obj/effect/gibspawner/human(loc, viruses, dna)
+ new /obj/effect/gibspawner/human(get_turf(src), dna)
else
- new /obj/effect/gibspawner/humanbodypartless(loc, viruses, dna)
+ new /obj/effect/gibspawner/humanbodypartless(get_turf(src), dna)
/mob/living/carbon/human/spawn_dust(just_ash = FALSE)
if(just_ash)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index aec0da4b8a..134f50052f 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -119,7 +119,8 @@
//Virsuses
if(viruses.len)
stat("Viruses:", null)
- for(var/datum/disease/D in viruses)
+ for(var/thing in viruses)
+ var/datum/disease/D = thing
stat("*", "[D.name], Type: [D.spread_text], Stage: [D.stage]/[D.max_stages], Possible Cure: [D.cure_text]")
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index e50997f634..9a82ba5ba9 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -222,6 +222,15 @@
/mob/living/carbon/proc/handle_blood()
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()
+
/mob/living/carbon/proc/handle_changeling()
if(mind && hud_used && hud_used.lingchemdisplay)
if(mind.changeling)
diff --git a/code/modules/mob/living/carbon/life.dm.rej b/code/modules/mob/living/carbon/life.dm.rej
new file mode 100644
index 0000000000..b62c84a34f
--- /dev/null
+++ b/code/modules/mob/living/carbon/life.dm.rej
@@ -0,0 +1,10 @@
+diff a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm (rejected hunks)
+@@ -12,7 +12,7 @@
+ if(..()) //not dead
+ handle_blood()
+
+- if(stat != DEAD) // Reagent processing needs to be handled before breathing and such, to prevent edge cases
++ if(stat != DEAD)
+ handle_organs()
+
+ if(stat == DEAD)
diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm
index eb96d09bde..0fd86ed02e 100644
--- a/code/modules/mob/living/death.dm
+++ b/code/modules/mob/living/death.dm
@@ -18,7 +18,7 @@
return
/mob/living/proc/spawn_gibs()
- new /obj/effect/gibspawner/generic(loc, viruses)
+ new /obj/effect/gibspawner/generic(get_turf(src))
/mob/living/proc/spill_organs()
return
diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm
index 2df4c83b85..9e51ece6d6 100644
--- a/code/modules/mob/living/life.dm
+++ b/code/modules/mob/living/life.dm
@@ -19,14 +19,19 @@
var/datum/gas_mixture/environment = loc.return_air()
if(stat != DEAD)
- //Breathing, if applicable
- handle_breathing(times_fired)
+ //Chemicals in the body
+ handle_chemicals_in_body()
+
if(stat != DEAD)
//Mutations and radiation
handle_mutations_and_radiation()
+
if(stat != DEAD)
- //Chemicals in the body
- handle_chemicals_in_body()
+ //Breathing, if applicable
+ handle_breathing(times_fired)
+
+ handle_diseases() // DEAD check is in the proc itself; we want it to spread even if the mob is dead, but to handle its disease-y properties only if you're not.
+
if(stat != DEAD)
//Random events (vomiting etc)
handle_random_events()
@@ -66,6 +71,9 @@
/mob/living/proc/handle_chemicals_in_body()
return
+/mob/living/proc/handle_diseases()
+ return
+
/mob/living/proc/handle_diginvis()
if(!digitaldisguise)
src.digitaldisguise = image(loc = src)
diff --git a/code/modules/mob/living/life.dm.rej b/code/modules/mob/living/life.dm.rej
new file mode 100644
index 0000000000..aeba977c88
--- /dev/null
+++ b/code/modules/mob/living/life.dm.rej
@@ -0,0 +1,11 @@
+diff a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm (rejected hunks)
+@@ -64,9 +64,6 @@
+ /mob/living/proc/handle_diseases()
+ return
+
+-/mob/living/proc/handle_chemicals_in_body()
+- return
+-
+ /mob/living/proc/handle_diginvis()
+ if(!digitaldisguise)
+ src.digitaldisguise = image(loc = src)
diff --git a/code/modules/mob/living/silicon/death.dm b/code/modules/mob/living/silicon/death.dm
index ca93c95f48..7537697d71 100644
--- a/code/modules/mob/living/silicon/death.dm
+++ b/code/modules/mob/living/silicon/death.dm
@@ -1,5 +1,5 @@
/mob/living/silicon/spawn_gibs()
- new /obj/effect/gibspawner/robot(loc,viruses)
+ new /obj/effect/gibspawner/robot(get_turf(src))
/mob/living/silicon/spawn_dust()
new /obj/effect/decal/remains/robot(loc)
diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm
index a4f8638c4a..0806f457d9 100644
--- a/code/modules/mob/living/silicon/pai/software.dm
+++ b/code/modules/mob/living/silicon/pai/software.dm
@@ -513,7 +513,8 @@
Structural Integrity: [M.getBruteLoss() > 50 ? "" : ""][M.getBruteLoss()]
Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)
"}
- for(var/datum/disease/D in M.viruses)
+ for(var/thing in M.viruses)
+ var/datum/disease/D = thing
dat += {"Infection Detected.
Name: [D.name]
Type: [D.spread_text]
diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm
index a0399d2b2c..b4694dc93a 100644
--- a/code/modules/mob/living/simple_animal/bot/medbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/medbot.dm
@@ -372,7 +372,8 @@
return 1
if(treat_virus && !C.reagents.has_reagent(treatment_virus_avoid) && !C.reagents.has_reagent(treatment_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) \
&& D.severity != NONTHREAT \
@@ -423,7 +424,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.dm b/code/modules/mob/mob.dm
index 7681566854..6d6f0ff72e 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -11,8 +11,7 @@
qdel(hud_used)
if(mind && mind.current == src)
spellremove(src)
- for(var/infection in viruses)
- qdel(infection)
+ QDEL_LIST(viruses)
for(var/cc in client_colours)
qdel(cc)
client_colours = null
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index 053cba123a..56e56bfcaa 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -113,7 +113,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/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm
index cf598b7a2e..e421b84853 100644
--- a/code/modules/mob/transform_procs.dm
+++ b/code/modules/mob/transform_procs.dm
@@ -65,9 +65,9 @@
if (tr_flags & TR_KEEPVIRUS)
O.viruses = viruses
viruses = list()
- for(var/datum/disease/D in O.viruses)
+ for(var/thing in O.viruses)
+ var/datum/disease/D = thing
D.affected_mob = O
- D.holder = O
//keep damage?
if (tr_flags & TR_KEEPDAMAGE)
@@ -219,9 +219,9 @@
if (tr_flags & TR_KEEPVIRUS)
O.viruses = viruses
viruses = list()
- for(var/datum/disease/D in O.viruses)
+ for(var/thing in O.viruses)
+ var/datum/disease/D = thing
D.affected_mob = O
- D.holder = O
O.med_hud_set_status()
//keep damage?
diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm
index ab68dffc0b..1685eeb72d 100644
--- a/code/modules/reagents/chemistry/machinery/pandemic.dm
+++ b/code/modules/reagents/chemistry/machinery/pandemic.dm
@@ -149,7 +149,7 @@
if(!new_name || ..())
return
A.AssignName(new_name)
- for(var/datum/disease/advance/AD in SSdisease.processing)
+ for(var/datum/disease/advance/AD in SSdisease.active_diseases)
AD.Refresh()
. = TRUE
if("create_culture_bottle")
diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
index a59af94aee..54e59f3584 100644
--- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
@@ -58,13 +58,11 @@
M.confused = 0
M.SetSleeping(0, 0)
M.jitteriness = 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()
..()
. = 1
@@ -686,7 +684,7 @@
taste_description = "dull toxin"
/datum/reagent/medicine/oculine/on_mob_life(mob/living/M)
- var/obj/item/organ/eyes/eyes = M.getorganslot("eyes_sight")
+ var/obj/item/organ/eyes/eyes = M.getorganslot("eyes_sight")
if (!eyes)
return
if(M.disabilities & BLIND)
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index fb7b99ce4d..1480c33429 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -13,7 +13,8 @@
/datum/reagent/blood/reaction_mob(mob/M, method=TOUCH, reac_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
@@ -73,11 +74,6 @@
if(data["blood_DNA"])
B.blood_DNA[data["blood_DNA"]] = data["blood_type"]
- for(var/datum/disease/D in data["viruses"])
- var/datum/disease/newVirus = D.Copy(1)
- B.viruses += newVirus
- newVirus.holder = B
-
/datum/reagent/liquidgibs
name = "Liquid gibs"
@@ -96,7 +92,8 @@
/datum/reagent/vaccine/reaction_mob(mob/M, method=TOUCH, reac_volume)
if(islist(data) && (method == INGEST || method == INJECT))
- 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