diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index 4b58839ce1f..f0e9bd07be9 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -39,19 +39,6 @@
// spawn(15)
power_change() // all machines set to current power level, also updates lighting icon
-/area/proc/get_contents()
- var/list/concat_contents = list()
- for (var/area/RA in related)
- concat_contents |= RA.contents
- return concat_contents
-
-/area/proc/get_cameras()
- var/list/cameras = list()
- for (var/area/RA in related)
- for (var/obj/machinery/camera/C in RA)
- cameras += C
- return cameras
-
/area/proc/poweralert(var/state, var/obj/source as obj)
if (state != poweralm)
poweralm = state
diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm
index 81be2a537b2..ef87104bd35 100644
--- a/code/game/dna/dna_modifier.dm
+++ b/code/game/dna/dna_modifier.dm
@@ -77,7 +77,7 @@
component_parts += new /obj/item/stack/cable_coil(src, 1)
component_parts += new /obj/item/stack/cable_coil(src, 1)
RefreshParts()
-
+
/obj/machinery/dna_scannernew/RefreshParts()
scan_level = 0
damage_coeff = 0
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index df0a76940f2..3b4fc5c4377 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -59,6 +59,11 @@
component_parts += new /obj/item/stack/cable_coil(src, 1)
component_parts += new /obj/item/stack/cable_coil(src, 1)
RefreshParts()
+
+/obj/machinery/clonepod/Destroy()
+ if(connected)
+ connected.pods -= src
+ ..()
/obj/machinery/clonepod/RefreshParts()
speed_coeff = 0
@@ -375,7 +380,7 @@
else
if(src.anchored)
src.anchored = 0
- connected.pod1 = null
+ connected.pods -= src
connected = null
else
src.anchored = 1
diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm
index 7e2d1b78d40..1ecc02fdb7b 100644
--- a/code/game/machinery/computer/cloning.dm
+++ b/code/game/machinery/computer/cloning.dm
@@ -15,37 +15,38 @@
var/obj/item/weapon/disk/data/diskette = null //Mostly so the geneticist can steal everything.
var/loading = 0 // Nice loading text
var/autoprocess = 0
- var/data[0]
+ var/obj/machinery/clonepod/selected_pod
light_color = LIGHT_COLOR_DARKBLUE
-/obj/machinery/computer/cloning/New()
+/obj/machinery/computer/cloning/initialize()
+ ..()
+ updatemodules()
+
+/obj/machinery/computer/cloning/Destroy()
+ releasecloner()
..()
- spawn(5)
- updatemodules()
- return
- return
/obj/machinery/computer/cloning/process()
- if(!(scanner && pod1 && autoprocess))
+ if(!scanner || !pods.len || !autoprocess)
return
if(scanner.occupant && (scanner.scan_level > 2))
scan_mob(scanner.occupant)
- if(!(pod1.occupant || pod1.mess) && (pod1.efficiency > 5))
- for(var/datum/dna2/record/R in src.records)
- if(!(pod1.occupant || pod1.mess))
- if(pod1.growclone(R))
- records.Remove(R)
-
+ for (var/obj/machinery/clonepod/pod in pods)
+ if(!(pod.occupant || pod.mess) && (pod.efficiency > 5))
+ for(var/datum/dna2/record/R in src.records)
+ if(!(pod.occupant || pod.mess))
+ if(pod.growclone(R))
+ records.Remove(R)
+
/obj/machinery/computer/cloning/proc/updatemodules()
src.scanner = findscanner()
+ releasecloner()
findcloner()
- var/num = 1
- for (var/obj/machinery/clonepod/pod in pods)
- pod.connected = src
- pod.name = "[initial(pod.name)] #[num++]"
+ if(!selected_pod)
+ selected_pod = pods[1]
/obj/machinery/computer/cloning/proc/findscanner()
var/obj/machinery/dna_scannernew/scannerf = null
@@ -63,13 +64,19 @@
return
-/obj/machinery/computer/cloning/proc/findcloner()
+/obj/machinery/computer/cloning/proc/releasecloner()
+ for(var/obj/machinery/clonepod/P in pods)
+ P.connected = null
+ P.name = initial(P.name)
pods.Cut()
+
+/obj/machinery/computer/cloning/proc/findcloner()
+ var/num = 1
for(var/obj/machinery/clonepod/P in get_area(src))
if(!P.connected)
pods += P
-
- return
+ P.connected = src
+ P.name = "[initial(P.name)] #[num++]"
/obj/machinery/computer/cloning/attackby(obj/item/W as obj, mob/user as mob, params)
if (istype(W, /obj/item/weapon/disk/data)) //INSERT SOME DISKETTES
@@ -108,31 +115,40 @@
ui_interact(user)
/obj/machinery/computer/cloning/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
- if(..())
- return
if(stat & (NOPOWER|BROKEN))
return
-
+ var/data[0]
data["menu"] = src.menu
- data["scanner"] = src.scanner
+ data["scanner"] = src.scanner
+
+ var/canpodautoprocess = 0
if(pods.len)
- data["pod"] = src.pods
+ data["numberofpods"] = src.pods.len
+
+ var/list/tempods[0]
+ for (var/obj/machinery/clonepod/pod in pods)
+ if(pod.efficiency > 5)
+ canpodautoprocess = 1
+
+ tempods.Add(list(list("pod" = "\ref[pod]", "name" = capitalize(pod.name), "biomass" = pod.biomass)))
+ data["pods"] = tempods
+
data["loading"] = loading
data["autoprocess"] = autoprocess
- if(scanner && pod1 && ((scanner.scan_level > 2) || (pod1.efficiency > 5)))
+
+ if(scanner && pods.len && ((scanner.scan_level > 2) || canpodautoprocess))
data["autoallowed"] = 1
else
data["autoallowed"] = 0
if(src.scanner)
data["occupant"] = src.scanner.occupant
data["locked"] = src.scanner.locked
- if(src.pod1)
- data["biomass"] = src.pod1.biomass
data["temp"] = temp
data["scantemp"] = scantemp
data["disk"] = src.diskette
+ data["selected_pod"] = "\ref[selected_pod]"
var/list/temprecords[0]
- for(var/datum/dna2/record/R in src.records)
+ for(var/datum/dna2/record/R in records)
var tempRealName = R.dna.real_name
temprecords.Add(list(list("record" = "\ref[R]", "realname" = tempRealName)))
data["records"] = temprecords
@@ -149,15 +165,15 @@
data["realname"] = src.active_record.dna.real_name
data["unidentity"] = src.active_record.dna.uni_identity
data["strucenzymes"] = src.active_record.dna.struc_enzymes
- if(pod1 && pod1.biomass >= CLONE_BIOMASS)
- data["enoughbiomass"] = 1
+ if(selected_pod && (selected_pod in pods) && selected_pod.biomass >= CLONE_BIOMASS)
+ data["podready"] = 1
else
- data["enoughbiomass"] = 0
+ data["podready"] = 0
// Set up the Nano UI
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
- ui = new(user, src, ui_key, "cloning_console.tmpl", "Cloning Console UI", 640, 480)
+ ui = new(user, src, ui_key, "cloning_console.tmpl", "Cloning Console UI", 640, 520)
ui.set_initial_data(data)
ui.open()
@@ -172,13 +188,11 @@
scantemp = "Scanner ready."
loading = 1
- nanomanager.update_uis(src)
spawn(20)
src.scan_mob(src.scanner.occupant)
loading = 0
- nanomanager.update_uis(src)
if(href_list["task"])
switch(href_list["task"])
@@ -195,7 +209,6 @@
src.scanner.locked = 1
else
src.scanner.locked = 0
- nanomanager.update_uis(src)
else if (href_list["view_rec"])
src.active_record = locate(href_list["view_rec"])
@@ -208,7 +221,6 @@
else
src.active_record = null
src.temp = "Error: Record missing."
- nanomanager.update_uis(src)
else if (href_list["del_rec"])
if ((!src.active_record) || (src.menu < 3))
@@ -227,30 +239,26 @@
src.menu = 2
else
src.temp = "Error: Access denied."
- nanomanager.update_uis(src)
else if (href_list["disk"]) //Load or eject.
switch(href_list["disk"])
if("load")
if ((isnull(src.diskette)) || isnull(src.diskette.buf))
src.temp = "Error: The disk's data could not be read."
- nanomanager.update_uis(src)
return
if (isnull(src.active_record))
src.temp = "Error: No active record was found."
src.menu = 1
- nanomanager.update_uis(src)
return
src.active_record = src.diskette.buf
src.temp = "Load successful."
- nanomanager.update_uis(src)
+
if("eject")
if (!isnull(src.diskette))
src.diskette.loc = src.loc
- src.diskette = null
- nanomanager.update_uis(src)
+ src.diskette = null
else if (href_list["save_disk"]) //Save to disk!
if ((isnull(src.diskette)) || (src.diskette.read_only) || (isnull(src.active_record)))
@@ -270,46 +278,53 @@
src.diskette.buf.types=DNA2_BUF_SE
src.diskette.name = "data disk - '[src.active_record.dna.real_name]'"
src.temp = "Save \[[href_list["save_disk"]]\] successful."
- nanomanager.update_uis(src)
else if (href_list["refresh"])
nanomanager.update_uis(src)
+
+ else if (href_list["selectpod"])
+ var/obj/machinery/clonepod/selected = locate(href_list["selectpod"])
+ if(istype(selected) && (selected in pods))
+ selected_pod = selected
else if (href_list["clone"])
var/datum/dna2/record/C = locate(href_list["clone"])
//Look for that player! They better be dead!
- if(C)
+ if(istype(C))
//Can't clone without someone to clone. Or a pod. Or if the pod is busy. Or full of gibs.
- if(!pod1)
+ if(!pods.len)
temp = "Error: No cloning pod detected."
- else if(pod1.occupant)
- temp = "Error: The cloning pod is currently occupied."
- else if(pod1.biomass < CLONE_BIOMASS)
- temp = "Error: Not enough biomass."
- else if(pod1.mess)
- temp = "Error: The cloning pod is malfunctioning."
- else if(!config.revival_cloning)
- temp = "Error: Unable to initiate cloning cycle."
- else if(pod1.growclone(C))
- temp = "Initiating cloning cycle..."
- records.Remove(C)
- qdel(C)
- menu = 1
- else
- var/mob/selected = find_dead_player("[C.ckey]")
- selected << 'sound/machines/chime.ogg' //probably not the best sound but I think it's reasonable
- var/answer = alert(selected,"Do you want to return to life?","Cloning","Yes","No")
- if(answer != "No" && pod1.growclone(C))
+ else
+ var/obj/machinery/clonepod/pod = selected_pod
+ if (!selected_pod)
+ temp = "Error: No cloning pod selected."
+ else if(pod.occupant)
+ temp = "Error: The cloning pod is currently occupied."
+ else if(pod.biomass < CLONE_BIOMASS)
+ temp = "Error: Not enough biomass."
+ else if(pod.mess)
+ temp = "Error: The cloning pod is malfunctioning."
+ else if(!config.revival_cloning)
+ temp = "Error: Unable to initiate cloning cycle."
+ else if(pod.growclone(C))
temp = "Initiating cloning cycle..."
records.Remove(C)
qdel(C)
menu = 1
else
- temp = "Initiating cloning cycle...
Error: Post-initialisation failed. Cloning cycle aborted."
+ var/mob/selected = find_dead_player("[C.ckey]")
+ selected << 'sound/machines/chime.ogg' //probably not the best sound but I think it's reasonable
+ var/answer = alert(selected,"Do you want to return to life?","Cloning","Yes","No")
+ if(answer != "No" && pod.growclone(C))
+ temp = "Initiating cloning cycle..."
+ records.Remove(C)
+ qdel(C)
+ menu = 1
+ else
+ temp = "Initiating cloning cycle...
Error: Post-initialisation failed. Cloning cycle aborted."
else
temp = "Error: Data corruption."
- nanomanager.update_uis(src)
else if (href_list["menu"])
src.menu = text2num(href_list["menu"])
diff --git a/nano/templates/cloning_console.tmpl b/nano/templates/cloning_console.tmpl
index 668f6a44917..7f82878aaa1 100644
--- a/nano/templates/cloning_console.tmpl
+++ b/nano/templates/cloning_console.tmpl
@@ -41,30 +41,42 @@ Used In File(s): \code\game\machinery\computer\cloning.dm