TG: Fixed issue 286 . DNA machines now have to recharge the injector when they're

first built.
Fixed  issue 388 .
Fixed  issue 403 .
Fixed spaceheaters appearing to be off when they are both off and the hatch is
open.
Fixed being able to waste rods out of existence by building them where lattice
already exists.
Revision: r3268
Author: 	 petethegoat
This commit is contained in:
Ren Erthilo
2012-04-26 00:34:41 +01:00
parent d1fb26f3d2
commit ba0e5809d7
9 changed files with 483 additions and 441 deletions
-39
View File
@@ -224,45 +224,6 @@
idle_power_usage = 10
active_power_usage = 400
/obj/machinery/scan_consolenew
name = "DNA Modifier Access Console"
desc = "Scans 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
var/list/message = list()
anchored = 1.0
use_power = 1
idle_power_usage = 10
active_power_usage = 400
/obj/machinery/door_control
name = "remote door-control"
desc = "It controls doors, remotely."
+10 -8
View File
@@ -841,14 +841,16 @@
src.icon_state = "c_unpowered"
stat |= NOPOWER
/obj/machinery/scan_consolenew/New()
/obj/machinery/computer/scan_consolenew/New()
..()
spawn( 5 )
spawn(5)
src.connected = locate(/obj/machinery/dna_scannernew, get_step(src, WEST))
spawn(250)
src.injectorready = 1
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
@@ -856,7 +858,7 @@
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
processing_objects.Remove(src) //Lets not have it waste CPU
if(stat & (NOPOWER|BROKEN))
return
@@ -864,13 +866,13 @@
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
if(!(user in message))
@@ -931,7 +933,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))
-386
View File
@@ -20,23 +20,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.
var/wantsscan = 1
var/wantspod = 1
var/list/message = list()
//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
@@ -64,375 +47,6 @@
data = "0983E840344C39F4B059D5145FC5785DC6406A4FFF"
read_only = 1
/obj/machinery/computer/cloning/New()
..()
spawn(5)
updatemodules()
/*src.scanner = locate(/obj/machinery/dna_scannernew, get_step(src, scandir))
src.pod1 = locate(/obj/machinery/clonepod, get_step(src, poddir))
src.temp = ""
if (isnull(src.scanner) && wantsscan)
src.temp += " <font color=red>SCNR-ERROR</font>"
if (isnull(src.pod1) && wantspod)
src.temp += " <font color=red>POD1-ERROR</font>"
else if (wantspod)
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 += " <font color=red>SCNR-ERROR</font>"
if (!isnull(src.pod1) && !wantspod)
src.pod1.connected = src
// src.temp += " <font color=red>POD1-ERROR</font>"
//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(1,2,4,8,5,6,9,10))
//world << "SEARCHING IN [dir]"
scannerf = locate(/obj/machinery/dna_scannernew, get_step(src, dir))
if (!isnull(scannerf))
//world << "FOUND"
break
if(isnull(scannerf) && wantsscan)
src.temp += " <font color=red>SCNR-ERROR</font>"
return scannerf
/obj/machinery/computer/cloning/proc/findcloner()
//..()
//world << "SEARCHING FOR POD"
var/obj/machinery/clonepod/podf = null
for(dir in list(1,2,4,8,5,6,9,10))
//world << "SEARCHING IN [dir]"
podf = locate(/obj/machinery/clonepod, get_step(src, dir))
if (!isnull(podf))
//world << "FOUND"
break
if(isnull(podf) && wantspod)
src.temp += " <font color=red>POD1-ERROR</font>"
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)
if(!(user in message))
user << "\blue This machine looks extremely complex. You'd probably need a decent knowledge of Genetics to understand it."
message += user
user.machine = src
add_fingerprint(user)
if(stat & (BROKEN|NOPOWER))
return
updatemodules()
var/dat = "<h3>Cloning System Control</h3>"
dat += "<font size=-1><a href='byond://?src=\ref[src];refresh=1'>Refresh</a></font>"
dat += "<br><tt>[temp]</tt><br>"
switch(src.menu)
if(1)
if(wantsscan)
dat += "<h4>Scanner Functions</h4>"
if (isnull(src.scanner))
dat += "No scanner connected!"
else
if (src.scanner.occupant)
dat += "<a href='byond://?src=\ref[src];scan=1'>Scan - [src.scanner.occupant]</a>"
else
dat += "Scanner unoccupied"
dat += "<br>Lock status: <a href='byond://?src=\ref[src];lock=1'>[src.scanner.locked ? "Locked" : "Unlocked"]</a>"
dat += "<h4>Database Functions</h4>"
dat += "<a href='byond://?src=\ref[src];menu=2'>View Records</a><br>"
if (src.diskette)
dat += "<a href='byond://?src=\ref[src];disk=eject'>Eject Disk</a>"
if(2)
dat += "<h4>Current records</h4>"
dat += "<a href='byond://?src=\ref[src];menu=1'>Back</a><br><br>"
for(var/datum/data/record/R in geneticsrecords)
dat += "<a href='byond://?src=\ref[src];view_rec=\ref[R]'>[R.fields["id"]]-[R.fields["name"]]</a><br>"
if(3)
dat += "<h4>Selected Record</h4>"
dat += "<a href='byond://?src=\ref[src];menu=2'>Back</a><br>"
if (!src.active_record)
dat += "<font color=red>ERROR: Record not found.</font>"
else
dat += "<br><font size=1><a href='byond://?src=\ref[src];del_rec=1'>Delete Record</a></font><br>"
dat += "<b>Name:</b> [src.active_record.fields["name"]]<br>"
var/obj/item/weapon/implant/health/H = locate(src.active_record.fields["imp"])
if ((H) && (istype(H)))
dat += "<b>Health:</b> [H.sensehealth()] | OXY-BURN-TOX-BRUTE<br>"
else
dat += "<font color=red>Unable to locate implant.</font><br>"
if (!isnull(src.diskette))
dat += "<a href='byond://?src=\ref[src];disk=load'>Load from disk.</a>"
dat += " | Save: <a href='byond://?src=\ref[src];save_disk=ue'>UI + UE</a>"
dat += " | Save: <a href='byond://?src=\ref[src];save_disk=ui'>UI</a>"
dat += " | Save: <a href='byond://?src=\ref[src];save_disk=se'>SE</a>"
dat += "<br>"
else
dat += "<br>" //Keeping a line empty for appearances I guess.
dat += {"<b>UI:</b> [src.active_record.fields["UI"]]<br>
<b>SE:</b> [src.active_record.fields["SE"]]<br><br>"}
if(wantspod)
dat += "<a href='byond://?src=\ref[src];clone=\ref[src.active_record]'>Clone</a><br>"
if(4)
if (!src.active_record)
src.menu = 2
dat = "[src.temp]<br>"
dat += "<h4>Confirm Record Deletion</h4>"
dat += "<b><a href='byond://?src=\ref[src];del_rec=1'>Scan card to confirm.</a></b><br>"
dat += "<b><a href='byond://?src=\ref[src];menu=3'>No</a></b>"
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))
geneticsrecords.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"]]")
var/answer = alert(selected,"Do you want to return to life?","Cloning","Yes","No")
if(answer == "No")
selected = null
//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"],C.fields["original"]))
src.temp = "Cloning cycle activated."
geneticsrecords.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/ckey = subject.ckey
if(!ckey && subject && subject.mind)
ckey = subject.mind.key
var/datum/data/record/R = new /datum/data/record( )
R.fields["mrace"] = subject.mutantrace
R.fields["ckey"] = 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
R.fields["original"] = subject.original_name
// 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))
var/datum/organ/external/O = subject.organs[pick(subject.organs)]
imp = new /obj/item/weapon/implant/health(O)
O.implant += imp
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]"
geneticsrecords += R //Save it to the global scan list.
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 geneticsrecords)
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))
+464
View File
@@ -0,0 +1,464 @@
/obj/machinery/computer/scan_consolenew
name = "DNA Modifier Access Console"
desc = "Scans 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 = 0 //Quick fix for issue 286 (screwdriver the screen twice to restore injector) -Pete
var/temphtml = null
var/obj/machinery/dna_scanner/connected = null
var/obj/item/weapon/disk/data/diskette = null
var/list/message = list()
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.
var/wantsscan = 1
var/wantspod = 1
var/list/message = list()
/obj/machinery/computer/cloning/New()
..()
spawn(5)
updatemodules()
/*src.scanner = locate(/obj/machinery/dna_scannernew, get_step(src, scandir))
src.pod1 = locate(/obj/machinery/clonepod, get_step(src, poddir))
src.temp = ""
if (isnull(src.scanner) && wantsscan)
src.temp += " <font color=red>SCNR-ERROR</font>"
if (isnull(src.pod1) && wantspod)
src.temp += " <font color=red>POD1-ERROR</font>"
else if (wantspod)
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 += " <font color=red>SCNR-ERROR</font>"
if (!isnull(src.pod1) && !wantspod)
src.pod1.connected = src
// src.temp += " <font color=red>POD1-ERROR</font>"
//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(1,2,4,8,5,6,9,10))
//world << "SEARCHING IN [dir]"
scannerf = locate(/obj/machinery/dna_scannernew, get_step(src, dir))
if (!isnull(scannerf))
//world << "FOUND"
break
if(isnull(scannerf) && wantsscan)
src.temp += " <font color=red>SCNR-ERROR</font>"
return scannerf
/obj/machinery/computer/cloning/proc/findcloner()
//..()
//world << "SEARCHING FOR POD"
var/obj/machinery/clonepod/podf = null
for(dir in list(1,2,4,8,5,6,9,10))
//world << "SEARCHING IN [dir]"
podf = locate(/obj/machinery/clonepod, get_step(src, dir))
if (!isnull(podf))
//world << "FOUND"
break
if(isnull(podf) && wantspod)
src.temp += " <font color=red>POD1-ERROR</font>"
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)
if(!(user in message))
user << "\blue This machine looks extremely complex. You'd probably need a decent knowledge of Genetics to understand it."
message += user
user.machine = src
add_fingerprint(user)
if(stat & (BROKEN|NOPOWER))
return
updatemodules()
var/dat = "<h3>Cloning System Control</h3>"
dat += "<font size=-1><a href='byond://?src=\ref[src];refresh=1'>Refresh</a></font>"
dat += "<br><tt>[temp]</tt><br>"
switch(src.menu)
if(1)
if(wantsscan)
dat += "<h4>Scanner Functions</h4>"
if (isnull(src.scanner))
dat += "No scanner connected!"
else
if (src.scanner.occupant)
dat += "<a href='byond://?src=\ref[src];scan=1'>Scan - [src.scanner.occupant]</a>"
else
dat += "Scanner unoccupied"
dat += "<br>Lock status: <a href='byond://?src=\ref[src];lock=1'>[src.scanner.locked ? "Locked" : "Unlocked"]</a>"
dat += "<h4>Database Functions</h4>"
dat += "<a href='byond://?src=\ref[src];menu=2'>View Records</a><br>"
if (src.diskette)
dat += "<a href='byond://?src=\ref[src];disk=eject'>Eject Disk</a>"
if(2)
dat += "<h4>Current records</h4>"
dat += "<a href='byond://?src=\ref[src];menu=1'>Back</a><br><br>"
for(var/datum/data/record/R in geneticsrecords)
dat += "<a href='byond://?src=\ref[src];view_rec=\ref[R]'>[R.fields["id"]]-[R.fields["name"]]</a><br>"
if(3)
dat += "<h4>Selected Record</h4>"
dat += "<a href='byond://?src=\ref[src];menu=2'>Back</a><br>"
if (!src.active_record)
dat += "<font color=red>ERROR: Record not found.</font>"
else
dat += "<br><font size=1><a href='byond://?src=\ref[src];del_rec=1'>Delete Record</a></font><br>"
dat += "<b>Name:</b> [src.active_record.fields["name"]]<br>"
var/obj/item/weapon/implant/health/H = locate(src.active_record.fields["imp"])
if ((H) && (istype(H)))
dat += "<b>Health:</b> [H.sensehealth()] | OXY-BURN-TOX-BRUTE<br>"
else
dat += "<font color=red>Unable to locate implant.</font><br>"
if (!isnull(src.diskette))
dat += "<a href='byond://?src=\ref[src];disk=load'>Load from disk.</a>"
dat += " | Save: <a href='byond://?src=\ref[src];save_disk=ue'>UI + UE</a>"
dat += " | Save: <a href='byond://?src=\ref[src];save_disk=ui'>UI</a>"
dat += " | Save: <a href='byond://?src=\ref[src];save_disk=se'>SE</a>"
dat += "<br>"
else
dat += "<br>" //Keeping a line empty for appearances I guess.
dat += {"<b>UI:</b> [src.active_record.fields["UI"]]<br>
<b>SE:</b> [src.active_record.fields["SE"]]<br><br>"}
if(wantspod)
dat += "<a href='byond://?src=\ref[src];clone=\ref[src.active_record]'>Clone</a><br>"
if(4)
if (!src.active_record)
src.menu = 2
dat = "[src.temp]<br>"
dat += "<h4>Confirm Record Deletion</h4>"
dat += "<b><a href='byond://?src=\ref[src];del_rec=1'>Scan card to confirm.</a></b><br>"
dat += "<b><a href='byond://?src=\ref[src];menu=3'>No</a></b>"
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))
geneticsrecords.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"]]")
var/answer = alert(selected,"Do you want to return to life?","Cloning","Yes","No")
if(answer == "No")
selected = null
//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"],C.fields["original"]))
src.temp = "Cloning cycle activated."
geneticsrecords.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/ckey = subject.ckey
if(!ckey && subject && subject.mind)
ckey = subject.mind.key
var/datum/data/record/R = new /datum/data/record( )
R.fields["mrace"] = subject.mutantrace
R.fields["ckey"] = 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
R.fields["original"] = subject.original_name
// 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))
var/datum/organ/external/O = subject.organs[pick(subject.organs)]
imp = new /obj/item/weapon/implant/health(O)
O.implant += imp
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]"
geneticsrecords += R //Save it to the global scan list.
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 geneticsrecords)
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
+3 -3
View File
@@ -23,10 +23,10 @@
return
update_icon()
overlays = null
icon_state = "sheater[on]"
if(open)
icon_state = "sheater-open"
else
icon_state = "sheater[on]"
overlays += "sheater-open"
return
examine()
@@ -211,11 +211,8 @@ the implant may become unstable and either pre-maturely inject the subject or si
if(!istype(M, /mob/living/carbon/human)) return
var/mob/living/carbon/human/H = M
if(H.mind in ticker.mode.head_revolutionaries)
visible_message("\red [M] seems to resist the implant.", 1)
for(var/mob/O in (viewers(M) - M))
O.show_message("\red [M] seems to resist the implant.", 1)
M << "\red You resist the implant."
return
H.visible_message("[H] seems to resist the implant!", "You feel the corporate tendrils of NanoTrasen try to invade your mind!")
return
else if(H.mind in ticker.mode:revolutionaries)
ticker.mode:remove_revolutionary(H.mind)
H << "\blue You feel a surge of loyalty towards NanoTrasen."
+3
View File
@@ -1247,6 +1247,9 @@ turf/simulated/floor/return_siding_icon_state()
/turf/space/attackby(obj/item/C as obj, mob/user as mob)
if (istype(C, /obj/item/stack/rods))
var/obj/structure/lattice/L = locate(/obj/structure/lattice, src)
if(L)
return
var/obj/item/stack/rods/R = C
user << "\blue Constructing support lattice ..."
playsound(src.loc, 'Genhit.ogg', 50, 1)