diff --git a/baystation12.dme b/baystation12.dme
index e3d89fdf6cc..f4eab299e80 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 b1170468d87..84b3c43207c 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 bf72360399f..55b33324fbb 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 0f13a6dbfdb..92aa0fe2460 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 20b80c9c890..6b0227e26d4 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 00000000000..fed6d59e438
--- /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 067ef6a42e2..ac9b3131cd5 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 6fd9de29f78..6ddb4f40aec 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 7dbed729a94..88876da9ed0 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 f825c8896ec..a209ef1c7fc 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 930dc14148d..a4c91876676 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 4246ba54fbf..367e336c437 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 37035089b5f..b99f8adb035 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)