diff --git a/baystation12.dme b/baystation12.dme index c887273366d..f9419f36bdb 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -214,7 +214,6 @@ #define FILE_DIR "code/WorkInProgress/Cael_Aislinn/BirdMan" #define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Rust" #define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Supermatter" -#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Tajara" #define FILE_DIR "code/WorkInProgress/carn" #define FILE_DIR "code/WorkInProgress/Chinsky" #define FILE_DIR "code/WorkInProgress/mapload" @@ -1345,6 +1344,13 @@ #include "code\WorkInProgress\Cael_Aislinn\Rust\virtual_particle_catcher.dm" #include "code\WorkInProgress\Ported\policetape.dm" #include "code\WorkInProgress\SkyMarshal\Ultralight_procs.dm" +#include "code\WorkInProgress\virus2\analyser.dm" +#include "code\WorkInProgress\virus2\antibodies.dm" +#include "code\WorkInProgress\virus2\base.dm" +#include "code\WorkInProgress\virus2\curer.dm" +#include "code\WorkInProgress\virus2\diseasesplicer.dm" +#include "code\WorkInProgress\virus2\dishincubator.dm" +#include "code\WorkInProgress\virus2\isolator.dm" #include "code\ZAS\Airflow.dm" #include "code\ZAS\Connection.dm" #include "code\ZAS\FEA_gas_mixture.dm" diff --git a/code/WorkInProgress/virus2/antibodies.dm b/code/WorkInProgress/virus2/antibodies.dm index 6277e1a6176..b8810e322da 100644 --- a/code/WorkInProgress/virus2/antibodies.dm +++ b/code/WorkInProgress/virus2/antibodies.dm @@ -9,10 +9,13 @@ datum/reagent/antibodies color = "#0050F0" reaction_mob(var/mob/M, var/method=TOUCH, var/volume) - if(istype(M,/mob/living/carbon/human)) + if(istype(M,/mob/living/carbon)) if(src.data && method == INGEST) - if(src.data["antibodies"] & M:virus2.antigen) + if(M:virus2) if(src.data["antibodies"] & M:virus2.antigen) M:virus2.dead = 1 + // if the virus is killed this way it immunizes + // M:antibodies |= M:virus2.antigen + M:antibodies |= src.data["antibodies"] return // reserving some numbers for later special antigens @@ -42,7 +45,7 @@ var/global/list/ANTIGENS = list("[ANTIGEN_A]" = "A", "[ANTIGEN_B]" = "B", "[ANTI icon_state = "health" w_class = 2.0 item_state = "electronic" - flags = FPRINT | TABLEPASS | ONBELT | CONDUCT | USEDELAY + flags = FPRINT | TABLEPASS | CONDUCT | USEDELAY /obj/item/device/antibody_scanner/attack(mob/living/carbon/human/M as mob, mob/user as mob) diff --git a/code/WorkInProgress/virus2/base.dm b/code/WorkInProgress/virus2/base.dm index 0f622bfaaa7..7950389ad32 100644 --- a/code/WorkInProgress/virus2/base.dm +++ b/code/WorkInProgress/virus2/base.dm @@ -44,6 +44,17 @@ return 1 +proc/airborne_can_reach(turf/source, turf/target) + var/obj/dummy = new(source) + dummy.flags = FPRINT | TABLEPASS + dummy.pass_flags = PASSTABLE + + for(var/i=0, i<5, i++) if(!step_towards(dummy, target)) break + + var/rval = (dummy.loc in range(1,target)) + del dummy + return rval + /proc/infect_virus2(var/mob/living/carbon/M,var/datum/disease2/disease/disease,var/forced = 0) if(M.virus2) return diff --git a/code/WorkInProgress/virus2/curer.dm b/code/WorkInProgress/virus2/curer.dm index cbd155711cc..4a7e56c1a10 100644 --- a/code/WorkInProgress/virus2/curer.dm +++ b/code/WorkInProgress/virus2/curer.dm @@ -40,7 +40,21 @@ container = I C.drop_item() I.loc = src + if(istype(I,/obj/item/weapon/virusdish)) + if(virusing) + user << "The pathogen materializer is still recharging.." + return + var/obj/item/weapon/reagent_containers/glass/beaker/product = new(src.loc) + var/list/data = list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"virus2"=null,"antibodies"=0) + data["virus2"] = I:virus2 + product.reagents.add_reagent("blood",30,data) + + virusing = 1 + spawn(1200) virusing = 0 + + state("The [src.name] Buzzes", "blue") + return //else src.attack_hand(user) return @@ -68,6 +82,9 @@ if(B) dat = "Blood sample inserted." + var/code = "" + for(var/V in ANTIGENS) if(text2num(V) & B.data["antibodies"]) code += ANTIGENS[V] + dat += "
Antibodies: [code]" dat += "
Begin antibody production" else dat += "
Please check container contents." @@ -121,9 +138,10 @@ product.reagents.add_reagent("antibodies",30,data) state("The [src.name] Buzzes", "blue") - +/* /obj/machinery/computer/curer/proc/createvirus(var/datum/disease2/disease/virus2) var/obj/item/weapon/cureimplanter/implanter = new /obj/item/weapon/cureimplanter(src.loc) implanter.name = "Viral implanter (MAJOR BIOHAZARD)" implanter.works = 3 - state("The [src.name] Buzzes", "blue") \ No newline at end of file + state("The [src.name] Buzzes", "blue") +*/ \ No newline at end of file diff --git a/code/WorkInProgress/virus2/dishincubator.dm b/code/WorkInProgress/virus2/dishincubator.dm index 955dbd75259..e6d0da12394 100644 --- a/code/WorkInProgress/virus2/dishincubator.dm +++ b/code/WorkInProgress/virus2/dishincubator.dm @@ -163,7 +163,7 @@ if(beaker) - if(beaker.reagents.remove_reagent("virusfood",5)) + if(!beaker.reagents.remove_reagent("virusfood",5)) foodsupply += 10 - if(beaker.reagents.remove_reagent("toxins",1)) + if(!beaker.reagents.remove_reagent("toxins",1)) toxins += 1 \ No newline at end of file diff --git a/code/WorkInProgress/virus2/isolator.dm b/code/WorkInProgress/virus2/isolator.dm index ec2d8c1f033..d337959fd6a 100644 --- a/code/WorkInProgress/virus2/isolator.dm +++ b/code/WorkInProgress/virus2/isolator.dm @@ -138,7 +138,7 @@ growth = rand(5, 50) /obj/item/weapon/virusdish/attackby(var/obj/item/weapon/W as obj,var/mob/living/carbon/user as mob) - if(istype(W,/obj/item/weapon/label) || istype(W,/obj/item/weapon/reagent_containers/syringe)) + if(istype(W,/obj/item/weapon/hand_labeler) || istype(W,/obj/item/weapon/reagent_containers/syringe)) return ..() if(prob(50)) diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 72660368143..8aa47a7d026 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -10,6 +10,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 /obj/effect/decal/cleanable/blood/Del() for(var/datum/disease/D in viruses) @@ -72,4 +73,17 @@ for(var/datum/disease/D in src.viruses) b.viruses += D if (step_to(src, get_step(src, direction), 0)) - break \ No newline at end of file + break + + +/obj/effect/decal/cleanable/mucus + name = "mucus" + desc = "Disgusting mucus." + gender = PLURAL + density = 0 + anchored = 1 + layer = 2 + icon = 'blood.dmi' + icon_state = "mucus" + random_icon_states = list("mucus") + var/datum/disease2/disease/virus2 = null \ No newline at end of file diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index ccf0e794871..430f01c80fd 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -6,6 +6,9 @@ var/eye_op_stage = 0.0 var/appendix_op_stage = 0.0 */ + var/datum/disease2/disease/virus2 = null + var/list/datum/disease2/disease/resistances2 = 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/human.dm b/code/modules/mob/living/carbon/human/human.dm index 6537c62aec3..ff330fde1ba 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -117,7 +117,7 @@ /mob/living/carbon/human/proc/fixblood() for(var/datum/reagent/blood/B in vessel.reagent_list) if(B.id == "blood") - B.data = list("donor"=src,"viruses"=null,"blood_DNA"=dna.unique_enzymes,"blood_type"=dna.b_type,"resistances"=null,"trace_chem"=null) + B.data = list("donor"=src,"viruses"=null,"blood_DNA"=dna.unique_enzymes,"blood_type"=dna.b_type,"resistances"=null,"trace_chem"=null, "virus2" = null, "antobodies" = null) /mob/living/carbon/human/Bump(atom/movable/AM as mob|obj, yes) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 1975716f0ea..df02c48849d 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -1367,7 +1367,28 @@ if(bodytemperature > 406) for(var/datum/disease/D in viruses) D.cure() - return + + 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 + CRASH("virus2 nulled before calling activate()") + 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 + + + return proc/handle_stomach() spawn(0) diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 7c2e01457be..f3237a042b4 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -91,7 +91,7 @@ datum blood - data = new/list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null) + data = new/list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"virus2"=null,"antibodies"=null ) name = "Blood" id = "blood" reagent_state = LIQUID @@ -108,6 +108,19 @@ datum else //injected M.contract_disease(virus, 1, 0) + if(self.data["virus2"]) + if(method == TOUCH) + infect_virus2(M,self.data["virus2"]) + 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 (M:virus2) if((self.data["antibodies"] & M:virus2.antigen) && prob(10)) + M:virus2.dead = 1 /* if(self.data["virus"]) @@ -797,6 +810,15 @@ datum on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M.apply_effect(2,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 + ..() return diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index 283bde88573..8aec88c09fa 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -181,6 +181,13 @@ datum required_reagents = list("silicon" = 1, "carbon" = 1) result_amount = 2 + virus_food + name = "Virus Food" + id = "virusfood" + result = "virusfood" + required_reagents = list("water" = 1, "milk" = 1) + result_amount = 5 + leporazine name = "Leporazine" id = "leporazine" diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 7487ffc2a3f..3a89cef6dd4 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -27,7 +27,8 @@ /obj/machinery/computer/pandemic, /obj/item/weapon/secstorage/ssafe, /obj/machinery/disposal, - /obj/machinery/iv_drip + /obj/machinery/iv_drip, + /obj/machinery/disease2/incubator ) examine() diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 48249a67f93..d2ce8cdb191 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -96,6 +96,8 @@ B.data["viruses"] += new D.type + 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) @@ -108,6 +110,7 @@ temp_chem += R.name temp_chem[R.name] = R.volume B.data["trace_chem"] = list2params(temp_chem) + B.data["antibodies"] = T.antibodies if(ishuman(T)) T:vessel.remove_reagent("blood",amount) // Removes blood if human diff --git a/icons/effects/blood.dmi b/icons/effects/blood.dmi index d64978d1a0c..92c2e7ddf21 100644 Binary files a/icons/effects/blood.dmi and b/icons/effects/blood.dmi differ