diff --git a/code/WorkInProgress/Chemistry-Machinery.dm b/code/WorkInProgress/Chemistry-Machinery.dm
index 7da3c6f8510..c3dd3b082e5 100644
--- a/code/WorkInProgress/Chemistry-Machinery.dm
+++ b/code/WorkInProgress/Chemistry-Machinery.dm
@@ -387,6 +387,9 @@
dat += "Blood Type: [(Blood.data["blood_type"]||"none")]
"
var/datum/disease/D = Blood.data["virus"]
dat += "Agent of disease: [D?"[D.agent] - Create virus culture bottle":"none"]
"
+ if(D)
+ dat += "Common name: [(D.name||"none")]
"
+ dat += "Possible cure: [(D.cure||"none")]
"
dat += "Contains antibodies to: "
if(Blood.data["resistances"])
var/list/res = Blood.data["resistances"]
diff --git a/code/WorkInProgress/Chemistry-Reagents.dm b/code/WorkInProgress/Chemistry-Reagents.dm
index 78ebf35ea08..e57253fd1ff 100644
--- a/code/WorkInProgress/Chemistry-Reagents.dm
+++ b/code/WorkInProgress/Chemistry-Reagents.dm
@@ -74,9 +74,9 @@ datum
var/datum/disease/V = self.data["virus"]
if(M.resistances.Find(V.type)) return
if(method == TOUCH)//respect all protective clothing...
- M.contract_disease(new V.type)
+ M.contract_disease(V)
else //injected
- M.contract_disease(new V.type, 1)
+ M.contract_disease(V, 1)
return
@@ -84,6 +84,7 @@ datum
var/datum/reagent/blood/self = src
src = null
if(!istype(T, /turf/simulated/)) return
+ var/datum/disease/D = self.data["virus"]
if(istype(self.data["donor"], /mob/living/carbon/human) || !self.data["donor"])
var/turf/simulated/source2 = T
var/list/objsonturf = range(0,T)
@@ -94,19 +95,36 @@ datum
var/obj/decal/cleanable/blood/blood_prop = new /obj/decal/cleanable/blood(source2)
blood_prop.blood_DNA = self.data["blood_DNA"]
blood_prop.blood_type = self.data["blood_type"]
- blood_prop.virus = self.data["virus"]
+ if(D)
+ blood_prop.virus = new D.type
+ blood_prop.virus.holder = blood_prop
+ if(istype(T, /turf/simulated/floor))
+ blood_prop.virus.spread_type = CONTACT_FEET
+ else
+ blood_prop.virus.spread_type = CONTACT_HANDS
else if(istype(self.data["donor"], /mob/living/carbon/monkey))
var/turf/simulated/source1 = T
var/obj/decal/cleanable/blood/blood_prop = new /obj/decal/cleanable/blood(source1)
blood_prop.blood_DNA = self.data["blood_DNA"]
- blood_prop.virus = self.data["virus"]
+ if(D)
+ blood_prop.virus = new D.type
+ blood_prop.virus.holder = blood_prop
+ if(istype(T, /turf/simulated/floor))
+ blood_prop.virus.spread_type = CONTACT_FEET
+ else
+ blood_prop.virus.spread_type = CONTACT_HANDS
else if(istype(self.data["donor"], /mob/living/carbon/alien))
var/turf/simulated/source2 = T
var/obj/decal/cleanable/xenoblood/blood_prop = new /obj/decal/cleanable/xenoblood(source2)
- blood_prop.virus = self.data["virus"]
-
+ if(D)
+ blood_prop.virus = new D.type
+ blood_prop.virus.holder = blood_prop
+ if(istype(T, /turf/simulated/floor))
+ blood_prop.virus.spread_type = CONTACT_FEET
+ else
+ blood_prop.virus.spread_type = CONTACT_HANDS
return
vaccine
@@ -119,8 +137,8 @@ datum
var/datum/reagent/vaccine/self = src
src = null
if(self.data&&method == INGEST)
- if(M.resistances.Find(self.data)) return
- M.resistances += self.data
+ if(M.virus&&M.virus.type == self.data)
+ M.virus.cure()
return
@@ -967,9 +985,9 @@ datum
reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
src = null
if( (prob(10) && method==TOUCH) || method==INGEST)
- if(!M.virus)
- M.virus = new /datum/disease/robotic_transformation
- M.virus.affected_mob = M
+ var/datum/disease/D = new /datum/disease/robotic_transformation
+ M.contract_disease(D,1)
+ del(D)
xenomicrobes
name = "Xenomicrobes"
@@ -979,9 +997,9 @@ datum
reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
src = null
if( (prob(10) && method==TOUCH) || method==INGEST)
- if(!M.virus)
- M.virus = new /datum/disease/xeno_transformation
- M.virus.affected_mob = M
+ var/datum/disease/D = new /datum/disease/xeno_transformation
+ M.contract_disease(D,1)
+ del(D)
//foam precursor
@@ -1804,4 +1822,4 @@ datum
if(data >= 55 && prob(33))
if (!M.confused) M.confused = 1
M.confused += 2
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/WorkInProgress/Chemistry-Tools.dm b/code/WorkInProgress/Chemistry-Tools.dm
index 6f8affa56bb..1d766d94ca1 100644
--- a/code/WorkInProgress/Chemistry-Tools.dm
+++ b/code/WorkInProgress/Chemistry-Tools.dm
@@ -357,6 +357,18 @@
amount_per_transfer_from_this = 10
flags = FPRINT | TABLEPASS | OPENCONTAINER
+ var/list/can_be_placed_into = list(
+ /obj/machinery/chem_master/,
+ /obj/table,
+ /obj/secure_closet,
+ /obj/closet,
+ /obj/item/weapon/storage,
+ /obj/machinery/atmospherics/unary/cryo_cell,
+ /obj/item/weapon/chem_grenade,
+ /obj/machinery/bot/medbot,
+ /obj/machinery/pandemic,
+ /obj/item/weapon/secstorage/ssafe)
+
examine()
set src in view(2)
..()
@@ -374,7 +386,8 @@
R.my_atom = src
afterattack(obj/target, mob/user , flag)
-
+ if(src.can_be_placed_into.Find(target.type))
+ return
if(ismob(target) && target.reagents && reagents.total_volume)
user << "\blue You splash the solution onto [target]."
for(var/mob/O in viewers(world.view, user))
@@ -407,7 +420,7 @@
var/trans = src.reagents.trans_to(target, 10)
user << "\blue You transfer [trans] units of the solution to [target]."
- else if(reagents.total_volume && !istype(target,/obj/machinery/chem_master/) && !istype(target,/obj/table) && !istype(target,/obj/secure_closet) && !istype(target,/obj/closet) && !istype(target,/obj/item/weapon/storage) && !istype(target, /obj/machinery/atmospherics/unary/cryo_cell) && !istype(target, /obj/item/weapon/chem_grenade) && !istype(target, /obj/machinery/bot/medbot) &&!istype(target, /obj/machinery/pandemic))
+ else if(reagents.total_volume)
user << "\blue You splash the solution onto [target]."
src.reagents.reaction(target, TOUCH)
spawn(5) src.reagents.clear_reagents()
@@ -547,7 +560,7 @@
B.volume = amount
//set reagent data
B.data["donor"] = T
- if(T.virus)
+ if(T.virus && T.virus.spread_type != SPECIAL)
B.data["virus"] = new T.virus.type
B.data["blood_DNA"] = copytext(T.dna.unique_enzymes,1,0)
if(T.resistances&&T.resistances.len)
diff --git a/code/datums/disease.dm b/code/datums/disease.dm
index ca8f4078f16..3d249f8f1ba 100644
--- a/code/datums/disease.dm
+++ b/code/datums/disease.dm
@@ -1,3 +1,18 @@
+#define SPECIAL 0
+#define CONTACT_GENERAL 1
+#define CONTACT_HANDS 2
+#define CONTACT_FEET 3
+#define AIRBORNE 4
+
+/*
+
+IMPORTANT NOTE: Please delete the diseases by using cure() proc or del() instruction.
+Diseases are referenced in global list, so simply setting mob or obj vars
+to null does not delete the object itself. Thank you.
+
+*/
+
+
/datum/disease
var/name = "No disease"
var/stage = 1 //all diseases start at stage 1
@@ -6,14 +21,19 @@
var/cure_id = null// reagent.id or list containing them
var/cure_chance = 8//chance for the cure to do its job
var/spread = null
+ var/spread_type = AIRBORNE
+ var/contagious_period = 0//the disease stage when it can be spread
var/list/affected_species = list()
var/mob/affected_mob = null
+ var/holder = null
var/carrier = 0.0 //there will be a small chance that the person will be a carrier
var/curable = 1 //can this disease be cured? (By itself...)
var/list/strain_data = list() //This is passed on to infectees
var/stage_prob = 5 // probability of advancing to next stage, default 5% per check
var/agent = "some microbes"//name of the disease agent
- var/permeability_mod = 0//permeability modifier. Positive gives better chance, negative - worse.
+ var/permeability_mod = 1//permeability modifier coefficient.
+ var/desc = null//description. Leave it null and this disease won't show in med records.
+ var/severity = null//severity descr
/datum/disease/proc/stage_act()
@@ -32,9 +52,8 @@
stage++
if(stage != 1 && (prob(1) || (cure_present && prob(cure_chance))))
stage--
- else if(stage == 1 && ((prob(1) && affected_mob.virus.curable) || (cure_present && prob(cure_chance))))
- affected_mob.resistances += affected_mob.virus.type
- affected_mob.virus = null
+ else if(stage <= 1 && ((prob(1) && src.curable) || (cure_present && prob(cure_chance))))
+ src.cure()
return
return
@@ -51,18 +70,25 @@
/mob/proc/contract_disease(var/datum/disease/virus, var/skip_this = 0)
+ world << "Contract_disease called by [src] with virus [virus]"
- if(src.resistances.Find(virus.type))
- if(prob(99)) return
- src.resistances.Remove(virus.type)//the resistance is futile
-
- //For alien egg and stuff
if(skip_this == 1)
- src.virus = virus
+ if(src.virus)
+ src.virus.cure(0)
+ src.virus = new virus.type
src.virus.affected_mob = src
+ src.virus.strain_data = virus.strain_data.Copy()
+ src.virus.holder = src
if(prob(5))
src.virus.carrier = 1
return
+
+ if(src.virus) return
+
+ if(src.resistances.Find(virus.type))
+ if(prob(99.9)) return
+ src.resistances.Remove(virus.type)//the resistance is futile
+
/*
var/list/clothing_areas = list()
var/list/covers = list(UPPER_TORSO,LOWER_TORSO,LEGS,FEET,ARMS,HANDS)
@@ -76,11 +102,36 @@
clothing_areas[Covers] += Clothing
*/
- if(prob(15)) return
+ if(prob(15/virus.permeability_mod)) return
var/obj/item/clothing/Cl = null
var/passed = 1
- var/target_zone = pick(1,2,50;3,50;4)//1 - head, 2 - body, 3 - hands, 4- feet
+
+ //chances to target this zone
+ var/head_ch
+ var/body_ch
+ var/hands_ch
+ var/feet_ch
+
+ switch(virus.spread_type)
+ if(CONTACT_HANDS)
+ head_ch = 0
+ body_ch = 0
+ hands_ch = 100
+ feet_ch = 0
+ if(CONTACT_FEET)
+ head_ch = 0
+ body_ch = 0
+ hands_ch = 0
+ feet_ch = 100
+ else
+ head_ch = 100
+ body_ch = 100
+ hands_ch = 25
+ feet_ch = 25
+
+
+ var/target_zone = pick(head_ch;1,body_ch;2,hands_ch;3,feet_ch;4)//1 - head, 2 - body, 3 - hands, 4- feet
if(istype(src, /mob/living/carbon/human))
var/mob/living/carbon/human/H = src
@@ -89,38 +140,38 @@
if(1)
if(H.head)
Cl = H.head
- passed = prob(Cl.permeability_coefficient*100+virus.permeability_mod)
+ passed = prob(Cl.permeability_coefficient*100*virus.permeability_mod)
//world << "Head pass [passed]"
if(passed && H.wear_mask)
Cl = H.wear_mask
- passed = prob(Cl.permeability_coefficient*100+virus.permeability_mod)
+ passed = prob(Cl.permeability_coefficient*100*virus.permeability_mod)
//world << "Mask pass [passed]"
if(2)//arms and legs included
if(H.wear_suit)
Cl = H.wear_suit
- passed = prob(Cl.permeability_coefficient*100+virus.permeability_mod)
+ passed = prob(Cl.permeability_coefficient*100*virus.permeability_mod)
//world << "Suit pass [passed]"
if(passed && H.slot_w_uniform)
Cl = H.slot_w_uniform
- passed = prob(Cl.permeability_coefficient*100+virus.permeability_mod)
+ passed = prob(Cl.permeability_coefficient*100*virus.permeability_mod)
//world << "Uniform pass [passed]"
if(3)
if(H.wear_suit && H.wear_suit.body_parts_covered&HANDS)
Cl = H.wear_suit
- passed = prob(Cl.permeability_coefficient*100+virus.permeability_mod)
+ passed = prob(Cl.permeability_coefficient*100*virus.permeability_mod)
if(passed && H.gloves)
Cl = H.gloves
- passed = prob(Cl.permeability_coefficient*100+virus.permeability_mod)
+ passed = prob(Cl.permeability_coefficient*100*virus.permeability_mod)
//world << "Gloves pass [passed]"
if(4)
if(H.wear_suit && H.wear_suit.body_parts_covered&FEET)
Cl = H.wear_suit
- passed = prob(Cl.permeability_coefficient*100+virus.permeability_mod)
+ passed = prob(Cl.permeability_coefficient*100*virus.permeability_mod)
if(passed && H.shoes)
Cl = H.shoes
- passed = prob(Cl.permeability_coefficient*100+virus.permeability_mod)
+ passed = prob(Cl.permeability_coefficient*100*virus.permeability_mod)
//world << "Shoes pass [passed]"
else
src << "Something strange's going on, something's wrong."
@@ -141,8 +192,8 @@
passed = prob(Cl.permeability_coefficient*100+virus.permeability_mod)
//world << "Mask pass [passed]"
- if(passed && virus.spread=="Airborne" && src.internals)
- passed = prob(60)
+ if(passed && virus.spread_type == AIRBORNE && src.internals)
+ passed = (prob(50*virus.permeability_mod))
if(passed)
// world << "Infection in the mob [src]. YAY"
@@ -175,9 +226,64 @@
else if(prob(15))
return
else*/
- src.virus = virus
+ src.virus = new virus.type
+ src.virus.strain_data = virus.strain_data.Copy()
src.virus.affected_mob = src
+ src.virus.holder = src
if(prob(5))
src.virus.carrier = 1
return
return
+
+
+/datum/disease/proc/spread(var/source=null)
+ //world << "Disease [src] proc spread was called from holder [source]"
+ if(src.spread_type == SPECIAL)//does not spread
+ return
+
+ if(src.stage < src.contagious_period) //the disease is not contagious at this stage
+ return
+
+ if(!source)//no holder specified
+ if(src.affected_mob)//no mob affected holder
+ source = src.affected_mob
+ else //no source and no mob affected. Rogue disease. Break
+ return
+
+
+ var/check_range = AIRBORNE//defaults to airborne - range 4
+ if(src.spread_type != AIRBORNE)
+ check_range = 1
+
+ for(var/mob/living/carbon/M in oviewers(check_range, source))
+ for(var/name in src.affected_species)
+ var/mob_type = text2path("/mob/living/carbon/[lowertext(name)]")
+ if(mob_type && istype(M, mob_type))
+ M.contract_disease(src)
+ break
+ return
+
+
+/datum/disease/proc/process()
+ if(!src.holder) return
+ if(prob(40))
+ src.spread(holder)
+ if(src.holder == src.affected_mob)
+ src.stage_act()
+ return
+
+/datum/disease/proc/cure(var/resistance=1)
+ var/datum/disease/D = src
+ src = null
+ if(resistance && src.affected_mob && !affected_mob.resistances.Find(D.type))
+ affected_mob.resistances += D.type
+ del(D)
+
+
+/datum/disease/New()
+ active_diseases += src
+
+/*
+/datum/disease/Del()
+ active_diseases.Remove(src)
+*/
diff --git a/code/datums/diseases/alien_embryo.dm b/code/datums/diseases/alien_embryo.dm
index 41c67e0b324..7c1e74137bd 100644
--- a/code/datums/diseases/alien_embryo.dm
+++ b/code/datums/diseases/alien_embryo.dm
@@ -10,10 +10,12 @@
name = "Unidentified Foreign Body"
max_stages = 5
spread = "None"
+ spread_type = SPECIAL
cure = "Unknown"
cure_id = list("lexorin","toxin","gargleblaster")
cure_chance = 20
affected_species = list("Human", "Monkey")
+ permeability_mod = 3//likely to infect
/datum/disease/alien_embryo/stage_act()
..()
diff --git a/code/datums/diseases/brainrot.dm b/code/datums/diseases/brainrot.dm
index 0195c48e7c2..b7609444a75 100644
--- a/code/datums/diseases/brainrot.dm
+++ b/code/datums/diseases/brainrot.dm
@@ -1,13 +1,16 @@
/datum/disease/brainrot
name = "Brainrot"
max_stages = 4
- spread = "Airborne"
+ spread = "On contact"
+ spread_type = CONTACT_GENERAL
cure = "Spaceacillin & Alkysine"
cure_id = list("alkysine","spaceacillin")
agent = "Cryptococcus Cosmosis"
affected_species = list("Human")
curable = 0
- cure_chance = 10
+ cure_chance = 15//higher chance to cure, since two reagents are required
+ desc = "This disease destroys the braincells, causing brain fever, brain necrosis and general intoxication."
+ severity = "Major"
/datum/disease/brainrot/stage_act() //Removed toxloss because damaging diseases are pretty horrible. Last round it killed the entire station because the cure didn't work -- Urist
..()
diff --git a/code/datums/diseases/cold.dm b/code/datums/diseases/cold.dm
index 82c4483dd70..1a58ce20f19 100644
--- a/code/datums/diseases/cold.dm
+++ b/code/datums/diseases/cold.dm
@@ -2,11 +2,13 @@
name = "The Cold"
max_stages = 3
spread = "Airborne"
- cure = "Rest"
- cure = "spaceacillin"
+ cure = "Rest & Spaceacillin"
+ cure_id = "spaceacillin"
agent = "XY-rhinovirus"
affected_species = list("Human", "Monkey")
- permeability_mod = -10
+ permeability_mod = 0.5
+ desc = "If left untreated the subject will contract the flu."
+ severity = "Minor"
/datum/disease/cold/stage_act()
..()
@@ -14,13 +16,11 @@
if(2)
if(affected_mob.sleeping && prob(40))
affected_mob << "\blue You feel better."
- affected_mob.resistances += affected_mob.virus.type
- affected_mob.virus = null
+ affected_mob.virus.cure()
return
if(prob(1) && prob(10))
affected_mob << "\blue You feel better."
- affected_mob.resistances += affected_mob.virus.type
- affected_mob.virus = null
+ affected_mob.virus.cure()
return
if(prob(1))
affected_mob.emote("sneeze")
@@ -33,13 +33,11 @@
if(3)
if(affected_mob.sleeping && prob(25))
affected_mob << "\blue You feel better."
- affected_mob.resistances += affected_mob.virus.type
- affected_mob.virus = null
+ affected_mob.virus.cure()
return
if(prob(1) && prob(10))
affected_mob << "\blue You feel better."
- affected_mob.resistances += affected_mob.virus.type
- affected_mob.virus = null
+ affected_mob.virus.cure()
if(prob(1))
affected_mob.emote("sneeze")
if(prob(1))
@@ -49,4 +47,6 @@
if(prob(1))
affected_mob << "\red Mucous runs down the back of your throat."
if(prob(1) && prob(50))
- affected_mob.contract_disease(new /datum/disease/flu)
+ var/datum/disease/Flu = new /datum/disease/flu
+ affected_mob.contract_disease(Flu,1)
+ del(Flu)
diff --git a/code/datums/diseases/dna_spread.dm b/code/datums/diseases/dna_spread.dm
index d75c9a9e7ac..23ad82b4c03 100644
--- a/code/datums/diseases/dna_spread.dm
+++ b/code/datums/diseases/dna_spread.dm
@@ -1,7 +1,8 @@
/datum/disease/dnaspread
name = "Space Retrovirus"
max_stages = 4
- spread = "Airborne"
+ spread = "On contact"
+ spread_type = CONTACT_GENERAL
cure = "Ryetalin"
cure = "ryetalyn"
curable = 0
@@ -9,6 +10,8 @@
affected_species = list("Human")
var/list/original_dna = list()
var/transformed = 0
+ desc = "This disease transplants the genetic code of the intial vector into new hosts."
+ severity = "Medium"
/datum/disease/dnaspread/stage_act()
@@ -32,7 +35,7 @@
if(4)
if(!src.transformed)
if ((!strain_data["name"]) || (!strain_data["UI"]) || (!strain_data["SE"]))
- affected_mob.virus = null
+ del(affected_mob.virus)
return
//Save original dna for when the disease is cured.
diff --git a/code/datums/diseases/fake_gbs.dm b/code/datums/diseases/fake_gbs.dm
index 51935d1a80c..3a264f5ca04 100644
--- a/code/datums/diseases/fake_gbs.dm
+++ b/code/datums/diseases/fake_gbs.dm
@@ -1,11 +1,14 @@
/datum/disease/fake_gbs
name = "GBS"
max_stages = 5
- spread = "Airborne"
+ spread = "On contact"
+ spread_type = CONTACT_GENERAL
cure = "Synaptizine & Sulfur"
cure_id = list("synaptizine","sulfur")
agent = "Gravitokinetic Bipotential SADS-"
affected_species = list("Human")
+ desc = "If left untreated death will occur."
+ severity = "Major"
/datum/disease/fake_gbs/stage_act()
..()
diff --git a/code/datums/diseases/flu.dm b/code/datums/diseases/flu.dm
index 1d2353fb79f..90b4b840cc1 100644
--- a/code/datums/diseases/flu.dm
+++ b/code/datums/diseases/flu.dm
@@ -4,10 +4,12 @@
spread = "Airborne"
cure = "Spaceacillin"
cure_id = "spaceacillin"
+ cure_chance = 10
agent = "H13N1 flu virion"
affected_species = list("Human")
- curable = 0
- permeability_mod = -5
+ permeability_mod = 0.75
+ desc = "If left untreated the subject will feel quite unwell."
+ severity = "Medium"
/datum/disease/flu/stage_act()
..()
diff --git a/code/datums/diseases/gbs.dm b/code/datums/diseases/gbs.dm
index 25405171537..954370bac12 100644
--- a/code/datums/diseases/gbs.dm
+++ b/code/datums/diseases/gbs.dm
@@ -1,7 +1,8 @@
/datum/disease/gbs
name = "GBS"
max_stages = 5
- spread = "Airborne"
+ spread = "On contact"
+ spread_type = CONTACT_GENERAL
cure = "Synaptizine & Sulfur"
cure_id = list("synaptizine","sulfur")
agent = "Gravitokinetic Bipotential SADS+"
diff --git a/code/datums/diseases/jungle_fever.dm b/code/datums/diseases/jungle_fever.dm
index 29ee0cdb9be..72e218a28f9 100644
--- a/code/datums/diseases/jungle_fever.dm
+++ b/code/datums/diseases/jungle_fever.dm
@@ -2,6 +2,9 @@
name = "Jungle Fever"
max_stages = 1
cure = "None"
- spread = "Airborne"
+ spread = "Bites"
+ spread_type = SPECIAL
affected_species = list("Monkey")
- curable = 0
\ No newline at end of file
+ curable = 0
+ desc = "Monkies with this disease will bite humans, causing humans to spontaneously mutate into a monkey."
+ severity = "Medium"
diff --git a/code/datums/diseases/magnitis.dm b/code/datums/diseases/magnitis.dm
index 8ea3f820bdb..fb9fe042b83 100644
--- a/code/datums/diseases/magnitis.dm
+++ b/code/datums/diseases/magnitis.dm
@@ -7,6 +7,9 @@
agent = "Fukkos Miracos"
affected_species = list("Human")
curable = 0
+ permeability_mod = 0.75
+ desc = "This disease disrupts the magnetic field of your body, making it act as if a powerful magnet. Injections of iron help stabilize the field."
+ severity = "Medium"
/datum/disease/magnitis/stage_act()
..()
diff --git a/code/datums/diseases/robotic_transformation.dm b/code/datums/diseases/robotic_transformation.dm
index b2e70069b61..ba5a81000b2 100644
--- a/code/datums/diseases/robotic_transformation.dm
+++ b/code/datums/diseases/robotic_transformation.dm
@@ -4,9 +4,12 @@
name = "Robotic Transformation"
max_stages = 5
spread = "Syringe"
+ spread_type = SPECIAL
cure = "None"
agent = "R2D2 Nanomachines"
affected_species = list("Human")
+ desc = "This disease, actually acute nanomachine infection, converts the victim into a cyborg."
+ severity = "Major"
/datum/disease/robotic_transformation/stage_act()
..()
diff --git a/code/datums/diseases/wizarditis.dm b/code/datums/diseases/wizarditis.dm
index 0875f19fd44..10baaf5d776 100644
--- a/code/datums/diseases/wizarditis.dm
+++ b/code/datums/diseases/wizarditis.dm
@@ -7,7 +7,9 @@
agent = "Rincewindus Vulgaris"
affected_species = list("Human")
curable = 0
- permeability_mod = -5
+ permeability_mod = 0.75
+ desc = "Some speculate, that this virus is the cause of Wizard Federation existance. Subjects affected show the signs of mental retardation, yelling obscure sentences or total gibberish. On late stages subjects sometime express the feelings of inner power, and, cite, 'the ability to control the forces of cosmos themselves!' A gulp of strong, manly spirits usually reverts them to normal, humanlike, condition."
+ severity = "Minor"
/*
BIRUZ BENNAR
@@ -24,7 +26,7 @@ STI KALY - blind
switch(stage)
if(2)
if(prob(4))
- affected_mob.say(pick("You shall not pass!", "Expeliarmus!", "By Merlins beard!", ""))
+ affected_mob.say(pick("You shall not pass!", "Expeliarmus!", "By Merlins beard!", "Feel the power of the Dark Side!"))
if(prob(2))
affected_mob << "\red You feel [pick("that you don't have enough mana.", "that the winds of magic are gone.", "an urge to summon familiar.")]"
@@ -43,70 +45,88 @@ STI KALY - blind
return
if(prob(2))
affected_mob << "\red You feel [pick("the tidal wave of raw power building inside","that this location gives you a +2 to INT and +1 to WIS","an urge to teleport")]."
- /* if(prob(5))
+ if(prob(5))
+ teleport()
- var/list/theareas = new/list()
- for(var/area/AR in world)
- if(theareas.Find(AR)) continue
- var/turf/picked = pick(get_area_turfs(AR.type))
- if (picked.z == affected_mob.z)
- theareas += AR
-
- var/area/thearea = pick(theareas)
- affected_mob.say("SCYAR NILA [uppertext(thearea.name)]")
-
- var/datum/effects/system/harmless_smoke_spread/smoke = new /datum/effects/system/harmless_smoke_spread()
- smoke.set_up(5, 0, affected_mob.loc)
- smoke.attach(affected_mob)
- smoke.start()
- var/list/L = list()
- for(var/turf/T in get_area_turfs(thearea.type))
- if(T.z != affected_mob.z) continue
- if(!T.density)
- var/clear = 1
- for(var/obj/O in T)
- if(O.density)
- clear = 0
- break
- if(clear)
- L+=T
-
- affected_mob.loc = pick(L)
- smoke.start()
-//Apparently it created a lagspike every time it was called -- Urist
- return */
return
/datum/disease/wizarditis/proc/spawn_wizard_clothes(var/chance=5)
- var/mob/living/carbon/human/H = affected_mob
- if(prob(chance))
- if(!istype(H.head, /obj/item/clothing/head/wizard))
- if(H.head)
- H.drop_from_slot(H.head)
- H.head = new /obj/item/clothing/head/wizard(H)
- H.head.layer = 20
- return
- if(prob(chance))
- if(!istype(H.wear_suit, /obj/item/clothing/suit/wizrobe))
- if(H.wear_suit)
- H.drop_from_slot(H.wear_suit)
- H.wear_suit = new /obj/item/clothing/suit/wizrobe(H)
- H.wear_suit.layer = 20
- return
- if(prob(chance))
- if(!istype(H.shoes, /obj/item/clothing/shoes/sandal))
- if(H.shoes)
- H.drop_from_slot(H.shoes)
- H.shoes = new /obj/item/clothing/shoes/sandal(H)
- H.shoes.layer = 20
- return
- if(prob(chance))
- if(!istype(H.r_hand, /obj/item/weapon/staff))
- if(H.r_hand)
- H.drop_from_slot(H.r_hand)
- H.r_hand = new /obj/item/weapon/staff(H)
- H.r_hand.layer = 20
- return
+ if(istype(affected_mob, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = affected_mob
+ if(prob(chance))
+ if(!istype(H.head, /obj/item/clothing/head/wizard))
+ if(H.head)
+ H.drop_from_slot(H.head)
+ H.head = new /obj/item/clothing/head/wizard(H)
+ H.head.layer = 20
+ return
+ if(prob(chance))
+ if(!istype(H.wear_suit, /obj/item/clothing/suit/wizrobe))
+ if(H.wear_suit)
+ H.drop_from_slot(H.wear_suit)
+ H.wear_suit = new /obj/item/clothing/suit/wizrobe(H)
+ H.wear_suit.layer = 20
+ return
+ if(prob(chance))
+ if(!istype(H.shoes, /obj/item/clothing/shoes/sandal))
+ if(H.shoes)
+ H.drop_from_slot(H.shoes)
+ H.shoes = new /obj/item/clothing/shoes/sandal(H)
+ H.shoes.layer = 20
+ return
+ else
+ var/mob/living/carbon/H = affected_mob
+ if(prob(chance))
+ if(!istype(H.r_hand, /obj/item/weapon/staff))
+ if(H.r_hand)
+ H.drop_from_slot(H.r_hand)
+ H.r_hand = new /obj/item/weapon/staff(H)
+ H.r_hand.layer = 20
+ return
return
+
+
+
+/datum/disease/wizarditis/proc/teleport()
+/*
+ var/list/theareas = new/list()
+ for(var/area/AR in world)
+ if(theareas.Find(AR)) continue
+ var/turf/picked = pick(get_area_turfs(AR.type)
+ if (picked && picked.z == affected_mob.z)
+ theareas += AR
+
+ var/area/thearea = pick(theareas)
+*/
+
+ var/list/theareas = new/list()
+ for(var/area/AR in orange(80, affected_mob))
+ if(theareas.Find(AR)) continue
+ theareas += AR
+
+ var/area/thearea = pick(theareas)
+
+ var/datum/effects/system/harmless_smoke_spread/smoke = new /datum/effects/system/harmless_smoke_spread()
+ smoke.set_up(5, 0, affected_mob.loc)
+ smoke.attach(affected_mob)
+ smoke.start()
+
+ var/list/L = list()
+ for(var/turf/T in get_area_turfs(thearea.type))
+ if(T.z != affected_mob.z) continue
+ if(!T.density)
+ var/clear = 1
+ for(var/obj/O in T)
+ if(O.density)
+ clear = 0
+ break
+ if(clear)
+ L+=T
+
+ affected_mob.say("SCYAR NILA [uppertext(thearea.name)]!")
+ affected_mob.loc = pick(L)
+ smoke.start()
+//Apparently it created a lagspike every time it was called -- Urist
+ return
\ No newline at end of file
diff --git a/code/datums/diseases/xeno_transformation.dm b/code/datums/diseases/xeno_transformation.dm
index e8276015521..72fd2b9874a 100644
--- a/code/datums/diseases/xeno_transformation.dm
+++ b/code/datums/diseases/xeno_transformation.dm
@@ -4,6 +4,7 @@
name = "Xenomorph Transformation"
max_stages = 5
spread = "Syringe"
+ spread_type = SPECIAL
cure = "None"
agent = "Rip-LEY Alien Microbes"
affected_species = list("Human")
diff --git a/code/defines/global.dm b/code/defines/global.dm
index b3fccdae074..e1d4bbe24cf 100644
--- a/code/defines/global.dm
+++ b/code/defines/global.dm
@@ -7,6 +7,7 @@ var/global
list/machines = list()
list/processing_items = list()
+ list/active_diseases = list()
//items that ask to be called every cycle
defer_powernet_rebuild = 0 // true if net rebuild will be called manually after an event
diff --git a/code/defines/obj/decal.dm b/code/defines/obj/decal.dm
index 35a3a1bdedf..1fd30a0a27b 100644
--- a/code/defines/obj/decal.dm
+++ b/code/defines/obj/decal.dm
@@ -28,6 +28,11 @@
blood_DNA = null
blood_type = null
+ Del()
+ if(virus)
+ virus.cure(0)
+ ..()
+
/obj/decal/cleanable/xenoblood
name = "Xeno blood"
desc = "It's green."
@@ -39,6 +44,11 @@
random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7")
var/datum/disease/virus = null
+ Del()
+ if(virus)
+ virus.cure(0)
+ ..()
+
/obj/decal/cleanable/blood/splatter
random_icon_states = list("gibbl1", "gibbl2", "gibbl3", "gibbl4", "gibbl5")
@@ -89,6 +99,11 @@
var/datum/disease/virus = null
random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7")
+ Del()
+ if(virus)
+ virus.cure(0)
+ ..()
+
/obj/decal/cleanable/oil/streak
random_icon_states = list("streak1", "streak2", "streak3", "streak4", "streak5")
diff --git a/code/game/atom_procs.dm b/code/game/atom_procs.dm
index d956db9edb4..4410644fab1 100644
--- a/code/game/atom_procs.dm
+++ b/code/game/atom_procs.dm
@@ -101,7 +101,8 @@
var/obj/decal/cleanable/blood/this = new /obj/decal/cleanable/blood(source2)
this.blood_DNA = M.dna.unique_enzymes
this.blood_type = M.b_type
- this.virus = M.virus
+ this.virus = new M.virus.type
+ this.virus.holder = this
else if (istype(src, /mob/living/carbon/human))
src.blood_DNA = M.dna.unique_enzymes
src.blood_type = M.b_type
@@ -124,19 +125,22 @@
var/turf/simulated/source1 = src
var/obj/decal/cleanable/blood/this = new /obj/decal/cleanable/blood(source1)
this.blood_DNA = M.dna.unique_enzymes
- this.virus = M.virus
+ this.virus = new M.virus.type
+ this.virus.holder = this
else if( istype(M, /mob/living/carbon/alien ))
if( istype(src, /turf/simulated) )
var/turf/simulated/source2 = src
var/obj/decal/cleanable/xenoblood/this = new /obj/decal/cleanable/xenoblood(source2)
- this.virus = M.virus
+ this.virus = new M.virus.type
+ this.virus.holder = this
else if( istype(M, /mob/living/silicon/robot ))
if( istype(src, /turf/simulated) )
var/turf/simulated/source2 = src
var/obj/decal/cleanable/oil/this = new /obj/decal/cleanable/oil(source2)
- this.virus = M.virus
+ this.virus = new M.virus.type
+ this.virus.holder = this
/atom/proc/clean_blood()
diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm
index 7307435c485..1f18cd6deb1 100644
--- a/code/game/machinery/computer/medical.dm
+++ b/code/game/machinery/computer/medical.dm
@@ -83,17 +83,15 @@
dat += text("New Record
")
dat += text("\nPrint Record
\nBack
", src, src)
if(5.0)
- dat += {"