/obj/machinery/r_n_d/server name = "R&D Server" icon = 'icons/obj/machines/research.dmi' icon_state = "server" var/datum/research/files var/health = 100 var/list/id_with_upload = list() //List of R&D consoles with upload to server access. var/list/id_with_download = list() //List of R&D consoles with download from server access. var/id_with_upload_string = "" //String versions for easy editing in map editor. var/id_with_download_string = "" var/server_id = 0 var/heat_gen = 100 var/heating_power = 40000 var/delay = 10 req_access = list(access_rd) //Only the R&D can change server settings. /obj/machinery/r_n_d/server/New() ..() component_parts = list() component_parts += new /obj/item/weapon/circuitboard/rdserver(src) component_parts += new /obj/item/weapon/stock_parts/scanning_module(src) component_parts += new /obj/item/weapon/cable_coil(src) component_parts += new /obj/item/weapon/cable_coil(src) RefreshParts() src.initialize(); //Agouri /obj/machinery/r_n_d/server/Del() griefProtection() ..() /obj/machinery/r_n_d/server/RefreshParts() var/tot_rating = 0 for(var/obj/item/weapon/stock_parts/SP in src) tot_rating += SP.rating heat_gen /= max(1, tot_rating) /obj/machinery/r_n_d/server/initialize() if(!files) files = new /datum/research(src) var/list/temp_list if(!id_with_upload.len) temp_list = list() temp_list = text2list(id_with_upload_string, ";") for(var/N in temp_list) id_with_upload += text2num(N) if(!id_with_download.len) temp_list = list() temp_list = text2list(id_with_download_string, ";") for(var/N in temp_list) id_with_download += text2num(N) /obj/machinery/r_n_d/server/process() var/datum/gas_mixture/environment = loc.return_air() switch(environment.temperature) if(0 to T0C) health = min(100, health + 1) if(T0C to (T20C + 20)) health = between(0, health, 100) if((T20C + 20) to (T0C + 70)) health = max(0, health - 1) if(health <= 0) griefProtection() //I dont like putting this in process() but it's the best I can do without re-writing a chunk of rd servers. files.known_designs = list() for(var/datum/tech/T in files.known_tech) if(prob(1)) T.level-- files.RefreshResearch() if(delay) delay-- else produce_heat(heat_gen) delay = initial(delay) /obj/machinery/r_n_d/server/meteorhit(var/obj/O as obj) griefProtection() ..() /obj/machinery/r_n_d/server/emp_act(severity) griefProtection() ..() /obj/machinery/r_n_d/server/ex_act(severity) griefProtection() ..() /obj/machinery/r_n_d/server/blob_act() griefProtection() ..() //Backup files to centcomm to help admins recover data after greifer attacks /obj/machinery/r_n_d/server/proc/griefProtection() for(var/obj/machinery/r_n_d/server/centcom/C in world) for(var/datum/tech/T in files.known_tech) C.files.AddTech2Known(T) for(var/datum/design/D in files.known_designs) C.files.AddDesign2Known(D) C.files.RefreshResearch() /obj/machinery/r_n_d/server/proc/produce_heat(heat_amt) if(!(stat & (NOPOWER|BROKEN))) //Blatently stolen from space heater. var/turf/simulated/L = loc if(istype(L)) var/datum/gas_mixture/env = L.return_air() if(env.temperature < (heat_amt+T0C)) var/transfer_moles = 0.25 * env.total_moles() var/datum/gas_mixture/removed = env.remove(transfer_moles) if(removed) var/heat_capacity = removed.heat_capacity() if(heat_capacity == 0 || heat_capacity == null) heat_capacity = 1 removed.temperature = min((removed.temperature*heat_capacity + heating_power)/heat_capacity, 1000) env.merge(removed) /obj/machinery/r_n_d/server/attackby(var/obj/item/O as obj, var/mob/user as mob) if (disabled) return if (shocked) shock(user,50) if (istype(O, /obj/item/weapon/screwdriver)) if (!opened) opened = 1 icon_state = "server_o" user << "You open the maintenance hatch of [src]." else opened = 0 icon_state = "server" user << "You close the maintenance hatch of [src]." return if (opened) if(istype(O, /obj/item/weapon/crowbar)) griefProtection() playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) var/obj/machinery/constructable_frame/machine_frame/M = new /obj/machinery/constructable_frame/machine_frame(src.loc) M.state = 2 M.icon_state = "box_1" for(var/obj/I in component_parts) if(I.reliability != 100 && crit_fail) I.crit_fail = 1 I.loc = src.loc del(src) return 1 /obj/machinery/r_n_d/server/attack_hand(mob/user as mob) if (disabled) return if (shocked) shock(user,50) if(ishuman(user)) if(istype(user:gloves, /obj/item/clothing/gloves/space_ninja)&&user:gloves:candrain&&!user:gloves:draining) call(/obj/item/clothing/gloves/space_ninja/proc/drain)("RESEARCH",src,user:wear_suit) return /obj/machinery/r_n_d/server/centcom name = "Centcom Central R&D Database" server_id = -1 /obj/machinery/r_n_d/server/centcom/initialize() ..() var/list/no_id_servers = list() var/list/server_ids = list() for(var/obj/machinery/r_n_d/server/S in world) switch(S.server_id) if(-1) continue if(0) no_id_servers += S else server_ids += S.server_id for(var/obj/machinery/r_n_d/server/S in no_id_servers) var/num = 1 while(!S.server_id) if(num in server_ids) num++ else S.server_id = num server_ids += num no_id_servers -= S /obj/machinery/r_n_d/server/centcom/process() return PROCESS_KILL //don't need process() /obj/machinery/computer/rdservercontrol name = "R&D Server Controller" icon_state = "rdcomp" var/screen = 0 var/obj/machinery/r_n_d/server/temp_server var/list/servers = list() var/list/consoles = list() var/badmin = 0 /obj/machinery/computer/rdservercontrol/Topic(href, href_list) if(..()) return add_fingerprint(usr) usr.set_machine(src) if(!src.allowed(usr) && !emagged) usr << "\red You do not have the required access level" return if(href_list["main"]) screen = 0 else if(href_list["access"] || href_list["data"] || href_list["transfer"]) temp_server = null consoles = list() servers = list() for(var/obj/machinery/r_n_d/server/S in world) if(S.server_id == text2num(href_list["access"]) || S.server_id == text2num(href_list["data"]) || S.server_id == text2num(href_list["transfer"])) temp_server = S break if(href_list["access"]) screen = 1 for(var/obj/machinery/computer/rdconsole/C in world) if(C.sync) consoles += C else if(href_list["data"]) screen = 2 else if(href_list["transfer"]) screen = 3 for(var/obj/machinery/r_n_d/server/S in world) if(S == src) continue servers += S else if(href_list["upload_toggle"]) var/num = text2num(href_list["upload_toggle"]) if(num in temp_server.id_with_upload) temp_server.id_with_upload -= num else temp_server.id_with_upload += num else if(href_list["download_toggle"]) var/num = text2num(href_list["download_toggle"]) if(num in temp_server.id_with_download) temp_server.id_with_download -= num else temp_server.id_with_download += num else if(href_list["reset_tech"]) var/choice = alert("Technology Data Rest", "Are you sure you want to reset this technology to its default data? Data lost cannot be recovered.", "Continue", "Cancel") if(choice == "Continue") for(var/datum/tech/T in temp_server.files.known_tech) if(T.id == href_list["reset_tech"]) T.level = 1 break temp_server.files.RefreshResearch() else if(href_list["reset_design"]) var/choice = alert("Design Data Deletion", "Are you sure you want to delete this design? If you still have the prerequisites for the design, it'll reset to its base reliability. Data lost cannot be recovered.", "Continue", "Cancel") if(choice == "Continue") for(var/datum/design/D in temp_server.files.known_designs) if(D.id == href_list["reset_design"]) D.reliability_mod = 0 temp_server.files.known_designs -= D break temp_server.files.RefreshResearch() updateUsrDialog() return /obj/machinery/computer/rdservercontrol/attack_hand(mob/user as mob) if(stat & (BROKEN|NOPOWER)) return user.set_machine(src) var/dat = "" switch(screen) if(0) //Main Menu dat += "Connected Servers:

" for(var/obj/machinery/r_n_d/server/S in world) if(istype(S, /obj/machinery/r_n_d/server/centcom) && !badmin) continue dat += "[S.name] || " dat += " Access Rights | " dat += "Data Management" if(badmin) dat += " | Server-to-Server Transfer" dat += "
" if(1) //Access rights menu dat += "[temp_server.name] Access Rights

" dat += "Consoles with Upload Access
" for(var/obj/machinery/computer/rdconsole/C in consoles) var/turf/console_turf = get_turf(C) dat += "* [console_turf.loc]" //FYI, these are all numeric ids, eventually. if(C.id in temp_server.id_with_upload) dat += " (Remove)
" else dat += " (Add)
" dat += "Consoles with Download Access
" for(var/obj/machinery/computer/rdconsole/C in consoles) var/turf/console_turf = get_turf(C) dat += "* [console_turf.loc]" if(C.id in temp_server.id_with_download) dat += " (Remove)
" else dat += " (Add)
" dat += "
Main Menu" if(2) //Data Management menu dat += "[temp_server.name] Data ManagementP

" dat += "Known Technologies
" for(var/datum/tech/T in temp_server.files.known_tech) dat += "* [T.name] " dat += "(Reset)
" //FYI, these are all strings. dat += "Known Designs
" for(var/datum/design/D in temp_server.files.known_designs) dat += "* [D.name] " dat += "(Delete)
" dat += "
Main Menu" if(3) //Server Data Transfer dat += "[temp_server.name] Server to Server Transfer

" dat += "Send Data to what server?
" for(var/obj/machinery/r_n_d/server/S in servers) dat += "[S.name] (Transfer)
" dat += "
Main Menu" user << browse("R&D Server Control
[dat]", "window=server_control;size=575x400") onclose(user, "server_control") return /obj/machinery/computer/rdservercontrol/attackby(var/obj/item/weapon/D as obj, var/mob/user as mob) if(istype(D, /obj/item/weapon/screwdriver)) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) if(do_after(user, 20)) if (src.stat & BROKEN) user << "\blue The broken glass falls out." var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) new /obj/item/weapon/shard( src.loc ) var/obj/item/weapon/circuitboard/rdservercontrol/M = new /obj/item/weapon/circuitboard/rdservercontrol( A ) for (var/obj/C in src) C.loc = src.loc A.circuit = M A.state = 3 A.icon_state = "3" A.anchored = 1 del(src) else user << "\blue You disconnect the monitor." var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) var/obj/item/weapon/circuitboard/rdservercontrol/M = new /obj/item/weapon/circuitboard/rdservercontrol( A ) for (var/obj/C in src) C.loc = src.loc A.circuit = M A.state = 4 A.icon_state = "4" A.anchored = 1 del(src) else if(istype(D, /obj/item/weapon/card/emag) && !emagged) playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) emagged = 1 user << "\blue You you disable the security protocols" src.updateUsrDialog() return /obj/machinery/r_n_d/server/robotics name = "Robotics R&D Server" id_with_upload_string = "1;2" id_with_download_string = "1;2" server_id = 2 /obj/machinery/r_n_d/server/core name = "Core R&D Server" id_with_upload_string = "1" id_with_download_string = "1" server_id = 1