diff --git a/code/WorkInProgress/virus2/analyser.dm b/code/WorkInProgress/virus2/analyser.dm
new file mode 100644
index 0000000000..3604d7955f
--- /dev/null
+++ b/code/WorkInProgress/virus2/analyser.dm
@@ -0,0 +1,78 @@
+/obj/machinery/disease2/diseaseanalyser
+ name = "Disease Analyser"
+ icon = 'virology.dmi'
+ icon_state = "analyser"
+ anchored = 1
+ density = 1
+
+ var/scanning = 0
+ var/pause = 0
+
+ var/obj/item/weapon/virusdish/dish = null
+
+/obj/machinery/disease2/diseaseanalyser/attackby(var/obj/I as obj, var/mob/user as mob)
+ if(istype(I,/obj/item/weapon/virusdish))
+ var/mob/living/carbon/c = user
+ if(!dish)
+
+ dish = I
+ c.drop_item()
+ I.loc = src
+ for(var/mob/M in viewers(src))
+ if(M == user) continue
+ M.show_message("\blue [user.name] inserts the [dish.name] in the [src.name]", 3)
+
+
+ else
+ user << "There is already a dish inserted"
+
+ //else
+ return
+
+
+/obj/machinery/disease2/diseaseanalyser/process()
+ if(stat & (NOPOWER|BROKEN))
+ return
+ use_power(500)
+ //src.updateDialog()
+
+
+ if(scanning)
+ scanning -= 1
+ if(scanning == 0)
+ var/r = "GNAv2 based virus lifeform"
+ r += "
Infection rate : [dish.virus2.infectionchance * 10]"
+ r += "
Spread form : [dish.virus2.spreadtype]"
+ r += "
Progress Speed : [dish.virus2.stageprob * 10]"
+ for(var/datum/disease2/effectholder/E in dish.virus2.effects)
+ r += "
Effect:[E.effect.name]. Strength : [E.multiplier * 8]. Verosity : [E.chance * 15]. Type : [5-E.stage]."
+ // display the antigens
+ var/code = ""
+ for(var/V in ANTIGENS) if(text2num(V) & dish.virus2.antigen) code += ANTIGENS[V]
+ r += "
Antigen pattern: [code]"
+
+ var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(src.loc)
+ P.info = r
+ dish.info = r
+ dish.analysed = 1
+ dish.loc = src.loc
+ dish = null
+ icon_state = "analyser"
+
+ for(var/mob/O in hearers(src, null))
+ O.show_message("\icon[src] \blue The [src.name] prints a sheet of paper", 3)
+ else if(dish && !scanning && !pause)
+ if(dish.virus2 && dish.growth > 50)
+ dish.growth -= 10
+ scanning = 5
+ icon_state = "analyser_processing"
+ else
+ pause = 1
+ spawn(25)
+ dish.loc = src.loc
+ dish = null
+ for(var/mob/M in viewers(src))
+ M.show_message("\icon[src] \blue The [src.name] buzzes", 2)
+ pause = 0
+
+ return
\ No newline at end of file
diff --git a/code/WorkInProgress/virus2/antibodies.dm b/code/WorkInProgress/virus2/antibodies.dm
new file mode 100644
index 0000000000..72953aa4ec
--- /dev/null
+++ b/code/WorkInProgress/virus2/antibodies.dm
@@ -0,0 +1,54 @@
+// pure concentrated antibodies
+datum/reagent/antibodies
+ data = new/list("antibodies"=0)
+ name = "Antibodies"
+ id = "antibodies"
+ reagent_state = LIQUID
+ color = "#0050F0"
+
+ reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
+ if(istype(M,/mob/living/carbon/human))
+ if(src.data && method == INGEST)
+ if(src.data["antibodies"] & M:virus2.antigen)
+ M:virus2.dead = 1
+ return
+
+// reserving some numbers for later special antigens
+var/global/const
+ ANTIGEN_A = 1
+ ANTIGEN_B = 2
+ ANTIGEN_RH = 4
+ ANTIGEN_Q = 8
+ ANTIGEN_U = 16
+ ANTIGEN_V = 32
+ ANTIGEN_X = 64
+ ANTIGEN_Y = 128
+ ANTIGEN_Z = 256
+ ANTIGEN_M = 512
+ ANTIGEN_N = 1024
+ ANTIGEN_P = 2048
+ ANTIGEN_O = 4096
+
+var/global/list/ANTIGENS = list("[ANTIGEN_A]" = "A", "[ANTIGEN_B]" = "B", "[ANTIGEN_RH]" = "RH", "[ANTIGEN_Q]" = "Q",
+ "[ANTIGEN_U]" = "U", "[ANTIGEN_V]" = "V", "[ANTIGEN_Z]" = "Z", "[ANTIGEN_M]" = "M",
+ "[ANTIGEN_N]" = "N", "[ANTIGEN_P]" = "P", "[ANTIGEN_O]" = "O")
+
+
+
+/obj/item/device/antibody_scanner
+ name = "Antibody Scanner"
+ desc = "Used to scan living beings for antibodies in their blood."
+ icon_state = "health"
+ w_class = 2.0
+ item_state = "electronic"
+ flags = FPRINT | TABLEPASS | ONBELT | CONDUCT | USEDELAY
+
+
+/obj/item/device/antibody_scanner/attack(mob/living/carbon/human/M as mob, mob/user as mob)
+ if(! istype(M, /mob/living/carbon) || !M:antibodies)
+ user << "Unable to detect antibodies.."
+ else
+ // iterate over the list of antigens and see what matches
+ var/code = ""
+ for(var/V in ANTIGENS) if(text2num(V) & M.antibodies) code += ANTIGENS[V]
+ user << text("\blue [src] The antibody scanner displays a cryptic set of data: [code]")
\ No newline at end of file
diff --git a/code/WorkInProgress/virus2/base.dm b/code/WorkInProgress/virus2/base.dm
new file mode 100644
index 0000000000..4b543badeb
--- /dev/null
+++ b/code/WorkInProgress/virus2/base.dm
@@ -0,0 +1,591 @@
+/obj/virus
+ // a virus instance that is placed on the map, moves, and infects
+ invisibility = 100
+
+ var/datum/disease2/disease
+
+ New()
+ ..()
+ step_rand(src)
+ step_rand(src)
+ anchored = 1
+ spawn(300) del(src)
+
+/mob/living/carbon/proc/get_infection_chance()
+ var/score = 0
+ var/mob/living/carbon/M = src
+ if(istype(M, /mob/living/carbon/human))
+ if(M:gloves)
+ score += 5
+ if(istype(M:wear_suit, /obj/item/clothing/suit/space)) score += 10
+ if(istype(M:wear_suit, /obj/item/clothing/suit/bio_suit)) score += 10
+ if(istype(M:head, /obj/item/clothing/head/helmet/space)) score += 5
+ if(istype(M:head, /obj/item/clothing/head/bio_hood)) score += 5
+ if(M.wear_mask)
+ score += 5
+ if(istype(M:wear_mask, /obj/item/clothing/mask/surgical) && !M.internal)
+ score += 10
+ if(M.internal)
+ score += 10
+
+ if(score >= 30)
+ return 0
+ else if(score == 25 && prob(99))
+ return 0
+ else if(score == 20 && prob(95))
+ return 0
+ else if(score == 15 && prob(75))
+ return 0
+ else if(score == 10 && prob(55))
+ return 0
+ else if(score == 5 && prob(35))
+ return 0
+
+ return 1
+
+
+/proc/infect_virus2(var/mob/living/carbon/M,var/datum/disease2/disease/disease,var/forced = 0)
+ if(M.virus2)
+ return
+ if(!disease)
+ return
+ //immunity
+ /*for(var/iii = 1, iii <= M.immunevirus2.len, iii++)
+ if(disease.issame(M.immunevirus2[iii]))
+ 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) return
+
+ for(var/datum/disease2/resistance/res in M.resistances)
+ if(res.resistsdisease(disease))
+ return
+ if(prob(disease.infectionchance) || forced)
+ if(M.virus2)
+ return
+ else
+ // certain clothes can prevent an infection
+ if(!forced && !M.get_infection_chance())
+ return
+
+ M.virus2 = disease.getcopy()
+ M.virus2.minormutate()
+
+ for(var/datum/disease2/resistance/res in M.resistances)
+ if(res.resistsdisease(M.virus2))
+ M.virus2 = null
+
+
+
+/datum/disease2/resistance
+ var/list/datum/disease2/effect/resistances = list()
+
+ proc/resistsdisease(var/datum/disease2/disease/virus2)
+ var/list/res2 = list()
+ for(var/datum/disease2/effect/e in resistances)
+ res2 += e.type
+ for(var/datum/disease2/effectholder/holder in virus2)
+ if(!(holder.effect.type in res2))
+ return 0
+ else
+ res2 -= holder.effect.type
+ if(res2.len > 0)
+ return 0
+ else
+ return 1
+
+ New(var/datum/disease2/disease/virus2)
+ for(var/datum/disease2/effectholder/h in virus2.effects)
+ resistances += h.effect.type
+
+
+/proc/infect_mob_random_lesser(var/mob/living/carbon/M)
+ if(!M.virus2)
+ M.virus2 = new /datum/disease2/disease
+ M.virus2.makerandom()
+ M.virus2.infectionchance = 1
+
+/proc/infect_mob_random_greater(var/mob/living/carbon/M)
+ if(!M.virus2)
+ M.virus2 = new /datum/disease2/disease
+ M.virus2.makerandom(1)
+
+/datum/disease2/var/antigen = 0 // 16 bits describing the antigens, when one bit is set, a cure with that bit can dock here
+
+/datum/disease2/disease
+ var/infectionchance = 10
+ var/speed = 1
+ var/spreadtype = "Blood" // Can also be "Airborne"
+ var/stage = 1
+ var/stageprob = 10
+ var/dead = 0
+ var/clicks = 0
+
+ var/uniqueID = 0
+ var/list/datum/disease2/effectholder/effects = list()
+ proc/makerandom(var/greater=0)
+ var/datum/disease2/effectholder/holder = new /datum/disease2/effectholder
+ holder.stage = 1
+ if(greater)
+ holder.getrandomeffect_greater()
+ else
+ holder.getrandomeffect_lesser()
+ effects += holder
+ holder = new /datum/disease2/effectholder
+ holder.stage = 2
+ if(greater)
+ holder.getrandomeffect_greater()
+ else
+ holder.getrandomeffect_lesser()
+ effects += holder
+ holder = new /datum/disease2/effectholder
+ holder.stage = 3
+ if(greater)
+ holder.getrandomeffect_greater()
+ else
+ holder.getrandomeffect_lesser()
+ effects += holder
+ holder = new /datum/disease2/effectholder
+ holder.stage = 4
+ if(greater)
+ holder.getrandomeffect_greater()
+ else
+ holder.getrandomeffect_lesser()
+ effects += holder
+ uniqueID = rand(0,10000)
+ infectionchance = rand(1,10)
+ // pick 2 antigens
+ antigen |= text2num(pick(ANTIGENS))
+ antigen |= text2num(pick(ANTIGENS))
+ spreadtype = "Airborne"
+
+ proc/makealien()
+ var/datum/disease2/effectholder/holder = new /datum/disease2/effectholder
+ holder.stage = 1
+ holder.chance = 10
+ holder.effect = new/datum/disease2/effect/lesser/gunck()
+ effects += holder
+
+ holder = new /datum/disease2/effectholder
+ holder.stage = 2
+ holder.chance = 10
+ holder.effect = new/datum/disease2/effect/lesser/cough()
+ effects += holder
+
+ holder = new /datum/disease2/effectholder
+ holder.stage = 3
+ holder.chance = 10
+ holder.effect = new/datum/disease2/effect/greater/toxins()
+ effects += holder
+
+ holder = new /datum/disease2/effectholder
+ holder.stage = 4
+ holder.chance = 10
+ holder.effect = new/datum/disease2/effect/alien()
+ effects += holder
+
+ uniqueID = 896 // all alien diseases have the same ID
+ infectionchance = 0
+ spreadtype = "Airborne"
+
+ proc/minormutate()
+ var/datum/disease2/effectholder/holder = pick(effects)
+ holder.minormutate()
+ infectionchance = min(10,infectionchance + rand(0,1))
+
+ proc/issame(var/datum/disease2/disease/disease)
+ var/list/types = list()
+ var/list/types2 = list()
+ for(var/datum/disease2/effectholder/d in effects)
+ types += d.effect.type
+ var/equal = 1
+
+ for(var/datum/disease2/effectholder/d in disease.effects)
+ types2 += d.effect.type
+
+ for(var/type in types)
+ if(!(type in types2))
+ equal = 0
+ return equal
+
+ proc/activate(var/mob/living/carbon/mob)
+ if(dead)
+ cure(mob)
+ mob.virus2 = null
+ return
+ if(mob.stat == 2)
+ return
+ // with a certain chance, the mob may become immune to the disease before it starts properly
+ if(stage <= 1 && clicks == 0)
+ if(prob(20))
+ mob.antibodies |= antigen // 20% immunity is a good chance IMO, because it allows finding an immune person easily
+ else
+ if(mob.radiation > 50)
+ if(prob(1))
+ majormutate()
+ if(mob.reagents.has_reagent("spaceacillin"))
+ mob.reagents.remove_reagent("spaceacillin",0.3)
+ return
+ if(mob.reagents.has_reagent("virusfood"))
+ mob.reagents.remove_reagent("virusfood",0.1)
+ clicks += 10
+ if(clicks > stage*100 && prob(10))
+ if(stage == 4)
+ var/datum/disease2/resistance/res = new /datum/disease2/resistance(src)
+ src.cure(mob)
+ mob.resistances2 += res
+ mob.antibodies |= src.antigen
+ mob.virus2 = null
+ del src
+ stage++
+ clicks = 0
+ for(var/datum/disease2/effectholder/e in effects)
+ e.runeffect(mob,stage)
+ clicks+=speed
+
+ proc/cure(var/mob/living/carbon/mob)
+ var/datum/disease2/effectholder/E
+ if(stage>1)
+ E = effects[1]
+ E.effect.deactivate(mob)
+ if(stage>2)
+ E = effects[2]
+ E.effect.deactivate(mob)
+ if(stage>3)
+ E = effects[3]
+ E.effect.deactivate(mob)
+ if(stage>4)
+ E = effects[4]
+ E.effect.deactivate(mob)
+
+ proc/cure_added(var/datum/disease2/resistance/res)
+ if(res.resistsdisease(src))
+ dead = 1
+
+ proc/majormutate()
+ var/datum/disease2/effectholder/holder = pick(effects)
+ holder.majormutate()
+
+
+ proc/getcopy()
+// world << "getting copy"
+ var/datum/disease2/disease/disease = new /datum/disease2/disease
+ disease.infectionchance = infectionchance
+ disease.spreadtype = spreadtype
+ disease.stageprob = stageprob
+ disease.antigen = antigen
+ for(var/datum/disease2/effectholder/holder in effects)
+ // world << "adding effects"
+ var/datum/disease2/effectholder/newholder = new /datum/disease2/effectholder
+ newholder.effect = new holder.effect.type
+ newholder.chance = holder.chance
+ newholder.cure = holder.cure
+ newholder.multiplier = holder.multiplier
+ newholder.happensonce = holder.happensonce
+ newholder.stage = holder.stage
+ disease.effects += newholder
+ // world << "[newholder.effect.name]"
+ // world << "[disease]"
+ return disease
+
+/datum/disease2/effect
+ var/chance_maxm = 100
+ var/name = "Blanking effect"
+ var/stage = 4
+ var/maxm = 1
+ proc/activate(var/mob/living/carbon/mob,var/multiplier)
+ proc/deactivate(var/mob/living/carbon/mob)
+
+/datum/disease2/effect/alien
+ name = "Unidentified Foreign Body"
+ stage = 4
+ activate(var/mob/living/carbon/mob,var/multiplier)
+ mob << "\red You feel something tearing its way out of your stomach..."
+ mob.toxloss += 10
+ mob.updatehealth()
+ if(prob(40))
+ if(mob.client)
+ mob.client.mob = new/mob/living/carbon/alien/larva(mob.loc)
+ else
+ new/mob/living/carbon/alien/larva(mob.loc)
+ var/datum/disease2/disease/D = mob:virus2
+ mob:gib()
+ del D
+
+/datum/disease2/effect/greater/gibbingtons
+ name = "Gibbingtons Syndrome"
+ stage = 4
+ activate(var/mob/living/carbon/mob,var/multiplier)
+ mob.gib()
+
+/datum/disease2/effect/greater/radian
+ name = "Radian's syndrome"
+ stage = 4
+ maxm = 3
+ activate(var/mob/living/carbon/mob,var/multiplier)
+ mob.radiation += (2*multiplier)
+
+/datum/disease2/effect/greater/toxins
+ name = "Hyperacid Syndrome"
+ stage = 3
+ maxm = 3
+ activate(var/mob/living/carbon/mob,var/multiplier)
+ mob.toxloss += (2*multiplier)
+
+/datum/disease2/effect/greater/scream
+ name = "Random screaming syndrome"
+ stage = 2
+ activate(var/mob/living/carbon/mob,var/multiplier)
+ mob.say("*scream")
+
+/datum/disease2/effect/greater/drowsness
+ name = "Automated sleeping syndrome"
+ stage = 2
+ activate(var/mob/living/carbon/mob,var/multiplier)
+ mob.drowsyness += 10
+
+/datum/disease2/effect/greater/shakey
+ name = "World Shaking syndrome"
+ stage = 3
+ maxm = 3
+ activate(var/mob/living/carbon/mob,var/multiplier)
+ shake_camera(mob,5*multiplier)
+
+/datum/disease2/effect/greater/deaf
+ name = "Hard of hearing syndrome"
+ stage = 4
+ activate(var/mob/living/carbon/mob,var/multiplier)
+ mob.ear_deaf += 20
+
+/datum/disease2/effect/invisible
+ name = "Waiting Syndrome"
+ stage = 1
+ activate(var/mob/living/carbon/mob,var/multiplier)
+ return
+
+/datum/disease2/effect/greater/telepathic
+ name = "Telepathy Syndrome"
+ stage = 3
+ activate(var/mob/living/carbon/mob,var/multiplier)
+ mob.mutations |= 512
+
+/*/datum/disease2/effect/greater/noface
+ name = "Identity Loss syndrome"
+ stage = 4
+ activate(var/mob/living/carbon/mob,var/multiplier)
+ mob.face_dmg++
+ deactivate(var/mob/living/carbon/mob)
+ mob.face_dmg--*/
+
+/datum/disease2/effect/greater/monkey
+ name = "Monkism syndrome"
+ stage = 4
+ activate(var/mob/living/carbon/mob,var/multiplier)
+ if(istype(mob,/mob/living/carbon/human))
+ var/mob/living/carbon/human/h = mob
+ h.monkeyize()
+
+/datum/disease2/effect/greater/sneeze
+ name = "Coldingtons Effect"
+ stage = 1
+ activate(var/mob/living/carbon/mob,var/multiplier)
+ mob.say("*sneeze")
+
+/datum/disease2/effect/greater/gunck
+ name = "Flemmingtons"
+ stage = 1
+ activate(var/mob/living/carbon/mob,var/multiplier)
+ mob << "\red Mucous runs down the back of your throat."
+
+/datum/disease2/effect/greater/killertoxins
+ name = "Toxification syndrome"
+ stage = 4
+ activate(var/mob/living/carbon/mob,var/multiplier)
+ mob.toxloss += 15
+
+/*/datum/disease2/effect/greater/hallucinations
+ name = "Hallucinational Syndrome"
+ stage = 3
+ activate(var/mob/living/carbon/mob,var/multiplier)
+ mob.hallucination += 25*/
+
+/datum/disease2/effect/greater/sleepy
+ name = "Resting syndrome"
+ stage = 2
+ activate(var/mob/living/carbon/mob,var/multiplier)
+ mob.say("*collapse")
+
+/datum/disease2/effect/greater/mind
+ name = "Lazy mind syndrome"
+ stage = 3
+ activate(var/mob/living/carbon/mob,var/multiplier)
+ mob.brainloss = 50
+
+/datum/disease2/effect/greater/suicide
+ name = "Suicidal syndrome"
+ stage = 4
+ activate(var/mob/living/carbon/mob,var/multiplier)
+ mob.suiciding = 1
+ //instead of killing them instantly, just put them at -175 health and let 'em gasp for a while
+ viewers(mob) << "\red [mob.name] is holding \his breath. It looks like \he's trying to commit suicide."
+ mob.oxyloss = max(175 - mob.toxloss - mob.fireloss - mob.bruteloss, mob.oxyloss)
+ mob.updatehealth()
+ spawn(200) //in case they get revived by cryo chamber or something stupid like that, let them suicide again in 20 seconds
+ mob.suiciding = 0
+
+// lesser syndromes, partly just copypastes
+/datum/disease2/effect/lesser/mind
+ name = "Lazy mind syndrome"
+ stage = 3
+ activate(var/mob/living/carbon/mob,var/multiplier)
+ mob.brainloss = 20
+
+/datum/disease2/effect/lesser/drowsy
+ name = "Bedroom Syndrome"
+ stage = 2
+ activate(var/mob/living/carbon/mob,var/multiplier)
+ mob.drowsyness = 5
+
+/datum/disease2/effect/lesser/deaf
+ name = "Hard of hearing syndrome"
+ stage = 3
+ activate(var/mob/living/carbon/mob,var/multiplier)
+ mob.ear_deaf = 5
+
+/datum/disease2/effect/lesser/gunck
+ name = "Flemmingtons"
+ stage = 1
+ activate(var/mob/living/carbon/mob,var/multiplier)
+ mob << "\red Mucous runs down the back of your throat."
+
+/datum/disease2/effect/lesser/radian
+ name = "Radian's syndrome"
+ stage = 4
+ maxm = 3
+ activate(var/mob/living/carbon/mob,var/multiplier)
+ mob.radiation += 1
+
+/datum/disease2/effect/lesser/sneeze
+ name = "Coldingtons Effect"
+ stage = 1
+ activate(var/mob/living/carbon/mob,var/multiplier)
+ mob.say("*sneeze")
+
+/datum/disease2/effect/lesser/cough
+ name = "Anima Syndrome"
+ stage = 2
+ activate(var/mob/living/carbon/mob,var/multiplier)
+ mob.say("*cough")
+
+/*/datum/disease2/effect/lesser/hallucinations
+ name = "Hallucinational Syndrome"
+ stage = 3
+ activate(var/mob/living/carbon/mob,var/multiplier)
+ mob.hallucination += 5*/
+
+/*/datum/disease2/effect/lesser/arm
+ name = "Disarming Syndrome"
+ stage = 4
+ activate(var/mob/living/carbon/mob,var/multiplier)
+ var/datum/organ/external/org = mob.organs["r_arm"]
+ org.take_damage(3,0,0,0)
+ mob << "\red You feel a sting in your right arm."*/
+
+/datum/disease2/effect/lesser/hungry
+ name = "Appetiser Effect"
+ stage = 2
+ activate(var/mob/living/carbon/mob,var/multiplier)
+ mob.nutrition = max(0, mob.nutrition - 200)
+
+/datum/disease2/effect/lesser/groan
+ name = "Groaning Syndrome"
+ stage = 3
+ activate(var/mob/living/carbon/mob,var/multiplier)
+ mob.say("*groan")
+
+/datum/disease2/effect/lesser/scream
+ name = "Loudness Syndrome"
+ stage = 4
+ activate(var/mob/living/carbon/mob,var/multiplier)
+ mob.say("*scream")
+
+/datum/disease2/effect/lesser/drool
+ name = "Saliva Effect"
+ stage = 1
+ activate(var/mob/living/carbon/mob,var/multiplier)
+ mob.say("*drool")
+
+/datum/disease2/effect/lesser/fridge
+ name = "Refridgerator Syndrome"
+ stage = 2
+ activate(var/mob/living/carbon/mob,var/multiplier)
+ mob.say("*shiver")
+
+/datum/disease2/effect/lesser/twitch
+ name = "Twitcher"
+ stage = 1
+ activate(var/mob/living/carbon/mob,var/multiplier)
+ mob.say("*twitch")
+
+/*Removed on request by Spaceman, due to it being detrimental to RP. -CN
+/datum/disease2/effect/lesser/deathgasp
+ name = "Zombie Syndrome"
+ stage = 4
+ activate(var/mob/living/carbon/mob,var/multiplier)
+ mob.say("*deathgasp")*/
+
+/datum/disease2/effect/lesser/giggle
+ name = "Uncontrolled Laughter Effect"
+ stage = 3
+ activate(var/mob/living/carbon/mob,var/multiplier)
+ mob.say("*giggle")
+
+
+/datum/disease2/effect/lesser
+ chance_maxm = 10
+
+/datum/disease2/effectholder
+ var/name = "Holder"
+ var/datum/disease2/effect/effect
+ var/chance = 0 //Chance in percentage each tick
+ var/cure = "" //Type of cure it requires
+ var/happensonce = 0
+ var/multiplier = 1 //The chance the effects are WORSE
+ var/stage = 0
+
+ proc/runeffect(var/mob/living/carbon/human/mob,var/stage)
+ if(happensonce > -1 && effect.stage <= stage && prob(chance))
+ effect.activate(mob)
+ if(happensonce == 1)
+ happensonce = -1
+
+ proc/getrandomeffect_greater()
+ var/list/datum/disease2/effect/list = list()
+ for(var/e in (typesof(/datum/disease2/effect/greater) - /datum/disease2/effect/greater))
+ // world << "Making [e]"
+ var/datum/disease2/effect/f = new e
+ if(f.stage == src.stage)
+ list += f
+ effect = pick(list)
+ chance = rand(1,6)
+
+ proc/getrandomeffect_lesser()
+ var/list/datum/disease2/effect/list = list()
+ for(var/e in (typesof(/datum/disease2/effect/lesser) - /datum/disease2/effect/lesser))
+ var/datum/disease2/effect/f = new e
+ if(f.stage == src.stage)
+ list += f
+ effect = pick(list)
+ chance = rand(1,6)
+
+ proc/minormutate()
+ switch(pick(1,2,3,4,5))
+ if(1)
+ chance = rand(0,effect.chance_maxm)
+ if(2)
+ multiplier = rand(1,effect.maxm)
+ proc/majormutate()
+ getrandomeffect_greater()
+
+/proc/dprob(var/p)
+ return(prob(sqrt(p)) && prob(sqrt(p)))
\ No newline at end of file
diff --git a/code/WorkInProgress/virus2/biohazard destroyer.dm b/code/WorkInProgress/virus2/biohazard destroyer.dm
new file mode 100644
index 0000000000..3e5f16df59
--- /dev/null
+++ b/code/WorkInProgress/virus2/biohazard destroyer.dm
@@ -0,0 +1,20 @@
+/obj/machinery/disease2/biodestroyer
+ name = "Biohazard destroyer"
+ icon = 'disposal.dmi'
+ icon_state = "disposalbio"
+ var/list/accepts = list(/obj/item/clothing,/obj/item/weapon/virusdish/,/obj/item/weapon/cureimplanter,/obj/item/weapon/diseasedisk,/obj/item/weapon/reagent_containers)
+ density = 1
+ anchored = 1
+
+/obj/machinery/disease2/biodestroyer/attackby(var/obj/I as obj, var/mob/user as mob)
+ for(var/path in accepts)
+ if(I.type in typesof(path))
+ user.drop_item()
+ del(I)
+ overlays += image('disposal.dmi', "dispover-handle")
+ return
+ user.drop_item()
+ I.loc = src.loc
+
+ for(var/mob/O in hearers(src, null))
+ O.show_message("\icon[src] \blue The [src.name] beeps", 2)
\ No newline at end of file
diff --git a/code/WorkInProgress/virus2/cureimplanter.dm b/code/WorkInProgress/virus2/cureimplanter.dm
new file mode 100644
index 0000000000..ea40dff733
--- /dev/null
+++ b/code/WorkInProgress/virus2/cureimplanter.dm
@@ -0,0 +1,43 @@
+/obj/item/weapon/cureimplanter
+ name = "Hypospray injector"
+ icon = 'items.dmi'
+ icon_state = "implanter1"
+ var/datum/disease2/resistance/resistance = null
+ var/works = 0
+ var/datum/disease2/disease/virus2 = null
+ item_state = "syringe_0"
+ throw_speed = 1
+ throw_range = 5
+ w_class = 2.0
+
+
+/obj/item/weapon/cureimplanter/attack(mob/target as mob, mob/user as mob)
+ if(ismob(target))
+ for(var/mob/O in viewers(world.view, user))
+ if (target != user)
+ O.show_message(text("\red [] is trying to inject [] with [src.name]!", user, target), 1)
+ else
+ O.show_message("\red [user] is trying to inject themselves with [src.name]!", 1)
+ if(!do_mob(user, target,60)) return
+
+
+ for(var/mob/O in viewers(world.view, user))
+ if (target != user)
+ O.show_message(text("\red [] injects [] with [src.name]!", user, target), 1)
+ else
+ O.show_message("\red [user] injects themself with [src.name]!", 1)
+
+
+ var/mob/living/carbon/M = target
+
+ if(works == 0)
+ M.resistances2 += resistance
+ //M.immunevirus2 += M.virus2.getcopy()
+ if(M.virus2)
+ M.virus2.cure_added(resistance)
+ else if(works == 1)
+ M.toxloss += 60
+ else if(works == 2)
+ M.gib()
+ else if(works == 3)
+ infect_virus2(M,virus2,1)
\ No newline at end of file
diff --git a/code/WorkInProgress/virus2/curer.dm b/code/WorkInProgress/virus2/curer.dm
new file mode 100644
index 0000000000..f4f53cff1b
--- /dev/null
+++ b/code/WorkInProgress/virus2/curer.dm
@@ -0,0 +1,129 @@
+/obj/machinery/computer/curer
+ name = "Cure Research Machine"
+ icon = 'computer.dmi'
+ icon_state = "dna"
+ var/curing
+ var/virusing
+
+ var/obj/item/weapon/reagent_containers/container = null
+
+/obj/machinery/computer/curer/attackby(var/obj/I as obj, var/mob/user as mob)
+ if(istype(I, /obj/item/weapon/screwdriver))
+ playsound(src.loc, 'Screwdriver.ogg', 50, 1)
+ if(do_after(user, 20))
+ if (src.stat & BROKEN)
+ user << "\blue The broken glass falls out."
+ var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
+ new /obj/item/weapon/shard( src.loc )
+ //var/obj/item/weapon/circuitboard/curer/M = new /obj/item/weapon/circuitboard/curer( A )
+ for (var/obj/C in src)
+ C.loc = src.loc
+ //A.circuit = M
+ A.state = 3
+ A.icon_state = "3"
+ A.anchored = 1
+ del(src)
+ else
+ user << "\blue You disconnect the monitor."
+ var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
+ //var/obj/item/weapon/circuitboard/curer/M = new /obj/item/weapon/circuitboard/curer( A )
+ for (var/obj/C in src)
+ C.loc = src.loc
+ //A.circuit = M
+ A.state = 4
+ A.icon_state = "4"
+ A.anchored = 1
+ del(src)
+ if(istype(I,/obj/item/weapon/reagent_containers))
+ var/mob/living/carbon/C = user
+ if(!container)
+ container = I
+ C.drop_item()
+ I.loc = src
+
+ //else
+ src.attack_hand(user)
+ return
+
+/obj/machinery/computer/curer/attack_ai(var/mob/user as mob)
+ return src.attack_hand(user)
+
+/obj/machinery/computer/curer/attack_paw(var/mob/user as mob)
+
+ return src.attack_hand(user)
+ return
+
+/obj/machinery/computer/curer/attack_hand(var/mob/user as mob)
+ if(..())
+ return
+ user.machine = src
+ var/dat
+ if(curing)
+ dat = "Antibody production in progress"
+ else if(virusing)
+ dat = "Virus production in progress"
+ else if(container)
+ // see if there's any blood in the container
+ var/datum/reagent/blood/B = locate(/datum/reagent/blood) in container.reagents.reagent_list
+
+ if(B)
+ dat = "Blood sample inserted."
+ dat += "
Begin antibody production"
+ else
+ dat += "
Please check container contents."
+ dat += "
Eject container"
+ else
+ dat = "Please insert a container."
+
+ user << browse(dat, "window=computer;size=400x500")
+ onclose(user, "computer")
+ return
+
+/obj/machinery/computer/curer/process()
+ ..()
+
+ if(stat & (NOPOWER|BROKEN))
+ return
+ use_power(500)
+ //src.updateDialog()
+
+ if(curing)
+ curing -= 1
+ if(curing == 0)
+ if(container)
+ createcure(container)
+ return
+
+/obj/machinery/computer/curer/Topic(href, href_list)
+ if(..())
+ return
+ if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon)))
+ usr.machine = src
+
+ if (href_list["antibody"])
+ curing = 10
+ else if(href_list["eject"])
+ container.loc = src.loc
+ container = null
+
+ src.add_fingerprint(usr)
+ src.updateUsrDialog()
+ return
+
+
+/obj/machinery/computer/curer/proc/createcure(var/obj/item/weapon/reagent_containers/container)
+ var/obj/item/weapon/reagent_containers/glass/beaker/product = new(src.loc)
+
+ var/datum/reagent/blood/B = locate() in container.reagents.reagent_list
+
+ var/list/data = list()
+ data["antibodies"] = B.data["antibodies"]
+ product.reagents.add_reagent("antibodies",30,data)
+
+ state("The [src.name] Buzzes", "blue")
+
+/obj/machinery/computer/curer/proc/createvirus(var/datum/disease2/disease/virus2)
+ var/obj/item/weapon/cureimplanter/implanter = new /obj/item/weapon/cureimplanter(src.loc)
+ implanter.name = "Viral implanter (MAJOR BIOHAZARD)"
+ implanter.works = 3
+ state("The [src.name] Buzzes", "blue")
\ No newline at end of file
diff --git a/code/WorkInProgress/virus2/diseasesplicer.dm b/code/WorkInProgress/virus2/diseasesplicer.dm
new file mode 100644
index 0000000000..624f725f09
--- /dev/null
+++ b/code/WorkInProgress/virus2/diseasesplicer.dm
@@ -0,0 +1,185 @@
+/obj/machinery/computer/diseasesplicer
+ name = "Disease Splicer"
+ icon = 'computer.dmi'
+ icon_state = "crew"
+
+ var/datum/disease2/effectholder/memorybank = null
+ var/analysed = 0
+ var/obj/item/weapon/virusdish/dish = null
+ var/burning = 0
+
+ var/splicing = 0
+ var/scanning = 0
+
+/obj/machinery/computer/diseasesplicer/attackby(var/obj/I as obj, var/mob/user as mob)
+ if(istype(I, /obj/item/weapon/screwdriver))
+ playsound(src.loc, 'Screwdriver.ogg', 50, 1)
+ if(do_after(user, 20))
+ if (src.stat & BROKEN)
+ user << "\blue The broken glass falls out."
+ var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
+ new /obj/item/weapon/shard( src.loc )
+ //var/obj/item/weapon/circuitboard/diseasesplicer/M = new /obj/item/weapon/circuitboard/diseasesplicer( A )
+ for (var/obj/C in src)
+ C.loc = src.loc
+ //A.circuit = M
+ A.state = 3
+ A.icon_state = "3"
+ A.anchored = 1
+ del(src)
+ else
+ user << "\blue You disconnect the monitor."
+ var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
+ //var/obj/item/weapon/circuitboard/diseasesplicer/M = new /obj/item/weapon/circuitboard/diseasesplicer( A )
+ for (var/obj/C in src)
+ C.loc = src.loc
+ //A.circuit = M
+ A.state = 4
+ A.icon_state = "4"
+ A.anchored = 1
+ del(src)
+ if(istype(I,/obj/item/weapon/virusdish))
+ var/mob/living/carbon/c = user
+ if(!dish)
+
+ dish = I
+ c.drop_item()
+ I.loc = src
+ if(istype(I,/obj/item/weapon/diseasedisk))
+ user << "You upload the contents of the disk into the buffer"
+ memorybank = I:effect
+
+
+ //else
+ src.attack_hand(user)
+ return
+
+/obj/machinery/computer/diseasesplicer/attack_ai(var/mob/user as mob)
+ return src.attack_hand(user)
+
+/obj/machinery/computer/diseasesplicer/attack_paw(var/mob/user as mob)
+
+ return src.attack_hand(user)
+ return
+
+/obj/machinery/computer/diseasesplicer/attack_hand(var/mob/user as mob)
+ if(..())
+ return
+ user.machine = src
+ var/dat
+ if(splicing)
+ dat = "Splicing in progress"
+ else if(scanning)
+ dat = "Splicing in progress"
+ else if(burning)
+ dat = "Data disk burning in progress"
+ else
+ if(dish)
+ dat = "Virus dish inserted"
+
+ dat += "
Current DNA strand : "
+ if(memorybank)
+ dat += ""
+ if(analysed)
+ dat += "[memorybank.effect.name] ([5-memorybank.effect.stage])"
+ else
+ dat += "Unknown DNA strand ([5-memorybank.effect.stage])"
+ dat += ""
+
+ dat += "
Burn DNA Sequence to data storage disk"
+ else
+ dat += "Empty"
+
+ dat += "
"
+
+ if(dish)
+ if(dish.virus2)
+ if(dish.growth >= 50)
+ for(var/datum/disease2/effectholder/e in dish.virus2.effects)
+ dat += "
DNA strand"
+ if(dish.analysed)
+ dat += ": [e.effect.name]"
+ dat += " (5-[e.effect.stage])"
+ else
+ dat += "
Insufficent cells to attempt gene splicing"
+ else
+ dat += "
No virus found in dish"
+
+ dat += "
Eject disk"
+ else
+ dat += "
Please insert dish"
+
+ user << browse(dat, "window=computer;size=400x500")
+ onclose(user, "computer")
+ return
+
+/obj/machinery/computer/diseasesplicer/process()
+ if(stat & (NOPOWER|BROKEN))
+ return
+ use_power(500)
+ //src.updateDialog()
+
+ if(scanning)
+ scanning -= 1
+ if(!scanning)
+ state("The [src.name] beeps", "blue")
+ if(splicing)
+ splicing -= 1
+ if(!splicing)
+ state("The [src.name] pings", "blue")
+ if(burning)
+ burning -= 1
+ if(!burning)
+ var/obj/item/weapon/diseasedisk/d = new /obj/item/weapon/diseasedisk(src.loc)
+ if(analysed)
+ d.name = "[memorybank.effect.name] GNA disk (Stage: [5-memorybank.effect.stage])"
+ else
+ d.name = "Unknown GNA disk (Stage: [5-memorybank.effect.stage])"
+ d.effect = memorybank
+ state("The [src.name] zings", "blue")
+
+ return
+
+/obj/machinery/computer/diseasesplicer/Topic(href, href_list)
+ if(..())
+ return
+ if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon)))
+ usr.machine = src
+
+ if (href_list["grab"])
+ memorybank = locate(href_list["grab"])
+ analysed = dish.analysed
+ del(dish)
+ dish = null
+ scanning = 10
+
+ else if(href_list["eject"])
+ dish.loc = src.loc
+ dish = null
+
+ else if(href_list["splice"])
+ for(var/datum/disease2/effectholder/e in dish.virus2.effects)
+ if(e.stage == memorybank.stage)
+ e.effect = memorybank.effect
+ splicing = 10
+ dish.virus2.spreadtype = "Blood"
+
+ else if(href_list["disk"])
+ burning = 10
+
+ src.add_fingerprint(usr)
+ src.updateUsrDialog()
+ return
+
+/obj/item/weapon/diseasedisk
+ name = "Blank GNA disk"
+ icon = 'items.dmi'
+ icon_state = "datadisk0"
+ var/datum/disease2/effectholder/effect = null
+ var/stage = 1
+
+/obj/item/weapon/diseasedisk/premade/New()
+ name = "Blank GNA disk (stage: [5-stage])"
+ effect = new /datum/disease2/effectholder
+ effect.effect = new /datum/disease2/effect/invisible
+ effect.stage = stage
diff --git a/code/WorkInProgress/virus2/dishincubator.dm b/code/WorkInProgress/virus2/dishincubator.dm
new file mode 100644
index 0000000000..e6d0da1239
--- /dev/null
+++ b/code/WorkInProgress/virus2/dishincubator.dm
@@ -0,0 +1,169 @@
+/obj/machinery/disease2/incubator/
+ name = "Pathogenic incubator"
+ density = 1
+ anchored = 1
+ icon = 'virology.dmi'
+ icon_state = "incubator"
+ var/obj/item/weapon/virusdish/dish
+ var/obj/item/weapon/reagent_containers/glass/beaker = null
+ var/radiation = 0
+
+ var/on = 0
+ var/power = 0
+
+ var/foodsupply = 0
+ var/toxins = 0
+
+ ex_act(severity)
+ switch(severity)
+ if(1.0)
+ del(src)
+ return
+ if(2.0)
+ if (prob(50))
+ del(src)
+ return
+
+ blob_act()
+ if (prob(25))
+ del(src)
+
+ meteorhit()
+ del(src)
+ return
+
+ attackby(var/obj/B as obj, var/mob/user as mob)
+ if(istype(B, /obj/item/weapon/reagent_containers/glass) || istype(B,/obj/item/weapon/reagent_containers/syringe))
+
+ if(src.beaker)
+ if(istype(beaker,/obj/item/weapon/reagent_containers/syringe))
+ user << "A syringe is already loaded into the machine."
+ else
+ user << "A beaker is already loaded into the machine."
+ return
+
+ src.beaker = B
+ user.drop_item()
+ B.loc = src
+ if(istype(B,/obj/item/weapon/reagent_containers/syringe))
+ user << "You add the syringe to the machine!"
+ src.updateUsrDialog()
+ else
+ user << "You add the beaker to the machine!"
+ src.updateUsrDialog()
+ else
+ if(istype(B,/obj/item/weapon/virusdish))
+ if(src.dish)
+ user << "A dish is already loaded into the machine."
+ return
+
+ src.dish = B
+ user.drop_item()
+ B.loc = src
+ if(istype(B,/obj/item/weapon/virusdish))
+ user << "You add the dish to the machine!"
+ src.updateUsrDialog()
+
+ Topic(href, href_list)
+ if(stat & BROKEN) return
+ if(usr.stat || usr.restrained()) return
+ if(!in_range(src, usr)) return
+ if (href_list["ejectchem"])
+ if(beaker)
+ beaker.loc = src.loc
+ beaker = null
+ if(!dish)
+ return
+ usr.machine = src
+ if (href_list["power"])
+ on = !on
+ if(on)
+ icon_state = "incubator_on"
+ else
+ icon_state = "incubator"
+ if (href_list["ejectdish"])
+ if(dish)
+ dish.loc = src.loc
+ dish = null
+ if (href_list["rad"])
+ radiation += 10
+ if (href_list["flush"])
+ radiation = 0
+ toxins = 0
+ foodsupply = 0
+
+
+ src.add_fingerprint(usr)
+ src.updateUsrDialog()
+
+ attack_hand(mob/user as mob)
+ if(stat & BROKEN)
+ return
+ user.machine = src
+ var/dat = ""
+ if(!dish)
+ dat = "Please insert dish into the incubator.
"
+ var/string = "Off"
+ if(on)
+ string = "On"
+ dat += "Power status : [string]"
+ dat += "
"
+ dat += "Food supply : [foodsupply]"
+ dat += "
"
+ dat += "Radiation Levels : [radiation] RADS : Radiate"
+ dat += "
"
+ dat += "Toxins : [toxins]"
+ dat += "
"
+ if(beaker)
+ dat += "Eject chemicals : Eject"
+ dat += "
"
+ if(dish)
+ dat += "Eject Virus dish : Eject"
+ dat += "
"
+ dat += "
"
+ dat += "Flush system
"
+ dat += "Close
"
+ user << browse("