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\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"

View File

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

View File

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

View File

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

View File

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

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

View File

@@ -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)
..()

View File

@@ -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 @@
<br />
"}
f = 1
for(var/k in ANTIGENS)
for(var/k in ALL_ANTIGENS)
if(!f) H += " | "
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 += {"
<a href="?src=\ref[src];what=antigen;reset=1" style="color:#0000aa">Reset</a>
<br />
@@ -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

View File

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

View File

@@ -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 += "<u>Antibodies:</u> "
P.info += B.data["antibodies"] ? antigens2string(B.data["antibodies"]) : "None"
P.info += antigens2string(B.data["antibodies"])
P.info += "<br>"
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 += "<br>"
P.info += {"

View File

@@ -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 += "<BR>Antibodies: [code]"
dat += "<BR>Antibodies: [antigens2string(B.data["antibodies"])]"
dat += "<BR><A href='?src=\ref[src];antibody=1'>Begin antibody production</a>"
else
dat += "<BR>Please check container contents."

View File

@@ -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)
<hr>
"}
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

View File

@@ -68,7 +68,8 @@ 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

View File

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