From cd0e6df228adbf28e9b60901ba41a1c3996755cb Mon Sep 17 00:00:00 2001 From: "vageyenaman@gmail.com" Date: Fri, 22 Jul 2011 22:49:49 +0000 Subject: [PATCH] I forgot to include some files in the last revision, sorry about that! git-svn-id: http://tgstation13.googlecode.com/svn/trunk@1906 316c924e-a436-60f5-8080-3fe189b3f50e --- code/modules/virus2/Disease2/analyser.dm | 75 ++++ code/modules/virus2/Disease2/base.dm | 331 ++++++++++++++++++ .../virus2/Disease2/biohazard destroyer.dm | 20 ++ code/modules/virus2/Disease2/cureimplanter.dm | 42 +++ .../modules/virus2/Disease2/diseasesplicer.dm | 202 +++++++++++ code/modules/virus2/Disease2/dishincubator.dm | 176 ++++++++++ code/modules/virus2/Disease2/isolator.dm | 139 ++++++++ .../virus2/Disease2/monkeydispensor.dm | 30 ++ 8 files changed, 1015 insertions(+) create mode 100644 code/modules/virus2/Disease2/analyser.dm create mode 100644 code/modules/virus2/Disease2/base.dm create mode 100644 code/modules/virus2/Disease2/biohazard destroyer.dm create mode 100644 code/modules/virus2/Disease2/cureimplanter.dm create mode 100644 code/modules/virus2/Disease2/diseasesplicer.dm create mode 100644 code/modules/virus2/Disease2/dishincubator.dm create mode 100644 code/modules/virus2/Disease2/isolator.dm create mode 100644 code/modules/virus2/Disease2/monkeydispensor.dm diff --git a/code/modules/virus2/Disease2/analyser.dm b/code/modules/virus2/Disease2/analyser.dm new file mode 100644 index 00000000000..e8728d052b1 --- /dev/null +++ b/code/modules/virus2/Disease2/analyser.dm @@ -0,0 +1,75 @@ +/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]." + 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 = 25 + 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 diff --git a/code/modules/virus2/Disease2/base.dm b/code/modules/virus2/Disease2/base.dm new file mode 100644 index 00000000000..c812405adf8 --- /dev/null +++ b/code/modules/virus2/Disease2/base.dm @@ -0,0 +1,331 @@ +//To simplify, all diseases have 4 stages, with effects starting at stage 2 +//Stage 1 = Rest,Minor disease +//Stage 2 = Minimal effect +//Stage 3 = Medium effect +//Stage 4 = Death/Really Really really bad effect + + +/proc/infect_virus2(var/mob/living/carbon/M,var/datum/disease2/disease/disease,var/forced = 0) + if(prob(disease.infectionchance)) + if(M.virus2) + return + else + var/score = 0 + if(!forced) + 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) || istype(M:wear_mask, /obj/item/clothing/mask/surgical)) && !M.internal) + score += 5 + if(M.internal) + score += 5 + + if(score > 15) + return + // else if(score == 20 && prob(95)) + // return + else if(score == 15 && prob(75)) + return + else if(score == 10 && prob(55)) + return + else if(score == 5 && prob(35)) + 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(var/mob/living/carbon/M) + if(!M.virus2) + M.virus2 = new /datum/disease2/disease + M.virus2.makerandom() + +/datum/disease2/disease + var/infectionchance = 10 + var/spreadtype = "Blood" // Can also be "Airborne" + var/stage = 1 + var/stageprob = 2 + var/dead = 0 + var/clicks = 0 + + var/uniqueID = 0 + var/list/datum/disease2/effectholder/effects = list() + proc/makerandom() + var/datum/disease2/effectholder/holder = new /datum/disease2/effectholder + holder.stage = 1 + holder.getrandomeffect() + effects += holder + holder = new /datum/disease2/effectholder + holder.stage = 2 + holder.getrandomeffect() + effects += holder + holder = new /datum/disease2/effectholder + holder.stage = 3 + holder.getrandomeffect() + effects += holder + holder = new /datum/disease2/effectholder + holder.stage = 4 + holder.getrandomeffect() + effects += holder + uniqueID = rand(0,10000) + infectionchance = rand(1,10) + 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) + mob.virus2 = null + return + if(mob.stat == 2) + return + if(mob.radiation > 50) + if(prob(1)) + majormutate() + if(mob.reagents.has_reagent("spaceacillin")) + return + if(prob(stageprob) && prob(25 + (clicks/100)) && stage != 4) + stage++ + clicks = 0 + for(var/datum/disease2/effectholder/e in effects) + e.runeffect(mob,stage) + + 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 + 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/name = "Blanking effect" + var/stage = 4 + var/maxm = 1 + proc/activate(var/mob/living/carbon/mob,var/multiplier) + +/datum/disease2/effect/gibbingtons + name = "Gibbingtons Syndrome" + stage = 4 + activate(var/mob/living/carbon/mob,var/multiplier) + mob.gib() + +/datum/disease2/effect/radian + name = "Radian's syndrome" + stage = 4 + maxm = 3 + activate(var/mob/living/carbon/mob,var/multiplier) + mob.radiation += (2*multiplier) + +/datum/disease2/effect/toxins + name = "Hyperacid Syndrome" + stage = 3 + maxm = 3 + activate(var/mob/living/carbon/mob,var/multiplier) + mob.toxloss += (2*multiplier) + +/datum/disease2/effect/scream + name = "Random screaming syndrome" + stage = 2 + activate(var/mob/living/carbon/mob,var/multiplier) + mob.say("*scream") + +/datum/disease2/effect/drowsness + name = "Automated sleeping syndrome" + stage = 2 + activate(var/mob/living/carbon/mob,var/multiplier) + mob.drowsyness += 10 + +/datum/disease2/effect/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/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/telepathic + name = "Telepathy Syndrome" + stage = 3 + activate(var/mob/living/carbon/mob,var/multiplier) + mob.mutations |= 512 +*/ +/datum/disease2/effect/noface + name = "Identity Loss syndrome" + stage = 4 + activate(var/mob/living/carbon/mob,var/multiplier) + mob.real_name = "Unknown" + +/datum/disease2/effect/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/sneeze + name = "Coldingtons Effect" + stage = 1 + activate(var/mob/living/carbon/mob,var/multiplier) + mob.say("*sneeze") + +/datum/disease2/effect/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/killertoxins + name = "Toxification syndrome" + stage = 4 + activate(var/mob/living/carbon/mob,var/multiplier) + mob.toxloss += 15 +/* +/datum/disease2/effect/hallucinations + name = "Hallucinational Syndrome" + stage = 3 + activate(var/mob/living/carbon/mob,var/multiplier) + mob.hallucination += 25 +*/ +/datum/disease2/effect/sleepy + name = "Resting syndrome" + stage = 2 + activate(var/mob/living/carbon/mob,var/multiplier) + mob.say("*collapse") + +/datum/disease2/effect/mind + name = "Lazy mind syndrome" + stage = 3 + activate(var/mob/living/carbon/mob,var/multiplier) + mob.brainloss = 50 + +/datum/disease2/effect/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 + +/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() + var/list/datum/disease2/effect/list = list() + for(var/e in (typesof(/datum/disease2/effect) - /datum/disease2/effect)) + // 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/minormutate() + switch(pick(1,2,3,4,5)) + if(1) + chance = rand(0,100) + if(2) + multiplier = rand(1,effect.maxm) + proc/majormutate() + getrandomeffect() + +/proc/dprob(var/p) + return(prob(sqrt(p)) && prob(sqrt(p))) diff --git a/code/modules/virus2/Disease2/biohazard destroyer.dm b/code/modules/virus2/Disease2/biohazard destroyer.dm new file mode 100644 index 00000000000..98fc9b1b218 --- /dev/null +++ b/code/modules/virus2/Disease2/biohazard destroyer.dm @@ -0,0 +1,20 @@ +/obj/machinery/disease2/biodestroyer + name = "Biohazard destroyer" + icon = 'disposal.dmi' + icon_state = "disposal" + var/list/accepts = list(/obj/item/clothing,/obj/item/weapon/virusdish/,/obj/item/weapon/cureimplanter,/obj/item/weapon/diseasedisk) + 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) diff --git a/code/modules/virus2/Disease2/cureimplanter.dm b/code/modules/virus2/Disease2/cureimplanter.dm new file mode 100644 index 00000000000..a6b484a2397 --- /dev/null +++ b/code/modules/virus2/Disease2/cureimplanter.dm @@ -0,0 +1,42 @@ +/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 && prob(25)) + M.resistances2 += resistance + if(M.virus2) + M.virus2.cure_added(resistance) + else if(works == 1) + M.toxloss += rand(20,50) + else if(works == 2) + M.toxloss += rand(50,100) + else if(works == 3) + infect_virus2(M,virus2,1) diff --git a/code/modules/virus2/Disease2/diseasesplicer.dm b/code/modules/virus2/Disease2/diseasesplicer.dm new file mode 100644 index 00000000000..759116f5975 --- /dev/null +++ b/code/modules/virus2/Disease2/diseasesplicer.dm @@ -0,0 +1,202 @@ +/obj/machinery/computer/diseasesplicer + name = "Disease Splicer" + icon = 'computer.dmi' + icon_state = "crew" + //brightnessred = 0 +// brightnessgreen = 2 +// brightnessblue = 2 +// broken_icon + + 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/computerframe/A = new /obj/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/computerframe/A = new /obj/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") + icon_state = "crew" + if(splicing) + splicing -= 1 + if(!splicing) + state("The [src.name] pings") + icon_state = "crew" + 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") + icon_state = "crew" + + + 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 = 30 + icon_state = "crew" + + 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 = 50 + dish.virus2.spreadtype = "Blood" + icon_state = "crew" + + else if(href_list["disk"]) + burning = 20 + icon_state = "crew" + + src.add_fingerprint(usr) + src.updateUsrDialog() + return + +/obj/machinery/computer/diseasesplicer/proc/state(var/msg) + for(var/mob/O in hearers(src, null)) + O.show_message("\icon[src] \blue [msg]", 2) + + +/obj/item/weapon/diseasedisk + name = "Blank GNA disk" + icon = 'cloning.dmi' + icon_state = "datadisk2" + 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/modules/virus2/Disease2/dishincubator.dm b/code/modules/virus2/Disease2/dishincubator.dm new file mode 100644 index 00000000000..d5d21728b23 --- /dev/null +++ b/code/modules/virus2/Disease2/dishincubator.dm @@ -0,0 +1,176 @@ +/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 + + usr.machine = src + if(!dish) return + + if (href_list["power"]) + on = !on + if(on) + icon_state = "incubator_on" + else + icon_state = "incubator" + if (href_list["ejectchem"]) + if(beaker) + beaker.loc = src.loc + beaker = null + 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.
" + dat += "Close" + 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" + + + user << browse("Pathogenic incubatorincubator menu:

[dat]", "window=incubator;size=575x400") + onclose(user, "incubator") + return + + + + + process() + + if(dish && on && dish.virus2) + use_power(50,EQUIP) + if(!powered(EQUIP)) + on = 0 + icon_state = "incubator" + if(foodsupply) + foodsupply -= 1 + dish.growth += 1 + if(dish.growth == 100) + state("The [src.name] pings") + if(radiation) + if(radiation > 50 & prob(5)) + dish.virus2.majormutate() + if(dish.info) + dish.info = "OUTDATED : [dish.info]" + dish.analysed = 0 + state("The [src.name] beeps") + + else if(prob(5)) + dish.virus2.minormutate() + radiation -= 1 + if(toxins && prob(5)) + dish.virus2.infectionchance -= 1 + if(toxins > 50) + dish.virus2 = null + else if(!dish) + on = 0 + icon_state = "incubator" + + + if(beaker) + if(!beaker.reagents.remove_reagent("virusfood",5)) + foodsupply += 20 + if(!beaker.reagents.remove_reagent("toxins",1)) + toxins += 1 + + proc/state(var/msg) + for(var/mob/O in hearers(src, null)) + O.show_message("\icon[src] \blue [msg]", 2) diff --git a/code/modules/virus2/Disease2/isolator.dm b/code/modules/virus2/Disease2/isolator.dm new file mode 100644 index 00000000000..18fb36603d8 --- /dev/null +++ b/code/modules/virus2/Disease2/isolator.dm @@ -0,0 +1,139 @@ +/obj/machinery/disease2/isolator/ + name = "Pathogenic Isolator" + density = 1 + anchored = 1 + icon = 'virology.dmi' + icon_state = "isolator" + var/datum/disease2/disease/virus2 = null + var/isolating = 0 + var/beaker = null + + 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/item/weapon/reagent_containers/glass/B as obj, var/mob/user as mob) + if(!istype(B,/obj/item/weapon/reagent_containers/syringe)) + return + + if(src.beaker) + user << "A syringe 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() + icon_state = "isolator_in" + + Topic(href, href_list) + if(stat & BROKEN) return + if(usr.stat || usr.restrained()) return + if(!in_range(src, usr)) return + + usr.machine = src + if(!beaker) return + var/datum/reagents/R = beaker:reagents + + if (href_list["isolate"]) + var/datum/reagent/blood/Blood + for(var/datum/reagent/blood/B in R.reagent_list) + if(B) + Blood = B + break + + if(Blood.data["virus2"]) + virus2 = Blood.data["virus2"] + isolating = 40 + icon_state = "isolator_processing" + src.updateUsrDialog() + return + + else if (href_list["main"]) + attack_hand(usr) + return + else if (href_list["eject"]) + beaker:loc = src.loc + beaker = null + icon_state = "isolator" + src.updateUsrDialog() + return + + attack_hand(mob/user as mob) + if(stat & BROKEN) + return + user.machine = src + var/dat = "" + if(!beaker) + dat = "Please insert sample into the isolator.
" + dat += "Close" + else if(isolating) + dat = "Isolating" + else + var/datum/reagents/R = beaker:reagents + dat += "Eject

" + if(!R.total_volume) + dat += "[beaker] is empty." + else + dat += "Contained reagents:
" + for(var/datum/reagent/blood/G in R.reagent_list) + dat += " [G.name]: Isolate" + user << browse("Pathogenic IsolatorIsolator menu:

[dat]", "window=isolator;size=575x400") + onclose(user, "isolator") + return + + + + + process() + if(isolating > 0) + isolating -= 1 + if(isolating == 0) + var/obj/item/weapon/virusdish/d = new /obj/item/weapon/virusdish(src.loc) + d.virus2 = virus2.getcopy() + virus2 = null + icon_state = "isolator_in" + + + + +/obj/item/weapon/virusdish + name = "Virus containment/growth dish" + icon = 'items.dmi' + icon_state = "implantcase-b" + var/datum/disease2/disease/virus2 = null + var/growth = 0 + var/info = 0 + var/analysed = 0 + +/obj/item/weapon/virusdish/attackby(var/obj/item/weapon/W as obj,var/mob/living/carbon/user as mob) + if(istype(W,/obj/item/weapon/hand_labeler)) + return + ..() + if(prob(50)) + user << "The dish shatters" + if(virus2.infectionchance > 0) + infect_virus2(user,virus2) + del src + +/obj/item/weapon/virusdish/examine() + usr << "This is a virus containment dish" + if(src.info) + usr << "It has the following information about its contents" + usr << src.info diff --git a/code/modules/virus2/Disease2/monkeydispensor.dm b/code/modules/virus2/Disease2/monkeydispensor.dm new file mode 100644 index 00000000000..5301bfe8e6a --- /dev/null +++ b/code/modules/virus2/Disease2/monkeydispensor.dm @@ -0,0 +1,30 @@ +/obj/machinery/disease2/monkeycloner + name = "Monkey dispensor" + icon = 'cloning.dmi' + icon_state = "pod_0" + density = 1 + anchored = 1 + + var/cloning = 0 + +/obj/machinery/disease2/monkeycloner/attack_hand() + if(!cloning) + cloning = 150 + + icon_state = "pod_g" + +/obj/machinery/disease2/monkeycloner/process() + if(stat & (NOPOWER|BROKEN)) + return + use_power(500) + src.updateDialog() + + if(cloning) + cloning -= 1 + if(!cloning) + new /mob/living/carbon/monkey(src.loc) + icon_state = "pod_0" + + + + return