diff --git a/baystation12.dme b/baystation12.dme
index 2fd6ab43983..fe673330dc9 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -1253,7 +1253,6 @@
#include "code\modules\surgery\surgery.dm"
#include "code\modules\virus2\analyser.dm"
#include "code\modules\virus2\antibodies.dm"
-#include "code\modules\virus2\base.dm"
#include "code\modules\virus2\curer.dm"
#include "code\modules\virus2\disease2.dm"
#include "code\modules\virus2\diseasesplicer.dm"
diff --git a/code/game/gamemodes/epidemic/epidemic.dm b/code/game/gamemodes/epidemic/epidemic.dm
index 0d4a20ff2fe..5c84612dbea 100644
--- a/code/game/gamemodes/epidemic/epidemic.dm
+++ b/code/game/gamemodes/epidemic/epidemic.dm
@@ -124,10 +124,10 @@
for(var/i = 0, i < lethal_amount, i++)
var/mob/living/carbon/human/H = pick(crew)
- if(H.virus2)
+ if(lethal in H.virus2)
i--
continue
- H.virus2 = lethal.getcopy()
+ H.virus2 += lethal.getcopy()
infectees += H
var/mob/living/carbon/human/patient_zero = pick(infectees)
@@ -169,7 +169,7 @@
var/sick = 0
for(var/mob/living/carbon/human/H in world)
if(H.key && H.stat != 2) alive++
- if(H.virus2 && H.stat != 2) sick++
+ if(H.virus2.len && H.stat != 2) sick++
if(alive == 0)
finished = 2
diff --git a/code/game/gamemodes/events/VirusEpidemic.dm b/code/game/gamemodes/events/VirusEpidemic.dm
index 72c7b912039..f44b631a207 100644
--- a/code/game/gamemodes/events/VirusEpidemic.dm
+++ b/code/game/gamemodes/events/VirusEpidemic.dm
@@ -8,7 +8,7 @@
Announce()
if(!virus)
for(var/mob/living/carbon/human/H in world)
- if((H.virus2) || (H.stat == 2) || prob(30))
+ if((H.virus2.len) || (H.stat == 2) || prob(30))
continue
if(prob(100)) // no lethal diseases outside virus mode!
infect_mob_random_lesser(H)
diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm
index 85248f5dc60..10442ca623d 100644
--- a/code/game/machinery/adv_med.dm
+++ b/code/game/machinery/adv_med.dm
@@ -235,7 +235,7 @@
else
dat += text("[]\tHealth %: [] ([])
", (occupant.health > 50 ? "" : ""), occupant.health, t1)
- if(occupant.virus2)
+ if(occupant.virus2.len)
dat += text("Viral pathogen detected in blood stream.
")
dat += text("[]\t-Brute Damage %: []
", (occupant.getBruteLoss() < 60 ? "" : ""), occupant.getBruteLoss())
diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm
index 172eca9ae97..e5b68088070 100644
--- a/code/game/objects/effects/decals/Cleanable/humans.dm
+++ b/code/game/objects/effects/decals/Cleanable/humans.dm
@@ -11,7 +11,7 @@
random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7")
var/list/viruses = list()
blood_DNA = list()
- var/datum/disease2/disease/virus2 = null
+ var/list/datum/disease2/disease/virus2 = list()
var/amount = 5
/obj/effect/decal/cleanable/blood/Del()
@@ -144,4 +144,4 @@
icon = 'blood.dmi'
icon_state = "mucus"
random_icon_states = list("mucus")
- var/datum/disease2/disease/virus2 = null
+ var/list/datum/disease2/disease/virus2 = null
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index f86f38cc83a..0ceeb674116 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -129,7 +129,7 @@ MASS SPECTROMETER
if (istype(M, /mob/living/carbon))
if(M:reagents.total_volume > 0)
user.show_message(text("\red Warning: Unknown substance detected in subject's blood."))
- if(M:virus2)
+ if(M:virus2.len)
user.show_message(text("\red Warning: Unknown pathogen detected in subject's blood."))
if (M.getCloneLoss())
user.show_message("\red Subject appears to have been imperfectly cloned.")
diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm
index 16d88a0ea0b..92c23b472f0 100644
--- a/code/game/turfs/simulated.dm
+++ b/code/game/turfs/simulated.dm
@@ -107,11 +107,15 @@
for(var/obj/effect/decal/cleanable/blood/B in contents)
if(!B.blood_DNA[M.dna.unique_enzymes])
B.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type
+ if (M.virus2.len)
+ B.virus2 |= M.virus2
return 1 //we bloodied the floor
//if there isn't a blood decal already, make one.
var/obj/effect/decal/cleanable/blood/newblood = new /obj/effect/decal/cleanable/blood(src)
newblood.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type
+ if (M.virus2.len)
+ newblood.virus2 = M.virus2.Copy()
return 1 //we bloodied the floor
@@ -120,6 +124,8 @@
if( istype(M, /mob/living/carbon/monkey) || istype(M, /mob/living/carbon/human))
var/obj/effect/decal/cleanable/blood/this = new /obj/effect/decal/cleanable/blood(src)
this.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type
+ if (M.virus2.len)
+ this.virus2 = M.virus2.Copy()
else if( istype(M, /mob/living/carbon/alien ))
var/obj/effect/decal/cleanable/xenoblood/this = new /obj/effect/decal/cleanable/xenoblood(src)
diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm
index 2ea08f56a48..0240cfdc62e 100644
--- a/code/modules/mob/living/carbon/carbon_defines.dm
+++ b/code/modules/mob/living/carbon/carbon_defines.dm
@@ -2,8 +2,7 @@
gender = MALE
var/list/stomach_contents = list()
var/brain_op_stage = 0.0
- var/datum/disease2/disease/virus2 = null
- var/list/datum/disease2/disease/resistances2 = list()
+ var/list/datum/disease2/disease/virus2 = list()
var/antibodies = 0
var/silent = null //Can't talk. Value goes down every life proc.
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index be07fcba530..07396a3996a 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -1326,28 +1326,29 @@
if(bodytemperature > 406)
for(var/datum/disease/D in viruses)
D.cure()
- if(virus2) virus2.cure(src)
- if(!virus2)
- for(var/obj/effect/decal/cleanable/blood/B in view(1,src))
- if(B.virus2 && get_infection_chance())
- infect_virus2(src,B.virus2)
- for(var/obj/effect/decal/cleanable/mucus/M in view(1,src))
- if(M.virus2 && get_infection_chance())
- infect_virus2(src,M.virus2)
- else
- if(isnull(virus2)) // Trying to figure out a runtime error that keeps repeating
+ for (var/datum/disease2/disease/V in virus2)
+ V.cure(src)
+ for(var/obj/effect/decal/cleanable/blood/B in view(1,src))
+ if(B.virus2.len && get_infection_chance(src))
+ for (var/datum/disease2/disease/V in B.virus2)
+ infect_virus2(src,V)
+ for(var/obj/effect/decal/cleanable/mucus/M in view(1,src))
+ if(M.virus2.len && get_infection_chance(src))
+ for (var/datum/disease2/disease/V in M.virus2)
+ infect_virus2(src,V)
+
+ for (var/datum/disease2/disease/V in virus2)
+ if(isnull(V)) // Trying to figure out a runtime error that keeps repeating
CRASH("virus2 nulled before calling activate()")
else
- virus2.activate(src)
-
+ V.activate(src)
// activate may have deleted the virus
- if(!virus2) return
+ if(!V) continue
// check if we're immune
- if(virus2.antigen & src.antibodies) virus2.dead = 1
+ if(V.antigen & src.antibodies) V.dead = 1
-
- return
+ return
proc/handle_stomach()
spawn(0)
diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm
index 45e57a3da77..1d4c4912dd0 100644
--- a/code/modules/mob/living/carbon/monkey/life.dm
+++ b/code/modules/mob/living/carbon/monkey/life.dm
@@ -150,28 +150,34 @@
emote("gasp")
updatehealth()
- proc/handle_virus_updates()//copypaste from mob/carbon/human/life.dm
+ proc/handle_virus_updates()
+ if(status_flags & GODMODE) return 0 //godmode
if(bodytemperature > 406)
for(var/datum/disease/D in viruses)
D.cure()
- if(!virus2)
- for(var/obj/effect/decal/cleanable/blood/B in view(1,src))
- if(B.virus2 && get_infection_chance())
- infect_virus2(src,B.virus2)
- for(var/obj/effect/decal/cleanable/mucus/M in view(1,src))
- if(M.virus2 && get_infection_chance())
- infect_virus2(src,M.virus2)
- else
- if(isnull(virus2)) // Trying to figure out a runtime error that keeps repeating
+ for (var/datum/disease2/disease/V in virus2)
+ V.cure(src)
+ for(var/obj/effect/decal/cleanable/blood/B in view(1,src))
+ if(B.virus2.len && get_infection_chance(src))
+ for (var/datum/disease2/disease/V in B.virus2)
+ infect_virus2(src,V)
+ for(var/obj/effect/decal/cleanable/mucus/M in view(1,src))
+ if(M.virus2.len && get_infection_chance(src))
+ for (var/datum/disease2/disease/V in M.virus2)
+ infect_virus2(src,V)
+
+ for (var/datum/disease2/disease/V in virus2)
+ if(isnull(V)) // Trying to figure out a runtime error that keeps repeating
CRASH("virus2 nulled before calling activate()")
else
- virus2.activate(src)
-
+ V.activate(src)
// activate may have deleted the virus
- if(!virus2) return
+ if(!V) continue
// check if we're immune
- if(virus2.antigen & src.antibodies) virus2.dead = 1
+ if(V.antigen & src.antibodies) V.dead = 1
+
+ return
proc/breathe()
if(reagents)
diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm
index 882582e4a35..227fbcd5a6b 100644
--- a/code/modules/organs/blood.dm
+++ b/code/modules/organs/blood.dm
@@ -164,7 +164,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
//set reagent data
B.data["donor"] = src
if(src.virus2)
- B.data["virus2"] = src.virus2.getcopy()
+ B.data["virus2"] = src.virus2.Copy()
B.data["antibodies"] = src.antibodies
B.data["blood_DNA"] = copytext(src.dna.unique_enzymes,1,0)
if(src.resistances && src.resistances.len)
@@ -200,7 +200,11 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
else
vessel.add_reagent("blood", amount, injected.data)
vessel.update_total()
-
+ var/list/viruses = injected.data["virus2"]
+ if (viruses.len)
+ virus2 |= viruses
+ if (injected.data["antibodies"] && prob(5))
+ antibodies |= injected.data["antibodies"]
var/list/chems = list()
chems = params2list(injected.data["trace_chem"])
for(var/C in chems)
diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm
index 55c255d42dd..b247fbfbc4e 100644
--- a/code/modules/reagents/Chemistry-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents.dm
@@ -929,11 +929,14 @@ datum
M.apply_effect(2*REM,IRRADIATE,0)
// radium may increase your chances to cure a disease
if(istype(M,/mob/living/carbon)) // make sure to only use it on carbon mobs
- if(M:virus2 && prob(5))
- if(prob(50))
- M.radiation += 50 // curing it that way may kill you instead
- M.adjustToxLoss(100)
- M:antibodies |= M:virus2.antigen
+ var/mob/living/carbon/C = M
+ if(C.virus2)
+ for (var/datum/disease2/disease/V in C.virus2)
+ if(prob(5))
+ if(prob(50))
+ M.radiation += 50 // curing it that way may kill you instead
+ M.adjustToxLoss(100)
+ M:antibodies |= V.antigen
..()
return
diff --git a/code/modules/virus2/disease2.dm b/code/modules/virus2/disease2.dm
index a9a8e6e45d9..cc27e5a1257 100644
--- a/code/modules/virus2/disease2.dm
+++ b/code/modules/virus2/disease2.dm
@@ -9,39 +9,19 @@
var/uniqueID = 0
var/list/datum/disease2/effectholder/effects = list()
var/antigen = 0 // 16 bits describing the antigens, when one bit is set, a cure with that bit can dock here
+ var/max_stage = 4
/datum/disease2/disease/proc/makerandom(var/greater=0)
- var/datum/disease2/effectholder/holder = new /datum/disease2/effectholder
- holder.stage = 1
- if(greater)
- holder.getrandomeffect_greater()
- else
- holder.getrandomeffect_lesser()
- effects += holder
- holder = new /datum/disease2/effectholder
- holder.stage = 2
- if(greater)
- holder.getrandomeffect_greater()
- else
- holder.getrandomeffect_lesser()
- effects += holder
- holder = new /datum/disease2/effectholder
- holder.stage = 3
- if(greater)
- holder.getrandomeffect_greater()
- else
- holder.getrandomeffect_lesser()
- effects += holder
- holder = new /datum/disease2/effectholder
- holder.stage = 4
- if(greater)
- holder.getrandomeffect_greater()
- else
- holder.getrandomeffect_lesser()
- effects += holder
+ for(var/i=1 ; i <= max_stage ; i++ )
+ var/datum/disease2/effectholder/holder = new /datum/disease2/effectholder
+ holder.stage = i
+ if(greater)
+ holder.getrandomeffect_greater()
+ else
+ holder.getrandomeffect_lesser()
+ effects += holder
uniqueID = rand(0,10000)
infectionchance = rand(1,10)
- // pick 2 antigens
antigen |= text2num(pick(ANTIGENS))
antigen |= text2num(pick(ANTIGENS))
spreadtype = "Airborne"
@@ -49,12 +29,11 @@
/datum/disease2/disease/proc/activate(var/mob/living/carbon/mob)
if(dead)
cure(mob)
- mob.virus2 = null
+ mob.virus2 -= src
return
if(mob.stat == 2)
return
- // with a certain chance, the mob may become immune to the disease before it starts properly
- if(stage <= 1 && clicks == 0)
+ if(stage <= 1 && clicks == 0) // with a certain chance, the mob may become immune to the disease before it starts properly
if(prob(20))
mob.antibodies |= antigen // 20% immunity is a good chance IMO, because it allows finding an immune person easily
else
@@ -67,10 +46,10 @@
mob.reagents.remove_reagent("virusfood",0.1)
clicks += 10
if(clicks > stage*100 && prob(10))
- if(stage == 4)
+ if(stage == max_stage)
src.cure(mob)
mob.antibodies |= src.antigen
- mob.virus2 = null
+ mob.virus2 -= src
del src
stage++
clicks = 0
@@ -79,19 +58,8 @@
clicks+=speed
/datum/disease2/disease/proc/cure(var/mob/living/carbon/mob)
- var/datum/disease2/effectholder/E
- if(stage>1)
- E = effects[1]
- E.effect.deactivate(mob)
- if(stage>2)
- E = effects[2]
- E.effect.deactivate(mob)
- if(stage>3)
- E = effects[3]
- E.effect.deactivate(mob)
- if(stage>4)
- E = effects[4]
- E.effect.deactivate(mob)
+ for(var/datum/disease2/effectholder/e in effects)
+ e.effect.deactivate(mob)
/datum/disease2/disease/proc/minormutate()
var/datum/disease2/effectholder/holder = pick(effects)
diff --git a/code/modules/virus2/effect.dm b/code/modules/virus2/effect.dm
index 848e253b545..4b8c103426d 100644
--- a/code/modules/virus2/effect.dm
+++ b/code/modules/virus2/effect.dm
@@ -37,6 +37,7 @@
chance = rand(0,effect.chance_maxm)
if(2)
multiplier = rand(1,effect.maxm)
+
/datum/disease2/effectholder/proc/majormutate()
getrandomeffect_greater()
@@ -76,7 +77,7 @@
maxm = 3
activate(var/mob/living/carbon/mob,var/multiplier)
mob.radiation += (2*multiplier)
-
+u
/datum/disease2/effect/greater/toxins
name = "Hyperacid Syndrome"
stage = 3
@@ -134,6 +135,9 @@
stage = 1
activate(var/mob/living/carbon/mob,var/multiplier)
mob.say("*sneeze")
+ if (prob(50))
+ var/obj/effect/decal/cleanable/mucus/M = new(get_turf(mob))
+ M.virus2 = mob.virus2.Copy()
/datum/disease2/effect/greater/gunck
name = "Flemmingtons"
diff --git a/code/modules/virus2/helpers.dm b/code/modules/virus2/helpers.dm
index 17e98f8447d..946bf71983b 100644
--- a/code/modules/virus2/helpers.dm
+++ b/code/modules/virus2/helpers.dm
@@ -29,7 +29,6 @@ proc/get_infection_chance(var/mob/living/carbon/M)
return 0
else if(score == 5 && prob(35))
return 0
-
return 1
//Checks if table-passing table can reach target (5 tile radius)
@@ -46,37 +45,37 @@ proc/airborne_can_reach(turf/source, turf/target)
//Attemptes to infect mob M with virus. Set forced to 1 to ignore protective clothnig
/proc/infect_virus2(var/mob/living/carbon/M,var/datum/disease2/disease/disease,var/forced = 0)
- if(M.virus2)
+ if(!istype(disease))
return
- if(!disease)
+ if(!istype(M))
+ return
+ if (disease in M.virus2)
return
-
// if one of the antibodies in the mob's body matches one of the disease's antigens, don't infect
- if(M.antibodies & disease.antigen != 0) return
+ if(M.antibodies & disease.antigen != 0)
+ return
if(prob(disease.infectionchance) || forced)
- if(M.virus2)
+ // certain clothes can prevent an infection
+ if(!forced && !get_infection_chance(M))
return
- else
- // certain clothes can prevent an infection
- if(!forced && !M.get_infection_chance())
- return
- M.virus2 = disease.getcopy()
- M.virus2.minormutate()
+ var/datum/disease2/disease/D = disease.getcopy()
+ D.minormutate()
+ M.virus2 += D
//Infects mob M with random lesser disease, if he doesn't have one
/proc/infect_mob_random_lesser(var/mob/living/carbon/M)
- if(!M.virus2)
- M.virus2 = new /datum/disease2/disease
- M.virus2.makerandom()
- M.virus2.infectionchance = 1
+ var/datum/disease2/disease/D = new /datum/disease2/disease
+ D.makerandom()
+ D.infectionchance = 1
+ M.virus2 += D
//Infects mob M with random greated disease, if he doesn't have one
/proc/infect_mob_random_greater(var/mob/living/carbon/M)
- if(!M.virus2)
- M.virus2 = new /datum/disease2/disease
- M.virus2.makerandom(1)
+ var/datum/disease2/disease/D = new /datum/disease2/disease
+ D.makerandom(1)
+ M.virus2 += D
//Fancy prob() function.
/proc/dprob(var/p)
diff --git a/code/modules/virus2/items_devices.dm b/code/modules/virus2/items_devices.dm
index c5449ae7497..75a33ef5c86 100644
--- a/code/modules/virus2/items_devices.dm
+++ b/code/modules/virus2/items_devices.dm
@@ -53,9 +53,9 @@
if(prob(50))
user << "The dish shatters"
if(virus2.infectionchance > 0)
- for(var/mob/living/carbon/target in view(null, src)) if(!target.virus2)
+ for(var/mob/living/carbon/target in view(null, src))
if(airborne_can_reach(src.loc, target.loc))
- if(target.get_infection_chance())
+ if(get_infection_chance(target))
infect_virus2(target,src.virus2)
del src