From d349beec3cca983126e308b50ab780bc0e8614df Mon Sep 17 00:00:00 2001 From: Markolie Date: Thu, 30 Jul 2015 21:58:19 +0200 Subject: [PATCH] Add NanoUI multi-clone pod support --- code/game/area/areas.dm | 13 --- code/game/dna/dna_modifier.dm | 2 +- code/game/machinery/cloning.dm | 7 +- code/game/machinery/computer/cloning.dm | 147 +++++++++++++----------- nano/templates/cloning_console.tmpl | 54 +++++---- 5 files changed, 121 insertions(+), 102 deletions(-) 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
-
Pod
-
- {{if data.pod}} Found!{{else}} Error: Not detected!{{/if}} +
Pods
+
+ {{if data.numberofpods}} Found {{:data.numberofpods}}!{{else}} Error: None detected!{{/if}}
{{if data.scanner}} -

Scanner Functions

- {{if data.loading}} - Scanning... - {{else}} - {{:data.scantemp}} +

Scanner Functions

+ {{if data.loading}} + Scanning... + {{else}} + {{:data.scantemp}} + {{/if}} +
+
Scan Occupant
+
{{:helper.link('Scan', 'search', {'scan' : 1}, !data.occupant ? 'disabled' : '')}}
+
+
+
Scanner Lock
+
{{if data.occupant}}{{:helper.link('Engaged', 'locked', {'lock' : 1}, data.locked ? 'selected' : '')}}{{else}} {{:helper.link('Engaged', 'locked', null, 'disabled')}}{{/if}}{{:helper.link('Disengaged', 'unlocked', {'lock' : 1}, !data.locked ? 'selected' : '')}}
+
{{/if}} -
-
Scan Occupant
-
{{:helper.link('Scan', 'search', {'scan' : 1}, !data.occupant ? 'disabled' : '')}}
-
-
-
Scanner Lock
-
{{if data.occupant}}{{:helper.link('Engaged', 'locked', {'lock' : 1}, data.locked ? 'selected' : '')}}{{else}} {{:helper.link('Engaged', 'locked', null, 'disabled')}}{{/if}}{{:helper.link('Disengaged', 'unlocked', {'lock' : 1}, !data.locked ? 'selected' : '')}}
-
-
-
Biomass
-
{{:data.biomass}}
-
+ {{if data.numberofpods}} +

Pods

+ {{for data.pods}} +
+ {{:value.name}} +
Biomass
+
+ {{:value.biomass}} +
+
Select
+
+ {{:helper.link('Select', 'check', {'selectpod' : value.pod}, value.pod == data.selected_pod ? 'selected' : '')}} +
+
+ {{/for}} {{/if}} {{/if}} {{if data.menu == 2}} @@ -106,7 +118,7 @@ Used In File(s): \code\game\machinery\computer\cloning.dm {{/if}}
Actions
-
{{:helper.link('Clone', 'arrowreturnthick-1-e', {'clone' : data.activerecord}, !data.enoughbiomass ? 'disabled' : '')}}{{:helper.link('Delete', 'trash', {'del_rec' : 1})}}
+
{{:helper.link('Clone', 'arrowreturnthick-1-e', {'clone' : data.activerecord}, !data.podready ? 'disabled' : '')}}{{:helper.link('Delete', 'trash', {'del_rec' : 1})}}
{{/if}} {{/if}}