From 1b08463b7eaa62fe73992f51535dc8f786bb53ec Mon Sep 17 00:00:00 2001 From: GinjaNinja32 Date: Mon, 26 Jan 2015 05:32:00 +0000 Subject: [PATCH] Antibodies rework. --- baystation12.dme | 1 + code/modules/mob/living/carbon/carbon.dm | 2 + .../mob/living/carbon/carbon_defines.dm | 2 +- code/modules/mob/living/carbon/human/life.dm | 43 ------------------ code/modules/mob/living/carbon/monkey/life.dm | 44 ------------------- code/modules/mob/living/carbon/viruses.dm | 43 ++++++++++++++++++ code/modules/organs/blood.dm | 2 +- code/modules/reagents/Chemistry-Reagents.dm | 12 +++-- code/modules/virus2/admin.dm | 19 ++++---- code/modules/virus2/antibodies.dm | 33 +++++++++++--- code/modules/virus2/centrifuge.dm | 9 ++-- code/modules/virus2/curer.dm | 6 +-- code/modules/virus2/disease2.dm | 12 ++--- code/modules/virus2/helpers.dm | 7 +-- code/modules/virus2/items_devices.dm | 4 +- 15 files changed, 110 insertions(+), 129 deletions(-) create mode 100644 code/modules/mob/living/carbon/viruses.dm diff --git a/baystation12.dme b/baystation12.dme index e3d89fdf6c..f4eab299e8 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -991,6 +991,7 @@ #include "code\modules\mob\living\carbon\carbon_powers.dm" #include "code\modules\mob\living\carbon\give.dm" #include "code\modules\mob\living\carbon\shock.dm" +#include "code\modules\mob\living\carbon\viruses.dm" #include "code\modules\mob\living\carbon\alien\alien.dm" #include "code\modules\mob\living\carbon\alien\alien_attacks.dm" #include "code\modules\mob\living\carbon\alien\alien_damage.dm" diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index b1170468d8..84b3c43207 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -1,6 +1,8 @@ /mob/living/carbon/Life() ..() + handle_viruses() + // Increase germ_level regularly if(germ_level < GERM_LEVEL_AMBIENT && prob(30)) //if you're just standing there, you shouldn't get more germs beyond an ambient level germ_level++ diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index bf72360399..55b33324fb 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -3,7 +3,7 @@ var/datum/species/species //Contains icon generation and language information, set during New(). var/list/stomach_contents = list() var/list/datum/disease2/disease/virus2 = list() - var/antibodies = 0 + var/list/antibodies = list() var/last_eating = 0 //Not sure what this does... I found it hidden in food.dm var/life_tick = 0 // The amount of life ticks that have processed on this mob. diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 0f13a6dbfd..92aa0fe246 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -93,8 +93,6 @@ //Random events (vomiting etc) handle_random_events() - handle_virus_updates() - //stuff in the stomach handle_stomach() @@ -1454,47 +1452,6 @@ if(!currentTurf.lighting_lumcount) playsound_local(src,pick(scarySounds),50, 1, -1) - proc/handle_virus_updates() - if(status_flags & GODMODE) return 0 //godmode - if(bodytemperature > 406) - for(var/datum/disease/D in viruses) - D.cure() - for (var/ID in virus2) - var/datum/disease2/disease/V = virus2[ID] - V.cure(src) - if(life_tick % 3) //don't spam checks over all objects in view every tick. - for(var/obj/effect/decal/cleanable/O in view(1,src)) - if(istype(O,/obj/effect/decal/cleanable/blood)) - var/obj/effect/decal/cleanable/blood/B = O - if(B.virus2.len) - for (var/ID in B.virus2) - var/datum/disease2/disease/V = B.virus2[ID] - infect_virus2(src,V.getcopy()) - - else if(istype(O,/obj/effect/decal/cleanable/mucus)) - var/obj/effect/decal/cleanable/mucus/M = O - if(M.virus2.len) - for (var/ID in M.virus2) - var/datum/disease2/disease/V = M.virus2[ID] - infect_virus2(src,V.getcopy()) - - - if(virus2.len) - 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 - V.activate(src) - // activate may have deleted the virus - if(!V) continue - - // check if we're immune - if(V.antigen & src.antibodies) - V.dead = 1 - - return - proc/handle_stomach() spawn(0) for(var/mob/living/M in stomach_contents) diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm index 20b80c9c89..6b0227e26d 100644 --- a/code/modules/mob/living/carbon/monkey/life.dm +++ b/code/modules/mob/living/carbon/monkey/life.dm @@ -44,9 +44,6 @@ //Disabilities handle_disabilities() - //Virus updates, duh - handle_virus_updates() - //Apparently, the person who wrote this code designed it so that //blinded get reset each cycle and then get activated later in the //code. Very ugly. I dont care. Moving this stuff here so its easy @@ -152,47 +149,6 @@ domutcheck(src,null) emote("gasp") - proc/handle_virus_updates() - if(status_flags & GODMODE) return 0 //godmode - if(bodytemperature > 406) - for(var/datum/disease/D in viruses) - D.cure() - for (var/ID in virus2) - var/datum/disease2/disease/V = virus2[ID] - V.cure(src) - - for(var/obj/effect/decal/cleanable/O in view(1,src)) - if(istype(O,/obj/effect/decal/cleanable/blood)) - var/obj/effect/decal/cleanable/blood/B = O - if(B.virus2.len) - for (var/ID in B.virus2) - var/datum/disease2/disease/V = B.virus2[ID] - infect_virus2(src,V) - - else if(istype(O,/obj/effect/decal/cleanable/mucus)) - var/obj/effect/decal/cleanable/mucus/M = O - - if(M.virus2.len) - for (var/ID in M.virus2) - var/datum/disease2/disease/V = M.virus2[ID] - infect_virus2(src,V) - - if(virus2.len) - 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 - V.activate(src) - // activate may have deleted the virus - if(!V) continue - - // check if we're immune - if(V.antigen & src.antibodies) - V.dead = 1 - - return - proc/breathe() if(reagents) diff --git a/code/modules/mob/living/carbon/viruses.dm b/code/modules/mob/living/carbon/viruses.dm new file mode 100644 index 0000000000..fed6d59e43 --- /dev/null +++ b/code/modules/mob/living/carbon/viruses.dm @@ -0,0 +1,43 @@ +/mob/living/carbon/proc/handle_viruses() + + if(status_flags & GODMODE) return 0 //godmode + + if(bodytemperature > 406) + for(var/datum/disease/D in viruses) + D.cure() + for (var/ID in virus2) + var/datum/disease2/disease/V = virus2[ID] + V.cure(src) + + if(life_tick % 3) //don't spam checks over all objects in view every tick. + for(var/obj/effect/decal/cleanable/O in view(1,src)) + if(istype(O,/obj/effect/decal/cleanable/blood)) + var/obj/effect/decal/cleanable/blood/B = O + if(B.virus2.len) + for (var/ID in B.virus2) + var/datum/disease2/disease/V = B.virus2[ID] + infect_virus2(src,V) + + else if(istype(O,/obj/effect/decal/cleanable/mucus)) + var/obj/effect/decal/cleanable/mucus/M = O + if(M.virus2.len) + for (var/ID in M.virus2) + var/datum/disease2/disease/V = M.virus2[ID] + infect_virus2(src,V) + + if(virus2.len) + 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 + V.activate(src) + // activate may have deleted the virus + if(!V) continue + + // check if we're immune + var/list/common_antibodies = V.antigen & src.antibodies + if(common_antibodies.len) + V.dead = 1 + + return \ No newline at end of file diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm index 067ef6a42e..ac9b3131cd 100644 --- a/code/modules/organs/blood.dm +++ b/code/modules/organs/blood.dm @@ -31,7 +31,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 for(var/datum/reagent/blood/B in vessel.reagent_list) if(B.id == "blood") B.data = list( "donor"=src,"viruses"=null,"species"=species.name,"blood_DNA"=dna.unique_enzymes,"blood_colour"= species.blood_color,"blood_type"=dna.b_type, \ - "resistances"=null,"trace_chem"=null, "virus2" = null, "antibodies" = null) + "resistances"=null,"trace_chem"=null, "virus2" = null, "antibodies" = list()) B.color = B.data["blood_colour"] // Takes care blood loss and regeneration diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 6fd9de29f7..6ddb4f40ae 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -98,7 +98,7 @@ datum blood - data = new/list("donor"=null,"viruses"=null,"species"="Human","blood_DNA"=null,"blood_type"=null,"blood_colour"= "#A10808","resistances"=null,"trace_chem"=null, "antibodies" = null) + data = new/list("donor"=null,"viruses"=null,"species"="Human","blood_DNA"=null,"blood_type"=null,"blood_colour"= "#A10808","resistances"=null,"trace_chem"=null, "antibodies" = list()) name = "Blood" id = "blood" reagent_state = LIQUID @@ -682,15 +682,13 @@ datum for (var/ID in C.virus2) var/datum/disease2/disease/V = C.virus2[ID] if(prob(5)) - M:antibodies |= V.antigen + C.antibodies |= V.antigen if(prob(50)) M.radiation += 50 // curing it that way may kill you instead var/absorbed - if(istype(C,/mob/living/carbon)) - var/mob/living/carbon/H = C - var/datum/organ/internal/diona/nutrients/rad_organ = locate() in H.internal_organs - if(rad_organ && !rad_organ.is_broken()) - absorbed = 1 + var/datum/organ/internal/diona/nutrients/rad_organ = locate() in C.internal_organs + if(rad_organ && !rad_organ.is_broken()) + absorbed = 1 if(!absorbed) M.adjustToxLoss(100) ..() diff --git a/code/modules/virus2/admin.dm b/code/modules/virus2/admin.dm index 7dbed729a9..88876da9ed 100644 --- a/code/modules/virus2/admin.dm +++ b/code/modules/virus2/admin.dm @@ -13,6 +13,8 @@ usr << "[E.stage]: [E.effect.name]; chance=[E.chance]; multiplier=[E.multiplier]" usr << "Antigens: [antigens2string(antigen)]" + return 1 + /datum/admins/var/datum/virus2_editor/virus2_editor_datum = new /client/proc/virus2_editor() set name = "Virus Editor" @@ -28,7 +30,7 @@ var/species = list() var/infectionchance = 70 var/spreadtype = "Contact" - var/antigens = 0 + var/list/antigens = list() var/speed = 1 var/mob/living/carbon/infectee = null @@ -84,10 +86,10 @@
"} f = 1 - for(var/k in ANTIGENS) + for(var/k in ALL_ANTIGENS) if(!f) H += " | " else f = 0 - H += "[ANTIGENS[k]]" + H += "[k]" H += {" Reset
@@ -145,13 +147,14 @@ speed = S if("antigen") if(href_list["toggle"]) - var/T = text2num(href_list["toggle"]) - if(T&antigens) - antigens &= ~T + var/T = href_list["toggle"] + if(length(T) != 1) return + if(T in antigens) + antigens -= T else antigens |= T else if(href_list["reset"]) - antigens = 0 + antigens = list() if("infectee") var/list/candidates = list() for(var/mob/living/carbon/G in living_mob_list) @@ -167,7 +170,7 @@ infectee = candidates[I] species |= infectee.species.name if("go") - if(!antigens) + if(!antigens.len) var/a = alert("This disease has no antigens; it will be impossible to permanently immunise anyone without them.\ It is strongly recommended to set at least one antigen. Do you want to go back and edit your virus?", "Antigens", "Yes", "Yes", "No") if(a == "Yes") return diff --git a/code/modules/virus2/antibodies.dm b/code/modules/virus2/antibodies.dm index f825c8896e..a209ef1c7f 100644 --- a/code/modules/virus2/antibodies.dm +++ b/code/modules/virus2/antibodies.dm @@ -1,5 +1,6 @@ //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33 +/* // reserving some numbers for later special antigens var/global/const/ANTIGEN_A = 1 var/global/const/ANTIGEN_B = 2 @@ -36,10 +37,18 @@ var/global/list/ANTIGENS = list( "[ANTIGEN_Y]" = "Y", "[ANTIGEN_Z]" = "Z" ) +*/ + +var/global/list/ALL_ANTIGENS = list( + "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" + ) + +/hook/startup/proc/randomise_antigens_order() + ALL_ANTIGENS = shuffle(ALL_ANTIGENS) // pure concentrated antibodies datum/reagent/antibodies - data = list("antibodies"=0) + data = list("antibodies"=list()) name = "Antibodies" id = "antibodies" reagent_state = LIQUID @@ -47,14 +56,26 @@ datum/reagent/antibodies reaction_mob(var/mob/M, var/method=TOUCH, var/volume) if(istype(M,/mob/living/carbon)) + var/mob/living/carbon/C = M if(src.data && method == INGEST) - if(M:virus2) if(src.data["antibodies"] & M:virus2.antigen) - M:virus2.dead = 1 - M:antibodies |= src.data["antibodies"] + //if(C.virus2) if(src.data["antibodies"] & C.virus2.antigen) + // C.virus2.dead = 1 + C.antibodies |= src.data["antibodies"] return // iterate over the list of antigens and see what matches -/proc/antigens2string(var/antigens) +/proc/antigens2string(list/antigens, none="None") + if(!istype(antigens)) + CRASH("Illegal type!") + if(!antigens.len) + return none + var/code = "" - for(var/V in ANTIGENS) if(text2num(V) & antigens) code += ANTIGENS[V] + for(var/V in ALL_ANTIGENS) + if(V in antigens) + code += V + + if(!code) + return none + return code \ No newline at end of file diff --git a/code/modules/virus2/centrifuge.dm b/code/modules/virus2/centrifuge.dm index 930dc14148..a4c9187667 100644 --- a/code/modules/virus2/centrifuge.dm +++ b/code/modules/virus2/centrifuge.dm @@ -54,7 +54,7 @@ if (sample) var/datum/reagent/blood/B = locate(/datum/reagent/blood) in sample.reagents.reagent_list if (B) - data["antibodies"] = B.data["antibodies"] ? antigens2string(B.data["antibodies"]) : null + data["antibodies"] = antigens2string(B.data["antibodies"], none=null) var/list/pathogens[0] var/list/virus = B.data["virus2"] @@ -67,7 +67,8 @@ else var/datum/reagent/antibodies/A = locate(/datum/reagent/antibodies) in sample.reagents.reagent_list - data["antibodies"] = A && A.data["antibodies"] ? antigens2string(A.data["antibodies"]) : null + if(A) + data["antibodies"] = antigens2string(A.data["antibodies"], none=null) data["is_antibody_sample"] = 1 ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) @@ -186,7 +187,7 @@ var/datum/reagent/blood/B = locate(/datum/reagent/blood) in sample.reagents.reagent_list if (B) P.info += "Antibodies: " - P.info += B.data["antibodies"] ? antigens2string(B.data["antibodies"]) : "None" + P.info += antigens2string(B.data["antibodies"]) P.info += "
" var/list/virus = B.data["virus2"] @@ -202,7 +203,7 @@ var/datum/reagent/antibodies/A = locate(/datum/reagent/antibodies) in sample.reagents.reagent_list if (A) P.info += "The following antibodies have been isolated from the blood sample: " - P.info += A.data["antibodies"] ? antigens2string(A.data["antibodies"]) : "None" + P.info += antigens2string(A.data["antibodies"]) P.info += "
" P.info += {" diff --git a/code/modules/virus2/curer.dm b/code/modules/virus2/curer.dm index 4246ba54fb..367e336c43 100644 --- a/code/modules/virus2/curer.dm +++ b/code/modules/virus2/curer.dm @@ -22,7 +22,7 @@ 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"=list(),"antibodies"=0) + var/list/data = list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"virus2"=list(),"antibodies"=list()) data["virus2"] |= I:virus2 product.reagents.add_reagent("blood",30,data) @@ -52,9 +52,7 @@ 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 += "
Antibodies: [antigens2string(B.data["antibodies"])]" dat += "
Begin antibody production" else dat += "
Please check container contents." diff --git a/code/modules/virus2/disease2.dm b/code/modules/virus2/disease2.dm index 37035089b5..b99f8adb03 100644 --- a/code/modules/virus2/disease2.dm +++ b/code/modules/virus2/disease2.dm @@ -8,7 +8,7 @@ var/clicks = 0 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/antigen = list() // 16 bits describing the antigens, when one bit is set, a cure with that bit can dock here var/max_stage = 4 var/list/affected_species = list("Human","Unathi","Skrell","Tajara") @@ -33,8 +33,8 @@ else infectionchance = rand(60,90) - antigen |= text2num(pick(ANTIGENS)) - antigen |= text2num(pick(ANTIGENS)) + antigen = list(pick(ALL_ANTIGENS)) + antigen |= pick(ALL_ANTIGENS) spreadtype = prob(70) ? "Airborne" : "Contact" if(all_species.len) @@ -123,8 +123,8 @@ exclude += D.effect.type holder.majormutate(exclude) if (prob(5)) - antigen = text2num(pick(ANTIGENS)) - antigen |= text2num(pick(ANTIGENS)) + antigen = list(pick(ALL_ANTIGENS)) + antigen |= pick(ALL_ANTIGENS) if (prob(5) && all_species.len) affected_species = get_infectable_species() @@ -250,7 +250,7 @@ proc/virology_letterhead(var/report_name)
"} -proc/can_add_symptom(type) +/datum/disease2/disease/proc/can_add_symptom(type) for(var/datum/disease2/effectholder/H in effects) if(H.effect.type == type) return 0 diff --git a/code/modules/virus2/helpers.dm b/code/modules/virus2/helpers.dm index 927078b062..0ce5cadfa5 100644 --- a/code/modules/virus2/helpers.dm +++ b/code/modules/virus2/helpers.dm @@ -68,14 +68,15 @@ proc/airborne_can_reach(turf/source, turf/target) 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) + var/list/antibodies_in_common = M.antibodies & disease.antigen + if(antibodies_in_common.len) return if(M.reagents.has_reagent("spaceacillin")) return - + if(!disease.affected_species.len) return - + if (!(M.species.name in disease.affected_species)) if (forced) disease.affected_species[1] = M.species.name diff --git a/code/modules/virus2/items_devices.dm b/code/modules/virus2/items_devices.dm index 2057a75c16..c14f7d9d4f 100644 --- a/code/modules/virus2/items_devices.dm +++ b/code/modules/virus2/items_devices.dm @@ -20,7 +20,7 @@ report("Scan aborted: The target does not have blood.", user) return - if(!C.antibodies) + if(!C.antibodies.len) report("Scan Complete: No antibodies detected.", user) return @@ -76,7 +76,7 @@ if(.) return if(href_list["info"]) - usr << browse(info, "window=virusinfo") + usr << browse(info, "window=info_\ref[src]") return 1 /obj/item/weapon/ruinedvirusdish