From 0fa23c964dad20afc01c74baea8f5cb7b4fdc680 Mon Sep 17 00:00:00 2001
From: covertcorvid <17987483+covertcorvid@users.noreply.github.com>
Date: Wed, 19 Apr 2023 19:28:23 -0400
Subject: [PATCH 001/549] Enables Byond 515
---
code/__byond_version_compat.dm | 2 ++
code/_compile_options.dm | 6 +++---
dependencies.sh | 4 ++--
3 files changed, 7 insertions(+), 5 deletions(-)
diff --git a/code/__byond_version_compat.dm b/code/__byond_version_compat.dm
index 4b79bdb8e68..9caf336854a 100644
--- a/code/__byond_version_compat.dm
+++ b/code/__byond_version_compat.dm
@@ -20,6 +20,8 @@
/savefile/byond_version = MIN_COMPILER_VERSION
#endif
+#define YES_I_WANT_515
+
// Temporary 515 block until it is completely compatible.
// AnturK says there are issues with savefiles that would make it dangerous to test merge,
// and so this check is in place to stop serious damage.
diff --git a/code/_compile_options.dm b/code/_compile_options.dm
index 885a8ed47d4..b8060da6f98 100644
--- a/code/_compile_options.dm
+++ b/code/_compile_options.dm
@@ -72,10 +72,10 @@
//End NSV
//Update this whenever the byond version is stable so people stop updating to hilariously broken versions
-#define MAX_COMPILER_VERSION 514
-#define MAX_COMPILER_BUILD 1589
+#define MAX_COMPILER_VERSION 515
+#define MAX_COMPILER_BUILD 1604
#if DM_VERSION > MAX_COMPILER_VERSION || DM_BUILD > MAX_COMPILER_BUILD
-#warn WARNING: Your BYOND version is over the recommended version (514.1589)! Stability is not guaranteed.
+#warn WARNING: Your BYOND version is over the recommended version (515.1604)! Stability is not guaranteed.
#endif
//Log the full sendmaps profile on 514.1556+, any earlier and we get bugs or it not existing
#if DM_VERSION >= 514 && DM_BUILD >= 1556
diff --git a/dependencies.sh b/dependencies.sh
index b4f1d0f2771..f2a3771cca7 100755
--- a/dependencies.sh
+++ b/dependencies.sh
@@ -4,8 +4,8 @@
#Final authority on what's required to fully build the project
# byond version
-export BYOND_MAJOR=514
-export BYOND_MINOR=1589
+export BYOND_MAJOR=515
+export BYOND_MINOR=1604
#rust version
export RUST_VERSION=1.54.0
From bc7856ae2784d525b5d31a260464af7ee0017ec6 Mon Sep 17 00:00:00 2001
From: covertcorvid <17987483+covertcorvid@users.noreply.github.com>
Date: Thu, 20 Apr 2023 20:07:53 -0400
Subject: [PATCH 002/549] Some things that stopped it from compiling in
515.1603
---
code/controllers/configuration/config_entry.dm | 2 +-
code/game/objects/items/extinguisher.dm | 4 ++--
nsv13/code/modules/overmap/ai-skynet.dm | 4 ++--
3 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/code/controllers/configuration/config_entry.dm b/code/controllers/configuration/config_entry.dm
index a4a78852480..b8a4782be97 100644
--- a/code/controllers/configuration/config_entry.dm
+++ b/code/controllers/configuration/config_entry.dm
@@ -38,7 +38,7 @@
/datum/config_entry/can_vv_get(var_name)
. = ..()
- if(var_name == NAMEOF_STATIC(src, config_entry_value) || var_name == NAMEOF_STATIC(src, default))
+ if(var_name == NAMEOF(src, config_entry_value) || var_name == NAMEOF(src, default))
. &= !(protection & CONFIG_ENTRY_HIDDEN)
/datum/config_entry/vv_edit_var(var_name, var_value)
diff --git a/code/game/objects/items/extinguisher.dm b/code/game/objects/items/extinguisher.dm
index e0ff8f815ae..dcfbfc98696 100644
--- a/code/game/objects/items/extinguisher.dm
+++ b/code/game/objects/items/extinguisher.dm
@@ -196,9 +196,9 @@
/obj/item/extinguisher/proc/manage_chair_speed(datum/move_loop/move/source)
SIGNAL_HANDLER
switch(source.lifetime)
- if(5 to 4)
+ if(4 to 5)
source.delay = 2
- if(3 to 1)
+ if(1 to 3)
source.delay = 3
/obj/item/extinguisher/AltClick(mob/user)
diff --git a/nsv13/code/modules/overmap/ai-skynet.dm b/nsv13/code/modules/overmap/ai-skynet.dm
index 55c1f2d770e..45662029495 100644
--- a/nsv13/code/modules/overmap/ai-skynet.dm
+++ b/nsv13/code/modules/overmap/ai-skynet.dm
@@ -1978,9 +1978,9 @@ Seek a ship thich we'll station ourselves around
switch(angular_difference)
if(-15 to 15)
boost(NORTH) //ZOOOM
- if(-45 to -180)
+ if(-180 to -45)
boost(WEST)
- if(-180 to -INFINITY)
+ if(-INFINITY to -180)
boost(EAST)
if(45 to 180)
boost(EAST)
From be1affeb5133992aa033ede058b027be73c10380 Mon Sep 17 00:00:00 2001
From: Bobbanz1 <59128051+Bobbanz1@users.noreply.github.com>
Date: Sat, 22 Apr 2023 23:52:09 +0200
Subject: [PATCH 003/549] [Upstream] Modular PDA Attempt Two - Electric
Boogaloo! (#2250)
Co-authored-by: covertcorvid <17987483+covertcorvid@users.noreply.github.com>
---
_maps/RandomRuins/SpaceRuins/bigderelict1.dmm | 2 +-
_maps/RandomZLevels/SnowCabin.dmm | 18 +-
_maps/RandomZLevels/moonoutpost19.dmm | 4 +-
_maps/RandomZLevels/undergroundoutpost45.dmm | 4 +-
_maps/RuinGeneration/13x9_cratestorage.dmm | 2 +-
_maps/map_files/Aetherwhisp/Aetherwhisp1.dmm | 30 +-
_maps/map_files/Aetherwhisp/Aetherwhisp2.dmm | 38 +-
_maps/map_files/Atlas/atlas.dmm | 6 +-
_maps/map_files/Atlas/atlas2.dmm | 2 +-
_maps/map_files/Eclipse/Eclipse1.dmm | 2 +-
_maps/map_files/Galactica/Galactica1.dmm | 8 +-
_maps/map_files/Galactica/Galactica2.dmm | 6 +-
.../Galactica/old/Galactica2_old.dmm | 18 +-
.../map_files/Galactica/old/Galactica_old.dmm | 8 +-
_maps/map_files/Gladius/Gladius1.dmm | 18 +-
_maps/map_files/Gladius/Gladius2.dmm | 20 +-
_maps/map_files/Hammerhead/Hammerhead.dmm | 4 +-
.../Instanced/map_files/Babylon2.dmm | 8 +-
.../Instanced/map_files/SpaceSHIP.dmm | 2 +-
.../map_files/Mining/nsv13/ruins/mining4.dmm | 4 +-
_maps/map_files/Serendipity/Serendipity1.dmm | 2 +-
_maps/map_files/Shrike/Shrike1.dmm | 2 +-
_maps/map_files/Snake/snake_lower.dmm | 2 +-
_maps/map_files/Snake/snake_upper.dmm | 6 +-
_maps/map_files/Tycoon/Tycoon1.dmm | 2 +-
_maps/map_files/Tycoon/Tycoon2.dmm | 272 ++--
_maps/map_files/Vago/vagodeck1.dmm | 6 +-
_maps/map_files/Vago/vagodeck2.dmm | 8 +-
_maps/map_files/generic/CentCom.dmm | 6 +-
.../obj_signals/item_signals/item_signals.dm | 7 +-
code/__DEFINES/devices.dm | 72 +
code/__DEFINES/interaction_flags.dm | 1 +
code/__DEFINES/machines.dm | 18 +
code/__DEFINES/misc.dm | 3 -
code/__HELPERS/cmp.dm | 8 +-
code/__HELPERS/text.dm | 44 +-
code/_globalvars/bitfields.dm | 5 +-
code/_globalvars/lists/objects.dm | 1 +
code/_onclick/hud/_defines.dm | 20 +-
code/_onclick/hud/ai.dm | 51 +-
code/_onclick/hud/pai.dm | 44 +-
code/_onclick/hud/robot.dm | 8 +-
code/_onclick/other_mobs.dm | 3 +-
code/controllers/subsystem/blackbox.dm | 4 +-
code/controllers/subsystem/traumas.dm | 2 +-
code/datums/action.dm | 9 +-
code/datums/components/uplink.dm | 13 +-
code/datums/mind.dm | 4 +-
code/game/gamemodes/sandbox/h_sandbox.dm | 2 +-
code/game/machinery/PDApainter.dm | 22 +-
code/game/machinery/airlock_cycle_control.dm | 2 +-
code/game/machinery/camera/camera.dm | 19 +-
code/game/machinery/computer/cloning.dm | 2 +-
.../game/machinery/computer/communications.dm | 5 +-
code/game/machinery/computer/security.dm | 12 +-
code/game/machinery/doors/firedoor.dm | 2 +-
code/game/machinery/navbeacon.dm | 2 +-
code/game/machinery/newscaster.dm | 9 +-
.../machinery/telecomms/computers/message.dm | 650 ++++-----
.../telecomms/machines/message_server.dm | 66 +-
code/game/mecha/mecha_defense.dm | 8 +-
.../objects/effects/spawners/mailspawner.dm | 4 +-
code/game/objects/items/cards_ids.dm | 12 +-
code/game/objects/items/cigs_lighters.dm | 4 +-
.../circuitboards/machine_circuitboards.dm | 2 +-
code/game/objects/items/colorizers/items.dm | 4 +-
code/game/objects/items/crayons.dm | 1 +
code/game/objects/items/devices/PDA/PDA.dm | 1248 -----------------
.../objects/items/devices/PDA/PDA_types.dm | 273 ----
code/game/objects/items/devices/PDA/cart.dm | 700 ---------
.../objects/items/devices/PDA/virus_cart.dm | 107 --
code/game/objects/items/devices/paicard.dm | 2 +
code/game/objects/items/mop.dm | 5 +
code/game/objects/items/stacks/telecrystal.dm | 4 +-
code/game/objects/items/storage/backpack.dm | 2 +-
code/game/objects/items/storage/boxes.dm | 26 +-
.../game/objects/items/storage/uplink_kits.dm | 10 +-
.../crates_lockers/closets/job_closets.dm | 2 +-
.../closets/secure/engineering.dm | 2 +-
.../crates_lockers/closets/secure/medical.dm | 2 +-
.../closets/secure/scientist.dm | 2 +-
.../crates_lockers/closets/secure/security.dm | 6 +-
.../crates_lockers/closets/syndicate.dm | 2 +-
code/game/objects/structures/displaycase.dm | 2 +-
code/game/objects/structures/janicart.dm | 5 +
code/modules/admin/admin_verbs.dm | 1 +
code/modules/admin/verbs/debug.dm | 10 +-
code/modules/admin/verbs/randomverbs.dm | 12 +
.../traitor/equipment/contractor.dm | 2 +-
code/modules/asset_cache/asset_list_items.dm | 9 +
.../atmospherics/machinery/airalarm.dm | 2 +-
code/modules/awaymissions/corpse.dm | 8 +-
code/modules/cargo/exports/gear.dm | 2 +-
code/modules/cargo/expressconsole.dm | 2 +-
code/modules/cargo/packs.dm | 4 +-
code/modules/clothing/chameleon.dm | 21 +-
code/modules/clothing/outfits/ert.dm | 11 +-
code/modules/clothing/outfits/standard.dm | 9 +-
.../crew_objectives/civilian_objectives.dm | 4 +-
code/modules/emoji/emoji_parse.dm | 1 -
code/modules/jobs/job_types/_job.dm | 12 +-
code/modules/jobs/job_types/assistant.dm | 2 +-
.../jobs/job_types/atmospheric_technician.dm | 3 +-
code/modules/jobs/job_types/bartender.dm | 2 +-
code/modules/jobs/job_types/botanist.dm | 2 +-
code/modules/jobs/job_types/brig_physician.dm | 2 +-
code/modules/jobs/job_types/captain.dm | 4 +-
.../jobs/job_types/cargo_technician.dm | 2 +-
code/modules/jobs/job_types/chaplain.dm | 2 +-
code/modules/jobs/job_types/chemist.dm | 2 +-
code/modules/jobs/job_types/chief_engineer.dm | 5 +-
.../jobs/job_types/chief_medical_officer.dm | 5 +-
code/modules/jobs/job_types/clown.dm | 2 +-
code/modules/jobs/job_types/cook.dm | 2 +-
code/modules/jobs/job_types/curator.dm | 2 +-
code/modules/jobs/job_types/deputy.dm | 2 +-
code/modules/jobs/job_types/detective.dm | 2 +-
.../jobs/job_types/exploration_team.dm | 4 +-
code/modules/jobs/job_types/geneticist.dm | 2 +-
code/modules/jobs/job_types/gimmick.dm | 8 +-
.../jobs/job_types/head_of_personnel.dm | 6 +-
.../jobs/job_types/head_of_security.dm | 8 +-
code/modules/jobs/job_types/janitor.dm | 2 +-
code/modules/jobs/job_types/lawyer.dm | 2 +-
code/modules/jobs/job_types/medical_doctor.dm | 2 +-
code/modules/jobs/job_types/mime.dm | 2 +-
code/modules/jobs/job_types/paramedic.dm | 2 +-
code/modules/jobs/job_types/quartermaster.dm | 2 +-
.../jobs/job_types/research_director.dm | 5 +-
code/modules/jobs/job_types/roboticist.dm | 3 +-
code/modules/jobs/job_types/scientist.dm | 3 +-
.../jobs/job_types/security_officer.dm | 4 +-
code/modules/jobs/job_types/shaft_miner.dm | 2 +-
.../jobs/job_types/station_engineer.dm | 3 +-
code/modules/jobs/job_types/virologist.dm | 2 +-
code/modules/jobs/job_types/warden.dm | 2 +-
code/modules/mining/abandoned_crates.dm | 4 +-
code/modules/mob/living/carbon/human/human.dm | 12 +-
.../mob/living/carbon/human/human_helpers.dm | 13 +-
.../mob/living/carbon/human/species.dm | 2 +-
.../human/species_types/shadowpeople.dm | 13 +-
code/modules/mob/living/living.dm | 7 +-
code/modules/mob/living/silicon/ai/ai.dm | 15 +-
code/modules/mob/living/silicon/pai/pai.dm | 21 +-
.../mob/living/silicon/pai/pai_shell.dm | 4 -
.../mob/living/silicon/pai/signaler.dm} | 1 +
.../mob/living/silicon/pai/software.dm | 39 -
.../modules/mob/living/silicon/robot/robot.dm | 52 +-
code/modules/mob/living/silicon/silicon.dm | 62 +-
.../mob/living/simple_animal/bot/bot.dm | 2 +-
.../mob/living/simple_animal/bot/cleanbot.dm | 7 +-
code/modules/mob/mob.dm | 25 +-
.../computers/item/computer.dm | 364 ++++-
.../computers/item/computer_components.dm | 22 +-
.../computers/item/computer_ui.dm | 163 ++-
.../computers/item/processor.dm | 5 +-
.../computers/item/role_tablet_presets.dm | 286 ++++
.../computers/item/tablet.dm | 316 ++++-
.../computers/item/tablet_presets.dm | 6 +-
.../computers/machinery/modular_computer.dm | 2 -
.../modular_computers/file_system/data.dm | 19 +-
.../modular_computers/file_system/program.dm | 83 +-
.../file_system/programs/airestorer.dm | 2 +-
.../file_system/programs/alarm.dm | 2 +-
.../file_system/programs/antagonist/emag.dm | 22 +
.../programs/antagonist/revelation.dm | 2 +-
.../file_system/programs/atmosscan.dm | 4 +-
.../file_system/programs/borg_monitor.dm | 4 +-
.../file_system/programs/borg_self_monitor.dm | 7 +-
.../file_system/programs/card.dm | 42 +-
.../file_system/programs/cargobounty.dm | 2 +-
.../file_system/programs/configurator.dm | 42 +-
.../file_system/programs/crewmanifest.dm | 2 +-
.../file_system/programs/file_browser.dm | 13 +-
.../file_system/programs/jobmanagement.dm | 2 +-
.../file_system/programs/log_viewer.dm | 96 ++
.../file_system/programs/notepad.dm | 42 +
.../file_system/programs/ntdownloader.dm | 4 +-
.../file_system/programs/ntmessenger.dm | 424 ++++++
.../file_system/programs/ntmonitor.dm | 2 +-
.../file_system/programs/ntnrc_client.dm | 27 +-
.../file_system/programs/phys_scanner.dm | 116 ++
.../file_system/programs/portrait_printer.dm | 2 +-
.../file_system/programs/powermonitor.dm | 4 +-
.../file_system/programs/radar.dm | 56 +-
.../file_system/programs/records.dm | 87 ++
.../file_system/programs/remote_airlock.dm | 52 +
.../file_system/programs/robocontrol.dm | 33 +-
.../file_system/programs/secureye.dm | 2 +-
.../file_system/programs/signaller.dm | 2 +-
.../file_system/programs/sm_monitor.dm | 4 +-
.../file_system/programs/statusdisplay.dm | 69 +
.../modular_computers/hardware/_hardware.dm | 5 +
.../modular_computers/hardware/card_slot.dm | 20 +-
.../modular_computers/hardware/hard_drive.dm | 70 +-
.../modular_computers/hardware/identifier.dm | 13 +
.../modular_computers/hardware/job_disk.dm | 234 ++++
.../hardware/network_card.dm | 10 +-
.../modular_computers/hardware/virus_disk.dm | 105 ++
code/modules/paperwork/contract.dm | 10 +-
code/modules/paperwork/paper.dm | 18 +-
code/modules/photography/camera/camera.dm | 11 +-
.../ruins/spaceruin_code/TheDerelict.dm | 2 +-
.../objective_types/assassination.dm | 2 +-
.../objective_types/vip_extraction.dm | 2 +-
.../ruin_generator/mapping.dm | 6 +-
code/modules/tgui/states/reverse_contained.dm | 18 +
code/modules/tgui/tgui_input_emoji.dm | 147 ++
code/modules/tgui/tgui_input_pda_message.dm | 196 +++
code/modules/tgui/tgui_select_picture.dm | 88 ++
code/modules/uplink/uplink_items.dm | 12 +-
code/modules/vehicles/pimpin_ride.dm | 3 +-
code/modules/vending/assist.dm | 2 +-
code/modules/vending/cartridge.dm | 26 -
code/modules/vending/job_disk.dm | 36 +
code/modules/vending/wardrobes.dm | 2 +-
icons/obj/pda.dmi | Bin 20619 -> 21701 bytes
nsv13.dme | 25 +-
nsv13/code/modules/cargo/objective_cargo.dm | 2 +-
.../modules/coffee/machine/coffeemaker.dm | 2 +-
.../jobs/job_types/fighter_technician.dm | 2 +-
.../jobs/job_types/marine/military_police.dm | 4 +-
.../modules/jobs/job_types/master_at_arms.dm | 2 +-
.../jobs/job_types/munitions_technician.dm | 2 +-
.../modules/overmap/fighters/_fighters.dm | 2 +-
.../overmap/fighters/modules/cargo_hold.dm | 2 +-
nsv13/code/modules/power/reactor/rbmk.dm | 2 +-
nsv13/code/modules/power/stormdrive.dm | 2 +-
nsv13/code/modules/recycling/replicatorDS.dm | 4 +-
.../modules/ship_missions/hail_computer.dm | 2 +-
nsv13/icons/obj/pda.dmi | Bin 11050 -> 24269 bytes
tgui/packages/tgui/components/TextArea.js | 8 +
tgui/packages/tgui/index.js | 21 +
tgui/packages/tgui/interfaces/EmagConsole.js | 17 +
.../tgui/interfaces/EmojiInputModal.js | 143 ++
.../tgui/interfaces/MessageMonitor.js | 325 +++++
.../tgui/interfaces/NtosAirlockControl.js | 38 +
.../tgui/interfaces/NtosConfiguration.js | 19 +-
.../tgui/interfaces/NtosEmagConsole.js | 141 ++
.../packages/tgui/interfaces/NtosLogViewer.js | 90 ++
tgui/packages/tgui/interfaces/NtosMain.js | 120 +-
.../packages/tgui/interfaces/NtosMessenger.js | 293 ++++
tgui/packages/tgui/interfaces/NtosNetChat.js | 3 +-
tgui/packages/tgui/interfaces/NtosNotepad.js | 32 +
.../tgui/interfaces/NtosPhysScanner.js | 40 +
tgui/packages/tgui/interfaces/NtosRadar.js | 87 +-
tgui/packages/tgui/interfaces/NtosRecords.js | 97 ++
.../tgui/interfaces/NtosRoboControl.js | 12 +-
tgui/packages/tgui/interfaces/NtosStatus.js | 88 ++
.../packages/tgui/interfaces/PDAInputModal.js | 55 +
.../tgui/interfaces/PictureSelectModal.js | 44 +
tgui/packages/tgui/layouts/NtosWindow.js | 6 +-
tgui/packages/tgui/layouts/Window.js | 4 +-
.../tgui/styles/components/Section.scss | 6 +
.../tgui/styles/themes-ntos/blue.scss | 7 +
.../tgui/styles/themes-ntos/brown.scss | 7 +
.../tgui/styles/themes-ntos/clown-pink.scss | 11 +
.../tgui/styles/themes-ntos/clown-yellow.scss | 11 +
.../tgui/styles/themes-ntos/dark.scss | 7 +
.../tgui/styles/themes-ntos/default.scss | 5 +
.../tgui/styles/themes-ntos/green.scss | 7 +
.../tgui/styles/themes-ntos/grey.scss | 7 +
.../tgui/styles/themes-ntos/hackerman.scss | 12 +
.../tgui/styles/themes-ntos/light.scss | 12 +
.../tgui/styles/themes-ntos/ntos-colors.scss | 47 +
.../tgui/styles/themes-ntos/olive.scss | 7 +
.../tgui/styles/themes-ntos/orange.scss | 7 +
.../tgui/styles/themes-ntos/pink.scss | 7 +
.../tgui/styles/themes-ntos/purple.scss | 7 +
.../packages/tgui/styles/themes-ntos/red.scss | 7 +
.../tgui/styles/themes-ntos/teal.scss | 7 +
.../tgui/styles/themes-ntos/violet.scss | 7 +
.../tgui/styles/themes-ntos/yellow.scss | 7 +
.../tgui/styles/themes/hackerman.scss | 4 +
.../packages/tgui/styles/themes/hackeros.scss | 62 +
tgui/packages/tgui/styles/themes/retro.scss | 20 +-
.../styles/themes/thinktronic-classic.scss | 198 +++
tools/UpdatePaths/pdas_to_tabs.txt | 65 +
278 files changed, 6420 insertions(+), 3881 deletions(-)
create mode 100644 code/__DEFINES/devices.dm
delete mode 100644 code/game/objects/items/devices/PDA/PDA.dm
delete mode 100644 code/game/objects/items/devices/PDA/PDA_types.dm
delete mode 100644 code/game/objects/items/devices/PDA/cart.dm
delete mode 100644 code/game/objects/items/devices/PDA/virus_cart.dm
rename code/{game/objects/items/devices/PDA/radio.dm => modules/mob/living/silicon/pai/signaler.dm} (96%)
create mode 100644 code/modules/modular_computers/computers/item/role_tablet_presets.dm
create mode 100644 code/modules/modular_computers/file_system/programs/antagonist/emag.dm
create mode 100644 code/modules/modular_computers/file_system/programs/log_viewer.dm
create mode 100644 code/modules/modular_computers/file_system/programs/notepad.dm
create mode 100644 code/modules/modular_computers/file_system/programs/ntmessenger.dm
create mode 100644 code/modules/modular_computers/file_system/programs/phys_scanner.dm
create mode 100644 code/modules/modular_computers/file_system/programs/records.dm
create mode 100644 code/modules/modular_computers/file_system/programs/remote_airlock.dm
create mode 100644 code/modules/modular_computers/file_system/programs/statusdisplay.dm
create mode 100644 code/modules/modular_computers/hardware/identifier.dm
create mode 100644 code/modules/modular_computers/hardware/job_disk.dm
create mode 100644 code/modules/modular_computers/hardware/virus_disk.dm
create mode 100644 code/modules/tgui/states/reverse_contained.dm
create mode 100644 code/modules/tgui/tgui_input_emoji.dm
create mode 100644 code/modules/tgui/tgui_input_pda_message.dm
create mode 100644 code/modules/tgui/tgui_select_picture.dm
delete mode 100644 code/modules/vending/cartridge.dm
create mode 100644 code/modules/vending/job_disk.dm
create mode 100644 tgui/packages/tgui/interfaces/EmagConsole.js
create mode 100644 tgui/packages/tgui/interfaces/EmojiInputModal.js
create mode 100644 tgui/packages/tgui/interfaces/MessageMonitor.js
create mode 100644 tgui/packages/tgui/interfaces/NtosAirlockControl.js
create mode 100644 tgui/packages/tgui/interfaces/NtosEmagConsole.js
create mode 100644 tgui/packages/tgui/interfaces/NtosLogViewer.js
create mode 100644 tgui/packages/tgui/interfaces/NtosMessenger.js
create mode 100644 tgui/packages/tgui/interfaces/NtosNotepad.js
create mode 100644 tgui/packages/tgui/interfaces/NtosPhysScanner.js
create mode 100644 tgui/packages/tgui/interfaces/NtosRecords.js
create mode 100644 tgui/packages/tgui/interfaces/NtosStatus.js
create mode 100644 tgui/packages/tgui/interfaces/PDAInputModal.js
create mode 100644 tgui/packages/tgui/interfaces/PictureSelectModal.js
create mode 100644 tgui/packages/tgui/styles/themes-ntos/blue.scss
create mode 100644 tgui/packages/tgui/styles/themes-ntos/brown.scss
create mode 100644 tgui/packages/tgui/styles/themes-ntos/clown-pink.scss
create mode 100644 tgui/packages/tgui/styles/themes-ntos/clown-yellow.scss
create mode 100644 tgui/packages/tgui/styles/themes-ntos/dark.scss
create mode 100644 tgui/packages/tgui/styles/themes-ntos/default.scss
create mode 100644 tgui/packages/tgui/styles/themes-ntos/green.scss
create mode 100644 tgui/packages/tgui/styles/themes-ntos/grey.scss
create mode 100644 tgui/packages/tgui/styles/themes-ntos/hackerman.scss
create mode 100644 tgui/packages/tgui/styles/themes-ntos/light.scss
create mode 100644 tgui/packages/tgui/styles/themes-ntos/ntos-colors.scss
create mode 100644 tgui/packages/tgui/styles/themes-ntos/olive.scss
create mode 100644 tgui/packages/tgui/styles/themes-ntos/orange.scss
create mode 100644 tgui/packages/tgui/styles/themes-ntos/pink.scss
create mode 100644 tgui/packages/tgui/styles/themes-ntos/purple.scss
create mode 100644 tgui/packages/tgui/styles/themes-ntos/red.scss
create mode 100644 tgui/packages/tgui/styles/themes-ntos/teal.scss
create mode 100644 tgui/packages/tgui/styles/themes-ntos/violet.scss
create mode 100644 tgui/packages/tgui/styles/themes-ntos/yellow.scss
create mode 100644 tgui/packages/tgui/styles/themes/hackeros.scss
create mode 100644 tgui/packages/tgui/styles/themes/thinktronic-classic.scss
create mode 100644 tools/UpdatePaths/pdas_to_tabs.txt
diff --git a/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm b/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm
index 920252a99cb..c649b0fa1ca 100644
--- a/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm
+++ b/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm
@@ -2146,7 +2146,7 @@
/area/ruin/space/has_grav/derelictoutpost/cargostorage)
"eC" = (
/obj/structure/closet/crate,
-/obj/item/pda/clear,
+/obj/item/modular_computer/tablet/pda/clear,
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
/area/ruin/space/has_grav/derelictoutpost/cargostorage)
diff --git a/_maps/RandomZLevels/SnowCabin.dmm b/_maps/RandomZLevels/SnowCabin.dmm
index 2e828062320..e61092ce025 100644
--- a/_maps/RandomZLevels/SnowCabin.dmm
+++ b/_maps/RandomZLevels/SnowCabin.dmm
@@ -1128,12 +1128,11 @@
/area/awaymission/cabin/snowforest/sovietsurface)
"dm" = (
/obj/structure/table/reinforced,
-/obj/item/pda/syndicate{
- background_color = "#0039A6";
- default_cartridge = /obj/item/cartridge/virus/mime;
+/obj/item/modular_computer/tablet/pda/syndicate{
+ default_disk = /obj/item/computer_hardware/hard_drive/role/virus/mime;
desc = "A portable microcomputer by Thinktronic Systems, LTD. Seems like it may have useful information on it.";
- name = "soviet PDA";
- note = "TRANSLATED TO GALACTIC COMMON:
My partner has left to help those Nanotrasen fucks three days ago. They said that a distress signal came from down south and they had to check it out. How fucking long does it take to investigate a mining outpost? Either those Nanotrasen fuckers betrayed us or something really did go wrong. Either way, I'm leaving before this becomes an issue for me and anyone else here. That dumb idiot."
+ name = "soviet tablet";
+ note = "TRANSLATED TO GALACTIC COMMON: My partner has left to help those Nanotrasen fucks three days ago. They said that a distress signal came from down south and they had to check it out. How fucking long does it take to investigate a mining outpost? Either those Nanotrasen fuckers betrayed us or something really did go wrong. Either way, I'm leaving before this becomes an issue for me and anyone else here. That dumb idiot."
},
/turf/open/floor/plating/snowed/temperatre,
/area/awaymission/cabin/snowforest/sovietsurface)
@@ -5220,12 +5219,11 @@
/area/awaymission/cabin/caves)
"nb" = (
/obj/effect/turf_decal/weather/snow,
-/obj/item/pda/syndicate{
- background_color = "#0039A6";
- default_cartridge = /obj/item/cartridge/virus/clown;
+/obj/item/modular_computer/tablet/pda/syndicate{
+ default_disk = /obj/item/computer_hardware/hard_drive/role/virus/clown;
desc = "A portable microcomputer by Thinktronic Systems, LTD. Seems like it may have useful information on it.";
- name = "soviet PDA";
- note = "TRANSLATED TO GALACTIC COMMON:
DO NOT GO SOUTH."
+ name = "soviet tablet";
+ note = "TRANSLATED TO GALACTIC COMMON: DO NOT GO SOUTH."
},
/obj/effect/decal/remains/human{
color = "#72e4fa"
diff --git a/_maps/RandomZLevels/moonoutpost19.dmm b/_maps/RandomZLevels/moonoutpost19.dmm
index b0ad0d9c033..5eb28e2c9cd 100644
--- a/_maps/RandomZLevels/moonoutpost19.dmm
+++ b/_maps/RandomZLevels/moonoutpost19.dmm
@@ -3760,8 +3760,8 @@
/area/awaymission/moonoutpost19/research)
"hr" = (
/obj/structure/table,
-/obj/item/cartridge/signal/toxins,
-/obj/item/cartridge/signal/toxins{
+/obj/item/computer_hardware/hard_drive/role/signal/toxins,
+/obj/item/computer_hardware/hard_drive/role/signal/toxins{
pixel_x = -4;
pixel_y = 2
},
diff --git a/_maps/RandomZLevels/undergroundoutpost45.dmm b/_maps/RandomZLevels/undergroundoutpost45.dmm
index 5946555c8a7..cbd71caaad7 100644
--- a/_maps/RandomZLevels/undergroundoutpost45.dmm
+++ b/_maps/RandomZLevels/undergroundoutpost45.dmm
@@ -7002,8 +7002,8 @@
/area/awaymission/undergroundoutpost45/research)
"nk" = (
/obj/structure/table,
-/obj/item/cartridge/signal/toxins,
-/obj/item/cartridge/signal/toxins{
+/obj/item/computer_hardware/hard_drive/role/signal/toxins,
+/obj/item/computer_hardware/hard_drive/role/signal/toxins{
pixel_x = -4;
pixel_y = 2
},
diff --git a/_maps/RuinGeneration/13x9_cratestorage.dmm b/_maps/RuinGeneration/13x9_cratestorage.dmm
index 4ed21920631..2ad4746e664 100644
--- a/_maps/RuinGeneration/13x9_cratestorage.dmm
+++ b/_maps/RuinGeneration/13x9_cratestorage.dmm
@@ -35,7 +35,7 @@
"o" = (
/obj/effect/turf_decal/delivery,
/obj/structure/closet/crate,
-/obj/item/pda/clear,
+/obj/item/modular_computer/tablet/pda/clear,
/obj/effect/spawner/lootdrop/ruinloot/important,
/turf/open/floor/plasteel,
/area/ruin/unpowered)
diff --git a/_maps/map_files/Aetherwhisp/Aetherwhisp1.dmm b/_maps/map_files/Aetherwhisp/Aetherwhisp1.dmm
index b10d61a86dd..349f69990f7 100644
--- a/_maps/map_files/Aetherwhisp/Aetherwhisp1.dmm
+++ b/_maps/map_files/Aetherwhisp/Aetherwhisp1.dmm
@@ -6744,7 +6744,7 @@
dir = 8
},
/obj/item/clothing/head/beret/black,
-/obj/item/cartridge/security,
+/obj/item/computer_hardware/hard_drive/role/security,
/obj/effect/spawner/lootdrop/gloves,
/turf/open/floor/carpet/ship/red_carpet,
/area/security/main/warroom)
@@ -11280,7 +11280,7 @@
pixel_y = -1
},
/obj/item/stamp/law,
-/obj/item/cartridge/lawyer{
+/obj/item/computer_hardware/hard_drive/role/lawyer{
pixel_x = 8;
pixel_y = 1
},
@@ -12427,7 +12427,7 @@
pixel_x = -4
},
/obj/item/stack/package_wrap,
-/obj/item/cartridge/security,
+/obj/item/computer_hardware/hard_drive/role/security,
/obj/item/dest_tagger{
pixel_x = 4;
pixel_y = 3
@@ -13920,7 +13920,7 @@
},
/obj/item/reagent_containers/glass/beaker,
/obj/machinery/airalarm/directional/north,
-/obj/item/cartridge/chemistry,
+/obj/item/computer_hardware/hard_drive/role/chemistry,
/turf/open/floor/carpet/ship/blue,
/area/medical/chemistry)
"jcC" = (
@@ -14163,7 +14163,7 @@
dir = 8
},
/obj/item/clothing/head/beret/black,
-/obj/item/cartridge/security,
+/obj/item/computer_hardware/hard_drive/role/security,
/obj/effect/spawner/lootdrop/gloves,
/obj/structure/disposalpipe/segment{
dir = 4
@@ -19834,14 +19834,14 @@
pixel_x = -5;
pixel_y = 4
},
-/obj/item/cartridge/medical,
+/obj/item/computer_hardware/hard_drive/role/medical,
/turf/open/floor/carpet/ship/blue,
/area/medical/storage)
"mZO" = (
/obj/structure/table,
-/obj/item/cartridge/engineering,
+/obj/item/computer_hardware/hard_drive/role/engineering,
/obj/item/airlock_painter,
-/obj/item/cartridge/atmos,
+/obj/item/computer_hardware/hard_drive/role/atmos,
/obj/item/holosign_creator/engineering,
/obj/structure/cable/white{
icon_state = "1-2"
@@ -26048,7 +26048,7 @@
pixel_y = 5
},
/obj/item/clothing/glasses/sunglasses/advanced,
-/obj/item/cartridge/detective,
+/obj/item/computer_hardware/hard_drive/role/detective,
/obj/structure/disposalpipe/segment{
dir = 4
},
@@ -31635,17 +31635,17 @@
/area/maintenance/department/engine)
"uPC" = (
/obj/structure/table/glass,
-/obj/item/cartridge/chemistry{
+/obj/item/computer_hardware/hard_drive/role/chemistry{
pixel_x = -4;
pixel_y = 4
},
/obj/item/storage/firstaid/regular,
-/obj/item/cartridge/chemistry{
+/obj/item/computer_hardware/hard_drive/role/chemistry{
pixel_x = -4;
pixel_y = 4
},
-/obj/item/cartridge/medical,
-/obj/item/cartridge/medical,
+/obj/item/computer_hardware/hard_drive/role/medical,
+/obj/item/computer_hardware/hard_drive/role/medical,
/obj/item/screwdriver,
/obj/machinery/airalarm/directional/west,
/obj/item/computer_hardware/card_slot,
@@ -34657,7 +34657,7 @@
dir = 4
},
/obj/item/clothing/head/beret/black,
-/obj/item/cartridge/security,
+/obj/item/computer_hardware/hard_drive/role/security,
/obj/effect/spawner/lootdrop/gloves,
/turf/open/floor/carpet/ship/red_carpet,
/area/security/main/warroom)
@@ -34939,7 +34939,7 @@
},
/obj/structure/table,
/obj/item/stack/sheet/mineral/copper,
-/obj/item/cartridge/medical,
+/obj/item/computer_hardware/hard_drive/role/medical,
/turf/open/floor/carpet/ship/blue,
/area/medical/storage)
"xpy" = (
diff --git a/_maps/map_files/Aetherwhisp/Aetherwhisp2.dmm b/_maps/map_files/Aetherwhisp/Aetherwhisp2.dmm
index 9e8a6e6d428..3c012b694e0 100644
--- a/_maps/map_files/Aetherwhisp/Aetherwhisp2.dmm
+++ b/_maps/map_files/Aetherwhisp/Aetherwhisp2.dmm
@@ -1675,7 +1675,7 @@
/obj/item/stack/cable_coil,
/obj/item/stock_parts/cell/empty,
/obj/item/stock_parts/cell/potato,
-/obj/item/cartridge/signal,
+/obj/item/computer_hardware/hard_drive/role/signal,
/turf/open/floor/holofloor/wood,
/area/science/computer_lab)
"bfR" = (
@@ -2994,7 +2994,7 @@
/turf/open/floor/engine,
/area/nsv/hanger/storage)
"bXL" = (
-/obj/machinery/vending/cart,
+/obj/machinery/vending/job_disk,
/obj/item/storage/secure/safe{
pixel_x = 32
},
@@ -4140,7 +4140,7 @@
/obj/item/camera_film,
/obj/item/camera,
/obj/item/taperecorder,
-/obj/item/cartridge/curator,
+/obj/item/computer_hardware/hard_drive/role/curator,
/turf/open/floor/carpet,
/area/library)
"cKo" = (
@@ -5044,18 +5044,18 @@
/area/engine/engineering/reactor_control)
"dzp" = (
/obj/structure/table/wood,
-/obj/item/pda/curator{
+/obj/item/modular_computer/tablet/pda/curator{
pixel_x = 3;
pixel_y = 3
},
/obj/item/gun/ballistic/revolver/russian{
pixel_x = -12
},
-/obj/item/pda/curator{
+/obj/item/modular_computer/tablet/pda/curator{
pixel_x = 13;
pixel_y = 5
},
-/obj/item/pda/curator{
+/obj/item/modular_computer/tablet/pda/curator{
pixel_x = 9;
pixel_y = -6
},
@@ -5984,7 +5984,7 @@
pixel_x = -4
},
/obj/machinery/airalarm/directional/east,
-/obj/item/cartridge/janitor,
+/obj/item/computer_hardware/hard_drive/role/janitor,
/obj/item/pushbroom,
/turf/open/floor/carpet/ship,
/area/janitor)
@@ -6335,7 +6335,7 @@
pixel_x = -6;
pixel_y = 4
},
-/obj/item/cartridge/roboticist,
+/obj/item/computer_hardware/hard_drive/role/roboticist,
/obj/structure/window/reinforced{
dir = 1
},
@@ -21079,13 +21079,13 @@
/area/nsv/weapons/starboard)
"oBd" = (
/obj/structure/table,
-/obj/item/cartridge/atmos,
+/obj/item/computer_hardware/hard_drive/role/atmos,
/obj/item/multitool{
pixel_x = -4;
pixel_y = 2
},
/obj/item/clothing/gloves/color/black,
-/obj/item/cartridge/engineering,
+/obj/item/computer_hardware/hard_drive/role/engineering,
/obj/item/holosign_creator/atmos,
/obj/machinery/computer/security/telescreen/ce{
dir = null;
@@ -23660,7 +23660,7 @@
/obj/item/camera,
/obj/item/hand_labeler_refill,
/obj/item/computer_hardware/card_slot,
-/obj/item/cartridge/quartermaster,
+/obj/item/computer_hardware/hard_drive/role/quartermaster,
/obj/structure/table,
/obj/machinery/camera/autoname,
/turf/open/floor/carpet/orange,
@@ -25122,16 +25122,16 @@
"rhn" = (
/obj/structure/table,
/obj/item/storage/toolbox/mechanical,
-/obj/item/cartridge/signal/toxins{
+/obj/item/computer_hardware/hard_drive/role/signal/toxins{
pixel_x = -4;
pixel_y = 2
},
-/obj/item/cartridge/signal/toxins,
-/obj/item/cartridge/signal/toxins{
+/obj/item/computer_hardware/hard_drive/role/signal/toxins,
+/obj/item/computer_hardware/hard_drive/role/signal/toxins{
pixel_x = 4;
pixel_y = 6
},
-/obj/item/cartridge/signal,
+/obj/item/computer_hardware/hard_drive/role/signal,
/turf/open/floor/carpet/ship/purple_carpet,
/area/science/mixing)
"rhw" = (
@@ -27728,7 +27728,7 @@
pixel_x = -32;
pixel_y = -32
},
-/obj/item/cartridge/captain,
+/obj/item/computer_hardware/hard_drive/role/captain,
/obj/item/computer_hardware/card_slot,
/turf/open/floor/carpet,
/area/crew_quarters/heads/captain/private)
@@ -30921,7 +30921,7 @@
/obj/item/tank/internals/plasmaman/belt/full{
pixel_x = 7
},
-/obj/item/pda/curator{
+/obj/item/modular_computer/tablet/pda/curator{
pixel_x = -10
},
/obj/machinery/airalarm/directional/north,
@@ -33179,8 +33179,8 @@
/obj/item/pen,
/obj/item/storage/toolbox/mechanical,
/obj/item/folder/yellow,
-/obj/item/cartridge/engineering,
-/obj/item/cartridge/engineering{
+/obj/item/computer_hardware/hard_drive/role/engineering,
+/obj/item/computer_hardware/hard_drive/role/engineering{
pixel_x = 3
},
/obj/item/reagent_containers/pill/patch/silver_sulf,
diff --git a/_maps/map_files/Atlas/atlas.dmm b/_maps/map_files/Atlas/atlas.dmm
index 03b83e70323..2ee01a32076 100644
--- a/_maps/map_files/Atlas/atlas.dmm
+++ b/_maps/map_files/Atlas/atlas.dmm
@@ -9175,15 +9175,15 @@
/area/maintenance/nsv/deck2/port/fore)
"EG" = (
/obj/structure/table/reinforced,
-/obj/item/cartridge/quartermaster{
+/obj/item/computer_hardware/hard_drive/role/quartermaster{
pixel_x = 6;
pixel_y = 5
},
-/obj/item/cartridge/quartermaster{
+/obj/item/computer_hardware/hard_drive/role/quartermaster{
pixel_x = -4;
pixel_y = 7
},
-/obj/item/cartridge/quartermaster,
+/obj/item/computer_hardware/hard_drive/role/quartermaster,
/obj/item/paper_bin,
/obj/item/stamp/quartermaster,
/obj/item/clothing/mask/cigarette/cigar,
diff --git a/_maps/map_files/Atlas/atlas2.dmm b/_maps/map_files/Atlas/atlas2.dmm
index cd2a1c0086e..41a2508df4d 100644
--- a/_maps/map_files/Atlas/atlas2.dmm
+++ b/_maps/map_files/Atlas/atlas2.dmm
@@ -4927,7 +4927,7 @@
name = "Executive requests console";
pixel_y = -32
},
-/obj/machinery/vending/cart{
+/obj/machinery/vending/job_disk{
density = 0;
pixel_x = 23
},
diff --git a/_maps/map_files/Eclipse/Eclipse1.dmm b/_maps/map_files/Eclipse/Eclipse1.dmm
index d1fab581abc..1801800b82d 100644
--- a/_maps/map_files/Eclipse/Eclipse1.dmm
+++ b/_maps/map_files/Eclipse/Eclipse1.dmm
@@ -10606,7 +10606,7 @@
/turf/open/floor/monotile/dark,
/area/hallway/primary/fore)
"RW" = (
-/obj/machinery/vending/cart,
+/obj/machinery/vending/job_disk,
/turf/open/floor/plasteel/dark/side{
dir = 4
},
diff --git a/_maps/map_files/Galactica/Galactica1.dmm b/_maps/map_files/Galactica/Galactica1.dmm
index d642660b97d..df3a2240b10 100644
--- a/_maps/map_files/Galactica/Galactica1.dmm
+++ b/_maps/map_files/Galactica/Galactica1.dmm
@@ -1032,7 +1032,7 @@
"cT" = (
/obj/structure/table/glass,
/obj/item/paper_bin,
-/obj/item/cartridge/chemistry{
+/obj/item/computer_hardware/hard_drive/role/chemistry{
pixel_y = 2
},
/obj/item/clothing/glasses/hud/health,
@@ -18101,9 +18101,9 @@
pixel_y = -8
},
/obj/structure/closet/secure_closet/quartermaster,
-/obj/item/cartridge/quartermaster,
-/obj/item/cartridge/quartermaster,
-/obj/item/cartridge/quartermaster,
+/obj/item/computer_hardware/hard_drive/role/quartermaster,
+/obj/item/computer_hardware/hard_drive/role/quartermaster,
+/obj/item/computer_hardware/hard_drive/role/quartermaster,
/obj/structure/disposalpipe/segment,
/obj/item/clothing/head/beret/supply,
/turf/open/floor/carpet/ship,
diff --git a/_maps/map_files/Galactica/Galactica2.dmm b/_maps/map_files/Galactica/Galactica2.dmm
index baa625599b4..3ec1f6ebf09 100644
--- a/_maps/map_files/Galactica/Galactica2.dmm
+++ b/_maps/map_files/Galactica/Galactica2.dmm
@@ -28479,7 +28479,7 @@
/obj/item/paper/monitorkey,
/obj/item/clothing/glasses/meson,
/obj/item/stamp/chief_engineer,
-/obj/item/cartridge/engineering{
+/obj/item/computer_hardware/hard_drive/role/engineering{
pixel_x = 3
},
/obj/item/reagent_containers/pill/patch/silver_sulf,
@@ -33437,7 +33437,7 @@
/turf/open/floor/monotile/steel,
/area/ai_monitored/security/armory/lockup)
"rIP" = (
-/obj/machinery/vending/cart,
+/obj/machinery/vending/job_disk,
/obj/machinery/light{
dir = 8
},
@@ -37236,7 +37236,7 @@
"tIA" = (
/obj/structure/table/reinforced,
/obj/item/rcl/pre_loaded,
-/obj/item/cartridge/engineering{
+/obj/item/computer_hardware/hard_drive/role/engineering{
pixel_x = 4;
pixel_y = 5
},
diff --git a/_maps/map_files/Galactica/old/Galactica2_old.dmm b/_maps/map_files/Galactica/old/Galactica2_old.dmm
index cbc5a790c9f..3653958d04d 100644
--- a/_maps/map_files/Galactica/old/Galactica2_old.dmm
+++ b/_maps/map_files/Galactica/old/Galactica2_old.dmm
@@ -14761,7 +14761,7 @@
name = "Executive officer's Office"
})
"aHJ" = (
-/obj/machinery/vending/cart,
+/obj/machinery/vending/job_disk,
/turf/open/floor/monotile,
/area/crew_quarters/heads/hop{
name = "Executive officer's Office"
@@ -14807,7 +14807,7 @@
/obj/structure/sign/nanotrasen{
pixel_y = 26
},
-/obj/item/cartridge/lawyer,
+/obj/item/computer_hardware/hard_drive/role/lawyer,
/obj/item/taperecorder,
/turf/open/floor/monotile,
/area/lawoffice)
@@ -19068,18 +19068,18 @@
/area/crew_quarters/heads/chief)
"aRr" = (
/obj/structure/table/reinforced,
-/obj/item/cartridge/engineering{
+/obj/item/computer_hardware/hard_drive/role/engineering{
pixel_x = 4;
pixel_y = 5
},
-/obj/item/cartridge/engineering{
+/obj/item/computer_hardware/hard_drive/role/engineering{
pixel_x = -3;
pixel_y = 2
},
-/obj/item/cartridge/engineering{
+/obj/item/computer_hardware/hard_drive/role/engineering{
pixel_x = 3
},
-/obj/item/cartridge/atmos,
+/obj/item/computer_hardware/hard_drive/role/atmos,
/obj/machinery/camera/autoname{
dir = 1;
icon_state = "camera"
@@ -54495,12 +54495,12 @@
/turf/open/floor/monotile,
/area/security/checkpoint/engineering)
"sVz" = (
-/obj/item/cartridge/quartermaster{
+/obj/item/computer_hardware/hard_drive/role/quartermaster{
pixel_x = -4;
pixel_y = 7
},
-/obj/item/cartridge/quartermaster,
-/obj/item/cartridge/quartermaster{
+/obj/item/computer_hardware/hard_drive/role/quartermaster,
+/obj/item/computer_hardware/hard_drive/role/quartermaster{
pixel_x = 6;
pixel_y = 5
},
diff --git a/_maps/map_files/Galactica/old/Galactica_old.dmm b/_maps/map_files/Galactica/old/Galactica_old.dmm
index 5d0c034cf69..448590381cf 100644
--- a/_maps/map_files/Galactica/old/Galactica_old.dmm
+++ b/_maps/map_files/Galactica/old/Galactica_old.dmm
@@ -6917,10 +6917,10 @@
/area/crew_quarters/heads/cmo)
"rx" = (
/obj/structure/table/glass,
-/obj/item/cartridge/medical,
-/obj/item/cartridge/medical,
-/obj/item/cartridge/medical,
-/obj/item/cartridge/chemistry{
+/obj/item/computer_hardware/hard_drive/role/medical,
+/obj/item/computer_hardware/hard_drive/role/medical,
+/obj/item/computer_hardware/hard_drive/role/medical,
+/obj/item/computer_hardware/hard_drive/role/chemistry{
pixel_y = 2
},
/obj/item/clothing/glasses/hud/health,
diff --git a/_maps/map_files/Gladius/Gladius1.dmm b/_maps/map_files/Gladius/Gladius1.dmm
index f0051faf01f..ea9fed5fb21 100644
--- a/_maps/map_files/Gladius/Gladius1.dmm
+++ b/_maps/map_files/Gladius/Gladius1.dmm
@@ -22438,7 +22438,7 @@
pixel_x = -2
},
/obj/item/book/manual/wiki/security_space_law,
-/obj/item/cartridge/detective,
+/obj/item/computer_hardware/hard_drive/role/detective,
/obj/machinery/light_switch/north,
/turf/open/floor/monotile/steel,
/area/crew_quarters/heads/hos)
@@ -23358,16 +23358,16 @@
/turf/open/floor/monotile/steel,
/area/crew_quarters/dorms/nsv/state_room)
"kXg" = (
-/obj/item/cartridge/medical{
+/obj/item/computer_hardware/hard_drive/role/medical{
pixel_x = -2;
pixel_y = 6
},
-/obj/item/cartridge/medical{
+/obj/item/computer_hardware/hard_drive/role/medical{
pixel_x = 6;
pixel_y = 3
},
-/obj/item/cartridge/medical,
-/obj/item/cartridge/chemistry{
+/obj/item/computer_hardware/hard_drive/role/medical,
+/obj/item/computer_hardware/hard_drive/role/chemistry{
pixel_y = 2
},
/obj/structure/table/glass,
@@ -30180,12 +30180,12 @@
/area/crew_quarters/heads/hor)
"oga" = (
/obj/structure/table,
-/obj/item/cartridge/signal/toxins,
-/obj/item/cartridge/signal/toxins{
+/obj/item/computer_hardware/hard_drive/role/signal/toxins,
+/obj/item/computer_hardware/hard_drive/role/signal/toxins{
pixel_x = -4;
pixel_y = 2
},
-/obj/item/cartridge/signal/toxins{
+/obj/item/computer_hardware/hard_drive/role/signal/toxins{
pixel_x = 4;
pixel_y = 6
},
@@ -42075,7 +42075,7 @@
/turf/open/floor/monotile/steel,
/area/nsv/briefingroom)
"tPt" = (
-/obj/machinery/vending/cart{
+/obj/machinery/vending/job_disk{
req_access_txt = "57"
},
/turf/open/floor/wood,
diff --git a/_maps/map_files/Gladius/Gladius2.dmm b/_maps/map_files/Gladius/Gladius2.dmm
index 4d319adca87..7ee7e11b309 100644
--- a/_maps/map_files/Gladius/Gladius2.dmm
+++ b/_maps/map_files/Gladius/Gladius2.dmm
@@ -19201,18 +19201,18 @@
/turf/open/floor/monotile/dark,
/area/quartermaster/sorting)
"lqn" = (
-/obj/item/cartridge/engineering{
+/obj/item/computer_hardware/hard_drive/role/engineering{
pixel_x = 4;
pixel_y = 5
},
-/obj/item/cartridge/engineering{
+/obj/item/computer_hardware/hard_drive/role/engineering{
pixel_x = -3;
pixel_y = 2
},
-/obj/item/cartridge/engineering{
+/obj/item/computer_hardware/hard_drive/role/engineering{
pixel_x = 3
},
-/obj/item/cartridge/atmos,
+/obj/item/computer_hardware/hard_drive/role/atmos,
/obj/structure/disposalpipe/segment,
/obj/structure/rack,
/obj/effect/turf_decal/ship/techfloor{
@@ -20218,7 +20218,7 @@
pixel_x = 4;
pixel_y = -2
},
-/obj/item/cartridge/janitor,
+/obj/item/computer_hardware/hard_drive/role/janitor,
/obj/machinery/light{
dir = 4
},
@@ -23048,7 +23048,7 @@
/turf/open/floor/carpet/green,
/area/engine/engineering/reactor_core)
"nsL" = (
-/obj/item/cartridge/lawyer,
+/obj/item/computer_hardware/hard_drive/role/lawyer,
/obj/item/clothing/accessory/lawyers_badge,
/obj/item/clothing/accessory/lawyers_badge,
/obj/item/clothing/suit/toggle/lawyer,
@@ -25000,7 +25000,7 @@
pixel_y = 7
},
/obj/item/pen,
-/obj/item/cartridge/lawyer{
+/obj/item/computer_hardware/hard_drive/role{
pixel_x = 8
},
/turf/open/floor/carpet/blue,
@@ -30473,15 +30473,15 @@
/area/quartermaster/qm)
"rvu" = (
/obj/structure/table,
-/obj/item/cartridge/quartermaster{
+/obj/item/computer_hardware/hard_drive/role/quartermaster{
pixel_x = -4;
pixel_y = 7
},
-/obj/item/cartridge/quartermaster{
+/obj/item/computer_hardware/hard_drive/role/quartermaster{
pixel_x = 6;
pixel_y = 5
},
-/obj/item/cartridge/quartermaster,
+/obj/item/computer_hardware/hard_drive/role/quartermaster,
/obj/item/gps{
gpstag = "QM0"
},
diff --git a/_maps/map_files/Hammerhead/Hammerhead.dmm b/_maps/map_files/Hammerhead/Hammerhead.dmm
index b2491444a2d..b77c08476da 100644
--- a/_maps/map_files/Hammerhead/Hammerhead.dmm
+++ b/_maps/map_files/Hammerhead/Hammerhead.dmm
@@ -20097,7 +20097,7 @@
/turf/open/floor/plasteel/dark,
/area/crew_quarters/heads/chief)
"byf" = (
-/obj/machinery/vending/cart,
+/obj/machinery/vending/job_disk,
/turf/open/floor/wood,
/area/crew_quarters/heads/hop)
"byj" = (
@@ -50633,7 +50633,7 @@
/turf/open/floor/plating,
/area/maintenance/department/electrical)
"uFa" = (
-/obj/item/pda/clear,
+/obj/item/modular_computer/tablet/pda/clear,
/obj/structure/grille{
layer = 3.001
},
diff --git a/_maps/map_files/Instanced/map_files/Babylon2.dmm b/_maps/map_files/Instanced/map_files/Babylon2.dmm
index 12ffed62a38..17033165d0d 100644
--- a/_maps/map_files/Instanced/map_files/Babylon2.dmm
+++ b/_maps/map_files/Instanced/map_files/Babylon2.dmm
@@ -2719,15 +2719,15 @@
"cGz" = (
/obj/structure/table,
/obj/item/clipboard,
-/obj/item/cartridge/quartermaster{
+/obj/item/computer_hardware/hard_drive/role/quartermaster{
pixel_x = 6;
pixel_y = 5
},
-/obj/item/cartridge/quartermaster{
+/obj/item/computer_hardware/hard_drive/role/quartermaster{
pixel_x = -4;
pixel_y = 7
},
-/obj/item/cartridge/quartermaster,
+/obj/item/computer_hardware/hard_drive/role/quartermaster,
/obj/item/coin/silver,
/turf/open/floor/plasteel/tech/grid,
/area/quartermaster/pvp)
@@ -20411,7 +20411,7 @@
/turf/open/floor/plasteel,
/area/quartermaster/pvp)
"sxo" = (
-/obj/machinery/vending/cart,
+/obj/machinery/vending/job_disk,
/obj/structure/disposalpipe/segment{
dir = 4
},
diff --git a/_maps/map_files/Instanced/map_files/SpaceSHIP.dmm b/_maps/map_files/Instanced/map_files/SpaceSHIP.dmm
index 90f6114c8f8..b761a7dedca 100644
--- a/_maps/map_files/Instanced/map_files/SpaceSHIP.dmm
+++ b/_maps/map_files/Instanced/map_files/SpaceSHIP.dmm
@@ -20674,7 +20674,7 @@
/turf/open/floor/plasteel/tech/grid,
/area/hallway/pvp)
"WU" = (
-/obj/machinery/vending/cart,
+/obj/machinery/vending/job_disk,
/turf/open/floor/carpet/red,
/area/crew_quarters/heads/captain/pvp)
"WV" = (
diff --git a/_maps/map_files/Mining/nsv13/ruins/mining4.dmm b/_maps/map_files/Mining/nsv13/ruins/mining4.dmm
index a85a6c7acdf..947342fd7b9 100644
--- a/_maps/map_files/Mining/nsv13/ruins/mining4.dmm
+++ b/_maps/map_files/Mining/nsv13/ruins/mining4.dmm
@@ -25,7 +25,7 @@
/area/ruin/powered)
"g" = (
/obj/item/shovel,
-/obj/item/pda/engineering,
+/obj/item/modular_computer/tablet/pda/engineering,
/turf/open/floor/plating,
/area/ruin/powered)
"h" = (
@@ -34,7 +34,7 @@
/turf/open/floor/plating,
/area/ruin/powered)
"i" = (
-/obj/item/pda/janitor,
+/obj/item/modular_computer/tablet/pda/janitor,
/turf/open/floor/plating,
/area/ruin/powered)
"j" = (
diff --git a/_maps/map_files/Serendipity/Serendipity1.dmm b/_maps/map_files/Serendipity/Serendipity1.dmm
index e183ec9ffca..a698320a7ae 100644
--- a/_maps/map_files/Serendipity/Serendipity1.dmm
+++ b/_maps/map_files/Serendipity/Serendipity1.dmm
@@ -13910,7 +13910,7 @@
/turf/open/floor/grass,
/area/chapel)
"TI" = (
-/obj/machinery/vending/cart,
+/obj/machinery/vending/job_disk,
/turf/open/floor/carpet,
/area/crew_quarters/heads/xo)
"TJ" = (
diff --git a/_maps/map_files/Shrike/Shrike1.dmm b/_maps/map_files/Shrike/Shrike1.dmm
index 1a7c4f609de..ea38f8a3934 100644
--- a/_maps/map_files/Shrike/Shrike1.dmm
+++ b/_maps/map_files/Shrike/Shrike1.dmm
@@ -8596,7 +8596,7 @@
/turf/closed/wall/ship,
/area/hallway/nsv/deck1/frame1/starboard)
"NR" = (
-/obj/machinery/vending/cart,
+/obj/machinery/vending/job_disk,
/turf/open/floor/plasteel/ridged/steel,
/area/bridge{
lighting_colour_bulb = "#c1e1ff";
diff --git a/_maps/map_files/Snake/snake_lower.dmm b/_maps/map_files/Snake/snake_lower.dmm
index afbf2490835..2333ad47572 100644
--- a/_maps/map_files/Snake/snake_lower.dmm
+++ b/_maps/map_files/Snake/snake_lower.dmm
@@ -13155,7 +13155,7 @@
/obj/structure/cable{
icon_state = "1-8"
},
-/obj/machinery/vending/cart,
+/obj/machinery/vending/job_disk,
/obj/machinery/light_switch/south,
/turf/open/floor/wood,
/area/crew_quarters/heads/hop{
diff --git a/_maps/map_files/Snake/snake_upper.dmm b/_maps/map_files/Snake/snake_upper.dmm
index c7f7cfd9972..5af0e2ac938 100644
--- a/_maps/map_files/Snake/snake_upper.dmm
+++ b/_maps/map_files/Snake/snake_upper.dmm
@@ -7571,12 +7571,12 @@
/area/maintenance/central)
"RR" = (
/obj/structure/table/reinforced,
-/obj/item/cartridge/quartermaster{
+/obj/item/computer_hardware/hard_drive/role/quartermaster{
pixel_x = -4;
pixel_y = 7
},
-/obj/item/cartridge/quartermaster,
-/obj/item/cartridge/quartermaster{
+/obj/item/computer_hardware/hard_drive/role/quartermaster,
+/obj/item/computer_hardware/hard_drive/role/quartermaster{
pixel_x = 6;
pixel_y = 5
},
diff --git a/_maps/map_files/Tycoon/Tycoon1.dmm b/_maps/map_files/Tycoon/Tycoon1.dmm
index 8d8be5b396c..77d9d6b540b 100644
--- a/_maps/map_files/Tycoon/Tycoon1.dmm
+++ b/_maps/map_files/Tycoon/Tycoon1.dmm
@@ -1971,7 +1971,7 @@
name = "Executive officer's Office"
})
"fi" = (
-/obj/machinery/vending/cart,
+/obj/machinery/vending/job_disk,
/obj/machinery/keycard_auth{
pixel_x = -26
},
diff --git a/_maps/map_files/Tycoon/Tycoon2.dmm b/_maps/map_files/Tycoon/Tycoon2.dmm
index 615cdf85cf1..81623bce9bc 100644
--- a/_maps/map_files/Tycoon/Tycoon2.dmm
+++ b/_maps/map_files/Tycoon/Tycoon2.dmm
@@ -5278,22 +5278,6 @@
},
/turf/open/floor/monotile/steel,
/area/medical/virology)
-"ani" = (
-/obj/item/cartridge/engineering{
- pixel_x = 4;
- pixel_y = 5
- },
-/obj/item/cartridge/engineering{
- pixel_x = -3;
- pixel_y = 2
- },
-/obj/item/cartridge/engineering{
- pixel_x = 3
- },
-/obj/structure/table/reinforced,
-/obj/item/cartridge/atmos,
-/turf/open/floor/carpet/blue,
-/area/crew_quarters/heads/chief)
"anj" = (
/turf/closed/wall/r_wall/ship,
/area/engine/engineering/hangar)
@@ -5435,13 +5419,6 @@
},
/turf/open/floor/monotile/light,
/area/medical/virology)
-"anF" = (
-/obj/structure/table/glass,
-/obj/item/cartridge/lawyer,
-/obj/item/taperecorder,
-/obj/item/reagent_containers/food/drinks/solgovcup,
-/turf/open/floor/carpet/blue,
-/area/lawoffice)
"anG" = (
/obj/machinery/computer/station_alert{
dir = 4
@@ -5578,16 +5555,6 @@
},
/turf/open/floor/monotile/dark,
/area/tcommsat/computer)
-"anY" = (
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/layer_manifold,
-/turf/open/floor/monotile/steel,
-/area/engine/engineering)
"aoa" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
dir = 4
@@ -8378,22 +8345,6 @@
},
/turf/open/floor/plating,
/area/engine/storage)
-"ayv" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/obj/machinery/door/airlock/ship/command{
- name = "Gravity Generator";
- req_one_access_txt = "56"
- },
-/obj/machinery/door/firedoor/border_only,
-/obj/machinery/door/firedoor/border_only{
- dir = 1
- },
-/turf/open/floor/monotile/steel,
-/area/engine/gravity_generator)
"ayE" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2,
/obj/structure/cable{
@@ -15067,21 +15018,6 @@
},
/turf/open/space/basic,
/area/space/nearstation)
-"aOj" = (
-/obj/structure/table/reinforced,
-/obj/item/cartridge/quartermaster{
- pixel_x = -4;
- pixel_y = 7
- },
-/obj/item/cartridge/quartermaster,
-/obj/item/cartridge/quartermaster{
- pixel_x = 6;
- pixel_y = 5
- },
-/obj/item/reagent_containers/food/drinks/solgovcup,
-/obj/item/clothing/ears/earmuffs,
-/turf/open/floor/carpet/ship,
-/area/quartermaster/qm)
"aOk" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -31264,30 +31200,6 @@
},
/turf/open/floor/monotile/light,
/area/crew_quarters/heads/cmo)
-"bwd" = (
-/obj/structure/table/glass,
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/item/cartridge/medical,
-/obj/item/cartridge/medical{
- pixel_x = 6;
- pixel_y = 3
- },
-/obj/item/cartridge/medical{
- pixel_x = -2;
- pixel_y = 6
- },
-/obj/item/cartridge/chemistry{
- pixel_y = 2
- },
-/obj/item/clothing/glasses/hud/health,
-/turf/open/floor/carpet/blue,
-/area/crew_quarters/heads/cmo)
"bwe" = (
/obj/machinery/atmospherics/pipe/simple/general/visible{
dir = 4
@@ -39186,6 +39098,21 @@
/obj/effect/turf_decal/tile/orange,
/turf/open/floor/monotile/steel,
/area/nsv/weapons/fore)
+"bYJ" = (
+/obj/structure/table/reinforced,
+/obj/item/computer_hardware/hard_drive/role/quartermaster{
+ pixel_x = -4;
+ pixel_y = 7
+ },
+/obj/item/computer_hardware/hard_drive/role/quartermaster,
+/obj/item/computer_hardware/hard_drive/role/quartermaster{
+ pixel_x = 6;
+ pixel_y = 5
+ },
+/obj/item/reagent_containers/food/drinks/solgovcup,
+/obj/item/clothing/ears/earmuffs,
+/turf/open/floor/carpet/ship,
+/area/quartermaster/qm)
"bYK" = (
/obj/structure/sign/ship/securearea{
dir = 8
@@ -40707,6 +40634,22 @@
},
/turf/closed/wall/r_wall/ship,
/area/engine/atmospherics_engine)
+"dwf" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/machinery/door/airlock/ship/command{
+ name = "Gravity Generator";
+ req_one_access_txt = "56"
+ },
+/obj/machinery/door/firedoor/border_only,
+/obj/machinery/door/firedoor/border_only{
+ dir = 1
+ },
+/turf/open/floor/monotile/steel,
+/area/engine/gravity_generator)
"dyj" = (
/obj/structure/bookcase/manuals/medical,
/obj/machinery/camera/autoname{
@@ -43334,6 +43277,22 @@
/obj/machinery/newscaster/security_unit,
/turf/closed/wall/ship,
/area/security/brig)
+"hrK" = (
+/obj/item/computer_hardware/hard_drive/role/engineering{
+ pixel_x = 4;
+ pixel_y = 5
+ },
+/obj/item/computer_hardware/hard_drive/role/engineering{
+ pixel_x = -3;
+ pixel_y = 2
+ },
+/obj/item/computer_hardware/hard_drive/role/engineering{
+ pixel_x = 3
+ },
+/obj/structure/table/reinforced,
+/obj/item/computer_hardware/hard_drive/role/atmos,
+/turf/open/floor/carpet/blue,
+/area/crew_quarters/heads/chief)
"hsX" = (
/obj/structure/disposalpipe/segment{
dir = 9
@@ -44109,6 +44068,30 @@
/obj/machinery/disposal/bin,
/turf/open/floor/plasteel/grid/steel,
/area/quartermaster/storage)
+"iBz" = (
+/obj/structure/table/glass,
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/item/computer_hardware/hard_drive/role/medical,
+/obj/item/computer_hardware/hard_drive/role/medical{
+ pixel_x = 6;
+ pixel_y = 3
+ },
+/obj/item/computer_hardware/hard_drive/role/medical{
+ pixel_x = -2;
+ pixel_y = 6
+ },
+/obj/item/computer_hardware/hard_drive/role/chemistry{
+ pixel_y = 2
+ },
+/obj/item/clothing/glasses/hud/health,
+/turf/open/floor/carpet/blue,
+/area/crew_quarters/heads/cmo)
"iCC" = (
/obj/effect/decal/cleanable/oil,
/turf/open/floor/plating,
@@ -48079,6 +48062,16 @@
},
/turf/open/floor/monotile/steel,
/area/nsv/weapons/fore)
+"ogB" = (
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/yellow,
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/turf/open/floor/monotile/dark,
+/area/engine/engineering)
"ohf" = (
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -48779,16 +48772,6 @@
/obj/effect/landmark/zebra_interlock_point,
/turf/open/floor/monotile/steel,
/area/nsv/weapons/fore)
-"prR" = (
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/obj/effect/turf_decal/tile/yellow,
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/turf/open/floor/monotile/dark,
-/area/engine/engineering)
"psx" = (
/obj/structure/disposalpipe/segment{
dir = 5
@@ -49273,6 +49256,21 @@
},
/turf/open/floor/plasteel/grid/steel,
/area/quartermaster/storage)
+"qiA" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 8
+ },
+/obj/machinery/door/airlock/ship/maintenance{
+ req_one_access_txt = "10"
+ },
+/turf/open/floor/plating,
+/area/maintenance/department/engine)
"qjd" = (
/obj/machinery/atmospherics/pipe/simple/dark/visible,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
@@ -52014,20 +52012,6 @@
/obj/machinery/light,
/turf/open/floor/engine,
/area/engine/engineering/reactor_core)
-"urL" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4,
-/turf/open/floor/monotile/steel,
-/area/engine/engineering)
"uti" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 4
@@ -52041,6 +52025,20 @@
},
/turf/open/floor/monotile/dark,
/area/hallway/secondary/exit)
+"utB" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4,
+/turf/open/floor/monotile/steel,
+/area/engine/engineering)
"uyI" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -52211,6 +52209,13 @@
/obj/effect/landmark/zebra_interlock_point,
/turf/open/floor/monotile/steel,
/area/medical/medbay/lobby)
+"uOT" = (
+/obj/structure/table/glass,
+/obj/item/computer_hardware/hard_drive/role/lawyer,
+/obj/item/taperecorder,
+/obj/item/reagent_containers/food/drinks/solgovcup,
+/turf/open/floor/carpet/blue,
+/area/lawoffice)
"uOY" = (
/obj/structure/closet/crate{
opened = 1
@@ -52218,6 +52223,16 @@
/obj/effect/spawner/lootdrop/maintenance,
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
+"uPh" = (
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/layer_manifold,
+/turf/open/floor/monotile/steel,
+/area/engine/engineering)
"uRG" = (
/obj/machinery/atmospherics/components/unary/portables_connector/layer2{
dir = 8
@@ -52908,21 +52923,6 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
-"vZO" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 8
- },
-/obj/machinery/door/airlock/ship/maintenance{
- req_one_access_txt = "10"
- },
-/turf/open/floor/plating,
-/area/maintenance/department/engine)
"wat" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{
dir = 4
@@ -79079,7 +79079,7 @@ aMs
blb
bwa
bwc
-bwd
+iBz
byY
bCq
acF
@@ -93232,7 +93232,7 @@ ajp
ajs
aka
akd
-aOj
+bYJ
aOr
phM
aEf
@@ -93438,7 +93438,7 @@ aRA
aRq
amq
aui
-anF
+uOT
asc
ate
avn
@@ -100117,7 +100117,7 @@ llg
asL
aqj
aqh
-ani
+hrK
aSm
btq
anp
@@ -101140,7 +101140,7 @@ amx
aey
aey
aey
-vZO
+qiA
aey
aey
aey
@@ -101907,7 +101907,7 @@ anJ
amx
aHM
aIy
-ayv
+dwf
ieG
wpa
wpa
@@ -102429,9 +102429,9 @@ iVI
jrd
tFb
vYQ
-anY
-urL
-prR
+uPh
+utB
+ogB
iVY
gvQ
kjd
diff --git a/_maps/map_files/Vago/vagodeck1.dmm b/_maps/map_files/Vago/vagodeck1.dmm
index 32fbfa20dd2..20b831eaec9 100644
--- a/_maps/map_files/Vago/vagodeck1.dmm
+++ b/_maps/map_files/Vago/vagodeck1.dmm
@@ -2525,12 +2525,12 @@
/obj/item/gps{
gpstag = "QM0"
},
-/obj/item/cartridge/quartermaster,
-/obj/item/cartridge/quartermaster{
+/obj/item/computer_hardware/hard_drive/role/quartermaster,
+/obj/item/computer_hardware/hard_drive/role/quartermaster{
pixel_x = 6;
pixel_y = 5
},
-/obj/item/cartridge/quartermaster{
+/obj/item/computer_hardware/hard_drive/role/quartermaster{
pixel_x = -4;
pixel_y = 7
},
diff --git a/_maps/map_files/Vago/vagodeck2.dmm b/_maps/map_files/Vago/vagodeck2.dmm
index 8da8b72f431..612f1560ff4 100644
--- a/_maps/map_files/Vago/vagodeck2.dmm
+++ b/_maps/map_files/Vago/vagodeck2.dmm
@@ -4646,7 +4646,7 @@
},
/obj/item/pen,
/obj/item/taperecorder,
-/obj/item/cartridge/lawyer,
+/obj/item/computer_hardware/hard_drive/role/lawyer,
/obj/item/radio/intercom{
pixel_y = 23
},
@@ -11059,15 +11059,15 @@
/area/hallway/nsv/deck2/frame2/port)
"Jo" = (
/obj/structure/table/wood,
-/obj/item/cartridge/engineering{
+/obj/item/computer_hardware/hard_drive/role/engineering{
pixel_x = -3;
pixel_y = 2
},
-/obj/item/cartridge/engineering{
+/obj/item/computer_hardware/hard_drive/role/engineering{
pixel_x = -3;
pixel_y = 2
},
-/obj/item/cartridge/engineering{
+/obj/item/computer_hardware/hard_drive/role/engineering{
pixel_x = -3;
pixel_y = 2
},
diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm
index 803d795c613..a2e3013a91e 100644
--- a/_maps/map_files/generic/CentCom.dmm
+++ b/_maps/map_files/generic/CentCom.dmm
@@ -4795,13 +4795,13 @@
/area/centcom/ferry)
"pP" = (
/obj/structure/table/reinforced,
-/obj/item/cartridge/quartermaster{
+/obj/item/computer_hardware/hard_drive/role/quartermaster{
pixel_x = -6
},
-/obj/item/cartridge/quartermaster{
+/obj/item/computer_hardware/hard_drive/role/quartermaster{
pixel_x = 6
},
-/obj/item/cartridge/quartermaster{
+/obj/item/computer_hardware/hard_drive/role/quartermaster{
pixel_y = 6
},
/obj/item/gps/mining,
diff --git a/code/__DEFINES/dcs/signals/obj_signals/item_signals/item_signals.dm b/code/__DEFINES/dcs/signals/obj_signals/item_signals/item_signals.dm
index 0d397364baf..ff100275b75 100644
--- a/code/__DEFINES/dcs/signals/obj_signals/item_signals/item_signals.dm
+++ b/code/__DEFINES/dcs/signals/obj_signals/item_signals/item_signals.dm
@@ -50,9 +50,10 @@
// /obj/effect/mine signals
#define COMSIG_MINE_TRIGGERED "minegoboom" ///from [/obj/effect/mine/proc/triggermine]:
-// /obj/item/pda signals
-#define COMSIG_PDA_CHANGE_RINGTONE "pda_change_ringtone" //! called on pda when the user changes the ringtone: (mob/living/user, new_ringtone)
- #define COMPONENT_STOP_RINGTONE_CHANGE 1
+// /obj/item/modular_computer/tablet/pda signals
+/// Called on tablet (PDA) when the user changes the ringtone: (mob/living/user, new_ringtone)
+#define COMSIG_TABLET_CHANGE_RINGTONE "comsig_tablet_change_ringtone"
+ #define COMPONENT_STOP_RINGTONE_CHANGE (1<<0)
// /obj/item/radio signals
diff --git a/code/__DEFINES/devices.dm b/code/__DEFINES/devices.dm
new file mode 100644
index 00000000000..179b9e93d78
--- /dev/null
+++ b/code/__DEFINES/devices.dm
@@ -0,0 +1,72 @@
+// Role disk defines
+
+#define DISK_POWER (1<<0)
+#define DISK_ATMOS (1<<1)
+#define DISK_MED (1<<2)
+#define DISK_CHEM (1<<3)
+#define DISK_MANIFEST (1<<4)
+#define DISK_NEWS (1<<5)
+#define DISK_SIGNAL (1<<6)
+#define DISK_STATUS (1<<7)
+#define DISK_CARGO (1<<8)
+#define DISK_ROBOS (1<<9)
+#define DISK_JANI (1<<10)
+#define DISK_SEC (1<<11)
+#define DISK_BUDGET (1<<12)
+#define DISK_REMOTE_AIRLOCK (1<<13)
+#define DISK_SILO_LOG (1<<14)
+#define DISK_HOP (1<<15)
+
+// Theme defines
+
+#define THEME_NTOS "ntos-default"
+#define THEME_THINKTRONIC "thinktronic-classic"
+#define THEME_NTOS_LIGHT "ntos-light"
+#define THEME_NTOS_DARK "ntos-dark"
+#define THEME_NTOS_RED "ntos-red"
+#define THEME_NTOS_ORANGE "ntos-orange"
+#define THEME_NTOS_YELLOW "ntos-yellow"
+#define THEME_NTOS_OLIVE "ntos-olive"
+#define THEME_NTOS_GREEN "ntos-green"
+#define THEME_NTOS_TEAL "ntos-teal"
+#define THEME_NTOS_BLUE "ntos-blue"
+#define THEME_NTOS_VIOLET "ntos-violet"
+#define THEME_NTOS_PURPLE "ntos-purple"
+#define THEME_NTOS_PINK "ntos-pink"
+#define THEME_NTOS_BROWN "ntos-brown"
+#define THEME_NTOS_GREY "ntos-grey"
+#define THEME_NTOS_CLOWN_PINK "ntos-clown-pink"
+#define THEME_NTOS_CLOWN_YELLOW "ntos-clown-yellow"
+#define THEME_NTOS_HACKERMAN "ntos-hackerman"
+#define THEME_HACKERMAN "hackeros"
+#define THEME_RETRO "retro"
+
+#define THEME_SYNDICATE "syndicate"
+
+GLOBAL_LIST_INIT(ntos_device_themes_default, list(
+ "NtOS Default" = THEME_NTOS,
+ "Thinktronic Classic" = THEME_THINKTRONIC,
+ "NtOS Light" = THEME_NTOS_LIGHT,
+ "NtOS Dark" = THEME_NTOS_DARK,
+ "NtOS Red" = THEME_NTOS_RED,
+ "NtOS Orange" = THEME_NTOS_ORANGE,
+ "NtOS Yellow" = THEME_NTOS_YELLOW,
+ "NtOS Olive" = THEME_NTOS_OLIVE,
+ "NtOS Green" = THEME_NTOS_GREEN,
+ "NtOS Teal" = THEME_NTOS_TEAL,
+ "NtOS Blue" = THEME_NTOS_BLUE,
+ "NtOS Violet" = THEME_NTOS_VIOLET,
+ "NtOS Purple" = THEME_NTOS_PURPLE,
+ "NtOS Pink" = THEME_NTOS_PINK,
+ "NtOS Brown" = THEME_NTOS_BROWN,
+ "NtOS Grey" = THEME_NTOS_GREY,
+ "NtOS Clown Pink" = THEME_NTOS_CLOWN_PINK,
+ "NtOS Clown Yellow" = THEME_NTOS_CLOWN_YELLOW,
+ "NtOS Hackerman" = THEME_NTOS_HACKERMAN,
+ "Hackerman" = THEME_HACKERMAN,
+ "Retro" = THEME_RETRO
+))
+
+GLOBAL_LIST_INIT(ntos_device_themes_emagged, list(
+ "Syndix" = THEME_SYNDICATE
+) + GLOB.ntos_device_themes_default)
diff --git a/code/__DEFINES/interaction_flags.dm b/code/__DEFINES/interaction_flags.dm
index 9535a99fc2d..93b8d3695f0 100644
--- a/code/__DEFINES/interaction_flags.dm
+++ b/code/__DEFINES/interaction_flags.dm
@@ -8,6 +8,7 @@
#define INTERACT_ATOM_CHECK_GRAB (1<<6) //! incapacitated check checks grab
#define INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND (1<<7) //! prevents leaving fingerprints automatically on attack_hand
#define INTERACT_ATOM_NO_FINGERPRINT_INTERACT (1<<8) //! adds hiddenprints instead of fingerprints on interact
+#define INTERACT_ATOM_ALLOW_USER_LOCATION (1<<9) //! allows this atom to skip the adjacency check
#define INTERACT_ITEM_ATTACK_HAND_PICKUP (1<<0) //! attempt pickup on attack_hand for items
diff --git a/code/__DEFINES/machines.dm b/code/__DEFINES/machines.dm
index 95c4e209ae5..4c28da23921 100644
--- a/code/__DEFINES/machines.dm
+++ b/code/__DEFINES/machines.dm
@@ -53,9 +53,11 @@
//Modular computer part defines
#define MC_CPU "CPU"
#define MC_HDD "HDD"
+#define MC_HDD_JOB "HDD_JOB"
#define MC_SDD "SDD"
#define MC_CARD "CARD"
#define MC_CARD2 "CARD2"
+#define MC_CART "CART"
#define MC_NET "NET"
#define MC_PRINT "PRINT"
#define MC_CELL "CELL"
@@ -63,6 +65,7 @@
#define MC_AI "AI"
#define MC_SENSORS "SENSORS"
#define MC_SIGNALLER "SIGNALER"
+#define MC_IDENTIFY "IDENTIFY"
//! ## NTNet stuff, for modular computers
//! **NTNet module-configuration values. Do not change these. If you need to add another use larger number (5..6..7 etc)**
@@ -159,3 +162,18 @@
#define PLANT_GENE_EXTRACTABLE (1<<1)
#define CLICKSOUND_INTERVAL (0.1 SECONDS) //clicky noises, how much time needed in between clicks on the machine for the sound to play on click again.
+
+// From code/game/machinery/computer/communications.dm
+// ---------------------------------------------------
+
+// for setting status display. Used in modpc status app as well.
+#define MAX_STATUS_LINE_LENGTH 40
+// approvied pictures, also used in modpc app
+GLOBAL_LIST_INIT(approved_status_pictures, list(
+ "biohazard",
+ "blank",
+ "default",
+ "lockdown",
+ "redalert",
+ "shuttle",
+))
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index 412b1f80dec..cb7c4fcf79d 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -401,9 +401,6 @@ GLOBAL_LIST_INIT(pda_styles, sortList(list(MONO, VT, ORBITRON, SHARE)))
#define EGG_LAYING_MESSAGES list("lays an egg.","squats down and croons.","begins making a huge racket.","begins clucking raucously.")
-// Used by PDA and cartridge code to reduce repetitiveness of spritesheets
-#define PDAIMG(what) {""}
-
//Filters
#define AMBIENT_OCCLUSION filter(type="drop_shadow", x=0, y=-2, size=4, color="#04080FAA")
#define GAUSSIAN_BLUR(filter_size) filter(type="blur", size=filter_size)
diff --git a/code/__HELPERS/cmp.dm b/code/__HELPERS/cmp.dm
index 0f86fed86e7..19040a150a1 100644
--- a/code/__HELPERS/cmp.dm
+++ b/code/__HELPERS/cmp.dm
@@ -125,11 +125,11 @@ GLOBAL_VAR_INIT(cmp_field, "name")
/proc/cmp_typepaths_asc(A, B)
return sorttext("[B]","[A]")
-/proc/cmp_pdaname_asc(obj/item/pda/A, obj/item/pda/B)
- return sorttext(B.owner, A.owner)
+/proc/cmp_pdaname_asc(obj/item/modular_computer/A, obj/item/modular_computer/B)
+ return sorttext(B?.saved_identification, A?.saved_identification)
-/proc/cmp_pdajob_asc(obj/item/pda/A, obj/item/pda/B)
- return sorttext(B.ownjob, A.ownjob)
+/proc/cmp_pdajob_asc(obj/item/modular_computer/A, obj/item/modular_computer/B)
+ return sorttext(B?.saved_job, A?.saved_job)
/proc/cmp_num_string_asc(A, B)
return text2num(A) - text2num(B)
diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm
index fe03bc7c972..24819c2d030 100644
--- a/code/__HELPERS/text.dm
+++ b/code/__HELPERS/text.dm
@@ -64,7 +64,7 @@
//Returns null if there is any bad text in the string
-/proc/reject_bad_text(text, max_length = 512, ascii_only = TRUE)
+/proc/reject_bad_text(text, max_length = 512, ascii_only = TRUE, alphanumeric_only = FALSE, underscore_allowed = TRUE)
var/char_count = 0
var/non_whitespace = FALSE
var/lenbytes = length(text)
@@ -79,13 +79,51 @@
return
if(0 to 31)
return
- if(32)
- continue
+ if(32 to 47)
+ if(alphanumeric_only)
+ return
+ else
+ non_whitespace = TRUE
+ continue
+ if(58 to 64)
+ if(alphanumeric_only)
+ return
+ else
+ non_whitespace = TRUE
+ continue
+ if(91 to 94)
+ if(alphanumeric_only)
+ return
+ else
+ non_whitespace = TRUE
+ continue
+ if(95)
+ if(underscore_allowed)
+ non_whitespace = TRUE
+ continue
+ else if(alphanumeric_only)
+ return
+ else
+ non_whitespace = TRUE
+ continue
+ if(96)
+ if(alphanumeric_only)
+ return
+ else
+ non_whitespace = TRUE
+ continue
+ if(123 to 126)
+ if(alphanumeric_only)
+ return
+ else
+ non_whitespace = TRUE
+ continue
if(127 to INFINITY)
if(ascii_only)
return
else
non_whitespace = TRUE
+
if(non_whitespace)
return text //only accepts the text if it has some non-spaces
diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm
index 2c09abc557c..ccab73e84aa 100644
--- a/code/_globalvars/bitfields.dm
+++ b/code/_globalvars/bitfields.dm
@@ -114,7 +114,8 @@ DEFINE_BITFIELD(interaction_flags_atom, list(
"INTERACT_ATOM_IGNORE_RESTRAINED" = INTERACT_ATOM_IGNORE_RESTRAINED,
"INTERACT_ATOM_CHECK_GRAB" = INTERACT_ATOM_CHECK_GRAB,
"INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND" = INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND,
- "INTERACT_ATOM_NO_FINGERPRINT_INTERACT" = INTERACT_ATOM_NO_FINGERPRINT_INTERACT
+ "INTERACT_ATOM_NO_FINGERPRINT_INTERACT" = INTERACT_ATOM_NO_FINGERPRINT_INTERACT,
+ "INTERACT_ATOM_ALLOW_USER_LOCATION" = INTERACT_ATOM_ALLOW_USER_LOCATION,
))
DEFINE_BITFIELD(interaction_flags_machine, list(
@@ -308,7 +309,7 @@ DEFINE_BITFIELD(overmap_deletion_traits, list(
"NEVER_DELETE_OCCUPIED" = NEVER_DELETE_OCCUPIED,
"DELETE_UNOCCUPIED_ON_DEPARTURE" = DELETE_UNOCCUPIED_ON_DEPARTURE,
"FIGHTERS_ARE_OCCUPANTS" = FIGHTERS_ARE_OCCUPANTS,
-))
+))
DEFINE_BITFIELD(overmap_user_roles, list(
"OVERMAP_USER_ROLE_PILOT" = OVERMAP_USER_ROLE_PILOT,
diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm
index 9d688b2b570..ac47123b886 100644
--- a/code/_globalvars/lists/objects.dm
+++ b/code/_globalvars/lists/objects.dm
@@ -31,6 +31,7 @@ GLOBAL_LIST_EMPTY(meteor_list) // List of all meteors.
GLOBAL_LIST_EMPTY(active_jammers) // List of active radio jammers
GLOBAL_LIST_EMPTY(ladders)
GLOBAL_LIST_EMPTY(bot_elevator)
+GLOBAL_LIST_EMPTY(janitor_devices)
GLOBAL_LIST_EMPTY(trophy_cases)
GLOBAL_LIST_EMPTY(wire_color_directory)
diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm
index f5feb50450f..5845568efcd 100644
--- a/code/_onclick/hud/_defines.dm
+++ b/code/_onclick/hud/_defines.dm
@@ -134,16 +134,15 @@
#define ui_ai_announcement "SOUTH:6,WEST+7"
#define ui_ai_shuttle "SOUTH:6,WEST+8"
#define ui_ai_state_laws "SOUTH:6,WEST+9"
-#define ui_ai_pda_send "SOUTH:6,WEST+10"
-#define ui_ai_pda_log "SOUTH:6,WEST+11"
-#define ui_ai_take_picture "SOUTH:6,WEST+12"
-#define ui_ai_view_images "SOUTH:6,WEST+13"
-#define ui_ai_sensor "SOUTH:6,WEST+14"
-#define ui_ai_multicam "SOUTH:6,WEST+15"
-#define ui_ai_add_multicam "SOUTH:6,WEST+16"
+#define ui_ai_mod_int "SOUTH:6,WEST+10"
+#define ui_ai_take_picture "SOUTH:6,WEST+11"
+#define ui_ai_view_images "SOUTH:6,WEST+12"
+#define ui_ai_sensor "SOUTH:6,WEST+13"
+#define ui_ai_multicam "SOUTH:6,WEST+12"
+#define ui_ai_add_multicam "SOUTH:6,WEST+13"
+#define ui_ai_move_up "SOUTH:6,WEST+14"
+#define ui_ai_move_down "SOUTH:6,WEST+15"
#define ui_ai_language_menu "CENTER+7:32,SOUTH+1:5"
-#define ui_ai_move_up "SOUTH:5+1,WEST+14"
-#define ui_ai_move_down "SOUTH:5+1,WEST+15"
// pAI
@@ -156,8 +155,7 @@
#define ui_pai_host_monitor "SOUTH:6,WEST+6"
#define ui_pai_crew_manifest "SOUTH:6,WEST+7"
#define ui_pai_state_laws "SOUTH:6,WEST+8"
-#define ui_pai_pda_send "SOUTH:6,WEST+9"
-#define ui_pai_pda_log "SOUTH:6,WEST+10"
+#define ui_pai_mod_int "SOUTH:6,WEST+9"
#define ui_pai_take_picture "SOUTH:6,WEST+12"
#define ui_pai_view_images "SOUTH:6,WEST+13"
diff --git a/code/_onclick/hud/ai.dm b/code/_onclick/hud/ai.dm
index adee4485fa2..8cccc65b566 100644
--- a/code/_onclick/hud/ai.dm
+++ b/code/_onclick/hud/ai.dm
@@ -46,6 +46,21 @@
var/mob/living/silicon/ai/AI = usr
AI.toggle_camera_light()
+/atom/movable/screen/ai/modpc
+ name = "Messenger"
+ icon_state = "pda_send"
+ var/mob/living/silicon/ai/robot
+
+/atom/movable/screen/ai/modpc/Click()
+ . = ..()
+ if(. || !robot.modularInterface?.turn_on(robot, open_ui = FALSE))
+ return
+ var/obj/item/computer_hardware/hard_drive/drive = robot.modularInterface.all_components[MC_HDD]
+ for(var/datum/computer_file/program/messenger/app in drive?.stored_files)
+ robot.modularInterface.open_program(robot, app)
+ robot.modularInterface.interact(robot)
+ break
+
/atom/movable/screen/ai/crew_monitor
name = "Crew Monitoring Console"
icon_state = "crew_monitor"
@@ -106,26 +121,6 @@
var/mob/living/silicon/ai/AI = usr
AI.checklaws()
-/atom/movable/screen/ai/pda_msg_send
- name = "PDA - Send Message"
- icon_state = "pda_send"
-
-/atom/movable/screen/ai/pda_msg_send/Click()
- if(..())
- return
- var/mob/living/silicon/ai/AI = usr
- AI.cmd_send_pdamesg(usr)
-
-/atom/movable/screen/ai/pda_msg_show
- name = "PDA - Show Message Log"
- icon_state = "pda_receive"
-
-/atom/movable/screen/ai/pda_msg_show/Click()
- if(..())
- return
- var/mob/living/silicon/ai/AI = usr
- AI.cmd_show_message_log(usr)
-
/atom/movable/screen/ai/image_take
name = "Take Image"
icon_state = "take_picture"
@@ -210,6 +205,7 @@
/datum/hud/ai/New(mob/owner)
..()
var/atom/movable/screen/using
+ var/mob/living/silicon/ai/myai = mymob
// Language menu
using = new /atom/movable/screen/language_menu
@@ -277,17 +273,14 @@
using.hud = src
static_inventory += using
-//PDA message
- using = new /atom/movable/screen/ai/pda_msg_send()
- using.screen_loc = ui_ai_pda_send
- using.hud = src
- static_inventory += using
-
-//PDA log
- using = new /atom/movable/screen/ai/pda_msg_show()
- using.screen_loc = ui_ai_pda_log
+// Modular Interface
+ using = new /atom/movable/screen/ai/modpc()
+ using.screen_loc = ui_ai_mod_int
using.hud = src
static_inventory += using
+ myai.interfaceButton = using
+ var/atom/movable/screen/ai/modpc/tabletbutton = using
+ tabletbutton.robot = myai
//Take image
using = new /atom/movable/screen/ai/image_take()
diff --git a/code/_onclick/hud/pai.dm b/code/_onclick/hud/pai.dm
index e97e88c12da..9bee046d244 100644
--- a/code/_onclick/hud/pai.dm
+++ b/code/_onclick/hud/pai.dm
@@ -113,27 +113,20 @@
var/mob/living/silicon/pai/pAI = usr
pAI.checklaws()
-/atom/movable/screen/pai/pda_msg_send
- name = "PDA - Send Message"
+/atom/movable/screen/pai/modpc
+ name = "Messenger"
icon_state = "pda_send"
- required_software = "digital messenger"
+ var/mob/living/silicon/pai/pAI
-/atom/movable/screen/pai/pda_msg_send/Click()
- if(!..())
+/atom/movable/screen/pai/modpc/Click()
+ . = ..()
+ if(!. || !pAI.modularInterface || !pAI.modularInterface.turn_on(pAI, open_ui = FALSE))
return
- var/mob/living/silicon/pai/pAI = usr
- pAI.cmd_send_pdamesg(usr)
-
-/atom/movable/screen/pai/pda_msg_show
- name = "PDA - Show Message Log"
- icon_state = "pda_receive"
- required_software = "digital messenger"
-
-/atom/movable/screen/pai/pda_msg_show/Click()
- if(!..())
- return
- var/mob/living/silicon/pai/pAI = usr
- pAI.cmd_show_message_log(usr)
+ var/obj/item/computer_hardware/hard_drive/drive = pAI.modularInterface.all_components[MC_HDD]
+ for(var/datum/computer_file/program/messenger/app in drive?.stored_files)
+ pAI.modularInterface.open_program(pAI, app)
+ pAI.modularInterface.interact(pAI)
+ break
/atom/movable/screen/pai/image_take
name = "Take Image"
@@ -171,6 +164,7 @@
/datum/hud/pai/New(mob/living/silicon/pai/owner)
..()
var/atom/movable/screen/using
+ var/mob/living/silicon/pai/mypai = mymob
// Software menu
using = new /atom/movable/screen/pai/software
@@ -222,15 +216,13 @@
using.screen_loc = ui_pai_state_laws
static_inventory += using
-// PDA message
- using = new /atom/movable/screen/pai/pda_msg_send()
- using.screen_loc = ui_pai_pda_send
- static_inventory += using
-
-// PDA log
- using = new /atom/movable/screen/pai/pda_msg_show()
- using.screen_loc = ui_pai_pda_log
+// Modular Interface
+ using = new /atom/movable/screen/pai/modpc()
+ using.screen_loc = ui_pai_mod_int
static_inventory += using
+ mypai.interface_button = using
+ var/atom/movable/screen/pai/modpc/tablet_button = using
+ tablet_button.pAI = mypai
// Take image
using = new /atom/movable/screen/pai/image_take()
diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm
index b13db01141d..6b3076380ba 100644
--- a/code/_onclick/hud/robot.dm
+++ b/code/_onclick/hud/robot.dm
@@ -125,14 +125,14 @@
static_inventory += using
//Borg Integrated Tablet
- using = new /atom/movable/screen/robot/modPC()
+ using = new /atom/movable/screen/robot/modpc()
using.screen_loc = ui_borg_tablet
using.hud = src
static_inventory += using
mymobR.interfaceButton = using
if(mymobR.modularInterface)
using.vis_contents += mymobR.modularInterface
- var/atom/movable/screen/robot/modPC/tabletbutton = using
+ var/atom/movable/screen/robot/modpc/tabletbutton = using
tabletbutton.robot = mymobR
//Alerts
@@ -293,12 +293,12 @@
else
icon_state = "lamp_off"
-/atom/movable/screen/robot/modPC
+/atom/movable/screen/robot/modpc
name = "Modular Interface"
icon_state = "template"
var/mob/living/silicon/robot/robot
-/atom/movable/screen/robot/modPC/Click()
+/atom/movable/screen/robot/modpc/Click()
. = ..()
if(.)
return
diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm
index 9d57f171af0..1f2d0c12884 100644
--- a/code/_onclick/other_mobs.dm
+++ b/code/_onclick/other_mobs.dm
@@ -47,7 +47,7 @@
return FALSE
/atom/proc/can_interact(mob/user)
- if(!user.can_interact_with(src))
+ if(!user.can_interact_with(src, interaction_flags_atom & INTERACT_ATOM_ALLOW_USER_LOCATION))
return FALSE
if((interaction_flags_atom & INTERACT_ATOM_REQUIRES_DEXTERITY) && !user.IsAdvancedToolUser())
to_chat(user, "You don't have the dexterity to do this!")
@@ -58,6 +58,7 @@
/atom/ui_status(mob/user)
. = ..()
+ //Check if both user and atom are at the same location
if(!can_interact(user))
. = min(., UI_UPDATE)
diff --git a/code/controllers/subsystem/blackbox.dm b/code/controllers/subsystem/blackbox.dm
index e4cd90a5ba3..9c224aebfcb 100644
--- a/code/controllers/subsystem/blackbox.dm
+++ b/code/controllers/subsystem/blackbox.dm
@@ -89,8 +89,8 @@ SUBSYSTEM_DEF(blackbox)
/datum/controller/subsystem/blackbox/proc/FinalFeedback()
record_feedback("tally", "ahelp_stats", GLOB.ahelp_tickets.active_tickets.len, "unresolved")
for (var/obj/machinery/telecomms/message_server/MS in GLOB.telecomms_list)
- if (MS.pda_msgs.len)
- record_feedback("tally", "radio_usage", MS.pda_msgs.len, "PDA")
+ if (MS.modular_msgs.len)
+ record_feedback("tally", "radio_usage", MS.modular_msgs.len, "PDA")
if (MS.rc_msgs.len)
record_feedback("tally", "radio_usage", MS.rc_msgs.len, "request console")
diff --git a/code/controllers/subsystem/traumas.dm b/code/controllers/subsystem/traumas.dm
index fdc3601b87e..d38033d4847 100644
--- a/code/controllers/subsystem/traumas.dm
+++ b/code/controllers/subsystem/traumas.dm
@@ -64,7 +64,7 @@ SUBSYSTEM_DEF(traumas)
"clowns" = typecacheof(list(/obj/item/clothing/under/rank/civilian/clown, /obj/item/clothing/shoes/clown_shoes,
/obj/item/clothing/mask/gas/clown_hat, /obj/item/instrument/bikehorn,
- /obj/item/pda/clown, /obj/item/grown/bananapeel)),
+ /obj/item/modular_computer/tablet/pda/clown, /obj/item/grown/bananapeel)),
"greytide" = typecacheof(list(/obj/item/clothing/under/color/grey, /obj/item/melee/baton/cattleprod,
/obj/item/spear, /obj/item/clothing/mask/gas/old)),
diff --git a/code/datums/action.dm b/code/datums/action.dm
index 67bed4f474d..10da7130767 100644
--- a/code/datums/action.dm
+++ b/code/datums/action.dm
@@ -203,9 +203,9 @@
name = "Toggle Light"
/datum/action/item_action/toggle_light/Trigger()
- if(istype(target, /obj/item/pda))
- var/obj/item/pda/P = target
- P.toggle_light(owner)
+ if(istype(target, /obj/item/modular_computer))
+ var/obj/item/modular_computer/mc = target
+ mc.toggle_flashlight()
return
..()
@@ -228,6 +228,9 @@
/datum/action/item_action/startchainsaw
name = "Pull The Starting Cord"
+/datum/action/item_action/toggle_computer_light
+ name = "Toggle Flashlight"
+
/datum/action/item_action/toggle_gunlight
name = "Toggle Gunlight"
diff --git a/code/datums/components/uplink.dm b/code/datums/components/uplink.dm
index f3ea6c1749b..cfcb7a133b8 100644
--- a/code/datums/components/uplink.dm
+++ b/code/datums/components/uplink.dm
@@ -42,8 +42,8 @@
RegisterSignal(parent, COMSIG_IMPLANT_IMPLANTING, PROC_REF(implanting))
RegisterSignal(parent, COMSIG_IMPLANT_OTHER, PROC_REF(old_implant))
RegisterSignal(parent, COMSIG_IMPLANT_EXISTING_UPLINK, PROC_REF(new_implant))
- else if(istype(parent, /obj/item/pda))
- RegisterSignal(parent, COMSIG_PDA_CHANGE_RINGTONE, PROC_REF(new_ringtone))
+ else if(istype(parent, /obj/item/modular_computer/tablet))
+ RegisterSignal(parent, COMSIG_TABLET_CHANGE_RINGTONE, PROC_REF(new_ringtone))
else if(istype(parent, /obj/item/radio))
RegisterSignal(parent, COMSIG_RADIO_MESSAGE, PROC_REF(radio_message))
else if(istype(parent, /obj/item/pen))
@@ -287,7 +287,6 @@
/datum/component/uplink/proc/new_ringtone(datum/source, mob/living/user, new_ring_text)
SIGNAL_HANDLER
- var/obj/item/pda/master = parent
if(trim(lowertext(new_ring_text)) != trim(lowertext(unlock_code)))
if(failsafe_code && trim(lowertext(new_ring_text)) == trim(lowertext(failsafe_code)))
failsafe()
@@ -295,9 +294,7 @@
return
locked = FALSE
interact(null, user)
- to_chat(user, "The PDA softly beeps.")
- user << browse(null, "window=pda")
- master.mode = 0
+ to_chat(user, "The computer softly beeps.")
return COMPONENT_STOP_RINGTONE_CHANGE
// Radio signal responses
@@ -353,7 +350,7 @@
/datum/component/uplink/proc/setup_unlock_code()
unlock_code = generate_code()
var/obj/item/P = parent
- if(istype(parent,/obj/item/pda))
+ if(istype(parent,/obj/item/modular_computer/tablet))
unlock_note = "Uplink Passcode: [unlock_code] ([P.name])."
else if(istype(parent,/obj/item/radio))
unlock_note = "Radio Passcode: [unlock_code] ([P.name] on the :d channel)."
@@ -361,7 +358,7 @@
unlock_note = "Uplink Degrees: [english_list(unlock_code)] ([P.name])."
/datum/component/uplink/proc/generate_code()
- if(istype(parent,/obj/item/pda))
+ if(istype(parent,/obj/item/modular_computer/tablet))
return "[random_code(3)] [pick(GLOB.phonetic_alphabet)]"
else if(istype(parent,/obj/item/radio))
return "[pick(GLOB.phonetic_alphabet)]"
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index cbdd4bed3ad..5804ebd9197 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -284,7 +284,7 @@
return
var/list/all_contents = traitor_mob.GetAllContents()
- var/obj/item/pda/PDA = locate() in all_contents
+ var/obj/item/modular_computer/tablet/pda/PDA = locate() in all_contents
var/obj/item/radio/R = locate() in all_contents
var/obj/item/pen/P
@@ -346,7 +346,7 @@
if(uplink_loc == R)
to_chat(traitor_mob, "[employer] has cunningly disguised a Syndicate Uplink as your [R.name]. Simply speak [U.unlock_code] into the :d channel to unlock its hidden features.")
else if(uplink_loc == PDA)
- to_chat(traitor_mob, "[employer] has cunningly disguised a Syndicate Uplink as your [PDA.name]. Simply enter the code \"[U.unlock_code]\" into the ringtone select to unlock its hidden features.")
+ to_chat(traitor_mob, "[employer] has cunningly disguised a Syndicate Uplink as your [PDA.name]. Simply enter the code \"[U.unlock_code]\" into the ring tone selection to unlock its hidden features.")
else if(uplink_loc == P)
to_chat(traitor_mob, "[employer] has cunningly disguised a Syndicate Uplink as your [P.name]. Simply twist the top of the pen [english_list(U.unlock_code)] from its starting position to unlock its hidden features.")
diff --git a/code/game/gamemodes/sandbox/h_sandbox.dm b/code/game/gamemodes/sandbox/h_sandbox.dm
index 41caf951879..93160201f68 100644
--- a/code/game/gamemodes/sandbox/h_sandbox.dm
+++ b/code/game/gamemodes/sandbox/h_sandbox.dm
@@ -29,7 +29,7 @@ GLOBAL_VAR_INIT(hsboxspawn, TRUE)
//items that shouldn't spawn on the floor because they would bug or act weird
var/static/list/spawn_forbidden = list(
/obj/item/tk_grab, /obj/item/implant, // not implanter, the actual thing that is inside you
- /obj/item/assembly, /obj/item/onetankbomb, /obj/item/pda/ai,
+ /obj/item/assembly, /obj/item/onetankbomb,
/obj/item/small_delivery, /obj/item/projectile,
/obj/item/borg/sight, /obj/item/borg/stun, /obj/item/robot_module)
diff --git a/code/game/machinery/PDApainter.dm b/code/game/machinery/PDApainter.dm
index 8c904c3d994..b325b4cd347 100644
--- a/code/game/machinery/PDApainter.dm
+++ b/code/game/machinery/PDApainter.dm
@@ -1,12 +1,12 @@
/obj/machinery/pdapainter
name = "\improper color manipulator"
desc = "A machine able to color PDAs and IDs with ease. Insert an ID card or PDA and pick a color scheme."
- icon = 'icons/obj/pda.dmi'
+ icon = 'nsv13/icons/obj/pda.dmi' //NSV13 - old sprites
icon_state = "coloriser"
max_integrity = 200
density = TRUE
anchored = TRUE
- var/obj/item/pda/storedpda = null
+ var/obj/item/modular_computer/tablet/pda/storedpda = null
var/obj/item/card/id/storedid = null
//Nsv13 - Crayon eaters & MPs
var/pda_icons = list(
@@ -117,16 +117,14 @@
/obj/machinery/pdapainter/Initialize(mapload)
. = ..()
var/list/blocked = list(
- /obj/item/pda/ai/pai,
- /obj/item/pda/ai,
- /obj/item/pda/heads,
- /obj/item/pda/clear,
- /obj/item/pda/syndicate,
- /obj/item/pda/chameleon,
- /obj/item/pda/chameleon/broken)
+ /obj/item/modular_computer/tablet/pda/heads,
+ /obj/item/modular_computer/tablet/pda/clear,
+ /obj/item/modular_computer/tablet/pda/syndicate,
+ /obj/item/modular_computer/tablet/pda/chameleon,
+ /obj/item/modular_computer/tablet/pda/chameleon/broken)
- for(var/P in typesof(/obj/item/pda) - blocked)
- var/obj/item/pda/D = new P
+ for(var/P in typesof(/obj/item/modular_computer/tablet/pda) - blocked)
+ var/obj/item/modular_computer/tablet/pda/D = new P
//D.name = "PDA Style [colorlist.len+1]" //Gotta set the name, otherwise it all comes up as "PDA"
D.name = D.icon_state //PDAs don't have unique names, but using the sprite names works.
@@ -165,7 +163,7 @@
power_change()
return
- else if(istype(O, /obj/item/pda))
+ else if(istype(O, /obj/item/modular_computer/tablet/pda))
if(storedpda)
to_chat(user, "There is already a PDA inside!")
return
diff --git a/code/game/machinery/airlock_cycle_control.dm b/code/game/machinery/airlock_cycle_control.dm
index e4563cc07bf..7be45657e23 100644
--- a/code/game/machinery/airlock_cycle_control.dm
+++ b/code/game/machinery/airlock_cycle_control.dm
@@ -452,7 +452,7 @@
to_chat(user, "The wires have been [panel_open ? "exposed" : "unexposed"].")
update_icon()
return
- else if(istype(W, /obj/item/card/id) || istype(W, /obj/item/pda))// trying to unlock the interface with an ID card
+ else if(istype(W, /obj/item/card/id) || istype(W, /obj/item/modular_computer/tablet/pda))// trying to unlock the interface with an ID card
togglelock(user)
return
else if(panel_open && is_wire_tool(W))
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index 9411299fa89..3e1d4b30acf 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -251,21 +251,20 @@
return
// OTHER
- if((istype(I, /obj/item/paper) || istype(I, /obj/item/pda)) && isliving(user))
+ if((istype(I, /obj/item/paper) || istype(I, /obj/item/modular_computer/tablet)) && isliving(user))
var/mob/living/U = user
- var/obj/item/paper/X = null
- var/obj/item/pda/P = null
var/itemname = ""
var/info = ""
if(istype(I, /obj/item/paper))
- X = I
- itemname = X.name
- info = X.info
- else
- P = I
- itemname = P.name
- info = P.notehtml
+ var/obj/item/paper/pressed_paper = I
+ itemname = pressed_paper.name
+ info = pressed_paper.info
+ if(istype(I, /obj/item/modular_computer/tablet))
+ var/obj/item/modular_computer/tablet/computer = I
+ itemname = computer.name
+ info = computer.note
+
itemname = sanitize(itemname)
to_chat(U, "You hold \the [itemname] up to the camera...")
U.changeNext_move(CLICK_CD_MELEE)
diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm
index 9003b69dd89..cf6bb68113f 100644
--- a/code/game/machinery/computer/cloning.dm
+++ b/code/game/machinery/computer/cloning.dm
@@ -234,7 +234,7 @@
scantemp = "Cannot delete: Data Corrupted."
return FALSE
var/obj/item/card/id/C = usr.get_idcard(hand_first = TRUE)
- if(istype(C) || istype(C, /obj/item/pda) || istype(C, /obj/item/modular_computer/tablet))
+ if(istype(C) || istype(C, /obj/item/modular_computer/tablet))
if(check_access(C))
scantemp = "[GRAB.fields["name"]] => Record deleted."
records.Remove(GRAB)
diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index eb5152b44d5..60468d9de16 100755
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -1,5 +1,4 @@
#define IMPORTANT_ACTION_COOLDOWN (60 SECONDS)
-#define MAX_STATUS_LINE_LENGTH 40
#define STATE_BUYING_SHUTTLE "buying_shuttle"
#define STATE_CHANGING_STATUS "changing_status"
@@ -80,7 +79,6 @@
/obj/machinery/computer/communications/ui_act(action, list/params)
var/static/list/approved_states = list(STATE_BUYING_SHUTTLE, STATE_CHANGING_STATUS, STATE_MESSAGES, STATE_OBJECTIVES) //NSV13 - added objectives
- var/static/list/approved_status_pictures = list("biohazard", "blank", "default", "lockdown", "redalert", "shuttle")
. = ..()
if (.)
@@ -296,7 +294,7 @@
if (!authenticated(usr))
return
var/picture = params["picture"]
- if (!(picture in approved_status_pictures))
+ if (!(picture in GLOB.approved_status_pictures))
return
post_status("alert", picture)
playsound(src, "terminal_type", 50, FALSE)
@@ -593,7 +591,6 @@
possible_answers = new_possible_answers
#undef IMPORTANT_ACTION_COOLDOWN
-#undef MAX_STATUS_LINE_LENGTH
#undef STATE_BUYING_SHUTTLE
#undef STATE_CHANGING_STATUS
#undef STATE_MESSAGES
diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm
index aa116eb0771..b2a27e8edf1 100644
--- a/code/game/machinery/computer/security.dm
+++ b/code/game/machinery/computer/security.dm
@@ -870,16 +870,16 @@ What a mess.*/
if(!canUseSecurityRecordsConsole(usr, t1, null, a2))
return
- var/crime = GLOB.data_core.createCrimeEntry(t1, "", authenticated, station_time_timestamp(), fine)
- for (var/obj/item/pda/P in GLOB.PDAs)
- if(P.owner == active1.fields["name"])
+ var/datum/data/crime/crime = GLOB.data_core.createCrimeEntry(t1, "", authenticated, station_time_timestamp(), fine)
+ for (var/obj/item/modular_computer/tablet in GLOB.TabletMessengers)
+ if(tablet.saved_identification == active1.fields["name"])
var/message = "You have been fined [fine] credits for '[t1]'. Fines may be paid at security."
- var/datum/signal/subspace/messaging/pda/signal = new(src, list(
+ var/datum/signal/subspace/messaging/tablet_msg/signal = new(src, list(
"name" = "Security Citation",
"job" = "Citation Server",
"message" = message,
- "targets" = list("[P.owner] ([P.ownjob])"),
- "automated" = 1
+ "targets" = list(tablet),
+ "automated" = TRUE
))
signal.send_to_receivers()
usr.log_message("(PDA: Citation Server) sent \"[message]\" to [signal.format_target()]", LOG_PDA)
diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm
index 98d0fb4e213..660d16aa0dd 100644
--- a/code/game/machinery/doors/firedoor.dm
+++ b/code/game/machinery/doors/firedoor.dm
@@ -163,7 +163,7 @@
if(operating)
return
- if(istype(C, /obj/item/pda))
+ if(istype(C, /obj/item/modular_computer/tablet/pda))
var/attack_verb = pick("smushes","rubs","smashes","presses","taps")
visible_message("[user] [attack_verb] \the [C] against [src]\s card reader.", "You [attack_verb] \the [C] against [src]\s card reader. It doesn't do anything.", "You hear plastic click against metal.")
return
diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm
index f626a45a8f9..05204158fe6 100644
--- a/code/game/machinery/navbeacon.dm
+++ b/code/game/machinery/navbeacon.dm
@@ -114,7 +114,7 @@
update_icon()
- else if (istype(I, /obj/item/card/id)||istype(I, /obj/item/pda))
+ else if (istype(I, /obj/item/card/id) || istype(I, /obj/item/modular_computer/tablet))
if(open)
if (src.allowed(user))
src.locked = !src.locked
diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm
index 740e5af1c3e..94b1350c49e 100644
--- a/code/game/machinery/newscaster.dm
+++ b/code/game/machinery/newscaster.dm
@@ -813,10 +813,11 @@ GLOBAL_LIST_EMPTY(allCasters)
if(ishuman(user))
var/mob/living/carbon/human/human_user = user
if(human_user.wear_id)
- if(istype(human_user.wear_id, /obj/item/pda))
- var/obj/item/pda/P = human_user.wear_id
- if(P.id)
- scanned_user = "[P.id.registered_name] ([P.id.assignment])"
+ if(istype(human_user.wear_id, /obj/item/modular_computer/tablet/pda))
+ var/obj/item/modular_computer/tablet/pda/P = human_user.wear_id
+ var/obj/item/card/id/ID = P.GetID()
+ if(istype(ID))
+ scanned_user = "[ID.registered_name] ([ID.assignment])"
else
scanned_user = "Unknown"
else if(istype(human_user.wear_id, /obj/item/card/id) )
diff --git a/code/game/machinery/telecomms/computers/message.dm b/code/game/machinery/telecomms/computers/message.dm
index 212729e00c4..ca9f1806ccd 100644
--- a/code/game/machinery/telecomms/computers/message.dm
+++ b/code/game/machinery/telecomms/computers/message.dm
@@ -2,43 +2,16 @@
The monitoring computer for the messaging server.
Lets you read PDA and request console messages.
*/
-
-#define LINKED_SERVER_NONRESPONSIVE (!linkedServer || (linkedServer.machine_stat & (NOPOWER|BROKEN)))
-
-#define MSG_MON_SCREEN_MAIN 0
-#define MSG_MON_SCREEN_LOGS 1
-#define MSG_MON_SCREEN_HACKED 2
-#define MSG_MON_SCREEN_CUSTOM_MSG 3
-#define MSG_MON_SCREEN_REQUEST_LOGS 4
-
-// The monitor itself.
/obj/machinery/computer/message_monitor
name = "message monitor console"
desc = "Used to monitor the crew's PDA messages, as well as request console messages."
icon_screen = "comm_logs"
circuit = /obj/item/circuitboard/computer/message_monitor
- //Server linked to.
- var/obj/machinery/telecomms/message_server/linkedServer = null
- //Sparks effect - For emag
- var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread
- //Messages - Saves me time if I want to change something.
- var/noserver = "ALERT: No server detected."
- var/incorrectkey = "ALERT: Incorrect decryption key!"
- var/defaultmsg = "Welcome. Please select an option."
- var/rebootmsg = "%$&(£: Critical %$$@ Error // !RestArting! - ?pLeaSe wAit!"
- //Computer properties
- var/screen = MSG_MON_SCREEN_MAIN // 0 = Main menu, 1 = Message Logs, 2 = Hacked screen, 3 = Custom Message
- var/hacking = FALSE // Is it being hacked into by the AI/Cyborg
- var/message = "System bootup complete. Please select an option." // The message that shows on the main menu.
- var/auth = FALSE // Are they authenticated?
- var/optioncount = 7
- // Custom Message Properties
- var/customsender = "System Administrator"
- var/obj/item/pda/customrecepient = null
- var/customjob = "Admin"
- var/custommessage = "This is a test, please ignore."
-
light_color = LIGHT_COLOR_GREEN
+ /// Message server selected to receive data from
+ var/obj/machinery/telecomms/message_server/linked_server
+ /// If the console is currently being hacked by a silicon
+ var/hacking = FALSE
/obj/machinery/computer/message_monitor/attackby(obj/item/O, mob/living/user, params)
if(O.tool_behaviour == TOOL_SCREWDRIVER && (obj_flags & EMAGGED))
@@ -50,19 +23,32 @@
/obj/machinery/computer/message_monitor/emag_act(mob/user)
if(obj_flags & EMAGGED)
return
- if(!isnull(linkedServer))
+ if(!linked_server)
obj_flags |= EMAGGED
- screen = MSG_MON_SCREEN_HACKED
- spark_system.set_up(5, 0, src)
- spark_system.start()
- var/obj/item/paper/monitorkey/MK = new(loc, linkedServer)
- // Will help make emagging the console not so easy to get away with.
+ to_chat(user, "A 'no server detected' error appears on the screen.")
+ return
+ else
+ ui_update()
+ do_sparks(5, FALSE, src)
+ addtimer(CALLBACK(src, PROC_REF(after_emag)), 10 * length(linked_server.decryptkey) SECONDS)
+
+/obj/machinery/computer/message_monitor/proc/after_emag()
+ // Print an "error" decryption key, leaving physical evidence of the hack.
+ if(linked_server)
+ var/obj/item/paper/monitorkey/MK = new(loc, linked_server)
MK.info += "
£%@%(*$%&(£&?*(%&£/{}"
- var/time = 100 * length(linkedServer.decryptkey)
- addtimer(CALLBACK(src, PROC_REF(UnmagConsole)), time)
- message = rebootmsg
else
- to_chat(user, "A no server error appears on the screen.")
+ say("Error: Server link lost!")
+ obj_flags &= ~EMAGGED
+ ui_update()
+
+/obj/machinery/computer/message_monitor/proc/finish_hack(mob/living/silicon/user)
+ hacking = FALSE
+ ui_update()
+ if(!linked_server)
+ to_chat(user, "Could not complete brute-force: Linked Server Disconnected!")
+ return
+ to_chat(user, "Brute-force completed! The decryption key is '[linked_server.decryptkey]'.")
/obj/machinery/computer/message_monitor/New()
..()
@@ -73,384 +59,222 @@
return INITIALIZE_HINT_LATELOAD
/obj/machinery/computer/message_monitor/LateInitialize()
- //Is the server isn't linked to a server, and there's a server available, default it to the first one in the list.
- if(!linkedServer)
+ //If the server isn't linked to a server, and there's a server available, default it to the first one in the list.
+ if(!linked_server)
for(var/obj/machinery/telecomms/message_server/S in GLOB.telecomms_list)
- linkedServer = S
+ set_linked_server(S)
break
+/obj/machinery/computer/message_monitor/proc/set_linked_server(var/obj/machinery/telecomms/message_server/server)
+ if(linked_server)
+ UnregisterSignal(linked_server, COMSIG_PARENT_QDELETING)
+ if(server != linked_server)
+ authenticated = FALSE
+ linked_server = server
+ if(server)
+ RegisterSignal(server, COMSIG_PARENT_QDELETING, PROC_REF(server_deleting))
+ ui_update()
+
+/obj/machinery/computer/message_monitor/proc/server_deleting()
+ set_linked_server(null)
+
/obj/machinery/computer/message_monitor/Destroy()
GLOB.telecomms_list -= src
+ set_linked_server(null)
return ..()
-/obj/machinery/computer/message_monitor/ui_interact(mob/living/user)
+/obj/machinery/computer/message_monitor/ui_assets(mob/user)
+ return list(
+ get_asset_datum(/datum/asset/spritesheet/chat),
+ )
+
+/obj/machinery/computer/message_monitor/ui_static_data(mob/user)
+ var/list/data = list()
+ data["emoji_names"] = icon_states('icons/emoji.dmi')
+ return data
+
+/obj/machinery/computer/message_monitor/ui_data(mob/user)
+ var/list/data = ..()
+ data["server_on"] = linked_server?.on
+ data["authenticated"] = authenticated
+ data["hacking"] = hacking || (obj_flags & EMAGGED)
+ var/mob/living/silicon/S = user
+ data["can_hack"] = istype(S) && S.hack_software
+ var/no_server = !linked_server || (linked_server.machine_stat & (NOPOWER|BROKEN))
+ data["no_server"] = no_server
+ if(no_server || !authenticated)
+ return data
+ var/list/pda_messages = list()
+ for(var/datum/data_tablet_msg/message in linked_server.modular_msgs)
+ var/list/message_data = list()
+ var/datum/picture/pic = message.picture
+ if(istype(pic))
+ message_data["photo"] = pda_rsc_image(pic, "[REF(message)]", user)
+ message_data["photo_width"] = pic.psize_x
+ message_data["photo_height"] = pic.psize_y
+ message_data["sender"] = message.sender
+ message_data["recipient"] = message.recipient
+ message_data["contents"] = message.message
+ message_data["emojis"] = message.emojis
+ message_data["ref"] = REF(message)
+ pda_messages += list(message_data)
+ data["pda_messages"] = pda_messages
+ var/list/request_messages = list()
+ for(var/datum/data_rc_msg/req in linked_server.rc_msgs)
+ request_messages += list(list(
+ "sending_department" = req.send_dpt,
+ "receiving_department" = req.rec_dpt,
+ "stamp" = req.stamp,
+ "id_auth" = req.id_auth,
+ "priority" = req.priority,
+ "message" = req.message,
+ "ref" = REF(req),
+ ))
+ data["request_messages"] = request_messages
+ return data
+
+/obj/machinery/computer/message_monitor/ui_act(action, params)
. = ..()
- //If the computer is being hacked or is emagged, display the reboot message.
- if(hacking || (obj_flags & EMAGGED))
- message = rebootmsg
- var/dat = "
"
-
- if(auth)
- dat += ""
- else
- dat += " \[Unauthenticated\] /"
- dat += " Server Power: [linkedServer && linkedServer.on ? "\[On\]":"\[Off\]"]
"
-
- if(hacking || (obj_flags & EMAGGED))
- screen = MSG_MON_SCREEN_HACKED
- else if(!auth || LINKED_SERVER_NONRESPONSIVE)
- if(LINKED_SERVER_NONRESPONSIVE)
- message = noserver
- screen = MSG_MON_SCREEN_MAIN
-
- switch(screen)
- //Main menu
- if(MSG_MON_SCREEN_MAIN)
- // = TAB
- var/i = 0
- dat += " [++i]. Link To A Server"
- if(auth)
- if(LINKED_SERVER_NONRESPONSIVE)
- dat += " ERROR: Server not found!
"
- else
- dat += " [++i]. View Message Logs
"
- dat += " [++i]. View Request Console Logs "
- dat += " [++i]. Clear Message Logs
"
- dat += " [++i]. Clear Request Console Logs
"
- dat += " [++i]. Set Custom Key
"
- dat += " [++i]. Send Admin Message
"
+ if(.)
+ return TRUE
+ switch(action)
+ if("login")
+ if(!usr || authenticated)
+ return TRUE
+ if(!linked_server)
+ to_chat(usr, "The console flashes a message: 'ERROR: Server connection lost.'")
+ return TRUE
+ var/dkey = capped_input(usr, "Please enter the decryption key.")
+ if(dkey && linked_server.decryptkey == dkey)
+ authenticated = TRUE
else
- for(var/n = ++i; n <= optioncount; n++)
- dat += " [n]. ---------------
"
+ to_chat(usr, "The console flashes a message: 'ALERT: Incorrect decryption key!'")
+ return TRUE
+ if("logout")
+ authenticated = FALSE
+ return TRUE
+ if("hack")
var/mob/living/silicon/S = usr
- if(istype(S) && S.hack_software)
- //Malf/Traitor AIs can bruteforce into the system to gain the Key.
- dat += "*&@#. Bruteforce Key
"
- else
- dat += "
"
-
- //Bottom message
- if(!auth)
- dat += "
Please authenticate with the server in order to show additional options."
- else
- dat += "
Reg, #514 forbids sending messages to a Head of Staff containing Erotic Rendering Properties."
-
- //Message Logs
- if(MSG_MON_SCREEN_LOGS)
- var/index = 0
- dat += "Back - Refresh
"
- dat += "| X | Sender | Recipient | Message |
"
- for(var/datum/data_pda_msg/pda in linkedServer.pda_msgs)
- index++
- if(index > 3000)
- break
- // Del - Sender - Recepient - Message
- // X - Al Green - Your Mom - WHAT UP!?
- dat += "| X | [pda.sender] | [pda.recipient] | [pda.message][pda.picture ? " (Photo)":""] |
"
- dat += "
"
- //Hacking screen.
- if(MSG_MON_SCREEN_HACKED)
- if(isAI(user) || iscyborg(user))
- dat += "Brute-forcing for server key.
It will take 20 seconds for every character that the password has."
- dat += "In the meantime, this console can reveal your true intentions if you let someone access it. Make sure no humans enter the room during that time."
- else
- //It's the same message as the one above but in binary. Because robots understand binary and humans don't... well I thought it was clever.
- dat += {"01000010011100100111010101110100011001010010110
- 10110011001101111011100100110001101101001011011100110011
- 10010000001100110011011110111001000100000011100110110010
- 10111001001110110011001010111001000100000011010110110010
- 10111100100101110001000000100100101110100001000000111011
- 10110100101101100011011000010000001110100011000010110101
- 10110010100100000001100100011000000100000011100110110010
- 10110001101101111011011100110010001110011001000000110011
- 00110111101110010001000000110010101110110011001010111001
- 00111100100100000011000110110100001100001011100100110000
- 10110001101110100011001010111001000100000011101000110100
- 00110000101110100001000000111010001101000011001010010000
- 00111000001100001011100110111001101110111011011110111001
- 00110010000100000011010000110000101110011001011100010000
- 00100100101101110001000000111010001101000011001010010000
- 00110110101100101011000010110111001110100011010010110110
- 10110010100101100001000000111010001101000011010010111001
- 10010000001100011011011110110111001110011011011110110110
- 00110010100100000011000110110000101101110001000000111001
- 00110010101110110011001010110000101101100001000000111100
- 10110111101110101011100100010000001110100011100100111010
- 10110010100100000011010010110111001110100011001010110111
- 00111010001101001011011110110111001110011001000000110100
- 10110011000100000011110010110111101110101001000000110110
- 00110010101110100001000000111001101101111011011010110010
- 10110111101101110011001010010000001100001011000110110001
- 10110010101110011011100110010000001101001011101000010111
- 00010000001001101011000010110101101100101001000000111001
- 10111010101110010011001010010000001101110011011110010000
- 00110100001110101011011010110000101101110011100110010000
- 00110010101101110011101000110010101110010001000000111010
- 00110100001100101001000000111001001101111011011110110110
- 10010000001100100011101010111001001101001011011100110011
- 10010000001110100011010000110000101110100001000000111010
- 001101001011011010110010100101110"}
-
- //Fake messages
- if(MSG_MON_SCREEN_CUSTOM_MSG)
- dat += "Back - Reset
"
-
- dat += {"
- | Sender |
- Sender's Job |
- Recipient |
- Message |
"}
- //Sender - Sender's Job - Recepient - Message
- //Al Green- Your Dad - Your Mom - WHAT UP!?
-
- dat += {"| [customsender] |
- [customjob] |
- [customrecepient ? customrecepient.owner : "NONE"] |
- [custommessage] |
"}
- dat += "
Send"
-
- //Request Console Logs
- if(MSG_MON_SCREEN_REQUEST_LOGS)
-
- var/index = 0
- /* data_rc_msg
- X - 5%
- var/rec_dpt = "Unspecified" //name of the person - 15%
- var/send_dpt = "Unspecified" //name of the sender- 15%
- var/message = "Blank" //transferred message - 300px
- var/stamp = "Unstamped" - 15%
- var/id_auth = "Unauthenticated" - 15%
- var/priority = "Normal" - 10%
- */
- dat += "Back - Refresh
"
- dat += {"| X | Sending Dep. | Receiving Dep. |
- Message | Stamp | ID Auth. | Priority. |
"}
- for(var/datum/data_rc_msg/rc in linkedServer.rc_msgs)
- index++
- if(index > 3000)
- break
- // Del - Sender - Recepient - Message
- // X - Al Green - Your Mom - WHAT UP!?
- dat += {"| X | [rc.send_dpt] |
- [rc.rec_dpt] | [rc.message] | [rc.stamp] | [rc.id_auth] | [rc.priority] |
"}
- dat += "
"
-
- message = defaultmsg
- var/datum/browser/popup = new(user, "hologram_console", name, 700, 700)
- popup.set_content(dat)
- popup.open()
-
-/obj/machinery/computer/message_monitor/proc/BruteForce(mob/user)
- if(isnull(linkedServer))
- to_chat(user, "Could not complete brute-force: Linked Server Disconnected!")
- else
- var/currentKey = linkedServer.decryptkey
- to_chat(user, "Brute-force completed! The key is '[currentKey]'.")
- hacking = FALSE
- screen = MSG_MON_SCREEN_MAIN // Return the screen back to normal
-
-/obj/machinery/computer/message_monitor/proc/UnmagConsole()
- obj_flags &= ~EMAGGED
-
-/obj/machinery/computer/message_monitor/proc/ResetMessage()
- customsender = "System Administrator"
- customrecepient = null
- custommessage = "This is a test, please ignore."
- customjob = "Admin"
-
-/obj/machinery/computer/message_monitor/Topic(href, href_list)
- if(..())
- return
-
- if(usr.contents.Find(src) || (in_range(src, usr) && isturf(loc)) || issilicon(usr))
- //Authenticate
- if (href_list["auth"])
- if(LINKED_SERVER_NONRESPONSIVE)
- message = noserver
- else if(auth)
- auth = FALSE
- screen = MSG_MON_SCREEN_MAIN
- else
- var/dkey = capped_input(usr, "Please enter the decryption key.")
- if(dkey && dkey != "")
- if(linkedServer.decryptkey == dkey)
- auth = TRUE
- else
- message = incorrectkey
-
- //Turn the server on/off.
- if (href_list["active"])
- if(LINKED_SERVER_NONRESPONSIVE)
- message = noserver
- else if(auth)
- linkedServer.toggled = !linkedServer.toggled
- //Find a server
- if (href_list["find"])
+ if(!istype(S) || !S.hack_software)
+ return TRUE
+ if(!linked_server)
+ to_chat(S, "The console flashes a message: 'ERROR: Server connection lost.'")
+ return TRUE
+ hacking = TRUE
+ var/duration = 10 * length(linked_server.decryptkey) SECONDS
+ var/approx_duration = max(duration + rand(-20, 20), 1)
+ to_chat(S, "Brute-force decryption started. This will take approximately [DisplayTimeText(approx_duration, round_seconds_to = 10)].")
+ addtimer(CALLBACK(src, PROC_REF(finish_hack), S), duration)
+ return TRUE
+ if("link")
var/list/message_servers = list()
+ var/obj/machinery/telecomms/message_server/last
for (var/obj/machinery/telecomms/message_server/M in GLOB.telecomms_list)
- message_servers += M
-
- if(message_servers.len > 1)
- linkedServer = input(usr, "Please select a server.", "Select a server.", null) as null|anything in message_servers
- message = "NOTICE: Server selected."
- else if(message_servers.len > 0)
- linkedServer = message_servers[1]
- message = "NOTICE: Only Single Server Detected - Server selected."
+ var/key_base = "[M.network] - [M.name]"
+ var/key = key_base
+ var/number = 1
+ while(key in message_servers)
+ key = key_base + " ([number])"
+ number++
+ message_servers[key] = M
+ last = M
+
+ if(length(message_servers) > 1)
+ var/choice = input(usr, "Please select a server.", "Select a server.", null) as null|anything in message_servers
+ if(choice in message_servers)
+ set_linked_server(message_servers[choice])
+ else
+ set_linked_server(null)
+ else if(length(message_servers) == 1)
+ set_linked_server(last)
else
- message = noserver
-
- //View the logs - KEY REQUIRED
- if (href_list["view_logs"])
- if(LINKED_SERVER_NONRESPONSIVE)
- message = noserver
- else if(auth)
- screen = MSG_MON_SCREEN_LOGS
-
- //Clears the logs - KEY REQUIRED
- if (href_list["clear_logs"])
- if(LINKED_SERVER_NONRESPONSIVE)
- message = noserver
- else if(auth)
- linkedServer.pda_msgs = list()
- message = "NOTICE: Logs cleared."
- //Clears the request console logs - KEY REQUIRED
- if (href_list["clear_requests"])
- if(LINKED_SERVER_NONRESPONSIVE)
- message = noserver
- else if(auth)
- linkedServer.rc_msgs = list()
- message = "NOTICE: Logs cleared."
- //Change the password - KEY REQUIRED
- if (href_list["pass"])
- if(LINKED_SERVER_NONRESPONSIVE)
- message = noserver
- else if(auth)
- var/dkey = stripped_input(usr, "Please enter the decryption key.")
- if(dkey && dkey != "")
- if(linkedServer.decryptkey == dkey)
- var/newkey = trim(input(usr,"Please enter the new key (3 - 16 characters max):"))
- if(length(newkey) <= 3)
- message = "NOTICE: Decryption key too short!"
- else if(length(newkey) > 16)
- message = "NOTICE: Decryption key too long!"
- else if(newkey && newkey != "")
- linkedServer.decryptkey = newkey
- message = "NOTICE: Decryption key set."
- else
- message = incorrectkey
-
- //Hack the Console to get the password
- if (href_list["hack"])
- var/mob/living/silicon/S = usr
- if(istype(S) && S.hack_software)
- hacking = TRUE
- screen = MSG_MON_SCREEN_HACKED
- //Time it takes to bruteforce is dependant on the password length.
- spawn(100*length(linkedServer.decryptkey))
- if(src && linkedServer && usr)
- BruteForce(usr)
- //Delete the log.
- if (href_list["delete_logs"])
- //Are they on the view logs screen?
- if(screen == MSG_MON_SCREEN_LOGS)
- if(LINKED_SERVER_NONRESPONSIVE)
- message = noserver
- else //if(istype(href_list["delete_logs"], /datum/data_pda_msg))
- linkedServer.pda_msgs -= locate(href_list["delete_logs"]) in linkedServer.pda_msgs
- message = "NOTICE: Log Deleted!"
- //Delete the request console log.
- if (href_list["delete_requests"])
- //Are they on the view logs screen?
- if(screen == MSG_MON_SCREEN_REQUEST_LOGS)
- if(LINKED_SERVER_NONRESPONSIVE)
- message = noserver
- else //if(istype(href_list["delete_logs"], /datum/data_pda_msg))
- linkedServer.rc_msgs -= locate(href_list["delete_requests"]) in linkedServer.rc_msgs
- message = "NOTICE: Log Deleted!"
- //Create a custom message
- if (href_list["msg"])
- if(LINKED_SERVER_NONRESPONSIVE)
- message = noserver
- else if(auth)
- screen = MSG_MON_SCREEN_CUSTOM_MSG
- //Fake messaging selection - KEY REQUIRED
- if (href_list["select"])
- if(LINKED_SERVER_NONRESPONSIVE)
- message = noserver
- screen = MSG_MON_SCREEN_MAIN
+ set_linked_server(null)
+ return TRUE
+ if("power")
+ if(!authenticated)
+ return TRUE
+ if(!linked_server)
+ to_chat(usr, "The console flashes a message: 'ERROR: Server connection lost.'")
+ return TRUE
+ linked_server.toggled = !linked_server.toggled
+ // Trigger this immediately or hte UI will not update properly... wow this is a dumb proc
+ linked_server.update_power()
+ return TRUE
+ if("reset_key")
+ if(!usr || !authenticated)
+ return TRUE
+ if(!linked_server)
+ to_chat(usr, "The console flashes a message: 'ERROR: Server connection lost.'")
+ return TRUE
+ var/dkey = capped_input(usr, "Please enter the decryption key.")
+ if(!dkey)
+ return
+ if(linked_server.decryptkey == dkey)
+ var/newkey = capped_input(usr, "Please enter the new key (4-16 characters):")
+ if(length(newkey) < 4)
+ to_chat(usr, "The console flashes a message: 'NOTICE: Decryption key too short!'")
+ else if(length(newkey) > 16)
+ to_chat(usr, "The console flashes a message: 'NOTICE: Decryption key too long!'")
+ else if(newkey && newkey != "")
+ linked_server.decryptkey = newkey
+ to_chat(usr, "The console flashes a message: 'NOTICE: Decryption key set.'")
else
- switch(href_list["select"])
-
- //Reset
- if("Reset")
- ResetMessage()
-
- //Select Your Name
- if("Sender")
- customsender = stripped_input(usr, "Please enter the sender's name.") || customsender
-
- //Select Receiver
- if("Recepient")
- //Get out list of viable PDAs
- var/list/obj/item/pda/sendPDAs = get_viewable_pdas()
- if(GLOB.PDAs && GLOB.PDAs.len > 0)
- customrecepient = input(usr, "Select a PDA from the list.") as null|anything in sendPDAs
- else
- customrecepient = null
-
- //Enter custom job
- if("RecJob")
- customjob = stripped_input(usr, "Please enter the sender's job.") || customjob
-
- //Enter message
- if("Message")
- custommessage = stripped_input(usr, "Please enter your message.") || custommessage
-
- //Send message
- if("Send")
- if(isnull(customsender) || customsender == "")
- customsender = "UNKNOWN"
-
- if(isnull(customrecepient))
- message = "NOTICE: No recepient selected!"
- return attack_hand(usr)
-
- if(isnull(custommessage) || custommessage == "")
- message = "NOTICE: No message entered!"
- return attack_hand(usr)
-
- var/datum/signal/subspace/messaging/pda/signal = new(src, list(
- "name" = "[customsender]",
- "job" = "[customjob]",
- "message" = custommessage,
- "targets" = list("[customrecepient.owner] ([customrecepient.ownjob])")
- ))
- // this will log the signal and transmit it to the target
- linkedServer.receive_information(signal, null)
- usr.log_message("(PDA: [name] | [usr.real_name]) sent \"[custommessage]\" to [signal.format_target()]", LOG_PDA)
-
-
- //Request Console Logs - KEY REQUIRED
- if(href_list["view_requests"])
- if(LINKED_SERVER_NONRESPONSIVE)
- message = noserver
- else if(auth)
- screen = MSG_MON_SCREEN_REQUEST_LOGS
-
- if (href_list["back"])
- screen = MSG_MON_SCREEN_MAIN
-
- return attack_hand(usr)
-
-#undef MSG_MON_SCREEN_MAIN
-#undef MSG_MON_SCREEN_LOGS
-#undef MSG_MON_SCREEN_HACKED
-#undef MSG_MON_SCREEN_CUSTOM_MSG
-#undef MSG_MON_SCREEN_REQUEST_LOGS
-
-#undef LINKED_SERVER_NONRESPONSIVE
-
+ to_chat(usr,"The console flashes a message: 'ALERT: Incorrect decryption key!'")
+ if("clear_logs")
+ var/type = params["type"]
+ if(!usr || !authenticated || (type != "pda" && type != "request"))
+ return TRUE
+ if(!linked_server)
+ to_chat(usr, "The console flashes a message: 'ERROR: Server connection lost.'")
+ return TRUE
+ if(type == "request")
+ linked_server.rc_msgs.Cut()
+ else
+ linked_server.modular_msgs.Cut()
+ to_chat(usr, "The console flashes a message: 'NOTICE: Logs cleared.'")
+ var/turf/the_turf = get_turf(src)
+ usr.log_message("cleared [type] logs using [src] at [AREACOORD(the_turf)]", LOG_GAME)
+ message_admins("[ADMIN_FLW(usr)] cleared [type] logs using [src] at [ADMIN_VERBOSEJMP(the_turf)]")
+ return TRUE
+ if("delete_log")
+ var/ref = params["ref"]
+ var/type = params["type"]
+ if(!usr || !authenticated || (type != "pda" && type != "request") || !ref)
+ return TRUE
+ if(!linked_server)
+ to_chat(usr, "The console flashes a message: 'ERROR: Server connection lost.'")
+ return TRUE
+ var/list/target = type == "request" ? linked_server.rc_msgs : linked_server.modular_msgs
+ var/datum/entry = locate(ref) in target
+ if(!entry)
+ return
+ target -= entry
+ var/msg = ""
+ if(istype(entry, /datum/data_tablet_msg))
+ var/datum/data_tablet_msg/pda_entry = entry
+ msg = "[pda_entry.sender] to [pda_entry.recipient]: [pda_entry.message]"
+ else if(istype(entry, /datum/data_rc_msg))
+ var/datum/data_rc_msg/rc_entry = entry
+ msg = "[rc_entry.send_dpt] to [rc_entry.rec_dpt] PRIORITY [rc_entry.priority] AUTH [rc_entry.id_auth] STAMP [rc_entry.stamp]: [rc_entry.message]"
+ to_chat(usr, "The console flashes a message: 'NOTICE: Log entry deleted.'")
+ var/turf/the_turf = get_turf(src)
+ usr.log_message("cleared [type] log entry \"[msg]\" using [src] at [AREACOORD(the_turf)]", LOG_GAME)
+ message_admins("[key_name_admin(usr)][ADMIN_FLW(usr)] deleted [type] log entry \"[msg]\" using [src] at [ADMIN_VERBOSEJMP(the_turf)]")
+ return TRUE
+ if("admin_message")
+ if(!usr || !authenticated)
+ return TRUE
+ if(!linked_server)
+ to_chat(usr, "The console flashes a message: 'ERROR: Server connection lost.'")
+ return TRUE
+ tgui_send_admin_pda(usr, src, linked_server)
+
+/obj/machinery/computer/message_monitor/ui_interact(mob/user, datum/tgui/ui)
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "MessageMonitor")
+ ui.open()
+ ui.set_autoupdate(TRUE)
/obj/item/paper/monitorkey
name = "monitor decryption key"
@@ -463,7 +287,21 @@
return INITIALIZE_HINT_LATELOAD
/obj/item/paper/monitorkey/proc/print(obj/machinery/telecomms/message_server/server)
- info = "Daily Key Reset
The new message monitor key is '[server.decryptkey]'.
Please keep this a secret and away from the clown.
If necessary, change the password to a more secure one."
+ info = "Telecommunications Security Notice
\
+ INCOMING TRANSMISSION - KEY RESET REPORT
\
+ \
+
\
+ REPORT: PREVIOUS SHIFT DATA WIPED.
\
+ KEY UPDATED.
\
+
\
+ Monitor Decryption Key: [server.decryptkey]\
+ \
+ \
+ PLEASE MAXIMIZE KEY SECURITY.
\
+ UPDATE KEY IF NECESSARY.
\
+ TRANSMISSION END.
\
+ SENDER: CentCom Telecommunications Data Retention\
+
"
add_overlay("paper_words")
/obj/item/paper/monitorkey/LateInitialize()
diff --git a/code/game/machinery/telecomms/machines/message_server.dm b/code/game/machinery/telecomms/machines/message_server.dm
index 5eccac38333..4cc0a278b90 100644
--- a/code/game/machinery/telecomms/machines/message_server.dm
+++ b/code/game/machinery/telecomms/machines/message_server.dm
@@ -80,7 +80,7 @@
active_power_usage = 100
circuit = /obj/item/circuitboard/machine/telecomms/message_server
- var/list/datum/data_pda_msg/pda_msgs = list()
+ var/list/datum/data_tablet_msg/modular_msgs = list()
var/list/datum/data_rc_msg/rc_msgs = list()
var/decryptkey = "password"
var/calibrating = 15 MINUTES //Init reads this and adds world.time, then becomes 0 when that time has passed and the machine works
@@ -93,15 +93,9 @@
if (calibrating)
calibrating += world.time
say("Calibrating... Estimated wait time: [rand(3, 9)] minutes.")
- pda_msgs += new /datum/data_pda_msg("System Administrator", "system", "This is an automated message. System calibration started at [station_time_timestamp()]")
+ modular_msgs += new /datum/data_tablet_msg("System Administrator", "system", "This is an automated message. System calibration started at [station_time_timestamp()].")
else
- pda_msgs += new /datum/data_pda_msg("System Administrator", "system", MESSAGE_SERVER_FUNCTIONING_MESSAGE)
-
-/obj/machinery/telecomms/message_server/Destroy()
- for(var/obj/machinery/computer/message_monitor/monitor in GLOB.telecomms_list)
- if(monitor.linkedServer && monitor.linkedServer == src)
- monitor.linkedServer = null
- . = ..()
+ modular_msgs += new /datum/data_tablet_msg("System Administrator", "system", MESSAGE_SERVER_FUNCTIONING_MESSAGE)
/obj/machinery/telecomms/message_server/examine(mob/user)
. = ..()
@@ -119,7 +113,7 @@
. = ..()
if(calibrating && calibrating <= world.time)
calibrating = 0
- pda_msgs += new /datum/data_pda_msg("System Administrator", "system", MESSAGE_SERVER_FUNCTIONING_MESSAGE)
+ modular_msgs += new /datum/data_tablet_msg("System Administrator", "system", MESSAGE_SERVER_FUNCTIONING_MESSAGE)
/obj/machinery/telecomms/message_server/receive_information(datum/signal/subspace/messaging/signal, obj/machinery/telecomms/machine_from)
// can't log non-message signals
@@ -127,16 +121,16 @@
return
// log the signal
- if(istype(signal, /datum/signal/subspace/messaging/pda))
- var/datum/signal/subspace/messaging/pda/PDAsignal = signal
- var/datum/data_pda_msg/M = new(PDAsignal.format_target(), "[PDAsignal.data["name"]] ([PDAsignal.data["job"]])", PDAsignal.data["message"], PDAsignal.data["photo"])
- pda_msgs += M
- signal.logged = M
+ if(istype(signal, /datum/signal/subspace/messaging/tablet_msg))
+ var/datum/signal/subspace/messaging/tablet_msg/PDAsignal = signal
+ var/datum/data_tablet_msg/msg = new(PDAsignal.format_target(), "[PDAsignal.data["name"]] ([PDAsignal.data["job"]])", PDAsignal.data["message"], PDAsignal.data["photo"], PDAsignal.data["emojis"])
+ modular_msgs += msg
+ signal.logged = msg
else if(istype(signal, /datum/signal/subspace/messaging/rc))
- var/datum/data_rc_msg/M = new(signal.data["rec_dpt"], signal.data["send_dpt"], signal.data["message"], signal.data["stamped"], signal.data["verified"], signal.data["priority"])
- signal.logged = M
+ var/datum/data_rc_msg/msg = new(signal.data["rec_dpt"], signal.data["send_dpt"], signal.data["message"], signal.data["stamped"], signal.data["verified"], signal.data["priority"])
+ signal.logged = msg
if(signal.data["send_dpt"]) // don't log messages not from a department but allow them to work
- rc_msgs += M
+ rc_msgs += msg
signal.data["reject"] = FALSE
// pass it along to either the hub or the broadcaster
@@ -170,23 +164,25 @@
copy.levels = levels
return copy
-// PDA signal datum
-/datum/signal/subspace/messaging/pda/proc/format_target()
+// Tablet message signal datum
+/datum/signal/subspace/messaging/tablet_msg/proc/format_target()
if (length(data["targets"]) > 1)
return "Everyone"
- return data["targets"][1]
+ var/obj/item/modular_computer/target = data["targets"][1]
+ return "[target.saved_identification] ([target.saved_job])"
-/datum/signal/subspace/messaging/pda/proc/format_message()
- if (logged && data["photo"])
+/datum/signal/subspace/messaging/tablet_msg/proc/format_message(include_photo = FALSE)
+ if (include_photo && logged && data["photo"])
return "\"[data["message"]]\" (Photo)"
return "\"[data["message"]]\""
-/datum/signal/subspace/messaging/pda/broadcast()
+/datum/signal/subspace/messaging/tablet_msg/broadcast()
if (!logged) // Can only go through if a message server logs it
return
- for (var/obj/item/pda/P in GLOB.PDAs)
- if ("[P.owner] ([P.ownjob])" in data["targets"])
- P.receive_message(src)
+ for (var/obj/item/modular_computer/comp in data["targets"])
+ var/obj/item/computer_hardware/hard_drive/drive = comp.all_components[MC_HDD]
+ for(var/datum/computer_file/program/messenger/app in drive.stored_files)
+ app.receive_message(src)
// Request Console signal datum
/datum/signal/subspace/messaging/rc/broadcast()
@@ -198,14 +194,16 @@
Console.createmessage(data["sender"], data["send_dpt"], data["message"], data["verified"], data["stamped"], data["priority"], data["notify_freq"])
// Log datums stored by the message server.
-/datum/data_pda_msg
+/datum/data_tablet_msg
var/sender = "Unspecified"
var/recipient = "Unspecified"
var/message = "Blank" // transferred message
var/datum/picture/picture // attached photo
- var/automated = 0 //automated message
+ var/automated = FALSE //automated message
+ /// If this message is allowed to render emojis
+ var/emojis = FALSE
-/datum/data_pda_msg/New(param_rec, param_sender, param_message, param_photo)
+/datum/data_tablet_msg/New(param_rec, param_sender, param_message, param_photo, param_emojis)
if(param_rec)
recipient = param_rec
if(param_sender)
@@ -214,16 +212,18 @@
message = param_message
if(param_photo)
picture = param_photo
+ if(param_emojis)
+ emojis = param_emojis
-/datum/data_pda_msg/Topic(href,href_list)
+/datum/data_tablet_msg/Topic(href,href_list)
..()
if(href_list["photo"])
var/mob/M = usr
M << browse_rsc(picture.picture_image, "pda_photo.png")
M << browse("PDA Photo" \
+ "" \
- + "
" \
- + "", "window=pdaphoto;size=[picture.psize_x]x[picture.psize_y];can-close=true")
+ + "
" \
+ + "