diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm index 3bed269cc35..38e9e858fc9 100644 --- a/code/_globalvars/lists/maintenance_loot.dm +++ b/code/_globalvars/lists/maintenance_loot.dm @@ -251,6 +251,12 @@ GLOBAL_LIST_INIT(uncommon_loot, list(//uncommon: useful items /obj/item/food/monkeycube = 1, ) = 8, + list(//computer disks + /obj/item/computer_disk/maintenance/scanner = 1, + /obj/item/computer_disk/maintenance/camera = 1, + /obj/item/computer_disk/maintenance/modsuit_control = 1, + ) = 4, + list(//modsuits /obj/effect/spawner/random/mod/maint = 3, /obj/item/mod/construction/broken_core = 1, diff --git a/code/modules/mod/mod_ui.dm b/code/modules/mod/mod_ui.dm index c68c0270ddb..2a9652a4a98 100644 --- a/code/modules/mod/mod_ui.dm +++ b/code/modules/mod/mod_ui.dm @@ -54,7 +54,7 @@ data["boots"] = boots?.name return data -/obj/item/mod/control/ui_act(action, params) +/obj/item/mod/control/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return diff --git a/code/modules/modular_computers/computers/item/disks/computer_disk.dm b/code/modules/modular_computers/computers/item/disks/computer_disk.dm index 81e4171481c..bd652a31c8e 100644 --- a/code/modules/modular_computers/computers/item/disks/computer_disk.dm +++ b/code/modules/modular_computers/computers/item/disks/computer_disk.dm @@ -20,6 +20,10 @@ var/datum/computer_file/program/program_type = new programs add_file(program_type) +/obj/item/computer_disk/Destroy(force) + . = ..() + QDEL_LIST(stored_files) + /** * add_file * @@ -29,6 +33,7 @@ if((file.size + used_capacity) > max_capacity) return FALSE stored_files.Add(file) + file.disk_host = src used_capacity += file.size return TRUE diff --git a/code/modules/modular_computers/computers/item/disks/maintenance_disks.dm b/code/modules/modular_computers/computers/item/disks/maintenance_disks.dm new file mode 100644 index 00000000000..d343ceba26a --- /dev/null +++ b/code/modules/modular_computers/computers/item/disks/maintenance_disks.dm @@ -0,0 +1,13 @@ +/obj/item/computer_disk/maintenance + name = "maintenance data disk" + desc = "A data disk forgotten in the depths of maintenance, might have some useful program on it." + +/// Medical health analyzer app +/obj/item/computer_disk/maintenance/scanner + starting_programs = list(/datum/computer_file/program/maintenance/phys_scanner) + +/obj/item/computer_disk/maintenance/camera + starting_programs = list(/datum/computer_file/program/maintenance/camera) + +/obj/item/computer_disk/maintenance/modsuit_control + starting_programs = list(/datum/computer_file/program/maintenance/modsuit_control) diff --git a/code/modules/modular_computers/computers/item/disks/role_disks.dm b/code/modules/modular_computers/computers/item/disks/role_disks.dm index 97e06a3d86c..a1cd5d063ca 100644 --- a/code/modules/modular_computers/computers/item/disks/role_disks.dm +++ b/code/modules/modular_computers/computers/item/disks/role_disks.dm @@ -24,14 +24,12 @@ starting_programs = list( /datum/computer_file/program/records/security, /datum/computer_file/program/records/medical, - /datum/computer_file/program/phys_scanner/all, ) /obj/item/computer_disk/command/cmo name = "chief medical officer data disk" desc = "Removable disk used to download essential CMO tablet apps." starting_programs = list( - /datum/computer_file/program/phys_scanner/all, /datum/computer_file/program/records/medical, ) @@ -39,7 +37,6 @@ name = "research director data disk" desc = "Removable disk used to download essential RD tablet apps." starting_programs = list( - /datum/computer_file/program/phys_scanner/chemistry, /datum/computer_file/program/signal_commander, ) @@ -88,7 +85,6 @@ desc = "Removable disk used to download medical-related tablet apps." icon_state = "datadisk7" starting_programs = list( - /datum/computer_file/program/phys_scanner/medical, /datum/computer_file/program/records/medical, ) @@ -96,9 +92,6 @@ name = "chemistry data disk" desc = "Removable disk used to download chemistry-related tablet apps." icon_state = "datadisk5" - starting_programs = list( - /datum/computer_file/program/phys_scanner/chemistry, - ) /** * Supply diff --git a/code/modules/modular_computers/computers/item/role_tablet_presets.dm b/code/modules/modular_computers/computers/item/role_tablet_presets.dm index 0105b8cda95..ebb8bfe9776 100644 --- a/code/modules/modular_computers/computers/item/role_tablet_presets.dm +++ b/code/modules/modular_computers/computers/item/role_tablet_presets.dm @@ -81,7 +81,7 @@ /datum/computer_file/program/science, /datum/computer_file/program/robocontrol, /datum/computer_file/program/budgetorders, - /datum/computer_file/program/phys_scanner/all, + /datum/computer_file/program/maintenance/phys_scanner, /datum/computer_file/program/records/medical, ) @@ -96,7 +96,6 @@ /datum/computer_file/program/science, /datum/computer_file/program/robocontrol, /datum/computer_file/program/budgetorders, - /datum/computer_file/program/phys_scanner/chemistry, /datum/computer_file/program/signal_commander, ) @@ -136,7 +135,6 @@ /datum/computer_file/program/records/security, /datum/computer_file/program/crew_manifest, /datum/computer_file/program/robocontrol, - /datum/computer_file/program/phys_scanner/medical, ) /obj/item/modular_computer/pda/warden @@ -196,7 +194,6 @@ greyscale_config = /datum/greyscale_config/tablet/stripe_split greyscale_colors = "#FAFAFA#000099#0097CA" starting_programs = list( - /datum/computer_file/program/phys_scanner/medical, /datum/computer_file/program/records/medical, ) @@ -209,7 +206,6 @@ greyscale_config = /datum/greyscale_config/tablet/stripe_thick greyscale_colors = "#FAFAFA#000099#3F96CC" starting_programs = list( - /datum/computer_file/program/phys_scanner/medical, /datum/computer_file/program/records/medical, /datum/computer_file/program/robocontrol, ) @@ -217,7 +213,6 @@ /obj/item/modular_computer/pda/medical/paramedic name = "paramedic PDA" starting_programs = list( - /datum/computer_file/program/phys_scanner/medical, /datum/computer_file/program/records/medical, /datum/computer_file/program/radar/lifeline, ) @@ -227,7 +222,6 @@ greyscale_config = /datum/greyscale_config/tablet/stripe_split greyscale_colors = "#FAFAFA#355FAC#57C451" starting_programs = list( - /datum/computer_file/program/phys_scanner/medical, /datum/computer_file/program/records/medical, /datum/computer_file/program/robocontrol, ) @@ -236,9 +230,6 @@ name = "chemist PDA" greyscale_config = /datum/greyscale_config/tablet/stripe_thick greyscale_colors = "#FAFAFA#355FAC#EA6400" - starting_programs = list( - /datum/computer_file/program/phys_scanner/chemistry, - ) /** * Supply diff --git a/code/modules/modular_computers/file_system/computer_file.dm b/code/modules/modular_computers/file_system/computer_file.dm index d34124045ba..337f483ee90 100644 --- a/code/modules/modular_computers/file_system/computer_file.dm +++ b/code/modules/modular_computers/file_system/computer_file.dm @@ -13,15 +13,21 @@ var/static/file_uid = 0 ///The modular computer hosting the file. var/obj/item/modular_computer/computer + ///The computer disk hosting the file. + var/obj/item/computer_disk/disk_host /datum/computer_file/New() ..() uid = file_uid++ + RegisterSignal(src, COMSIG_MODULAR_COMPUTER_FILE_ADDED, PROC_REF(on_install)) /datum/computer_file/Destroy(force) if(computer) computer.remove_file(src) computer = null + if(disk_host) + disk_host.remove_file(src) + disk_host = null return ..() // Returns independent copy of this file. @@ -36,6 +42,11 @@ temp.filetype = filetype return temp +///Called post-installation of an application in a computer, after 'computer' var is set. +/datum/computer_file/proc/on_install() + SIGNAL_HANDLER + return + /** * Called when examining a modular computer * Args: diff --git a/code/modules/modular_computers/file_system/program.dm b/code/modules/modular_computers/file_system/program.dm index 84532e4f517..6d3bfb4fd9c 100644 --- a/code/modules/modular_computers/file_system/program.dm +++ b/code/modules/modular_computers/file_system/program.dm @@ -31,7 +31,7 @@ var/available_on_syndinet = FALSE /// Name of the tgui interface var/tgui_id - /// Example: "something.gif" - a header image that will be rendered in computer's UI when this program is running at background. Images are taken from /icons/program_icons. Be careful not to use too large images! + /// Example: "something.gif" - a header image that will be rendered in computer's UI when this program is running at background. Images must also be inserted into /datum/asset/simple/headers. var/ui_header = null /// Font Awesome icon to use as this program's icon in the modular computer main menu. Defaults to a basic program maximize window icon if not overridden. var/program_icon = "window-maximize-o" @@ -77,7 +77,7 @@ *user is the person making the attack action *params is anything the pre_attack() proc had in the same-named variable. */ -/datum/computer_file/program/proc/tap(atom/A, mob/living/user, params) +/datum/computer_file/program/proc/tap(atom/tapped_atom, mob/living/user, params) return FALSE ///Makes sure a program can run on this hardware (for apps limited to tablets/computers/laptops) @@ -213,7 +213,7 @@ // Calls beginning with "PRG_" are reserved for programs handling. // Calls beginning with "PC_" are reserved for computer handling (by whatever runs the program) // ALWAYS INCLUDE PARENT CALL ..() OR DIE IN FIRE. -/datum/computer_file/program/ui_act(action,list/params,datum/tgui/ui) +/datum/computer_file/program/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return diff --git a/code/modules/modular_computers/file_system/programs/alarm.dm b/code/modules/modular_computers/file_system/programs/alarm.dm index 7430e08ad2c..ad8f56d6330 100644 --- a/code/modules/modular_computers/file_system/programs/alarm.dm +++ b/code/modules/modular_computers/file_system/programs/alarm.dm @@ -14,13 +14,13 @@ /// Station alert datum for showing alerts UI var/datum/station_alert/alert_control -/datum/computer_file/program/alarm_monitor/New() +/datum/computer_file/program/alarm_monitor/on_install() + . = ..() //We want to send an alarm if we're in one of the mining home areas //Or if we're on station. Otherwise, die. var/list/allowed_areas = GLOB.the_station_areas + typesof(/area/mine) alert_control = new(computer, list(ALARM_ATMOS, ALARM_FIRE, ALARM_POWER), listener_areas = allowed_areas) RegisterSignals(alert_control.listener, list(COMSIG_ALARM_LISTENER_TRIGGERED, COMSIG_ALARM_LISTENER_CLEARED), PROC_REF(update_alarm_display)) - return ..() /datum/computer_file/program/alarm_monitor/Destroy() QDEL_NULL(alert_control) diff --git a/code/modules/modular_computers/file_system/programs/maintenance/_maintenance_program.dm b/code/modules/modular_computers/file_system/programs/maintenance/_maintenance_program.dm new file mode 100644 index 00000000000..39edf659cff --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/maintenance/_maintenance_program.dm @@ -0,0 +1,13 @@ +/** + * Maintenance programs + * + * Programs that are found from data disks in maintenance + * Can only be cloned once to a modular computer, then deletes itself. + */ +/datum/computer_file/program/maintenance + filetype = "MNT" + available_on_ntnet = FALSE + +/datum/computer_file/program/maintenance/clone(rename = FALSE) + . = ..() + qdel(src) diff --git a/code/modules/modular_computers/file_system/programs/maintenance/camera.dm b/code/modules/modular_computers/file_system/programs/maintenance/camera.dm new file mode 100644 index 00000000000..c5a89fb6f59 --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/maintenance/camera.dm @@ -0,0 +1,64 @@ +/datum/computer_file/program/maintenance/camera + filename = "camera_app" + filedesc = "Camera" + program_icon_state = "camera" + category = PROGRAM_CATEGORY_MISC + extended_desc = "This program allows the taking of pictures." + size = 4 + usage_flags = PROGRAM_TABLET + tgui_id = "NtosCamera" + program_icon = "camera" + + /// Camera built-into the tablet. + var/obj/item/camera/internal_camera + /// Latest picture taken by the app. + var/datum/picture/internal_picture + /// How many pictures were taken already, used for the camera's TGUI photo display + var/picture_number = 1 + +/datum/computer_file/program/maintenance/camera/on_install() + . = ..() + internal_camera = new(computer) + internal_camera.print_picture_on_snap = FALSE + +/datum/computer_file/program/maintenance/camera/Destroy() + if(internal_camera) + QDEL_NULL(internal_camera) + if(internal_picture) + QDEL_NULL(internal_picture) + return ..() + +/datum/computer_file/program/maintenance/camera/tap(atom/tapped_atom, mob/living/user, params) + . = ..() + if(internal_picture) + QDEL_NULL(internal_picture) + var/turf/our_turf = get_turf(tapped_atom) + internal_picture = internal_camera.captureimage(our_turf, user, internal_camera.picture_size_x + 1, internal_camera.picture_size_y + 1) + picture_number++ + computer.save_photo(internal_picture.picture_image) + +/datum/computer_file/program/maintenance/camera/ui_data(mob/user) + var/list/data = get_header_data() + + if(!isnull(internal_picture)) + user << browse_rsc(internal_picture.picture_image, "tmp_photo[picture_number].png") + data["photo"] = "tmp_photo[picture_number].png" + + data["paper_left"] = computer.stored_paper + + return data + +/datum/computer_file/program/maintenance/camera/ui_act(action, params, datum/tgui/ui) + . = ..() + if(.) + return + + var/mob/living/user = usr + switch(action) + if("print_photo") + if(computer.stored_paper <= 0) + to_chat(usr, span_notice("Hardware error: Printer out of paper.")) + return + internal_camera.printpicture(user, internal_picture) + computer.stored_paper-- + computer.visible_message(span_notice("\The [computer] prints out a paper.")) diff --git a/code/modules/modular_computers/file_system/programs/maintenance/modsuit.dm b/code/modules/modular_computers/file_system/programs/maintenance/modsuit.dm new file mode 100644 index 00000000000..1c0efef4d35 --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/maintenance/modsuit.dm @@ -0,0 +1,49 @@ +/datum/computer_file/program/maintenance/modsuit_control + filename = "modsuit_control" + filedesc = "MODsuit Control" + program_icon_state = "modsuit_control" + category = PROGRAM_CATEGORY_SCI + extended_desc = "This program allows people to connect a MODsuit to it, allowing remote control." + size = 2 + tgui_id = "NtosMODsuit" + program_icon = "user-astronaut" + + ///The suit we have control over. + var/obj/item/mod/control/controlled_suit + +/datum/computer_file/program/maintenance/modsuit_control/Destroy() + if(controlled_suit) + unsync_modsuit() + return ..() + +/datum/computer_file/program/maintenance/modsuit_control/application_attackby(obj/item/attacking_item, mob/living/user) + . = ..() + if(!istype(attacking_item, controlled_suit)) + return FALSE + if(controlled_suit) + unsync_modsuit() + controlled_suit = attacking_item + RegisterSignal(controlled_suit, COMSIG_PARENT_QDELETING, PROC_REF(unsync_modsuit)) + user.balloon_alert(user, "suit updated") + return TRUE + +/datum/computer_file/program/maintenance/modsuit_control/proc/unsync_modsuit(atom/source) + UnregisterSignal(controlled_suit, COMSIG_PARENT_QDELETING) + controlled_suit = null + +/datum/computer_file/program/maintenance/modsuit_control/ui_data(mob/user) + var/list/data = get_header_data() + data["has_suit"] = !!controlled_suit + if(controlled_suit) + data += controlled_suit.ui_data() + return data + +/datum/computer_file/program/maintenance/modsuit_control/ui_static_data(mob/user) + return controlled_suit.ui_static_data() + +/datum/computer_file/program/maintenance/modsuit_control/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return + + controlled_suit.ui_act(action, params, ui) diff --git a/code/modules/modular_computers/file_system/programs/maintenance/phys_scanner.dm b/code/modules/modular_computers/file_system/programs/maintenance/phys_scanner.dm new file mode 100644 index 00000000000..dd52dce439f --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/maintenance/phys_scanner.dm @@ -0,0 +1,26 @@ +/datum/computer_file/program/maintenance/phys_scanner + filename = "phys_scanner" + filedesc = "Physical Scanner" + category = PROGRAM_CATEGORY_MISC + extended_desc = "This program allows the tablet to scan physical objects and display a data output." + size = 2 + usage_flags = PROGRAM_TABLET + tgui_id = "NtosPhysScanner" + program_icon = "barcode" + /// Information from the last scanned person, to display on the app. + var/last_record = "" + +/datum/computer_file/program/maintenance/phys_scanner/tap(atom/tapped_atom, mob/living/user, params) + . = ..() + + if(!iscarbon(tapped_atom)) + return + var/mob/living/carbon/carbon = tapped_atom + carbon.visible_message(span_notice("[user] analyzes [tapped_atom]'s vitals.")) + last_record = healthscan(user, carbon, 1, tochat = FALSE) + +/datum/computer_file/program/maintenance/phys_scanner/ui_data(mob/user) + var/list/data = get_header_data() + + data["last_record"] = last_record + return data diff --git a/code/modules/modular_computers/file_system/programs/phys_scanner.dm b/code/modules/modular_computers/file_system/programs/phys_scanner.dm deleted file mode 100644 index 8f0efa35c01..00000000000 --- a/code/modules/modular_computers/file_system/programs/phys_scanner.dm +++ /dev/null @@ -1,93 +0,0 @@ -#define TABLET_MEDICAL_MODE (1<<0) -#define TABLET_CHEMISTRY_MODE (1<<1) - -/datum/computer_file/program/phys_scanner - filename = "phys_scanner" - filedesc = "Physical Scanner" - category = PROGRAM_CATEGORY_MISC - extended_desc = "This program allows the tablet to scan physical objects and display a data output." - size = 8 - usage_flags = PROGRAM_TABLET - available_on_ntnet = FALSE - tgui_id = "NtosPhysScanner" - program_icon = "barcode" - - var/current_mode = 0 - var/available_modes = NONE - - var/last_record = "" - -/datum/computer_file/program/phys_scanner/proc/ReadModes() - var/reads = list() - - if(available_modes & TABLET_CHEMISTRY_MODE) - reads += "Reagent" - - if(available_modes & TABLET_MEDICAL_MODE) - reads += "Health" - - return reads - -/datum/computer_file/program/phys_scanner/proc/ReadCurrent() - if(current_mode & TABLET_CHEMISTRY_MODE) - return "Reagent" - if(current_mode & TABLET_MEDICAL_MODE) - return "Health" - -/datum/computer_file/program/phys_scanner/tap(atom/A, mob/living/user, params) - . = ..() - - switch(current_mode) - if(TABLET_CHEMISTRY_MODE) - if(!isnull(A.reagents)) - if(A.reagents.reagent_list.len > 0) - var/reagents_length = A.reagents.reagent_list.len - last_record = "[reagents_length] chemical agent[reagents_length > 1 ? "s" : ""] found." - for (var/re in A.reagents.reagent_list) - last_record += "\t [re]" - else - last_record = "No active chemical agents found in [A]." - else - last_record = "No significant chemical agents found in [A]." - if(TABLET_MEDICAL_MODE) - var/mob/living/carbon/carbon = A - if(istype(carbon)) - carbon.visible_message(span_notice("[user] analyzes [A]'s vitals.")) - last_record = healthscan(user, carbon, 1, tochat = FALSE) - -/datum/computer_file/program/phys_scanner/ui_act(action, list/params, datum/tgui/ui) - . = ..() - if(.) - return - - switch(action) - if("selectMode") - switch(params["newMode"]) - if("Reagent") - current_mode = TABLET_CHEMISTRY_MODE - if("Health") - current_mode = TABLET_MEDICAL_MODE - - return UI_UPDATE - - -/datum/computer_file/program/phys_scanner/ui_data(mob/user) - var/list/data = get_header_data() - - data["set_mode"] = ReadCurrent() - data["last_record"] = last_record - data["available_modes"] = ReadModes() - - return data - -/datum/computer_file/program/phys_scanner/medical - available_modes = TABLET_MEDICAL_MODE - -/datum/computer_file/program/phys_scanner/chemistry - available_modes = TABLET_CHEMISTRY_MODE - -/datum/computer_file/program/phys_scanner/all - available_modes = TABLET_MEDICAL_MODE | TABLET_CHEMISTRY_MODE - -#undef TABLET_MEDICAL_MODE -#undef TABLET_CHEMISTRY_MODE diff --git a/code/modules/photography/camera/camera.dm b/code/modules/photography/camera/camera.dm index 8651b40a82d..3e1c7f87856 100644 --- a/code/modules/photography/camera/camera.dm +++ b/code/modules/photography/camera/camera.dm @@ -40,6 +40,8 @@ var/picture_size_y_max = 4 var/can_customise = TRUE var/default_picture_name + ///Whether the camera should print pictures immediately when a picture is taken. + var/print_picture_on_snap = TRUE /obj/item/camera/Initialize(mapload) . = ..() @@ -216,25 +218,26 @@ after_picture(user, picture) SEND_SIGNAL(src, COMSIG_CAMERA_IMAGE_CAPTURED, target, user) blending = FALSE - + return picture /obj/item/camera/proc/flash_end() set_light_on(FALSE) /obj/item/camera/proc/after_picture(mob/user, datum/picture/picture) - printpicture(user, picture) + if(print_picture_on_snap) + printpicture(user, picture) /obj/item/camera/proc/printpicture(mob/user, datum/picture/picture) //Normal camera proc for creating photos - var/obj/item/photo/p = new(get_turf(src), picture) - if(user && in_range(src, user)) //needed because of TK - if(!ispAI(user)) - user.put_in_hands(p) - pictures_left-- - to_chat(user, span_notice("[pictures_left] photos left.")) - var/customise = "No" - if(can_customise) - customise = tgui_alert(user, "Do you want to customize the photo?", "Customization", list("Yes", "No")) + if(!user) + return + pictures_left-- + var/obj/item/photo/new_photo = new(get_turf(src), picture) + if(in_range(new_photo, user) && user.put_in_hands(new_photo)) //needed because of TK + to_chat(user, span_notice("[pictures_left] photos left.")) + + if(can_customise) + var/customise = tgui_alert(user, "Do you want to customize the photo?", "Customization", list("Yes", "No")) if(customise == "Yes") var/name1 = tgui_input_text(user, "Set a name for this photo, or leave blank.", "Name", max_length = 32) var/desc1 = tgui_input_text(user, "Set a description to add to photo, or leave blank.", "Description", max_length = 128) @@ -245,11 +248,10 @@ picture.picture_desc = "[desc1] - [picture.picture_desc]" if(caption) picture.caption = caption - else - if(default_picture_name) - picture.picture_name = default_picture_name + else if(default_picture_name) + picture.picture_name = default_picture_name - p.set_picture(picture, TRUE, TRUE) + new_photo.set_picture(picture, TRUE, TRUE) if(CONFIG_GET(flag/picture_logging_camera)) picture.log_to_file() diff --git a/icons/obj/modular_console.dmi b/icons/obj/modular_console.dmi index 71fb225b97e..86e3d713957 100644 Binary files a/icons/obj/modular_console.dmi and b/icons/obj/modular_console.dmi differ diff --git a/icons/obj/modular_laptop.dmi b/icons/obj/modular_laptop.dmi index 92536f9ca6c..22432826e92 100644 Binary files a/icons/obj/modular_laptop.dmi and b/icons/obj/modular_laptop.dmi differ diff --git a/icons/obj/modular_pda.dmi b/icons/obj/modular_pda.dmi index cafb0442386..593633ff1fe 100644 Binary files a/icons/obj/modular_pda.dmi and b/icons/obj/modular_pda.dmi differ diff --git a/tgstation.dme b/tgstation.dme index 304fc6b91e3..99ce3730486 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -4125,6 +4125,7 @@ #include "code\modules\modular_computers\computers\item\processor.dm" #include "code\modules\modular_computers\computers\item\role_tablet_presets.dm" #include "code\modules\modular_computers\computers\item\disks\computer_disk.dm" +#include "code\modules\modular_computers\computers\item\disks\maintenance_disks.dm" #include "code\modules\modular_computers\computers\item\disks\role_disks.dm" #include "code\modules\modular_computers\computers\item\disks\virus_disk.dm" #include "code\modules\modular_computers\computers\machinery\console_presets.dm" @@ -4155,7 +4156,6 @@ #include "code\modules\modular_computers\file_system\programs\ntdownloader.dm" #include "code\modules\modular_computers\file_system\programs\ntmessenger.dm" #include "code\modules\modular_computers\file_system\programs\ntnrc_client.dm" -#include "code\modules\modular_computers\file_system\programs\phys_scanner.dm" #include "code\modules\modular_computers\file_system\programs\portrait_printer.dm" #include "code\modules\modular_computers\file_system\programs\powermonitor.dm" #include "code\modules\modular_computers\file_system\programs\radar.dm" @@ -4171,6 +4171,10 @@ #include "code\modules\modular_computers\file_system\programs\wirecarp.dm" #include "code\modules\modular_computers\file_system\programs\antagonist\dos.dm" #include "code\modules\modular_computers\file_system\programs\antagonist\revelation.dm" +#include "code\modules\modular_computers\file_system\programs\maintenance\_maintenance_program.dm" +#include "code\modules\modular_computers\file_system\programs\maintenance\camera.dm" +#include "code\modules\modular_computers\file_system\programs\maintenance\modsuit.dm" +#include "code\modules\modular_computers\file_system\programs\maintenance\phys_scanner.dm" #include "code\modules\modular_computers\NTNet\NTNRC\conversation.dm" #include "code\modules\movespeed\_movespeed_modifier.dm" #include "code\modules\movespeed\modifiers\components.dm" diff --git a/tgui/packages/tgui/interfaces/MODsuit.js b/tgui/packages/tgui/interfaces/MODsuit.js index 7b4d10933e9..58c528b3ece 100644 --- a/tgui/packages/tgui/interfaces/MODsuit.js +++ b/tgui/packages/tgui/interfaces/MODsuit.js @@ -747,6 +747,31 @@ const ModuleSection = (props, context) => { ); }; +export const MODsuitContent = (props, context) => { + const { act, data } = useBackend(context); + const { ui_theme, interface_break } = data; + return ( +
+ {(!!interface_break && ) || ( + + + + + + + + + + + + + + + )} +
+ ); +}; + export const MODsuit = (props, context) => { const { act, data } = useBackend(context); const { ui_theme, interface_break } = data; @@ -758,22 +783,7 @@ export const MODsuit = (props, context) => { title="MOD Interface Panel" resizable> - {(!!interface_break && ) || ( - - - - - - - - - - - - - - - )} + ); diff --git a/tgui/packages/tgui/interfaces/NtosCamera.js b/tgui/packages/tgui/interfaces/NtosCamera.js new file mode 100644 index 00000000000..dbb86a69f69 --- /dev/null +++ b/tgui/packages/tgui/interfaces/NtosCamera.js @@ -0,0 +1,38 @@ +import { useBackend } from '../backend'; +import { NtosWindow } from '../layouts'; +import { Button, Box, NoticeBox, Stack } from '../components'; + +export const NtosCamera = (props, context) => { + return ( + + + + + + ); +}; + +export const NtosCameraContent = (props, context) => { + const { act, data } = useBackend(context); + const { photo, paper_left } = data; + + if (!photo) { + return Phototrasen Images - Tap to snap a photo!; + } + + return ( + + +