diff --git a/baystation12.dme b/baystation12.dme index ca07b9249f..5a034ff343 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -1260,6 +1260,17 @@ #include "code\modules\surgery\ribcage.dm" #include "code\modules\surgery\robolimbs.dm" #include "code\modules\surgery\surgery.dm" +#include "code\modules\virus2\analyser.dm" +#include "code\modules\virus2\antibodies.dm" +#include "code\modules\virus2\centrifuge.dm" +#include "code\modules\virus2\curer.dm" +#include "code\modules\virus2\disease2.dm" +#include "code\modules\virus2\diseasesplicer.dm" +#include "code\modules\virus2\dishincubator.dm" +#include "code\modules\virus2\effect.dm" +#include "code\modules\virus2\helpers.dm" +#include "code\modules\virus2\isolator.dm" +#include "code\modules\virus2\items_devices.dm" #include "code\WorkInProgress\autopsy.dm" #include "code\WorkInProgress\buildmode.dm" #include "code\WorkInProgress\explosion_particles.dm" @@ -1316,13 +1327,6 @@ #include "code\WorkInProgress\SkyMarshal\officer_stuff.dm" #include "code\WorkInProgress\SkyMarshal\Ultralight_procs.dm" #include "code\WorkInProgress\Susan\susan_desert_turfs.dm" -#include "code\WorkInProgress\virus2\analyser.dm" -#include "code\WorkInProgress\virus2\antibodies.dm" -#include "code\WorkInProgress\virus2\base.dm" -#include "code\WorkInProgress\virus2\curer.dm" -#include "code\WorkInProgress\virus2\diseasesplicer.dm" -#include "code\WorkInProgress\virus2\dishincubator.dm" -#include "code\WorkInProgress\virus2\isolator.dm" #include "code\ZAS\Airflow.dm" #include "code\ZAS\Connection.dm" #include "code\ZAS\Debug.dm" diff --git a/code/WorkInProgress/virus2/Disease2/biohazard destroyer.dm b/code/WorkInProgress/virus2/Disease2/biohazard destroyer.dm deleted file mode 100644 index 1f39043326..0000000000 --- a/code/WorkInProgress/virus2/Disease2/biohazard destroyer.dm +++ /dev/null @@ -1,20 +0,0 @@ -/obj/machinery/disease2/biodestroyer - name = "Biohazard destroyer" - icon = 'icons/obj/pipes/disposal.dmi' - icon_state = "disposal" - var/list/accepts = list(/obj/item/clothing,/obj/item/weapon/virusdish/,/obj/item/weapon/cureimplanter,/obj/item/weapon/diseasedisk) - density = 1 - anchored = 1 - -/obj/machinery/disease2/biodestroyer/attackby(var/obj/I as obj, var/mob/user as mob) - for(var/path in accepts) - if(I.type in typesof(path)) - user.drop_item() - del(I) - overlays += image('icons/obj/pipes/disposal.dmi', "dispover-handle") - return - user.drop_item() - I.loc = src.loc - - for(var/mob/O in hearers(src, null)) - O.show_message("\icon[src] \blue The [src.name] beeps", 2) diff --git a/code/WorkInProgress/virus2/Disease2/cureimplanter.dm b/code/WorkInProgress/virus2/Disease2/cureimplanter.dm deleted file mode 100644 index 4506495456..0000000000 --- a/code/WorkInProgress/virus2/Disease2/cureimplanter.dm +++ /dev/null @@ -1,42 +0,0 @@ -/obj/item/weapon/cureimplanter - name = "Hypospray injector" - icon = 'icons/obj/items.dmi' - icon_state = "implanter1" - var/datum/disease2/resistance/resistance = null - var/works = 0 - var/datum/disease2/disease/virus2 = null - item_state = "syringe_0" - throw_speed = 1 - throw_range = 5 - w_class = 2.0 - - -/obj/item/weapon/cureimplanter/attack(mob/target as mob, mob/user as mob) - if(ismob(target)) - for(var/mob/O in viewers(world.view, user)) - if (target != user) - O.show_message(text("\red [] is trying to inject [] with [src.name]!", user, target), 1) - else - O.show_message("\red [user] is trying to inject themselves with [src.name]!", 1) - if(!do_mob(user, target,60)) return - - - for(var/mob/O in viewers(world.view, user)) - if (target != user) - O.show_message(text("\red [] injects [] with [src.name]!", user, target), 1) - else - O.show_message("\red [user] injects themself with [src.name]!", 1) - - - var/mob/living/carbon/M = target - - if(works == 0 && prob(25)) - M.resistances2 += resistance - if(M.virus2) - M.virus2.cure_added(resistance) - else if(works == 1) - M.adjustToxLoss(rand(20,50)) - else if(works == 2) - M.adjustToxLoss(rand(50,100)) - else if(works == 3) - infect_virus2(M,virus2,1) diff --git a/code/WorkInProgress/virus2/Disease2/diseasesplicer.dm b/code/WorkInProgress/virus2/Disease2/diseasesplicer.dm deleted file mode 100644 index 958a14b1f1..0000000000 --- a/code/WorkInProgress/virus2/Disease2/diseasesplicer.dm +++ /dev/null @@ -1,202 +0,0 @@ -/obj/machinery/computer/diseasesplicer - name = "Disease Splicer" - icon = 'icons/obj/computer.dmi' - icon_state = "crew" - //brightnessred = 0 -// brightnessgreen = 2 -// brightnessblue = 2 -// broken_icon - - var/datum/disease2/effectholder/memorybank = null - var/analysed = 0 - var/obj/item/weapon/virusdish/dish = null - var/burning = 0 - - var/splicing = 0 - var/scanning = 0 - -/obj/machinery/computer/diseasesplicer/attackby(var/obj/I as obj, var/mob/user as mob) -/* - if(istype(I, /obj/item/weapon/screwdriver)) - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - if(do_after(user, 20)) - if (src.stat & BROKEN) - user << "\blue The broken glass falls out." - var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) - new /obj/item/weapon/shard( src.loc ) - var/obj/item/weapon/circuitboard/diseasesplicer/M = new /obj/item/weapon/circuitboard/diseasesplicer( A ) - for (var/obj/C in src) - C.loc = src.loc - A.circuit = M - A.state = 3 - A.icon_state = "3" - A.anchored = 1 - del(src) - else - user << "\blue You disconnect the monitor." - var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) - var/obj/item/weapon/circuitboard/diseasesplicer/M = new /obj/item/weapon/circuitboard/diseasesplicer( A ) - for (var/obj/C in src) - C.loc = src.loc - A.circuit = M - A.state = 4 - A.icon_state = "4" - A.anchored = 1 - del(src)*/ - if(istype(I,/obj/item/weapon/virusdish)) - var/mob/living/carbon/c = user - if(!dish) - - dish = I - c.drop_item() - I.loc = src - if(istype(I,/obj/item/weapon/diseasedisk)) - user << "You upload the contents of the disk into the buffer" - memorybank = I:effect - - - //else - src.attack_hand(user) - return - -/obj/machinery/computer/diseasesplicer/attack_ai(var/mob/user as mob) - return src.attack_hand(user) - -/obj/machinery/computer/diseasesplicer/attack_paw(var/mob/user as mob) - - return src.attack_hand(user) - return - -/obj/machinery/computer/diseasesplicer/attack_hand(var/mob/user as mob) - if(..()) - return - user.machine = src - var/dat - if(splicing) - dat = "Splicing in progress" - else if(scanning) - dat = "Splicing in progress" - else if(burning) - dat = "Data disk burning in progress" - else - if(dish) - dat = "Virus dish inserted" - - dat += "
Current DNA strand : " - if(memorybank) - dat += "" - if(analysed) - dat += "[memorybank.effect.name] ([5-memorybank.effect.stage])" - else - dat += "Unknown DNA strand ([5-memorybank.effect.stage])" - dat += "" - - dat += "
Burn DNA Sequence to data storage disk" - else - dat += "Empty" - - dat += "

" - - if(dish) - if(dish.virus2) - if(dish.growth >= 50) - for(var/datum/disease2/effectholder/e in dish.virus2.effects) - dat += "
DNA strand" - if(dish.analysed) - dat += ": [e.effect.name]" - dat += " (5-[e.effect.stage])" - else - dat += "
Insufficent cells to attempt gene splicing" - else - dat += "
No virus found in dish" - - dat += "

Eject disk" - else - dat += "
Please insert dish" - - user << browse(dat, "window=computer;size=400x500") - onclose(user, "computer") - return - -/obj/machinery/computer/diseasesplicer/process() - if(stat & (NOPOWER|BROKEN)) - return - use_power(500) - src.updateDialog() - - if(scanning) - scanning -= 1 - if(!scanning) - state("The [src.name] beeps") - icon_state = "crew" - if(splicing) - splicing -= 1 - if(!splicing) - state("The [src.name] pings") - icon_state = "crew" - if(burning) - burning -= 1 - if(!burning) - var/obj/item/weapon/diseasedisk/d = new /obj/item/weapon/diseasedisk(src.loc) - if(analysed) - d.name = "[memorybank.effect.name] GNA disk (Stage: [5-memorybank.effect.stage])" - else - d.name = "Unknown GNA disk (Stage: [5-memorybank.effect.stage])" - d.effect = memorybank - state("The [src.name] zings") - icon_state = "crew" - - - return - -/obj/machinery/computer/diseasesplicer/Topic(href, href_list) - if(..()) - return - if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon))) - usr.machine = src - - if (href_list["grab"]) - memorybank = locate(href_list["grab"]) - analysed = dish.analysed - del(dish) - dish = null - scanning = 30 - icon_state = "crew" - - else if(href_list["eject"]) - dish.loc = src.loc - dish = null - - else if(href_list["splice"]) - for(var/datum/disease2/effectholder/e in dish.virus2.effects) - if(e.stage == memorybank.stage) - e.effect = memorybank.effect - splicing = 50 - dish.virus2.spreadtype = "Blood" - icon_state = "crew" - - else if(href_list["disk"]) - burning = 20 - icon_state = "crew" - - src.add_fingerprint(usr) - src.updateUsrDialog() - return - -/obj/machinery/computer/diseasesplicer/proc/state(var/msg) - for(var/mob/O in hearers(src, null)) - O.show_message("\icon[src] \blue [msg]", 2) - - -/obj/item/weapon/diseasedisk - name = "Blank GNA disk" - icon = 'icons/obj/cloning.dmi' - icon_state = "datadisk2" - var/datum/disease2/effectholder/effect = null - var/stage = 1 - -/obj/item/weapon/diseasedisk/premade/New() - name = "Blank GNA disk (stage: [5-stage])" - effect = new /datum/disease2/effectholder - effect.effect = new /datum/disease2/effect/invisible - effect.stage = stage diff --git a/code/WorkInProgress/virus2/Disease2/dishincubator.dm b/code/WorkInProgress/virus2/Disease2/dishincubator.dm deleted file mode 100644 index 921ed21574..0000000000 --- a/code/WorkInProgress/virus2/Disease2/dishincubator.dm +++ /dev/null @@ -1,176 +0,0 @@ -/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 - - ex_act(severity) - switch(severity) - if(1.0) - del(src) - return - if(2.0) - if (prob(50)) - del(src) - return - - blob_act() - if (prob(25)) - del(src) - - meteorhit() - del(src) - return - - attackby(var/obj/B as obj, var/mob/user as mob) - if(istype(B, /obj/item/weapon/reagent_containers/glass) || istype(B,/obj/item/weapon/reagent_containers/syringe)) - - if(src.beaker) - if(istype(beaker,/obj/item/weapon/reagent_containers/syringe)) - user << "A syringe is already loaded into the machine." - else - user << "A beaker is already loaded into the machine." - return - - src.beaker = B - user.drop_item() - B.loc = src - if(istype(B,/obj/item/weapon/reagent_containers/syringe)) - user << "You add the syringe to the machine!" - src.updateUsrDialog() - else - user << "You add the beaker to the machine!" - src.updateUsrDialog() - else - if(istype(B,/obj/item/weapon/virusdish)) - if(src.dish) - user << "A dish is already loaded into the machine." - return - - src.dish = B - user.drop_item() - B.loc = src - if(istype(B,/obj/item/weapon/virusdish)) - user << "You add the dish to the machine!" - src.updateUsrDialog() - - Topic(href, href_list) - if(stat & BROKEN) return - if(usr.stat || usr.restrained()) return - if(!in_range(src, usr)) return - - usr.machine = src - if(!dish) return - - if (href_list["power"]) - on = !on - if(on) - icon_state = "incubator_on" - else - icon_state = "incubator" - if (href_list["ejectchem"]) - if(beaker) - beaker.loc = src.loc - beaker = null - if (href_list["ejectdish"]) - if(dish) - dish.loc = src.loc - dish = null - if (href_list["rad"]) - radiation += 10 - if (href_list["flush"]) - radiation = 0 - toxins = 0 - foodsupply = 0 - - - src.add_fingerprint(usr) - src.updateUsrDialog() - - attack_hand(mob/user as mob) - if(stat & BROKEN) - return - user.machine = src - var/dat = "" - if(!dish) - dat = "Please insert dish into the incubator.
" - dat += "Close" - var/string = "Off" - if(on) - string = "On" - dat += "Power status : [string]" - dat += "
" - dat += "Food supply : [foodsupply]" - dat += "
" - dat += "Radiation Levels : [radiation] RADS : Radiate" - dat += "
" - dat += "Toxins : [toxins]" - dat += "

" - if(beaker) - dat += "Eject chemicals : Eject" - dat += "
" - if(dish) - dat += "Eject Virus dish : Eject" - dat += "
" - dat += "

" - dat += "Flush system" - - - user << browse("Pathogenic incubatorincubator menu:

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

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

[dat]", "window=isolator;size=575x400") - onclose(user, "isolator") - return - - - - - process() - if(isolating > 0) - isolating -= 1 - if(isolating == 0) - var/obj/item/weapon/virusdish/d = new /obj/item/weapon/virusdish(src.loc) - d.virus2 = virus2.getcopy() - virus2 = null - icon_state = "isolator_in" - - - - -/obj/item/weapon/virusdish - name = "Virus containment/growth dish" - icon = 'icons/obj/items.dmi' - icon_state = "implantcase-b" - var/datum/disease2/disease/virus2 = null - var/growth = 0 - var/info = 0 - var/analysed = 0 - -/obj/item/weapon/virusdish/attackby(var/obj/item/weapon/W as obj,var/mob/living/carbon/user as mob) - if(istype(W,/obj/item/weapon/hand_labeler)) - return - ..() - if(prob(50)) - user << "The dish shatters" - if(virus2.infectionchance > 0) - infect_virus2(user,virus2) - del src - -/obj/item/weapon/virusdish/examine() - usr << "This is a virus containment dish" - if(src.info) - usr << "It has the following information about its contents" - usr << src.info diff --git a/code/WorkInProgress/virus2/Disease2/monkeydispensor.dm b/code/WorkInProgress/virus2/Disease2/monkeydispensor.dm deleted file mode 100644 index 13d1b9806f..0000000000 --- a/code/WorkInProgress/virus2/Disease2/monkeydispensor.dm +++ /dev/null @@ -1,30 +0,0 @@ -/obj/machinery/disease2/monkeycloner - name = "Monkey dispensor" - icon = 'icons/obj/cloning.dmi' - icon_state = "pod_0" - density = 1 - anchored = 1 - - var/cloning = 0 - -/obj/machinery/disease2/monkeycloner/attack_hand() - if(!cloning) - cloning = 150 - - icon_state = "pod_g" - -/obj/machinery/disease2/monkeycloner/process() - if(stat & (NOPOWER|BROKEN)) - return - use_power(500) - src.updateDialog() - - if(cloning) - cloning -= 1 - if(!cloning) - new /mob/living/carbon/monkey(src.loc) - icon_state = "pod_0" - - - - return diff --git a/code/WorkInProgress/virus2/analyser.dm b/code/WorkInProgress/virus2/analyser.dm deleted file mode 100644 index 3604d7955f..0000000000 --- a/code/WorkInProgress/virus2/analyser.dm +++ /dev/null @@ -1,78 +0,0 @@ -/obj/machinery/disease2/diseaseanalyser - name = "Disease Analyser" - icon = 'virology.dmi' - icon_state = "analyser" - anchored = 1 - density = 1 - - var/scanning = 0 - var/pause = 0 - - var/obj/item/weapon/virusdish/dish = null - -/obj/machinery/disease2/diseaseanalyser/attackby(var/obj/I as obj, var/mob/user as mob) - if(istype(I,/obj/item/weapon/virusdish)) - var/mob/living/carbon/c = user - if(!dish) - - dish = I - c.drop_item() - I.loc = src - for(var/mob/M in viewers(src)) - if(M == user) continue - M.show_message("\blue [user.name] inserts the [dish.name] in the [src.name]", 3) - - - else - user << "There is already a dish inserted" - - //else - return - - -/obj/machinery/disease2/diseaseanalyser/process() - if(stat & (NOPOWER|BROKEN)) - return - use_power(500) - //src.updateDialog() - - - if(scanning) - scanning -= 1 - if(scanning == 0) - var/r = "GNAv2 based virus lifeform" - r += "
Infection rate : [dish.virus2.infectionchance * 10]" - r += "
Spread form : [dish.virus2.spreadtype]" - r += "
Progress Speed : [dish.virus2.stageprob * 10]" - for(var/datum/disease2/effectholder/E in dish.virus2.effects) - r += "
Effect:[E.effect.name]. Strength : [E.multiplier * 8]. Verosity : [E.chance * 15]. Type : [5-E.stage]." - // display the antigens - var/code = "" - for(var/V in ANTIGENS) if(text2num(V) & dish.virus2.antigen) code += ANTIGENS[V] - r += "
Antigen pattern: [code]" - - var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(src.loc) - P.info = r - dish.info = r - dish.analysed = 1 - dish.loc = src.loc - dish = null - icon_state = "analyser" - - for(var/mob/O in hearers(src, null)) - O.show_message("\icon[src] \blue The [src.name] prints a sheet of paper", 3) - else if(dish && !scanning && !pause) - if(dish.virus2 && dish.growth > 50) - dish.growth -= 10 - scanning = 5 - icon_state = "analyser_processing" - else - pause = 1 - spawn(25) - dish.loc = src.loc - dish = null - for(var/mob/M in viewers(src)) - M.show_message("\icon[src] \blue The [src.name] buzzes", 2) - pause = 0 - - return \ No newline at end of file diff --git a/code/WorkInProgress/virus2/antibodies.dm b/code/WorkInProgress/virus2/antibodies.dm deleted file mode 100644 index b8810e322d..0000000000 --- a/code/WorkInProgress/virus2/antibodies.dm +++ /dev/null @@ -1,58 +0,0 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33 - -// pure concentrated antibodies -datum/reagent/antibodies - data = new/list("antibodies"=0) - name = "Antibodies" - id = "antibodies" - reagent_state = LIQUID - color = "#0050F0" - - reaction_mob(var/mob/M, var/method=TOUCH, var/volume) - if(istype(M,/mob/living/carbon)) - if(src.data && method == INGEST) - if(M:virus2) if(src.data["antibodies"] & M:virus2.antigen) - M:virus2.dead = 1 - // if the virus is killed this way it immunizes - // M:antibodies |= M:virus2.antigen - M:antibodies |= src.data["antibodies"] - return - -// reserving some numbers for later special antigens -var/global/const/ANTIGEN_A = 1 -var/global/const/ANTIGEN_B = 2 -var/global/const/ANTIGEN_RH = 4 -var/global/const/ANTIGEN_Q = 8 -var/global/const/ANTIGEN_U = 16 -var/global/const/ANTIGEN_V = 32 -var/global/const/ANTIGEN_X = 64 -var/global/const/ANTIGEN_Y = 128 -var/global/const/ANTIGEN_Z = 256 -var/global/const/ANTIGEN_M = 512 -var/global/const/ANTIGEN_N = 1024 -var/global/const/ANTIGEN_P = 2048 -var/global/const/ANTIGEN_O = 4096 - -var/global/list/ANTIGENS = list("[ANTIGEN_A]" = "A", "[ANTIGEN_B]" = "B", "[ANTIGEN_RH]" = "RH", "[ANTIGEN_Q]" = "Q", - "[ANTIGEN_U]" = "U", "[ANTIGEN_V]" = "V", "[ANTIGEN_Z]" = "Z", "[ANTIGEN_M]" = "M", - "[ANTIGEN_N]" = "N", "[ANTIGEN_P]" = "P", "[ANTIGEN_O]" = "O") - - - -/obj/item/device/antibody_scanner - name = "Antibody Scanner" - desc = "Used to scan living beings for antibodies in their blood." - icon_state = "health" - w_class = 2.0 - item_state = "electronic" - flags = FPRINT | TABLEPASS | CONDUCT | USEDELAY - - -/obj/item/device/antibody_scanner/attack(mob/living/carbon/human/M as mob, mob/user as mob) - if(! istype(M, /mob/living/carbon) || !M:antibodies) - user << "Unable to detect antibodies.." - else - // iterate over the list of antigens and see what matches - var/code = "" - for(var/V in ANTIGENS) if(text2num(V) & M.antibodies) code += ANTIGENS[V] - user << text("\blue [src] The antibody scanner displays a cryptic set of data: [code]") diff --git a/code/WorkInProgress/virus2/base.dm b/code/WorkInProgress/virus2/base.dm deleted file mode 100644 index 3d8954fc99..0000000000 --- a/code/WorkInProgress/virus2/base.dm +++ /dev/null @@ -1,601 +0,0 @@ -/obj/virus - // a virus instance that is placed on the map, moves, and infects - invisibility = INVISIBILITY_MAXIMUM - - var/datum/disease2/disease - - New() - ..() - step_rand(src) - step_rand(src) - anchored = 1 - spawn(300) del(src) - -/mob/living/carbon/proc/get_infection_chance() - var/score = 0 - var/mob/living/carbon/M = src - if(istype(M, /mob/living/carbon/human)) - if(M:gloves) - score += 5 - if(istype(M:wear_suit, /obj/item/clothing/suit/space)) score += 10 - if(istype(M:wear_suit, /obj/item/clothing/suit/bio_suit)) score += 10 - if(istype(M:head, /obj/item/clothing/head/helmet/space)) score += 5 - if(istype(M:head, /obj/item/clothing/head/bio_hood)) score += 5 - if(M.wear_mask) - score += 5 - if(istype(M:wear_mask, /obj/item/clothing/mask/surgical) && !M.internal) - score += 10 - if(M.internal) - score += 10 - - if(score >= 30) - return 0 - else if(score == 25 && prob(99)) - return 0 - else if(score == 20 && prob(95)) - return 0 - else if(score == 15 && prob(75)) - return 0 - else if(score == 10 && prob(55)) - return 0 - else if(score == 5 && prob(35)) - return 0 - - return 1 - - -proc/airborne_can_reach(turf/source, turf/target) - var/obj/dummy = new(source) - dummy.flags = FPRINT | TABLEPASS - dummy.pass_flags = PASSTABLE - - for(var/i=0, i<5, i++) if(!step_towards(dummy, target)) break - - var/rval = (dummy.loc in range(1,target)) - del dummy - return rval - -/proc/infect_virus2(var/mob/living/carbon/M,var/datum/disease2/disease/disease,var/forced = 0) - if(M.virus2) - return - if(!disease) - return - //immunity - /*for(var/iii = 1, iii <= M.immunevirus2.len, iii++) - if(disease.issame(M.immunevirus2[iii])) - return*/ - - // if one of the antibodies in the mob's body matches one of the disease's antigens, don't infect - if(M.antibodies & disease.antigen != 0) return - - for(var/datum/disease2/resistance/res in M.resistances) - if(res.resistsdisease(disease)) - return - if(prob(disease.infectionchance) || forced) - if(M.virus2) - return - else - // certain clothes can prevent an infection - if(!forced && !M.get_infection_chance()) - return - - M.virus2 = disease.getcopy() - M.virus2.minormutate() - - for(var/datum/disease2/resistance/res in M.resistances) - if(res.resistsdisease(M.virus2)) - M.virus2 = null - - - -/datum/disease2/resistance - var/list/datum/disease2/effect/resistances = list() - - proc/resistsdisease(var/datum/disease2/disease/virus2) - var/list/res2 = list() - for(var/datum/disease2/effect/e in resistances) - res2 += e.type - for(var/datum/disease2/effectholder/holder in virus2) - if(!(holder.effect.type in res2)) - return 0 - else - res2 -= holder.effect.type - if(res2.len > 0) - return 0 - else - return 1 - - New(var/datum/disease2/disease/virus2) - for(var/datum/disease2/effectholder/h in virus2.effects) - resistances += h.effect.type - - -/proc/infect_mob_random_lesser(var/mob/living/carbon/M) - if(!M.virus2) - M.virus2 = new /datum/disease2/disease - M.virus2.makerandom() - M.virus2.infectionchance = 1 - -/proc/infect_mob_random_greater(var/mob/living/carbon/M) - if(!M.virus2) - M.virus2 = new /datum/disease2/disease - M.virus2.makerandom(1) - -/datum/disease2/var/antigen = 0 // 16 bits describing the antigens, when one bit is set, a cure with that bit can dock here - -/datum/disease2/disease - var/infectionchance = 10 - var/speed = 1 - var/spreadtype = "Blood" // Can also be "Airborne" - var/stage = 1 - var/stageprob = 10 - var/dead = 0 - var/clicks = 0 - - var/uniqueID = 0 - var/list/datum/disease2/effectholder/effects = list() - proc/makerandom(var/greater=0) - var/datum/disease2/effectholder/holder = new /datum/disease2/effectholder - holder.stage = 1 - if(greater) - holder.getrandomeffect_greater() - else - holder.getrandomeffect_lesser() - effects += holder - holder = new /datum/disease2/effectholder - holder.stage = 2 - if(greater) - holder.getrandomeffect_greater() - else - holder.getrandomeffect_lesser() - effects += holder - holder = new /datum/disease2/effectholder - holder.stage = 3 - if(greater) - holder.getrandomeffect_greater() - else - holder.getrandomeffect_lesser() - effects += holder - holder = new /datum/disease2/effectholder - holder.stage = 4 - if(greater) - holder.getrandomeffect_greater() - else - holder.getrandomeffect_lesser() - effects += holder - uniqueID = rand(0,10000) - infectionchance = rand(1,10) - // pick 2 antigens - antigen |= text2num(pick(ANTIGENS)) - antigen |= text2num(pick(ANTIGENS)) - spreadtype = "Airborne" - - proc/makealien() - var/datum/disease2/effectholder/holder = new /datum/disease2/effectholder - holder.stage = 1 - holder.chance = 10 - holder.effect = new/datum/disease2/effect/lesser/gunck() - effects += holder - - holder = new /datum/disease2/effectholder - holder.stage = 2 - holder.chance = 10 - holder.effect = new/datum/disease2/effect/lesser/cough() - effects += holder - - holder = new /datum/disease2/effectholder - holder.stage = 3 - holder.chance = 10 - holder.effect = new/datum/disease2/effect/greater/toxins() - effects += holder - - holder = new /datum/disease2/effectholder - holder.stage = 4 - holder.chance = 10 - holder.effect = new/datum/disease2/effect/alien() - effects += holder - - uniqueID = 896 // all alien diseases have the same ID - infectionchance = 0 - spreadtype = "Airborne" - - proc/minormutate() - var/datum/disease2/effectholder/holder = pick(effects) - holder.minormutate() - infectionchance = min(10,infectionchance + rand(0,1)) - - proc/issame(var/datum/disease2/disease/disease) - var/list/types = list() - var/list/types2 = list() - for(var/datum/disease2/effectholder/d in effects) - types += d.effect.type - var/equal = 1 - - for(var/datum/disease2/effectholder/d in disease.effects) - types2 += d.effect.type - - for(var/type in types) - if(!(type in types2)) - equal = 0 - return equal - - proc/activate(var/mob/living/carbon/mob) - if(dead) - cure(mob) - mob.virus2 = null - return - if(mob.stat == 2) - return - // with a certain chance, the mob may become immune to the disease before it starts properly - if(stage <= 1 && clicks == 0) - if(prob(20)) - mob.antibodies |= antigen // 20% immunity is a good chance IMO, because it allows finding an immune person easily - else - if(mob.radiation > 50) - if(prob(1)) - majormutate() - if(mob.reagents.has_reagent("spaceacillin")) - return - if(mob.reagents.has_reagent("virusfood")) - mob.reagents.remove_reagent("virusfood",0.1) - clicks += 10 - if(clicks > stage*100 && prob(10)) - if(stage == 4) - var/datum/disease2/resistance/res = new /datum/disease2/resistance(src) - src.cure(mob) - mob.resistances2 += res - mob.antibodies |= src.antigen - mob.virus2 = null - del src - stage++ - clicks = 0 - for(var/datum/disease2/effectholder/e in effects) - e.runeffect(mob,stage) - clicks+=speed - - proc/cure(var/mob/living/carbon/mob) - var/datum/disease2/effectholder/E - if(stage>1) - E = effects[1] - E.effect.deactivate(mob) - if(stage>2) - E = effects[2] - E.effect.deactivate(mob) - if(stage>3) - E = effects[3] - E.effect.deactivate(mob) - if(stage>4) - E = effects[4] - E.effect.deactivate(mob) - - proc/cure_added(var/datum/disease2/resistance/res) - if(res.resistsdisease(src)) - dead = 1 - - proc/majormutate() - var/datum/disease2/effectholder/holder = pick(effects) - holder.majormutate() - - - proc/getcopy() -// world << "getting copy" - var/datum/disease2/disease/disease = new /datum/disease2/disease - disease.infectionchance = infectionchance - disease.spreadtype = spreadtype - disease.stageprob = stageprob - disease.antigen = antigen - for(var/datum/disease2/effectholder/holder in effects) - // world << "adding effects" - var/datum/disease2/effectholder/newholder = new /datum/disease2/effectholder - newholder.effect = new holder.effect.type - newholder.chance = holder.chance - newholder.cure = holder.cure - newholder.multiplier = holder.multiplier - newholder.happensonce = holder.happensonce - newholder.stage = holder.stage - disease.effects += newholder - // world << "[newholder.effect.name]" - // world << "[disease]" - return disease - -/datum/disease2/effect - var/chance_maxm = 100 - var/name = "Blanking effect" - var/stage = 4 - var/maxm = 1 - proc/activate(var/mob/living/carbon/mob,var/multiplier) - proc/deactivate(var/mob/living/carbon/mob) - -/datum/disease2/effect/alien - name = "Unidentified Foreign Body" - stage = 4 - activate(var/mob/living/carbon/mob,var/multiplier) - mob << "\red You feel something tearing its way out of your stomach..." - mob.adjustToxLoss(10) - mob.updatehealth() - if(prob(40)) - if(mob.client) - mob.client.mob = new/mob/living/carbon/alien/larva(mob.loc) - else - new/mob/living/carbon/alien/larva(mob.loc) - var/datum/disease2/disease/D = mob:virus2 - mob:gib() - del D - -/datum/disease2/effect/greater/gibbingtons - name = "Gibbingtons Syndrome" - stage = 4 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.gib() - -/datum/disease2/effect/greater/radian - name = "Radian's syndrome" - stage = 4 - maxm = 3 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.radiation += (2*multiplier) - -/datum/disease2/effect/greater/toxins - name = "Hyperacid Syndrome" - stage = 3 - maxm = 3 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.adjustToxLoss((2*multiplier)) - -/datum/disease2/effect/greater/scream - name = "Random screaming syndrome" - stage = 2 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.say("*scream") - -/datum/disease2/effect/greater/drowsness - name = "Automated sleeping syndrome" - stage = 2 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.drowsyness += 10 - -/datum/disease2/effect/greater/shakey - name = "World Shaking syndrome" - stage = 3 - maxm = 3 - activate(var/mob/living/carbon/mob,var/multiplier) - shake_camera(mob,5*multiplier) - -/datum/disease2/effect/greater/deaf - name = "Hard of hearing syndrome" - stage = 4 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.ear_deaf += 20 - -/datum/disease2/effect/invisible - name = "Waiting Syndrome" - stage = 1 - activate(var/mob/living/carbon/mob,var/multiplier) - return - -/datum/disease2/effect/greater/telepathic - name = "Telepathy Syndrome" - stage = 3 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.mutations |= 512 - -/*/datum/disease2/effect/greater/noface - name = "Identity Loss syndrome" - stage = 4 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.face_dmg++ - deactivate(var/mob/living/carbon/mob) - mob.face_dmg--*/ - -/datum/disease2/effect/greater/monkey - name = "Monkism syndrome" - stage = 4 - activate(var/mob/living/carbon/mob,var/multiplier) - if(istype(mob,/mob/living/carbon/human)) - var/mob/living/carbon/human/h = mob - h.monkeyize() - -/datum/disease2/effect/greater/sneeze - name = "Coldingtons Effect" - stage = 1 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.say("*sneeze") - -/datum/disease2/effect/greater/gunck - name = "Flemmingtons" - stage = 1 - activate(var/mob/living/carbon/mob,var/multiplier) - mob << "\red Mucous runs down the back of your throat." - -/datum/disease2/effect/greater/killertoxins - name = "Toxification syndrome" - stage = 4 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.adjustToxLoss(15) - -/*/datum/disease2/effect/greater/hallucinations - name = "Hallucinational Syndrome" - stage = 3 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.hallucination += 25*/ - -/datum/disease2/effect/greater/sleepy - name = "Resting syndrome" - stage = 2 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.say("*collapse") - -/datum/disease2/effect/greater/mind - name = "Lazy mind syndrome" - stage = 3 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.setBrainLoss(50) - -/datum/disease2/effect/greater/suicide - name = "Suicidal syndrome" - stage = 4 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.suiciding = 1 - //instead of killing them instantly, just put them at -175 health and let 'em gasp for a while - viewers(mob) << "\red [mob.name] is holding \his breath. It looks like \he's trying to commit suicide." - mob.adjustOxyLoss(175 - mob.getToxLoss() - mob.getFireLoss() - mob.getBruteLoss() - mob.getOxyLoss()) - mob.updatehealth() - spawn(200) //in case they get revived by cryo chamber or something stupid like that, let them suicide again in 20 seconds - mob.suiciding = 0 - -// lesser syndromes, partly just copypastes -/datum/disease2/effect/lesser/mind - name = "Lazy mind syndrome" - stage = 3 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.setBrainLoss(20) - -/datum/disease2/effect/lesser/drowsy - name = "Bedroom Syndrome" - stage = 2 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.drowsyness = 5 - -/datum/disease2/effect/lesser/deaf - name = "Hard of hearing syndrome" - stage = 3 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.ear_deaf = 5 - -/datum/disease2/effect/lesser/gunck - name = "Flemmingtons" - stage = 1 - activate(var/mob/living/carbon/mob,var/multiplier) - mob << "\red Mucous runs down the back of your throat." - -/datum/disease2/effect/lesser/radian - name = "Radian's syndrome" - stage = 4 - maxm = 3 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.radiation += 1 - -/datum/disease2/effect/lesser/sneeze - name = "Coldingtons Effect" - stage = 1 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.say("*sneeze") - -/datum/disease2/effect/lesser/cough - name = "Anima Syndrome" - stage = 2 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.say("*cough") - -/*/datum/disease2/effect/lesser/hallucinations - name = "Hallucinational Syndrome" - stage = 3 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.hallucination += 5*/ - -/*/datum/disease2/effect/lesser/arm - name = "Disarming Syndrome" - stage = 4 - activate(var/mob/living/carbon/mob,var/multiplier) - var/datum/organ/external/org = mob.organs["r_arm"] - org.take_damage(3,0,0,0) - mob << "\red You feel a sting in your right arm."*/ - -/datum/disease2/effect/lesser/hungry - name = "Appetiser Effect" - stage = 2 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.nutrition = max(0, mob.nutrition - 200) - -/datum/disease2/effect/lesser/groan - name = "Groaning Syndrome" - stage = 3 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.say("*groan") - -/datum/disease2/effect/lesser/scream - name = "Loudness Syndrome" - stage = 4 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.say("*scream") - -/datum/disease2/effect/lesser/drool - name = "Saliva Effect" - stage = 1 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.say("*drool") - -/datum/disease2/effect/lesser/fridge - name = "Refridgerator Syndrome" - stage = 2 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.say("*shiver") - -/datum/disease2/effect/lesser/twitch - name = "Twitcher" - stage = 1 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.say("*twitch") - -/*Removed on request by Spaceman, due to it being detrimental to RP. -CN -/datum/disease2/effect/lesser/deathgasp - name = "Zombie Syndrome" - stage = 4 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.say("*deathgasp")*/ - -/datum/disease2/effect/lesser/giggle - name = "Uncontrolled Laughter Effect" - stage = 3 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.say("*giggle") - - -/datum/disease2/effect/lesser - chance_maxm = 10 - -/datum/disease2/effectholder - var/name = "Holder" - var/datum/disease2/effect/effect - var/chance = 0 //Chance in percentage each tick - var/cure = "" //Type of cure it requires - var/happensonce = 0 - var/multiplier = 1 //The chance the effects are WORSE - var/stage = 0 - - proc/runeffect(var/mob/living/carbon/human/mob,var/stage) - if(happensonce > -1 && effect.stage <= stage && prob(chance)) - effect.activate(mob) - if(happensonce == 1) - happensonce = -1 - - proc/getrandomeffect_greater() - var/list/datum/disease2/effect/list = list() - for(var/e in (typesof(/datum/disease2/effect/greater) - /datum/disease2/effect/greater)) - // world << "Making [e]" - var/datum/disease2/effect/f = new e - if(f.stage == src.stage) - list += f - effect = pick(list) - chance = rand(1,6) - - proc/getrandomeffect_lesser() - var/list/datum/disease2/effect/list = list() - for(var/e in (typesof(/datum/disease2/effect/lesser) - /datum/disease2/effect/lesser)) - var/datum/disease2/effect/f = new e - if(f.stage == src.stage) - list += f - effect = pick(list) - chance = rand(1,6) - - proc/minormutate() - switch(pick(1,2,3,4,5)) - if(1) - chance = rand(0,effect.chance_maxm) - if(2) - multiplier = rand(1,effect.maxm) - proc/majormutate() - getrandomeffect_greater() - -/proc/dprob(var/p) - return(prob(sqrt(p)) && prob(sqrt(p))) diff --git a/code/WorkInProgress/virus2/cureimplanter.dm b/code/WorkInProgress/virus2/cureimplanter.dm deleted file mode 100644 index 80354e5765..0000000000 --- a/code/WorkInProgress/virus2/cureimplanter.dm +++ /dev/null @@ -1,43 +0,0 @@ -/obj/item/weapon/cureimplanter - name = "Hypospray injector" - icon = 'items.dmi' - icon_state = "implanter1" - var/datum/disease2/resistance/resistance = null - var/works = 0 - var/datum/disease2/disease/virus2 = null - item_state = "syringe_0" - throw_speed = 1 - throw_range = 5 - w_class = 2.0 - - -/obj/item/weapon/cureimplanter/attack(mob/target as mob, mob/user as mob) - if(ismob(target)) - for(var/mob/O in viewers(world.view, user)) - if (target != user) - O.show_message(text("\red [] is trying to inject [] with [src.name]!", user, target), 1) - else - O.show_message("\red [user] is trying to inject themselves with [src.name]!", 1) - if(!do_mob(user, target,60)) return - - - for(var/mob/O in viewers(world.view, user)) - if (target != user) - O.show_message(text("\red [] injects [] with [src.name]!", user, target), 1) - else - O.show_message("\red [user] injects themself with [src.name]!", 1) - - - var/mob/living/carbon/M = target - - if(works == 0) - M.resistances2 += resistance - //M.immunevirus2 += M.virus2.getcopy() - if(M.virus2) - M.virus2.cure_added(resistance) - else if(works == 1) - M.adjustToxLoss(60) - else if(works == 2) - M.gib() - else if(works == 3) - infect_virus2(M,virus2,1) \ No newline at end of file diff --git a/code/WorkInProgress/virus2/dishincubator.dm b/code/WorkInProgress/virus2/dishincubator.dm deleted file mode 100644 index 93b475f4c6..0000000000 --- a/code/WorkInProgress/virus2/dishincubator.dm +++ /dev/null @@ -1,169 +0,0 @@ -/obj/machinery/disease2/incubator/ - name = "Pathogenic incubator" - density = 1 - anchored = 1 - icon = 'virology.dmi' - icon_state = "incubator" - var/obj/item/weapon/virusdish/dish - var/obj/item/weapon/reagent_containers/glass/beaker = null - var/radiation = 0 - - var/on = 0 - var/power = 0 - - var/foodsupply = 0 - var/toxins = 0 - - ex_act(severity) - switch(severity) - if(1.0) - del(src) - return - if(2.0) - if (prob(50)) - del(src) - return - - blob_act() - if (prob(25)) - del(src) - - meteorhit() - del(src) - return - - attackby(var/obj/B as obj, var/mob/user as mob) - if(istype(B, /obj/item/weapon/reagent_containers/glass) || istype(B,/obj/item/weapon/reagent_containers/syringe)) - - if(src.beaker) - if(istype(beaker,/obj/item/weapon/reagent_containers/syringe)) - user << "A syringe is already loaded into the machine." - else - user << "A beaker is already loaded into the machine." - return - - src.beaker = B - user.drop_item() - B.loc = src - if(istype(B,/obj/item/weapon/reagent_containers/syringe)) - user << "You add the syringe to the machine!" - src.updateUsrDialog() - else - user << "You add the beaker to the machine!" - src.updateUsrDialog() - else - if(istype(B,/obj/item/weapon/virusdish)) - if(src.dish) - user << "A dish is already loaded into the machine." - return - - src.dish = B - user.drop_item() - B.loc = src - if(istype(B,/obj/item/weapon/virusdish)) - user << "You add the dish to the machine!" - src.updateUsrDialog() - - Topic(href, href_list) - if(stat & BROKEN) return - if(usr.stat || usr.restrained()) return - if(!in_range(src, usr)) return - if (href_list["ejectchem"]) - if(beaker) - beaker.loc = src.loc - beaker = null - if(!dish) - return - usr.machine = src - if (href_list["power"]) - on = !on - if(on) - icon_state = "incubator_on" - else - icon_state = "incubator" - if (href_list["ejectdish"]) - if(dish) - dish.loc = src.loc - dish = null - if (href_list["rad"]) - radiation += 10 - if (href_list["flush"]) - radiation = 0 - toxins = 0 - foodsupply = 0 - - - src.add_fingerprint(usr) - src.updateUsrDialog() - - attack_hand(mob/user as mob) - if(stat & BROKEN) - return - user.machine = src - var/dat = "" - if(!dish) - dat = "Please insert dish into the incubator.
" - var/string = "Off" - if(on) - string = "On" - dat += "Power status : [string]" - dat += "
" - dat += "Food supply : [foodsupply]" - dat += "
" - dat += "Radiation Levels : [radiation] RADS : Radiate" - dat += "
" - dat += "Toxins : [toxins]" - dat += "

" - if(beaker) - dat += "Eject chemicals : Eject" - dat += "
" - if(dish) - dat += "Eject Virus dish : Eject" - dat += "
" - dat += "

" - dat += "Flush system
" - dat += "Close
" - user << browse("Pathogenic incubatorincubator menu:

[dat]", "window=incubator;size=575x400") - onclose(user, "incubator") - return - - - - - process() - - if(dish && on && dish.virus2) - use_power(50,EQUIP) - if(!powered(EQUIP)) - on = 0 - icon_state = "incubator" - if(foodsupply) - foodsupply -= 1 - dish.growth += 3 - if(dish.growth >= 100) - state("The [src.name] pings", "blue") - if(radiation) - if(radiation > 50 & prob(5)) - dish.virus2.majormutate() - if(dish.info) - dish.info = "OUTDATED : [dish.info]" - dish.analysed = 0 - state("The [src.name] beeps", "blue") - - else if(prob(5)) - dish.virus2.minormutate() - radiation -= 1 - if(toxins && prob(5)) - dish.virus2.infectionchance -= 1 - if(toxins > 50) - dish.virus2 = null - else if(!dish) - on = 0 - icon_state = "incubator" - - - if(beaker) - if(!beaker.reagents.remove_reagent("virusfood",5)) - foodsupply += 10 - if(!beaker.reagents.remove_reagent("toxin",1)) - toxins += 1 \ No newline at end of file diff --git a/code/WorkInProgress/virus2/isolator.dm b/code/WorkInProgress/virus2/isolator.dm deleted file mode 100644 index d337959fd6..0000000000 --- a/code/WorkInProgress/virus2/isolator.dm +++ /dev/null @@ -1,161 +0,0 @@ -/obj/machinery/disease2/isolator/ - name = "Pathogenic Isolator" - density = 1 - anchored = 1 - icon = 'virology.dmi' - icon_state = "isolator" - var/datum/disease2/disease/virus2 = null - var/isolating = 0 - var/beaker = null - - ex_act(severity) - switch(severity) - if(1.0) - del(src) - return - if(2.0) - if (prob(50)) - del(src) - return - - blob_act() - if (prob(25)) - del(src) - - meteorhit() - del(src) - return - - attackby(var/obj/item/weapon/reagent_containers/glass/B as obj, var/mob/user as mob) - if(!istype(B,/obj/item/weapon/reagent_containers/syringe)) - return - - if(src.beaker) - user << "A syringe is already loaded into the machine." - return - - src.beaker = B - user.drop_item() - B.loc = src - if(istype(B,/obj/item/weapon/reagent_containers/syringe)) - user << "You add the syringe to the machine!" - src.updateUsrDialog() - icon_state = "isolator_in" - - Topic(href, href_list) - if(stat & BROKEN) return - if(usr.stat || usr.restrained()) return - if(!in_range(src, usr)) return - - usr.machine = src - if(!beaker) return - var/datum/reagents/R = beaker:reagents - - if (href_list["isolate"]) - var/datum/reagent/blood/Blood - for(var/datum/reagent/blood/B in R.reagent_list) - if(B) - Blood = B - break - - if(Blood.data["virus2"]) - virus2 = Blood.data["virus2"] - isolating = 40 - icon_state = "isolator_processing" - src.updateUsrDialog() - return - - else if (href_list["main"]) - attack_hand(usr) - return - else if (href_list["eject"]) - beaker:loc = src.loc - beaker = null - icon_state = "isolator" - src.updateUsrDialog() - return - - attack_hand(mob/user as mob) - if(stat & BROKEN) - return - user.machine = src - var/dat = "" - if(!beaker) - dat = "Please insert sample into the isolator.
" - dat += "Close" - else if(isolating) - dat = "Isolating" - else - var/datum/reagents/R = beaker:reagents - dat += "Eject

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

[dat]", "window=isolator;size=575x400") - onclose(user, "isolator") - return - - - - - process() - if(isolating > 0) - isolating -= 1 - if(isolating == 0) - var/obj/item/weapon/virusdish/d = new /obj/item/weapon/virusdish(src.loc) - d.virus2 = virus2.getcopy() - virus2 = null - icon_state = "isolator_in" - - - - -/obj/item/weapon/virusdish - name = "Virus containment/growth dish" - icon = 'items.dmi' - icon_state = "implantcase-b" - var/datum/disease2/disease/virus2 = null - var/growth = 0 - var/info = 0 - var/analysed = 0 - - reagents = list() - -/obj/item/weapon/virusdish/random - name = "Virus Sample" - -/obj/item/weapon/virusdish/random/New() - ..() - // add a random virus to this dish - 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)) - user << "The dish shatters" - if(virus2.infectionchance > 0) - for(var/mob/living/carbon/target in view(null, src)) if(!target.virus2) - if(airborne_can_reach(src.loc, target.loc)) - if(target.get_infection_chance()) - infect_virus2(target,src.virus2) - del src - -/obj/item/weapon/virusdish/examine() - usr << "This is a virus containment dish" - if(src.info) - usr << "It has the following information about its contents" - usr << src.info - -/obj/machinery/proc/state(var/msg) - for(var/mob/O in hearers(src, null)) - O.show_message("\icon[src] \blue [msg]", 2) diff --git a/code/WorkInProgress/virus2/monkeydispensor.dm b/code/WorkInProgress/virus2/monkeydispensor.dm deleted file mode 100644 index aee24b0d4a..0000000000 --- a/code/WorkInProgress/virus2/monkeydispensor.dm +++ /dev/null @@ -1,30 +0,0 @@ -/obj/machinery/disease2/monkeycloner - name = "Monkey dispensor" - icon = 'cloning.dmi' - icon_state = "pod_0" - density = 1 - anchored = 1 - - var/cloning = 0 - -/obj/machinery/disease2/monkeycloner/attack_hand() - if(!cloning) - cloning = 150 - - icon_state = "pod_g" - -/obj/machinery/disease2/monkeycloner/process() - if(stat & (NOPOWER|BROKEN)) - return - use_power(500) - //src.updateDialog() - - if(cloning) - cloning -= 1 - if(!cloning) - new /mob/living/carbon/monkey(src.loc) - icon_state = "pod_0" - - - - return \ No newline at end of file diff --git a/code/game/gamemodes/epidemic/epidemic.dm b/code/game/gamemodes/epidemic/epidemic.dm index 0d4a20ff2f..60701479e1 100644 --- a/code/game/gamemodes/epidemic/epidemic.dm +++ b/code/game/gamemodes/epidemic/epidemic.dm @@ -124,14 +124,15 @@ for(var/i = 0, i < lethal_amount, i++) var/mob/living/carbon/human/H = pick(crew) - if(H.virus2) + if(lethal.uniqueID in H.virus2) i-- continue - H.virus2 = lethal.getcopy() + H.virus2["[lethal.uniqueID]"] = lethal.getcopy() infectees += H var/mob/living/carbon/human/patient_zero = pick(infectees) - patient_zero.virus2.stage = 3 + var/datum/disease2/disease/V = patient_zero.virus2["[lethal.uniqueID]"] + V.stage = 3 cruiser_arrival = world.time + (10 * 90 * 60) stage = 1 @@ -169,7 +170,7 @@ var/sick = 0 for(var/mob/living/carbon/human/H in world) if(H.key && H.stat != 2) alive++ - if(H.virus2 && H.stat != 2) sick++ + if(H.virus2.len && H.stat != 2) sick++ if(alive == 0) finished = 2 diff --git a/code/game/gamemodes/events/VirusEpidemic.dm b/code/game/gamemodes/events/VirusEpidemic.dm index 72c7b91203..f44b631a20 100644 --- a/code/game/gamemodes/events/VirusEpidemic.dm +++ b/code/game/gamemodes/events/VirusEpidemic.dm @@ -8,7 +8,7 @@ Announce() if(!virus) for(var/mob/living/carbon/human/H in world) - if((H.virus2) || (H.stat == 2) || prob(30)) + if((H.virus2.len) || (H.stat == 2) || prob(30)) continue if(prob(100)) // no lethal diseases outside virus mode! infect_mob_random_lesser(H) diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index 5c53d4ce8b..9f9ff56f78 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -61,6 +61,9 @@ t1 = "*dead*" else dat += text("[]\tHealth %: [] ([])
", (occupant.health > 50 ? "" : ""), occupant.health, t1) + if(iscarbon(occupant)) + var/mob/living/carbon/C = occupant + dat += text("[]\t-Pulse, bpm: []
", (C.pulse == PULSE_NONE || C.pulse == PULSE_THREADY ? "" : ""), C.get_pulse(GETPULSE_TOOL)) dat += text("[]\t-Brute Damage %: []
", (occupant.getBruteLoss() < 60 ? "" : ""), occupant.getBruteLoss()) dat += text("[]\t-Respiratory Damage %: []
", (occupant.getOxyLoss() < 60 ? "" : ""), occupant.getOxyLoss()) dat += text("[]\t-Toxin Content %: []
", (occupant.getToxLoss() < 60 ? "" : ""), occupant.getToxLoss()) diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index 72d00d89ed..f2ad62d05e 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -235,7 +235,7 @@ else dat += text("[]\tHealth %: [] ([])
", (occupant.health > 50 ? "" : ""), occupant.health, t1) - if(occupant.virus2) + if(occupant.virus2.len) dat += text("Viral pathogen detected in blood stream.
") dat += text("[]\t-Brute Damage %: []

", (occupant.getBruteLoss() < 60 ? "" : ""), occupant.getBruteLoss()) diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm index 36d4c6ea70..f1a1f02db7 100644 --- a/code/game/machinery/computer/Operating.dm +++ b/code/game/machinery/computer/Operating.dm @@ -56,6 +56,7 @@ Fire Damage: [src.victim.getFireLoss()]
Suffocation Damage: [src.victim.getOxyLoss()]
Patient Status: [src.victim.stat ? "Non-Responsive" : "Stable"]
+Heartbeat rate: [victim.get_pulse(GETPULSE_TOOL)]
"} else src.victim = null diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index 81f58d19d0..c6f2f45456 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -83,6 +83,7 @@ dat += text("\nPrint Record
\nBack
", src, src) if(5.0) dat += "
Virus Database
" + /* Advanced diseases is weak! Feeble! Glory to virus2! for(var/Dt in typesof(/datum/disease/)) var/datum/disease/Dis = new Dt(0) if(istype(Dis, /datum/disease/advance)) @@ -90,6 +91,11 @@ if(!Dis.desc) continue dat += "
[Dis.name]" + */ + for (var/ID in virusDB) + var/datum/data/record/v = virusDB[ID] + dat += "
[v.fields["name"]]" + dat += "
Back" if(6.0) dat += "
Medical Robot Monitor
" @@ -121,36 +127,56 @@ /obj/machinery/computer/med_data/Topic(href, href_list) if(..()) return + if (!( data_core.general.Find(src.active1) )) src.active1 = null + if (!( data_core.medical.Find(src.active2) )) src.active2 = null + if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon))) usr.set_machine(src) + if (href_list["temp"]) src.temp = null + if (href_list["scan"]) if (src.scan) - src.scan.loc = src.loc - src.scan = null + + if(ishuman(usr)) + scan.loc = usr.loc + + if(!usr.get_active_hand()) + usr.put_in_hands(scan) + + scan = null + + else + src.scan.loc = src.loc + src.scan = null + else var/obj/item/I = usr.get_active_hand() if (istype(I, /obj/item/weapon/card/id)) usr.drop_item() I.loc = src src.scan = I + else if (href_list["logout"]) src.authenticated = null src.screen = null src.active1 = null src.active2 = null + else if (href_list["login"]) + if (istype(usr, /mob/living/silicon/ai)) src.active1 = null src.active2 = null src.authenticated = usr.name src.rank = "AI" src.screen = 1 + else if (istype(usr, /mob/living/silicon/robot)) src.active1 = null src.active2 = null @@ -158,13 +184,16 @@ var/mob/living/silicon/robot/R = usr src.rank = R.braintype src.screen = 1 + else if (istype(src.scan, /obj/item/weapon/card/id)) src.active1 = null src.active2 = null + if (src.check_access(src.scan)) src.authenticated = src.scan.registered_name src.rank = src.scan.assignment src.screen = 1 + if (src.authenticated) if(href_list["screen"]) @@ -176,20 +205,12 @@ src.active2 = null if(href_list["vir"]) - var/type = href_list["vir"] - var/datum/disease/Dis = new type(0) - var/AfS = "" - for(var/Str in Dis.affected_species) - AfS += " [Str];" - src.temp = {"Name: [Dis.name] -
Number of stages: [Dis.max_stages] -
Spread: [Dis.spread] Transmission -
Possible Cure: [(Dis.cure||"none")] -
Affected Species:[AfS] -
-
Notes: [Dis.desc] -
-
Severity: [Dis.severity]"} + var/datum/data/record/v = locate(href_list["vir"]) + src.temp = "
GNAv2 based virus lifeform V-[v.fields["id"]]
" + src.temp += "
Name: [v.fields["name"]]" + src.temp += "
Antigen: [v.fields["antigen"]]" + src.temp += "
Spread: [v.fields["spread type"]] " + src.temp += "
Details:
[v.fields["description"]]" if (href_list["del_all"]) src.temp = text("Are you sure you wish to delete all records?
\n\tYes
\n\tNo
", src, src) @@ -279,7 +300,7 @@ src.active2.fields["notes"] = t1 if("p_stat") if (istype(src.active1, /datum/data/record)) - src.temp = text("Physical Condition:
\n\t*Deceased*
\n\t*Unconscious*
\n\tActive
\n\tPhysically Unfit
", src, src, src, src) + src.temp = text("Physical Condition:
\n\t*Deceased*
\n\t*SSD*
\n\tActive
\n\tPhysically Unfit
\n\tDisabled
", src, src, src, src, src) if("m_stat") if (istype(src.active1, /datum/data/record)) src.temp = text("Mental Condition:
\n\t*Insane*
\n\t*Unstable*
\n\t*Watch*
\n\tStable
", src, src, src, src) @@ -292,6 +313,20 @@ if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active1 != a1)) return src.active1.fields["dna"] = t1 + if("vir_name") + var/datum/data/record/v = locate(href_list["edit_vir"]) + if (v) + var/t1 = copytext(sanitize(input("Please input pathogen name:", "VirusDB", v.fields["name"], null) as text),1,MAX_MESSAGE_LEN) + if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active1 != a1)) + return + v.fields["name"] = t1 + if("vir_desc") + var/datum/data/record/v = locate(href_list["edit_vir"]) + if (v) + var/t1 = copytext(sanitize(input("Please input information about pathogen:", "VirusDB", v.fields["description"], null) as message),1,MAX_MESSAGE_LEN) + if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active1 != a1)) + return + v.fields["description"] = t1 else if (href_list["p_stat"]) @@ -299,12 +334,14 @@ switch(href_list["p_stat"]) if("deceased") src.active1.fields["p_stat"] = "*Deceased*" - if("unconscious") - src.active1.fields["p_stat"] = "*Unconscious*" + if("ssd") + src.active1.fields["p_stat"] = "*SSD*" if("active") src.active1.fields["p_stat"] = "Active" if("unfit") src.active1.fields["p_stat"] = "Physically Unfit" + if("disabled") + src.active1.fields["p_stat"] = "Disabled" if (href_list["m_stat"]) if (src.active1) @@ -466,7 +503,7 @@ if(4) R.fields["b_type"] = pick("A-", "B-", "AB-", "O-", "A+", "B+", "AB+", "O+") if(5) - R.fields["p_stat"] = pick("*Unconcious*", "Active", "Physically Unfit") + R.fields["p_stat"] = pick("*SSD*", "Active", "Physically Unfit", "Disabled") if(6) R.fields["m_stat"] = pick("*Insane*", "*Unstable*", "*Watch*", "Stable") continue diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index 4b095488f9..abe6341230 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -87,7 +87,7 @@ Current cell temperature: [temp_text]K
Cryo status: [ on ? "Off On" : "Off On"]
[beaker_text]

- Current occupant: [occupant ? "
Name: [occupant]
Health: [health_text]
Oxygen deprivation: [round(occupant.getOxyLoss(),0.1)]
Brute damage: [round(occupant.getBruteLoss(),0.1)]
Fire damage: [round(occupant.getFireLoss(),0.1)]
Toxin damage: [round(occupant.getToxLoss(),0.1)]
Body temperature: [occupant.bodytemperature]" : "None"]
+ Current occupant: [occupant ? "
Name: [occupant]
Health: [health_text]
Oxygen deprivation: [round(occupant.getOxyLoss(),0.1)]
Brute damage: [round(occupant.getBruteLoss(),0.1)]
Fire damage: [round(occupant.getFireLoss(),0.1)]
Toxin damage: [round(occupant.getToxLoss(),0.1)]
Body temperature: [occupant.bodytemperature]
Heartbeat rate: [occupant.get_pulse(GETPULSE_TOOL)]" : "None"]
"} user.set_machine(src) user << browse(dat, "window=cryo") diff --git a/code/game/mecha/medical/odysseus.dm b/code/game/mecha/medical/odysseus.dm index 869ff5b210..008b5d819a 100644 --- a/code/game/mecha/medical/odysseus.dm +++ b/code/game/mecha/medical/odysseus.dm @@ -87,8 +87,11 @@ for(var/datum/disease/D in patient.viruses) if(!D.hidden[SCANNER]) foundVirus++ - if(patient.virus2) - foundVirus++ + + for (var/ID in patient.virus2) + if (ID in virusDB) + foundVirus = 1 + break holder = patient.hud_list[HEALTH_HUD] if(patient.stat == 2) diff --git a/code/game/objects/effects/barsign.dm b/code/game/objects/effects/barsign.dm index fc6278187e..c5cc289356 100644 --- a/code/game/objects/effects/barsign.dm +++ b/code/game/objects/effects/barsign.dm @@ -1,4 +1,4 @@ -/obj/effect/sign/barsign +/obj/effect/sign/double/barsign icon = 'barsigns.dmi' icon_state = "empty" anchored = 1 diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 172eca9ae9..911a63c0e4 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -11,7 +11,7 @@ random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7") var/list/viruses = list() blood_DNA = list() - var/datum/disease2/disease/virus2 = null + var/list/datum/disease2/disease/virus2 = list() var/amount = 5 /obj/effect/decal/cleanable/blood/Del() @@ -144,4 +144,4 @@ icon = 'blood.dmi' icon_state = "mucus" random_icon_states = list("mucus") - var/datum/disease2/disease/virus2 = null + var/list/datum/disease2/disease/virus2 = list() diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 78cf9617fd..c55684eb19 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -113,9 +113,10 @@ var/datum/organ/external/temp = user:organs_by_name["r_hand"] if (user.hand) temp = user:organs_by_name["l_hand"] - if(temp && temp.status & ORGAN_DESTROYED) - user << " Yo- wait a minute." + if(temp && !temp.is_usable()) + user << "You try to move your [temp.display_name], but cannot!" return + if (istype(src.loc, /obj/item/weapon/storage)) var/obj/item/weapon/storage/S = src.loc S.remove_from_storage(src) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index f86f38cc83..bef800f0fa 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -129,8 +129,13 @@ MASS SPECTROMETER if (istype(M, /mob/living/carbon)) if(M:reagents.total_volume > 0) user.show_message(text("\red Warning: Unknown substance detected in subject's blood.")) - if(M:virus2) - user.show_message(text("\red Warning: Unknown pathogen detected in subject's blood.")) + if(M:virus2.len) + var/mob/living/carbon/C = M + for (var/ID in C.virus2) + if (ID in virusDB) + var/datum/data/record/V = virusDB[ID] + user.show_message(text("\red Warning: Pathogen [V.fields["name"]] detected in subject's blood. Known antigen : [V.fields["antigen"]]")) +// user.show_message(text("\red Warning: Unknown pathogen detected in subject's blood.")) if (M.getCloneLoss()) user.show_message("\red Subject appears to have been imperfectly cloned.") for(var/datum/disease/D in M.viruses) @@ -174,6 +179,7 @@ MASS SPECTROMETER user.show_message("\red Warning: Blood Level CRITICAL: [blood_percent]% [blood_volume]cl") else user.show_message("\blue Blood Level Normal: [blood_percent]% [blood_volume]cl") + user.show_message("\blue Subject's pulse: [H.get_pulse(GETPULSE_TOOL)] bpm.") src.add_fingerprint(user) return diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 1e8bc3891b..6020cc834a 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -32,7 +32,6 @@ R.icon_state = "robot" del(R.module) R.module = null - R.modtype = "robot" R.updatename("Default") R.status_flags |= CANPUSH R.updateicon() @@ -52,6 +51,7 @@ /obj/item/borg/upgrade/rename/action(var/mob/living/silicon/robot/R) if(..()) return 0 R.name = heldname + R.custom_name = heldname R.real_name = heldname return 1 diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 3671b6ce08..42def9a2b7 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -253,4 +253,4 @@ var/global/list/datum/stack_recipe/silver_recipes = list ( \ throw_speed = 3 throw_range = 3 origin_tech = "materials=4" - perunit = 2000 \ No newline at end of file + perunit = 2000 diff --git a/code/game/objects/items/weapons/power_cells.dm b/code/game/objects/items/weapons/power_cells.dm index 472e28852f..1fb480596b 100644 --- a/code/game/objects/items/weapons/power_cells.dm +++ b/code/game/objects/items/weapons/power_cells.dm @@ -111,4 +111,4 @@ maxcharge = 10000 maxcharge = 10000 m_amt = 0 - g_amt = 0 \ No newline at end of file + g_amt = 0 diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index 3c60005f75..6fb0ab4cc9 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -201,3 +201,56 @@ desc = "A packet of six imported DromedaryCo cancer sticks. A label on the packaging reads, \"Wouldn't a slow death make a change?\"" icon_state = "Dpacket" item_state = "Dpacket" + + +/* + * Vial Box + */ + +/obj/item/weapon/storage/fancy/vials + icon = 'icons/obj/vialbox.dmi' + icon_state = "vialbox6" + icon_type = "vial" + name = "vial storage box" + storage_slots = 6 + can_hold = list("/obj/item/weapon/reagent_containers/glass/beaker/vial") + + +/obj/item/weapon/storage/fancy/vials/New() + ..() + for(var/i=1; i <= storage_slots; i++) + new /obj/item/weapon/reagent_containers/glass/beaker/vial(src) + return + +/obj/item/weapon/storage/lockbox/vials + name = "secure vial storage box" + desc = "A locked box for keeping things away from children." + icon = 'icons/obj/vialbox.dmi' + icon_state = "vialbox0" + item_state = "syringe_kit" + max_w_class = 3 + can_hold = list("/obj/item/weapon/reagent_containers/glass/beaker/vial") + max_combined_w_class = 14 //The sum of the w_classes of all the items in this storage item. + storage_slots = 6 + req_access = list(access_virology) + +/obj/item/weapon/storage/lockbox/vials/New() + ..() + update_icon() + +/obj/item/weapon/storage/lockbox/vials/update_icon(var/itemremoved = 0) + var/total_contents = src.contents.len - itemremoved + src.icon_state = "vialbox[total_contents]" + src.overlays.Cut() + if (!broken) + overlays += image(icon, src, "led[locked]") + if(locked) + overlays += image(icon, src, "cover") + else + overlays += image(icon, src, "ledb") + return + +/obj/item/weapon/storage/lockbox/vials/attackby(obj/item/weapon/W as obj, mob/user as mob) + ..() + update_icon() + diff --git a/code/game/objects/structures/barsign.dm b/code/game/objects/structures/barsign.dm index 3164bf90ea..651c7fb590 100644 --- a/code/game/objects/structures/barsign.dm +++ b/code/game/objects/structures/barsign.dm @@ -1,4 +1,4 @@ -/obj/structure/sign/barsign +/obj/structure/sign/double/barsign icon = 'barsigns.dmi' icon_state = "empty" anchored = 1 diff --git a/code/game/objects/structures/crates_lockers/closets/l3closet.dm b/code/game/objects/structures/crates_lockers/closets/l3closet.dm index 6e7591868a..97062911dd 100644 --- a/code/game/objects/structures/crates_lockers/closets/l3closet.dm +++ b/code/game/objects/structures/crates_lockers/closets/l3closet.dm @@ -36,6 +36,8 @@ contents = list() new /obj/item/clothing/suit/bio_suit/virology( src ) new /obj/item/clothing/head/bio_hood/virology( src ) + new /obj/item/clothing/mask/breath(src) + new /obj/item/weapon/tank/oxygen(src) /obj/structure/closet/l3closet/security diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm index d955d5cca8..7827749fa1 100644 --- a/code/game/objects/structures/signs.dm +++ b/code/game/objects/structures/signs.dm @@ -19,20 +19,60 @@ else return - /obj/structure/sign/blob_act() del(src) return +/obj/structure/sign/attackby(obj/item/tool as obj, mob/user as mob) //deconstruction + if(istype(tool, /obj/item/weapon/screwdriver) && !istype(src, /obj/structure/sign/double)) + user << "You unfasten the sign with your [tool]." + var/obj/item/sign/S = new(src.loc) + S.name = name + S.desc = desc + S.icon_state = icon_state + //var/icon/I = icon('icons/obj/decals.dmi', icon_state) + //S.icon = I.Scale(24, 24) + S.sign_state = icon_state + del(src) + else ..() -/obj/structure/sign/map +/obj/item/sign + name = "sign" + desc = "" + icon = 'icons/obj/decals.dmi' + w_class = 3 //big + var/sign_state = "" + +/obj/item/sign/attackby(obj/item/tool as obj, mob/user as mob) //construction + if(istype(tool, /obj/item/weapon/screwdriver) && isturf(user.loc)) + var/direction = input("In which direction?", "Select direction.") in list("North", "East", "South", "West", "Cancel") + if(direction == "Cancel") return + var/obj/structure/sign/S = new(user.loc) + switch(direction) + if("North") + S.pixel_y = 32 + if("East") + S.pixel_x = 32 + if("South") + S.pixel_y = -32 + if("West") + S.pixel_x = -32 + else return + S.name = name + S.desc = desc + S.icon_state = sign_state + user << "You fasten \the [S] with your [tool]." + del(src) + else ..() + +/obj/structure/sign/double/map name = "station map" desc = "A framed picture of the station." -/obj/structure/sign/map/left +/obj/structure/sign/double/map/left icon_state = "map-left" -/obj/structure/sign/map/right +/obj/structure/sign/double/map/right icon_state = "map-right" /obj/structure/sign/securearea @@ -75,13 +115,11 @@ desc = "A warning sign which reads 'DANGER: FIRE'" icon_state = "fire" - /obj/structure/sign/nosmoking_1 name = "\improper NO SMOKING" desc = "A warning sign which reads 'NO SMOKING'" icon_state = "nosmoking" - /obj/structure/sign/nosmoking_2 name = "\improper NO SMOKING" desc = "A warning sign which reads 'NO SMOKING'" @@ -112,14 +150,14 @@ desc = "This plaque commemorates the fall of the Atmos FEA division. For all the charred, dizzy, and brittle men who have died in its hands." icon_state = "atmosplaque" -/obj/structure/sign/maltesefalcon //The sign is 64x32, so it needs two tiles. ;3 +/obj/structure/sign/double/maltesefalcon //The sign is 64x32, so it needs two tiles. ;3 name = "The Maltese Falcon" desc = "The Maltese Falcon, Space Bar and Grill." -/obj/structure/sign/maltesefalcon/left +/obj/structure/sign/double/maltesefalcon/left icon_state = "maltesefalcon-left" -/obj/structure/sign/maltesefalcon/right +/obj/structure/sign/double/maltesefalcon/right icon_state = "maltesefalcon-right" /obj/structure/sign/science //These 3 have multiple types, just var-edit the icon_state to whatever one you want on the map diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index 16d88a0ea0..6432f1bac7 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -107,11 +107,15 @@ for(var/obj/effect/decal/cleanable/blood/B in contents) if(!B.blood_DNA[M.dna.unique_enzymes]) B.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type + if (M.virus2.len) + B.virus2 |= virus_copylist(M.virus2) return 1 //we bloodied the floor //if there isn't a blood decal already, make one. var/obj/effect/decal/cleanable/blood/newblood = new /obj/effect/decal/cleanable/blood(src) newblood.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type + if (M.virus2.len) + newblood.virus2 |= virus_copylist(M.virus2) return 1 //we bloodied the floor @@ -120,6 +124,8 @@ if( istype(M, /mob/living/carbon/monkey) || istype(M, /mob/living/carbon/human)) var/obj/effect/decal/cleanable/blood/this = new /obj/effect/decal/cleanable/blood(src) this.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type + if (M.virus2.len) + this.virus2 = virus_copylist(M.virus2) else if( istype(M, /mob/living/carbon/alien )) var/obj/effect/decal/cleanable/xenoblood/this = new /obj/effect/decal/cleanable/xenoblood(src) diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index edabcfe1c9..e3fff70f36 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -53,8 +53,10 @@ for(var/datum/disease/D in patient.viruses) if(!D.hidden[SCANNER]) foundVirus++ - if(patient.virus2) - foundVirus++ + for (var/ID in patient.virus2) + if (ID in virusDB) + foundVirus = 1 + break if(!C) continue holder = patient.hud_list[HEALTH_HUD] diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index 14b40a6a76..42307b1708 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -318,6 +318,10 @@ icon_state = "eleanorstone" item_state = "eleanorstone" + volume = 150 + amount_per_transfer_from_this = 10 + possible_transfer_amounts = list(5,10,15,25,30,50,150) + /obj/item/weapon/storage/pill_bottle/fluff/listermedbottle //compactninja: Lister Black name = "Pill bottle (anti-depressants)" desc = "Contains pills used to deal with depression. They appear to be prescribed to Lister Black" diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 8e92cf653d..061f06fe7d 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -455,4 +455,26 @@
"} user << browse(dat, text("window=mob[];size=325x500", name)) onclose(user, "mob[name]") - return \ No newline at end of file + return + +//generates realistic-ish pulse output based on preset levels +/mob/living/carbon/proc/get_pulse(var/method) //method 0 is for hands, 1 is for machines, more accurate + var/temp = 0 //see setup.dm:694 + switch(src.pulse) + if(PULSE_NONE) + return "0" + if(PULSE_SLOW) + temp = rand(40, 60) + return num2text(method ? temp : temp + rand(-10, 10)) + if(PULSE_NORM) + temp = rand(60, 90) + return num2text(method ? temp : temp + rand(-10, 10)) + if(PULSE_FAST) + temp = rand(90, 120) + return num2text(method ? temp : temp + rand(-10, 10)) + if(PULSE_2FAST) + temp = rand(120, 160) + return num2text(method ? temp : temp + rand(-10, 10)) + if(PULSE_THREADY) + return method ? ">250" : "extremely weak and fast, patient's artery feels like a thread" +// output for machines^ ^^^^^^^output for people^^^^^^^^^ \ No newline at end of file diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 2ea08f56a4..6f10e8af79 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -2,8 +2,7 @@ gender = MALE var/list/stomach_contents = list() var/brain_op_stage = 0.0 - var/datum/disease2/disease/virus2 = null - var/list/datum/disease2/disease/resistances2 = list() + var/list/datum/disease2/disease/virus2 = list() var/antibodies = 0 var/silent = null //Can't talk. Value goes down every life proc. @@ -19,4 +18,6 @@ //Surgery info var/datum/surgery_status/op_stage = new/datum/surgery_status //Active emote/pose - var/pose = null \ No newline at end of file + var/pose = null + + var/pulse = PULSE_NORM //current pulse level diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 20f56dd022..ed033f4d6f 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -199,29 +199,19 @@ var/distance = get_dist(usr,src) if(istype(usr, /mob/dead/observer) || usr.stat == 2) // ghosts can see anything distance = 1 - if (src.stat == 1 || stat == 2) + if (src.stat) msg += "[t_He] [t_is]n't responding to anything around [t_him] and seems to be asleep.\n" if((stat == 2 || src.health < config.health_threshold_crit) && distance <= 3) msg += "[t_He] does not appear to be breathing.\n" - if(istype(usr, /mob/living/carbon/human) && usr.stat == 0 && src.stat == 1 && distance <= 1) + if(istype(usr, /mob/living/carbon/human) && !usr.stat && distance <= 1) for(var/mob/O in viewers(usr.loc, null)) O.show_message("[usr] checks [src]'s pulse.", 1) - spawn(15) - usr << "\blue [t_He] has a pulse!" - - if (src.stat == 2 || (status_flags & FAKEDEATH)) - if(distance <= 1) - if(istype(usr, /mob/living/carbon/human) && usr.stat == 0) - for(var/mob/O in viewers(usr.loc, null)) - O.show_message("[usr] checks [src]'s pulse.", 1) - spawn(15) - var/foundghost = 0 - if(src.client) - foundghost = 1 - if(!foundghost) - usr << "[t_He] has no pulse and [t_his] soul has departed..." + spawn(15) + if(distance <= 1 && usr.stat != 1) + if(pulse == PULSE_NONE) + usr << "[t_He] has no pulse[src.client ? "" : " and [t_his] soul has departed"]..." else - usr << "[t_He] has no pulse..." + usr << "[t_He] has a pulse!" msg += "" diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 9bfba32b28..7c394844d5 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1213,3 +1213,36 @@ mob/living/carbon/human/yank_out_object() organ.status |= ORGAN_BLEEDING organ.take_damage(rand(1,3), 0, 0) src.adjustToxLoss(rand(1,3)) + +/mob/living/carbon/human/verb/check_pulse() + set category = "Object" + set name = "Check pulse" + set desc = "Approximately count somebody's pulse. Requires you to stand still at least 6 seconds." + set src in view(1) + var/self = 0 + + if(usr.stat == 1 || usr.restrained() || !isliving(usr)) return + + if(usr == src) + self = 1 + if(!self) + usr.visible_message("\blue [usr] kneels down, puts \his hand on [src]'s wrist and begins counting their pulse.",\ + "You begin counting [src]'s pulse") + else + usr.visible_message("\blue [usr] begins counting their pulse.",\ + "You begin counting your pulse.") + + if(src.pulse) + usr << "\blue [self ? "You have a" : "[src] has a"] pulse! Counting..." + else + usr << "\red [src] has no pulse!" //it is REALLY UNLIKELY that a dead person would check his own pulse + return + + usr << "Don't move until counting is finished." + var/time = world.timeofday + sleep(60) + if(usr.l_move_time >= time) //checks if our mob has moved during the sleep() + usr << "You moved while counting. Try again." + else + usr << "\blue [self ? "Your" : "[src]'s"] pulse is [src.get_pulse(GETPULSE_HAND)]." + diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index bdf4970235..205dcf5b34 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -113,6 +113,8 @@ handle_regular_hud_updates() + pulse = handle_pulse() + // Grabbing for(var/obj/item/weapon/grab/G in src) G.process() @@ -542,17 +544,20 @@ if(stat != 2) stabilize_temperature_from_calories() +// log_debug("Adjusting to atmosphere.") //After then, it reacts to the surrounding atmosphere based on your thermal protection - if(loc_temp < bodytemperature) - //Place is colder than we are + if(loc_temp < BODYTEMP_COLD_DAMAGE_LIMIT) //Place is colder than we are var/thermal_protection = get_cold_protection(loc_temp) //This returns a 0 - 1 value, which corresponds to the percentage of protection based on what you're wearing and what you're exposed to. if(thermal_protection < 1) - bodytemperature += min((1-thermal_protection) * ((loc_temp - bodytemperature) / BODYTEMP_COLD_DIVISOR), BODYTEMP_COOLING_MAX) - else - //Place is hotter than we are + var/amt = min((1-thermal_protection) * ((loc_temp - bodytemperature) / BODYTEMP_COLD_DIVISOR), BODYTEMP_COOLING_MAX) +// log_debug("[loc_temp] is Cold. Cooling by [amt]") + bodytemperature += amt + else if (loc_temp > BODYTEMP_HEAT_DAMAGE_LIMIT) //Place is hotter than we are var/thermal_protection = get_heat_protection(loc_temp) //This returns a 0 - 1 value, which corresponds to the percentage of protection based on what you're wearing and what you're exposed to. if(thermal_protection < 1) - bodytemperature += min((1-thermal_protection) * ((loc_temp - bodytemperature) / BODYTEMP_HEAT_DIVISOR), BODYTEMP_HEATING_MAX) + var/amt = min((1-thermal_protection) * ((loc_temp - bodytemperature) / BODYTEMP_HEAT_DIVISOR), BODYTEMP_HEATING_MAX) +// log_debug("[loc_temp] is Heat. Heating up by [amt]") + bodytemperature += amt // +/- 50 degrees from 310.15K is the 'safe' zone, where no damage is dealt. if(bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT) @@ -632,19 +637,25 @@ */ proc/stabilize_temperature_from_calories() + var/body_temperature_difference = 310.15 - bodytemperature + if (abs(body_temperature_difference) < 0.01) + return //fuck this precision switch(bodytemperature) if(-INFINITY to 260.15) //260.15 is 310.15 - 50, the temperature where you start to feel effects. if(nutrition >= 2) //If we are very, very cold we'll use up quite a bit of nutriment to heat us up. nutrition -= 2 - var/body_temperature_difference = 310.15 - bodytemperature - bodytemperature += max((body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR), BODYTEMP_AUTORECOVERY_MINIMUM) + var/recovery_amt = max((body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR), BODYTEMP_AUTORECOVERY_MINIMUM) +// log_debug("Cold. Difference = [body_temperature_difference]. Recovering [recovery_amt]") + bodytemperature += recovery_amt if(260.15 to 360.15) - var/body_temperature_difference = 310.15 - bodytemperature - bodytemperature += body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR + var/recovery_amt = body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR +// log_debug("Norm. Difference = [body_temperature_difference]. Recovering [recovery_amt]") + bodytemperature += recovery_amt if(360.15 to INFINITY) //360.15 is 310.15 + 50, the temperature where you start to feel effects. //We totally need a sweat system cause it totally makes sense...~ - var/body_temperature_difference = 310.15 - bodytemperature - bodytemperature += min((body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR), -BODYTEMP_AUTORECOVERY_MINIMUM) //We're dealing with negative numbers + var/recovery_amt = min((body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR), -BODYTEMP_AUTORECOVERY_MINIMUM) //We're dealing with negative numbers +// log_debug("Hot. Difference = [body_temperature_difference]. Recovering [recovery_amt]") + bodytemperature += recovery_amt //This proc returns a number made up of the flags for body parts which you are protected on. (such as HEAD, UPPER_TORSO, LOWER_TORSO, etc. See setup.dm for the full list) proc/get_heat_protection_flags(temperature) //Temperature is the temperature you're being exposed to. @@ -1332,28 +1343,35 @@ if(bodytemperature > 406) for(var/datum/disease/D in viruses) D.cure() - if(virus2) virus2.cure(src) - if(!virus2) - for(var/obj/effect/decal/cleanable/blood/B in view(1,src)) - if(B.virus2 && get_infection_chance()) - infect_virus2(src,B.virus2) - for(var/obj/effect/decal/cleanable/mucus/M in view(1,src)) - if(M.virus2 && get_infection_chance()) - infect_virus2(src,M.virus2) - else - if(isnull(virus2)) // Trying to figure out a runtime error that keeps repeating + for (var/ID in virus2) + var/datum/disease2/disease/V = virus2[ID] + V.cure(src) + + for(var/obj/effect/decal/cleanable/blood/B in view(1,src)) + if(B.virus2.len && get_infection_chance(src)) + for (var/ID in B.virus2) + var/datum/disease2/disease/V = virus2[ID] + infect_virus2(src,V) + for(var/obj/effect/decal/cleanable/mucus/M in view(1,src)) + if(M.virus2.len && get_infection_chance(src)) + for (var/ID in M.virus2) + var/datum/disease2/disease/V = virus2[ID] + infect_virus2(src,V) + + for (var/ID in virus2) + var/datum/disease2/disease/V = virus2[ID] + if(isnull(V)) // Trying to figure out a runtime error that keeps repeating CRASH("virus2 nulled before calling activate()") else - virus2.activate(src) - + V.activate(src) // activate may have deleted the virus - if(!virus2) return + if(!V) continue // check if we're immune - if(virus2.antigen & src.antibodies) virus2.dead = 1 + if(V.antigen & src.antibodies) + V.dead = 1 - - return + return proc/handle_stomach() spawn(0) @@ -1414,5 +1432,34 @@ if (shock_stage > 80) Paralyse(rand(15,28)) + proc/handle_pulse() + if(life_tick % 5) return pulse //update pulse every 5 life ticks (~1 tick/sec, depending on server load) + + if(stat == DEAD) + return PULSE_NONE //that's it, you're dead, nothing can influence your pulse + + var/temp = PULSE_NORM + + if(round(vessel.get_reagent_amount("blood")) <= BLOOD_VOLUME_BAD) //how much blood do we have + temp = PULSE_THREADY //not enough :( + + if(status_flags & FAKEDEATH) + temp = PULSE_NONE //pretend that we're dead. unlike actual death, can be inflienced by meds + + for(var/datum/reagent/R in reagents.reagent_list) + if(R.id in bradycardics) + if(temp <= PULSE_THREADY && temp >= PULSE_NORM) + temp-- + break //one reagent is enough + //comment out the breaks to make med effects stack + for(var/datum/reagent/R in reagents.reagent_list) //handles different chems' influence on pulse + if(R.id in tachycardics) + if(temp <= PULSE_FAST && temp >= PULSE_NONE) + temp++ + break + + return temp + + #undef HUMAN_MAX_OXYLOSS #undef HUMAN_CRIT_MAX_OXYLOSS diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm index b1fe07b32f..ce68c8710d 100644 --- a/code/modules/mob/living/carbon/monkey/life.dm +++ b/code/modules/mob/living/carbon/monkey/life.dm @@ -150,28 +150,40 @@ emote("gasp") updatehealth() - proc/handle_virus_updates()//copypaste from mob/carbon/human/life.dm + proc/handle_virus_updates() + if(status_flags & GODMODE) return 0 //godmode if(bodytemperature > 406) for(var/datum/disease/D in viruses) D.cure() - if(!virus2) - for(var/obj/effect/decal/cleanable/blood/B in view(1,src)) - if(B.virus2 && get_infection_chance()) - infect_virus2(src,B.virus2) - for(var/obj/effect/decal/cleanable/mucus/M in view(1,src)) - if(M.virus2 && get_infection_chance()) - infect_virus2(src,M.virus2) - else - if(isnull(virus2)) // Trying to figure out a runtime error that keeps repeating + for (var/ID in virus2) + var/datum/disease2/disease/V = virus2[ID] + V.cure(src) + + for(var/obj/effect/decal/cleanable/blood/B in view(1,src)) + if(B.virus2.len && get_infection_chance(src)) + for (var/ID in B.virus2) + var/datum/disease2/disease/V = virus2[ID] + infect_virus2(src,V) + for(var/obj/effect/decal/cleanable/mucus/M in view(1,src)) + if(M.virus2.len && get_infection_chance(src)) + for (var/ID in M.virus2) + var/datum/disease2/disease/V = virus2[ID] + infect_virus2(src,V) + + for (var/ID in virus2) + var/datum/disease2/disease/V = virus2[ID] + if(isnull(V)) // Trying to figure out a runtime error that keeps repeating CRASH("virus2 nulled before calling activate()") else - virus2.activate(src) - + V.activate(src) // activate may have deleted the virus - if(!virus2) return + if(!V) continue // check if we're immune - if(virus2.antigen & src.antibodies) virus2.dead = 1 + if(V.antigen & src.antibodies) + V.dead = 1 + + return proc/breathe() if(reagents) diff --git a/code/modules/mob/living/silicon/pai/hud.dm b/code/modules/mob/living/silicon/pai/hud.dm index c8c8bb3a66..74d5ec8f87 100644 --- a/code/modules/mob/living/silicon/pai/hud.dm +++ b/code/modules/mob/living/silicon/pai/hud.dm @@ -59,8 +59,11 @@ for(var/datum/disease/D in patient.viruses) if(!D.hidden[SCANNER]) foundVirus++ - if(patient.virus2) - foundVirus++ + + for (var/ID in patient.virus2) + if (ID in virusDB) + foundVirus = 1 + break holder = patient.hud_list[HEALTH_HUD] if(patient.stat == 2) diff --git a/code/modules/mob/living/silicon/robot/examine.dm b/code/modules/mob/living/silicon/robot/examine.dm index 98943f9988..2a9886dee1 100644 --- a/code/modules/mob/living/silicon/robot/examine.dm +++ b/code/modules/mob/living/silicon/robot/examine.dm @@ -6,7 +6,7 @@ usr << "Something is there but you can't see it." return - var/msg = "*---------*\nThis is \icon[src] \a [src]!\n" + var/msg = "*---------*\nThis is \icon[src] \a [src][custom_name ? ", [modtype] [braintype]" : ""]!\n" msg += "" if (src.getBruteLoss()) if (src.getBruteLoss() < 75) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 0016ee9720..cd24321bbb 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -48,7 +48,7 @@ //var/list/laws = list() var/alarms = list("Motion"=list(), "Fire"=list(), "Atmosphere"=list(), "Power"=list(), "Camera"=list()) var/viewalerts = 0 - var/modtype = "robot" + var/modtype = "Default" var/lower_mod = 0 var/jetpack = 0 var/datum/effect/effect/system/ion_trail_follow/ion_trail = null @@ -87,7 +87,7 @@ module = new /obj/item/weapon/robot_module/syndicate(src) hands.icon_state = "standard" icon_state = "secborg" - modtype = "Synd" + modtype = "Security" else laws = new /datum/ai_laws/nanotrasen() connected_ai = select_active_ai_with_fewest_borgs() @@ -151,7 +151,7 @@ if(crisis && security_level == SEC_LEVEL_RED) //Leaving this in until it's balanced appropriately. src << "\red Crisis mode active. Combat module available." modules+="Combat" - var/mod = input("Please, select a module!", "Robot", null, null) in modules + modtype = input("Please, select a module!", "Robot", null, null) in modules var/module_sprites[0] //Used to store the associations between sprite names and sprite index. var/channels = list() @@ -159,17 +159,15 @@ if(module) return - switch(mod) + switch(modtype) if("Standard") module = new /obj/item/weapon/robot_module/standard(src) - modtype = "Stand" module_sprites["Basic"] = "robot_old" module_sprites["Android"] = "droid" module_sprites["Default"] = "robot" if("Service") module = new /obj/item/weapon/robot_module/butler(src) - modtype = "Butler" module_sprites["Waitress"] = "Service" module_sprites["Kent"] = "toiletbot" module_sprites["Bro"] = "Brobot" @@ -178,7 +176,6 @@ if("Miner") module = new /obj/item/weapon/robot_module/miner(src) - modtype = "Miner" channels = list("Supply" = 1) module_sprites["Basic"] = "Miner_old" module_sprites["Advanced Droid"] = "droid-miner" @@ -186,7 +183,6 @@ if("Medical") module = new /obj/item/weapon/robot_module/medical(src) - modtype = "Med" channels = list("Medical" = 1) module_sprites["Basic"] = "Medbot" module_sprites["Advanced Droid"] = "droid-medical" @@ -195,7 +191,6 @@ if("Security") module = new /obj/item/weapon/robot_module/security(src) - modtype = "Sec" channels = list("Security" = 1) module_sprites["Basic"] = "secborg" module_sprites["Red Knight"] = "Security" @@ -205,7 +200,6 @@ if("Engineering") module = new /obj/item/weapon/robot_module/engineering(src) - modtype = "Eng" channels = list("Engineering" = 1) module_sprites["Basic"] = "Engineering" module_sprites["Antique"] = "engineerrobot" @@ -213,26 +207,24 @@ if("Janitor") module = new /obj/item/weapon/robot_module/janitor(src) - modtype = "Jan" module_sprites["Basic"] = "JanBot2" module_sprites["Mopbot"] = "janitorrobot" module_sprites["Mop Gear Rex"] = "mopgearrex" if("Combat") module = new /obj/item/weapon/robot_module/combat(src) - modtype = "Com" module_sprites["Combat Android"] = "droid-combat" channels = list("Security" = 1) //Custom_sprite check and entry if (custom_sprite == 1) - module_sprites["Custom"] = "[src.ckey]-[mod]" + module_sprites["Custom"] = "[src.ckey]-[modtype]" - hands.icon_state = lowertext(mod) - feedback_inc("cyborg_[lowertext(mod)]",1) - updatename(mod) + hands.icon_state = lowertext(modtype) + feedback_inc("cyborg_[lowertext(modtype)]",1) + updatename() - if(mod == "Medical" || mod == "Security" || mod == "Combat") + if(modtype == "Medical" || modtype == "Security" || modtype == "Combat") status_flags &= ~CANPUSH choose_icon(6,module_sprites) @@ -240,7 +232,8 @@ base_icon = icon_state /mob/living/silicon/robot/proc/updatename(var/prefix as text) - + if(prefix) + modtype = prefix if(istype(mmi, /obj/item/device/mmi/posibrain)) braintype = "Android" else @@ -250,7 +243,7 @@ if(custom_name) changed_name = custom_name else - changed_name = "[(prefix ? "[prefix] " : "")][braintype]-[num2text(ident)]" + changed_name = "[modtype] [braintype]-[num2text(ident)]" real_name = changed_name name = real_name @@ -288,7 +281,7 @@ if (newname != "") custom_name = newname - updatename("Default") + updatename() updateicon() /mob/living/silicon/robot/verb/cmd_robot_alerts() diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm index 882582e4a3..dd31d28ac7 100644 --- a/code/modules/organs/blood.dm +++ b/code/modules/organs/blood.dm @@ -163,8 +163,9 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 //set reagent data B.data["donor"] = src - if(src.virus2) - B.data["virus2"] = src.virus2.getcopy() + if (!B.data["virus2"]) + B.data["virus2"] = list() + B.data["virus2"] |= virus_copylist(src.virus2) B.data["antibodies"] = src.antibodies B.data["blood_DNA"] = copytext(src.dna.unique_enzymes,1,0) if(src.resistances && src.resistances.len) @@ -188,27 +189,35 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 . = ..() vessel.remove_reagent("blood",amount) // Removes blood if human -//Transfers blood from container ot vessels, respecting blood types compatability. -/mob/living/carbon/human/proc/inject_blood(obj/item/weapon/reagent_containers/container, var/amount) - var/datum/reagent/blood/our = get_blood(vessel) +//Transfers blood from container ot vessels +/mob/living/carbon/proc/inject_blood(obj/item/weapon/reagent_containers/container, var/amount) var/datum/reagent/blood/injected = get_blood(container.reagents) if (!injected) return + src.virus2 |= virus_copylist(injected.data["virus2"]) + if (injected.data["antibodies"] && prob(5)) + antibodies |= injected.data["antibodies"] + var/list/chems = list() + chems = params2list(injected.data["trace_chem"]) + for(var/C in chems) + src.reagents.add_reagent(C, (text2num(chems[C]) / 560) * amount)//adds trace chemicals to owner's blood + reagents.update_total() + + container.reagents.remove_reagent("blood", amount) + +//Transfers blood from container ot vessels, respecting blood types compatability. +/mob/living/carbon/human/inject_blood(obj/item/weapon/reagent_containers/container, var/amount) + var/datum/reagent/blood/our = get_blood(vessel) + var/datum/reagent/blood/injected = get_blood(container.reagents) + if (!injected || !our) + return if(blood_incompatible(injected.data["blood_type"],our.data["blood_type"]) ) reagents.add_reagent("toxin",amount * 0.5) reagents.update_total() else vessel.add_reagent("blood", amount, injected.data) vessel.update_total() - - var/list/chems = list() - chems = params2list(injected.data["trace_chem"]) - for(var/C in chems) - src.reagents.add_reagent(C, (text2num(chems[C]) / 560) * amount)//adds trace chemicals to owner's blood - //world << "added [(text2num(chems[C])/560) * amount] = [text2num(chems[C])]/560*[amount] units of [C] to [src]" //DEBUG - reagents.update_total() - - container.reagents.remove_reagent("blood", amount) + ..() //Gets human's own blood. /mob/living/carbon/proc/get_blood(datum/reagents/container) diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index 16cf913d5a..7c44f5307f 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -114,7 +114,7 @@ del(spark_system) else if(E.name in list("l_leg","l_foot","r_leg","r_foot") && !lying) - if (E.status & ORGAN_DESTROYED || malfunction || (broken && !(E.status & ORGAN_SPLINTED))) + if (!E.is_usable() || malfunction || (broken && !(E.status & ORGAN_SPLINTED))) leg_tally-- // let it fail even if just foot&leg // standing is poor diff --git a/code/modules/paperwork/handlabeler.dm b/code/modules/paperwork/handlabeler.dm index 8ae7517cb6..6d1008ca8d 100644 --- a/code/modules/paperwork/handlabeler.dm +++ b/code/modules/paperwork/handlabeler.dm @@ -28,6 +28,9 @@ if(issilicon(A)) user << "You can't label cyborgs." return + if(istype(A, /obj/item/weapon/reagent_containers/glass)) + user << "The label can't stick to the [A.name]. (Try using a pen)" + return user.visible_message("[user] labels [A] as [label].", \ "You label [A] as [label].") diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 41c84823a6..35af50877c 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -30,6 +30,15 @@ var/tmp/told_cant_shoot = 0 //So that it doesn't spam them with the fact they cannot hit them. var/firerate = 1 // 0 for one bullet after tarrget moves and aim is lowered, //1 for keep shooting until aim is lowered + var/fire_delay = 6 + var/last_fired = 0 + + proc/ready_to_fire() + if(world.time >= last_fired + fire_delay) + last_fired = world.time + return 1 + else + return 0 proc/load_into_chamber() return 0 @@ -87,6 +96,11 @@ if(!special_check(user)) return + if (!ready_to_fire()) + if (world.time % 3) //to prevent spam + user << "[src] is not ready to fire again!" + return + if(!load_into_chamber()) //CHECK return click_empty(user) diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index 6ed8669912..c7026905b6 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -71,6 +71,8 @@ obj/item/weapon/gun/energy/laser/retro origin_tech = "combat=4;materials=3;powerstorage=3" projectile_type = "/obj/item/projectile/beam/heavylaser" + fire_delay = 20 + isHandgun() return 0 diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm index 73b5b3710c..cd990a66a7 100644 --- a/code/modules/projectiles/guns/energy/pulse.dm +++ b/code/modules/projectiles/guns/energy/pulse.dm @@ -9,7 +9,7 @@ projectile_type = "/obj/item/projectile/beam/pulse" cell_type = "/obj/item/weapon/cell/super" var/mode = 2 - + fire_delay = 25 attack_self(mob/living/user as mob) switch(mode) diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index c5e3ed3784..93a7010d7d 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -9,6 +9,8 @@ ammo_type = "/obj/item/ammo_casing/c9mm" automatic = 1 + fire_delay = 0 + isHandgun() return 0 diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index cfeb4e9de4..81dceaf7eb 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -929,11 +929,15 @@ datum M.apply_effect(2*REM,IRRADIATE,0) // radium may increase your chances to cure a disease if(istype(M,/mob/living/carbon)) // make sure to only use it on carbon mobs - if(M:virus2 && prob(5)) - if(prob(50)) - M.radiation += 50 // curing it that way may kill you instead - M.adjustToxLoss(100) - M:antibodies |= M:virus2.antigen + var/mob/living/carbon/C = M + if(C.virus2.len) + for (var/ID in C.virus2) + var/datum/disease2/disease/V = C.virus2[ID] + if(prob(5)) + if(prob(50)) + M.radiation += 50 // curing it that way may kill you instead + M.adjustToxLoss(100) + M:antibodies |= V.antigen ..() return @@ -3459,4 +3463,4 @@ datum else if(data >= 115 && prob(33)) M.confused = max(M.confused+15,15) ..() - return \ No newline at end of file + return diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index 5c66e44036..f5d3fee5bb 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -501,7 +501,7 @@ datum result = "virusfood" required_reagents = list("water" = 5, "milk" = 5, "oxygen" = 5) result_amount = 15 - +/* mix_virus name = "Mix Virus" id = "mixvirus" @@ -539,7 +539,7 @@ datum var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"] if(D) D.Devolve() - +*/ condensedcapsaicin name = "Condensed Capsaicin" id = "condensedcapsaicin" diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 936362f3fe..9c8b004c47 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -4,6 +4,7 @@ //////////////////////////////////////////////////////////////////////////////// /obj/item/weapon/reagent_containers/glass name = " " + var/base_name = " " desc = " " icon = 'icons/obj/chemical.dmi' icon_state = "null" @@ -13,6 +14,8 @@ volume = 50 flags = FPRINT | TABLEPASS | OPENCONTAINER + var/label_text = "" + var/list/can_be_placed_into = list( /obj/machinery/chem_master/, /obj/machinery/chem_dispenser/, @@ -31,7 +34,12 @@ /obj/machinery/disposal, /obj/machinery/apiary, /mob/living/simple_animal/cow, - /mob/living/simple_animal/hostile/retaliate/goat ) + /mob/living/simple_animal/hostile/retaliate/goat, + /obj/machinery/computer/centrifuge ) + + New() + ..() + base_name = name examine() set src in view() @@ -39,8 +47,7 @@ if (!(usr in view(2)) && usr!=src.loc) return usr << "\blue It contains:" if(reagents && reagents.reagent_list.len) - for(var/datum/reagent/R in reagents.reagent_list) - usr << "\blue [R.volume] units of [R.name]" + usr << "\blue [src.reagents.total_volume] units of liquid." else usr << "\blue Nothing." if (!is_open_container()) @@ -121,6 +128,22 @@ spawn(5) src.reagents.clear_reagents() return + attackby(obj/item/weapon/W as obj, mob/user as mob) + if(istype(W, /obj/item/weapon/pen) || istype(W, /obj/item/device/flashlight/pen)) + var/tmp_label = sanitize(input(user, "Enter a label for [src.name]","Label",src.label_text)) + if(length(tmp_label) > 10) + user << "\red The label can be at most 10 characters long." + else + user << "\blue You set the label to \"[tmp_label]\"." + src.label_text = tmp_label + src.update_name_label() + + proc/update_name_label() + if(src.label_text == "") + src.name = src.base_name + else + src.name = "[src.base_name] ([src.label_text])" + /obj/item/weapon/reagent_containers/glass/beaker name = "beaker" desc = "A beaker. Can hold up to 50 units." @@ -228,6 +251,16 @@ user.drop_from_inventory(src) del(src) +/obj/item/weapon/reagent_containers/glass/beaker/vial + name = "vial" + desc = "Small glass vial. Looks fragile." + icon_state = "vial" + g_amt = 500 + volume = 15 + amount_per_transfer_from_this = 5 + possible_transfer_amounts = list(1,5,15) + flags = FPRINT | TABLEPASS | OPENCONTAINER + /* /obj/item/weapon/reagent_containers/glass/blender_jug name = "Blender Jug" diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 8551a16f2a..d0364d1e4c 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -88,8 +88,7 @@ /obj/item/weapon/reagent_containers/spray/examine() set src in usr ..() - for(var/datum/reagent/R in reagents.reagent_list) - usr << "[round(R.volume)] units of [R.name] left." + usr << "[round(src.reagents.total_volume)] units left." return /obj/item/weapon/reagent_containers/spray/verb/empty() diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index d93ce04229..38e9c6f688 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -154,9 +154,9 @@ B = d break var/trans - if(B && ishuman(target)) - var/mob/living/carbon/human/H = target - H.inject_blood(src,5) + if(B && istype(target,/mob/living/carbon)) + var/mob/living/carbon/C = target + C.inject_blood(src,5) else trans = src.reagents.trans_to(target, amount_per_transfer_from_this) user << "\blue You inject [trans] units of the solution. The syringe now contains [src.reagents.total_volume] units." diff --git a/code/WorkInProgress/virus2/Disease2/analyser.dm b/code/modules/virus2/analyser.dm similarity index 62% rename from code/WorkInProgress/virus2/Disease2/analyser.dm rename to code/modules/virus2/analyser.dm index abc123369a..21471a8379 100644 --- a/code/WorkInProgress/virus2/Disease2/analyser.dm +++ b/code/modules/virus2/analyser.dm @@ -1,75 +1,62 @@ -/obj/machinery/disease2/diseaseanalyser - name = "Disease Analyser" - icon = 'icons/obj/virology.dmi' - icon_state = "analyser" - anchored = 1 - density = 1 - - var/scanning = 0 - var/pause = 0 - - var/obj/item/weapon/virusdish/dish = null - -/obj/machinery/disease2/diseaseanalyser/attackby(var/obj/I as obj, var/mob/user as mob) - if(istype(I,/obj/item/weapon/virusdish)) - var/mob/living/carbon/c = user - if(!dish) - - dish = I - c.drop_item() - I.loc = src - for(var/mob/M in viewers(src)) - if(M == user) continue - M.show_message("\blue [user.name] inserts the [dish.name] in the [src.name]", 3) - - - else - user << "There is already a dish inserted" - - //else - return - - -/obj/machinery/disease2/diseaseanalyser/process() - if(stat & (NOPOWER|BROKEN)) - return - use_power(500) - src.updateDialog() - - - if(scanning) - scanning -= 1 - if(scanning == 0) - var/r = "GNAv2 based virus lifeform" - r += "
Infection rate : [dish.virus2.infectionchance * 10]" - r += "
Spread form : [dish.virus2.spreadtype]" - r += "
Progress Speed : [dish.virus2.stageprob * 10]" - for(var/datum/disease2/effectholder/E in dish.virus2.effects) - r += "
Effect:[E.effect.name]. Strength : [E.multiplier * 8]. Verosity : [E.chance * 15]. Type : [5-E.stage]." - var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(src.loc) - P.info = r - dish.info = r - dish.analysed = 1 - dish.loc = src.loc - dish = null - icon_state = "analyser" - - for(var/mob/O in hearers(src, null)) - O.show_message("\icon[src] \blue The [src.name] prints a sheet of paper", 3) - else if(dish && !scanning && !pause) - if(dish.virus2 && dish.growth > 50) - dish.growth -= 10 - scanning = 25 - icon_state = "analyser_processing" - else - pause = 1 - spawn(25) - dish.loc = src.loc - dish = null - for(var/mob/M in viewers(src)) - M.show_message("\icon[src] \blue The [src.name] buzzes", 2) - pause = 0 - - - - return +/obj/machinery/disease2/diseaseanalyser + name = "Disease Analyser" + icon = 'virology.dmi' + icon_state = "analyser" + anchored = 1 + density = 1 + + var/scanning = 0 + var/pause = 0 + + var/obj/item/weapon/virusdish/dish = null + +/obj/machinery/disease2/diseaseanalyser/attackby(var/obj/I as obj, var/mob/user as mob) + if(istype(I,/obj/item/weapon/virusdish)) + var/mob/living/carbon/c = user + if(!dish) + dish = I + c.drop_item() + I.loc = src + for(var/mob/M in viewers(src)) + if(M == user) continue + M.show_message("\blue [user.name] inserts the [dish.name] in the [src.name]", 3) + else + user << "There is already a dish inserted" + return + + +/obj/machinery/disease2/diseaseanalyser/process() + if(stat & (NOPOWER|BROKEN)) + return + use_power(500) + + if(scanning) + scanning -= 1 + if(scanning == 0) + var/r = dish.virus2.get_info() + + var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(src.loc) + P.info = r + dish.info = r + dish.analysed = 1 + if (dish.virus2.addToDB()) + src.state("\The [src.name] states, \"Added new pathogen to database.\"") + dish.loc = src.loc + dish = null + icon_state = "analyser" + + src.state("\The [src.name] prints a sheet of paper") + + else if(dish && !scanning && !pause) + if(dish.virus2 && dish.growth > 50) + dish.growth -= 10 + scanning = 5 + icon_state = "analyser_processing" + else + pause = 1 + spawn(25) + dish.loc = src.loc + dish = null + src.state("\The [src.name] buzzes") + pause = 0 + return \ No newline at end of file diff --git a/code/modules/virus2/antibodies.dm b/code/modules/virus2/antibodies.dm new file mode 100644 index 0000000000..9d4c63ae2c --- /dev/null +++ b/code/modules/virus2/antibodies.dm @@ -0,0 +1,52 @@ +//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33 + +// reserving some numbers for later special antigens +var/global/const/ANTIGEN_A = 1 +var/global/const/ANTIGEN_B = 2 +var/global/const/ANTIGEN_RH = 4 +var/global/const/ANTIGEN_Q = 8 +var/global/const/ANTIGEN_U = 16 +var/global/const/ANTIGEN_V = 32 +var/global/const/ANTIGEN_X = 64 +var/global/const/ANTIGEN_Y = 128 +var/global/const/ANTIGEN_Z = 256 +var/global/const/ANTIGEN_M = 512 +var/global/const/ANTIGEN_N = 1024 +var/global/const/ANTIGEN_P = 2048 +var/global/const/ANTIGEN_O = 4096 + +var/global/list/ANTIGENS = list( +"[ANTIGEN_A]" = "A", +"[ANTIGEN_B]" = "B", +"[ANTIGEN_RH]" = "RH", +"[ANTIGEN_Q]" = "Q", +"[ANTIGEN_U]" = "U", +"[ANTIGEN_V]" = "V", +"[ANTIGEN_Z]" = "Z", +"[ANTIGEN_M]" = "M", +"[ANTIGEN_N]" = "N", +"[ANTIGEN_P]" = "P", +"[ANTIGEN_O]" = "O" +) + +// pure concentrated antibodies +datum/reagent/antibodies + data = list("antibodies"=0) + name = "Antibodies" + id = "antibodies" + reagent_state = LIQUID + color = "#0050F0" + + reaction_mob(var/mob/M, var/method=TOUCH, var/volume) + if(istype(M,/mob/living/carbon)) + if(src.data && method == INGEST) + if(M:virus2) if(src.data["antibodies"] & M:virus2.antigen) + M:virus2.dead = 1 + M:antibodies |= src.data["antibodies"] + return + +// iterate over the list of antigens and see what matches +/proc/antigens2string(var/antigens) + var/code = "" + for(var/V in ANTIGENS) if(text2num(V) & antigens) code += ANTIGENS[V] + return code \ No newline at end of file diff --git a/code/WorkInProgress/virus2/biohazard destroyer.dm b/code/modules/virus2/biohazard destroyer.dm similarity index 100% rename from code/WorkInProgress/virus2/biohazard destroyer.dm rename to code/modules/virus2/biohazard destroyer.dm diff --git a/code/modules/virus2/centrifuge.dm b/code/modules/virus2/centrifuge.dm new file mode 100644 index 0000000000..aadada0b2d --- /dev/null +++ b/code/modules/virus2/centrifuge.dm @@ -0,0 +1,157 @@ +/obj/machinery/computer/centrifuge + name = "Isolation Centrifuge" + desc = "Used to separate things with different weight. Spin 'em round, round, right round." + icon = 'icons/obj/virology.dmi' + icon_state = "centrifuge" + var/curing + var/isolating + + var/obj/item/weapon/reagent_containers/glass/beaker/vial/sample = null + var/datum/disease2/disease/virus2 = null + +/obj/machinery/computer/centrifuge/attackby(var/obj/I as obj, var/mob/user as mob) + if(istype(I, /obj/item/weapon/screwdriver)) + return ..(I,user) + + if(istype(I,/obj/item/weapon/reagent_containers/glass/beaker/vial)) + var/mob/living/carbon/C = user + if(!sample) + sample = I + C.drop_item() + I.loc = src + + src.attack_hand(user) + return + +/obj/machinery/computer/centrifuge/update_icon() + ..() + if(! (stat & (BROKEN|NOPOWER)) && (isolating || curing)) + icon_state = "centrifuge_moving" + +/obj/machinery/computer/centrifuge/attack_hand(var/mob/user as mob) + if(..()) + return + user.machine = src + var/dat= "" + if(curing) + dat = "Antibody isolation in progress" + else if(isolating) + dat = "Pathogen isolation in progress" + else + dat += "
Blood sample:" + dat += "
" + if(sample) + var/datum/reagent/blood/B = locate(/datum/reagent/blood) in sample.reagents.reagent_list + if(B) + dat += "Sample inserted." + if (B.data["antibodies"]) + dat += "
" + dat += "Antibodies: [antigens2string(B.data["antibodies"])]" + dat += "Isolate" + + var/list/virus = B.data["virus2"] + for (var/ID in virus) + var/datum/disease2/disease/V = virus[ID] + dat += "
pathogen [V.name()]" + dat += "Isolate" + else + dat += "Please check container contents." + dat += "
Eject container" + else + dat = "Please insert a container." + dat += "

" + + dat += "
" + + user << browse(dat, "window=computer;size=400x500") + onclose(user, "computer") + return + +/obj/machinery/computer/centrifuge/process() + ..() + + if(stat & (NOPOWER|BROKEN)) + return + use_power(500) + + if(curing) + curing -= 1 + if(curing == 0) + if(sample) + cure() + update_icon() + if(isolating) + isolating -= 1 + if(isolating == 0) + if(sample) + isolate() + update_icon() + return + +/obj/machinery/computer/centrifuge/Topic(href, href_list) + if(..()) + return + usr.machine = src + + switch(href_list["action"]) + if("antibody") + var/delay = 20 + var/datum/reagent/blood/B = locate(/datum/reagent/blood) in sample.reagents.reagent_list + if (!B) + state("\The [src.name] buzzes, \"No antibody carrier detected.\"", "blue") + return + + if(sample.reagents.has_reagent("toxins")) + state("\The [src.name] beeps, \"Pathogen purging speed above nominal.\"", "blue") + delay = delay/2 + return + + curing = delay + playsound(src.loc, 'sound/machines/juicer.ogg', 50, 1) + update_icon() + + if("isolate") + var/datum/reagent/blood/B = locate(/datum/reagent/blood) in sample.reagents.reagent_list + if (!B) + return + + var/list/virus = virus_copylist(B.data["virus2"]) + var/choice = href_list["isolate"]; + if (choice in virus) + virus2 = virus[choice] + else + state("\The [src.name] buzzes, \"No such pathogen detected.\"", "blue") + return + isolating = 40 + update_icon() + src.updateUsrDialog() + return + + if("sample") + if(sample) + sample.loc = src.loc + sample = null + + src.add_fingerprint(usr) + src.updateUsrDialog() + attack_hand(usr) + return + + +/obj/machinery/computer/centrifuge/proc/cure() + var/datum/reagent/blood/B = locate(/datum/reagent/blood) in sample.reagents.reagent_list + if (!B) + return + + var/list/data = list("antibodies" = B.data["antibodies"]) + var/amt= sample.reagents.get_reagent_amount("blood") + sample.reagents.remove_reagent("blood",amt) + sample.reagents.add_reagent("antibodies",amt,data) + + state("\The [src.name] pings", "blue") + +/obj/machinery/computer/centrifuge/proc/isolate() + var/obj/item/weapon/virusdish/dish = new/obj/item/weapon/virusdish(src.loc) + dish.virus2 = virus2 + + state("\The [src.name] pings", "blue") \ No newline at end of file diff --git a/code/WorkInProgress/virus2/curer.dm b/code/modules/virus2/curer.dm similarity index 61% rename from code/WorkInProgress/virus2/curer.dm rename to code/modules/virus2/curer.dm index 4a7e56c1a1..4d616048d1 100644 --- a/code/WorkInProgress/virus2/curer.dm +++ b/code/modules/virus2/curer.dm @@ -9,31 +9,7 @@ /obj/machinery/computer/curer/attackby(var/obj/I as obj, var/mob/user as mob) if(istype(I, /obj/item/weapon/screwdriver)) - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - if(do_after(user, 20)) - if (src.stat & BROKEN) - user << "\blue The broken glass falls out." - var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) - new /obj/item/weapon/shard( src.loc ) - //var/obj/item/weapon/circuitboard/curer/M = new /obj/item/weapon/circuitboard/curer( A ) - for (var/obj/C in src) - C.loc = src.loc - //A.circuit = M - A.state = 3 - A.icon_state = "3" - A.anchored = 1 - del(src) - else - user << "\blue You disconnect the monitor." - var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) - //var/obj/item/weapon/circuitboard/curer/M = new /obj/item/weapon/circuitboard/curer( A ) - for (var/obj/C in src) - C.loc = src.loc - //A.circuit = M - A.state = 4 - A.icon_state = "4" - A.anchored = 1 - del(src) + return ..(I,user) if(istype(I,/obj/item/weapon/reagent_containers)) var/mob/living/carbon/C = user if(!container) @@ -46,8 +22,8 @@ return var/obj/item/weapon/reagent_containers/glass/beaker/product = new(src.loc) - var/list/data = list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"virus2"=null,"antibodies"=0) - data["virus2"] = I:virus2 + var/list/data = list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"virus2"=list(),"antibodies"=0) + data["virus2"] |= I:virus2 product.reagents.add_reagent("blood",30,data) virusing = 1 @@ -55,7 +31,6 @@ state("The [src.name] Buzzes", "blue") return - //else src.attack_hand(user) return @@ -102,7 +77,6 @@ if(stat & (NOPOWER|BROKEN)) return use_power(500) - //src.updateDialog() if(curing) curing -= 1 @@ -114,16 +88,15 @@ /obj/machinery/computer/curer/Topic(href, href_list) if(..()) return - if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon))) - usr.machine = src + usr.machine = src - if (href_list["antibody"]) - curing = 10 - else if(href_list["eject"]) - container.loc = src.loc - container = null + if (href_list["antibody"]) + curing = 10 + else if(href_list["eject"]) + container.loc = src.loc + container = null - src.add_fingerprint(usr) + src.add_fingerprint(usr) src.updateUsrDialog() return @@ -137,11 +110,4 @@ data["antibodies"] = B.data["antibodies"] product.reagents.add_reagent("antibodies",30,data) - state("The [src.name] Buzzes", "blue") -/* -/obj/machinery/computer/curer/proc/createvirus(var/datum/disease2/disease/virus2) - var/obj/item/weapon/cureimplanter/implanter = new /obj/item/weapon/cureimplanter(src.loc) - implanter.name = "Viral implanter (MAJOR BIOHAZARD)" - implanter.works = 3 - state("The [src.name] Buzzes", "blue") -*/ \ No newline at end of file + state("\The [src.name] buzzes", "blue") diff --git a/code/modules/virus2/disease2.dm b/code/modules/virus2/disease2.dm new file mode 100644 index 0000000000..84fcf486e4 --- /dev/null +++ b/code/modules/virus2/disease2.dm @@ -0,0 +1,164 @@ +/datum/disease2/disease + var/infectionchance = 10 + var/speed = 1 + var/spreadtype = "Blood" // Can also be "Airborne" + var/stage = 1 + var/stageprob = 10 + var/dead = 0 + var/clicks = 0 + var/uniqueID = 0 + var/list/datum/disease2/effectholder/effects = list() + var/antigen = 0 // 16 bits describing the antigens, when one bit is set, a cure with that bit can dock here + var/max_stage = 4 + +/datum/disease2/disease/New() + uniqueID = rand(0,10000) + ..() + +/datum/disease2/disease/proc/makerandom(var/greater=0) + for(var/i=1 ; i <= max_stage ; i++ ) + var/datum/disease2/effectholder/holder = new /datum/disease2/effectholder + holder.stage = i + if(greater) + holder.getrandomeffect(2) + else + holder.getrandomeffect() + effects += holder + uniqueID = rand(0,10000) + infectionchance = rand(1,10) + antigen |= text2num(pick(ANTIGENS)) + antigen |= text2num(pick(ANTIGENS)) + spreadtype = "Airborne" + +/datum/disease2/disease/proc/activate(var/mob/living/carbon/mob) + if(dead) + cure(mob) + return + + if(mob.stat == 2) + return + if(stage <= 1 && clicks == 0) // with a certain chance, the mob may become immune to the disease before it starts properly + if(prob(20)) + mob.antibodies |= antigen // 20% immunity is a good chance IMO, because it allows finding an immune person easily + else + if(mob.radiation > 50) + if(prob(1)) + majormutate() + + //Space antibiotics stop disease completely (temporary) + if(mob.reagents.has_reagent("spaceacillin")) + return + + //Virus food speeds up disease progress + if(mob.reagents.has_reagent("virusfood")) + mob.reagents.remove_reagent("virusfood",0.1) + clicks += 10 + + //Moving to the next stage + if(clicks > stage*100 && prob(10)) + if(stage == max_stage) + src.cure(mob) + mob.antibodies |= src.antigen + stage++ + clicks = 0 + //Do nasty effects + for(var/datum/disease2/effectholder/e in effects) + e.runeffect(mob,stage) + + //fever + mob.bodytemperature = max(mob.bodytemperature, min(310+5*stage ,mob.bodytemperature+5*stage)) + clicks+=speed + +/datum/disease2/disease/proc/cure(var/mob/living/carbon/mob) + for(var/datum/disease2/effectholder/e in effects) + e.effect.deactivate(mob) + mob.virus2.Remove("[uniqueID]") + +/datum/disease2/disease/proc/minormutate() + uniqueID = rand(0,10000) + var/datum/disease2/effectholder/holder = pick(effects) + holder.minormutate() + infectionchance = min(10,infectionchance + rand(0,1)) + +/datum/disease2/disease/proc/majormutate() + uniqueID = rand(0,10000) + var/datum/disease2/effectholder/holder = pick(effects) + holder.majormutate() + if (prob(5)) + antigen = text2num(pick(ANTIGENS)) + antigen |= text2num(pick(ANTIGENS)) + +/datum/disease2/disease/proc/getcopy() + var/datum/disease2/disease/disease = new /datum/disease2/disease + disease.infectionchance = infectionchance + disease.spreadtype = spreadtype + disease.stageprob = stageprob + disease.antigen = antigen + disease.uniqueID = uniqueID + for(var/datum/disease2/effectholder/holder in effects) + var/datum/disease2/effectholder/newholder = new /datum/disease2/effectholder + newholder.effect = new holder.effect.type + newholder.chance = holder.chance + newholder.cure = holder.cure + newholder.multiplier = holder.multiplier + newholder.happensonce = holder.happensonce + newholder.stage = holder.stage + disease.effects += newholder + return disease + +/datum/disease2/disease/proc/issame(var/datum/disease2/disease/disease) + var/list/types = list() + var/list/types2 = list() + for(var/datum/disease2/effectholder/d in effects) + types += d.effect.type + var/equal = 1 + + for(var/datum/disease2/effectholder/d in disease.effects) + types2 += d.effect.type + + for(var/type in types) + if(!(type in types2)) + equal = 0 + + if (antigen != disease.antigen) + equal = 0 + return equal + +/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() + .= "stamm #[add_zero("[uniqueID]", 4)]" + if ("[uniqueID]" in virusDB) + var/datum/data/record/V = virusDB["[uniqueID]"] + .= V.fields["name"] + +/datum/disease2/disease/proc/get_info() + var/r = "GNAv2 based virus lifeform - [name()], #[add_zero("[uniqueID]", 4)]" + r += "
Infection rate : [infectionchance * 10]" + r += "
Spread form : [spreadtype]" + r += "
Progress Speed : [stageprob * 10]" + for(var/datum/disease2/effectholder/E in effects) + r += "
Effect:[E.effect.name]. Strength : [E.multiplier * 8]. Verosity : [E.chance * 15]. Type : [5-E.stage]." + + r += "
Antigen pattern: [antigens2string(antigen)]" + return r + +/datum/disease2/disease/proc/addToDB() + if ("[uniqueID]" in virusDB) + return 0 + var/datum/data/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 diff --git a/code/WorkInProgress/virus2/diseasesplicer.dm b/code/modules/virus2/diseasesplicer.dm similarity index 58% rename from code/WorkInProgress/virus2/diseasesplicer.dm rename to code/modules/virus2/diseasesplicer.dm index 5a558546e4..d1ac117c38 100644 --- a/code/WorkInProgress/virus2/diseasesplicer.dm +++ b/code/modules/virus2/diseasesplicer.dm @@ -13,31 +13,7 @@ /obj/machinery/computer/diseasesplicer/attackby(var/obj/I as obj, var/mob/user as mob) if(istype(I, /obj/item/weapon/screwdriver)) - playsound(src.loc, 'Screwdriver.ogg', 50, 1) - if(do_after(user, 20)) - if (src.stat & BROKEN) - user << "\blue The broken glass falls out." - var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) - new /obj/item/weapon/shard( src.loc ) - //var/obj/item/weapon/circuitboard/diseasesplicer/M = new /obj/item/weapon/circuitboard/diseasesplicer( A ) - for (var/obj/C in src) - C.loc = src.loc - //A.circuit = M - A.state = 3 - A.icon_state = "3" - A.anchored = 1 - del(src) - else - user << "\blue You disconnect the monitor." - var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) - //var/obj/item/weapon/circuitboard/diseasesplicer/M = new /obj/item/weapon/circuitboard/diseasesplicer( A ) - for (var/obj/C in src) - C.loc = src.loc - //A.circuit = M - A.state = 4 - A.icon_state = "4" - A.anchored = 1 - del(src) + return ..(I,user) if(istype(I,/obj/item/weapon/virusdish)) var/mob/living/carbon/c = user if(!dish) @@ -49,8 +25,6 @@ user << "You upload the contents of the disk into the buffer" memorybank = I:effect - - //else src.attack_hand(user) return @@ -117,7 +91,6 @@ if(stat & (NOPOWER|BROKEN)) return use_power(500) - //src.updateDialog() if(scanning) scanning -= 1 @@ -143,44 +116,29 @@ /obj/machinery/computer/diseasesplicer/Topic(href, href_list) if(..()) return - if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon))) - usr.machine = src - if (href_list["grab"]) - memorybank = locate(href_list["grab"]) - analysed = dish.analysed - del(dish) - dish = null - scanning = 10 + if (href_list["grab"]) + memorybank = locate(href_list["grab"]) + analysed = dish.analysed + del(dish) + dish = null + scanning = 10 - else if(href_list["eject"]) - dish.loc = src.loc - dish = null + else if(href_list["eject"]) + dish.loc = src.loc + dish = null - else if(href_list["splice"]) - if(dish) - for(var/datum/disease2/effectholder/e in dish.virus2.effects) - if(e.stage == memorybank.stage) - e.effect = memorybank.effect - splicing = 10 - dish.virus2.spreadtype = "Blood" + else if(href_list["splice"]) + if(dish) + for(var/datum/disease2/effectholder/e in dish.virus2.effects) + if(e.stage == memorybank.stage) + e.effect = memorybank.effect + splicing = 10 +// dish.virus2.spreadtype = "Blood" - else if(href_list["disk"]) - burning = 10 + else if(href_list["disk"]) + burning = 10 - src.add_fingerprint(usr) + src.add_fingerprint(usr) src.updateUsrDialog() return - -/obj/item/weapon/diseasedisk - name = "Blank GNA disk" - icon = 'cloning.dmi' - icon_state = "datadisk0" - var/datum/disease2/effectholder/effect = null - var/stage = 1 - -/obj/item/weapon/diseasedisk/premade/New() - name = "Blank GNA disk (stage: [5-stage])" - effect = new /datum/disease2/effectholder - effect.effect = new /datum/disease2/effect/invisible - effect.stage = stage diff --git a/code/modules/virus2/dishincubator.dm b/code/modules/virus2/dishincubator.dm new file mode 100644 index 0000000000..c8af39777f --- /dev/null +++ b/code/modules/virus2/dishincubator.dm @@ -0,0 +1,167 @@ +/obj/machinery/disease2/incubator/ + name = "Pathogenic incubator" + density = 1 + anchored = 1 + icon = 'virology.dmi' + icon_state = "incubator" + var/obj/item/weapon/virusdish/dish + var/obj/item/weapon/reagent_containers/glass/beaker = null + var/radiation = 0 + + var/on = 0 + var/power = 0 + + var/foodsupply = 0 + var/toxins = 0 + + var/virusing + +/obj/machinery/disease2/incubator/attackby(var/obj/B as obj, var/mob/user as mob) + if(istype(B, /obj/item/weapon/reagent_containers/glass) || istype(B,/obj/item/weapon/reagent_containers/syringe)) + + if(src.beaker) + if(istype(beaker,/obj/item/weapon/reagent_containers/syringe)) + user << "A syringe is already loaded into the machine." + else + user << "A beaker is already loaded into the machine." + return + + src.beaker = B + user.drop_item() + B.loc = src + if(istype(B,/obj/item/weapon/reagent_containers/syringe)) + user << "You add the syringe to the machine!" + src.updateUsrDialog() + else + user << "You add the beaker to the machine!" + src.updateUsrDialog() + else + if(istype(B,/obj/item/weapon/virusdish)) + if(src.dish) + user << "A dish is already loaded into the machine." + return + + src.dish = B + user.drop_item() + B.loc = src + if(istype(B,/obj/item/weapon/virusdish)) + user << "You add the dish to the machine!" + src.updateUsrDialog() + +/obj/machinery/disease2/incubator/Topic(href, href_list) + if(..()) return + + if (href_list["ejectchem"]) + if(beaker) + beaker.loc = src.loc + beaker = null + if(!dish) + return + usr.machine = src + if (href_list["power"]) + on = !on + if(on) + icon_state = "incubator_on" + else + icon_state = "incubator" + if (href_list["ejectdish"]) + if(dish) + dish.loc = src.loc + dish = null + if (href_list["rad"]) + radiation += 10 + if (href_list["flush"]) + radiation = 0 + toxins = 0 + foodsupply = 0 + + if(href_list["virus"]) + if (!dish) + state("\The [src.name] buzzes, \"No viral culture sample detected.\"", "blue") + return + + var/datum/reagent/blood/B = locate(/datum/reagent/blood) in beaker.reagents.reagent_list + if (!B) + state("\The [src.name] buzzes, \"No suitable breeding enviroment detected.\"", "blue") + return + + if (!B.data["virus2"]) + B.data["virus2"] = list() + var/list/virus = list("[dish.virus2.uniqueID]" = dish.virus2.getcopy()) + B.data["virus2"] = virus + + state("\The [src.name] pings, \"Injection complete.\"", "blue") + + + src.add_fingerprint(usr) + src.updateUsrDialog() + +/obj/machinery/disease2/incubator/attack_hand(mob/user as mob) + if(stat & BROKEN) + return + user.machine = src + var/dat = "" + if(!dish) + dat = "Please insert dish into the incubator.
" + var/string = "Off" + if(on) + string = "On" + dat += "Power status : [string]" + dat += "
" + dat += "Food supply : [foodsupply]" + dat += "
" + dat += "Radiation Levels : [radiation] RADS : Radiate" + dat += "
" + dat += "Toxins : [toxins]" + dat += "

" + if(beaker) + dat += "Eject chemicals : Eject" + dat += "
" + if(dish) + dat += "Eject Virus dish : Eject" + dat += "
" + if(beaker) + dat += "Breed viral culture in beaker : Start" + dat += "
" + dat += "

" + dat += "Flush system
" + dat += "Close
" + user << browse("Pathogenic incubatorincubator menu:

[dat]", "window=incubator;size=575x400") + onclose(user, "incubator") + return + +/obj/machinery/disease2/incubator/process() + if(dish && on && dish.virus2) + use_power(50,EQUIP) + if(!powered(EQUIP)) + on = 0 + icon_state = "incubator" + if(foodsupply) + foodsupply -= 1 + dish.growth += 3 + if(dish.growth >= 100) + state("The [src.name] pings", "blue") + if(radiation) + if(radiation > 50 & prob(5)) + dish.virus2.majormutate() + if(dish.info) + dish.info = "OUTDATED : [dish.info]" + dish.analysed = 0 + state("The [src.name] beeps", "blue") + + else if(prob(5)) + dish.virus2.minormutate() + radiation -= 1 + if(toxins && prob(5)) + dish.virus2.infectionchance -= 1 + if(toxins > 50) + dish.virus2 = null + else if(!dish) + on = 0 + icon_state = "incubator" + + if(beaker) + if(!beaker.reagents.remove_reagent("virusfood",5)) + foodsupply += 10 + if(!beaker.reagents.remove_reagent("toxin",1)) + toxins += 1 \ 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 0000000000..ff62376c63 --- /dev/null +++ b/code/modules/virus2/effect.dm @@ -0,0 +1,361 @@ +/datum/disease2/effectholder + var/name = "Holder" + var/datum/disease2/effect/effect + var/chance = 0 //Chance in percentage each tick + var/cure = "" //Type of cure it requires + var/happensonce = 0 + var/multiplier = 1 //The chance the effects are WORSE + var/stage = 0 + +/datum/disease2/effectholder/proc/runeffect(var/mob/living/carbon/human/mob,var/stage) + if(happensonce > -1 && effect.stage <= stage && prob(chance)) + effect.activate(mob) + if(happensonce == 1) + happensonce = -1 + +/datum/disease2/effectholder/proc/getrandomeffect(var/badness = 1) + var/list/datum/disease2/effect/list = list() + for(var/e in (typesof(/datum/disease2/effect) - /datum/disease2/effect)) + var/datum/disease2/effect/f = new e + if (f.badness > badness) //we don't want such strong effects + continue + if(f.stage == src.stage) + list += f + effect = pick(list) + chance = rand(1,6) + +/datum/disease2/effectholder/proc/minormutate() + switch(pick(1,2,3,4,5)) + if(1) + chance = rand(0,effect.chance_maxm) + if(2) + multiplier = rand(1,effect.maxm) + +/datum/disease2/effectholder/proc/majormutate() + getrandomeffect(2) + +//////////////////////////////////////////////////////////////// +////////////////////////EFFECTS///////////////////////////////// +//////////////////////////////////////////////////////////////// + +/datum/disease2/effect + var/chance_maxm = 50 + var/name = "Blanking effect" + var/stage = 4 + var/maxm = 1 + var/badness = 1 + proc/activate(var/mob/living/carbon/mob,var/multiplier) + proc/deactivate(var/mob/living/carbon/mob) + +////////////////////////SPECIAL///////////////////////////////// +/datum/disease2/effect/alien + name = "Unidentified Foreign Body" + stage = 4 + activate(var/mob/living/carbon/mob,var/multiplier) + mob << "\red You feel something tearing its way out of your stomach..." + mob.adjustToxLoss(10) + mob.updatehealth() + if(prob(40)) + if(mob.client) + mob.client.mob = new/mob/living/carbon/alien/larva(mob.loc) + else + new/mob/living/carbon/alien/larva(mob.loc) + var/datum/disease2/disease/D = mob:virus2 + mob:gib() + del D + +/datum/disease2/effect/invisible + name = "Waiting Syndrome" + stage = 1 + activate(var/mob/living/carbon/mob,var/multiplier) + return + +////////////////////////STAGE 4///////////////////////////////// + +/datum/disease2/effect/gibbingtons + name = "Gibbingtons Syndrome" + stage = 4 + badness = 2 + activate(var/mob/living/carbon/mob,var/multiplier) + mob.gib() + +/datum/disease2/effect/radian + name = "Radian's Syndrome" + stage = 4 + maxm = 3 + activate(var/mob/living/carbon/mob,var/multiplier) + mob.radiation += (2*multiplier) + +/datum/disease2/effect/deaf + name = "Dead Ear Syndrome" + stage = 4 + activate(var/mob/living/carbon/mob,var/multiplier) + mob.ear_deaf += 20 + +/datum/disease2/effect/monkey + name = "Monkism Syndrome" + stage = 4 + badness = 2 + activate(var/mob/living/carbon/mob,var/multiplier) + if(istype(mob,/mob/living/carbon/human)) + var/mob/living/carbon/human/h = mob + h.monkeyize() + +/datum/disease2/effect/suicide + name = "Suicidal Syndrome" + stage = 4 + badness = 2 + activate(var/mob/living/carbon/mob,var/multiplier) + mob.suiciding = 1 + //instead of killing them instantly, just put them at -175 health and let 'em gasp for a while + viewers(mob) << "\red [mob.name] is holding \his breath. It looks like \he's trying to commit suicide." + mob.adjustOxyLoss(175 - mob.getToxLoss() - mob.getFireLoss() - mob.getBruteLoss() - mob.getOxyLoss()) + mob.updatehealth() + spawn(200) //in case they get revived by cryo chamber or something stupid like that, let them suicide again in 20 seconds + mob.suiciding = 0 + +/datum/disease2/effect/killertoxins + name = "Toxification Syndrome" + stage = 4 + activate(var/mob/living/carbon/mob,var/multiplier) + mob.adjustToxLoss(15*multiplier) + +/datum/disease2/effect/dna + name = "Reverse Pattern Syndrome" + stage = 4 + activate(var/mob/living/carbon/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 + activate(var/mob/living/carbon/mob,var/multiplier) + if(istype(mob, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = mob + var/datum/organ/external/E = pick(H.organs) + if (!(E.status & ORGAN_DEAD)) + E.status |= ORGAN_DEAD + H << "You can't feel your [E.display_name] anymore..." + mob.adjustToxLoss(15*multiplier) + + deactivate(var/mob/living/carbon/mob,var/multiplier) + if(istype(mob, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = mob + for (var/datum/organ/external/E in H.organs) + E.status ^= ORGAN_DEAD + +/datum/disease2/effect/immortal + name = "Longevity Syndrome" + stage = 4 + activate(var/mob/living/carbon/mob,var/multiplier) + if(istype(mob, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = mob + for (var/datum/organ/external/E in H.organs) + if (E.status & ORGAN_BROKEN && prob(30)) + E.status ^= ORGAN_BROKEN + var/heal_amt = -5*multiplier + mob.apply_damages(heal_amt,heal_amt,heal_amt,heal_amt) + + deactivate(var/mob/living/carbon/mob,var/multiplier) + if(istype(mob, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = mob + H << "You suddenly feel hurt and old..." + H.age += 8 + var/backlash_amt = 5*multiplier + mob.apply_damages(backlash_amt,backlash_amt,backlash_amt,backlash_amt) + +////////////////////////STAGE 3///////////////////////////////// + +/datum/disease2/effect/bones + name = "Fragile Bones Syndrome" + stage = 4 + activate(var/mob/living/carbon/mob,var/multiplier) + if(istype(mob, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = mob + for (var/datum/organ/external/E in H.organs) + E.min_broken_damage = max(5, E.min_broken_damage - 30) + + deactivate(var/mob/living/carbon/mob,var/multiplier) + if(istype(mob, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = mob + for (var/datum/organ/external/E in H.organs) + E.min_broken_damage = initial(E.min_broken_damage) + +/datum/disease2/effect/toxins + name = "Hyperacidity" + stage = 3 + maxm = 3 + activate(var/mob/living/carbon/mob,var/multiplier) + mob.adjustToxLoss((2*multiplier)) + +/datum/disease2/effect/shakey + name = "World Shaking Syndrome" + stage = 3 + maxm = 3 + activate(var/mob/living/carbon/mob,var/multiplier) + shake_camera(mob,5*multiplier) + +/datum/disease2/effect/telepathic + name = "Telepathy Syndrome" + stage = 3 + activate(var/mob/living/carbon/mob,var/multiplier) + mob.dna.check_integrity() + var/newdna = setblock(mob.dna.struc_enzymes,REMOTETALKBLOCK,toggledblock(getblock(mob.dna.struc_enzymes,REMOTETALKBLOCK,3)),3) + mob.dna.struc_enzymes = newdna + domutcheck(mob, null) + +/datum/disease2/effect/mind + name = "Lazy Mind Syndrome" + stage = 3 + activate(var/mob/living/carbon/mob,var/multiplier) + if(istype(mob, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = mob + var/datum/organ/internal/brain/B = H.internal_organs["brain"] + B.take_damage(5) + else + mob.setBrainLoss(50) + +/datum/disease2/effect/hallucinations + name = "Hallucinational Syndrome" + stage = 3 + activate(var/mob/living/carbon/mob,var/multiplier) + mob.hallucination += 25 + +/datum/disease2/effect/deaf + name = "Hard of Hearing Syndrome" + stage = 3 + activate(var/mob/living/carbon/mob,var/multiplier) + mob.ear_deaf = 5 + +/datum/disease2/effect/giggle + name = "Uncontrolled Laughter Effect" + stage = 3 + activate(var/mob/living/carbon/mob,var/multiplier) + mob.say("*giggle") + +/datum/disease2/effect/confusion + name = "Topographical Cretinism" + stage = 3 + activate(var/mob/living/carbon/mob,var/multiplier) + mob << "You have trouble telling right and left apart all of a sudden." + mob.confused += 10 + +/datum/disease2/effect/mutation + name = "DNA Degradation" + stage = 3 + activate(var/mob/living/carbon/mob,var/multiplier) + mob.apply_damage(2, CLONE) + + +/datum/disease2/effect/groan + name = "Groaning Syndrome" + stage = 3 + activate(var/mob/living/carbon/mob,var/multiplier) + mob.say("*groan") +////////////////////////STAGE 2///////////////////////////////// + +/datum/disease2/effect/scream + name = "Loudness Syndrome" + stage = 2 + activate(var/mob/living/carbon/mob,var/multiplier) + mob.say("*scream") + +/datum/disease2/effect/drowsness + name = "Automated Sleeping Syndrome" + stage = 2 + activate(var/mob/living/carbon/mob,var/multiplier) + mob.drowsyness += 10 + +/datum/disease2/effect/sleepy + name = "Resting Syndrome" + stage = 2 + activate(var/mob/living/carbon/mob,var/multiplier) + mob.say("*collapse") + +/datum/disease2/effect/blind + name = "Blackout Syndrome" + stage = 2 + activate(var/mob/living/carbon/mob,var/multiplier) + mob.eye_blind = max(mob.eye_blind, 4) + +/datum/disease2/effect/cough + name = "Anima Syndrome" + stage = 2 + activate(var/mob/living/carbon/mob,var/multiplier) + mob.say("*cough") + for(var/mob/living/carbon/M in view(1,mob)) + if(airborne_can_reach(get_turf(mob), get_turf(M))) + for (var/datum/disease2/disease/V in mob.virus2) + if(V.spreadtype == "Airborne") + infect_virus2(M,V) + +/datum/disease2/effect/hungry + name = "Appetiser Effect" + stage = 2 + activate(var/mob/living/carbon/mob,var/multiplier) + mob.nutrition = max(0, mob.nutrition - 200) + +/datum/disease2/effect/fridge + name = "Refridgerator Syndrome" + stage = 2 + activate(var/mob/living/carbon/mob,var/multiplier) + mob.say("*shiver") + +/datum/disease2/effect/hair + name = "Hair Loss" + stage = 2 + activate(var/mob/living/carbon/mob,var/multiplier) + if(istype(mob, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = mob + if(!(H.h_style == "Bald") && !(H.h_style == "Balding Hair")) + H << "Your hair starts to fall out in clumps..." + spawn(50) + H.h_style = "Balding Hair" + H.update_hair() + +/datum/disease2/effect/stimulant + name = "Adrenaline Extra" + stage = 2 + activate(var/mob/living/carbon/mob,var/multiplier) + mob << "You feel a rush of energy inside you!" + if (mob.reagents.get_reagent_amount("hyperzine") < 30) + mob.reagents.add_reagent("hyperzine", 10) + if (prob(30)) + mob.jitteriness += 10 + +////////////////////////STAGE 1///////////////////////////////// + +/datum/disease2/effect/sneeze + name = "Coldingtons Effect" + stage = 1 + activate(var/mob/living/carbon/mob,var/multiplier) + mob.say("*sneeze") + if (prob(50)) + 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 + activate(var/mob/living/carbon/mob,var/multiplier) + mob << "\red Mucous runs down the back of your throat." + +/datum/disease2/effect/drool + name = "Saliva Effect" + stage = 1 + activate(var/mob/living/carbon/mob,var/multiplier) + mob.say("*drool") + +/datum/disease2/effect/twitch + name = "Twitcher" + stage = 1 + activate(var/mob/living/carbon/mob,var/multiplier) + mob.say("*twitch") + +/datum/disease2/effect/headache + name = "Headache" + stage = 1 + activate(var/mob/living/carbon/mob,var/multiplier) + mob << " Your head hurts a bit" \ 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 0000000000..eb3de7ace1 --- /dev/null +++ b/code/modules/virus2/helpers.dm @@ -0,0 +1,82 @@ +//Returns 1 if mob can be infected, 0 otherwise. Checks his clothing. +proc/get_infection_chance(var/mob/living/carbon/M) + var/score = 0 + if (!istype(M)) + return 0 + if(istype(M, /mob/living/carbon/human)) + if(M:gloves) + score += 5 + if(istype(M:wear_suit, /obj/item/clothing/suit/space)) score += 10 + if(istype(M:wear_suit, /obj/item/clothing/suit/bio_suit)) score += 10 + if(istype(M:head, /obj/item/clothing/head/helmet/space)) score += 5 + if(istype(M:head, /obj/item/clothing/head/bio_hood)) score += 5 + if(M.wear_mask) + score += 5 + if(istype(M:wear_mask, /obj/item/clothing/mask/surgical) && !M.internal) + score += 10 + if(M.internal) + score += 10 + + if(score >= 30) + return 0 + else if(score == 25 && prob(99)) + return 0 + else if(score == 20 && prob(95)) + return 0 + else if(score == 15 && prob(75)) + return 0 + else if(score == 10 && prob(55)) + return 0 + else if(score == 5 && prob(35)) + return 0 + return 1 + +//Checks if table-passing table can reach target (5 tile radius) +proc/airborne_can_reach(turf/source, turf/target) + var/obj/dummy = new(source) + dummy.flags = FPRINT | TABLEPASS + dummy.pass_flags = PASSTABLE + + for(var/i=0, i<5, i++) if(!step_towards(dummy, target)) break + + var/rval = (dummy.loc in range(1,target)) + del dummy + return rval + +//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)) + return + if(!istype(M)) + 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 + if(M.antibodies & disease.antigen != 0) + return + + if(prob(disease.infectionchance) || forced) + // certain clothes can prevent an infection + if(!forced && !get_infection_chance(M)) + return + + var/datum/disease2/disease/D = disease.getcopy() + D.minormutate() + M.virus2["[D.uniqueID]"] = D + +//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() + D.infectionchance = 1 + M.virus2["[D.uniqueID]"] = D + +//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(1) + M.virus2["[D.uniqueID]"] = D + +//Fancy prob() function. +/proc/dprob(var/p) + return(prob(sqrt(p)) && prob(sqrt(p))) diff --git a/code/modules/virus2/isolator.dm b/code/modules/virus2/isolator.dm new file mode 100644 index 0000000000..667ab67e99 --- /dev/null +++ b/code/modules/virus2/isolator.dm @@ -0,0 +1,97 @@ +/obj/machinery/disease2/isolator/ + name = "Pathogenic Isolator" + density = 1 + anchored = 1 + icon = 'virology.dmi' + icon_state = "isolator" + var/datum/disease2/disease/virus2 = null + var/isolating = 0 + var/beaker = null + +/obj/machinery/disease2/isolator/attackby(var/W as obj, var/mob/user) + if(!istype(W,/obj/item/weapon/reagent_containers/syringe)) + return + + var/obj/item/weapon/reagent_containers/syringe/B = W + + if(src.beaker) + user << "A syringe is already loaded into the machine." + return + + src.beaker = B + user.drop_item() + B.loc = src + if(istype(B,/obj/item/weapon/reagent_containers/syringe)) + user << "You add the syringe to the machine!" + src.updateUsrDialog() + icon_state = "isolator_in" + +/obj/machinery/disease2/isolator/Topic(href, href_list) + if(..()) return + + usr.machine = src + if(!beaker) return + var/datum/reagents/R = beaker:reagents + + if (href_list["isolate"]) + var/datum/reagent/blood/Blood + for(var/datum/reagent/blood/B in R.reagent_list) + if(B) + Blood = B + break + var/list/virus = virus_copylist(Blood.data["virus2"]) + var/choice = text2num(href_list["isolate"]); + for (var/datum/disease2/disease/V in virus) + if (V.uniqueID == choice) + virus2 = virus + isolating = 40 + icon_state = "isolator_processing" + src.updateUsrDialog() + return + + else if (href_list["main"]) + attack_hand(usr) + return + else if (href_list["eject"]) + beaker:loc = src.loc + beaker = null + icon_state = "isolator" + src.updateUsrDialog() + return + +/obj/machinery/disease2/isolator/attack_hand(mob/user as mob) + if(stat & BROKEN) + return + user.machine = src + var/dat = "" + if(!beaker) + dat = "Please insert sample into the isolator.
" + dat += "Close" + else if(isolating) + dat = "Isolating" + else + var/datum/reagents/R = beaker:reagents + dat += "Eject

" + if(!R.total_volume) + dat += "[beaker] is empty." + else + dat += "Contained reagents:
" + for(var/datum/reagent/blood/G in R.reagent_list) + if(G.data["virus2"]) + var/list/virus = G.data["virus2"] + for (var/datum/disease2/disease/V in virus) + dat += "
[G.name]: Isolate pathogen #[V.uniqueID]" + else + dat += " No pathogen" + user << browse("Pathogenic IsolatorIsolator menu:

[dat]", "window=isolator;size=575x400") + onclose(user, "isolator") + return + +/obj/machinery/disease2/isolator/process() + if(isolating > 0) + isolating -= 1 + if(isolating == 0) + var/obj/item/weapon/virusdish/d = new /obj/item/weapon/virusdish(src.loc) + d.virus2 = virus2.getcopy() + virus2 = null + icon_state = "isolator_in" diff --git a/code/modules/virus2/items_devices.dm b/code/modules/virus2/items_devices.dm new file mode 100644 index 0000000000..75a33ef5c8 --- /dev/null +++ b/code/modules/virus2/items_devices.dm @@ -0,0 +1,81 @@ +/obj/machinery/proc/state(var/msg) + for(var/mob/O in hearers(src, null)) + O.show_message("\icon[src] [msg]", 2) + +///////////////ANTIBODY SCANNER/////////////// + +/obj/item/device/antibody_scanner + name = "Antibody Scanner" + desc = "Used to scan living beings for antibodies in their blood." + icon_state = "health" + w_class = 2.0 + item_state = "electronic" + flags = FPRINT | TABLEPASS | CONDUCT | USEDELAY + + +/obj/item/device/antibody_scanner/attack(mob/living/carbon/human/M as mob, mob/user as mob) + if(!istype(M)) + user << "Incompatible object, scan aborted." + return + var/mob/living/carbon/C = M + if(!C.antibodies) + user << "Unable to detect antibodies." + return + var/code = antigens2string(M.antibodies) + user << "[src] The antibody scanner displays a cryptic set of data: [code]" + +///////////////VIRUS DISH/////////////// + +/obj/item/weapon/virusdish + name = "Virus containment/growth dish" + icon = 'items.dmi' + icon_state = "implantcase-b" + var/datum/disease2/disease/virus2 = null + var/growth = 0 + var/info = 0 + var/analysed = 0 + + reagents = list() + +/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)) + user << "The dish shatters" + if(virus2.infectionchance > 0) + for(var/mob/living/carbon/target in view(null, src)) + if(airborne_can_reach(src.loc, target.loc)) + if(get_infection_chance(target)) + infect_virus2(target,src.virus2) + del src + +/obj/item/weapon/virusdish/examine() + usr << "This is a virus containment dish" + if(src.info) + usr << "It has the following information about its contents" + usr << src.info + +///////////////GNA DISK/////////////// + +/obj/item/weapon/diseasedisk + name = "Blank GNA disk" + icon = 'cloning.dmi' + icon_state = "datadisk0" + var/datum/disease2/effectholder/effect = null + var/stage = 1 + +/obj/item/weapon/diseasedisk/premade/New() + name = "Blank GNA disk (stage: [5-stage])" + effect = new /datum/disease2/effectholder + effect.effect = new /datum/disease2/effect/invisible + effect.stage = stage \ No newline at end of file diff --git a/code/setup.dm b/code/setup.dm index 8cf41fb4cc..8afcbe689a 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -679,3 +679,18 @@ var/list/be_special_flags = list( #define IMPLOYAL_HUD 5 // loyality implant #define IMPCHEM_HUD 6 // chemical implant #define IMPTRACK_HUD 7 // tracking implant + +//Pulse levels, very simplified +#define PULSE_NONE 0 //so !M.pulse checks would be possible +#define PULSE_SLOW 1 //<60 bpm +#define PULSE_NORM 2 //60-90 bpm +#define PULSE_FAST 3 //90-120 bpm +#define PULSE_2FAST 4 //>120 bpm +#define PULSE_THREADY 5 //occurs during hypovolemic shock +//feel free to add shit to lists below +var/list/tachycardics = list("coffee", "inaprovaline", "hyperzine", "nitroglycerin", "thirteenloko", "nicotine") //increase heart rate +var/list/bradycardics = list("neurotoxin", "cryoxadone", "clonexadone", "space_drugs", "stoxin") //decrease heart rate + +//proc/get_pulse methods +#define GETPULSE_HAND 0 //less accurate (hand) +#define GETPULSE_TOOL 1 //more accurate (med scanner, sleeper, etc) diff --git a/config/custom_sprites.txt b/config/custom_sprites.txt index e69de29bb2..bb370589f5 100644 --- a/config/custom_sprites.txt +++ b/config/custom_sprites.txt @@ -0,0 +1,5 @@ +rowtree-Lucy +sydrec-SINA +ravensdale-Blunt +ravensdale-Skuld +serithi-REMNANT diff --git a/html/changelog.html b/html/changelog.html index f30f115d4d..6f635fef91 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,7 +56,35 @@ Changelog Section Stuff which is in development and not yet visible to players or just code related (ie. code improvements for expandability, etc.) should not be listed here. They should be listed in the changelog upon commit though. Thanks. --> - +
+

2013-11-07

+

Chinsky updated:

+
    +
  • Gun delays. All guns now have delays between shots. Most have less than second, lasercannons and pulse rifles have around 2 seconds delay. Automatics have zero, click-speed.
  • +
+
+
+

2013/07/06

+

Chinsky updated:

+
    +
  • Humans now can be infected with more than one virus at once.
  • +
  • All analyzed viruses are put into virus DB. You can view it and edit their name and description on medical record consoles.
  • +
  • Only known viruses (ones in DB) will be detected by the machinery and HUDs.
  • +
  • Viruses cause fever, body temperature rising the more stage is.
  • +
  • Humans' body temperature does not drift towards room one unless there's big difference in them.
  • +
  • Virus incubators now can transmit viuses from dishes to blood sample.
  • +
  • New machine - centrifuge. It can isolate antibodies or viruses (spawning virus dish) from a blood sample in vials. Accepts vials only.
  • +
  • Fancy vial boxes in virology, one of them is locked by ID with MD access.
  • +
  • Engineered viruses are now ariborne too.
  • +
+
+
+

05.07.2013

+

Spamcat updated:

+
    +
  • Pulse! Humans now have hearbeat rate, which can be measured by right-clicking someone - Check pulse or by health analyzer. Medical machinery also has heartbeat monitors. Certain meds and conditions can influence it.
  • +
+

July 30th, 2013

Erthilo updated:

diff --git a/icons/mob/monkey.dmi b/icons/mob/monkey.dmi index c0f5e306f2..30a7bdb3c5 100644 Binary files a/icons/mob/monkey.dmi and b/icons/mob/monkey.dmi differ diff --git a/icons/obj/chemical.dmi b/icons/obj/chemical.dmi index 313a90b305..60370fdc8c 100644 Binary files a/icons/obj/chemical.dmi and b/icons/obj/chemical.dmi differ diff --git a/icons/obj/reagentfillings.dmi b/icons/obj/reagentfillings.dmi index fbf42ca03d..f236fbc2c0 100644 Binary files a/icons/obj/reagentfillings.dmi and b/icons/obj/reagentfillings.dmi differ diff --git a/icons/obj/vialbox.dmi b/icons/obj/vialbox.dmi new file mode 100644 index 0000000000..c08b5cfeab Binary files /dev/null and b/icons/obj/vialbox.dmi differ diff --git a/icons/obj/virology.dmi b/icons/obj/virology.dmi index 01b6e591e3..02a426049b 100644 Binary files a/icons/obj/virology.dmi and b/icons/obj/virology.dmi differ diff --git a/maps/tgstation.2.1.0.0.1.dmm b/maps/tgstation.2.1.0.0.1.dmm index 58910b36af..9e21d488e0 100644 --- a/maps/tgstation.2.1.0.0.1.dmm +++ b/maps/tgstation.2.1.0.0.1.dmm @@ -1110,7 +1110,7 @@ "avr" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "solar_tool_airlock"; name = "exterior access button"; pixel_x = -25; pixel_y = -25; req_access_txt = "13"},/turf/simulated/floor/plating/airless,/area/solar/auxport) "avs" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/wall,/area/security/vacantoffice2) "avt" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall,/area/security/vacantoffice2) -"avu" = (/obj/structure/closet/secure_closet/personal/patient,/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door_control{id = "Medbay_privacy_room2"; name = "Privacy Shutters"; pixel_y = -25},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) +"avu" = (/obj/structure/sign/double/barsign,/turf/simulated/wall,/area/crew_quarters/bar) "avv" = (/obj/machinery/atmospherics/pipe/manifold{color = "red"; dir = 1; icon_state = "manifold-r-f"; level = 1; name = "pipe manifold"},/turf/simulated/wall,/area/security/vacantoffice2) "avw" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall,/area/lawoffice) "avx" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall,/area/lawoffice) @@ -1536,7 +1536,7 @@ "aDB" = (/obj/structure/table,/obj/item/weapon/paper/pamphlet,/turf/simulated/floor,/area/gateway) "aDC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/gateway) "aDD" = (/obj/structure/table,/obj/item/device/radio/off{pixel_y = 6},/obj/item/device/radio/off{pixel_x = 6; pixel_y = 4},/obj/item/device/radio/off{pixel_x = -6; pixel_y = 4},/obj/item/device/radio/off,/turf/simulated/floor,/area/gateway) -"aDE" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Medbay_privacy_room2"; name = "Privacy Shutters"; opacity = 0},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/medical/medbay) +"aDE" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/sign/double/map/left,/turf/simulated/wall,/area/maintenance/fpmaint2) "aDF" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/fpmaint) "aDG" = (/obj/item/device/radio/intercom{freerange = 1; frequency = 1459; name = "Station Intercom (General)"; pixel_x = -30},/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/table/reinforced,/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = -1},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/ai_monitored/storage/eva) "aDH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) @@ -1613,7 +1613,7 @@ "aFa" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/gateway) "aFb" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor,/area/gateway) "aFc" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor,/area/gateway) -"aFd" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Medbay_privacy_psychiatry"; name = "Privacy Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/medical/medbay) +"aFd" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/sign/double/map/right,/turf/simulated/wall,/area/maintenance/fpmaint2) "aFe" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/fpmaint) "aFf" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/radio/off,/turf/simulated/floor{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/ai_monitored/storage/eva) "aFg" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/table/reinforced,/obj/machinery/cell_charger,/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/cable_coil{pixel_x = 3; pixel_y = -7},/obj/item/weapon/cable_coil{pixel_x = 3; pixel_y = -7},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/ai_monitored/storage/eva) @@ -1682,8 +1682,8 @@ "aGr" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/door/airlock/security{name = "Security Checkpoint"; req_access = null; req_access_txt = "1"},/turf/simulated/floor,/area/security/checkpoint2) "aGs" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/security/checkpoint2) "aGt" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/turf/simulated/floor{icon_state = "delivery"},/area/hallway/secondary/entry) -"aGu" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/sign/map/left,/turf/simulated/wall,/area/maintenance/fpmaint2) -"aGv" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/sign/map/right,/turf/simulated/wall,/area/maintenance/fpmaint2) +"aGu" = (/obj/item/weapon/reagent_containers/syringe,/obj/item/weapon/reagent_containers/pill/methylphenidate,/obj/item/weapon/reagent_containers/pill/citalopram,/obj/item/weapon/reagent_containers/pill/citalopram,/obj/item/weapon/reagent_containers/pill/methylphenidate,/obj/item/weapon/reagent_containers/glass/bottle/stoxin,/obj/item/clothing/suit/straight_jacket{layer = 3},/obj/structure/closet/secure_closet{name = "Psychiatrist's Locker"; req_access = null; req_access_txt = "64"},/obj/item/weapon/storage/box/cups,/turf/simulated/floor{tag = "icon-bcarpet06"; icon_state = "bcarpet06"},/area/medical/medbay) +"aGv" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/door/airlock/medical{name = "Psychiatrist's Office"; req_access_txt = "64"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "aGw" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall,/area/maintenance/fpmaint2) "aGx" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "aGy" = (/obj/machinery/atmospherics/pipe/manifold{color = "red"; dir = 1; icon_state = "manifold-r-f"; level = 1; name = "pipe manifold"},/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) @@ -1704,7 +1704,7 @@ "aGN" = (/obj/machinery/atmospherics/pipe/manifold{color = "red"; dir = 1; icon_state = "manifold-r-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor,/area/gateway) "aGO" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/pipe/manifold{color = "red"; icon_state = "manifold-r-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor,/area/gateway) "aGP" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/gateway) -"aGQ" = (/obj/effect/landmark/start{name = "Psychiatrist"},/obj/structure/stool/bed/chair/comfy/teal{tag = "icon-comfychair_teal (EAST)"; icon_state = "comfychair_teal"; dir = 4},/obj/machinery/door_control{id = "Medbay_privacy_psychiatry"; name = "Privacy Shutters"; pixel_y = -25},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor{dir = 2; icon_state = "whiteblue"},/area/medical/medbay) +"aGQ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{tag = "icon-bcarpet04"; icon_state = "bcarpet04"},/area/medical/medbay) "aGR" = (/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/fpmaint) "aGS" = (/obj/machinery/light/small{dir = 8},/obj/structure/dispenser/oxygen,/turf/simulated/floor{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/ai_monitored/storage/eva) "aGT" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_command{name = "E.V.A."; req_access_txt = "0"; req_one_access_txt = "11;24;5;1"},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) @@ -2795,7 +2795,7 @@ "bbM" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central) "bbN" = (/obj/machinery/door/firedoor/border_only,/turf/simulated/floor,/area/hallway/primary/central) "bbO" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass{name = "Diner"},/turf/simulated/floor,/area/crew_quarters/bar) -"bbP" = (/obj/structure/sign/barsign,/turf/simulated/wall,/area/crew_quarters/bar) +"bbP" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{tag = "icon-bcarpet05"; icon_state = "bcarpet05"},/area/medical/medbay) "bbQ" = (/turf/simulated/wall,/area/hallway/primary/starboard) "bbR" = (/turf/simulated/floor{dir = 1; icon_state = "whitecorner"},/area/hallway/primary/starboard) "bbS" = (/obj/machinery/camera{c_tag = "Starboard Primary Hallway 2"; dir = 2; network = list("SS13")},/turf/simulated/floor{dir = 1; icon_state = "whitecorner"},/area/hallway/primary/starboard) @@ -3118,7 +3118,7 @@ "bhX" = (/turf/simulated/wall,/area/medical/chemistry) "bhY" = (/turf/simulated/floor/beach/water,/turf/simulated/floor{tag = "icon-siding2 (NORTH)"; icon_state = "siding2"; dir = 1},/turf/simulated/floor{tag = "icon-siding4"; icon_state = "siding4"},/area/crew_quarters/fitness) "bhZ" = (/obj/structure/rack{dir = 1},/obj/item/device/flashlight,/turf/simulated/floor/plating,/area/maintenance/aft) -"bia" = (/obj/item/weapon/reagent_containers/syringe,/obj/item/weapon/reagent_containers/pill/methylphenidate,/obj/item/weapon/reagent_containers/pill/citalopram,/obj/item/weapon/reagent_containers/pill/citalopram,/obj/item/weapon/reagent_containers/pill/methylphenidate,/obj/item/weapon/reagent_containers/glass/bottle/stoxin,/obj/item/clothing/suit/straight_jacket{layer = 3},/obj/structure/closet/secure_closet{name = "Psychiatrist's Locker"; req_access = null; req_access_txt = "64"},/turf/simulated/floor{dir = 1; icon_state = "whiteblue"},/area/medical/medbay) +"bia" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/floor{tag = "icon-bcarpet05"; icon_state = "bcarpet05"},/area/medical/medbay) "bib" = (/obj/structure/table/reinforced,/obj/item/clothing/glasses/science{pixel_x = 2; pixel_y = 6},/obj/item/clothing/glasses/science{pixel_x = 2; pixel_y = 6},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/toxins/misc_lab) "bic" = (/obj/structure/table/reinforced,/obj/machinery/ignition_switch{id = "Xenobio"; pixel_x = -6; pixel_y = 4},/obj/machinery/atmospherics/pipe/manifold{dir = 4; icon_state = "manifold"; initialize_directions = 11; level = 2},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/toxins/misc_lab) "bid" = (/obj/item/weapon/crowbar/red,/obj/item/weapon/wrench,/obj/machinery/power/apc{dir = 8; name = "Misc Research APC"; pixel_x = -25},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/general/visible{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/toxins/misc_lab) @@ -3134,13 +3134,13 @@ "bin" = (/obj/machinery/atmospherics/pipe/manifold{color = "red"; dir = 8; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bio" = (/obj/structure/disposalpipe/segment,/obj/effect/landmark{name = "lightsout"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bip" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) -"biq" = (/obj/machinery/door/airlock/glass_medical{id_tag = ""; name = "Psychiatrist's Office"; req_access_txt = "64"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) -"bir" = (/obj/machinery/alarm{pixel_y = 24},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "whiteblue"},/area/medical/medbay) +"biq" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 5},/obj/item/weapon/pen/blue{pixel_x = -3; pixel_y = 2},/obj/item/weapon/pen/red{pixel_x = 2; pixel_y = 6},/obj/machinery/camera{c_tag = "Psychiatric Office"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = -22},/turf/simulated/floor{tag = "icon-bcarpet09"; icon_state = "bcarpet09"},/area/medical/medbay) +"bir" = (/obj/structure/closet/secure_closet/personal/patient,/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door_control{id = "medpriv1"; name = "Privacy Shutters"; pixel_y = -25},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bis" = (/turf/simulated/wall/r_wall,/area/assembly/chargebay) -"bit" = (/obj/machinery/vending/wallmed1{pixel_y = 28},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "whiteblue"},/area/medical/medbay) +"bit" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "medpriv1"; name = "Privacy Shutters"; opacity = 0},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/medical/medbay) "biu" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/poddoor/shutters{id = "Skynet_launch"; name = "Mech Bay"},/turf/simulated/floor{icon_state = "delivery"},/area/assembly/chargebay) "biv" = (/obj/machinery/computer/rdconsole/robotics,/obj/machinery/alarm{pixel_y = 25},/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics) -"biw" = (/obj/structure/noticeboard{pixel_y = 28},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/floor{dir = 1; icon_state = "whiteblue"},/area/medical/medbay) +"biw" = (/obj/structure/table,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor{tag = "icon-bcarpet08"; icon_state = "bcarpet08"},/area/medical/medbay) "bix" = (/obj/machinery/r_n_d/circuit_imprinter,/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics) "biy" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/floor/plating,/area/assembly/robotics) "biz" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/machinery/door/window/eastright{base_state = "left"; dir = 2; icon_state = "left"; name = "Robotics Desk"; req_access_txt = "29"},/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/item/weapon/folder/white,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/floor/plating,/area/assembly/robotics) @@ -3196,7 +3196,7 @@ "bjx" = (/obj/structure/reagent_dispensers/watertank,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) "bjy" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/wall/r_wall,/area/maintenance/asmaint) "bjz" = (/obj/machinery/atmospherics/pipe/manifold{color = "blue"; dir = 4; icon_state = "manifold-b-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/wall/r_wall,/area/maintenance/asmaint) -"bjA" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 5},/obj/item/weapon/pen/blue{pixel_x = -3; pixel_y = 2},/obj/item/weapon/pen/red{pixel_x = 2; pixel_y = 6},/obj/machinery/camera{c_tag = "Psychiatric Office"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = -22},/turf/simulated/floor{dir = 2; icon_state = "whiteblue"},/area/medical/medbay) +"bjA" = (/obj/machinery/newscaster{pixel_x = 0; pixel_y = -28},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; level = 2; on = 1},/obj/structure/stool/bed/chair/comfy/brown{dir = 8},/turf/simulated/floor{tag = "icon-bcarpet08"; icon_state = "bcarpet08"},/area/medical/medbay) "bjB" = (/obj/structure/disposalpipe/junction{tag = "icon-pipe-j2"; icon_state = "pipe-j2"; dir = 2},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/manifold{color = "red"; dir = 8; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor/plating,/area/maintenance/asmaint) "bjC" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/general/visible,/turf/simulated/floor/plating,/area/toxins/misc_lab) "bjD" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/airlock/maintenance{name = "Misc Research Maintenance"; req_access_txt = "47"},/turf/simulated/floor/plating,/area/toxins/misc_lab) @@ -3211,8 +3211,8 @@ "bjM" = (/obj/machinery/washing_machine,/obj/machinery/atmospherics/pipe/manifold{color = "blue"; dir = 8; icon_state = "manifold-b-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 2; icon_state = "whitegreencorner"},/area/medical/medbay) "bjN" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Medbay_privacy_surgery"; name = "Privacy Shutters"; opacity = 0},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/medical/sleeper) "bjO" = (/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 8; icon_state = "whitegreencorner"},/area/medical/medbay) -"bjP" = (/obj/structure/table,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor{dir = 2; icon_state = "whiteblue"},/area/medical/medbay) -"bjQ" = (/obj/structure/stool/bed/chair/comfy/teal{tag = "icon-comfychair_teal (WEST)"; icon_state = "comfychair_teal"; dir = 8},/obj/machinery/newscaster{pixel_x = 0; pixel_y = -28},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; level = 2; on = 1},/turf/simulated/floor{dir = 2; icon_state = "whiteblue"},/area/medical/medbay) +"bjP" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "medpriv4"; name = "Privacy Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/medical/medbay) +"bjQ" = (/obj/effect/landmark/start{name = "Psychiatrist"},/obj/machinery/door_control{id = "medpriv1"; name = "Privacy Shutters"; pixel_y = -25},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/stool/bed/chair/comfy/brown{dir = 4},/turf/simulated/floor{tag = "icon-bcarpet07"; icon_state = "bcarpet07"},/area/medical/medbay) "bjR" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Medbay_privacy_surgery"; name = "Privacy Shutters"; opacity = 0},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/medical/sleeper) "bjS" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall/r_wall,/area/assembly/chargebay) "bjT" = (/obj/machinery/light_switch{pixel_y = 28},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor,/area/assembly/chargebay) @@ -3292,7 +3292,7 @@ "blp" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/captain) "blq" = (/obj/machinery/atmospherics/pipe/manifold{color = "blue"; dir = 4; icon_state = "manifold-b-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/wall/r_wall,/area/crew_quarters/captain) "blr" = (/obj/machinery/light{dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central) -"bls" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Medbay_privacy_room1"; name = "Privacy Shutters"; opacity = 0},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/medical/medbay) +"bls" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/dr_gibb{pixel_x = -3; pixel_y = -1},/obj/item/weapon/reagent_containers/food/drinks/dr_gibb{pixel_x = 4; pixel_y = 3},/obj/machinery/newscaster{pixel_x = 32; pixel_y = 0},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/medbay) "blt" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall/r_wall,/area/atmos) "blu" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/maintenance{name = "Atmospherics Maintenance"; req_access_txt = "24;12"},/turf/simulated/floor/plating,/area/atmos) "blv" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/closet/firecloset,/obj/item/taperoll/engineering,/turf/simulated/floor,/area/engine/break_room) @@ -3605,7 +3605,7 @@ "brq" = (/obj/structure/table/woodentable,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/item/weapon/storage/box/matches,/obj/item/clothing/mask/cigarette/cigar,/obj/item/weapon/reagent_containers/food/drinks/flask{pixel_x = 8},/turf/simulated/floor/carpet,/area/crew_quarters/captain) "brr" = (/obj/machinery/door/window/eastright{base_state = "left"; dir = 1; icon_state = "left"; name = "Shower"; req_access_txt = "0"},/obj/machinery/shower{tag = "icon-shower (EAST)"; icon_state = "shower"; dir = 4},/obj/item/weapon/soap/deluxe,/obj/item/weapon/bikehorn/rubberducky,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/captain) "brs" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/crew_quarters/captain) -"brt" = (/obj/structure/closet/secure_closet/personal/patient,/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/door_control{id = "Medbay_privacy_room1"; name = "Privacy Shutters"; pixel_y = 25},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) +"brt" = (/obj/machinery/atmospherics/pipe/simple{dir = 4},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/medical/medbay) "bru" = (/obj/structure/table,/obj/item/weapon/retractor{pixel_x = 0; pixel_y = 6},/obj/item/weapon/scalpel,/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) "brv" = (/obj/machinery/vending/snack,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "dark"},/area/hallway/primary/central) "brw" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/wall,/area/medical/sleeper) @@ -3616,7 +3616,7 @@ "brB" = (/obj/structure/table,/obj/item/weapon/surgicaldrill,/obj/item/weapon/circular_saw,/turf/simulated/floor,/area/medical/sleeper) "brC" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) "brD" = (/obj/structure/table,/obj/item/weapon/reagent_containers/blood/AMinus{pixel_x = -7; pixel_y = -3},/obj/item/weapon/reagent_containers/blood/APlus{pixel_x = -5; pixel_y = 4},/obj/item/weapon/reagent_containers/blood/empty{pixel_x = 1; pixel_y = -4},/obj/item/weapon/reagent_containers/blood/empty{pixel_x = 1; pixel_y = -4},/obj/item/weapon/reagent_containers/blood/BMinus{pixel_y = 4},/obj/item/weapon/reagent_containers/blood/BPlus{pixel_x = 5; pixel_y = 3},/obj/item/weapon/reagent_containers/blood/OMinus{pixel_x = -5; pixel_y = -1},/obj/item/weapon/reagent_containers/blood/OPlus{pixel_x = 4; pixel_y = 2},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) -"brE" = (/obj/structure/table,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/medbay) +"brE" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/britcup{pixel_x = 4; pixel_y = 5},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/machinery/camera{c_tag = "Medbay Break Room"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = -22},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/medbay) "brF" = (/obj/machinery/atmospherics/pipe/simple{color = "red"; dir = 4; icon_state = "intact-r-f"; level = 1; name = "pipe"},/obj/item/device/radio/intercom{pixel_y = 25},/turf/simulated/floor,/area/janitor) "brG" = (/obj/machinery/atmospherics/pipe/simple{color = "red"; dir = 4; icon_state = "intact-r-f"; level = 1; name = "pipe"},/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/janitor) "brH" = (/obj/machinery/door/window/westleft{name = "Janitoral Delivery"; req_access_txt = "26"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple{color = "red"; dir = 4; icon_state = "intact-r-f"; level = 1; name = "pipe"},/turf/simulated/floor{icon_state = "delivery"},/area/janitor) @@ -3690,9 +3690,9 @@ "bsX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold{color = "red"; icon_state = "manifold-r-f"; level = 1; name = "pipe manifold"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint) "bsY" = (/obj/structure/disposalpipe/junction{tag = "icon-pipe-j2 (EAST)"; icon_state = "pipe-j2"; dir = 4},/turf/simulated/floor{dir = 8; icon_state = "whitered"},/area/medical/medbay) "bsZ" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) -"bta" = (/obj/machinery/atmospherics/pipe/simple{dir = 4},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/medical/medbay) +"bta" = (/obj/item/device/radio/intercom{pixel_y = 25},/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/margherita{desc = "No one knows how long this has been here."; name = "old cold pizza"},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/medbay) "btb" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) -"btc" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/dr_gibb{pixel_x = -3; pixel_y = -1},/obj/item/weapon/reagent_containers/food/drinks/dr_gibb{pixel_x = 4; pixel_y = 3},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/medbay) +"btc" = (/obj/machinery/atmospherics/pipe/simple{dir = 4},/turf/simulated/wall,/area/medical/medbay) "btd" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/asmaint) "bte" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/obj/structure/rack,/obj/item/clothing/mask/gas,/obj/item/clothing/glasses/sunglasses,/turf/simulated/floor/plating,/area/maintenance/asmaint) "btf" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/reagent_dispensers/watertank,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/asmaint) @@ -3778,7 +3778,7 @@ "buH" = (/obj/machinery/sleeper{icon_state = "sleeper_0-r"; orient = "RIGHT"},/turf/simulated/floor,/area/medical/sleeper) "buI" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/hallway/primary/central) "buJ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall,/area/medical/medbay) -"buK" = (/obj/item/device/radio/intercom{pixel_y = 25},/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/margherita{desc = "No one knows how long this has been here."; name = "old cold pizza"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/medbay) +"buK" = (/obj/structure/sign/examroom{pixel_x = 30},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "buL" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold{color = "red"; dir = 1; icon_state = "manifold-r-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor/plating,/area/maintenance/asmaint) "buM" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) "buN" = (/turf/simulated/floor{icon_state = "white"},/area/medical/genetics) @@ -3849,6 +3849,7 @@ "bwa" = (/obj/machinery/door/airlock/glass_medical{name = "Medbay"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bwb" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor{icon_state = "redcorner"; dir = 4},/area/hallway/primary/fore) "bwc" = (/obj/effect/landmark/start{name = "Medical Doctor"},/obj/machinery/door_control{desc = "A remote control switch for the medbay foyer."; id = "MedbayFoyer"; name = "Medbay Doors Control"; normaldoorcontrol = 1; pixel_x = -26; pixel_y = 6; range = 4; req_access_txt = "5"},/obj/structure/stool/bed/chair/office/light{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) +"bwd" = (/obj/machinery/vending/wallmed1{pixel_y = 28},/turf/simulated/floor{tag = "icon-bcarpet02"; icon_state = "bcarpet02"},/area/medical/medbay) "bwe" = (/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Recovery Room"; req_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) "bwf" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bwg" = (/obj/machinery/vending/medical{pixel_x = -2},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) @@ -3861,8 +3862,8 @@ "bwn" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/structure/stool/bed/chair/comfy/teal{tag = "icon-comfychair_teal (EAST)"; icon_state = "comfychair_teal"; dir = 4},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/medbay) "bwo" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/disposalpipe/sortjunction{dir = 1; icon_state = "pipe-j2s"; sortType = 2},/turf/simulated/floor/plating,/area/maintenance/asmaint) "bwp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/grille{density = 0; icon_state = "brokengrille"},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/asmaint) -"bwq" = (/obj/machinery/atmospherics/pipe/simple{dir = 4},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/medical/medbay) -"bwr" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/medbay) +"bwq" = (/obj/structure/noticeboard{pixel_y = 28},/obj/structure/stool/psychbed,/turf/simulated/floor{tag = "icon-bcarpet02"; icon_state = "bcarpet02"},/area/medical/medbay) +"bwr" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "medpriv4"; name = "Privacy Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/medical/medbay) "bws" = (/obj/structure/table,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/item/clothing/tie/stethoscope,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/medbay) "bwt" = (/turf/simulated/wall,/area/assembly/chargebay) "bwu" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall,/area/assembly/chargebay) @@ -3930,7 +3931,7 @@ "bxE" = (/obj/machinery/door/airlock/medical{name = "Patient Room 1"; req_access_txt = "5"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bxF" = (/turf/simulated/wall,/area/medical/sleeper) "bxG" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) -"bxH" = (/obj/structure/disposalpipe/junction{tag = "icon-pipe-j2"; icon_state = "pipe-j2"; dir = 2},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) +"bxH" = (/obj/machinery/alarm{pixel_y = 24},/obj/structure/stool/bed/chair/comfy/brown,/turf/simulated/floor{tag = "icon-bcarpet01"; icon_state = "bcarpet01"},/area/medical/medbay) "bxI" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bxJ" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bxK" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/fire{pixel_x = -2; pixel_y = 4},/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; frequency = 1485; listening = 1; name = "Station Intercom (Medbay)"; pixel_x = 0; pixel_y = -30},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) @@ -4009,7 +4010,7 @@ "bzf" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "whitehall"; dir = 1},/area/medical/sleeper) "bzg" = (/obj/machinery/vending/wallmed2{pixel_y = -28},/obj/machinery/camera{c_tag = "Surgery Operating"; dir = 1; network = list("SS13"); pixel_x = 22},/obj/machinery/light,/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) "bzh" = (/turf/simulated/wall/r_wall,/area/medical/sleeper) -"bzi" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/vending/snack,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/medbay) +"bzi" = (/obj/structure/reagent_dispensers/water_cooler,/turf/simulated/floor{tag = "icon-bcarpet03"; icon_state = "bcarpet03"},/area/medical/medbay) "bzj" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "0"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "bzk" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint) "bzl" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) @@ -4022,7 +4023,7 @@ "bzs" = (/obj/machinery/atmospherics/pipe/manifold{color = "blue"; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/device/flashlight,/turf/simulated/floor/plating,/area/maintenance/asmaint) "bzt" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/asmaint) "bzu" = (/obj/effect/landmark{name = "blobstart"},/obj/machinery/atmospherics/pipe/manifold{color = "blue"; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) -"bzv" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/sign/examroom{pixel_x = 30},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) +"bzv" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/maintenance{name = "Medbay Maintenance"; req_access_txt = "5"},/turf/simulated/floor/plating,/area/medical/medbay) "bzw" = (/obj/structure/sign/nosmoking_2{pixel_x = -28},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bzx" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/wall,/area/medical/medbay) "bzy" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/asmaint) @@ -4084,9 +4085,9 @@ "bAC" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/asmaint) "bAD" = (/obj/machinery/atmospherics/pipe/simple{color = "red"; dir = 4; icon_state = "intact-r-f"; level = 1; name = "pipe"},/turf/simulated/wall,/area/storage/tech) "bAE" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/wall,/area/medical/medbay) -"bAF" = (/obj/machinery/newscaster{pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/machinery/camera{c_tag = "Medbay Break Room"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = -22},/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/britcup{pixel_x = 4; pixel_y = 5},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/medbay) +"bAF" = (/obj/machinery/vending/snack,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/medbay) "bAG" = (/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; frequency = 1485; listening = 1; name = "Station Intercom (Medbay)"; pixel_x = -30; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/camera{c_tag = "Medbay South"; dir = 4; network = list("SS13")},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) -"bAH" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/turf/simulated/floor/plating,/area/medical/medbay) +"bAH" = (/obj/structure/disposalpipe/segment,/obj/structure/disposalpipe/junction{tag = "icon-pipe-j2"; icon_state = "pipe-j2"; dir = 2},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bAI" = (/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) "bAJ" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) "bAK" = (/obj/structure/disposalpipe/segment,/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) @@ -4101,7 +4102,7 @@ "bAT" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor{icon_state = "showroomfloor"},/area/maintenance/asmaint) "bAU" = (/turf/simulated/floor,/area/medical/genetics) "bAV" = (/obj/machinery/optable,/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) -"bAW" = (/obj/machinery/door/airlock/maintenance{name = "Medbay Maintenance"; req_access_txt = "5"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/medical/medbay) +"bAW" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "medpriv4"; name = "Privacy Shutters"; opacity = 0},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/medical/medbay) "bAX" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/medbay) "bAY" = (/obj/structure/disposalpipe/sortjunction{sortType = 9},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint) "bAZ" = (/turf/simulated/wall/r_wall,/area/toxins/server) @@ -4164,9 +4165,11 @@ "bCe" = (/obj/machinery/atmospherics/pipe/manifold{color = "red"; dir = 4; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) "bCf" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; icon_state = "off"; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/closet/secure_closet/medical2,/turf/simulated/floor{dir = 4; icon_state = "whitehall"; tag = "icon-whitehall (WEST)"},/area/medical/sleeper) "bCg" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) +"bCh" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/medical/medbay) "bCi" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/glass_medical{id_tag = ""; name = "Break Room"; req_access_txt = "5"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bCj" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline{pixel_x = 7; pixel_y = -3},/obj/item/weapon/reagent_containers/glass/bottle/antitoxin{pixel_x = -4; pixel_y = -3},/obj/item/weapon/reagent_containers/syringe/inaprovaline{pixel_x = 3; pixel_y = -2},/obj/item/weapon/reagent_containers/glass/bottle/stoxin,/obj/item/weapon/reagent_containers/glass/bottle/toxin{pixel_x = 4; pixel_y = 2},/obj/item/weapon/reagent_containers/syringe/inaprovaline{pixel_x = 5; pixel_y = -2},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) "bCk" = (/obj/structure/stool/bed/chair/office/light{dir = 8},/obj/item/device/radio/intercom{pixel_y = 25},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) +"bCl" = (/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/disposal,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/medbay) "bCm" = (/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/clothing/tie/stethoscope,/obj/machinery/vending/wallmed1{pixel_y = 28},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bCn" = (/obj/structure/window/reinforced{dir = 8},/mob/living/carbon/monkey,/turf/simulated/floor,/area/medical/genetics) "bCo" = (/mob/living/carbon/monkey,/turf/simulated/floor,/area/medical/genetics) @@ -4426,6 +4429,7 @@ "bHi" = (/obj/structure/stool/bed/roller,/obj/machinery/door_control{desc = "A remote control switch for the medbay foyer."; id = "MedbayFoyer"; name = "Medbay Exit Button"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = 26; range = 3},/obj/structure/extinguisher_cabinet{pixel_x = -24},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bHj" = (/obj/machinery/atmospherics/pipe/simple{dir = 4},/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/medical/medbay) "bHk" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/turf/simulated/floor/plating,/area/medical/medbay) +"bHl" = (/obj/structure/closet/secure_closet/personal/patient,/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/door_control{id = "medpriv4"; name = "Privacy Shutters"; pixel_y = 25},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bHm" = (/obj/machinery/atmospherics/pipe/manifold{color = "red"; dir = 1; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/wall,/area/maintenance/asmaint) "bHn" = (/turf/simulated/wall/r_wall,/area/medical/cmo) "bHo" = (/obj/machinery/door/airlock/glass_command{name = "Chief Medical Officer"; req_access_txt = "40"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/medical/cmo) @@ -5089,6 +5093,7 @@ "bTW" = (/obj/structure/sign/nosmoking_2{pixel_x = 28},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/stool/bed/chair/office/light{dir = 8},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bTX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/medical/cmo) "bTY" = (/obj/structure/table/reinforced,/turf/simulated/floor{dir = 8; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/medbay) +"bTZ" = (/obj/machinery/computer/centrifuge,/turf/simulated/floor{dir = 4; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/virology) "bUa" = (/obj/structure/table,/obj/item/clothing/glasses/science{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/box/syringes,/obj/item/clothing/glasses/science{pixel_x = 0; pixel_y = 1},/turf/simulated/floor{dir = 4; icon_state = "whiteyellow"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry) "bUb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) "bUc" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/sign/securearea{pixel_x = 0; pixel_y = 32},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold{color = "red"; icon_state = "manifold-r-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) @@ -5194,6 +5199,7 @@ "bVY" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/medical/cmo) "bVZ" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/turf/simulated/floor,/area/atmos) "bWa" = (/obj/machinery/atmospherics/pipe/simple{color = "red"; icon_state = "intact-r"; level = 2},/turf/simulated/floor,/area/atmos) +"bWb" = (/obj/structure/table,/obj/item/weapon/storage/fancy/vials,/turf/simulated/floor{dir = 4; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/virology) "bWc" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple{color = "cyan"; dir = 4; icon_state = "intact-c"; level = 2},/obj/machinery/atmospherics/pipe/simple{color = "yellow"; icon_state = "intact-y"; level = 2},/turf/simulated/floor/plating,/area/atmos) "bWd" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple{color = "cyan"; dir = 4; icon_state = "intact-c"; level = 2},/turf/simulated/floor/plating,/area/atmos) "bWe" = (/obj/machinery/atmospherics/pipe/simple{color = "cyan"; dir = 4; icon_state = "intact-c"; level = 2},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple{color = "yellow"; icon_state = "intact-y"; level = 2},/turf/simulated/floor/plating,/area/atmos) @@ -5306,7 +5312,7 @@ "bYh" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/engine/n20,/area/atmos) "bYi" = (/obj/structure/sign/biohazard,/turf/simulated/wall/r_wall,/area/medical/virology) "bYj" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "engineering_east_airlock"; name = "interior access button"; pixel_x = -20; pixel_y = -20; req_access_txt = "10;13"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor,/area/engine/engineering) -"bYk" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall/r_wall,/area/medical/virology) +"bYk" = (/obj/structure/table,/obj/item/weapon/virusdish/random{pixel_x = -8; pixel_y = -5},/obj/item/weapon/virusdish/random{pixel_x = -2; pixel_y = 10},/obj/item/weapon/virusdish/random,/obj/item/weapon/storage/lockbox/vials,/obj/item/device/antibody_scanner,/turf/simulated/floor{dir = 8; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/virology) "bYl" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/engine/engineering) "bYm" = (/obj/machinery/portable_atmospherics/canister/toxins,/turf/simulated/floor/plating,/area/engine/engineering) "bYn" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/toxins/xenobiology) @@ -5414,7 +5420,7 @@ "cal" = (/obj/structure/closet/wardrobe/virology_white,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cam" = (/obj/machinery/power/smes,/obj/structure/cable,/turf/simulated/floor,/area/engine/engineering) "can" = (/obj/machinery/light/small,/turf/simulated/floor/plating,/area/engine/break_room) -"cao" = (/obj/structure/closet/l3closet/virology,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"cao" = (/obj/structure/table,/obj/machinery/computer/med_data/laptop,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cap" = (/obj/structure/stool/bed/chair{dir = 4},/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod5/station) "caq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{icon_state = "dark"},/area/medical/morgue) "car" = (/obj/machinery/light/small{dir = 8},/obj/machinery/camera{c_tag = "Engineering Secure Storage"; dir = 4; network = list("SS13")},/obj/machinery/shield_capacitor,/turf/simulated/floor/plating,/area/engine/engineering) @@ -5464,7 +5470,7 @@ "cbj" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/medical/virology) "cbk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/storage/emergency) "cbl" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "0"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) -"cbm" = (/obj/machinery/computer/curer,/turf/simulated/floor{dir = 4; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/virology) +"cbm" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cbn" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cbo" = (/obj/structure/sign/securearea{pixel_x = -32; pixel_y = 0},/obj/machinery/shower{tag = "icon-shower (EAST)"; icon_state = "shower"; dir = 4},/turf/simulated/floor{dir = 8; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/xenobiology) "cbp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) @@ -5486,6 +5492,7 @@ "cbF" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "0"; req_one_access_txt = "11;24"},/turf/simulated/floor,/area/engine/break_room) "cbG" = (/obj/effect/landmark/start{name = "Virologist"},/obj/structure/stool/bed/chair/office/light{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cbH" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"cbI" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/closet/l3closet/virology,/turf/simulated/floor{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/medical/virology) "cbJ" = (/obj/machinery/atmospherics/pipe/manifold{dir = 8; icon_state = "manifold"; level = 2},/obj/machinery/meter,/turf/simulated/floor,/area/atmos) "cbK" = (/obj/machinery/atmospherics/binary/pump{dir = 8},/turf/simulated/floor,/area/atmos) "cbL" = (/obj/machinery/atmospherics/pipe/simple{color = "yellow"; icon_state = "intact-y"; level = 2},/obj/machinery/atmospherics/portables_connector{dir = 8},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/atmos) @@ -5495,7 +5502,7 @@ "cbP" = (/obj/machinery/atmospherics/pipe/simple{color = "red"; dir = 6; icon_state = "intact-r"; level = 2},/obj/machinery/power/apc{dir = 8; name = "Atmospherics APC"; pixel_x = -24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor,/area/atmos) "cbQ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/medical/virology) "cbR" = (/obj/structure/table,/obj/item/weapon/storage/box/beakers{pixel_x = -1; pixel_y = -1; pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/box/syringes,/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/item/weapon/hand_labeler,/turf/simulated/floor{dir = 8; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/virology) -"cbS" = (/obj/machinery/disease2/isolator,/turf/simulated/floor{dir = 4; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/virology) +"cbS" = (/obj/structure/closet/emcloset,/obj/machinery/camera/xray{c_tag = "Virology Access"},/turf/simulated/floor{tag = "icon-warnwhite (NORTHEAST)"; icon_state = "warnwhite"; dir = 5},/area/medical/virology) "cbT" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cbU" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9; pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cbV" = (/obj/machinery/atmospherics/pipe/manifold{color = "blue"; dir = 1; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) @@ -5559,6 +5566,7 @@ "cdb" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plating,/area/storage/emergency) "cdc" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cdd" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/vending/cigarette,/turf/simulated/floor,/area/engine/break_room) +"cde" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cdf" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cdg" = (/turf/simulated/floor/engine,/area/toxins/xenobiology) "cdh" = (/mob/living/carbon/slime,/turf/simulated/floor/engine,/area/toxins/xenobiology) @@ -5588,6 +5596,7 @@ "cdF" = (/obj/structure/table,/turf/simulated/floor,/area/engine/break_room) "cdG" = (/obj/machinery/conveyor{dir = 4; id = "Skynet_heavy"},/obj/machinery/ai_status_display{pixel_y = -32},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/assembly/assembly_line) "cdH" = (/obj/machinery/conveyor{dir = 4; id = "Skynet_heavy"},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/assembly/assembly_line) +"cdI" = (/obj/structure/closet/l3closet/virology,/turf/simulated/floor{dir = 6; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/medical/virology) "cdJ" = (/obj/machinery/conveyor{dir = 4; id = "Skynet_heavy"},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/assembly/assembly_line) "cdK" = (/obj/machinery/atmospherics/pipe/manifold{icon_state = "manifold"; level = 2},/obj/item/weapon/cigbutt,/turf/simulated/floor,/area/atmos) "cdL" = (/obj/machinery/atmospherics/unary/cold_sink/freezer{dir = 8; icon_state = "freezer_0"; tag = ""},/turf/simulated/floor,/area/atmos) @@ -5599,7 +5608,7 @@ "cdR" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/medical/virology) "cdS" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/medical/virology) "cdT" = (/obj/machinery/light{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cdU" = (/obj/structure/table,/obj/item/weapon/virusdish/random{pixel_x = -8; pixel_y = -5},/obj/item/weapon/virusdish/random{pixel_x = -2; pixel_y = 10},/obj/item/weapon/virusdish/random,/turf/simulated/floor{dir = 8; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/virology) +"cdU" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 8},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cdV" = (/obj/machinery/disease2/incubator,/turf/simulated/floor{dir = 4; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/virology) "cdW" = (/obj/machinery/conveyor_switch{id = "Skynet_heavy"},/turf/simulated/floor{icon_state = "floorgrime"},/area/assembly/assembly_line) "cdX" = (/obj/machinery/chem_master,/turf/simulated/floor{dir = 1; icon_state = "whiteyellow"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry) @@ -5791,7 +5800,7 @@ "chB" = (/obj/machinery/camera{c_tag = "Engineering Access"},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/vending/engivend,/turf/simulated/floor,/area/engine/break_room) "chC" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/vending/tool,/turf/simulated/floor,/area/engine/break_room) "chD" = (/obj/machinery/constructable_frame/machine_frame,/turf/simulated/floor,/area/engine/break_room) -"chE" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"chE" = (/obj/machinery/light{dir = 1},/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "chF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "chG" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "n2_in"; name = "Nitrogen Supply Control"; output_tag = "n2_out"; sensors = list("n2_sensor" = "Tank")},/obj/machinery/atmospherics/pipe/simple{color = "green"; icon_state = "intact-g"; level = 2},/turf/simulated/floor{icon_state = "red"},/area/atmos) "chH" = (/obj/machinery/atmospherics/valve/digital{name = "Nitrogen Outlet Valve"; openDuringInit = 1},/turf/simulated/floor{icon_state = "red"; dir = 6},/area/atmos) @@ -5825,6 +5834,7 @@ "cij" = (/turf/simulated/wall/r_wall,/area/engine/engineering) "cik" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall/r_wall,/area/engine/engineering) "cil" = (/turf/simulated/wall/r_wall,/area/engine/chiefs_office) +"cim" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cin" = (/obj/machinery/atmospherics/pipe/simple{color = "cyan"; dir = 6; icon_state = "intact-c"; initialize_directions = 6; level = 2},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor,/area/atmos) "cio" = (/obj/structure/table,/obj/item/device/t_scanner,/obj/item/device/flashlight,/turf/simulated/floor/plating,/area/maintenance/asmaint) "cip" = (/obj/structure/rack{dir = 1},/obj/item/clothing/suit/fire/firefighter,/obj/item/weapon/tank/oxygen,/obj/item/clothing/mask/gas,/obj/item/weapon/extinguisher,/obj/item/clothing/head/hardhat/red,/obj/item/clothing/glasses/meson,/turf/simulated/floor/plating,/area/maintenance/asmaint) @@ -5944,7 +5954,7 @@ "ckz" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/engine/break_room) "ckA" = (/obj/structure/table,/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/item/weapon/storage/toolbox/mechanical{pixel_y = 5},/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_Toxins = 0},/obj/item/weapon/storage/belt/utility,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor,/area/engine/break_room) "ckB" = (/obj/structure/table,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating,/area/storage/emergency) -"ckC" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/closet/l3closet,/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/medical/virology) +"ckC" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "ckD" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "ckE" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 1; frequency = 1441; icon_state = "on"; id = "n2_in"; on = 1},/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/atmos) "ckF" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "n2_sensor"},/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/atmos) @@ -6011,7 +6021,7 @@ "clO" = (/obj/machinery/space_heater,/obj/structure/sign/atmosplaque{pixel_x = 0; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple{color = "red"; dir = 4; icon_state = "intact-r"; level = 2},/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/atmos) "clP" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/engine/chiefs_office) "clQ" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/engine/break_room) -"clR" = (/obj/structure/closet/emcloset,/obj/machinery/camera/xray{c_tag = "Virology Access"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{tag = "icon-warnwhite (NORTHEAST)"; icon_state = "warnwhite"; dir = 5},/area/medical/virology) +"clR" = (/obj/structure/sign/double/map/right{pixel_y = 32},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) "clS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold{color = "red"; dir = 4; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "clT" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/cable,/turf/simulated/floor/plating,/area/engine/break_room) "clU" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/cable,/turf/simulated/floor/plating,/area/engine/break_room) @@ -6046,7 +6056,7 @@ "cmx" = (/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Monkey Pen"; req_access_txt = "39"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cmy" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/medical/virology) "cmz" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cmA" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"cmA" = (/obj/structure/sign/double/map/left{pixel_y = 32},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) "cmB" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/engine,/area/toxins/xenobiology) "cmC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating/airless,/area/solar/starboard) "cmD" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable,/turf/simulated/floor/plating/airless,/area/solar/starboard) @@ -6066,14 +6076,12 @@ "cmR" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/scrubber,/obj/machinery/light/small,/turf/simulated/floor{dir = 8; icon_state = "escape"},/area/atmos) "cmS" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig/atmos,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/atmos,/obj/machinery/light{dir = 8},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor,/area/atmos) "cmT" = (/obj/machinery/vending/coffee,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor,/area/atmos) -"cmU" = (/obj/structure/closet/l3closet,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{dir = 6; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/medical/virology) "cmV" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/access_button{command = "cycle_interior"; master_tag = "virology_airlock_control"; name = "Virology Access Button"; pixel_x = 8; pixel_y = -28; req_access_txt = "39"},/turf/simulated/floor{dir = 10; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/medical/virology) "cmW" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/wall,/area/medical/virology) "cmX" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s10"; icon_state = "swall_s10"; dir = 2},/area/shuttle/escape_pod5/station) "cmY" = (/obj/machinery/light/small{dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor/engine,/area/toxins/xenobiology) "cmZ" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cna" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/mob/living/carbon/monkey,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cnb" = (/obj/machinery/light{dir = 1},/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cnc" = (/obj/item/weapon/storage/secure/safe{pixel_x = 5; pixel_y = 29},/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/obj/machinery/camera{c_tag = "Virology Break Room"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cnd" = (/obj/machinery/camera{c_tag = "Engine West"; dir = 4; network = list("SS13")},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/dispenser,/turf/simulated/floor,/area/engine/engineering) "cne" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/engine/engineering) @@ -6200,7 +6208,6 @@ "cpv" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/engine/engineering) "cpw" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/engine/engineering) "cpx" = (/obj/machinery/embedded_controller/radio/airlock_controller{airpump_tag = "engineering_east_pump"; exterior_door_tag = "engineering_east_outer"; frequency = 1379; id_tag = "engineering_east_airlock"; interior_door_tag = "engineering_east_inner"; pixel_x = -25; req_access_txt = "10;13"; sensor_tag = "engineering_east_sensor"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "engineering_east_sensor"; pixel_x = -25; pixel_y = 12},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering) -"cpy" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cpz" = (/obj/machinery/atmospherics/pipe/manifold{color = "red"; icon_state = "manifold-r-f"; level = 1; name = "pipe manifold"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cpA" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "engineering_west_outer"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "10;13"},/turf/simulated/floor/plating,/area/engine/engineering) "cpB" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating/airless,/area) @@ -6681,8 +6688,6 @@ "cyI" = (/obj/structure/closet/syndicate/personal,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) "cyJ" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows2 (NORTH)"; icon_state = "fakewindows2"; dir = 1},/area/syndicate_mothership) "cyK" = (/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) -"cyL" = (/obj/structure/sign/map/left{pixel_y = 32},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) -"cyM" = (/obj/structure/sign/map/right{pixel_y = 32},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) "cyN" = (/obj/structure/table,/obj/machinery/microwave,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/syndicate_mothership) "cyO" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/syndicate_mothership) "cyP" = (/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = -30; pixel_y = 0; req_access_txt = "0"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/centcom/evac) @@ -10160,7 +10165,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaBEaBFaBGaBFaBFaBHaBIaBFaBFaBGaBJaBKasGayTaBLaBMaBNaBOaBPaBQaBRaBSaAGawdaBTatxayYayYaBUaBVaANaBWaBXaGAaENaELaCdaCcaCbaCeaCfaANaabaAgaCgaChaCiaCjaCkaAgaabayeayiayjaClaCmaCnaCmaCoayjaykaCpaxkaynaynaCqaCraAnaCsaAoaAnaCtaCuaynaywaxkayxapoayyalsayzawCawDaCvawFatdaCwaCxazyaCyaAtaAtaAtazzaCzaCAaCBazyaFEaSOaSPaQeaQdaBnaaaaabaaaaabaaaaabaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaAwaCFaCGaCHaAwaBnaCIaCJaCKaCLaCMaCMaCMaCMaCMaCMaCNaCOaCOaCPaCQaCRaCOaCOaCSaCTaCUaabaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBEaBJaBFaCVaCWaCWaCXaCYaCZaDaaDbaCWaCWaDcaDdawRayTaDeaAGaDfaDgaDhaDiaDhaDjaDkaDlaDmaqQaDnaDoaDpazYaDqaDraDsaDtaDtaDtaDuaDtaDtaDvaBXaANaaaaAgaDwaDxaDyaCjaDzaAgaaaayeayiayjaDAaDBaDCaDDapSayjaykaDFaxkaxkaxkaxkaDGaAnaynaDHaAZaDIazpaDJaDKaxkaDLasqaDMalsayzaDNaDOaDOaDOaDOaDPaDQaDRaDSaDTaDUaDUaDUaDVaDUaDWaQfaKtaRuaKuaRAaEbaBnaBnaBnaBnaBnaBnaBnaBnaBnaBnaCIaCJaBnaBnaBnaCIaEcaEdaBnaBnaAwaAwaEeaEfaAwaEgaEhaEiaEjaEkaElaElaElaElaElaEgaEmaEnaEnaEoaEpaEqaEnaEraEsaEtaEraEraEraEraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDcaEuaEvaEwaCWaExaCWaExaCWaExaCWaExaCWaEyaEzazOayTaEAaAGaEBaECaEDaEEaEFaEGaAGaEHaEIazYaEJazYaEKaqQaALaIgaDvaDtaDtaDtaDtaDtaDtaEMaGFaEOaEPaEQaERaESaETaEUaEVaAgaabayeaEWaEXaEYaEZaFaaFbaFcaEXanCaFeaxkaFfaynaziaFgaAZazlaFhaAnaFiaxkaxkaxkaxkaFjaFkaFlalsaFmariariariaFnaFoaFpaFqaFraFsaFtaFraFuaFraFvaFraFwaFxaRBaNzaREaIXaFAaFBaFCaFDaFDaFBaQbaFFaFFaFFaFFaFFaFGaFHaFFaRHaFJaRGaSzaFMaFNaFOaFPaFQaFRaFRaFRaFSaFTaFUaFVaElaFWaFXaFYaElaEnaFZaEnaGaaGbaGcaGdaGeaGfaGgaGhaGiaGjaGkaGlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGmaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGnaCWaCWaBGaCWaExaCWaExaGoaExaCWaExaCWaEyaEzazOayTaGpaAGaGqaGraGsaGtaGsaBMaBMaGuaGvaGwaGxaGyaGxaGxaGzaIjaGBaGCaGCaGCaGDaGCaGCaGEaBZaANaaaaGGaAgaGHaGIaGHaAgaAgaaaayeaGJayjaGKaGLaGMaGNaGOaGPaqiaGRaxkaGSaynaGTaCraAnaynaAoaAnaCtaGUaxkaxkaxkaGVaGWaGXalsaGYalsalsalsaGZalsaHaaHbazyaHcaAtazyaHdazyaHeazyaHfaHgaUpaUtaVLaXyaXzaHoaHnaXAaRJaXBaSQaRJaRJaSSaBvaHoaHtaHoaHuaHoaHoaSTaHxaHyaHzaHzaHAaHBaHCaHDaHzaHEaHFaHGaHHaHIaHJaHKaHLaElaHMaHNaEnaHOaHPaHQaHRaGeaHSaHTaGhaHUaEraEraEraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGnaCWaCWaBGaCWaExaCWaExaGoaExaCWaExaCWaEyaEzazOayTaGpaAGaGqaGraGsaGtaGsaBMaBMaDEaFdaGwaGxaGyaGxaGxaGzaIjaGBaGCaGCaGCaGDaGCaGCaGEaBZaANaaaaGGaAgaGHaGIaGHaAgaAgaaaayeaGJayjaGKaGLaGMaGNaGOaGPaqiaGRaxkaGSaynaGTaCraAnaynaAoaAnaCtaGUaxkaxkaxkaGVaGWaGXalsaGYalsalsalsaGZalsaHaaHbazyaHcaAtazyaHdazyaHeazyaHfaHgaUpaUtaVLaXyaXzaHoaHnaXAaRJaXBaSQaRJaRJaSSaBvaHoaHtaHoaHuaHoaHoaSTaHxaHyaHzaHzaHAaHBaHCaHDaHzaHEaHFaHGaHHaHIaHJaHKaHLaElaHMaHNaEnaHOaHPaHQaHRaGeaHSaHTaGhaHUaEraEraEraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDcaHVaEvaEwaCWaExaCWaExaCWaExaCWaExaCWaEyaEzazOaHWaHXaHYaHZaIaaIaaIaaHXaIbaIcaHXaIdaIeaqQaIfauyauyaALaBZaIhaBXaIiaBZaBZaIlaImaInaIoaANaaaaIpaaaaIqaIraIqaaaaabaaaayeaGJayjaIsaItaIuaIvaIwayjaIxaoHaxkaIyaynaziaIzaIAazlaIBaICaIDaIEaIFaIGaIHaIIaIJaIKaILaIMaINaaaaaaaIOaIPaIQaIRazyaISaAtaAtaAtaCAaAtaAtaAtaITaIXatnaIXaKsaKraIXaIYaIXaJeaJgaJdaJfaJbaJcaJiaJhaJaaJiaNFaJiaJiaJiaJiaJjaJiaJiaJkaJiaJiaJiaJiaJlaJmaHHaJnaJoaJpaJqaJraElaJsaJtaJuaJvaJwaJxaHRaJyaHSaHTaGhaHTaJzaJAaJBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJCaJCaJCaJCaJCaJCaJCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJDaJEaBFaCVaCWaCWaCWaJFaCWaCWaJGaCWaCWaDcaJHaxPayTaxRaJIaJJaJJaJJaJJaJJaJJaJJaJKaJLatxatxaJMatxatxaALaJNaJOaJPaJQaJQaJQaJQaJRaJSaJTaANaJUaJVaJWaJXaJYaJZaJWaJWaKaayeaKbayjayjayjaKcaKdayjayjaKeaKfaxkaxkaxkaxkaKgaKhaGTaGTaKiaKjaIFaIFaKkaIJaIJaIJaIJaIJaKlaKmaKnaKoaIOaKpaIQaKqazyazyazyazyazyazyazyazyazyaITaHmaHlaHjaHiaHkaKwaMlaKyaJeaHhaIVaIWaIZaMraJiaHwaIUaHraHqaHraHsaHvaHpaKLaKMaKNaKOaFKaFIaFzaJiaKSaKTaKUaJnaKVaJpaJqaKWaElaKXaKYaKZaLaaLbaHRaHRaEnaEraLcaGhaHTaLdaLeaLfaaaaaaaaaaaaaaaaaaaaaaaaaaaaJCaJCaJCaJCaJCaJCaJCaJCaJCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJDaBFaBGaBFaBFaLgaBIaBFaBFaBGaJEaLhasGaLiaxRawRaLjaLjaLkaLjaLlatuaLmaLnaJLaLoaLpaLqaLraLsaLtaLuaLvaLuaLuaLuaLuaLuaLuaLuaLwaLxaLyaLzaLAaLAaLBaLCaLAaLAaLAaLDaLEaLFaLGaLAaLHaLIaLJaLKaLLaIJaLMaLNaIJaIKaILaILaILaILaILaILaLOaLPaLQaLRaLSaLTaLUaLVaLWaIJaIJaIJaLXaLYaLZaLYaMaaMbaMcaMdaIJaMeaIJaIXaMxaMwaMvaPXaRzaRzaMtaMsaNwaMmaJeaMuaMoaMkaMkaMnaJiaMqaMpaMfaMhaMfaMfaMgaKJaMjaKJaMiaMzaMyaMAaKJaJiaJlaMBaMCaMCaMDaMEaMCaMFaElaMGaMHaEnaMIaMJaHRaHRaEnaMKaMLaMMaHTaEraEraEraaaaabaaaaaaaaaaaaaaaaaaaaaaJCaJCaJCaJCaJCaJCaJCaJCaJCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -10174,7 +10179,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUWaUWaUWaUWaUWaUWaUWaUWaUWaUWaUWaUWaUWaWmaWnaWoayTaWpaWqaWraWsaWtaWuaWvaWwaWxaWsaWyaWzaWAaWBaWCaPnaWDaQPaWEaWFaWGaWGaWHaWGaWGaWGaWIaWJaWKaQGaWLaWMaWNaWOaQGaQGaWPaPkaWQaPBaWRaWSaCaaWUaWUaWVaIJaIJaIJaIJaIJaWWaWXaWYaWZaXaaXbaUbaXcaXdaXeaXfaXgaXhaXianaaXkaXlaXmaXaaXnaXoaXpaXqaXraXsaXtaXuaXvaIJaXwaIXaXxaUmaUnaUoaKDaOGaOEaKDaNuaUqaUoaKDaSRaOHaDXaRCaVMaRCaXCaRCaXDaUzaXEaJeaQcaUCaRLaRLaRLaRLaUFaQgaJiaXFaXGaXHaXIaXJaXKaXLaXLaXLaXLaXLaXLaXMaXNaXOaRTaRTaRTaRTaRTaRTaXPaXQaXRaTpaTpaTpaTpaTqaRZaaaaabaabaJCaJCaJCaJCaJCaJCaJCaJCaJCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUWaUWaUWaUWaUWaUWaUWaUWaUWaUWaUWaUWaUWaySavkaySaxRaXSaTzaXTaXUaXVaXVaXVaXVaXWaXXaTxaXYaXZaYaaYbaYcaYcaYcaYdaYcaYeaYfaYgaYhaYiaYiaYjaQVaYkaYlaYmaYnaYoaYpaYqaYqaYraYsaYtaYuaYvaYwaYwaYwaYxaPBaYyaIJaYzaYAaYBaYCaYDaYEaYFaYGaYHaYIaYJaPFaPFaPFaPFaPFaPFaYKaYLaYMaYNaXdaYOaYPaPFaYEaYDaYQaYRaYAaYSaIJaIJaSMaKDaYTaKDaKDaKDaNzaKDaKDaUraKDaYUaYUaYUaYUaODaYWaYXaRCaRCaRCaYYaYZaOCaJeaZbaZcaRLaZdaZdaZeaZcaZfaJiaZgaZhaZiaZjaOSaOSaOSaOSaZkaOSaOSaOSaZlaXQaRTaRTaRTaRTaRTaRTaRTaXPaXQaXRaTpaTpaZmaTpaZnaRZaabaabaaaaJCaJCaJCaJCaJCaJCaJCaJCaJCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUWaUWaUWaUWaUWaUWaUWaUWaUWaUWaUWaUWaUWaZoaZpaWoayTaZqaZraZsaZtaZuaZvaZwaXVaZxaZyaTxaZzaZAaYaaYbaZBaZCaZDaZEaYcaZFaZGaZHaPnaZIaZJaZKaZLaPnaZMaZNaZOaZOaZOaZOaZPaZOaZOaZQaZRaZRaZRaZSaZRaZTaZUaZVaZWaZXaZYaZZaZZaZZaZZbaababbacbabbadbaebaebaebaebaebaebaebaebafbagbagbahbagbagbagbagbagbagbagaYSaIJaIJaIXbaiaNAaNBbalaKDbamaKDbanbaobajaYUbapbaqbaraJeaJeaJebatbasbasbasaJeaJeaJebauaRLaRLbavbawbaxbayaNGaJibazaZhbaAaElbaBbaCbaDaVWbaEbaCbaFaVWbaGaErbaHaHTbaIaRTaRTbaIaHTbaJaErbaKbaLbaMaTpaTpaTqaRZaaaaabaabaJCaJCaJCaJCaJCaJCaJCaJCaJCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUWaUWaUWaUWaUWaUWaUWaUWaUWaUWaUWaUWaabaxPbaNaPhbaOaTzbaPbaPbaQbaRbaSbaQbaTbaPaTxbaUbaVbaWbaXbaYbaYbaZbbabaYbbbaZGbbcaPnaZIaZJbbdbbeaPnbbfaZNaZObbgbbhbbhbbhbbiaZObbjbbkbblbbmaZUaZUaZUaZUaIJaIJbbnbbobbpbbqbbrbbsbbtbbubbvbbwbadbaebbxbbybbzbbAbbBbbCbbDbafbagbbEbbFbbGbbHbbIbbJbbKbbLbagbbMbbNbbNaIXaIXaIXaIXaIXbbOaSMbbObbPaIXaIXaRtaIXaIXaIXbbQbbRbbRbbRbbRbbRbbRbbSbbRbbQaNGbbTbbTbbUaZiaZiaZiaZibbQbazbbVbaAaElaElaElaElaElbbWaElaElaElaElaErbbXbbYbbZbbZbbZbbZbcaaEraErbcbaTpbccaTpaTpaTqaTraQxaQxaWlaJCaJCaJCaJCaJCaJCaJCaJCaJCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUWaUWaUWaUWaUWaUWaUWaUWaUWaUWaUWaUWaabaxPbaNaPhbaOaTzbaPbaPbaQbaRbaSbaQbaTbaPaTxbaUbaVbaWbaXbaYbaYbaZbbabaYbbbaZGbbcaPnaZIaZJbbdbbeaPnbbfaZNaZObbgbbhbbhbbhbbiaZObbjbbkbblbbmaZUaZUaZUaZUaIJaIJbbnbbobbpbbqbbrbbsbbtbbubbvbbwbadbaebbxbbybbzbbAbbBbbCbbDbafbagbbEbbFbbGbbHbbIbbJbbKbbLbagbbMbbNbbNaIXaIXaIXaIXaIXbbOaSMbbOavuaIXaIXaRtaIXaIXaIXbbQbbRbbRbbRbbRbbRbbRbbSbbRbbQaNGbbTbbTbbUaZiaZiaZiaZibbQbazbbVbaAaElaElaElaElaElbbWaElaElaElaElaErbbXbbYbbZbbZbbZbbZbcaaEraErbcbaTpbccaTpaTpaTqaTraQxaQxaWlaJCaJCaJCaJCaJCaJCaJCaJCaJCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazMasGbcdaABaWoatuatuatuatuatuatubcebaOaTzaTxaTxaTxaTxaTxaTxaTxaTxaTxbcfaQGaYaaYbaZBbcgbchbciaYcbcjbckbclaPnaZIaZJbcmbcnaPnbbfaZNaZObbhbcobcobbhbcoaZObbjbcpbcqbcqbcrbcsbctaZUbcuaIJaYzbcvbcwbcxbcybczbczbcybcAbcBbadbaebcCbcDbcEbcFbcGbcHbcIbcJbcKbcLbcMbbLbcNbcObcPbbLbcQbagaYSbcRaIJbcSbcTbcUaZiaZiaZiaZiaZiaZiaZibcVaZiaZiaZiaZibcWaZiaZiaZiaZiaZiaZiaZiaZibcXaZiaZiaZiaZiaZiaZiaZiaZibcYbcZbdabdbbdcbdbbddbdbbdebdfbdgbdbbdhbdbbdibdjbdbbdbbdbbdbbdbbdbbdkbdlbdmbdnbccaTpaTpaTpaUVbdoaUUaUVaJCaJCaJCaJCaJCaJCaJCaJCaJCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdpbdpbdpbdpbdpbdpbdpbdpbdpbdpaaaaabbdqazPaxTbdrbdsbdtbdtbdtbdtbdtbdtbdubdvaPkaWPaQGaYaaYbaYcaYcbdwbdxaYcaPnaPnbdyaPnaZIbdzbcmbdAaPnbbfaZNaZObdBbdCbbhbcobdDaZObbjbdEbcqbcqbcqbdFbdGaZUbdHaIJaYzbdIbdJbdKbdLbdMbdNbdObcAbdPbadbaebdQbdRbdSbdSbdSbdTbdUbaebdVbdWbbLbbLbcNbdXbcPbbLbdYbagaujaIJaIJbcSbcTbcUaZiaZiaZiaZiaZiaZiaZiaRyaZiaZiaZiaZiaZiaZibebbdbbdbbdbbdbbdbbdbbecbdbbdbbdbbdbbdbbdbbdbaTPbeebefbegaZiaZiaZiaZiaZiaZhaZiaZiaZiaZiaZiaZiaZiaZiaZiaZiaZiaZibehbcYbeiaTpaTpbccaTpaTpbejaWkaQxaQxaTsaJCaJCaJCaJCaJCaJCaJCaJCaJCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdpbdpbdpbdpbdpbdpbdpbdpbdpbdpbdpaWmaWnaWoayTbekbelbembembenbembembembeoaPkaPkaPkaPkaYaaYbaZBbepbeqberaYcbesbetbeuaPnaPnaPnaPnbevaPnbbfaZNaZObewbbhbcobexbeyaZObbjaZUbezbcqbcqbeAbeBaZUbeCaIJaYzbeDbeEbdKbdLbeFbeGbdObcAbeHbadbeIbeJbeKbdSbeLbdSbcDbeMbeNbdVbeObePbeQbeRbeRbeSbbLbeTbagaYSbeUaIJbcSbcTbcUaZibeVaZibRNbRAbRAbRAbRObRAbRAbRAbRzaZiaZiaZiaZibfaaZibeVbRBbfcbRLaZiaZiaZibRMbffbRQbfhbRPbfjbfkaZiaZiaZiaZiaZibflbfmbfaaZiaZiaZiaZiaZiaZiaZiaZiaZiaZiaZiaZibcYbfnbfobfpbfqbfrbfsbftcghaabaaaaabaJCaJCaJCaJCaJCaJCaJCaJCaJCaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -10194,35 +10199,35 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnPbnPbnPbnPbnPbnPbnPbzYbzZbAaaZOaZObAbbqNbqNbqNbAcaZOaZObAdbAebAfaZObAgbAgbAgbAhbAgbAibAjbAkbAlbAmbAibeCaIJbAnbAoaTVbofbuebApbAqbAqbArbAsbAtaqvbAubAtbAvbAwbAxbAybAzbAzbAzbAAbsObsObsObsObsObsObsObsQdKTaXudKUbxFbxFbKEbKFbKGbxFbxFbKCbKDbKAbAIbAIbKBbIXbLIbLJbIXbITbjLbqfbwmbLGbLCbLHbKxbKIbKHbLBbKxbKxbKybKvbKwbKubAZbAZbAZbAZbAZbBabAZbAZbBbbBcbBdbBebBebBfbBgbvjbBhbzMbBibBjbBkbBlbBmbBnbylbiEbzTbpfaaaaaabkfbBobBpbkfbvobkfbkfbvobkfaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnPbnPbnPbnPbnPbnPbnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBqaabaaaaaaaaaaaabAgbBrbBsbBtbBubAibBvbBwbBxbBybAibeCaIJbBzbBAbBBbBAbBCbBDbBEbBFbBGbBHaXubBIaXubBJbBKbBLbBMbBNbBOaIJaMcbBPaMdbcSbBEbBQbBRaIJbBSbBTbzeaIJdKRbxFbKsbKtbKqbKrbKobKpbKmbKnboJbAIbAIbIYbIXbIWbIVbIUbITbjLbISbwmbIRbIQbIPbIObINbIMbILbIKbIJbqrbqrbCpbIIbAZbCtbCubCvbCwbCxbCybIHbBbbCAbCBbCCbBebBebCDbvjbBhbCEbCFbCGbCHbCIbCJbCKbylbiEbzTbgQbgQbgQbgQbgQbkfbkfaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGmaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnPbnPbnPbnPbnPbnPbnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAgbCLbCMbCNbCObCPbCQbCRbCSbCTbAibeCbCUbCVaIJaIJaIJaIJbcSbBEbBQbCWaIJaIJbCXaIJaIJbCYbCZbDaaIJaIJaIJaIJbBPaIJbcSbBEbBQbDeaXubDcbDbbDjbDdbtmbtlbtobtnbtHbtpbuCbuBbuEbuDbuGbuFbuHbxFbthbtibtjbtkbxFbjLbqfbwmbwmbwmbwmbwmbqrbqrbqrbqrbqrbqrbtebtdbtfbAZbDxbDybDzbtgbDBbDCbDDbBbbDEbDFbDGbDGbBebDHbDIbDJbDKbDLbDMbCJbDNbDObDPbylbiEbzTbgQaTTbDRbDRbgQaabaabaabaabaabaabaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabbDSbDTbDTbDUbDVbDVbDWbDWbDWbDWbDXaabaabaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnPbnPbnPbnPbnPaaaaaaaaaaaaaaaaaaaaaaaabDYbDZbEabDZbEbaaaaaaaaabAgbAgbEcbEdbCNbEdbEebEfbEgbEhbEibAibEjbeCbEkbElbtWbEmbtWbEnbEobEpbtXaIJbEqbErbjrbjrbEsaXuaXuaXuaXuaXuaXubEtbEubEvbEwbExbECbEBbEDbuIbvYbvXbECbuPbjRbjNbjJbvZbxFbxFbNYbwebNYbxFbxFbxFbxFbxFbxFbxFbxFbjLbqfbwfbwibwjbwgbwhbeabwnbwkbwlbuKbuJbuMbuLbuObAZbESbETbCvbEUbEVbEWbEXbBbbEYbDFbDGbDGbBebEZbFabFbbFcbFdbFebFfbFgbFhbFibFjbFkbFlbFlbFlbFlbFmbmiaaaaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabbFnbFobFpbFobDVbDWbDWbFqbFrbFqbDWbDWaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFsbFtbFubFtbFsbFvbFwbFxbAgbFybEdbFzbFAbFBbFCbFDbFDbFEbFFbAibFGbFGbFHbFGaTVaTVaTVaTVbFIbFIbFIbFIbFIbFIbFIbFIbFJbbNbbNbFKbFKbFKbFKbFLbFMbFKbFKbFKbFKbFNbFObFPaIPbrvbrxbrwbqqbqpbruaXjbrBbxFbrDbrCbrybNYbrzbrzbqgbqhbqibqkbNYbqebqfbqfbqfbqfbqfbjLbqlbqmbqnbqobrEbeabGjbeWbGlbGlbGlbGlbGlbGlbGlbGlbGlbBbbGmbGnbGobGobBebGpbGqbGrbGsbGsbGsbGsbGtbGubGvbGwbGsbGsbGsbGsbzTbGxbGyaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacbGzbFobFobGAbDWbDWbFqbFqbGBbFqbFqbDWbDWaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabEabGCbGDbGCbEabGEbGFbGGbAgbGHbGIbEdbGJbGKbAibGLbGMbGNbGObAibGPbGPbGQbFGaaaaaaaaaaaabFIbGRbGSbGTbGUbGVbGWbFIbGXbGYbGZbFKbHabHbbrNbHdbrGbrFbrIbrHbrKbrJbrMbrLbHmbrQbFNbxFbrPbrCboJbrObsTbxFbsSbsibrSbrRbAIbAIbAIbAIbAIbsZbsVbsYbsUbsUbsUbsUbtbbjLbtabqmbqnbqobtcbeabGjbeWbGlbHAbHBbHBbHCbHDbHEbHFbHGbBbbHHbHIbHJbHJbBebHKbHLbBhbHMbHNbHObHPbHQbHRbHSbHTbHUbHVbHWbGsbgQbEObgQbHYbHYbHYbHYbHYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaabHZbDWbGzbDWbDWbFqbFqbFqbFqbFqbFqbFqbDWbDWaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFsbGCbGCbGCbIabIbbEdbEdbIcbIdbEdbEdbIebIfbAibAibAibIgbAibAibIhbIibIjbIkaaabIlbImbInbIobIpbGWbIqbIrbIsbItbADbzDbzCbzBbzAbzzbIAbIBbICbIDbIEbIFbFKbFKbIGbACbzEbARbAQbATbASbAIbrCbAVbrObAIbALbAMbrCbANbxFbAPbAObAIbAIbAJbAKbeabeabeabeabeabAGbjLbjLbAHbqmbqnbqobAFbAEbIZbeWbGlbJabJbbHBbJcbHBbHBbHBbJdbBbbJebDFbJfbJfbBebBgbJgbJhbJibJjbJjbJjbJjbJkbJlbJmbJnbJobJpbGsbJqbJrbJsbJtbJubJvbJwbJxaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabbDVbDWbJybJzbJzbFqbFqbFqbFqbFqbFqbFqbFqbDWbDWaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabEabGDbGDbGDbEabJAbJBbJCbJDbJEbEdbJFbJGbJHbJIbJJbJJbJKbJJbJJbJLbJMbJNbJOaaabJPbJQbJRbJSbJTbGWbJUbJVbJWbJXbFIbJYbJZbKabFKbKbbKcbKdbKebKfbKgbKhbKibKjbKkbKldKSbCbbCabBZbzhbCfbCebCdbCcbBWbxFbBVbrCbBYbxFbBXbrObAIbAIbCjbKzbeabCmbCkbrtblsbxGbjLbCgbCibAXbAXbAXbAXbAWbBUbAYbGlbHAbKJbHBbHBbHBbHBbHBbKKbBbbKLbDFbKMbKMbBebKNbKObBhbKPbJlbJlbKQbKRbKSbKTbKUbKVbKWbKXbKYbKZbLabLbbLcbLdbLebJwbLfaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaabDWbDWbLgbFqbFqbFqbFqbFqbFqbFqbFqbFqbFqbFqbDWbDWaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaabFsbLhbLibLjbFsbLkbFwbFxbAgbAgbLlbLlbLlbAgbAgbFGbFGbFGbFGbLmbFGbFGbLnbJOaaabJPbLobLpbLqbLrbLsbLtbLubLrbLrbLvbLwbLxbLybFKbFKbFKbFKbFKbFKbLzbFKbFKbLAbwpbwobLDbLEbLFbLEbzhbymbxVbzgbzfbxSbxFbxUbxTbxObxFbxRbxQbxKbxLbxMbxNbeabxIbqfbxJbxEbxGbxHbsUbwqbwrbwsbxCbzibeabGjbeWbGlbGlbMcbHBbHBbHBbMdbGlbGlbBbbMebMfbKMbKMbBebMgbKObBhbHMbMhbMibMjbMkbMlbMmbMnbJlbMobMpbGsbMqbMrbMsbHYbMtbMubMvbMwaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabbDWbFqbFqbFqbFqbFqbFqbMxbFqbMybFqbFqbFqbFqbFqbDWbDWaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMzbDZbMAbDZbMBaaaaabaaaaaabAgbMCbMDbMEbAgaaaaaaaaabFGbMFbMGbIhbFGbLnbJOaaabJPbMHbMIbMJbMKbGWbMLbMMbMNbMObFIbMPbMQbMRbMSbMTbMTbMTbMTbMUbzkbMWbMWbMXbMYbzmbzlbzubztbzsbYBbzrbzpbYBbzobzrbYBbYBbzpbzobYBbYBbzobYBbYBbzpbYBbzxbdZbeaaWTbeabzwbjLbzvbeabeabeabeabeabeabzybeWbGlbNnbNobNpbNqbNrbNsbNtbNnbBebNubNvbCCbBebBebNwbKObNxbHYbHYbGsbGsbGsbGsbGwbGsbNybJlbNzbGsbNAbHXbgQbHYbNBbNCbNDbHYaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaabDWbNEbNEbNEbNEbNEbNEbNFbFqbNGbNEbMybFqbFqbFqbFqbDWaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaabaaaaaaaaaaabaaaaaaaaabFGbNHbNIbNJbFGbLnbNKaaabNLbImbNMbNNbNObGWbGWbNPbNQbNRbNSbNTbNUbNVbNWbNWbNWbNWbNWbjzbjybNZbjxbjvbOcbjubjtbifbiebihbigbOjbOkbOlbOlbOjbOlbOlbOkbOlbOlbOlbOlbOlbOlbOkbiiaWTbijbikbilbimbinbiobipbiqbirbitbiwbiabFNbGjbeWbGlbidbicbibbOCbODbOEbOFbOGbBebBebOHbBebBebOIbOJbKObnCbOKaabbOLbOMbONbOObOPbOObOQbORbOSbGsbOTbGxbOUbHYbOVbOWbOWbOXaacaacaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOYbFobFobFobFobFobFobFobOZbFrbFqbFqbFqbFqbPabFrbDWaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaabaabaabaabaabaabbFGbFGbFGbFGbFGbPbbFGaaaaaaaaaaaabFIbPcbPdbPebPfbFIbPgbFIblxblwbPjbPkbPkblvbPmbPnbPobPpbPqbPrbPrbPrbltblubPrbPrbPubPqbPvbPrbPrbPrbltbPrbFNbFNbFNbFNbFNbFNbFNbFNbFNbeWaWTbjKbjIavuaDEbjObjLbjMaFdaGQbjPbjQbjAbFNbGjbjBbjDbjCbjFbjEbjHbjGbPObPObPPbPQbPRbPSbnCbPTbnCbOJbKObnCbPUaabbOLbPVbPVbPWbPXbPYbPZbQabQbbGsbQcbGxbzTbHYbHYbHYbHYbHYaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaabDWbJzbJzbJzbJzbJzbJzbQdbFqbJybJzbQebFqbFqbFqbFqbDWaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnPbnPbnPbnPbnPaaaaaaaaaaaaaaaaaaaaaaaabDYbDZbEabDZbEbaaaaaaaaabAgbAgbEcbEdbCNbEdbEebEfbEgbEhbEibAibEjbeCbEkbElbtWbEmbtWbEnbEobEpbtXaIJbEqbErbjrbjrbEsaXuaXuaXuaXuaXuaXubEtbEubEvbEwbExbECbEBbEDbuIbvYbvXbECbuPbjRbjNbjJbvZbxFbxFbNYbwebNYbxFbxFbxFbxFbxFbxFbxFbxFbjLbqfbwfbwibwjbwgbwhbeabwnbwkbwlbtabuJbuMbuLbuObAZbESbETbCvbEUbEVbEWbEXbBbbEYbDFbDGbDGbBebEZbFabFbbFcbFdbFebFfbFgbFhbFibFjbFkbFlbFlbFlbFlbFmbmiaaaaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabbFnbFobFpbFobDVbDWbDWbFqbFrbFqbDWbDWaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFsbFtbFubFtbFsbFvbFwbFxbAgbFybEdbFzbFAbFBbFCbFDbFDbFEbFFbAibFGbFGbFHbFGaTVaTVaTVaTVbFIbFIbFIbFIbFIbFIbFIbFIbFJbbNbbNbFKbFKbFKbFKbFLbFMbFKbFKbFKbFKbFNbFObFPaIPbrvbrxbrwbqqbqpbruaXjbrBbxFbrDbrCbrybNYbrzbrzbqgbqhbqibqkbNYbqebqfbqfbqfbqfbqfbjLbqlbqmbqnbqoblsbeabGjbeWbGlbGlbGlbGlbGlbGlbGlbGlbGlbBbbGmbGnbGobGobBebGpbGqbGrbGsbGsbGsbGsbGtbGubGvbGwbGsbGsbGsbGsbzTbGxbGyaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacbGzbFobFobGAbDWbDWbFqbFqbGBbFqbFqbDWbDWaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabEabGCbGDbGCbEabGEbGFbGGbAgbGHbGIbEdbGJbGKbAibGLbGMbGNbGObAibGPbGPbGQbFGaaaaaaaaaaaabFIbGRbGSbGTbGUbGVbGWbFIbGXbGYbGZbFKbHabHbbrNbHdbrGbrFbrIbrHbrKbrJbrMbrLbHmbrQbFNbxFbrPbrCboJbrObsTbxFbsSbsibrSbrRbAIbAIbAIbAIbAIbsZbsVbsYbsUbsUbsUbsUbtbbjLbrtbqmbqnbqobrEbAEbGjbeWbGlbHAbHBbHBbHCbHDbHEbHFbHGbBbbHHbHIbHJbHJbBebHKbHLbBhbHMbHNbHObHPbHQbHRbHSbHTbHUbHVbHWbGsbgQbEObgQbHYbHYbHYbHYbHYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaabHZbDWbGzbDWbDWbFqbFqbFqbFqbFqbFqbFqbDWbDWaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFsbGCbGCbGCbIabIbbEdbEdbIcbIdbEdbEdbIebIfbAibAibAibIgbAibAibIhbIibIjbIkaaabIlbImbInbIobIpbGWbIqbIrbIsbItbADbzDbzCbzBbzAbzzbIAbIBbICbIDbIEbIFbFKbFKbIGbACbzEbARbAQbATbASbAIbrCbAVbrObAIbALbAMbrCbANbxFbAPbAObAIbAIbAJbAKbeabeabeabeabeabAGbjLbCgbCibAXbAXbAXbAXbzvbIZbeWbGlbJabJbbHBbJcbHBbHBbHBbJdbBbbJebDFbJfbJfbBebBgbJgbJhbJibJjbJjbJjbJjbJkbJlbJmbJnbJobJpbGsbJqbJrbJsbJtbJubJvbJwbJxaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabbDVbDWbJybJzbJzbFqbFqbFqbFqbFqbFqbFqbFqbDWbDWaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabEabGDbGDbGDbEabJAbJBbJCbJDbJEbEdbJFbJGbJHbJIbJJbJJbJKbJJbJJbJLbJMbJNbJOaaabJPbJQbJRbJSbJTbGWbJUbJVbJWbJXbFIbJYbJZbKabFKbKbbKcbKdbKebKfbKgbKhbKibKjbKkbKldKSbCbbCabBZbzhbCfbCebCdbCcbBWbxFbBVbrCbBYbxFbBXbrObAIbAIbCjbKzbeabCmbCkbHlbAWbxGbAHbsUbChbClbwsbxCbAFbeabBUbAYbGlbHAbKJbHBbHBbHBbHBbHBbKKbBbbKLbDFbKMbKMbBebKNbKObBhbKPbJlbJlbKQbKRbKSbKTbKUbKVbKWbKXbKYbKZbLabLbbLcbLdbLebJwbLfaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaabDWbDWbLgbFqbFqbFqbFqbFqbFqbFqbFqbFqbFqbFqbDWbDWaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaabFsbLhbLibLjbFsbLkbFwbFxbAgbAgbLlbLlbLlbAgbAgbFGbFGbFGbFGbLmbFGbFGbLnbJOaaabJPbLobLpbLqbLrbLsbLtbLubLrbLrbLvbLwbLxbLybFKbFKbFKbFKbFKbFKbLzbFKbFKbLAbwpbwobLDbLEbLFbLEbzhbymbxVbzgbzfbxSbxFbxUbxTbxObxFbxRbxQbxKbxLbxMbxNbeabxIbqfbxJbxEbxGbjLbuKbtcbeabeabeabeabeabGjbeWbGlbGlbMcbHBbHBbHBbMdbGlbGlbBbbMebMfbKMbKMbBebMgbKObBhbHMbMhbMibMjbMkbMlbMmbMnbJlbMobMpbGsbMqbMrbMsbHYbMtbMubMvbMwaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabbDWbFqbFqbFqbFqbFqbFqbMxbFqbMybFqbFqbFqbFqbFqbDWbDWaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMzbDZbMAbDZbMBaaaaabaaaaaabAgbMCbMDbMEbAgaaaaaaaaabFGbMFbMGbIhbFGbLnbJOaaabJPbMHbMIbMJbMKbGWbMLbMMbMNbMObFIbMPbMQbMRbMSbMTbMTbMTbMTbMUbzkbMWbMWbMXbMYbzmbzlbzubztbzsbYBbzrbzpbYBbzobzrbYBbYBbzpbzobYBbYBbzobYBbYBbzpbYBbzxbdZbeaaWTbeabzwbjLbxJbwrbxHbwdbwqbzibeabzybeWbGlbNnbNobNpbNqbNrbNsbNtbNnbBebNubNvbCCbBebBebNwbKObNxbHYbHYbGsbGsbGsbGsbGwbGsbNybJlbNzbGsbNAbHXbgQbHYbNBbNCbNDbHYaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaabDWbNEbNEbNEbNEbNEbNEbNFbFqbNGbNEbMybFqbFqbFqbFqbDWaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaabaaaaaaaaaaabaaaaaaaaabFGbNHbNIbNJbFGbLnbNKaaabNLbImbNMbNNbNObGWbGWbNPbNQbNRbNSbNTbNUbNVbNWbNWbNWbNWbNWbjzbjybNZbjxbjvbOcbjubjtbifbiebihbigbOjbOkbOlbOlbOjbOlbOlbOkbOlbOlbOlbOlbOlbOlbOkbiiaWTbijbikbilbimbinbiobipaGvaGQbbPbiaaGubFNbGjbeWbGlbidbicbibbOCbODbOEbOFbOGbBebBebOHbBebBebOIbOJbKObnCbOKaabbOLbOMbONbOObOPbOObOQbORbOSbGsbOTbGxbOUbHYbOVbOWbOWbOXaacaacaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOYbFobFobFobFobFobFobFobOZbFrbFqbFqbFqbFqbPabFrbDWaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaabaabaabaabaabaabbFGbFGbFGbFGbFGbPbbFGaaaaaaaaaaaabFIbPcbPdbPebPfbFIbPgbFIblxblwbPjbPkbPkblvbPmbPnbPobPpbPqbPrbPrbPrbltblubPrbPrbPubPqbPvbPrbPrbPrbltbPrbFNbFNbFNbFNbFNbFNbFNbFNbFNbeWaWTbjKbjIbirbitbjObjLbjMbjPbjQbiwbjAbiqbFNbGjbjBbjDbjCbjFbjEbjHbjGbPObPObPPbPQbPRbPSbnCbPTbnCbOJbKObnCbPUaabbOLbPVbPVbPWbPXbPYbPZbQabQbbGsbQcbGxbzTbHYbHYbHYbHYbHYaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaabDWbJzbJzbJzbJzbJzbJzbQdbFqbJybJzbQebFqbFqbFqbFqbDWaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaabQfbQgbLnbFGbFGbFGbFGbFGbFIbFIbFIbFIbFIbFIbFIbFIbQhbQibfubQkbQlbQmbQnbQnbQobfebfdbfbbfibQtbfgbQvaTSbQxbQybQzbQAbQBbQCbQDbQEbQFaabaaaaaaaaaaaaaaaaaabFNbedbeWaWTbdZbeaaWTbeabdZbeXaWTbeabeabeabeabeabFNbGjbeYbGlbQJbQJbQKbQLbeZbQNbQLbQObQPbQQbQRbQSbnCbQTbOJbKObQUbQVaabbOLbPVbQWbOObQXbOObQYbQZbRabGsbQcbGxbRbbRcbgQaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabbDWbFqbFqbFqbFqbFqbFqbMxbFqbQebFqbFqbFqbFqbFqbDWbDWaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabbRdbhZbRfbRgbRgbRhbRibRjbRkbRlbRmbRnbRobRnbRpbRkbhVbhUbRsbRtbRubRvbRwbRwbRxbRybfdbhSbfibQtbhTbQvbgAbRCbRDbREbRFbRGbRFbRHbRIbRJaabbRKbRKbRKbRKbRKaaabFNbggbgtbOjbOkbOlbOjbgubgxbgvbgwbgubOlbOlbOlbOlbOlbgCbgBbGlbRTbRUbRVbgRbgDbRYbRZbGlbGlbqzbSabqzbqzbqzbSbbScbSdbqzbGsbGsbGsbGsbGsbSebGsbGsbGsbGsbGsbQcbGxbSfbRcbgQaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaabDWbDWbLgbFqbFqbFqbFqbFqbFqbFqbFqbFqbFqbFqbDWbDWaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabSgaaaaabaabbShbShbShbShbShbShbShbShbSibSjbRkbSkbRlbRlbRnbSlbRpbRkbSmbSnbRsbSobSpbQnbSqboFbSrbSsboKboIboHboGbRFbQvbSxbRCbSybSzbSAbSBbSCbSDbSEbSFbnpbSHbSIbSJbSKbRKaaabFNboAboBboCboDboEdSMbSRbnKboybozbSRbSRbSVbSWbSRbSRdOGbeWbGlbGlbGlbGlbGlbGlbSYbGlbGlbSZbnobTbbTcbTdbqzbSabTebTfbqzaTRbThbTibTjbTkbQcbzTbzTbTlbzTbxBbQcbGxbTmbgQbgQbgQaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabbDVbDWbNGbNEbNEbFqbFqbFqbFqbFqbFqbFqbFqbDWbDWaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabTnbTobTpbTqbTqbTqbTrbTsbTtbTubTvbTwbTxbShbTybSjbRkbTzbRlbRmbRlbRnbTAbRkbTBbSnbRsbRtbTCbQnbQnbQnbTDbTEbqdbTGbTHbRFbqcbqbbRFbTKbSybSzbTLbTMbTMbTNbTObTPaabbTQbTRbSKbTSbRKaabbFNboPboYbFNaaaaabaaabTVboOboMboNbTVaabaabaaaaabbFNdSLboLbOlbOlbOlbOlbOlbOlbOjbOlbOlbOlbOlbOkbUbbOlbgubUcbUdbUebzjbznbUgbUgbUgbUhbUibUgbUgbUgbUgbxPbUjbUkbUlbUmbUnbgQbgQbgQbgQaaaaabaaaaaaaaaamRamRamRaabaaaaaaaabaaaaaaaabaaaaaabHZbDWbGzbDWbDWbFqbFqbFqbFqbFqbFqbFqbDWbDWaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUobUobUobUobUobUpbUqbUrbUsbUsbUtbShbUubUvblIbUxbUybUzbRlbRlbUAbRkbUBbUCblMbUEbUEbUFbUGbUHbndbUIbncbUKbULbRFbQvbRFbUMbUNbUObUPbUQbURbUSbUTbUUbUVblybSHbUXbSKbSKbRKaabbFNbTcbTcbFNaaaaabaaablzblAblBblCblzaabaabaaaaabbFNblHblGblFblEbKjblDblDbVhbVibVjbVkbSRbSRbSVbSWbSRbSRbVlbVmbVnbVobVobVpbVqbVqbVrbVobVobVpbVqbVqbVrbVobVsbzTbVtbVubVvbVwbVxbrAbVzbVAbVAbVAbVAbVAbVAbVAbVAbVAbVAbVAbVAbVAbVAbVAbVAbVBbVCbVCbVDbDWbDWbFqbFqbVEbFqbFqbDWbDWaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaabaabbVFbVGbVHbVIbVHbVJbVKbVLbVMbVMbVNbShbVObIhbRkbVPbRlbVQbRlbRlbRlbnnbTBbSnbRsbngbPkbVTbVUbnhbnlbnjbfdbnmbVZbRFbQvbRFbWabVUapHbWcbWdbWebWfbWgbWfbWhaabbRKbRKbRKbRKbRKaabbFNbFNbnfbFNaabaabaabbWjbWkbnebWmbWjaabaaaaaaaabbFNbFNbFNbFNbFNbWnbFNbFNbWobWpbWqbFNbFNaaaaaaaaaaaabWrbWsbWtbWubWraaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaabgQbWvbWwbWxbgQbgQbgQbgQaaaaabaaaaaaaaaamRamRamRaabaaaaaaaabaaaaaaaabaabaabbWybWzbWAbGAbDVbDWbDWbFqbFrbFqbDWbDWaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbVFbWBbWCbWDbWEbUrbWFbUrbWGbUrbWHbWIbWJbWKbRkbWLbRlbVQbRlbRlbWMbRkbWNbWObRscgJbPkbQncgIbWRboHcgDbfdcgHbUMcgkcgnbWWchTcinbWZbXabXbbXcbSAbXdbXebXfbnpbSHbXgbXhbXhbRKaabaabbTccgTbTcaaaaabaaadOvchPchFchEdOvaabaaaaaaaabaaaaaaaaabFNciobTccipbFNaaaaabaaaaaaaabaaaaaaaaaaaabXqbXrbXsbXtbXqaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaabXubXubXvbXwbXuaaaaaaaaaaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabbXxbDTbDTbDUbDVbDVbDWbDWbDWbDWbDXaabaabaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabbVFbXybXzbXAbXzbXBbXCbXDbXEbXFbXGbShbLnbIhbRkbXHbRlbXIbXJdQmdQlbRkbXMbSnbRscfWbXOcfNcfMbRIbXRcfLcfybRIbXUcfxcfwbRIcgdbXYbXZbYabYbbRFbYcbYdbYebTPaabbTQbYfbYgbYhbRKaabaaaaaaaaaaaaaaaaaaaaabYibTVcgebYkbYiaabaabaabaabaabaabaaabFNcgjcgibzqbFNaaaaabaaaaaaaabaaaaaaaaaaaabYnbYobYpbYqbYnaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaabXubYrbYsbYtbXuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabbUobUobUobUobUobShbShbShbShbShbShbShbLnbIhbRkbRkbRkbRkbRkbRkbRkbRkbXMbSnbRsclKbYvclLclMclOckZclaclbclgcllclHbQvbRFbYFbYGbYHbYIbYJbRFbYcbYKbYLbYMblybSHbYNbXhbXhbRKaabaaaaaaaaaaabaabaabaaabTVclVclSclRbTVbTVbTVbTVbTVbTVbTVaabbFNbFNbFNbFNbFNaaaaabaaaaaaaabaaaaaaaaaaaabYRbYSbYTbYUbYRaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaabXubYVbYWbYXbXuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbIhbFGbFGbFGbFGbYYbIhbIhbYZbZabZabZabZabZbbZcbZcbZdbZebZebZebZebZebZebZebRjbFGbZfbSnbRscjqbZhcjUbltbPrcebciscirciscjacjnbQvbRFbSybZobZpbZqbZrbRFbYcbYdbZsbTPaabbRKbRKbRKbRKbRKaabaaabTVbTVbTVbTVbTVbTVbTVbZtckDckCbZwcjYckwckpcjXcjYbTVaabaabaabaabaabaabaabbZBaabaabaabaabaabaabaabbZCbWrbZDbZEbZCaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaabXubZFbZGbZHbXuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabbZIbZJbZKbZLbZMbZNbIhbIhbSibZObIhbFGbFGbZPbZQbFGbFGbZRbZSbZQbFGbFGbZTbIhbSjbFGbXMbSnbRscmRbZVbQnbZWbPkbZXbZYbZZcmTbPqcmSbQvbRFbWacacbYHbVZcadcaecafcagcahbXfbnpbSHcaicajcakbRKaabaaabTVcalcnccnbcaobTVcmWcmVckDcmUbZwbWkcnacmZcnpbWkbTVaaaaaaaaaaabaaaaaaaaaaabaaaaaaaabaaaaaaaaaaaabWrcavcawcaxbWraaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaacaycazcaAcaBcaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaabIhbFGbFGbFGbFGcaDcaEcaEcaFcaGcaHcaGaaacaIaaaaaaaaaaaaaaaaaaaaabFGcaJbIhbSjbFGcaKcaLcaMcaNcaOcaPcaQcaRcaScaTcaUbQncmkcmqclWbRFbWacaccaYbVZcadcaZbYcbYdcbabTPaabbTQcbbcbccbdbRKaabaaabTVcmzcmKcmAbZwbTVcmtbZwcmwcmtbZwcbjcmycmxcbYcmQbTVaaaaaaaaaaabaaaaaaaaabWrbWrbWrbWrbWrbWrbWrbWrbWrcbocbpcbqbWraaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaabcbrcbscbraabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaabbFGcbtcaGcaGcbucaGcbvcaGcaGcbwcbxcaGcaGcbycbzcbxcaGcaGcaGcaGcbAcbBcbCcbDbRscbEcbFbQnbQobQnbQnbQnbQnbQncoGcoHcoIbRFbWacacbYHbVZcbJcbKcbLcbMcbNbYMblybSHcbOcajcajbRKaabcsJcbQcsycsxcbTcswcbTcsvcsjcpzcpycpmcoXccbcbTcoKcoWbTVaaaaaaaaaaabaaaaaaaaabWrcceccfccgcchcciccjcckcclccmccnccoccpccqaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaabccrccsccraabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalvalvalvalualualvalualualualUalualualualvalvaaaaaaaabaabaaaaaaaaaaaaaaaaaaaabbIkcbtcctccuccvccwccxccycczccAccBccCcaGccBccDccEccFccFccGcaGccHccIccJccKbRscbEccLccMbQobQnbSqbQnccNcnrcnKcnLcntbRFbWabRFccSbRFccTccUbYcbYdccVbTPaabbRKbRKbRKbRKbRKaabaaabTVcoFblAcoecoEcoCblCdTncozcofcoecnMcbVcoeblCcdfbTVaabaabaabaabaabaabaabbWrcdgcdhcdgcdicdjbYocdkcclcdlcdmcdlbWrbWraaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaabaaacdnaaaaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalvaaaaaaaabaabaaaaabaabaaaaaaaabaabaabaaaalvaaaaabaabaaaaaaaaaaaaaaaaaaaaaaaabJOcbtcdocdpcdqcdrcdscdscdscdscdtcducdvccFcdwccFccFcdxccFcdycdzcdAcdBccKbRscbEcdCcdDbQoccRcdFccQbQocdFccOdKHccPbRFbWabRFbSybZocdKcdLcdMcdNcdObXfbnpbSHcdPcdQcdQbRKaabaaabYicbjcdRcdSbTVcbRcbWcbVcbUcbSccacbZcbYcbXcccccdbTVaaaaaaaaaaabaaaaaaaaabWrcdgcdgcdgceccedccjceecefcegcehceicejbWraaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaabaaacekaaaaabaabaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalvaaacelcemcenaaacelcemcenaaacelcemcenaabceoaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaabJOcbtcdocepccFcdxceqccFccFccFccFccFcepcepccFccFccFccFcercescdzcetcdzceucevcdCcdCcewbQocexceycezbQodMtbPqcbPceCceDceEbWWbUOceFceGbSAbUQbYdceHbTPaabbTQceIceJceKbRKaabaabaabaabaabaabbTVcbibWkbWmcbGcbmbWjdTncbHbWjcbHdTnbTVaaaaaaaaaaabaaaaaaaaabWrcclcclcclcclcePbYoceQceRceSceTceUceVbWraaaaaaaaaaaaaaaceWceWceWceXaabaabaabaabcekaabaabaabaabaabalUceWceWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalvaaacelceYcenaaacelceYcenaaacelceYcenaabaabaabaabaaaaaaaaaaaaaaaaaaaabaabaabbJOcbtceZcepcfaccFcfbcdWcfdcfdcdwccFcepcfeccFccFccFccFcffcfgcfhcfibJZcfjcfkcflcfmcfnbQocexcdFcfobQocdYbPqbWabRFbRFceFbRIcfqbXRcfrcfsbQDcftcfubYMblybSHcfvcdQcdQbRKaabaaaaaaaabaaaaaabTVcdUbWkbWmbWkcdVbWjbWkbWmbWjbWmcdTbTVaaaaaaaaaaabaaaaaaaaabWrcceccfccgcfzcfAccjcfBcfCcfDcfEbYocfFbWraaaaaaaaaaaaaaaceWaaaaabaaaaabaaaaaaaaacfGaaaaabaabaaaaaaaaaaaaceWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUobUobUobUobUobUpbUqbUrbUsbUsbUtbShbUubUvblIbUxbUybUzbRlbRlbUAbRkbUBbUCblMbUEbUEbUFbUGbUHbndbUIbncbUKbULbRFbQvbRFbUMbUNbUObUPbUQbURbUSbUTbUUbUVblybSHbUXbSKbSKbRKaabbFNbTcbTcbFNaaaaabaaablzblAblBcbUblzaabaabaaaaabbFNblHblGblFblEbKjblDblDbVhbVibVjbVkbSRbSRbSVbSWbSRbSRbVlbVmbVnbVobVobVpbVqbVqbVrbVobVobVpbVqbVqbVrbVobVsbzTbVtbVubVvbVwbVxbrAbVzbVAbVAbVAbVAbVAbVAbVAbVAbVAbVAbVAbVAbVAbVAbVAbVAbVBbVCbVCbVDbDWbDWbFqbFqbVEbFqbFqbDWbDWaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaabaabbVFbVGbVHbVIbVHbVJbVKbVLbVMbVMbVNbShbVObIhbRkbVPbRlbVQbRlbRlbRlbnnbTBbSnbRsbngbPkbVTbVUbnhbnlbnjbfdbnmbVZbRFbQvbRFbWabVUapHbWcbWdbWebWfbWgbWfbWhaabbRKbRKbRKbRKbRKaabbFNbFNbnfbFNaabaabaabbWjbWkbnebWkbWjaabaaaaaaaabbFNbFNbFNbFNbFNbWnbFNbFNbWobWpbWqbFNbFNaaaaaaaaaaaabWrbWsbWtbWubWraaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaabgQbWvbWwbWxbgQbgQbgQbgQaaaaabaaaaaaaaaamRamRamRaabaaaaaaaabaaaaaaaabaabaabbWybWzbWAbGAbDVbDWbDWbFqbFrbFqbDWbDWaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbVFbWBbWCbWDbWEbUrbWFbUrbWGbUrbWHbWIbWJbWKbRkbWLbRlbVQbRlbRlbWMbRkbWNbWObRscgJbPkbQncgIbWRboHcgDbfdcgHbUMcgkcgnbWWchTcinbWZbXabXbbXcbSAbXdbXebXfbnpbSHbXgbXhbXhbRKaabaabbTccgTbTcaaaaabaaadOvchPchFcbmdOvaabaaaaaaaabaaaaaaaaabFNciobTccipbFNaaaaabaaaaaaaabaaaaaaaaaaaabXqbXrbXsbXtbXqaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaabXubXubXvbXwbXuaaaaaaaaaaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabbXxbDTbDTbDUbDVbDVbDWbDWbDWbDWbDXaabaabaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabbVFbXybXzbXAbXzbXBbXCbXDbXEbXFbXGbShbLnbIhbRkbXHbRlbXIbXJdQmdQlbRkbXMbSnbRscfWbXOcfNcfMbRIbXRcfLcfybRIbXUcfxcfwbRIcgdbXYbXZbYabYbbRFbYcbYdbYebTPaabbTQbYfbYgbYhbRKaabaaaaaaaaaaaaaaaaaaaaabYibTVcgebTVbYiaabaabaabaabaabaabaaabFNcgjcgibzqbFNaaaaabaaaaaaaabaaaaaaaaaaaabYnbYobYpbYqbYnaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaabXubYrbYsbYtbXuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabbUobUobUobUobUobShbShbShbShbShbShbShbLnbIhbRkbRkbRkbRkbRkbRkbRkbRkbXMbSnbRsclKbYvclLclMclOckZclaclbclgcllclHbQvbRFbYFbYGbYHbYIbYJbRFbYcbYKbYLbYMblybSHbYNbXhbXhbRKaabaaaaaaaaaaabaabaabaaabTVclVclScbSbTVbTVbTVbTVbTVbTVbTVaabbFNbFNbFNbFNbFNaaaaabaaaaaaaabaaaaaaaaaaaabYRbYSbYTbYUbYRaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaabXubYVbYWbYXbXuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbIhbFGbFGbFGbFGbYYbIhbIhbYZbZabZabZabZabZbbZcbZcbZdbZebZebZebZebZebZebZebRjbFGbZfbSnbRscjqbZhcjUbltbPrcebciscirciscjacjnbQvbRFbSybZobZpbZqbZrbRFbYcbYdbZsbTPaabbRKbRKbRKbRKbRKaabaaabTVbTVbTVbTVbTVbTVbTVbZtckDcbIbZwcjYckwckpcjXcjYbTVaabaabaabaabaabaabaabbZBaabaabaabaabaabaabaabbZCbWrbZDbZEbZCaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaabXubZFbZGbZHbXuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabbZIbZJbZKbZLbZMbZNbIhbIhbSibZObIhbFGbFGbZPbZQbFGbFGbZRbZSbZQbFGbFGbZTbIhbSjbFGbXMbSnbRscmRbZVbQnbZWbPkbZXbZYbZZcmTbPqcmSbQvbRFbWacacbYHbVZcadcaecafcagcahbXfbnpbSHcaicajcakbRKaabaaabTVcalcncchEcdUbTVcmWcmVckDcdIbZwbWkcnacmZcnpbWkbTVaaaaaaaaaaabaaaaaaaaaaabaaaaaaaabaaaaaaaaaaaabWrcavcawcaxbWraaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaacaycazcaAcaBcaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaabIhbFGbFGbFGbFGcaDcaEcaEcaFcaGcaHcaGaaacaIaaaaaaaaaaaaaaaaaaaaabFGcaJbIhbSjbFGcaKcaLcaMcaNcaOcaPcaQcaRcaScaTcaUbQncmkcmqclWbRFbWacaccaYbVZcadcaZbYcbYdcbabTPaabbTQcbbcbccbdbRKaabaaabTVcmzcmKcdebZwbTVcmtbZwcmwbZwbZwcbjcmycmxcbYcmQbTVaaaaaaaaaaabaaaaaaaaabWrbWrbWrbWrbWrbWrbWrbWrbWrcbocbpcbqbWraaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaabcbrcbscbraabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaabbFGcbtcaGcaGcbucaGcbvcaGcaGcbwcbxcaGcaGcbycbzcbxcaGcaGcaGcaGcbAcbBcbCcbDbRscbEcbFbQnbQobQnbQnbQnbQnbQncoGcoHcoIbRFbWacacbYHbVZcbJcbKcbLcbMcbNbYMblybSHcbOcajcajbRKaabcsJcbQcsycsxckCcswcbTcsvcsjcpzcimcpmcoXccbcbTcoKcoWbTVaaaaaaaaaaabaaaaaaaaabWrcceccfccgcchcciccjcckcclccmccnccoccpccqaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaabccrccsccraabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalvalvalvalualualvalualualualUalualualualvalvaaaaaaaabaabaaaaaaaaaaaaaaaaaaaabbIkcbtcctccuccvccwccxccycczccAccBccCcaGccBccDccEccFccFccGcaGccHccIccJccKbRscbEccLccMbQobQnbSqbQnccNcnrcnKcnLcntbRFbWabRFccSbRFccTccUbYcbYdccVbTPaabbRKbRKbRKbRKbRKaabaaabTVcoFblAcofcoEcoCblCdTncozcoecoecnMcbVcoeblCcdfbTVaabaabaabaabaabaabaabbWrcdgcdhcdgcdicdjbYocdkcclcdlcdmcdlbWrbWraaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaabaaacdnaaaaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalvaaaaaaaabaabaaaaabaabaaaaaaaabaabaabaaaalvaaaaabaabaaaaaaaaaaaaaaaaaaaaaaaabJOcbtcdocdpcdqcdrcdscdscdscdscdtcducdvccFcdwccFccFcdxccFcdycdzcdAcdBccKbRscbEcdCcdDbQoccRcdFccQbQocdFccOdKHccPbRFbWabRFbSybZocdKcdLcdMcdNcdObXfbnpbSHcdPcdQcdQbRKaabaaabYicbjcdRcdSbTVcbRcbWcbVcbUbWbccacbZcbYcbXcccccdbTVaaaaaaaaaaabaaaaaaaaabWrcdgcdgcdgceccedccjceecefcegcehceicejbWraaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaabaaacekaaaaabaabaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalvaaacelcemcenaaacelcemcenaaacelcemcenaabceoaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaabJOcbtcdocepccFcdxceqccFccFccFccFccFcepcepccFccFccFccFcercescdzcetcdzceucevcdCcdCcewbQocexceycezbQodMtbPqcbPceCceDceEbWWbUOceFceGbSAbUQbYdceHbTPaabbTQceIceJceKbRKaabaabaabaabaabaabbTVcbibWkbWmcbGbTZbWjdTncbHbWjcbHdTnbTVaaaaaaaaaaabaaaaaaaaabWrcclcclcclcclcePbYoceQceRceSceTceUceVbWraaaaaaaaaaaaaaaceWceWceWceXaabaabaabaabcekaabaabaabaabaabalUceWceWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalvaaacelceYcenaaacelceYcenaaacelceYcenaabaabaabaabaaaaaaaaaaaaaaaaaaaabaabaabbJOcbtceZcepcfaccFcfbcdWcfdcfdcdwccFcepcfeccFccFccFccFcffcfgcfhcfibJZcfjcfkcflcfmcfnbQocexcdFcfobQocdYbPqbWabRFbRFceFbRIcfqbXRcfrcfsbQDcftcfubYMblybSHcfvcdQcdQbRKaabaaaaaaaabaaaaaabTVbYkbWkbWmbWkcdVbWjbWkbWmbWjbWmcdTbTVaaaaaaaaaaabaaaaaaaaabWrcceccfccgcfzcfAccjcfBcfCcfDcfEbYocfFbWraaaaaaaaaaaaaaaceWaaaaabaaaaabaaaaaaaaacfGaaaaabaabaaaaaaaaaaaaceWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaluaabcelceYcenaaacelceYcenaabcelceYcenaabaaaaaaaabaabaaaaaaaaaaaaaaaaabaaaaaabNKcbtcaGcfHccFcfIcfJcfKcdHcdGcdHcdJcdHcfOcfPccBcfQcepcepcesbLycfRcfScfTcfUcfVdNgcfXcfYcfZcgaaqOcgccddbPqcdEbRFbRFcgfbRFbRFbRFbRHbXYcgfbYdbZsbTPaabbRKbRKbRKbRKbRKaabaaaaaaaabaaaaaabTVccXccZccYcdccdacglcgmccWcglccWcgmbTVaabaabaabaabaabaabaabbWrcdgcdgcdgcgocdjbYocgpcgqcgrcgsbYocgtbWrbWrbWrbWraaaaaaceWaaacgucgucgucgucguaabcgvaabcgucgucgucgucguaaaceWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaacelceYcenaabcelceYcenaaacelceYcenaaaaaaaaaaaaaaaaabaaaaabaaaaabaabaaaaaabFGcbtcaGcgwcgxcgxcgycaGcaGcaGcaGcaGcaGcaGcaGcaGcaGcaGcaGcaGbFGcgzbFGcgAbFGbPkcgBcgCdNHcnGcnUcobcsKcsLbPqceMcgKcgLcgMcgNcgOcgNcgMcgPcgMcgQceFcgRaabaabaabaabaabaabaabaaaaaaaaaaaaaaabTVbTVbTVceLceBbTVbTVcgUbTVbTVbTVcgUbYiaaaaaaaaaaaaaaaaaaaaabWrcdgcdgcdgcfzcgVccjcgWcgXcgYcgZchachachbchcchdbWraabaabceWaabchechfchfchfchfchgcgvchhchichichichichjaabceWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalvalvaluaabaaacelceYcenaabcelceYcenaaacelceYcenaabaaaaaaaaaaaaaabaabchkchlchlchlchlbFGbFGcbtcaGchmchnchnchochpchqchrchrchrchrchrchrchschrchrchtchtchrchuchvchwchxbPkchychzchAchBchCchDbQnceAcebboIceachGchHchIchJchKchLbRFchMchNchObRCaabaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaabaaabTVcbjcdZbTVaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaabWrcclcclcclcclchQbYocgpchRchScgsbYobYochUbYochVbWraaaaaaceWaabchWchWchWchWchWaaacgvaaachWchWchWchWchWaabceWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaacelceYcenaabcelceYcenaaacelceYcenaaaaaaaaaaaaaaaaabaaaaabaaaaabaabaaaaaabFGcbtcaGcgwcgxcgxcgycaGcaGcaGcaGcaGcaGcaGcaGcaGcaGcaGcaGcaGbFGcgzbFGcgAbFGbPkcgBcgCdNHcnGcnUcobcsKcsLbPqceMcgKcgLcgMcgNcgOcgNcgMcgPcgMcgQceFcgRaabaabaabaabaabaabaabaaaaaaaaaaaaaaabTVbTVcaoceLceBbTVbTVcgUbTVbTVbTVcgUbYiaaaaaaaaaaaaaaaaaaaaabWrcdgcdgcdgcfzcgVccjcgWcgXcgYcgZchachachbchcchdbWraabaabceWaabchechfchfchfchfchgcgvchhchichichichichjaabceWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalvalvaluaabaaacelceYcenaabcelceYcenaaacelceYcenaabaaaaaaaaaaaaaabaabchkchlchlchlchlbFGbFGcbtcaGchmchnchnchochpchqchrchrchrchrchrchrchschrchrchtchtchrchuchvchwchxbPkchychzchAchBchCchDbQnceAcebboIceachGchHchIchJchKchLbRFchMchNchObRCaabaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaabbTVcbjcdRcdZbTVaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaabWrcclcclcclcclchQbYocgpchRchScgsbYobYochUbYochVbWraaaaaaceWaabchWchWchWchWchWaaacgvaaachWchWchWchWchWaabceWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalvaaaaabaaaaabaabchXaabaabaabchXaabaaaaabchXaabaaaaaaaaaaaaaaachYchZciacibciccidciecifcaEcigcaGcaGcihciicaGcaGbPbcijcijcijcijcijcijcikcijcijcijcilcilarQdQicilcildQjciqchzchAbQnbQnbQnbQncfccfpcitciucivciwcixciycixciwcixcizcixcizciAaabaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaabaaaaaaaaaciBaaaaaaaaaaaaaabaaaaabaaaaaaaaaaaaaaaaaaaaaaaabWrcceccfccgciCcfAccjciDbYqciEciFciFciGciHciIciJbWraaaaaaceWaaaaabaaaaabaabaabaaacgvaaaaabaaaaabaaaaabaaaceWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaluaabciKciLciLciMciNciNciNciNciNciNciNciNciNciNciNciNciNciNciOciPciQciRciSciTciUciVciWbIhcbtciXcaGcaGcaGcaGbIhbPbcijciYciZceOcjbcjccjdcjecjfcjgcjhcjicjjcjkcjlcjmdOjcjocjpchAbQnbQnbQnbQndOkbPkaabcjraabcjsaabcjraabcjsaabcjtaabcjtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacjuaaaaaaaaaaaaaabaaaaabaaaaaaaaaaaaaaaaaaaaaaaabWrcdgcdhcdgcjvcdjbYobYpbYqcjwbYobYocjxcclcclcclbWraaaaaaceWaaacgucgucgucgucguaabcgvaabcgucgucgucgucguaabceWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalvaaaaabaaaaabaabcjyaabaaaaabcjyaabaaaaabcjyaabaaaaaaaaaaaaaaachYchZcjzcjAcjBcjCchlcjDbIhcjEcaEcaEcaEcaEcaEcaEcjFcijcjGcjHcjIcjIcjJcjKcjScjTcjOcjPcjQcjRcgGcgFcjNcjMcgEchzchAcjWbYDbQnbQnbYEbPkbRKcjZbTQcjZbRKcjZbTQcjZbRKckabTQckbbRKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWrcdgcdgcdgciCckcckdckeckfckgbYobYockhbYockibYobXqaabaabceWaabchechfchfchfchfchgcgvchhchichichichichjaabceWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -10363,7 +10368,7 @@ cqCcrrcrxcrEcrCcrvcrucrAcrvcrrcrxcrEcrCcrvcrucrAcrvcrucrAcrrcrxcrEcrCcrvcrucrAcq cqFcrAcrwcrBcrFcrEcrxcrDcrEcrAcrwcrBcrFcrEcrxcrDcrEcrxcrDcrAcrwcrBcrFcrEcrxcrDcqGcrmcqDcrycrCcrvcskcvOcvqcvJcvpcvvcvwcvIcvJcvKcvscvrcvLcvMcvvcvwcvIcvJcvlcrAcrzcrFcqBcrmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacwMcxdcxdcxdcxdcxdcxXcxYcxZcyacyacyacybcxYcyccxdcxdcxdcxdcxHcxdcxdcxecxdcxecxdcxfcxdcxfcwMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacydcyecyecyfcygcwzcxwcxxcwzcyhcydaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa cqIcrscrscrycrrcrBcrwcrtcrBcrscrscrycrrcrBcrwcrtcrBcrwcrtcrscrscrycrrcrBcrwcrtcqOcrmcqJcrAcrFcrEcyicvtcvwcvqcvvcvrcvLcvxcvqcvpcvJcvIcvOcvucvrcvLcvxcvqcvycrDcrvcrrcqKcrmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacwMcxdcxdcxdcxdcxdcxYcyjcykcylcymcyncyocyocxYcypcxdcxdcxVcxVcxVcxVcxVcxVcxVcxVcyqcyrcxVcwMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacwocyscyscyscytcwzcxwcxxcwzcyucwocyvcyvcyvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa cqHcrzcrzcrAcrucrycrscrCcrycrzcrzcrAcrucrycrscrCcrycrscrCcrzcrzcrAcrucrycrscrCcqLcrmcqGcrDcrrcrBcywcvKcvLcvwcvrcvIcvOcvMcvwcvvcvqcvxcvtcvscvIcvOcvMcvwcsucrtcrEcrucqNcrmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacwMcxdcxdcxdcxdcxdcxYcyxcykcykcyycykcykcykcxYcypcxdcyzcyAcyBcyBcyCcwMcwMcwMcwMcwMcwMcwMcwMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacwocyDcyEcyscyFcwzcwzcwzcwzcwzcwscyvcyvcyvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -cqDcrvcrvcrDcrxcrAcrzcrFcrAcrvcrvcrDcrxcrAcrzcrFcrAcrzcrFcrvcrvcrDcrxcrAcrzcrFcqBcrmcqOcrtcrucrycwucvpcvOcvLcvIcvxcrucvucvLcvrcvwcvMcrxcvJcvxcvtcvucvLcvPcrCcrBcrxcqEcrmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacwMcxdcxdcxdcxdcxdcxYcyGcykcykcykcyHcykcyIcxYcypcxHcyzcyJcyKcyKcyKcyLcyMcwMcyNcyOcwMcwMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacwocyPcyscyscygcwzcwPcwPcwPcwRcwocyvcyvcyvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +cqDcrvcrvcrDcrxcrAcrzcrFcrAcrvcrvcrDcrxcrAcrzcrFcrAcrzcrFcrvcrvcrDcrxcrAcrzcrFcqBcrmcqOcrtcrucrycwucvpcvOcvLcvIcvxcrucvucvLcvrcvwcvMcrxcvJcvxcvtcvucvLcvPcrCcrBcrxcqEcrmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacwMcxdcxdcxdcxdcxdcxYcyGcykcykcykcyHcykcyIcxYcypcxHcyzcyJcyKcyKcyKcmAclRcwMcyNcyOcwMcwMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacwocyPcyscyscygcwzcwPcwPcwPcwRcwocyvcyvcyvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa cqJcrEcrEcrtcrwcrDcrvcrrcrDcrEcrEcrtcrwcrDcrvcrrcrDcrvcrrcrEcrEcrtcrwcrDcrvcrrcqKcrmcqLcrCcrxcrAcsAcvvcvtcvOcvxcvpcrBcvIcvJcvucvrcvqcrucvvcvMcvKcvscvOcvTcrFcrycrwcqMcrmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacwMcxdcxdcxdcxdcxdcyQcxYcxYcxYcyRcxYcxYcxYcyScxdcxdcyTcyJcyKcyKcyUcyKcyKcyVcyWcyWcyXcwMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacwocyDcyEcyscyYcwzcyZczaczbcwycwocyvcyvcyvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa cqGcrBcrBcrCcrscrtcrEcrucrtcrBcrBcrCcrscrtcrEcrucrtcrEcrucrBcrBcrCcrscrtcrEcrucqNcrmcqBcrFcrwcrDcxccvrcvKcvtcvMcvvcrycrEcrtcrAcrvcrCcrxcvrcvucvpcvJcvtcvXcrrcrAcrscqPcrmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacwMcxdcxdcxdcxdcxdcxdcxdcxYczccykczdcxYczecxVcxVcxVczfczgcyKczhcziczjcyKcwMcyWczkczkcwMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxhczlczlcwrcwrczmcwrcwrczlczlcxjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa cqOcqMcqIcqKcqPcqDcqFcqCcqOcqHcqLcqGcqNcqBdTjdTjdTjdTjdTjcqIcqKcqCcqGcqPcqBcqHcqEcrmcqKcrrcrscrtcuRctlcsOcuWctMctcctSctIcuBcugctwcuEcsOctlctScsUcuucuWctIcrucrDcrzcqCcrmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacwMcxdcxdcxdcxdcxdcxdcxdcxYcykcykcykcxYcyAcyBcyBcyBcyCcwMcyKczhcznczjcyKcwMcwMcwMcwMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxhcwtczocxwcwzcxxczpcwqcxjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa