Antibodies rework.

This commit is contained in:
GinjaNinja32
2015-01-26 05:32:00 +00:00
parent e49c6de525
commit 1b08463b7e
15 changed files with 110 additions and 129 deletions

View File

@@ -991,6 +991,7 @@
#include "code\modules\mob\living\carbon\carbon_powers.dm" #include "code\modules\mob\living\carbon\carbon_powers.dm"
#include "code\modules\mob\living\carbon\give.dm" #include "code\modules\mob\living\carbon\give.dm"
#include "code\modules\mob\living\carbon\shock.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.dm"
#include "code\modules\mob\living\carbon\alien\alien_attacks.dm" #include "code\modules\mob\living\carbon\alien\alien_attacks.dm"
#include "code\modules\mob\living\carbon\alien\alien_damage.dm" #include "code\modules\mob\living\carbon\alien\alien_damage.dm"

View File

@@ -1,6 +1,8 @@
/mob/living/carbon/Life() /mob/living/carbon/Life()
..() ..()
handle_viruses()
// Increase germ_level regularly // 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 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++ germ_level++

View File

@@ -3,7 +3,7 @@
var/datum/species/species //Contains icon generation and language information, set during New(). var/datum/species/species //Contains icon generation and language information, set during New().
var/list/stomach_contents = list() var/list/stomach_contents = list()
var/list/datum/disease2/disease/virus2 = 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/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. var/life_tick = 0 // The amount of life ticks that have processed on this mob.

View File

@@ -93,8 +93,6 @@
//Random events (vomiting etc) //Random events (vomiting etc)
handle_random_events() handle_random_events()
handle_virus_updates()
//stuff in the stomach //stuff in the stomach
handle_stomach() handle_stomach()
@@ -1454,47 +1452,6 @@
if(!currentTurf.lighting_lumcount) if(!currentTurf.lighting_lumcount)
playsound_local(src,pick(scarySounds),50, 1, -1) 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() proc/handle_stomach()
spawn(0) spawn(0)
for(var/mob/living/M in stomach_contents) for(var/mob/living/M in stomach_contents)

View File

@@ -44,9 +44,6 @@
//Disabilities //Disabilities
handle_disabilities() handle_disabilities()
//Virus updates, duh
handle_virus_updates()
//Apparently, the person who wrote this code designed it so that //Apparently, the person who wrote this code designed it so that
//blinded get reset each cycle and then get activated later in the //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 //code. Very ugly. I dont care. Moving this stuff here so its easy
@@ -152,47 +149,6 @@
domutcheck(src,null) domutcheck(src,null)
emote("gasp") 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() proc/breathe()
if(reagents) if(reagents)

View File

@@ -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

View File

@@ -31,7 +31,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
for(var/datum/reagent/blood/B in vessel.reagent_list) for(var/datum/reagent/blood/B in vessel.reagent_list)
if(B.id == "blood") 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, \ 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"] B.color = B.data["blood_colour"]
// Takes care blood loss and regeneration // Takes care blood loss and regeneration

View File

@@ -98,7 +98,7 @@ datum
blood 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" name = "Blood"
id = "blood" id = "blood"
reagent_state = LIQUID reagent_state = LIQUID
@@ -682,15 +682,13 @@ datum
for (var/ID in C.virus2) for (var/ID in C.virus2)
var/datum/disease2/disease/V = C.virus2[ID] var/datum/disease2/disease/V = C.virus2[ID]
if(prob(5)) if(prob(5))
M:antibodies |= V.antigen C.antibodies |= V.antigen
if(prob(50)) if(prob(50))
M.radiation += 50 // curing it that way may kill you instead M.radiation += 50 // curing it that way may kill you instead
var/absorbed var/absorbed
if(istype(C,/mob/living/carbon)) var/datum/organ/internal/diona/nutrients/rad_organ = locate() in C.internal_organs
var/mob/living/carbon/H = C if(rad_organ && !rad_organ.is_broken())
var/datum/organ/internal/diona/nutrients/rad_organ = locate() in H.internal_organs absorbed = 1
if(rad_organ && !rad_organ.is_broken())
absorbed = 1
if(!absorbed) if(!absorbed)
M.adjustToxLoss(100) M.adjustToxLoss(100)
..() ..()

View File

@@ -13,6 +13,8 @@
usr << "[E.stage]: [E.effect.name]; chance=[E.chance]; multiplier=[E.multiplier]" usr << "[E.stage]: [E.effect.name]; chance=[E.chance]; multiplier=[E.multiplier]"
usr << "Antigens: [antigens2string(antigen)]" usr << "Antigens: [antigens2string(antigen)]"
return 1
/datum/admins/var/datum/virus2_editor/virus2_editor_datum = new /datum/admins/var/datum/virus2_editor/virus2_editor_datum = new
/client/proc/virus2_editor() /client/proc/virus2_editor()
set name = "Virus Editor" set name = "Virus Editor"
@@ -28,7 +30,7 @@
var/species = list() var/species = list()
var/infectionchance = 70 var/infectionchance = 70
var/spreadtype = "Contact" var/spreadtype = "Contact"
var/antigens = 0 var/list/antigens = list()
var/speed = 1 var/speed = 1
var/mob/living/carbon/infectee = null var/mob/living/carbon/infectee = null
@@ -84,10 +86,10 @@
<br /> <br />
"} "}
f = 1 f = 1
for(var/k in ANTIGENS) for(var/k in ALL_ANTIGENS)
if(!f) H += " | " if(!f) H += " | "
else f = 0 else f = 0
H += "<a href='?src=\ref[src];what=antigen;toggle=[k]' style='color:[(text2num(k) & antigens) ? "#006600" : "#ff0000"]'>[ANTIGENS[k]]</a>" H += "<a href='?src=\ref[src];what=antigen;toggle=[k]' style='color:[(k in antigens) ? "#006600" : "#ff0000"]'>[k]</a>"
H += {" H += {"
<a href="?src=\ref[src];what=antigen;reset=1" style="color:#0000aa">Reset</a> <a href="?src=\ref[src];what=antigen;reset=1" style="color:#0000aa">Reset</a>
<br /> <br />
@@ -145,13 +147,14 @@
speed = S speed = S
if("antigen") if("antigen")
if(href_list["toggle"]) if(href_list["toggle"])
var/T = text2num(href_list["toggle"]) var/T = href_list["toggle"]
if(T&antigens) if(length(T) != 1) return
antigens &= ~T if(T in antigens)
antigens -= T
else else
antigens |= T antigens |= T
else if(href_list["reset"]) else if(href_list["reset"])
antigens = 0 antigens = list()
if("infectee") if("infectee")
var/list/candidates = list() var/list/candidates = list()
for(var/mob/living/carbon/G in living_mob_list) for(var/mob/living/carbon/G in living_mob_list)
@@ -167,7 +170,7 @@
infectee = candidates[I] infectee = candidates[I]
species |= infectee.species.name species |= infectee.species.name
if("go") 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.\ 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") 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 if(a == "Yes") return

View File

@@ -1,5 +1,6 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33 //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33
/*
// reserving some numbers for later special antigens // reserving some numbers for later special antigens
var/global/const/ANTIGEN_A = 1 var/global/const/ANTIGEN_A = 1
var/global/const/ANTIGEN_B = 2 var/global/const/ANTIGEN_B = 2
@@ -36,10 +37,18 @@ var/global/list/ANTIGENS = list(
"[ANTIGEN_Y]" = "Y", "[ANTIGEN_Y]" = "Y",
"[ANTIGEN_Z]" = "Z" "[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 // pure concentrated antibodies
datum/reagent/antibodies datum/reagent/antibodies
data = list("antibodies"=0) data = list("antibodies"=list())
name = "Antibodies" name = "Antibodies"
id = "antibodies" id = "antibodies"
reagent_state = LIQUID reagent_state = LIQUID
@@ -47,14 +56,26 @@ datum/reagent/antibodies
reaction_mob(var/mob/M, var/method=TOUCH, var/volume) reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
if(istype(M,/mob/living/carbon)) if(istype(M,/mob/living/carbon))
var/mob/living/carbon/C = M
if(src.data && method == INGEST) if(src.data && method == INGEST)
if(M:virus2) if(src.data["antibodies"] & M:virus2.antigen) //if(C.virus2) if(src.data["antibodies"] & C.virus2.antigen)
M:virus2.dead = 1 // C.virus2.dead = 1
M:antibodies |= src.data["antibodies"] C.antibodies |= src.data["antibodies"]
return return
// iterate over the list of antigens and see what matches // 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 = "" 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 return code

View File

@@ -54,7 +54,7 @@
if (sample) if (sample)
var/datum/reagent/blood/B = locate(/datum/reagent/blood) in sample.reagents.reagent_list var/datum/reagent/blood/B = locate(/datum/reagent/blood) in sample.reagents.reagent_list
if (B) 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/pathogens[0]
var/list/virus = B.data["virus2"] var/list/virus = B.data["virus2"]
@@ -67,7 +67,8 @@
else else
var/datum/reagent/antibodies/A = locate(/datum/reagent/antibodies) in sample.reagents.reagent_list 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 data["is_antibody_sample"] = 1
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) 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 var/datum/reagent/blood/B = locate(/datum/reagent/blood) in sample.reagents.reagent_list
if (B) if (B)
P.info += "<u>Antibodies:</u> " P.info += "<u>Antibodies:</u> "
P.info += B.data["antibodies"] ? antigens2string(B.data["antibodies"]) : "None" P.info += antigens2string(B.data["antibodies"])
P.info += "<br>" P.info += "<br>"
var/list/virus = B.data["virus2"] var/list/virus = B.data["virus2"]
@@ -202,7 +203,7 @@
var/datum/reagent/antibodies/A = locate(/datum/reagent/antibodies) in sample.reagents.reagent_list var/datum/reagent/antibodies/A = locate(/datum/reagent/antibodies) in sample.reagents.reagent_list
if (A) if (A)
P.info += "The following antibodies have been isolated from the blood sample: " 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 += "<br>" P.info += "<br>"
P.info += {" P.info += {"

View File

@@ -22,7 +22,7 @@
return return
var/obj/item/weapon/reagent_containers/glass/beaker/product = new(src.loc) 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 data["virus2"] |= I:virus2
product.reagents.add_reagent("blood",30,data) product.reagents.add_reagent("blood",30,data)
@@ -52,9 +52,7 @@
if(B) if(B)
dat = "Blood sample inserted." dat = "Blood sample inserted."
var/code = "" dat += "<BR>Antibodies: [antigens2string(B.data["antibodies"])]"
for(var/V in ANTIGENS) if(text2num(V) & B.data["antibodies"]) code += ANTIGENS[V]
dat += "<BR>Antibodies: [code]"
dat += "<BR><A href='?src=\ref[src];antibody=1'>Begin antibody production</a>" dat += "<BR><A href='?src=\ref[src];antibody=1'>Begin antibody production</a>"
else else
dat += "<BR>Please check container contents." dat += "<BR>Please check container contents."

View File

@@ -8,7 +8,7 @@
var/clicks = 0 var/clicks = 0
var/uniqueID = 0 var/uniqueID = 0
var/list/datum/disease2/effectholder/effects = list() 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/max_stage = 4
var/list/affected_species = list("Human","Unathi","Skrell","Tajara") var/list/affected_species = list("Human","Unathi","Skrell","Tajara")
@@ -33,8 +33,8 @@
else else
infectionchance = rand(60,90) infectionchance = rand(60,90)
antigen |= text2num(pick(ANTIGENS)) antigen = list(pick(ALL_ANTIGENS))
antigen |= text2num(pick(ANTIGENS)) antigen |= pick(ALL_ANTIGENS)
spreadtype = prob(70) ? "Airborne" : "Contact" spreadtype = prob(70) ? "Airborne" : "Contact"
if(all_species.len) if(all_species.len)
@@ -123,8 +123,8 @@
exclude += D.effect.type exclude += D.effect.type
holder.majormutate(exclude) holder.majormutate(exclude)
if (prob(5)) if (prob(5))
antigen = text2num(pick(ANTIGENS)) antigen = list(pick(ALL_ANTIGENS))
antigen |= text2num(pick(ANTIGENS)) antigen |= pick(ALL_ANTIGENS)
if (prob(5) && all_species.len) if (prob(5) && all_species.len)
affected_species = get_infectable_species() affected_species = get_infectable_species()
@@ -250,7 +250,7 @@ proc/virology_letterhead(var/report_name)
<hr> <hr>
"} "}
proc/can_add_symptom(type) /datum/disease2/disease/proc/can_add_symptom(type)
for(var/datum/disease2/effectholder/H in effects) for(var/datum/disease2/effectholder/H in effects)
if(H.effect.type == type) if(H.effect.type == type)
return 0 return 0

View File

@@ -68,14 +68,15 @@ proc/airborne_can_reach(turf/source, turf/target)
if ("[disease.uniqueID]" in M.virus2) if ("[disease.uniqueID]" in M.virus2)
return return
// if one of the antibodies in the mob's body matches one of the disease's antigens, don't infect // 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 return
if(M.reagents.has_reagent("spaceacillin")) if(M.reagents.has_reagent("spaceacillin"))
return return
if(!disease.affected_species.len) if(!disease.affected_species.len)
return return
if (!(M.species.name in disease.affected_species)) if (!(M.species.name in disease.affected_species))
if (forced) if (forced)
disease.affected_species[1] = M.species.name disease.affected_species[1] = M.species.name

View File

@@ -20,7 +20,7 @@
report("Scan aborted: The target does not have blood.", user) report("Scan aborted: The target does not have blood.", user)
return return
if(!C.antibodies) if(!C.antibodies.len)
report("Scan Complete: No antibodies detected.", user) report("Scan Complete: No antibodies detected.", user)
return return
@@ -76,7 +76,7 @@
if(.) return if(.) return
if(href_list["info"]) if(href_list["info"])
usr << browse(info, "window=virusinfo") usr << browse(info, "window=info_\ref[src]")
return 1 return 1
/obj/item/weapon/ruinedvirusdish /obj/item/weapon/ruinedvirusdish