From 6acd7511e03184ac211d2fd0fa4b907b2e08247a Mon Sep 17 00:00:00 2001 From: "quartz235@gmail.com" Date: Sun, 18 Dec 2011 16:51:23 +0000 Subject: [PATCH] okay please commit this time i am tired of your lockout errors moved cloning-related computers to a new dm in game/machinery/computer/ switched dna modifiers from machinery/ to machinery/computer fixed issue 243 fixed a bug that using a screwdriver on a teleporter beacon would move the beacon in your hand and make the screwdriver unusable/undroppable git-svn-id: http://tgstation13.googlecode.com/svn/trunk@2734 316c924e-a436-60f5-8080-3fe189b3f50e --- code/defines/obj/machinery.dm | 38 -- code/game/dna.dm | 20 +- code/game/machinery/cloning.dm | 379 --------------- .../game/machinery/computer/buildandrepair.dm | 2 +- code/game/machinery/computer/cloning.dm | 453 ++++++++++++++++++ code/game/objects/radio/radio.dm | 18 +- config/admins.txt | 1 + maps/tgstation.2.0.8.dmm | 10 +- 8 files changed, 480 insertions(+), 441 deletions(-) create mode 100644 code/game/machinery/computer/cloning.dm diff --git a/code/defines/obj/machinery.dm b/code/defines/obj/machinery.dm index c4619699d03..4aad8f88df9 100644 --- a/code/defines/obj/machinery.dm +++ b/code/defines/obj/machinery.dm @@ -218,44 +218,6 @@ idle_power_usage = 10 active_power_usage = 400 -/obj/machinery/scan_consolenew - name = "DNA Modifier Access Console" - desc = "Scand DNA." - icon = 'computer.dmi' - icon_state = "scanner" - density = 1 - var/uniblock = 1.0 - var/strucblock = 1.0 - var/subblock = 1.0 - var/status = null - var/radduration = 2.0 - var/radstrength = 1.0 - var/radacc = 1.0 - var/buffer1 = null - var/buffer2 = null - var/buffer3 = null - var/buffer1owner = null - var/buffer2owner = null - var/buffer3owner = null - var/buffer1label = null - var/buffer2label = null - var/buffer3label = null - var/buffer1type = null - var/buffer2type = null - var/buffer3type = null - var/buffer1iue = 0 - var/buffer2iue = 0 - var/buffer3iue = 0 - var/delete = 0 - var/injectorready = 1 - var/temphtml = null - var/obj/machinery/dna_scanner/connected = null - var/obj/item/weapon/disk/data/diskette = null - anchored = 1.0 - use_power = 1 - idle_power_usage = 10 - active_power_usage = 400 - /obj/machinery/door_control name = "Remote Door Control" desc = "This controls doors." diff --git a/code/game/dna.dm b/code/game/dna.dm index 473ef170378..f5be4627b4d 100644 --- a/code/game/dna.dm +++ b/code/game/dna.dm @@ -634,7 +634,7 @@ A.loc = src.loc del(src) -/obj/machinery/scan_consolenew/ex_act(severity) +/obj/machinery/computer/scan_consolenew/ex_act(severity) switch(severity) if(1.0) @@ -649,12 +649,12 @@ else return -/obj/machinery/scan_consolenew/blob_act() +/obj/machinery/computer/scan_consolenew/blob_act() if(prob(75)) del(src) -/obj/machinery/scan_consolenew/power_change() +/obj/machinery/computer/scan_consolenew/power_change() if(stat & BROKEN) icon_state = "broken" else if(powered()) @@ -665,14 +665,14 @@ src.icon_state = "c_unpowered" stat |= NOPOWER -/obj/machinery/scan_consolenew/New() +/obj/machinery/computer/scan_consolenew/New() ..() spawn( 5 ) src.connected = locate(/obj/machinery/dna_scannernew, get_step(src, WEST)) return return -/obj/machinery/scan_consolenew/attackby(obj/item/W as obj, mob/user as mob) +/obj/machinery/computer/scan_consolenew/attackby(obj/item/W as obj, mob/user as mob) if ((istype(W, /obj/item/weapon/disk/data)) && (!src.diskette)) user.drop_item() W.loc = src @@ -680,20 +680,20 @@ user << "You insert [W]." src.updateUsrDialog() -/obj/machinery/scan_consolenew/process() //not really used right now +/obj/machinery/computer/scan_consolenew/process() //not really used right now if(stat & (NOPOWER|BROKEN)) return if (!( src.status )) //remove this return return -/obj/machinery/scan_consolenew/attack_paw(user as mob) +/obj/machinery/computer/scan_consolenew/attack_paw(user as mob) return src.attack_hand(user) -/obj/machinery/scan_consolenew/attack_ai(user as mob) +/obj/machinery/computer/scan_consolenew/attack_ai(user as mob) return src.attack_hand(user) -/obj/machinery/scan_consolenew/attack_hand(user as mob) +/obj/machinery/computer/scan_consolenew/attack_hand(user as mob) if(..()) return var/dat @@ -751,7 +751,7 @@ onclose(user, "scannernew") return -/obj/machinery/scan_consolenew/Topic(href, href_list) +/obj/machinery/computer/scan_consolenew/Topic(href, href_list) if(..()) return if(!istype(usr.loc, /turf)) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index e62c2752e33..5d377d9b50f 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -19,20 +19,6 @@ var/attempting = 0 //One clone attempt at a time thanks var/eject_wait = 0 //Don't eject them as soon as they are created fuckkk -/obj/machinery/computer/cloning - name = "Cloning console" - icon = 'computer.dmi' - icon_state = "dna" - circuit = "/obj/item/weapon/circuitboard/cloning" - req_access = list(access_heads) //Only used for record deletion right now. - var/obj/machinery/dna_scannernew/scanner = null //Linked scanner. For scanning. - var/obj/machinery/clonepod/pod1 = null //Linked cloning pod. - var/temp = "Initializing System..." - var/menu = 1 //Which menu screen to display - var/list/records = list() - var/datum/data/record/active_record = null - var/obj/item/weapon/disk/data/diskette = null //Mostly so the geneticist can steal everything. - //The return of data disks?? Just for transferring between genetics machine/cloning machine. //TO-DO: Make the genetics machine accept them. /obj/item/weapon/disk/data @@ -60,371 +46,6 @@ data = "0983E840344C39F4B059D5145FC5785DC6406A4FFF" read_only = 1 - -/obj/machinery/computer/cloning/New() - ..() - spawn(5) - updatemodules() - /*src.scanner = findscanner()//locate(/obj/machinery/dna_scannernew, get_step(src, WEST)) - src.pod1 = findcloner()//locate(/obj/machinery/clonepod, get_step(src, EAST)) - world << "SEARCHING FOR MACHEIN" - src.temp = "" - if (isnull(src.scanner)) - src.temp += " SCNR-ERROR" - if (isnull(src.pod1)) - src.temp += " POD1-ERROR" - else - src.pod1.connected = src - - if (src.temp == "") - src.temp = "System ready."*/ - return - return - -/obj/machinery/computer/cloning/proc/updatemodules() - //world << "UPDATING MODULES" - src.scanner = findscanner()//locate(/obj/machinery/dna_scannernew, get_step(src, WEST)) - src.pod1 = findcloner()//locate(/obj/machinery/clonepod, get_step(src, EAST)) - //world << "SEARCHING FOR MACHEIN" - //src.temp = "" - //if (isnull(src.scanner)) - // src.temp += " SCNR-ERROR" - if (!isnull(src.pod1)) - src.pod1.connected = src - // src.temp += " POD1-ERROR" - //else - - //if (src.temp == "") - // src.temp = "System ready." - -/obj/machinery/computer/cloning/proc/findscanner() - //..() - //world << "SEARCHING FOR SCANNER" - var/obj/machinery/dna_scannernew/scannerf = null - for(dir in list(NORTH,EAST,SOUTH,WEST)) - //world << "SEARCHING IN [dir]" - scannerf = locate(/obj/machinery/dna_scannernew, get_step(src, dir)) - if (!isnull(scannerf)) - //world << "FOUND" - break - return scannerf - -/obj/machinery/computer/cloning/proc/findcloner() - //..() - //world << "SEARCHING FOR POD" - var/obj/machinery/clonepod/podf = null - for(dir in list(NORTH,EAST,SOUTH,WEST)) - //world << "SEARCHING IN [dir]" - podf = locate(/obj/machinery/clonepod, get_step(src, dir)) - if (!isnull(podf)) - //world << "FOUND" - break - return podf - -/obj/machinery/computer/cloning/attackby(obj/item/W as obj, mob/user as mob) - if (istype(W, /obj/item/weapon/disk/data)) //INSERT SOME DISKETTES - if (!src.diskette) - user.drop_item() - W.loc = src - src.diskette = W - user << "You insert [W]." - src.updateUsrDialog() - return - else - ..() - return - -/obj/machinery/computer/cloning/attack_paw(mob/user as mob) - return attack_hand(user) - -/obj/machinery/computer/cloning/attack_ai(mob/user as mob) - return attack_hand(user) - -/obj/machinery/computer/cloning/attack_hand(mob/user as mob) - user.machine = src - add_fingerprint(user) - - if(stat & (BROKEN|NOPOWER)) - return - - updatemodules() - - var/dat = "

Cloning System Control

" - dat += "Refresh" - - dat += "
[temp]
" - - switch(src.menu) - if(1) - dat += "

Modules

" - //dat += "Reload Modules" - if (isnull(src.scanner)) - dat += " Scanner-ERROR
" - else - dat += " Scanner-Found!
" - if (isnull(src.pod1)) - dat += " Pod-ERROR
" - else - dat += " Pod-Found!
" - - dat += "

Scanner Functions

" - - if (isnull(src.scanner)) - dat += "No scanner connected!" - else - if (src.scanner.occupant) - dat += "Scan - [src.scanner.occupant]" - else - dat += "Scanner unoccupied" - - dat += "
Lock status: [src.scanner.locked ? "Locked" : "Unlocked"]" - - dat += "

Database Functions

" - dat += "View Records
" - if (src.diskette) - dat += "Eject Disk" - - - if(2) - dat += "

Current records

" - dat += "Back

" - for(var/datum/data/record/R in src.records) - dat += "[R.fields["id"]]-[R.fields["name"]]
" - - if(3) - dat += "

Selected Record

" - dat += "Back
" - - if (!src.active_record) - dat += "ERROR: Record not found." - else - dat += "
Delete Record
" - dat += "Name: [src.active_record.fields["name"]]
" - - var/obj/item/weapon/implant/health/H = locate(src.active_record.fields["imp"]) - - if ((H) && (istype(H))) - dat += "Health: [H.sensehealth()] | OXY-BURN-TOX-BRUTE
" - else - dat += "Unable to locate implant.
" - - if (!isnull(src.diskette)) - dat += "Load from disk." - - dat += " | Save: UI + UE" - dat += " | Save: UI" - dat += " | Save: SE" - dat += "
" - else - dat += "
" //Keeping a line empty for appearances I guess. - - dat += {"UI: [src.active_record.fields["UI"]]
- SE: [src.active_record.fields["SE"]]

- Clone
"} - - if(4) - if (!src.active_record) - src.menu = 2 - dat = "[src.temp]
" - dat += "

Confirm Record Deletion

" - - dat += "Scan card to confirm.
" - dat += "No" - - - user << browse(dat, "window=cloning") - onclose(user, "cloning") - return - -/obj/machinery/computer/cloning/Topic(href, href_list) - if(..()) - return - - if ((href_list["scan"]) && (!isnull(src.scanner))) - src.scan_mob(src.scanner.occupant) - - //No locking an open scanner. - else if ((href_list["lock"]) && (!isnull(src.scanner))) - if ((!src.scanner.locked) && (src.scanner.occupant)) - src.scanner.locked = 1 - else - src.scanner.locked = 0 - - else if (href_list["view_rec"]) - src.active_record = locate(href_list["view_rec"]) - if ((isnull(src.active_record.fields["ckey"])) || (src.active_record.fields["ckey"] == "")) - del(src.active_record) - src.temp = "ERROR: Record Corrupt" - else - src.menu = 3 - - else if (href_list["del_rec"]) - if ((!src.active_record) || (src.menu < 3)) - return - if (src.menu == 3) //If we are viewing a record, confirm deletion - src.temp = "Delete record?" - src.menu = 4 - - else if (src.menu == 4) - var/obj/item/weapon/card/id/C = usr.equipped() - if (istype(C)||istype(C, /obj/item/device/pda)) - if(src.check_access(C)) - src.records.Remove(src.active_record) - del(src.active_record) - src.temp = "Record deleted." - src.menu = 2 - else - src.temp = "Access Denied." - - else if (href_list["disk"]) //Load or eject. - switch(href_list["disk"]) - if("load") - if ((isnull(src.diskette)) || (src.diskette.data == "")) - src.temp = "Load error." - src.updateUsrDialog() - return - if (isnull(src.active_record)) - src.temp = "Record error." - src.menu = 1 - src.updateUsrDialog() - return - - if (src.diskette.data_type == "ui") - src.active_record.fields["UI"] = src.diskette.data - if (src.diskette.ue) - src.active_record.fields["name"] = src.diskette.owner - else if (src.diskette.data_type == "se") - src.active_record.fields["SE"] = src.diskette.data - - src.temp = "Load successful." - if("eject") - if (!isnull(src.diskette)) - src.diskette.loc = src.loc - src.diskette = null - - else if (href_list["save_disk"]) //Save to disk! - if ((isnull(src.diskette)) || (src.diskette.read_only) || (isnull(src.active_record))) - src.temp = "Save error." - src.updateUsrDialog() - return - - switch(href_list["save_disk"]) //Save as Ui/Ui+Ue/Se - if("ui") - src.diskette.data = src.active_record.fields["UI"] - src.diskette.ue = 0 - src.diskette.data_type = "ui" - if("ue") - src.diskette.data = src.active_record.fields["UI"] - src.diskette.ue = 1 - src.diskette.data_type = "ui" - if("se") - src.diskette.data = src.active_record.fields["SE"] - src.diskette.ue = 0 - src.diskette.data_type = "se" - src.diskette.owner = src.active_record.fields["name"] - src.diskette.name = "data disk - '[src.diskette.owner]'" - src.temp = "Save \[[href_list["save_disk"]]\] successful." - - else if (href_list["refresh"]) - src.updateUsrDialog() - - else if (href_list["clone"]) - var/datum/data/record/C = locate(href_list["clone"]) - //Look for that player! They better be dead! - if(C) - var/mob/selected = find_dead_player("[C.fields["ckey"]]") - -//Can't clone without someone to clone. Or a pod. Or if the pod is busy. Or full of gibs. - if ((!selected) || (!src.pod1) || (src.pod1.occupant) || (src.pod1.mess) || !config.revival_cloning) - src.temp = "Unable to initiate cloning cycle." // most helpful error message in THE HISTORY OF THE WORLD - else if (src.pod1.growclone(selected, C.fields["name"], C.fields["UI"], C.fields["SE"], C.fields["mind"], C.fields["mrace"], C.fields["interface"],C.fields["changeling"])) - src.temp = "Cloning cycle activated." - src.records.Remove(C) - del(C) - src.menu = 1 - - else if (href_list["menu"]) - src.menu = text2num(href_list["menu"]) - - src.add_fingerprint(usr) - src.updateUsrDialog() - return - -/obj/machinery/computer/cloning/proc/scan_mob(mob/living/carbon/human/subject as mob) - if ((isnull(subject)) || (!(ishuman(subject))) || (!subject.dna)) - src.temp = "Error: Unable to locate valid genetic data." - return - if (subject.brain_op_stage == 4.0) - src.temp = "Error: No signs of intelligence detected." - return - if (subject.suiciding == 1) - src.temp = "Error: Subject's brain is not responding to scanning stimuli." - return - if ((!subject.ckey) || (!subject.client)) - src.temp = "Error: Mental interface failure." - return - if (subject.mutations & HUSK) - src.temp = "Error: Mental interface failure." - return - if (!isnull(find_record(subject.ckey))) - src.temp = "Subject already in database." - return - - subject.dna.check_integrity() - - var/datum/data/record/R = new /datum/data/record( ) - R.fields["mrace"] = subject.mutantrace - R.fields["ckey"] = subject.ckey - R.fields["name"] = subject.real_name - R.fields["id"] = copytext(md5(subject.real_name), 2, 6) - R.fields["UI"] = subject.dna.uni_identity - R.fields["SE"] = subject.dna.struc_enzymes - R.fields["changeling"] = subject.changeling - - // Preferences stuff - R.fields["interface"] = subject.UI - - - - //Add an implant if needed - var/obj/item/weapon/implant/health/imp = locate(/obj/item/weapon/implant/health, subject) - if (isnull(imp)) - imp = new /obj/item/weapon/implant/health(subject) - imp.implanted = subject - R.fields["imp"] = "\ref[imp]" - //Update it if needed - else - R.fields["imp"] = "\ref[imp]" - - if (!isnull(subject.mind)) //Save that mind so traitors can continue traitoring after cloning. - R.fields["mind"] = "\ref[subject.mind]" - - src.records += R - src.temp = "Subject successfully scanned." - -//Find a specific record by key. -/obj/machinery/computer/cloning/proc/find_record(var/find_key) - var/selected_record = null - for(var/datum/data/record/R in src.records) - if (R.fields["ckey"] == find_key) - selected_record = R - break - return selected_record - -/obj/machinery/computer/cloning/power_change() - - if(stat & BROKEN) - icon_state = "commb" - else - if( powered() ) - icon_state = initial(icon_state) - stat &= ~NOPOWER - else - spawn(rand(0, 15)) - src.icon_state = "c_unpowered" - stat |= NOPOWER - - //Find a dead mob with a brain and client. /proc/find_dead_player(var/find_key) if (isnull(find_key)) diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index af122965dff..6fea50ea712 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -50,7 +50,7 @@ origin_tech = "programming=2;biotech=2" /obj/item/weapon/circuitboard/scan_consolenew name = "Circuit board (DNA Machine)" - build_path = "/obj/machinery/scan_consolenew" + build_path = "/obj/machinery/computer/scan_consolenew" origin_tech = "programming=2;biotech=2" /obj/item/weapon/circuitboard/communications name = "Circuit board (Communications)" diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm new file mode 100644 index 00000000000..0bec1cc5b21 --- /dev/null +++ b/code/game/machinery/computer/cloning.dm @@ -0,0 +1,453 @@ +/obj/machinery/computer/scan_consolenew + name = "DNA Modifier Access Console" + desc = "Scand DNA." + icon = 'computer.dmi' + icon_state = "scanner" + density = 1 + var/uniblock = 1.0 + var/strucblock = 1.0 + var/subblock = 1.0 + var/status = null + var/radduration = 2.0 + var/radstrength = 1.0 + var/radacc = 1.0 + var/buffer1 = null + var/buffer2 = null + var/buffer3 = null + var/buffer1owner = null + var/buffer2owner = null + var/buffer3owner = null + var/buffer1label = null + var/buffer2label = null + var/buffer3label = null + var/buffer1type = null + var/buffer2type = null + var/buffer3type = null + var/buffer1iue = 0 + var/buffer2iue = 0 + var/buffer3iue = 0 + var/delete = 0 + var/injectorready = 1 + var/temphtml = null + var/obj/machinery/dna_scanner/connected = null + var/obj/item/weapon/disk/data/diskette = null + anchored = 1.0 + use_power = 1 + idle_power_usage = 10 + active_power_usage = 400 + +/obj/machinery/computer/scan_consolenew/attackby(obj/item/I as obj, 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/scan_consolenew/M = new /obj/item/weapon/circuitboard/scan_consolenew( 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/scan_consolenew/M = new /obj/item/weapon/circuitboard/scan_consolenew( 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/disk/data)) //INSERT SOME DISKETTES + if (!src.diskette) + user.drop_item() + I.loc = src + src.diskette = I + user << "You insert [I]." + src.updateUsrDialog() + return + else + src.attack_hand(user) + return + +/obj/machinery/computer/cloning + name = "Cloning console" + icon = 'computer.dmi' + icon_state = "dna" + circuit = "/obj/item/weapon/circuitboard/cloning" + req_access = list(access_heads) //Only used for record deletion right now. + var/obj/machinery/dna_scannernew/scanner = null //Linked scanner. For scanning. + var/obj/machinery/clonepod/pod1 = null //Linked cloning pod. + var/temp = "Initializing System..." + var/menu = 1 //Which menu screen to display + var/list/records = list() + var/datum/data/record/active_record = null + var/obj/item/weapon/disk/data/diskette = null //Mostly so the geneticist can steal everything. + +/obj/machinery/computer/cloning/New() + ..() + spawn(5) + updatemodules() + /*src.scanner = findscanner()//locate(/obj/machinery/dna_scannernew, get_step(src, WEST)) + src.pod1 = findcloner()//locate(/obj/machinery/clonepod, get_step(src, EAST)) + world << "SEARCHING FOR MACHEIN" + src.temp = "" + if (isnull(src.scanner)) + src.temp += " SCNR-ERROR" + if (isnull(src.pod1)) + src.temp += " POD1-ERROR" + else + src.pod1.connected = src + + if (src.temp == "") + src.temp = "System ready."*/ + return + return + +/obj/machinery/computer/cloning/proc/updatemodules() + //world << "UPDATING MODULES" + src.scanner = findscanner()//locate(/obj/machinery/dna_scannernew, get_step(src, WEST)) + src.pod1 = findcloner()//locate(/obj/machinery/clonepod, get_step(src, EAST)) + //world << "SEARCHING FOR MACHEIN" + //src.temp = "" + //if (isnull(src.scanner)) + // src.temp += " SCNR-ERROR" + if (!isnull(src.pod1)) + src.pod1.connected = src + // src.temp += " POD1-ERROR" + //else + + //if (src.temp == "") + // src.temp = "System ready." + +/obj/machinery/computer/cloning/proc/findscanner() + //..() + //world << "SEARCHING FOR SCANNER" + var/obj/machinery/dna_scannernew/scannerf = null + for(dir in list(NORTH,EAST,SOUTH,WEST)) + //world << "SEARCHING IN [dir]" + scannerf = locate(/obj/machinery/dna_scannernew, get_step(src, dir)) + if (!isnull(scannerf)) + //world << "FOUND" + break + return scannerf + +/obj/machinery/computer/cloning/proc/findcloner() + //..() + //world << "SEARCHING FOR POD" + var/obj/machinery/clonepod/podf = null + for(dir in list(NORTH,EAST,SOUTH,WEST)) + //world << "SEARCHING IN [dir]" + podf = locate(/obj/machinery/clonepod, get_step(src, dir)) + if (!isnull(podf)) + //world << "FOUND" + break + return podf + +/obj/machinery/computer/cloning/attackby(obj/item/W as obj, mob/user as mob) + if (istype(W, /obj/item/weapon/disk/data)) //INSERT SOME DISKETTES + if (!src.diskette) + user.drop_item() + W.loc = src + src.diskette = W + user << "You insert [W]." + src.updateUsrDialog() + return + else + ..() + return + +/obj/machinery/computer/cloning/attack_paw(mob/user as mob) + return attack_hand(user) + +/obj/machinery/computer/cloning/attack_ai(mob/user as mob) + return attack_hand(user) + +/obj/machinery/computer/cloning/attack_hand(mob/user as mob) + user.machine = src + add_fingerprint(user) + + if(stat & (BROKEN|NOPOWER)) + return + + updatemodules() + + var/dat = "

Cloning System Control

" + dat += "Refresh" + + dat += "
[temp]
" + + switch(src.menu) + if(1) + dat += "

Modules

" + //dat += "Reload Modules" + if (isnull(src.scanner)) + dat += " Scanner-ERROR
" + else + dat += " Scanner-Found!
" + if (isnull(src.pod1)) + dat += " Pod-ERROR
" + else + dat += " Pod-Found!
" + + dat += "

Scanner Functions

" + + if (isnull(src.scanner)) + dat += "No scanner connected!" + else + if (src.scanner.occupant) + dat += "Scan - [src.scanner.occupant]" + else + dat += "Scanner unoccupied" + + dat += "
Lock status: [src.scanner.locked ? "Locked" : "Unlocked"]" + + dat += "

Database Functions

" + dat += "View Records
" + if (src.diskette) + dat += "Eject Disk" + + + if(2) + dat += "

Current records

" + dat += "Back

" + for(var/datum/data/record/R in src.records) + dat += "[R.fields["id"]]-[R.fields["name"]]
" + + if(3) + dat += "

Selected Record

" + dat += "Back
" + + if (!src.active_record) + dat += "ERROR: Record not found." + else + dat += "
Delete Record
" + dat += "Name: [src.active_record.fields["name"]]
" + + var/obj/item/weapon/implant/health/H = locate(src.active_record.fields["imp"]) + + if ((H) && (istype(H))) + dat += "Health: [H.sensehealth()] | OXY-BURN-TOX-BRUTE
" + else + dat += "Unable to locate implant.
" + + if (!isnull(src.diskette)) + dat += "Load from disk." + + dat += " | Save: UI + UE" + dat += " | Save: UI" + dat += " | Save: SE" + dat += "
" + else + dat += "
" //Keeping a line empty for appearances I guess. + + dat += {"UI: [src.active_record.fields["UI"]]
+ SE: [src.active_record.fields["SE"]]

+ Clone
"} + + if(4) + if (!src.active_record) + src.menu = 2 + dat = "[src.temp]
" + dat += "

Confirm Record Deletion

" + + dat += "Scan card to confirm.
" + dat += "No" + + + user << browse(dat, "window=cloning") + onclose(user, "cloning") + return + +/obj/machinery/computer/cloning/Topic(href, href_list) + if(..()) + return + + if ((href_list["scan"]) && (!isnull(src.scanner))) + src.scan_mob(src.scanner.occupant) + + //No locking an open scanner. + else if ((href_list["lock"]) && (!isnull(src.scanner))) + if ((!src.scanner.locked) && (src.scanner.occupant)) + src.scanner.locked = 1 + else + src.scanner.locked = 0 + + else if (href_list["view_rec"]) + src.active_record = locate(href_list["view_rec"]) + if ((isnull(src.active_record.fields["ckey"])) || (src.active_record.fields["ckey"] == "")) + del(src.active_record) + src.temp = "ERROR: Record Corrupt" + else + src.menu = 3 + + else if (href_list["del_rec"]) + if ((!src.active_record) || (src.menu < 3)) + return + if (src.menu == 3) //If we are viewing a record, confirm deletion + src.temp = "Delete record?" + src.menu = 4 + + else if (src.menu == 4) + var/obj/item/weapon/card/id/C = usr.equipped() + if (istype(C)||istype(C, /obj/item/device/pda)) + if(src.check_access(C)) + src.records.Remove(src.active_record) + del(src.active_record) + src.temp = "Record deleted." + src.menu = 2 + else + src.temp = "Access Denied." + + else if (href_list["disk"]) //Load or eject. + switch(href_list["disk"]) + if("load") + if ((isnull(src.diskette)) || (src.diskette.data == "")) + src.temp = "Load error." + src.updateUsrDialog() + return + if (isnull(src.active_record)) + src.temp = "Record error." + src.menu = 1 + src.updateUsrDialog() + return + + if (src.diskette.data_type == "ui") + src.active_record.fields["UI"] = src.diskette.data + if (src.diskette.ue) + src.active_record.fields["name"] = src.diskette.owner + else if (src.diskette.data_type == "se") + src.active_record.fields["SE"] = src.diskette.data + + src.temp = "Load successful." + if("eject") + if (!isnull(src.diskette)) + src.diskette.loc = src.loc + src.diskette = null + + else if (href_list["save_disk"]) //Save to disk! + if ((isnull(src.diskette)) || (src.diskette.read_only) || (isnull(src.active_record))) + src.temp = "Save error." + src.updateUsrDialog() + return + + switch(href_list["save_disk"]) //Save as Ui/Ui+Ue/Se + if("ui") + src.diskette.data = src.active_record.fields["UI"] + src.diskette.ue = 0 + src.diskette.data_type = "ui" + if("ue") + src.diskette.data = src.active_record.fields["UI"] + src.diskette.ue = 1 + src.diskette.data_type = "ui" + if("se") + src.diskette.data = src.active_record.fields["SE"] + src.diskette.ue = 0 + src.diskette.data_type = "se" + src.diskette.owner = src.active_record.fields["name"] + src.diskette.name = "data disk - '[src.diskette.owner]'" + src.temp = "Save \[[href_list["save_disk"]]\] successful." + + else if (href_list["refresh"]) + src.updateUsrDialog() + + else if (href_list["clone"]) + var/datum/data/record/C = locate(href_list["clone"]) + //Look for that player! They better be dead! + if(C) + var/mob/selected = find_dead_player("[C.fields["ckey"]]") + +//Can't clone without someone to clone. Or a pod. Or if the pod is busy. Or full of gibs. + if ((!selected) || (!src.pod1) || (src.pod1.occupant) || (src.pod1.mess) || !config.revival_cloning) + src.temp = "Unable to initiate cloning cycle." // most helpful error message in THE HISTORY OF THE WORLD + else if (src.pod1.growclone(selected, C.fields["name"], C.fields["UI"], C.fields["SE"], C.fields["mind"], C.fields["mrace"], C.fields["interface"],C.fields["changeling"])) + src.temp = "Cloning cycle activated." + src.records.Remove(C) + del(C) + src.menu = 1 + + else if (href_list["menu"]) + src.menu = text2num(href_list["menu"]) + + src.add_fingerprint(usr) + src.updateUsrDialog() + return + +/obj/machinery/computer/cloning/proc/scan_mob(mob/living/carbon/human/subject as mob) + if ((isnull(subject)) || (!(ishuman(subject))) || (!subject.dna)) + src.temp = "Error: Unable to locate valid genetic data." + return + if (subject.brain_op_stage == 4.0) + src.temp = "Error: No signs of intelligence detected." + return + if (subject.suiciding == 1) + src.temp = "Error: Subject's brain is not responding to scanning stimuli." + return + if ((!subject.ckey) || (!subject.client)) + src.temp = "Error: Mental interface failure." + return + if (subject.mutations & HUSK) + src.temp = "Error: Mental interface failure." + return + if (!isnull(find_record(subject.ckey))) + src.temp = "Subject already in database." + return + + subject.dna.check_integrity() + + var/datum/data/record/R = new /datum/data/record( ) + R.fields["mrace"] = subject.mutantrace + R.fields["ckey"] = subject.ckey + R.fields["name"] = subject.real_name + R.fields["id"] = copytext(md5(subject.real_name), 2, 6) + R.fields["UI"] = subject.dna.uni_identity + R.fields["SE"] = subject.dna.struc_enzymes + R.fields["changeling"] = subject.changeling + + // Preferences stuff + R.fields["interface"] = subject.UI + + + + //Add an implant if needed + var/obj/item/weapon/implant/health/imp = locate(/obj/item/weapon/implant/health, subject) + if (isnull(imp)) + imp = new /obj/item/weapon/implant/health(subject) + imp.implanted = subject + R.fields["imp"] = "\ref[imp]" + //Update it if needed + else + R.fields["imp"] = "\ref[imp]" + + if (!isnull(subject.mind)) //Save that mind so traitors can continue traitoring after cloning. + R.fields["mind"] = "\ref[subject.mind]" + + src.records += R + src.temp = "Subject successfully scanned." + +//Find a specific record by key. +/obj/machinery/computer/cloning/proc/find_record(var/find_key) + var/selected_record = null + for(var/datum/data/record/R in src.records) + if (R.fields["ckey"] == find_key) + selected_record = R + break + return selected_record + +/obj/machinery/computer/cloning/power_change() + + if(stat & BROKEN) + icon_state = "commb" + else + if( powered() ) + icon_state = initial(icon_state) + stat &= ~NOPOWER + else + spawn(rand(0, 15)) + src.icon_state = "c_unpowered" + stat |= NOPOWER \ No newline at end of file diff --git a/code/game/objects/radio/radio.dm b/code/game/objects/radio/radio.dm index 7c6f352e911..f169f4525fd 100644 --- a/code/game/objects/radio/radio.dm +++ b/code/game/objects/radio/radio.dm @@ -425,14 +425,16 @@ if (!( istype(W, /obj/item/weapon/screwdriver) )) return b_stat = !( b_stat ) - if (b_stat) - user.show_message("\blue The radio can now be attached and modified!") - else - user.show_message("\blue The radio can no longer be modified or attached!") - updateDialog() - //Foreach goto(83) - add_fingerprint(user) - return + if(!istype(src, /obj/item/device/radio/beacon)) + if (b_stat) + user.show_message("\blue The radio can now be attached and modified!") + else + user.show_message("\blue The radio can no longer be modified or attached!") + updateDialog() + //Foreach goto(83) + add_fingerprint(user) + return + else return /obj/item/device/radio/emp_act(severity) broadcasting = 0 diff --git a/config/admins.txt b/config/admins.txt index 5e62b16409c..d65886dc26b 100644 --- a/config/admins.txt +++ b/config/admins.txt @@ -1,3 +1,4 @@ +quarxink - Game Master tle - Game Master xsi - Game Master sillazi - Game Master diff --git a/maps/tgstation.2.0.8.dmm b/maps/tgstation.2.0.8.dmm index a1f122f3b4a..366982e3e0d 100644 --- a/maps/tgstation.2.0.8.dmm +++ b/maps/tgstation.2.0.8.dmm @@ -1082,7 +1082,7 @@ "auP" = (/obj/structure/cable,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/auxsolarport) "auQ" = (/obj/machinery/light/small{dir = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/terminal,/turf/simulated/floor/plating,/area/maintenance/auxsolarport) "auR" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = -1},/obj/item/clothing/gloves/yellow,/obj/item/device/t_scanner,/obj/item/clothing/glasses/meson,/turf/simulated/floor/plating,/area/storage/tech) -"auS" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/scan_consolenew{pixel_x = -3; pixel_y = 3},/obj/item/weapon/circuitboard/cloning{pixel_x = 0},/obj/item/weapon/circuitboard/med_data{pixel_x = 3; pixel_y = -3},/obj/item/weapon/circuitboard/clonescanner,/obj/item/weapon/circuitboard/clonepod,/turf/simulated/floor/plating,/area/storage/tech) +"auS" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/machinery/computer/scan_consolenew,/obj/item/weapon/circuitboard/cloning{pixel_x = 0},/obj/item/weapon/circuitboard/med_data{pixel_x = 3; pixel_y = -3},/obj/item/weapon/circuitboard/clonescanner,/obj/item/weapon/circuitboard/clonepod,/turf/simulated/floor/plating,/area/storage/tech) "auT" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/storage/tech) "auU" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/pandemic{pixel_x = -3; pixel_y = 3},/obj/item/weapon/circuitboard/rdconsole,/obj/item/weapon/circuitboard/rdserver{pixel_x = 3; pixel_y = -3},/obj/item/weapon/circuitboard/destructive_analyzer,/turf/simulated/floor/plating,/area/storage/tech) "auV" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = "90Curve"},/turf/simulated/floor/plating,/area/storage/tech) @@ -3422,7 +3422,7 @@ "bnP" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/genetics) "bnQ" = (/obj/structure/stool/chair{dir = 1},/obj/effect/landmark/start{name = "Geneticist"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/genetics) "bnR" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_Toxins = 0},/turf/simulated/floor{icon_state = "white"},/area/medical/genetics) -"bnS" = (/obj/machinery/scan_consolenew,/turf/simulated/floor{icon_state = "white"},/area/medical/genetics) +"bnS" = (/obj/machinery/computer/scan_consolenew,/turf/simulated/floor{icon_state = "white"},/area/medical/genetics) "bnT" = (/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 20},/turf/simulated/floor{icon_state = "white"},/area/medical/genetics) "bnU" = (/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) "bnV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = "Streight"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) @@ -5849,7 +5849,7 @@ "ciy" = (/obj/machinery/dna_scannernew,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration/centcom) "ciz" = (/obj/machinery/computer/cloning,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration/centcom) "ciA" = (/obj/machinery/clonepod,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration/centcom) -"ciB" = (/obj/machinery/scan_consolenew,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration/centcom) +"ciB" = (/obj/machinery/computer/scan_consolenew,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration/centcom) "ciC" = (/obj/structure/device/piano{dir = 4},/turf/unsimulated/floor{tag = "icon-redyellowfull"; icon_state = "redyellowfull"},/area/centcom/living) "ciD" = (/obj/structure/stool{pixel_y = 8},/turf/unsimulated/floor{tag = "icon-redyellowfull"; icon_state = "redyellowfull"},/area/centcom/living) "ciE" = (/obj/structure/closet/secure_closet/bar{req_access_txt = "25"},/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/living) @@ -5973,7 +5973,7 @@ "ckS" = (/obj/machinery/r_n_d/server/centcom,/turf/unsimulated/floor{icon_state = "green"; dir = 6},/area/centcom/control) "ckT" = (/turf/unsimulated/floor{tag = "icon-warning (NORTH)"; icon_state = "warning"; dir = 1; heat_capacity = 1},/area/centcom/control) "ckU" = (/obj/machinery/dna_scannernew,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/test) -"ckV" = (/obj/machinery/scan_consolenew,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/test) +"ckV" = (/obj/machinery/computer/scan_consolenew,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/test) "ckW" = (/obj/machinery/computer/cloning,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/test) "ckX" = (/obj/machinery/clonepod,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/test) "ckY" = (/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) @@ -6149,7 +6149,7 @@ "com" = (/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) "con" = (/turf/space,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/shuttle/specops/centcom) "coo" = (/obj/machinery/door/airlock/centcom{name = "General Access"; opacity = 1; req_access_txt = "101"},/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/control) -"cop" = (/obj/structure/table,/obj/item/assembly/shock_kit{icon = 'icons/obj/assemblies.dmi'},/obj/item/device/assembly/signaler,/obj/item/weapon/handcuffs,/obj/item/weapon/melee/classic_baton,/turf/unsimulated/floor{icon_state = "whiteshiny"},/area/centcom/control) +"cop" = (/obj/structure/table,/obj/item/assembly/shock_kit{icon = 'assemblies.dmi'},/obj/item/device/assembly/signaler,/obj/item/weapon/handcuffs,/obj/item/weapon/melee/classic_baton,/turf/unsimulated/floor{icon_state = "whiteshiny"},/area/centcom/control) "coq" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (EAST)"; icon_state = "propulsion"; dir = 4},/turf/space,/area/shuttle/specops/centcom) "cor" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/shuttle/engine/heater{tag = "icon-heater (WEST)"; icon_state = "heater"; dir = 8},/turf/unsimulated/floor,/area/shuttle/specops/centcom) "cos" = (/obj/effect/landmark{name = "Commando-Bomb"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom)