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)