diff --git a/code/WorkInProgress/Chemistry-Holder.dm b/code/WorkInProgress/Chemistry-Holder.dm
index 594f5bd0f23..07c4798548b 100644
--- a/code/WorkInProgress/Chemistry-Holder.dm
+++ b/code/WorkInProgress/Chemistry-Holder.dm
@@ -274,6 +274,13 @@ datum
R.volume += amount
update_total()
my_atom.on_reagent_change()
+
+ // mix dem viruses
+ if(R.data["viruses"] || data["viruses"])
+ var/list/this = R.data["viruses"]
+ var/list/that = data["viruses"]
+ this += that // combine the two
+
return 0
for(var/A in typesof(/datum/reagent) - /datum/reagent)
diff --git a/code/WorkInProgress/Chemistry-Machinery.dm b/code/WorkInProgress/Chemistry-Machinery.dm
index 29602525570..6bc41363662 100644
--- a/code/WorkInProgress/Chemistry-Machinery.dm
+++ b/code/WorkInProgress/Chemistry-Machinery.dm
@@ -349,7 +349,7 @@
B.icon_state = "bottle3"
var/type = text2path(href_list["create_virus_culture"])//the path is received as string - converting
var/datum/disease/D = new type
- var/list/data = list("virus"=D)
+ var/list/data = list("viruses"=list(D))
var/name = sanitize(input(usr,"Name:","Name the culture",D.name))
if(!name || name == " ") name = D.name
B.name = "[name] culture bottle"
@@ -416,11 +416,17 @@
dat += "
Blood sample data:
"
dat += "Blood DNA: [(Blood.data["blood_DNA"]||"none")]
"
dat += "Blood Type: [(Blood.data["blood_type"]||"none")]
"
- var/datum/disease/D = Blood.data["virus"]
- dat += "Agent of disease: [D?"[D.agent] - Create virus culture bottle":"none"]
"
- if(D)
- dat += "Common name: [(D.name||"none")]
"
- dat += "Possible cure: [(D.cure||"none")]
"
+
+
+ if(Blood.data["viruses"])
+ var/list/vir = Blood.data["viruses"]
+ if(vir.len)
+ for(var/datum/disease/D in Blood.data["viruses"])
+
+ dat += "Disease Agent: [D?"[D.agent] - Create virus culture bottle":"none"]
"
+ dat += "Common name: [(D.name||"none")]
"
+ dat += "Possible cure: [(D.cure||"none")]
"
+
dat += "Contains antibodies to: "
if(Blood.data["resistances"])
var/list/res = Blood.data["resistances"]
diff --git a/code/WorkInProgress/Chemistry-Reagents.dm b/code/WorkInProgress/Chemistry-Reagents.dm
index 499a42f63bc..779cf6746b6 100644
--- a/code/WorkInProgress/Chemistry-Reagents.dm
+++ b/code/WorkInProgress/Chemistry-Reagents.dm
@@ -15,6 +15,7 @@ datum
var/data = null
var/volume = 0
var/nutriment_factor = 0
+ //var/list/viruses = list()
proc
reaction_mob(var/mob/M, var/method=TOUCH, var/volume) //By default we have a chance to transfer some
@@ -68,15 +69,22 @@ datum
blood
- data = new/list("donor"=null,"virus"=null,"blood_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null)
+ data = new/list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null)
name = "Blood"
id = "blood"
reagent_state = LIQUID
reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
- if(M.virus) return //to prevent the healing of some serious shit with common cold injection.
var/datum/reagent/blood/self = src
src = null
+ for(var/datum/disease/D in self.data["viruses"])
+ var/datum/disease/virus = new D.type
+ if(method == TOUCH)
+ M.contract_disease(virus)
+
+ else //injected
+ M.contract_disease(virus, 1, 0)
+ /*
if(self.data["virus"])
var/datum/disease/V = self.data["virus"]
if(M.resistances.Find(V.type)) return
@@ -85,52 +93,67 @@ datum
else //injected
M.contract_disease(V, 1, 0)
return
+ */
reaction_turf(var/turf/simulated/T, var/volume)//splash the blood all over the place
if(!istype(T)) return
var/datum/reagent/blood/self = src
src = null
- var/datum/disease/D = self.data["virus"]
+ //var/datum/disease/D = self.data["virus"]
if(!self.data["donor"] || istype(self.data["donor"], /mob/living/carbon/human))
var/obj/decal/cleanable/blood/blood_prop = locate() in T //find some blood here
if(!blood_prop) //first blood!
blood_prop = new(T)
blood_prop.blood_DNA = self.data["blood_DNA"]
blood_prop.blood_type = self.data["blood_type"]
- if(D && !blood_prop.virus) //TODO: multiple viruses
- blood_prop.virus = new D.type
- blood_prop.virus.holder = blood_prop
+
+ for(var/datum/disease/D in self.data["viruses"])
+ var/datum/disease/newVirus = new D.type
+ blood_prop.viruses += newVirus
+ newVirus.holder = blood_prop
+
+ // this makes it almost impossible for airborne diseases to spread
+ // THIS SHIT HAS TO GO, SORRY!
+ /*
if(T.density==0)
- blood_prop.virus.spread_type = CONTACT_FEET
+ newVirus.spread_type = CONTACT_FEET
else
- blood_prop.virus.spread_type = CONTACT_HANDS
+ newVirus.spread_type = CONTACT_HANDS
+ */
else if(istype(self.data["donor"], /mob/living/carbon/monkey))
var/obj/decal/cleanable/blood/blood_prop = locate() in T
if(!blood_prop)
blood_prop = new(T)
blood_prop.blood_DNA = self.data["blood_DNA"]
- if(D && !blood_prop.virus)
- blood_prop.virus = new D.type
- blood_prop.virus.holder = blood_prop
+ for(var/datum/disease/D in self.data["viruses"])
+ var/datum/disease/newVirus = new D.type
+ blood_prop.viruses += newVirus
+ newVirus.holder = blood_prop
+
+ /*
if(T.density==0)
- blood_prop.virus.spread_type = CONTACT_FEET
+ newVirus.spread_type = CONTACT_FEET
else
- blood_prop.virus.spread_type = CONTACT_HANDS
+ newVirus.spread_type = CONTACT_HANDS
+ */
else if(istype(self.data["donor"], /mob/living/carbon/alien))
var/obj/decal/cleanable/xenoblood/blood_prop = locate() in T
if(!blood_prop)
blood_prop = new(T)
blood_prop.blood_DNA = self.data["blood_DNA"]
- if(D && !blood_prop.virus)
- blood_prop.virus = new D.type
- blood_prop.virus.holder = blood_prop
+ for(var/datum/disease/D in self.data["viruses"])
+ var/datum/disease/newVirus = new D.type
+ blood_prop.viruses += newVirus
+ newVirus.holder = blood_prop
+ /*
if(T.density==0)
- blood_prop.virus.spread_type = CONTACT_FEET
+ newVirus.spread_type = CONTACT_FEET
else
- blood_prop.virus.spread_type = CONTACT_HANDS
+ newVirus.spread_type = CONTACT_HANDS
+ */
return
/* Must check the transfering of reagents and their data first. They all can point to one disease datum.
@@ -151,10 +174,11 @@ datum
var/datum/reagent/vaccine/self = src
src = null
if(self.data&&method == INGEST)
- if(M.virus && M.virus.type == self.data)
- M.virus.cure()
- else if(!(self.data in M.resistances))
- M.resistances += self.data
+ for(var/datum/disease/D in M.viruses)
+ if(M.virus && D.type == self.data["viruses"])
+ D.cure()
+
+ M.resistances += self.data
return
@@ -997,10 +1021,11 @@ datum
M:confused = 0
M:sleeping = 0
M:jitteriness = 0
- M.virus.spread = "Remissive"
- M.virus.stage--
- if(M.virus.stage < 1)
- M.virus.cure()
+ for(var/datum/disease/D in M.viruses)
+ D.spread = "Remissive"
+ D.stage--
+ if(D.stage < 1)
+ D.cure()
..()
return
@@ -1532,8 +1557,10 @@ datum
M:heal_organ_damage(1,1)
..()
return
+
..()
+
dry_ramen
name = "Dry Ramen"
id = "dry_ramen"
@@ -1775,6 +1802,7 @@ datum
if(data >= 40 && prob(33))
if (!M:confused) M:confused = 1
M:confused += 2
+
..()
return
@@ -1960,6 +1988,9 @@ datum
reagent_state = LIQUID
on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
+ if(M:oxyloss && prob(20)) M:oxyloss--
+ if(M:bruteloss && prob(20)) M:heal_organ_damage(1,0)
+ if(M:fireloss && prob(20)) M:heal_organ_damage(0,1)
if(M:toxloss && prob(20)) M:toxloss--
M:nutrition++
..()
@@ -2027,6 +2058,12 @@ datum
..()
return
+ cream
+ name = "Cream"
+ id = "cream"
+ description = "The fatty, still liquid part of milk. Why don't you mix this with sum scotch, eh?"
+ reagent_state = LIQUID
+
hooch
name = "Hooch"
id = "hooch"
diff --git a/code/WorkInProgress/Chemistry-Tools.dm b/code/WorkInProgress/Chemistry-Tools.dm
index aacfc57f5ac..3e56f46eb6b 100644
--- a/code/WorkInProgress/Chemistry-Tools.dm
+++ b/code/WorkInProgress/Chemistry-Tools.dm
@@ -783,8 +783,20 @@
B.volume = amount
//set reagent data
B.data["donor"] = T
+ /*
if(T.virus && T.virus.spread_type != SPECIAL)
B.data["virus"] = new T.virus.type(0)
+ */
+
+
+
+ for(var/datum/disease/D in T.viruses)
+ if(!B.data["viruses"])
+ B.data["viruses"] = list()
+
+
+ B.data["virus"] += new D.type
+
B.data["blood_DNA"] = copytext(T.dna.unique_enzymes,1,0)
if(T.resistances&&T.resistances.len)
B.data["resistances"] = T.resistances.Copy()
@@ -1611,7 +1623,7 @@
New()
..()
var/datum/disease/F = new /datum/disease/flu(0)
- var/list/data = list("virus"= F)
+ var/list/data = list("viruses"= list(F))
reagents.add_reagent("blood", 20, data)
/obj/item/weapon/reagent_containers/glass/bottle/pierrot_throat
@@ -1622,7 +1634,7 @@
New()
..()
var/datum/disease/F = new /datum/disease/pierrot_throat(0)
- var/list/data = list("virus"= F)
+ var/list/data = list("viruses"= list(F))
reagents.add_reagent("blood", 20, data)
/obj/item/weapon/reagent_containers/glass/bottle/cold
@@ -1633,7 +1645,7 @@
New()
..()
var/datum/disease/F = new /datum/disease/cold(0)
- var/list/data = list("virus"= F)
+ var/list/data = list("viruses"= list(F))
reagents.add_reagent("blood", 20, data)
/*
@@ -1660,7 +1672,7 @@
New()
..()
var/datum/disease/F = new /datum/disease/fake_gbs(0)
- var/list/data = list("virus"= F)
+ var/list/data = list("viruses"= list(F))
reagents.add_reagent("blood", 20, data)
/*
/obj/item/weapon/reagent_containers/glass/bottle/rhumba_beat
@@ -1687,7 +1699,7 @@
New()
..()
var/datum/disease/F = new /datum/disease/brainrot(0)
- var/list/data = list("virus"= F)
+ var/list/data = list("viruses"= list(F))
reagents.add_reagent("blood", 20, data)
/obj/item/weapon/reagent_containers/glass/bottle/magnitis
@@ -1698,7 +1710,7 @@
New()
..()
var/datum/disease/F = new /datum/disease/magnitis(0)
- var/list/data = list("virus"= F)
+ var/list/data = list("viruses"= list(F))
reagents.add_reagent("blood", 20, data)
@@ -1710,7 +1722,7 @@
New()
..()
var/datum/disease/F = new /datum/disease/wizarditis(0)
- var/list/data = list("virus"= F)
+ var/list/data = list("viruses"= list(F))
reagents.add_reagent("blood", 20, data)
diff --git a/code/WorkInProgress/buildmode.dm b/code/WorkInProgress/buildmode.dm
index 6140edf60f2..aa6a1b993ae 100644
--- a/code/WorkInProgress/buildmode.dm
+++ b/code/WorkInProgress/buildmode.dm
@@ -154,7 +154,7 @@
else if (dd_hasprefix(objholder, "/mob") && !(usr.client.holder.rank in list("Game Master", "Game Admin", "Badmin")))
objholder = "/obj/closet"
if(3)
- var/list/locked = list("vars", "key", "ckey", "client", "firemut", "ishulk", "telekinesis", "xray", "virus", "cuffed", "ka", "last_eaten", "urine")
+ var/list/locked = list("vars", "key", "ckey", "client", "firemut", "ishulk", "telekinesis", "xray", "virus", "viruses", "cuffed", "ka", "last_eaten", "urine")
master.buildmode.varholder = input(usr,"Enter variable name:" ,"Name", "name")
if(master.buildmode.varholder in locked && !(usr.client.holder.rank in list("Game Master", "Game Admin")))
diff --git a/code/WorkInProgress/cloning.dm b/code/WorkInProgress/cloning.dm
index eae697bdcd4..17848277502 100644
--- a/code/WorkInProgress/cloning.dm
+++ b/code/WorkInProgress/cloning.dm
@@ -318,6 +318,9 @@
if ((!subject.ckey) || (!subject.client))
src.temp = "Error: Mental interface failure."
return
+ if (subject.mutations & HUSK)
+ src.temp = "Error: Mental interface failure."
+ return
if (!isnull(find_record(subject.ckey)))
src.temp = "Subject already in database."
return
diff --git a/code/datums/disease.dm b/code/datums/disease.dm
index c3e33e65b13..a7c59cc3dea 100644
--- a/code/datums/disease.dm
+++ b/code/datums/disease.dm
@@ -84,6 +84,13 @@ to null does not delete the object itself. Thank you.
/mob/proc/contract_disease(var/datum/disease/virus, var/skip_this = 0, var/force_species_check=1)
// world << "Contract_disease called by [src] with virus [virus]"
if(stat >=2) return
+ if(virus.type in resistances)
+ if(prob(99.9)) return
+ resistances.Remove(virus.type)//the resistance is futile
+
+ for(var/datum/disease/D in viruses)
+ if(istype(D, virus.type))
+ return // two viruses of the same kind can't infect a body at once!!
if(force_species_check)
@@ -95,23 +102,21 @@ to null does not delete the object itself. Thank you.
break
if(fail) return
- if(skip_this == 1)//be wary, it replaces the current disease...
- if(src.virus)
- src.virus.cure(0)
- src.virus = new virus.type
- src.virus.affected_mob = src
- src.virus.strain_data = virus.strain_data.Copy()
- src.virus.holder = src
+ if(skip_this == 1)
+ //if(src.virus) < -- this used to replace the current disease. Not anymore!
+ //src.virus.cure(0)
+
+ var/datum/disease/v = new virus.type
+ src.viruses += v
+ v.affected_mob = src
+ v.strain_data = v.strain_data.Copy()
+ v.holder = src
if(prob(5))
- src.virus.carrier = 1
+ v.carrier = 1
return
- if(src.virus)
- return
-
- if(virus.type in resistances)
- if(prob(99.9)) return
- resistances.Remove(virus.type)//the resistance is futile
+ //if(src.virus) //
+ //return //
/*
@@ -223,7 +228,7 @@ to null does not delete the object itself. Thank you.
passed = (prob(50*virus.permeability_mod))
if(passed)
-// world << "Infection in the mob [src]. YAY"
+ //world << "Infection in the mob [src]. YAY"
/*
@@ -253,18 +258,20 @@ to null does not delete the object itself. Thank you.
else if(prob(15))
return
else*/
- src.virus = new virus.type
- src.virus.strain_data = virus.strain_data.Copy()
- src.virus.affected_mob = src
- src.virus.holder = src
+ var/datum/disease/v = new virus.type
+ src.viruses += v
+ v.affected_mob = src
+ v.strain_data = v.strain_data.Copy()
+ v.holder = src
if(prob(5))
- src.virus.carrier = 1
+ v.carrier = 1
return
return
-/datum/disease/proc/spread(var/source=null)
+/datum/disease/proc/spread(var/atom/source=null)
//world << "Disease [src] proc spread was called from holder [source]"
+
if(spread_type == SPECIAL)//does not spread
return
@@ -279,8 +286,9 @@ to null does not delete the object itself. Thank you.
var/check_range = AIRBORNE//defaults to airborne - range 4
+
if(spread_type != AIRBORNE)
- check_range = 0
+ check_range = 0 // everything else, like infect-on-contact things, only infect things on top of it
for(var/mob/living/carbon/M in oviewers(check_range, source))
M.contract_disease(src)
@@ -290,8 +298,15 @@ to null does not delete the object itself. Thank you.
/datum/disease/proc/process()
if(!holder) return
- if(prob(40))
+ if(prob(65))
spread(holder)
+
+ if(affected_mob)
+ for(var/datum/disease/D in affected_mob.viruses)
+ if(D != src)
+ if(istype(src, D.type))
+ del(D) // if there are somehow two viruses of the same kind in the system, delete the other one
+
if(holder == affected_mob)
if(affected_mob.stat < 2) //he's alive
stage_act()
@@ -301,8 +316,19 @@ to null does not delete the object itself. Thank you.
affected_mob = null
if(!affected_mob) //the virus is in inanimate obj
// world << "[src] longevity = [longevity]"
- if(--longevity<=0)
- cure(0)
+ /*
+ if(holder)
+
+ // spreads the love. Why hasn't anyone coded this in yet?!?!?!?
+ for(var/mob/living/M in view(1, holder))
+ if(M.stat != 2)
+ if(prob(90))
+ M.contract_disease(src)
+ */
+
+ if(prob(70))
+ if(--longevity<=0)
+ cure(0)
return
/datum/disease/proc/cure(var/resistance=1)//if resistance = 0, the mob won't develop resistance to disease
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index 1dfdcdae6eb..f1f7781bffe 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -181,10 +181,15 @@ datum/mind
if (istype(current, /mob/living/carbon/human))
text += "healthy|infected|HUMAN|other"
else if (istype(current, /mob/living/carbon/monkey))
- if(istype(current.virus, /datum/disease/jungle_fever))
+ var/found = 0
+ for(var/datum/disease/D in current.viruses)
+ if(istype(D, /datum/disease/jungle_fever)) found = 1
+
+ if(found)
text += "healthy|INFECTED|human|other"
else
text += "HEALTHY|infected|human|other"
+
else
text += "healthy|infected|human|OTHER"
sections["monkey"] = text
@@ -675,9 +680,10 @@ datum/mind
M = H.monkeyize()
src = M.mind
//world << "DEBUG: \"healthy\": M=[M], M.mind=[M.mind], src=[src]!"
- else if (istype(M) && M.virus)
- M.virus.cure(0)
- sleep(0) //because deleting of virus is doing throught spawn(0)
+ else if (istype(M) && length(M.viruses))
+ for(var/datum/disease/D in M.viruses)
+ D.cure(0)
+ sleep(0) //because deleting of virus is done through spawn(0)
if("infected")
if (usr.client.holder.level >= 3)
var/mob/living/carbon/human/H = current
@@ -694,9 +700,10 @@ datum/mind
if("human")
var/mob/living/carbon/monkey/M = current
if (istype(M))
- if (istype(M.virus,/datum/disease/jungle_fever))
- M.virus.cure(0)
- sleep(0) //because deleting of virus is doing throught spawn(0)
+ for(var/datum/disease/D in M.viruses)
+ if (istype(D,/datum/disease/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("\blue [key_name_admin(usr)] attempting to humanize [key_name_admin(current)]", 1)
var/obj/item/weapon/dnainjector/m2h/m2h = new
diff --git a/code/defines/mob/mob.dm b/code/defines/mob/mob.dm
index 2f14939d222..a9135e83c5f 100644
--- a/code/defines/mob/mob.dm
+++ b/code/defines/mob/mob.dm
@@ -184,6 +184,10 @@
//Wizard mode, but can be used in other modes thanks to the brand new "Give Spell" badmin button
var/obj/proc_holder/spell/list/spell_list = list()
+//List of active diseases
+
+ var/viruses = list() // replaces var/datum/disease/virus
+
//Monkey/infected mode
var/list/resistances = list()
var/datum/disease/virus = null
diff --git a/code/defines/obj/decal.dm b/code/defines/obj/decal.dm
index 9ba9caef1ba..df610beb740 100644
--- a/code/defines/obj/decal.dm
+++ b/code/defines/obj/decal.dm
@@ -47,13 +47,13 @@
icon = 'blood.dmi'
icon_state = "floor1"
random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7")
- var/datum/disease/virus = null
+ var/list/viruses = list()
blood_DNA = null
blood_type = null
Del()
- if(virus)
- virus.cure(0)
+ for(var/datum/disease/D in viruses)
+ D.cure(0)
..()
/obj/decal/cleanable/blood/splatter
@@ -99,11 +99,11 @@
icon = 'blood.dmi'
icon_state = "xfloor1"
random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7")
- var/datum/disease/virus = null
+ var/list/viruses = list()
Del()
- if(virus)
- virus.cure(0)
+ for(var/datum/disease/D in viruses)
+ D.cure(0)
..()
/obj/decal/cleanable/xenoblood/xsplatter
@@ -164,12 +164,12 @@
layer = 2
icon = 'robots.dmi'
icon_state = "floor1"
- var/datum/disease/virus = null
+ var/viruses = list()
random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7")
Del()
- if(virus)
- virus.cure(0)
+ for(var/datum/disease/D in viruses)
+ D.cure(0)
..()
/obj/decal/cleanable/oil/streak
diff --git a/code/game/atom_procs.dm b/code/game/atom_procs.dm
index e9acfd13be3..f50621988d2 100644
--- a/code/game/atom_procs.dm
+++ b/code/game/atom_procs.dm
@@ -111,9 +111,10 @@
var/obj/decal/cleanable/blood/this = new /obj/decal/cleanable/blood(source2)
this.blood_DNA = M.dna.unique_enzymes
this.blood_type = M.b_type
- if (M.virus)
- this.virus = new M.virus.type
- this.virus.holder = this
+ for(var/datum/disease/D in M.viruses)
+ var/datum/disease/newDisease = new D.type
+ this.viruses += newDisease
+ newDisease.holder = this
else if (istype(src, /mob/living/carbon/human))
src.blood_DNA = M.dna.unique_enzymes
src.blood_type = M.b_type
@@ -136,25 +137,28 @@
var/turf/simulated/source1 = src
var/obj/decal/cleanable/blood/this = new /obj/decal/cleanable/blood(source1)
this.blood_DNA = M.dna.unique_enzymes
- if(M.virus)
- this.virus = new M.virus.type
- this.virus.holder = this
+ for(var/datum/disease/D in M.viruses)
+ var/datum/disease/newDisease = new D.type
+ this.viruses += newDisease
+ newDisease.holder = this
else if( istype(M, /mob/living/carbon/alien ))
if( istype(src, /turf/simulated) )
var/turf/simulated/source2 = src
var/obj/decal/cleanable/xenoblood/this = new /obj/decal/cleanable/xenoblood(source2)
- if(M.virus)
- this.virus = new M.virus.type
- this.virus.holder = this
+ for(var/datum/disease/D in M.viruses)
+ var/datum/disease/newDisease = new D.type
+ this.viruses += newDisease
+ newDisease.holder = this
else if( istype(M, /mob/living/silicon/robot ))
if( istype(src, /turf/simulated) )
var/turf/simulated/source2 = src
var/obj/decal/cleanable/oil/this = new /obj/decal/cleanable/oil(source2)
- if(M.virus)
- this.virus = new M.virus.type
- this.virus.holder = this
+ for(var/datum/disease/D in M.viruses)
+ var/datum/disease/newDisease = new D.type
+ this.viruses += newDisease
+ newDisease.holder = this
diff --git a/code/game/dna.dm b/code/game/dna.dm
index 3401cd1bd8a..706bc3e3fa7 100644
--- a/code/game/dna.dm
+++ b/code/game/dna.dm
@@ -368,10 +368,10 @@
M.dna = null
- O.virus = M.virus
- M.virus = null
- if (O.virus)
- O.virus.affected_mob = O
+ for(var/datum/disease/D in M.viruses)
+ O.viruses += D
+ D.affected_mob = O
+ M.viruses -= D
for(var/obj/T in (M.contents-implants))
@@ -433,10 +433,10 @@
O.dna = M.dna
M.dna = null
- O.virus = M.virus
- M.virus = null
- if (O.virus)
- O.virus.affected_mob = O
+ for(var/datum/disease/D in M.viruses)
+ O.viruses += D
+ D.affected_mob = O
+ M.viruses -= D
//for(var/obj/T in M)
// del(T)
diff --git a/code/game/gamemodes/events.dm b/code/game/gamemodes/events.dm
index 9a7f1e7d0a2..4b3eaae05b5 100644
--- a/code/game/gamemodes/events.dm
+++ b/code/game/gamemodes/events.dm
@@ -242,8 +242,13 @@
if("pierrot's throat")
virus_type = /datum/disease/pierrot_throat
for(var/mob/living/carbon/human/H in world)
- if((H.virus) || (H.stat == 2))
+
+ 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
+
if(virus_type == /datum/disease/dnaspread) //Dnaspread needs strain_data set to work.
if((!H.dna) || (H.sdisabilities & 1)) //A blindness disease would be the worst.
continue
@@ -254,13 +259,14 @@
D.carrier = 1
D.holder = H
D.affected_mob = H
- H.virus = D
+ H.viruses += D
break
else
- H.virus = new virus_type
- H.virus.affected_mob = H
- H.virus.holder = H
- H.virus.carrier = 1
+ var/datum/disease/D = new virus_type
+ D.carrier = 1
+ D.holder = H
+ D.affected_mob = H
+ H.viruses += D
break
/proc/alien_infestation() // -- TLE
diff --git a/code/game/gamemodes/events/ninja_equipment.dm b/code/game/gamemodes/events/ninja_equipment.dm
index 9ee2798ef5b..d179e9f2702 100644
--- a/code/game/gamemodes/events/ninja_equipment.dm
+++ b/code/game/gamemodes/events/ninja_equipment.dm
@@ -293,8 +293,9 @@ ________________________________________________________________________________
dat += " | Brute trauma: [U.bruteloss]
"
dat += "Radiation Level: [U.radiation] rad
"
dat += "Body Temperature: [U.bodytemperature-T0C]°C ([U.bodytemperature*1.8-459.67]°F)
"
- if(U.virus)
- dat += "Warning Virus Detected. Name: [U.virus.name].Type: [U.virus.spread]. Stage: [U.virus.stage]/[U.virus.max_stages]. Possible Cure: [U.virus.cure].
"
+
+ for(var/datum/disease/D in U.viruses)
+ dat += "Warning: Virus Detected. Name: [D.name].Type: [D.spread]. Stage: [D.stage]/[D.max_stages]. Possible Cure: [D.cure].
"
dat += ""
for(var/datum/reagent/R in reagents.reagent_list)
if(R.id=="radium"&&s_control)//Can only directly inject radium when AI is in control.
diff --git a/code/game/machinery/bots/medbot.dm b/code/game/machinery/bots/medbot.dm
index 2aec5a71940..fca0969f1b3 100644
--- a/code/game/machinery/bots/medbot.dm
+++ b/code/game/machinery/bots/medbot.dm
@@ -340,9 +340,12 @@
if((C.toxloss >= heal_threshold) && (!C.reagents.has_reagent(src.treatment_tox)))
return 1
- if(C.virus && ((C.virus.stage > 1) || (C.virus.spread_type == AIRBORNE)))
- if (!C.reagents.has_reagent(src.treatment_virus))
- return 1 //STOP DISEASE FOREVER
+
+ for(var/datum/disease/D in C.viruses)
+ if((D.stage > 1) || (D.spread_type == AIRBORNE))
+
+ if (!C.reagents.has_reagent(src.treatment_virus))
+ return 1 //STOP DISEASE FOREVER
return 0
@@ -375,7 +378,11 @@
if(src.emagged) //Emagged! Time to poison everybody.
reagent_id = "toxin"
- if (!reagent_id && (C.virus))
+ var/virus = 0
+ for(var/datum/disease/D in C.viruses)
+ virus = 1
+
+ if (!reagent_id && (virus))
if(!C.reagents.has_reagent(src.treatment_virus))
reagent_id = src.treatment_virus
diff --git a/code/game/machinery/kitchen/processor.dm b/code/game/machinery/kitchen/processor.dm
index 067be2cad87..72a71c23c41 100644
--- a/code/game/machinery/kitchen/processor.dm
+++ b/code/game/machinery/kitchen/processor.dm
@@ -74,8 +74,11 @@
B.volume = 70
//set reagent data
B.data["donor"] = O
- if(O.virus && O.virus.spread_type != SPECIAL)
- B.data["virus"] = new O.virus.type(0)
+
+ for(var/datum/disease/D in O.viruses)
+ if(D.spread_type != SPECIAL)
+ B.data["viruses"] = new D.type(0)
+
B.data["blood_DNA"] = copytext(O.dna.unique_enzymes,1,0)
if(O.resistances&&O.resistances.len)
B.data["resistances"] = O.resistances.Copy()
diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm
index 764239b66ba..f9cde1d05c1 100644
--- a/code/game/machinery/portable_turret.dm
+++ b/code/game/machinery/portable_turret.dm
@@ -355,17 +355,17 @@ Neutralize All Unidentified Life Signs: []
"},
if (istype(t, /mob/living)) // if a mob
var/mob/living/M = t // simple typecasting
if (M.stat!=2) // if the target is not dead
- popUp() // pop the turret up if it's not already up.
+ spawn() popUp() // pop the turret up if it's not already up.
dir=get_dir(src,M) // even if you can't shoot, follow the target
- shootAt(M) // shoot the target, finally
+ spawn() shootAt(M) // shoot the target, finally
else
if (istype(t, /obj/livestock)) // shoot other things, same process as above
var/obj/livestock/L = t
if (L.alive==1)
- popUp()
+ spawn() popUp()
dir=get_dir(src,L)
- shootAt(L)
+ spawn() shootAt(L)
else
@@ -373,11 +373,11 @@ Neutralize All Unidentified Life Signs: []
"},
var/mob/t = pick(secondarytargets)
if (istype(t, /mob/living))
if (t.stat!=2)
- popUp()
+ spawn() popUp()
dir=get_dir(src,t)
shootAt(t)
else
- popDown()
+ spawn() popDown()
/obj/machinery/porta_turret/proc
popUp() // pops the turret up
@@ -396,6 +396,7 @@ Neutralize All Unidentified Life Signs: []
"},
popDown() // pops the turret down
if(raising || !raised) return
if(stat & BROKEN) return
+ layer=3
raising=1
flick("popdown",cover)
sleep(10)
@@ -404,7 +405,6 @@ Neutralize All Unidentified Life Signs: []
"},
raised=0
invisibility=2
icon_state="grey_target_prism"
- layer=3
/obj/machinery/porta_turret/proc/assess_perp(mob/living/carbon/human/perp as mob)
@@ -466,6 +466,9 @@ Neutralize All Unidentified Life Signs: []
"},
if (!istype(T) || !istype(U))
return
+ if (!raised) // the turret has to be raised in order to fire - makes sense, right?
+ return
+
// any emagged turrets will shoot extremely fast! This not only is deadly, but drains a lot power!
@@ -475,6 +478,7 @@ Neutralize All Unidentified Life Signs: []
"},
A = new /obj/item/projectile/electrode( loc )
use_power(200)
playsound(src.loc, 'Taser.ogg', 75, 1)
+ icon_state = "orange_target_prism"
else
// Shooting Code:
var/obj/item/weapon/gun/energy/E=new installation
@@ -492,7 +496,7 @@ Neutralize All Unidentified Life Signs: []
"},
else if(istype(E, /obj/item/weapon/gun/energy/taser))
A = new /obj/item/projectile/electrode( loc )
- icon_state = "target_prism"
+ icon_state = "orange_target_prism"
use_power(200)
else // Energy gun shots
@@ -511,7 +515,7 @@ Neutralize All Unidentified Life Signs: []
"},
A.current = T
A.yo = U.y - T.y
A.xo = U.x - T.x
- spawn( 0 )
+ spawn( 1 )
A.process()
return
diff --git a/code/game/objects/alien/facehugger.dm b/code/game/objects/alien/facehugger.dm
index 67a1e5e6eec..6b98fd8bbad 100644
--- a/code/game/objects/alien/facehugger.dm
+++ b/code/game/objects/alien/facehugger.dm
@@ -251,11 +251,12 @@
if (!lamarr)
var/mob/trg = target
death()
- if(trg.virus)//Viruses are stored in a global database.
- trg.virus.cure(0)//You need to either cure() or del() them to stop their processing.
+ //if(trg.virus)//Viruses are stored in a global database.
+ //trg.virus.cure(0)//You need to either cure() or del() them to stop their processing.
trg.contract_disease(new /datum/disease/alien_embryo(0))//So after that you need to infect the target anew.
- if(target.virus)//If they actually get infected. They may not.
- target.alien_egg_flag = 1//We finally set their flag to 1.
+ for(var/datum/disease/alien_embryo/A in trg.viruses)
+ if(target.virus)//If they actually get infected. They may not.
+ target.alien_egg_flag = 1//We finally set their flag to 1.
return
else
sleep(50)
diff --git a/code/game/objects/blood.dm b/code/game/objects/blood.dm
index 29d8b62181e..6ef8617b442 100644
--- a/code/game/objects/blood.dm
+++ b/code/game/objects/blood.dm
@@ -20,8 +20,8 @@
sleep(3)
if (i > 0)
var/obj/decal/cleanable/blood/b = new /obj/decal/cleanable/blood/splatter(src.loc)
- if (src.virus)
- b.virus = src.virus
+ for(var/datum/disease/D in src.viruses)
+ b.viruses += D
if (step_to(src, get_step(src, direction), 0))
break
@@ -32,8 +32,8 @@
sleep(3)
if (i > 0)
var/obj/decal/cleanable/xenoblood/b = new /obj/decal/cleanable/xenoblood/xsplatter(src.loc)
- if (src.virus)
- b.virus = src.virus
+ for(var/datum/disease/D in src.viruses)
+ b.viruses += D
if (step_to(src, get_step(src, direction), 0))
break
diff --git a/code/game/objects/devices/PDA/PDA.dm b/code/game/objects/devices/PDA/PDA.dm
index cc2647de59a..b07d46829a1 100644
--- a/code/game/objects/devices/PDA/PDA.dm
+++ b/code/game/objects/devices/PDA/PDA.dm
@@ -690,8 +690,8 @@
user.show_message("\blue \t Damage Specifics: [C.oxyloss > 50 ? "\red" : "\blue"][C.oxyloss]-[C.toxloss > 50 ? "\red" : "\blue"][C.toxloss]-[C.fireloss > 50 ? "\red" : "\blue"][C.fireloss]-[C.bruteloss > 50 ? "\red" : "\blue"][C.bruteloss]", 1)
user.show_message("\blue \t Key: Suffocation/Toxin/Burns/Brute", 1)
user.show_message("\blue \t Body Temperature: [C.bodytemperature-T0C]°C ([C.bodytemperature*1.8-459.67]°F)", 1)
- if(C.virus)
- user.show_message(text("\red Warning Virus Detected.\nName: [C.virus.name].\nType: [C.virus.spread].\nStage: [C.virus.stage]/[C.virus.max_stages].\nPossible Cure: [C.virus.cure]"))
+ for(var/datum/disease/D in C.viruses)
+ user.show_message(text("\red Warning Virus Detected.\nName: [D.name].\nType: [D.spread].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure]"))
if(2)
if (!istype(C:dna, /datum/dna) || !isnull(C:gloves))
diff --git a/code/game/objects/devices/scanners.dm b/code/game/objects/devices/scanners.dm
index 7492feded41..93ab3e74434 100644
--- a/code/game/objects/devices/scanners.dm
+++ b/code/game/objects/devices/scanners.dm
@@ -114,8 +114,6 @@ MASS SPECTROMETER
if (istype(A, /obj/decal/cleanable/blood) || istype(A, /obj/rune))
if(A.blood_DNA)
user << "\blue Blood type: [A.blood_type]\nDNA: [A.blood_DNA]"
- if(A:virus)
- user << "\red Warning, virus found in the blood! Name: [A:virus.name]"
else if (A.blood_DNA)
user << "\blue Blood found on [A]. Analysing..."
sleep(15)
@@ -175,8 +173,8 @@ MASS SPECTROMETER
user.show_message(text("\blue [] | [] | [] | []", M.oxyloss > 50 ? "\red Severe oxygen deprivation detected\blue" : "Subject bloodstream oxygen level normal", M.toxloss > 50 ? "\red Dangerous amount of toxins detected\blue" : "Subject bloodstream toxin level minimal", M.fireloss > 50 ? "\red Severe burn damage detected\blue" : "Subject burn injury status O.K", M.bruteloss > 50 ? "\red Severe anatomical damage detected\blue" : "Subject brute-force injury status O.K"), 1)
if (M.cloneloss)
user.show_message(text("\red Subject appears to have been imperfectly cloned."), 1)
- if (M.virus)
- user.show_message(text("\red Warning: Virus Detected.\nName: [M.virus.name].\nType: [M.virus.spread].\nStage: [M.virus.stage]/[M.virus.max_stages].\nPossible Cure: [M.virus.cure]"))
+ for(var/datum/disease/D in M.viruses)
+ user.show_message(text("\red Warning: Virus Detected\nName: [D.name].\nType: [D.spread].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure]"))
if (M.reagents && M.reagents.get_reagent_amount("inaprovaline"))
user.show_message(text("\blue Bloodstream Analysis located [M.reagents:get_reagent_amount("inaprovaline")] units of rejuvenation chemicals."), 1)
if (M.brainloss >= 100 || istype(M, /mob/living/carbon/human) && M:brain_op_stage == 4.0)
diff --git a/code/game/objects/gibs.dm b/code/game/objects/gibs.dm
index 602824f7b54..9a2506cb5ac 100644
--- a/code/game/objects/gibs.dm
+++ b/code/game/objects/gibs.dm
@@ -1,13 +1,13 @@
//HUMANS
-/proc/gibs(atom/location, var/datum/disease/virus)
- new /obj/gibspawner/human(get_turf(location),virus)
+/proc/gibs(atom/location, var/list/viruses)
+ new /obj/gibspawner/human(get_turf(location),viruses)
-/proc/xgibs(atom/location, var/datum/disease/virus)
- new /obj/gibspawner/xeno(get_turf(location),virus)
+/proc/xgibs(atom/location, var/list/viruses)
+ new /obj/gibspawner/xeno(get_turf(location),viruses)
-/proc/robogibs(atom/location, var/datum/disease/virus)
- new /obj/gibspawner/robot(get_turf(location),virus)
+/proc/robogibs(atom/location, var/list/viruses)
+ new /obj/gibspawner/robot(get_turf(location),viruses)
/obj/gibspawner
var/sparks = 0 //whether sparks spread on Gib()
@@ -16,20 +16,21 @@
var/list/gibamounts = list()
var/list/gibdirections = list() //of lists
- New(location, var/datum/disease/virus = null)
+ New(location, var/list/viruses)
..()
if(istype(loc,/turf)) //basically if a badmin spawns it
- Gib(loc,virus)
+ Gib(loc,viruses)
- proc/Gib(atom/location, var/datum/disease/virus = null)
+ proc/Gib(atom/location, var/list/viruses = list())
if(gibtypes.len != gibamounts.len || gibamounts.len != gibdirections.len)
world << "\red Gib list length mismatch!"
return
var/obj/decal/cleanable/blood/gibs/gib = null
- if(virus && virus.spread_type == SPECIAL)
- virus = null
+ for(var/datum/disease/D in viruses)
+ if(D.spread_type == SPECIAL)
+ del(D)
if(sparks)
var/datum/effects/system/spark_spread/s = new /datum/effects/system/spark_spread
@@ -41,13 +42,17 @@
for(var/j = 1, j<= gibamounts[i], j++)
var/gibType = gibtypes[i]
gib = new gibType(location)
- if(virus && prob(virusProb))
- gib.virus = new virus.type
- gib.virus.holder = gib
- gib.virus.spread_type = CONTACT_FEET
- var/list/directions = gibdirections[i]
- if(directions.len)
- gib.streak(directions)
+
+ if(viruses.len > 0)
+ for(var/datum/disease/D in viruses)
+ if(prob(virusProb))
+ var/datum/disease/viruus = new D.type
+ gib.viruses += viruus
+ viruus.holder = gib
+ viruus.spread_type = CONTACT_FEET
+ var/list/directions = gibdirections[i]
+ if(directions.len)
+ gib.streak(directions)
del(src)
diff --git a/code/game/vials.dm b/code/game/vials.dm
index 7a83d669306..0612694ad5a 100644
--- a/code/game/vials.dm
+++ b/code/game/vials.dm
@@ -90,11 +90,11 @@
O2.icon = 'objects.dmi'
O2.icon_state = "shards"
for(var/mob/living/carbon/human/H in view(5, sourceloc))
- if(!H.virus) H.contract_disease(new /datum/disease/gbs,1)
+ H.contract_disease(new /datum/disease/gbs,1)
var/i
for(i=0, i<5, i++)
for(var/mob/living/carbon/human/H in view(5, sourceloc))
- if(!H.virus) H.contract_disease(new /datum/disease/gbs,1)
+ H.contract_disease(new /datum/disease/gbs,1)
sleep(20)
flick("greenshatter2",O)
O.icon_state = "nothing"
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 58a4ac28fbc..653c9222da1 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -2163,10 +2163,12 @@ var/showadminmessages = 1
if (ticker.mode.config_tag == "changeling")
return 2
return 1
- if(istype(M.virus, /datum/disease/jungle_fever))
- if (ticker.mode.config_tag == "monkey")
- return 2
- return 1
+
+ for(var/datum/disease/D in M.viruses)
+ if(istype(D, /datum/disease/jungle_fever))
+ if (ticker.mode.config_tag == "monkey")
+ return 2
+ return 1
if(isrobot(M))
var/mob/living/silicon/robot/R = M
if(R.emagged)
diff --git a/code/modules/admin/verbs/modifyvariables.dm b/code/modules/admin/verbs/modifyvariables.dm
index f06a88148ed..d9b972fb6e4 100644
--- a/code/modules/admin/verbs/modifyvariables.dm
+++ b/code/modules/admin/verbs/modifyvariables.dm
@@ -96,7 +96,7 @@
/client/proc/mod_list(var/list/L)
if(!istype(L,/list)) src << "Not a List."
- var/list/locked = list("vars", "key", "ckey", "client", "firemut", "ishulk", "telekinesis", "xray", "virus", "cuffed", "ka", "last_eaten", "urine", "poo", "icon", "icon_state")
+ var/list/locked = list("vars", "key", "ckey", "client", "firemut", "ishulk", "telekinesis", "xray", "virus", "viruses", "cuffed", "ka", "last_eaten", "urine", "poo", "icon", "icon_state")
var/list/names = sortList(L)
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 176ce1dc092..1c105a0ee5b 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -725,8 +725,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
message_admins("[key_name_admin(usr)] has gibbed [key_name_admin(M)]", 1)
if (istype(M, /mob/dead/observer))
- var/virus = M.virus
- gibs(M.loc, virus)
+ gibs(M.loc, M.viruses)
return
M.gib()
diff --git a/code/modules/food/food.dm b/code/modules/food/food.dm
index f7a910396c3..3f5701713c7 100644
--- a/code/modules/food/food.dm
+++ b/code/modules/food/food.dm
@@ -255,7 +255,7 @@
..()
/*
var/datum/disease/F = new /datum/disease/pierrot_throat(0)
- var/list/data = list("virus"= F)
+ var/list/data = list("viruses"= list(F))
reagents.add_reagent("blood", 4, data)
*/
reagents.add_reagent("nutriment", 6)
diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
index bbe91fd9f73..6821cf25746 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
@@ -154,7 +154,7 @@
return
else if (stat == 2 && !client)
- gibs(loc, virus)
+ gibs(loc, viruses)
del(src)
return
diff --git a/code/modules/mob/living/carbon/alien/humanoid/life_new.dm b/code/modules/mob/living/carbon/alien/humanoid/life_new.dm
index b1ba118cc8b..b1419fd787c 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/life_new.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/life_new.dm
@@ -533,8 +533,9 @@
return 1
handle_virus_updates()
- if(src.bodytemperature > 406 && src.virus)
- src.virus.cure()
+ if(src.bodytemperature > 406)
+ for(var/datum/disease/D in viruses)
+ D.cure()
return
check_if_buckled()
diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm
index 51015fe505f..a647333b3f5 100644
--- a/code/modules/mob/living/carbon/alien/larva/larva.dm
+++ b/code/modules/mob/living/carbon/alien/larva/larva.dm
@@ -139,7 +139,7 @@
return
else if (stat == 2 && !client)
- gibs(loc, virus)
+ gibs(loc, viruses)
del(src)
return
diff --git a/code/modules/mob/living/carbon/alien/larva/life.dm b/code/modules/mob/living/carbon/alien/larva/life.dm
index b1db79631e8..a2c0fcadb31 100644
--- a/code/modules/mob/living/carbon/alien/larva/life.dm
+++ b/code/modules/mob/living/carbon/alien/larva/life.dm
@@ -465,8 +465,9 @@
return
handle_virus_updates()
- if(bodytemperature > 406 && virus)
- virus.cure()
+ if(bodytemperature > 406)
+ for(var/datum/disease/D in viruses)
+ D.cure()
return
check_if_buckled()
diff --git a/code/modules/mob/living/carbon/brain/life.dm b/code/modules/mob/living/carbon/brain/life.dm
index c9aa52d62b6..2ec526d911d 100644
--- a/code/modules/mob/living/carbon/brain/life.dm
+++ b/code/modules/mob/living/carbon/brain/life.dm
@@ -295,6 +295,7 @@
return 1
handle_virus_updates()
- if(bodytemperature > 406 && virus)
- virus.cure()
+ if(bodytemperature > 409)
+ for(var/datum/disease/D in viruses)
+ D.cure()
return
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 4fa6993adbd..f8d7e1f1d96 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -47,6 +47,24 @@
/mob/living/carbon/attack_hand(mob/M as mob)
if(!istype(M, /mob/living/carbon)) return
+
+ for(var/datum/disease/D in viruses)
+ var/s_spread_type
+ if(D.spread_type!=SPECIAL && D.spread_type!=AIRBORNE)
+ s_spread_type = D.spread_type
+ D.spread_type = CONTACT_HANDS
+ M.contract_disease(D)
+ D.spread_type = s_spread_type
+
+ for(var/datum/disease/D in M.viruses)
+ var/s_spread_type
+ if(D.spread_type!=SPECIAL && D.spread_type!=AIRBORNE)
+ s_spread_type = D.spread_type
+ D.spread_type = CONTACT_HANDS
+ contract_disease(D)
+ D.spread_type = s_spread_type
+
+ /* // old code: doesn't support multiple viruses
if(src.virus || M.virus)
var/s_spread_type
if(src.virus && src.virus.spread_type!=SPECIAL && src.virus.spread_type!=AIRBORNE)
@@ -60,11 +78,32 @@
M.virus.spread_type = CONTACT_GENERAL
src.contract_disease(M.virus)
M.virus.spread_type = s_spread_type
+ */
return
/mob/living/carbon/attack_paw(mob/M as mob)
if(!istype(M, /mob/living/carbon)) return
+
+
+ for(var/datum/disease/D in viruses)
+ var/s_spread_type
+ if(D.spread_type!=SPECIAL && D.spread_type!=AIRBORNE)
+ s_spread_type = D.spread_type
+ D.spread_type = CONTACT_HANDS
+ M.contract_disease(D)
+ D.spread_type = s_spread_type
+
+ for(var/datum/disease/D in M.viruses)
+ var/s_spread_type
+ if(D.spread_type!=SPECIAL && D.spread_type!=AIRBORNE)
+ s_spread_type = D.spread_type
+ D.spread_type = CONTACT_HANDS
+ contract_disease(D)
+ D.spread_type = s_spread_type
+
+ /*
+
if(src.virus || M.virus)
var/s_spread_type
if(src.virus && src.virus.spread_type!=SPECIAL && src.virus.spread_type!=AIRBORNE)
@@ -78,6 +117,7 @@
M.virus.spread_type = CONTACT_GENERAL
src.contract_disease(M.virus)
M.virus.spread_type = s_spread_type
+ */
return
/mob/living/carbon/electrocute_act(var/shock_damage, var/obj/source, var/siemens_coeff = 1.0)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index dca353c1c78..291b6767ce1 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -459,7 +459,7 @@
return
else if (stat == 2 && !client)
- gibs(loc, virus)
+ gibs(loc, viruses)
del(src)
return
@@ -1440,11 +1440,13 @@
else
UpdateDamage()
updatehealth()
- if(istype(M.virus, /datum/disease/jungle_fever))
- var/mob/living/carbon/human/H = src
- src = null
- src = H.monkeyize()
- contract_disease(M.virus,1,0)
+
+ for(var/datum/disease/D in M.viruses)
+ if(istype(D, /datum/disease/jungle_fever))
+ var/mob/living/carbon/human/H = src
+ src = null
+ src = H.monkeyize()
+ contract_disease(D,1,0)
return
@@ -1493,11 +1495,13 @@
else
UpdateDamage()
updatehealth()
- if(istype(M.virus, /datum/disease/jungle_fever))
- var/mob/living/carbon/human/H = src
- src = null
- src = H.monkeyize()
- contract_disease(M.virus,1,0)
+
+ for(var/datum/disease/D in M.viruses)
+ if(istype(D, /datum/disease/jungle_fever))
+ var/mob/living/carbon/human/H = src
+ src = null
+ src = H.monkeyize()
+ contract_disease(D,1,0)
return
/mob/living/carbon/human/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index fe424727027..4003c59c236 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -838,14 +838,20 @@
see_invisible = 0
else if (istype(glasses, /obj/item/clothing/glasses/hud/health))
if(client)
+
var/icon/tempHud = 'hud.dmi'
for(var/mob/living/carbon/human/patient in view(src))
+
+ var/foundVirus = 0
+ for(var/datum/disease/D in patient.viruses)
+ foundVirus++
+
client.images += image(tempHud,patient,"hud[RoundHealth(patient.health)]")
if(patient.stat == 2)
client.images += image(tempHud,patient,"huddead")
else if(patient.alien_egg_flag)
client.images += image(tempHud,patient,"hudxeno")
- else if(patient.virus)
+ else if(foundVirus)
client.images += image(tempHud,patient,"hudill")
else
client.images += image(tempHud,patient,"hudhealthy")
@@ -986,8 +992,9 @@
return
handle_virus_updates()
- if(bodytemperature > 406 && virus)
- virus.cure()
+ if(bodytemperature > 406)
+ for(var/datum/disease/D in viruses)
+ D.cure()
return
diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm
index ad7e2cc2de9..816eb80bb5c 100644
--- a/code/modules/mob/living/carbon/human/say.dm
+++ b/code/modules/mob/living/carbon/human/say.dm
@@ -12,18 +12,21 @@
var/imax = rand(5,20)
for(var/i = 0,i 406 && src.virus)
- src.virus.cure()
+ if(src.bodytemperature > 406)
+ for(var/datum/disease/D in viruses)
+ D.cure()
return
check_if_buckled()
diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm
index 29abf620679..d21b1f6d7d8 100644
--- a/code/modules/mob/living/carbon/monkey/monkey.dm
+++ b/code/modules/mob/living/carbon/monkey/monkey.dm
@@ -160,8 +160,10 @@
if (mutations & HULK) damage += 10
bruteloss += damage
updatehealth()
- if(istype(M.virus, /datum/disease/jungle_fever))
- contract_disease(M.virus,1,0)
+
+ for(var/datum/disease/D in M.viruses)
+ if(istype(D, /datum/disease/jungle_fever))
+ contract_disease(D,1,0)
else
for(var/mob/O in viewers(src, null))
O.show_message(text("\red [M.name] has attempted to bite []!", src), 1)
@@ -181,8 +183,9 @@
var/damage = rand(1, 5)
bruteloss += damage
health = 100 - oxyloss - toxloss - fireloss - bruteloss
- if(istype(M.virus, /datum/disease/jungle_fever))
- contract_disease(M.virus,1,0)
+ for(var/datum/disease/D in M.viruses)
+ if(istype(D, /datum/disease/jungle_fever))
+ contract_disease(D,1,0)
else
for(var/mob/O in viewers(src, null))
O.show_message("\red [M.name] has attempted to bite [name]!", 1)
diff --git a/code/modules/mob/living/silicon/pai/hud.dm b/code/modules/mob/living/silicon/pai/hud.dm
index 0e14b958d09..68c7d593bfd 100644
--- a/code/modules/mob/living/silicon/pai/hud.dm
+++ b/code/modules/mob/living/silicon/pai/hud.dm
@@ -34,12 +34,16 @@
var/icon/tempHud = 'hud.dmi'
var/turf/T = get_turf_or_move(src.loc)
for(var/mob/living/carbon/human/patient in view(T))
+
+ var/foundVirus = 0
+ for(var/datum/disease/D in patient.viruses) foundVirus = 1
+
client.images += image(tempHud,patient,"hud[RoundHealth(patient.health)]")
if(patient.stat == 2)
client.images += image(tempHud,patient,"huddead")
else if(patient.alien_egg_flag)
client.images += image(tempHud,patient,"hudxeno")
- else if(patient.virus)
+ else if(foundVirus)
client.images += image(tempHud,patient,"hudill")
else
client.images += image(tempHud,patient,"hudhealthy")
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm
index 7d4f6e444d4..6d0302368b7 100644
--- a/code/modules/mob/living/silicon/pai/software.dm
+++ b/code/modules/mob/living/silicon/pai/software.dm
@@ -469,12 +469,12 @@
Structural Integrity: [M.bruteloss > 50 ? "" : ""][M.bruteloss]
Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)
"}
- if(M.virus)
+ for(var/datum/disease/D in M.viruses)
dat += {"Infection Detected.
- Name: [M.virus.name]
- Type: [M.virus.spread]
- Stage: [M.virus.stage]/[M.virus.max_stages]
- Possible Cure: [M.virus.cure]
+ Name: [D.name]
+ Type: [D.spread]
+ Stage: [D.stage]/[D.max_stages]
+ Possible Cure: [D.cure]
"}
dat += "Visual Status Overlay
"
return dat
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 2956ae4a459..2f30f390cfe 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -2008,8 +2008,7 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
/mob/proc/gib()
if (istype(src, /mob/dead/observer))
- var/V = virus
- gibs(loc, V)
+ gibs(loc, viruses)
return
if(!isrobot(src))//Cyborgs no-longer "die" when gibbed.
death(1)
@@ -2033,22 +2032,20 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
flick("gibbed-r", animation)
if(key)
- var/V = virus
if (istype(src, /mob/living/silicon))
- robogibs(loc, V)
+ robogibs(loc, viruses)
else if (istype(src, /mob/living/carbon/alien))
- xgibs(loc, V)
+ xgibs(loc, viruses)
else
- gibs(loc, V)
+ gibs(loc, viruses)
else
- var/V = virus
if (istype(src, /mob/living/silicon))
- robogibs(loc, V)
+ robogibs(loc, viruses)
else if (istype(src, /mob/living/carbon/alien))
- xgibs(loc, V)
+ xgibs(loc, viruses)
else
- gibs(loc, V)
+ gibs(loc, viruses)
sleep(15)
del(src)
@@ -2216,7 +2213,7 @@ note dizziness decrements automatically in the mob's Life() proc.
/client/proc/station_explosion_cinematic(var/derp)
if(!src.mob)
return
-
+
var/mob/M = src.mob
M.loc = null // HACK, but whatever, this works
diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm
index 39f78a92b8d..bf022afd819 100644
--- a/code/modules/mob/transform_procs.dm
+++ b/code/modules/mob/transform_procs.dm
@@ -30,10 +30,11 @@
//O.dna.struc_enzymes = "0983E840344C39F4B059D5145FC5785DC6406A4BB8"
O.dna.struc_enzymes = "[copytext(O.dna.struc_enzymes,1,1+3*13)]BB8"
O.loc = loc
- O.virus = virus
- virus = null
- if (O.virus)
- O.virus.affected_mob = O
+ O.viruses = viruses
+ viruses = list()
+ for(var/datum/disease/D in O.viruses)
+ D.affected_mob = O
+
if (client)
client.mob = O
if(mind)
diff --git a/code/unused/gamemodes/monkey.dm b/code/unused/gamemodes/monkey.dm
index bb0a948382b..7454928c9e2 100644
--- a/code/unused/gamemodes/monkey.dm
+++ b/code/unused/gamemodes/monkey.dm
@@ -66,11 +66,13 @@
/datum/game_mode/monkey/proc/is_important_monkey(var/mob/living/carbon/monkey/M as mob)
var/turf/T = get_turf(M)
var/area/A = get_area(M)
- return \
- M.stat!=2 && \
- istype(M.virus, /datum/disease/jungle_fever) && \
- ( T.z==1 || is_type_in_list(A, centcom_areas))
-
+ if(M.stat!=2)
+
+ for(var/datum/disease/D in M.viruses)
+ if(istype(D, /datum/disease/jungle_fever) && ( T.z==1 || is_type_in_list(A, centcom_areas)))
+ return 1
+
+
/datum/game_mode/monkey/check_win()
if (state==MONKEY_MODE_SHUTTLE_CAPTURED || state==MONKEY_MODE_SHUTTLE_WITH_HUMANS)
return
@@ -117,8 +119,9 @@
/datum/game_mode/proc/auto_declare_completion_monkey()
for(var/mob/living/carbon/monkey/monkey_player in world)
- if (istype(monkey_player.virus, /datum/disease/jungle_fever) && monkey_player.ckey)
- world << "[monkey_player.ckey] was played infested [monkey_player]. [monkey_player.stat == 2 ? "(DEAD)" : ""]"
+ for(var/datum/disease/D in monkey_player.viruses)
+ if (istype(D, /datum/disease/jungle_fever) && monkey_player.ckey)
+ world << "[monkey_player.ckey] was played infested [monkey_player]. [monkey_player.stat == 2 ? "(DEAD)" : ""]"
return 1
#undef MONKEY_MODE_RUNNING