Files
GS13NG/code/modules/research/rdconsole.dm
kevinz000 91ac70a73e RND TECHWEBS: TECHFABS (#36055)
Doing my little update piece by piece because I'm lazy and because storage PR is going to conflict everything ever.

Techfabs do not link to RND consoles, and have their own interface for producing things.
RND production machinery code refactored.
Techwebs have categories views instead of just a goddamn design list.
Old machinery will be kept in, as some places will keep them. Read: Engineering, robotics, etc.

experimental: Protolathes and circuit imprinters combined/changed to techfabs. All departments can now print related circuit boards. Engineering and science will keep their lathe/imprinter design by default at roundstart because they have specialized labs for those.
2018-03-07 21:11:56 -06:00

1099 lines
44 KiB
Plaintext

/*
Research and Development (R&D) Console
This is the main work horse of the R&D system. It contains the menus/controls for the Destructive Analyzer, Protolathe, and Circuit
imprinter.
Basic use: When it first is created, it will attempt to link up to related devices within 3 squares. It'll only link up if they
aren't already linked to another console. Any consoles it cannot link up with (either because all of a certain type are already
linked or there aren't any in range), you'll just not have access to that menu. In the settings menu, there are menu options that
allow a player to attempt to re-sync with nearby consoles. You can also force it to disconnect from a specific console.
The imprinting and construction menus do NOT require toxins access to access but all the other menus do. However, if you leave it
on a menu, nothing is to stop the person from using the options on that menu (although they won't be able to change to a different
one). You can also lock the console on the settings menu if you're feeling paranoid and you don't want anyone messing with it who
doesn't have toxins access.
*/
/obj/machinery/computer/rdconsole
name = "R&D Console"
desc = "A console used to interface with R&D tools."
icon_screen = "rdcomp"
icon_keyboard = "rd_key"
var/datum/techweb/stored_research //Reference to global science techweb.
var/obj/item/disk/tech_disk/t_disk //Stores the technology disk.
var/obj/item/disk/design_disk/d_disk //Stores the design disk.
circuit = /obj/item/circuitboard/computer/rdconsole
var/obj/machinery/rnd/destructive_analyzer/linked_destroy //Linked Destructive Analyzer
var/obj/machinery/rnd/production/protolathe/linked_lathe //Linked Protolathe
var/obj/machinery/rnd/production/circuit_imprinter/linked_imprinter //Linked Circuit Imprinter
req_access = list(ACCESS_TOX) //lA AND SETTING MANIPULATION REQUIRES SCIENTIST ACCESS.
//UI VARS
var/screen = RDSCREEN_MENU
var/back = RDSCREEN_MENU
var/locked = FALSE
var/tdisk_uple = FALSE
var/ddisk_uple = FALSE
var/datum/techweb_node/selected_node
var/datum/design/selected_design
var/selected_category
var/list/datum/design/matching_designs
var/disk_slot_selected
var/searchstring = ""
var/searchtype = ""
var/ui_mode = RDCONSOLE_UI_MODE_NORMAL
var/research_control = TRUE
/obj/machinery/computer/rdconsole/production
research_control = FALSE
/proc/CallMaterialName(ID)
if (copytext(ID, 1, 2) == "$" && GLOB.materials_list[ID])
var/datum/material/material = GLOB.materials_list[ID]
return material.name
else if(GLOB.chemical_reagents_list[ID])
var/datum/reagent/reagent = GLOB.chemical_reagents_list[ID]
return reagent.name
return "ERROR: Report This"
/obj/machinery/computer/rdconsole/proc/SyncRDevices() //Makes sure it is properly sync'ed up with the devices attached to it (if any).
for(var/obj/machinery/rnd/D in oview(3,src))
if(D.linked_console != null || D.disabled || D.panel_open)
continue
if(istype(D, /obj/machinery/rnd/destructive_analyzer))
if(linked_destroy == null)
linked_destroy = D
D.linked_console = src
else if(istype(D, /obj/machinery/rnd/production/protolathe))
if(linked_lathe == null)
var/obj/machinery/rnd/production/protolathe/P = D
if(!P.console_link)
continue
linked_lathe = D
D.linked_console = src
else if(istype(D, /obj/machinery/rnd/production/circuit_imprinter))
if(linked_imprinter == null)
var/obj/machinery/rnd/production/circuit_imprinter/C = D
if(!C.console_link)
continue
linked_imprinter = D
D.linked_console = src
/obj/machinery/computer/rdconsole/Initialize()
. = ..()
stored_research = SSresearch.science_tech
stored_research.consoles_accessing[src] = TRUE
matching_designs = list()
SyncRDevices()
/obj/machinery/computer/rdconsole/Destroy()
if(stored_research)
stored_research.consoles_accessing -= src
if(linked_destroy)
linked_destroy.linked_console = null
linked_destroy = null
if(linked_lathe)
linked_lathe.linked_console = null
linked_lathe = null
if(linked_imprinter)
linked_imprinter.linked_console = null
linked_imprinter = null
if(t_disk)
t_disk.forceMove(get_turf(src))
t_disk = null
if(d_disk)
d_disk.forceMove(get_turf(src))
d_disk = null
matching_designs = null
selected_node = null
selected_design = null
return ..()
/obj/machinery/computer/rdconsole/attackby(obj/item/D, mob/user, params)
//Loading a disk into it.
if(istype(D, /obj/item/disk))
if(istype(D, /obj/item/disk/tech_disk))
if(t_disk)
to_chat(user, "<span class='danger'>A technology disk is already loaded!</span>")
return
if(!user.transferItemToLoc(D, src))
to_chat(user, "<span class='danger'>[D] is stuck to your hand!</span>")
return
t_disk = D
else if (istype(D, /obj/item/disk/design_disk))
if(d_disk)
to_chat(user, "<span class='danger'>A design disk is already loaded!</span>")
return
if(!user.transferItemToLoc(D, src))
to_chat(user, "<span class='danger'>[D] is stuck to your hand!</span>")
return
d_disk = D
else
to_chat(user, "<span class='danger'>Machine cannot accept disks in that format.</span>")
return
to_chat(user, "<span class='notice'>You insert [D] into \the [src]!</span>")
else if(!(linked_destroy && linked_destroy.busy) && !(linked_lathe && linked_lathe.busy) && !(linked_imprinter && linked_imprinter.busy))
. = ..()
/obj/machinery/computer/rdconsole/proc/research_node(id, mob/user)
if(!stored_research.available_nodes[id] || stored_research.researched_nodes[id])
say("Node unlock failed: Either already researched or not available!")
return FALSE
var/datum/techweb_node/TN = SSresearch.techweb_nodes[id]
if(!istype(TN))
say("Node unlock failed: Unknown error.")
return FALSE
var/price = TN.get_price(stored_research)
if(stored_research.research_points >= price)
investigate_log("[key_name(user)] researched [id]([price]) on techweb id [stored_research.id].", INVESTIGATE_RESEARCH)
if(stored_research == SSresearch.science_tech)
SSblackbox.record_feedback("associative", "science_techweb_unlock", 1, list("id" = "[id]", "name" = TN.display_name, "price" = "[price]", "time" = SQLtime()))
if(stored_research.research_node(SSresearch.techweb_nodes[id]))
say("Sucessfully researched [TN.display_name].")
var/logname = "Unknown"
if(isAI(user))
logname = "AI: [user.name]"
if(iscarbon(user))
var/obj/item/card/id/idcard = user.get_active_held_item()
if(istype(idcard))
logname = "User: [idcard.registered_name]"
if(ishuman(user))
var/mob/living/carbon/human/H = user
var/obj/item/I = H.wear_id
if(istype(I))
var/obj/item/card/id/ID = I.GetID()
if(istype(ID))
logname = "User: [ID.registered_name]"
stored_research.research_logs += "[logname] researched node id [id] for [price] points."
return TRUE
else
say("Failed to research node: Internal database error!")
return FALSE
say("Not enough research points...")
return FALSE
/obj/machinery/computer/rdconsole/on_deconstruction()
if(linked_destroy)
linked_destroy.linked_console = null
linked_destroy = null
if(linked_lathe)
linked_lathe.linked_console = null
linked_lathe = null
if(linked_imprinter)
linked_imprinter.linked_console = null
linked_imprinter = null
..()
/obj/machinery/computer/rdconsole/emag_act(mob/user)
if(!(obj_flags & EMAGGED))
to_chat(user, "<span class='notice'>You disable the security protocols</span>")
playsound(src, "sparks", 75, 1)
obj_flags |= EMAGGED
return ..()
/obj/machinery/computer/rdconsole/proc/list_categories(list/categories, menu_num as num)
if(!categories)
return
var/line_length = 1
var/list/l = "<table style='width:100%' align='center'><tr>"
for(var/C in categories)
if(line_length > 2)
l += "</tr><tr>"
line_length = 1
l += "<td><A href='?src=[REF(src)];category=[C];switch_screen=[menu_num]'>[C]</A></td>"
line_length++
l += "</tr></table></div>"
return l
/obj/machinery/computer/rdconsole/proc/ui_header()
var/list/l = list()
l += "<div class='statusDisplay'><b>[stored_research.organization] Research and Development Network</b>"
l += "Available points: [round(stored_research.research_points)] (+[round(stored_research.last_bitcoins * 60)] / minute)"
l += "Security protocols: [obj_flags & EMAGGED ? "<font color='red'>Disabled</font>" : "<font color='green'>Enabled</font>"]"
l += "<a href='?src=[REF(src)];switch_screen=[RDSCREEN_MENU]'>Main Menu</a> | <a href='?src=[REF(src)];switch_screen=[back]'>Back</a></div>[RDSCREEN_NOBREAK]"
l += "[ui_mode == 1? "<span class='linkOn'>Normal View</span>" : "<a href='?src=[REF(src)];ui_mode=1'>Normal View</a>"] | [ui_mode == 2? "<span class='linkOn'>Expert View</span>" : "<a href='?src=[REF(src)];ui_mode=2'>Expert View</a>"] | [ui_mode == 3? "<span class='linkOn'>List View</span>" : "<a href='?src=[REF(src)];ui_mode=3'>List View</a>"]"
return l
/obj/machinery/computer/rdconsole/proc/ui_main_menu()
var/list/l = list()
if(research_control)
l += "<H2><a href='?src=[REF(src)];switch_screen=[RDSCREEN_TECHWEB]'>Technology</a>"
if(d_disk)
l += "<hr><a href='?src=[REF(src)];switch_screen=[RDSCREEN_DESIGNDISK]'>Design Disk</a>"
if(t_disk)
l += "<hr><a href='?src=[REF(src)];switch_screen=[RDSCREEN_TECHDISK]'>Tech Disk</a>"
if(linked_destroy)
l += "<hr><a href='?src=[REF(src)];switch_screen=[RDSCREEN_DECONSTRUCT]'>Destructive Analyzer</a>"
if(linked_lathe)
l += "<hr><a href='?src=[REF(src)];switch_screen=[RDSCREEN_PROTOLATHE]'>Protolathe</a>"
if(linked_imprinter)
l += "<hr><a href='?src=[REF(src)];switch_screen=[RDSCREEN_IMPRINTER]'>Circuit Imprinter</a>"
l += "<hr><a href='?src=[REF(src)];switch_screen=[RDSCREEN_SETTINGS]'>Settings</a></H2>"
return l
/obj/machinery/computer/rdconsole/proc/ui_locked()
return list("<h3><a href='?src=[REF(src)];switch_screen=[RDSCREEN_MENU];unlock_console=1'>SYSTEM LOCKED</a></h3></br>")
/obj/machinery/computer/rdconsole/proc/ui_settings()
var/list/l = list()
l += "<div class='statusDisplay'><h3>R&D Console Settings:</h3>"
l += "<A href='?src=[REF(src)];switch_screen=[RDSCREEN_DEVICE_LINKING]'>Device Linkage Menu</A>"
l += "<A href='?src=[REF(src)];lock_console=1'>Lock Console</A></div>"
return l
/obj/machinery/computer/rdconsole/proc/ui_device_linking()
var/list/l = list()
l += "<A href='?src=[REF(src)];switch_screen=[RDSCREEN_SETTINGS]'>Settings Menu</A><div class='statusDisplay'>"
l += "<h3>R&D Console Device Linkage Menu:</h3>"
l += "<A href='?src=[REF(src)];find_device=1'>Re-sync with Nearby Devices</A>"
l += "<h3>Linked Devices:</h3>"
l += linked_destroy? "* Destructive Analyzer <A href='?src=[REF(src)];disconnect=destroy'>Disconnect</A>" : "* No Destructive Analyzer Linked"
l += linked_lathe? "* Protolathe <A href='?src=[REF(src)];disconnect=lathe'>Disconnect</A>" : "* No Protolathe Linked"
l += linked_imprinter? "* Circuit Imprinter <A href='?src=[REF(src)];disconnect=imprinter'>Disconnect</A>" : "* No Circuit Imprinter Linked"
l += "</div>"
return l
/obj/machinery/computer/rdconsole/proc/ui_protolathe_header()
var/list/l = list()
l += "<div class='statusDisplay'><A href='?src=[REF(src)];switch_screen=[RDSCREEN_PROTOLATHE]'>Protolathe Menu</A>"
l += "<A href='?src=[REF(src)];switch_screen=[RDSCREEN_PROTOLATHE_MATERIALS]'><B>Material Amount:</B> [linked_lathe.materials.total_amount] / [linked_lathe.materials.max_amount]</A>"
l += "<A href='?src=[REF(src)];switch_screen=[RDSCREEN_PROTOLATHE_CHEMICALS]'><B>Chemical volume:</B> [linked_lathe.reagents.total_volume] / [linked_lathe.reagents.maximum_volume]</A></div>"
return l
/obj/machinery/computer/rdconsole/proc/ui_protolathe_category_view() //Legacy code
RDSCREEN_UI_LATHE_CHECK
var/list/l = list()
l += ui_protolathe_header()
l += "<div class='statusDisplay'><h3>Browsing [selected_category]:</h3>"
var/coeff = linked_lathe.efficiency_coeff
for(var/v in stored_research.researched_designs)
var/datum/design/D = stored_research.researched_designs[v]
if(!(selected_category in D.category)|| !(D.build_type & PROTOLATHE))
continue
if(!(D.departmental_flags & linked_lathe.allowed_department_flags))
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 += "<span class='bad'>[all_materials[M]*coeff] [CallMaterialName(M)]</span>"
else
temp_material += " [all_materials[M]*coeff] [CallMaterialName(M)]"
c = min(c,t)
if (c >= 1)
l += "<A href='?src=[REF(src)];build=[D.id];amount=1'>[D.name]</A>[RDSCREEN_NOBREAK]"
if(c >= 5)
l += "<A href='?src=[REF(src)];build=[D.id];amount=5'>x5</A>[RDSCREEN_NOBREAK]"
if(c >= 10)
l += "<A href='?src=[REF(src)];build=[D.id];amount=10'>x10</A>[RDSCREEN_NOBREAK]"
l += "[temp_material][RDSCREEN_NOBREAK]"
else
l += "<span class='linkOff'>[D.name]</span>[temp_material][RDSCREEN_NOBREAK]"
l += ""
l += "</div>"
return l
/obj/machinery/computer/rdconsole/proc/ui_protolathe() //Legacy code
RDSCREEN_UI_LATHE_CHECK
var/list/l = list()
l += ui_protolathe_header()
l += "<form name='search' action='?src=[REF(src)]'>\
<input type='hidden' name='src' value='[REF(src)]'>\
<input type='hidden' name='search' value='to_search'>\
<input type='hidden' name='type' value='proto'>\
<input type='text' name='to_search'>\
<input type='submit' value='Search'>\
</form><HR>"
l += list_categories(linked_lathe.categories, RDSCREEN_PROTOLATHE_CATEGORY_VIEW)
return l
/obj/machinery/computer/rdconsole/proc/ui_protolathe_search() //Legacy code
RDSCREEN_UI_LATHE_CHECK
var/list/l = list()
l += ui_protolathe_header()
var/coeff = linked_lathe.efficiency_coeff
for(var/datum/design/D in matching_designs)
if(!(D.departmental_flags & linked_lathe.allowed_department_flags))
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 += "<span class='bad'>[all_materials[M]*coeff] [CallMaterialName(M)]</span>"
else
temp_material += " [all_materials[M]*coeff] [CallMaterialName(M)]"
c = min(c,t)
if (c >= 1)
l += "<A href='?src=[REF(src)];build=[D.id];amount=1'>[D.name]</A>[RDSCREEN_NOBREAK]"
if(c >= 5)
l += "<A href='?src=[REF(src)];build=[D.id];amount=5'>x5</A>[RDSCREEN_NOBREAK]"
if(c >= 10)
l += "<A href='?src=[REF(src)];build=[D.id];amount=10'>x10</A>[RDSCREEN_NOBREAK]"
l += "[temp_material][RDSCREEN_NOBREAK]"
else
l += "<span class='linkOff'>[D.name]</span>[temp_material][RDSCREEN_NOBREAK]"
l += ""
l += "</div>"
return l
/obj/machinery/computer/rdconsole/proc/ui_protolathe_materials() //Legacy code
RDSCREEN_UI_LATHE_CHECK
var/list/l = list()
l += ui_protolathe_header()
l += "<div class='statusDisplay'><h3>Material Storage:</h3>"
for(var/mat_id in linked_lathe.materials.materials)
var/datum/material/M = linked_lathe.materials.materials[mat_id]
l += "* [M.amount] of [M.name]: "
if(M.amount >= MINERAL_MATERIAL_AMOUNT) l += "<A href='?src=[REF(src)];ejectsheet=[M.id];eject_amt=1'>Eject</A> [RDSCREEN_NOBREAK]"
if(M.amount >= MINERAL_MATERIAL_AMOUNT*5) l += "<A href='?src=[REF(src)];ejectsheet=[M.id];eject_amt=5'>5x</A> [RDSCREEN_NOBREAK]"
if(M.amount >= MINERAL_MATERIAL_AMOUNT) l += "<A href='?src=[REF(src)];ejectsheet=[M.id];eject_amt=50'>All</A>[RDSCREEN_NOBREAK]"
l += ""
l += "</div>[RDSCREEN_NOBREAK]"
return l
/obj/machinery/computer/rdconsole/proc/ui_protolathe_chemicals() //Legacy code
RDSCREEN_UI_LATHE_CHECK
var/list/l = list()
l += ui_protolathe_header()
l += "<div class='statusDisplay'><A href='?src=[REF(src)];disposeallP=1'>Disposal All Chemicals in Storage</A>"
l += "<h3>Chemical Storage:</h3>"
for(var/datum/reagent/R in linked_lathe.reagents.reagent_list)
l += "[R.name]: [R.volume]"
l += "<A href='?src=[REF(src)];disposeP=[R.id]'>Purge</A>"
l += "</div>"
return l
/obj/machinery/computer/rdconsole/proc/ui_circuit_header() //Legacy Code
var/list/l = list()
l += "<div class='statusDisplay'><A href='?src=[REF(src)];switch_screen=[RDSCREEN_IMPRINTER]'>Circuit Imprinter Menu</A>"
l += "<A href='?src=[REF(src)];switch_screen=[RDSCREEN_IMPRINTER_MATERIALS]'><B>Material Amount:</B> [linked_imprinter.materials.total_amount] / [linked_imprinter.materials.max_amount]</A>"
l += "<A href='?src=[REF(src)];switch_screen=[RDSCREEN_IMPRINTER_CHEMICALS]'><B>Chemical volume:</B> [linked_imprinter.reagents.total_volume] / [linked_imprinter.reagents.maximum_volume]</A></div>"
return l
/obj/machinery/computer/rdconsole/proc/ui_circuit() //Legacy code
RDSCREEN_UI_IMPRINTER_CHECK
var/list/l = list()
l += ui_circuit_header()
l += "<h3>Circuit Imprinter Menu:</h3>"
l += "<form name='search' action='?src=[REF(src)]'>\
<input type='hidden' name='src' value='[REF(src)]'>\
<input type='hidden' name='search' value='to_search'>\
<input type='hidden' name='type' value='imprint'>\
<input type='text' name='to_search'>\
<input type='submit' value='Search'>\
</form><HR>"
l += list_categories(linked_imprinter.categories, RDSCREEN_IMPRINTER_CATEGORY_VIEW)
return l
/obj/machinery/computer/rdconsole/proc/ui_circuit_category_view() //Legacy code
RDSCREEN_UI_IMPRINTER_CHECK
var/list/l = list()
l += ui_circuit_header()
l += "<div class='statusDisplay'><h3>Browsing [selected_category]:</h3>"
var/coeff = linked_imprinter.efficiency_coeff
for(var/v in stored_research.researched_designs)
var/datum/design/D = stored_research.researched_designs[v]
if(!(selected_category in D.category) || !(D.build_type & IMPRINTER))
continue
if(!(D.departmental_flags & linked_imprinter.allowed_department_flags))
continue
var/temp_materials
var/check_materials = TRUE
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 = FALSE
temp_materials += " <span class='bad'>[all_materials[M]/coeff] [CallMaterialName(M)]</span>"
else
temp_materials += " [all_materials[M]/coeff] [CallMaterialName(M)]"
if (check_materials)
l += "<A href='?src=[REF(src)];imprint=[D.id]'>[D.name]</A>[temp_materials]"
else
l += "<span class='linkOff'>[D.name]</span>[temp_materials]"
l += "</div>"
return l
/obj/machinery/computer/rdconsole/proc/ui_circuit_search() //Legacy code
RDSCREEN_UI_IMPRINTER_CHECK
var/list/l = list()
l += ui_circuit_header()
l += "<div class='statusDisplay'><h3>Search results:</h3>"
var/coeff = linked_imprinter.efficiency_coeff
for(var/datum/design/D in matching_designs)
if(!(D.departmental_flags & linked_imprinter.allowed_department_flags))
continue
var/temp_materials
var/check_materials = TRUE
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 = FALSE
temp_materials += " <span class='bad'>[all_materials[M]/coeff] [CallMaterialName(M)]</span>"
else
temp_materials += " [all_materials[M]/coeff] [CallMaterialName(M)]"
if (check_materials)
l += "<A href='?src=[REF(src)];imprint=[D.id]'>[D.name]</A>[temp_materials]"
else
l += "<span class='linkOff'>[D.name]</span>[temp_materials]"
l += "</div>"
return l
/obj/machinery/computer/rdconsole/proc/ui_circuit_chemicals() //legacy code
RDSCREEN_UI_IMPRINTER_CHECK
var/list/l = list()
l += ui_circuit_header()
l += "<A href='?src=[REF(src)];disposeallI=1'>Disposal All Chemicals in Storage</A><div class='statusDisplay'>"
l += "<h3>Chemical Storage:</h3>"
for(var/datum/reagent/R in linked_imprinter.reagents.reagent_list)
l += "[R.name]: [R.volume]"
l += "<A href='?src=[REF(src)];disposeI=[R.id]'>Purge</A>"
return l
/obj/machinery/computer/rdconsole/proc/ui_circuit_materials() //Legacy code!
RDSCREEN_UI_IMPRINTER_CHECK
var/list/l = list()
l += ui_circuit_header()
l += "<h3><div class='statusDisplay'>Material Storage:</h3>"
for(var/mat_id in linked_imprinter.materials.materials)
var/datum/material/M = linked_imprinter.materials.materials[mat_id]
l += "* [M.amount] of [M.name]: "
if(M.amount >= MINERAL_MATERIAL_AMOUNT) l += "<A href='?src=[REF(src)];imprinter_ejectsheet=[M.id];eject_amt=1'>Eject</A> [RDSCREEN_NOBREAK]"
if(M.amount >= MINERAL_MATERIAL_AMOUNT*5) l += "<A href='?src=[REF(src)];imprinter_ejectsheet=[M.id];eject_amt=5'>5x</A> [RDSCREEN_NOBREAK]"
if(M.amount >= MINERAL_MATERIAL_AMOUNT) l += "<A href='?src=[REF(src)];imprinter_ejectsheet=[M.id];eject_amt=50'>All</A>[RDSCREEN_NOBREAK]</div>"
return l
/obj/machinery/computer/rdconsole/proc/ui_techdisk() //Legacy code
RDSCREEN_UI_TDISK_CHECK
var/list/l = list()
l += "<div class='statusDisplay'>Disk Operations: <A href='?src=[REF(src)];clear_tech=0'>Clear Disk</A>"
l += "<A href='?src=[REF(src)];eject_tech=1'>Eject Disk</A>"
l += "<A href='?src=[REF(src)];updt_tech=0'>Upload All</A>"
l += "<A href='?src=[REF(src)];copy_tech=1'>Load Technology to Disk</A></div>"
l += "<div class='statusDisplay'><h3>Stored Technology Nodes:</h3>"
for(var/i in t_disk.stored_research.researched_nodes)
var/datum/techweb_node/N = t_disk.stored_research.researched_nodes[i]
l += "<A href='?src=[REF(src)];view_node=[i];back_screen=[screen]'>[N.display_name]</A>"
l += "</div>"
return l
/obj/machinery/computer/rdconsole/proc/ui_designdisk() //Legacy code
RDSCREEN_UI_DDISK_CHECK
var/list/l = list()
l += "Disk Operations: <A href='?src=[REF(src)];clear_design=0'>Clear Disk</A><A href='?src=[REF(src)];updt_design=0'>Upload All</A><A href='?src=[REF(src)];eject_design=1'>Eject Disk</A>"
for(var/i in 1 to d_disk.max_blueprints)
l += "<div class='statusDisplay'>"
if(d_disk.blueprints[i])
var/datum/design/D = d_disk.blueprints[i]
l += "<A href='?src=[REF(src)];view_design=[D.id]'>[D.name]</A>"
l += "Operations: <A href='?src=[REF(src)];updt_design=[i]'>Upload to database</A> <A href='?src=[REF(src)];clear_design=[i]'>Clear Slot</A>"
else
l += "Empty Slot Operations: <A href='?src=[REF(src)];switch_screen=[RDSCREEN_DESIGNDISK_UPLOAD];disk_slot=[i]'>Load Design to Slot</A>"
l += "</div>"
return l
/obj/machinery/computer/rdconsole/proc/ui_designdisk_upload() //Legacy code
RDSCREEN_UI_DDISK_CHECK
var/list/l = list()
l += "<A href='?src=[REF(src)];switch_screen=[RDSCREEN_DESIGNDISK];back_screen=[screen]'>Return to Disk Operations</A><div class='statusDisplay'>"
l += "<h3>Load Design to Disk:</h3>"
for(var/v in stored_research.researched_designs)
var/datum/design/D = stored_research.researched_designs[v]
l += "[D.name] "
l += "<A href='?src=[REF(src)];copy_design=[disk_slot_selected];copy_design_ID=[D.id]'>Copy to Disk</A>"
l += "</div>"
return l
/obj/machinery/computer/rdconsole/proc/ui_deconstruct() //Legacy code
RDSCREEN_UI_DECONSTRUCT_CHECK
var/list/l = list()
if(!linked_destroy.loaded_item)
l += "<div class='statusDisplay'>No item loaded. Standing-by...</div>"
else
l += "<div class='statusDisplay'>[RDSCREEN_NOBREAK]"
l += "<table><tr><td>[icon2html(linked_destroy.loaded_item, usr)]</td><td><b>[linked_destroy.loaded_item.name]</b> <A href='?src=[REF(src)];eject_item=1'>Eject</A></td></tr></table>[RDSCREEN_NOBREAK]"
l += "Select a node to boost by deconstructing this item. This item can boost:"
var/anything = FALSE
var/list/boostable_nodes = techweb_item_boost_check(linked_destroy.loaded_item)
for(var/id in boostable_nodes)
anything = TRUE
var/worth = boostable_nodes[id]
var/datum/techweb_node/N = get_techweb_node_by_id(id)
l += "<div class='statusDisplay'>[RDSCREEN_NOBREAK]"
if (stored_research.researched_nodes[N.id]) // already researched
l += "<span class='linkOff'>[N.display_name]</span>"
l += "This node has already been researched."
else if (worth == 0) // reveal only
if (stored_research.hidden_nodes[N.id])
l += "<A href='?src=[REF(src)];deconstruct=[N.id]'>[N.display_name]</A>"
l += "This node will be revealed."
else
l += "<span class='linkOff'>[N.display_name]</span>"
l += "This node has already been revealed."
else // boost by the difference
var/difference = min(worth, N.research_cost) - stored_research.boosted_nodes[N.id]
if (difference > 0)
l += "<A href='?src=[REF(src)];deconstruct=[N.id]'>[N.display_name]</A>"
l += "This node will be boosted by [difference] points."
else
l += "<span class='linkOff'>[N.display_name]</span>"
l += "This node has already been boosted.</span>"
l += "</div>[RDSCREEN_NOBREAK]"
// point deconstruction and material reclamation use the same ID to prevent accidentally missing the points
var/point_value = techweb_item_point_check(linked_destroy.loaded_item)
if(point_value)
anything = TRUE
l += "<div class='statusDisplay'>[RDSCREEN_NOBREAK]"
if (stored_research.deconstructed_items[linked_destroy.loaded_item.type])
l += "<span class='linkOff'>Point Deconstruction</span>"
l += "This item's [point_value] point\s have already been claimed."
else
l += "<A href='?src=[REF(src)];deconstruct=[RESEARCH_MATERIAL_RECLAMATION_ID]'>Point Deconstruction</A>"
l += "This item is worth [point_value] point\s!"
l += "</div>[RDSCREEN_NOBREAK]"
var/list/materials = linked_destroy.loaded_item.materials
if (materials.len)
l += "<div class='statusDisplay'><A href='?src=[REF(src)];deconstruct=[RESEARCH_MATERIAL_RECLAMATION_ID]'>Material Reclamation</A>"
for (var/M in materials)
l += "* [CallMaterialName(M)] x [materials[M]]"
l += "</div>[RDSCREEN_NOBREAK]"
anything = TRUE
if (!anything)
l += "Nothing!"
l += "</div>"
return l
/obj/machinery/computer/rdconsole/proc/ui_techweb()
var/list/l = list()
if(ui_mode != RDCONSOLE_UI_MODE_LIST)
var/list/columns = list()
var/max_tier = 0
for (var/node_ in stored_research.tiers)
var/datum/techweb_node/node = node_
var/tier = stored_research.tiers[node]
LAZYINITLIST(columns["[tier]"]) // String hackery to make the numbers associative
columns["[tier]"] += ui_techweb_single_node(node, minimal=(tier != 1))
max_tier = max(max_tier, tier)
l += "<table><tr><th align='left'>Researched</th><th align='left'>Available</th><th align='left'>Future</th></tr><tr>[RDSCREEN_NOBREAK]"
for(var/tier in 0 to max_tier)
l += "<td valign='top'>[RDSCREEN_NOBREAK]"
l += columns["[tier]"]
l += "</td>[RDSCREEN_NOBREAK]"
l += "</tr></table>[RDSCREEN_NOBREAK]"
else
var/list/avail = list() //This could probably be optimized a bit later.
var/list/unavail = list()
var/list/res = list()
for(var/v in stored_research.researched_nodes)
res += stored_research.researched_nodes[v]
for(var/v in stored_research.available_nodes)
if(stored_research.researched_nodes[v])
continue
avail += stored_research.available_nodes[v]
for(var/v in stored_research.visible_nodes)
if(stored_research.available_nodes[v])
continue
unavail += stored_research.visible_nodes[v]
l += "<h2>Technology Nodes:</h2>[RDSCREEN_NOBREAK]"
l += "<div><h3>Available for Research:</h3>"
for(var/datum/techweb_node/N in avail)
var/not_unlocked = (stored_research.available_nodes[N.id] && !stored_research.researched_nodes[N.id])
var/has_points = (stored_research.research_points >= N.get_price(stored_research))
var/research_href = not_unlocked? (has_points? "<A href='?src=[REF(src)];research_node=[N.id]'>Research</A>" : "<span class='linkOff bad'>Not Enough Points</span>") : null
l += "<A href='?src=[REF(src)];view_node=[N.id];back_screen=[screen]'>[N.display_name]</A>[research_href]"
l += "</div><div><h3>Locked Nodes:</h3>"
for(var/datum/techweb_node/N in unavail)
l += "<A href='?src=[REF(src)];view_node=[N.id];back_screen=[screen]'>[N.display_name]</A>"
l += "</div><div><h3>Researched Nodes:</h3>"
for(var/datum/techweb_node/N in res)
l += "<A href='?src=[REF(src)];view_node=[N.id];back_screen=[screen]'>[N.display_name]</A>"
l += "</div>[RDSCREEN_NOBREAK]"
return l
/obj/machinery/computer/rdconsole/proc/machine_icon(atom/item)
return icon2html(initial(item.icon), usr, initial(item.icon_state), SOUTH)
/obj/machinery/computer/rdconsole/proc/ui_techweb_single_node(datum/techweb_node/node, selflink=TRUE, minimal=FALSE)
var/list/l = list()
if (stored_research.hidden_nodes[node.id])
return l
var/price = node.get_price(stored_research)
var/display_name = node.display_name
if (selflink)
display_name = "<A href='?src=[REF(src)];view_node=[node.id];back_screen=[screen]'>[display_name]</A>"
l += "<div class='statusDisplay technode'><b>[display_name]</b> [RDSCREEN_NOBREAK]"
if(minimal)
l += "<br>[node.description]"
else
if(stored_research.researched_nodes[node.id])
l += "<span class='linkOff'>Researched</span>"
else if(stored_research.available_nodes[node.id])
if(stored_research.research_points >= price)
l += "<A href='?src=[REF(src)];research_node=[node.id]'>[price]</A>"
else
l += "<span class='linkOff'>[price]</span>" // gray - too expensive
else
l += "<span class='linkOff bad'>[price]</span>" // red - missing prereqs
if(ui_mode == RDCONSOLE_UI_MODE_NORMAL)
l += "[node.description]"
for(var/i in node.designs)
var/datum/design/D = node.designs[i]
l += "<span data-tooltip='[D.name]' onclick='location=\"?src=[REF(src)];view_design=[i];back_screen=[screen]\"'>[D.icon_html(usr)]</span>[RDSCREEN_NOBREAK]"
l += "</div>[RDSCREEN_NOBREAK]"
return l
/obj/machinery/computer/rdconsole/proc/ui_techweb_nodeview()
RDSCREEN_UI_SNODE_CHECK
var/list/l = list()
if(stored_research.hidden_nodes[selected_node.id])
l += "<div><h3>ERROR: RESEARCH NODE UNKNOWN.</h3></div>"
return
l += "<table><tr>[RDSCREEN_NOBREAK]"
if (length(selected_node.prerequisites))
l += "<th align='left'>Requires</th>[RDSCREEN_NOBREAK]"
l += "<th align='left'>Current Node</th>[RDSCREEN_NOBREAK]"
if (length(selected_node.unlocks))
l += "<th align='left'>Unlocks</th>[RDSCREEN_NOBREAK]"
l += "</tr><tr>[RDSCREEN_NOBREAK]"
if (length(selected_node.prerequisites))
l += "<td valign='top'>[RDSCREEN_NOBREAK]"
for (var/i in selected_node.prerequisites)
l += ui_techweb_single_node(selected_node.prerequisites[i])
l += "</td>[RDSCREEN_NOBREAK]"
l += "<td valign='top'>[RDSCREEN_NOBREAK]"
l += ui_techweb_single_node(selected_node, selflink=FALSE)
l += "</td>[RDSCREEN_NOBREAK]"
if (length(selected_node.unlocks))
l += "<td valign='top'>[RDSCREEN_NOBREAK]"
for (var/i in selected_node.unlocks)
l += ui_techweb_single_node(selected_node.unlocks[i])
l += "</td>[RDSCREEN_NOBREAK]"
l += "</tr></table>[RDSCREEN_NOBREAK]"
return l
/obj/machinery/computer/rdconsole/proc/ui_techweb_designview() //Legacy code
RDSCREEN_UI_SDESIGN_CHECK
var/list/l = list()
var/datum/design/D = selected_design
l += "<div><table><tr><td>[D.icon_html(usr)]</td><td><b>[D.name]</b></td></tr></table>[RDSCREEN_NOBREAK]"
if(D.build_type)
var/lathes = list()
if(D.build_type & IMPRINTER)
lathes += "<span data-tooltip='Circuit Imprinter'>[machine_icon(/obj/machinery/rnd/production/circuit_imprinter)]</span>[RDSCREEN_NOBREAK]"
if (linked_imprinter && D.id in stored_research.researched_designs)
l += "<A href='?src=[REF(src)];search=1;type=imprint;to_search=[D.name]'>Imprint</A>"
if(D.build_type & PROTOLATHE)
lathes += "<span data-tooltip='Protolathe'>[machine_icon(/obj/machinery/rnd/production/protolathe)]</span>[RDSCREEN_NOBREAK]"
if (linked_lathe && D.id in stored_research.researched_designs)
l += "<A href='?src=[REF(src)];search=1;type=proto;to_search=[D.name]'>Construct</A>"
if(D.build_type & AUTOLATHE)
lathes += "<span data-tooltip='Autolathe'>[machine_icon(/obj/machinery/autolathe)]</span>[RDSCREEN_NOBREAK]"
if(D.build_type & MECHFAB)
lathes += "<span data-tooltip='Exosuit Fabricator'>[machine_icon(/obj/machinery/mecha_part_fabricator)]</span>[RDSCREEN_NOBREAK]"
if(D.build_type & BIOGENERATOR)
lathes += "<span data-tooltip='Biogenerator'>[machine_icon(/obj/machinery/biogenerator)]</span>[RDSCREEN_NOBREAK]"
if(D.build_type & LIMBGROWER)
lathes += "<span data-tooltip='Limbgrower'>[machine_icon(/obj/machinery/limbgrower)]</span>[RDSCREEN_NOBREAK]"
if(D.build_type & SMELTER)
lathes += "<span data-tooltip='Smelter'>[machine_icon(/obj/machinery/mineral/processing_unit)]</span>[RDSCREEN_NOBREAK]"
l += "Construction types:"
l += lathes
l += ""
l += "Required materials:"
var/all_mats = D.materials + D.reagents_list
for(var/M in all_mats)
l += "* [CallMaterialName(M)] x [all_mats[M]]"
l += "Unlocked by:"
for (var/node in D.unlocked_by)
l += ui_techweb_single_node(node)
l += "[RDSCREEN_NOBREAK]</div>"
return l
//Fuck TGUI.
/obj/machinery/computer/rdconsole/proc/generate_ui()
var/list/ui = list()
ui += ui_header()
if(locked)
ui += ui_locked()
else
switch(screen)
if(RDSCREEN_MENU)
ui += ui_main_menu()
if(RDSCREEN_TECHWEB)
ui += ui_techweb()
if(RDSCREEN_TECHWEB_NODEVIEW)
ui += ui_techweb_nodeview()
if(RDSCREEN_TECHWEB_DESIGNVIEW)
ui += ui_techweb_designview()
if(RDSCREEN_DESIGNDISK)
ui += ui_designdisk()
if(RDSCREEN_DESIGNDISK_UPLOAD)
ui += ui_designdisk_upload()
if(RDSCREEN_TECHDISK)
ui += ui_techdisk()
if(RDSCREEN_DECONSTRUCT)
ui += ui_deconstruct()
if(RDSCREEN_PROTOLATHE)
ui += ui_protolathe()
if(RDSCREEN_PROTOLATHE_CATEGORY_VIEW)
ui += ui_protolathe_category_view()
if(RDSCREEN_PROTOLATHE_MATERIALS)
ui += ui_protolathe_materials()
if(RDSCREEN_PROTOLATHE_CHEMICALS)
ui += ui_protolathe_chemicals()
if(RDSCREEN_PROTOLATHE_SEARCH)
ui += ui_protolathe_search()
if(RDSCREEN_IMPRINTER)
ui += ui_circuit()
if(RDSCREEN_IMPRINTER_CATEGORY_VIEW)
ui += ui_circuit_category_view()
if(RDSCREEN_IMPRINTER_MATERIALS)
ui += ui_circuit_materials()
if(RDSCREEN_IMPRINTER_CHEMICALS)
ui += ui_circuit_chemicals()
if(RDSCREEN_IMPRINTER_SEARCH)
ui += ui_circuit_search()
if(RDSCREEN_SETTINGS)
ui += ui_settings()
if(RDSCREEN_DEVICE_LINKING)
ui += ui_device_linking()
for(var/i in 1 to length(ui))
if(!findtextEx(ui[i], RDSCREEN_NOBREAK))
ui[i] += "<br>"
ui[i] = replacetextEx(ui[i], RDSCREEN_NOBREAK, "")
return ui.Join("")
/obj/machinery/computer/rdconsole/Topic(raw, ls)
if(..())
return
add_fingerprint(usr)
usr.set_machine(src)
if(ls["switch_screen"])
back = screen
screen = text2num(ls["switch_screen"])
if(ls["ui_mode"])
ui_mode = text2num(ls["ui_mode"])
if(ls["lock_console"])
if(allowed(usr))
lock_console(usr)
else
to_chat(usr, "<span class='boldwarning'>Unauthorized Access.</span>")
if(ls["unlock_console"])
if(allowed(usr))
unlock_console(usr)
else
to_chat(usr, "<span class='boldwarning'>Unauthorized Access.</span>")
if(ls["find_device"])
SyncRDevices()
say("Resynced with nearby devices.")
if(ls["back_screen"])
back = text2num(ls["back_screen"])
if(ls["build"]) //Causes the Protolathe to build something.
if(QDELETED(linked_lathe))
say("No Protolathe Linked!")
return
if(linked_lathe.busy)
say("Warning: Protolathe busy!")
else
linked_lathe.user_try_print_id(ls["build"], ls["amount"])
if(ls["imprint"])
if(QDELETED(linked_imprinter))
say("No Circuit Imprinter Linked!")
return
if(linked_imprinter.busy)
say("Warning: Imprinter busy!")
else
linked_imprinter.user_try_print_id(ls["imprint"])
if(ls["category"])
selected_category = ls["category"]
if(ls["disconnect"]) //The R&D console disconnects with a specific device.
switch(ls["disconnect"])
if("destroy")
if(QDELETED(linked_destroy))
say("No Deconstructive Analyzer Linked!")
return
linked_destroy.linked_console = null
linked_destroy = null
if("lathe")
if(QDELETED(linked_lathe))
say("No Protolathe Linked!")
return
linked_lathe.linked_console = null
linked_lathe = null
if("imprinter")
if(QDELETED(linked_imprinter))
say("No Circuit Imprinter Linked!")
return
linked_imprinter.linked_console = null
linked_imprinter = null
if(ls["eject_design"]) //Eject the design disk.
eject_disk("design")
screen = RDSCREEN_MENU
say("Ejecting Design Disk")
if(ls["eject_tech"]) //Eject the technology disk.
eject_disk("tech")
screen = RDSCREEN_MENU
say("Ejecting Technology Disk")
if(ls["deconstruct"])
if(QDELETED(linked_destroy))
say("No Deconstructive Analyzer Linked!")
return
linked_destroy.user_try_decon_id(ls["deconstruct"], usr)
//Protolathe Materials
if(ls["disposeP"]) //Causes the protolathe to dispose of a single reagent (all of it)
if(QDELETED(linked_lathe))
say("No Protolathe Linked!")
return
linked_lathe.reagents.del_reagent(ls["disposeP"])
if(ls["disposeallP"]) //Causes the protolathe to dispose of all it's reagents.
if(QDELETED(linked_lathe))
say("No Protolathe Linked!")
return
linked_lathe.reagents.clear_reagents()
if(ls["ejectsheet"]) //Causes the protolathe to eject a sheet of material
if(QDELETED(linked_lathe))
say("No Protolathe Linked!")
return
linked_lathe.materials.retrieve_sheets(text2num(ls["eject_amt"]), ls["ejectsheet"])
//Circuit Imprinter Materials
if(ls["disposeI"]) //Causes the circuit imprinter to dispose of a single reagent (all of it)
if(QDELETED(linked_imprinter))
say("No Circuit Imprinter Linked!")
return
linked_imprinter.reagents.del_reagent(ls["disposeI"])
if(ls["disposeallI"]) //Causes the circuit imprinter to dispose of all it's reagents.
if(QDELETED(linked_imprinter))
say("No Circuit Imprinter Linked!")
return
linked_imprinter.reagents.clear_reagents()
if(ls["imprinter_ejectsheet"]) //Causes the imprinter to eject a sheet of material
if(QDELETED(linked_imprinter))
say("No Circuit Imprinter Linked!")
return
linked_imprinter.materials.retrieve_sheets(text2num(ls["eject_amt"]), ls["imprinter_ejectsheet"])
if(ls["disk_slot"])
disk_slot_selected = text2num(ls["disk_slot"])
if(ls["research_node"])
if(!research_control)
return //honestly should call them out for href exploiting :^)
if(!SSresearch.science_tech.available_nodes[ls["research_node"]])
return //Nope!
research_node(ls["research_node"], usr)
if(ls["clear_tech"]) //Erase la on the technology disk.
if(QDELETED(t_disk))
say("No Technology Disk Inserted!")
return
qdel(t_disk.stored_research)
t_disk.stored_research = new
say("Wiping technology disk.")
if(ls["copy_tech"]) //Copy some technology la from the research holder to the disk.
if(QDELETED(t_disk))
say("No Technology Disk Inserted!")
return
stored_research.copy_research_to(t_disk.stored_research)
screen = RDSCREEN_TECHDISK
say("Downloading to technology disk.")
if(ls["clear_design"]) //Erases la on the design disk.
if(QDELETED(d_disk))
say("No Design Disk Inserted!")
return
var/n = text2num(ls["clear_design"])
if(!n)
for(var/i in 1 to d_disk.max_blueprints)
d_disk.blueprints[i] = null
say("Wiping design disk.")
else
var/datum/design/D = d_disk.blueprints[n]
say("Wiping design [D.name] from design disk.")
d_disk.blueprints[n] = null
if(ls["search"]) //Search for designs with name matching pattern
searchstring = ls["to_search"]
searchtype = ls["type"]
rescan_views()
if(searchtype == "proto")
screen = RDSCREEN_PROTOLATHE_SEARCH
else
screen = RDSCREEN_IMPRINTER_SEARCH
if(ls["updt_tech"]) //Uple the research holder with information from the technology disk.
if(QDELETED(t_disk))
say("No Technology Disk Inserted!")
return
say("Uploading technology disk.")
t_disk.stored_research.copy_research_to(stored_research)
if(ls["copy_design"]) //Copy design la from the research holder to the design disk.
if(QDELETED(d_disk))
say("No Design Disk Inserted!")
return
var/slot = text2num(ls["copy_design"])
var/datum/design/D = stored_research.researched_designs[ls["copy_design_ID"]]
if(D)
var/autolathe_friendly = TRUE
if(D.reagents_list.len)
autolathe_friendly = FALSE
D.category -= "Imported"
else
for(var/x in D.materials)
if( !(x in list(MAT_METAL, MAT_GLASS)))
autolathe_friendly = FALSE
D.category -= "Imported"
if(D.build_type & (AUTOLATHE|PROTOLATHE|CRAFTLATHE)) // Specifically excludes circuit imprinter and mechfab
D.build_type = autolathe_friendly ? (D.build_type | AUTOLATHE) : D.build_type
D.category |= "Imported"
d_disk.blueprints[slot] = D
screen = RDSCREEN_DESIGNDISK
if(ls["eject_item"]) //Eject the item inside the destructive analyzer.
if(QDELETED(linked_destroy))
say("No Deconstructive Analyzer Linked!")
return
if(linked_destroy.busy)
to_chat(usr, "<span class='danger'>The destructive analyzer is busy at the moment.</span>")
else if(linked_destroy.loaded_item)
linked_destroy.unload_item()
screen = RDSCREEN_MENU
if(ls["view_node"])
selected_node = SSresearch.techweb_nodes[ls["view_node"]]
screen = RDSCREEN_TECHWEB_NODEVIEW
if(ls["view_design"])
selected_design = SSresearch.techweb_designs[ls["view_design"]]
screen = RDSCREEN_TECHWEB_DESIGNVIEW
if(ls["updt_design"]) //Uples the research holder with design la from the design disk.
if(QDELETED(d_disk))
say("No design disk found.")
return
var/n = text2num(ls["updt_design"])
if(!n)
for(var/D in d_disk.blueprints)
if(D)
stored_research.add_design(D)
else
stored_research.add_design(d_disk.blueprints[n])
updateUsrDialog()
/obj/machinery/computer/rdconsole/attack_hand(mob/user)
if(..())
return
interact(user)
/obj/machinery/computer/rdconsole/interact(mob/user)
user.set_machine(src)
var/datum/browser/popup = new(user, "rndconsole", name, 900, 600)
popup.add_stylesheet("techwebs", 'html/browser/techwebs.css')
popup.set_content(generate_ui())
popup.open()
/obj/machinery/computer/rdconsole/proc/tdisk_uple_complete()
tdisk_uple = FALSE
updateUsrDialog()
/obj/machinery/computer/rdconsole/proc/ddisk_uple_complete()
ddisk_uple = FALSE
updateUsrDialog()
/obj/machinery/computer/rdconsole/proc/eject_disk(type)
if(type == "design")
d_disk.forceMove(get_turf(src))
d_disk = null
if(type == "tech")
t_disk.forceMove(get_turf(src))
t_disk = null
/obj/machinery/computer/rdconsole/proc/rescan_views()
var/compare
matching_designs.Cut()
if(searchtype == "proto")
compare = PROTOLATHE
else if(searchtype == "imprint")
compare = IMPRINTER
for(var/v in stored_research.researched_designs)
var/datum/design/D = stored_research.researched_designs[v]
if(!(D.build_type & compare))
continue
if(findtext(D.name,searchstring))
matching_designs.Add(D)
/obj/machinery/computer/rdconsole/proc/check_canprint(datum/design/D, buildtype)
var/amount = 50
if(buildtype == IMPRINTER)
if(QDELETED(linked_imprinter))
return FALSE
for(var/M in D.materials + D.reagents_list)
amount = min(amount, linked_imprinter.check_mat(D, M))
if(amount < 1)
return FALSE
else if(buildtype == PROTOLATHE)
if(QDELETED(linked_lathe))
return FALSE
for(var/M in D.materials + D.reagents_list)
amount = min(amount, linked_lathe.check_mat(D, M))
if(amount < 1)
return FALSE
else
return FALSE
return amount
/obj/machinery/computer/rdconsole/proc/lock_console(mob/user)
locked = TRUE
/obj/machinery/computer/rdconsole/proc/unlock_console(mob/user)
locked = FALSE
/obj/machinery/computer/rdconsole/robotics
name = "Robotics R&D Console"
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"
/obj/machinery/computer/rdconsole/experiment
name = "E.X.P.E.R.I-MENTOR R&D Console"