diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm
index f0ba15446c..b9df144ace 100644
--- a/code/_onclick/other_mobs.dm
+++ b/code/_onclick/other_mobs.dm
@@ -100,8 +100,7 @@
"[name] bites [ML]!")
if(armor >= 2)
return
- for(var/thing in viruses)
- var/datum/disease/D = thing
+ for(var/datum/disease/D in viruses)
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 451bd05606..5499680a2f 100644
--- a/code/controllers/subsystem/disease.dm
+++ b/code/controllers/subsystem/disease.dm
@@ -1,8 +1,11 @@
SUBSYSTEM_DEF(disease)
name = "Disease"
- flags = SS_NO_FIRE
+ flags = SS_KEEP_TIMING|SS_NO_INIT
+ runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
+
+ var/list/currentrun = list()
+ var/list/processing = list()
- var/list/active_diseases = list() //List of Active disease in all mobs; purely for quick referencing.
var/list/diseases
var/list/archive_diseases = list()
@@ -12,5 +15,27 @@ 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:[active_diseases.len]")
\ No newline at end of file
+ ..("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
diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm
index 84d177a390..77b8aeed6a 100644
--- a/code/datums/diseases/_MobProcs.dm
+++ b/code/datums/diseases/_MobProcs.dm
@@ -1,7 +1,6 @@
/mob/proc/HasDisease(datum/disease/D)
- for(var/thing in viruses)
- var/datum/disease/DD = thing
+ for(var/datum/disease/DD in viruses)
if(D.IsSame(DD))
return 1
return 0
@@ -40,7 +39,7 @@
var/datum/disease/DD = new D.type(1, D, 0)
viruses += DD
DD.affected_mob = src
- SSdisease.active_diseases += DD //Add it to the active diseases list, now that it's actually in a mob and being processed.
+ DD.holder = src
//Copy properties over. This is so edited diseases persist.
var/list/skipped = list("affected_mob","holder","carrier","stage","type","parent_type","vars","transformed")
@@ -148,9 +147,6 @@
/mob/living/carbon/human/CanContractDisease(datum/disease/D)
- if(dna && (VIRUSIMMUNE in dna.species.species_traits) && !D.bypasses_immunity)
+ if(dna && (VIRUSIMMUNE in dna.species.species_traits))
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 13ad3ece4e..cc11d0e6d2 100644
--- a/code/datums/diseases/_disease.dm
+++ b/code/datums/diseases/_disease.dm
@@ -46,23 +46,21 @@
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 = 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/carrier = 0 //If our host is only a carrier
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()
@@ -95,16 +93,13 @@
if(!. || (needs_all_cures && . < cures.len))
return 0
-
-/datum/disease/proc/spread(force_spread = 0)
- if(!affected_mob)
- return
-
+/datum/disease/proc/spread(atom/source, force_spread = 0)
if((spread_flags & SPECIAL || spread_flags & NON_CONTAGIOUS || spread_flags & BLOOD) && !force_spread)
return
- if(affected_mob.reagents.has_reagent("spaceacillin") || (affected_mob.satiety > 0 && prob(affected_mob.satiety/10)))
- return
+ if(affected_mob)
+ if( affected_mob.reagents.has_reagent("spaceacillin") || (affected_mob.satiety > 0 && prob(affected_mob.satiety/10)) )
+ return
var/spread_range = 1
@@ -114,9 +109,15 @@
if(spread_flags & AIRBORNE)
spread_range++
- var/turf/T = affected_mob.loc
+ if(!source)
+ if(affected_mob)
+ source = affected_mob
+ else
+ return
+
+ var/turf/T = source.loc
if(istype(T))
- for(var/mob/living/carbon/C in oview(spread_range, affected_mob))
+ for(var/mob/living/carbon/C in oview(spread_range, source))
var/turf/V = get_turf(C)
if(V)
while(TRUE)
@@ -128,6 +129,29 @@
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)
@@ -137,6 +161,20 @@
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
@@ -153,6 +191,11 @@
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 623b436893..3aa4dab99b 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(GetDiseaseID() != D.GetDiseaseID())
+ if(src.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(!(IsSame(D)))
+ if(!(src.IsSame(D)))
var/list/possible_symptoms = shuffle(D.symptoms)
for(var/datum/symptom/S in possible_symptoms)
AddSymptom(new S.type)
@@ -156,6 +156,7 @@
return generated
/datum/disease/advance/proc/Refresh(new_name = 0)
+ //to_chat(world, "[src.name] \ref[src] - REFRESH!")
GenerateProperties()
AssignProperties()
id = null
@@ -394,7 +395,7 @@
D.AssignName(new_name)
D.Refresh()
- for(var/datum/disease/advance/AD in SSdisease.active_diseases)
+ for(var/datum/disease/advance/AD in SSdisease.processing)
AD.Refresh()
for(var/mob/living/carbon/human/H in shuffle(GLOB.living_mob_list))
@@ -409,6 +410,13 @@
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 11d8b714ba..9413eea5db 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(5)
+ A.spread(A.holder, 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 bd5d09afa3..44d7db5709 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(type == S[i])
+ if(src.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 8c681b8ec3..eba5e1173b 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 e830cafbef..a58f85a494 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/brain)
+ required_organs = list(/obj/item/bodypart/head)
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 2b77885359..69b30589ac 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"])
- carrier = TRUE
- stage = 4
+ src.carrier = 1
+ src.stage = 4
return
switch(stage)
diff --git a/code/datums/diseases/pierrot_throat.dm b/code/datums/diseases/pierrot_throat.dm
index 75f63edf43..b2195a9527 100644
--- a/code/datums/diseases/pierrot_throat.dm
+++ b/code/datums/diseases/pierrot_throat.dm
@@ -10,6 +10,7 @@
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 9cbb829061..d33446cadf 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")
- cure()
+ src.cure()
return
switch(stage)
if(2)
diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm
index e5746c3f8b..03b746a3bd 100644
--- a/code/datums/diseases/transformation.dm
+++ b/code/datums/diseases/transformation.dm
@@ -73,6 +73,7 @@
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 c8e2a4609b..4b57c2655b 100644
--- a/code/datums/diseases/tuberculosis.dm
+++ b/code/datums/diseases/tuberculosis.dm
@@ -1,5 +1,4 @@
/datum/disease/tuberculosis
- form = "Disease"
name = "Fungal tuberculosis"
max_stages = 5
spread_text = "Airborne"
@@ -9,9 +8,8 @@
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/lungs)
+ required_organs = list(/obj/item/bodypart/head)
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 b484e1e480..f23f01d068 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -629,11 +629,10 @@
text = "[text]: "
if (ishuman(current))
text += "healthy|infected|HUMAN|other"
- else if(ismonkey(current))
- var/found = FALSE
- for(var/datum/disease/transformation/jungle_fever/JF in current.viruses)
- found = TRUE
- break
+ 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
if(found)
text += "healthy|INFECTED|human|other"
@@ -1343,8 +1342,7 @@
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/thing in M.viruses)
- var/datum/disease/D = thing
+ for(var/datum/disease/D in M.viruses)
D.cure(0)
if("infected")
if (check_rights(R_ADMIN, 0))
@@ -1364,9 +1362,10 @@
var/mob/living/carbon/human/H = current
var/mob/living/carbon/monkey/M = current
if (istype(M))
- 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
+ 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)
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 4e4c35a937..2e5854509a 100644
--- a/code/game/data_huds.dm
+++ b/code/game/data_huds.dm
@@ -62,8 +62,7 @@
//called when a carbon changes virus
/mob/living/carbon/proc/check_virus()
var/threat = 0
- for(var/thing in viruses)
- var/datum/disease/D = thing
+ for(var/datum/disease/D in viruses)
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 c961406810..40ce63a60e 100644
--- a/code/game/gamemodes/changeling/powers/panacea.dm
+++ b/code/game/gamemodes/changeling/powers/panacea.dm
@@ -41,9 +41,6 @@
user.reagents.add_reagent("antihol", 10)
user.reagents.add_reagent("mannitol", 25)
- for(var/thing in user.viruses)
- var/datum/disease/D = thing
- if(D.severity == NONTHREAT)
- continue
+ for(var/datum/disease/D in user.viruses)
D.cure()
return TRUE
diff --git a/code/game/gamemodes/miniantags/abduction/gland.dm b/code/game/gamemodes/miniantags/abduction/gland.dm
index 6a0993db54..13e86dd5d3 100644
--- a/code/game/gamemodes/miniantags/abduction/gland.dm
+++ b/code/game/gamemodes/miniantags/abduction/gland.dm
@@ -133,9 +133,10 @@
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 = TRUE
+ D.carrier = 1
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 da9f4b61f1..20ba54afc4 100644
--- a/code/game/gamemodes/miniantags/monkey/monkey.dm
+++ b/code/game/gamemodes/miniantags/monkey/monkey.dm
@@ -60,6 +60,7 @@
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 4785fab384..5e876d3b92 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(get_turf(src))
+ new /obj/effect/gibspawner/generic(loc)
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 26b5bca1ec..3ab96f6df5 100644
--- a/code/game/objects/effects/decals/cleanable/aliens.dm
+++ b/code/game/objects/effects/decals/cleanable/aliens.dm
@@ -6,10 +6,17 @@
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")
@@ -27,9 +34,13 @@
var/direction = pick(directions)
for(var/i = 0, i < pick(1, 200; 2, 150; 3, 50), i++)
sleep(2)
- if(i > 0)
- new /obj/effect/decal/cleanable/xenoblood/xsplatter(loc)
- if(!step_to(src, get_step(src, direction), 0))
+ 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))
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 5127aa2285..8248776a95 100644
--- a/code/game/objects/effects/decals/cleanable/humans.dm
+++ b/code/game/objects/effects/decals/cleanable/humans.dm
@@ -4,10 +4,17 @@
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()
@@ -63,11 +70,15 @@
/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)
- new /obj/effect/decal/cleanable/blood/splatter(loc)
- if(!step_to(src, get_step(src, direction), 0))
+ 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))
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 98a9782600..f1b0a9ce40 100644
--- a/code/game/objects/effects/decals/cleanable/misc.dm
+++ b/code/game/objects/effects/decals/cleanable/misc.dm
@@ -80,8 +80,9 @@
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(mob/user)
+/obj/effect/decal/cleanable/vomit/attack_hand(var/mob/user)
if(ishuman(user))
var/mob/living/carbon/human/H = user
if(isflyperson(H))
@@ -97,6 +98,12 @@
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 e91c273903..862d21ad6b 100644
--- a/code/game/objects/effects/decals/cleanable/robots.dm
+++ b/code/game/objects/effects/decals/cleanable/robots.dm
@@ -43,6 +43,7 @@
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
@@ -51,5 +52,11 @@
..()
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 b25b9f7d8f..06beef6940 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, datum/dna/MobDNA)
- . = ..()
+/obj/effect/gibspawner/Initialize(mapload, list/viruses, datum/dna/MobDNA)
+ ..()
if(gibtypes.len != gibamounts.len || gibamounts.len != gibdirections.len)
to_chat(world, "Gib list length mismatch!")
@@ -29,6 +29,13 @@
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
@@ -49,7 +56,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)
@@ -58,7 +65,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).
@@ -68,7 +75,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
@@ -78,7 +85,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).
@@ -89,7 +96,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)
@@ -98,7 +105,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)
@@ -107,7 +114,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
@@ -117,4 +124,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 968f361544..70b6d54f73 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -171,8 +171,7 @@ MASS SPECTROMETER
if(tdelta < (DEFIB_TIME_LIMIT * 10))
to_chat(user, "Subject died [tdelta / 10] seconds ago, defibrillation may be possible!")
- for(var/thing in M.viruses)
- var/datum/disease/D = thing
+ for(var/datum/disease/D in M.viruses)
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 6285dcaa13..e10d04611a 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(get_turf(H), H.dna)
+ new /obj/effect/gibspawner/generic(H.loc, H.viruses, 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 1b00e01d4e..ffad361db8 100644
--- a/code/modules/admin/secrets.dm
+++ b/code/modules/admin/secrets.dm
@@ -149,9 +149,8 @@
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/thing in SSdisease.active_diseases)
- var/datum/disease/D = thing
- D.cure(0)
+ for(var/datum/disease/D in SSdisease.processing)
+ D.cure(D)
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 90ac9416d9..9a8e7c8278 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(get_turf(M))
+ new /obj/effect/gibspawner/generic(M.loc, M.viruses)
return
if(confirm == "Yes")
M.gib()
diff --git a/code/modules/clothing/ears/ears.dm b/code/modules/clothing/ears/ears.dm
index 4061c4db03..906bde2a87 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."]")
\ No newline at end of file
+ to_chat(owner, "You turn the music [headphones_on? "on. Untz Untz Untz!" : "off."]")
diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm
index dbac242321..fc86356adf 100644
--- a/code/modules/events/disease_outbreak.dm
+++ b/code/modules/events/disease_outbreak.dm
@@ -27,17 +27,11 @@
continue
if(T.z != ZLEVEL_STATION)
continue
- 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
+ var/foundAlready = 0 // don't infect someone that already has the virus
+ for(var/datum/disease/D in H.viruses)
+ foundAlready = 1
break
- if(foundAlready)
+ if(H.stat == DEAD || foundAlready)
continue
var/datum/disease/D
@@ -51,6 +45,6 @@
DS.strain_data["SE"] = H.dna.struc_enzymes
else
D = new virus_type()
- D.carrier = TRUE
+ D.carrier = 1
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 f19471fffc..60d7535e5a 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/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/virus_type = pick(/datum/disease/beesease, /datum/disease/brainrot, /datum/disease/fluspanish)
var/turf/T
for(var/i=0, i<10, i++)
if(prob(15))
@@ -142,7 +142,11 @@
else if(prob(25))
shuttle_spawns.Add(/obj/item/weapon/shard)
T = pick_n_take(empty_shuttle_turfs)
- new virus_type(T)
+ 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
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
deleted file mode 100644
index 98a7e42033..0000000000
--- a/code/modules/events/shuttle_loan.dm.rej
+++ /dev/null
@@ -1,10 +0,0 @@
-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 a441210432..eb66be3038 100644
--- a/code/modules/events/spontaneous_appendicitis.dm
+++ b/code/modules/events/spontaneous_appendicitis.dm
@@ -8,17 +8,10 @@
/datum/round_event/spontaneous_appendicitis/start()
for(var/mob/living/carbon/human/H in shuffle(GLOB.living_mob_list))
- 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)
+ 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)
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 d20b74210b..09a0560357 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/processor.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/processor.dm
@@ -162,8 +162,7 @@
//set reagent data
B.data["donor"] = O
- for(var/thing in O.viruses)
- var/datum/disease/D = thing
+ for(var/datum/disease/D in O.viruses)
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 8e547eeb12..69eacbb69e 100644
--- a/code/modules/mob/living/blood.dm
+++ b/code/modules/mob/living/blood.dm
@@ -137,8 +137,7 @@
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/thing in blood_data["viruses"])
- var/datum/disease/D = thing
+ for(var/datum/disease/D in blood_data["viruses"])
if((D.spread_flags & SPECIAL) || (D.spread_flags & NON_CONTAGIOUS))
continue
C.ForceContractDisease(D)
@@ -163,8 +162,7 @@
blood_data["donor"] = src
blood_data["viruses"] = list()
- for(var/thing in viruses)
- var/datum/disease/D = thing
+ for(var/datum/disease/D in viruses)
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 a31dba9fa9..46facdc454 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(get_turf(src))
+ new /obj/effect/gibspawner/xeno(loc,viruses)
else
- new /obj/effect/gibspawner/xenobodypartless(get_turf(src))
+ new /obj/effect/gibspawner/xenobodypartless(loc,viruses)
/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 f49e545dfa..585e5779c6 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(get_turf(src))
+ new /obj/effect/gibspawner/larva(loc,viruses)
else
- new /obj/effect/gibspawner/larvabodypartless(get_turf(src))
+ new /obj/effect/gibspawner/larvabodypartless(loc,viruses)
/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 c71751ab2f..4415c0d7ab 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -716,9 +716,8 @@
var/obj/item/organ/brain/B = getorgan(/obj/item/organ/brain)
if(B)
B.damaged_brain = 0
- for(var/thing in viruses)
- var/datum/disease/D = thing
- if(D.severity != NONTHREAT)
+ for(var/datum/disease/D in viruses)
+ 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 599c3a43cd..780fabe64d 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -107,13 +107,11 @@
/mob/living/carbon/attack_hand(mob/living/carbon/human/user)
- for(var/thing in viruses)
- var/datum/disease/D = thing
+ for(var/datum/disease/D in viruses)
if(D.IsSpreadByTouch())
user.ContractDisease(D)
- for(var/thing in user.viruses)
- var/datum/disease/D = thing
+ for(var/datum/disease/D in user.viruses)
if(D.IsSpreadByTouch())
ContractDisease(D)
@@ -126,13 +124,11 @@
/mob/living/carbon/attack_paw(mob/living/carbon/monkey/M)
- for(var/thing in viruses)
- var/datum/disease/D = thing
+ for(var/datum/disease/D in viruses)
if(D.IsSpreadByTouch())
M.ContractDisease(D)
- for(var/thing in M.viruses)
- var/datum/disease/D = thing
+ for(var/datum/disease/D in M.viruses)
if(D.IsSpreadByTouch())
ContractDisease(D)
@@ -141,8 +137,7 @@
return 0
if(..()) //successful monkey bite.
- for(var/thing in M.viruses)
- var/datum/disease/D = thing
+ for(var/datum/disease/D in M.viruses)
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 a1b67fbee1..4547390f56 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(get_turf(src), dna)
+ new /obj/effect/gibspawner/human(loc, viruses, dna)
else
- new /obj/effect/gibspawner/humanbodypartless(get_turf(src), dna)
+ new /obj/effect/gibspawner/humanbodypartless(loc, viruses, 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 134f50052f..aec0da4b8a 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -119,8 +119,7 @@
//Virsuses
if(viruses.len)
stat("Viruses:", null)
- for(var/thing in viruses)
- var/datum/disease/D = thing
+ for(var/datum/disease/D in viruses)
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 9a82ba5ba9..e50997f634 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -222,15 +222,6 @@
/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
deleted file mode 100644
index b62c84a34f..0000000000
--- a/code/modules/mob/living/carbon/life.dm.rej
+++ /dev/null
@@ -1,10 +0,0 @@
-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 0fd86ed02e..eb96d09bde 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(get_turf(src))
+ new /obj/effect/gibspawner/generic(loc, viruses)
/mob/living/proc/spill_organs()
return
diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm
index 9e51ece6d6..2df4c83b85 100644
--- a/code/modules/mob/living/life.dm
+++ b/code/modules/mob/living/life.dm
@@ -19,19 +19,14 @@
var/datum/gas_mixture/environment = loc.return_air()
if(stat != DEAD)
- //Chemicals in the body
- handle_chemicals_in_body()
-
+ //Breathing, if applicable
+ handle_breathing(times_fired)
if(stat != DEAD)
//Mutations and radiation
handle_mutations_and_radiation()
-
if(stat != DEAD)
- //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.
-
+ //Chemicals in the body
+ handle_chemicals_in_body()
if(stat != DEAD)
//Random events (vomiting etc)
handle_random_events()
@@ -71,9 +66,6 @@
/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
deleted file mode 100644
index aeba977c88..0000000000
--- a/code/modules/mob/living/life.dm.rej
+++ /dev/null
@@ -1,11 +0,0 @@
-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 7537697d71..ca93c95f48 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(get_turf(src))
+ new /obj/effect/gibspawner/robot(loc,viruses)
/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 0806f457d9..a4f8638c4a 100644
--- a/code/modules/mob/living/silicon/pai/software.dm
+++ b/code/modules/mob/living/silicon/pai/software.dm
@@ -513,8 +513,7 @@
Structural Integrity: [M.getBruteLoss() > 50 ? "" : ""][M.getBruteLoss()]
Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)
"}
- for(var/thing in M.viruses)
- var/datum/disease/D = thing
+ for(var/datum/disease/D in M.viruses)
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 b4694dc93a..a0399d2b2c 100644
--- a/code/modules/mob/living/simple_animal/bot/medbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/medbot.dm
@@ -372,8 +372,7 @@
return 1
if(treat_virus && !C.reagents.has_reagent(treatment_virus_avoid) && !C.reagents.has_reagent(treatment_virus))
- for(var/thing in C.viruses)
- var/datum/disease/D = thing
+ for(var/datum/disease/D in C.viruses)
//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 \
@@ -424,8 +423,7 @@
else
if(treat_virus)
var/virus = 0
- for(var/thing in C.viruses)
- var/datum/disease/D = thing
+ for(var/datum/disease/D in C.viruses)
//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 6d6f0ff72e..7681566854 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -11,7 +11,8 @@
qdel(hud_used)
if(mind && mind.current == src)
spellremove(src)
- QDEL_LIST(viruses)
+ for(var/infection in viruses)
+ qdel(infection)
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 56e56bfcaa..053cba123a 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() // list of all diseases in a mob
+ var/list/viruses = list() // replaces var/datum/disease/virus
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 e421b84853..cf598b7a2e 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/thing in O.viruses)
- var/datum/disease/D = thing
+ for(var/datum/disease/D in O.viruses)
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/thing in O.viruses)
- var/datum/disease/D = thing
+ for(var/datum/disease/D in O.viruses)
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 1685eeb72d..ab68dffc0b 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.active_diseases)
+ for(var/datum/disease/advance/AD in SSdisease.processing)
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 54e59f3584..a59af94aee 100644
--- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
@@ -58,11 +58,13 @@
M.confused = 0
M.SetSleeping(0, 0)
M.jitteriness = 0
- for(var/thing in M.viruses)
- var/datum/disease/D = thing
+ for(var/datum/disease/D in M.viruses)
if(D.severity == NONTHREAT)
continue
- D.cure()
+ D.spread_text = "Remissive"
+ D.stage--
+ if(D.stage < 1)
+ D.cure()
..()
. = 1
@@ -684,7 +686,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 1480c33429..fb7b99ce4d 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -13,8 +13,7 @@
/datum/reagent/blood/reaction_mob(mob/M, method=TOUCH, reac_volume)
if(data && data["viruses"])
- for(var/thing in data["viruses"])
- var/datum/disease/D = thing
+ for(var/datum/disease/D in data["viruses"])
if((D.spread_flags & SPECIAL) || (D.spread_flags & NON_CONTAGIOUS))
continue
@@ -74,6 +73,11 @@
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"
@@ -92,8 +96,7 @@
/datum/reagent/vaccine/reaction_mob(mob/M, method=TOUCH, reac_volume)
if(islist(data) && (method == INGEST || method == INJECT))
- for(var/thing in M.viruses)
- var/datum/disease/D = thing
+ for(var/datum/disease/D in M.viruses)
if(D.GetDiseaseID() in data)
D.cure()
M.resistances |= data