diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm
index adadb40bc9..d034ba382e 100644
--- a/code/game/machinery/computer/cloning.dm
+++ b/code/game/machinery/computer/cloning.dm
@@ -13,7 +13,7 @@
var/temp = "Inactive"
var/scantemp_ckey
var/scantemp_name
- var/scantemp = "Ready to Scan"
+ var/scantemp = "Inactive"
var/menu = 1 //Which menu screen to display
var/datum/data/record/active_record = null
var/obj/item/disk/data/diskette = null //Mostly so the geneticist can steal everything.
@@ -132,7 +132,6 @@
src.diskette = W
to_chat(user, "You insert [W]. ")
playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0)
- src.updateUsrDialog()
else if(W.tool_behaviour == TOOL_MULTITOOL)
if(istype(W.buffer, clonepod_type))
if(get_area(W.buffer) != get_area(src))
@@ -151,311 +150,233 @@
else
return ..()
-/obj/machinery/computer/cloning/ui_interact(mob/user)
+/obj/machinery/computer/cloning/AltClick(mob/user)
. = ..()
+ EjectDisk(user)
- updatemodules(TRUE)
+/obj/machinery/computer/cloning/proc/EjectDisk(mob/user)
+ if(diskette)
+ scantemp = "Disk Ejected"
+ diskette.forceMove(drop_location())
+ usr.put_in_active_hand(diskette)
+ diskette = null
+ playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0)
- var/dat = ""
- dat += "Refresh "
+/obj/machinery/computer/cloning/proc/Save(mob/user, target)
+ var/datum/data/record/GRAB = null
+ for(var/datum/data/record/record in records)
+ if(record.fields["id"] == target)
+ GRAB = record
+ break
+ else
+ continue
+ if(!GRAB || !GRAB.fields)
+ playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
+ scantemp = "Failed saving to disk: Data Corruption"
+ return FALSE
+ if(!diskette || diskette.read_only)
+ scantemp = !diskette ? "Failed saving to disk: No disk." : "Failed saving to disk: Disk refuses override attempt."
+ playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
+ return
+ diskette.fields = GRAB.fields.Copy()
+ diskette.name = "data disk - '[src.diskette.fields["name"]]'"
+ scantemp = "Saved to disk successfully."
+ playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
+/obj/machinery/computer/cloning/proc/DeleteRecord(mob/user, target)
+ var/datum/data/record/GRAB = null
+ for(var/datum/data/record/record in records)
+ if(record.fields["id"] == target)
+ GRAB = record
+ break
+ else
+ continue
+ if(!GRAB)
+ playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
+ scantemp = "Cannot delete: Data Corrupted."
+ return FALSE
+ var/obj/item/card/id/C = usr.get_idcard(hand_first = TRUE)
+ if(istype(C) || istype(C, /obj/item/pda) || istype(C, /obj/item/modular_computer/tablet))
+ if(check_access(C))
+ scantemp = "[GRAB.fields["name"]] => Record deleted."
+ records.Remove(GRAB)
+ playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
+ var/obj/item/circuitboard/computer/cloning/board = circuit
+ board.records = records
+ return TRUE
+ scantemp = "Cannot delete: Access Denied."
+ playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
+
+/obj/machinery/computer/cloning/proc/Load(mob/user)
+ if(!diskette || !istype(diskette.fields) || !diskette.fields["name"] || !diskette.fields)
+ scantemp = "Failed loading: Load error."
+ playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
+ return
+ for(var/datum/data/record/R in records)
+ if(R.fields["key"] == diskette.fields["key"])
+ scantemp = "Failed loading: Data already exists!"
+ return FALSE
+ var/datum/data/record/R = new(src)
+ for(var/key in diskette.fields)
+ R.fields[key] = diskette.fields[key]
+ records += R
+ scantemp = "Loaded into internal storage successfully."
+ var/obj/item/circuitboard/computer/cloning/board = circuit
+ board.records = records
+ playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
+
+/obj/machinery/computer/cloning/proc/Clone(mob/user, target)
+ var/datum/data/record/C = find_record("id", target, records)
+ //Look for that player! They better be dead!
+ if(C)
+ var/obj/machinery/clonepod/pod = GetAvailablePod()
+ //Can't clone without someone to clone. Or a pod. Or if the pod is busy. Or full of gibs.
+ if(!LAZYLEN(pods))
+ temp = "Error: No Clonepods detected."
+ playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
+ else if(!pod)
+ temp = "Error: No Clonepods available."
+ playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
+ else if(!CONFIG_GET(flag/revival_cloning))
+ temp = "Error: Unable to initiate cloning cycle."
+ playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
+ else if(pod.occupant)
+ temp = "Warning: Cloning cycle already in progress."
+ playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
+ else if(pod.growclone(C.fields["ckey"], C.fields["name"], C.fields["UI"], C.fields["SE"], C.fields["mind"], C.fields["blood_type"], C.fields["mrace"], C.fields["features"], C.fields["factions"], C.fields["quirks"], C.fields["bank_account"], C.fields["traumas"]))
+ temp = "Notice: [C.fields["name"]] => Cloning cycle in progress..."
+ playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
+ records.Remove(C)
+ else
+ temp = "Error: [C.fields["name"]] => Initialisation failure."
+ playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
+
+ else
+ temp = "Failed to clone: Data corrupted."
+ playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
+ . = TRUE
+
+/obj/machinery/computer/cloning/proc/Toggle_lock(mob/user)
+ if(!scanner.is_operational())
+ return
+ if(!scanner.locked && !scanner.occupant) //I figured out that if you're fast enough, you can lock an open pod
+ return
+ scanner.locked = !scanner.locked
+ playsound(src, scanner.locked ? 'sound/machines/terminal_prompt_deny.ogg' : 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
+ . = TRUE
+
+/obj/machinery/computer/cloning/proc/Scan(mob/user)
+ if(!scanner.is_operational() || !scanner.occupant)
+ return
+ scantemp = "[scantemp_name] => Scanning..."
+ loading = TRUE
+ playsound(src, 'sound/machines/terminal_prompt.ogg', 50, 0)
+ say("Initiating scan...")
+ var/prev_locked = scanner.locked
+ scanner.locked = TRUE
+ addtimer(CALLBACK(src, .proc/finish_scan, scanner.occupant, prev_locked), 2 SECONDS)
+ . = TRUE
+
+/obj/machinery/computer/cloning/proc/Toggle_autoprocess(mob/user)
+ autoprocess = !autoprocess
+ if(autoprocess)
+ START_PROCESSING(SSmachines, src)
+ playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
+ else
+ STOP_PROCESSING(SSmachines, src)
+ playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
+ . = TRUE
+
+/obj/machinery/computer/cloning/ui_data(mob/user)
+ var/list/data = list()
+ data["useRecords"] = use_records
+ var/list/records_to_send = list()
if(use_records)
if(scanner && HasEfficientPod() && scanner.scan_level >= AUTOCLONING_MINIMAL_LEVEL)
- if(!autoprocess)
- dat += "Autoclone "
- else
- dat += "Stop autoclone "
- else
- dat += "Autoclone "
- dat += "
Cloning Pod Status "
- dat += "[temp]
"
-
- switch(src.menu)
- if(1)
- // Modules
- if (isnull(src.scanner) || !LAZYLEN(pods))
- dat += "Modules "
- //dat += "Reload Modules "
- if (isnull(src.scanner))
- dat += "ERROR: No Scanner detected! "
- if (!LAZYLEN(pods))
- dat += "ERROR: No Pod detected "
-
- // Scanner
- if (!isnull(src.scanner))
- var/mob/living/scanner_occupant = get_mob_or_brainmob(scanner.occupant)
-
- dat += "Scanner Functions "
-
- dat += ""
- if(!scanner_occupant)
- dat += "Scanner Unoccupied"
- else if(loading)
- dat += "[scanner_occupant] => Scanning..."
- else
- if(use_records)
- if(scanner_occupant.ckey != scantemp_ckey || scanner_occupant.name != scantemp_name)
- scantemp = "Ready to Scan"
- scantemp_ckey = scanner_occupant.ckey
- scantemp_name = scanner_occupant.name
- else
- scantemp = "Ready to Clone"
- dat += "[scanner_occupant] => [scantemp]"
- dat += "
"
-
- if(scanner_occupant)
- dat += "[use_records ? "Start Scan" : "Clone"] "
- dat += "[scanner.locked ? "Unlock Scanner" : "Lock Scanner"] "
- else
- dat += "[use_records ? "Start Scan" : "Clone"] "
- if(use_records)
- // Database
- dat += "Database Functions "
- if (src.records.len && src.records.len > 0)
- dat += "View Records ([src.records.len]) "
- else
- dat += "View Records (0) "
- if (src.diskette)
- dat += "Eject Disk "
-
-
-
- if(2)
- dat += "Current records "
- dat += "<< Back "
+ data["hasAutoprocess"] = TRUE
+ if(length(records))
for(var/datum/data/record/R in records)
- dat += "[R.fields["name"]] Scan ID [R.fields["id"]] View Record "
- if(3)
- dat += "Selected Record "
- dat += "<< Back "
-
- if (!src.active_record)
- dat += "Record not found. "
- else
- dat += "[src.active_record.fields["name"]] "
- dat += "Scan ID [src.active_record.fields["id"]] Clone "
-
- var/obj/item/implant/health/H = locate(active_record.fields["imp"])
-
- if ((H) && (istype(H)))
- dat += "Health Implant Data: [H.sensehealth()] "
+ var/list/record_entry = list()
+ record_entry["name"] = "[R.fields["name"]]"
+ record_entry["id"] = "[R.fields["id"]]"
+ var/obj/item/implant/health/H = locate(R.fields["imp"])
+ if(H && istype(H))
+ record_entry["damages"] = H.sensehealth(TRUE)
else
- dat += "Unable to locate Health Implant. "
+ record_entry["damages"] = FALSE
+ record_entry["UI"] = "[R.fields["UI"]]"
+ record_entry["UE"] = "[R.fields["UE"]]"
+ record_entry["blood_type"] = "[R.fields["blood_type"]]"
+ records_to_send += list(record_entry)
+ data["records"] = records_to_send
+ else
+ data["records"] = list()
+ if(diskette && diskette.fields)
+ var/list/disk_data = list()
+ disk_data["name"] = "[diskette.fields["name"]]"
+ disk_data["id"] = "[diskette.fields["id"]]"
+ disk_data["UI"] = "[diskette.fields["UI"]]"
+ disk_data["UE"] = "[diskette.fields["UE"]]"
+ disk_data["blood_type"] = "[diskette.fields["blood_type"]]"
+ data["diskData"] = disk_data
+ else
+ data["diskData"] = list()
+ else
+ data["hasAutoprocess"] = FALSE
+ data["autoprocess"] = autoprocess
+ var/list/lack_machine = list()
+ if(isnull(src.scanner))
+ lack_machine += "ERROR: No Scanner Detected!"
+ if(!LAZYLEN(pods))
+ lack_machine += "ERROR: No Pod Detected!"
+ data["lacksMachine"] = lack_machine
+ data["temp"] = temp
+ var/build_temp = null
+ var/mob/living/scanner_occupant = get_mob_or_brainmob(scanner?.occupant)
+ if(scanner_occupant?.ckey != scantemp_ckey || scanner_occupant?.name != scantemp_name)
+ if(use_records)
+ build_temp = "Ready to Scan"
+ scantemp_ckey = scanner_occupant?.ckey
+ scantemp_name = scanner_occupant?.name
+ else
+ build_temp = "Ready to Clone"
+ scantemp = "[scanner_occupant] => [build_temp]"
+ data["scanTemp"] = scantemp
+ data["scannerLocked"] = scanner?.locked
+ data["hasOccupant"] = scanner?.occupant
+ data["recordsLength"] = "View Records ([length(records)])"
- dat += "Unique Identifier: [src.active_record.fields["UI"]] "
- dat += "Structural Enzymes: [src.active_record.fields["SE"]] "
+ return data
- if(diskette && diskette.fields)
- dat += ""
- dat += "
Inserted Disk "
- dat += "
Contents: "
- var/list/L = list()
- if(diskette.fields["UI"])
- L += "Unique Identifier"
- if(diskette.fields["UE"] && diskette.fields["name"] && diskette.fields["blood_type"])
- L += "Unique Enzymes"
- if(diskette.fields["SE"])
- L += "Structural Enzymes"
- dat += english_list(L, "Empty", " + ", " + ")
- dat += "
Load from Disk "
-
- dat += "
Save to Disk "
- dat += "
"
-
- dat += "Delete Record "
-
- if(4)
- if (!src.active_record)
- src.menu = 2
- dat = "[src.temp] "
- dat += "Confirm Record Deletion "
-
- dat += "Scan card to confirm. "
- dat += "Cancel "
-
-
- var/datum/browser/popup = new(user, "cloning", "Cloning System Control")
- popup.set_content(dat)
- popup.open()
-
-/obj/machinery/computer/cloning/Topic(href, href_list)
+/obj/machinery/computer/cloning/ui_act(action, params)
if(..())
return
+ switch(action)
+ if("toggle_autoprocess")
+ Toggle_autoprocess(usr)
+ if("scan")
+ Scan(usr)
+ if("toggle_lock")
+ Toggle_lock(usr)
+ if("clone")
+ Clone(usr, params["target"])
+ if("delrecord")
+ DeleteRecord(usr, params["target"])
+ if("save")
+ Save(usr, params["target"])
+ if("load")
+ Load(usr)
+ if("eject")
+ EjectDisk(usr)
- if(loading)
+/obj/machinery/computer/cloning/ui_interact(mob/user, datum/tgui/ui)
+ if(..())
return
-
- if(href_list["task"])
- switch(href_list["task"])
- if("autoprocess")
- if(scanner && HasEfficientPod() && scanner.scan_level >= AUTOCLONING_MINIMAL_LEVEL)
- autoprocess = TRUE
- START_PROCESSING(SSmachines, src)
- playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
- if("stopautoprocess")
- autoprocess = FALSE
- STOP_PROCESSING(SSmachines, src)
- playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
- src.updateUsrDialog()
- . = TRUE
-
- else if ((href_list["scan"]) && !isnull(scanner) && scanner.is_operational())
- scantemp = ""
-
- loading = TRUE
- playsound(src, 'sound/machines/terminal_prompt.ogg', 50, 0)
- say("Initiating scan...")
- var/prev_locked = scanner.locked
- scanner.locked = TRUE
- src.updateUsrDialog()
- addtimer(CALLBACK(src, .proc/finish_scan, scanner.occupant, prev_locked), 2 SECONDS)
- . = TRUE
-
- //No locking an open scanner.
- else if ((href_list["lock"]) && !isnull(scanner) && scanner.is_operational())
- if ((!scanner.locked) && (scanner.occupant))
- scanner.locked = TRUE
- playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
- else
- scanner.locked = FALSE
- playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
- src.updateUsrDialog()
- . = TRUE
-
-
- else if (href_list["refresh"])
- src.updateUsrDialog()
- playsound(src, "terminal_type", 25, 0)
- . = TRUE
-
- if(. || !use_records)
- return
- if(href_list["view_rec"])
- playsound(src, "terminal_type", 25, 0)
- src.active_record = find_record("id", href_list["view_rec"], records)
- if(active_record)
- if(!active_record.fields["ckey"])
- records -= active_record
- active_record = null
- src.temp = "Record Corrupt "
- else
- src.menu = 3
- else
- src.temp = "Record missing."
- src.updateUsrDialog()
- . = TRUE
-
- 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
- src.updateUsrDialog()
- playsound(src, 'sound/machines/terminal_prompt.ogg', 50, 0)
-
- else if (src.menu == 4)
- var/obj/item/card/id/C = usr.get_active_held_item()
- if (istype(C)||istype(C, /obj/item/pda))
- if(src.check_access(C))
- src.temp = "[src.active_record.fields["name"]] => Record deleted."
- src.records.Remove(active_record)
- active_record = null
- src.updateUsrDialog()
- playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
- src.menu = 2
- var/obj/item/circuitboard/computer/cloning/board = circuit
- board.records = records
- else
- src.temp = "Access Denied. "
- src.updateUsrDialog()
- playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
- . = TRUE
-
- else if (href_list["disk"] && use_records) //Load or eject.
- switch(href_list["disk"])
- if("load")
- if (!diskette || !istype(diskette.fields) || !diskette.fields["name"] || !diskette.fields)
- src.temp = "Load error. "
- src.updateUsrDialog()
- playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
- return
- if (!src.active_record)
- src.temp = "Record error. "
- src.menu = 1
- src.updateUsrDialog()
- playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
- return
-
- for(var/key in diskette.fields)
- src.active_record.fields[key] = diskette.fields[key]
- src.temp = "Load successful."
- src.updateUsrDialog()
- var/obj/item/circuitboard/computer/cloning/board = circuit
- board.records = records
- playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
-
- if("eject")
- if(src.diskette)
- src.diskette.forceMove(drop_location())
- src.diskette = null
- playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0)
- if("save")
- if(!diskette || diskette.read_only || !active_record || !active_record.fields)
- src.temp = "Save error. "
- src.updateUsrDialog()
- playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
- return
-
- diskette.fields = active_record.fields.Copy()
- diskette.name = "data disk - '[src.diskette.fields["name"]]'"
- src.temp = "Save successful."
- src.updateUsrDialog()
- playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
- . = TRUE
-
- else if (href_list["clone"])
- var/datum/data/record/C = find_record("id", href_list["clone"], records)
- //Look for that player! They better be dead!
- if(C)
- var/obj/machinery/clonepod/pod = GetAvailablePod()
- //Can't clone without someone to clone. Or a pod. Or if the pod is busy. Or full of gibs.
- if(!LAZYLEN(pods))
- temp = "No Clonepods detected. "
- playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
- else if(!pod)
- temp = "No Clonepods available. "
- playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
- else if(!CONFIG_GET(flag/revival_cloning))
- temp = "Unable to initiate cloning cycle. "
- playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
- else if(pod.occupant)
- temp = "Cloning cycle already in progress. "
- playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
- else if(pod.growclone(C.fields["ckey"], C.fields["name"], C.fields["UI"], C.fields["SE"], C.fields["mind"], C.fields["blood_type"], C.fields["mrace"], C.fields["features"], C.fields["factions"], C.fields["quirks"], C.fields["bank_account"], C.fields["traumas"]))
- temp = "[C.fields["name"]] => Cloning cycle in progress... "
- playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
- records.Remove(C)
- if(active_record == C)
- active_record = null
- menu = 1
- src.updateUsrDialog()
- else
- temp = "[C.fields["name"]] => Initialisation failure. "
- src.updateUsrDialog()
- playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
-
- else
- temp = "Data corruption. "
- src.updateUsrDialog()
- playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
- . = TRUE
-
- else if (href_list["menu"] && use_records)
- menu = text2num(href_list["menu"])
- src.updateUsrDialog()
- playsound(src, "terminal_type", 25, 0)
- . = TRUE
+ updatemodules(TRUE)
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "CloningConsole", "Cloning System Control")
+ ui.open()
/obj/machinery/computer/cloning/proc/finish_scan(mob/living/L, prev_locked)
if(!scanner || !L)
@@ -469,7 +390,6 @@
loading = FALSE
scanner.locked = prev_locked
- src.updateUsrDialog()
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
@@ -568,44 +488,44 @@
var/obj/machinery/clonepod/pod = GetAvailablePod()
//Can't clone without someone to clone. Or a pod. Or if the pod is busy. Or full of gibs.
if(!LAZYLEN(pods))
- temp = "No Clonepods detected. "
+ temp = "No Clonepods detected."
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
else if(!pod)
- temp = "No Clonepods available. "
+ temp = "No Clonepods available."
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
else if(pod.occupant)
- temp = "Cloning cycle already in progress. "
+ temp = "Cloning cycle already in progress."
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
else
pod.growclone(null, mob_occupant.real_name, dna.uni_identity, dna.mutation_index, null, dna.blood_type, clone_species, dna.features, mob_occupant.faction)
- temp = "[mob_occupant.real_name] => Cloning data sent to pod. "
+ temp = "[mob_occupant.real_name] => Cloning data sent to pod."
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
/obj/machinery/computer/cloning/proc/can_scan(datum/dna/dna, mob/living/mob_occupant, experimental = FALSE, datum/bank_account/account)
if(!istype(dna))
- scantemp = "Unable to locate valid genetic data. "
+ scantemp = "Unable to locate valid genetic data."
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
return
if(!experimental)
if(mob_occupant.suiciding || mob_occupant.hellbound)
- scantemp = "Subject's brain is not responding to scanning stimuli. "
+ scantemp = "Subject's brain is not responding to scanning stimuli."
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
return
if((HAS_TRAIT(mob_occupant, TRAIT_NOCLONE)) && (src.scanner.scan_level < 2))
- scantemp = "Subject no longer contains the fundamental materials required to create a living clone. "
+ scantemp = "Subject no longer contains the fundamental materials required to create a living clone."
playsound(src, 'sound/machines/terminal_alert.ogg', 50, 0)
return
if (!experimental)
if(!mob_occupant.ckey || !mob_occupant.client)
- scantemp = "Mental interface failure. "
+ scantemp = "Mental interface failure."
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
return
if (find_record("ckey", mob_occupant.ckey, records))
- scantemp = "Subject already in database. "
+ scantemp = "Subject already in database."
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
return
if(SSeconomy.full_ancap && !account)
- scantemp = "Subject is either missing an ID card with a bank account on it, or does not have an account to begin with. Please ensure the ID card is on the body before attempting to scan. "
+ scantemp = "Subject is either missing an ID card with a bank account on it, or does not have an account to begin with. Please ensure the ID card is on the body before attempting to scan."
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
return
return TRUE
@@ -618,3 +538,4 @@
icon_keyboard = "med_key"
circuit = /obj/item/circuitboard/computer/cloning/prototype
clonepod_type = /obj/machinery/clonepod/experimental
+ use_records = FALSE //Wait, so you tell me it lacks records but you never set it as false?
diff --git a/code/game/objects/items/implants/implant_misc.dm b/code/game/objects/items/implants/implant_misc.dm
index 0a86abdec9..6d8ae34ef5 100644
--- a/code/game/objects/items/implants/implant_misc.dm
+++ b/code/game/objects/items/implants/implant_misc.dm
@@ -139,14 +139,25 @@
name = "health implant"
activated = 0
var/healthstring = ""
+ var/list/raw_data = list()
-/obj/item/implant/health/proc/sensehealth()
+/obj/item/implant/health/proc/sensehealth(get_list = FALSE)
if (!imp_in)
return "ERROR"
else
if(isliving(imp_in))
var/mob/living/L = imp_in
healthstring = "Oxygen Deprivation Damage => [round(L.getOxyLoss())] Fire Damage => [round(L.getFireLoss())] Toxin Damage => [round(L.getToxLoss())] Brute Force Damage => [round(L.getBruteLoss())] "
- if (!healthstring)
+ raw_data = list() //Reset list
+ raw_data["oxy"] = list("[round(L.getOxyLoss())]") //Suffocation
+ raw_data["burn"] = list("[round(L.getFireLoss())]") //Burn
+ raw_data["tox"] = list("[round(L.getToxLoss())]") //Tox
+ raw_data["brute"] = list("[round(L.getBruteLoss())]") //Brute
+ if(!healthstring) //I have no idea who made it go this order but okay.
healthstring = "ERROR"
- return healthstring
+ if(!length(raw_data))
+ raw_data = list("ERROR")
+ if(!get_list)
+ return healthstring
+ else
+ return raw_data
diff --git a/tgui/packages/tgui/interfaces/CloningConsole.js b/tgui/packages/tgui/interfaces/CloningConsole.js
new file mode 100644
index 0000000000..8b72e24552
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/CloningConsole.js
@@ -0,0 +1,176 @@
+import { map } from 'common/collections';
+import { useBackend } from '../backend';
+import { Box, Button, Collapsible, NoticeBox, ProgressBar, Section } from '../components';
+import { Window } from '../layouts';
+
+export const CloningConsole = (props, context) => {
+ const { act, data } = useBackend(context);
+ const {
+ useRecords,
+ hasAutoprocess,
+ autoprocess,
+ temp,
+ scanTemp,
+ scannerLocked,
+ hasOccupant,
+ recordsLength,
+ } = data;
+ const lacksMachine = data.lacksMachine || [];
+ const diskData = data.diskData || [];
+ const records = data.records || [];
+ return (
+
+
+ {useRecords ? (
+ act('toggle_autoprocess')}
+ />
+ }
+ />
+ ) : (null) }
+
+
+ {!lacksMachine.length ? (
+
+
+
+ {scanTemp}
+
+
+ act('scan')}
+ />
+ act('toggle_lock')}
+ />
+
+ ) : (
+
+ {lacksMachine.map(machine => (
+
+ {machine}
+
+ ))}
+
+ )}
+ {useRecords ? (
+
+
+
+
+ Current Records:
+ {records.map(record => (
+
+
+
+ Scan ID {record["id"]}
+
act('clone', {
+ target: record["id"],
+ })}
+ />
+ act('delrecord', {
+ target: record["id"],
+ })}
+ />
+ act('save', {
+ target: record["id"],
+ })}
+ />
+
+ Health Implant Data
+
+
+ Oxygen Deprivation Damage:
+
+ Fire Damage:
+
+ Toxin Damage:
+
+ Brute Damage:
+
+
+ Unique Identifier:
+ {record["UI"]}
+ Unique Enzymes:
+ {record["UE"]}
+ Blood Type:
+ {record["blood_type"]}
+
+
+
+ ))}
+
+
+
+
+ act('load')}
+ />
+ act('eject')}
+ />
+
+ }
+ >
+ {diskData.length !== 0 ? (
+
+ {diskData["id"] ? (
+
+ ID: {diskData["id"]}
+ UI: {diskData["UI"]}
+ UE: {diskData["UE"]}
+ Blood Type: {diskData["blood_type"]}
+
+ ) : ("No Data")}
+
+ ) : ("No Disk")}
+
+
+ ) : (null)}
+
+
+
+ );
+};