Circuit Imprinter is busy at the moment.")
updateUsrDialog()
return
var/coeff = linked_imprinter.efficiency_coeff
var/power = 1000
var/old_screen = screen
for(var/M in being_built.materials)
power += round(being_built.materials[M] / 5)
power = max(4000, power)
screen = 0.4
if (!(being_built.build_type & IMPRINTER))
message_admins("Circuit imprinter exploit attempted by [key_name(usr, usr.client)]!")
updateUsrDialog()
return
var/g2g = 1
var/enough_materials = 1
linked_imprinter.busy = TRUE
flick("circuit_imprinter_ani", linked_imprinter)
use_power(power)
var/list/efficient_mats = list()
for(var/MAT in being_built.materials)
efficient_mats[MAT] = being_built.materials[MAT]/coeff
if(!imprinter_materials.has_materials(efficient_mats))
linked_imprinter.say("Not enough materials to complete prototype.")
enough_materials = 0
g2g = 0
else
for(var/R in being_built.reagents_list)
if(!linked_imprinter.reagents.has_reagent(R, being_built.reagents_list[R]/coeff))
linked_imprinter.say("Not enough reagents to complete prototype.")
enough_materials = 0
g2g = 0
if(enough_materials)
imprinter_materials.use_amount(efficient_mats)
for(var/R in being_built.reagents_list)
linked_imprinter.reagents.remove_reagent(R, being_built.reagents_list[R]/coeff)
var/P = being_built.build_path //lets save these values before the spawn() just in case. Nobody likes runtimes.
spawn(16)
if(linked_imprinter)
if(g2g)
var/obj/item/new_item = new P(src)
new_item.loc = linked_imprinter.loc
new_item.materials = efficient_mats.Copy()
SSblackbox.add_details("circuit_printed","[new_item.type]")
screen = old_screen
linked_imprinter.busy = FALSE
else
say("Circuit Imprinter connection failed. Production halted.")
screen = 1.0
updateUsrDialog()
//Protolathe Materials
else if(href_list["disposeP"] && linked_lathe) //Causes the protolathe to dispose of a single reagent (all of it)
linked_lathe.reagents.del_reagent(href_list["disposeP"])
else if(href_list["disposeallP"] && linked_lathe) //Causes the protolathe to dispose of all it's reagents.
linked_lathe.reagents.clear_reagents()
else if(href_list["ejectsheet"] && linked_lathe) //Causes the protolathe to eject a sheet of material
linked_materials.retrieve_sheets(text2num(href_list["eject_amt"]), href_list["ejectsheet"])
//Circuit Imprinter Materials
else if(href_list["disposeI"] && linked_imprinter) //Causes the circuit imprinter to dispose of a single reagent (all of it)
linked_imprinter.reagents.del_reagent(href_list["disposeI"])
else if(href_list["disposeallI"] && linked_imprinter) //Causes the circuit imprinter to dispose of all it's reagents.
linked_imprinter.reagents.clear_reagents()
else if(href_list["imprinter_ejectsheet"] && linked_imprinter) //Causes the imprinter to eject a sheet of material
imprinter_materials.retrieve_sheets(text2num(href_list["eject_amt"]), href_list["imprinter_ejectsheet"])
else if(href_list["find_device"]) //The R&D console looks for devices nearby to link up with.
screen = 0.0
spawn(20)
SyncRDevices()
screen = 1.7
updateUsrDialog()
else if(href_list["disconnect"]) //The R&D console disconnects with a specific device.
switch(href_list["disconnect"])
if("destroy")
linked_destroy.linked_console = null
linked_destroy = null
if("lathe")
linked_lathe.linked_console = null
linked_lathe = null
if("imprinter")
linked_imprinter.linked_console = null
linked_imprinter = null
else if(href_list["reset"]) //Reset the R&D console's database.
griefProtection()
var/choice = alert("R&D Console Database Reset", "Are you sure you want to reset the R&D console's database? Data lost cannot be recovered.", "Continue", "Cancel")
if(choice == "Continue" && usr.canUseTopic(src))
message_admins("[key_name_admin(usr)] reset \the [src.name]'s database")
log_game("[key_name_admin(usr)] reset \the [src.name]'s database")
screen = 0.0
qdel(files)
files = new /datum/research(src)
spawn(20)
screen = 1.6
updateUsrDialog()
else if(href_list["search"]) //Search for designs with name matching pattern
var/compare
matching_designs.Cut()
if(href_list["type"] == "proto")
compare = PROTOLATHE
screen = 3.17
else
compare = IMPRINTER
screen = 4.17
for(var/v in files.known_designs)
var/datum/design/D = files.known_designs[v]
if(!(D.build_type & compare))
continue
if(findtext(D.name,href_list["to_search"]))
matching_designs.Add(D)
updateUsrDialog()
return
/obj/machinery/computer/rdconsole/attack_hand(mob/user)
if(..())
return
interact(user)
/obj/machinery/computer/rdconsole/interact(mob/user)
user.set_machine(src)
if(first_use)
SyncRDevices()
var/dat = ""
files.RefreshResearch()
switch(screen) //A quick check to make sure you get the right screen when a device is disconnected.
if(2 to 2.9)
if(screen == 2.3)
;
else if(linked_destroy == null)
screen = 2.0
else if(linked_destroy.loaded_item == null)
screen = 2.1
else
screen = 2.2
if(3 to 3.9)
if(linked_lathe == null)
screen = 3.0
if(4 to 4.9)
if(linked_imprinter == null)
screen = 4.0
var/datum/component/material_container/linked_materials
if(linked_lathe)
linked_materials = linked_lathe.GetComponent(/datum/component/material_container)
var/datum/component/material_container/imprinter_materials
if(linked_imprinter)
imprinter_materials = linked_imprinter.GetComponent(/datum/component/material_container)
switch(screen)
//////////////////////R&D CONSOLE SCREENS//////////////////
if(0.0)
dat += "Updating Database....
"
if(0.1)
dat += "Processing and Updating Database...
"
if(0.2)
dat += "SYSTEM LOCKED
"
dat += "Unlock"
if(0.3)
dat += "Constructing Prototype. Please Wait...
"
if(0.4)
dat += "Imprinting Circuit. Please Wait...
"
if(1.0) //Main Menu
dat += ""
if(1.1) //Research viewer
dat += "Main Menu"
dat += "Current Research Levels:
"
for(var/v in files.known_tech)
var/datum/tech/T = files.known_tech[v]
if(T.level <= 0)
continue
dat += "[T.name]
"
dat += "* Level: [T.level]
"
dat += "* Summary: [T.desc]
"
dat += ""
if(1.2) //Technology Disk Menu
dat += "Main Menu
"
dat += "Disk Operations: Clear DiskUpload AllEject Disk"
for(var/i in 1 to t_disk.max_tech_stored)
dat += ""
if(t_disk.tech_stored[i])
var/datum/tech/tech = t_disk.tech_stored[i]
dat += "Name: [tech.name]
"
dat += "Level: [tech.level]
"
dat += "Description: [tech.desc]
"
dat += "Operations:
Upload to DatabaseClear Slot"
else
dat += "Empty Slot
Operations:
Load Tech to Slot"
dat += "
"
if(1.3) //Technology Disk submenu
dat += "Main Menu"
dat += "Return to Disk Operations"
dat += "
Load Technology to Disk:
"
for(var/v in files.known_tech)
var/datum/tech/T = files.known_tech[v]
if(T.level <= 0)
continue
dat += "[T.name]"
dat += "
Copy to Disk"
dat += "
"
if(1.4) //Design Disk menu.
dat += "Main Menu
"
dat += "Disk Operations: Clear DiskUpload AllEject Disk"
for(var/i in 1 to d_disk.max_blueprints)
dat += ""
if(d_disk.blueprints[i])
var/datum/design/D = d_disk.blueprints[i]
dat += "Name: [D.name]
"
if(D.build_type)
dat += "Lathe Types:
"
if(D.build_type & IMPRINTER)
dat += "Circuit Imprinter
"
if(D.build_type & PROTOLATHE)
dat += "Protolathe
"
if(D.build_type & AUTOLATHE)
dat += "Autolathe
"
if(D.build_type & MECHFAB)
dat += "Exosuit Fabricator
"
if(D.build_type & BIOGENERATOR)
dat += "Biogenerator
"
if(D.build_type & LIMBGROWER)
dat += "Limbgrower
"
if(D.build_type & SMELTER)
dat += "Smelter
"
dat += "Required Materials:
"
var/all_mats = D.materials + D.reagents_list
for(var/M in all_mats)
dat += "* [CallMaterialName(M)] x [all_mats[M]]
"
dat += "Operations:
Upload to Database Clear Slot"
else
dat += "Empty Slot
Operations:
Load Design to Slot"
dat += "
"
if(1.5) //Design disk submenu
dat += "Main Menu"
dat += "Return to Disk Operations"
dat += "
Load Design to Disk:
"
for(var/v in files.known_designs)
var/datum/design/D = files.known_designs[v]
dat += "[D.name] "
dat += "
Copy to Disk"
dat += "
"
if(1.6) //R&D console settings
dat += "Main Menu"
if(1.7) //R&D device linkage
dat += "Main Menu"
dat += "Settings Menu"
dat += "
R&D Console Device Linkage Menu:
"
dat += "
Re-sync with Nearby Devices"
dat += "
Linked Devices:
"
if(linked_destroy)
dat += "* Destructive Analyzer
Disconnect"
else
dat += "* No Destructive Analyzer Linked
"
if(linked_lathe)
dat += "* Protolathe
Disconnect"
else
dat += "* No Protolathe Linked
"
if(linked_imprinter)
dat += "* Circuit Imprinter
Disconnect"
else
dat += "* No Circuit Imprinter Linked
"
dat += "
"
////////////////////DESTRUCTIVE ANALYZER SCREENS////////////////////////////
if(2.0)
dat += "Main Menu"
dat += "NO DESTRUCTIVE ANALYZER LINKED TO CONSOLE
"
if(2.1)
dat += "Main Menu"
dat += "No Item Loaded. Standing-by...
"
if(2.2)
dat += "Main Menu"
dat += "
Deconstruction Menu
"
dat += "Name: [linked_destroy.loaded_item.name]
"
dat += "Origin Tech:
"
var/list/temp_tech = linked_destroy.ConvertReqString2List(linked_destroy.loaded_item.origin_tech)
for(var/T in temp_tech)
dat += "* [CallTechName(T)] [temp_tech[T]]"
var/datum/tech/F = files.known_tech[T]
if(F)
dat += " (Current: [F.level])"
dat += "
"
dat += "Options: "
dat += "Deconstruct Item"
dat += "Eject Item"
if(2.3)
dat += "Main Menu"
dat += "Item is neither reliable enough or broken enough to learn from.
"
/////////////////////PROTOLATHE SCREENS/////////////////////////
if(3.0)
dat += "Main Menu
"
dat += "NO PROTOLATHE LINKED TO CONSOLE
"
if(3.1)
dat += "Main Menu "
dat += "Material Storage"
dat += "Chemical Storage"
dat += "
Protolathe Menu:
"
dat += "
Material Amount: [linked_materials.total_amount] / [linked_materials.max_amount]
"
dat += "
Chemical Volume: [linked_lathe.reagents.total_volume] / [linked_lathe.reagents.maximum_volume]
"
dat += "
"
dat += list_categories(linked_lathe.categories, 3.15)
//Grouping designs by categories, to improve readability
if(3.15)
dat += "
Main Menu"
dat += "
Protolathe Menu"
dat += "
Browsing [selected_category]:
"
dat += "
Material Amount: [linked_materials.total_amount] / [linked_materials.max_amount]
"
dat += "
Chemical Volume: [linked_lathe.reagents.total_volume] / [linked_lathe.reagents.maximum_volume]
"
var/coeff = linked_lathe.efficiency_coeff
for(var/v in files.known_designs)
var/datum/design/D = files.known_designs[v]
if(!(selected_category in D.category)|| !(D.build_type & PROTOLATHE))
continue
var/temp_material
var/c = 50
var/t
var/all_materials = D.materials + D.reagents_list
for(var/M in all_materials)
t = linked_lathe.check_mat(D, M)
temp_material += " | "
if (t < 1)
temp_material += "
[all_materials[M]*coeff] [CallMaterialName(M)]"
else
temp_material += " [all_materials[M]*coeff] [CallMaterialName(M)]"
c = min(c,t)
if (c >= 1)
dat += "
[D.name]"
if(c >= 5)
dat += "
x5"
if(c >= 10)
dat += "
x10"
dat += "[temp_material]"
else
dat += "
[D.name][temp_material]"
dat += "
"
dat += "
"
if(3.17) //Display search result
dat += "
Main Menu"
dat += "
Protolathe Menu"
dat += "
Search results:
"
dat += "
Material Amount: [linked_materials.total_amount] / [linked_materials.max_amount]
"
dat += "
Chemical Volume: [linked_lathe.reagents.total_volume] / [linked_lathe.reagents.maximum_volume]
"
var/coeff = linked_lathe.efficiency_coeff
for(var/datum/design/D in matching_designs)
var/temp_material
var/c = 50
var/t
var/all_materials = D.materials + D.reagents_list
for(var/M in all_materials)
t = linked_lathe.check_mat(D, M)
temp_material += " | "
if (t < 1)
temp_material += "
[all_materials[M]*coeff] [CallMaterialName(M)]"
else
temp_material += " [all_materials[M]*coeff] [CallMaterialName(M)]"
c = min(c,t)
if (c >= 1)
dat += "
[D.name]"
if(c >= 5)
dat += "
x5"
if(c >= 10)
dat += "
x10"
dat += "[temp_material]"
else
dat += "
[D.name][temp_material]"
dat += "
"
dat += "
"
if(3.2) //Protolathe Material Storage Sub-menu
dat += "
Main Menu"
dat += "
Protolathe Menu"
dat += "
Material Storage:
"
if(!linked_lathe)
dat += "ERROR: Protolathe connection failed."
else
for(var/mat_id in linked_materials.materials)
var/datum/material/M = linked_materials.materials[mat_id]
dat += "* [M.amount] of [M.name]: "
if(M.amount >= MINERAL_MATERIAL_AMOUNT)
dat += "
Eject "
if(M.amount >= MINERAL_MATERIAL_AMOUNT*5)
dat += "
5x "
if(M.amount >= MINERAL_MATERIAL_AMOUNT)
dat += "
All"
dat += "
"
dat += "
"
if(3.3)
dat += "
Main Menu"
dat += "
Protolathe Menu"
dat += "
Disposal All Chemicals in Storage"
dat += "
Chemical Storage:
"
for(var/datum/reagent/R in linked_lathe.reagents.reagent_list)
dat += "[R.name]: [R.volume]"
dat += "
Purge"
///////////////////CIRCUIT IMPRINTER SCREENS////////////////////
if(4.0)
dat += "
Main Menu
"
dat += "
NO CIRCUIT IMPRINTER LINKED TO CONSOLE
"
if(4.1)
dat += "
Main Menu"
dat += "
Material Storage"
dat += "
Chemical Storage"
dat += "
Circuit Imprinter Menu:
"
dat += "Material Amount: [imprinter_materials.total_amount]
"
dat += "Chemical Volume: [linked_imprinter.reagents.total_volume]
"
dat += "
"
dat += list_categories(linked_imprinter.categories, 4.15)
if(4.15)
dat += "
Main Menu"
dat += "
Circuit Imprinter Menu"
dat += "
Browsing [selected_category]:
"
dat += "Material Amount: [imprinter_materials.total_amount]
"
dat += "Chemical Volume: [linked_imprinter.reagents.total_volume]
"
var/coeff = linked_imprinter.efficiency_coeff
for(var/v in files.known_designs)
var/datum/design/D = files.known_designs[v]
if(!(selected_category in D.category) || !(D.build_type & IMPRINTER))
continue
var/temp_materials
var/check_materials = 1
var/all_materials = D.materials + D.reagents_list
for(var/M in all_materials)
temp_materials += " | "
if (!linked_imprinter.check_mat(D, M))
check_materials = 0
temp_materials += "
[all_materials[M]/coeff] [CallMaterialName(M)]"
else
temp_materials += " [all_materials[M]/coeff] [CallMaterialName(M)]"
if (check_materials)
dat += "
[D.name][temp_materials]
"
else
dat += "
[D.name][temp_materials]
"
dat += "
"
if(4.17)
dat += "
Main Menu"
dat += "
Circuit Imprinter Menu"
dat += "
Search results:
"
dat += "Material Amount: [imprinter_materials.total_amount]
"
dat += "Chemical Volume: [linked_imprinter.reagents.total_volume]
"
var/coeff = linked_imprinter.efficiency_coeff
for(var/datum/design/D in matching_designs)
var/temp_materials
var/check_materials = 1
var/all_materials = D.materials + D.reagents_list
for(var/M in all_materials)
temp_materials += " | "
if (!linked_imprinter.check_mat(D, M))
check_materials = 0
temp_materials += "
[all_materials[M]/coeff] [CallMaterialName(M)]"
else
temp_materials += " [all_materials[M]/coeff] [CallMaterialName(M)]"
if (check_materials)
dat += "
[D.name][temp_materials]
"
else
dat += "
[D.name][temp_materials]
"
dat += "
"
if(4.2) //Circuit Imprinter Material Storage Sub-menu
dat += "
Main Menu"
dat += "
Circuit Imprinter Menu"
dat += "
Disposal All Chemicals in Storage"
dat += "
Chemical Storage:
"
for(var/datum/reagent/R in linked_imprinter.reagents.reagent_list)
dat += "[R.name]: [R.volume]"
dat += "
Purge"
if(4.3)
dat += "
Main Menu"
dat += "
Circuit Imprinter Menu"
dat += "
Material Storage:
"
if(!linked_imprinter)
dat += "ERROR: Protolathe connection failed."
else
for(var/mat_id in imprinter_materials.materials)
var/datum/material/M = imprinter_materials.materials[mat_id]
dat += "* [M.amount] of [M.name]: "
if(M.amount >= MINERAL_MATERIAL_AMOUNT)
dat += "
Eject "
if(M.amount >= MINERAL_MATERIAL_AMOUNT*5)
dat += "
5x "
if(M.amount >= MINERAL_MATERIAL_AMOUNT)
dat += "
All"
dat += "
"
dat += "
"
var/datum/browser/popup = new(user, "rndconsole", name, 460, 550)
popup.set_content(dat)
popup.open()
return
//helper proc, which return a table containing categories
/obj/machinery/computer/rdconsole/proc/list_categories(list/categories, menu_num as num)
if(!categories)
return
var/line_length = 1
var/dat = "
"
for(var/C in categories)
if(line_length > 2)
dat += "
"
line_length = 1
dat += "| [C] | "
line_length++
dat += "
"
return dat
/obj/machinery/computer/rdconsole/robotics
name = "Robotics R&D Console"
desc = "A console used to interface with R&D tools."
id = 2
req_access = null
req_access_txt = "29"
/obj/machinery/computer/rdconsole/robotics/Initialize()
. = ..()
if(circuit)
circuit.name = "R&D Console - Robotics (Computer Board)"
circuit.build_path = /obj/machinery/computer/rdconsole/robotics
/obj/machinery/computer/rdconsole/core
name = "Core R&D Console"
desc = "A console used to interface with R&D tools."
id = 1
/obj/machinery/computer/rdconsole/experiment
name = "E.X.P.E.R.I-MENTOR R&D Console"
desc = "A console used to interface with R&D tools."
id = 3