diff --git a/code/modules/modular_computers/file_system/programs/airestorer.dm b/code/modules/modular_computers/file_system/programs/airestorer.dm
index 1aa292f24..a715af66f 100644
--- a/code/modules/modular_computers/file_system/programs/airestorer.dm
+++ b/code/modules/modular_computers/file_system/programs/airestorer.dm
@@ -8,7 +8,7 @@
usage_flags = PROGRAM_CONSOLE
transfer_access = ACCESS_HEADS
available_on_ntnet = 1
- tgui_id = "ntos_ai_restorer"
+ tgui_id = "NtosAiRestorer"
ui_x = 600
ui_y = 400
diff --git a/code/modules/modular_computers/file_system/programs/alarm.dm b/code/modules/modular_computers/file_system/programs/alarm.dm
index ca075b51e..ebfd3c0ad 100644
--- a/code/modules/modular_computers/file_system/programs/alarm.dm
+++ b/code/modules/modular_computers/file_system/programs/alarm.dm
@@ -7,7 +7,7 @@
requires_ntnet = 1
network_destination = "alarm monitoring network"
size = 5
- tgui_id = "ntos_station_alert"
+ tgui_id = "NtosStationAlertConsole"
ui_x = 315
ui_y = 500
diff --git a/code/modules/modular_computers/file_system/programs/antagonist/dos.dm b/code/modules/modular_computers/file_system/programs/antagonist/dos.dm
index 337e98aca..336f255c5 100644
--- a/code/modules/modular_computers/file_system/programs/antagonist/dos.dm
+++ b/code/modules/modular_computers/file_system/programs/antagonist/dos.dm
@@ -7,7 +7,7 @@
requires_ntnet = 1
available_on_ntnet = 0
available_on_syndinet = 1
- tgui_id = "ntos_net_dos"
+ tgui_id = "NtosNetDos"
ui_style = "syndicate"
ui_x = 400
ui_y = 250
@@ -80,17 +80,8 @@
else if(target && executed)
data["target"] = 1
data["speed"] = dos_speed
-
- // This is mostly visual, generate some strings of 1s and 0s
- // Probability of 1 is equal of completion percentage of DoS attack on this relay.
- // Combined with UI updates this adds quite nice effect to the UI
- var/percentage = target.dos_overload * 100 / target.dos_capacity
- data["dos_strings"] = list()
- for(var/j, j<10, j++)
- var/string = ""
- for(var/i, i<20, i++)
- string = "[string][prob(percentage)]"
- data["dos_strings"] += list(list("nums" = string))
+ data["overload"] = target.dos_overload
+ data["capacity"] = target.dos_capacity
else
data["relays"] = list()
for(var/obj/machinery/ntnet_relay/R in SSnetworks.station_network.relays)
diff --git a/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm b/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm
index 103b70e49..3e8f0edf7 100644
--- a/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm
+++ b/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm
@@ -7,7 +7,7 @@
requires_ntnet = 0
available_on_ntnet = 0
available_on_syndinet = 1
- tgui_id = "ntos_revelation"
+ tgui_id = "NtosRevelation"
ui_style = "syndicate"
ui_x = 400
ui_y = 250
diff --git a/code/modules/modular_computers/file_system/programs/card.dm b/code/modules/modular_computers/file_system/programs/card.dm
index 8319dee60..75c51b00e 100644
--- a/code/modules/modular_computers/file_system/programs/card.dm
+++ b/code/modules/modular_computers/file_system/programs/card.dm
@@ -6,7 +6,7 @@
transfer_access = ACCESS_HEADS
requires_ntnet = 0
size = 8
- tgui_id = "ntos_card"
+ tgui_id = "NtosCard"
ui_x = 600
ui_y = 700
@@ -15,7 +15,7 @@
var/show_assignments = 0
var/minor = 0
var/authenticated = 0
- var/list/reg_ids = list()
+ var/reg_ids = 1
var/list/region_access = null
var/list/head_subordinates = null
var/target_dept = 0 //Which department this computer has access to. 0=all departments
@@ -94,6 +94,134 @@
return formatted
+
+/datum/computer_file/program/card_mod/ui_data(mob/user)
+ var/list/data = get_header_data()
+
+ var/obj/item/computer_hardware/card_slot/card_slot
+ var/obj/item/computer_hardware/printer/printer
+
+ if(computer)
+ card_slot = computer.all_components[MC_CARD]
+ printer = computer.all_components[MC_PRINT]
+
+ data["mmode"] = mod_mode
+
+ var/authed = 0
+ if(computer)
+ if(card_slot)
+ var/obj/item/card/id/auth_card = card_slot.stored_card2
+ data["auth_name"] = auth_card ? strip_html_simple(auth_card.name) : "-----"
+ authed = authorized()
+
+
+ if(mod_mode == 2)
+ data["slots"] = list()
+ var/list/pos = list()
+ for(var/datum/job/job in SSjob.occupations)
+ if(job.title in blacklisted)
+ continue
+
+ var/list/status_open = build_manage(job,1)
+ var/list/status_close = build_manage(job,0)
+
+ pos.Add(list(list(
+ "title" = job.title,
+ "current" = job.current_positions,
+ "total" = job.total_positions,
+ "status_open" = (authed && !minor) ? status_open["enable"]: 0,
+ "status_close" = (authed && !minor) ? status_close["enable"] : 0,
+ "desc_open" = status_open["desc"],
+ "desc_close" = status_close["desc"])))
+ data["slots"] = pos
+
+ data["src"] = "[REF(src)]"
+
+
+ if(!mod_mode)
+ data["manifest"] = list()
+ var/list/crew = list()
+ for(var/datum/data/record/t in sortRecord(GLOB.data_core.general))
+ crew.Add(list(list(
+ "name" = t.fields["name"],
+ "rank" = t.fields["rank"])))
+
+ data["manifest"] = crew
+ data["assignments"] = show_assignments
+ if(computer)
+ data["have_id_slot"] = !!card_slot
+ data["have_printer"] = !!printer
+ if(!card_slot && mod_mode == 1)
+ mod_mode = 0 //We can't modify IDs when there is no card reader
+ else
+ data["have_id_slot"] = 0
+ data["have_printer"] = 0
+
+ data["authenticated"] = authed
+
+ if(mod_mode == 1 && computer)
+ if(card_slot)
+ var/obj/item/card/id/id_card = card_slot.stored_card
+
+ data["has_id"] = !!id_card
+ data["id_rank"] = id_card && id_card.assignment ? html_encode(id_card.assignment) : "Unassigned"
+ data["id_owner"] = id_card && id_card.registered_name ? html_encode(id_card.registered_name) : "-----"
+ data["id_name"] = id_card ? strip_html_simple(id_card.name) : "-----"
+
+ if(card_slot.stored_card)
+ var/obj/item/card/id/id_card = card_slot.stored_card
+
+ if(is_centcom)
+ var/list/all_centcom_access = list()
+ for(var/access in get_all_centcom_access())
+ all_centcom_access.Add(list(list(
+ "desc" = replacetext(get_centcom_access_desc(access), " ", " "),
+ "ref" = access,
+ "allowed" = (access in id_card.access) ? 1 : 0)))
+ data["all_centcom_access"] = all_centcom_access
+ else
+ var/list/accesses = list()
+ for(var/access in get_region_accesses(reg_ids))
+ if (get_access_desc(access))
+ accesses.Add(list(list(
+ "desc" = replacetext(get_access_desc(access), " ", " "),
+ "ref" = access,
+ "allowed" = (access in id_card.access) ? 1 : 0)))
+
+ var/list/regions = list()
+ for(var/i = 1; i <= 7; i++)
+ if((minor || target_dept) && !(i in region_access))
+ continue
+
+ regions.Add(list(list(
+ "name" = get_region_accesses_name(i),
+ "regid" = i,
+ "selected" = (reg_ids == i) ? 1 : null,
+ "accesses" = (reg_ids == i) ? accesses : null)))
+ data["regions"] = regions
+
+ return data
+
+
+/datum/computer_file/program/card_mod/ui_static_data(mob/user)
+ var/list/data = list()
+
+ data["station_name"] = station_name()
+ data["centcom_access"] = is_centcom
+ data["minor"] = target_dept || minor ? TRUE : FALSE
+
+ if(authenticated)
+ data["engineering_jobs"] = format_jobs(GLOB.engineering_positions)
+ data["medical_jobs"] = format_jobs(GLOB.medical_positions)
+ data["science_jobs"] = format_jobs(GLOB.science_positions)
+ data["security_jobs"] = format_jobs(GLOB.security_positions)
+ data["cargo_jobs"] = format_jobs(GLOB.supply_positions)
+ data["civilian_jobs"] = format_jobs(GLOB.civilian_positions)
+ data["centcom_jobs"] = format_jobs(get_all_centcom_jobs())
+
+ return data
+
+
/datum/computer_file/program/card_mod/ui_act(action, params)
if(..())
return 1
@@ -127,11 +255,6 @@
mod_mode = 0
else if (params["target"] == "manage")
mod_mode = 2
- if("PRG_togglea")
- if(show_assignments)
- show_assignments = 0
- else
- show_assignments = 1
if("PRG_print")
if(computer && printer) //This option should never be called if there is no printer
if(mod_mode)
@@ -270,13 +393,8 @@
j.total_positions--
opened_positions[edit_job_target]--
if("PRG_regsel")
- if(!reg_ids)
- reg_ids = list()
var/regsel = text2num(params["region"])
- if(regsel in reg_ids)
- reg_ids -= regsel
- else
- reg_ids += regsel
+ reg_ids = regsel
if(id_card)
id_card.name = text("[id_card.registered_name]'s ID Card ([id_card.assignment])")
@@ -290,133 +408,6 @@
/datum/computer_file/program/card_mod/proc/apply_access(obj/item/card/id/id_card, list/accesses)
id_card.access |= accesses
-/datum/computer_file/program/card_mod/ui_data(mob/user)
-
- var/list/data = get_header_data()
-
- var/obj/item/computer_hardware/card_slot/card_slot
- var/obj/item/computer_hardware/printer/printer
-
- if(computer)
- card_slot = computer.all_components[MC_CARD]
- printer = computer.all_components[MC_PRINT]
-
- data["mmode"] = mod_mode
-
- var/authed = 0
- if(computer)
- if(card_slot)
- var/obj/item/card/id/auth_card = card_slot.stored_card2
- data["auth_name"] = auth_card ? strip_html_simple(auth_card.name) : "-----"
- authed = authorized()
-
-
- if(mod_mode == 2)
- data["slots"] = list()
- var/list/pos = list()
- for(var/datum/job/job in SSjob.occupations)
- if(job.title in blacklisted)
- continue
-
- var/list/status_open = build_manage(job,1)
- var/list/status_close = build_manage(job,0)
-
- pos.Add(list(list(
- "title" = job.title,
- "current" = job.current_positions,
- "total" = job.total_positions,
- "status_open" = (authed && !minor) ? status_open["enable"]: 0,
- "status_close" = (authed && !minor) ? status_close["enable"] : 0,
- "desc_open" = status_open["desc"],
- "desc_close" = status_close["desc"])))
- data["slots"] = pos
-
- data["src"] = "[REF(src)]"
- data["station_name"] = station_name()
-
-
- if(!mod_mode)
- data["manifest"] = list()
- var/list/crew = list()
- for(var/datum/data/record/t in sortRecord(GLOB.data_core.general))
- crew.Add(list(list(
- "name" = t.fields["name"],
- "rank" = t.fields["rank"])))
-
- data["manifest"] = crew
- data["assignments"] = show_assignments
- if(computer)
- data["have_id_slot"] = !!card_slot
- data["have_printer"] = !!printer
- if(!card_slot && mod_mode == 1)
- mod_mode = 0 //We can't modify IDs when there is no card reader
- else
- data["have_id_slot"] = 0
- data["have_printer"] = 0
-
- data["centcom_access"] = is_centcom
-
-
- data["authenticated"] = authed
-
-
- if(mod_mode == 1 && computer)
- if(card_slot)
- var/obj/item/card/id/id_card = card_slot.stored_card
-
- data["has_id"] = !!id_card
- data["id_rank"] = id_card && id_card.assignment ? html_encode(id_card.assignment) : "Unassigned"
- data["id_owner"] = id_card && id_card.registered_name ? html_encode(id_card.registered_name) : "-----"
- data["id_name"] = id_card ? strip_html_simple(id_card.name) : "-----"
-
- if(show_assignments)
- data["engineering_jobs"] = format_jobs(GLOB.engineering_positions)
- data["medical_jobs"] = format_jobs(GLOB.medical_positions)
- data["science_jobs"] = format_jobs(GLOB.science_positions)
- data["security_jobs"] = format_jobs(GLOB.security_positions)
- data["cargo_jobs"] = format_jobs(GLOB.supply_positions)
- data["civilian_jobs"] = format_jobs(GLOB.civilian_positions)
- data["centcom_jobs"] = format_jobs(get_all_centcom_jobs())
-
-
- if(card_slot.stored_card)
- var/obj/item/card/id/id_card = card_slot.stored_card
- if(is_centcom)
- var/list/all_centcom_access = list()
- for(var/access in get_all_centcom_access())
- all_centcom_access.Add(list(list(
- "desc" = replacetext(get_centcom_access_desc(access), " ", " "),
- "ref" = access,
- "allowed" = (access in id_card.access) ? 1 : 0)))
- data["all_centcom_access"] = all_centcom_access
- else
- var/list/regions = list()
- for(var/i = 1; i <= 7; i++)
- if((minor || target_dept) && !(i in region_access))
- continue
-
- var/list/accesses = list()
- if(i in reg_ids)
- for(var/access in get_region_accesses(i))
- if (get_access_desc(access))
- accesses.Add(list(list(
- "desc" = replacetext(get_access_desc(access), " ", " "),
- "ref" = access,
- "allowed" = (access in id_card.access) ? 1 : 0)))
-
- regions.Add(list(list(
- "name" = get_region_accesses_name(i),
- "regid" = i,
- "selected" = (i in reg_ids) ? 1 : null,
- "accesses" = accesses)))
- data["regions"] = regions
-
- data["minor"] = target_dept || minor ? 1 : 0
-
-
- return data
-
-
/datum/computer_file/program/card_mod/proc/build_manage(datum/job,open = FALSE)
var/out = "Denied"
var/can_change= 0
diff --git a/code/modules/modular_computers/file_system/programs/file_browser.dm b/code/modules/modular_computers/file_system/programs/file_browser.dm
index 090d64e9d..4b7dba165 100644
--- a/code/modules/modular_computers/file_system/programs/file_browser.dm
+++ b/code/modules/modular_computers/file_system/programs/file_browser.dm
@@ -7,10 +7,7 @@
requires_ntnet = 0
available_on_ntnet = 0
undeletable = 1
- tgui_id = "ntos_file_manager"
-
- var/open_file
- var/error
+ tgui_id = "NtosFileManager"
/datum/computer_file/program/filemanager/ui_act(action, params)
if(..())
@@ -18,23 +15,8 @@
var/obj/item/computer_hardware/hard_drive/HDD = computer.all_components[MC_HDD]
var/obj/item/computer_hardware/hard_drive/RHDD = computer.all_components[MC_SDD]
- var/obj/item/computer_hardware/printer/printer = computer.all_components[MC_PRINT]
switch(action)
- if("PRG_openfile")
- . = 1
- open_file = params["name"]
- if("PRG_newtextfile")
- . = 1
- var/newname = stripped_input(usr, "Enter file name or leave blank to cancel:", "File rename", max_length=50)
- if(!newname)
- return 1
- if(!HDD)
- return 1
- var/datum/computer_file/data/F = new/datum/computer_file/data()
- F.filename = newname
- F.filetype = "TXT"
- HDD.store_file(F)
if("PRG_deletefile")
. = 1
if(!HDD)
@@ -51,19 +33,6 @@
if(!file || file.undeletable)
return 1
RHDD.remove_file(file)
- if("PRG_closefile")
- . = 1
- open_file = null
- error = null
- if("PRG_clone")
- . = 1
- if(!HDD)
- return 1
- var/datum/computer_file/F = HDD.find_file_by_name(params["name"])
- if(!F || !istype(F))
- return 1
- var/datum/computer_file/C = F.clone(1)
- HDD.store_file(C)
if("PRG_rename")
. = 1
if(!HDD)
@@ -74,47 +43,15 @@
var/newname = stripped_input(usr, "Enter new file name:", "File rename", file.filename, max_length=50)
if(file && newname)
file.filename = newname
- if("PRG_edit")
- . = 1
- if(!open_file)
+ if("PRG_usbrenamefile")
+ if(!RHDD)
return 1
- if(!HDD)
- return 1
- var/datum/computer_file/data/F = HDD.find_file_by_name(open_file)
- if(!F || !istype(F))
- return 1
- if(F.do_not_edit && (alert("WARNING: This file is not compatible with editor. Editing it may result in permanently corrupted formatting or damaged data consistency. Edit anyway?", "Incompatible File", "No", "Yes") == "No"))
- return 1
- // 16384 is the limit for file length in characters. Currently, papers have value of 2048 so this is 8 times as long, since we can't edit parts of the file independently.
- var/newtext = stripped_multiline_input(usr, "Editing file [open_file]. You may use most tags used in paper formatting:", "Text Editor", html_decode(F.stored_data), 16384, TRUE)
- if(!newtext)
- return
- if(F)
- var/datum/computer_file/data/backup = F.clone()
- HDD.remove_file(F)
- F.stored_data = newtext
- F.calculate_size()
- // We can't store the updated file, it's probably too large. Print an error and restore backed up version.
- // This is mostly intended to prevent people from losing texts they spent lot of time working on due to running out of space.
- // They will be able to copy-paste the text from error screen and store it in notepad or something.
- if(!HDD.store_file(F))
- error = "I/O error: Unable to overwrite file. Hard drive is probably full. You may want to backup your changes before closing this window:
[F.stored_data]
"
- HDD.store_file(backup)
- if("PRG_printfile")
- . = 1
- if(!open_file)
- return 1
- if(!HDD)
- return 1
- var/datum/computer_file/data/F = HDD.find_file_by_name(open_file)
- if(!F || !istype(F))
- return 1
- if(!printer)
- error = "Missing Hardware: Your computer does not have required hardware to complete this operation."
- return 1
- if(!printer.print_text("" + prepare_printjob(F.stored_data) + "", open_file))
- error = "Hardware error: Printer was unable to print the file. It may be out of paper."
+ var/datum/computer_file/file = RHDD.find_file_by_name(params["name"])
+ if(!file || !istype(file))
return 1
+ var/newname = stripped_input(usr, "Enter new file name:", "File rename", file.filename, max_length=50)
+ if(file && newname)
+ file.filename = newname
if("PRG_copytousb")
. = 1
if(!HDD || !RHDD)
@@ -190,43 +127,29 @@
var/obj/item/computer_hardware/hard_drive/HDD = computer.all_components[MC_HDD]
var/obj/item/computer_hardware/hard_drive/portable/RHDD = computer.all_components[MC_SDD]
- if(error)
- data["error"] = error
- if(open_file)
- var/datum/computer_file/data/file
- if(!computer || !HDD)
- data["error"] = "I/O ERROR: Unable to access hard drive."
- else
- file = HDD.find_file_by_name(open_file)
- if(!istype(file))
- data["error"] = "I/O ERROR: Unable to open file."
- else
- data["filedata"] = parse_tags(file.stored_data)
- data["filename"] = "[file.filename].[file.filetype]"
+ if(!computer || !HDD)
+ data["error"] = "I/O ERROR: Unable to access hard drive."
else
- if(!computer || !HDD)
- data["error"] = "I/O ERROR: Unable to access hard drive."
- else
- var/list/files[0]
- for(var/datum/computer_file/F in HDD.stored_files)
- files.Add(list(list(
+ var/list/files[0]
+ for(var/datum/computer_file/F in HDD.stored_files)
+ files.Add(list(list(
+ "name" = F.filename,
+ "type" = F.filetype,
+ "size" = F.size,
+ "undeletable" = F.undeletable
+ )))
+ data["files"] = files
+ if(RHDD)
+ data["usbconnected"] = TRUE
+ var/list/usbfiles[0]
+ for(var/datum/computer_file/F in RHDD.stored_files)
+ usbfiles.Add(list(list(
"name" = F.filename,
"type" = F.filetype,
"size" = F.size,
"undeletable" = F.undeletable
)))
- data["files"] = files
- if(RHDD)
- data["usbconnected"] = 1
- var/list/usbfiles[0]
- for(var/datum/computer_file/F in RHDD.stored_files)
- usbfiles.Add(list(list(
- "name" = F.filename,
- "type" = F.filetype,
- "size" = F.size,
- "undeletable" = F.undeletable
- )))
- data["usbfiles"] = usbfiles
+ data["usbfiles"] = usbfiles
return data
diff --git a/code/modules/modular_computers/file_system/programs/ntmonitor.dm b/code/modules/modular_computers/file_system/programs/ntmonitor.dm
index 2312db7b1..07ccaf8af 100644
--- a/code/modules/modular_computers/file_system/programs/ntmonitor.dm
+++ b/code/modules/modular_computers/file_system/programs/ntmonitor.dm
@@ -7,7 +7,7 @@
requires_ntnet = 1
required_access = ACCESS_NETWORK //NETWORK CONTROL IS A MORE SECURE PROGRAM.
available_on_ntnet = 1
- tgui_id = "ntos_net_monitor"
+ tgui_id = "NtosNetMonitor"
/datum/computer_file/program/ntnetmonitor/ui_act(action, params)
if(..())
diff --git a/code/modules/modular_computers/file_system/programs/nttransfer.dm b/code/modules/modular_computers/file_system/programs/nttransfer.dm
index 698e55794..ae5423a1a 100644
--- a/code/modules/modular_computers/file_system/programs/nttransfer.dm
+++ b/code/modules/modular_computers/file_system/programs/nttransfer.dm
@@ -8,7 +8,7 @@
requires_ntnet_feature = NTNET_PEERTOPEER
network_destination = "other device via P2P tunnel"
available_on_ntnet = 1
- tgui_id = "ntos_net_transfer"
+ tgui_id = "NtosNetTransfer"
var/error = "" // Error screen
var/server_password = "" // Optional password to download the file.
diff --git a/tgui/packages/tgui/interfaces/NtosAiRestorer.js b/tgui/packages/tgui/interfaces/NtosAiRestorer.js
new file mode 100644
index 000000000..54fcd00c4
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/NtosAiRestorer.js
@@ -0,0 +1,90 @@
+import { useBackend } from '../backend';
+import { Box, Button, LabeledList, NoticeBox, ProgressBar, Section, Table } from '../components';
+import { NtosWindow } from '../layouts';
+
+export const NtosAiRestorer = (props, context) => {
+ const { act, data } = useBackend(context);
+ const {
+ restoring,
+ error,
+ name,
+ nocard,
+ isDead,
+ health,
+ no_ai,
+ ai_laws = [],
+ } = data;
+
+ return (
+