From 59834d2ed9832818a6972f3840e98ed44eab4e30 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Sat, 8 Jun 2013 12:39:03 +0400 Subject: [PATCH 01/68] Added new reagent container - vial. basically 15u beaker. --- .../reagents/reagent_containers/glass.dm | 10 ++++++++++ icons/obj/chemical.dmi | Bin 30294 -> 30335 bytes icons/obj/reagentfillings.dmi | Bin 2091 -> 1297 bytes 3 files changed, 10 insertions(+) diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 553b5953c3..6f6db60299 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -218,6 +218,16 @@ user.drop_from_inventory(src) del(src) +/obj/item/weapon/reagent_containers/glass/beaker/vial + name = "vial" + desc = "Small glass vial. Can hold up to 20 units." + 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/icons/obj/chemical.dmi b/icons/obj/chemical.dmi index 313a90b3053931370e6c76a8f84a810bc05ac2d0..1c744c70e2fa2b7180f753474c9181549b94f7df 100644 GIT binary patch delta 11013 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 a?h?$a@>X}a?L`AXpJ$3M9+xYah5a9?AgpKr delta 11023 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 BiGlzC diff --git a/icons/obj/reagentfillings.dmi b/icons/obj/reagentfillings.dmi index fbf42ca03d52b767d6bb19a1aad5374398e867ca..f236fbc2c0609a3fa14672c8343e9e4d453ebbe5 100644 GIT binary patch literal 1297 zcmeAS@N?(olHy`uVBq!ia0vp^3qY8I4M=vMPuB%fH>yG+N?cNllZ!G7N;32F7#J$% zOr5xw>yU#$%j-MAI#JrkqseXH1)y(17oLOJ~Y@Efk=QHnz#CJ2*KTm%A`1A2s+ZZp` zGsoZVGCt$q*MDaHRy+QO{kBRwEe}{*%zc@YQJj0g`p1vOpZmXBOaltudw#fgM*X+! z13S$g$kzP1_;c^ghPR*3|N9|jp1^;OUFDRuBA%$mwS@dsz!mrzY zm9jrRKR+IHYI)EpAZfpJivH7=FE>8bWAWHM{h{sFHgf@m?XM;79f&T}Hh(2_=iw#m z4U9W|kH6@<*`RIy($j<8Orf^t&IGdurMD8%wWsf6x!v&P>JHi5 z15>^C3+Nu0x?AFbe$~UDQy9coUE8I|=LCT+yx%4K;8gDR+sB1& z)h*>H`1+?gT4%8+rYZCK$H))$?R6*4SY2+I3oPRpJYD@<);T3K F0RXA!NLBy< literal 2091 zcmbuAc{tPy7sr3oFfz!JWeRa`>Qa`mWF14{TC!A@TTxuH(^$qn7?dp%Lo;P8xd~$_ zUB)tE44E61?TUhqd%Duty<>Im^pa_OP_YI$cMbdxv|4`G=tWQFj3#npp6t6Pj!)mfBBo(EO+6 z%H`$P_$#!O_O5%wt<5Lit6QL^FH-ns(S=DlB?kxB^hXw7q>zHyDf-R3e2^`MZFR-U zJOGKj?*cY3>fR9)Kb@5H<&wSxYEyNP6eUMBts5!W_?5M1k=a=$nOv^3p=gKbrCV9& z1XOX#OpKl28YcW)Qy&hX)=^|L$MF|B?-HaOtc*OpAmnp^tS(RAq>{SC-B;HjAZaX9%w8{u!iU zo9YuS{W#iAdb;MMbYb&OD)&hKteh(u=9T{WHsL!YUwjGkr|l67JOSP`yDTBrcjWX3 zCcm4?tp{&b8V|@kq~H=LxWud-@y2NV>gq%b_-B=uR%<|TknkgOO;d@tfVCu8>FN)N zzt1kom(t2e0k6npX&eq$SzDVOKe58my&i*vT=$p*r;joifht&ArPUNE;Q=LQ=ae3@ zyf#*S zP_QgpRGlb9p)Ya|H!Hs0T>t5dfKaEHntD2^z-9IZAgvInTr zY2fhOqqJGL&wjkTp2_|RAjIUkmqVXumX-(+WT!u_Fw~@~3S57vvA?yHBG9Zb z#Jp?7`gTgABO+7=%g?kCN(2D(HXDw7pbx&Oa|*f;RO6>Z!sq8pdVe8;)cm%i*}a)i z7>aqy;nPRt)51c|U~X=Z@f&@J-!%&T4^&jkx}EYprn<})b5h9S-P9NMC>#B$*hm3x zDl{c4#|L1@Vbv?2p8%GtQzIy0;h8S7uK6EVC!=L$WnIGyzp0%!%I8Nw8fIDWMpWlctXcC+vHw3;Os1NlJTTY6u;D*>XwC4R#CG+ z`wIf4%9(2T-$^&8b3XXYKNFimw*WOC1I)U*{QUiIum~+JEn{0b+pBNM^9n}slwNiF`&Po!bhn7#76$ z-FNbGg$_K7n1%XJ+|do55~jA#cT6o(G|>kJ$nkm}BflG$lVWGr9I@ikOIHXAu!*J3 z8OqTFD$NYFXD~|193N`<;>U8Hr;LnDC}-Ju*d(3j#fKX=J{4~naY53eGjL(ykez9N z`DL=4S9#nf+)yj|U*?QEXV0GXWN9X|Pg$2GJgoz=N%^b9{Ji z2^}35ha2+6?UAw1l};@hxFi6*z05YKN($)a`bt;YnA5dn%fvP+!+p}sGA{1d3Yt)1 z6m5~k?`mX-ONAu{Rr)`@>xObAl)Sq$)Ts+a zt1%KSZGk0%Sm|A}As{M^mv#Q_B1p3Tn*f~JHn+VSsAE^SytZ0n5W}5w;w@$}$NH%N z%T`gWa$^VMh}R&J{F(m{j{qh8GI2|4FFuRTXnITy=>+%AhA2v8ctlo}wbryr2(h%4 dUwj8 Date: Sat, 8 Jun 2013 13:00:37 +0400 Subject: [PATCH 02/68] Moved virus2 out of WIP folder. It's been finished years ago... Also removed Disease2 folder which is just older versions of same files. --- .../virus2/Disease2/analyser.dm | 75 ------- .../virus2/Disease2/biohazard destroyer.dm | 20 -- .../virus2/Disease2/cureimplanter.dm | 42 ---- .../virus2/Disease2/diseasesplicer.dm | 202 ------------------ .../virus2/Disease2/dishincubator.dm | 176 --------------- .../virus2/Disease2/isolator.dm | 139 ------------ .../virus2/Disease2/monkeydispensor.dm | 30 --- .../virus2/analyser.dm | 0 .../virus2/antibodies.dm | 0 .../virus2/base.dm | 0 .../virus2/biohazard destroyer.dm | 0 .../virus2/cureimplanter.dm | 0 .../virus2/curer.dm | 0 .../virus2/diseasesplicer.dm | 0 .../virus2/dishincubator.dm | 0 .../virus2/isolator.dm | 0 .../virus2/monkeydispensor.dm | 0 17 files changed, 684 deletions(-) delete mode 100644 code/WorkInProgress/virus2/Disease2/analyser.dm delete mode 100644 code/WorkInProgress/virus2/Disease2/biohazard destroyer.dm delete mode 100644 code/WorkInProgress/virus2/Disease2/cureimplanter.dm delete mode 100644 code/WorkInProgress/virus2/Disease2/diseasesplicer.dm delete mode 100644 code/WorkInProgress/virus2/Disease2/dishincubator.dm delete mode 100644 code/WorkInProgress/virus2/Disease2/isolator.dm delete mode 100644 code/WorkInProgress/virus2/Disease2/monkeydispensor.dm rename code/{WorkInProgress => modules}/virus2/analyser.dm (100%) rename code/{WorkInProgress => modules}/virus2/antibodies.dm (100%) rename code/{WorkInProgress => modules}/virus2/base.dm (100%) rename code/{WorkInProgress => modules}/virus2/biohazard destroyer.dm (100%) rename code/{WorkInProgress => modules}/virus2/cureimplanter.dm (100%) rename code/{WorkInProgress => modules}/virus2/curer.dm (100%) rename code/{WorkInProgress => modules}/virus2/diseasesplicer.dm (100%) rename code/{WorkInProgress => modules}/virus2/dishincubator.dm (100%) rename code/{WorkInProgress => modules}/virus2/isolator.dm (100%) rename code/{WorkInProgress => modules}/virus2/monkeydispensor.dm (100%) diff --git a/code/WorkInProgress/virus2/Disease2/analyser.dm b/code/WorkInProgress/virus2/Disease2/analyser.dm deleted file mode 100644 index abc123369a..0000000000 --- a/code/WorkInProgress/virus2/Disease2/analyser.dm +++ /dev/null @@ -1,75 +0,0 @@ -/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 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/modules/virus2/analyser.dm similarity index 100% rename from code/WorkInProgress/virus2/analyser.dm rename to code/modules/virus2/analyser.dm diff --git a/code/WorkInProgress/virus2/antibodies.dm b/code/modules/virus2/antibodies.dm similarity index 100% rename from code/WorkInProgress/virus2/antibodies.dm rename to code/modules/virus2/antibodies.dm diff --git a/code/WorkInProgress/virus2/base.dm b/code/modules/virus2/base.dm similarity index 100% rename from code/WorkInProgress/virus2/base.dm rename to code/modules/virus2/base.dm 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/WorkInProgress/virus2/cureimplanter.dm b/code/modules/virus2/cureimplanter.dm similarity index 100% rename from code/WorkInProgress/virus2/cureimplanter.dm rename to code/modules/virus2/cureimplanter.dm diff --git a/code/WorkInProgress/virus2/curer.dm b/code/modules/virus2/curer.dm similarity index 100% rename from code/WorkInProgress/virus2/curer.dm rename to code/modules/virus2/curer.dm diff --git a/code/WorkInProgress/virus2/diseasesplicer.dm b/code/modules/virus2/diseasesplicer.dm similarity index 100% rename from code/WorkInProgress/virus2/diseasesplicer.dm rename to code/modules/virus2/diseasesplicer.dm diff --git a/code/WorkInProgress/virus2/dishincubator.dm b/code/modules/virus2/dishincubator.dm similarity index 100% rename from code/WorkInProgress/virus2/dishincubator.dm rename to code/modules/virus2/dishincubator.dm diff --git a/code/WorkInProgress/virus2/isolator.dm b/code/modules/virus2/isolator.dm similarity index 100% rename from code/WorkInProgress/virus2/isolator.dm rename to code/modules/virus2/isolator.dm diff --git a/code/WorkInProgress/virus2/monkeydispensor.dm b/code/modules/virus2/monkeydispensor.dm similarity index 100% rename from code/WorkInProgress/virus2/monkeydispensor.dm rename to code/modules/virus2/monkeydispensor.dm From 1820a227a14b606a0a4acf9e55feacb4c47b6c4a Mon Sep 17 00:00:00 2001 From: Chinsky Date: Sat, 8 Jun 2013 17:36:12 +0400 Subject: [PATCH 03/68] Virus2 Refactoring, Part I - Machinery. -Removed functions already defined in parent classes. -Replaced checks in Topic() with parent class ones. -Removed two unused files (there are duplicates in unused folder anyway) -Removed commented out lines, mostly pre-antibody curing code. -Shuffled code around for better readability (like antibody list) -Moved various devices and items defines to separate file. --- baystation12.dme | 14 +- code/modules/virus2/analyser.dm | 21 +-- code/modules/virus2/antibodies.dm | 70 ++++--- code/modules/virus2/cureimplanter.dm | 43 ----- code/modules/virus2/curer.dm | 52 +----- code/modules/virus2/diseasesplicer.dm | 82 ++------- code/modules/virus2/dishincubator.dm | 244 +++++++++++-------------- code/modules/virus2/isolator.dm | 216 ++++++++-------------- code/modules/virus2/monkeydispensor.dm | 30 --- 9 files changed, 257 insertions(+), 515 deletions(-) delete mode 100644 code/modules/virus2/cureimplanter.dm delete mode 100644 code/modules/virus2/monkeydispensor.dm diff --git a/baystation12.dme b/baystation12.dme index ef839733bc..eb2d25d40c 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -1251,6 +1251,13 @@ #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\base.dm" +#include "code\modules\virus2\curer.dm" +#include "code\modules\virus2\diseasesplicer.dm" +#include "code\modules\virus2\dishincubator.dm" +#include "code\modules\virus2\isolator.dm" #include "code\WorkInProgress\autopsy.dm" #include "code\WorkInProgress\buildmode.dm" #include "code\WorkInProgress\explosion_particles.dm" @@ -1306,13 +1313,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/modules/virus2/analyser.dm b/code/modules/virus2/analyser.dm index 3604d7955f..82d1b633b8 100644 --- a/code/modules/virus2/analyser.dm +++ b/code/modules/virus2/analyser.dm @@ -14,19 +14,14 @@ 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 @@ -34,8 +29,6 @@ if(stat & (NOPOWER|BROKEN)) return use_power(500) - //src.updateDialog() - if(scanning) scanning -= 1 @@ -46,10 +39,8 @@ 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]" + + r += "
Antigen pattern: [antigens2string(dish.virus2.antigen)]" var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(src.loc) P.info = r @@ -59,8 +50,8 @@ 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) + M.state("\The [src.name] prints a sheet of paper") + else if(dish && !scanning && !pause) if(dish.virus2 && dish.growth > 50) dish.growth -= 10 @@ -71,8 +62,6 @@ 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) + M.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 index b8810e322d..9d4c63ae2c 100644 --- a/code/modules/virus2/antibodies.dm +++ b/code/modules/virus2/antibodies.dm @@ -1,23 +1,5 @@ //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 @@ -33,26 +15,38 @@ 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") +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 -/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]") +// 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/modules/virus2/cureimplanter.dm b/code/modules/virus2/cureimplanter.dm deleted file mode 100644 index 80354e5765..0000000000 --- a/code/modules/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/modules/virus2/curer.dm b/code/modules/virus2/curer.dm index 4a7e56c1a1..65b030ba82 100644 --- a/code/modules/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) @@ -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/diseasesplicer.dm b/code/modules/virus2/diseasesplicer.dm index 5a558546e4..0165e8ee63 100644 --- a/code/modules/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 index f2aefe07ea..e777c63552 100644 --- a/code/modules/virus2/dishincubator.dm +++ b/code/modules/virus2/dishincubator.dm @@ -14,156 +14,132 @@ 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) +/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)) - meteorhit() - del(src) - return + 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 - 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." + 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.beaker = B + src.dish = 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 + user << "You add the dish to the machine!" + src.updateUsrDialog() - 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 - 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 (href_list["ejectchem"]) 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") + 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() +/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 += "
" + 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) +/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 + 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/isolator.dm b/code/modules/virus2/isolator.dm index d337959fd6..acd92c395c 100644 --- a/code/modules/virus2/isolator.dm +++ b/code/modules/virus2/isolator.dm @@ -8,154 +8,86 @@ 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) +/obj/machinery/disease2/isolator/attackby(var/W as obj, var/mob/user) + if(!istype(W,/obj/item/weapon/reagent_containers/syringe)) 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 + var/obj/item/weapon/reagent_containers/syringe/B = W - if(src.beaker) - user << "A syringe is already loaded into the machine." - 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" + 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 +/obj/machinery/disease2/isolator/Topic(href, href_list) + if(..()) return - usr.machine = src - if(!beaker) 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 + +/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 - - 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" + dat += "Eject

" + if(!R.total_volume) + dat += "[beaker] is empty." 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 + 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) +/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/monkeydispensor.dm b/code/modules/virus2/monkeydispensor.dm deleted file mode 100644 index aee24b0d4a..0000000000 --- a/code/modules/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 From 5703b8089d683e70aed7d360783ef9c3d9dd1324 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Sat, 8 Jun 2013 18:44:57 +0400 Subject: [PATCH 04/68] -Forgot to commit one file for previous iteration. -Fixed derp with analyser. Refactoring virus2, Part II - Viruses. -Removed obsolete curing/resistance methods. -Split base.dm into disease2.dm, effect.dm, helpers.dm. --- baystation12.dme | 4 + code/modules/virus2/analyser.dm | 4 +- code/modules/virus2/base.dm | 601 --------------------------- code/modules/virus2/disease2.dm | 135 ++++++ code/modules/virus2/effect.dm | 268 ++++++++++++ code/modules/virus2/helpers.dm | 83 ++++ code/modules/virus2/items_devices.dm | 81 ++++ 7 files changed, 573 insertions(+), 603 deletions(-) delete mode 100644 code/modules/virus2/base.dm create mode 100644 code/modules/virus2/disease2.dm create mode 100644 code/modules/virus2/effect.dm create mode 100644 code/modules/virus2/helpers.dm create mode 100644 code/modules/virus2/items_devices.dm diff --git a/baystation12.dme b/baystation12.dme index eb2d25d40c..2fd6ab4398 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -1255,9 +1255,13 @@ #include "code\modules\virus2\antibodies.dm" #include "code\modules\virus2\base.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" diff --git a/code/modules/virus2/analyser.dm b/code/modules/virus2/analyser.dm index 82d1b633b8..c792e81c6a 100644 --- a/code/modules/virus2/analyser.dm +++ b/code/modules/virus2/analyser.dm @@ -50,7 +50,7 @@ dish = null icon_state = "analyser" - M.state("\The [src.name] prints a sheet of paper") + src.state("\The [src.name] prints a sheet of paper") else if(dish && !scanning && !pause) if(dish.virus2 && dish.growth > 50) @@ -62,6 +62,6 @@ spawn(25) dish.loc = src.loc dish = null - M.state("\The [src.name] buzzes") + src.state("\The [src.name] buzzes") pause = 0 return \ No newline at end of file diff --git a/code/modules/virus2/base.dm b/code/modules/virus2/base.dm deleted file mode 100644 index 3d8954fc99..0000000000 --- a/code/modules/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/modules/virus2/disease2.dm b/code/modules/virus2/disease2.dm new file mode 100644 index 0000000000..a9a8e6e45d --- /dev/null +++ b/code/modules/virus2/disease2.dm @@ -0,0 +1,135 @@ +/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 + +/datum/disease2/disease/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" + +/datum/disease2/disease/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) + src.cure(mob) + 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 + +/datum/disease2/disease/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) + +/datum/disease2/disease/proc/minormutate() + var/datum/disease2/effectholder/holder = pick(effects) + holder.minormutate() + infectionchance = min(10,infectionchance + rand(0,1)) + +/datum/disease2/disease/proc/majormutate() + var/datum/disease2/effectholder/holder = pick(effects) + holder.majormutate() + +/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 + 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 + return equal diff --git a/code/modules/virus2/effect.dm b/code/modules/virus2/effect.dm new file mode 100644 index 0000000000..848e253b54 --- /dev/null +++ b/code/modules/virus2/effect.dm @@ -0,0 +1,268 @@ +/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_greater() + var/list/datum/disease2/effect/list = list() + for(var/e in (typesof(/datum/disease2/effect/greater) - /datum/disease2/effect/greater)) + var/datum/disease2/effect/f = new e + if(f.stage == src.stage) + list += f + effect = pick(list) + chance = rand(1,6) + +/datum/disease2/effectholder/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) + +/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_greater() + +/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/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 + chance_maxm = 10 + +/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/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") + +/datum/disease2/effect/lesser/giggle + name = "Uncontrolled Laughter Effect" + stage = 3 + activate(var/mob/living/carbon/mob,var/multiplier) + mob.say("*giggle") diff --git a/code/modules/virus2/helpers.dm b/code/modules/virus2/helpers.dm new file mode 100644 index 0000000000..17e98f8447 --- /dev/null +++ b/code/modules/virus2/helpers.dm @@ -0,0 +1,83 @@ +//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(M.virus2) + return + if(!disease) + 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) + 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() + +//Infects mob M with random lesser disease, if he doesn't have one +/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 + +//Infects mob M with random greated disease, if he doesn't have one +/proc/infect_mob_random_greater(var/mob/living/carbon/M) + if(!M.virus2) + M.virus2 = new /datum/disease2/disease + M.virus2.makerandom(1) + +//Fancy prob() function. +/proc/dprob(var/p) + return(prob(sqrt(p)) && prob(sqrt(p))) diff --git a/code/modules/virus2/items_devices.dm b/code/modules/virus2/items_devices.dm new file mode 100644 index 0000000000..c5449ae749 --- /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(!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 + +///////////////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 From 7a8a822a92941ecf06c84a0fa410986dc68fda67 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Sun, 9 Jun 2013 13:31:16 +0400 Subject: [PATCH 05/68] Made it possible for mob to be infected with several viruses at once. --- baystation12.dme | 1 - code/game/gamemodes/epidemic/epidemic.dm | 6 +- code/game/gamemodes/events/VirusEpidemic.dm | 2 +- code/game/machinery/adv_med.dm | 2 +- .../effects/decals/Cleanable/humans.dm | 4 +- code/game/objects/items/devices/scanners.dm | 2 +- code/game/turfs/simulated.dm | 6 ++ .../mob/living/carbon/carbon_defines.dm | 3 +- code/modules/mob/living/carbon/human/life.dm | 33 +++++----- code/modules/mob/living/carbon/monkey/life.dm | 34 +++++----- code/modules/organs/blood.dm | 8 ++- code/modules/reagents/Chemistry-Reagents.dm | 13 ++-- code/modules/virus2/disease2.dm | 62 +++++-------------- code/modules/virus2/effect.dm | 6 +- code/modules/virus2/helpers.dm | 37 ++++++----- code/modules/virus2/items_devices.dm | 4 +- 16 files changed, 106 insertions(+), 117 deletions(-) diff --git a/baystation12.dme b/baystation12.dme index 2fd6ab4398..fe673330dc 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -1253,7 +1253,6 @@ #include "code\modules\surgery\surgery.dm" #include "code\modules\virus2\analyser.dm" #include "code\modules\virus2\antibodies.dm" -#include "code\modules\virus2\base.dm" #include "code\modules\virus2\curer.dm" #include "code\modules\virus2\disease2.dm" #include "code\modules\virus2\diseasesplicer.dm" diff --git a/code/game/gamemodes/epidemic/epidemic.dm b/code/game/gamemodes/epidemic/epidemic.dm index 0d4a20ff2f..5c84612dbe 100644 --- a/code/game/gamemodes/epidemic/epidemic.dm +++ b/code/game/gamemodes/epidemic/epidemic.dm @@ -124,10 +124,10 @@ for(var/i = 0, i < lethal_amount, i++) var/mob/living/carbon/human/H = pick(crew) - if(H.virus2) + if(lethal in H.virus2) i-- continue - H.virus2 = lethal.getcopy() + H.virus2 += lethal.getcopy() infectees += H var/mob/living/carbon/human/patient_zero = pick(infectees) @@ -169,7 +169,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/adv_med.dm b/code/game/machinery/adv_med.dm index 85248f5dc6..10442ca623 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/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 172eca9ae9..e5b6808807 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 = null diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index f86f38cc83..0ceeb67411 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -129,7 +129,7 @@ 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) + if(M:virus2.len) 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.") diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index 16d88a0ea0..92c23b472f 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 |= 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 = M.virus2.Copy() 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 = M.virus2.Copy() 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/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 2ea08f56a4..0240cfdc62 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. diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index be07fcba53..07396a3996 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -1326,28 +1326,29 @@ 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/datum/disease2/disease/V in virus2) + 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/datum/disease2/disease/V in B.virus2) + 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/datum/disease2/disease/V in M.virus2) + infect_virus2(src,V) + + for (var/datum/disease2/disease/V in virus2) + 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) diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm index 45e57a3da7..1d4c4912dd 100644 --- a/code/modules/mob/living/carbon/monkey/life.dm +++ b/code/modules/mob/living/carbon/monkey/life.dm @@ -150,28 +150,34 @@ 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/datum/disease2/disease/V in virus2) + 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/datum/disease2/disease/V in B.virus2) + 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/datum/disease2/disease/V in M.virus2) + infect_virus2(src,V) + + for (var/datum/disease2/disease/V in virus2) + 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/organs/blood.dm b/code/modules/organs/blood.dm index 882582e4a3..227fbcd5a6 100644 --- a/code/modules/organs/blood.dm +++ b/code/modules/organs/blood.dm @@ -164,7 +164,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 //set reagent data B.data["donor"] = src if(src.virus2) - B.data["virus2"] = src.virus2.getcopy() + B.data["virus2"] = src.virus2.Copy() B.data["antibodies"] = src.antibodies B.data["blood_DNA"] = copytext(src.dna.unique_enzymes,1,0) if(src.resistances && src.resistances.len) @@ -200,7 +200,11 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 else vessel.add_reagent("blood", amount, injected.data) vessel.update_total() - + var/list/viruses = injected.data["virus2"] + if (viruses.len) + virus2 |= viruses + 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) diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 55c255d42d..b247fbfbc4 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -929,11 +929,14 @@ 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) + for (var/datum/disease2/disease/V in C.virus2) + 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 diff --git a/code/modules/virus2/disease2.dm b/code/modules/virus2/disease2.dm index a9a8e6e45d..cc27e5a125 100644 --- a/code/modules/virus2/disease2.dm +++ b/code/modules/virus2/disease2.dm @@ -9,39 +9,19 @@ 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/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 + for(var/i=1 ; i <= max_stage ; i++ ) + var/datum/disease2/effectholder/holder = new /datum/disease2/effectholder + holder.stage = i + 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" @@ -49,12 +29,11 @@ /datum/disease2/disease/proc/activate(var/mob/living/carbon/mob) if(dead) cure(mob) - mob.virus2 = null + mob.virus2 -= src 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(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 @@ -67,10 +46,10 @@ mob.reagents.remove_reagent("virusfood",0.1) clicks += 10 if(clicks > stage*100 && prob(10)) - if(stage == 4) + if(stage == max_stage) src.cure(mob) mob.antibodies |= src.antigen - mob.virus2 = null + mob.virus2 -= src del src stage++ clicks = 0 @@ -79,19 +58,8 @@ clicks+=speed /datum/disease2/disease/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) + for(var/datum/disease2/effectholder/e in effects) + e.effect.deactivate(mob) /datum/disease2/disease/proc/minormutate() var/datum/disease2/effectholder/holder = pick(effects) diff --git a/code/modules/virus2/effect.dm b/code/modules/virus2/effect.dm index 848e253b54..4b8c103426 100644 --- a/code/modules/virus2/effect.dm +++ b/code/modules/virus2/effect.dm @@ -37,6 +37,7 @@ chance = rand(0,effect.chance_maxm) if(2) multiplier = rand(1,effect.maxm) + /datum/disease2/effectholder/proc/majormutate() getrandomeffect_greater() @@ -76,7 +77,7 @@ maxm = 3 activate(var/mob/living/carbon/mob,var/multiplier) mob.radiation += (2*multiplier) - +u /datum/disease2/effect/greater/toxins name = "Hyperacid Syndrome" stage = 3 @@ -134,6 +135,9 @@ 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 = mob.virus2.Copy() /datum/disease2/effect/greater/gunck name = "Flemmingtons" diff --git a/code/modules/virus2/helpers.dm b/code/modules/virus2/helpers.dm index 17e98f8447..946bf71983 100644 --- a/code/modules/virus2/helpers.dm +++ b/code/modules/virus2/helpers.dm @@ -29,7 +29,6 @@ proc/get_infection_chance(var/mob/living/carbon/M) return 0 else if(score == 5 && prob(35)) return 0 - return 1 //Checks if table-passing table can reach target (5 tile radius) @@ -46,37 +45,37 @@ proc/airborne_can_reach(turf/source, turf/target) //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(M.virus2) + if(!istype(disease)) return - if(!disease) + if(!istype(M)) + return + if (disease 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(M.antibodies & disease.antigen != 0) + return if(prob(disease.infectionchance) || forced) - if(M.virus2) + // certain clothes can prevent an infection + if(!forced && !get_infection_chance(M)) return - else - // certain clothes can prevent an infection - if(!forced && !M.get_infection_chance()) - return - M.virus2 = disease.getcopy() - M.virus2.minormutate() + var/datum/disease2/disease/D = disease.getcopy() + D.minormutate() + M.virus2 += D //Infects mob M with random lesser disease, if he doesn't have one /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 + var/datum/disease2/disease/D = new /datum/disease2/disease + D.makerandom() + D.infectionchance = 1 + M.virus2 += D //Infects mob M with random greated disease, if he doesn't have one /proc/infect_mob_random_greater(var/mob/living/carbon/M) - if(!M.virus2) - M.virus2 = new /datum/disease2/disease - M.virus2.makerandom(1) + var/datum/disease2/disease/D = new /datum/disease2/disease + D.makerandom(1) + M.virus2 += D //Fancy prob() function. /proc/dprob(var/p) diff --git a/code/modules/virus2/items_devices.dm b/code/modules/virus2/items_devices.dm index c5449ae749..75a33ef5c8 100644 --- a/code/modules/virus2/items_devices.dm +++ b/code/modules/virus2/items_devices.dm @@ -53,9 +53,9 @@ if(prob(50)) user << "The dish shatters" if(virus2.infectionchance > 0) - for(var/mob/living/carbon/target in view(null, src)) if(!target.virus2) + for(var/mob/living/carbon/target in view(null, src)) if(airborne_can_reach(src.loc, target.loc)) - if(target.get_infection_chance()) + if(get_infection_chance(target)) infect_virus2(target,src.virus2) del src From be8ca60280fac73bfae1436a8732e894b0e0b402 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Sun, 9 Jun 2013 14:27:41 +0400 Subject: [PATCH 06/68] Changed how 'greater' effects are picked, now it's var-based, not type-based. That'll let 'greater' and 'lesser' viruses pick low-stage symptoms from same pool without duplicating them. Also sorted effect datums by stage in effect.dm. --- code/modules/virus2/disease2.dm | 9 +- code/modules/virus2/effect.dm | 287 +++++++++++++++----------------- 2 files changed, 140 insertions(+), 156 deletions(-) diff --git a/code/modules/virus2/disease2.dm b/code/modules/virus2/disease2.dm index cc27e5a125..a475a7f711 100644 --- a/code/modules/virus2/disease2.dm +++ b/code/modules/virus2/disease2.dm @@ -11,14 +11,18 @@ 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_greater() + holder.getrandomeffect(2) else - holder.getrandomeffect_lesser() + holder.getrandomeffect() effects += holder uniqueID = rand(0,10000) infectionchance = rand(1,10) @@ -76,6 +80,7 @@ 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 diff --git a/code/modules/virus2/effect.dm b/code/modules/virus2/effect.dm index 4b8c103426..3aa5a361c6 100644 --- a/code/modules/virus2/effect.dm +++ b/code/modules/virus2/effect.dm @@ -13,19 +13,12 @@ if(happensonce == 1) happensonce = -1 -/datum/disease2/effectholder/proc/getrandomeffect_greater() +/datum/disease2/effectholder/proc/getrandomeffect(var/badness = 1) var/list/datum/disease2/effect/list = list() - for(var/e in (typesof(/datum/disease2/effect/greater) - /datum/disease2/effect/greater)) - var/datum/disease2/effect/f = new e - if(f.stage == src.stage) - list += f - effect = pick(list) - chance = rand(1,6) - -/datum/disease2/effectholder/proc/getrandomeffect_lesser() - var/list/datum/disease2/effect/list = list() - for(var/e in (typesof(/datum/disease2/effect/lesser) - /datum/disease2/effect/lesser)) + 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) @@ -39,16 +32,22 @@ multiplier = rand(1,effect.maxm) /datum/disease2/effectholder/proc/majormutate() - getrandomeffect_greater() + getrandomeffect(2) + +//////////////////////////////////////////////////////////////// +////////////////////////EFFECTS///////////////////////////////// +//////////////////////////////////////////////////////////////// /datum/disease2/effect - var/chance_maxm = 100 + 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 @@ -65,113 +64,47 @@ 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) -u -/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 +////////////////////////STAGE 4///////////////////////////////// -/datum/disease2/effect/greater/monkey +/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 = "Hard of hearing 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/greater/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 = mob.virus2.Copy() - -/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 +/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 @@ -181,92 +114,138 @@ u 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/killertoxins + name = "Toxification syndrome" + stage = 4 + activate(var/mob/living/carbon/mob,var/multiplier) + mob.adjustToxLoss(15*multiplier) -/datum/disease2/effect/lesser - chance_maxm = 10 +////////////////////////STAGE 3///////////////////////////////// -/datum/disease2/effect/lesser/mind +/datum/disease2/effect/toxins + name = "Hyperacid Syndrome" + 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.mutations |= 512 + +/datum/disease2/effect/mind name = "Lazy mind syndrome" stage = 3 activate(var/mob/living/carbon/mob,var/multiplier) - mob.setBrainLoss(20) + 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/lesser/drowsy - name = "Bedroom Syndrome" - stage = 2 +/datum/disease2/effect/hallucinations + name = "Hallucinational Syndrome" + stage = 3 activate(var/mob/living/carbon/mob,var/multiplier) - mob.drowsyness = 5 + mob.hallucination += 25 -/datum/disease2/effect/lesser/deaf +/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/lesser/gunck - name = "Flemmingtons" - stage = 1 +/datum/disease2/effect/giggle + name = "Uncontrolled Laughter Effect" + stage = 3 activate(var/mob/living/carbon/mob,var/multiplier) - mob << "\red Mucous runs down the back of your throat." + mob.say("*giggle") -/datum/disease2/effect/lesser/radian - name = "Radian's syndrome" - stage = 4 - maxm = 3 +/datum/disease2/effect/groan + name = "Groaning Syndrome" + stage = 3 activate(var/mob/living/carbon/mob,var/multiplier) - mob.radiation += 1 + mob.say("*groan") +////////////////////////STAGE 2///////////////////////////////// -/datum/disease2/effect/lesser/sneeze - name = "Coldingtons Effect" - stage = 1 +/datum/disease2/effect/scream + name = "Random screaming syndrome" + stage = 2 activate(var/mob/living/carbon/mob,var/multiplier) - mob.say("*sneeze") + mob.say("*scream") -/datum/disease2/effect/lesser/cough +/datum/disease2/effect/drowsness + name = "Automated sleeping syndrome" + stage = 2 + activate(var/mob/living/carbon/mob,var/multiplier) + mob.drowsyness += 10 + +/datum/disease2/effect/drowsy + name = "Bedroom Syndrome" + stage = 2 + activate(var/mob/living/carbon/mob,var/multiplier) + mob.drowsyness = 5 + +/datum/disease2/effect/sleepy + name = "Resting syndrome" + stage = 2 + activate(var/mob/living/carbon/mob,var/multiplier) + mob.say("*collapse") + +/datum/disease2/effect/cough name = "Anima Syndrome" stage = 2 activate(var/mob/living/carbon/mob,var/multiplier) mob.say("*cough") -/datum/disease2/effect/lesser/hungry +/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/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 +/datum/disease2/effect/fridge name = "Refridgerator Syndrome" stage = 2 activate(var/mob/living/carbon/mob,var/multiplier) mob.say("*shiver") -/datum/disease2/effect/lesser/twitch +////////////////////////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 = mob.virus2.Copy() + +/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/lesser/giggle - name = "Uncontrolled Laughter Effect" - stage = 3 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.say("*giggle") From 28c15adaa397be3e2dd833b3c09eb48977ed70d7 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Sun, 9 Jun 2013 16:30:22 +0400 Subject: [PATCH 07/68] Fixed runtime in blood transfer. Fixed cure machine producing virus blood wrong. Changes to existing syndromes: -Cough : now has chance to infect people around mob. -Telepathy : now should properly give powers to the mob. New syndromes: -Topographical Cretinism : confusing directions, much like drunk effect. -Blackout : short-time blindness --- code/modules/organs/blood.dm | 2 +- code/modules/virus2/curer.dm | 4 ++-- code/modules/virus2/effect.dm | 32 +++++++++++++++++++++++--------- 3 files changed, 26 insertions(+), 12 deletions(-) diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm index 227fbcd5a6..20373ea209 100644 --- a/code/modules/organs/blood.dm +++ b/code/modules/organs/blood.dm @@ -201,7 +201,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 vessel.add_reagent("blood", amount, injected.data) vessel.update_total() var/list/viruses = injected.data["virus2"] - if (viruses.len) + if (viruses && viruses.len) virus2 |= viruses if (injected.data["antibodies"] && prob(5)) antibodies |= injected.data["antibodies"] diff --git a/code/modules/virus2/curer.dm b/code/modules/virus2/curer.dm index 65b030ba82..4d616048d1 100644 --- a/code/modules/virus2/curer.dm +++ b/code/modules/virus2/curer.dm @@ -22,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 diff --git a/code/modules/virus2/effect.dm b/code/modules/virus2/effect.dm index 3aa5a361c6..5a3cef83e6 100644 --- a/code/modules/virus2/effect.dm +++ b/code/modules/virus2/effect.dm @@ -87,7 +87,7 @@ mob.radiation += (2*multiplier) /datum/disease2/effect/deaf - name = "Hard of hearing syndrome" + name = "Dead Ear syndrome" stage = 4 activate(var/mob/living/carbon/mob,var/multiplier) mob.ear_deaf += 20 @@ -140,7 +140,10 @@ name = "Telepathy Syndrome" stage = 3 activate(var/mob/living/carbon/mob,var/multiplier) - mob.mutations |= 512 + 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" @@ -171,6 +174,12 @@ activate(var/mob/living/carbon/mob,var/multiplier) mob.say("*giggle") +/datum/disease2/effect/confusion + name = "Topographical Cretinism Syndrome" + stage = 3 + activate(var/mob/living/carbon/mob,var/multiplier) + mob.confused += 10 + /datum/disease2/effect/groan name = "Groaning Syndrome" stage = 3 @@ -179,7 +188,7 @@ ////////////////////////STAGE 2///////////////////////////////// /datum/disease2/effect/scream - name = "Random screaming syndrome" + name = "Loudness syndrome" stage = 2 activate(var/mob/living/carbon/mob,var/multiplier) mob.say("*scream") @@ -190,23 +199,28 @@ activate(var/mob/living/carbon/mob,var/multiplier) mob.drowsyness += 10 -/datum/disease2/effect/drowsy - name = "Bedroom Syndrome" - stage = 2 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.drowsyness = 5 - /datum/disease2/effect/sleepy name = "Resting syndrome" stage = 2 activate(var/mob/living/carbon/mob,var/multiplier) mob.say("*collapse") +/datum/disease2/effect/sleepy + 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" From e74f52f86bf8cdcba262171bb74e099e58b79d11 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Sun, 9 Jun 2013 16:39:03 +0400 Subject: [PATCH 08/68] OCD commit, makes capitalizations uniform --- code/modules/virus2/effect.dm | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/code/modules/virus2/effect.dm b/code/modules/virus2/effect.dm index 5a3cef83e6..c451482674 100644 --- a/code/modules/virus2/effect.dm +++ b/code/modules/virus2/effect.dm @@ -80,20 +80,20 @@ mob.gib() /datum/disease2/effect/radian - name = "Radian's syndrome" + 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" + 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" + name = "Monkism Syndrome" stage = 4 badness = 2 activate(var/mob/living/carbon/mob,var/multiplier) @@ -102,7 +102,7 @@ h.monkeyize() /datum/disease2/effect/suicide - name = "Suicidal syndrome" + name = "Suicidal Syndrome" stage = 4 badness = 2 activate(var/mob/living/carbon/mob,var/multiplier) @@ -115,22 +115,23 @@ mob.suiciding = 0 /datum/disease2/effect/killertoxins - name = "Toxification syndrome" + name = "Toxification Syndrome" stage = 4 activate(var/mob/living/carbon/mob,var/multiplier) mob.adjustToxLoss(15*multiplier) + ////////////////////////STAGE 3///////////////////////////////// /datum/disease2/effect/toxins - name = "Hyperacid Syndrome" + 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" + name = "World Shaking Syndrome" stage = 3 maxm = 3 activate(var/mob/living/carbon/mob,var/multiplier) @@ -139,14 +140,14 @@ /datum/disease2/effect/telepathic name = "Telepathy Syndrome" stage = 3 - activate(var/mob/living/carbon/mob,var/multiplier) + 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" + name = "Lazy Mind Syndrome" stage = 3 activate(var/mob/living/carbon/mob,var/multiplier) if(istype(mob, /mob/living/carbon/human)) @@ -163,7 +164,7 @@ mob.hallucination += 25 /datum/disease2/effect/deaf - name = "Hard of hearing syndrome" + name = "Hard of Hearing Syndrome" stage = 3 activate(var/mob/living/carbon/mob,var/multiplier) mob.ear_deaf = 5 @@ -175,7 +176,7 @@ mob.say("*giggle") /datum/disease2/effect/confusion - name = "Topographical Cretinism Syndrome" + name = "Topographical Cretinism" stage = 3 activate(var/mob/living/carbon/mob,var/multiplier) mob.confused += 10 @@ -188,19 +189,19 @@ ////////////////////////STAGE 2///////////////////////////////// /datum/disease2/effect/scream - name = "Loudness syndrome" + name = "Loudness Syndrome" stage = 2 activate(var/mob/living/carbon/mob,var/multiplier) mob.say("*scream") /datum/disease2/effect/drowsness - name = "Automated sleeping syndrome" + name = "Automated Sleeping Syndrome" stage = 2 activate(var/mob/living/carbon/mob,var/multiplier) mob.drowsyness += 10 /datum/disease2/effect/sleepy - name = "Resting syndrome" + name = "Resting Syndrome" stage = 2 activate(var/mob/living/carbon/mob,var/multiplier) mob.say("*collapse") From 300a73da71df570df73ad449a27ff3cc35f47b03 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Sun, 9 Jun 2013 16:51:07 +0400 Subject: [PATCH 09/68] Should make unusable limbs treated as such. --- code/game/objects/items.dm | 5 +++-- code/modules/organs/organ.dm | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) 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/modules/organs/organ.dm b/code/modules/organs/organ.dm index 0e61142b9c..dc16e55bd0 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 From 5056e3a4fa0efbe3d360dfa77d4edb3e21c049bd Mon Sep 17 00:00:00 2001 From: Chinsky Date: Sun, 9 Jun 2013 17:06:37 +0400 Subject: [PATCH 10/68] Added fever to the virus progress. --- code/modules/virus2/disease2.dm | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/code/modules/virus2/disease2.dm b/code/modules/virus2/disease2.dm index a475a7f711..523c6001ba 100644 --- a/code/modules/virus2/disease2.dm +++ b/code/modules/virus2/disease2.dm @@ -44,11 +44,17 @@ 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) @@ -57,8 +63,12 @@ del src 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) From 915c37f1b6ca1307bcb56f3aaa60c614b5ed50f2 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Sun, 9 Jun 2013 17:10:07 +0400 Subject: [PATCH 11/68] Two new syndromes: -Retrovirus : scrambles DNA. -Shutdown : limbs become unusable. Reversed when cured -Fragile Bones : --- code/modules/virus2/effect.dm | 41 ++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/code/modules/virus2/effect.dm b/code/modules/virus2/effect.dm index c451482674..329054703b 100644 --- a/code/modules/virus2/effect.dm +++ b/code/modules/virus2/effect.dm @@ -120,9 +120,48 @@ 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) + +/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 ////////////////////////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 @@ -140,7 +179,7 @@ /datum/disease2/effect/telepathic name = "Telepathy Syndrome" stage = 3 - activate(var/mob/living/carbon/mob,var/multiplier)") + 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 From d25c9723e11035ba1449051ee00afd7ae47ac987 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Sun, 9 Jun 2013 18:19:35 +0400 Subject: [PATCH 12/68] Two new syndromes, ideas stolen from TG's advanced diseases: -Balding -Stimulant - generates hyperzine. Two more: -Longevity : heals small amount of damage and some broken bones when activated. When healed deals same amount of damage. -DNA degradation : deals tiny amount of clone damage Also made retrovirus deal clone damage as well. --- code/modules/virus2/effect.dm | 57 ++++++++++++++++++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git a/code/modules/virus2/effect.dm b/code/modules/virus2/effect.dm index 329054703b..87e01e74f1 100644 --- a/code/modules/virus2/effect.dm +++ b/code/modules/virus2/effect.dm @@ -126,6 +126,7 @@ 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" @@ -145,6 +146,26 @@ 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 @@ -220,6 +241,13 @@ activate(var/mob/living/carbon/mob,var/multiplier) 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 @@ -245,7 +273,7 @@ activate(var/mob/living/carbon/mob,var/multiplier) mob.say("*collapse") -/datum/disease2/effect/sleepy +/datum/disease2/effect/blind name = "Blackout Syndrome" stage = 2 activate(var/mob/living/carbon/mob,var/multiplier) @@ -274,6 +302,28 @@ 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(M, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = M + 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 @@ -303,3 +353,8 @@ 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 From 5d7b62f32db270704a71a3583e45e70c8eaa1ecb Mon Sep 17 00:00:00 2001 From: Chinsky Date: Sun, 9 Jun 2013 18:31:11 +0400 Subject: [PATCH 13/68] gave virus slight chance to change antibodies they could be cured with. --- code/modules/virus2/disease2.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/virus2/disease2.dm b/code/modules/virus2/disease2.dm index 523c6001ba..81705cbe4a 100644 --- a/code/modules/virus2/disease2.dm +++ b/code/modules/virus2/disease2.dm @@ -83,6 +83,9 @@ /datum/disease2/disease/proc/majormutate() 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 From a76b87635e39854d533993e0345acc6b88d1a1df Mon Sep 17 00:00:00 2001 From: Chinsky Date: Sat, 15 Jun 2013 15:54:43 +0400 Subject: [PATCH 14/68] It only holds 15 units. --- code/modules/reagents/reagent_containers/glass.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 6f6db60299..b8e86ec0f9 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -220,7 +220,7 @@ /obj/item/weapon/reagent_containers/glass/beaker/vial name = "vial" - desc = "Small glass vial. Can hold up to 20 units." + desc = "Small glass vial. Looks fragile." icon_state = "vial" g_amt = 500 volume = 15 From f052d8d97275f2b749b3e0fd5000af17bf795820 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Sat, 15 Jun 2013 22:13:31 +0400 Subject: [PATCH 15/68] Added boxes for vials. Usual and secure version(default to viro access) Changed vial lid sprite slightly. --- .../objects/items/weapons/storage/fancy.dm | 53 ++++++++++++++++++ icons/obj/chemical.dmi | Bin 30335 -> 30318 bytes icons/obj/vialbox.dmi | Bin 0 -> 1425 bytes 3 files changed, 53 insertions(+) create mode 100644 icons/obj/vialbox.dmi 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/icons/obj/chemical.dmi b/icons/obj/chemical.dmi index 1c744c70e2fa2b7180f753474c9181549b94f7df..60370fdc8cccac4794da8717f80237a5be51d960 100644 GIT binary patch delta 10701 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 CAtDI? diff --git a/icons/obj/vialbox.dmi b/icons/obj/vialbox.dmi new file mode 100644 index 0000000000000000000000000000000000000000..c08b5cfeabb15017414bfbde9406f48fb08b3713 GIT binary patch literal 1425 zcmbu9eKgYx7{`Az%=I?XrR!yzq*Ib8#I?4G%1FseNozdErP8+9nZ9W`GT87uOeTDdrC#p;TsuipKT- zAi5=iU>4t#_nruFj+q@@PkS4W1fSO!5`vl4WNWobO&^5RJM*%Iv98C$BPp6|<0ll3=STxJ}ktJ0Eng}8{M&abK7RSASQ{XB4 z6)W4XiE688JYoC_PKq4u^ql0x_FGrrY)Ilg^c)kjGy*7kV&`*h%@RXxM9o+tGrNmz z^O^@(m6c8eGnZX-S&2qMezRN)hHk!Qq+HjLrYuHPJv63;g@%Ssb#Vj~POyaj{B~UW z1;4f0&+wI*fzh66w8G8^xB~sw2Mo2eZAeJbmaYe+ahVx_ts#Qr-#KHICZ{)e=#PeeW9gJ zpqZhPCR+*3ToZz4SC4NEmPCiV15b4>Agyg|&Jl^5xm@lX6589_yWL`I{D-!jPsIK2ckR25XFi8~Z zoRz7aLhrLWFMwR4#|61rdrI0W5_I>y^Uz zUwVt>5T}{tx^cBQ3ed$gq*8PZb=CBK$bd3qI!syKUP##Zu>khaG55NIA!+{t(3Pe% literal 0 HcmV?d00001 From 934a25a172b6073a3cb0f3a9786d24e57920fe99 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Sun, 16 Jun 2013 11:27:00 +0400 Subject: [PATCH 16/68] Added antigen check to viri comparing proc. --- code/modules/virus2/disease2.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/virus2/disease2.dm b/code/modules/virus2/disease2.dm index 81705cbe4a..6ee3690c16 100644 --- a/code/modules/virus2/disease2.dm +++ b/code/modules/virus2/disease2.dm @@ -118,4 +118,7 @@ for(var/type in types) if(!(type in types2)) equal = 0 + + if (antigen != disease.antigen) + equal = 0 return equal From 5aa1170bd30cc93364f32c154350157b4eaf8e5d Mon Sep 17 00:00:00 2001 From: Chinsky Date: Sun, 16 Jun 2013 11:29:18 +0400 Subject: [PATCH 17/68] Changed isolator to be able to isolate any virus from sample. --- code/modules/virus2/isolator.dm | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/code/modules/virus2/isolator.dm b/code/modules/virus2/isolator.dm index acd92c395c..f0ab132886 100644 --- a/code/modules/virus2/isolator.dm +++ b/code/modules/virus2/isolator.dm @@ -39,11 +39,13 @@ if(B) Blood = B break - - if(Blood.data["virus2"]) - virus2 = Blood.data["virus2"] - isolating = 40 - icon_state = "isolator_processing" + var/list/virus = get_copy_viruses(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 @@ -76,7 +78,9 @@ dat += "Contained reagents:
" for(var/datum/reagent/blood/G in R.reagent_list) if(G.data["virus2"]) - dat += " [G.name]: Isolate" + 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") From 6f45ff68c76d66a01b87b4f4bfae69d7ff63f7cc Mon Sep 17 00:00:00 2001 From: Chinsky Date: Sun, 16 Jun 2013 11:30:47 +0400 Subject: [PATCH 18/68] Changes to effects: fixed indentation in some cases. added feedback message to disorientation effect. changed mucus virus transfer to proper proc --- code/modules/virus2/effect.dm | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/code/modules/virus2/effect.dm b/code/modules/virus2/effect.dm index 87e01e74f1..fe7e274775 100644 --- a/code/modules/virus2/effect.dm +++ b/code/modules/virus2/effect.dm @@ -239,6 +239,7 @@ 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 @@ -306,13 +307,13 @@ name = "Hair Loss" stage = 2 activate(var/mob/living/carbon/mob,var/multiplier) - if(istype(M, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = M + 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() + 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" @@ -320,7 +321,7 @@ 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) + mob.reagents.add_reagent("hyperzine", 10) if (prob(30)) mob.jitteriness += 10 @@ -333,7 +334,7 @@ mob.say("*sneeze") if (prob(50)) var/obj/effect/decal/cleanable/mucus/M = new(get_turf(mob)) - M.virus2 = mob.virus2.Copy() + M.virus2 = get_copy_viruses(mob.virus2) /datum/disease2/effect/gunck name = "Flemmingtons" From 898da9b31077b47b59269a705e7f4fde3b6e0d3f Mon Sep 17 00:00:00 2001 From: Chinsky Date: Sun, 16 Jun 2013 11:31:42 +0400 Subject: [PATCH 19/68] Moved function of infecting blood samples with viruses to incubator from the cure machine. --- code/modules/virus2/dishincubator.dm | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/code/modules/virus2/dishincubator.dm b/code/modules/virus2/dishincubator.dm index e777c63552..7b075577bb 100644 --- a/code/modules/virus2/dishincubator.dm +++ b/code/modules/virus2/dishincubator.dm @@ -14,6 +14,7 @@ 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)) @@ -74,6 +75,22 @@ 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 + + var/list/virus = list(dish.virus2.getcopy()) + B.data["virus2"] |= virus + + state("\The [src.name] pings, \"Injection complete.\"", "blue") + + src.add_fingerprint(usr) src.updateUsrDialog() @@ -101,6 +118,9 @@ if(dish) dat += "Eject Virus dish : Eject" dat += "
" + if(beaker) + dat += "Breed viral culture in beaker : Start" + dat += "
" dat += "

" dat += "Flush system
" dat += "Close
" From 960a22ee43dd56b0ad084eba9c4e124155e44f71 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Wed, 19 Jun 2013 02:28:53 +0400 Subject: [PATCH 20/68] Changes way viruses are stored in mobs. Now it's an associative list: uniqueID - virus datum Updated most instances to match it. --- code/game/gamemodes/epidemic/epidemic.dm | 7 ++++--- .../effects/decals/Cleanable/humans.dm | 2 +- code/game/turfs/simulated.dm | 6 +++--- code/modules/mob/living/carbon/human/life.dm | 16 ++++++++++----- code/modules/mob/living/carbon/monkey/life.dm | 16 ++++++++++----- code/modules/organs/blood.dm | 9 ++++----- code/modules/reagents/Chemistry-Reagents.dm | 5 +++-- code/modules/virus2/disease2.dm | 20 +++++++++++++++++-- code/modules/virus2/dishincubator.dm | 6 ++++-- code/modules/virus2/effect.dm | 2 +- code/modules/virus2/helpers.dm | 8 ++++---- code/modules/virus2/isolator.dm | 2 +- 12 files changed, 65 insertions(+), 34 deletions(-) diff --git a/code/game/gamemodes/epidemic/epidemic.dm b/code/game/gamemodes/epidemic/epidemic.dm index 5c84612dbe..6538baa834 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(lethal in 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 diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index e5b6808807..911a63c0e4 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -144,4 +144,4 @@ icon = 'blood.dmi' icon_state = "mucus" random_icon_states = list("mucus") - var/list/datum/disease2/disease/virus2 = null + var/list/datum/disease2/disease/virus2 = list() diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index 92c23b472f..6432f1bac7 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -108,14 +108,14 @@ 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 |= M.virus2 + 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 = M.virus2.Copy() + newblood.virus2 |= virus_copylist(M.virus2) return 1 //we bloodied the floor @@ -125,7 +125,7 @@ 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 = M.virus2.Copy() + 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/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 1606b01f0c..25707e7d73 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -1332,18 +1332,23 @@ if(bodytemperature > 406) for(var/datum/disease/D in viruses) D.cure() - for (var/datum/disease2/disease/V in virus2) + 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/datum/disease2/disease/V in B.virus2) + 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/datum/disease2/disease/V in M.virus2) + for (var/ID in M.virus2) + var/datum/disease2/disease/V = virus2[ID] infect_virus2(src,V) - for (var/datum/disease2/disease/V in virus2) + 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 @@ -1352,7 +1357,8 @@ if(!V) continue // check if we're immune - if(V.antigen & src.antibodies) V.dead = 1 + if(V.antigen & src.antibodies) + V.dead = 1 return diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm index 0d06c0b50f..e27fe2564b 100644 --- a/code/modules/mob/living/carbon/monkey/life.dm +++ b/code/modules/mob/living/carbon/monkey/life.dm @@ -155,18 +155,23 @@ if(bodytemperature > 406) for(var/datum/disease/D in viruses) D.cure() - for (var/datum/disease2/disease/V in virus2) + 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/datum/disease2/disease/V in B.virus2) + 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/datum/disease2/disease/V in M.virus2) + for (var/ID in M.virus2) + var/datum/disease2/disease/V = virus2[ID] infect_virus2(src,V) - for (var/datum/disease2/disease/V in virus2) + 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 @@ -175,7 +180,8 @@ if(!V) continue // check if we're immune - if(V.antigen & src.antibodies) V.dead = 1 + if(V.antigen & src.antibodies) + V.dead = 1 return diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm index 20373ea209..2dfa262fc9 100644 --- a/code/modules/organs/blood.dm +++ b/code/modules/organs/blood.dm @@ -163,8 +163,8 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 //set reagent data B.data["donor"] = src - if(src.virus2) - B.data["virus2"] = src.virus2.Copy() +// B.data["virus2"] = virus_mergelist(B.data["virus2"] , src.virus2) + 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) @@ -200,9 +200,8 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 else vessel.add_reagent("blood", amount, injected.data) vessel.update_total() - var/list/viruses = injected.data["virus2"] - if (viruses && viruses.len) - virus2 |= viruses +// src.virus2 = virus_mergelist(src.virus2 , injected.data["virus2"]) + src.virus2 |= virus_copylist(injected.data["virus2"]) if (injected.data["antibodies"] && prob(5)) antibodies |= injected.data["antibodies"] var/list/chems = list() diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index b247fbfbc4..67ccb1db81 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -930,8 +930,9 @@ datum // radium may increase your chances to cure a disease if(istype(M,/mob/living/carbon)) // make sure to only use it on carbon mobs var/mob/living/carbon/C = M - if(C.virus2) - for (var/datum/disease2/disease/V in C.virus2) + 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 diff --git a/code/modules/virus2/disease2.dm b/code/modules/virus2/disease2.dm index 6ee3690c16..7454ecf81c 100644 --- a/code/modules/virus2/disease2.dm +++ b/code/modules/virus2/disease2.dm @@ -33,8 +33,8 @@ /datum/disease2/disease/proc/activate(var/mob/living/carbon/mob) if(dead) cure(mob) - mob.virus2 -= src 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 @@ -68,7 +68,7 @@ e.runeffect(mob,stage) //fever - mob.bodytemperature += max(mob.bodytemperature, min(310+5*stage ,mob.bodytemperature+5*stage)) + 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) @@ -122,3 +122,19 @@ 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 +/* +/proc/virus_mergelist(var/list/datum/disease2/disease/viruses1, var/list/datum/disease2/disease/viruses2) + var/list/res = virus_copylist(viruses1) + for (var/ID in viruses2) + var/datum/disease2/disease/V = viruses2[ID] + if(!res["[V.uniqueID]"]) + res["[V.uniqueID]"] = V.getcopy() + return res +*/ \ No newline at end of file diff --git a/code/modules/virus2/dishincubator.dm b/code/modules/virus2/dishincubator.dm index 7b075577bb..c8af39777f 100644 --- a/code/modules/virus2/dishincubator.dm +++ b/code/modules/virus2/dishincubator.dm @@ -85,8 +85,10 @@ state("\The [src.name] buzzes, \"No suitable breeding enviroment detected.\"", "blue") return - var/list/virus = list(dish.virus2.getcopy()) - B.data["virus2"] |= virus + 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") diff --git a/code/modules/virus2/effect.dm b/code/modules/virus2/effect.dm index fe7e274775..ff62376c63 100644 --- a/code/modules/virus2/effect.dm +++ b/code/modules/virus2/effect.dm @@ -334,7 +334,7 @@ mob.say("*sneeze") if (prob(50)) var/obj/effect/decal/cleanable/mucus/M = new(get_turf(mob)) - M.virus2 = get_copy_viruses(mob.virus2) + M.virus2 = virus_copylist(mob.virus2) /datum/disease2/effect/gunck name = "Flemmingtons" diff --git a/code/modules/virus2/helpers.dm b/code/modules/virus2/helpers.dm index 946bf71983..eb3de7ace1 100644 --- a/code/modules/virus2/helpers.dm +++ b/code/modules/virus2/helpers.dm @@ -49,7 +49,7 @@ proc/airborne_can_reach(turf/source, turf/target) return if(!istype(M)) return - if (disease in M.virus2) + 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) @@ -62,20 +62,20 @@ proc/airborne_can_reach(turf/source, turf/target) var/datum/disease2/disease/D = disease.getcopy() D.minormutate() - M.virus2 += D + 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 + 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 + M.virus2["[D.uniqueID]"] = D //Fancy prob() function. /proc/dprob(var/p) diff --git a/code/modules/virus2/isolator.dm b/code/modules/virus2/isolator.dm index f0ab132886..667ab67e99 100644 --- a/code/modules/virus2/isolator.dm +++ b/code/modules/virus2/isolator.dm @@ -39,7 +39,7 @@ if(B) Blood = B break - var/list/virus = get_copy_viruses(Blood.data["virus2"]) + 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) From a3587dc81de5525c26cd2aac4bf18ec32a0e458c Mon Sep 17 00:00:00 2001 From: Chinsky Date: Wed, 19 Jun 2013 02:33:32 +0400 Subject: [PATCH 21/68] Adds new virology machine - centrifuge. Used for extracting virus samples or antibodies. Accepts only vials. --- baystation12.dme | 1 + .../reagents/reagent_containers/glass.dm | 3 +- code/modules/virus2/centrifuge.dm | 157 ++++++++++++++++++ icons/obj/virology.dmi | Bin 5796 -> 5167 bytes 4 files changed, 160 insertions(+), 1 deletion(-) create mode 100644 code/modules/virus2/centrifuge.dm diff --git a/baystation12.dme b/baystation12.dme index abd8aeb638..425d46bf57 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -1260,6 +1260,7 @@ #include "code\modules\virus2\antibodies.dm" #include "code\modules\virus2\curer.dm" #include "code\modules\virus2\disease2.dm" +#include "code\modules\virus2\centrifuge.dm" #include "code\modules\virus2\diseasesplicer.dm" #include "code\modules\virus2\dishincubator.dm" #include "code\modules\virus2\effect.dm" diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index b8e86ec0f9..a35eba0f81 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -31,7 +31,8 @@ /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 ) examine() set src in view() diff --git a/code/modules/virus2/centrifuge.dm b/code/modules/virus2/centrifuge.dm new file mode 100644 index 0000000000..a0330f796c --- /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.uniqueID]" + 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/icons/obj/virology.dmi b/icons/obj/virology.dmi index 01b6e591e34d56a7c86c60967937e357e63fa593..02a426049bb07c2c46e8dbde55fecbcab91dfc72 100644 GIT binary patch literal 5167 zcmaiYc{o&G{QqU_vWJL>M6zZ{$fzhn_9)9p$-ZStTxKjK`@WMU`*<(5ebK*{ zi2-WkMx14#?nkhNwZD#&-@_-aKK`!WUH}l3pOK7Z=~OuJV&so`)H7kn3Vap+WU_Fx zl~lk$bB9M+UH{x%w6f{K#8_HQC-u-8*E%IjJx7<_hAELa&i|! z&qs6F_qgD9#UBywVxia`|vp1us+A2GwNYc zjI*9ig?S=DYN<2myzs3dL;N6p%@X_d1g8%U5l;7-C0d&|I1cV@)(4h_j%i�-cpp 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 literal 5796 zcmai2_dk{Y`#<)mP}!qHvWYT74l+W>-Ydx{j$}LM7)3>*gpiS$t?YH2leaxiRtE>? z*jX9JIEQnN@97WtJib5N_v^mz*Ym#i_eGC3P*J9x=>} z)bl&fM*`HPCDPhHSkLQ)XOM4TurD|O00{q*oQh<9scl8@MH@W;~`wMtnc_P<^>NF~gcQ&@iN7C*`+&1Yj+kui`eF zDRm%MCjVvX4MDOvb9KlvkFGp8Y6F`*zHV}+y3R3vJ@y7_g~vNHff&@a5)J@xl^N;j zSciYv$%O`UdUy7L(zXMB+`1uhMRG*ozLQT&CbuK_=lD|IEMsK}L$+}gOI+_}Pv%10 z-SLHMwLaBxvph$x<<-^GM%RDPli8x3`}4!CWeN6sk+QC%7GOt;`eXclBTBLKX$ig>iLKq^wHaU za`|yiPEP5irQ$<@MSgyM*W)=zq%|j2ZPB^qefu~SWn~K&mywxzZ#g1;^fSB_|EoWH zOPFg9{G!hhtl2&zR zmUbO%1n?m$TfoYTGZa#?SKXj_1;aCc|3)P&KI^XSF)R#!qBObW2gSVfTDN?h;WpQ^NzNl#C=&@j!{5{l^}?|_ZS6T9uVPedA;nxsogN@CPg zKKa7LH_vDD9u*{_k2w|lR#EC$d&YhknX1w;8WUw~LY&MEGq~Q-RP+9ld?;ODI{ZNT zs8*$wFyynxx1RIylC})V84bb`o8Sws!`PTcV3lCox<`zaMdj!hA@!@ScPI~6=JL&i zd$YmnFwIlzOct2>QHli8JP)k+ljd5)%4Mk;ExT31y<6xq4DBXqaV`5c(!7jPlic@J zXsrdY8h2-Atr_?_Sub5=3-U(#r44LYr+;lE$J4d&7EcwP-CV-_hcFTags(7Moy{*}j|6s;is^oB?x-4s1P2$pL?D4V zq=tY2bk1x>26tp+q*~}UFCZi&^Gk$H zNS#wzdVFeZ?D7VklB%i`l9j@{<`h6P(j8E=l>G7V=vvC_goK0^7!n17IkK0&oIPx6 zZZ<4*IuE@e?ISKm*bRUg)A(p&o12>_e*FS)IAo)9yac&eU@*L#X}5i+vQ|db=+6t3 z=`|-m8pY>28oA&+T*_V8;MFl*-K^C6DDh8LZvmWx<$5q}BudI{g^82&wruX*a zPD<(R6?IS%*QzF{0GHB9dT0B|7KR9qR9!6_3WI5irRCqcYAgf731$NA+K&x}E;G%H zpj4R(hf?(^f|;O?JPMWxvIj0ZeMLc6+bjtrPpKKwyR6iHc1eO1ej;n~x7a@~j3Jd| zoe#i=dxm2FkMsXKEdS5W*DuD!-d6|9m-6B;v$F=<7Md>RTExe56S25;CeRZ=Q)8o4 ze0)47H@88xyyTmC_g*KUIhjmmX}$oX?7gNh;0vIv+j@M*iHV6l2hk%@@-S;a@5{0a z%H7LGd-xO}5k<6*K%(wqOS@?pnV9$l1&5h`RV_-(6Nm#TU*fhlHx1}7>IGOoxPe5O z!>oY{S#jc(6&2F7G$4Kb9-}CF&^h6r0WwxQ=HTGKgJyj+SCsdnLG=qY!B3f)%O__n z^rSCp&*L^X{Y)5mNTel+4(_>`86z8;sZ=p-1>VQAX=4LHY|W%!}&2<7LG42a!R(WqxE z8(nWdd0Y|gR*hzB%X5&tRsHflpZI$Y(879`chi51{MWti$Ah+c+w1EU{j&Tw=IFZA zZa>C2Xa01~jC-2@^T6%>aJp!&K+^7PnO?fbjZfbwL(%2`u8LoH3PqD&podZu6FP-t zEVjZ{_S-Gv96yZaMhs1U*$WA%ArzHRL_%gx)y8k8TCBm%n}}~u z-H8ZvtLT7vE4$j<{qk?$K2yWt&kI`!Lc054B`_pCXdMK%HTPkq?;_&G`ly3kC5!8; ziH-j@f=gGZL0e>JK@=7iHsCgl_wY$T7HxdmPMfr}w4{uTC@1S>)_CfKo8CDV*_}wo ztxJHe#LUmnzY|bpd-&pf6VyF9KQAN|gIZ7GP2SxJ)zHdM(MAA|P)Ui2o+{mof#Ln? z)XY*+t?JlRxqnvW<>iT-+jkv4vJMGpT!p>Ct@BU?a&d75hlP38&!|OHAdej^EIwEx zk1SFmTx5Gr8ChYl15p~E`kBuP9=Z=+!fI59Hi8XK=@JWZfqG%?T>5-LTVYj$)Pnp6 z)9mWAEPP+u8l9R*4+0TC03HO_{4SbX$LsHSZ@&_^baQiC2~iV#AAzp^=gbDT!iSG! z#{ZsD7(mg)3`c|>=4yFuZAze;;9Ck3i4^BvjP7UCyA?+_U%UeS&rqTYcY}EYzdzM6s(Y<3cYcv=?o`%_Z-!-` zW-9L5=a+vUp4;fPnqB5L321i8y5(u$IJdCis;;gcNNwsMos(IPLQ z@^%OlG-rf_Oylt9Y1}IdebqPL@Xh|tv=YILaDa=JB_H)Q!(C5yR?FJ2 z`DpB%O+_nDCPcZ~*0{`aPq!12mgd@olD3jVjv`CSQ)b=|o~r=RG(1Jg|N7vk52Nhf zYzPX4(o*EUj5J@(Z1ZForI61=%YH687Cbuu2DfL?f1wqp$!R>YV)eMktHS+lNQOW9 znf!6p=jMTgjvzq5uVdh7^K)p4=fv!7bc(;>Di=3|30M(a<*Yb#)L@zcQUQ!0^l%ML zlhD7q_FM_M44ann>xwEXt40I^8<=+e;Y(1|@iR6-HH28E^OZ)I=r@cwQpC~X`tfn7 z<~4Rj@6mU&d2HvgQBM}P?v4-=2fytc7hcE$=*9{|wd_xXo|3%caTmLbX+t88ps#bo zqM?q<%{NvsoP<4L2)o*{!(~7HOIk5!7Z$B~`7cbaPRUV0T?*Cvm@7d^w7@ZlH#(1{ zDagR}D=|;l1&sMMs#u8PL0d5paSY}{Y7oaJsWHEm_Tit63v}MsG1NwaEPKB~N7L0Llp&vuP{g!ZK>t>x( zVb<5iZB0O`g|VeVh)|7ZyfMitgabr8-Ji77OzFKboj?GR$J#AvZL7Y!kI}vCk}V(P zwGwumM%i6Ad)IbE70IT`hS14rn}l{TM8wiIKZVnbH0$AAyj~A6A-t_J+jgI)=5V## z!(Z})_hh3i13o`nTgOLsen2y^3A&exDBJt``mTh4!Qd5iOUMqUS$@g95$L^gP98~f z4jt(EaMCL%iFD^E>%8bKb$D#j;Vr0bH%?-I%Cv++aI^fD-V8cPFzy?Z9}T)&-G2aK zpxmLyGAx99WP|zoRsGsE=79XYWZIT0BNW1SX88tA*Yp0^wK z4Q`=Yw919uiV$2P1g1JSyxcEH4?>zHRC@Er+B#-?i$^Xi>}8y$d92Jmg{x`>#B613 zFwTI5O?vZSgr|AtE?O=tGw_XuGpxn#`2Kd5-2Sj`NS4tQx{{1ujFZpnO%^aTH8nMc zs)?Sj3|w`FJXh`{`;mu{JW?jn!Q`}6@F}!}F7SMqF`4y{?kVSILXRTSi|Wn}0B#r8 zext=W?sdrpxPLaPj3^E@I&!HbuKB>l#Id5;yQynY+ox1C)p{cLQ}~oPc0PNzIeRxH zDdSZ}tfo1BzM6P#3StPhg(fLu*_HBxb2kN!9RsU|t=lF$!V&VZ(1OsXibVry63a)C zQc_Zj{U83!h4%t=-=FApVRy|dWNry!7bOcTD=);{^v|g$=yv^HKj{nXPU)KMc45DS ziZ<5Rv-4%DD+c_vbT6V8;0zD+DDfP8uUG@*ylxJRAtLy3Eo(VN#8N+azDb>9>?)>t zrkQ;DJ>o>O(FFbgPwvL$R5$yGFDzo8)kkq34m;VlSi-IGz#% zwrl_M!jw0dJD-i%gkzTJ`fK|o^vq;}$=|Gff@hC$JHGw<3~P5RA|NJC!P5V`=h;54 zINvy&%g@0rtRqifZXr@k_MD^OGcCC8^ZcSa@6T6BQo2$ZiT4t*p6p}1h2N%Khs?tz zINONt<7jV2`bM@~+xs20wI5kt`#Q`l62(0;2w6r(WXvz0-2;}i@zv7c8R-GqmDE+LK*Pvh@buzyY>1)mBdB%vHvz<@{AP$+bA zL;WggBDahtP~AkWHkSg0PiJzbt)lQ!Na;}qjo1n;5{mY4?1Z8_&2jwwd(5wdSOtx+ zcLL6>b39?XYlmnR?RB2 zBx@o|@KPCTxC%hKz!y_ z{Ybm)QjfgJQjbxS{$);kg>OyMF4%|dj6A+Hj#r=Z_f|Qtl_jY%^92BCH-(EE8kDMi zc}3lJnRJ7XziA6|NI>+>6|Nwn^^)wvNOv!u5>9*dDG+ zu)-hg$;-sx3e@F(For~W^7V&yH}p$)2PeV+NjFvu{2d=(+C1#No$8<9dwDrH@o$tN ze*P=*XLjvFyxc9*vOn<7?A?4ucjZkVlAF%WUyv?X_yD99s2jN2mL!&qJ3)OvA+=4$vReV7;6ofFklTPATi*O9L7 zQgwE5^^Wf5RIzUtljwyx6hU)D{Cat1Wl>ib=wmkWOU2jX;u{_?wHJVdZVwVH`lm+W z1Pg6_-}1g*0Bv26!~+$=N!xr!$_1vtT>54}ZPCpWN@x!G-Uv1~tkorhJ;D8^0+(8$ zTnJX2C4io-uu)0XMt$LAJnN5%%^gdBRZd#VcU=~lz=vomFH-Vgp1ERZ(Es7gQZ&aO zdN@FntpEXR@D~8M;XnTJOEpixU73_&^_o5Ka2MKS_?gC9rGK`_!w|6WT)gF)q>j)v zlW%DVHyR2%f%zBXbS#R-&c{_g@bVt30$VtH-8BNs-it|X%NX?nK>~1cVk_T5VyqTD z2*1=~ic#TfadQH>RoaPe3f(Fa2f51*{E%&(51{_e|D#r}5B->&ovlE`1Ku`PQ&|%G zt!iljl2feL$H<3nHaJF>P0ny9+Oontet{cDxD47IZLv*?VvG>t4oWLA6R|JxqKMWZXeyN z^V&iyUw&L&{6K(99^@jMb>`lC^0rCrzV`nu@Py=ga?-{@RL4UhVAcSjZ(>oJPLDJvMG#OR-7LCdGVz+%eP8 z*_oS=zzCqe;{yh#bf^rrp%(chovnRH3s($=&1yXJ%C}DX!#d9q#dj5J?sl~4J pjQgQiIse Date: Fri, 21 Jun 2013 21:37:20 +0400 Subject: [PATCH 22/68] Fixes for runtimes and viruses staying in blood after curing. --- code/modules/organs/blood.dm | 4 ++-- code/modules/virus2/disease2.dm | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm index 2dfa262fc9..78ccd65c28 100644 --- a/code/modules/organs/blood.dm +++ b/code/modules/organs/blood.dm @@ -163,7 +163,8 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 //set reagent data B.data["donor"] = src -// B.data["virus2"] = virus_mergelist(B.data["virus2"] , src.virus2) + 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) @@ -200,7 +201,6 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 else vessel.add_reagent("blood", amount, injected.data) vessel.update_total() -// src.virus2 = virus_mergelist(src.virus2 , injected.data["virus2"]) src.virus2 |= virus_copylist(injected.data["virus2"]) if (injected.data["antibodies"] && prob(5)) antibodies |= injected.data["antibodies"] diff --git a/code/modules/virus2/disease2.dm b/code/modules/virus2/disease2.dm index 7454ecf81c..dd8905af17 100644 --- a/code/modules/virus2/disease2.dm +++ b/code/modules/virus2/disease2.dm @@ -59,8 +59,6 @@ if(stage == max_stage) src.cure(mob) mob.antibodies |= src.antigen - mob.virus2 -= src - del src stage++ clicks = 0 //Do nasty effects @@ -74,6 +72,7 @@ /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() var/datum/disease2/effectholder/holder = pick(effects) From 2a9be1a2aa7d6e36bd26a060f376ac0bbf059122 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Sat, 22 Jun 2013 12:08:37 +0400 Subject: [PATCH 23/68] Commented out blood/virus food reaction, that was about tg virus system. --- code/modules/reagents/Chemistry-Recipes.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index 52e7ba9d63..dffbabc1a6 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" From 051edc22275dc63b34905664ef81208c25711485 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Fri, 28 Jun 2013 15:43:58 +0400 Subject: [PATCH 24/68] Started implementing of ViroDB. -Analyzers now add info about viruses they scan to global list. -Health analyzers will only find known viruses. --- code/game/objects/items/devices/scanners.dm | 7 +++- code/modules/virus2/analyser.dm | 11 ++---- code/modules/virus2/centrifuge.dm | 2 +- code/modules/virus2/disease2.dm | 40 ++++++++++++++++----- 4 files changed, 41 insertions(+), 19 deletions(-) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 0ceeb67411..72e7431492 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -130,7 +130,12 @@ MASS SPECTROMETER if(M:reagents.total_volume > 0) user.show_message(text("\red Warning: Unknown substance detected in subject's blood.")) if(M:virus2.len) - user.show_message(text("\red Warning: Unknown pathogen detected in subject's blood.")) + 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) diff --git a/code/modules/virus2/analyser.dm b/code/modules/virus2/analyser.dm index c792e81c6a..3463c2504d 100644 --- a/code/modules/virus2/analyser.dm +++ b/code/modules/virus2/analyser.dm @@ -33,14 +33,7 @@ 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]." - - r += "
Antigen pattern: [antigens2string(dish.virus2.antigen)]" + var/r = dish.virus2.get_info() var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(src.loc) P.info = r @@ -49,6 +42,8 @@ dish.loc = src.loc dish = null icon_state = "analyser" + if (dish.virus2.addToDB()) + src.state("\The [src.name] states, \"Added new pathogen to database.\"") src.state("\The [src.name] prints a sheet of paper") diff --git a/code/modules/virus2/centrifuge.dm b/code/modules/virus2/centrifuge.dm index a0330f796c..aadada0b2d 100644 --- a/code/modules/virus2/centrifuge.dm +++ b/code/modules/virus2/centrifuge.dm @@ -52,7 +52,7 @@ var/list/virus = B.data["virus2"] for (var/ID in virus) var/datum/disease2/disease/V = virus[ID] - dat += " pathogen #[V.uniqueID]" + dat += " pathogen [V.name()]" dat += "Isolate" else dat += "Please check container contents." diff --git a/code/modules/virus2/disease2.dm b/code/modules/virus2/disease2.dm index dd8905af17..81560a3fb1 100644 --- a/code/modules/virus2/disease2.dm +++ b/code/modules/virus2/disease2.dm @@ -128,12 +128,34 @@ var/datum/disease2/disease/V = viruses[ID] res["[V.uniqueID]"] = V.getcopy() return res -/* -/proc/virus_mergelist(var/list/datum/disease2/disease/viruses1, var/list/datum/disease2/disease/viruses2) - var/list/res = virus_copylist(viruses1) - for (var/ID in viruses2) - var/datum/disease2/disease/V = viruses2[ID] - if(!res["[V.uniqueID]"]) - res["[V.uniqueID]"] = V.getcopy() - return res -*/ \ No newline at end of file + + +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)]" + +/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 From 8bd7d77916f725b8caf3fb8283cd51627365ca49 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Fri, 28 Jun 2013 23:57:16 +0400 Subject: [PATCH 25/68] Medical record viral DB now should list scanned virus2 stamms. Fixed runtime in analyzer DB uploading. Fixed derp in get_info() proc for viri --- code/game/machinery/computer/medical.dm | 26 ++++++++++++------------- code/modules/virus2/analyser.dm | 4 ++-- code/modules/virus2/disease2.dm | 1 + 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index d3e7e4c178..33e6f7ab30 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
" @@ -169,20 +175,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) diff --git a/code/modules/virus2/analyser.dm b/code/modules/virus2/analyser.dm index 3463c2504d..21471a8379 100644 --- a/code/modules/virus2/analyser.dm +++ b/code/modules/virus2/analyser.dm @@ -39,11 +39,11 @@ 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" - if (dish.virus2.addToDB()) - src.state("\The [src.name] states, \"Added new pathogen to database.\"") src.state("\The [src.name] prints a sheet of paper") diff --git a/code/modules/virus2/disease2.dm b/code/modules/virus2/disease2.dm index 81560a3fb1..c0b8234427 100644 --- a/code/modules/virus2/disease2.dm +++ b/code/modules/virus2/disease2.dm @@ -147,6 +147,7 @@ var/global/list/virusDB = list() 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) From 0e1829794eb6178013418c694ec8f3b0a01179f6 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Sat, 29 Jun 2013 19:08:31 +0400 Subject: [PATCH 26/68] Started on editing capability for virus DB. Some weird issues with it, like first making stuff invisible. Committing before Armageddon. --- code/game/machinery/computer/medical.dm | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index 33e6f7ab30..560268e5f3 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -176,11 +176,11 @@ if(href_list["vir"]) 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 = "
GNAv2 based virus lifeform V-[v.fields["id"]]
" + src.temp += "
Name: [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) @@ -283,6 +283,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["vir"]) + if (istype(v, /datum/data/record)) + 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["vir"]) + if (istype(v, /datum/data/record)) + 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"]) From 05142eac35b72893eb0a79afc2d69328249a5924 Mon Sep 17 00:00:00 2001 From: comma Date: Mon, 1 Jul 2013 15:14:30 +0400 Subject: [PATCH 27/68] Fixed formatting issue. Editing name and description works now. --- code/game/machinery/computer/medical.dm | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index 560268e5f3..f826ef8c3d 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -176,11 +176,11 @@ if(href_list["vir"]) 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) @@ -284,15 +284,15 @@ return src.active1.fields["dna"] = t1 if("vir_name") - var/datum/data/record/v = locate(href_list["vir"]) - if (istype(v, /datum/data/record)) + 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["vir"]) - if (istype(v, /datum/data/record)) + 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 From 5d9a3f12a1383ef530ecb245bb5631bf4906d7be Mon Sep 17 00:00:00 2001 From: comma Date: Mon, 1 Jul 2013 17:08:21 +0400 Subject: [PATCH 28/68] Fixed humans being lukewarmblooded. Now only severe temperature differences will affect internal body temperature, so it will revert back to normal after a bit. --- code/modules/mob/living/carbon/human/life.dm | 33 +++++++++++++------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 25707e7d73..05fcd7eb7d 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -542,17 +542,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 +635,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. From 1b9d6f67e2006bffcb46bcf9cc30631cea032eba Mon Sep 17 00:00:00 2001 From: comma Date: Mon, 1 Jul 2013 17:22:20 +0400 Subject: [PATCH 29/68] Made mutation change virus ID. --- code/modules/virus2/disease2.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/virus2/disease2.dm b/code/modules/virus2/disease2.dm index c0b8234427..84fcf486e4 100644 --- a/code/modules/virus2/disease2.dm +++ b/code/modules/virus2/disease2.dm @@ -75,11 +75,13 @@ 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)) From 6e61fe391480c4bb37837d18c2d56b2535c16554 Mon Sep 17 00:00:00 2001 From: Spamcat Date: Fri, 5 Jul 2013 03:11:50 +0400 Subject: [PATCH 30/68] Initial pulse code. WIP --- .../mob/living/carbon/carbon_defines.dm | 4 +- .../mob/living/carbon/human/examine.dm | 1 + code/modules/mob/living/carbon/human/human.dm | 40 +++++++++++++++++++ code/modules/mob/living/carbon/human/life.dm | 33 +++++++++++++++ code/setup.dm | 15 +++++++ 5 files changed, 92 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 2ea08f56a4..dd1a80a80c 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -19,4 +19,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 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 20f56dd022..c929d5e952 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -440,6 +440,7 @@ if( findtext(pose,".",lentext(pose)) == 0 && findtext(pose,"!",lentext(pose)) == 0 && findtext(pose,"?",lentext(pose)) == 0 ) pose = addtext(pose,".") //Makes sure all emotes end with a period. msg += "\n[t_He] is [pose]" + msg += "\n\red pulse:[src.pulse]" usr << msg diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 78546ceea2..ea98ee5631 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1218,3 +1218,43 @@ 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) + + if(usr.stat == 1 || usr.restrained() || !isliving(usr)) return + + usr.visible_message("\blue [usr] kneels down, puts \his hand on [src]'s wrist and begins counting their pulse.",\ + "\blue Don't move until counting is finished.") + if(src.pulse) + usr << "\blue [src] has pulse! Counting..." + else + usr << "\red [src] has no pulse!" + return + + sleep(60) + if(usr.move_speed >= 60) + usr << "\blue [src]'s pulse is [src.get_pulse(0)]." + +/mob/living/carbon/human/proc/get_pulse(var/method) //method 0 is for hands, 1 is for machines, more accurate + var/temp = 0 + switch(src.pulse) + if(PULSE_NONE) + return "0" + if(PULSE_SLOW) + temp = rand(40, 60) + return method ? num2text(temp) : temp + rand(-10, 10) + if(PULSE_NORM) + temp = rand(60, 90) + return method ? num2text(temp) : temp + rand(-10, 10) + if(PULSE_FAST) + temp = rand(90, 120) + return method ? num2text(temp) : temp + rand(-10, 10) + if(PULSE_2FAST) + temp = rand(120, 160) + return method ? num2text(temp) : temp + rand(-10, 10) + if(PULSE_THREADY) + return method ? ">250" : "extremely weak and fast, patient's artery feels like a thread" \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 366ea5e02b..566e5a24e2 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() @@ -211,6 +213,8 @@ // Next, the method to induce stasis has some adverse side-effects, manifesting // as cloneloss adjustCloneLoss(0.1) + //no pulse in stasis + pulse = PULSE_NONE proc/handle_mutations_and_radiation() if(getFireLoss()) @@ -1414,5 +1418,34 @@ if (shock_stage > 80) Paralyse(rand(15,28)) + proc/handle_pulse() + //if(life_tick % 100) return pulse //update pulse every 100 life ticks + + 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(reagents.get_reagent_amount("zombiepowder")) + temp = PULSE_NONE //pretend that we're dead. unlike actual death, can be inflienced by meds + + for(var/R in bradycardics) + if(reagents.get_reagent_amount(R)) + if(temp <= PULSE_THREADY && temp >= PULSE_NORM) + temp-- + break //one reagent is enough + + for(var/R in tachycardics) //handles different chems' influence on pulse + if(reagents.get_reagent_amount(R)) + if(temp <= PULSE_FAST && temp >= PULSE_NONE) + temp++ + break + + return temp + + #undef HUMAN_MAX_OXYLOSS #undef HUMAN_CRIT_MAX_OXYLOSS diff --git a/code/setup.dm b/code/setup.dm index f4b8d35e2f..d817150d90 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -678,3 +678,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 + +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 + +//get_pulse methods +#define GETPULSE_HAND 0 //less accurate (hand) +#define GETPULSE_TOOL 1 //more accurate (med scanner, sleeper, etc) \ No newline at end of file From 24eddd6eaaa61ec246efcdfbe99055134d550f56 Mon Sep 17 00:00:00 2001 From: Spamcat Date: Fri, 5 Jul 2013 04:12:41 +0400 Subject: [PATCH 31/68] Now 100% more machinery! --- code/game/machinery/computer/Operating.dm | 1 + code/game/objects/items/devices/scanners.dm | 2 ++ .../mob/living/carbon/human/examine.dm | 2 +- code/modules/mob/living/carbon/human/human.dm | 33 +++++++++++++------ code/setup.dm | 6 ++-- 5 files changed, 30 insertions(+), 14 deletions(-) diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm index 2022dc79da..accd7b7a68 100644 --- a/code/game/machinery/computer/Operating.dm +++ b/code/game/machinery/computer/Operating.dm @@ -55,6 +55,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/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index f86f38cc83..37f4a80937 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -174,6 +174,8 @@ 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") + if(H.pulse) + user.show_message("\blue Subject's pulse: [H.get_pulse(GETPULSE_TOOL)] bpm.") src.add_fingerprint(user) return diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index c929d5e952..dbb721afa9 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -223,6 +223,7 @@ else usr << "[t_He] has no pulse..." + msg += "" if(nutrition < 100) @@ -440,7 +441,6 @@ if( findtext(pose,".",lentext(pose)) == 0 && findtext(pose,"!",lentext(pose)) == 0 && findtext(pose,"?",lentext(pose)) == 0 ) pose = addtext(pose,".") //Makes sure all emotes end with a period. msg += "\n[t_He] is [pose]" - msg += "\n\red pulse:[src.pulse]" usr << msg diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index ea98ee5631..e841bb2718 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1224,20 +1224,32 @@ mob/living/carbon/human/yank_out_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 - usr.visible_message("\blue [usr] kneels down, puts \his hand on [src]'s wrist and begins counting their pulse.",\ - "\blue Don't move until counting is finished.") + 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 [src] has pulse! Counting..." + usr << "\blue [self ? "I have" : "[src] has"] pulse! Counting..." else usr << "\red [src] has no pulse!" return + usr << "Don't move until counting is finished." + var/time = world.timeofday sleep(60) - if(usr.move_speed >= 60) - usr << "\blue [src]'s pulse is [src.get_pulse(0)]." + 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 [src]'s pulse is [src.get_pulse(GETPULSE_HAND)]." /mob/living/carbon/human/proc/get_pulse(var/method) //method 0 is for hands, 1 is for machines, more accurate var/temp = 0 @@ -1246,15 +1258,16 @@ mob/living/carbon/human/yank_out_object() return "0" if(PULSE_SLOW) temp = rand(40, 60) - return method ? num2text(temp) : temp + rand(-10, 10) + return num2text(method ? temp : temp + rand(-10, 10)) if(PULSE_NORM) temp = rand(60, 90) - return method ? num2text(temp) : temp + rand(-10, 10) + return num2text(method ? temp : temp + rand(-10, 10)) if(PULSE_FAST) temp = rand(90, 120) - return method ? num2text(temp) : temp + rand(-10, 10) + return num2text(method ? temp : temp + rand(-10, 10)) if(PULSE_2FAST) temp = rand(120, 160) - return method ? num2text(temp) : temp + rand(-10, 10) + 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" \ No newline at end of file + 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/setup.dm b/code/setup.dm index d817150d90..046ba2a189 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -686,10 +686,10 @@ var/list/be_special_flags = list( #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 +var/list/bradycardics = list("neurotoxin", "cryoxadone", "clonexadone", "space_drugs", "stoxin") //decrease heart rate -//get_pulse methods +//proc/get_pulse methods #define GETPULSE_HAND 0 //less accurate (hand) #define GETPULSE_TOOL 1 //more accurate (med scanner, sleeper, etc) \ No newline at end of file From 3a1ea41ff266447d73801d0439b295b1701d114e Mon Sep 17 00:00:00 2001 From: Spamcat Date: Fri, 5 Jul 2013 04:39:57 +0400 Subject: [PATCH 32/68] Moar machinery. --- code/game/machinery/Sleeper.dm | 3 +++ code/game/machinery/cryo.dm | 2 +- code/modules/mob/living/carbon/carbon.dm | 24 ++++++++++++++++++- code/modules/mob/living/carbon/human/human.dm | 22 +---------------- code/modules/mob/living/carbon/human/life.dm | 2 +- 5 files changed, 29 insertions(+), 24 deletions(-) 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/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/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/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index e841bb2718..58c0f09373 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1249,25 +1249,5 @@ mob/living/carbon/human/yank_out_object() 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 [src]'s pulse is [src.get_pulse(GETPULSE_HAND)]." + usr << "\blue [self ? "My" : "[src]'s"] pulse is [src.get_pulse(GETPULSE_HAND)]." -/mob/living/carbon/human/proc/get_pulse(var/method) //method 0 is for hands, 1 is for machines, more accurate - var/temp = 0 - 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/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 566e5a24e2..a1d714ba17 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -1437,7 +1437,7 @@ if(temp <= PULSE_THREADY && temp >= PULSE_NORM) temp-- break //one reagent is enough - + //comment out the breaks to make med effects stack for(var/R in tachycardics) //handles different chems' influence on pulse if(reagents.get_reagent_amount(R)) if(temp <= PULSE_FAST && temp >= PULSE_NONE) From 1541b5dec8fe390be5096891d02e2584017cf2c1 Mon Sep 17 00:00:00 2001 From: Spamcat Date: Fri, 5 Jul 2013 04:44:54 +0400 Subject: [PATCH 33/68] Changelog. --- html/changelog.html | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/html/changelog.html b/html/changelog.html index 83de3037b7..4e37e06ec6 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -57,6 +57,13 @@ Stuff which is in development and not yet visible to players or just code relate (ie. code improvements for expandability, etc.) should not be listed here. They should be listed in the changelog upon commit though. Thanks. --> +
+

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.
  • +
+

03.07.2013

Segrain updated:

From f7dc8f8c0a867f4d50749c5ed00fff1a223ca46e Mon Sep 17 00:00:00 2001 From: Spamcat Date: Fri, 5 Jul 2013 04:50:18 +0400 Subject: [PATCH 34/68] derp --- code/modules/mob/living/carbon/human/life.dm | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index a1d714ba17..1806bf1700 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -213,8 +213,6 @@ // Next, the method to induce stasis has some adverse side-effects, manifesting // as cloneloss adjustCloneLoss(0.1) - //no pulse in stasis - pulse = PULSE_NONE proc/handle_mutations_and_radiation() if(getFireLoss()) From 9cc31cdd21e9367508997016e23ecb3c6fde42e5 Mon Sep 17 00:00:00 2001 From: LordBraindead Date: Fri, 5 Jul 2013 09:03:32 +0200 Subject: [PATCH 35/68] changed how fire works -fire switched to release energy by burning fuel and generating heat from that - reorganzied the fire process in a saner manner --- code/ZAS/Fire.dm | 333 ++++++++++++++++++++++++++--------------------- 1 file changed, 182 insertions(+), 151 deletions(-) diff --git a/code/ZAS/Fire.dm b/code/ZAS/Fire.dm index 3cfccaeb84..023d60acf0 100644 --- a/code/ZAS/Fire.dm +++ b/code/ZAS/Fire.dm @@ -11,8 +11,6 @@ Attach to transfer valve and open. BOOM. */ - - //Some legacy definitions so fires can be started. atom/proc/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) return null @@ -21,35 +19,24 @@ atom/proc/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0) - turf/simulated/hotspot_expose(exposed_temperature, exposed_volume, soh) - if(fire_protection > world.time-300) return - var/datum/gas_mixture/air_contents = return_air(1) - if(!air_contents) + if(fire_protection > world.time-300) return 0 - - /*if(active_hotspot) - if(soh) - if(air_contents.toxins > 0.5 && air_contents.oxygen > 0.5) - if(active_hotspot.temperature < exposed_temperature) - active_hotspot.temperature = exposed_temperature - if(active_hotspot.volume < exposed_volume) - active_hotspot.volume = exposed_volume - return 1*/ - var/igniting = 0 if(locate(/obj/fire) in src) return 1 - var/datum/gas/volatile_fuel/fuel = locate() in air_contents.trace_gases + var/datum/gas_mixture/air_contents = return_air() + if(!air_contents || exposed_temperature < PLASMA_MINIMUM_BURN_TEMPERATURE) + return 0 + + var/igniting = 0 var/obj/effect/decal/cleanable/liquid_fuel/liquid = locate() in src - if(air_contents.calculate_firelevel(liquid) > vsc.IgnitionLevel && (fuel || liquid || air_contents.toxins > 0.5)) + + if(air_contents.check_combustability(liquid)) igniting = 1 - if(air_contents.oxygen < 0.5) - return 0 if(! (locate(/obj/fire) in src)) - var/obj/fire/F = new(src,1000) - F.temperature = exposed_temperature - F.volume = CELL_VOLUME + + new /obj/fire(src,1000) //active_hotspot.just_spawned = (current_cycle < air_master.current_cycle) //remove just_spawned protection if no longer processing this cell @@ -71,93 +58,97 @@ obj layer = TURF_LAYER var - volume = CELL_VOLUME - temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST firelevel = 10000 //Calculated by gas_mixture.calculate_firelevel() - archived_firelevel = 0 process() . = 1 - - if(firelevel > vsc.IgnitionLevel) - - var/turf/simulated/floor/S = loc - if(!S.zone) del src //Cannot exist where zones are broken. - - if(istype(S)) - var - datum/gas_mixture/air_contents = S.return_air() - //Get whatever trace fuels are in the area - datum/gas/volatile_fuel/fuel = locate() in air_contents.trace_gases - //Also get liquid fuels on the ground. - obj/effect/decal/cleanable/liquid_fuel/liquid = locate() in S - - var/datum/gas_mixture/flow = air_contents.remove_ratio(0.25) - //The reason we're taking a part of the air instead of all of it is so that it doesn't jump to - //the fire's max temperature instantaneously. - - firelevel = air_contents.calculate_firelevel(liquid) - - //Ensure that there is an appropriate amount of fuel and O2 here. - if(firelevel > 0.25 && flow.oxygen > 0.3 && (air_contents.toxins || fuel || liquid)) - - for(var/direction in cardinal) - if(S.air_check_directions&direction) //Grab all valid bordering tiles - - var/turf/simulated/enemy_tile = get_step(S, direction) - - if(istype(enemy_tile)) - //If extinguisher mist passed over the turf it's trying to spread to, don't spread and - //reduce firelevel. - if(enemy_tile.fire_protection > world.time-30) - firelevel -= 1.5 - continue - - //Spread the fire. - if(!(locate(/obj/fire) in enemy_tile)) - if( prob( firelevel*10 ) && S.CanPass(null, enemy_tile, 0,0) && enemy_tile.CanPass(null, S, 0,0)) - new/obj/fire(enemy_tile,firelevel) - - if(flow) - - //Ensure adequate oxygen and fuel. - if(flow.oxygen > 0.3 && (flow.toxins || fuel || liquid)) - - //Change icon depending on the fuel, and thus temperature. - if(firelevel > 6) - icon_state = "3" - else if(firelevel > 2.5) - icon_state = "2" - else - icon_state = "1" - - //Ensure flow temperature is higher than minimum fire temperatures. - flow.temperature = max(PLASMA_MINIMUM_BURN_TEMPERATURE+0.1,flow.temperature) - - //Burn the gas mixture. - flow.zburn(liquid) - if(fuel && fuel.moles <= 0.00001) - del fuel - - else - - del src - - - S.assume_air(flow) //Then put it back where you found it. - - else - del src - else - del src - else + + //get location and check if it is in a proper ZAS zone + var/turf/simulated/floor/S = loc + if(!S.zone) del src - - + + if(!istype(S)) + del src + + var/datum/gas_mixture/air_contents = S.return_air() + //get liquid fuels on the ground. + var/obj/effect/decal/cleanable/liquid_fuel/liquid = locate() in S + //and the volatile stuff from the air + var/datum/gas/volatile_fuel/fuel = locate() in air_contents.trace_gases + + //since the air is processed in fractions, we need to make sure not to have any minuscle residue or + //the amount of moles might get to low for some functions to catch them and thus result in wonky behaviour + if(air_contents.oxygen < 0.001) + air_contents.oxygen = 0 + if(air_contents.toxins < 0.001) + air_contents.toxins = 0 + if(fuel) + if(fuel.moles < 0.001) + air_contents.trace_gases.Remove(fuel) + + //check if there is something to combust + if(!air_contents.check_combustability(liquid)) + del src + + //get a firelevel and set the icon + firelevel = air_contents.calculate_firelevel(liquid) + + if(firelevel > 6) + icon_state = "3" + SetLuminosity(7) + else if(firelevel > 2.5) + icon_state = "2" + SetLuminosity(5) + else + icon_state = "1" + SetLuminosity(3) + + //im not sure how to implement a version that works for every creature so for now monkeys are firesafe for(var/mob/living/carbon/human/M in loc) - M.FireBurn(temperature, min(max(0.1,firelevel / 20),10)) //Burn the humans! + M.FireBurn(firelevel, air_contents.temperature, air_contents.return_pressure() ) //Burn the humans! + + //spread! + for(var/direction in cardinal) + if(S.air_check_directions&direction) //Grab all valid bordering tiles + var/turf/simulated/enemy_tile = get_step(S, direction) + + if(istype(enemy_tile)) + //If extinguisher mist passed over the turf it's trying to spread to, don't spread and + //reduce firelevel. + if(enemy_tile.fire_protection > world.time-30) + firelevel -= 1.5 + continue + + //Spread the fire. + if(!(locate(/obj/fire) in enemy_tile)) + if( prob( 50 + 50 * (firelevel/vsc.fire_firelevel_multiplier) ) && S.CanPass(null, enemy_tile, 0,0) && enemy_tile.CanPass(null, S, 0,0)) + new/obj/fire(enemy_tile,firelevel) + + //seperate part of the present gas + //this is done to prevent the fire burning all gases in a single pass + var/datum/gas_mixture/flow = air_contents.remove_ratio(vsc.fire_consuption_rate) + +///////////////////////////////// FLOW HAS BEEN CREATED /// DONT DELETE THE FIRE UNTIL IT IS MERGED BACK OR YOU WILL DELETE AIR /////////////////////////////////////////////// + + if(flow) + if(flow.check_combustability(liquid)) + //Ensure flow temperature is higher than minimum fire temperatures. + //this creates some energy ex nihilo but is necessary to get a fire started + //lets just pretend this energy comes from the ignition source and dont mention this again + //flow.temperature = max(PLASMA_MINIMUM_BURN_TEMPERATURE+0.1,flow.temperature) + + //burn baby burn! + flow.zburn(liquid,1) + + //merge the air back + S.assume_air(flow) + +///////////////////////////////// FLOW HAS BEEN REMERGED /// feel free to delete the fire again from here on ////////////////////////////////////////////////////////////////// + + New(newLoc,fl) ..() @@ -165,13 +156,14 @@ obj del src dir = pick(cardinal) - //sd_SetLuminosity(3,2,0) + SetLuminosity(3) firelevel = fl air_master.active_hotspots.Add(src) + Del() if (istype(loc, /turf/simulated)) - //sd_SetLuminosity(0) + SetLuminosity(0) loc = null air_master.active_hotspots.Remove(src) @@ -179,23 +171,25 @@ obj ..() + turf/simulated/var/fire_protection = 0 //Protects newly extinguished tiles from being overrun again. turf/proc/apply_fire_protection() turf/simulated/apply_fire_protection() fire_protection = world.time -datum/gas_mixture/proc/zburn(obj/effect/decal/cleanable/liquid_fuel/liquid) - //This proc is similar to fire(), but uses a simple logarithm to calculate temp, and is thus more stable with ZAS. - if(temperature > PLASMA_MINIMUM_BURN_TEMPERATURE) - var - total_fuel = toxins - fuel_sources = 0 //We'll divide by this later so that fuel is consumed evenly. - datum/gas/volatile_fuel/fuel = locate() in trace_gases +datum/gas_mixture/proc/zburn(obj/effect/decal/cleanable/liquid_fuel/liquid,force_burn) + var/value = 0 + + if((temperature > PLASMA_MINIMUM_BURN_TEMPERATURE || force_burn) && check_combustability(liquid) ) + var/total_fuel = 0 + var/datum/gas/volatile_fuel/fuel = locate() in trace_gases + + total_fuel += toxins + if(fuel) //Volatile Fuel total_fuel += fuel.moles - fuel_sources++ if(liquid) //Liquid Fuel @@ -203,61 +197,94 @@ datum/gas_mixture/proc/zburn(obj/effect/decal/cleanable/liquid_fuel/liquid) del liquid else total_fuel += liquid.amount - fuel_sources++ - //Toxins - if(toxins > 0.3) fuel_sources++ + //Calculate the firelevel. + var/firelevel = calculate_firelevel(liquid) - if(!fuel_sources) return 0 //If there's no fuel, there's no burn. Can't divide by zero anyway. + //get the current inner energy of the gas mix + //this must be taken here to prevent the addition or deletion of energy by a changing heat capacity + var/starting_energy = temperature * heat_capacity() - if(oxygen > 0.3) + //determine the amount of oxygen used + var/total_oxygen = min(oxygen, 2 * total_fuel) + + //determine the amount of fuel actually used + var/used_fuel_ratio = min(oxygen / 2 , total_fuel) / total_fuel + total_fuel = total_fuel * used_fuel_ratio - //Calculate the firelevel. - var/firelevel = calculate_firelevel(liquid) + var/total_reactants = total_fuel + total_oxygen - //Reaches a maximum practical temperature of around 4500. + //determine the amount of reactants actually reacting + var/used_reactants_ratio = min( max(total_reactants * firelevel / vsc.fire_firelevel_multiplier, 0.2), total_reactants) / total_reactants - //Increase temperature. - temperature = max( 1700*log(0.4*firelevel + 1.23) , temperature ) + //remove and add gasses as calculated + oxygen -= min(oxygen, total_oxygen * used_reactants_ratio ) - //Consume some gas. - var/consumed_gas = min(oxygen,0.05*firelevel,total_fuel) / fuel_sources + toxins -= min(toxins, toxins * used_fuel_ratio * used_reactants_ratio ) - oxygen = max(0,oxygen-consumed_gas) + carbon_dioxide += max(2 * total_fuel, 0) - toxins = max(0,toxins-consumed_gas) + if(fuel) + fuel.moles -= fuel.moles * used_fuel_ratio * used_reactants_ratio + if(fuel.moles <= 0) del fuel - carbon_dioxide += consumed_gas*2 + if(liquid) + liquid.amount -= liquid.amount * used_fuel_ratio * used_reactants_ratio + if(liquid.amount <= 0) del liquid - if(fuel) - fuel.moles -= consumed_gas - if(fuel.moles <= 0) del fuel - - if(liquid) - liquid.amount -= consumed_gas - if(liquid.amount <= 0) del liquid - - update_values() - return consumed_gas*fuel_sources - return 0 + //calculate the energy produced by the reaction and then set the new temperature of the mix + temperature = (starting_energy + vsc.fire_fuel_energy_release * total_fuel) / heat_capacity() + + update_values() + value = total_reactants * used_reactants_ratio + return value +datum/gas_mixture/proc/check_combustability(obj/effect/decal/cleanable/liquid_fuel/liquid) + //this check comes up very often and is thus centralized here to ease adding stuff + + var/datum/gas/volatile_fuel/fuel = locate() in trace_gases + var/value = 0 + + if(oxygen && (toxins || fuel || liquid)) + value = 1 + + return value datum/gas_mixture/proc/calculate_firelevel(obj/effect/decal/cleanable/liquid_fuel/liquid) - //Calculates the firelevel based on one equation instead of having to do this multiple times in different areas. - var - datum/gas/volatile_fuel/fuel = locate() in trace_gases - liquid_concentration = 0 + //Calculates the firelevel based on one equation instead of having to do this multiple times in different areas. + + var/datum/gas/volatile_fuel/fuel = locate() in trace_gases + var/total_fuel = 0 + var/firelevel = 0 + + if(check_combustability(liquid)) + + total_fuel += toxins - oxy_concentration = oxygen / volume - tox_concentration = toxins / volume - fuel_concentration = 0 + if(liquid) + total_fuel += liquid.amount - if(fuel) fuel_concentration = (fuel.moles) / volume - if(liquid) liquid_concentration = (liquid.amount*15) / volume - return (oxy_concentration + tox_concentration + liquid_concentration + fuel_concentration)*100 + if(fuel) + total_fuel += fuel.moles -/mob/living/carbon/human/proc/FireBurn(last_temperature, mx as num) + var/total_combustables = (total_fuel + oxygen) + + if(total_fuel > 0 && oxygen > 0) + + //slows down the burning when the concentration of the reactants is low + var/dampening_multiplier = total_combustables / (total_combustables + nitrogen + carbon_dioxide) + //calculates how close the mixture of the reactants is to the optimum + var/mix_multiplier = 1 / (1 + (5 * ((oxygen / total_combustables) ^2))) + //toss everything together + firelevel = vsc.fire_firelevel_multiplier * mix_multiplier * dampening_multiplier + + return max( 0, firelevel) + + +/mob/living/carbon/human/proc/FireBurn(var/firelevel, var/last_temperature, var/pressure) +// mostly using the old proc from Sky until I can think of something better //Burns mobs due to fire. Respects heat transfer coefficients on various body parts. + //Due to TG reworking how fireprotection works, this is kinda less meaningful. var head_exposure = 1 @@ -266,8 +293,12 @@ datum/gas_mixture/proc/calculate_firelevel(obj/effect/decal/cleanable/liquid_fue legs_exposure = 1 arms_exposure = 1 - //Get heat transfer coefficients for clothing. + //determine the multiplier + //minimize this for low-pressure enviroments + var/mx = 5 * firelevel/vsc.fire_firelevel_multiplier * min(pressure / ONE_ATMOSPHERE, 1) + //Get heat transfer coefficients for clothing. + //skytodo: kill anyone who breaks things then orders me to fix them for(var/obj/item/clothing/C in src) if(l_hand == C || r_hand == C) continue @@ -294,4 +325,4 @@ datum/gas_mixture/proc/calculate_firelevel(obj/effect/decal/cleanable/liquid_fue apply_damage(0.4*mx*arms_exposure, BURN, "l_arm", 0, 0, "Fire") apply_damage(0.4*mx*arms_exposure, BURN, "r_arm", 0, 0, "Fire") - //flash_pain() \ No newline at end of file + //flash_pain() From 032530dfd7a1657dc9ef06d42fea82d34af5aab9 Mon Sep 17 00:00:00 2001 From: LordBraindead Date: Fri, 5 Jul 2013 09:04:39 +0200 Subject: [PATCH 36/68] changed variable settings for the change in fire.dm added one new variable deleted three variables that are no longer used --- code/ZAS/Variable Settings.dm | 23 ++++++----------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/code/ZAS/Variable Settings.dm b/code/ZAS/Variable Settings.dm index ee63fd37b2..dd22765e99 100644 --- a/code/ZAS/Variable Settings.dm +++ b/code/ZAS/Variable Settings.dm @@ -1,25 +1,18 @@ var/global/vs_control/vsc = new vs_control/var - IgnitionLevel = 0.5 - IgnitionLevel_DESC = "Determines point at which fire can ignite" - fire_consuption_rate = 0.25 fire_consuption_rate_NAME = "Fire - Air Consumption Ratio" fire_consuption_rate_DESC = "Ratio of air removed and combusted per tick." fire_firelevel_multiplier = 25 fire_firelevel_multiplier_NAME = "Fire - Firelevel Constant" - fire_firelevel_multiplier_DESC = "Multiplied by the equation for firelevel, affects the combustion and ignition of gas mixes." - - fire_temperature_multiplier = 1700 - fire_temperature_multiplier_NAME = "Fire - Temperature Multiplier" - fire_temperature_multiplier_DESC = "Base value for fire temperatures." - - fire_gas_combustion_ratio = 0.25 - fire_gas_combustion_ratio_NAME = "Fire - Gas Conversion Ratio" - fire_gas_combustion_ratio_DESC = "The rate at which oxygen and plasma are converted to CO2, expressed in terms of the firelevel." + fire_firelevel_multiplier_DESC = "Multiplied by the equation for firelevel, affects mainly the extingiushing of fires." + fire_fuel_energy_release = 397000 + fire_fuel_energy_release_NAME = "Fire - Fuel energy release" + fire_fuel_energy_release_DESC = "The energy in joule released when burning one mol of a burnable substance" + airflow_lightest_pressure = 20 airflow_lightest_pressure_NAME = "Airflow - Small Movement Threshold %" @@ -229,7 +222,6 @@ vs_control plc.CONTAMINATION_LOSS = 0.075 if("ZAS - Normal") - IgnitionLevel = 0.5 airflow_lightest_pressure = 20 airflow_light_pressure = 35 airflow_medium_pressure = 50 @@ -244,7 +236,6 @@ vs_control airflow_mob_slowdown = 1 if("ZAS - Forgiving") - IgnitionLevel = 1 airflow_lightest_pressure = 45 airflow_light_pressure = 60 airflow_medium_pressure = 120 @@ -259,7 +250,6 @@ vs_control airflow_mob_slowdown = 0 if("ZAS - Dangerous") - IgnitionLevel = 0.4 airflow_lightest_pressure = 15 airflow_light_pressure = 30 airflow_medium_pressure = 45 @@ -274,7 +264,6 @@ vs_control airflow_mob_slowdown = 2 if("ZAS - Hellish") - IgnitionLevel = 0.3 airflow_lightest_pressure = 20 airflow_light_pressure = 30 airflow_medium_pressure = 40 @@ -330,4 +319,4 @@ pl_control newvalue = roll(txt) else newvalue = vars[V] - vars[V] = newvalue \ No newline at end of file + vars[V] = newvalue From ba15e0f51517843d3f4d3dfdd877ced19e653362 Mon Sep 17 00:00:00 2001 From: LordBraindead Date: Fri, 5 Jul 2013 09:06:34 +0200 Subject: [PATCH 37/68] readjusted composition of syndie bombs set them to produce a 1-2-5 explosion for the fire changes --- code/game/objects/effects/spawners/bombspawner.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/game/objects/effects/spawners/bombspawner.dm b/code/game/objects/effects/spawners/bombspawner.dm index 944efe32a7..1d59701bb7 100644 --- a/code/game/objects/effects/spawners/bombspawner.dm +++ b/code/game/objects/effects/spawners/bombspawner.dm @@ -137,12 +137,12 @@ OT.master = V PT.air_contents.temperature = PLASMA_FLASHPOINT - PT.air_contents.toxins = 15 - PT.air_contents.carbon_dioxide = 33 + PT.air_contents.toxins = 3 + PT.air_contents.carbon_dioxide = 17 PT.air_contents.update_values() OT.air_contents.temperature = PLASMA_FLASHPOINT - OT.air_contents.oxygen = 48 + OT.air_contents.oxygen = 20 OT.air_contents.update_values() var/obj/item/device/assembly/S @@ -171,4 +171,4 @@ V.update_icon() - del(src) \ No newline at end of file + del(src) From d514be535c1990492f17b7ddf1d1d5cc4cca180c Mon Sep 17 00:00:00 2001 From: Ravensdale Date: Fri, 5 Jul 2013 06:54:17 -0700 Subject: [PATCH 38/68] Remove mordeth221 from custom sprites list until his sprites are ready and in. --- config/custom_sprites.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/config/custom_sprites.txt b/config/custom_sprites.txt index d9b0adfeca..ca52951476 100644 --- a/config/custom_sprites.txt +++ b/config/custom_sprites.txt @@ -1,6 +1,5 @@ rowtree-Lucy sydrec-SINA -mordeth221-Elly ravensdale-Blunt ravensdale-Skuld serithi-REMNANT \ No newline at end of file From 5abed5a5f694a184e782ceb52603fc453a3396d4 Mon Sep 17 00:00:00 2001 From: Segrain Date: Fri, 5 Jul 2013 20:10:39 +0300 Subject: [PATCH 39/68] Modtype tweak. --- .../objects/items/robot/robot_upgrades.dm | 2 +- .../mob/living/silicon/robot/examine.dm | 2 +- .../modules/mob/living/silicon/robot/robot.dm | 43 ++++++++----------- 3 files changed, 20 insertions(+), 27 deletions(-) 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/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 1f84e124d5..2de2de5f10 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -47,7 +47,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 @@ -86,7 +86,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() @@ -150,25 +150,23 @@ if(emagged || security_level > SEC_LEVEL_BLUE) 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() 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" @@ -177,7 +175,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" @@ -185,7 +182,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" @@ -194,7 +190,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" @@ -203,7 +198,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" @@ -211,24 +205,22 @@ 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]" - - 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") status_flags &= ~CANPUSH @@ -238,7 +230,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 @@ -248,7 +241,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 @@ -258,7 +251,7 @@ //We also need to update name of internal camera. if (camera) camera.c_tag = changed_name - + if(!custom_sprite) //Check for custom sprite var/file = file2text("config/custom_sprites.txt") var/lines = text2list(file, "\n") @@ -271,10 +264,10 @@ if(Entry.len < 2) continue; - + if(Entry[1] == src.ckey && Entry[2] == src.real_name) //They're in the list? Custom sprite time, var and icon change required - custom_sprite = 1 - icon = 'icons/mob/custom-synthetic.dmi' + custom_sprite = 1 + icon = 'icons/mob/custom-synthetic.dmi' /mob/living/silicon/robot/verb/Namepick() if(custom_name) @@ -286,7 +279,7 @@ if (newname != "") custom_name = newname - updatename("Default") + updatename() updateicon() /mob/living/silicon/robot/verb/cmd_robot_alerts() @@ -989,7 +982,7 @@ overlays += "eyes-[icon_state]" else overlays -= "eyes" - + if(opened && custom_sprite == 1) //Custom borgs also have custom panels, heh if(wiresexposed) overlays += "[src.ckey]-openpanel +w" From a2d3edcaff4478771d4ee3c1626974d564df8a9b Mon Sep 17 00:00:00 2001 From: Segrain Date: Fri, 5 Jul 2013 21:56:25 +0300 Subject: [PATCH 40/68] More fixes. --- code/modules/mob/living/silicon/robot/robot.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 2de2de5f10..6d782d999f 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -146,7 +146,7 @@ /mob/living/silicon/robot/proc/pick_module() if(module) return - var/list/modules = list("Standard", "Engineering", "Medical", "Miner", "Janitor", "Service", "Security", "Combat") + var/list/modules = list("Standard", "Engineering", "Medical", "Miner", "Janitor", "Service", "Security") if(emagged || security_level > SEC_LEVEL_BLUE) src << "\red Crisis mode active. Combat module available." modules+="Combat" @@ -216,13 +216,13 @@ //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(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) From 87feed7e7bc52bc19ab0cf1f777dc07e60a4281e Mon Sep 17 00:00:00 2001 From: Spamcat Date: Fri, 5 Jul 2013 17:55:38 +0400 Subject: [PATCH 41/68] Nice colours (and a minor bugfix) --- code/game/objects/items/devices/scanners.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 37f4a80937..8f37ab2f3b 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -174,8 +174,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") - if(H.pulse) - user.show_message("\blue Subject's pulse: [H.get_pulse(GETPULSE_TOOL)] bpm.") + user.show_message("\blue Subject's pulse: [H.get_pulse(GETPULSE_TOOL)] bpm.") src.add_fingerprint(user) return From 0e4271f97c3bac71c6ff117636f92e04b7952b3a Mon Sep 17 00:00:00 2001 From: Spamcat Date: Fri, 5 Jul 2013 18:20:10 +0400 Subject: [PATCH 42/68] Stage 1: deconstruction. --- code/game/objects/structures/signs.dm | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm index d955d5cca8..1d36625e03 100644 --- a/code/game/objects/structures/signs.dm +++ b/code/game/objects/structures/signs.dm @@ -25,10 +25,30 @@ return +/obj/structure/sign/attackby(obj/item/tool as obj, mob/user as mob) + if(istype(tool, /obj/item/weapon/screwdriver)) + 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 + del(src) + else + ..() + +/obj/item/sign + name = "sign" + desc = "if you see this, it's a bug" + icon = 'icons/obj/decals.dmi' + icon_state = "securearea" + /obj/structure/sign/map name = "station map" desc = "A framed picture of the station." +/obj/structure/sign/map/attackby() + return ..() + /obj/structure/sign/map/left icon_state = "map-left" @@ -116,6 +136,9 @@ name = "The Maltese Falcon" desc = "The Maltese Falcon, Space Bar and Grill." +/obj/structure/sign/maltesefalcon/attackby() + return ..() + /obj/structure/sign/maltesefalcon/left icon_state = "maltesefalcon-left" From 63de302a09e8d50bb36b71486d56f5f7b3a4a33b Mon Sep 17 00:00:00 2001 From: Spamcat Date: Sat, 6 Jul 2013 01:14:02 +0400 Subject: [PATCH 43/68] Part 2: construction. --- code/game/objects/structures/signs.dm | 55 +++++++++++++++++---------- maps/tgstation.2.1.0.0.1.dmm | 8 ++-- 2 files changed, 39 insertions(+), 24 deletions(-) diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm index 1d36625e03..40366221f9 100644 --- a/code/game/objects/structures/signs.dm +++ b/code/game/objects/structures/signs.dm @@ -25,34 +25,52 @@ return -/obj/structure/sign/attackby(obj/item/tool as obj, mob/user as mob) - if(istype(tool, /obj/item/weapon/screwdriver)) +/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 + S.sign_type = type del(src) - else - ..() + else ..() /obj/item/sign name = "sign" - desc = "if you see this, it's a bug" - icon = 'icons/obj/decals.dmi' - icon_state = "securearea" + desc = "" + //var/sign_state = "" + var/sign_type -/obj/structure/sign/map +/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/S = new sign_type + //S.name = name + //S.desc = desc + //S.icon_state = sign_state + 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 ..() + +/obj/structure/sign/double/map name = "station map" desc = "A framed picture of the station." -/obj/structure/sign/map/attackby() - return ..() - -/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 @@ -132,17 +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/attackby() - return ..() - -/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/maps/tgstation.2.1.0.0.1.dmm b/maps/tgstation.2.1.0.0.1.dmm index bac0a58d23..5e1f348e32 100644 --- a/maps/tgstation.2.1.0.0.1.dmm +++ b/maps/tgstation.2.1.0.0.1.dmm @@ -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/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/sign/double/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/double/map/right,/turf/simulated/wall,/area/maintenance/fpmaint2) "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) @@ -6691,8 +6691,8 @@ "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) +"cyL" = (/obj/structure/sign/double/map/left{pixel_y = 32},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) +"cyM" = (/obj/structure/sign/double/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) From 5f690e150d2babd6d00659b4a57140df56546d85 Mon Sep 17 00:00:00 2001 From: Spamcat Date: Sat, 6 Jul 2013 02:48:06 +0400 Subject: [PATCH 44/68] Part 3: fixing shit --- code/game/objects/structures/signs.dm | 32 +++++++++++++-------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm index 40366221f9..7827749fa1 100644 --- a/code/game/objects/structures/signs.dm +++ b/code/game/objects/structures/signs.dm @@ -19,48 +19,50 @@ 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 - var/icon/I = icon('icons/obj/decals.dmi', "[icon_state]") - S.icon = I.Scale(24, 24) - //S.sign_state = icon_state - S.sign_type = type + 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/item/sign name = "sign" desc = "" - //var/sign_state = "" - var/sign_type + 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/S = new sign_type - //S.name = name - //S.desc = desc - //S.icon_state = sign_state + var/obj/structure/sign/S = new(user.loc) switch(direction) if("North") - S.pixel_y = -32 + S.pixel_y = 32 if("East") S.pixel_x = 32 if("South") - S.pixel_y = 32 + 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 @@ -113,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'" From 0e153b72267e1b226f736461650a8dfd08abf9d0 Mon Sep 17 00:00:00 2001 From: Spamcat Date: Mon, 8 Jul 2013 22:37:54 +0400 Subject: [PATCH 45/68] Updated pulse checking on examine, optimized handle_pulse(), fixed some grammer. xoxo chinsky --- code/modules/mob/living/carbon/human/examine.dm | 17 +++++------------ code/modules/mob/living/carbon/human/human.dm | 6 +++--- code/modules/mob/living/carbon/human/life.dm | 12 ++++++------ 3 files changed, 14 insertions(+), 21 deletions(-) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index dbb721afa9..754f3b13c7 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -209,20 +209,13 @@ 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) + if(distance <= 1) + if(istype(usr, /mob/living/carbon/human) && usr.stat == 0) spawn(15) - var/foundghost = 0 - if(src.client) - foundghost = 1 - if(!foundghost) - usr << "[t_He] has no pulse and [t_his] soul has departed..." + 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 58c0f09373..c357004ece 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1238,9 +1238,9 @@ mob/living/carbon/human/yank_out_object() "You begin counting your pulse.") if(src.pulse) - usr << "\blue [self ? "I have" : "[src] has"] pulse! Counting..." + usr << "\blue [self ? "You have a" : "[src] has"] pulse! Counting..." else - usr << "\red [src] has no pulse!" + 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." @@ -1249,5 +1249,5 @@ mob/living/carbon/human/yank_out_object() 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 ? "My" : "[src]'s"] pulse is [src.get_pulse(GETPULSE_HAND)]." + 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 1806bf1700..edbbaf5467 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -1417,7 +1417,7 @@ Paralyse(rand(15,28)) proc/handle_pulse() - //if(life_tick % 100) return pulse //update pulse every 100 life ticks + 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 @@ -1427,17 +1427,17 @@ if(round(vessel.get_reagent_amount("blood")) <= BLOOD_VOLUME_BAD) //how much blood do we have temp = PULSE_THREADY //not enough :( - if(reagents.get_reagent_amount("zombiepowder")) + if(status_flags & FAKEDEATH) temp = PULSE_NONE //pretend that we're dead. unlike actual death, can be inflienced by meds - for(var/R in bradycardics) - if(reagents.get_reagent_amount(R)) + 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/R in tachycardics) //handles different chems' influence on pulse - if(reagents.get_reagent_amount(R)) + 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 From c8eb9df6ac7545a00472b2a2551e64b0df3aa772 Mon Sep 17 00:00:00 2001 From: Spamcat Date: Mon, 8 Jul 2013 22:56:35 +0400 Subject: [PATCH 46/68] How do I grammar? --- code/modules/mob/living/carbon/human/examine.dm | 2 +- code/modules/mob/living/carbon/human/human.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 754f3b13c7..95b2e67811 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -213,7 +213,7 @@ if(istype(usr, /mob/living/carbon/human) && usr.stat == 0) spawn(15) if(pulse == PULSE_NONE) - usr << "[t_He] has no pulse [src.client ? "" : "and [t_his] soul has departed"]..." + usr << "[t_He] has no pulse[src.client ? "" : " and [t_his] soul has departed"]..." else usr << "[t_He] has a pulse!" diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index c357004ece..367c230916 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1238,7 +1238,7 @@ mob/living/carbon/human/yank_out_object() "You begin counting your pulse.") if(src.pulse) - usr << "\blue [self ? "You have a" : "[src] has"] pulse! Counting..." + 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 From df90824d60b94186d5897f51d0a1c5839eb716c9 Mon Sep 17 00:00:00 2001 From: Spamcat Date: Mon, 8 Jul 2013 23:25:13 +0400 Subject: [PATCH 47/68] Whoa, 2 barsign.dm's? WTF? --- code/game/objects/effects/barsign.dm | 2 +- code/game/objects/structures/barsign.dm | 2 +- maps/tgstation.2.1.0.0.1.dmm | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) 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/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/maps/tgstation.2.1.0.0.1.dmm b/maps/tgstation.2.1.0.0.1.dmm index 5e1f348e32..2f62400781 100644 --- a/maps/tgstation.2.1.0.0.1.dmm +++ b/maps/tgstation.2.1.0.0.1.dmm @@ -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/structure/sign/double/barsign,/turf/simulated/wall,/area/crew_quarters/bar) "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) From d5942c4b1023cac4b16effde73695839bf4c2268 Mon Sep 17 00:00:00 2001 From: comma Date: Tue, 9 Jul 2013 13:04:05 +0400 Subject: [PATCH 48/68] Updated HUDs to find only known viruses. --- code/game/mecha/medical/odysseus.dm | 7 +++++-- code/modules/clothing/glasses/hud.dm | 6 ++++-- code/modules/mob/living/silicon/pai/hud.dm | 7 +++++-- 3 files changed, 14 insertions(+), 6 deletions(-) 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/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/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) From 74e75c71b7435f859b9ca2349872a30d1da61e8c Mon Sep 17 00:00:00 2001 From: comma Date: Tue, 9 Jul 2013 13:59:34 +0400 Subject: [PATCH 49/68] Replaced viro machinery with new one. --- maps/tgstation.2.1.0.0.1.dmm | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/maps/tgstation.2.1.0.0.1.dmm b/maps/tgstation.2.1.0.0.1.dmm index 6a465d60f4..26eaf33a46 100644 --- a/maps/tgstation.2.1.0.0.1.dmm +++ b/maps/tgstation.2.1.0.0.1.dmm @@ -5470,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/computer/centrifuge,/turf/simulated/floor{dir = 4; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/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) @@ -5502,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/table,/obj/item/weapon/storage/fancy/vials,/turf/simulated/floor{dir = 4; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/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) @@ -5608,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/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) "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) @@ -6380,6 +6380,7 @@ "csJ" = (/obj/machinery/atmospherics/pipe/vent{dir = 4},/turf/simulated/floor/plating/airless,/area) "csK" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Engineering"; name = "Engineering Security Doors"; opacity = 0},/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/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) "csL" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Engineering"; name = "Engineering Security Doors"; opacity = 0},/turf/simulated/floor/plating,/area/engine/break_room) +"csM" = (/obj/structure/table,/obj/machinery/computer/med_data/laptop,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "csO" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north/shuttlespace_ns5,/area) "csP" = (/turf/space/transit/north/shuttlespace_ns2,/area/shuttle/escape/transit) "csQ" = (/turf/space/transit/north/shuttlespace_ns12,/area/shuttle/escape/transit) @@ -10233,8 +10234,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalvaaacelcemcenaaacelcemcenaaacelcemcenaabceoaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaabJOcbtcdocepccFcdxceqccFccFccFccFccFcepcepccFccFccFccFcercescdzcetcdzceucevcdCcdCcewbQocexceycezbQodMtbPqcbPceCceDceEbWWbUOceFceGbSAbUQbYdceHbTPaabbTQceIceJceKbRKaabaabaabaabaabaabbTVcbibWkbWmcbGcbmbWjdTncbHbWjcbHdTnbTVaaaaaaaaaaabaaaaaaaaabWrcclcclcclcclcePbYoceQceRceSceTceUceVbWraaaaaaaaaaaaaaaceWceWceWceXaabaabaabaabcekaabaabaabaabaabalUceWceWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalvaaacelceYcenaaacelceYcenaaacelceYcenaabaabaabaabaaaaaaaaaaaaaaaaaaaabaabaabbJOcbtceZcepcfaccFcfbcdWcfdcfdcdwccFcepcfeccFccFccFccFcffcfgcfhcfibJZcfjcfkcflcfmcfnbQocexcdFcfobQocdYbPqbWabRFbRFceFbRIcfqbXRcfrcfsbQDcftcfubYMblybSHcfvcdQcdQbRKaabaaaaaaaabaaaaaabTVcdUbWkbWmbWkcdVbWjbWkbWmbWjbWmcdTbTVaaaaaaaaaaabaaaaaaaaabWrcceccfccgcfzcfAccjcfBcfCcfDcfEbYocfFbWraaaaaaaaaaaaaaaceWaaaaabaaaaabaaaaaaaaacfGaaaaabaabaaaaaaaaaaaaceWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaluaabcelceYcenaaacelceYcenaabcelceYcenaabaaaaaaaabaabaaaaaaaaaaaaaaaaabaaaaaabNKcbtcaGcfHccFcfIcfJcfKcdHcdGcdHcdJcdHcfOcfPccBcfQcepcepcesbLycfRcfScfTcfUcfVdNgcfXcfYcfZcgacdecgccddbPqcdEbRFbRFcgfbRFbRFbRFbRHbXYcgfbYdbZsbTPaabbRKbRKbRKbRKbRKaabaaaaaaaabaaaaaabTVccXccZccYcdccdacglcgmccWcglccWcgmbTVaabaabaabaabaabaabaabbWrcdgcdgcdgcgocdjbYocgpcgqcgrcgsbYocgtbWrbWrbWrbWraaaaaaceWaaacgucgucgucgucguaabcgvaabcgucgucgucgucguaaaceWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaacelceYcenaabcelceYcenaaacelceYcenaaaaaaaaaaaaaaaaabaaaaabaaaaabaabaaaaaabFGcbtcaGcgwcgxcgxcgycaGcaGcaGcaGcaGcaGcaGcaGcaGcaGcaGcaGcaGbFGcgzbFGcgAbFGbPkcgBcgCdNHcnGcnUcobcsKcsLbPqceMcgKcgLcgMcgNcgOcgNcgMcgPcgMcgQceFcgRaabaabaabaabaabaabaabaaaaaaaaaaaaaaabTVbTVbTVceLceBbTVbTVcgUbTVbTVbTVcgUbYiaaaaaaaaaaaaaaaaaaaaabWrcdgcdgcdgcfzcgVccjcgWcgXcgYcgZchachachbchcchdbWraabaabceWaabchechfchfchfchfchgcgvchhchichichichichjaabceWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalvalvaluaabaaacelceYcenaabcelceYcenaaacelceYcenaabaaaaaaaaaaaaaabaabchkchlchlchlchlbFGbFGcbtcaGchmchnchnchochpchqchrchrchrchrchrchrchschrchrchtchtchrchuchvchwchxbPkchychzchAchBchCchDbQnceAcebboIceachGchHchIchJchKchLbRFchMchNchObRCaabaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaabaaabTVcbjcdZbTVaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaabWrcclcclcclcclchQbYocgpchRchScgsbYobYochUbYochVbWraaaaaaceWaabchWchWchWchWchWaaacgvaaachWchWchWchWchWaabceWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaacelceYcenaabcelceYcenaaacelceYcenaaaaaaaaaaaaaaaaabaaaaabaaaaabaabaaaaaabFGcbtcaGcgwcgxcgxcgycaGcaGcaGcaGcaGcaGcaGcaGcaGcaGcaGcaGcaGbFGcgzbFGcgAbFGbPkcgBcgCdNHcnGcnUcobcsKcsLbPqceMcgKcgLcgMcgNcgOcgNcgMcgPcgMcgQceFcgRaabaabaabaabaabaabaabaaaaaaaaaaaaaaabTVbTVcsMceLceBbTVbTVcgUbTVbTVbTVcgUbYiaaaaaaaaaaaaaaaaaaaaabWrcdgcdgcdgcfzcgVccjcgWcgXcgYcgZchachachbchcchdbWraabaabceWaabchechfchfchfchfchgcgvchhchichichichichjaabceWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalvalvaluaabaaacelceYcenaabcelceYcenaaacelceYcenaabaaaaaaaaaaaaaabaabchkchlchlchlchlbFGbFGcbtcaGchmchnchnchochpchqchrchrchrchrchrchrchschrchrchtchtchrchuchvchwchxbPkchychzchAchBchCchDbQnceAcebboIceachGchHchIchJchKchLbRFchMchNchObRCaabaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaabacMcbjcdRcdZbTVaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaabWrcclcclcclcclchQbYocgpchRchScgsbYobYochUbYochVbWraaaaaaceWaabchWchWchWchWchWaaacgvaaachWchWchWchWchWaabceWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalvaaaaabaaaaabaabchXaabaabaabchXaabaaaaabchXaabaaaaaaaaaaaaaaachYchZciacibciccidciecifcaEcigcaGcaGcihciicaGcaGbPbcijcijcijcijcijcijcikcijcijcijcilcilcimdQicilcildQjciqchzchAbQnbQnbQnbQncfccfpcitciucivciwcixciycixciwcixcizcixcizciAaabaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaabaaaaaaaaaciBaaaaaaaaaaaaaabaaaaabaaaaaaaaaaaaaaaaaaaaaaaabWrcceccfccgciCcfAccjciDbYqciEciFciFciGciHciIciJbWraaaaaaceWaaaaabaaaaabaabaabaaacgvaaaaabaaaaabaaaaabaaaceWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaluaabciKciLciLciMciNciNciNciNciNciNciNciNciNciNciNciNciNciNciOciPciQciRciSciTciUciVciWbIhcbtciXcaGcaGcaGcaGbIhbPbcijciYciZceOcjbcjccjdcjecjfcjgcjhcjicjjcjkcjlcjmdOjcjocjpchAbQnbQnbQnbQndOkbPkaabcjraabcjsaabcjraabcjsaabcjtaabcjtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacjuaaaaaaaaaaaaaabaaaaabaaaaaaaaaaaaaaaaaaaaaaaabWrcdgcdhcdgcjvcdjbYobYpbYqcjwbYobYocjxcclcclcclbWraaaaaaceWaaacgucgucgucgucguaabcgvaabcgucgucgucgucguaabceWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalvaaaaabaaaaabaabcjyaabaaaaabcjyaabaaaaabcjyaabaaaaaaaaaaaaaaachYchZcjzcjAcjBcjCchlcjDbIhcjEcaEcaEcaEcaEcaEcaEcjFcijcjGcjHcjIcjIcjJcjKcjScjTcjOcjPcjQcjRcgGcgFcjNcjMcgEchzchAcjWbYDbQnbQnbYEbPkbRKcjZbTQcjZbRKcjZbTQcjZbRKckabTQckbbRKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWrcdgcdgcdgciCckcckdckeckfckgbYobYockhbYockibYobXqaabaabceWaabchechfchfchfchfchgcgvchhchichichichichjaabceWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa From e0f7097c23a4d2c3660d1f5b3f568942d883ca05 Mon Sep 17 00:00:00 2001 From: comma Date: Tue, 9 Jul 2013 14:16:58 +0400 Subject: [PATCH 50/68] Makes engineered viruses airborne too, since otherwise they are nigh useless. --- code/modules/virus2/diseasesplicer.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/virus2/diseasesplicer.dm b/code/modules/virus2/diseasesplicer.dm index 0165e8ee63..d1ac117c38 100644 --- a/code/modules/virus2/diseasesplicer.dm +++ b/code/modules/virus2/diseasesplicer.dm @@ -134,7 +134,7 @@ if(e.stage == memorybank.stage) e.effect = memorybank.effect splicing = 10 - dish.virus2.spreadtype = "Blood" +// dish.virus2.spreadtype = "Blood" else if(href_list["disk"]) burning = 10 From 2509e8f8366c1b5d28e3cf2a50c6c6d37f96def7 Mon Sep 17 00:00:00 2001 From: comma Date: Tue, 9 Jul 2013 14:19:05 +0400 Subject: [PATCH 51/68] Changelog entry. --- html/changelog.html | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/html/changelog.html b/html/changelog.html index 4e37e06ec6..a4f86080e2 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,21 @@ 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/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

From 722d4d27fbc282f3a4717af87394741a54ab9772 Mon Sep 17 00:00:00 2001 From: comma Date: Tue, 9 Jul 2013 16:07:58 +0400 Subject: [PATCH 52/68] Fixed a typo. --- code/game/gamemodes/epidemic/epidemic.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/gamemodes/epidemic/epidemic.dm b/code/game/gamemodes/epidemic/epidemic.dm index 6538baa834..60701479e1 100644 --- a/code/game/gamemodes/epidemic/epidemic.dm +++ b/code/game/gamemodes/epidemic/epidemic.dm @@ -127,7 +127,7 @@ if(lethal.uniqueID in H.virus2) i-- continue - H.virus2["[lethal.uniqueID]"] += lethal.getcopy() + H.virus2["[lethal.uniqueID]"] = lethal.getcopy() infectees += H var/mob/living/carbon/human/patient_zero = pick(infectees) From 330f9176b0d32a4c0403205aad6fff1feda7ae96 Mon Sep 17 00:00:00 2001 From: fauxtada Date: Tue, 9 Jul 2013 07:01:06 -0700 Subject: [PATCH 53/68] Map Edits - Expanded Psych Office. - Added second toolbelt to robotics. - Fixed issue of the bar maintence door being in the kitchen cold room. Also fixed the mislabled camera. Oooops. - Added one each of the alien baby races to genetics. - Fixes misaligned AI door. I'm going to have another map edit up shortly, as I want to work on some areas, but am waiting for Chinsky to finish his stuff first. --- maps/tgstation.2.1.0.0.1.dmm | 136 ++++++++++++++++++----------------- 1 file changed, 71 insertions(+), 65 deletions(-) diff --git a/maps/tgstation.2.1.0.0.1.dmm b/maps/tgstation.2.1.0.0.1.dmm index 6a465d60f4..efb4d7579d 100644 --- a/maps/tgstation.2.1.0.0.1.dmm +++ b/maps/tgstation.2.1.0.0.1.dmm @@ -1819,7 +1819,7 @@ "aIY" = (/obj/machinery/door/airlock/maintenance{name = "Bar Maintenance"; req_access_txt = "12"},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/crew_quarters/bar) "aIZ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_Toxins = 0},/turf/simulated/floor{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) "aJa" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/wall,/area/hydroponics) -"aJb" = (/obj/machinery/camera{c_tag = "Bar Storage"},/obj/machinery/chem_master/condimaster{name = "CondiMaster Neo"; pixel_x = -5},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) +"aJb" = (/obj/machinery/camera{c_tag = "Kitchen Cold Room"},/obj/machinery/chem_master/condimaster{name = "CondiMaster Neo"; pixel_x = -5},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) "aJc" = (/obj/machinery/door/window/southleft{base_state = "left"; dir = 2; icon_state = "left"; name = "Kitchen Delivery"; req_access_txt = "28"},/turf/simulated/floor{icon_state = "delivery"},/area/crew_quarters/kitchen) "aJd" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) "aJe" = (/turf/simulated/wall,/area/crew_quarters/kitchen) @@ -2328,7 +2328,7 @@ "aSN" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/wood,/area/crew_quarters/bar) "aSO" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/wood,/area/crew_quarters/bar) "aSP" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/bar) -"aSQ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple{color = "blue"; dir = 4; icon_state = "intact-b-f"; level = 1; name = "pipe"},/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/maintenance{name = "Bar Storage Maintenance"; req_access_txt = "25"},/turf/simulated/floor/plating,/area/crew_quarters/kitchen) +"aSQ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple{color = "blue"; dir = 4; icon_state = "intact-b-f"; level = 1; name = "pipe"},/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/maintenance{name = "Kitche Cold Room Maintenance"; req_access_txt = "28"},/turf/simulated/floor/plating,/area/crew_quarters/kitchen) "aSR" = (/obj/structure/table/reinforced,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) "aSS" = (/obj/machinery/atmospherics/pipe/simple{color = "blue"; dir = 4; icon_state = "intact-b-f"; level = 1; name = "pipe"},/obj/structure/plasticflaps{opacity = 1},/obj/machinery/navbeacon{codes_txt = "delivery;dir=2"; freq = 1400; location = "Kitchen"},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/crew_quarters/kitchen) "aST" = (/obj/machinery/atmospherics/pipe/simple{color = "blue"; dir = 4; icon_state = "intact-b-f"; level = 1; name = "pipe"},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/power/apc{dir = 2; name = "Bar Maintenance APC"; pixel_y = -24},/obj/structure/cable,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) @@ -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/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) "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,14 +3134,14 @@ "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/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) +"bir" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{tag = "icon-bcarpet04"; icon_state = "bcarpet04"},/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/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{tag = "icon-bcarpet05"; icon_state = "bcarpet05"},/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) -"bix" = (/obj/machinery/r_n_d/circuit_imprinter,/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics) +"biw" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/floor{tag = "icon-bcarpet05"; icon_state = "bcarpet05"},/area/medical/medbay) +"bix" = (/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) "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) "biA" = (/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/toxins/lab) @@ -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/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) "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 = 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) "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/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) +"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/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) "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/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 = "medpriv1"; 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) +"bls" = (/obj/structure/table,/obj/item/weapon/storage/box/gloves{pixel_x = -4; pixel_y = -3; pixel_x = 3; pixel_y = 4},/obj/item/weapon/storage/box/masks{pixel_x = 4; pixel_y = 5; pixel_x = 0; pixel_y = 0},/turf/simulated/floor{dir = 2; icon_state = "whiteredcorner"},/area/medical/sleeper) "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) @@ -3323,7 +3323,7 @@ "blU" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics) "blV" = (/obj/machinery/atmospherics/pipe/manifold{color = "red"; dir = 1; icon_state = "manifold-r-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics) "blW" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics) -"blX" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = 6},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/item/clothing/head/welding{pixel_x = -3; pixel_y = 5},/obj/item/clothing/glasses/welding,/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics) +"blX" = (/obj/structure/closet/l3closet,/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) "blY" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/assembly/robotics) "blZ" = (/obj/structure/closet/emcloset,/obj/machinery/atmospherics/pipe/manifold{color = "red"; dir = 1; icon_state = "manifold-r-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 9; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/medical/research{name = "Research Division"}) "bma" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) @@ -3610,13 +3610,13 @@ "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) "brx" = (/obj/machinery/vending/cigarette,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/hallway/primary/central) -"bry" = (/obj/structure/table,/obj/item/weapon/storage/box/gloves{pixel_x = 0; pixel_y = 0; pixel_x = 3; pixel_y = 4},/obj/item/weapon/storage/box/masks{pixel_x = 0; pixel_y = 0; pixel_x = 0; pixel_y = 0},/turf/simulated/floor{dir = 2; icon_state = "whiteredcorner"},/area/medical/sleeper) -"brz" = (/obj/structure/closet/l3closet/general,/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) +"bry" = (/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) +"brz" = (/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) "brA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "toxin_test_outer"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "10;13"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "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) @@ -3713,7 +3713,7 @@ "btu" = (/obj/structure/table,/obj/item/weapon/circular_saw,/obj/item/weapon/scalpel{pixel_y = 12},/turf/simulated/floor{dir = 2; icon_state = "whitecorner"},/area/assembly/robotics) "btv" = (/obj/structure/table,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/structure/window/reinforced/tinted{dir = 4; icon_state = "twindow"; tag = ""},/obj/item/device/mmi/posibrain,/turf/simulated/floor{dir = 8; icon_state = "whitecorner"},/area/assembly/robotics) "btw" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{dir = 8; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/assembly/robotics) -"btx" = (/obj/structure/table,/obj/item/weapon/crowbar,/obj/item/device/radio/headset/headset_sci{pixel_x = -3},/obj/item/device/multitool{pixel_x = 3},/obj/item/device/multitool{pixel_x = 3},/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics) +"btx" = (/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) "bty" = (/obj/machinery/light{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor{dir = 2; icon_state = "whitecorner"},/area/medical/research{name = "Research Division"}) "btz" = (/obj/effect/landmark{name = "lightsout"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor{icon_state = "whitehall"; dir = 2},/area/medical/research{name = "Research Division"}) "btA" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor{dir = 8; icon_state = "whitecorner"},/area/medical/research{name = "Research Division"}) @@ -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/machinery/vending/wallmed1{pixel_y = 28},/turf/simulated/floor{tag = "icon-bcarpet02"; icon_state = "bcarpet02"},/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) @@ -3862,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) @@ -3931,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) @@ -4010,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) @@ -4023,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/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/sortjunction{sortType = 9},/turf/simulated/floor/plating,/area/maintenance/asmaint) "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) @@ -4085,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/atmospherics/pipe/simple/supply/hidden,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) "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{dir = 4},/obj/machinery/door/airlock/maintenance{name = "Medbay Maintenance"; req_access_txt = "5"},/turf/simulated/floor/plating,/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) @@ -4102,9 +4102,9 @@ "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/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) "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) +"bAY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/asmaint) "bAZ" = (/turf/simulated/wall/r_wall,/area/toxins/server) "bBa" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/machinery/door/airlock/command{name = "Server Room"; req_access = null; req_access_txt = "30"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{icon_state = "dark"},/area/toxins/server) "bBb" = (/turf/simulated/wall/r_wall,/area/toxins/storage) @@ -4152,7 +4152,7 @@ "bBR" = (/obj/machinery/atm{pixel_y = 32},/turf/simulated/floor,/area/hallway/primary/central) "bBS" = (/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor,/area/hallway/primary/central) "bBT" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor,/area/hallway/primary/central) -"bBU" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint) +"bBU" = (/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) "bBV" = (/obj/structure/sign/nosmoking_2{pixel_x = -28},/obj/structure/stool/bed/roller,/turf/simulated/floor{dir = 1; icon_state = "whiteredcorner"},/area/medical/sleeper) "bBW" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor{tag = "icon-whitehall (WEST)"; icon_state = "whitehall"; dir = 8},/area/medical/sleeper) "bBX" = (/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/weapon/folder/white,/obj/item/weapon/hand_labeler,/obj/item/weapon/gun/syringe,/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) @@ -4171,7 +4171,7 @@ "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/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) "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) +"bCn" = (/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) "bCo" = (/mob/living/carbon/monkey,/turf/simulated/floor,/area/medical/genetics) "bCp" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint) "bCq" = (/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/camera{c_tag = "Medbay East"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = -22},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) @@ -4493,8 +4493,8 @@ "bIu" = (/obj/machinery/light{dir = 1},/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/genetics) "bIv" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/medical/genetics) "bIw" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) -"bIx" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor,/area/medical/genetics) -"bIy" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/mob/living/carbon/monkey,/turf/simulated/floor,/area/medical/genetics) +"bIx" = (/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/disposal,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/medbay) +"bIy" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor,/area/medical/genetics) "bIz" = (/obj/machinery/atmospherics/pipe/manifold{color = "red"; dir = 4; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/wall/r_wall,/area/assembly/chargebay) "bIA" = (/obj/structure/stool,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/landmark/start{name = "Janitor"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor,/area/janitor) "bIB" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/janitor) @@ -4787,7 +4787,7 @@ "bOc" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) "bOd" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bOe" = (/obj/structure/disposalpipe/sortjunction{dir = 2; icon_state = "pipe-j2s"; sortType = 12},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold{color = "blue"; dir = 8; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "white"},/area/medical/genetics) -"bOf" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor,/area/medical/genetics) +"bOf" = (/obj/structure/table,/obj/item/weapon/crowbar,/obj/item/device/radio/headset/headset_sci{pixel_x = -3},/obj/item/device/multitool{pixel_x = 3},/obj/item/device/multitool{pixel_x = 3},/obj/item/clothing/glasses/welding,/obj/item/clothing/glasses/welding,/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics) "bOg" = (/obj/structure/window/reinforced,/mob/living/carbon/monkey,/turf/simulated/floor,/area/medical/genetics) "bOh" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/sign/securearea{pixel_x = 32},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/genetics) "bOi" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/medical/research{name = "Research Division"}) @@ -4797,7 +4797,7 @@ "bOm" = (/obj/machinery/light/small{dir = 1},/obj/item/weapon/extinguisher,/turf/simulated/floor/plating,/area/storage/emergency) "bOn" = (/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating,/area/storage/emergency) "bOo" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_Toxins = 0},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) -"bOp" = (/obj/machinery/requests_console{department = "Chemistry"; departmentType = 2; pixel_x = -30; pixel_y = 0},/obj/structure/table,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/item/weapon/reagent_containers/dropper{pixel_x = 0; pixel_y = -4},/turf/simulated/floor{dir = 8; icon_state = "whiteyellow"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry) +"bOp" = (/mob/living/carbon/monkey/unathi,/turf/simulated/floor,/area/medical/genetics) "bOq" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/obj/structure/stool,/obj/effect/landmark/start{name = "Chemist"},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) "bOr" = (/turf/simulated/floor{dir = 8; icon_state = "whiteyellow"; tag = "icon-whitehall (WEST)"},/area/medical/medbay) "bOs" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) @@ -4857,10 +4857,10 @@ "bPu" = (/obj/machinery/atmospherics/pipe/simple{color = "red"; icon_state = "intact-r"; level = 2},/turf/simulated/wall/r_wall,/area/atmos) "bPv" = (/obj/machinery/atmospherics/pipe/simple{color = "blue"; icon_state = "intact-b"; level = 2},/turf/simulated/wall/r_wall,/area/atmos) "bPw" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall,/area/storage/emergency) -"bPx" = (/obj/structure/table,/obj/item/weapon/book/manual/robotics_cyborgs{pixel_x = 2; pixel_y = 5},/obj/item/weapon/storage/belt/utility,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/machinery/requests_console{department = "Robotics"; departmentType = 2; name = "Robotics RC"; pixel_y = 30},/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics) +"bPx" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/mob/living/carbon/monkey/tajara,/turf/simulated/floor,/area/medical/genetics) "bPy" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/medical/cmo) "bPz" = (/obj/machinery/computer/med_data,/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/medical/cmo) -"bPA" = (/obj/machinery/light/small{dir = 8},/obj/structure/table,/obj/item/device/camera{name = "Autopsy Camera"; pixel_x = -2; pixel_y = -2},/turf/simulated/floor{icon_state = "dark"},/area/medical/morgue) +"bPA" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/mob/living/carbon/monkey/skrell,/turf/simulated/floor,/area/medical/genetics) "bPB" = (/obj/structure/stool/bed/chair,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bPC" = (/obj/structure/closet/crate,/obj/item/weapon/coin/silver,/turf/simulated/floor/plating,/area/storage/emergency) "bPD" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/storage/emergency) @@ -4904,11 +4904,11 @@ "bQp" = (/obj/structure/table,/obj/item/weapon/reagent_containers/spray/cleaner{desc = "Someone has crossed out the 'Space' from Space Cleaner and written in Chemistry. Scrawled on the back is, 'Okay, whoever filled this with polytrinic acid, it was only funny the first time. It was hard enough replacing the CMO's first cat!'"; name = "Chemistry Cleaner"},/turf/simulated/floor{dir = 1; icon_state = "whiteyellow"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry) "bQq" = (/obj/structure/stool/bed/chair,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bQr" = (/obj/structure/stool/bed/chair,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) -"bQs" = (/obj/structure/table,/obj/machinery/reagentgrinder,/turf/simulated/floor{dir = 4; icon_state = "whiteyellowfull"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry) +"bQs" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/mob/living/carbon/monkey,/turf/simulated/floor,/area/medical/genetics) "bQt" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/simulated/floor{icon_state = "bot"},/area/atmos) "bQu" = (/obj/machinery/newscaster{pixel_x = -28; pixel_y = 0},/obj/structure/table,/obj/item/weapon/folder/white,/turf/simulated/floor{dir = 8; icon_state = "whiteyellowcorner"},/area/medical/medbay) "bQv" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/atmos) -"bQw" = (/obj/machinery/door/window{name = "AI Core Door"; req_access_txt = "16"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/turretid{name = "AI Chamber turret control"; pixel_x = 24; pixel_y = 24},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) +"bQw" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/item/weapon/reagent_containers/dropper{pixel_x = 0; pixel_y = -4},/turf/simulated/floor{dir = 8; icon_state = "whiteyellow"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry) "bQx" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/atmos) "bQy" = (/obj/machinery/atmospherics/pipe/manifold{color = "red"; dir = 8; icon_state = "manifold-r"; level = 2},/obj/machinery/light{dir = 1},/obj/machinery/meter{frequency = 1443; id = "wloop_atm_meter"; name = "Waste Loop"},/turf/simulated/floor,/area/atmos) "bQz" = (/obj/machinery/camera{c_tag = "Atmospherics North East"},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 20},/obj/machinery/atmospherics/binary/pump{dir = 8; icon_state = "intact_off"; name = "Distro to Waste"; on = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor,/area/atmos) @@ -5147,7 +5147,7 @@ "bUY" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/white,/obj/item/weapon/pen,/turf/simulated/floor{dir = 1; icon_state = "whitegreen"},/area/medical/medbay) "bUZ" = (/obj/machinery/door/window/northleft{name = "Medbay Reception"; req_access_txt = "5"},/turf/simulated/floor{dir = 1; icon_state = "whitegreen"},/area/medical/medbay) "bVa" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/turf/simulated/floor{tag = "icon-whitegreen (NORTHWEST)"; icon_state = "whitegreen"; dir = 9},/area/medical/medbay) -"bVb" = (/obj/structure/table,/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/item/weapon/reagent_containers/dropper{pixel_y = -4},/turf/simulated/floor{dir = 8; icon_state = "whiteyellow"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry) +"bVb" = (/obj/structure/table,/obj/item/weapon/book/manual/robotics_cyborgs{pixel_x = 2; pixel_y = 5},/obj/item/weapon/storage/belt/utility,/obj/machinery/requests_console{department = "Robotics"; departmentType = 2; name = "Robotics RC"; pixel_y = 30},/obj/machinery/light{dir = 1},/obj/item/weapon/storage/belt/utility,/obj/item/weapon/reagent_containers/glass/beaker/large,/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics) "bVc" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/stool,/obj/effect/landmark/start{name = "Chemist"},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) "bVd" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor{icon_state = "dark"},/area/medical/morgue) "bVe" = (/obj/structure/stool/bed/chair{dir = 1},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/medical/cmo) @@ -5258,7 +5258,7 @@ "bXf" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple{color = "cyan"; icon_state = "intact-c"},/obj/machinery/atmospherics/pipe/simple{color = "yellow"; dir = 4; icon_state = "intact-y"; level = 2},/turf/simulated/floor/plating,/area/atmos) "bXg" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 0; frequency = 1441; icon_state = "in"; id_tag = "n2o_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine/n20,/area/atmos) "bXh" = (/turf/simulated/floor/engine/n20,/area/atmos) -"bXi" = (/obj/structure/table,/turf/simulated/floor{dir = 8; icon_state = "whiteyellow"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry) +"bXi" = (/obj/machinery/r_n_d/circuit_imprinter,/obj/item/weapon/reagent_containers/glass/beaker/sulphuric,/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics) "bXj" = (/obj/machinery/chem_dispenser,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) "bXk" = (/obj/structure/disposalpipe/trunk,/obj/machinery/disposal,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) "bXl" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/tank/oxygen,/obj/item/weapon/tank/oxygen,/obj/item/weapon/storage/belt/utility,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/turf/simulated/floor/plating,/area/storage/emergency) @@ -5953,8 +5953,8 @@ "cky" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor,/area/engine/break_room) "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) +"ckB" = (/obj/machinery/light/small{dir = 8},/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},/turf/simulated/floor{icon_state = "dark"},/area/medical/morgue) +"ckC" = (/obj/structure/table,/obj/machinery/reagentgrinder,/obj/machinery/requests_console{department = "Tool Storage"; departmentType = 0; pixel_y = 30},/turf/simulated/floor{dir = 4; icon_state = "whiteyellowfull"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry) "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) @@ -6076,7 +6076,7 @@ "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) +"cmU" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/turretid{name = "AI Chamber turret control"; pixel_x = 24; pixel_y = 24},/obj/machinery/door/window{dir = 2; name = "AI Core Door"; req_access_txt = "109"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) "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) @@ -6380,6 +6380,8 @@ "csJ" = (/obj/machinery/atmospherics/pipe/vent{dir = 4},/turf/simulated/floor/plating/airless,/area) "csK" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Engineering"; name = "Engineering Security Doors"; opacity = 0},/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/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) "csL" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Engineering"; name = "Engineering Security Doors"; opacity = 0},/turf/simulated/floor/plating,/area/engine/break_room) +"csM" = (/obj/structure/table,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/extinguisher,/turf/simulated/floor/plating,/area/storage/emergency) +"csN" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/item/weapon/reagent_containers/dropper{pixel_y = -4},/turf/simulated/floor{dir = 8; icon_state = "whiteyellow"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry) "csO" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north/shuttlespace_ns5,/area) "csP" = (/turf/space/transit/north/shuttlespace_ns2,/area/shuttle/escape/transit) "csQ" = (/turf/space/transit/north/shuttlespace_ns12,/area/shuttle/escape/transit) @@ -6398,6 +6400,7 @@ "ctd" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; name = "thrower_leftnostop"},/turf/space/transit/east/shuttlespace_ew15,/area) "cte" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; name = "thrower_leftnostop"},/turf/space/transit/east/shuttlespace_ew4,/area) "ctf" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; name = "thrower_leftnostop"},/turf/space/transit/east/shuttlespace_ew5,/area) +"ctg" = (/obj/structure/table,/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/turf/simulated/floor{dir = 8; icon_state = "whiteyellow"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry) "cth" = (/turf/unsimulated/wall{tag = "icon-iron3"; icon_state = "iron3"},/area) "cti" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/unsimulated/wall{tag = "icon-iron12"; icon_state = "iron12"},/area) "ctj" = (/turf/unsimulated/wall,/area) @@ -7151,6 +7154,7 @@ "cHD" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/unsimulated/floor{name = "plating"},/area/centcom/creed) "cHE" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/unsimulated/floor{name = "plating"},/area/centcom/creed) "cHF" = (/obj/structure/closet/radiation,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_Toxins = 1},/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/turf/simulated/floor{dir = 9; icon_state = "yellow"},/area/engine/engineering) +"cHG" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = 6},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/item/clothing/head/welding{pixel_x = -3; pixel_y = 5},/obj/item/clothing/head/welding{pixel_x = -3; pixel_y = 5},/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics) "cHH" = (/obj/structure/table/reinforced,/obj/item/device/pda/captain,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) "cHI" = (/obj/machinery/computer/secure_data,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) "cHJ" = (/obj/machinery/computer/security,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) @@ -7187,6 +7191,8 @@ "cIo" = (/obj/machinery/door/airlock/external,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "NTrasen"; name = "Outer Airlock"; opacity = 0},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom) "cIp" = (/turf/space,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/shuttle/specops/centcom) "cIq" = (/obj/structure/stool/bed/chair{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"cIr" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/closet/l3closet/virology,/turf/simulated/floor{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/medical/virology) +"cIs" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/closet/l3closet/virology,/turf/simulated/floor{dir = 6; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/medical/virology) "cIu" = (/obj/machinery/door/airlock/centcom{name = "General Access"; opacity = 1; req_access_txt = "101"},/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/control) "cIv" = (/obj/structure/table,/obj/item/device/assembly/signaler,/obj/item/weapon/handcuffs,/obj/item/weapon/melee/classic_baton,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/control) "cIw" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (EAST)"; icon_state = "propulsion"; dir = 4},/turf/space,/area/shuttle/specops/centcom) @@ -10190,31 +10196,31 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazMasGbcdaABaWoatuatuatuatuatuatubcebaOaTzaTxaTxaTxaTxaTxaTxaTxaTxaTxbcfaQGaYaaYbaZBbcgbchbciaYcbcjbckbclaPnaZIaZJbcmbcnaPnbbfaZNaZObbhbcobcobbhbcoaZObbjbcpbcqbcqbcrbcsbctaZUbcuaIJaYzbcvbcwbcxbcybczbczbcybcAbcBbadbaebcCbcDbcEbcFbcGbcHbcIbcJbcKbcLbcMbbLbcNbcObcPbbLbcQbagaYSbcRaIJbcSbcTbcUaZiaZiaZiaZiaZiaZiaZibcVaZiaZiaZiaZibcWaZiaZiaZiaZiaZiaZiaZiaZibcXaZiaZiaZiaZiaZiaZiaZiaZibcYbcZbdabdbbdcbdbbddbdbbdebdfbdgbdbbdhbdbbdibdjbdbbdbbdbbdbbdbbdbbdkbdlbdmbdnbccaTpaTpaTpaUVbdoaUUaUVaJCaJCaJCaJCaJCaJCaJCaJCaJCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdpbdpbdpbdpbdpbdpbdpbdpbdpbdpaaaaabbdqazPaxTbdrbdsbdtbdtbdtbdtbdtbdtbdubdvaPkaWPaQGaYaaYbaYcaYcbdwbdxaYcaPnaPnbdyaPnaZIbdzbcmbdAaPnbbfaZNaZObdBbdCbbhbcobdDaZObbjbdEbcqbcqbcqbdFbdGaZUbdHaIJaYzbdIbdJbdKbdLbdMbdNbdObcAbdPbadbaebdQbdRbdSbdSbdSbdTbdUbaebdVbdWbbLbbLbcNbdXbcPbbLbdYbagaujaIJaIJbcSbcTbcUaZiaZiaZiaZiaZiaZiaZiaRyaZiaZiaZiaZiaZiaZibebbdbbdbbdbbdbbdbbdbbecbdbbdbbdbbdbbdbbdbbdbaTPbeebefbegaZiaZiaZiaZiaZiaZhaZiaZiaZiaZiaZiaZiaZiaZiaZiaZiaZiaZibehbcYbeiaTpaTpbccaTpaTpbejaWkaQxaQxaTsaJCaJCaJCaJCaJCaJCaJCaJCaJCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdpbdpbdpbdpbdpbdpbdpbdpbdpbdpbdpaWmaWnaWoayTbekbelbembembenbembembembeoaPkaPkaPkaPkaYaaYbaZBbepbeqberaYcbesbetbeuaPnaPnaPnaPnbevaPnbbfaZNaZObewbbhbcobexbeyaZObbjaZUbezbcqbcqbeAbeBaZUbeCaIJaYzbeDbeEbdKbdLbeFbeGbdObcAbeHbadbeIbeJbeKbdSbeLbdSbcDbeMbeNbdVbeObePbeQbeRbeRbeSbbLbeTbagaYSbeUaIJbcSbcTbcUaZibeVaZibRNbRAbRAbRAbRObRAbRAbRAbRzaZiaZiaZiaZibfaaZibeVbRBbfcbRLaZiaZiaZibRMbffbRQbfhbRPbfjbfkaZiaZiaZiaZiaZibflbfmbfaaZiaZiaZiaZiaZiaZiaZiaZiaZiaZiaZiaZibcYbfnbfobfpbfqbfrbfsbftcghaabaaaaabaJCaJCaJCaJCaJCaJCaJCaJCaJCaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdpbdpbdpbdpbdpbdpbdpbdpbdpbdpbdpaySavkaySaxRbfvbembfwbfxbfybfybfzbfAbfBbfCbfCbfCbfCbfDbfEbfFbfFbfGbfHbfFbfIbfIbfJbfIbfKbfLbfLbfMbfLbfNbfObfPbfQbfRbfRbfSbfTbfPbfUbfVbfWbcqbcqbeAbfXbfYbeCaIJaYzbfZbgabgbbcybcybcybcybcAbgcbadbaebgdbgebgfbQwbghbgebgibaebdVbgjbgkbglbgmbgnbgobgpbgqbagbgraGWaGWbgsbgsbgsbgsbgsbgsbgsbNjbOdbOdbQIbQGbQHbNjbHnbHnbHnbHnbHnbHnbgzbgzbgzbQMbgzbgzbgzbRqbRebflbRrbgEbCpbgGbgHaZiaZibgIbgIbgJbgJbgJbgJbgJbgKbgLbgLbgMbgLaZibgLbgMbgLbgLbgNbgObgObgObgOcggbgEaPfaPfaPfaaaaaaaaaaJCaJCaJCaJCaJCaJCaJCaJCaJCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdpbdpbdpbdpbdpbdpbdpbdpbdpbdpbdpaZoaZpaWoayTbgTbembgUbembgVbgWbembembemaQGbgXbgYbgYbgZaYcaZBbhabchbhbaYcbhcbhdaVibhebhfbhgbhhbhibhjbhhbhkbhlbhmbhnbhmbhmbhobhpbhqbhrbhsbcqbcqbhtbhubhvbeCaIJbhwbfZbhxbhybhzbhAbhBbhCbhDbadbadbaebhEbhFbhGbhHbhIbhJbhKbaebdVbhLbhMbhNbhObhPbgobbLbhQbagaYSaIJbhRbgsbPNcdXbQjbQpbQsbhXbQubqfbqfbQqbQrbQrbPBbHnbPFbPEbPzbPybHnbPAbPKbPJbPMbPLbPHbPGbPwbPIbPwbPwbPwbIwbIzbisbPtbisbiubiubgJbivbPxbixbgJbiybizbiybgJbgKbgLbgNbgObiAbiBbiAbgObiCbiDbgOcbkcbgblJbgEaaaaaaaaaaaaaJCaJCaJCaJCaJCaJCaJCaJCaJCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdpbdpbdpbdpbdpbdpbdpbdpbdpbdpaaaaaaazObaNaPhbiFbembiGbembiHbiIbiJbiKbembiLaQGbiMaQGbiNaYcaYcaYcaYcaYcaYcbiObiPbiQaQGbiRaZOaZOaZObiSaZOaZOaZObiTaZOaZOaZOaZObiUbiVbiWbiXbcqbcqbeAbiYbfYbeCaIJbiZbfZbjabhybadbadbadbadbjbbadbjcbjdbjebjfbbxbjgbbxbjhbjibjjbjkbhLbjlbbLbjmbjnbgobjobbLbjpbjqbjrbjsbgsbOpbOqbOobjwbOtbOubOrbOsbqfbxGbqfbqfbxJbOBbOAbOzbOybOxbHnbOwbYAbPsbYAcaqbPlbgzbPibPhbOmbOnbgEbDAbjSbjTbjUbjVbjWbjXbjYbjZbkabjZbkbbkcbkdbkebgJbkfbkgbkhbgObkibkjbkkbklbkmbknbgObZjbZgcdbbgEaaaaaaaaaaagaJCaJCaJCaJCaJCaJCaJCaJCaJCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazMasGbcdaABaZpaTuaTuaTuaABaTubkoayTaxRaxRbembkpbkqbkrbiJbksbktbkubkvbkvbkvbkvbkwbkxbkxbkxbhhbhhbhhbkybkzbkzbkzbkAaZObkBbkCbkDbkEbkFbkGbkHbkIbkJbkKbkLbkMbkNbkObkPbkQbkRbkSbkTbkTbkUbjrbkVbkWbkXbkYbkZblablbblcbldbleblfbjjbjjbjjbjjblgbjjbjjbjjbjjblhblibljblkbllblmblnbloblpblqblraIJaIJbgsbXibXjbXkbjwbWTbWUbOrbWVbWXbWYbWXbWXbWibVYbWPbWlbWSbWQbHnbVRbYAbVWbYAcaqbVXbgzblJblKblLbXlbgEbDAblNblOblPblPblQblRblSblTblTblTblUblVblWblXblYblZbmabmbbmcbmdbmebkmbmfbmgbmhbgObPDbZgblLbgEaaaaaaaaaaaaaaaaJCaJCaJCaJCaJCaJCaJCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmjbmkavkaySawSawSawSaPhaxRaxRbembmlbmmbiJbmnbembembemaPkbmobmpbmqbmrbmqbmqbmqbmrbmqaPkaPkaZOaZOaZObmsaZObkHbkHbmtbkHbkHbkHbkHbkHbmubmvbmwbmxbmybmzbmzbmzbmAbmBbmCbmDbmEbmFbmGbmHbmIbmIbmJbmKbmLbmMbmNbmObmPbmQbmRbmSbmTbmUbmVbmSbmWbmQbmXbhLbmYbmZbmYbagbagbagbnabdVbnbaIJaIJbgsbVbbVcbHfbjwbUJbUWbOrbxGbqfbVabUYbUZbVgbHnbVfbVebVVbVSbHnbVRbVdbYAbYAcaqbPlbgzbgEbgEbgEbgEbgEbDAbjSbnqbnrbnsbntbnubnvbnwbnxbnybnybnzbjZbnAbgJbnBbnCbnDbgObnEbnFbnGbnHbnIbnJbgObPDbZgcnqbgEaaaaaaaaaaaaaabaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaabmjavkavkaySaxQaxQaxQbnLaxQaxQbembnMbnNbnObiJbemaaaaaaaaaaabaabbnPbnPbnPbnPbnPbnPbnPaaaaaabnQbnRbnSbnTbnUbkHbkHbkHbkHbkHbkHbkHbkHbnVbiXbcqbnWbnXbnYaZUaZUbnZbkNaZUaZUboabobbocbodboebofbofbogbofbohboibofabHbojbokbmSbolbmUbolbmSbombojbmXbonboobeRbopboqborbosbotboubovaIJbowboxbUwbUDbHfbjwbUabhXbUfbxGbqfbTYbTZbqfbTWbHnbOAbTXbTTbTJbHnbTUbTFbTabSXbTIbSXbSUbSSbSSbSSbSSbSSbSTbjSboQbjUbjUbntboRboSboTboUboVboVboWboXbSQbgJboZbnCbpabgObpbbpcbpdbnHbkmbpebgObZjbZgckBbgEaaaaaaaaaaaaaabbpgbphbpibphbpibphbpjaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdpbdpbdpbdpbdpbdpbdpbdpbdpbdpbdpaySavkaySaxRbfvbembfwbfxbfybfybfzbfAbfBbfCbfCbfCbfCbfDbfEbfFbfFbfGbfHbfFbfIbfIbfJbfIbfKbfLbfLbfMbfLbfNbfObfPbfQbfRbfRbfSbfTbfPbfUbfVbfWbcqbcqbeAbfXbfYbeCaIJaYzbfZbgabgbbcybcybcybcybcAbgcbadbaebgdbgebgfcmUbghbgebgibaebdVbgjbgkbglbgmbgnbgobgpbgqbagbgraGWaGWbgsbgsbgsbgsbgsbgsbgsbNjbOdbOdbQIbQGbQHbNjbHnbHnbHnbHnbHnbHnbgzbgzbgzbQMbgzbgzbgzbRqbRebflbRrbgEbCpbgGbgHaZiaZibgIbgIbgJbgJbgJbgJbgJbgKbgLbgLbgMbgLaZibgLbgMbgLbgLbgNbgObgObgObgOcggbgEaPfaPfaPfaaaaaaaaaaJCaJCaJCaJCaJCaJCaJCaJCaJCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdpbdpbdpbdpbdpbdpbdpbdpbdpbdpbdpaZoaZpaWoayTbgTbembgUbembgVbgWbembembemaQGbgXbgYbgYbgZaYcaZBbhabchbhbaYcbhcbhdaVibhebhfbhgbhhbhibhjbhhbhkbhlbhmbhnbhmbhmbhobhpbhqbhrbhsbcqbcqbhtbhubhvbeCaIJbhwbfZbhxbhybhzbhAbhBbhCbhDbadbadbaebhEbhFbhGbhHbhIbhJbhKbaebdVbhLbhMbhNbhObhPbgobbLbhQbagaYSaIJbhRbgsbPNcdXbQjbQpckCbhXbQubqfbqfbQqbQrbQrbPBbHnbPFbPEbPzbPybHnckBbPKbPJbPMbPLbPHbPGbPwbPIbPwbPwbPwbIwbIzbisbPtbisbiubiubgJbivbVbbXibgJbiybizbiybgJbgKbgLbgNbgObiAbiBbiAbgObiCbiDbgOcbkcbgblJbgEaaaaaaaaaaaaaJCaJCaJCaJCaJCaJCaJCaJCaJCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdpbdpbdpbdpbdpbdpbdpbdpbdpbdpaaaaaaazObaNaPhbiFbembiGbembiHbiIbiJbiKbembiLaQGbiMaQGbiNaYcaYcaYcaYcaYcaYcbiObiPbiQaQGbiRaZOaZOaZObiSaZOaZOaZObiTaZOaZOaZOaZObiUbiVbiWbiXbcqbcqbeAbiYbfYbeCaIJbiZbfZbjabhybadbadbadbadbjbbadbjcbjdbjebjfbbxbjgbbxbjhbjibjjbjkbhLbjlbbLbjmbjnbgobjobbLbjpbjqbjrbjsbgsbQwbOqbOobjwbOtbOubOrbOsbqfbxGbqfbqfbxJbOBbOAbOzbOybOxbHnbOwbYAbPsbYAcaqbPlbgzbPibPhbOmbOnbgEbDAbjSbjTbjUbjVbjWbjXbjYbjZbkabjZbkbbkcbkdbkebgJbkfbkgbkhbgObkibkjbkkbklbkmbknbgObZjbZgcdbbgEaaaaaaaaaaagaJCaJCaJCaJCaJCaJCaJCaJCaJCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazMasGbcdaABaZpaTuaTuaTuaABaTubkoayTaxRaxRbembkpbkqbkrbiJbksbktbkubkvbkvbkvbkvbkwbkxbkxbkxbhhbhhbhhbkybkzbkzbkzbkAaZObkBbkCbkDbkEbkFbkGbkHbkIbkJbkKbkLbkMbkNbkObkPbkQbkRbkSbkTbkTbkUbjrbkVbkWbkXbkYbkZblablbblcbldbleblfbjjbjjbjjbjjblgbjjbjjbjjbjjblhblibljblkbllblmblnbloblpblqblraIJaIJbgsctgbXjbXkbjwbWTbWUbOrbWVbWXbWYbWXbWXbWibVYbWPbWlbWSbWQbHnbVRbYAbVWbYAcaqbVXbgzblJblKblLbXlbgEbDAblNblOblPblPblQblRblSblTblTblTblUblVblWcHGblYblZbmabmbbmcbmdbmebkmbmfbmgbmhbgObPDbZgblLbgEaaaaaaaaaaaaaaaaJCaJCaJCaJCaJCaJCaJCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmjbmkavkaySawSawSawSaPhaxRaxRbembmlbmmbiJbmnbembembemaPkbmobmpbmqbmrbmqbmqbmqbmrbmqaPkaPkaZOaZOaZObmsaZObkHbkHbmtbkHbkHbkHbkHbkHbmubmvbmwbmxbmybmzbmzbmzbmAbmBbmCbmDbmEbmFbmGbmHbmIbmIbmJbmKbmLbmMbmNbmObmPbmQbmRbmSbmTbmUbmVbmSbmWbmQbmXbhLbmYbmZbmYbagbagbagbnabdVbnbaIJaIJbgscsNbVcbHfbjwbUJbUWbOrbxGbqfbVabUYbUZbVgbHnbVfbVebVVbVSbHnbVRbVdbYAbYAcaqbPlbgzbgEbgEbgEbgEbgEbDAbjSbnqbnrbnsbntbnubnvbnwbnxbnybnybnzbjZbnAbgJbnBbnCbnDbgObnEbnFbnGbnHbnIbnJbgObPDbZgcnqbgEaaaaaaaaaaaaaabaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaabmjavkavkaySaxQaxQaxQbnLaxQaxQbembnMbnNbnObiJbemaaaaaaaaaaabaabbnPbnPbnPbnPbnPbnPbnPaaaaaabnQbnRbnSbnTbnUbkHbkHbkHbkHbkHbkHbkHbkHbnVbiXbcqbnWbnXbnYaZUaZUbnZbkNaZUaZUboabobbocbodboebofbofbogbofbohboibofabHbojbokbmSbolbmUbolbmSbombojbmXbonboobeRbopboqborbosbotboubovaIJbowboxbUwbUDbHfbjwbUabhXbUfbxGbqfbTYbTZbqfbTWbHnbOAbTXbTTbTJbHnbTUbTFbTabSXbTIbSXbSUbSSbSSbSSbSSbSSbSTbjSboQbjUbjUbntboRboSboTboUboVboVboWboXbSQbgJboZbnCbpabgObpbbpcbpdbnHbkmbpebgObZjbZgcsMbgEaaaaaaaaaaaaaabbpgbphbpibphbpibphbpjaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxPaySaySbpkaTubplazMasGbpmbplbembpnbpobppbgWbemaaaaaaaaaaaaaaabnPbnPbnPbnPbnPbnPbnPaaaaaabpqbprbkHbpsbptbptbptbptbptbpubptbptbptbpvbpwbpxbpybpzbpAaZUbpBbeAbpCbpDbpEbeCbpFbpGbodbodbofbpHbpIbpJbpKbpLbofbpMbpNbpObpPbpQbpRbpQbpSbpTbpUbpVbonbpWbeRbpXbagbpYbmYbpZbqabovaIJaIJbgsbSubSvbHfbStbRXbhXbeabRWbRSbqlbRRbqfbSPbSObSNbSMbSLbSGbHnbgzbSwbgzbgzbqrbqrbqrbqrbqrbqrbqrbqrbDAbjSbnqbnrbnsbqsbqtbqubqvbqwbqwbqwboWbjZbqxbqybqzbkgbqAbgObqBbqCbqDbqEbkmbqFbgObPDblKbgEbgEaaaaaaaaaaaaaabbqGbqHbqIbqJbqJbqKbqGaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnPbnPbnPbnPbnPbnPbnPbqMbqNbqObqPbkHbkHbkHbqQbqQbqQbqQbnTbkHbkHbkHbmubqRbcqbqSbqTbqUbqVbqWbeAbcqbqXbqYbeCbpFbqZbrabrbbrcbrdbrebrfbrgbrhbofabHbribrjbmSbpQbrkbpQbmSbrlbrmbmXbrnbrobrpbrqbagbrrbmYbrsbqabovaIJbGkbgsbHcbHebHfbHgbHhbhXbHibxGbqfbHjbHkbHlaWTbHnbHpbHobHrbHqbHnbHsbHubHtbHwbHvbHybHxbIubHzbIxbIybIvbIwbIzbrTbrUbrVbrWbrXbjYbrYbqwbqwbqwbrZbjZbsabgJbsbbsbbscbgObsdbsebsfbsgbkmbshbgObPDbPCbgEaaaaaaaaaaaaaaaaabbsjbskbqIbqJbqIbslbpiaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnPbnPbnPbnPbnPbnPbnPbsmbsnbsmbsobspbkHbkHbkHbkHbkHbkHbnTbkHbsqaZOaZObsrbcqbcqbssbstbsubsvbeAbcqbcqbswaIJbpFbsxbsybszbsAbsBbsCbsDbsEbsFbofabHbrmbrmbsGbsHbsIbmSbsJbsKbsLbsMbsNbsObsObsObsObsObsObsPbsQbsRaGWbGabGbbGebGfbGcbGdbhXbhXbGgbxGbqfbqfbqfbqfbFTbFSbqfbFRbqfbCgbFUbsUbFWbqfbFVbERbFZbDgbFYbFXbCnbAUbqrbGhbGibtqbtqbtrbtsbttbjYbtubjZbjZbtvbtwbjZbtxbjYbtybtzbtAbtBbtCbtDbtEbtFbtGbgObgObOvbgEbgEbtIbtJbtJbtJbtKbkfbqGbqJbqIbqJbqJbqKbqGaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaagaaaaaaaaabnPbnPbnPbnPbnPbnPbnPbtLbtMbtLbtNbkHbkHbkHbqQbqQbqQbqQbnTbkHbtObtPaZObtQbcqbcqbssbtRbtSbsvbtTbtUbpxbtVbtWbtXbovaRrbszbtYbtZbuabubbucbudbuebufbugbuhbuibujbrkbujbsKbukbulbulbsNbumbunbuobupbuqburbusbutdKMaIJbDpbEEbDnbEybEzbEAbEHbEIbEFbEJbEFbEGbEFbEFbEMbELbEFbELbEFbEFbEFbEKbEQbEPbFQbERbENbDgbuNbuNbDQbCobqrbDAbjSbuQbuRbuSbuTbuTbjYbuUbuVbuWbjYbuXbjZbuYbuZbvabvbbvcbvdbvebvfbvgbvhbvibsbbkgbvjbvkbvlbvmbvnbvnbvnbvnbvobvpbphbpibvqbpibphbvraabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnPbnPbnPbnPbnPbnPbnPbvsbqNbvtbvubkHbkHbkHbkHbkHbkHbkHbnTbkHbtObvvaZObvwbdFbcqbvxbpxbvybpxbvzbcqbqXbpEbeCaIJbovaRrbszbofbvAbvBbvCbvDbvEbogbvFbvGbvHbvIbsLbvJbvKbvLbvMbvNbvObsNbvPbvQbvRbvSbvTbvTbvUbvVbvWaIJbDpbDqbDnbDobqfbDmbDvbDwbDrbDubDrbDtbDrbDsbCsbsUbCrbsUbsUbtbbCqbwmbwmbDlbDkbDibDhbDgbDfbCzbCnbCobqrbCpbjSbisbwtbwubwtbwtbjYbjYbjYbjYbjYbwvbwwbwxbwybwzbwAbwBbwCbwCbwDbwEbnCbwFbwGbwHbvjbnCbvlbwIbnCbwJbnCbwKbkfbtIbtJbtKbwLbkfaaaaaaaabaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnPbnPbnPbnPbnPbnPbnPbtLbtMbtLbwMbwNbkHbkHbwObwPbwQbwPbwRbwPbwSbwTbfPbwUbwVbkQbwWbkQbwXbkRbwVbwYbwZbqYbeCaIJbxabxbbxcbofbxdbxebxfbxgbxhbogbxibxjbxkbxlbxmbxnbxobxpbxqbxrbxsbxtbxubxvbxvbxwbxxbxybxzbsQbxAaIJbNibNjbeabNkbqfbLZbNdbxFbNYbNebNfbNgbNhbxFbNYbzhbzhbNYbxFbObbOdbwmbNlbuNbuNbNmbERbDgbOabNXbOfbOgbqrbOebOhbOibxWbxXbwCbwCbxYbxZbwCbyabybbycbydbyebwCbyfbygbyhbyibyjbykbylbylbylbylbylcbncblbgQbtIbtKbkfbnCbvnbynbyobVybypbyqbyraaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnPbnPbnPbnPbnPbnPbnPbqMbqNbqObqPbkHbkHbkHbqQbqQbqQbqQbnTbkHbkHbkHbmubqRbcqbqSbqTbqUbqVbqWbeAbcqbqXbqYbeCbpFbqZbrabrbbrcbrdbrebrfbrgbrhbofabHbribrjbmSbpQbrkbpQbmSbrlbrmbmXbrnbrobrpbrqbagbrrbmYbrsbqabovaIJbGkbgsbHcbHebHfbHgbHhbhXbHibxGbqfbHjbHkbHlaWTbHnbHpbHobHrbHqbHnbHsbHubHtbHwbHvbHybHxbIubHzbPxbPAbIvbIwbIzbrTbrUbrVbrWbrXbjYbrYbqwbqwbqwbrZbjZbsabgJbsbbsbbscbgObsdbsebsfbsgbkmbshbgObPDbPCbgEaaaaaaaaaaaaaaaaabbsjbskbqIbqJbqIbslbpiaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnPbnPbnPbnPbnPbnPbnPbsmbsnbsmbsobspbkHbkHbkHbkHbkHbkHbnTbkHbsqaZOaZObsrbcqbcqbssbstbsubsvbeAbcqbcqbswaIJbpFbsxbsybszbsAbsBbsCbsDbsEbsFbofabHbrmbrmbsGbsHbsIbmSbsJbsKbsLbsMbsNbsObsObsObsObsObsObsPbsQbsRaGWbGabGbbGebGfbGcbGdbhXbhXbGgbxGbqfbqfbqfbqfbFTbFSbqfbFRbqfbCgbFUbsUbFWbqfbFVbERbFZbDgbFYbFXbIybOpbqrbGhbGibtqbtqbtrbtsbttbjYbtubjZbjZbtvbtwbjZbOfbjYbtybtzbtAbtBbtCbtDbtEbtFbtGbgObgObOvbgEbgEbtIbtJbtJbtJbtKbkfbqGbqJbqIbqJbqJbqKbqGaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaagaaaaaaaaabnPbnPbnPbnPbnPbnPbnPbtLbtMbtLbtNbkHbkHbkHbqQbqQbqQbqQbnTbkHbtObtPaZObtQbcqbcqbssbtRbtSbsvbtTbtUbpxbtVbtWbtXbovaRrbszbtYbtZbuabubbucbudbuebufbugbuhbuibujbrkbujbsKbukbulbulbsNbumbunbuobupbuqburbusbutdKMaIJbDpbEEbDnbEybEzbEAbEHbEIbEFbEJbEFbEGbEFbEFbEMbELbEFbELbEFbEFbEFbEKbEQbEPbFQbERbENbDgbuNbuNbDQbAUbqrbDAbjSbuQbuRbuSbuTbuTbjYbuUbuVbuWbjYbuXbjZbuYbuZbvabvbbvcbvdbvebvfbvgbvhbvibsbbkgbvjbvkbvlbvmbvnbvnbvnbvnbvobvpbphbpibvqbpibphbvraabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnPbnPbnPbnPbnPbnPbnPbvsbqNbvtbvubkHbkHbkHbkHbkHbkHbkHbnTbkHbtObvvaZObvwbdFbcqbvxbpxbvybpxbvzbcqbqXbpEbeCaIJbovaRrbszbofbvAbvBbvCbvDbvEbogbvFbvGbvHbvIbsLbvJbvKbvLbvMbvNbvObsNbvPbvQbvRbvSbvTbvTbvUbvVbvWaIJbDpbDqbDnbDobqfbDmbDvbDwbDrbDubDrbDtbDrbDsbCsbsUbCrbsUbsUbtbbCqbwmbwmbDlbDkbDibDhbDgbDfbCzbIybCobqrbCpbjSbisbwtbwubwtbwtbjYbjYbjYbjYbjYbwvbwwbwxbwybwzbwAbwBbwCbwCbwDbwEbnCbwFbwGbwHbvjbnCbvlbwIbnCbwJbnCbwKbkfbtIbtJbtKbwLbkfaaaaaaaabaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnPbnPbnPbnPbnPbnPbnPbtLbtMbtLbwMbwNbkHbkHbwObwPbwQbwPbwRbwPbwSbwTbfPbwUbwVbkQbwWbkQbwXbkRbwVbwYbwZbqYbeCaIJbxabxbbxcbofbxdbxebxfbxgbxhbogbxibxjbxkbxlbxmbxnbxobxpbxqbxrbxsbxtbxubxvbxvbxwbxxbxybxzbsQbxAaIJbNibNjbeabNkbqfbLZbNdbxFbNYbNebNfbNgbNhbxFbNYbzhbzhbNYbxFbObbOdbwmbNlbuNbuNbNmbERbDgbOabNXbQsbOgbqrbOebOhbOibxWbxXbwCbwCbxYbxZbwCbyabybbycbydbyebwCbyfbygbyhbyibyjbykbylbylbylbylbylcbncblbgQbtIbtKbkfbnCbvnbynbyobVybypbyqbyraaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnPbnPbnPbnPbnPbnPbnPbysbytbysbyubyvbywbywbywbywbywbyxbyybkHbtObyzaZObyAbyBbyCbyDbyEbnXbyFbyGbyHaZUaZUbyIaIJbyJbyKbszbofbyLbyMbyNbvBbyObogbyPbyQbyRbySbyTbyUbyVbyWbyXbyYbyZbsNbzabzbbzcbzdbxxbxybxzbsQbzeaIJbLXbLYbMabMbbqfbLZbwgbxFbLTbLUbLVbLWbuHbxFbLSbLRbLRbLQbxFbjLbqfbwmbLLbuNbXNbLKbLPbLObLNbLMbLMbMVbMZbNabNbbNcbzFbzGbvebvebzHbvebzIbvebvfbvebvebvebvebzJbzKbzLbzMbzNbzObzPbzQbzRbzSbylbiEbzTbmiaabaabbkfbzUbvnbyobyobvobzVbzWbzXaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnPbnPbnPbnPbnPbnPbnPbzYbzZbAaaZOaZObAbbqNbqNbqNbAcaZOaZObAdbAebAfaZObAgbAgbAgbAhbAgbAibAjbAkbAlbAmbAibeCaIJbAnbAoaTVbofbuebApbAqbAqbArbAsbAtbAtbAubAtbAvbAwbAxbAybAzbAzbAzbAAbsObsObsObsObsObsObsObsQdKTaXudKUbxFbxFbKEbKFbKGbxFbxFbKCbKDbKAbAIbAIbKBbIXbLIbLJbIXbITbjLbqfbwmbLGbLCbLHbKxbKIbKHbLBbKxbKxbKybKvbKwbKubAZbAZbAZbAZbAZbBabAZbAZbBbbBcbBdbBebBebBfbBgbvjbBhbzMbBibBjbBkbBlbBmbBnbylbiEbzTbpfaaaaaabkfbBobBpbkfbvobkfbkfbvobkfaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnPbnPbnPbnPbnPbnPbnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBqaabaaaaaaaaaaaabAgbBrbBsbBtbBubAibBvbBwbBxbBybAibeCaIJbBzbBAbBBbBAbBCbBDbBEbBFbBGbBHaXubBIaXubBJbBKbBLbBMbBNbBOaIJaMcbBPaMdbcSbBEbBQbBRaIJbBSbBTbzeaIJdKRbxFbKsbKtbKqbKrbKobKpbKmbKnboJbAIbAIbIYbIXbIWbIVbIUbITbjLbISbwmbIRbIQbIPbIObINbIMbILbIKbIJbqrbqrbCpbIIbAZbCtbCubCvbCwbCxbCybIHbBbbCAbCBbCCbBebBebCDbvjbBhbCEbCFbCGbCHbCIbCJbCKbylbiEbzTbgQbgQbgQbgQbgQbkfbkfaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGmaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnPbnPbnPbnPbnPbnPbnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAgbCLbCMbCNbCObCPbCQbCRbCSbCTbAibeCbCUbCVaIJaIJaIJaIJbcSbBEbBQbCWaIJaIJbCXaIJaIJbCYbCZbDaaIJaIJaIJaIJbBPaIJbcSbBEbBQbDeaXubDcbDbbDjbDdbtmbtlbtobtnbtHbtpbuCbuBbuEbuDbuGbuFbuHbxFbthbtibtjbtkbxFbjLbqfbwmbwmbwmbwmbwmbqrbqrbqrbqrbqrbqrbtebtdbtfbAZbDxbDybDzbtgbDBbDCbDDbBbbDEbDFbDGbDGbBebDHbDIbDJbDKbDLbDMbCJbDNbDObDPbylbiEbzTbgQaTTbDRbDRbgQaabaabaabaabaabaabaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabbDSbDTbDTbDUbDVbDVbDWbDWbDWbDWbDXaabaabaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnPbnPbnPbnPbnPaaaaaaaaaaaaaaaaaaaaaaaabDYbDZbEabDZbEbaaaaaaaaabAgbAgbEcbEdbCNbEdbEebEfbEgbEhbEibAibEjbeCbEkbElbtWbEmbtWbEnbEobEpbtXaIJbEqbErbjrbjrbEsaXuaXuaXuaXuaXuaXubEtbEubEvbEwbExbECbEBbEDbuIbvYbvXbECbuPbwdbwcbwabvZbxFbxFbNYbwebNYbxFbxFbxFbxFbxFbxFbxFbxFbjLbqfbwfbwibwjbwgbwhbeabwnbwkbwlbuKbuJbuMbuLbuObAZbESbETbCvbEUbEVbEWbEXbBbbEYbDFbDGbDGbBebEZbFabFbbFcbFdbFebFfbFgbFhbFibFjbFkbFlbFlbFlbFlbFmbmiaaaaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabbFnbFobFpbFobDVbDWbDWbFqbFrbFqbDWbDWaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFsbFtbFubFtbFsbFvbFwbFxbAgbFybEdbFzbFAbFBbFCbFDbFDbFEbFFbAibFGbFGbFHbFGaTVaTVaTVaTVbFIbFIbFIbFIbFIbFIbFIbFIbFJbbNbbNbFKbFKbFKbFKbFLbFMbFKbFKbFKbFKbFNbFObFPaIPbrvbrxbrwbqqbqpbrubrtbrBbxFbrDbrCbrybNYbrzbrzbqgbqhbqibqkbNYbqebqfbqfbqfbqfbqfbjLbqlbqmbqnbqobrEbeabGjbeWbGlbGlbGlbGlbGlbGlbGlbGlbGlbBbbGmbGnbGobGobBebGpbGqbGrbGsbGsbGsbGsbGtbGubGvbGwbGsbGsbGsbGsbzTbGxbGyaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacbGzbFobFobGAbDWbDWbFqbFqbGBbFqbFqbDWbDWaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabEabGCbGDbGCbEabGEbGFbGGbAgbGHbGIbEdbGJbGKbAibGLbGMbGNbGObAibGPbGPbGQbFGaaaaaaaaaaaabFIbGRbGSbGTbGUbGVbGWbFIbGXbGYbGZbFKbHabHbbrNbHdbrGbrFbrIbrHbrKbrJbrMbrLbHmbrQbFNbxFbrPbrCboJbrObsTbxFbsSbsibrSbrRbAIbAIbAIbAIbAIbsZbsVbsYbsUbsUbsUbsUbtbbjLbtabqmbqnbqobtcbeabGjbeWbGlbHAbHBbHBbHCbHDbHEbHFbHGbBbbHHbHIbHJbHJbBebHKbHLbBhbHMbHNbHObHPbHQbHRbHSbHTbHUbHVbHWbGsbgQbEObgQbHYbHYbHYbHYbHYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaabHZbDWbGzbDWbDWbFqbFqbFqbFqbFqbFqbFqbDWbDWaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFsbGCbGCbGCbIabIbbEdbEdbIcbIdbEdbEdbIebIfbAibAibAibIgbAibAibIhbIibIjbIkaaabIlbImbInbIobIpbGWbIqbIrbIsbItbADbzDbzCbzBbzAbzzbIAbIBbICbIDbIEbIFbFKbFKbIGbACbzEbARbAQbATbASbAIbrCbAVbrObAIbALbAMbrCbANbxFbAPbAObAIbAIbAJbAKbeabeabeabeabeabAGbjLbjLbAHbqmbqnbqobAFbAEbIZbeWbGlbJabJbbHBbJcbHBbHBbHBbJdbBbbJebDFbJfbJfbBebBgbJgbJhbJibJjbJjbJjbJjbJkbJlbJmbJnbJobJpbGsbJqbJrbJsbJtbJubJvbJwbJxaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabbDVbDWbJybJzbJzbFqbFqbFqbFqbFqbFqbFqbFqbDWbDWaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabEabGDbGDbGDbEabJAbJBbJCbJDbJEbEdbJFbJGbJHbJIbJJbJJbJKbJJbJJbJLbJMbJNbJOaaabJPbJQbJRbJSbJTbGWbJUbJVbJWbJXbFIbJYbJZbKabFKbKbbKcbKdbKebKfbKgbKhbKibKjbKkbKldKSbCbbCabBZbzhbCfbCebCdbCcbBWbxFbBVbrCbBYbxFbBXbrObAIbAIbCjbKzbeabCmbCkbClbChbxGbjLbCgbCibAXbAXbAXbAXbAWbBUbAYbGlbHAbKJbHBbHBbHBbHBbHBbKKbBbbKLbDFbKMbKMbBebKNbKObBhbKPbJlbJlbKQbKRbKSbKTbKUbKVbKWbKXbKYbKZbLabLbbLcbLdbLebJwbLfaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaabDWbDWbLgbFqbFqbFqbFqbFqbFqbFqbFqbFqbFqbFqbDWbDWaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaabFsbLhbLibLjbFsbLkbFwbFxbAgbAgbLlbLlbLlbAgbAgbFGbFGbFGbFGbLmbFGbFGbLnbJOaaabJPbLobLpbLqbLrbLsbLtbLubLrbLrbLvbLwbLxbLybFKbFKbFKbFKbFKbFKbLzbFKbFKbLAbwpbwobLDbLEbLFbLEbzhbymbxVbzgbzfbxSbxFbxUbxTbxObxFbxRbxQbxKbxLbxMbxNbeabxIbqfbxJbxEbxGbxHbsUbwqbwrbwsbxCbzibeabGjbeWbGlbGlbMcbHBbHBbHBbMdbGlbGlbBbbMebMfbKMbKMbBebMgbKObBhbHMbMhbMibMjbMkbMlbMmbMnbJlbMobMpbGsbMqbMrbMsbHYbMtbMubMvbMwaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabbDWbFqbFqbFqbFqbFqbFqbMxbFqbMybFqbFqbFqbFqbFqbDWbDWaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMzbDZbMAbDZbMBaaaaabaaaaaabAgbMCbMDbMEbAgaaaaaaaaabFGbMFbMGbIhbFGbLnbJOaaabJPbMHbMIbMJbMKbGWbMLbMMbMNbMObFIbMPbMQbMRbMSbMTbMTbMTbMTbMUbzkbMWbMWbMXbMYbzmbzlbzubztbzsbYBbzrbzpbYBbzobzrbYBbYBbzpbzobYBbYBbzobYBbYBbzpbYBbzxbdZbeaaWTbeabzwbjLbzvbeabeabeabeabeabeabzybeWbGlbNnbNobNpbNqbNrbNsbNtbNnbBebNubNvbCCbBebBebNwbKObNxbHYbHYbGsbGsbGsbGsbGwbGsbNybJlbNzbGsbNAbHXbgQbHYbNBbNCbNDbHYaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaabDWbNEbNEbNEbNEbNEbNEbNFbFqbNGbNEbMybFqbFqbFqbFqbDWaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnPbnPbnPbnPbnPaaaaaaaaaaaaaaaaaaaaaaaabDYbDZbEabDZbEbaaaaaaaaabAgbAgbEcbEdbCNbEdbEebEfbEgbEhbEibAibEjbeCbEkbElbtWbEmbtWbEnbEobEpbtXaIJbEqbErbjrbjrbEsaXuaXuaXuaXuaXuaXubEtbEubEvbEwbExbECbEBbEDbuIbvYbvXbECbuPbwdbwcbwabvZbxFbxFbNYbwebNYbxFbxFbxFbxFbxFbxFbxFbxFbjLbqfbwfbwibwjbwgbwhbeabwnbwkbwlbtabuJbuMbuLbuObAZbESbETbCvbEUbEVbEWbEXbBbbEYbDFbDGbDGbBebEZbFabFbbFcbFdbFebFfbFgbFhbFibFjbFkbFlbFlbFlbFlbFmbmiaaaaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabbFnbFobFpbFobDVbDWbDWbFqbFrbFqbDWbDWaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFsbFtbFubFtbFsbFvbFwbFxbAgbFybEdbFzbFAbFBbFCbFDbFDbFEbFFbAibFGbFGbFHbFGaTVaTVaTVaTVbFIbFIbFIbFIbFIbFIbFIbFIbFJbbNbbNbFKbFKbFKbFKbFLbFMbFKbFKbFKbFKbFNbFObFPaIPbrvbrxbrwbqqbqpbrubrtbrBbxFbrDbrCblsbNYblXblXbqgbqhbqibqkbNYbqebqfbqfbqfbqfbqfbjLbqlbqmbqnbqobrybeabGjbeWbGlbGlbGlbGlbGlbGlbGlbGlbGlbBbbGmbGnbGobGobBebGpbGqbGrbGsbGsbGsbGsbGtbGubGvbGwbGsbGsbGsbGsbzTbGxbGyaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacbGzbFobFobGAbDWbDWbFqbFqbGBbFqbFqbDWbDWaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabEabGCbGDbGCbEabGEbGFbGGbAgbGHbGIbEdbGJbGKbAibGLbGMbGNbGObAibGPbGPbGQbFGaaaaaaaaaaaabFIbGRbGSbGTbGUbGVbGWbFIbGXbGYbGZbFKbHabHbbrNbHdbrGbrFbrIbrHbrKbrJbrMbrLbHmbrQbFNbxFbrPbrCboJbrObsTbxFbsSbsibrSbrRbAIbAIbAIbAIbAIbsZbsVbsYbsUbsUbsUbsUbtbbjLbrzbqmbqnbqobrEbAEbIZbeWbGlbHAbHBbHBbHCbHDbHEbHFbHGbBbbHHbHIbHJbHJbBebHKbHLbBhbHMbHNbHObHPbHQbHRbHSbHTbHUbHVbHWbGsbgQbEObgQbHYbHYbHYbHYbHYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaabHZbDWbGzbDWbDWbFqbFqbFqbFqbFqbFqbFqbDWbDWaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFsbGCbGCbGCbIabIbbEdbEdbIcbIdbEdbEdbIebIfbAibAibAibIgbAibAibIhbIibIjbIkaaabIlbImbInbIobIpbGWbIqbIrbIsbItbADbzDbzCbzBbzAbzzbIAbIBbICbIDbIEbIFbFKbFKbIGbACbzEbARbAQbATbASbAIbrCbAVbrObAIbALbAMbrCbANbxFbAPbAObAIbAIbAJbAKbeabeabeabeabeabAGbjLbCgbCibAXbAXbAXbAXbAHbAFbzvbGlbJabJbbHBbJcbHBbHBbHBbJdbBbbJebDFbJfbJfbBebBgbJgbJhbJibJjbJjbJjbJjbJkbJlbJmbJnbJobJpbGsbJqbJrbJsbJtbJubJvbJwbJxaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabbDVbDWbJybJzbJzbFqbFqbFqbFqbFqbFqbFqbFqbDWbDWaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabEabGDbGDbGDbEabJAbJBbJCbJDbJEbEdbJFbJGbJHbJIbJJbJJbJKbJJbJJbJLbJMbJNbJOaaabJPbJQbJRbJSbJTbGWbJUbJVbJWbJXbFIbJYbJZbKabFKbKbbKcbKdbKebKfbKgbKhbKibKjbKkbKldKSbCbbCabBZbzhbCfbCebCdbCcbBWbxFbBVbrCbBYbxFbBXbrObAIbAIbCjbKzbeabCmbCkbClbChbxGbBUbsUbCnbIxbwsbxCbAWbeabGjbAYbGlbHAbKJbHBbHBbHBbHBbHBbKKbBbbKLbDFbKMbKMbBebKNbKObBhbKPbJlbJlbKQbKRbKSbKTbKUbKVbKWbKXbKYbKZbLabLbbLcbLdbLebJwbLfaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaabDWbDWbLgbFqbFqbFqbFqbFqbFqbFqbFqbFqbFqbFqbDWbDWaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaabFsbLhbLibLjbFsbLkbFwbFxbAgbAgbLlbLlbLlbAgbAgbFGbFGbFGbFGbLmbFGbFGbLnbJOaaabJPbLobLpbLqbLrbLsbLtbLubLrbLrbLvbLwbLxbLybFKbFKbFKbFKbFKbFKbLzbFKbFKbLAbwpbwobLDbLEbLFbLEbzhbymbxVbzgbzfbxSbxFbxUbxTbxObxFbxRbxQbxKbxLbxMbxNbeabxIbqfbxJbxEbxGbjLbtxbtcbeabeabeabeabeabGjbeWbGlbGlbMcbHBbHBbHBbMdbGlbGlbBbbMebMfbKMbKMbBebMgbKObBhbHMbMhbMibMjbMkbMlbMmbMnbJlbMobMpbGsbMqbMrbMsbHYbMtbMubMvbMwaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabbDWbFqbFqbFqbFqbFqbFqbMxbFqbMybFqbFqbFqbFqbFqbDWbDWaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMzbDZbMAbDZbMBaaaaabaaaaaabAgbMCbMDbMEbAgaaaaaaaaabFGbMFbMGbIhbFGbLnbJOaaabJPbMHbMIbMJbMKbGWbMLbMMbMNbMObFIbMPbMQbMRbMSbMTbMTbMTbMTbMUbzkbMWbMWbMXbMYbzmbzlbzubztbzsbYBbzrbzpbYBbzobzrbYBbYBbzpbzobYBbYBbzobYBbYBbzpbYBbzxbdZbeaaWTbeabzwbjLbxJbwrbxHbuKbwqbzibeabzybeWbGlbNnbNobNpbNqbNrbNsbNtbNnbBebNubNvbCCbBebBebNwbKObNxbHYbHYbGsbGsbGsbGsbGwbGsbNybJlbNzbGsbNAbHXbgQbHYbNBbNCbNDbHYaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaabDWbNEbNEbNEbNEbNEbNEbNFbFqbNGbNEbMybFqbFqbFqbFqbDWaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaabaaaaaaaaaaabaaaaaaaaabFGbNHbNIbNJbFGbLnbNKaaabNLbImbNMbNNbNObGWbGWbNPbNQbNRbNSbNTbNUbNVbNWbNWbNWbNWbNWbjzbjybNZbjxbjvbOcbjubjtbifbiebihbigbOjbOkbOlbOlbOjbOlbOlbOkbOlbOlbOlbOlbOlbOlbOkbiiaWTbijbikbilbimbinbiobipbiqbirbitbiwbiabFNbGjbeWbGlbidbicbibbOCbODbOEbOFbOGbBebBebOHbBebBebOIbOJbKObnCbOKaabbOLbOMbONbOObOPbOObOQbORbOSbGsbOTbGxbOUbHYbOVbOWbOWbOXaacaacaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOYbFobFobFobFobFobFobFobOZbFrbFqbFqbFqbFqbPabFrbDWaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaabaabaabaabaabaabbFGbFGbFGbFGbFGbPbbFGaaaaaaaaaaaabFIbPcbPdbPebPfbFIbPgbFIblxblwbPjbPkbPkblvbPmbPnbPobPpbPqbPrbPrbPrbltblubPrbPrbPubPqbPvbPrbPrbPrbltbPrbFNbFNbFNbFNbFNbFNbFNbFNbFNbeWaWTbjKbjIbjJbjNbjObjLbjMbjRblsbjPbjQbjAbFNbGjbjBbjDbjCbjFbjEbjHbjGbPObPObPPbPQbPRbPSbnCbPTbnCbOJbKObnCbPUaabbOLbPVbPVbPWbPXbPYbPZbQabQbbGsbQcbGxbzTbHYbHYbHYbHYbHYaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaabDWbJzbJzbJzbJzbJzbJzbQdbFqbJybJzbQebFqbFqbFqbFqbDWaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaabaabaabaabaabaabbFGbFGbFGbFGbFGbPbbFGaaaaaaaaaaaabFIbPcbPdbPebPfbFIbPgbFIblxblwbPjbPkbPkblvbPmbPnbPobPpbPqbPrbPrbPrbltblubPrbPrbPubPqbPvbPrbPrbPrbltbPrbFNbFNbFNbFNbFNbFNbFNbFNbFNbeWaWTbjKbjIbjJbjNbjObjLbjMbjRbjQbjAbjPbixbFNbGjbjBbjDbjCbjFbjEbjHbjGbPObPObPPbPQbPRbPSbnCbPTbnCbOJbKObnCbPUaabbOLbPVbPVbPWbPXbPYbPZbQabQbbGsbQcbGxbzTbHYbHYbHYbHYbHYaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaabDWbJzbJzbJzbJzbJzbJzbQdbFqbJybJzbQebFqbFqbFqbFqbDWaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaabQfbQgbLnbFGbFGbFGbFGbFGbFIbFIbFIbFIbFIbFIbFIbFIbQhbQibfubQkbQlbQmbQnbQnbQobfebfdbfbbfibQtbfgbQvaTSbQxbQybQzbQAbQBbQCbQDbQEbQFaabaaaaaaaaaaaaaaaaaabFNbedbeWaWTbdZbeaaWTbeabdZbeXaWTbeabeabeabeabeabFNbGjbeYbGlbQJbQJbQKbQLbeZbQNbQLbQObQPbQQbQRbQSbnCbQTbOJbKObQUbQVaabbOLbPVbQWbOObQXbOObQYbQZbRabGsbQcbGxbRbbRcbgQaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabbDWbFqbFqbFqbFqbFqbFqbMxbFqbQebFqbFqbFqbFqbFqbDWbDWaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabbRdbhZbRfbRgbRgbRhbRibRjbRkbRlbRmbRnbRobRnbRpbRkbhVbhUbRsbRtbRubRvbRwbRwbRxbRybfdbhSbfibQtbhTbQvbgAbRCbRDbREbRFbRGbRFbRHbRIbRJaabbRKbRKbRKbRKbRKaaabFNbggbgtbOjbOkbOlbOjbgubgxbgvbgwbgubOlbOlbOlbOlbOlbgCbgBbGlbRTbRUbRVbgRbgDbRYbRZbGlbGlbqzbSabqzbqzbqzbSbbScbSdbqzbGsbGsbGsbGsbGsbSebGsbGsbGsbGsbGsbQcbGxbSfbRcbgQaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaabDWbDWbLgbFqbFqbFqbFqbFqbFqbFqbFqbFqbFqbFqbDWbDWaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabSgaaaaabaabbShbShbShbShbShbShbShbShbSibSjbRkbSkbRlbRlbRnbSlbRpbRkbSmbSnbRsbSobSpbQnbSqboFbSrbSsboKboIboHboGbRFbQvbSxbRCbSybSzbSAbSBbSCbSDbSEbSFbnpbSHbSIbSJbSKbRKaaabFNboAboBboCboDboEdSMbSRbnKboybozbSRbSRbSVbSWbSRbSRdOGbeWbGlbGlbGlbGlbGlbGlbSYbGlbGlbSZbnobTbbTcbTdbqzbSabTebTfbqzaTRbThbTibTjbTkbQcbzTbzTbTlbzTbxBbQcbGxbTmbgQbgQbgQaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabbDVbDWbNGbNEbNEbFqbFqbFqbFqbFqbFqbFqbFqbDWbDWaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -10224,8 +10230,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbVFbWBbWCbWDbWEbUrbWFbUrbWGbUrbWHbWIbWJbWKbRkbWLbRlbVQbRlbRlbWMbRkbWNbWObRscgJbPkbQncgIbWRboHcgDbfdcgHbUMcgkcgnbWWchTcinbWZbXabXbbXcbSAbXdbXebXfbnpbSHbXgbXhbXhbRKaabaabbTccgTbTcaaaaabaaadOvchPchFchEdOvaabaaaaaaaabaaaaaaaaabFNciobTccipbFNaaaaabaaaaaaaabaaaaaaaaaaaabXqbXrbXsbXtbXqaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaabXubXubXvbXwbXuaaaaaaaaaaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabbXxbDTbDTbDUbDVbDVbDWbDWbDWbDWbDXaabaabaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabbVFbXybXzbXAbXzbXBbXCbXDbXEbXFbXGbShbLnbIhbRkbXHbRlbXIbXJdQmdQlbRkbXMbSnbRscfWbXOcfNcfMbRIbXRcfLcfybRIbXUcfxcfwbRIcgdbXYbXZbYabYbbRFbYcbYdbYebTPaabbTQbYfbYgbYhbRKaabaaaaaaaaaaaaaaaaaaaaabYibTVcgebYkbYiaabaabaabaabaabaabaaabFNcgjcgibzqbFNaaaaabaaaaaaaabaaaaaaaaaaaabYnbYobYpbYqbYnaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaabXubYrbYsbYtbXuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabbUobUobUobUobUobShbShbShbShbShbShbShbLnbIhbRkbRkbRkbRkbRkbRkbRkbRkbXMbSnbRsclKbYvclLclMclOckZclaclbclgcllclHbQvbRFbYFbYGbYHbYIbYJbRFbYcbYKbYLbYMblybSHbYNbXhbXhbRKaabaaaaaaaaaaabaabaabaaabTVclVclSclRbTVbTVbTVbTVbTVbTVbTVaabbFNbFNbFNbFNbFNaaaaabaaaaaaaabaaaaaaaaaaaabYRbYSbYTbYUbYRaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaabXubYVbYWbYXbXuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbIhbFGbFGbFGbFGbYYbIhbIhbYZbZabZabZabZabZbbZcbZcbZdbZebZebZebZebZebZebZebRjbFGbZfbSnbRscjqbZhcjUbltbPrcebciscirciscjacjnbQvbRFbSybZobZpbZqbZrbRFbYcbYdbZsbTPaabbRKbRKbRKbRKbRKaabaaabTVbTVbTVbTVbTVbTVbTVbZtckDckCbZwcjYckwckpcjXcjYbTVaabaabaabaabaabaabaabbZBaabaabaabaabaabaabaabbZCbWrbZDbZEbZCaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaabXubZFbZGbZHbXuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabbZIbZJbZKbZLbZMbZNbIhbIhbSibZObIhbFGbFGbZPbZQbFGbFGbZRbZSbZQbFGbFGbZTbIhbSjbFGbXMbSnbRscmRbZVbQnbZWbPkbZXbZYbZZcmTbPqcmSbQvbRFbWacacbYHbVZcadcaecafcagcahbXfbnpbSHcaicajcakbRKaabaaabTVcalcnccnbcaobTVcmWcmVckDcmUbZwbWkcnacmZcnpbWkbTVaaaaaaaaaaabaaaaaaaaaaabaaaaaaaabaaaaaaaaaaaabWrcavcawcaxbWraaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaacaycazcaAcaBcaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbIhbFGbFGbFGbFGbYYbIhbIhbYZbZabZabZabZabZbbZcbZcbZdbZebZebZebZebZebZebZebRjbFGbZfbSnbRscjqbZhcjUbltbPrcebciscirciscjacjnbQvbRFbSybZobZpbZqbZrbRFbYcbYdbZsbTPaabbRKbRKbRKbRKbRKaabaaabTVbTVbTVbTVbTVbTVbTVbZtckDcIrbZwcjYckwckpcjXcjYbTVaabaabaabaabaabaabaabbZBaabaabaabaabaabaabaabbZCbWrbZDbZEbZCaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaabXubZFbZGbZHbXuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabbZIbZJbZKbZLbZMbZNbIhbIhbSibZObIhbFGbFGbZPbZQbFGbFGbZRbZSbZQbFGbFGbZTbIhbSjbFGbXMbSnbRscmRbZVbQnbZWbPkbZXbZYbZZcmTbPqcmSbQvbRFbWacacbYHbVZcadcaecafcagcahbXfbnpbSHcaicajcakbRKaabaaabTVcalcnccnbcaobTVcmWcmVckDcIsbZwbWkcnacmZcnpbWkbTVaaaaaaaaaaabaaaaaaaaaaabaaaaaaaabaaaaaaaaaaaabWrcavcawcaxbWraaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaacaycazcaAcaBcaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaabIhbFGbFGbFGbFGcaDcaEcaEcaFcaGcaHcaGaaacaIaaaaaaaaaaaaaaaaaaaaabFGcaJbIhbSjbFGcaKcaLcaMcaNcaOcaPcaQcaRcaScaTcaUbQncmkcmqclWbRFbWacaccaYbVZcadcaZbYcbYdcbabTPaabbTQcbbcbccbdbRKaabaaabTVcmzcmKcmAbZwbTVcmtbZwcmwcmtbZwcbjcmycmxcbYcmQbTVaaaaaaaaaaabaaaaaaaaabWrbWrbWrbWrbWrbWrbWrbWrbWrcbocbpcbqbWraaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaabcbrcbscbraabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaabbFGcbtcaGcaGcbucaGcbvcaGcaGcbwcbxcaGcaGcbycbzcbxcaGcaGcaGcaGcbAcbBcbCcbDbRscbEcbFbQnbQobQnbQnbQnbQnbQncoGcoHcoIbRFbWacacbYHbVZcbJcbKcbLcbMcbNbYMblybSHcbOcajcajbRKaabcsJcbQcsycsxcbTcswcbTcsvcsjcpzcpycpmcoXccbcbTcoKcoWbTVaaaaaaaaaaabaaaaaaaaabWrcceccfccgcchcciccjcckcclccmccnccoccpccqaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaabccrccsccraabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalvalvalvalualualvalualualualUalualualualvalvaaaaaaaabaabaaaaaaaaaaaaaaaaaaaabbIkcbtcctccuccvccwccxccycczccAccBccCcaGccBccDccEccFccFccGcaGccHccIccJccKbRscbEccLccMbQobQnbSqbQnccNcnrcnKcnLcntbRFbWabRFccSbRFccTccUbYcbYdccVbTPaabbRKbRKbRKbRKbRKaabaaabTVcoFblAcoecoEcoCblCdTncozcofcoecnMcbVcoeblCcdfbTVaabaabaabaabaabaabaabbWrcdgcdhcdgcdicdjbYocdkcclcdlcdmcdlbWrbWraaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaabaaacdnaaaaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa From 01d5a0f4d355eb21eea9a7c7c705f7a0dd4bf19f Mon Sep 17 00:00:00 2001 From: fauxtada Date: Tue, 9 Jul 2013 07:02:01 -0700 Subject: [PATCH 54/68] Monkey Mob DMI Changes - Changes Farwa sprite to the one Fox approved of before he stepped down from whitelister of tajs. - Also re-adds in the pun pun sprite since that got removed. --- icons/mob/monkey.dmi | Bin 26121 -> 28385 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/monkey.dmi b/icons/mob/monkey.dmi index c0f5e306f26461b7a8248021de397da686a8ff47..30a7bdb3c575bcef8ff4dee85494987d0496bc2f 100644 GIT binary patch delta 8882 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 delta 6605 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 ax*>JsQK^G^68D3!A0;_e*>Y)<;Qs=H`hr~m From c41abfc9293f32381d0b062724b2d928f953b43f Mon Sep 17 00:00:00 2001 From: fauxtada Date: Tue, 9 Jul 2013 07:02:17 -0700 Subject: [PATCH 55/68] Edits contents of virology biohazard closets to be more virus resistant. Now with robust internals! --- code/game/objects/structures/crates_lockers/closets/l3closet.dm | 2 ++ 1 file changed, 2 insertions(+) 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 From bdaeb2c6fb369418c6dac7d15b5a94a598b334cd Mon Sep 17 00:00:00 2001 From: comma Date: Wed, 10 Jul 2013 21:19:21 +0400 Subject: [PATCH 56/68] Adds fire delay to all weapons (except automatics). For most weapons it is only slightly bigger than clicking own delay, but still can see difference between revolver and SMG. Shotungs do not get special delay because they are slow as they are anyway. Biggest delays go to laser cannon (40 damage per shot) and pulse rifle, ~2 seconds for one shot. --- code/modules/projectiles/gun.dm | 14 ++++++++++++++ code/modules/projectiles/guns/energy/laser.dm | 2 ++ code/modules/projectiles/guns/energy/pulse.dm | 2 +- .../projectiles/guns/projectile/automatic.dm | 2 ++ 4 files changed, 19 insertions(+), 1 deletion(-) 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 From aaa1228e1180ba64e370d8f15ec4bc2b469ea211 Mon Sep 17 00:00:00 2001 From: comma Date: Thu, 11 Jul 2013 02:52:36 +0400 Subject: [PATCH 57/68] Changelog. --- html/changelog.html | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/html/changelog.html b/html/changelog.html index 4e37e06ec6..c20db3b1ce 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,7 +56,13 @@ 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.
  • +
+

05.07.2013

Spamcat updated:

From 08d2e2222081b288bc239ae8ac24e8d0ce95dfd7 Mon Sep 17 00:00:00 2001 From: LordBraindead Date: Sun, 14 Jul 2013 21:20:45 +0200 Subject: [PATCH 58/68] fire update enabled fire to destroy floors and objects also tweaked the behaviour of glass to enable glasslocks against fire also made fire extingiushers stop being useless --- code/ZAS/Fire.dm | 164 ++++++++++++----- code/defines/obj.dm | 12 +- .../effects/decals/Cleanable/scorchmark.dm | 15 ++ code/game/objects/effects/effect_system.dm | 18 +- .../objects/items/stacks/sheets/mineral.dm | 16 ++ .../game/objects/items/weapons/power_cells.dm | 14 +- .../game/objects/items/weapons/tanks/tanks.dm | 14 +- .../structures/stool_bed_chair_nest/chairs.dm | 11 ++ .../structures/stool_bed_chair_nest/stools.dm | 4 + code/game/objects/structures/window.dm | 5 +- code/modules/reagents/reagent_dispenser.dm | 51 +++++- html/changelog.html | 167 ++---------------- icons/effects/scorchmark.dmi | Bin 0 -> 12218 bytes 13 files changed, 264 insertions(+), 227 deletions(-) create mode 100644 code/game/objects/effects/decals/Cleanable/scorchmark.dm create mode 100644 icons/effects/scorchmark.dmi diff --git a/code/ZAS/Fire.dm b/code/ZAS/Fire.dm index 023d60acf0..31c3085f40 100644 --- a/code/ZAS/Fire.dm +++ b/code/ZAS/Fire.dm @@ -30,7 +30,7 @@ turf/simulated/hotspot_expose(exposed_temperature, exposed_volume, soh) var/igniting = 0 var/obj/effect/decal/cleanable/liquid_fuel/liquid = locate() in src - + if(air_contents.check_combustability(liquid)) igniting = 1 @@ -55,28 +55,87 @@ obj icon = 'fire.dmi' icon_state = "1" - layer = TURF_LAYER + layer = TURF_LAYER + 0.2 var firelevel = 10000 //Calculated by gas_mixture.calculate_firelevel() process() . = 1 - + //get location and check if it is in a proper ZAS zone var/turf/simulated/floor/S = loc if(!S.zone) del src - + if(!istype(S)) del src - + var/datum/gas_mixture/air_contents = S.return_air() //get liquid fuels on the ground. var/obj/effect/decal/cleanable/liquid_fuel/liquid = locate() in S //and the volatile stuff from the air var/datum/gas/volatile_fuel/fuel = locate() in air_contents.trace_gases - + //get scorchmarks + var/obj/effect/decal/cleanable/scorchmark/scorch = locate() in S + + //check if it found a scorchmark and add one if there isnt one already + if (!scorch) + scorch = new/obj/effect/decal/cleanable/scorchmark(S,0) + + //try to burn the floor + //initialize the temperature needed for burning the floor + //initialize the fuel gained by burning this floor + //initialize the speed modifier for the floor to catch on fire + var/floor_target_temp = 0 + var/floor_fuel = 1 + var/floor_speed_modifier = 1 + if(S.is_plasteel_floor()) + floor_target_temp = 800 + else if (S.is_light_floor()) + floor_target_temp = 600 + else if (S.is_grass_floor()) + floor_target_temp = 500 + floor_fuel = 2 + floor_speed_modifier = 1.5 + else if (S.is_wood_floor()) + floor_target_temp = 500 + floor_fuel = 3 + floor_speed_modifier = 1.25 + else if (S.is_carpet_floor()) + floor_target_temp = 500 + floor_fuel = 3 + floor_speed_modifier = 1.5 + else + floor_target_temp = 1200 + floor_speed_modifier = 0.8 + + //check if the floor is burnable + if(floor_target_temp > 0) + //calculate a random factor for the equation + var/turf_burn_random = max( min(floor_speed_modifier * 5 * ( ( max(air_contents.temperature - floor_target_temp,0) / floor_target_temp )^2 ), 100), 0) + //check if the random check is passed + if (prob(turf_burn_random)) + //check if the tile has already been damaged once + if (S.burnt || S.broken) + //check if the tile is plating, if not break it and release some fuel, also some randomness to slow down the process + if (!S.is_plating() && prob(10)) + scorch.amount += floor_fuel + S.break_tile_to_plating() + + //damage it and release fuel + else + scorch.amount += floor_fuel + S.burn_tile() + + //now burn some items! + for(var/obj/o in loc) + if(o.fire_min_burn_temp) + var/obj_burn_random = max( min(o.fire_burn_multiplier * 5 * ( ( max(air_contents.temperature - o.fire_min_burn_temp,0) / o.fire_min_burn_temp )^2 ), 100), 0) + if(prob(obj_burn_random)) + scorch.amount += fire_fuel_worth + o.fire_burn() + //since the air is processed in fractions, we need to make sure not to have any minuscle residue or //the amount of moles might get to low for some functions to catch them and thus result in wonky behaviour if(air_contents.oxygen < 0.001) @@ -86,29 +145,29 @@ obj if(fuel) if(fuel.moles < 0.001) air_contents.trace_gases.Remove(fuel) - + //check if there is something to combust - if(!air_contents.check_combustability(liquid)) + if(!air_contents.check_combustability(liquid,scorch)) del src - + //get a firelevel and set the icon - firelevel = air_contents.calculate_firelevel(liquid) - - if(firelevel > 6) + firelevel = air_contents.calculate_firelevel(liquid,scorch) + + if(firelevel > 3) icon_state = "3" SetLuminosity(7) - else if(firelevel > 2.5) + else if(firelevel > 2) icon_state = "2" SetLuminosity(5) else icon_state = "1" SetLuminosity(3) - + //im not sure how to implement a version that works for every creature so for now monkeys are firesafe for(var/mob/living/carbon/human/M in loc) M.FireBurn(firelevel, air_contents.temperature, air_contents.return_pressure() ) //Burn the humans! - + //spread! for(var/direction in cardinal) if(S.air_check_directions&direction) //Grab all valid bordering tiles @@ -118,7 +177,7 @@ obj if(istype(enemy_tile)) //If extinguisher mist passed over the turf it's trying to spread to, don't spread and //reduce firelevel. - if(enemy_tile.fire_protection > world.time-30) + if(prob( 100 * (1 - min( max( ( (world.time - 30) - enemy_tile.fire_protection ), 0 ) / 30, 1) ) ) ) firelevel -= 1.5 continue @@ -126,29 +185,29 @@ obj if(!(locate(/obj/fire) in enemy_tile)) if( prob( 50 + 50 * (firelevel/vsc.fire_firelevel_multiplier) ) && S.CanPass(null, enemy_tile, 0,0) && enemy_tile.CanPass(null, S, 0,0)) new/obj/fire(enemy_tile,firelevel) - + //seperate part of the present gas //this is done to prevent the fire burning all gases in a single pass var/datum/gas_mixture/flow = air_contents.remove_ratio(vsc.fire_consuption_rate) - + ///////////////////////////////// FLOW HAS BEEN CREATED /// DONT DELETE THE FIRE UNTIL IT IS MERGED BACK OR YOU WILL DELETE AIR /////////////////////////////////////////////// - + if(flow) - if(flow.check_combustability(liquid)) + if(flow.check_combustability(liquid,scorch)) //Ensure flow temperature is higher than minimum fire temperatures. //this creates some energy ex nihilo but is necessary to get a fire started //lets just pretend this energy comes from the ignition source and dont mention this again //flow.temperature = max(PLASMA_MINIMUM_BURN_TEMPERATURE+0.1,flow.temperature) - + //burn baby burn! - flow.zburn(liquid,1) - + flow.zburn(liquid,scorch,1) + //merge the air back S.assume_air(flow) ///////////////////////////////// FLOW HAS BEEN REMERGED /// feel free to delete the fire again from here on ////////////////////////////////////////////////////////////////// - + New(newLoc,fl) ..() @@ -178,15 +237,15 @@ turf/simulated/apply_fire_protection() fire_protection = world.time -datum/gas_mixture/proc/zburn(obj/effect/decal/cleanable/liquid_fuel/liquid,force_burn) +datum/gas_mixture/proc/zburn(obj/effect/decal/cleanable/liquid_fuel/liquid, obj/effect/decal/cleanable/scorchmark/scorch, force_burn) var/value = 0 - - if((temperature > PLASMA_MINIMUM_BURN_TEMPERATURE || force_burn) && check_combustability(liquid) ) - var/total_fuel = 0 + + if((temperature > PLASMA_MINIMUM_BURN_TEMPERATURE || force_burn) && check_combustability(liquid,scorch) ) + var/total_fuel = 0 var/datum/gas/volatile_fuel/fuel = locate() in trace_gases total_fuel += toxins - + if(fuel) //Volatile Fuel total_fuel += fuel.moles @@ -198,8 +257,12 @@ datum/gas_mixture/proc/zburn(obj/effect/decal/cleanable/liquid_fuel/liquid,force else total_fuel += liquid.amount + if(scorch) + //fuel created by destroying objects and turfs + total_fuel += scorch.amount + //Calculate the firelevel. - var/firelevel = calculate_firelevel(liquid) + var/firelevel = calculate_firelevel(liquid, scorch) //get the current inner energy of the gas mix //this must be taken here to prevent the addition or deletion of energy by a changing heat capacity @@ -207,7 +270,7 @@ datum/gas_mixture/proc/zburn(obj/effect/decal/cleanable/liquid_fuel/liquid,force //determine the amount of oxygen used var/total_oxygen = min(oxygen, 2 * total_fuel) - + //determine the amount of fuel actually used var/used_fuel_ratio = min(oxygen / 2 , total_fuel) / total_fuel total_fuel = total_fuel * used_fuel_ratio @@ -232,33 +295,39 @@ datum/gas_mixture/proc/zburn(obj/effect/decal/cleanable/liquid_fuel/liquid,force liquid.amount -= liquid.amount * used_fuel_ratio * used_reactants_ratio if(liquid.amount <= 0) del liquid + if(scorch) + scorch.amount -= min(scorch.amount, scorch.amount * used_fuel_ratio * used_reactants_ratio) + //calculate the energy produced by the reaction and then set the new temperature of the mix temperature = (starting_energy + vsc.fire_fuel_energy_release * total_fuel) / heat_capacity() - + update_values() value = total_reactants * used_reactants_ratio return value -datum/gas_mixture/proc/check_combustability(obj/effect/decal/cleanable/liquid_fuel/liquid) +datum/gas_mixture/proc/check_combustability(obj/effect/decal/cleanable/liquid_fuel/liquid, obj/effect/decal/cleanable/scorchmark/scorch) //this check comes up very often and is thus centralized here to ease adding stuff - - var/datum/gas/volatile_fuel/fuel = locate() in trace_gases + + var/datum/gas/volatile_fuel/fuel = locate() in trace_gases var/value = 0 - + if(oxygen && (toxins || fuel || liquid)) value = 1 - + else if (scorch) + if (oxygen && scorch.amount > 0) + value = 1 + return value -datum/gas_mixture/proc/calculate_firelevel(obj/effect/decal/cleanable/liquid_fuel/liquid) +datum/gas_mixture/proc/calculate_firelevel(obj/effect/decal/cleanable/liquid_fuel/liquid, obj/effect/decal/cleanable/scorchmark/scorch) //Calculates the firelevel based on one equation instead of having to do this multiple times in different areas. - + var/datum/gas/volatile_fuel/fuel = locate() in trace_gases var/total_fuel = 0 var/firelevel = 0 - + if(check_combustability(liquid)) - + total_fuel += toxins if(liquid) @@ -267,17 +336,20 @@ datum/gas_mixture/proc/calculate_firelevel(obj/effect/decal/cleanable/liquid_fue if(fuel) total_fuel += fuel.moles + if(scorch) + total_fuel += scorch.amount + var/total_combustables = (total_fuel + oxygen) - + if(total_fuel > 0 && oxygen > 0) - + //slows down the burning when the concentration of the reactants is low var/dampening_multiplier = total_combustables / (total_combustables + nitrogen + carbon_dioxide) //calculates how close the mixture of the reactants is to the optimum var/mix_multiplier = 1 / (1 + (5 * ((oxygen / total_combustables) ^2))) //toss everything together firelevel = vsc.fire_firelevel_multiplier * mix_multiplier * dampening_multiplier - + return max( 0, firelevel) @@ -323,6 +395,4 @@ datum/gas_mixture/proc/calculate_firelevel(obj/effect/decal/cleanable/liquid_fue apply_damage(0.6*mx*legs_exposure, BURN, "l_leg", 0, 0, "Fire") apply_damage(0.6*mx*legs_exposure, BURN, "r_leg", 0, 0, "Fire") apply_damage(0.4*mx*arms_exposure, BURN, "l_arm", 0, 0, "Fire") - apply_damage(0.4*mx*arms_exposure, BURN, "r_arm", 0, 0, "Fire") - - //flash_pain() + apply_damage(0.4*mx*arms_exposure, BURN, "r_arm", 0, 0, "Fire") \ No newline at end of file diff --git a/code/defines/obj.dm b/code/defines/obj.dm index 661f4c43b3..116136bfaf 100644 --- a/code/defines/obj.dm +++ b/code/defines/obj.dm @@ -80,7 +80,17 @@ var/name = t.fields["name"] var/rank = t.fields["rank"] var/real_rank = t.fields["real_rank"] - isactive[name] = t.fields["p_stat"] + + var/active = 0 + for(var/mob/M in player_list) if(M.name == name) + // For dead ones, have a chance to get their status wrong + if(M.stat == 2) + active = M.x % 2 // Should be good enough, avoids their status flipping constantly + break + else if(M.client && M.client.inactivity <= 10 * 60 * 10) + active = 1 + break + isactive[name] = active ? "Active" : "SSD" //world << "[name]: [rank]" diff --git a/code/game/objects/effects/decals/Cleanable/scorchmark.dm b/code/game/objects/effects/decals/Cleanable/scorchmark.dm new file mode 100644 index 0000000000..9274708d6e --- /dev/null +++ b/code/game/objects/effects/decals/Cleanable/scorchmark.dm @@ -0,0 +1,15 @@ +obj/effect/decal/cleanable/scorchmark + //this is used as an additional visual result of fire and as a reagent holder for fuel created by burning of turfs and items. + icon = 'icons/effects/scorchmark.dmi' + name = "Soot" + icon_state = "1" + layer = TURF_LAYER+0.1 + anchored = 1 + var/amount = 0 //starts always empty and is filled by procs called by fire + + New(newLoc,start_amount=0) + ..() + + icon_state = pick("1","2","3","4","5","6","7","8","9") + dir = pick(cardinal) + amount = start_amount \ No newline at end of file diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index d3e7144297..309d667553 100644 --- a/code/game/objects/effects/effect_system.dm +++ b/code/game/objects/effects/effect_system.dm @@ -39,25 +39,25 @@ would spawn and follow the beaker, even if it is carried or thrown. /obj/effect/effect/water/New() ..() - //var/turf/T = src.loc - //if (istype(T, /turf)) - // T.firelevel = 0 //TODO: FIX + var/turf/simulated/floor/T = src.loc + if (istype(T, /turf/simulated/floor)) + T.fire_protection = world.time spawn( 70 ) delete() return return /obj/effect/effect/water/Del() - //var/turf/T = src.loc - //if (istype(T, /turf)) - // T.firelevel = 0 //TODO: FIX + var/turf/simulated/floor/T = src.loc + if (istype(T, /turf/simulated/floor)) + T.fire_protection = world.time ..() return /obj/effect/effect/water/Move(turf/newloc) - //var/turf/T = src.loc - //if (istype(T, /turf)) - // T.firelevel = 0 //TODO: FIX + var/turf/simulated/floor/T = src.loc + if (istype(T, /turf/simulated/floor)) + T.fire_protection = world.time if (--src.life < 1) //SN src = null delete() diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 3671b6ce08..7718ea2c11 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -103,6 +103,9 @@ var/global/list/datum/stack_recipe/uranium_recipes = list ( \ origin_tech = "plasmatech=2;materials=2" perunit = 2000 sheettype = "plasma" + fire_min_burn_temp = 500 + fire_burn_multiplier = 3 //made of burnium + fire_fuel_worth = 0 var/global/list/datum/stack_recipe/plasma_recipes = list ( \ new/datum/stack_recipe("plasma door", /obj/structure/mineral_door/transparent/plasma, 10, one_per_turf = 1, on_floor = 1), \ @@ -114,6 +117,18 @@ var/global/list/datum/stack_recipe/plasma_recipes = list ( \ pixel_y = rand(0,4)-4 ..() +/obj/item/stack/sheet/mineral/plasma/fire_burn() + //get location and check if it is in a proper ZAS zone + var/turf/simulated/floor/S = loc + if(S.zone) + var/datum/gas_mixture/air_contents = S.return_air() + if(air_contents) + air_contents.toxins += 20 + air_contents.update_values() + amount -= 1 + if(amount <= 0) + del src + /obj/item/stack/sheet/mineral/plastic name = "Plastic" icon_state = "sheet-plastic" @@ -124,6 +139,7 @@ var/global/list/datum/stack_recipe/plasma_recipes = list ( \ throw_range = 3 origin_tech = "materials=3" perunit = 2000 + sheettype = "plastic" var/global/list/datum/stack_recipe/plastic_recipes = list ( \ new/datum/stack_recipe("plastic crate", /obj/structure/closet/pcrate, 10, one_per_turf = 1, on_floor = 1), \ diff --git a/code/game/objects/items/weapons/power_cells.dm b/code/game/objects/items/weapons/power_cells.dm index 472e28852f..89078970f3 100644 --- a/code/game/objects/items/weapons/power_cells.dm +++ b/code/game/objects/items/weapons/power_cells.dm @@ -20,6 +20,10 @@ var/construction_cost = list("metal"=750,"glass"=75) var/construction_time=100 + fire_min_burn_temp = 1000 + fire_burn_multiplier = 0.75 + fire_fuel_worth = 0 + suicide_act(mob/user) viewers(user) << "\red [user] is licking the electrodes of the [src.name]! It looks like \he's trying to commit suicide." return (FIRELOSS) @@ -111,4 +115,12 @@ maxcharge = 10000 maxcharge = 10000 m_amt = 0 - g_amt = 0 \ No newline at end of file + g_amt = 0 + +/obj/item/weapon/cell/fire_burn() + viewers(src) << "\red Charge: [src.charge]" + var/radius = round( (sqrt(charge)/30)+0.5, 1 ) + viewers(src) << "\red Radius: [radius]" + if (radius >= 1) + explosion(src.loc,0,0,radius) + ..() \ No newline at end of file diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index 143ff13a04..ea3f42247d 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -16,6 +16,11 @@ var/integrity = 3 var/volume = 70 + m_amt = 3750 + fire_min_burn_temp = 800 + fire_burn_multiplier = 0.75 + fire_fuel_worth = 0 + /obj/item/weapon/tank/New() ..() @@ -261,4 +266,11 @@ integrity-- else if(integrity < 3) - integrity++ \ No newline at end of file + integrity++ + +/obj/item/weapon/tank/fire_burn() + //get location and check if it is in a proper ZAS zone + var/turf/simulated/floor/S = loc + if(S.zone) + S.assume_air(air_contents) + ..() \ No newline at end of file diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm index 762888a4b4..6e421c9443 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -76,11 +76,19 @@ icon_state = "wooden_chair" name = "wooden chair" desc = "Old is never too old to not be in fashion." + fire_min_burn_temp = 500 + fire_burn_multiplier = 1.25 + fire_fuel_worth = 5 + m_amt = 0 /obj/structure/stool/bed/chair/wood/wings icon_state = "wooden_chair_wings" name = "wooden chair" desc = "Old is never too old to not be in fashion." + fire_min_burn_temp = 500 + fire_burn_multiplier = 1.25 + fire_fuel_worth = 5 + m_amt = 0 /obj/structure/stool/bed/chair/wood/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W, /obj/item/weapon/wrench)) @@ -93,6 +101,9 @@ /obj/structure/stool/bed/chair/comfy name = "comfy chair" desc = "It looks comfy." + fire_min_burn_temp = 500 + fire_burn_multiplier = 1.25 + fire_fuel_worth = 4 /obj/structure/stool/bed/chair/comfy/brown icon_state = "comfychair_brown" diff --git a/code/game/objects/structures/stool_bed_chair_nest/stools.dm b/code/game/objects/structures/stool_bed_chair_nest/stools.dm index ab7a55e1da..fcd404f165 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/stools.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/stools.dm @@ -6,6 +6,10 @@ anchored = 1.0 flags = FPRINT pressure_resistance = 15 + m_amt = 3750 + fire_min_burn_temp = 600 + fire_burn_multiplier = 1 + fire_fuel_worth = 2 /obj/structure/stool/ex_act(severity) switch(severity) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 2879122972..55a00acfdc 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -373,8 +373,9 @@ return /obj/structure/window/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) - if(exposed_temperature > T0C + 800) - hit(round(exposed_volume / 100), 0) + //Since glasslocks are the only thing you can do to prevent spreading atmos issues, this was disabled for the time being + //if(exposed_temperature > T0C + 800) + // hit(round(exposed_volume / 100), 0) ..() diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 93cb235649..4762b3212f 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -1,5 +1,3 @@ - - /obj/structure/reagent_dispensers name = "Dispenser" desc = "..." @@ -66,12 +64,6 @@ new /obj/effect/effect/water(src.loc) del(src) - - - - - - //Dispensers /obj/structure/reagent_dispensers/watertank name = "watertank" @@ -79,10 +71,39 @@ icon = 'icons/obj/objects.dmi' icon_state = "watertank" amount_per_transfer_from_this = 10 + + m_amt = 7500 + g_amt = 3750 + fire_min_burn_temp = 800 + fire_burn_multiplier = 0.75 + fire_fuel_worth = 0 + New() ..() reagents.add_reagent("water",1000) +/obj/structure/reagent_dispensers/watertank/fire_burn() + src.reagents.update_total() + var/number_of_gusts = src.reagents.total_volume / 50 + for(var/a=0, a < number_of_gusts , a++) + var/obj/effect/effect/water/W = new /obj/effect/effect/water( get_turf(src) ) + var/turf/my_target = get_step(get_step(get_step(get_step(get_step(get_turf(src),pick(cardinal)),pick(cardinal)),pick(cardinal)),pick(cardinal)),pick(cardinal)) + var/datum/reagents/R = new/datum/reagents(50) + if(!W) return + W.reagents = R + R.my_atom = W + if(!W || !src) return + src.reagents.trans_to(W,50) + for(var/b=0, b<5, b++) + step_towards(W,my_target) + if(!W) return + W.reagents.reaction(get_turf(W)) + for(var/atom/atm in get_turf(W)) + if(!W) return + W.reagents.reaction(atm) + if(W.loc == my_target) break + ..() + /obj/structure/reagent_dispensers/fueltank name = "fueltank" desc = "A fueltank" @@ -91,6 +112,13 @@ amount_per_transfer_from_this = 10 var/modded = 0 var/obj/item/device/assembly_holder/rig = null + + m_amt = 7500 + g_amt = 3750 + fire_min_burn_temp = 800 + fire_burn_multiplier = 1 + fire_fuel_worth = 0 + New() ..() reagents.add_reagent("fuel",1000) @@ -164,6 +192,11 @@ if(src) del(src) +/obj/structure/reagent_dispensers/fueltank/fire_burn() + src.reagents.update_total() + new/obj/effect/decal/cleanable/liquid_fuel(src.loc, src.reagents.total_volume) + ..() + /obj/structure/reagent_dispensers/peppertank name = "Pepper Spray Refiller" desc = "Refill pepper spray canisters." @@ -214,4 +247,4 @@ New() ..() - reagents.add_reagent("virusfood", 1000) + reagents.add_reagent("virusfood", 1000) diff --git a/html/changelog.html b/html/changelog.html index 4fdd862029..9e59bcd6e9 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -40,7 +40,7 @@ Header Section Code: Abi79, Aryn, Cael_Aislinn, Chinsky, cib, CompactNinja, DopeGhoti, Erthilo, Hawk_v3, Head, Ispil, Lexusjjss, Melonstorm, Miniature, Mloc, NerdyBoy1104, SkyMarshal, Spectre, Strumpetplaya, Sunfall, Tastyfish, Uristqwerty
- Sprites: Apple_Master, Arcalane, Chinsky, CompactNinja, Deus Dactyl, Erthilo, Flashkirby, Miniature, Searif, Xenone, faux
+ Sprites: Apple_Master, Arcalane, Chinsky, CompactNinja, Deus Dactyl, Erthilo, Flashkirby, Miniature, Searif, Xenone
Sounds: Aryn
Thanks To: /tg/ station, Goonstation, Animus Station, Daedalus, and original Spacestation 13 devs. Skibiliano for the IRC bot. @@ -56,97 +56,32 @@ 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:

+

14/07/2013

+

Lord Braindead 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.
  • +
  • Added fire damaging floors and certain objects
  • +
  • fixed fire extingiushers being next to worthless against fire
  • +
  • made glass locks work against fire
-

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.
  • -
-
-
-

03.07.2013

-

Segrain updated:

-
    -
  • Security and medical cyborgs can use their HUDs to access records.
  • -
-
-
-

June 28th, 2013

-

Segrain updated:

-
    -
  • AIs are now able to examine what they see.
  • -
-
-
-

June 27th, 2013

+

27.06.2013

Segrain updated:

  • ID cards properly setup bloodtype, DNA and fingerprints again.
+
-

June 26th, 2013

-

Whitellama updated:

-
    -
  • One-antag rounds (like wizard/ninja) no longer end automatically upon death
  • -
  • Space ninja has been implemented as a voteable gamemode
  • -
  • Space ninja spawn landmarks have been implemented (but not yet placed on the map), still spawn at carps-pawns instead. (The code will warn you about this and ask you to report it, it's a known issue.)
  • -
  • Five new space ninja directives have been added, old directives have been reworded to be less harsh
  • -
  • Space ninjas have been given their own list as antagonists, and are no longer bundled up with traitors
  • -
  • Space ninjas with a "steal a functional AI" objective will now succeed by downloading one into their suits
  • -
  • Space ninja suits' exploding on death has been nerfed, so as not to cause breaches
  • -
  • A few space ninja titles/names have been added and removed to be slightly more believable
  • -
  • The antagonist selector no longer chooses jobbanned players when it runs out of willing options
  • -
-
-
-

June 26th, 2013

+

26.06.2013

Segrain updated:

  • Autopsy scanner properly displays time of wound infliction and death.
  • Autopsy scanner properly displays wounds by projectile weapons.
-
-

June 23rd, 2013

-

Segrain updated:

-
    -
  • Airlocks of various models can be constructed again.
  • -
-
- -
-

June 23rd, 2013

-

faux updated:

-
    -
  • There has been a complete medbay renovation spearheaded by Vetinarix. http://baystation12.net/forums/viewtopic.php?f=20&t=7847 <-- Please put any commentary good or bad, here.
  • -
  • Some maintenance doors within RnD and Medbay have had their accesses changed. Maintenance doors in the joint areas (leading to the research shuttle, virology, and xenobiology) are now zero access. Which means anyone in those joints can enter the maintenance tunnels. This was done to add additional evacuation locations during radiation storms. Additional maintenance doors were added to the tunnels in these areas to prevent docs and scientists from running about.
  • -
  • Starboard emergency storage isn't gone now, it's simply located in the escape wing.
  • -
  • An engineering training room has been added to engineering. This location was previously where surgery was located. If you are new to engineering or need to brush up on your skills, please use this area for testing.
  • -
-

June 22nd 2013

@@ -157,69 +92,6 @@ should be listed in the changelog upon commit though. Thanks. -->
-
-

21.06.2013

-

Jupotter updated:

-
    -
  • Fix the robotiscist preview in the char setupe screen
  • -
-
- -
-

18.06.2013

-

Segrain updated:

-
    -
  • Fixed some bugs in windoor construction.
  • -
  • Secure windoors are made with rods again.
  • -
  • Windoors drop their electronics when broken. Emagged windoors can have theirs removed by crowbar.
  • -
  • Airlock electronics can be configured to make door open for any single access on it instead of all of them.
  • -
  • Cyborgs can preview their icons before choosing.
  • -
-
- -
-

13.06.2013

-

Kilakk updated:

-
    -
  • Added the Xenobiologist job. Has access to the research hallway and to xenobiology.
  • -
  • Removed Xenobiology access from Scientists.
  • -
  • Removed the Xenobiologist alternate title from Scientists.
  • -
  • Added "Xenoarchaeology" to the RD, Scientists, and to the ID computer.
  • -
  • Changed the Research Outpost doors to use "Xenoarchaeology" access.
  • -
-
- -
-

6-13-13

-

Asanadas updated:

-
    -
  • Added a whimsical suit to the head of personnel's secret clothing locker.
  • -
-
- -
-

12/06/2013

-

Zuhayr updated:

-
    -
  • Added pneumatic cannon and harpoons.
  • -
  • Added embedded projectiles. Bullets and thrown weapons may stick in targets. Throwing them by hand won't make them stick, firing them from a cannon might. Implant removal surgery will get rid of shrapnel and stuck items.
  • -
-
- - -
-

6/11/13

-

Meyar updated:

-
    -
  • Fixes a security door with a firedoor ontop of it.
  • -
  • Fixed a typo relating to the admin Select Equipment Verb. (It's RESPONSE team not RESCUE team)
  • -
  • ERT are now automated, from their spawn to their shuttle. Admin intervention no longer required! (Getting to the mechs still requires admin permission generally)
  • -
  • Added flashlights to compensate for the weakened PDA lights
  • -
  • ERT Uniforms updated to be in line with Centcom uniforms. No more turtlenecks, no sir.
  • -
-
- -

09.06.2013

Segrain updated:

@@ -269,25 +141,6 @@ should be listed in the changelog upon commit though. Thanks. -->
-
-

5.06.2013

-

Chinsky updated:

-
    -
  • Load bearing equipment - webbings and vests for engineers and sec. Attach to jumpsuit, use 'Look in storage' verb (object tab) to open.
  • -
-
- - - - - - - - - - - -

1.06.2013

Chinsky updated:

diff --git a/icons/effects/scorchmark.dmi b/icons/effects/scorchmark.dmi new file mode 100644 index 0000000000000000000000000000000000000000..eb4e21cc12f927e341afa3d6a0f63190b655edef GIT binary patch literal 12218 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 GUP!_)>sfL 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 IM6N<$f;@CJi~s-t literal 0 HcmV?d00001 From 53c73f6b85dc3c9c3030c2cf75814e1cd4f273fc Mon Sep 17 00:00:00 2001 From: LordBraindead Date: Sun, 14 Jul 2013 21:22:09 +0200 Subject: [PATCH 59/68] Update power_cells.dm derped a debug message into the commit --- code/game/objects/items/weapons/power_cells.dm | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/code/game/objects/items/weapons/power_cells.dm b/code/game/objects/items/weapons/power_cells.dm index 89078970f3..0a1cda9b2b 100644 --- a/code/game/objects/items/weapons/power_cells.dm +++ b/code/game/objects/items/weapons/power_cells.dm @@ -118,9 +118,7 @@ g_amt = 0 /obj/item/weapon/cell/fire_burn() - viewers(src) << "\red Charge: [src.charge]" var/radius = round( (sqrt(charge)/30)+0.5, 1 ) - viewers(src) << "\red Radius: [radius]" if (radius >= 1) explosion(src.loc,0,0,radius) - ..() \ No newline at end of file + ..() From f172e085b18f9ab1fe67464f90b772f96f588150 Mon Sep 17 00:00:00 2001 From: LordBraindead Date: Sun, 14 Jul 2013 21:40:32 +0200 Subject: [PATCH 60/68] Update changelog.html underped the changelog too --- html/changelog.html | 166 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 161 insertions(+), 5 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 9e59bcd6e9..afa541edf7 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -40,7 +40,7 @@ Header Section Code: Abi79, Aryn, Cael_Aislinn, Chinsky, cib, CompactNinja, DopeGhoti, Erthilo, Hawk_v3, Head, Ispil, Lexusjjss, Melonstorm, Miniature, Mloc, NerdyBoy1104, SkyMarshal, Spectre, Strumpetplaya, Sunfall, Tastyfish, Uristqwerty
- Sprites: Apple_Master, Arcalane, Chinsky, CompactNinja, Deus Dactyl, Erthilo, Flashkirby, Miniature, Searif, Xenone
+ Sprites: Apple_Master, Arcalane, Chinsky, CompactNinja, Deus Dactyl, Erthilo, Flashkirby, Miniature, Searif, Xenone, faux
Sounds: Aryn
Thanks To: /tg/ station, Goonstation, Animus Station, Daedalus, and original Spacestation 13 devs. Skibiliano for the IRC bot. @@ -56,7 +56,6 @@ 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. --> -

14/07/2013

Lord Braindead updated:

@@ -67,21 +66,96 @@ should be listed in the changelog upon commit though. Thanks. -->
-

27.06.2013

+

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.
  • +
+
+
+

03.07.2013

+

Segrain updated:

+
    +
  • Security and medical cyborgs can use their HUDs to access records.
  • +
+
+
+

June 28th, 2013

+

Segrain updated:

+
    +
  • AIs are now able to examine what they see.
  • +
+
+
+

June 27th, 2013

Segrain updated:

  • ID cards properly setup bloodtype, DNA and fingerprints again.
-
-

26.06.2013

+

June 26th, 2013

+

Whitellama updated:

+
    +
  • One-antag rounds (like wizard/ninja) no longer end automatically upon death
  • +
  • Space ninja has been implemented as a voteable gamemode
  • +
  • Space ninja spawn landmarks have been implemented (but not yet placed on the map), still spawn at carps-pawns instead. (The code will warn you about this and ask you to report it, it's a known issue.)
  • +
  • Five new space ninja directives have been added, old directives have been reworded to be less harsh
  • +
  • Space ninjas have been given their own list as antagonists, and are no longer bundled up with traitors
  • +
  • Space ninjas with a "steal a functional AI" objective will now succeed by downloading one into their suits
  • +
  • Space ninja suits' exploding on death has been nerfed, so as not to cause breaches
  • +
  • A few space ninja titles/names have been added and removed to be slightly more believable
  • +
  • The antagonist selector no longer chooses jobbanned players when it runs out of willing options
  • +
+
+
+

June 26th, 2013

Segrain updated:

  • Autopsy scanner properly displays time of wound infliction and death.
  • Autopsy scanner properly displays wounds by projectile weapons.
+
+

June 23rd, 2013

+

Segrain updated:

+
    +
  • Airlocks of various models can be constructed again.
  • +
+
+ +
+

June 23rd, 2013

+

faux updated:

+
    +
  • There has been a complete medbay renovation spearheaded by Vetinarix. http://baystation12.net/forums/viewtopic.php?f=20&t=7847 <-- Please put any commentary good or bad, here.
  • +
  • Some maintenance doors within RnD and Medbay have had their accesses changed. Maintenance doors in the joint areas (leading to the research shuttle, virology, and xenobiology) are now zero access. Which means anyone in those joints can enter the maintenance tunnels. This was done to add additional evacuation locations during radiation storms. Additional maintenance doors were added to the tunnels in these areas to prevent docs and scientists from running about.
  • +
  • Starboard emergency storage isn't gone now, it's simply located in the escape wing.
  • +
  • An engineering training room has been added to engineering. This location was previously where surgery was located. If you are new to engineering or need to brush up on your skills, please use this area for testing.
  • +
+

June 22nd 2013

@@ -92,6 +166,69 @@ should be listed in the changelog upon commit though. Thanks. -->
+
+

21.06.2013

+

Jupotter updated:

+
    +
  • Fix the robotiscist preview in the char setupe screen
  • +
+
+ +
+

18.06.2013

+

Segrain updated:

+
    +
  • Fixed some bugs in windoor construction.
  • +
  • Secure windoors are made with rods again.
  • +
  • Windoors drop their electronics when broken. Emagged windoors can have theirs removed by crowbar.
  • +
  • Airlock electronics can be configured to make door open for any single access on it instead of all of them.
  • +
  • Cyborgs can preview their icons before choosing.
  • +
+
+ +
+

13.06.2013

+

Kilakk updated:

+
    +
  • Added the Xenobiologist job. Has access to the research hallway and to xenobiology.
  • +
  • Removed Xenobiology access from Scientists.
  • +
  • Removed the Xenobiologist alternate title from Scientists.
  • +
  • Added "Xenoarchaeology" to the RD, Scientists, and to the ID computer.
  • +
  • Changed the Research Outpost doors to use "Xenoarchaeology" access.
  • +
+
+ +
+

6-13-13

+

Asanadas updated:

+
    +
  • Added a whimsical suit to the head of personnel's secret clothing locker.
  • +
+
+ +
+

12/06/2013

+

Zuhayr updated:

+
    +
  • Added pneumatic cannon and harpoons.
  • +
  • Added embedded projectiles. Bullets and thrown weapons may stick in targets. Throwing them by hand won't make them stick, firing them from a cannon might. Implant removal surgery will get rid of shrapnel and stuck items.
  • +
+
+ + +
+

6/11/13

+

Meyar updated:

+
    +
  • Fixes a security door with a firedoor ontop of it.
  • +
  • Fixed a typo relating to the admin Select Equipment Verb. (It's RESPONSE team not RESCUE team)
  • +
  • ERT are now automated, from their spawn to their shuttle. Admin intervention no longer required! (Getting to the mechs still requires admin permission generally)
  • +
  • Added flashlights to compensate for the weakened PDA lights
  • +
  • ERT Uniforms updated to be in line with Centcom uniforms. No more turtlenecks, no sir.
  • +
+
+ +

09.06.2013

Segrain updated:

@@ -141,6 +278,25 @@ should be listed in the changelog upon commit though. Thanks. -->
+
+

5.06.2013

+

Chinsky updated:

+
    +
  • Load bearing equipment - webbings and vests for engineers and sec. Attach to jumpsuit, use 'Look in storage' verb (object tab) to open.
  • +
+
+ + + + + + + + + + + +

1.06.2013

Chinsky updated:

From 5d63943d0742239b353eabcb4eb46c07078c98f4 Mon Sep 17 00:00:00 2001 From: LordBraindead Date: Sun, 14 Jul 2013 21:50:48 +0200 Subject: [PATCH 61/68] Update mineral.dm removed sheettpye = "plastic" again because it snuck back in after being removed already --- code/game/objects/items/stacks/sheets/mineral.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 7718ea2c11..f559c7f830 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -139,7 +139,6 @@ var/global/list/datum/stack_recipe/plasma_recipes = list ( \ throw_range = 3 origin_tech = "materials=3" perunit = 2000 - sheettype = "plastic" var/global/list/datum/stack_recipe/plastic_recipes = list ( \ new/datum/stack_recipe("plastic crate", /obj/structure/closet/pcrate, 10, one_per_turf = 1, on_floor = 1), \ @@ -269,4 +268,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 From adc3c14779faaa4c609345f2d0e1e1989fed1013 Mon Sep 17 00:00:00 2001 From: Mloc-Argent Date: Sat, 20 Jul 2013 18:38:00 +0100 Subject: [PATCH 62/68] Revert #3316 from BEF due to compile errors and (assumed) missing files. Signed-off-by: Mloc-Argent --- code/ZAS/Fire.dm | 164 +++++------------ code/defines/obj.dm | 12 +- .../effects/decals/Cleanable/scorchmark.dm | 15 -- code/game/objects/effects/effect_system.dm | 18 +- .../objects/items/stacks/sheets/mineral.dm | 18 +- .../game/objects/items/weapons/power_cells.dm | 8 +- .../game/objects/items/weapons/tanks/tanks.dm | 14 +- .../structures/stool_bed_chair_nest/chairs.dm | 11 -- .../structures/stool_bed_chair_nest/stools.dm | 4 - code/game/objects/structures/window.dm | 5 +- code/modules/reagents/reagent_dispenser.dm | 51 +----- html/changelog.html | 166 +----------------- icons/effects/scorchmark.dmi | Bin 12218 -> 0 bytes 13 files changed, 79 insertions(+), 407 deletions(-) delete mode 100644 code/game/objects/effects/decals/Cleanable/scorchmark.dm delete mode 100644 icons/effects/scorchmark.dmi diff --git a/code/ZAS/Fire.dm b/code/ZAS/Fire.dm index 31c3085f40..023d60acf0 100644 --- a/code/ZAS/Fire.dm +++ b/code/ZAS/Fire.dm @@ -30,7 +30,7 @@ turf/simulated/hotspot_expose(exposed_temperature, exposed_volume, soh) var/igniting = 0 var/obj/effect/decal/cleanable/liquid_fuel/liquid = locate() in src - + if(air_contents.check_combustability(liquid)) igniting = 1 @@ -55,87 +55,28 @@ obj icon = 'fire.dmi' icon_state = "1" - layer = TURF_LAYER + 0.2 + layer = TURF_LAYER var firelevel = 10000 //Calculated by gas_mixture.calculate_firelevel() process() . = 1 - + //get location and check if it is in a proper ZAS zone var/turf/simulated/floor/S = loc if(!S.zone) del src - + if(!istype(S)) del src - + var/datum/gas_mixture/air_contents = S.return_air() //get liquid fuels on the ground. var/obj/effect/decal/cleanable/liquid_fuel/liquid = locate() in S //and the volatile stuff from the air var/datum/gas/volatile_fuel/fuel = locate() in air_contents.trace_gases - //get scorchmarks - var/obj/effect/decal/cleanable/scorchmark/scorch = locate() in S - - //check if it found a scorchmark and add one if there isnt one already - if (!scorch) - scorch = new/obj/effect/decal/cleanable/scorchmark(S,0) - - //try to burn the floor - //initialize the temperature needed for burning the floor - //initialize the fuel gained by burning this floor - //initialize the speed modifier for the floor to catch on fire - var/floor_target_temp = 0 - var/floor_fuel = 1 - var/floor_speed_modifier = 1 - if(S.is_plasteel_floor()) - floor_target_temp = 800 - else if (S.is_light_floor()) - floor_target_temp = 600 - else if (S.is_grass_floor()) - floor_target_temp = 500 - floor_fuel = 2 - floor_speed_modifier = 1.5 - else if (S.is_wood_floor()) - floor_target_temp = 500 - floor_fuel = 3 - floor_speed_modifier = 1.25 - else if (S.is_carpet_floor()) - floor_target_temp = 500 - floor_fuel = 3 - floor_speed_modifier = 1.5 - else - floor_target_temp = 1200 - floor_speed_modifier = 0.8 - - //check if the floor is burnable - if(floor_target_temp > 0) - //calculate a random factor for the equation - var/turf_burn_random = max( min(floor_speed_modifier * 5 * ( ( max(air_contents.temperature - floor_target_temp,0) / floor_target_temp )^2 ), 100), 0) - //check if the random check is passed - if (prob(turf_burn_random)) - //check if the tile has already been damaged once - if (S.burnt || S.broken) - //check if the tile is plating, if not break it and release some fuel, also some randomness to slow down the process - if (!S.is_plating() && prob(10)) - scorch.amount += floor_fuel - S.break_tile_to_plating() - - //damage it and release fuel - else - scorch.amount += floor_fuel - S.burn_tile() - - //now burn some items! - for(var/obj/o in loc) - if(o.fire_min_burn_temp) - var/obj_burn_random = max( min(o.fire_burn_multiplier * 5 * ( ( max(air_contents.temperature - o.fire_min_burn_temp,0) / o.fire_min_burn_temp )^2 ), 100), 0) - if(prob(obj_burn_random)) - scorch.amount += fire_fuel_worth - o.fire_burn() - + //since the air is processed in fractions, we need to make sure not to have any minuscle residue or //the amount of moles might get to low for some functions to catch them and thus result in wonky behaviour if(air_contents.oxygen < 0.001) @@ -145,29 +86,29 @@ obj if(fuel) if(fuel.moles < 0.001) air_contents.trace_gases.Remove(fuel) - + //check if there is something to combust - if(!air_contents.check_combustability(liquid,scorch)) + if(!air_contents.check_combustability(liquid)) del src - + //get a firelevel and set the icon - firelevel = air_contents.calculate_firelevel(liquid,scorch) - - if(firelevel > 3) + firelevel = air_contents.calculate_firelevel(liquid) + + if(firelevel > 6) icon_state = "3" SetLuminosity(7) - else if(firelevel > 2) + else if(firelevel > 2.5) icon_state = "2" SetLuminosity(5) else icon_state = "1" SetLuminosity(3) - + //im not sure how to implement a version that works for every creature so for now monkeys are firesafe for(var/mob/living/carbon/human/M in loc) M.FireBurn(firelevel, air_contents.temperature, air_contents.return_pressure() ) //Burn the humans! - + //spread! for(var/direction in cardinal) if(S.air_check_directions&direction) //Grab all valid bordering tiles @@ -177,7 +118,7 @@ obj if(istype(enemy_tile)) //If extinguisher mist passed over the turf it's trying to spread to, don't spread and //reduce firelevel. - if(prob( 100 * (1 - min( max( ( (world.time - 30) - enemy_tile.fire_protection ), 0 ) / 30, 1) ) ) ) + if(enemy_tile.fire_protection > world.time-30) firelevel -= 1.5 continue @@ -185,29 +126,29 @@ obj if(!(locate(/obj/fire) in enemy_tile)) if( prob( 50 + 50 * (firelevel/vsc.fire_firelevel_multiplier) ) && S.CanPass(null, enemy_tile, 0,0) && enemy_tile.CanPass(null, S, 0,0)) new/obj/fire(enemy_tile,firelevel) - + //seperate part of the present gas //this is done to prevent the fire burning all gases in a single pass var/datum/gas_mixture/flow = air_contents.remove_ratio(vsc.fire_consuption_rate) - + ///////////////////////////////// FLOW HAS BEEN CREATED /// DONT DELETE THE FIRE UNTIL IT IS MERGED BACK OR YOU WILL DELETE AIR /////////////////////////////////////////////// - + if(flow) - if(flow.check_combustability(liquid,scorch)) + if(flow.check_combustability(liquid)) //Ensure flow temperature is higher than minimum fire temperatures. //this creates some energy ex nihilo but is necessary to get a fire started //lets just pretend this energy comes from the ignition source and dont mention this again //flow.temperature = max(PLASMA_MINIMUM_BURN_TEMPERATURE+0.1,flow.temperature) - + //burn baby burn! - flow.zburn(liquid,scorch,1) - + flow.zburn(liquid,1) + //merge the air back S.assume_air(flow) ///////////////////////////////// FLOW HAS BEEN REMERGED /// feel free to delete the fire again from here on ////////////////////////////////////////////////////////////////// - + New(newLoc,fl) ..() @@ -237,15 +178,15 @@ turf/simulated/apply_fire_protection() fire_protection = world.time -datum/gas_mixture/proc/zburn(obj/effect/decal/cleanable/liquid_fuel/liquid, obj/effect/decal/cleanable/scorchmark/scorch, force_burn) +datum/gas_mixture/proc/zburn(obj/effect/decal/cleanable/liquid_fuel/liquid,force_burn) var/value = 0 - - if((temperature > PLASMA_MINIMUM_BURN_TEMPERATURE || force_burn) && check_combustability(liquid,scorch) ) - var/total_fuel = 0 + + if((temperature > PLASMA_MINIMUM_BURN_TEMPERATURE || force_burn) && check_combustability(liquid) ) + var/total_fuel = 0 var/datum/gas/volatile_fuel/fuel = locate() in trace_gases total_fuel += toxins - + if(fuel) //Volatile Fuel total_fuel += fuel.moles @@ -257,12 +198,8 @@ datum/gas_mixture/proc/zburn(obj/effect/decal/cleanable/liquid_fuel/liquid, obj/ else total_fuel += liquid.amount - if(scorch) - //fuel created by destroying objects and turfs - total_fuel += scorch.amount - //Calculate the firelevel. - var/firelevel = calculate_firelevel(liquid, scorch) + var/firelevel = calculate_firelevel(liquid) //get the current inner energy of the gas mix //this must be taken here to prevent the addition or deletion of energy by a changing heat capacity @@ -270,7 +207,7 @@ datum/gas_mixture/proc/zburn(obj/effect/decal/cleanable/liquid_fuel/liquid, obj/ //determine the amount of oxygen used var/total_oxygen = min(oxygen, 2 * total_fuel) - + //determine the amount of fuel actually used var/used_fuel_ratio = min(oxygen / 2 , total_fuel) / total_fuel total_fuel = total_fuel * used_fuel_ratio @@ -295,39 +232,33 @@ datum/gas_mixture/proc/zburn(obj/effect/decal/cleanable/liquid_fuel/liquid, obj/ liquid.amount -= liquid.amount * used_fuel_ratio * used_reactants_ratio if(liquid.amount <= 0) del liquid - if(scorch) - scorch.amount -= min(scorch.amount, scorch.amount * used_fuel_ratio * used_reactants_ratio) - //calculate the energy produced by the reaction and then set the new temperature of the mix temperature = (starting_energy + vsc.fire_fuel_energy_release * total_fuel) / heat_capacity() - + update_values() value = total_reactants * used_reactants_ratio return value -datum/gas_mixture/proc/check_combustability(obj/effect/decal/cleanable/liquid_fuel/liquid, obj/effect/decal/cleanable/scorchmark/scorch) +datum/gas_mixture/proc/check_combustability(obj/effect/decal/cleanable/liquid_fuel/liquid) //this check comes up very often and is thus centralized here to ease adding stuff - - var/datum/gas/volatile_fuel/fuel = locate() in trace_gases + + var/datum/gas/volatile_fuel/fuel = locate() in trace_gases var/value = 0 - + if(oxygen && (toxins || fuel || liquid)) value = 1 - else if (scorch) - if (oxygen && scorch.amount > 0) - value = 1 - + return value -datum/gas_mixture/proc/calculate_firelevel(obj/effect/decal/cleanable/liquid_fuel/liquid, obj/effect/decal/cleanable/scorchmark/scorch) +datum/gas_mixture/proc/calculate_firelevel(obj/effect/decal/cleanable/liquid_fuel/liquid) //Calculates the firelevel based on one equation instead of having to do this multiple times in different areas. - + var/datum/gas/volatile_fuel/fuel = locate() in trace_gases var/total_fuel = 0 var/firelevel = 0 - + if(check_combustability(liquid)) - + total_fuel += toxins if(liquid) @@ -336,20 +267,17 @@ datum/gas_mixture/proc/calculate_firelevel(obj/effect/decal/cleanable/liquid_fue if(fuel) total_fuel += fuel.moles - if(scorch) - total_fuel += scorch.amount - var/total_combustables = (total_fuel + oxygen) - + if(total_fuel > 0 && oxygen > 0) - + //slows down the burning when the concentration of the reactants is low var/dampening_multiplier = total_combustables / (total_combustables + nitrogen + carbon_dioxide) //calculates how close the mixture of the reactants is to the optimum var/mix_multiplier = 1 / (1 + (5 * ((oxygen / total_combustables) ^2))) //toss everything together firelevel = vsc.fire_firelevel_multiplier * mix_multiplier * dampening_multiplier - + return max( 0, firelevel) @@ -395,4 +323,6 @@ datum/gas_mixture/proc/calculate_firelevel(obj/effect/decal/cleanable/liquid_fue apply_damage(0.6*mx*legs_exposure, BURN, "l_leg", 0, 0, "Fire") apply_damage(0.6*mx*legs_exposure, BURN, "r_leg", 0, 0, "Fire") apply_damage(0.4*mx*arms_exposure, BURN, "l_arm", 0, 0, "Fire") - apply_damage(0.4*mx*arms_exposure, BURN, "r_arm", 0, 0, "Fire") \ No newline at end of file + apply_damage(0.4*mx*arms_exposure, BURN, "r_arm", 0, 0, "Fire") + + //flash_pain() diff --git a/code/defines/obj.dm b/code/defines/obj.dm index 116136bfaf..661f4c43b3 100644 --- a/code/defines/obj.dm +++ b/code/defines/obj.dm @@ -80,17 +80,7 @@ var/name = t.fields["name"] var/rank = t.fields["rank"] var/real_rank = t.fields["real_rank"] - - var/active = 0 - for(var/mob/M in player_list) if(M.name == name) - // For dead ones, have a chance to get their status wrong - if(M.stat == 2) - active = M.x % 2 // Should be good enough, avoids their status flipping constantly - break - else if(M.client && M.client.inactivity <= 10 * 60 * 10) - active = 1 - break - isactive[name] = active ? "Active" : "SSD" + isactive[name] = t.fields["p_stat"] //world << "[name]: [rank]" diff --git a/code/game/objects/effects/decals/Cleanable/scorchmark.dm b/code/game/objects/effects/decals/Cleanable/scorchmark.dm deleted file mode 100644 index 9274708d6e..0000000000 --- a/code/game/objects/effects/decals/Cleanable/scorchmark.dm +++ /dev/null @@ -1,15 +0,0 @@ -obj/effect/decal/cleanable/scorchmark - //this is used as an additional visual result of fire and as a reagent holder for fuel created by burning of turfs and items. - icon = 'icons/effects/scorchmark.dmi' - name = "Soot" - icon_state = "1" - layer = TURF_LAYER+0.1 - anchored = 1 - var/amount = 0 //starts always empty and is filled by procs called by fire - - New(newLoc,start_amount=0) - ..() - - icon_state = pick("1","2","3","4","5","6","7","8","9") - dir = pick(cardinal) - amount = start_amount \ No newline at end of file diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index 309d667553..d3e7144297 100644 --- a/code/game/objects/effects/effect_system.dm +++ b/code/game/objects/effects/effect_system.dm @@ -39,25 +39,25 @@ would spawn and follow the beaker, even if it is carried or thrown. /obj/effect/effect/water/New() ..() - var/turf/simulated/floor/T = src.loc - if (istype(T, /turf/simulated/floor)) - T.fire_protection = world.time + //var/turf/T = src.loc + //if (istype(T, /turf)) + // T.firelevel = 0 //TODO: FIX spawn( 70 ) delete() return return /obj/effect/effect/water/Del() - var/turf/simulated/floor/T = src.loc - if (istype(T, /turf/simulated/floor)) - T.fire_protection = world.time + //var/turf/T = src.loc + //if (istype(T, /turf)) + // T.firelevel = 0 //TODO: FIX ..() return /obj/effect/effect/water/Move(turf/newloc) - var/turf/simulated/floor/T = src.loc - if (istype(T, /turf/simulated/floor)) - T.fire_protection = world.time + //var/turf/T = src.loc + //if (istype(T, /turf)) + // T.firelevel = 0 //TODO: FIX if (--src.life < 1) //SN src = null delete() diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index f559c7f830..834029e7c4 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -103,9 +103,6 @@ var/global/list/datum/stack_recipe/uranium_recipes = list ( \ origin_tech = "plasmatech=2;materials=2" perunit = 2000 sheettype = "plasma" - fire_min_burn_temp = 500 - fire_burn_multiplier = 3 //made of burnium - fire_fuel_worth = 0 var/global/list/datum/stack_recipe/plasma_recipes = list ( \ new/datum/stack_recipe("plasma door", /obj/structure/mineral_door/transparent/plasma, 10, one_per_turf = 1, on_floor = 1), \ @@ -117,18 +114,6 @@ var/global/list/datum/stack_recipe/plasma_recipes = list ( \ pixel_y = rand(0,4)-4 ..() -/obj/item/stack/sheet/mineral/plasma/fire_burn() - //get location and check if it is in a proper ZAS zone - var/turf/simulated/floor/S = loc - if(S.zone) - var/datum/gas_mixture/air_contents = S.return_air() - if(air_contents) - air_contents.toxins += 20 - air_contents.update_values() - amount -= 1 - if(amount <= 0) - del src - /obj/item/stack/sheet/mineral/plastic name = "Plastic" icon_state = "sheet-plastic" @@ -139,6 +124,7 @@ var/global/list/datum/stack_recipe/plasma_recipes = list ( \ throw_range = 3 origin_tech = "materials=3" perunit = 2000 + sheettype = "plastic" var/global/list/datum/stack_recipe/plastic_recipes = list ( \ new/datum/stack_recipe("plastic crate", /obj/structure/closet/pcrate, 10, one_per_turf = 1, on_floor = 1), \ @@ -268,4 +254,4 @@ var/global/list/datum/stack_recipe/silver_recipes = list ( \ throw_speed = 3 throw_range = 3 origin_tech = "materials=4" - perunit = 2000 + perunit = 2000 diff --git a/code/game/objects/items/weapons/power_cells.dm b/code/game/objects/items/weapons/power_cells.dm index 0a1cda9b2b..353790d22f 100644 --- a/code/game/objects/items/weapons/power_cells.dm +++ b/code/game/objects/items/weapons/power_cells.dm @@ -20,10 +20,6 @@ var/construction_cost = list("metal"=750,"glass"=75) var/construction_time=100 - fire_min_burn_temp = 1000 - fire_burn_multiplier = 0.75 - fire_fuel_worth = 0 - suicide_act(mob/user) viewers(user) << "\red [user] is licking the electrodes of the [src.name]! It looks like \he's trying to commit suicide." return (FIRELOSS) @@ -118,7 +114,9 @@ g_amt = 0 /obj/item/weapon/cell/fire_burn() + viewers(src) << "\red Charge: [src.charge]" var/radius = round( (sqrt(charge)/30)+0.5, 1 ) + viewers(src) << "\red Radius: [radius]" if (radius >= 1) explosion(src.loc,0,0,radius) - ..() + ..() diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index ea3f42247d..143ff13a04 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -16,11 +16,6 @@ var/integrity = 3 var/volume = 70 - m_amt = 3750 - fire_min_burn_temp = 800 - fire_burn_multiplier = 0.75 - fire_fuel_worth = 0 - /obj/item/weapon/tank/New() ..() @@ -266,11 +261,4 @@ integrity-- else if(integrity < 3) - integrity++ - -/obj/item/weapon/tank/fire_burn() - //get location and check if it is in a proper ZAS zone - var/turf/simulated/floor/S = loc - if(S.zone) - S.assume_air(air_contents) - ..() \ No newline at end of file + integrity++ \ No newline at end of file diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm index 6e421c9443..762888a4b4 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -76,19 +76,11 @@ icon_state = "wooden_chair" name = "wooden chair" desc = "Old is never too old to not be in fashion." - fire_min_burn_temp = 500 - fire_burn_multiplier = 1.25 - fire_fuel_worth = 5 - m_amt = 0 /obj/structure/stool/bed/chair/wood/wings icon_state = "wooden_chair_wings" name = "wooden chair" desc = "Old is never too old to not be in fashion." - fire_min_burn_temp = 500 - fire_burn_multiplier = 1.25 - fire_fuel_worth = 5 - m_amt = 0 /obj/structure/stool/bed/chair/wood/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W, /obj/item/weapon/wrench)) @@ -101,9 +93,6 @@ /obj/structure/stool/bed/chair/comfy name = "comfy chair" desc = "It looks comfy." - fire_min_burn_temp = 500 - fire_burn_multiplier = 1.25 - fire_fuel_worth = 4 /obj/structure/stool/bed/chair/comfy/brown icon_state = "comfychair_brown" diff --git a/code/game/objects/structures/stool_bed_chair_nest/stools.dm b/code/game/objects/structures/stool_bed_chair_nest/stools.dm index fcd404f165..ab7a55e1da 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/stools.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/stools.dm @@ -6,10 +6,6 @@ anchored = 1.0 flags = FPRINT pressure_resistance = 15 - m_amt = 3750 - fire_min_burn_temp = 600 - fire_burn_multiplier = 1 - fire_fuel_worth = 2 /obj/structure/stool/ex_act(severity) switch(severity) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 55a00acfdc..2879122972 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -373,9 +373,8 @@ return /obj/structure/window/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) - //Since glasslocks are the only thing you can do to prevent spreading atmos issues, this was disabled for the time being - //if(exposed_temperature > T0C + 800) - // hit(round(exposed_volume / 100), 0) + if(exposed_temperature > T0C + 800) + hit(round(exposed_volume / 100), 0) ..() diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 4762b3212f..93cb235649 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -1,3 +1,5 @@ + + /obj/structure/reagent_dispensers name = "Dispenser" desc = "..." @@ -64,6 +66,12 @@ new /obj/effect/effect/water(src.loc) del(src) + + + + + + //Dispensers /obj/structure/reagent_dispensers/watertank name = "watertank" @@ -71,39 +79,10 @@ icon = 'icons/obj/objects.dmi' icon_state = "watertank" amount_per_transfer_from_this = 10 - - m_amt = 7500 - g_amt = 3750 - fire_min_burn_temp = 800 - fire_burn_multiplier = 0.75 - fire_fuel_worth = 0 - New() ..() reagents.add_reagent("water",1000) -/obj/structure/reagent_dispensers/watertank/fire_burn() - src.reagents.update_total() - var/number_of_gusts = src.reagents.total_volume / 50 - for(var/a=0, a < number_of_gusts , a++) - var/obj/effect/effect/water/W = new /obj/effect/effect/water( get_turf(src) ) - var/turf/my_target = get_step(get_step(get_step(get_step(get_step(get_turf(src),pick(cardinal)),pick(cardinal)),pick(cardinal)),pick(cardinal)),pick(cardinal)) - var/datum/reagents/R = new/datum/reagents(50) - if(!W) return - W.reagents = R - R.my_atom = W - if(!W || !src) return - src.reagents.trans_to(W,50) - for(var/b=0, b<5, b++) - step_towards(W,my_target) - if(!W) return - W.reagents.reaction(get_turf(W)) - for(var/atom/atm in get_turf(W)) - if(!W) return - W.reagents.reaction(atm) - if(W.loc == my_target) break - ..() - /obj/structure/reagent_dispensers/fueltank name = "fueltank" desc = "A fueltank" @@ -112,13 +91,6 @@ amount_per_transfer_from_this = 10 var/modded = 0 var/obj/item/device/assembly_holder/rig = null - - m_amt = 7500 - g_amt = 3750 - fire_min_burn_temp = 800 - fire_burn_multiplier = 1 - fire_fuel_worth = 0 - New() ..() reagents.add_reagent("fuel",1000) @@ -192,11 +164,6 @@ if(src) del(src) -/obj/structure/reagent_dispensers/fueltank/fire_burn() - src.reagents.update_total() - new/obj/effect/decal/cleanable/liquid_fuel(src.loc, src.reagents.total_volume) - ..() - /obj/structure/reagent_dispensers/peppertank name = "Pepper Spray Refiller" desc = "Refill pepper spray canisters." @@ -247,4 +214,4 @@ New() ..() - reagents.add_reagent("virusfood", 1000) + reagents.add_reagent("virusfood", 1000) diff --git a/html/changelog.html b/html/changelog.html index afa541edf7..9e59bcd6e9 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -40,7 +40,7 @@ Header Section Code: Abi79, Aryn, Cael_Aislinn, Chinsky, cib, CompactNinja, DopeGhoti, Erthilo, Hawk_v3, Head, Ispil, Lexusjjss, Melonstorm, Miniature, Mloc, NerdyBoy1104, SkyMarshal, Spectre, Strumpetplaya, Sunfall, Tastyfish, Uristqwerty
- Sprites: Apple_Master, Arcalane, Chinsky, CompactNinja, Deus Dactyl, Erthilo, Flashkirby, Miniature, Searif, Xenone, faux
+ Sprites: Apple_Master, Arcalane, Chinsky, CompactNinja, Deus Dactyl, Erthilo, Flashkirby, Miniature, Searif, Xenone
Sounds: Aryn
Thanks To: /tg/ station, Goonstation, Animus Station, Daedalus, and original Spacestation 13 devs. Skibiliano for the IRC bot. @@ -56,6 +56,7 @@ 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. --> +

14/07/2013

Lord Braindead updated:

@@ -66,96 +67,21 @@ 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.
  • -
-
-
-

03.07.2013

-

Segrain updated:

-
    -
  • Security and medical cyborgs can use their HUDs to access records.
  • -
-
-
-

June 28th, 2013

-

Segrain updated:

-
    -
  • AIs are now able to examine what they see.
  • -
-
-
-

June 27th, 2013

+

27.06.2013

Segrain updated:

  • ID cards properly setup bloodtype, DNA and fingerprints again.
+
-

June 26th, 2013

-

Whitellama updated:

-
    -
  • One-antag rounds (like wizard/ninja) no longer end automatically upon death
  • -
  • Space ninja has been implemented as a voteable gamemode
  • -
  • Space ninja spawn landmarks have been implemented (but not yet placed on the map), still spawn at carps-pawns instead. (The code will warn you about this and ask you to report it, it's a known issue.)
  • -
  • Five new space ninja directives have been added, old directives have been reworded to be less harsh
  • -
  • Space ninjas have been given their own list as antagonists, and are no longer bundled up with traitors
  • -
  • Space ninjas with a "steal a functional AI" objective will now succeed by downloading one into their suits
  • -
  • Space ninja suits' exploding on death has been nerfed, so as not to cause breaches
  • -
  • A few space ninja titles/names have been added and removed to be slightly more believable
  • -
  • The antagonist selector no longer chooses jobbanned players when it runs out of willing options
  • -
-
-
-

June 26th, 2013

+

26.06.2013

Segrain updated:

  • Autopsy scanner properly displays time of wound infliction and death.
  • Autopsy scanner properly displays wounds by projectile weapons.
-
-

June 23rd, 2013

-

Segrain updated:

-
    -
  • Airlocks of various models can be constructed again.
  • -
-
- -
-

June 23rd, 2013

-

faux updated:

-
    -
  • There has been a complete medbay renovation spearheaded by Vetinarix. http://baystation12.net/forums/viewtopic.php?f=20&t=7847 <-- Please put any commentary good or bad, here.
  • -
  • Some maintenance doors within RnD and Medbay have had their accesses changed. Maintenance doors in the joint areas (leading to the research shuttle, virology, and xenobiology) are now zero access. Which means anyone in those joints can enter the maintenance tunnels. This was done to add additional evacuation locations during radiation storms. Additional maintenance doors were added to the tunnels in these areas to prevent docs and scientists from running about.
  • -
  • Starboard emergency storage isn't gone now, it's simply located in the escape wing.
  • -
  • An engineering training room has been added to engineering. This location was previously where surgery was located. If you are new to engineering or need to brush up on your skills, please use this area for testing.
  • -
-

June 22nd 2013

@@ -166,69 +92,6 @@ should be listed in the changelog upon commit though. Thanks. -->
-
-

21.06.2013

-

Jupotter updated:

-
    -
  • Fix the robotiscist preview in the char setupe screen
  • -
-
- -
-

18.06.2013

-

Segrain updated:

-
    -
  • Fixed some bugs in windoor construction.
  • -
  • Secure windoors are made with rods again.
  • -
  • Windoors drop their electronics when broken. Emagged windoors can have theirs removed by crowbar.
  • -
  • Airlock electronics can be configured to make door open for any single access on it instead of all of them.
  • -
  • Cyborgs can preview their icons before choosing.
  • -
-
- -
-

13.06.2013

-

Kilakk updated:

-
    -
  • Added the Xenobiologist job. Has access to the research hallway and to xenobiology.
  • -
  • Removed Xenobiology access from Scientists.
  • -
  • Removed the Xenobiologist alternate title from Scientists.
  • -
  • Added "Xenoarchaeology" to the RD, Scientists, and to the ID computer.
  • -
  • Changed the Research Outpost doors to use "Xenoarchaeology" access.
  • -
-
- -
-

6-13-13

-

Asanadas updated:

-
    -
  • Added a whimsical suit to the head of personnel's secret clothing locker.
  • -
-
- -
-

12/06/2013

-

Zuhayr updated:

-
    -
  • Added pneumatic cannon and harpoons.
  • -
  • Added embedded projectiles. Bullets and thrown weapons may stick in targets. Throwing them by hand won't make them stick, firing them from a cannon might. Implant removal surgery will get rid of shrapnel and stuck items.
  • -
-
- - -
-

6/11/13

-

Meyar updated:

-
    -
  • Fixes a security door with a firedoor ontop of it.
  • -
  • Fixed a typo relating to the admin Select Equipment Verb. (It's RESPONSE team not RESCUE team)
  • -
  • ERT are now automated, from their spawn to their shuttle. Admin intervention no longer required! (Getting to the mechs still requires admin permission generally)
  • -
  • Added flashlights to compensate for the weakened PDA lights
  • -
  • ERT Uniforms updated to be in line with Centcom uniforms. No more turtlenecks, no sir.
  • -
-
- -

09.06.2013

Segrain updated:

@@ -278,25 +141,6 @@ should be listed in the changelog upon commit though. Thanks. -->
-
-

5.06.2013

-

Chinsky updated:

-
    -
  • Load bearing equipment - webbings and vests for engineers and sec. Attach to jumpsuit, use 'Look in storage' verb (object tab) to open.
  • -
-
- - - - - - - - - - - -

1.06.2013

Chinsky updated:

diff --git a/icons/effects/scorchmark.dmi b/icons/effects/scorchmark.dmi deleted file mode 100644 index eb4e21cc12f927e341afa3d6a0f63190b655edef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12218 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 GUP!_)>sfL z17m8Q#K==2L0(}b1>+v{c>g9Hyx-G-G$O*{B`(B-tj!cP>{K7b<5T@rRlA2{`loIf z$qPq{>?9HfkI>0yt5Z0Y^uU(+OpJ7lZ1N02ex`ffX2R%dwtyC)a>&5R5XDC!taFP~ zol9u+kr;$cz=q6O7_PDdaC^#cOM+}vHy=PjpN+$2M!xYm7>Vkh@&=}B!!jknwVs}V z&A@CUn2OmccJ%YWjqVvQBnF2@Np=FQtx~bM#(+J6DeAIc*Jyv9J1EM)U^2qOws*5J zNo~xg0CNXnMyRmA#A@PM3T*B=9O>rgK|Y%KIPFTYDm_8+`YB{ zf~*{!^5#(CPg9wAdcYRS1G9OXr#s@HGC$vgqI;_S+77SI17j2<=!mL(dmKzgGNV$c z$Au{`a8d0&4b$p*VDP}bJmXSN*H(>o$4rmGBK9Krm0^IRAYX0LHBb0)xH|P~GH87$ zO1`-%e{++%9Wlk)T+9#QF^q}W)Bm-iZv~Ae*MN_=Qjj&dS0LR^z;ORBV9qR;Qj~hz zQ%tpsF`B<)YU426`i0NKWG`v->z~=g)Zi z6DXMeSY;#pA$pS>KGHQKDYG}^hs@#*r>u~ucQQrx*cBrKC(yVGZ}I$3QMA5&F|wOc z+%buE!E6F|`Lm6qvH@c=djcl!1TgtwY~Kuo#w^SR!+dPEhNfrF;qhLb=xgGreDOA46>G}*NIJ`;uiP)w;gTg4R z#sI#7>dz~W~PgZH+f^bVH~tp7!Q66Wz(PW zF>QsbR1H4pLZjvGZVH#v%%*S^1tt?L_mS8>`8w{qjIsPZ+hBC@0ss+tUR6hm$W<73 z(xNx<^5@iSr*Ym3gEIaO__eA|7sFkC4x@dGT|xC*RsA>q4?kDJea&Ce*G1$ERef0u z9rqP%$%jY(S~2M4zx#_Ds71KD3b)FsV>Ug%4<=}?#@v>+!gN5LG2K__g`)l;Y64~# zY^DE13zF^`RUPfe=V6oO3Na_e_f+*Q5!pix_uA}PhsRs%UcJSkB#1Zm=7LtgMFK#1 z-m2<6vxPAm!tps)PAjJeEu`(PW@TO;a!3ea{V@6-x~Z@m2Q(#biq~K(`xTOWk;*q> z8-4gZWEo^ZRW}38E+SdXJa1rn=DrwWd_P>h5&r<^zAGZrMP#Lj48VBRp<*cHahRIo zM`G}mftbeeArU!349Za>q(l3Ms*dyYR?q71>0d?UPyi8mQwq4ZJBG+O+sm@HbEB$G z_S1X4-M2AT@BtCIM2oxWt6u(Je(gF{U99FN`tvQ!%7qwq=}&%buJhxnZZ_CFt!683 z`Kjt#z$!6x#W#U3s_J{H`keP?qKLGQx3%w$TvV^6a4sid z@Lid_QL4?`IMQy%F}yDYLa{%MvH^{dLZRLU$q?^+!h0Xq`LDl z5*8|wmoW1784A8Md)q9>sK^l*cgQRZwJ_4t*f_EtWpg^-n?`%@4ivWUag0Ta!B~P> z|2uucL)0ABw&}PF#-au{R;vMS#yO-a|5yqO8eTtHbrA;j{XJcbZLn`)Ea^)Wz-^Y| zZ}2{yM`2CJ`*n-!et7w48X+sE5b}d(1Prk=Zgi*kbG2e6{rJY}COc!m)@Nx%1>A|T ze7!L#_gGBda{(qO?d|z%v6*xP2|HQcV-N+C85p2jNnvPG-Srgb!WVJ;CW#HExRr*q z+a06b!6FXCSzQWOx0FVO-e)K(?F_ZdlJF!dU$mC8RB0dvCOS9e4aE!@0lXTFp%k+B zU$A)j4PS$iof@>7Bbx-<81{j;unn*VFpVX#dze1u6pBC-l6N!(|tLACU!}L&!tTGl;D8`F@6_eU$P~?g;JVmMjo#N>* z%%QBapVx+m(G(@s4w#@3h~zcco)O-Fq2kygPhZa*OnVqgvu*q#>flIub+$6Z(1=}X zR(=zv_zR9|zq(GU8*uoQ-j@hB6T;a>3OwdOOhySG|XD{VPcU`mV5rS;)u2QIoFkcoy9zB zR$zW+OVuDEmjR31s1bdAG98~KBBzVHIr;AtzsH&Cuo^L>Lj3xv@$^3zb5lAq_eVq) zdU~f8@bH(^;4+7Z8T8-v`wvsq+x+<7FyZZCKmU$ez>n)hJ#8|BGOSCkse*tu~N-`F8qC49fnes9g8_3ey9$;6oarZhKg1P*}&-5N^F@1 zo3$?0xwyJ!35NX{gK-M4Vd%L!9Ko#^_Y(WZR0;_A1`@m5q+dZpLv`>vrgm6?0kTH< zJ+o?j0~Q?We2fjeAeFt5`fxn9VXjE!hgJ8lBgaH&wPh(Un3`Z{PW1F(jAJU6w5qWi zeQOrdA!5Uh z2iyxIb%Jf2p;iwKQ zxRkA{I#V%L@e051HkjcgvxUnsM&X9)1q4<#G_cQkx|6?*0d=3!wZp3O(`hX{PR8s2 zZ7AU5rV&N1_H;TnV=ux;%Z<6bzA>L1bFDvR#%xVt#YRv}jE}GdZpr&lubi0S0e}so zQT<}Vl-UnslWTZMohaf~kz> zV|Ib({AM8$UQ#vsD5mZW=dIkq6ugi^y>Lf zrjW0QAbBpBAd$_FL(*~Is*x-Zg3GVDoKUqJ#+e7xU=PGd_OTdE&)|l&lmJ#6G34C@FKh6| zX{)C5zaLuIsP~fwvaN``CL;ZuU29=IaZIMFel_LctlKyJbc5Hq3qv^|7Us9*7j3Eo zY}Nh3L}Z|pFbPlB*I^ENZ;MEvuWwP~>GyOtxU;JM73eMIwSF3Kn~3Zr1`0medH>}i zau{Y)2pQ$GRUdB>kt5YWUhO@*KemFtqN)Q`b%gh$zp4&bi!$&nHU59278ih1z1}$@ z@^HMd@TI+!)@;_ko_546W&2~BSMB}%0%qJ8M4^?TKRJj-Gv4rY9MMSDVoN*BoRhIl z_jrt~?LY;j!t_j6W27NWo>|?|1=E_&#WbPyM)?rMj2Ihkt4J)Ve%meN$8(0cG|1-x z*oM0vn}DD8F)U=iYABPKX8ymSGa2G(D8?SAs9rPwU57Flhi&SQP*e_`JUx{vVx#BZ zN~6DTi(!Y4!IWZZlxLdcN1yMb*neLqMeeHVA576(b@yjDHueADR5z3Fhe#W{=k4kJ zx(6q#IatRSZ6q-RL}a~)tPzoAo;MgkRm1=HZ85jb-(z$hElz!?>Sz(UTtwQrl)MsS z0rv+sxnvs-d2eGuK*FgmNaEhuii_W;J^iDq23fn&)3Ze6co7+=rc(KWh^(UV_e~MG zR?UDi&HH&W@PZpjb{CPcseU_Ejc6+G`ZIK=L|$)kK#Xw_i@tuRs!kP=!Ktl2YU-V7 zn((B-fn-hJK$2fr%AbYt*uDLHDupkP4R@RmQo!8%Q)01=qi9xNt=gVjo!6^pF=msU zfx#YM##YCeCjA_Yv3ngc64Z-=J?ciI*ZZy%|uXBcO3$)H>QheG~?wkV(0sVuE3Vy z>gXuRk=ygK6>Yx1xL$RKs%tU=dnM*H@eGA;4(I7Ja5i`g?d1ME0UPX!(fmOawZvqK5c4p$fd=HSw&(Vxa73MHbTQ4V<`If9C(zbsQ26!! zlnp-+foG)a19rL4|5xKWuTOa9gE8~(5MWx1m!vrU1^}D_w>dg2_YkRrTC-{SnxH zFdK8|{&!4i_+?f7hq#NYh|G_-5^+2GV5)^|`;E9gvD{*|oP=#!w_uxN%f}YH{B}&| z@(@MN2z}4asosj}x-gROh0)Rslk8d5-Ole($Mqad!L43`>9TG~<%4nfz27IkMXOPD@hR&vnhMVd?g6V*6t@8U|TF)5V(57~z_|RR2agUeLItteuFqGH{O>WxCeWxnF z9ph-?Va~-i+ew%z_;ie`h>a3{30^ zJ*w+t@Vn63C2JK$-F_-2$!(mf*U_lXpWPS2YyW_j6?b_%p2uCKH(?!;e*{&b%coQjzK%llL~*D>R$nT z6H^sD=y{(}i_N(f_%eo1eL~Ex`&~>|^M2LNOPYj5F>m-am<{|@5qS+mW^a$#07hdP z+5f~GS>oO^RrU6~&*goyx@Uik8q5=OfM1J!^kM}R>wcio+Edia`%}DU!mDEew)F0z zF#uiY<1_0Pv~@=eEmj8snOmLjNTY!yqVI-0(j%3H#x?X#kJGqcbfWbKhHk>lrFDFu zVHlEOIc3%d+u4sssLs0T+Nj@*lx~Lw>j+@j=_x;4vuI0e2ZL5|nLR)B<2_T}`CF*l zEZ}y=4vnHQ%3*Apb5dS>P49e)^!dCG)I3b+x`#%Gi-8#F3u|02k|T%b1-v}Nah{-p zS^7(ygVFSvDSuarPH9!1a1@DqHwsK;8Aj^ECUFdAUs%@;bCi2fL?&Z#*Lq`tQ*Xd% z-cG7I4f}mpL=IAO*AE}s*TlXB^O2^H?*QLQ$B0NT^(E)OQEKGpENu40m-BM;+TVNL zYHS68v7R5LcDt$SG_mNrA7LQczpLu2UZpJtBWwvjrX>=}d~f3sO<%SXk-iw_=^_z% z2MaFsj_bs}sYZt8h(XfZrDy7^s*n4#{t#1tAA`vZ5oLHh@MAUd)ivJS&J;jx7$4rm zmTRz(Bd}RJ7280Lz{pXKc;3Rjq`ZKQUxV?@FHj60txTBMMjVK;Fq*{oB2UGn?mX+l z0F%E|kwL^$C=kWq&K|^+e8I`}B}vvasw|$tR=_p1R-xo?MoyrSW9vg9lanwer3Xn{ z>}7@9!Fb(HA9IuEC_#$ar~E)IG{yXTS!aswBygv5Q~4SS*YX;T{$D3xI+$RG565)u z86-RtBTKOt1!65=BadLK=&_IK;~SU?BqHT@!8YW3XvBk_gR#{QRo5?|^_NFN7q(56 zzYAtg`vL|cExC6C7im|QhG-6x0auU)$M z6t*-LQ{W^yz(nQ%=26JUshF4@Hq}5Uw0xi-UDtw@NdrEhsuK#ZLH;s^ROO+>8ih@o zt0)`cwlo@T^49>*_rc3nxScVDVpy(vd7IrReExpvo*QWl)pi|5k|$#VT1<$ssZJYG zFp(|&o5=yss_Qk}IP#9FZt(Mg*iQc<#$vuKBAZopu!xMoHmGlj$TPrytLmlF7?fiv zwsd#a=KS(D82>$A&DUzPS|rDY{$X~29o0T-I~mg}9RjE(8?}g>h)L=nsK)>m!;apI z>5}@X>N%-?1R!}?-3TLweZ9nwA5+!wRevtSCh%7=2Ik9Z-Z2EjQq^w^Ug9rcLwa*N zVtSsg7)|VkAt!=<_a?dMV?1!Rs z=lg?af3ys1kyvq<4(CdW9;dfz^BGCe^ybfwyL_mY^T*-xSN4L;Ov03S0exRs-Qxv}*YAqa{(y$RLZQuv zHR;>_7!9t2eV>SFEn_bT!6=iZ5JWGhC?`WjzBR^xgzo7qwqV=9NYZ2qslA8Ra!3|d zS>_MCW3vXM!`QOFibjw3p!>}{RN{eRHQYwo#6xLy1&!e9aFIIw^0oHIXc<4ZB_L$ zHB8IlVsV~_;y)4TDu#g{suteyM0E_j*jG*e)vGp(BllY|55bSb0wetaBV_;+#e8g+ zsD*%>m9FcFeWrYsnxApRu3qi;JqADl8|Pl*2kTN(3wPXf3?O3dr5BgS`}Ls;xfeqWj#AZy>YN~^1z4!&M?FAQKP%>h(nVDtloX0nEDGc(Y~TEm*!ON? zrA)*_7caz?=5{m&m)HT5>_S@_ilqhEE+5d8dq`ozJZ}-jiSBT0=Z~-A)y^8PkOC@U zT-DClD%*&WtvXgu9||`0B`TY==ZC%ebqbK|QB1NO>&LZsdo~2s0#k5Mch~nybp+d> zXHlFp#$%HGwG@L_Fab;R#b;35{HOXLOz`t;A$yAQ!TaE1`eCYoJ{Ze+ERDk4Hk1!x z_N6hVTt+dk!BKV;3Afo7^TKR7jn=4#Jt$bGa3UPhq>U@F%`xkJHehnYGHm9aj!D9U zDDd{s&`$OG8!^r2Y>K6B6E@SA(fEy=4VWghMQU$@aSZwE(%WKch@XjpTsvWYO;b{x zewdUu*U$IC#Q(Qd^>uIKFBpe$hS(?0chbh_f+u_DB1FL!eRbTYu5b&m9PJUl?2IYfr(mPcPjYBGlPfXhU08=MqmGYJbYz(Hize7v>e#9c7 z`~jN*IqJ%h*o^CfZN492?BkQEP9IhMwpd{CmsNGMhJ%4=rqc=6T|Y1_??LCqpCjzW{Al5Rduzh zeoczoX~+sl347lnYxr*mV2zj#X}S6rGsNObkH-Rsf2bwWdKf&87mK*^AD9VoftPnv z<5CXAl#P?sbvx;K#(UlS)grL$toC`rh|+Sss@^SzIqIdRXb=*r&wqGS1o`%vga?x1i!!zl2N(A8W{ z0lc>QT%i{3;{}XmyBy;*=3q**3~Gvg1sLG^R5pd?U+X)9Vv`NF_qBXIjVg?86y;yQ zN)D&d-6-;VU_gYGqfvz(R$Uy%FACQ+M41sb{D3&d#t+dG;C%@z4o3C#Q5+#DX8rR%T;P)6=t4X zf$c+q0nID&L|OxwkHKsR-7uDUb(6Mxk!&6q+0CHfuE6a74`AZ)Pp6;(SpWb407*qo IM6N<$f;@CJi~s-t From 8575b7a2863ab780e4cdf4f334b88890b3677284 Mon Sep 17 00:00:00 2001 From: Mloc-Argent Date: Sat, 20 Jul 2013 18:41:50 +0100 Subject: [PATCH 63/68] And once again, did that the wrong way around. Whoops. Fully reverts #3316. Signed-off-by: Mloc-Argent --- .../objects/items/stacks/sheets/mineral.dm | 1 - .../game/objects/items/weapons/power_cells.dm | 10 +- html/changelog.html | 167 ++++++++++++++++-- 3 files changed, 158 insertions(+), 20 deletions(-) diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 834029e7c4..42def9a2b7 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -124,7 +124,6 @@ var/global/list/datum/stack_recipe/plasma_recipes = list ( \ throw_range = 3 origin_tech = "materials=3" perunit = 2000 - sheettype = "plastic" var/global/list/datum/stack_recipe/plastic_recipes = list ( \ new/datum/stack_recipe("plastic crate", /obj/structure/closet/pcrate, 10, one_per_turf = 1, on_floor = 1), \ diff --git a/code/game/objects/items/weapons/power_cells.dm b/code/game/objects/items/weapons/power_cells.dm index 353790d22f..1fb480596b 100644 --- a/code/game/objects/items/weapons/power_cells.dm +++ b/code/game/objects/items/weapons/power_cells.dm @@ -111,12 +111,4 @@ maxcharge = 10000 maxcharge = 10000 m_amt = 0 - g_amt = 0 - -/obj/item/weapon/cell/fire_burn() - viewers(src) << "\red Charge: [src.charge]" - var/radius = round( (sqrt(charge)/30)+0.5, 1 ) - viewers(src) << "\red Radius: [radius]" - if (radius >= 1) - explosion(src.loc,0,0,radius) - ..() + g_amt = 0 diff --git a/html/changelog.html b/html/changelog.html index 9e59bcd6e9..4fdd862029 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -40,7 +40,7 @@ Header Section Code: Abi79, Aryn, Cael_Aislinn, Chinsky, cib, CompactNinja, DopeGhoti, Erthilo, Hawk_v3, Head, Ispil, Lexusjjss, Melonstorm, Miniature, Mloc, NerdyBoy1104, SkyMarshal, Spectre, Strumpetplaya, Sunfall, Tastyfish, Uristqwerty
- Sprites: Apple_Master, Arcalane, Chinsky, CompactNinja, Deus Dactyl, Erthilo, Flashkirby, Miniature, Searif, Xenone
+ Sprites: Apple_Master, Arcalane, Chinsky, CompactNinja, Deus Dactyl, Erthilo, Flashkirby, Miniature, Searif, Xenone, faux
Sounds: Aryn
Thanks To: /tg/ station, Goonstation, Animus Station, Daedalus, and original Spacestation 13 devs. Skibiliano for the IRC bot. @@ -56,32 +56,97 @@ 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. --> -
-

14/07/2013

-

Lord Braindead updated:

+

2013-11-07

+

Chinsky updated:

    -
  • Added fire damaging floors and certain objects
  • -
  • fixed fire extingiushers being next to worthless against fire
  • -
  • made glass locks work against fire
  • +
  • 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.
-

27.06.2013

+

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.
  • +
+
+
+

03.07.2013

+

Segrain updated:

+
    +
  • Security and medical cyborgs can use their HUDs to access records.
  • +
+
+
+

June 28th, 2013

+

Segrain updated:

+
    +
  • AIs are now able to examine what they see.
  • +
+
+
+

June 27th, 2013

Segrain updated:

  • ID cards properly setup bloodtype, DNA and fingerprints again.
-
-

26.06.2013

+

June 26th, 2013

+

Whitellama updated:

+
    +
  • One-antag rounds (like wizard/ninja) no longer end automatically upon death
  • +
  • Space ninja has been implemented as a voteable gamemode
  • +
  • Space ninja spawn landmarks have been implemented (but not yet placed on the map), still spawn at carps-pawns instead. (The code will warn you about this and ask you to report it, it's a known issue.)
  • +
  • Five new space ninja directives have been added, old directives have been reworded to be less harsh
  • +
  • Space ninjas have been given their own list as antagonists, and are no longer bundled up with traitors
  • +
  • Space ninjas with a "steal a functional AI" objective will now succeed by downloading one into their suits
  • +
  • Space ninja suits' exploding on death has been nerfed, so as not to cause breaches
  • +
  • A few space ninja titles/names have been added and removed to be slightly more believable
  • +
  • The antagonist selector no longer chooses jobbanned players when it runs out of willing options
  • +
+
+
+

June 26th, 2013

Segrain updated:

  • Autopsy scanner properly displays time of wound infliction and death.
  • Autopsy scanner properly displays wounds by projectile weapons.
+
+

June 23rd, 2013

+

Segrain updated:

+
    +
  • Airlocks of various models can be constructed again.
  • +
+
+ +
+

June 23rd, 2013

+

faux updated:

+
    +
  • There has been a complete medbay renovation spearheaded by Vetinarix. http://baystation12.net/forums/viewtopic.php?f=20&t=7847 <-- Please put any commentary good or bad, here.
  • +
  • Some maintenance doors within RnD and Medbay have had their accesses changed. Maintenance doors in the joint areas (leading to the research shuttle, virology, and xenobiology) are now zero access. Which means anyone in those joints can enter the maintenance tunnels. This was done to add additional evacuation locations during radiation storms. Additional maintenance doors were added to the tunnels in these areas to prevent docs and scientists from running about.
  • +
  • Starboard emergency storage isn't gone now, it's simply located in the escape wing.
  • +
  • An engineering training room has been added to engineering. This location was previously where surgery was located. If you are new to engineering or need to brush up on your skills, please use this area for testing.
  • +
+

June 22nd 2013

@@ -92,6 +157,69 @@ should be listed in the changelog upon commit though. Thanks. -->
+
+

21.06.2013

+

Jupotter updated:

+
    +
  • Fix the robotiscist preview in the char setupe screen
  • +
+
+ +
+

18.06.2013

+

Segrain updated:

+
    +
  • Fixed some bugs in windoor construction.
  • +
  • Secure windoors are made with rods again.
  • +
  • Windoors drop their electronics when broken. Emagged windoors can have theirs removed by crowbar.
  • +
  • Airlock electronics can be configured to make door open for any single access on it instead of all of them.
  • +
  • Cyborgs can preview their icons before choosing.
  • +
+
+ +
+

13.06.2013

+

Kilakk updated:

+
    +
  • Added the Xenobiologist job. Has access to the research hallway and to xenobiology.
  • +
  • Removed Xenobiology access from Scientists.
  • +
  • Removed the Xenobiologist alternate title from Scientists.
  • +
  • Added "Xenoarchaeology" to the RD, Scientists, and to the ID computer.
  • +
  • Changed the Research Outpost doors to use "Xenoarchaeology" access.
  • +
+
+ +
+

6-13-13

+

Asanadas updated:

+
    +
  • Added a whimsical suit to the head of personnel's secret clothing locker.
  • +
+
+ +
+

12/06/2013

+

Zuhayr updated:

+
    +
  • Added pneumatic cannon and harpoons.
  • +
  • Added embedded projectiles. Bullets and thrown weapons may stick in targets. Throwing them by hand won't make them stick, firing them from a cannon might. Implant removal surgery will get rid of shrapnel and stuck items.
  • +
+
+ + +
+

6/11/13

+

Meyar updated:

+
    +
  • Fixes a security door with a firedoor ontop of it.
  • +
  • Fixed a typo relating to the admin Select Equipment Verb. (It's RESPONSE team not RESCUE team)
  • +
  • ERT are now automated, from their spawn to their shuttle. Admin intervention no longer required! (Getting to the mechs still requires admin permission generally)
  • +
  • Added flashlights to compensate for the weakened PDA lights
  • +
  • ERT Uniforms updated to be in line with Centcom uniforms. No more turtlenecks, no sir.
  • +
+
+ +

09.06.2013

Segrain updated:

@@ -141,6 +269,25 @@ should be listed in the changelog upon commit though. Thanks. -->
+
+

5.06.2013

+

Chinsky updated:

+
    +
  • Load bearing equipment - webbings and vests for engineers and sec. Attach to jumpsuit, use 'Look in storage' verb (object tab) to open.
  • +
+
+ + + + + + + + + + + +

1.06.2013

Chinsky updated:

From 8421cd44dfbe774fc6a0a7765248d187180a6d94 Mon Sep 17 00:00:00 2001 From: Mloc-Argent Date: Mon, 22 Jul 2013 17:37:39 +0100 Subject: [PATCH 64/68] Upped the capacity of Eleanor Stone/RKF's custom teapot item to 150 units, by request. Signed-off-by: Mloc-Argent --- code/modules/customitems/item_defines.dm | 4 ++++ 1 file changed, 4 insertions(+) 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" From e7f38be3b4f1f76c605d141f85a1f50cd98cbf8d Mon Sep 17 00:00:00 2001 From: Mloc-Argent Date: Mon, 22 Jul 2013 17:38:34 +0100 Subject: [PATCH 65/68] Beakers and other glass containers now hide their contents, only showing the amount. Additionally, they can be labeled with a pen, up to a max of 10 characters. Signed-off-by: Mloc-Argent --- code/modules/paperwork/handlabeler.dm | 3 +++ .../reagents/reagent_containers/glass.dm | 26 +++++++++++++++++-- .../reagents/reagent_containers/spray.dm | 3 +-- 3 files changed, 28 insertions(+), 4 deletions(-) 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/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index af30187c1d..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/, @@ -34,14 +37,17 @@ /mob/living/simple_animal/hostile/retaliate/goat, /obj/machinery/computer/centrifuge ) + New() + ..() + base_name = name + examine() set src in view() ..() 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()) @@ -122,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." 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() From 8766e4154dc8405faf01639455fb5820b4190cb0 Mon Sep 17 00:00:00 2001 From: Kilakk Date: Mon, 22 Jul 2013 15:10:25 -0400 Subject: [PATCH 66/68] Changed the list of p_stats available in medical records Made it so removing an ID card from the medical computer puts the ID into your hand rather than onto the computer List: Active, *SSD*, *Deceased*, Physically Unfit, Disabled --- baystation12.dme | 2 +- code/game/machinery/computer/medical.dm | 37 +++++++++++++++++++++---- 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/baystation12.dme b/baystation12.dme index 61cc972fe9..802413560a 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -1262,9 +1262,9 @@ #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\centrifuge.dm" #include "code\modules\virus2\diseasesplicer.dm" #include "code\modules\virus2\dishincubator.dm" #include "code\modules\virus2\effect.dm" diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index 6ee5deff1f..c6f2f45456 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -127,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 @@ -164,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"]) @@ -277,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) @@ -311,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) @@ -478,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 From da2786891adbf4c24f0f0dac1c854003fc1a59c1 Mon Sep 17 00:00:00 2001 From: Segrain Date: Mon, 29 Jul 2013 08:12:02 +0300 Subject: [PATCH 67/68] Fix for #3337. --- code/modules/mob/living/carbon/human/examine.dm | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 95b2e67811..ed033f4d6f 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -199,19 +199,15 @@ 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(distance <= 1) - if(istype(usr, /mob/living/carbon/human) && usr.stat == 0) - spawn(15) + 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 From 747c71096e87748cc97777bec7e048076e9a844e Mon Sep 17 00:00:00 2001 From: comma Date: Sun, 4 Aug 2013 00:32:37 +0400 Subject: [PATCH 68/68] Fixed monkeys not getting space rabies via syringes. --- code/modules/organs/blood.dm | 26 ++++++++++++------- .../reagents/reagent_containers/syringes.dm | 6 ++--- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm index 78ccd65c28..dd31d28ac7 100644 --- a/code/modules/organs/blood.dm +++ b/code/modules/organs/blood.dm @@ -189,18 +189,11 @@ 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 - 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() src.virus2 |= virus_copylist(injected.data["virus2"]) if (injected.data["antibodies"] && prob(5)) antibodies |= injected.data["antibodies"] @@ -208,11 +201,24 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 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) +//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() + ..() + //Gets human's own blood. /mob/living/carbon/proc/get_blood(datum/reagents/container) var/datum/reagent/blood/res = locate() in container.reagent_list //Grab some blood 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."