From 960a22ee43dd56b0ad084eba9c4e124155e44f71 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Wed, 19 Jun 2013 02:28:53 +0400 Subject: [PATCH] Changes way viruses are stored in mobs. Now it's an associative list: uniqueID - virus datum Updated most instances to match it. --- code/game/gamemodes/epidemic/epidemic.dm | 7 ++++--- .../effects/decals/Cleanable/humans.dm | 2 +- code/game/turfs/simulated.dm | 6 +++--- code/modules/mob/living/carbon/human/life.dm | 16 ++++++++++----- code/modules/mob/living/carbon/monkey/life.dm | 16 ++++++++++----- code/modules/organs/blood.dm | 9 ++++----- code/modules/reagents/Chemistry-Reagents.dm | 5 +++-- code/modules/virus2/disease2.dm | 20 +++++++++++++++++-- code/modules/virus2/dishincubator.dm | 6 ++++-- code/modules/virus2/effect.dm | 2 +- code/modules/virus2/helpers.dm | 8 ++++---- code/modules/virus2/isolator.dm | 2 +- 12 files changed, 65 insertions(+), 34 deletions(-) diff --git a/code/game/gamemodes/epidemic/epidemic.dm b/code/game/gamemodes/epidemic/epidemic.dm index 5c84612dbea..6538baa8346 100644 --- a/code/game/gamemodes/epidemic/epidemic.dm +++ b/code/game/gamemodes/epidemic/epidemic.dm @@ -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 diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index e5b68088070..911a63c0e4c 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -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() diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index 92c23b472f0..6432f1bac76 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -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) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 1606b01f0c3..25707e7d733 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -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 diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm index 0d06c0b50f4..e27fe2564be 100644 --- a/code/modules/mob/living/carbon/monkey/life.dm +++ b/code/modules/mob/living/carbon/monkey/life.dm @@ -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 diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm index 20373ea2094..2dfa262fc90 100644 --- a/code/modules/organs/blood.dm +++ b/code/modules/organs/blood.dm @@ -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() diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index b247fbfbc4e..67ccb1db812 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -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 diff --git a/code/modules/virus2/disease2.dm b/code/modules/virus2/disease2.dm index 6ee3690c16e..7454ecf81ce 100644 --- a/code/modules/virus2/disease2.dm +++ b/code/modules/virus2/disease2.dm @@ -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 +*/ \ No newline at end of file diff --git a/code/modules/virus2/dishincubator.dm b/code/modules/virus2/dishincubator.dm index 7b075577bb3..c8af39777f8 100644 --- a/code/modules/virus2/dishincubator.dm +++ b/code/modules/virus2/dishincubator.dm @@ -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") diff --git a/code/modules/virus2/effect.dm b/code/modules/virus2/effect.dm index fe7e2747754..ff62376c63e 100644 --- a/code/modules/virus2/effect.dm +++ b/code/modules/virus2/effect.dm @@ -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" diff --git a/code/modules/virus2/helpers.dm b/code/modules/virus2/helpers.dm index 946bf71983b..eb3de7ace16 100644 --- a/code/modules/virus2/helpers.dm +++ b/code/modules/virus2/helpers.dm @@ -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) diff --git a/code/modules/virus2/isolator.dm b/code/modules/virus2/isolator.dm index f0ab1328866..667ab67e999 100644 --- a/code/modules/virus2/isolator.dm +++ b/code/modules/virus2/isolator.dm @@ -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)