From 4fcedc92264b053b400d693d2dc6d72f6442e14f Mon Sep 17 00:00:00 2001
From: John Willard <53777086+JohnFulpWillard@users.noreply.github.com>
Date: Sun, 29 Jan 2023 18:19:57 +0000
Subject: [PATCH] R&D Monitoring console TGUI + Can see RD consoles (#72987)
## About The Pull Request
I wrote this while constantly rushing lol
This PR does many things, the largest is that the R&D Monitoring console
(the RD's one) is now TGUI
It also changes how researching loggings work, bringing the RD console
and NtosRD app on par with eachother
The type of person is also logged differently, instead of ``Cyborg:
[name]`` and ``User: [name]``, humans do not have a prefix and cyborgs
will say ``CYBORG [name]``. ``research_logs`` also works differently now
to make it easier to reference each needed data from the list.
Lastly, I added the ability to see R&D consoles from the console, and
the ability to remotely un/lock them down. This currently is pretty
useless as it can't control the tablet app variant, and anyone with
Science access can just unlock it, however with some minor future
changes I think this can be turned into a good way for the RD to get
control of their department.
Video demonstration, mostly (I made a few edits after this):
https://user-images.githubusercontent.com/53777086/215005387-817106f4-5237-4f2e-b0ac-da28e6a17f9c.mp4
## Why It's Good For The Game
This console is overhyped by the game, being hidden behind an RD-locked
Command-colored door, in the same room as one of the most damaging theft
objectives, yet it is one of the most useless and forgotten consoles in
R&D if you don't count everything outside of researching, experiments
and robotics.
This adds a nice TGUI menu while making it a little more worthwhile to
use.
## Changelog
:cl:
balance: The R&D monitoring console now shows R&D consoles and their
locations.
refactor: The R&D monitoring console now has a nice TGUI menu.
/:cl:
---
.../file_system/programs/techweb.dm | 15 +-
code/modules/research/rdconsole.dm | 17 +-
code/modules/research/server.dm | 90 +----------
code/modules/research/server_control.dm | 84 ++++++++++
code/modules/research/techweb/_techweb.dm | 2 +-
tgstation.dme | 1 +
.../tgui/interfaces/ServerControl.tsx | 152 ++++++++++++++++++
7 files changed, 263 insertions(+), 98 deletions(-)
create mode 100644 code/modules/research/server_control.dm
create mode 100644 tgui/packages/tgui/interfaces/ServerControl.tsx
diff --git a/code/modules/modular_computers/file_system/programs/techweb.dm b/code/modules/modular_computers/file_system/programs/techweb.dm
index 2e609a24374..80302abf894 100644
--- a/code/modules/modular_computers/file_system/programs/techweb.dm
+++ b/code/modules/modular_computers/file_system/programs/techweb.dm
@@ -204,21 +204,26 @@
computer.say("Successfully researched [tech_node.display_name].")
var/logname = "Unknown"
if(isAI(user))
- logname = "AI: [user.name]"
+ logname = "AI [user.name]"
if(iscyborg(user))
- logname = "Cyborg: [user.name]"
+ logname = "CYBORG [user.name]"
if(iscarbon(user))
var/obj/item/card/id/idcard = user.get_active_held_item()
if(istype(idcard))
- logname = "User: [idcard.registered_name]"
+ logname = "[idcard.registered_name]"
if(ishuman(user))
var/mob/living/carbon/human/human_user = user
var/obj/item/worn = human_user.wear_id
if(istype(worn))
var/obj/item/card/id/id_card_of_human_user = worn.GetID()
if(istype(id_card_of_human_user))
- logname = "User: [id_card_of_human_user.registered_name]"
- stored_research.research_logs += list(list(tech_node.display_name, price["General Research"], logname, "[get_area(computer)] ([user.x],[user.y],[user.z])"))
+ logname = "[id_card_of_human_user.registered_name]"
+ stored_research.research_logs += list(list(
+ "node_name" = tech_node.display_name,
+ "node_cost" = price["General Research"],
+ "node_researcher" = logname,
+ "node_research_location" = "[get_area(computer)] ([user.x],[user.y],[user.z])",
+ ))
return TRUE
else
computer.say("Failed to research node: Internal database error!")
diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm
index 790f7c8ab72..c6a330efd22 100644
--- a/code/modules/research/rdconsole.dm
+++ b/code/modules/research/rdconsole.dm
@@ -113,23 +113,26 @@ Nothing else in the console has ID requirements.
say("Successfully researched [TN.display_name].")
var/logname = "Unknown"
if(isAI(user))
- logname = "AI: [user.name]"
+ logname = "AI [user.name]"
if(iscyborg(user))
- logname = "Cyborg: [user.name]"
+ logname = "CYBORG [user.name]"
if(iscarbon(user))
var/obj/item/card/id/idcard = user.get_active_held_item()
if(istype(idcard))
- logname = "User: [idcard.registered_name]"
+ logname = "[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]"
- var/i = stored_research.research_logs.len
- stored_research.research_logs += null
- stored_research.research_logs[++i] = list(TN.display_name, price["General Research"], logname, "[get_area(src)] ([src.x],[src.y],[src.z])")
+ logname = "[ID.registered_name]"
+ stored_research.research_logs += list(list(
+ "node_name" = TN.display_name,
+ "node_cost" = price["General Research"],
+ "node_researcher" = logname,
+ "node_research_location" = "[get_area(src)] ([src.x],[src.y],[src.z])",
+ ))
return TRUE
else
say("Failed to research node: Internal database error!")
diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm
index f4a7dfa0cb1..d611ea0bf96 100644
--- a/code/modules/research/server.dm
+++ b/code/modules/research/server.dm
@@ -9,7 +9,7 @@
/// The ninja has blown the HDD up.
#define HDD_OVERLOADED 4
-#define SERVER_NOMINAL_TEXT "Nominal"
+#define SERVER_NOMINAL_TEXT "Nominal"
/obj/machinery/rnd/server
name = "\improper R&D Server"
@@ -87,15 +87,15 @@
/// Gets status text based on this server's status for the computer.
/obj/machinery/rnd/server/proc/get_status_text()
if(machine_stat & EMPED)
- return "O&F@I*$ - R3*&O$T R@U!R%D"
+ return "O&F@I*$ - R3*&O$T R@U!R%D"
else if(machine_stat & NOPOWER)
- return "Offline - Server Unpowered"
+ return "Offline - Server Unpowered"
else if(research_disabled)
- return "Offline - Server Control Disabled"
+ return "Offline - Server Control Disabled"
else if(!working)
// If, for some reason, working is FALSE even though we're not emp'd or powerless,
// We need something to update our working state - such as rebooting the server
- return "Offline - Reboot Required"
+ return "Offline - Reboot Required"
return SERVER_NOMINAL_TEXT
@@ -106,86 +106,6 @@
to_chat(user, span_notice("Stored [src]'s techweb information in [tool]."))
return TRUE
-/obj/machinery/computer/rdservercontrol
- name = "R&D Server Controller"
- desc = "Used to manage access to research and manufacturing databases."
- icon_screen = "rdcomp"
- icon_keyboard = "rd_key"
- circuit = /obj/item/circuitboard/computer/rdservercontrol
- req_access = list(ACCESS_RD)
- var/list/servers = list()
- ///Connected techweb node the server is connected to.
- var/datum/techweb/stored_research
-
-/obj/machinery/computer/rdservercontrol/Initialize(mapload, obj/item/circuitboard/C)
- . = ..()
- if(!CONFIG_GET(flag/no_default_techweb_link) && !stored_research)
- stored_research = SSresearch.science_tech
-
-/obj/machinery/computer/rdservercontrol/Topic(href, href_list)
- if(..())
- return
-
- add_fingerprint(usr)
- if (href_list["toggle"])
- if(allowed(usr) || obj_flags & EMAGGED)
- var/obj/machinery/rnd/server/S = locate(href_list["toggle"]) in stored_research.techweb_servers
- S.toggle_disable(usr)
- else
- to_chat(usr, span_danger("Access Denied."))
-
- updateUsrDialog()
- return
-
-/obj/machinery/computer/rdservercontrol/ui_interact(mob/user)
- . = ..()
- var/list/dat = list()
-
- dat += "Connected Servers:"
- dat += "