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 (
+
+
+
+
+
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/NtosMODsuit.js b/tgui/packages/tgui/interfaces/NtosMODsuit.js
new file mode 100644
index 00000000000..9efc9b7df12
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/NtosMODsuit.js
@@ -0,0 +1,31 @@
+import { NtosWindow } from '../layouts';
+import { useBackend } from '../backend';
+import { NoticeBox } from '../components';
+import { MODsuitContent } from './MODsuit';
+
+export const NtosMODsuit = (props, context) => {
+ const { data } = useBackend(context);
+ const { ui_theme } = data;
+ return (
+
+
+
+
+
+ );
+};
+
+const NtosMODsuitContent = (props, context) => {
+ const { data } = useBackend(context);
+ const { has_suit } = data;
+ if (!has_suit) {
+ return (
+
+ No Modular suit connected, please tap a suit on the application host to
+ sync on
+
+ );
+ } else {
+ return ;
+ }
+};
diff --git a/tgui/packages/tgui/interfaces/NtosPhysScanner.js b/tgui/packages/tgui/interfaces/NtosPhysScanner.js
index a01c4e5736b..e1decda9246 100644
--- a/tgui/packages/tgui/interfaces/NtosPhysScanner.js
+++ b/tgui/packages/tgui/interfaces/NtosPhysScanner.js
@@ -1,6 +1,6 @@
import { useBackend } from '../backend';
import { NtosWindow } from '../layouts';
-import { Section, Box, Dropdown } from '../components';
+import { Section, Box } from '../components';
import { sanitizeText } from '../sanitize';
export const NtosPhysScanner = (props, context) => {
@@ -16,20 +16,6 @@ export const NtosPhysScanner = (props, context) => {
Tap something (right-click) with your tablet to use the physical
scanner.
-
-
- SELECTED MODE
-
-
- act('selectMode', {
- newMode: value,
- })
- }
- />
-