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