Changes way viruses are stored in mobs.

Now it's an associative list:
uniqueID - virus datum

Updated most instances to match it.
This commit is contained in:
Chinsky
2013-06-19 02:28:53 +04:00
parent cb7daa77a6
commit 960a22ee43
12 changed files with 65 additions and 34 deletions
+4 -3
View File
@@ -124,14 +124,15 @@
for(var/i = 0, i < lethal_amount, i++)
var/mob/living/carbon/human/H = pick(crew)
if(lethal in H.virus2)
if(lethal.uniqueID in H.virus2)
i--
continue
H.virus2 += lethal.getcopy()
H.virus2["[lethal.uniqueID]"] += lethal.getcopy()
infectees += H
var/mob/living/carbon/human/patient_zero = pick(infectees)
patient_zero.virus2.stage = 3
var/datum/disease2/disease/V = patient_zero.virus2["[lethal.uniqueID]"]
V.stage = 3
cruiser_arrival = world.time + (10 * 90 * 60)
stage = 1
@@ -144,4 +144,4 @@
icon = 'blood.dmi'
icon_state = "mucus"
random_icon_states = list("mucus")
var/list/datum/disease2/disease/virus2 = null
var/list/datum/disease2/disease/virus2 = list()
+3 -3
View File
@@ -108,14 +108,14 @@
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
B.virus2 |= virus_copylist(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()
newblood.virus2 |= virus_copylist(M.virus2)
return 1 //we bloodied the floor
@@ -125,7 +125,7 @@
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()
this.virus2 = virus_copylist(M.virus2)
else if( istype(M, /mob/living/carbon/alien ))
var/obj/effect/decal/cleanable/xenoblood/this = new /obj/effect/decal/cleanable/xenoblood(src)
+11 -5
View File
@@ -1332,18 +1332,23 @@
if(bodytemperature > 406)
for(var/datum/disease/D in viruses)
D.cure()
for (var/datum/disease2/disease/V in virus2)
for (var/ID in virus2)
var/datum/disease2/disease/V = virus2[ID]
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)
for (var/ID in B.virus2)
var/datum/disease2/disease/V = virus2[ID]
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)
for (var/ID in M.virus2)
var/datum/disease2/disease/V = virus2[ID]
infect_virus2(src,V)
for (var/datum/disease2/disease/V in virus2)
for (var/ID in virus2)
var/datum/disease2/disease/V = virus2[ID]
if(isnull(V)) // Trying to figure out a runtime error that keeps repeating
CRASH("virus2 nulled before calling activate()")
else
@@ -1352,7 +1357,8 @@
if(!V) continue
// check if we're immune
if(V.antigen & src.antibodies) V.dead = 1
if(V.antigen & src.antibodies)
V.dead = 1
return
+11 -5
View File
@@ -155,18 +155,23 @@
if(bodytemperature > 406)
for(var/datum/disease/D in viruses)
D.cure()
for (var/datum/disease2/disease/V in virus2)
for (var/ID in virus2)
var/datum/disease2/disease/V = virus2[ID]
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)
for (var/ID in B.virus2)
var/datum/disease2/disease/V = virus2[ID]
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)
for (var/ID in M.virus2)
var/datum/disease2/disease/V = virus2[ID]
infect_virus2(src,V)
for (var/datum/disease2/disease/V in virus2)
for (var/ID in virus2)
var/datum/disease2/disease/V = virus2[ID]
if(isnull(V)) // Trying to figure out a runtime error that keeps repeating
CRASH("virus2 nulled before calling activate()")
else
@@ -175,7 +180,8 @@
if(!V) continue
// check if we're immune
if(V.antigen & src.antibodies) V.dead = 1
if(V.antigen & src.antibodies)
V.dead = 1
return
+4 -5
View File
@@ -163,8 +163,8 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
//set reagent data
B.data["donor"] = src
if(src.virus2)
B.data["virus2"] = src.virus2.Copy()
// B.data["virus2"] = virus_mergelist(B.data["virus2"] , src.virus2)
B.data["virus2"] |= virus_copylist(src.virus2)
B.data["antibodies"] = src.antibodies
B.data["blood_DNA"] = copytext(src.dna.unique_enzymes,1,0)
if(src.resistances && src.resistances.len)
@@ -200,9 +200,8 @@ 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 && viruses.len)
virus2 |= viruses
// src.virus2 = virus_mergelist(src.virus2 , injected.data["virus2"])
src.virus2 |= virus_copylist(injected.data["virus2"])
if (injected.data["antibodies"] && prob(5))
antibodies |= injected.data["antibodies"]
var/list/chems = list()
+3 -2
View File
@@ -930,8 +930,9 @@ datum
// radium may increase your chances to cure a disease
if(istype(M,/mob/living/carbon)) // make sure to only use it on carbon mobs
var/mob/living/carbon/C = M
if(C.virus2)
for (var/datum/disease2/disease/V in C.virus2)
if(C.virus2.len)
for (var/ID in C.virus2)
var/datum/disease2/disease/V = C.virus2[ID]
if(prob(5))
if(prob(50))
M.radiation += 50 // curing it that way may kill you instead
+18 -2
View File
@@ -33,8 +33,8 @@
/datum/disease2/disease/proc/activate(var/mob/living/carbon/mob)
if(dead)
cure(mob)
mob.virus2 -= src
return
if(mob.stat == 2)
return
if(stage <= 1 && clicks == 0) // with a certain chance, the mob may become immune to the disease before it starts properly
@@ -68,7 +68,7 @@
e.runeffect(mob,stage)
//fever
mob.bodytemperature += max(mob.bodytemperature, min(310+5*stage ,mob.bodytemperature+5*stage))
mob.bodytemperature = max(mob.bodytemperature, min(310+5*stage ,mob.bodytemperature+5*stage))
clicks+=speed
/datum/disease2/disease/proc/cure(var/mob/living/carbon/mob)
@@ -122,3 +122,19 @@
if (antigen != disease.antigen)
equal = 0
return equal
/proc/virus_copylist(var/list/datum/disease2/disease/viruses)
var/list/res = list()
for (var/ID in viruses)
var/datum/disease2/disease/V = viruses[ID]
res["[V.uniqueID]"] = V.getcopy()
return res
/*
/proc/virus_mergelist(var/list/datum/disease2/disease/viruses1, var/list/datum/disease2/disease/viruses2)
var/list/res = virus_copylist(viruses1)
for (var/ID in viruses2)
var/datum/disease2/disease/V = viruses2[ID]
if(!res["[V.uniqueID]"])
res["[V.uniqueID]"] = V.getcopy()
return res
*/
+4 -2
View File
@@ -85,8 +85,10 @@
state("\The [src.name] buzzes, \"No suitable breeding enviroment detected.\"", "blue")
return
var/list/virus = list(dish.virus2.getcopy())
B.data["virus2"] |= virus
if (!B.data["virus2"])
B.data["virus2"] = list()
var/list/virus = list("[dish.virus2.uniqueID]" = dish.virus2.getcopy())
B.data["virus2"] = virus
state("\The [src.name] pings, \"Injection complete.\"", "blue")
+1 -1
View File
@@ -334,7 +334,7 @@
mob.say("*sneeze")
if (prob(50))
var/obj/effect/decal/cleanable/mucus/M = new(get_turf(mob))
M.virus2 = get_copy_viruses(mob.virus2)
M.virus2 = virus_copylist(mob.virus2)
/datum/disease2/effect/gunck
name = "Flemmingtons"
+4 -4
View File
@@ -49,7 +49,7 @@ proc/airborne_can_reach(turf/source, turf/target)
return
if(!istype(M))
return
if (disease in M.virus2)
if ("[disease.uniqueID]" 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)
@@ -62,20 +62,20 @@ proc/airborne_can_reach(turf/source, turf/target)
var/datum/disease2/disease/D = disease.getcopy()
D.minormutate()
M.virus2 += D
M.virus2["[D.uniqueID]"] = D
//Infects mob M with random lesser disease, if he doesn't have one
/proc/infect_mob_random_lesser(var/mob/living/carbon/M)
var/datum/disease2/disease/D = new /datum/disease2/disease
D.makerandom()
D.infectionchance = 1
M.virus2 += D
M.virus2["[D.uniqueID]"] = D
//Infects mob M with random greated disease, if he doesn't have one
/proc/infect_mob_random_greater(var/mob/living/carbon/M)
var/datum/disease2/disease/D = new /datum/disease2/disease
D.makerandom(1)
M.virus2 += D
M.virus2["[D.uniqueID]"] = D
//Fancy prob() function.
/proc/dprob(var/p)
+1 -1
View File
@@ -39,7 +39,7 @@
if(B)
Blood = B
break
var/list/virus = get_copy_viruses(Blood.data["virus2"])
var/list/virus = virus_copylist(Blood.data["virus2"])
var/choice = text2num(href_list["isolate"]);
for (var/datum/disease2/disease/V in virus)
if (V.uniqueID == choice)