50)
+ if((mob.species.name == SPECIES_DIONA) && prob(mob.radiation/25))
+ cure(mob)
+ else if(prob(1))
+ majormutate()
+
+ if(prob(mob.virus_immunity()) && prob(stage)) // Increasing chance of curing as the virus progresses
+ cure(mob,1)
+ //Waiting out the disease the old way
+ if(stage == max_stage && clicks > max(stage*100, 300))
+ if(prob(mob.virus_immunity() * 0.05 + 100-infectionchance))
+ cure(mob, 1)
+
+ var/top_badness = 1
+ for(var/datum/disease2/effect/e in effects)
+ if(e.stage == stage)
+ top_badness = max(top_badness, e.badness)
+
+ //Space antibiotics might stop disease completely
+ if(mob.chem_effects[CE_ANTIVIRAL] > top_badness)
+ if(stage == 1 && prob(20))
+ cure(mob)
+ return
+
+ clicks += speed
+ //Virus food speeds up disease progress
+ if(mob.reagents.has_reagent(/datum/reagent/nutriment/virus_food))
+ mob.reagents.remove_reagent(/datum/reagent/nutriment/virus_food, REM)
+ clicks += 10
+
+ //Moving to the next stage
+ if(clicks > max(stage*100, 300))
+ if(stage < max_stage && prob(10))
+ stage++
+ clicks = 0
+
+ //Do nasty effects
+ for(var/datum/disease2/effect/e in effects)
+ e.fire(mob,stage)
+
+ //fever
+ if(!mob.chem_effects[CE_ANTIVIRAL])
+ mob.bodytemperature = max(mob.bodytemperature, min(310+5*min(stage,max_stage) ,mob.bodytemperature+5*min(stage,max_stage)))
+
+/datum/disease2/disease/proc/cure(var/mob/living/carbon/mob, mob_gains_antigens)
+ for(var/datum/disease2/effect/e in effects)
+ e.deactivate(mob)
+
+ mob.virus2.Remove("[uniqueID]")
+
+ //Tries to remove the virus also from the bloodstream (only for human-like lifeforms).
+ if(istype(mob, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = mob
+ H.cure_virus(uniqueID)
+
+ if (mob_gains_antigens)
+ mob.antibodies |= antigen
+
+ BITSET(mob.hud_updateflag, STATUS_HUD)
+
+/datum/disease2/disease/proc/minormutate()
+ var/datum/disease2/effect/E = pick(effects)
+ E.minormutate()
+
+/datum/disease2/disease/proc/majormutate(badness = VIRUS_ENGINEERED)
+ uniqueID = rand(0,10000)
+ var/datum/disease2/effect/E = pick(effects)
+ var/list/exclude = list()
+ for(var/datum/disease2/effect/D in effects)
+ if(D != E)
+ exclude += D.type
+
+ var/effect_stage = E.stage
+ E.deactivate()
+ effects -= E
+ qdel(E)
+
+ effects += get_random_virus2_effect(effect_stage, badness, exclude)
+
+ antigen = list(pick(ALL_ANTIGENS))
+ antigen |= pick(ALL_ANTIGENS)
+
+ if (prob(5) && all_species.len)
+ affected_species = get_infectable_species()
+
+/datum/disease2/disease/proc/getcopy()
+ var/datum/disease2/disease/disease = new /datum/disease2/disease
+ disease.infectionchance = infectionchance
+ disease.spreadtype = spreadtype
+ disease.speed = speed
+ disease.antigen = antigen
+ disease.uniqueID = uniqueID
+ disease.affected_species = affected_species.Copy()
+ for(var/datum/disease2/effect/effect in effects)
+ var/datum/disease2/effect/neweffect = new effect.type
+ neweffect.generate(effect.data)
+ neweffect.chance = effect.chance
+ neweffect.multiplier = effect.multiplier
+ neweffect.oneshot = effect.oneshot
+ neweffect.stage = effect.stage
+ disease.effects += neweffect
+ return disease
+
+/datum/disease2/disease/proc/issame(var/datum/disease2/disease/disease)
+ . = 1
+
+ var/list/types = list()
+ for(var/datum/disease2/effect/d in effects)
+ types += d.type
+ for(var/datum/disease2/effect/d in disease.effects)
+ if(!(d.type in types))
+ return 0
+
+ if (antigen != disease.antigen)
+ return 0
+
+/proc/virus_copylist(var/list/datum/disease2/disease/viruses)
+ var/list/res = list()
+ for (var/ID in viruses)
+ var/datum/disease2/disease/V = viruses[ID]
+ res["[V.uniqueID]"] = V.getcopy()
+ return res
+
+
+var/global/list/virusDB = list()
+
+/datum/disease2/disease/proc/name()
+ .= "strain #[add_zero("[uniqueID]", 4)]"
+ if ("[uniqueID]" in virusDB)
+ var/datum/computer_file/data/virus_record/V = virusDB["[uniqueID]"]
+ .= V.fields["name"]
+
+/datum/disease2/disease/proc/get_info(skill = HAS_PERK, verbose = 1, given_effects)
+ if(!given_effects)
+ given_effects = effects
+ var/r = list()
+ if(verbose)
+ r += "Analysis determined the existence of a GNAv2-based viral lifeform.
"
+ r += "Designation: [name()]
"
+ r += "Antigen: [antigens2string(antigen)]
"
+ r += "Transmitted By: [spreadtype]
"
+ else
+ r = "[name()]"
+
+ var/list/dat = list()
+ if(skill >= HAS_PERK)
+ if(verbose)
+ r += "Rate of Progression: [speed * 100]%
"
+ var/species = affected_species.Copy()
+ r += "Species Affected: [jointext(species, ", ")]
"
+ r += "Symptoms:
"
+
+ for(var/datum/disease2/effect/E in given_effects)
+ dat += E.get_effect_info(verbose)
+
+ . = verbose ? JOINTEXT(r + dat) : "[r] ([jointext(dat, ", ")])"
+
+
+/datum/disease2/disease/proc/addToDB()
+ if ("[uniqueID]" in virusDB)
+ return 0
+ var/datum/computer_file/data/virus_record/v = new()
+ v.fields["id"] = uniqueID
+ v.fields["name"] = name()
+ v.fields["description"] = get_info()
+ v.fields["antigen"] = antigens2string(antigen)
+ v.fields["spread type"] = spreadtype
+ virusDB["[uniqueID]"] = v
+ return 1
+
+
+proc/virology_letterhead(var/report_name)
+ return {"
+ [report_name]
+ [station_name()] Virology Lab
+
+"}
+
+/datum/disease2/disease/proc/can_add_symptom(type)
+ for(var/datum/disease2/effect/H in effects)
+ if(H.type == type && !H.allow_multiple)
+ return 0
+
+ return 1
\ No newline at end of file
diff --git a/code/modules/virus2/diseasesplicer.dm b/code/modules/virus2/diseasesplicer.dm
new file mode 100644
index 00000000000..339e624782b
--- /dev/null
+++ b/code/modules/virus2/diseasesplicer.dm
@@ -0,0 +1,187 @@
+/obj/machinery/computer/diseasesplicer
+ name = "disease splicer"
+ icon = 'icons/obj/computer.dmi'
+ icon_keyboard = "med_key"
+ icon_screen = "crew"
+
+ var/datum/disease2/effect/memorybank = null
+ var/list/species_buffer = 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(isScrewdriver(I))
+ return ..(I,user)
+
+ if(istype(I,/obj/item/weapon/virusdish))
+ if (dish)
+ to_chat(user, "\The [src] is already loaded.")
+ return
+ if(!user.unEquip(I, src))
+ return
+ dish = I
+
+ if(istype(I,/obj/item/weapon/diseasedisk))
+ to_chat(user, "You upload the contents of the disk onto the buffer.")
+ var/obj/item/weapon/diseasedisk/disk = I
+ memorybank = disk.effect
+ species_buffer = disk.species
+ analysed = disk.analysed
+
+ src.attack_hand(user)
+
+/obj/machinery/computer/diseasesplicer/interface_interact(var/mob/user)
+ ui_interact(user)
+ return TRUE
+
+/obj/machinery/computer/diseasesplicer/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ user.set_machine(src)
+
+ var/data[0]
+ data["dish_inserted"] = !!dish
+ data["growth"] = 0
+ data["affected_species"] = null
+
+ if (memorybank)
+ data["buffer"] = list("name" = (analysed ? memorybank.name : "Unknown Symptom"), "stage" = memorybank.stage)
+ if (species_buffer)
+ data["species_buffer"] = analysed ? jointext(species_buffer, ", ") : "Unknown Species"
+
+ if (splicing)
+ data["busy"] = "Splicing..."
+ else if (scanning)
+ data["busy"] = "Scanning..."
+ else if (burning)
+ data["busy"] = "Copying data to disk..."
+ else if (dish)
+ data["growth"] = min(dish.growth, 100)
+
+ if (dish.virus2)
+ if (dish.virus2.affected_species)
+ data["affected_species"] = dish.analysed ? jointext(dish.virus2.affected_species, ", ") : "Unknown"
+
+ if (dish.growth >= 50)
+ var/list/effects[0]
+ for (var/datum/disease2/effect/e in dish.virus2.effects)
+ effects.Add(list(list("name" = (dish.analysed ? e.name : "Unknown"), "stage" = (e.stage), "reference" = "\ref[e]")))
+ data["effects"] = effects
+ else
+ data["info"] = "Insufficient cell growth for gene splicing."
+ else
+ data["info"] = "No virus detected."
+ else
+ data["info"] = "No dish loaded."
+
+ ui = SSnano.try_update_ui(user, src, ui_key, ui, data, force_open)
+ if (!ui)
+ ui = new(user, src, ui_key, "disease_splicer.tmpl", src.name, 400, 600)
+ ui.set_initial_data(data)
+ ui.open()
+
+/obj/machinery/computer/diseasesplicer/Process()
+ if(stat & (NOPOWER|BROKEN))
+ return
+
+ if(scanning)
+ scanning -= 1
+ if(!scanning)
+ ping("\The [src] pings, \"Analysis complete.\"")
+ SSnano.update_uis(src)
+ if(splicing)
+ splicing -= 1
+ if(!splicing)
+ ping("\The [src] pings, \"Splicing operation complete.\"")
+ SSnano.update_uis(src)
+ if(burning)
+ burning -= 1
+ if(!burning)
+ var/obj/item/weapon/diseasedisk/d = new /obj/item/weapon/diseasedisk(src.loc)
+ d.analysed = analysed
+ if(analysed)
+ if (memorybank)
+ d.SetName("[memorybank.name] GNA disk (Stage: [memorybank.stage])")
+ d.effect = memorybank
+ else if (species_buffer)
+ d.SetName("[jointext(species_buffer, ", ")] GNA disk")
+ d.species = species_buffer
+ else
+ if (memorybank)
+ d.SetName("Unknown GNA disk (Stage: [memorybank.stage])")
+ d.effect = memorybank
+ else if (species_buffer)
+ d.SetName("Unknown Species GNA disk")
+ d.species = species_buffer
+
+ ping("\The [src] pings, \"Backup disk saved.\"")
+ SSnano.update_uis(src)
+
+ if((scanning || splicing || burning) && dish && dish.virus2)
+ infect_nearby(dish.virus2, 80)
+
+/obj/machinery/computer/diseasesplicer/OnTopic(mob/user, href_list)
+ operator_skill = user.get_skill_value(core_skill)
+ if (href_list["close"])
+ SSnano.close_user_uis(user, src, "main")
+ return TOPIC_HANDLED
+
+ if (href_list["grab"])
+ if (dish)
+ memorybank = locate(href_list["grab"])
+ species_buffer = null
+ analysed = dish.analysed
+ dish = null
+ scanning = 10
+ return TOPIC_REFRESH
+
+ if (href_list["affected_species"])
+ if (dish)
+ memorybank = null
+ species_buffer = dish.virus2.affected_species
+ analysed = dish.analysed
+ dish = null
+ scanning = 10
+ return TOPIC_REFRESH
+
+ if(href_list["eject"])
+ if (dish)
+ dish.dropInto(loc)
+ dish = null
+ return TOPIC_REFRESH
+
+ if(href_list["splice"])
+ if(dish)
+ var/target = text2num(href_list["splice"]) // target = 1+ for effects, -1 for species
+ if(memorybank && target > 0)
+ if(target < memorybank.stage)
+ return // too powerful, catching this for href exploit prevention
+
+ var/datum/disease2/effect/target_effect
+ var/list/illegal_types = list()
+ for(var/datum/disease2/effect/e in dish.virus2.effects)
+ if(e.stage == target)
+ target_effect = e
+ if(!e.allow_multiple)
+ illegal_types += e.type
+ if(memorybank.type in illegal_types)
+ to_chat(user, "Virus DNA can't hold more than one [memorybank]")
+ return 1
+ dish.virus2.effects -= target_effect
+ dish.virus2.effects += memorybank
+ qdel(target_effect)
+
+ else if(species_buffer && target == -1)
+ dish.virus2.affected_species = species_buffer
+
+ else
+ return TOPIC_HANDLED
+
+ splicing = 10
+ dish.virus2.uniqueID = rand(0,10000)
+ return TOPIC_REFRESH
+
+ if(href_list["disk"])
+ burning = 10
+ return TOPIC_REFRESH
\ No newline at end of file
diff --git a/code/modules/virus2/dishincubator.dm b/code/modules/virus2/dishincubator.dm
new file mode 100644
index 00000000000..1a60c0d5ce1
--- /dev/null
+++ b/code/modules/virus2/dishincubator.dm
@@ -0,0 +1,200 @@
+/obj/machinery/disease2/incubator/
+ name = "pathogenic incubator"
+ density = 1
+ anchored = 1
+ icon = 'icons/obj/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
+
+/obj/machinery/disease2/incubator/attackby(var/obj/O as obj, var/mob/user as mob)
+ if(istype(O, /obj/item/weapon/reagent_containers/glass) || istype(O,/obj/item/weapon/reagent_containers/syringe))
+
+ if(beaker)
+ to_chat(user, "\The [src] is already loaded.")
+ return
+ if(!user.unEquip(O, src))
+ return
+ beaker = O
+
+ user.visible_message("[user] adds \a [O] to \the [src]!", "You add \a [O] to \the [src]!")
+ SSnano.update_uis(src)
+
+ src.attack_hand(user)
+ return
+
+ if(istype(O, /obj/item/weapon/virusdish))
+
+ if(dish)
+ to_chat(user, "The dish tray is already full!")
+ return
+ if(!user.unEquip(O, src))
+ return
+ dish = O
+
+ user.visible_message("[user] adds \a [O] to \the [src]!", "You add \a [O] to \the [src]!")
+ SSnano.update_uis(src)
+
+ src.attack_hand(user)
+
+/obj/machinery/disease2/incubator/interface_interact(mob/user)
+ ui_interact(user)
+ return TRUE
+
+/obj/machinery/disease2/incubator/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ user.set_machine(src)
+
+ var/data[0]
+ data["chemicals_inserted"] = !!beaker
+ data["dish_inserted"] = !!dish
+ data["food_supply"] = foodsupply
+ data["radiation"] = radiation
+ data["toxins"] = min(toxins, 100)
+ data["on"] = on
+ data["system_in_use"] = foodsupply > 0 || radiation > 0 || toxins > 0
+ data["chemical_volume"] = beaker ? beaker.reagents.total_volume : 0
+ data["max_chemical_volume"] = beaker ? beaker.volume : 1
+ data["virus"] = dish ? dish.virus2 : null
+ data["growth"] = dish ? min(dish.growth, 100) : 0
+ data["infection_rate"] = dish && dish.virus2 ? dish.virus2.infectionchance * 10 : 0
+ data["analysed"] = dish && dish.analysed ? 1 : 0
+ data["can_breed_virus"] = null
+ data["blood_already_infected"] = null
+
+ if (beaker)
+ var/datum/reagent/blood/B = locate(/datum/reagent/blood) in beaker.reagents.reagent_list
+ data["can_breed_virus"] = dish && dish.virus2 && B
+
+ if (B)
+ if (!B.data["virus2"])
+ B.data["virus2"] = list()
+
+ var/list/virus = B.data["virus2"]
+ for (var/ID in virus)
+ data["blood_already_infected"] = virus[ID]
+
+ ui = SSnano.try_update_ui(user, src, ui_key, ui, data, force_open)
+ if (!ui)
+ ui = new(user, src, ui_key, "dish_incubator.tmpl", src.name, 400, 600)
+ ui.set_initial_data(data)
+ ui.open()
+
+/obj/machinery/disease2/incubator/Process()
+ ..()
+ if(dish && on && dish.virus2)
+ use_power_oneoff(50,EQUIP)
+ if(!powered(EQUIP))
+ on = 0
+ icon_state = "incubator"
+
+ var/threshold_mod = 0
+
+ if(foodsupply)
+ if(dish.growth + 3 >= 100 && dish.growth < 100)
+ ping("\The [src] pings, \"Sufficient viral growth density achieved.\"")
+
+ foodsupply -= 1
+ dish.growth += 3
+ SSnano.update_uis(src)
+
+ if(radiation)
+ threshold_mod++
+ if(radiation > 50 & prob(5))
+ dish.virus2.majormutate()
+ if(dish.info)
+ dish.info = "OUTDATED : [dish.info]"
+ dish.basic_info = "OUTDATED: [dish.basic_info]"
+ dish.analysed = 0
+ ping("\The [src] pings, \"Mutant viral strain detected.\"")
+ else if(prob(5))
+ dish.virus2.minormutate()
+ radiation -= 1
+ SSnano.update_uis(src)
+ if(toxins && prob(5))
+ dish.virus2.infectionchance -= 1
+ SSnano.update_uis(src)
+ if(toxins > 50)
+ dish.growth = 0
+ dish.virus2 = null
+ SSnano.update_uis(src)
+ infect_nearby(dish.virus2, 20 * 2**threshold_mod)
+ else if(!dish)
+ on = 0
+ icon_state = "incubator"
+ SSnano.update_uis(src)
+
+ if(beaker)
+ if (foodsupply < 100 && beaker.reagents.has_reagent(/datum/reagent/nutriment/virus_food))
+ var/food_needed = min(10, 100 - foodsupply) / 2
+ var/food_taken = min(food_needed, beaker.reagents.get_reagent_amount(/datum/reagent/nutriment/virus_food))
+
+ beaker.reagents.remove_reagent(/datum/reagent/nutriment/virus_food, food_taken)
+ foodsupply = min(100, foodsupply+(food_taken * 2))
+ SSnano.update_uis(src)
+
+ if ((locate(/datum/reagent/toxin) in beaker.reagents.reagent_list) && toxins < 100)
+ for(var/datum/reagent/toxin/T in beaker.reagents.reagent_list)
+ toxins += max(T.strength,1)
+ beaker.reagents.remove_reagent(T.type,1)
+ if(toxins > 100)
+ toxins = 100
+ break
+ SSnano.update_uis(src)
+
+/obj/machinery/disease2/incubator/OnTopic(mob/user, href_list)
+ operator_skill = user.get_skill_value(core_skill)
+ if (href_list["close"])
+ SSnano.close_user_uis(user, src, "main")
+ return TOPIC_HANDLED
+
+ if (href_list["ejectchem"])
+ if(beaker)
+ beaker.dropInto(loc)
+ beaker = null
+ return TOPIC_REFRESH
+
+ if (href_list["power"])
+ if (dish)
+ on = !on
+ icon_state = on ? "incubator_on" : "incubator"
+ return TOPIC_REFRESH
+
+ if (href_list["ejectdish"])
+ if(dish)
+ dish.dropInto(loc)
+ dish = null
+ return TOPIC_REFRESH
+
+ if (href_list["rad"])
+ radiation = min(100, radiation + 10)
+ return TOPIC_REFRESH
+
+ if (href_list["flush"])
+ radiation = 0
+ toxins = 0
+ foodsupply = 0
+ return TOPIC_REFRESH
+
+ if(href_list["virus"])
+ if (!dish)
+ return TOPIC_HANDLED
+
+ var/datum/reagent/blood/B = locate(/datum/reagent/blood) in beaker.reagents.reagent_list
+ if (!B)
+ return TOPIC_HANDLED
+
+ if (!B.data["virus2"])
+ B.data["virus2"] = list()
+
+ var/list/virus = list("[dish.virus2.uniqueID]" = dish.virus2.getcopy())
+ B.data["virus2"] += virus
+
+ ping("\The [src] pings, \"Injection complete.\"")
+ return TOPIC_REFRESH
\ No newline at end of file
diff --git a/code/modules/virus2/effect.dm b/code/modules/virus2/effect.dm
new file mode 100644
index 00000000000..a891f134e19
--- /dev/null
+++ b/code/modules/virus2/effect.dm
@@ -0,0 +1,406 @@
+////////////////////////////////////////////////////////////////
+////////////////////////EFFECTS/////////////////////////////////
+////////////////////////////////////////////////////////////////
+/proc/get_random_virus2_effect(stage, badness, exclude)
+ var/list/datum/disease2/effect/candidates = list()
+ for(var/T in subtypesof(/datum/disease2/effect))
+ var/datum/disease2/effect/E = T
+ if(E in exclude)
+ continue
+ if(initial(E.badness) > badness) //we don't want such strong effects
+ continue
+ if(initial(E.stage) <= stage)
+ candidates += T
+ var/type = pick(candidates)
+ var/datum/disease2/effect/effect = new type
+ effect.generate()
+ effect.chance = rand(0,effect.chance_max)
+ effect.multiplier = rand(1,effect.multiplier_max)
+ return effect
+
+/datum/disease2/effect
+ var/name = "Blanking effect"
+ var/chance //probality to fire every tick
+ var/chance_max = 50
+ var/multiplier = 1 //effect magnitude multiplier
+ var/multiplier_max = 1
+ var/stage = 4 //minimal stage
+ var/badness = VIRUS_MILD //Used in random generation to limit how bad result should come out.
+ var/data = null //For semi-procedural effects; this should be generated in generate() if used
+ var/oneshot
+ var/delay = 5 SECONDS //minimal time between activations
+ var/hold_until //can only fire after this worldtime
+ var/allow_multiple //allow to have more than 1 effect of this type in the same virus
+
+/datum/disease2/effect/proc/get_effect_info(verbose = 1)
+ . = list()
+ if(verbose)
+ . += "([stage]) [name] "
+ . += "Strength: [multiplier >= 3 ? "Severe" : multiplier > 1 ? "Above Average" : "Average"] "
+ . += "Verosity: [chance * 15]
"
+ else
+ . += name
+ return JOINTEXT(.)
+
+/datum/disease2/effect/proc/fire(var/mob/living/carbon/human/mob,var/current_stage)
+ if(oneshot == -1)
+ return
+ if(hold_until > world.time)
+ return
+ if(mob.chem_effects[CE_ANTIVIRAL] >= badness)
+ return
+ if(stage <= current_stage && prob(chance))
+ hold_until = world.time + delay
+ activate(mob)
+ if(oneshot == 1)
+ oneshot = -1
+
+/datum/disease2/effect/proc/minormutate()
+ switch(pick(1,2,3,4,5))
+ if(1)
+ chance = rand(0,chance_max)
+ if(2)
+ multiplier = rand(1,multiplier_max)
+
+/datum/disease2/effect/proc/activate(var/mob/living/carbon/human/mob)
+/datum/disease2/effect/proc/deactivate(var/mob/living/carbon/human/mob)
+/datum/disease2/effect/proc/generate(copy_data) // copy_data will be non-null if this is a copy; it should be used to initialise the data for this effect if present
+
+/datum/disease2/effect/invisible
+ name = "Waiting Syndrome"
+ stage = 1
+
+////////////////////////STAGE 4/////////////////////////////////
+
+/datum/disease2/effect/gibbingtons
+ name = "Gibbingtons Syndrome"
+ stage = 4
+ badness = VIRUS_EXOTIC
+ activate(var/mob/living/carbon/human/mob,var/multiplier)
+ // Probabilities have been tweaked to kill in ~2-3 minutes, giving 5-10 messages.
+ // Probably needs more balancing, but it's better than LOL U GIBBED NOW, especially now that viruses can potentially have no signs up until Gibbingtons.
+ mob.adjustBruteLoss(10*multiplier)
+ var/obj/item/organ/external/O = pick(mob.organs)
+ if(prob(25))
+ to_chat(mob, "Your [O.name] feels as if it might burst!")
+ if(prob(10))
+ spawn(50)
+ if(O)
+ O.droplimb(0,DROPLIMB_BLUNT)
+
+/datum/disease2/effect/radian
+ name = "Radian's Syndrome"
+ stage = 4
+ multiplier_max = 3
+ badness = VIRUS_COMMON
+ activate(var/mob/living/carbon/human/mob,var/multiplier)
+ mob.apply_damage(2*multiplier, IRRADIATE, armor_pen = 100)
+
+/datum/disease2/effect/deaf
+ name = "Dead Ear Syndrome"
+ stage = 4
+ badness = VIRUS_COMMON
+ activate(var/mob/living/carbon/human/mob,var/multiplier)
+ mob.ear_deaf = min(mob.ear_deaf + 10, 50)
+
+/datum/disease2/effect/monkey
+ name = "Two Percent Syndrome"
+ stage = 4
+ badness = VIRUS_EXOTIC
+ activate(var/mob/living/carbon/human/mob,var/multiplier)
+ mob.monkeyize()
+
+/datum/disease2/effect/killertoxins
+ name = "Toxification Syndrome"
+ stage = 4
+ badness = VIRUS_COMMON
+ activate(var/mob/living/carbon/human/mob,var/multiplier)
+ mob.adjustToxLoss(15*multiplier)
+
+/datum/disease2/effect/dna
+ name = "Reverse Pattern Syndrome"
+ stage = 4
+ badness = VIRUS_ENGINEERED
+ activate(var/mob/living/carbon/human/mob,var/multiplier)
+ mob.bodytemperature = max(mob.bodytemperature, 350)
+ scramble(0,mob,10)
+ mob.apply_damage(10, CLONE)
+
+/datum/disease2/effect/organs
+ name = "Shutdown Syndrome"
+ stage = 4
+ badness = VIRUS_ENGINEERED
+ activate(var/mob/living/carbon/human/mob,var/multiplier)
+ var/organ = pick(list(BP_R_ARM,BP_L_ARM,BP_R_LEG,BP_L_LEG))
+ var/obj/item/organ/external/E = mob.organs_by_name[organ]
+ if (!(E.status & ORGAN_DEAD))
+ E.status |= ORGAN_DEAD
+ to_chat(mob, "You can't feel your [E.name] anymore...")
+ for (var/obj/item/organ/external/C in E.children)
+ C.status |= ORGAN_DEAD
+ mob.update_body(1)
+ mob.adjustToxLoss(15*multiplier)
+
+ deactivate(var/mob/living/carbon/human/mob,var/multiplier)
+ for (var/obj/item/organ/external/E in mob.organs)
+ E.status &= ~ORGAN_DEAD
+ for (var/obj/item/organ/external/C in E.children)
+ C.status &= ~ORGAN_DEAD
+ mob.update_body(1)
+
+/datum/disease2/effect/immortal
+ name = "Longevity Syndrome"
+ stage = 4
+ badness = VIRUS_ENGINEERED
+ activate(var/mob/living/carbon/human/mob,var/multiplier)
+ for (var/external in mob.organs)
+ var/obj/item/organ/external/E = external
+ if (E.status & ORGAN_BROKEN && prob(30))
+ to_chat(mob, "Your [E.name] suddenly feels much better!")
+ E.status ^= ORGAN_BROKEN
+ break
+ for (var/internal in mob.internal_organs)
+ var/obj/item/organ/internal/I = internal
+ if (I.damage && prob(30))
+ to_chat(mob, "Your [mob.get_organ(I.parent_organ)] feels a bit warm...")
+ I.take_internal_damage(-2*multiplier)
+ break
+ var/heal_amt = -5*multiplier
+ mob.apply_damages(heal_amt,heal_amt,heal_amt,heal_amt)
+
+ deactivate(var/mob/living/carbon/human/mob,var/multiplier)
+ to_chat(mob, "You suddenly feel hurt and old...")
+ mob.age += 8
+ var/backlash_amt = 5*multiplier
+ mob.apply_damages(backlash_amt,backlash_amt,backlash_amt,backlash_amt)
+
+/datum/disease2/effect/bones
+ name = "Fragile Bones Syndrome"
+ stage = 4
+ badness = VIRUS_ENGINEERED
+ activate(var/mob/living/carbon/human/mob,var/multiplier)
+ for (var/obj/item/organ/external/E in mob.organs)
+ E.min_broken_damage = max(5, E.min_broken_damage - 30)
+
+ deactivate(var/mob/living/carbon/human/mob,var/multiplier)
+ for (var/obj/item/organ/external/E in mob.organs)
+ E.min_broken_damage = initial(E.min_broken_damage)
+
+////////////////////////STAGE 3/////////////////////////////////
+
+/datum/disease2/effect/toxins
+ name = "Hyperacidity"
+ stage = 3
+ multiplier_max = 3
+ badness = VIRUS_COMMON
+ activate(var/mob/living/carbon/human/mob,var/multiplier)
+ mob.adjustToxLoss((2*multiplier))
+
+/datum/disease2/effect/shakey
+ name = "World Shaking Syndrome"
+ stage = 3
+ multiplier_max = 3
+ activate(var/mob/living/carbon/human/mob,var/multiplier)
+ shake_camera(mob,5*multiplier)
+
+/datum/disease2/effect/telepathic
+ name = "Telepathy Syndrome"
+ stage = 3
+ activate(var/mob/living/carbon/human/mob,var/multiplier)
+ mob.dna.SetSEState(GLOB.REMOTETALKBLOCK,1)
+ domutcheck(mob, null, MUTCHK_FORCED)
+
+/datum/disease2/effect/mind
+ name = "Lazy Mind Syndrome"
+ stage = 3
+ badness = VIRUS_COMMON
+ activate(var/mob/living/carbon/human/mob,var/multiplier)
+ var/obj/item/organ/internal/brain/B = mob.internal_organs_by_name[BP_BRAIN]
+ if (B && B.damage < B.min_broken_damage)
+ B.take_internal_damage(5)
+
+/datum/disease2/effect/deaf
+ name = "Hard of Hearing Syndrome"
+ stage = 3
+ activate(var/mob/living/carbon/human/mob,var/multiplier)
+ mob.ear_deaf = 5
+
+/datum/disease2/effect/confusion
+ name = "Topographical Cretinism"
+ stage = 3
+ activate(var/mob/living/carbon/human/mob,var/multiplier)
+ to_chat(mob, "You have trouble telling right and left apart all of a sudden.")
+ mob.confused = min(mob.confused + 10, 50)
+
+/datum/disease2/effect/mutation
+ name = "DNA Degradation"
+ stage = 3
+ badness = VIRUS_COMMON
+ activate(var/mob/living/carbon/human/mob,var/multiplier)
+ mob.apply_damage(2, CLONE)
+
+/datum/disease2/effect/chem_synthesis
+ name = "Chemical Synthesis"
+ stage = 3
+ badness = VIRUS_COMMON
+ chance_max = 25
+
+ generate(c_data)
+ if(c_data)
+ data = c_data
+ else
+ data = pick(/datum/reagent/bicaridine, /datum/reagent/kelotane, /datum/reagent/dylovene, /datum/reagent/inaprovaline, /datum/reagent/space_drugs, /datum/reagent/sugar,
+ /datum/reagent/tramadol, /datum/reagent/dexalin, /datum/reagent/cryptobiolin, /datum/reagent/impedrezene, /datum/reagent/hyperzine, /datum/reagent/ethylredoxrazine,
+ /datum/reagent/mindbreaker, /datum/reagent/nutriment/glucose)
+ var/datum/reagent/R = data
+ name = "[initial(name)] ([initial(R.name)])"
+
+ activate(var/mob/living/carbon/human/mob,var/multiplier)
+ if (mob.reagents.get_reagent_amount(data) < 5)
+ mob.reagents.add_reagent(data, 2)
+
+/datum/disease2/effect/nothing
+ name = "Nil Syndrome"
+ stage = 1
+ badness = VIRUS_MILD
+ chance_max = 0
+ allow_multiple = 1
+
+////////////////////////STAGE 2/////////////////////////////////
+/datum/disease2/effect/drowsness
+ name = "Automated Sleeping Syndrome"
+ stage = 2
+ activate(var/mob/living/carbon/human/mob,var/multiplier)
+ mob.drowsyness = min(mob.drowsyness + 10, 50)
+
+/datum/disease2/effect/sleepy
+ name = "Resting Syndrome"
+ stage = 2
+ chance_max = 15
+ delay = 35 SECONDS
+ activate(var/mob/living/carbon/human/mob,var/multiplier)
+ mob.emote("collapse")
+
+/datum/disease2/effect/blind
+ name = "Blackout Syndrome"
+ stage = 2
+ badness = VIRUS_COMMON
+ activate(var/mob/living/carbon/human/mob,var/multiplier)
+ mob.eye_blind = max(mob.eye_blind, 4)
+
+/datum/disease2/effect/cough
+ name = "Anima Syndrome"
+ stage = 2
+ delay = 25 SECONDS
+ activate(var/mob/living/carbon/human/mob,var/multiplier)
+ mob.emote("cough")
+ if (mob.wear_mask)
+ return
+ for(var/mob/living/carbon/human/M in oview(2,mob))
+ mob.spread_disease_to(M)
+
+/datum/disease2/effect/hungry
+ name = "Appetiser Effect"
+ stage = 2
+ activate(var/mob/living/carbon/human/mob,var/multiplier)
+ mob.adjust_nutrition(-200)
+
+/datum/disease2/effect/fridge
+ name = "Refridgerator Syndrome"
+ stage = 2
+ chance_max = 25
+ delay = 25 SECONDS
+ activate(var/mob/living/carbon/human/mob,var/multiplier)
+ mob.emote("shiver")
+
+/datum/disease2/effect/hair
+ name = "Hair Loss"
+ stage = 2
+ badness = VIRUS_COMMON
+ activate(var/mob/living/carbon/human/mob,var/multiplier)
+ if(mob.species.name == SPECIES_HUMAN && !(mob.h_style == "Bald") && !(mob.h_style == "Balding Hair"))
+ to_chat(mob, "Your hair starts to fall out in clumps...")
+ spawn(50)
+ mob.h_style = "Balding Hair"
+ mob.update_hair()
+
+/datum/disease2/effect/stimulant
+ name = "Adrenaline Extra"
+ stage = 2
+ badness = VIRUS_COMMON
+ activate(var/mob/living/carbon/human/mob,var/multiplier)
+ to_chat(mob, "You feel a rush of energy inside you!")
+ if (mob.reagents.get_reagent_amount(/datum/reagent/hyperzine) < 10)
+ mob.reagents.add_reagent(/datum/reagent/hyperzine, 4)
+ if (prob(30))
+ mob.jitteriness = min(mob.jitteriness + 10, 500)
+
+////////////////////////STAGE 1/////////////////////////////////
+
+/datum/disease2/effect/sneeze
+ name = "Coldingtons Effect"
+ stage = 1
+ delay = 15 SECONDS
+
+ activate(var/mob/living/carbon/human/mob,var/multiplier)
+ if (prob(30))
+ to_chat(mob, "You feel like you are about to sneeze!")
+ sleep(5)
+ mob.emote("sneeze")
+ for(var/mob/living/carbon/human/M in get_step(mob,mob.dir))
+ mob.spread_disease_to(M)
+ if (prob(50) && !mob.wear_mask)
+ var/obj/effect/decal/cleanable/mucus/M = new(get_turf(mob))
+ M.virus2 = virus_copylist(mob.virus2)
+
+/datum/disease2/effect/gunck
+ name = "Flemmingtons"
+ stage = 1
+ delay = 25 SECONDS
+ activate(var/mob/living/carbon/human/mob,var/multiplier)
+ to_chat(mob, "Mucous runs down the back of your throat.")
+
+/datum/disease2/effect/drool
+ name = "Saliva Effect"
+ stage = 1
+ chance_max = 25
+ delay = 25 SECONDS
+ activate(var/mob/living/carbon/human/mob,var/multiplier)
+ mob.emote("drool")
+
+/datum/disease2/effect/twitch
+ name = "Twitcher"
+ stage = 1
+ chance_max = 25
+ delay = 25 SECONDS
+ activate(var/mob/living/carbon/human/mob,var/multiplier)
+ mob.emote("twitch")
+
+/datum/disease2/effect/headache
+ name = "Headache"
+ stage = 1
+ delay = 25 SECONDS
+ activate(var/mob/living/carbon/human/mob,var/multiplier)
+ mob.custom_pain("Your head hurts a bit.", 20)
+
+/datum/disease2/effect/itch
+ name = "Itches"
+ stage = 1
+ delay = 25 SECONDS
+ activate(var/mob/living/carbon/human/mob,var/multiplier)
+ var/obj/O = pick(mob.organs)
+ to_chat(mob, "Your [O.name] itches like hell.")
+
+/datum/disease2/effect/stomach
+ name = "Upset stomach"
+ stage = 1
+ delay = 25 SECONDS
+ activate(var/mob/living/carbon/human/mob,var/multiplier)
+ to_chat(mob, "Your stomach feels heavy.")
+
+/datum/disease2/effect/stealth
+ name = "Silent Death Syndrome"
+ stage = 1
+ badness = VIRUS_EXOTIC
+ chance_max = 0
+ allow_multiple = 1
\ No newline at end of file
diff --git a/code/modules/virus2/helpers.dm b/code/modules/virus2/helpers.dm
new file mode 100644
index 00000000000..36740face50
--- /dev/null
+++ b/code/modules/virus2/helpers.dm
@@ -0,0 +1,191 @@
+/obj/machinery/disease2
+ core_skill = SKILL_VIROLOGY
+
+/obj/machinery/proc/infect_nearby(datum/disease2/disease/disease, base_chance = 20, dist = 2)
+ if(istype(disease) && operator_skill <= HAS_PERK)
+ for(var/mob/living/carbon/victim in range(dist, src))
+ if(prob(base_chance))
+ infect_virus2(victim, disease)
+
+//Returns 1 if mob can be infected, 0 otherwise.
+proc/infection_chance(var/mob/living/carbon/M, var/vector = "Airborne")
+ if (!istype(M))
+ return 0
+
+ var/mob/living/carbon/human/H = M
+ if(istype(H) && H.species.get_virus_immune(H))
+ return 0
+
+ var/protection = M.get_blocked_ratio(null, TOX, damage_flags = DAM_DISPERSED | DAM_BIO) //gets the full body bio armour value, weighted by body part coverage.
+ var/score = round(6 * protection) //scales 100% protection to 6.
+
+ switch(vector)
+ if("Airborne")
+ if(M.internal) //not breathing infected air helps greatly
+ return 0
+ var/obj/item/I = M.wear_mask
+ //masks provide a small bonus and can replace overall bio protection
+ if(I)
+ var/datum/extension/armor/armor_datum = get_extension(I, /datum/extension/armor)
+ if(armor_datum)
+ score = max(score, round(0.06*armor_datum.get_value("bio")))
+ if (istype(I, /obj/item/clothing/mask))
+ score += 1 //this should be added after
+
+ if("Contact")
+ if(istype(H))
+ //gloves provide a larger bonus
+ if (istype(H.gloves, /obj/item/clothing/gloves))
+ score += 2
+
+ switch(score)
+ if (6 to INFINITY)
+ return 0
+ if (5)
+ return 1
+ if (4)
+ return 5
+ if (3)
+ return 25
+ if (2)
+ return 45
+ if (1)
+ return 65
+ else
+ return 100
+
+//Similar to infection check, but used for when M is spreading the virus.
+/proc/infection_spreading_check(var/mob/living/carbon/M, var/vector = "Airborne")
+ if (!istype(M))
+ return 0
+
+ var/protection = M.get_blocked_ratio(null, TOX, damage_flags = DAM_DISPERSED | DAM_BIO) //gets the full body bio armour value, weighted by body part coverage.
+
+ if (vector == "Airborne") //for airborne infections face-covering items give non-weighted protection value.
+ if(M.internal)
+ return 1
+ protection = max(protection, M.get_blocked_ratio(BP_HEAD, TOX, damage_flags = DAM_BIO))
+
+ return prob(100 * protection + 15*M.chem_effects[CE_ANTIVIRAL])
+
+/proc/airborne_can_reach(turf/simulated/source, turf/simulated/target)
+ //Can't ariborne without air
+ if(is_below_sound_pressure(source) || is_below_sound_pressure(target))
+ return FALSE
+ //no infecting from other side of the hallway
+ if(get_dist(source,target) > 5)
+ return FALSE
+ if(istype(source) && istype(target))
+ return source.zone == target.zone
+
+//Attemptes to infect mob M with virus. Set forced to 1 to ignore protective clothnig
+/proc/infect_virus2(var/mob/living/carbon/M,var/datum/disease2/disease/disease,var/forced = 0)
+ if(!istype(disease))
+// log_debug("Bad virus")
+ return
+ if(!istype(M))
+// log_debug("Bad mob")
+ return
+ if ("[disease.uniqueID]" in M.virus2)
+ return
+ // if one of the antibodies in the mob's body matches one of the disease's antigens, don't infect
+ var/list/antibodies_in_common = M.antibodies & disease.antigen
+ if(antibodies_in_common.len)
+ return
+ if(prob(100 * M.reagents.get_reagent_amount(/datum/reagent/spaceacillin) / (REAGENTS_OVERDOSE/2)))
+ return
+
+ if(!disease.affected_species.len)
+ return
+
+ if (!(M.species.get_bodytype(M) in disease.affected_species))
+ if (forced)
+ disease.affected_species[1] = M.species.get_bodytype(M)
+ else
+ return //not compatible with this species
+
+// log_debug("Infecting [M]")
+ var/mob_infection_prob = infection_chance(M, disease.spreadtype) * M.immunity_weakness()
+ if(forced || (prob(disease.infectionchance) && prob(mob_infection_prob)))
+ var/datum/disease2/disease/D = disease.getcopy()
+ D.minormutate()
+// log_debug("Adding virus")
+ M.virus2["[D.uniqueID]"] = D
+ BITSET(M.hud_updateflag, STATUS_HUD)
+
+//Infects mob M with random lesser disease, if he doesn't have one
+/proc/infect_mob_random_lesser(var/mob/living/carbon/M)
+ var/datum/disease2/disease/D = new /datum/disease2/disease
+
+ D.makerandom(VIRUS_MILD)
+ infect_virus2(M, D, 1)
+
+//Infects mob M with random greated disease, if he doesn't have one
+/proc/infect_mob_random_greater(var/mob/living/carbon/M)
+ var/datum/disease2/disease/D = new /datum/disease2/disease
+
+ D.makerandom(VIRUS_COMMON)
+ infect_virus2(M, D, 1)
+
+//Fancy prob() function.
+/proc/dprob(var/p)
+ return(prob(sqrt(p)) && prob(sqrt(p)))
+
+/mob/living/carbon/proc/spread_disease_to(var/mob/living/carbon/victim, var/vector = "Airborne")
+ if (src == victim)
+ return "retardation"
+
+// log_debug("Spreading [vector] diseases from [src] to [victim]")
+ if (virus2.len > 0)
+ for (var/ID in virus2)
+// log_debug("Attempting virus [ID]")
+ var/datum/disease2/disease/V = virus2[ID]
+ if(V.spreadtype != vector) continue
+
+ //It's hard to get other people sick if you're in an airtight suit.
+ if(!infection_spreading_check(src, V.spreadtype)) continue
+
+ if (vector == "Airborne")
+ if(airborne_can_reach(get_turf(src), get_turf(victim)))
+// log_debug("In range, infecting")
+ infect_virus2(victim,V)
+// else
+// log_debug("Could not reach target")
+
+ if (vector == "Contact")
+ if (Adjacent(victim))
+// log_debug("In range, infecting")
+ infect_virus2(victim,V)
+
+ //contact goes both ways
+ if (victim.virus2.len > 0 && vector == "Contact" && Adjacent(victim))
+// log_debug("Spreading [vector] diseases from [victim] to [src]")
+ var/nudity = 1
+
+ if (ishuman(victim))
+ var/mob/living/carbon/human/H = victim
+
+ //Allow for small chance of touching other zones.
+ //This is proc is also used for passive spreading so just because they are targeting
+ //that zone doesn't mean that's necessarily where they will touch.
+ var/touch_zone = zone_sel ? zone_sel.selecting : "chest"
+ touch_zone = ran_zone(touch_zone, 80)
+ var/obj/item/organ/external/select_area = H.get_organ(touch_zone)
+ if(!select_area)
+ //give it one more chance, since this is also called for passive spreading
+ select_area = H.get_organ(ran_zone())
+
+ if(!select_area)
+ nudity = 0 //cant contact a missing body part
+ else
+ var/list/clothes = list(H.head, H.wear_mask, H.wear_suit, H.w_uniform, H.gloves, H.shoes)
+ for(var/obj/item/clothing/C in clothes)
+ if(C && istype(C))
+ if(C.body_parts_covered & select_area.body_part)
+ nudity = 0
+ if (nudity)
+ for (var/ID in victim.virus2)
+ var/datum/disease2/disease/V = victim.virus2[ID]
+ if(V && V.spreadtype != vector) continue
+ if(!infection_spreading_check(victim, V.spreadtype)) continue
+ infect_virus2(src,V)
\ No newline at end of file
diff --git a/code/modules/virus2/isolator.dm b/code/modules/virus2/isolator.dm
new file mode 100644
index 00000000000..44cbc248cc7
--- /dev/null
+++ b/code/modules/virus2/isolator.dm
@@ -0,0 +1,227 @@
+// UI menu navigation
+#define HOME "home"
+#define LIST "list"
+#define ENTRY "entry"
+
+/obj/machinery/disease2/isolator/
+ name = "pathogenic isolator"
+ density = 1
+ anchored = 1
+ icon = 'icons/obj/virology.dmi'
+ icon_state = "isolator"
+ var/isolating = 0
+ var/state = HOME
+ var/datum/disease2/disease/virus2 = null
+ var/datum/computer_file/data/virus_record/entry = null
+ var/obj/item/weapon/reagent_containers/syringe/sample = null
+
+/obj/machinery/disease2/isolator/on_update_icon()
+ if (stat & (BROKEN|NOPOWER))
+ icon_state = "isolator"
+ return
+
+ if (isolating)
+ icon_state = "isolator_processing"
+ else if (sample)
+ icon_state = "isolator_in"
+ else
+ icon_state = "isolator"
+
+/obj/machinery/disease2/isolator/attackby(var/obj/O as obj, var/mob/user)
+ if(!istype(O,/obj/item/weapon/reagent_containers/syringe)) return
+ if(sample)
+ to_chat(user, "\The [src] is already loaded.")
+ return
+ if(!user.unEquip(O, src))
+ return
+ sample = O
+
+ user.visible_message("[user] adds \a [O] to \the [src]!", "You add \a [O] to \the [src]!")
+ SSnano.update_uis(src)
+ update_icon()
+
+ src.attack_hand(user)
+
+/obj/machinery/disease2/isolator/interface_interact(mob/user)
+ ui_interact(user)
+ return TRUE
+
+/obj/machinery/disease2/isolator/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ user.set_machine(src)
+
+ var/data[0]
+ data["syringe_inserted"] = !!sample
+ data["isolating"] = isolating
+ data["pathogen_pool"] = null
+ data["state"] = state
+ data["entry"] = entry
+ data["can_print"] = (state != HOME || sample) && !isolating
+
+ switch (state)
+ if (HOME)
+ if (sample)
+ var/list/pathogen_pool[0]
+ for(var/datum/reagent/blood/B in sample.reagents.reagent_list)
+ var/list/virus = B.data["virus2"]
+ for (var/ID in virus)
+ var/datum/disease2/disease/V = virus[ID]
+ var/datum/computer_file/data/virus_record/R = null
+ if (ID in virusDB)
+ R = virusDB[ID]
+
+ var/weakref/W = B.data["donor"]
+ var/mob/living/carbon/human/D = W.resolve()
+ pathogen_pool.Add(list(list(\
+ "name" = "[D ? D.get_species() : "Unidentified"] [B.name]", \
+ "dna" = B.data["blood_DNA"], \
+ "unique_id" = V.uniqueID, \
+ "reference" = "\ref[V]", \
+ "is_in_database" = !!R, \
+ "record" = "\ref[R]")))
+
+ if (pathogen_pool.len > 0)
+ data["pathogen_pool"] = pathogen_pool
+
+ if (LIST)
+ var/list/db[0]
+ for (var/ID in virusDB)
+ var/datum/computer_file/data/virus_record/r = virusDB[ID]
+ db.Add(list(list("name" = r.fields["name"], "record" = "\ref[r]")))
+
+ if (db.len > 0)
+ data["database"] = db
+
+ if (ENTRY)
+ if (entry)
+ var/desc = entry.fields["description"]
+ data["entry"] = list(\
+ "name" = entry.fields["name"], \
+ "description" = replacetext(desc, "\n", ""))
+
+ ui = SSnano.try_update_ui(user, src, ui_key, ui, data, force_open)
+ if (!ui)
+ ui = new(user, src, ui_key, "pathogenic_isolator.tmpl", src.name, 400, 500)
+ ui.set_initial_data(data)
+ ui.open()
+
+/obj/machinery/disease2/isolator/Process()
+ if (isolating > 0)
+ isolating -= 1
+ if(virus2)
+ infect_nearby(virus2)
+ if (isolating == 0)
+ if (virus2)
+ var/obj/item/weapon/virusdish/d = new /obj/item/weapon/virusdish(src.loc)
+ d.virus2 = virus2.getcopy()
+ virus2 = null
+ ping("\The [src] pings, \"Viral strain isolated.\"")
+
+ SSnano.update_uis(src)
+ update_icon()
+
+/obj/machinery/disease2/isolator/OnTopic(mob/user, href_list)
+ if (href_list["close"])
+ SSnano.close_user_uis(user, src, "main")
+ return TOPIC_HANDLED
+
+ if (href_list[HOME])
+ state = HOME
+ return TOPIC_REFRESH
+
+ if (href_list[LIST])
+ state = LIST
+ return TOPIC_REFRESH
+
+ if (href_list[ENTRY])
+ if (istype(locate(href_list["view"]), /datum/computer_file/data/virus_record))
+ entry = locate(href_list["view"])
+
+ state = ENTRY
+ return TOPIC_REFRESH
+
+ if (href_list["print"])
+ print(user)
+ return TOPIC_REFRESH
+
+ if(!sample) return TOPIC_HANDLED
+
+ if (href_list["isolate"])
+ operator_skill = user.get_skill_value(core_skill)
+ var/datum/disease2/disease/V = locate(href_list["isolate"])
+ if (V)
+ virus2 = V
+ isolating = 20
+ update_icon()
+ return TOPIC_REFRESH
+
+ if (href_list["eject"])
+ sample.dropInto(loc)
+ sample = null
+ update_icon()
+ return TOPIC_REFRESH
+
+/obj/machinery/disease2/isolator/proc/print(var/mob/user)
+ var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(loc)
+
+ switch (state)
+ if (HOME)
+ if (!sample) return
+ P.SetName("paper - Patient Diagnostic Report")
+ P.info = {"
+ [virology_letterhead("Patient Diagnostic Report")]
+ CONFIDENTIAL MEDICAL REPORT
+ Sample: [sample.name]
+"}
+
+ if (user)
+ P.info += "Generated By: [user.name]
"
+
+ P.info += "
"
+
+ for(var/datum/reagent/blood/B in sample.reagents.reagent_list)
+ var/weakref/W = B.data["donor"]
+ var/mob/living/carbon/human/D = W.resolve()
+ P.info += "[D ? D.get_species() : "Unidentified"] [B.name]:
[B.data["blood_DNA"]]
"
+
+ var/list/virus = B.data["virus2"]
+ P.info += "Pathogens:
"
+ if (virus.len > 0)
+ for (var/ID in virus)
+ var/datum/disease2/disease/V = virus[ID]
+ P.info += "[V.name()]
"
+ else
+ P.info += "None
"
+
+ P.info += {"
+
+ Additional Notes:
+"}
+
+ if (LIST)
+ P.SetName("paper - Virus List")
+ P.info = {"
+ [virology_letterhead("Virus List")]
+"}
+
+ var/i = 0
+ for (var/ID in virusDB)
+ i++
+ var/datum/computer_file/data/virus_record/r = virusDB[ID]
+ P.info += "[i]. " + r.fields["name"]
+ P.info += "
"
+
+ P.info += {"
+
+ Additional Notes:
+"}
+
+ if (ENTRY)
+ P.SetName("paper - Viral Profile")
+ P.info = {"
+ [virology_letterhead("Viral Profile")]
+ [entry.fields["description"]]
+
+ Additional Notes:
+"}
+
+ state("The nearby computer prints out a report.")
\ No newline at end of file
diff --git a/code/modules/virus2/items_devices.dm b/code/modules/virus2/items_devices.dm
new file mode 100644
index 00000000000..49e1c1aea28
--- /dev/null
+++ b/code/modules/virus2/items_devices.dm
@@ -0,0 +1,108 @@
+///////////////ANTIBODY SCANNER///////////////
+
+/obj/item/device/antibody_scanner
+ name = "antibody scanner"
+ desc = "Scans living beings for antibodies in their blood."
+ icon_state = "health"
+ w_class = ITEM_SIZE_SMALL
+ item_state = "electronic"
+ obj_flags = OBJ_FLAG_CONDUCTIBLE
+
+/obj/item/device/antibody_scanner/attack(mob/M as mob, mob/user as mob)
+ if(!istype(M,/mob/living/carbon/))
+ report("Scan aborted: Incompatible target.", user)
+ return
+
+ var/mob/living/carbon/C = M
+ if (istype(C,/mob/living/carbon/human/))
+ var/mob/living/carbon/human/H = C
+ if(!H.should_have_organ(BP_HEART))
+ report("Scan aborted: The target does not have blood.", user)
+ return
+
+ if(!C.antibodies.len)
+ report("Scan Complete: No antibodies detected.", user)
+ return
+
+ if (MUTATION_CLUMSY in user.mutations && prob(50))
+ // I was tempted to be really evil and rot13 the output.
+ report("Antibodies detected: [reverse_text(antigens2string(C.antibodies))]", user)
+ else
+ report("Antibodies detected: [antigens2string(C.antibodies)]", user)
+
+/obj/item/device/antibody_scanner/proc/report(var/text, mob/user as mob)
+ to_chat(user, "\icon[src] \The [src] beeps, \"[text]\"")
+
+///////////////VIRUS DISH///////////////
+
+/obj/item/weapon/virusdish
+ name = "virus dish"
+ icon = 'icons/obj/items.dmi'
+ icon_state = "implantcase-b"
+ var/datum/disease2/disease/virus2 = null
+ var/growth = 0
+ var/basic_info = null
+ var/info = 0
+ var/analysed = 0
+
+/obj/item/weapon/virusdish/random
+ name = "virus sample"
+
+/obj/item/weapon/virusdish/random/New()
+ ..()
+ src.virus2 = new /datum/disease2/disease
+ src.virus2.makerandom()
+ growth = rand(5, 50)
+
+/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) || istype(W,/obj/item/weapon/reagent_containers/syringe))
+ return
+ ..()
+ if(prob(50))
+ to_chat(user, "\The [src] shatters!")
+ if(virus2.infectionchance > 0)
+ for(var/mob/living/carbon/target in view(1, get_turf(src)))
+ if(airborne_can_reach(get_turf(src), get_turf(target)))
+ infect_virus2(target, src.virus2)
+ qdel(src)
+
+/obj/item/weapon/virusdish/examine(mob/user)
+ . = ..()
+ if(basic_info)
+ to_chat(user, "[basic_info] : More Information")
+
+/obj/item/weapon/virusdish/OnTopic(user, href_list)
+ if(href_list["info"])
+ show_browser(user, info, "window=info_\ref[src]")
+ return TOPIC_HANDLED
+
+/obj/item/weapon/ruinedvirusdish
+ name = "ruined virus sample"
+ icon = 'icons/obj/items.dmi'
+ icon_state = "implantcase-b"
+ desc = "The bacteria in the dish are completely dead."
+
+/obj/item/weapon/ruinedvirusdish/attackby(var/obj/item/weapon/W as obj,var/mob/living/carbon/user as mob)
+ if(istype(W,/obj/item/weapon/hand_labeler) || istype(W,/obj/item/weapon/reagent_containers/syringe))
+ return ..()
+
+ if(prob(50))
+ to_chat(user, "\The [src] shatters!")
+ qdel(src)
+
+///////////////GNA DISK///////////////
+
+/obj/item/weapon/diseasedisk
+ name = "blank GNA disk"
+ icon = 'icons/obj/cloning.dmi'
+ icon_state = "datadisk0"
+ w_class = ITEM_SIZE_TINY
+ var/datum/disease2/effect/effect = null
+ var/list/species = null
+ var/stage = 1
+ var/analysed = 1
+
+/obj/item/weapon/diseasedisk/premade/New()
+ name = "blank GNA disk (stage: [stage])"
+ effect = new /datum/disease2/effect/invisible
+ effect.stage = stage
\ No newline at end of file
diff --git a/maps/away/lar_maria/lar_maria.dm b/maps/away/lar_maria/lar_maria.dm
index 946fe02f399..552e5faed6b 100644
--- a/maps/away/lar_maria/lar_maria.dm
+++ b/maps/away/lar_maria/lar_maria.dm
@@ -14,6 +14,66 @@
cost = 2
area_usage_test_exempted_root_areas = list(/area/lar_maria)
+///////////////////////////////////custom virus for prisoners to spread
+/datum/disease2/disease/lar_maria
+ infectionchance = 90 //very aggressive
+ speed = 10
+ spreadtype = "Airborne"
+
+/datum/disease2/disease/lar_maria/New()
+ ..()
+ var/datum/disease2/effect/sneeze/E1 = new()
+ E1.stage = 1
+ effects += E1
+ var/datum/disease2/effect/stimulant/E2 = new()
+ E2.stage = 2
+ effects += E2
+ var/datum/disease2/effect/stimulant/E3 = new()
+ E3.stage = 3
+ effects += E3
+ var/datum/disease2/effect/rage/E4 = new()
+ E4.stage = 4
+ effects += E4
+
+/datum/disease2/effect/rage //custom effect, fills PC with uncontrollable rage
+ name = "Rampage Syndrome"
+ stage = 4
+ badness = VIRUS_EXOTIC
+ delay = 20 SECONDS
+ var/first_message_shown = FALSE
+
+/datum/disease2/effect/rage/activate(var/mob/living/carbon/human/mob,var/multiplier)
+ if (!first_message_shown)
+ first_message_shown = TRUE
+ to_chat(mob, "Your muscles start tensing up, and you can feel your pulse rising, throbbing at the back of your head. Your breathing increases, and you feel... angry. An urge wells up inside you. Everything is making you angry, and you want it to pay for it.")
+ return //nothing else happens first time giving chance to adjust RP
+ if(prob(50))
+ to_chat(mob, "You feel uncontrollable rage filling you! You want to hurt and destroy!")
+ if (mob.reagents.get_reagent_amount(/datum/reagent/hyperzine) < 10)
+ mob.reagents.add_reagent(/datum/reagent/hyperzine, 4)
+ if(prob(50) && mob.check_has_mouth())//go crazy and bite someone
+ var/list/mouth_status = mob.can_eat_status()
+ if (mouth_status[1] == 1)//if no mouth HUMAN_EATING_NBP_MOUTH
+ to_chat(mob, "You angrily attempt to bite someone but you can't without a mouth!")
+ return
+ if (mouth_status[1] == 2)//if something covers mouth HUMAN_EATING_BLOCKED_MOUTH
+ to_chat(mob, "You angrily chew \the [mouth_status[2]] covering your mouth!")
+ return
+ var/list/mobs_to_bite = list()
+ for (var/mob/living/carbon/human/L in trange(1))
+ if (L == mob)
+ continue
+ mobs_to_bite += L
+ if (mobs_to_bite.len < 1)//nobody to bite
+ return
+ var/mob/living/carbon/human/Target = pick(mobs_to_bite)
+ mob.visible_message("[mob] violently bites [Target]!")
+ Target.adjustBruteLoss(5)
+ if (prob(50))
+ infect_virus2(Target, src, 1)
+
+
+
///////////////////////////////////crew and prisoners
/obj/effect/landmark/corpse/lar_maria
eye_colors_per_species = list(SPECIES_HUMAN = list(COLOR_RED))//red eyes
@@ -43,6 +103,11 @@
attacktext = "punched"
var/obj/effect/landmark/corpse/lar_maria/corpse = null
var/weapon = null
+ var/datum/disease2/disease/lar_maria/LMD = new()
+
+/mob/living/simple_animal/hostile/lar_maria/Destroy()
+ . = ..()
+ QDEL_NULL(LMD)
/mob/living/simple_animal/hostile/lar_maria/death(gibbed, deathmessage, show_dead_message)
..(gibbed, deathmessage, show_dead_message)
@@ -51,8 +116,21 @@
if (weapon)
new weapon(src.loc)
visible_message("Small shining spores float away from dying [src]!")
+ for (var/mob/living/carbon/human/L in orange(3))//infect those who are around
+ if (prob(infection_chance(L, "Airborne")))
+ infect_virus2(L, LMD, 1)
qdel(src)
+/mob/living/simple_animal/hostile/lar_maria/AttackingTarget()
+ . = ..()
+ if (!.)
+ return
+ if(ishuman(target_mob) && Adjacent(target_mob))//if it's human who can be infected standing nearby
+ var/mob/living/L = target_mob
+ if (prob(50))
+ visible_message("[src] violently bites [L]!")
+ infect_virus2(L, LMD, 1)
+
/mob/living/simple_animal/hostile/lar_maria/test_subject
name = "\improper test subject"
desc = "Sick, filthy, angry and probably crazy human in an orange robe."
diff --git a/maps/torch/items/cards_ids.dm b/maps/torch/items/cards_ids.dm
index 8f97405540c..629aef837c5 100644
--- a/maps/torch/items/cards_ids.dm
+++ b/maps/torch/items/cards_ids.dm
@@ -41,6 +41,9 @@
job_access_type = /datum/job/doctor
detail_color = COLOR_PALE_BLUE_GRAY
+/obj/item/weapon/card/id/torch/crew/medical/virology
+ job_access_type = /datum/job/doctor/virologist
+
/obj/item/weapon/card/id/torch/crew/medical/senior
job_access_type = /datum/job/senior_doctor
diff --git a/maps/torch/job/command_jobs.dm b/maps/torch/job/command_jobs.dm
index 10af77400bf..b38b6c04f3f 100644
--- a/maps/torch/job/command_jobs.dm
+++ b/maps/torch/job/command_jobs.dm
@@ -158,7 +158,8 @@
SKILL_MEDICAL = SKILL_EXPERT,
SKILL_ANATOMY = SKILL_EXPERT,
SKILL_CHEMISTRY = SKILL_BASIC,
- SKILL_DEVICES = SKILL_ADEPT)
+ SKILL_DEVICES = SKILL_ADEPT,
+ SKILL_VIROLOGY = HAS_PERK)
max_skill = list( SKILL_MEDICAL = SKILL_MAX,
SKILL_ANATOMY = SKILL_MAX,
diff --git a/maps/torch/job/medical_jobs.dm b/maps/torch/job/medical_jobs.dm
index 45b070edd88..d193e41e475 100644
--- a/maps/torch/job/medical_jobs.dm
+++ b/maps/torch/job/medical_jobs.dm
@@ -3,7 +3,7 @@
department = "Medical"
department_flag = MED
minimal_player_age = 0
- minimum_character_age = list(SPECIES_HUMAN = 25) //lowered to 25 because of Resident alt-title. if resident title is removed or someone changes age to somehow link to tile, raise back to 28
+ minimum_character_age = list(SPECIES_HUMAN = 25)
total_positions = 3
spawn_positions = 3
supervisors = "the Chief Medical Officer"
@@ -86,6 +86,44 @@
/datum/computer_file/program/camera_monitor)
skill_points = 22
+/datum/job/doctor/virologist
+ title = "Virologist" //Highly specialized role for handling viruses only. Not a physician. Not a medtech.
+ total_positions = 1
+ spawn_positions = 1
+ supervisors = "the Chief Medical Officer"
+ economic_power = 8
+ minimum_character_age = list(SPECIES_HUMAN = 25)
+ minimal_player_age = 0
+ alt_titles = list()
+ outfit_type = /decl/hierarchy/outfit/job/torch/crew/medical/virologist
+ allowed_branches = list(
+ /datum/mil_branch/expeditionary_corps,
+ /datum/mil_branch/fleet = /decl/hierarchy/outfit/job/torch/crew/medical/virologist/fleet,
+ /datum/mil_branch/civilian = /decl/hierarchy/outfit/job/torch/crew/medical/contractor/virologist
+ )
+ allowed_ranks = list(
+ /datum/mil_rank/ec/o1,
+ /datum/mil_rank/fleet/o1,
+ /datum/mil_rank/fleet/o2,
+ /datum/mil_rank/civ/contractor
+ )
+ min_skill = list( SKILL_EVA = SKILL_BASIC,
+ SKILL_MEDICAL = SKILL_BASIC,
+ SKILL_ANATOMY = SKILL_BASIC,
+ SKILL_VIROLOGY = HAS_PERK)
+
+ max_skill = list( SKILL_MEDICAL = SKILL_MAX,
+ SKILL_CHEMISTRY = SKILL_MAX)
+
+ access = list(access_medical, access_morgue, access_virology, access_maint_tunnels, access_emergency_storage,
+ access_crematorium, access_surgery,
+ access_medical_equip, access_solgov_crew, access_hangar)
+ minimal_access = list()
+
+ software_on_spawn = list(/datum/computer_file/program/suit_sensors,
+ /datum/computer_file/program/camera_monitor)
+ skill_points = 22
+
/datum/job/medical_trainee
title = "Medical Trainee"
department = "Medical"
diff --git a/maps/torch/job/outfits/boh_outfits.dm b/maps/torch/job/outfits/boh_outfits.dm
index e1e2675ecdf..9a415b225c8 100644
--- a/maps/torch/job/outfits/boh_outfits.dm
+++ b/maps/torch/job/outfits/boh_outfits.dm
@@ -73,6 +73,11 @@
uniform = /obj/item/clothing/under/solgov/utility/army/medical
shoes = /obj/item/clothing/shoes/dutyboots
+/decl/hierarchy/outfit/job/torch/crew/medical/virologist/marine
+ name = OUTFIT_JOB_NAME("Virologist - Marine Corps")
+ uniform = /obj/item/clothing/under/solgov/utility/army/medical
+ shoes = /obj/item/clothing/shoes/dutyboots
+
/decl/hierarchy/outfit/job/torch/crew/medical/doctor/marine
name = OUTFIT_JOB_NAME("Medical Technician - Marine Corps")
uniform = /obj/item/clothing/under/solgov/utility/army/medical
diff --git a/maps/torch/job/outfits/medical_outfits.dm b/maps/torch/job/outfits/medical_outfits.dm
index 7e812f64df0..989b8114cb3 100644
--- a/maps/torch/job/outfits/medical_outfits.dm
+++ b/maps/torch/job/outfits/medical_outfits.dm
@@ -14,15 +14,30 @@
shoes = /obj/item/clothing/shoes/dutyboots
id_type = /obj/item/weapon/card/id/torch/crew/medical/senior
+/decl/hierarchy/outfit/job/torch/crew/medical/virologist
+ name = OUTFIT_JOB_NAME("Virologist - Dagon")
+ uniform = /obj/item/clothing/under/solgov/utility/expeditionary/officer/medical
+ shoes = /obj/item/clothing/shoes/dutyboots
+ id_type =/obj/item/weapon/card/id/torch/crew/medical/virology
+
/decl/hierarchy/outfit/job/torch/crew/medical/senior/fleet
name = OUTFIT_JOB_NAME("Physician - Fleet")
uniform = /obj/item/clothing/under/solgov/utility/fleet/medical
shoes = /obj/item/clothing/shoes/dutyboots
+/decl/hierarchy/outfit/job/torch/crew/medical/virologist/fleet
+ name = OUTFIT_JOB_NAME("Virologist - Fleet")
+ uniform = /obj/item/clothing/under/solgov/utility/fleet/medical
+ shoes = /obj/item/clothing/shoes/dutyboots
+
/decl/hierarchy/outfit/job/torch/crew/medical/contractor/senior
name = OUTFIT_JOB_NAME("Physician - Contractor")
id_type = /obj/item/weapon/card/id/torch/contractor/medical/senior
+/decl/hierarchy/outfit/job/torch/crew/medical/contractor/virologist
+ name = OUTFIT_JOB_NAME("Virologist - Contractor")
+ id_type =/obj/item/weapon/card/id/torch/crew/medical/virology
+
/decl/hierarchy/outfit/job/torch/crew/medical/doctor
name = OUTFIT_JOB_NAME("Medical Technician")
uniform = /obj/item/clothing/under/solgov/utility/expeditionary/medical
diff --git a/maps/torch/job/torch_jobs.dm b/maps/torch/job/torch_jobs.dm
index cbdcd011307..203234c9965 100644
--- a/maps/torch/job/torch_jobs.dm
+++ b/maps/torch/job/torch_jobs.dm
@@ -18,7 +18,7 @@
/datum/job/senior_engineer, /datum/job/engineer, /datum/job/roboticist, /datum/job/engineer_trainee,
/datum/job/officer, /datum/job/warden, /datum/job/detective, /datum/job/seccadet,
/datum/job/squad_lead, /datum/job/combat_tech, /datum/job/grunt, /datum/job/combat_medic,
- /datum/job/senior_doctor, /datum/job/doctor, /datum/job/chemist, /datum/job/medical_trainee,
+ /datum/job/senior_doctor, /datum/job/doctor/virologist, /datum/job/doctor, /datum/job/chemist, /datum/job/medical_trainee,
/datum/job/psychiatrist, /datum/job/chaplain,
/datum/job/qm, /datum/job/cargo_tech, /datum/job/mining,
/datum/job/janitor, /datum/job/chef, /datum/job/bartender,
diff --git a/maps/torch/job/torch_jobs_boh.dm b/maps/torch/job/torch_jobs_boh.dm
index 04a07de3698..1f1532f8b16 100644
--- a/maps/torch/job/torch_jobs_boh.dm
+++ b/maps/torch/job/torch_jobs_boh.dm
@@ -240,6 +240,20 @@
/datum/mil_rank/civ/contractor
)
+/datum/job/doctor/virologist
+ allowed_branches = list(
+ /datum/mil_branch/fleet = /decl/hierarchy/outfit/job/torch/crew/medical/virologist/fleet,
+ /datum/mil_branch/civilian = /decl/hierarchy/outfit/job/torch/crew/medical/contractor/virologist,
+ /datum/mil_branch/marine_corps = /decl/hierarchy/outfit/job/torch/crew/medical/virologist/marine
+ )
+ allowed_ranks = list(
+ /datum/mil_rank/fleet/o3,
+ /datum/mil_rank/fleet/o4,
+ /datum/mil_rank/marine_corps/o3,
+ /datum/mil_rank/marine_corps/o4,
+ /datum/mil_rank/civ/contractor
+ )
+
/datum/job/medical_trainee
allowed_branches = list(
/datum/mil_branch/expeditionary_corps,
diff --git a/maps/torch/loadout/_defines.dm b/maps/torch/loadout/_defines.dm
index a890e4cc51a..4f3e674c2fd 100644
--- a/maps/torch/loadout/_defines.dm
+++ b/maps/torch/loadout/_defines.dm
@@ -14,13 +14,13 @@
#define CASUAL_ROLES list(/datum/job/assistant, /datum/job/janitor, /datum/job/chef, /datum/job/bartender, /datum/job/cargo_tech, /datum/job/roboticist, /datum/job/mining, /datum/job/chaplain, /datum/job/merchant, /datum/job/psiadvisor, /datum/job/submap/bearcat_captain, /datum/job/submap/bearcat_crewman, /datum/job/submap/unishi_crew, /datum/job/submap/unishi_researcher, /datum/job/submap/colonist, /datum/job/submap/pod)
//For roles that would have a higher level of education, typically doctors and other scientists
-#define DOCTOR_ROLES list(/datum/job/cmo, /datum/job/senior_doctor, /datum/job/chemist, /datum/job/psychiatrist, /datum/job/roboticist, /datum/job/rd, /datum/job/senior_scientist, /datum/job/scientist)
+#define DOCTOR_ROLES list(/datum/job/cmo, /datum/job/senior_doctor, /datum/job/doctor/virologist, /datum/job/chemist, /datum/job/psychiatrist, /datum/job/roboticist, /datum/job/rd, /datum/job/senior_scientist, /datum/job/scientist)
//For members of the medical department
-#define MEDICAL_ROLES list(/datum/job/cmo, /datum/job/senior_doctor, /datum/job/doctor, /datum/job/psychiatrist, /datum/job/chemist, /datum/job/medical_trainee)
+#define MEDICAL_ROLES list(/datum/job/cmo, /datum/job/senior_doctor, /datum/job/doctor, /datum/job/doctor/virologist, /datum/job/psychiatrist, /datum/job/chemist, /datum/job/medical_trainee)
//For members of the medical department, roboticists, and some Research
-#define STERILE_ROLES list(/datum/job/cmo, /datum/job/senior_doctor, /datum/job/doctor, /datum/job/chemist, /datum/job/psychiatrist, /datum/job/roboticist, /datum/job/rd, /datum/job/senior_scientist, /datum/job/scientist, /datum/job/scientist_assistant, /datum/job/medical_trainee)
+#define STERILE_ROLES list(/datum/job/cmo, /datum/job/senior_doctor, /datum/job/doctor, /datum/job/doctor/virologist, /datum/job/chemist, /datum/job/psychiatrist, /datum/job/roboticist, /datum/job/rd, /datum/job/senior_scientist, /datum/job/scientist, /datum/job/scientist_assistant, /datum/job/medical_trainee)
//For members of the engineering department
#define ENGINEERING_ROLES list(/datum/job/chief_engineer, /datum/job/senior_engineer, /datum/job/engineer, /datum/job/roboticist, /datum/job/engineer_trainee)
@@ -53,10 +53,10 @@
#define COMMAND_ROLES list(/datum/job/captain, /datum/job/hop, /datum/job/rd, /datum/job/cmo, /datum/job/chief_engineer, /datum/job/hos, /datum/job/sea, /datum/job/sea/marine, /datum/job/bridgeofficer, /datum/job/liaison, /datum/job/solrep, /datum/job/solguard /datum/job/bodyguard, /datum/job/bailiff, /datum/job/psiadvisor, /datum/jiaison, /datum/job/bodyguard, /datum/job/bailiff, ob/adjudicator)
//For jobs that have at least O-1 in either SGF or SMC, but aren't considered Command or Command Support.
-#define OFFICER_ROLES list(/datum/job/scientist, /datum/job/qm, /datum/job/chaplain, /datum/job/psychiatrist, /datum/job/senior_doctor, /datum/job/pathfinder)
+#define OFFICER_ROLES list(/datum/job/scientist, /datum/job/qm, /datum/job/chaplain, /datum/job/psychiatrist, /datum/job/senior_doctor, /datum/job/doctor/virologist, /datum/job/pathfinder)
//For members of Command, Command Support and all other officer roles. Basically COMMAND_ROLES and OFFICER_ROLES merged together as a last resort.
-#define COMMANDANDOFFICER_ROLES list(/datum/job/captain, /datum/job/hop, /datum/job/rd, /datum/job/cmo, /datum/job/chief_engineer, /datum/job/hos, /datum/job/sea, /datum/job/sea/marine, /datum/job/bridgeofficer, /datum/job/liaison, /datum/job/bodyguard, /datum/job/bailiff, /datum/job/psiadvisor, /datum/job/adjudicator, /datum/job/scientist, /datum/job/qm, /datum/job/chaplain, /datum/job/psychiatrist, /datum/job/senior_doctor, /datum/job/pathfinder, /datum/job/solrep, /datum/job/solguard)
+#define COMMANDANDOFFICER_ROLES list(/datum/job/captain, /datum/job/hop, /datum/job/rd, /datum/job/cmo, /datum/job/chief_engineer, /datum/job/hos, /datum/job/sea, /datum/job/sea/marine, /datum/job/bridgeofficer, /datum/job/liaison, /datum/job/bodyguard, /datum/job/bailiff, /datum/job/psiadvisor, /datum/job/adjudicator, /datum/job/scientist, /datum/job/qm, /datum/job/chaplain, /datum/job/psychiatrist, /datum/job/senior_doctor, /datum/job/doctor/virologist, /datum/job/pathfinder, /datum/job/solrep, /datum/job/solguard)
#define UNIFORMED_BRANCHES list(/datum/mil_branch/expeditionary_corps, /datum/mil_branch/fleet, /datum/mil_branch/marine_corps)
diff --git a/maps/torch/loadout/loadout_accessories.dm b/maps/torch/loadout/loadout_accessories.dm
index e8375760184..00864056c0f 100644
--- a/maps/torch/loadout/loadout_accessories.dm
+++ b/maps/torch/loadout/loadout_accessories.dm
@@ -102,7 +102,7 @@
/datum/gear/accessory/armband_corpsman
display_name = "medical armband"
path = /obj/item/clothing/accessory/armband/medblue
- allowed_roles = list(/datum/job/cmo, /datum/job/senior_doctor, /datum/job/doctor, /datum/job/medical_trainee)
+ allowed_roles = list(/datum/job/cmo, /datum/job/senior_doctor, /datum/job/doctor/virologist, /datum/job/doctor, /datum/job/medical_trainee)
/datum/gear/accessory/armband_engineering
allowed_roles = ENGINEERING_ROLES
diff --git a/maps/torch/loadout/loadout_suit.dm b/maps/torch/loadout/loadout_suit.dm
index 26864672d92..fdb7c494ead 100644
--- a/maps/torch/loadout/loadout_suit.dm
+++ b/maps/torch/loadout/loadout_suit.dm
@@ -15,7 +15,7 @@
allowed_roles = list(/datum/job/merchant, /datum/job/hos, /datum/job/warden, /datum/job/detective, /datum/job/officer, /datum/job/seccadet)
/datum/gear/suit/medical_poncho
- allowed_roles = list(/datum/job/senior_doctor, /datum/job/doctor, /datum/job/psychiatrist, /datum/job/merchant, /datum/job/chemist)
+ allowed_roles = list(/datum/job/senior_doctor, /datum/job/doctor/virologist, /datum/job/doctor, /datum/job/psychiatrist, /datum/job/merchant, /datum/job/chemist)
/datum/gear/suit/engineering_poncho
allowed_roles = list(/datum/job/engineer, /datum/job/roboticist, /datum/job/merchant)
diff --git a/maps/torch/structures/closets/medical.dm b/maps/torch/structures/closets/medical.dm
index d4305349200..cfd4ef28730 100644
--- a/maps/torch/structures/closets/medical.dm
+++ b/maps/torch/structures/closets/medical.dm
@@ -60,6 +60,33 @@
new /datum/atom_creator/weighted(list(/obj/item/weapon/storage/backpack/dufflebag/med, /obj/item/weapon/storage/backpack/messenger/med)),
RANDOM_SCRUBS
)
+/obj/structure/closet/secure_closet/medical_viro
+ name = "virologist's locker"
+ req_access = list(access_virology)
+ closet_appearance = /decl/closet_appearance/secure_closet/torch/medical/physician
+
+/obj/structure/closet/secure_closet/medical_viro/WillContain()
+ return list(
+ /obj/item/clothing/under/sterile,
+ /obj/item/clothing/suit/storage/toggle/labcoat/virologist,
+ /obj/item/clothing/shoes/white,
+ /obj/item/device/radio/headset/headset_med,
+ /obj/item/device/radio/headset/headset_med/alt,
+ /obj/item/taperoll/medical,
+ /obj/item/weapon/storage/belt/medical/full,
+ /obj/item/clothing/mask/surgical,
+ /obj/item/device/scanner/health,
+ /obj/item/clothing/accessory/stethoscope,
+ /obj/item/device/flashlight/pen,
+ /obj/item/clothing/glasses/hud/health,
+ /obj/item/device/flash,
+ /obj/item/device/megaphone,
+ /obj/item/weapon/storage/firstaid/adv,
+ /obj/item/weapon/material/knife/folding/swiss,
+ new /datum/atom_creator/weighted(list(/obj/item/weapon/storage/backpack/medic, /obj/item/weapon/storage/backpack/satchel/med)),
+ new /datum/atom_creator/weighted(list(/obj/item/weapon/storage/backpack/dufflebag/med, /obj/item/weapon/storage/backpack/messenger/med)),
+ RANDOM_SCRUBS = 2
+ )
/obj/structure/closet/secure_closet/medical_torchsenior
name = "physician's locker"
diff --git a/maps/torch/torch4_deck2.dmm b/maps/torch/torch4_deck2.dmm
index b0f086486da..d4845ea1366 100644
--- a/maps/torch/torch4_deck2.dmm
+++ b/maps/torch/torch4_deck2.dmm
@@ -1635,9 +1635,10 @@
/turf/simulated/floor/tiled/monotile,
/area/engineering/locker_room)
"da" = (
-/obj/effect/floor_decal/techfloor{
- dir = 8
- },
+/obj/effect/floor_decal/industrial/outline/yellow,
+/obj/structure/table/rack,
+/obj/random/firstaid,
+/obj/random/firstaid,
/turf/simulated/floor/tiled/techfloor/grid,
/area/medical/storage)
"db" = (
@@ -1654,6 +1655,9 @@
dir = 9
},
/obj/effect/floor_decal/techfloor/corner,
+/obj/effect/floor_decal/techfloor/corner{
+ dir = 8
+ },
/turf/simulated/floor/tiled/techfloor,
/area/medical/storage)
"dc" = (
@@ -6945,10 +6949,8 @@
/turf/simulated/wall/r_wall/prepainted,
/area/hallway/primary/seconddeck/elevator)
"nb" = (
-/obj/structure/table/rack,
/obj/effect/floor_decal/industrial/outline/yellow,
-/obj/random/firstaid,
-/obj/random/firstaid,
+/obj/structure/closet/l3closet/virology,
/turf/simulated/floor/tiled/techfloor/grid,
/area/medical/storage)
"nc" = (
@@ -8009,15 +8011,13 @@
dir = 8;
icon_state = "corner_techfloor_grid"
},
-/obj/effect/floor_decal/techfloor/corner{
- dir = 8
- },
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
},
+/obj/effect/floor_decal/techfloor,
/turf/simulated/floor/tiled/techfloor,
/area/medical/storage)
"pi" = (
@@ -10869,10 +10869,10 @@
/turf/simulated/floor/tiled/techfloor,
/area/engineering/bluespace/containment)
"up" = (
-/obj/effect/floor_decal/techfloor/corner{
+/obj/effect/floor_decal/techfloor,
+/obj/effect/floor_decal/techfloor{
dir = 1
},
-/obj/effect/floor_decal/techfloor,
/turf/simulated/floor/tiled/techfloor/grid,
/area/medical/storage)
"uq" = (
@@ -11010,6 +11010,9 @@
/obj/machinery/light/small{
dir = 4
},
+/obj/effect/floor_decal/techfloor/corner{
+ dir = 1
+ },
/turf/simulated/floor/tiled/techfloor/grid,
/area/medical/storage)
"uC" = (
@@ -18138,6 +18141,9 @@
/obj/effect/floor_decal/techfloor{
dir = 4
},
+/obj/effect/floor_decal/techfloor{
+ dir = 8
+ },
/turf/simulated/floor/tiled/techfloor/grid,
/area/medical/storage)
"PE" = (
diff --git a/maps/torch/torch5_deck1.dmm b/maps/torch/torch5_deck1.dmm
index bc29ad5d3e7..e602ca46c83 100644
--- a/maps/torch/torch5_deck1.dmm
+++ b/maps/torch/torch5_deck1.dmm
@@ -3,8 +3,13 @@
/turf/space,
/area/space)
"aac" = (
-/obj/structure/inflatable,
-/turf/simulated/floor/plating,
+/obj/machinery/washing_machine,
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/effect/floor_decal/corner/paleblue/mono,
+/obj/effect/floor_decal/industrial/outline/yellow,
+/turf/simulated/floor/tiled/white/monotile,
/area/medical/virology)
"aad" = (
/obj/structure/disposalpipe/segment,
@@ -177,14 +182,16 @@
/turf/simulated/floor/tiled/dark,
/area/command/armoury)
"aav" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/random/junk,
-/turf/simulated/floor/plating,
+/obj/machinery/disease2/isolator,
+/obj/effect/floor_decal/corner/paleblue/mono,
+/obj/effect/floor_decal/industrial/outline/yellow,
+/turf/simulated/floor/tiled/white/monotile,
/area/medical/virology)
"aaw" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/smartfridge/secure/virology,
-/turf/simulated/floor/plating,
+/obj/machinery/computer/centrifuge,
+/obj/effect/floor_decal/corner/paleblue/mono,
+/obj/effect/floor_decal/industrial/outline/yellow,
+/turf/simulated/floor/tiled/white/monotile,
/area/medical/virology)
"aay" = (
/obj/effect/floor_decal/corner_techfloor_grid{
@@ -230,14 +237,13 @@
/turf/space,
/area/space)
"aaH" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/random/junk,
-/obj/structure/cable/green{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
+ dir = 1
},
-/turf/simulated/floor/plating,
+/obj/effect/floor_decal/corner/paleblue{
+ dir = 6
+ },
+/turf/simulated/floor/tiled/white,
/area/medical/virology)
"aaI" = (
/obj/structure/table/steel,
@@ -838,8 +844,24 @@
/turf/simulated/floor/tiled/freezer,
/area/crew_quarters/head/aux)
"abT" = (
-/obj/random/junk,
-/turf/simulated/floor/plating,
+/obj/structure/cable/green{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/obj/machinery/embedded_controller/radio/airlock/access_controller{
+ id_tag = "virology_airlock_control";
+ name = "Virology Access Console";
+ pixel_x = -24;
+ pixel_y = -24;
+ req_access = list("ACCESS_VIRO");
+ tag_exterior_door = "virology_airlock_exterior";
+ tag_interior_door = "virology_airlock_interior"
+ },
+/obj/effect/floor_decal/corner/paleblue{
+ dir = 6
+ },
+/turf/simulated/floor/tiled/white,
/area/medical/virology)
"abU" = (
/obj/structure/lattice,
@@ -1191,29 +1213,51 @@
/turf/simulated/floor/tiled/monotile,
/area/rnd/development)
"acI" = (
-/obj/machinery/door/firedoor,
-/obj/effect/wallframe_spawn/reinforced,
-/turf/simulated/floor/plating,
-/area/medical/virology)
-"acJ" = (
-/obj/effect/decal/cleanable/filth,
/obj/structure/cable/green{
- d1 = 4;
+ d2 = 2;
+ icon_state = "0-2"
+ },
+/obj/structure/cable/green{
+ d1 = 2;
d2 = 8;
- icon_state = "4-8"
+ icon_state = "2-8"
},
-/turf/simulated/floor/plating,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/effect/wallframe_spawn/reinforced,
+/turf/simulated/floor/tiled/white,
+/area/medical/virology)
+"acJ" = (
+/obj/structure/table/glass,
+/obj/effect/floor_decal/corner/paleblue/mono,
+/turf/simulated/floor/tiled/white/monotile,
/area/medical/virology)
"acL" = (
/turf/simulated/wall/prepainted,
/area/maintenance/firstdeck/aftstarboard)
"acM" = (
-/turf/simulated/wall/r_wall/prepainted,
-/area/maintenance/firstdeck/centralstarboard)
+/obj/machinery/disease2/incubator,
+/obj/item/weapon/storage/secure/safe{
+ pixel_x = 5;
+ pixel_y = 29
+ },
+/obj/effect/floor_decal/corner/paleblue/mono,
+/obj/effect/floor_decal/industrial/outline/yellow,
+/turf/simulated/floor/tiled/white/monotile,
+/area/medical/virology)
"acN" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/table,
-/turf/simulated/floor/plating,
+/obj/effect/floor_decal/corner/paleblue{
+ dir = 10
+ },
+/obj/machinery/atmospherics/unary/vent_scrubber/on{
+ dir = 1
+ },
+/obj/item/device/radio/intercom{
+ dir = 1;
+ pixel_y = -28
+ },
+/turf/simulated/floor/tiled/white,
/area/medical/virology)
"acO" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
@@ -1538,9 +1582,15 @@
/turf/simulated/floor/tiled,
/area/hallway/primary/firstdeck/center)
"ads" = (
-/obj/effect/decal/cleanable/cobweb,
-/turf/simulated/wall/r_wall/prepainted,
-/area/maintenance/firstdeck/aftstarboard)
+/obj/structure/reagent_dispensers/virusfood{
+ density = 0;
+ pixel_y = 32
+ },
+/obj/machinery/disease2/antibodyanalyser,
+/obj/effect/floor_decal/corner/paleblue/mono,
+/obj/effect/floor_decal/industrial/outline/yellow,
+/turf/simulated/floor/tiled/white/monotile,
+/area/medical/virology)
"adt" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
@@ -2735,9 +2785,15 @@
/turf/simulated/floor/tiled/techfloor,
/area/crew_quarters/safe_room/firstdeck)
"afD" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/bed/padded,
-/turf/simulated/floor/plating,
+/obj/structure/cable/green{
+ d2 = 4;
+ icon_state = "0-4"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/effect/wallframe_spawn/reinforced,
+/turf/simulated/floor/tiled/white,
/area/medical/virology)
"afE" = (
/obj/machinery/hologram/holopad,
@@ -2984,6 +3040,10 @@
d2 = 2;
icon_state = "1-2"
},
+/obj/structure/disposalpipe/segment{
+ dir = 8;
+ icon_state = "pipe-c"
+ },
/turf/simulated/floor/tiled/white,
/area/medical/sleeper)
"agc" = (
@@ -4337,22 +4397,35 @@
/turf/simulated/floor/tiled,
/area/security/wing)
"aik" = (
-/obj/structure/catwalk,
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/barricade,
-/turf/simulated/floor/plating,
+/obj/machinery/atmospherics/unary/vent_scrubber/on{
+ dir = 4
+ },
+/obj/effect/floor_decal/corner/paleblue{
+ dir = 6
+ },
+/obj/effect/floor_decal/industrial/warning{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
/area/medical/virology/access)
"ail" = (
-/obj/structure/catwalk,
-/obj/effect/decal/cleanable/dirt,
-/obj/random/junk,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{
+ dir = 4
+ },
+/obj/structure/disposalpipe/segment,
/obj/structure/cable/green{
d1 = 1;
d2 = 2;
icon_state = "1-2"
},
-/obj/structure/barricade,
-/turf/simulated/floor/plating,
+/obj/effect/floor_decal/corner/paleblue{
+ dir = 9
+ },
+/obj/effect/floor_decal/industrial/warning{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
/area/medical/virology/access)
"aim" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
@@ -4400,17 +4473,38 @@
/obj/effect/floor_decal/corner/paleblue{
dir = 6
},
+/obj/machinery/embedded_controller/radio/airlock/access_controller{
+ id_tag = "virology_airlock_control";
+ name = "Virology Access Console";
+ pixel_x = -24;
+ pixel_y = 22;
+ req_access = list("ACCESS_VIRO");
+ tag_exterior_door = "virology_airlock_exterior";
+ tag_interior_door = "virology_airlock_interior"
+ },
/turf/simulated/floor/tiled/white,
/area/medical/sleeper)
"aiq" = (
-/obj/structure/catwalk,
-/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable/green{
+ d1 = 2;
+ d2 = 4;
+ icon_state = "2-4"
+ },
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/structure/disposalpipe/segment,
/obj/structure/cable/green{
d1 = 1;
d2 = 2;
icon_state = "1-2"
},
-/turf/simulated/floor/plating,
+/obj/effect/floor_decal/corner/paleblue{
+ dir = 9
+ },
+/obj/effect/floor_decal/industrial/warning,
+/turf/simulated/floor/tiled/white,
/area/medical/virology/access)
"air" = (
/obj/structure/hygiene/sink{
@@ -4434,23 +4528,32 @@
/area/security/wing)
"ais" = (
/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/virology{
+ frequency = 1379;
+ id_tag = "virology_airlock_exterior";
+ locked = 1;
+ name = "Virology External Airlock"
+ },
/obj/effect/floor_decal/industrial/hatch/yellow,
-/obj/structure/barricade,
-/obj/structure/door_assembly,
/turf/simulated/floor/tiled/white/monotile,
/area/medical/virology/access)
"ait" = (
/obj/machinery/door/firedoor,
-/obj/effect/floor_decal/industrial/hatch/yellow,
-/obj/machinery/door/airlock/medical{
- name = "Decomissioned Virology"
- },
/obj/structure/cable/green{
d1 = 1;
d2 = 2;
icon_state = "1-2"
},
-/obj/structure/barricade,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/structure/disposalpipe/segment,
+/obj/machinery/door/airlock/virology{
+ frequency = 1379;
+ id_tag = "virology_airlock_exterior";
+ locked = 1;
+ name = "Virology External Airlock"
+ },
+/obj/effect/floor_decal/industrial/hatch/yellow,
/turf/simulated/floor/tiled/white/monotile,
/area/medical/virology/access)
"aiu" = (
@@ -4462,12 +4565,8 @@
d2 = 8;
icon_state = "4-8"
},
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
- },
+/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply,
/obj/effect/floor_decal/corner/paleblue{
dir = 9
},
@@ -4481,6 +4580,7 @@
d2 = 8;
icon_state = "1-8"
},
+/obj/structure/disposalpipe/segment,
/turf/simulated/floor/tiled/white,
/area/medical/sleeper)
"aiy" = (
@@ -4933,9 +5033,19 @@
/turf/simulated/floor/tiled,
/area/security/wing)
"ajz" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/door/airlock/virology,
-/turf/simulated/floor/plating,
+/obj/structure/cable/green{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/machinery/door/window/southright{
+ dir = 8;
+ name = "Virology Isolation Room One"
+ },
+/obj/effect/floor_decal/corner/paleblue{
+ dir = 9
+ },
+/turf/simulated/floor/tiled/white,
/area/medical/virology)
"ajC" = (
/obj/effect/floor_decal/floordetail/edgedrain{
@@ -5033,13 +5143,15 @@
/turf/simulated/floor/airless,
/area/thruster/d1starboard)
"ajN" = (
-/obj/structure/inflatable,
+/obj/structure/closet/secure_closet/virology,
/obj/structure/cable/green{
d1 = 1;
d2 = 2;
icon_state = "1-2"
},
-/turf/simulated/floor/plating,
+/obj/effect/floor_decal/corner/paleblue/mono,
+/obj/effect/floor_decal/industrial/outline/yellow,
+/turf/simulated/floor/tiled/white/monotile,
/area/medical/virology)
"ajO" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
@@ -5226,17 +5338,29 @@
/turf/simulated/floor/plating,
/area/shuttle/escape_pod7/station)
"akc" = (
+/obj/structure/cable/green{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
/obj/structure/cable/green{
d1 = 1;
- d2 = 2;
- icon_state = "1-2"
+ d2 = 8;
+ icon_state = "1-8"
},
-/turf/simulated/floor/plating,
+/obj/effect/floor_decal/corner/paleblue{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
/area/medical/virology)
"akd" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/closet/wardrobe/virology_white,
-/turf/simulated/floor/plating,
+/obj/structure/bed/padded,
+/obj/item/weapon/bedsheet,
+/obj/machinery/atmospherics/unary/vent_pump/on{
+ dir = 1
+ },
+/obj/effect/floor_decal/corner/paleblue/mono,
+/turf/simulated/floor/tiled/white/monotile,
/area/medical/virology)
"ake" = (
/obj/machinery/power/breakerbox/activated{
@@ -5458,25 +5582,48 @@
/turf/simulated/floor/tiled,
/area/security/brig/perma)
"akv" = (
-/obj/machinery/requests_console{
- announcementConsole = 1;
- department = "Medbay";
- departmentType = 1;
- name = "Medbay RC";
- pixel_x = -31
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/virology{
+ frequency = 1379;
+ id_tag = "virology_airlock_interior";
+ locked = 1;
+ name = "Virology Internal Airlock"
},
-/obj/structure/door_assembly,
-/obj/structure/firedoor_assembly,
-/turf/simulated/floor/plating,
+/obj/effect/floor_decal/industrial/hatch/yellow,
+/obj/machinery/door/blast/regular{
+ density = 0;
+ dir = 1;
+ icon_state = "pdoor0";
+ id_tag = "virologyquar";
+ name = "Virology Emergency Quarantine Blast Doors";
+ opacity = 0
+ },
+/turf/simulated/floor/tiled/white/monotile,
/area/medical/virology/access)
"aky" = (
-/obj/effect/decal/cleanable/dirt,
+/obj/machinery/smartfridge/secure/virology{
+ req_access = list(list("ACCESS_VIRO","ACCESS_SURGERY"))
+ },
+/obj/machinery/requests_console{
+ department = "Virology";
+ name = "Virology Requests Console";
+ pixel_x = -32
+ },
/obj/structure/cable/green{
d1 = 1;
d2 = 2;
icon_state = "1-2"
},
-/turf/simulated/floor/plating,
+/obj/machinery/button/blast_door{
+ desc = "A remote control-switch for shutters.";
+ id_tag = "viro2_shutters";
+ name = "Virology Window Shutters";
+ pixel_x = -22;
+ pixel_y = 24
+ },
+/obj/effect/floor_decal/corner/paleblue/mono,
+/obj/effect/floor_decal/industrial/outline/yellow,
+/turf/simulated/floor/tiled/white/monotile,
/area/medical/virology)
"akz" = (
/obj/machinery/washing_machine,
@@ -5485,16 +5632,6 @@
},
/turf/simulated/floor/tiled,
/area/security/brig/perma)
-"akA" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/table,
-/obj/structure/cable/green{
- d1 = 1;
- d2 = 8;
- icon_state = "1-8"
- },
-/turf/simulated/floor/plating,
-/area/medical/virology)
"akC" = (
/turf/simulated/wall/prepainted,
/area/security/brig/psionic)
@@ -5603,12 +5740,11 @@
/turf/simulated/floor/tiled/techfloor/grid,
/area/crew_quarters/safe_room/firstdeck)
"akO" = (
-/obj/structure/cable/green{
- d1 = 1;
- d2 = 4;
- icon_state = "1-4"
- },
-/turf/simulated/floor/plating,
+/obj/structure/closet/secure_closet/personal/patient,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/effect/floor_decal/corner/paleblue/mono,
+/obj/effect/floor_decal/industrial/outline/yellow,
+/turf/simulated/floor/tiled/white/monotile,
/area/medical/virology)
"akQ" = (
/obj/structure/cable/green{
@@ -5637,22 +5773,9 @@
},
/turf/simulated/floor/plating,
/area/security/wing)
-"akR" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable/green{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
- },
-/turf/simulated/floor/plating,
-/area/medical/virology)
"akS" = (
-/obj/structure/cable/green{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
- },
-/turf/simulated/floor/plating,
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/turf/simulated/floor/tiled/white,
/area/medical/virology)
"akU" = (
/obj/machinery/door/airlock/civilian{
@@ -5724,9 +5847,21 @@
/turf/simulated/floor/tiled,
/area/security/brig/perma)
"alb" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/portable_atmospherics/canister/oxygen,
-/turf/simulated/floor/plating,
+/obj/effect/floor_decal/corner/paleblue{
+ dir = 10
+ },
+/obj/machinery/atmospherics/unary/vent_scrubber/on{
+ dir = 1
+ },
+/obj/effect/landmark{
+ name = "xeno_spawn";
+ pixel_x = -1
+ },
+/obj/item/device/radio/intercom{
+ dir = 1;
+ pixel_y = -28
+ },
+/turf/simulated/floor/tiled/white,
/area/medical/virology)
"alc" = (
/obj/structure/table/reinforced,
@@ -5754,24 +5889,18 @@
/turf/simulated/floor/tiled,
/area/security/brig/perma)
"alf" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/filth,
-/obj/structure/cable/green{
- d1 = 2;
- d2 = 4;
- icon_state = "2-4"
- },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/structure/disposalpipe/segment,
/obj/structure/cable/green{
- d1 = 2;
- d2 = 8;
- icon_state = "2-8"
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
},
-/obj/structure/cable/green{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
+/obj/effect/floor_decal/corner/paleblue{
+ dir = 9
},
-/turf/simulated/floor/plating,
+/turf/simulated/floor/tiled/white,
/area/medical/virology)
"alh" = (
/obj/structure/cable{
@@ -5895,18 +6024,43 @@
/turf/simulated/floor/plating,
/area/maintenance/firstdeck/centralstarboard)
"als" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/structure/disposalpipe/segment,
/obj/structure/cable/green{
d1 = 1;
d2 = 2;
icon_state = "1-2"
},
-/obj/structure/door_assembly,
-/obj/structure/firedoor_assembly,
-/turf/simulated/floor/plating,
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/virology{
+ frequency = 1379;
+ id_tag = "virology_airlock_interior";
+ locked = 1;
+ name = "Virology Internal Airlock"
+ },
+/obj/effect/floor_decal/industrial/hatch/yellow,
+/obj/machinery/door/blast/regular{
+ density = 0;
+ dir = 1;
+ icon_state = "pdoor0";
+ id_tag = "virologyquar";
+ name = "Virology Emergency Quarantine Blast Doors";
+ opacity = 0
+ },
+/turf/simulated/floor/tiled/white/monotile,
/area/medical/virology/access)
"alu" = (
-/obj/effect/decal/cleanable/filth,
-/turf/simulated/floor/plating,
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/obj/effect/floor_decal/corner/paleblue{
+ dir = 5
+ },
+/obj/effect/floor_decal/corner/paleblue{
+ dir = 10
+ },
+/turf/simulated/floor/tiled/white,
/area/medical/virology)
"alw" = (
/obj/structure/table/reinforced,
@@ -7213,6 +7367,7 @@
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 9
},
+/obj/structure/disposalpipe/segment,
/turf/simulated/floor/tiled/white,
/area/medical/sleeper)
"anN" = (
@@ -10266,8 +10421,20 @@
/turf/simulated/floor/tiled,
/area/security/wing)
"asZ" = (
-/obj/effect/decal/cleanable/dirt,
-/turf/simulated/wall/r_wall/hull,
+/obj/machinery/disposal,
+/obj/structure/disposalpipe/trunk{
+ dir = 4
+ },
+/obj/machinery/camera/network/medbay{
+ c_tag = "Virology - Fore"
+ },
+/obj/machinery/alarm{
+ dir = 4;
+ pixel_x = -23;
+ pixel_y = 0
+ },
+/obj/effect/floor_decal/industrial/hatch/yellow,
+/turf/simulated/floor/tiled/white,
/area/medical/virology)
"ata" = (
/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,
@@ -10292,7 +10459,19 @@
/turf/simulated/floor/tiled,
/area/security/wing)
"atb" = (
-/turf/simulated/floor/plating,
+/obj/machinery/firealarm{
+ dir = 2;
+ pixel_y = 24
+ },
+/obj/structure/closet/crate/freezer,
+/obj/item/weapon/virusdish/random,
+/obj/item/weapon/virusdish/random,
+/obj/item/weapon/virusdish/random,
+/obj/item/weapon/virusdish/random,
+/obj/item/weapon/virusdish/random,
+/obj/effect/floor_decal/corner/paleblue/mono,
+/obj/effect/floor_decal/industrial/outline/yellow,
+/turf/simulated/floor/tiled/white/monotile,
/area/medical/virology)
"atc" = (
/obj/structure/cable/green{
@@ -13233,6 +13412,7 @@
dir = 4;
pixel_x = 24
},
+/obj/structure/disposalpipe/segment,
/turf/simulated/floor/tiled/white,
/area/medical/sleeper)
"aDE" = (
@@ -13596,6 +13776,7 @@
dir = 4;
icon_state = "tube1"
},
+/obj/structure/disposalpipe/segment,
/turf/simulated/floor/tiled/white,
/area/medical/sleeper)
"aFB" = (
@@ -13782,6 +13963,17 @@
/obj/effect/wallframe_spawn/reinforced/no_grille,
/turf/simulated/floor/plating,
/area/rnd/development)
+"aGF" = (
+/obj/structure/cable/green{
+ d2 = 8;
+ icon_state = "0-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/effect/wallframe_spawn/reinforced,
+/turf/simulated/floor/tiled/white,
+/area/medical/virology)
"aGG" = (
/turf/simulated/wall/prepainted,
/area/rnd/breakroom)
@@ -14199,6 +14391,22 @@
},
/turf/simulated/floor/tiled/dark,
/area/medical/morgue)
+"aKy" = (
+/obj/structure/cable/green{
+ d2 = 2;
+ icon_state = "0-2"
+ },
+/obj/structure/cable/green{
+ d1 = 2;
+ d2 = 4;
+ icon_state = "2-4"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/effect/wallframe_spawn/reinforced,
+/turf/simulated/floor/tiled/white,
+/area/medical/virology)
"aKz" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 10
@@ -15363,11 +15571,18 @@
/turf/simulated/floor/plating,
/area/maintenance/firstdeck/centralport)
"aSF" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/table/standard,
-/obj/item/clothing/suit/bio_suit/virology,
-/obj/effect/decal/cleanable/filth,
-/turf/simulated/floor/plating,
+/obj/structure/table/glass,
+/obj/item/weapon/paper_bin{
+ pixel_x = 1;
+ pixel_y = 8
+ },
+/obj/item/weapon/reagent_containers/spray/cleaner,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/effect/floor_decal/corner/paleblue/mono,
+/obj/effect/floor_decal/industrial/outline/yellow,
+/turf/simulated/floor/tiled/white/monotile,
/area/medical/virology)
"aSK" = (
/turf/simulated/wall/r_wall/prepainted,
@@ -16877,6 +17092,7 @@
/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
dir = 8
},
+/obj/structure/disposalpipe/segment,
/turf/simulated/floor/tiled/white,
/area/medical/sleeper)
"bex" = (
@@ -17043,6 +17259,10 @@
dir = 6
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/structure/disposalpipe/segment{
+ dir = 4;
+ icon_state = "pipe-c"
+ },
/turf/simulated/floor/tiled/white,
/area/medical/sleeper)
"bpt" = (
@@ -17355,15 +17575,32 @@
/turf/simulated/floor/reinforced,
/area/rnd/xenobiology)
"bCf" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/filth,
-/obj/structure/barricade,
+/obj/structure/cable/green{
+ d1 = 2;
+ d2 = 4;
+ icon_state = "2-4"
+ },
+/obj/structure/cable/green{
+ d1 = 2;
+ d2 = 8;
+ icon_state = "2-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/structure/disposalpipe/segment,
/obj/structure/cable/green{
d1 = 1;
d2 = 2;
icon_state = "1-2"
},
-/turf/simulated/floor/plating,
+/obj/machinery/light_switch{
+ pixel_x = 24;
+ pixel_y = -21
+ },
+/obj/effect/floor_decal/corner/paleblue{
+ dir = 9
+ },
+/turf/simulated/floor/tiled/white,
/area/medical/virology)
"bCX" = (
/obj/structure/table/steel,
@@ -17387,7 +17624,8 @@
/turf/simulated/floor/reinforced,
/area/rnd/xenobiology)
"bDc" = (
-/turf/simulated/wall/r_wall/prepainted,
+/obj/structure/sign/warning/biohazard,
+/turf/simulated/wall/r_wall/hull,
/area/medical/virology/access)
"bDK" = (
/turf/simulated/wall/r_wall/hull,
@@ -17481,6 +17719,7 @@
/obj/machinery/door/airlock/medical{
name = "Emergency Treatment Center"
},
+/obj/structure/disposalpipe/segment,
/turf/simulated/floor/tiled/white/monotile,
/area/medical/sleeper)
"bGD" = (
@@ -17824,9 +18063,9 @@
/turf/simulated/floor/tiled/white/monotile,
/area/medical/sleeper)
"bSY" = (
-/obj/machinery/status_display,
+/obj/structure/sign/warning/deathsposal,
/turf/simulated/wall/r_wall/hull,
-/area/maintenance/firstdeck/aftstarboard)
+/area/medical/virology)
"bTb" = (
/obj/item/device/radio/intercom{
dir = 4;
@@ -17856,6 +18095,9 @@
pixel_x = 2;
pixel_y = -34
},
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
/turf/simulated/floor/tiled/white,
/area/medical/sleeper)
"bUe" = (
@@ -17940,6 +18182,11 @@
/obj/effect/shuttle_landmark/escape_pod/start/pod10,
/turf/simulated/floor/plating,
/area/shuttle/escape_pod10/station)
+"bWf" = (
+/obj/structure/cable/green,
+/obj/effect/wallframe_spawn/reinforced,
+/turf/simulated/floor/plating,
+/area/medical/virology)
"bWw" = (
/obj/machinery/power/apc{
dir = 4;
@@ -18066,6 +18313,21 @@
},
/turf/simulated/floor/tiled/white,
/area/medical/infirmreception)
+"ccM" = (
+/obj/machinery/atmospherics/unary/vent_pump/on,
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/structure/cable/green{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/obj/effect/floor_decal/corner/paleblue{
+ dir = 10
+ },
+/turf/simulated/floor/tiled/white,
+/area/medical/virology)
"cdD" = (
/obj/effect/wallframe_spawn/reinforced/polarized/no_grille/regular{
id = "medbaylockers"
@@ -18204,6 +18466,12 @@
},
/turf/simulated/floor/tiled,
/area/hallway/primary/firstdeck/fore)
+"cjy" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/simulated/wall/r_wall/hull,
+/area/medical/virology)
"cjG" = (
/obj/structure/disposalpipe/segment,
/turf/simulated/wall/prepainted,
@@ -18874,13 +19142,13 @@
/turf/simulated/floor/tiled/white,
/area/medical/locker)
"cVb" = (
-/obj/random/junk,
-/obj/structure/cable/green{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
+ dir = 1
},
-/turf/simulated/floor/plating,
+/obj/effect/floor_decal/corner/paleblue{
+ dir = 9
+ },
+/turf/simulated/floor/tiled/white,
/area/medical/virology)
"cVP" = (
/obj/structure/disposalpipe/segment{
@@ -19100,6 +19368,7 @@
pixel_x = 6;
pixel_y = -20
},
+/obj/structure/disposalpipe/segment,
/turf/simulated/floor/tiled/white,
/area/medical/infirmreception)
"dci" = (
@@ -19607,6 +19876,7 @@
/obj/effect/floor_decal/corner/paleblue{
dir = 1
},
+/obj/structure/disposalpipe/segment,
/turf/simulated/floor/tiled,
/area/hallway/primary/firstdeck/aft)
"dPA" = (
@@ -20173,10 +20443,17 @@
/turf/simulated/floor/tiled/monotile,
/area/teleporter/firstdeck)
"fac" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/table/standard,
-/obj/item/weapon/zipgunframe,
-/turf/simulated/floor/plating,
+/obj/structure/table/glass,
+/obj/item/weapon/storage/fancy/vials,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/obj/effect/floor_decal/corner/paleblue/mono,
+/obj/effect/floor_decal/industrial/outline/yellow,
+/turf/simulated/floor/tiled/white/monotile,
/area/medical/virology)
"fcb" = (
/obj/machinery/atmospherics/pipe/simple/hidden{
@@ -20207,6 +20484,16 @@
},
/turf/simulated/floor/tiled/white,
/area/medical/sleeper)
+"fdr" = (
+/obj/structure/closet/secure_closet/personal/patient,
+/obj/machinery/atmospherics/unary/vent_pump/on{
+ dir = 4
+ },
+/obj/effect/floor_decal/industrial/outline/yellow,
+/obj/effect/floor_decal/corner/paleblue/mono,
+/obj/effect/floor_decal/industrial/outline/yellow,
+/turf/simulated/floor/tiled/white/monotile,
+/area/medical/virology)
"fdQ" = (
/obj/structure/skele_stand,
/turf/simulated/floor/tiled/techfloor,
@@ -20400,6 +20687,10 @@
/obj/effect/floor_decal/corner/paleblue{
dir = 4
},
+/obj/structure/disposalpipe/segment{
+ dir = 1;
+ icon_state = "pipe-c"
+ },
/turf/simulated/floor/tiled/white,
/area/medical/sleeper)
"fub" = (
@@ -20420,6 +20711,10 @@
name = "Infirmary Entry Lockdown Shutters";
opacity = 0
},
+/obj/structure/disposalpipe/segment{
+ dir = 2;
+ icon_state = "pipe-c"
+ },
/turf/simulated/floor/tiled/white/monotile,
/area/medical/sleeper)
"fuV" = (
@@ -20434,6 +20729,24 @@
"fvw" = (
/turf/simulated/wall/prepainted,
/area/medical/triage)
+"fya" = (
+/obj/structure/cable/green,
+/obj/structure/cable/green{
+ d1 = 1;
+ d2 = 8;
+ icon_state = "1-8"
+ },
+/obj/structure/cable/green{
+ d1 = 2;
+ d2 = 8;
+ icon_state = "2-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/obj/effect/wallframe_spawn/reinforced,
+/turf/simulated/floor/tiled/white,
+/area/medical/virology)
"fyf" = (
/obj/machinery/atmospherics/pipe/simple/hidden{
dir = 4
@@ -20613,6 +20926,13 @@
},
/turf/simulated/floor/tiled/white,
/area/medical/triage)
+"fQQ" = (
+/obj/machinery/hologram/holopad,
+/obj/effect/floor_decal/corner/paleblue/three_quarters{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/medical/virology)
"fRN" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/structure/disposalpipe/segment,
@@ -20939,6 +21259,24 @@
},
/turf/simulated/floor/tiled/white,
/area/medical/sleeper)
+"gub" = (
+/obj/effect/floor_decal/corner/paleblue{
+ dir = 6
+ },
+/obj/structure/hygiene/sink{
+ dir = 4;
+ icon_state = "sink";
+ pixel_x = 11;
+ pixel_y = 0
+ },
+/obj/machinery/atmospherics/unary/vent_scrubber/on{
+ dir = 8
+ },
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/medical/virology)
"guP" = (
/obj/structure/filingcabinet/chestdrawer,
/obj/effect/floor_decal/corner/paleblue{
@@ -21037,6 +21375,18 @@
},
/turf/simulated/floor/tiled,
/area/hallway/primary/firstdeck/aft)
+"gAV" = (
+/obj/machinery/atmospherics/unary/vent_scrubber/on,
+/obj/structure/cable/green{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/obj/effect/floor_decal/corner/paleblue{
+ dir = 10
+ },
+/turf/simulated/floor/tiled/white,
+/area/medical/virology)
"gBb" = (
/obj/effect/floor_decal/corner/paleblue{
dir = 9
@@ -21110,6 +21460,7 @@
/obj/effect/floor_decal/corner/paleblue/three_quarters{
dir = 1
},
+/obj/structure/disposalpipe/segment,
/turf/simulated/floor/tiled/white,
/area/medical/sleeper)
"gQb" = (
@@ -21247,6 +21598,13 @@
},
/turf/simulated/floor/plating,
/area/hallway/primary/firstdeck/center)
+"hes" = (
+/obj/effect/floor_decal/corner/paleblue{
+ dir = 9
+ },
+/obj/structure/disposalpipe/segment,
+/turf/simulated/floor/tiled/white,
+/area/medical/sleeper)
"hgb" = (
/obj/structure/cable/green{
d1 = 4;
@@ -21773,13 +22131,29 @@
/turf/simulated/floor/tiled/white,
/area/medical/sleeper)
"hEK" = (
+/obj/structure/hygiene/shower{
+ dir = 4;
+ icon_state = "shower"
+ },
+/obj/machinery/embedded_controller/radio/airlock/access_controller{
+ id_tag = "virology_airlock_control";
+ name = "Virology Access Console";
+ pixel_x = 8;
+ pixel_y = 24;
+ req_access = list("ACCESS_VIRO");
+ tag_exterior_door = "virology_airlock_exterior";
+ tag_interior_door = "virology_airlock_interior"
+ },
+/obj/effect/floor_decal/industrial/warning{
+ dir = 9
+ },
/obj/machinery/alarm{
- alarm_id = "xenobio2_alarm";
dir = 4;
- pixel_x = -24
+ icon_state = "alarm0";
+ pixel_x = -22;
+ pixel_y = 0
},
-/obj/effect/decal/cleanable/dirt,
-/turf/simulated/floor/plating,
+/turf/simulated/floor/tiled/white,
/area/medical/virology/access)
"hFb" = (
/obj/structure/disposalpipe/segment,
@@ -22003,6 +22377,13 @@
/obj/machinery/ai_status_display,
/turf/simulated/wall/r_wall/prepainted,
/area/hallway/primary/firstdeck/center)
+"hWW" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/effect/floor_decal/corner/paleblue{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/medical/virology)
"hYb" = (
/obj/machinery/atmospherics/pipe/simple/hidden{
dir = 4
@@ -22252,10 +22633,27 @@
/turf/simulated/floor/tiled/white,
/area/medical/washroom)
"iop" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/filth,
-/obj/structure/table,
-/turf/simulated/floor/plating,
+/obj/structure/table/glass,
+/obj/item/weapon/storage/box/gloves{
+ pixel_x = 4;
+ pixel_y = 4
+ },
+/obj/item/weapon/storage/box/masks,
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 6
+ },
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable/green{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/effect/floor_decal/corner/paleblue/mono,
+/obj/effect/floor_decal/industrial/outline/yellow,
+/turf/simulated/floor/tiled/white/monotile,
/area/medical/virology)
"iqb" = (
/obj/structure/bed/chair/office/light,
@@ -22443,10 +22841,19 @@
/turf/simulated/wall/prepainted,
/area/medical/reslab)
"iAd" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/table/standard,
-/obj/item/clothing/head/bio_hood/virology,
-/turf/simulated/floor/plating,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/structure/table/glass,
+/obj/item/weapon/storage/box/syringes{
+ pixel_x = 4;
+ pixel_y = 4
+ },
+/obj/item/weapon/storage/box/beakers,
+/obj/item/weapon/reagent_containers/dropper,
+/obj/effect/floor_decal/corner/paleblue/mono,
+/obj/effect/floor_decal/industrial/outline/yellow,
+/turf/simulated/floor/tiled/white/monotile,
/area/medical/virology)
"iAS" = (
/obj/structure/table/rack,
@@ -22633,6 +23040,7 @@
d2 = 8;
icon_state = "2-8"
},
+/obj/structure/disposalpipe/segment,
/turf/simulated/floor/tiled/white,
/area/medical/sleeper)
"iSb" = (
@@ -22722,6 +23130,23 @@
"jbE" = (
/turf/simulated/wall/r_wall/hull,
/area/medical/virology)
+"jbL" = (
+/obj/structure/cable/green{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/obj/machinery/door/window/southright{
+ name = "Virology Isolation Room Three"
+ },
+/obj/effect/floor_decal/corner/paleblue{
+ dir = 10
+ },
+/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/medical/virology)
"jbR" = (
/obj/machinery/atmospherics/unary/vent_pump{
dir = 8;
@@ -22845,7 +23270,8 @@
/area/thruster/d1starboard)
"jib" = (
/obj/machinery/porta_turret/exterior/dagon,
-/turf/simulated/floor/airless,
+/obj/structure/lattice,
+/turf/space,
/area/space)
"jiq" = (
/obj/structure/railing/mapped,
@@ -23047,6 +23473,21 @@
},
/turf/simulated/floor/tiled/white,
/area/rnd/locker)
+"jus" = (
+/obj/structure/cable/green{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/machinery/door/window/southright{
+ dir = 4;
+ name = "Animal Pen"
+ },
+/obj/effect/floor_decal/corner/paleblue{
+ dir = 6
+ },
+/turf/simulated/floor/tiled/white,
+/area/medical/virology)
"jvb" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
@@ -23699,6 +24140,9 @@
/obj/machinery/door/firedoor,
/turf/simulated/floor/tiled/techfloor/grid,
/area/command/armoury/tactical)
+"ktq" = (
+/turf/simulated/floor/tiled/white,
+/area/medical/virology)
"kub" = (
/obj/effect/floor_decal/corner_techfloor_grid{
dir = 1
@@ -23828,6 +24272,24 @@
/obj/effect/wallframe_spawn/reinforced/no_grille,
/turf/simulated/floor/plating,
/area/assembly/chargebay)
+"kEF" = (
+/obj/structure/cable/green,
+/obj/structure/cable/green{
+ d1 = 1;
+ d2 = 4;
+ icon_state = "1-4"
+ },
+/obj/structure/cable/green{
+ d1 = 2;
+ d2 = 4;
+ icon_state = "2-4"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/obj/effect/wallframe_spawn/reinforced,
+/turf/simulated/floor/tiled/white,
+/area/medical/virology)
"kHb" = (
/obj/machinery/door/airlock/engineering{
autoset_access = 0;
@@ -23841,8 +24303,22 @@
/turf/simulated/floor/tiled/steel_ridged,
/area/assembly/robotics)
"kIu" = (
-/obj/structure/table/standard,
-/turf/simulated/floor/plating,
+/obj/structure/table/glass,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/obj/item/weapon/reagent_containers/syringe/antiviral,
+/obj/item/weapon/reagent_containers/syringe/antiviral,
+/obj/item/weapon/reagent_containers/syringe/antiviral,
+/obj/item/weapon/reagent_containers/syringe/antiviral,
+/obj/item/weapon/storage/lockbox/vials,
+/obj/item/device/antibody_scanner,
+/obj/effect/floor_decal/corner/paleblue/mono,
+/obj/effect/floor_decal/industrial/outline/yellow,
+/turf/simulated/floor/tiled/white/monotile,
/area/medical/virology)
"kLb" = (
/obj/effect/floor_decal/corner/paleblue{
@@ -24704,6 +25180,7 @@
d2 = 8;
icon_state = "4-8"
},
+/obj/structure/disposalpipe/segment,
/turf/simulated/floor/tiled/white,
/area/medical/sleeper)
"lYS" = (
@@ -24811,14 +25288,14 @@
/turf/simulated/floor/plating,
/area/security/storage)
"mfH" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/filth,
+/obj/structure/cable/green,
/obj/structure/cable/green{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
},
-/turf/simulated/floor/plating,
+/obj/effect/wallframe_spawn/reinforced,
+/turf/simulated/floor/tiled/white,
/area/medical/virology)
"mgb" = (
/obj/structure/table/steel,
@@ -25128,6 +25605,31 @@
},
/turf/simulated/floor/tiled/white/monotile,
/area/medical/chemistry)
+"mxx" = (
+/obj/structure/disposalpipe/segment{
+ dir = 2;
+ icon_state = "pipe-c"
+ },
+/obj/structure/cable/green{
+ d1 = 2;
+ d2 = 4;
+ icon_state = "2-4"
+ },
+/obj/structure/cable/green{
+ d1 = 2;
+ d2 = 8;
+ icon_state = "2-8"
+ },
+/obj/structure/cable/green{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/obj/effect/floor_decal/corner/paleblue{
+ dir = 10
+ },
+/turf/simulated/floor/tiled/white,
+/area/medical/virology)
"myb" = (
/obj/effect/floor_decal/corner/paleblue{
dir = 9
@@ -25250,8 +25752,13 @@
/turf/simulated/floor/tiled/techfloor/grid,
/area/command/armoury)
"mJY" = (
-/obj/effect/decal/cleanable/dirt,
-/turf/simulated/floor/plating,
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/machinery/computer/diseasesplicer,
+/obj/effect/floor_decal/corner/paleblue/mono,
+/obj/effect/floor_decal/industrial/outline/yellow,
+/turf/simulated/floor/tiled/white/monotile,
/area/medical/virology)
"mKb" = (
/obj/machinery/light_switch{
@@ -25443,6 +25950,14 @@
/obj/structure/disposalpipe/segment,
/turf/simulated/floor/tiled/steel_grid,
/area/hallway/primary/firstdeck/fore)
+"ncs" = (
+/obj/structure/table/glass,
+/obj/item/modular_computer/laptop/preset/records,
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply,
+/obj/effect/floor_decal/corner/paleblue/mono,
+/obj/effect/floor_decal/industrial/outline/yellow,
+/turf/simulated/floor/tiled/white/monotile,
+/area/medical/virology)
"ncI" = (
/obj/effect/floor_decal/industrial/outline/grey,
/turf/simulated/floor/tiled/techfloor,
@@ -25577,6 +26092,14 @@
},
/turf/simulated/floor/tiled,
/area/hallway/primary/firstdeck/fore)
+"njY" = (
+/obj/effect/floor_decal/corner/paleblue{
+ dir = 6
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/structure/disposalpipe/segment,
+/turf/simulated/floor/tiled/white,
+/area/medical/sleeper)
"nkb" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/glass/security{
@@ -25729,6 +26252,7 @@
"nyk" = (
/obj/effect/wallframe_spawn/reinforced/no_grille,
/obj/machinery/door/firedoor,
+/obj/structure/disposalpipe/segment,
/turf/simulated/floor/plating,
/area/medical/infirmreception)
"nys" = (
@@ -26069,6 +26593,23 @@
},
/turf/simulated/floor/plating,
/area/hallway/primary/firstdeck/fore)
+"nWe" = (
+/obj/structure/cable/green{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/obj/machinery/door/window/southright{
+ name = "Virology Isolation Room Two"
+ },
+/obj/effect/floor_decal/corner/paleblue{
+ dir = 10
+ },
+/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/medical/virology)
"nWl" = (
/obj/machinery/atmospherics/unary/vent_pump/on{
dir = 1
@@ -26279,8 +26820,30 @@
},
/turf/simulated/floor/tiled/white,
/area/rnd/research)
+"oeo" = (
+/obj/structure/bed/padded,
+/obj/item/weapon/bedsheet,
+/obj/machinery/atmospherics/unary/vent_scrubber/on{
+ dir = 4
+ },
+/obj/machinery/light{
+ dir = 8
+ },
+/obj/effect/floor_decal/corner/paleblue/mono,
+/turf/simulated/floor/tiled/white/monotile,
+/area/medical/virology)
+"oeT" = (
+/obj/effect/landmark{
+ name = "lightsout"
+ },
+/obj/effect/floor_decal/corner/paleblue{
+ dir = 5
+ },
+/turf/simulated/floor/tiled/white,
+/area/medical/virology)
"ofb" = (
/obj/effect/floor_decal/industrial/outline/blue,
+/obj/structure/disposalpipe/segment,
/turf/simulated/floor/tiled/white,
/area/medical/infirmreception)
"ogb" = (
@@ -26712,6 +27275,22 @@
},
/turf/simulated/floor/tiled/white,
/area/rnd/locker)
+"oTa" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/obj/structure/cable/green{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/obj/structure/cable/green{
+ d2 = 4;
+ icon_state = "0-4"
+ },
+/obj/effect/wallframe_spawn/reinforced,
+/turf/simulated/floor/tiled/white,
+/area/medical/virology)
"oTb" = (
/obj/structure/cable/green{
d1 = 4;
@@ -26881,6 +27460,13 @@
},
/turf/simulated/floor/tiled/white,
/area/rnd/research)
+"peA" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/effect/floor_decal/corner/paleblue{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/medical/virology)
"pfb" = (
/obj/machinery/door/firedoor,
/obj/structure/cable/green{
@@ -26982,14 +27568,16 @@
/turf/simulated/floor/tiled/dark,
/area/medical/reslab)
"plV" = (
-/obj/machinery/door/firedoor,
-/obj/effect/wallframe_spawn/reinforced,
-/obj/machinery/door/blast/regular{
- dir = 4;
- id_tag = "viroblast";
- name = "Virology Blast Door"
+/obj/structure/disposalpipe/segment{
+ dir = 4
},
-/turf/simulated/floor/plating,
+/obj/structure/cable/green{
+ d1 = 1;
+ d2 = 4;
+ icon_state = "1-4"
+ },
+/obj/effect/floor_decal/corner/paleblue,
+/turf/simulated/floor/tiled/white,
/area/medical/virology)
"pmb" = (
/obj/structure/cable/green{
@@ -27029,13 +27617,25 @@
/turf/simulated/floor/tiled/white,
/area/rnd/locker)
"psJ" = (
+/obj/effect/wallframe_spawn/reinforced/hull,
/obj/machinery/door/firedoor,
-/obj/effect/wallframe_spawn/reinforced,
/obj/machinery/door/blast/regular{
- id_tag = "viroblast";
- name = "Virology Blast Door"
+ density = 0;
+ dir = 1;
+ icon_state = "pdoor0";
+ id_tag = "virologyquar";
+ name = "Virology Emergency Quarantine Blast Doors";
+ opacity = 0
},
-/turf/simulated/floor/plating,
+/obj/machinery/door/blast/shutters{
+ density = 0;
+ dir = 2;
+ icon_state = "shutter0";
+ id_tag = "viro2_shutters";
+ name = "Window Shutters";
+ opacity = 0
+ },
+/turf/simulated/floor/airless,
/area/medical/virology)
"ptb" = (
/obj/structure/closet/emcloset,
@@ -27131,6 +27731,30 @@
/obj/structure/catwalk,
/turf/simulated/floor/plating,
/area/maintenance/firstdeck/aftport)
+"pxh" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable/green{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/effect/floor_decal/corner/paleblue/three_quarters{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/medical/virology)
+"pxt" = (
+/obj/effect/floor_decal/corner/paleblue{
+ dir = 9
+ },
+/obj/item/device/radio/intercom{
+ dir = 4;
+ pixel_x = -21
+ },
+/turf/simulated/floor/tiled/white,
+/area/medical/virology)
"pyb" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 9
@@ -27308,20 +27932,6 @@
"pIA" = (
/turf/simulated/floor/tiled,
/area/hallway/primary/firstdeck/fore)
-"pID" = (
-/obj/machinery/door/firedoor,
-/obj/effect/wallframe_spawn/reinforced,
-/obj/structure/cable/green{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
- },
-/obj/machinery/door/blast/regular{
- id_tag = "viroblast";
- name = "Virology Blast Door"
- },
-/turf/simulated/floor/plating,
-/area/medical/virology)
"pIW" = (
/obj/structure/lattice,
/obj/machinery/atmospherics/pipe/simple/visible/blue,
@@ -27785,6 +28395,15 @@
},
/turf/simulated/floor/tiled/dark,
/area/medical/surgery)
+"qoW" = (
+/obj/effect/floor_decal/corner/paleblue{
+ dir = 6
+ },
+/obj/machinery/atmospherics/unary/vent_pump/on{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/medical/virology)
"qqb" = (
/obj/machinery/photocopier,
/obj/machinery/power/apc{
@@ -28043,6 +28662,17 @@
},
/turf/simulated/floor/tiled/white,
/area/rnd/xenobiology/xenoflora)
+"qJy" = (
+/obj/effect/floor_decal/corner/paleblue{
+ dir = 10
+ },
+/obj/item/weapon/stool,
+/obj/machinery/light,
+/obj/effect/floor_decal/corner/paleblue{
+ dir = 5
+ },
+/turf/simulated/floor/tiled/white,
+/area/medical/virology)
"qKb" = (
/obj/machinery/atmospherics/pipe/manifold/visible{
dir = 4
@@ -28425,6 +29055,20 @@
/obj/effect/floor_decal/industrial/outline/yellow,
/turf/simulated/floor/tiled/white,
/area/rnd/xenobiology/xenoflora)
+"rgw" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/structure/cable/green{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/obj/effect/floor_decal/corner/paleblue{
+ dir = 10
+ },
+/turf/simulated/floor/tiled/white,
+/area/medical/virology)
"rhb" = (
/obj/machinery/atmospherics/pipe/simple/visible,
/obj/effect/floor_decal/industrial/warning{
@@ -28432,6 +29076,15 @@
},
/turf/simulated/floor/tiled/white/monotile,
/area/rnd/xenobiology/xenoflora)
+"rhJ" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/obj/effect/floor_decal/corner/paleblue{
+ dir = 6
+ },
+/turf/simulated/floor/tiled/white,
+/area/medical/virology)
"rhO" = (
/turf/simulated/floor/tiled/techfloor,
/area/maintenance/firstdeck/centralstarboard)
@@ -28499,9 +29152,13 @@
/turf/simulated/floor/tiled/white/monotile,
/area/rnd/misc_lab)
"rmC" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/constructable_frame,
-/turf/simulated/floor/plating,
+/obj/item/device/radio/intercom{
+ pixel_y = 23
+ },
+/obj/machinery/disease2/diseaseanalyser,
+/obj/effect/floor_decal/corner/paleblue/mono,
+/obj/effect/floor_decal/industrial/outline/yellow,
+/turf/simulated/floor/tiled/white/monotile,
/area/medical/virology)
"rnb" = (
/obj/machinery/portable_atmospherics/canister,
@@ -28540,6 +29197,26 @@
/obj/effect/floor_decal/corner/research/mono,
/turf/simulated/floor/tiled/white/monotile,
/area/rnd/misc_lab)
+"roy" = (
+/obj/machinery/camera/network/medbay{
+ c_tag = "Virology - Aft"
+ },
+/obj/structure/cable/green{
+ d2 = 8;
+ icon_state = "0-8"
+ },
+/obj/machinery/power/apc{
+ dir = 4;
+ name = "east bump";
+ pixel_x = 24
+ },
+/obj/machinery/disposal,
+/obj/structure/disposalpipe/trunk{
+ dir = 4
+ },
+/obj/effect/floor_decal/industrial/hatch/yellow,
+/turf/simulated/floor/tiled/white,
+/area/medical/virology)
"roA" = (
/obj/structure/railing/mapped{
dir = 4;
@@ -28560,6 +29237,17 @@
},
/turf/simulated/floor/tiled/monotile,
/area/security/detectives_office)
+"rqU" = (
+/obj/structure/table/glass,
+/obj/item/weapon/folder/white,
+/obj/item/weapon/hand_labeler,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/effect/floor_decal/corner/paleblue/mono,
+/obj/effect/floor_decal/industrial/outline/yellow,
+/turf/simulated/floor/tiled/white/monotile,
+/area/medical/virology)
"rrV" = (
/obj/effect/floor_decal/industrial/outline/grey,
/obj/machinery/power/apc{
@@ -28579,6 +29267,23 @@
},
/turf/simulated/floor/tiled/white,
/area/rnd/research)
+"rss" = (
+/obj/structure/cable/green{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/obj/structure/cable/green{
+ d2 = 4;
+ icon_state = "0-4"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/obj/effect/wallframe_spawn/reinforced,
+/turf/simulated/floor/tiled/white,
+/area/medical/virology)
"rsu" = (
/obj/effect/floor_decal/corner/red{
dir = 8
@@ -28716,19 +29421,17 @@
/turf/simulated/floor/reinforced,
/area/rnd/misc_lab)
"ryc" = (
-/obj/item/device/radio/intercom/department/medbay{
- dir = 8;
- pixel_x = 21
+/obj/structure/closet/wardrobe/virology_white,
+/obj/effect/floor_decal/industrial/warning{
+ dir = 5
},
-/obj/machinery/camera/network/medbay{
- c_tag = "Infirmary - Virology Access";
- dir = 8
+/obj/structure/sign/warning/internals_required{
+ pixel_x = 32
},
-/obj/machinery/light{
- dir = 1
+/obj/machinery/camera/network/medbay{
+ c_tag = "Virology - Access"
},
-/obj/random/obstruction,
-/turf/simulated/floor/plating,
+/turf/simulated/floor/tiled/white,
/area/medical/virology/access)
"rzb" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
@@ -28798,6 +29501,20 @@
},
/turf/simulated/floor/tiled/white,
/area/rnd/xenobiology/xenoflora)
+"rDW" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable/green{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/effect/floor_decal/corner/paleblue{
+ dir = 9
+ },
+/turf/simulated/floor/tiled/white,
+/area/medical/virology)
"rEb" = (
/obj/machinery/atmospherics/pipe/simple/visible/red,
/obj/machinery/honey_extractor,
@@ -28931,6 +29648,17 @@
},
/turf/simulated/floor/tiled/white,
/area/rnd/research)
+"rMN" = (
+/obj/structure/cable/green{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/obj/effect/floor_decal/corner/paleblue{
+ dir = 10
+ },
+/turf/simulated/floor/tiled/white,
+/area/medical/virology)
"rNb" = (
/obj/machinery/atmospherics/portables_connector{
dir = 1
@@ -30566,6 +31294,29 @@
"tJO" = (
/turf/simulated/floor/tiled/white,
/area/security/detectives_office)
+"tLF" = (
+/obj/structure/cable/green{
+ d2 = 4;
+ icon_state = "0-4"
+ },
+/obj/structure/cable/green{
+ d1 = 1;
+ d2 = 4;
+ icon_state = "1-4"
+ },
+/obj/effect/wallframe_spawn/reinforced,
+/turf/simulated/floor/tiled/white,
+/area/medical/virology)
+"tMD" = (
+/obj/effect/floor_decal/corner/paleblue{
+ dir = 6
+ },
+/obj/item/device/radio/intercom{
+ dir = 8;
+ pixel_x = 21
+ },
+/turf/simulated/floor/tiled/white,
+/area/medical/virology)
"tTY" = (
/obj/structure/railing/mapped{
dir = 1
@@ -30587,12 +31338,22 @@
},
/turf/simulated/wall/r_wall/prepainted,
/area/maintenance/firstdeck/aftstarboard)
+"tWu" = (
+/obj/effect/floor_decal/corner/paleblue{
+ dir = 6
+ },
+/turf/simulated/floor/tiled/white,
+/area/medical/virology)
"tWZ" = (
/obj/effect/floor_decal/techfloor{
dir = 1
},
/turf/simulated/floor/tiled/techfloor,
/area/crew_quarters/safe_room/firstdeck)
+"tXa" = (
+/obj/structure/disposalpipe/segment,
+/turf/simulated/wall/prepainted,
+/area/medical/infirmreception)
"tYV" = (
/obj/machinery/atmospherics/pipe/simple/visible/fuel{
dir = 4
@@ -30651,6 +31412,12 @@
},
/turf/simulated/floor/tiled/steel_ridged,
/area/medical/counselor)
+"ujw" = (
+/obj/effect/floor_decal/corner/paleblue{
+ dir = 5
+ },
+/turf/simulated/floor/tiled/white,
+/area/medical/virology)
"ujx" = (
/obj/machinery/light{
dir = 1
@@ -30775,9 +31542,21 @@
/turf/simulated/open,
/area/maintenance/firstdeck/aftport)
"uHJ" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/filth,
-/turf/simulated/floor/plating,
+/obj/structure/bed/chair/office/light{
+ dir = 1
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/structure/cable/green{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/obj/effect/floor_decal/corner/paleblue{
+ dir = 10
+ },
+/turf/simulated/floor/tiled/white,
/area/medical/virology)
"uJn" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
@@ -30937,6 +31716,22 @@
/obj/machinery/light,
/turf/simulated/floor/tiled/techfloor/grid,
/area/command/armoury)
+"vdb" = (
+/obj/structure/cable/green{
+ d1 = 2;
+ d2 = 8;
+ icon_state = "2-8"
+ },
+/obj/structure/cable/green{
+ d2 = 2;
+ icon_state = "0-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/obj/effect/wallframe_spawn/reinforced,
+/turf/simulated/floor/tiled/white,
+/area/medical/virology)
"veT" = (
/obj/effect/floor_decal/techfloor{
dir = 4
@@ -30989,6 +31784,19 @@
/obj/structure/catwalk,
/turf/simulated/floor/plating,
/area/maintenance/firstdeck/aftstarboard)
+"vgz" = (
+/obj/structure/cable/green{
+ d1 = 1;
+ d2 = 8;
+ icon_state = "1-8"
+ },
+/obj/structure/cable/green{
+ d2 = 8;
+ icon_state = "0-8"
+ },
+/obj/effect/wallframe_spawn/reinforced,
+/turf/simulated/floor/tiled/white,
+/area/medical/virology)
"vhs" = (
/obj/effect/floor_decal/industrial/outline/yellow,
/obj/machinery/hologram/holopad,
@@ -31026,6 +31834,12 @@
},
/turf/simulated/floor/tiled/techfloor/grid,
/area/command/armoury)
+"vmw" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/medical/virology)
"vnz" = (
/obj/effect/floor_decal/industrial/outline/grey,
/obj/machinery/light,
@@ -31129,6 +31943,22 @@
},
/turf/simulated/floor/tiled/white,
/area/security/detectives_office)
+"vEx" = (
+/obj/structure/table/glass,
+/obj/item/weapon/storage/box/monkeycubes,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 9
+ },
+/obj/item/weapon/storage/box/monkeycubes/farwacubes,
+/obj/item/weapon/storage/box/monkeycubes/neaeracubes,
+/obj/item/weapon/storage/box/monkeycubes/stokcubes,
+/obj/effect/floor_decal/corner/paleblue/mono,
+/obj/effect/floor_decal/industrial/outline/yellow,
+/turf/simulated/floor/tiled/white/monotile,
+/area/medical/virology)
"vFj" = (
/obj/structure/table/glass,
/obj/item/device/scanner/reagent,
@@ -31173,9 +32003,25 @@
/turf/simulated/floor/tiled,
/area/security/wing)
"vJX" = (
-/obj/structure/barricade,
-/obj/effect/decal/cleanable/dirt,
-/turf/simulated/floor/plating,
+/obj/structure/closet/l3closet/virology,
+/obj/item/clothing/mask/gas,
+/obj/effect/floor_decal/industrial/warning{
+ dir = 6
+ },
+/obj/machinery/power/apc{
+ dir = 4;
+ name = "east bump";
+ pixel_x = 24
+ },
+/obj/structure/cable/green{
+ d2 = 8;
+ icon_state = "0-8"
+ },
+/obj/item/device/radio/intercom{
+ dir = 1;
+ pixel_y = -28
+ },
+/turf/simulated/floor/tiled/white,
/area/medical/virology/access)
"vMw" = (
/turf/simulated/wall/r_wall/prepainted,
@@ -31184,9 +32030,14 @@
/turf/simulated/wall/r_wall/prepainted,
/area/security/locker)
"vMO" = (
-/obj/structure/catwalk,
-/obj/effect/decal/cleanable/dirt,
-/turf/simulated/floor/plating,
+/obj/machinery/atmospherics/unary/vent_pump/on{
+ dir = 4
+ },
+/obj/effect/floor_decal/corner/paleblue{
+ dir = 6
+ },
+/obj/effect/floor_decal/industrial/warning,
+/turf/simulated/floor/tiled/white,
/area/medical/virology/access)
"vSe" = (
/obj/effect/floor_decal/corner/paleblue/mono,
@@ -31387,11 +32238,29 @@
/turf/simulated/floor/plating,
/area/hallway/primary/firstdeck/fore)
"wna" = (
-/obj/structure/extinguisher_cabinet{
- pixel_x = -32
+/obj/structure/hygiene/sink{
+ dir = 8;
+ icon_state = "sink";
+ pixel_x = -12;
+ pixel_y = 2
},
-/obj/random/obstruction,
-/turf/simulated/floor/plating,
+/obj/machinery/button/blast_door{
+ desc = "A remote control-switch for shutters.";
+ id_tag = "virologyquar";
+ name = "Virology Emergency Quarantine Control";
+ pixel_x = 8;
+ pixel_y = -24
+ },
+/obj/effect/floor_decal/industrial/warning{
+ dir = 10
+ },
+/obj/machinery/firealarm{
+ dir = 8;
+ pixel_x = -24;
+ pixel_y = 0
+ },
+/obj/machinery/light,
+/turf/simulated/floor/tiled/white,
/area/medical/virology/access)
"wro" = (
/obj/item/weapon/stool/padded,
@@ -31463,18 +32332,30 @@
/turf/simulated/floor/tiled,
/area/security/wing)
"wyf" = (
-/obj/machinery/door/firedoor,
/obj/structure/cable/green{
d1 = 1;
d2 = 2;
icon_state = "1-2"
},
-/obj/effect/wallframe_spawn/reinforced,
+/obj/effect/wallframe_spawn/reinforced/hull,
+/obj/machinery/door/firedoor,
/obj/machinery/door/blast/regular{
- id_tag = "viroblast";
- name = "Virology Blast Door"
+ density = 0;
+ dir = 1;
+ icon_state = "pdoor0";
+ id_tag = "virologyquar";
+ name = "Virology Emergency Quarantine Blast Doors";
+ opacity = 0
},
-/turf/simulated/floor/plating,
+/obj/machinery/door/blast/shutters{
+ density = 0;
+ dir = 2;
+ icon_state = "shutter0";
+ id_tag = "viro2_shutters";
+ name = "Window Shutters";
+ opacity = 0
+ },
+/turf/simulated/floor/airless,
/area/medical/virology)
"wyA" = (
/turf/simulated/wall/prepainted,
@@ -31546,6 +32427,22 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/turf/simulated/floor/tiled/dark,
/area/command/armoury/access)
+"wVv" = (
+/obj/structure/cable/green{
+ d1 = 2;
+ d2 = 4;
+ icon_state = "2-4"
+ },
+/obj/structure/cable/green{
+ d2 = 2;
+ icon_state = "0-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/obj/effect/wallframe_spawn/reinforced,
+/turf/simulated/floor/tiled/white,
+/area/medical/virology)
"wWc" = (
/obj/structure/sign/warning/secure_area{
dir = 4
@@ -50923,7 +51820,7 @@ aaa
aaa
aaa
czU
-adA
+aaa
aaa
aaa
aaa
@@ -51128,9 +52025,9 @@ fSy
adA
jib
jbE
-plV
jbE
-plV
+jbE
+jbE
jbE
aaa
aaa
@@ -51330,9 +52227,9 @@ fSy
adA
adA
jbE
-atb
-atb
-atb
+fdr
+pxt
+oeo
jbE
aaa
aaa
@@ -51533,7 +52430,7 @@ adA
jbE
jbE
afD
-mJY
+ktq
alu
jbE
jbE
@@ -51736,8 +52633,8 @@ jbE
asZ
acI
ajz
-acI
-asZ
+kEF
+bWf
jbE
jbE
aaa
@@ -51933,12 +52830,12 @@ aaa
aaa
aaa
qxz
-pID
-aky
+wyf
aky
+plV
aaH
-aky
-aky
+hWW
+rss
akO
akd
jbE
@@ -52137,10 +53034,10 @@ aaa
aaa
psJ
mJY
-atb
-mJY
-mJY
-atb
+ccM
+ncs
+ujw
+nWe
akS
alb
jbE
@@ -52339,16 +53236,16 @@ aaa
aaa
jbE
rmC
-mJY
-aSF
uHJ
-alu
+aSF
+ujw
+oTa
acJ
-uHJ
+qJy
jbE
abP
abP
-acM
+abP
acC
aeo
ssh
@@ -52540,17 +53437,17 @@ aaa
aaa
aaa
jbE
-rmC
+acM
uHJ
iAd
-uHJ
-mJY
-akR
-aac
+ujw
+vdb
+mfH
+tLF
meG
hEK
wna
-bDc
+meG
ahk
aeo
aeo
@@ -52741,13 +53638,13 @@ aaa
aaa
aaa
aaa
-jbE
+psJ
aav
-uHJ
-mJY
-uHJ
-mJY
-akR
+rgw
+rqU
+fQQ
+rhJ
+tWu
abT
akv
aik
@@ -52763,7 +53660,7 @@ gnb
aaZ
bnN
bdW
-bnN
+njY
anM
gOb
fsb
@@ -52943,12 +53840,12 @@ aaa
aaa
aaa
aaa
-jbE
+psJ
aaw
-mJY
+mxx
iop
-uHJ
-alu
+pxh
+rDW
alf
bCf
als
@@ -52956,9 +53853,9 @@ ail
aiq
ait
aiv
-fob
+hes
bGj
-fob
+hes
lYJ
aDD
aFx
@@ -53146,14 +54043,14 @@ aaa
aaa
aaa
jbE
-rmC
-mJY
+ads
+rMN
kIu
-uHJ
-uHJ
+oeT
+wVv
mfH
-mJY
-meG
+vgz
+bDc
ryc
vJX
bDc
@@ -53176,9 +54073,9 @@ ofb
ofb
ofb
dbH
-arK
+tXa
dMe
-hwY
+hlh
mpq
amO
ljb
@@ -53349,16 +54246,16 @@ aaa
aaa
jbE
atb
-mJY
+rMN
fac
-mJY
-mJY
-akR
-akd
+ujw
+oTa
+acJ
+qJy
jbE
mpy
-bSY
-ads
+mpy
+mpy
adt
sfx
ebt
@@ -53551,10 +54448,10 @@ aaa
aaa
psJ
aac
-atb
-mJY
-mJY
-mJY
+gAV
+vEx
+ujw
+jbL
akS
acN
jbE
@@ -53755,10 +54652,10 @@ wyf
ajN
akc
cVb
-aky
-aky
-akA
-acN
+peA
+rss
+akO
+akd
jbE
aaa
mpy
@@ -53954,12 +54851,12 @@ aaa
aaa
dDC
jbE
-jbE
-jbE
-acI
-ajz
-acI
-jbE
+bSY
+roy
+aKy
+jus
+fya
+bWf
jbE
jbE
aaa
@@ -54157,10 +55054,10 @@ aaa
dDC
adA
jbE
-jbE
-mJY
-mJY
-atb
+cjy
+aGF
+ktq
+vmw
jbE
jbE
aaa
@@ -54359,10 +55256,10 @@ aaa
dDC
adA
adA
-jbE
-aac
-mJY
-atb
+cjy
+qoW
+tMD
+gub
jbE
aaa
aaa
@@ -54561,10 +55458,10 @@ aaa
dDC
adA
jib
+cjy
+jbE
jbE
-plV
jbE
-plV
jbE
aaa
aaa
@@ -54761,9 +55658,9 @@ aaa
aaa
aaa
tdB
-adA
aaa
aaa
+aaB
aaa
aaa
aaa
diff --git a/maps/torch/torch_areas.dm b/maps/torch/torch_areas.dm
index f8e1897861a..961e3de6172 100644
--- a/maps/torch/torch_areas.dm
+++ b/maps/torch/torch_areas.dm
@@ -1121,7 +1121,7 @@
req_access = list(access_surgery)
/area/medical/virology
- name = "\improper Virology (decomissioned)"
+ name = "\improper Virology"
/area/crew_quarters/safe_room/medical
name = "\improper Medical Safe Room"
diff --git a/maps/torch/torch_unit_testing.dm b/maps/torch/torch_unit_testing.dm
index b44d615bf87..7007def44b2 100644
--- a/maps/torch/torch_unit_testing.dm
+++ b/maps/torch/torch_unit_testing.dm
@@ -42,7 +42,6 @@
/area/maintenance/aux_med = NO_SCRUBBER|NO_VENT|NO_APC,
/area/solar = NO_SCRUBBER|NO_VENT|NO_APC,
/area/storage = NO_SCRUBBER|NO_VENT,
- /area/medical/virology = NO_SCRUBBER|NO_VENT|NO_APC,
/area/storage/auxillary/port = 0,
/area/storage/auxillary/starboard = 0,
/area/storage/primary = 0,
@@ -82,8 +81,6 @@
/area/shuttle/syndicate_elite/station,
/area/shuttle/escape/centcom,
/area/rnd/xenobiology/xenoflora_storage,
- /area/medical/virology,
- /area/medical/virology/access,
/area/turbolift,
/area/turbolift/start,
/area/turbolift/bridge,
diff --git a/nano/templates/disease_splicer.tmpl b/nano/templates/disease_splicer.tmpl
new file mode 100644
index 00000000000..a41ab323a4e
--- /dev/null
+++ b/nano/templates/disease_splicer.tmpl
@@ -0,0 +1,124 @@
+
+
+ {{:helper.link('Close', 'gear', {'close' : 1}, null, 'fixedLeft')}}
+
+
+
+{{if data.busy}}
+ The Splicer is currently busy.
+
+
{{:data.busy}}
+
+
+ Thank you for your patience!
+
+{{else}}
+
+
Virus Dish
+
+
+ {{:helper.link('Eject Dish', 'eject', { 'eject' : 1 }, data.dish_inserted ? null : 'disabled')}}
+
+
+
+
+ Growth Density:
+
+
+ {{:helper.displayBar(data.growth, 0, 100, (data.growth >= 50) ? 'good' : data.growth >= 25 ? 'average' : 'bad', data.growth + '%' )}}
+
+
+
+
+
+ {{if !data.info}}
+
+ Symptoms:
+
+ {{/if}}
+
+ {{if data.info}}
+
{{:data.info}}
+ {{else}}
+ {{for data.effects}}
+
+
+ ({{:value.stage}}) {{:value.name}}
+ {{if value.badness > 1}}
+ Dangerous
+ {{/if}}
+
+
+ {{/for}}
+ {{/if}}
+
+
+ {{if data.affected_species && !data.info}}
+
+
+ Affected Species:
+
+
+ {{:data.affected_species}}
+
+
+ {{/if}}
+
+ {{if data.effects}}
+
+ CAUTION: Reverse engineering will destroy the viral sample.
+
+
+
+ Reverse Engineering:
+
+
+ {{for data.effects}}
+ {{:helper.link(value.stage, 'transferthick-e-w', { 'grab' : value.reference })}}
+ {{/for}}
+
+
+ {{:helper.link('Species', 'transferthick-e-w', { 'affected_species' : 1 })}}
+
+
+ {{/if}}
+
+
+
Storage
+
+
+
+
+ Memory Buffer:
+
+
+ {{if data.buffer}}
+ {{:data.buffer.name}} ({{:data.buffer.stage}})
+ {{else}}
+ {{if data.species_buffer}}
+ {{:data.species_buffer}}
+ {{else}}
+ Empty
+ {{/if}}
+ {{/if}}
+
+
+ {{:helper.link('Save To Disk', 'disk', { 'disk' : 1 }, (data.buffer || data.species_buffer) ? null : 'disabled')}}
+ {{if data.species_buffer}}
+ {{:helper.link('Splice Species', 'pencil', { 'splice' : -1 }, (data.species_buffer && !data.info) ? null : 'disabled')}}
+ {{else data.buffer}}
+ {{:helper.link('Splice #1', 'pencil', { 'splice' : 1 }, data.buffer.stage > 1 ? 'disabled' : null)}}
+ {{:helper.link('Splice #2', 'pencil', { 'splice' : 2 }, data.buffer.stage > 2 ? 'disabled' : null)}}
+ {{:helper.link('Splice #3', 'pencil', { 'splice' : 3 }, data.buffer.stage > 3 ? 'disabled' : null)}}
+ {{:helper.link('Splice #4', 'pencil', { 'splice' : 4 }, data.buffer.stage > 4 ? 'disabled' : null)}}
+ {{/if}}
+{{/if}}
+
+
+
+
+
+
+
+
+
diff --git a/nano/templates/dish_incubator.tmpl b/nano/templates/dish_incubator.tmpl
new file mode 100644
index 00000000000..e1e916828a4
--- /dev/null
+++ b/nano/templates/dish_incubator.tmpl
@@ -0,0 +1,123 @@
+
+
+ {{:helper.link('Close', 'gear', {'close' : '1'}, null, 'fixedLeft')}}
+
+
+
+
+
Environmental Conditions
+
+
+
+ Power:
+
+
+ {{:helper.link('On', 'power', { 'power' : 1 }, !data.dish_inserted ? 'disabled' : data.on ? 'selected' : null)}}{{:helper.link('Off', 'close', { 'power' : 1 }, data.on ? null : 'selected')}}
+
+
+
+ {{:helper.link('Add Radiation', 'radiation', {'rad' : 1})}}
+ {{:helper.link('Flush System', 'trash', {'flush' : 1}, data.system_in_use ? null : 'disabled')}}
+
+
+
+
+
+ Virus Food:
+
+
+ {{:helper.displayBar(data.food_supply, 0, 100, 'good', data.food_supply)}}
+
+
+
+
+ Radiation Level:
+
+
+ {{:helper.displayBar(data.radiation, 0, 100, (data.radiation >= 50) ? 'bad' : (data.growth >= 25) ? 'average' : 'good')}}
+
+ {{:helper.formatNumber(data.radiation * 10000)}}
µSv
+
+
+
+
+ Toxicity:
+
+
+ {{:helper.displayBar(data.toxins, 0, 100, (data.toxins >= 50) ? 'bad' : (data.toxins >= 25) ? 'average' : 'good', data.toxins + '%')}}
+
+
+
+
+
+
Chemicals
+
+
+ {{:helper.link('Eject Chemicals', 'eject', { 'ejectchem' : 1 }, data.chemicals_inserted ? null : 'disabled')}}
+ {{:helper.link('Breed Virus', 'circle-arrow-s', { 'virus' : 1 }, data.can_breed_virus ? null : 'disabled')}}
+
+
+{{if data.chemicals_inserted}}
+
+
+ Volume:
+
+
+ {{:helper.displayBar(data.chemical_volume, 0, data.max_chemical_volume, 'good', data.chemical_volume + ' / ' + data.max_chemical_volume)}}
+
+
+
+
+ Breeding Environment:
+
+
+
+ {{:!data.dish_inserted ? 'N/A' : data.can_breed_virus ? 'Suitable' : 'No hemolytic samples detected'}}
+
+ {{if data.blood_already_infected}}
+
+ CAUTION: Viral infection detected in blood sample.
+ {{/if}}
+
+
+{{else}}
+
+ No chemicals inserted.
+
+{{/if}}
+
+
+
Virus Dish
+
+
+ {{:helper.link('Eject Dish', 'eject', {'ejectdish' : 1}, data.dish_inserted ? null : 'disabled')}}
+
+
+{{if data.dish_inserted}}
+ {{if data.virus}}
+
+
+ Growth Density:
+
+
+ {{:helper.displayBar(data.growth, 0, 100, (data.growth >= 50) ? 'good' : (data.growth >= 25) ? 'average' : 'bad', data.growth + '%' )}}
+
+
+
+
+ Infection Rate:
+
+
+ {{:data.analysed ? data.infection_rate : "Unknown"}}
+
+
+ {{else}}
+
+ No virus detected.
+
+ {{/if}}
+{{else}}
+
+ No dish loaded.
+
+{{/if}}
\ No newline at end of file
diff --git a/nano/templates/isolation_centrifuge.tmpl b/nano/templates/isolation_centrifuge.tmpl
new file mode 100644
index 00000000000..6a4fd0fe1ab
--- /dev/null
+++ b/nano/templates/isolation_centrifuge.tmpl
@@ -0,0 +1,81 @@
+
+ {{:helper.link('Close', 'gear', {'close' : 1}, null, 'fixedLeft')}}
+ {{:helper.link('Print', 'print', { 'print' : 1 }, data.antibodies || data.pathogens ? null : 'disabled', 'fixedLeft')}}
+
+
+{{if data.busy}}
+ The Centrifuge is currently busy.
+
+
{{:data.busy}}
+
+
+ Thank you for your patience!
+
+{{else}}
+
+
{{:data.is_antibody_sample ? 'Antibody Sample' : 'Blood Sample'}}
+
+
+ {{:helper.link('Eject Vial', 'eject', { 'action' : 'sample' }, data.sample_inserted ? null : 'disabled')}}
+
+ {{if data.sample_inserted}}
+ {{if data.antibodies || data.pathogens}}
+
+ {{if data.antibodies}}
+
+
+ Antibodies:
+
+
+ {{:data.antibodies}}
+
+
+ {{/if}}
+ {{if data.pathogens}}
+
+
+ Pathogens:
+
+
+ {{for data.pathogens}}
+
+ {{:value.name}} ({{:value.spread_type}})
+
+ {{/for}}
+
+
+ {{/if}}
+
+ {{else}}
+
+ No antibodies or viral strains detected.
+
+ {{/if}}
+ {{else}}
+
+ No vial detected.
+
+ {{/if}}
+ {{if data.antibodies && !data.is_antibody_sample}}
+
+
+ Isolate Antibodies:
+
+
+ {{:helper.link(data.antibodies, 'pencil', { 'action' : 'antibody' })}}
+
+
+ {{/if}}
+ {{if data.pathogens}}
+
+
+ Isolate Strain:
+
+
+ {{for data.pathogens}}
+ {{:helper.link(value.name, 'pencil', { 'isolate' : value.reference })}}
+ {{/for}}
+
+
+ {{/if}}
+{{/if}}
\ No newline at end of file
diff --git a/nano/templates/pathogenic_isolator.tmpl b/nano/templates/pathogenic_isolator.tmpl
new file mode 100644
index 00000000000..958201d2c05
--- /dev/null
+++ b/nano/templates/pathogenic_isolator.tmpl
@@ -0,0 +1,107 @@
+
+
Menu
+
+
+ {{if !data.isolating}}
+ {{:helper.link('Home', 'home', {'home' : 1}, data.state == 'home' ? 'disabled' : null, 'fixedLeft')}}
+ {{:helper.link('List', 'note', {'list' : 1}, data.state == 'list' ? 'disabled' : null, 'fixedLeft')}}
+ {{:helper.link('Pathogen', 'folder-open', {'entry' : 1}, data.state == 'entry' ? 'disabled' : null, 'fixedLeft')}}
+ {{/if}}
+
+ {{:helper.link('Close', 'gear', {'close' : 1}, null, 'fixedLeft')}}
+ {{:helper.link('Print', 'print', { 'print' : 1 }, data.can_print ? null : 'disabled', 'fixedLeft')}}
+
+
+{{if data.isolating}}
+ The Isolator is currently busy.
+
+
Isolating pathogens...
+
+
+ Thank you for your patience!
+
+{{else}}
+ {{if data.state =="home"}}
+
+
Blood Sample
+
+
+ {{:helper.link('Eject Syringe', 'eject', { 'eject' : 1 }, data.syringe_inserted ? null : 'disabled')}}
+
+
+ {{if data.syringe_inserted}}
+
+
Pathogens:
+ {{if data.pathogen_pool}}
+ {{for data.pathogen_pool}}
+
+ {{:index + 1}}. #{{:value.unique_id}} {{:value.is_in_database ? "(Analysed)" : ""}}
+ {{:value.name}}: {{:value.dna}}
+
+ {{/for}}
+ {{else}}
+ No pathogens detected.
+ {{/if}}
+
+ {{else}}
+
+ No syringe loaded.
+
+ {{/if}}
+ {{if data.pathogen_pool}}
+
+
+ Isolate Pathogens:
+
+
+ {{for data.pathogen_pool}}
+ {{:helper.link('#' + value.unique_id, 'pencil', { 'isolate' : value.reference }, null, 'fixedLeft')}}
+ {{/for}}
+
+
+
+
+ Database Lookup:
+
+
+ {{for data.pathogen_pool}}
+ {{if value.is_in_database}}
+ {{:helper.link('#' + value.unique_id, 'info', { 'entry' : 1, 'view' : value.record }, null, 'fixedLeft')}}
+ {{/if}}
+ {{/for}}
+
+
+ {{/if}}
+ {{else}}
+ {{if data.state == "list"}}
+
+
View Database
+
+
+ {{if data.database}}
+ {{for data.database}}
+
+
{{:value.name}}
+ {{:helper.link('Details', 'circle-arrow-s', { 'entry' : 1, 'view' : value.record }, null, 'fixedLeft')}}
+
+ {{/for}}
+ {{else}}
+
The viral database is empty.
+ {{/if}}
+
+ {{else}}
+ {{if data.state == "entry"}}
+ {{if data.entry}}
+
+
{{:data.entry.name}}
+
+
+ {{:data.entry.description}}
+
+ {{else}}
+ No virus selected.
+ {{/if}}
+ {{/if}}
+ {{/if}}
+ {{/if}}
+{{/if}}
\ No newline at end of file
diff --git a/test/check-paths.sh b/test/check-paths.sh
index 514576e18ff..b259c17d1a7 100755
--- a/test/check-paths.sh
+++ b/test/check-paths.sh
@@ -31,12 +31,12 @@ exactly 10 "/obj text paths" '"/obj'
exactly 8 "/turf text paths" '"/turf'
exactly 0 "world<< uses" 'world<<|world[[:space:]]<<'
exactly 43 "world.log<< uses" 'world.log<<|world.log[[:space:]]<<'
-exactly 478 "<< uses" '(?