diff --git a/code/defines/mob/living/carbon/carbon.dm b/code/defines/mob/living/carbon/carbon.dm index aab5d4ee6b5..18a626647f7 100644 --- a/code/defines/mob/living/carbon/carbon.dm +++ b/code/defines/mob/living/carbon/carbon.dm @@ -7,4 +7,5 @@ var/appendix_op_stage = 0.0 var/datum/disease2/disease/virus2 = null - var/list/datum/disease2/disease/resistances2 = list() \ No newline at end of file + var/list/datum/disease2/disease/resistances2 = list() + var/antibodies = 0 \ No newline at end of file diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 5e114f35d71..a1f938e4cde 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -1441,14 +1441,24 @@ message_admins("[key_name_admin(usr)] broke all lights", 1) lightsout(0,0) if("virus") - if(alert("Do you want this to be a random disease or do you have something in mind?",,"Random","Choose")=="Random") + var/answer = alert("Do you want this to be a random disease or do you have something in mind?",,"Virus2","Random","Choose") + if(answer=="Random") viral_outbreak() message_admins("[key_name_admin(usr)] has triggered a virus outbreak", 1) - else + else if(answer == "Choose") var/list/viruses = list("fake gbs","gbs","magnitis","wizarditis",/*"beesease",*/"brain rot","cold","retrovirus","flu","pierrot's throat","rhumba beat") var/V = input("Choose the virus to spread", "BIOHAZARD") in viruses viral_outbreak(V) message_admins("[key_name_admin(usr)] has triggered a virus outbreak of [V]", 1) + else + var/lesser = (alert("Do you want to infect the mob with a major or minor disease?",,"Major","Minor") == "Minor") + var/mob/living/carbon/victim = input("Select a mob to infect", "Virus2") as null|mob in world + if(!istype(victim)) return + if(lesser) + infect_mob_random_lesser(victim) + else + infect_mob_random_greater(victim) + message_admins("[key_name_admin(usr)] has infected [victim] with a [lesser ? "minor" : "major"] virus2.", 1) if("retardify") if (src.rank in list("Badmin", "Game Admin", "Game Master")) for(var/mob/living/carbon/human/H in world) diff --git a/code/modules/chemical/Chemistry-Reagents.dm b/code/modules/chemical/Chemistry-Reagents.dm index f9ba28f7955..cd6014facf5 100644 --- a/code/modules/chemical/Chemistry-Reagents.dm +++ b/code/modules/chemical/Chemistry-Reagents.dm @@ -96,7 +96,7 @@ datum blood - data = new/list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"virus2"=null) + data = new/list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"virus2"=null,"antibodies"=0) name = "Blood" id = "blood" reagent_state = LIQUID @@ -119,6 +119,15 @@ datum else infect_virus2(M,self.data["virus2"],1) + if(istype(M,/mob/living/carbon)) + // add the host's antibodies to their blood + self.data["antibodies"] |= M:antibodies + + // check if the blood has antibodies that cure our disease + if(self.data["antibodies"] & M:virus2.antigen) if(prob(10)) + M:virus2.dead = 1 + + /* if(self.data["virus"]) var/datum/disease/V = self.data["virus"] diff --git a/code/modules/chemical/Chemistry-Tools.dm b/code/modules/chemical/Chemistry-Tools.dm index 88231c0d8c0..a6bae31c618 100644 --- a/code/modules/chemical/Chemistry-Tools.dm +++ b/code/modules/chemical/Chemistry-Tools.dm @@ -935,9 +935,9 @@ B.data["viruses"] += new D.type - if(B.data["virus2"]) - if(T.virus2) - B.data["virus2"] = T.virus2.getcopy() + // not sure why it was checking if(B.data["virus2"]), but it seemed wrong + if(T.virus2) + B.data["virus2"] = T.virus2.getcopy() B.data["blood_DNA"] = copytext(T.dna.unique_enzymes,1,0) if(T.resistances&&T.resistances.len) @@ -950,6 +950,7 @@ temp_chem += R.name temp_chem[R.name] = R.volume B.data["trace_chem"] = list2params(temp_chem) + B.data["antibodies"] = T.antibodies //debug //for(var/D in B.data) // world << "Data [D] = [B.data[D]]" diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index cd715e4236a..3da6a461a38 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -994,15 +994,28 @@ if(!virus2) - for(var/mob/living/carbon/M in oviewers(4,src)) + // the following is silly since it lets you infect people through glass + /*for(var/mob/living/carbon/M in oviewers(4,src)) if(M.virus2) - infect_virus2(src,M.virus2) + infect_virus2(src,M.virus2)*/ + // instead we're going to use little floating disease objects + for(var/obj/virus/V in src.loc) if(src.get_infection_chance()) + infect_virus2(src,V.disease) for(var/obj/effect/decal/cleanable/blood/B in view(4, src)) if(B.virus2) infect_virus2(src,B.virus2) else virus2.activate(src) + // activate may have deleted the virus + if(!virus2) return + + // check if we're immune + if(virus2.antigen & src.antibodies) virus2.dead = 1 + if(src.get_infection_chance()) + var/obj/virus/V = new(src.loc) + V.disease = src.virus2 + return