diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm index 9a00c826d3..4282731dd8 100644 --- a/code/__defines/misc.dm +++ b/code/__defines/misc.dm @@ -113,6 +113,7 @@ #define MAX_RECORD_LENGTH 24576 #define MAX_LNAME_LEN 64 #define MAX_NAME_LEN 52 +#define MAX_TEXTFILE_LENGTH 128000 // 512GQ file // Event defines. #define EVENT_LEVEL_MUNDANE 1 diff --git a/code/_macros.dm b/code/_macros.dm index 4549e01079..3860f63434 100644 --- a/code/_macros.dm +++ b/code/_macros.dm @@ -11,6 +11,7 @@ #define log_world(message) world.log << message #define to_file(file_entry, source_var) file_entry << source_var #define from_file(file_entry, target_var) file_entry >> target_var +#define show_browser(target, browser_content, browser_name) target << browse(browser_content, browser_name) // From TG, might be useful to have. // Didn't port SEND_TEXT() since to_chat() appears to serve the same purpose. diff --git a/code/modules/client/preference_setup/loadout/gear_tweaks.dm b/code/modules/client/preference_setup/loadout/gear_tweaks.dm index 7ddb6957a8..2b86685f17 100644 --- a/code/modules/client/preference_setup/loadout/gear_tweaks.dm +++ b/code/modules/client/preference_setup/loadout/gear_tweaks.dm @@ -289,3 +289,151 @@ if(ValidTeslaLinks[metadata[7]]) var/t = ValidTeslaLinks[metadata[7]] I.tesla_link = new t(I) + +/datum/gear_tweak/laptop + var/list/ValidProcessors = list(/obj/item/weapon/computer_hardware/processor_unit/small, /obj/item/weapon/computer_hardware/processor_unit) + var/list/ValidBatteries = list(/obj/item/weapon/computer_hardware/battery_module, /obj/item/weapon/computer_hardware/battery_module/advanced, /obj/item/weapon/computer_hardware/battery_module/super) + var/list/ValidHardDrives = list(/obj/item/weapon/computer_hardware/hard_drive, /obj/item/weapon/computer_hardware/hard_drive/advanced, /obj/item/weapon/computer_hardware/hard_drive/super) + var/list/ValidNetworkCards = list(/obj/item/weapon/computer_hardware/network_card, /obj/item/weapon/computer_hardware/network_card/advanced) + var/list/ValidNanoPrinters = list(null, /obj/item/weapon/computer_hardware/nano_printer) + var/list/ValidCardSlots = list(null, /obj/item/weapon/computer_hardware/card_slot) + var/list/ValidTeslaLinks = list(null, /obj/item/weapon/computer_hardware/tesla_link) + +/datum/gear_tweak/laptop/get_contents(var/list/metadata) + var/list/names = list() + var/obj/O = ValidProcessors[metadata[1]] + if(O) + names += initial(O.name) + O = ValidBatteries[metadata[2]] + if(O) + names += initial(O.name) + O = ValidHardDrives[metadata[3]] + if(O) + names += initial(O.name) + O = ValidNetworkCards[metadata[4]] + if(O) + names += initial(O.name) + O = ValidNanoPrinters[metadata[5]] + if(O) + names += initial(O.name) + O = ValidCardSlots[metadata[6]] + if(O) + names += initial(O.name) + O = ValidTeslaLinks[metadata[7]] + if(O) + names += initial(O.name) + return "[english_list(names, and_text = ", ")]" + +/datum/gear_tweak/laptop/get_metadata(var/user, var/metadata) + . = list() + + var/list/names = list() + var/counter = 1 + for(var/i in ValidProcessors) + if(i) + var/obj/O = i + names[initial(O.name)] = counter++ + else + names["None"] = counter++ + + var/entry = input(user, "Choose a processor.", "Character Preference") in names + . += names[entry] + + names = list() + counter = 1 + for(var/i in ValidBatteries) + if(i) + var/obj/O = i + names[initial(O.name)] = counter++ + else + names["None"] = counter++ + + entry = input(user, "Choose a battery.", "Character Preference") in names + . += names[entry] + + names = list() + counter = 1 + for(var/i in ValidHardDrives) + if(i) + var/obj/O = i + names[initial(O.name)] = counter++ + else + names["None"] = counter++ + + entry = input(user, "Choose a hard drive.", "Character Preference") in names + . += names[entry] + + names = list() + counter = 1 + for(var/i in ValidNetworkCards) + if(i) + var/obj/O = i + names[initial(O.name)] = counter++ + else + names["None"] = counter++ + + entry = input(user, "Choose a network card.", "Character Preference") in names + . += names[entry] + + names = list() + counter = 1 + for(var/i in ValidNanoPrinters) + if(i) + var/obj/O = i + names[initial(O.name)] = counter++ + else + names["None"] = counter++ + + entry = input(user, "Choose a nanoprinter.", "Character Preference") in names + . += names[entry] + + names = list() + counter = 1 + for(var/i in ValidCardSlots) + if(i) + var/obj/O = i + names[initial(O.name)] = counter++ + else + names["None"] = counter++ + + entry = input(user, "Choose a card slot.", "Character Preference") in names + . += names[entry] + + names = list() + counter = 1 + for(var/i in ValidTeslaLinks) + if(i) + var/obj/O = i + names[initial(O.name)] = counter++ + else + names["None"] = counter++ + + entry = input(user, "Choose a tesla link.", "Character Preference") in names + . += names[entry] + +/datum/gear_tweak/laptop/get_default() + return list(1, 1, 1, 1, 1, 1, 1) + +/datum/gear_tweak/laptop/tweak_item(var/obj/item/modular_computer/laptop/preset/I, var/list/metadata) + if(ValidProcessors[metadata[1]]) + var/t = ValidProcessors[metadata[1]] + I.processor_unit = new t(I) + if(ValidBatteries[metadata[2]]) + var/t = ValidBatteries[metadata[2]] + I.battery_module = new t(I) + I.battery_module.charge_to_full() + if(ValidHardDrives[metadata[3]]) + var/t = ValidHardDrives[metadata[3]] + I.hard_drive = new t(I) + if(ValidNetworkCards[metadata[4]]) + var/t = ValidNetworkCards[metadata[4]] + I.network_card = new t(I) + if(ValidNanoPrinters[metadata[5]]) + var/t = ValidNanoPrinters[metadata[5]] + I.nano_printer = new t(I) + if(ValidCardSlots[metadata[6]]) + var/t = ValidCardSlots[metadata[6]] + I.card_slot = new t(I) + if(ValidTeslaLinks[metadata[7]]) + var/t = ValidTeslaLinks[metadata[7]] + I.tesla_link = new t(I) diff --git a/code/modules/client/preference_setup/loadout/loadout_utility.dm b/code/modules/client/preference_setup/loadout/loadout_utility.dm index 091d732299..bd2977a94f 100644 --- a/code/modules/client/preference_setup/loadout/loadout_utility.dm +++ b/code/modules/client/preference_setup/loadout/loadout_utility.dm @@ -158,23 +158,47 @@ ..() gear_tweaks = list(gear_tweak_free_color_choice) +/**************** +modular computers +****************/ + /datum/gear/utility/cheaptablet - display_name = "cheap tablet computer" display_name = "tablet computer: cheap" + display_name = "tablet computer, cheap" path = /obj/item/modular_computer/tablet/preset/custom_loadout/cheap cost = 3 /datum/gear/utility/normaltablet - display_name = "tablet computer" display_name = "tablet computer: advanced" + display_name = "tablet computer, advanced" path = /obj/item/modular_computer/tablet/preset/custom_loadout/advanced cost = 4 /datum/gear/utility/customtablet display_name = "tablet computer: custom" + display_name = "tablet computer, custom" path = /obj/item/modular_computer/tablet cost = 4 /datum/gear/utility/customtablet/New() ..() - gear_tweaks += new /datum/gear_tweak/tablet() \ No newline at end of file + gear_tweaks += new /datum/gear_tweak/tablet() + +/datum/gear/utility/cheaplaptop + display_name = "laptop computer, cheap" + path = /obj/item/modular_computer/laptop/preset/custom_loadout/cheap + cost = 4 + +/datum/gear/utility/normallaptop + display_name = "laptop computer, advanced" + path = /obj/item/modular_computer/laptop/preset/custom_loadout/advanced + cost = 5 + +/datum/gear/utility/customlaptop + display_name = "laptop computer, custom" + path = /obj/item/modular_computer/laptop/preset/ + cost = 6 + +/datum/gear/utility/customlaptop/New() + ..() + gear_tweaks += new /datum/gear_tweak/laptop() diff --git a/code/modules/modular_computers/computers/modular_computer/core.dm b/code/modules/modular_computers/computers/modular_computer/core.dm index 5474fb1f40..30d9cf6039 100644 --- a/code/modules/modular_computers/computers/modular_computer/core.dm +++ b/code/modules/modular_computers/computers/modular_computer/core.dm @@ -82,6 +82,8 @@ set_light(light_strength) if(active_program) overlays.Add(active_program.program_icon_state ? active_program.program_icon_state : icon_state_menu) + if(active_program.program_key_state) + overlays.Add(active_program.program_key_state) else overlays.Add(icon_state_menu) diff --git a/code/modules/modular_computers/computers/modular_computer/interaction.dm b/code/modules/modular_computers/computers/modular_computer/interaction.dm index 89c35a56cf..bf70bb7d28 100644 --- a/code/modules/modular_computers/computers/modular_computer/interaction.dm +++ b/code/modules/modular_computers/computers/modular_computer/interaction.dm @@ -136,7 +136,7 @@ update_uis() to_chat(user, "You insert \the [I] into \the [src].") return - if(istype(W, /obj/item/weapon/paper)) + if(istype(W, /obj/item/weapon/paper) || istype(W, /obj/item/weapon/paper_bundle)) if(!nano_printer) return nano_printer.attackby(W, user) diff --git a/code/modules/modular_computers/computers/modular_computer/ui.dm b/code/modules/modular_computers/computers/modular_computer/ui.dm index cc4d23a4f4..81081c0cb1 100644 --- a/code/modules/modular_computers/computers/modular_computer/ui.dm +++ b/code/modules/modular_computers/computers/modular_computer/ui.dm @@ -31,6 +31,7 @@ var/list/program = list() program["name"] = P.filename program["desc"] = P.filedesc + program["icon"] = P.program_menu_icon program["autorun"] = (istype(autorun) && (autorun.stored_data == P.filename)) ? 1 : 0 if(P in idle_threads) program["running"] = 1 diff --git a/code/modules/modular_computers/computers/subtypes/dev_laptop.dm b/code/modules/modular_computers/computers/subtypes/dev_laptop.dm index 4aef23213f..eddae93f74 100644 --- a/code/modules/modular_computers/computers/subtypes/dev_laptop.dm +++ b/code/modules/modular_computers/computers/subtypes/dev_laptop.dm @@ -34,4 +34,4 @@ icon_state = icon_state_closed /obj/item/modular_computer/laptop/preset - anchored = FALSE \ No newline at end of file + anchored = FALSE diff --git a/code/modules/modular_computers/computers/subtypes/dev_tablet.dm b/code/modules/modular_computers/computers/subtypes/dev_tablet.dm index 7ebf646e10..62d12ba545 100644 --- a/code/modules/modular_computers/computers/subtypes/dev_tablet.dm +++ b/code/modules/modular_computers/computers/subtypes/dev_tablet.dm @@ -8,4 +8,9 @@ hardware_flag = PROGRAM_TABLET max_hardware_size = 1 w_class = ITEMSIZE_SMALL - light_strength = 2 // Same as PDAs \ No newline at end of file + light_strength = 2 // Same as PDAs + +/obj/item/modular_computer/tablet/lease + desc = "A small portable microcomputer. This one has a gold and blue stripe, and a serial number stamped into the case." + icon_state = "tabletsol" + icon_state_unpowered = "tabletsol" \ No newline at end of file diff --git a/code/modules/modular_computers/computers/subtypes/dev_telescreen.dm b/code/modules/modular_computers/computers/subtypes/dev_telescreen.dm index 95df05320d..1f88ed6cb2 100644 --- a/code/modules/modular_computers/computers/subtypes/dev_telescreen.dm +++ b/code/modules/modular_computers/computers/subtypes/dev_telescreen.dm @@ -1,6 +1,6 @@ /obj/item/modular_computer/telescreen name = "telescreen" - desc = "A stationary wall-mounted touchscreen" + desc = "A wall-mounted touchscreen computer." icon = 'icons/obj/modular_telescreen.dmi' icon_state = "telescreen" icon_state_unpowered = "telescreen" diff --git a/code/modules/modular_computers/computers/subtypes/preset_console.dm b/code/modules/modular_computers/computers/subtypes/preset_console.dm index 5b8735d79e..6bdb081202 100644 --- a/code/modules/modular_computers/computers/subtypes/preset_console.dm +++ b/code/modules/modular_computers/computers/subtypes/preset_console.dm @@ -20,6 +20,7 @@ ..() hard_drive.store_file(new/datum/computer_file/program/suit_sensors()) hard_drive.store_file(new/datum/computer_file/program/camera_monitor()) + hard_drive.store_file(new/datum/computer_file/program/wordprocessor()) set_autorun("sensormonitor") // Research @@ -35,6 +36,7 @@ hard_drive.store_file(new/datum/computer_file/program/camera_monitor()) //hard_drive.store_file(new/datum/computer_file/program/aidiag()) hard_drive.store_file(new/datum/computer_file/program/email_client()) + hard_drive.store_file(new/datum/computer_file/program/wordprocessor()) // Administrator /obj/item/modular_computer/console/preset/sysadmin/install_default_hardware() @@ -50,6 +52,7 @@ //hard_drive.store_file(new/datum/computer_file/program/aidiag()) hard_drive.store_file(new/datum/computer_file/program/email_client()) hard_drive.store_file(new/datum/computer_file/program/email_administration()) + hard_drive.store_file(new/datum/computer_file/program/wordprocessor()) // Command /obj/item/modular_computer/console/preset/command/install_default_hardware() @@ -70,6 +73,7 @@ ..() hard_drive.store_file(new/datum/computer_file/program/camera_monitor()) hard_drive.store_file(new/datum/computer_file/program/digitalwarrant()) + hard_drive.store_file(new/datum/computer_file/program/wordprocessor()) // Civilian /obj/item/modular_computer/console/preset/civilian/install_default_programs() @@ -79,6 +83,7 @@ hard_drive.store_file(new/datum/computer_file/program/newsbrowser()) hard_drive.store_file(new/datum/computer_file/program/camera_monitor()) hard_drive.store_file(new/datum/computer_file/program/email_client()) + hard_drive.store_file(new/datum/computer_file/program/wordprocessor()) // ERT /obj/item/modular_computer/console/preset/ert/install_default_hardware() @@ -114,4 +119,14 @@ // Merchant /obj/item/modular_computer/console/preset/merchant/install_default_programs() ..() - //hard_drive.store_file(new/datum/computer_file/program/merchant()) \ No newline at end of file + //hard_drive.store_file(new/datum/computer_file/program/merchant()) + hard_drive.store_file(new/datum/computer_file/program/wordprocessor()) + +// Library +/obj/item/modular_computer/console/preset/library/install_default_programs() + ..() + hard_drive.store_file(new/datum/computer_file/program/nttransfer()) + hard_drive.store_file(new/datum/computer_file/program/newsbrowser()) + hard_drive.store_file(new/datum/computer_file/program/email_client()) + hard_drive.store_file(new/datum/computer_file/program/wordprocessor()) + hard_drive.store_file(new/datum/computer_file/program/library()) diff --git a/code/modules/modular_computers/file_system/program.dm b/code/modules/modular_computers/file_system/program.dm index e699b009d8..7124bdcd03 100644 --- a/code/modules/modular_computers/file_system/program.dm +++ b/code/modules/modular_computers/file_system/program.dm @@ -12,6 +12,8 @@ var/filedesc = "Unknown Program" // User-friendly name of this program. var/extended_desc = "N/A" // Short description of this program's function. var/program_icon_state = null // Program-specific screen icon state + var/program_key_state = "standby_key" // Program-specific keyboard icon state + var/program_menu_icon = "newwin" // Icon to use for program's link in main menu var/requires_ntnet = 0 // Set to 1 for program to require nonstop NTNet connection to run. If NTNet connection is lost program crashes. var/requires_ntnet_feature = 0 // Optional, if above is set to 1 checks for specific function of NTNet (currently NTNET_SOFTWAREDOWNLOAD, NTNET_PEERTOPEER, NTNET_SYSTEMCONTROL and NTNET_COMMUNICATION) var/ntnet_status = 1 // NTNet status, updated every tick by computer running this program. Don't use this for checks if NTNet works, computers do that. Use this for calculations, etc. @@ -125,6 +127,7 @@ if(can_run(user, 1) || !requires_access_to_run) if(nanomodule_path) NM = new nanomodule_path(src, new /datum/topic_manager/program(src), src) + NM.using_access = user.GetAccess() if(requires_ntnet && network_destination) generate_network_log("Connection opened to [network_destination].") program_state = PROGRAM_STATE_ACTIVE diff --git a/code/modules/modular_computers/file_system/programs/antagonist/dos.dm b/code/modules/modular_computers/file_system/programs/antagonist/dos.dm index 44e5fd8cfe..0e0a1381bd 100644 --- a/code/modules/modular_computers/file_system/programs/antagonist/dos.dm +++ b/code/modules/modular_computers/file_system/programs/antagonist/dos.dm @@ -2,6 +2,8 @@ filename = "ntn_dos" filedesc = "DoS Traffic Generator" program_icon_state = "hostile" + program_key_state = "security_key" + program_menu_icon = "arrow-4-diag" extended_desc = "This advanced script can perform denial of service attacks against NTNet quantum relays. The system administrator will probably notice this. Multiple devices can run this program together against same relay for increased effect" size = 20 requires_ntnet = 1 diff --git a/code/modules/modular_computers/file_system/programs/antagonist/hacked_camera.dm b/code/modules/modular_computers/file_system/programs/antagonist/hacked_camera.dm index 4d224a5bed..27e5a26c3f 100644 --- a/code/modules/modular_computers/file_system/programs/antagonist/hacked_camera.dm +++ b/code/modules/modular_computers/file_system/programs/antagonist/hacked_camera.dm @@ -3,6 +3,8 @@ filedesc = "Camera Decryption Tool" nanomodule_path = /datum/nano_module/camera_monitor/hacked program_icon_state = "hostile" + program_key_state = "security_key" + program_menu_icon = "zoomin" extended_desc = "This very advanced piece of software uses adaptive programming and large database of cipherkeys to bypass most encryptions used on camera networks. Be warned that system administrator may notice this." size = 73 // Very large, a price for bypassing ID checks completely. available_on_ntnet = 0 diff --git a/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm b/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm index 1a5659d743..17199c3b18 100644 --- a/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm +++ b/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm @@ -2,6 +2,8 @@ filename = "revelation" filedesc = "Revelation" program_icon_state = "hostile" + program_key_state = "security_key" + program_menu_icon = "home" extended_desc = "This virus can destroy hard drive of system it is executed on. It may be obfuscated to look like another non-malicious program. Once armed, it will destroy the system upon next execution." size = 13 requires_ntnet = 0 @@ -48,6 +50,10 @@ if(!newname) return filedesc = newname + for(var/datum/computer_file/program/P in ntnet_global.available_station_software) + if(filedesc == P.filedesc) + program_menu_icon = P.program_menu_icon + break return 1 /datum/computer_file/program/revelation/clone() diff --git a/code/modules/modular_computers/file_system/programs/command/card.dm b/code/modules/modular_computers/file_system/programs/command/card.dm index 8aaab7ea0d..2b5c3a6047 100644 --- a/code/modules/modular_computers/file_system/programs/command/card.dm +++ b/code/modules/modular_computers/file_system/programs/command/card.dm @@ -3,7 +3,9 @@ filedesc = "ID card modification program" nanomodule_path = /datum/nano_module/program/card_mod program_icon_state = "id" - extended_desc = "Program for programming employee ID cards to access parts of the station." + program_key_state = "id_key" + program_menu_icon = "key" + extended_desc = "Program for programming crew ID cards." required_access = access_hop requires_ntnet = 0 size = 8 diff --git a/code/modules/modular_computers/file_system/programs/command/comm.dm b/code/modules/modular_computers/file_system/programs/command/comm.dm index 2089c987f3..8de74ed700 100644 --- a/code/modules/modular_computers/file_system/programs/command/comm.dm +++ b/code/modules/modular_computers/file_system/programs/command/comm.dm @@ -5,15 +5,17 @@ #define STATE_ALERT_LEVEL 5 /datum/computer_file/program/comm filename = "comm" - filedesc = "Command and communications program." + filedesc = "Command and Communications Program" program_icon_state = "comm" + program_key_state = "med_key" + program_menu_icon = "flag" nanomodule_path = /datum/nano_module/program/comm - extended_desc = "Used to command and control the station. Can relay long-range communications. This program can not be run on tablet computers." + extended_desc = "Used to command and control. Can relay long-range communications. This program can not be run on tablet computers." required_access = access_heads requires_ntnet = 1 size = 12 usage_flags = PROGRAM_CONSOLE | PROGRAM_LAPTOP - network_destination = "station long-range communication array" + network_destination = "long-range communication array" var/datum/comm_message_listener/message_core = new /datum/computer_file/program/comm/clone() @@ -23,7 +25,7 @@ return temp /datum/nano_module/program/comm - name = "Command and communications program" + name = "Command and Communications Program" //available_to_ai = TRUE var/current_status = STATE_DEFAULT var/msg_line1 = "" diff --git a/code/modules/modular_computers/file_system/programs/engineering/alarm_monitor.dm b/code/modules/modular_computers/file_system/programs/engineering/alarm_monitor.dm index b4d5635ffd..cfd9353eee 100644 --- a/code/modules/modular_computers/file_system/programs/engineering/alarm_monitor.dm +++ b/code/modules/modular_computers/file_system/programs/engineering/alarm_monitor.dm @@ -4,6 +4,8 @@ nanomodule_path = /datum/nano_module/alarm_monitor/engineering ui_header = "alarm_green.gif" program_icon_state = "alert-green" + program_key_state = "atmos_key" + program_menu_icon = "alert" extended_desc = "This program provides visual interface for the alarm system." requires_ntnet = 1 network_destination = "alarm monitoring network" @@ -43,7 +45,7 @@ /datum/nano_module/alarm_monitor/engineering/New() ..() - alarm_handlers = list(atmosphere_alarm, fire_alarm, power_alarm) + alarm_handlers = list(atmosphere_alarm, camera_alarm, fire_alarm, power_alarm) /datum/nano_module/alarm_monitor/security/New() ..() diff --git a/code/modules/modular_computers/file_system/programs/engineering/atmos_control.dm b/code/modules/modular_computers/file_system/programs/engineering/atmos_control.dm index fa3d43176b..3f88029713 100644 --- a/code/modules/modular_computers/file_system/programs/engineering/atmos_control.dm +++ b/code/modules/modular_computers/file_system/programs/engineering/atmos_control.dm @@ -3,6 +3,8 @@ filedesc = "Atmosphere Control" nanomodule_path = /datum/nano_module/atmos_control program_icon_state = "atmos_control" + program_key_state = "atmos_key" + program_menu_icon = "shuffle" extended_desc = "This program allows remote control of air alarms. This program can not be run on tablet computers." required_access = access_atmospherics requires_ntnet = 1 diff --git a/code/modules/modular_computers/file_system/programs/engineering/power_monitor.dm b/code/modules/modular_computers/file_system/programs/engineering/power_monitor.dm index 475a03cfdb..32117e845c 100644 --- a/code/modules/modular_computers/file_system/programs/engineering/power_monitor.dm +++ b/code/modules/modular_computers/file_system/programs/engineering/power_monitor.dm @@ -3,6 +3,8 @@ filedesc = "Power Monitoring" nanomodule_path = /datum/nano_module/power_monitor/ program_icon_state = "power_monitor" + program_key_state = "power_key" + program_menu_icon = "battery-3" extended_desc = "This program connects to sensors to provide information about electrical systems" ui_header = "power_norm.gif" required_access = access_engine diff --git a/code/modules/modular_computers/file_system/programs/engineering/rcon_console.dm b/code/modules/modular_computers/file_system/programs/engineering/rcon_console.dm index 0e22a3ba1e..d5ee88b670 100644 --- a/code/modules/modular_computers/file_system/programs/engineering/rcon_console.dm +++ b/code/modules/modular_computers/file_system/programs/engineering/rcon_console.dm @@ -3,6 +3,8 @@ filedesc = "RCON Remote Control" nanomodule_path = /datum/nano_module/rcon program_icon_state = "generic" + program_key_state = "rd_key" + program_menu_icon = "power" extended_desc = "This program allows remote control of power distribution systems. This program can not be run on tablet computers." required_access = access_engine requires_ntnet = 1 diff --git a/code/modules/modular_computers/file_system/programs/engineering/supermatter_monitor.dm b/code/modules/modular_computers/file_system/programs/engineering/supermatter_monitor.dm index bd60780c78..af0489a953 100644 --- a/code/modules/modular_computers/file_system/programs/engineering/supermatter_monitor.dm +++ b/code/modules/modular_computers/file_system/programs/engineering/supermatter_monitor.dm @@ -3,6 +3,8 @@ filedesc = "Supermatter Monitoring" nanomodule_path = /datum/nano_module/supermatter_monitor/ program_icon_state = "smmon_0" + program_key_state = "tech_key" + program_menu_icon = "notice" extended_desc = "This program connects to specially calibrated supermatter sensors to provide information on the status of supermatter-based engines." ui_header = "smmon_0.gif" required_access = access_engine diff --git a/code/modules/modular_computers/file_system/programs/generic/camera.dm b/code/modules/modular_computers/file_system/programs/generic/camera.dm index 7dde9c0d3f..47ac48eb40 100644 --- a/code/modules/modular_computers/file_system/programs/generic/camera.dm +++ b/code/modules/modular_computers/file_system/programs/generic/camera.dm @@ -29,6 +29,8 @@ filedesc = "Camera Monitoring" nanomodule_path = /datum/nano_module/camera_monitor program_icon_state = "cameras" + program_key_state = "generic_key" + program_menu_icon = "search" extended_desc = "This program allows remote access to the camera system. Some camera networks may have additional access requirements." size = 12 available_on_ntnet = 1 diff --git a/code/modules/modular_computers/file_system/programs/generic/configurator.dm b/code/modules/modular_computers/file_system/programs/generic/configurator.dm index 5867efbdcb..c3ce1e358a 100644 --- a/code/modules/modular_computers/file_system/programs/generic/configurator.dm +++ b/code/modules/modular_computers/file_system/programs/generic/configurator.dm @@ -7,6 +7,8 @@ filedesc = "Computer Configuration Tool" extended_desc = "This program allows configuration of computer's hardware" program_icon_state = "generic" + program_key_state = "generic_key" + program_menu_icon = "gear" unsendable = 1 undeletable = 1 size = 4 diff --git a/code/modules/modular_computers/file_system/programs/generic/email_client.dm b/code/modules/modular_computers/file_system/programs/generic/email_client.dm index 429a68c3a4..3e2f979bb5 100644 --- a/code/modules/modular_computers/file_system/programs/generic/email_client.dm +++ b/code/modules/modular_computers/file_system/programs/generic/email_client.dm @@ -3,6 +3,8 @@ filedesc = "Email Client" extended_desc = "This program may be used to log in into your email account." program_icon_state = "generic" + program_key_state = "generic_key" + program_menu_icon = "mail-closed" size = 7 requires_ntnet = 1 available_on_ntnet = 1 diff --git a/code/modules/modular_computers/file_system/programs/generic/file_browser.dm b/code/modules/modular_computers/file_system/programs/generic/file_browser.dm index 4311c2dedd..42dfdd622d 100644 --- a/code/modules/modular_computers/file_system/programs/generic/file_browser.dm +++ b/code/modules/modular_computers/file_system/programs/generic/file_browser.dm @@ -1,10 +1,10 @@ -#define MAX_TEXTFILE_LENGTH 128000 // 512GQ file - /datum/computer_file/program/filemanager filename = "filemanager" filedesc = "NTOS File Manager" extended_desc = "This program allows management of files." program_icon_state = "generic" + program_key_state = "generic_key" + program_menu_icon = "folder-collapsed" size = 8 requires_ntnet = 0 available_on_ntnet = 0 @@ -89,9 +89,9 @@ return 1 var/oldtext = html_decode(F.stored_data) - oldtext = replacetext(oldtext, "\[editorbr\]", "\n") + oldtext = replacetext(oldtext, "\[br\]", "\n") - var/newtext = sanitize(replacetext(input(usr, "Editing file [open_file]. You may use most tags used in paper formatting:", "Text Editor", oldtext) as message|null, "\n", "\[editorbr\]"), MAX_TEXTFILE_LENGTH) + var/newtext = sanitize(replacetext(input(usr, "Editing file [open_file]. You may use most tags used in paper formatting:", "Text Editor", oldtext) as message|null, "\n", "\[br\]"), MAX_TEXTFILE_LENGTH) if(!newtext) return @@ -204,5 +204,4 @@ ui = new(user, src, ui_key, "file_manager.tmpl", "NTOS File Manager", 575, 700, state = state) ui.auto_update_layout = 1 ui.set_initial_data(data) - ui.open() -#undef MAX_TEXTFILE_LENGTH \ No newline at end of file + ui.open() \ No newline at end of file diff --git a/code/modules/modular_computers/file_system/programs/generic/game.dm b/code/modules/modular_computers/file_system/programs/generic/game.dm index e947bea365..b4c0688c29 100644 --- a/code/modules/modular_computers/file_system/programs/generic/game.dm +++ b/code/modules/modular_computers/file_system/programs/generic/game.dm @@ -6,6 +6,7 @@ filename = "arcadec" // File name, as shown in the file browser program. filedesc = "Unknown Game" // User-Friendly name. In this case, we will generate a random name in constructor. program_icon_state = "game" // Icon state of this program's screen. + program_menu_icon = "script" extended_desc = "Fun for the whole family! Probably not an AAA title, but at least you can download it on the corporate network.." // A nice description. size = 5 // Size in GQ. Integers only. Smaller sizes should be used for utility/low use programs (like this one), while large sizes are for important programs. requires_ntnet = 0 // This particular program does not require NTNet network conectivity... diff --git a/code/modules/modular_computers/file_system/programs/generic/library.dm b/code/modules/modular_computers/file_system/programs/generic/library.dm new file mode 100644 index 0000000000..b686cda14e --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/generic/library.dm @@ -0,0 +1,191 @@ +/* +In reply to this set of comments on lib_machines.dm: +// TODO: Make this an actual /obj/machinery/computer that can be crafted from circuit boards and such +// It is August 22nd, 2012... This TODO has already been here for months.. I wonder how long it'll last before someone does something about it. + +The answer was five and a half years -ZeroBits +*/ + +/datum/computer_file/program/library + filename = "library" + filedesc = "Library" + extended_desc = "This program can be used to view e-books from an external archive." + program_icon_state = "word" + program_key_state = "atmos_key" + program_menu_icon = "note" + size = 6 + requires_ntnet = 1 + available_on_ntnet = 1 + + nanomodule_path = /datum/nano_module/library + +/datum/nano_module/library + name = "Library" + var/error_message = "" + var/current_book + var/obj/machinery/libraryscanner/scanner + var/sort_by = "id" + +/datum/nano_module/library/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) + var/list/data = host.initial_data() + + if(error_message) + data["error"] = error_message + else if(current_book) + data["current_book"] = current_book + else + var/list/all_entries[0] + establish_old_db_connection() + if(!dbcon_old.IsConnected()) + error_message = "Unable to contact External Archive. Please contact your system administrator for assistance." + else + var/DBQuery/query = dbcon_old.NewQuery("SELECT id, author, title, category FROM library ORDER BY "+sanitizeSQL(sort_by)) + query.Execute() + + while(query.NextRow()) + all_entries.Add(list(list( + "id" = query.item[1], + "author" = query.item[2], + "title" = query.item[3], + "category" = query.item[4] + ))) + data["book_list"] = all_entries + data["scanner"] = istype(scanner) + + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "library.tmpl", "Library Program", 575, 700, state = state) + ui.auto_update_layout = 1 + ui.set_initial_data(data) + ui.open() + +/datum/nano_module/library/Topic(href, href_list) + if(..()) + return 1 + if(href_list["viewbook"]) + view_book(href_list["viewbook"]) + return 1 + if(href_list["viewid"]) + view_book(sanitizeSQL(input("Enter USBN:") as num|null)) + return 1 + if(href_list["closebook"]) + current_book = null + return 1 + if(href_list["connectscanner"]) + if(!nano_host()) + return 1 + for(var/d in GLOB.cardinal) + var/obj/machinery/libraryscanner/scn = locate(/obj/machinery/libraryscanner, get_step(nano_host(), d)) + if(scn && scn.anchored) + scanner = scn + return 1 + if(href_list["uploadbook"]) + if(!scanner || !scanner.anchored) + scanner = null + error_message = "Hardware Error: No scanner detected. Unable to access cache." + return 1 + if(!scanner.cache) + error_message = "Interface Error: Scanner cache does not contain any data. Please scan a book." + return 1 + + var/obj/item/weapon/book/B = scanner.cache + + if(B.unique) + error_message = "Interface Error: Cached book is copy-protected." + return 1 + + //B.SetName(input(usr, "Enter Book Title", "Title", B.name) as text|null) + B.author = input(usr, "Enter Author Name", "Author", B.author) as text|null + + if(!B.author) + B.author = "Anonymous" + else if(lowertext(B.author) == "edgar allen poe" || lowertext(B.author) == "edgar allan poe") + error_message = "User Error: Upload something original." + return 1 + + if(!B.title) + B.title = "Untitled" + + var/choice = input(usr, "Upload [B.name] by [B.author] to the External Archive?") in list("Yes", "No") + if(choice == "Yes") + establish_old_db_connection() + if(!dbcon_old.IsConnected()) + error_message = "Network Error: Connection to the Archive has been severed." + return 1 + + var/upload_category = input(usr, "Upload to which category?") in list("Fiction", "Non-Fiction", "Reference", "Religion") + + var/sqltitle = sanitizeSQL(B.name) + var/sqlauthor = sanitizeSQL(B.author) + var/sqlcontent = sanitizeSQL(B.dat) + var/sqlcategory = sanitizeSQL(upload_category) + var/DBQuery/query = dbcon_old.NewQuery("INSERT INTO library (author, title, content, category) VALUES ('[sqlauthor]', '[sqltitle]', '[sqlcontent]', '[sqlcategory]')") + if(!query.Execute()) + to_chat(usr, query.ErrorMsg()) + error_message = "Network Error: Unable to upload to the Archive. Contact your system Administrator for assistance." + return 1 + else + log_and_message_admins("has uploaded the book titled [B.name], [length(B.dat)] signs") + log_game("[usr.name]/[usr.key] has uploaded the book titled [B.name], [length(B.dat)] signs") + alert("Upload Complete.") + return 1 + + return 0 + + if(href_list["printbook"]) + if(!current_book) + error_message = "Software Error: Unable to print; book not found." + return 1 + + //PRINT TO BINDER + if(!nano_host()) + return 1 + for(var/d in GLOB.cardinal) + var/obj/machinery/bookbinder/bndr = locate(/obj/machinery/bookbinder, get_step(nano_host(), d)) + if(bndr && bndr.anchored) + var/obj/item/weapon/book/B = new(bndr.loc) + //B.SetName(current_book["title"]) + B.title = current_book["title"] + B.author = current_book["author"] + B.dat = current_book["content"] + B.icon_state = "book[rand(1,7)]" + B.desc = current_book["author"]+", "+current_book["title"]+", "+"USBN "+current_book["id"] + bndr.visible_message("\The [bndr] whirs as it prints and binds a new book.") + return 1 + + //Regular printing + print_text("Author: [current_book["author"]]
USBN: [current_book["id"]]

[current_book["title"]]


[current_book["content"]]", usr) + return 1 + if(href_list["sortby"]) + sort_by = href_list["sortby"] + return 1 + if(href_list["reseterror"]) + if(error_message) + current_book = null + scanner = null + sort_by = "id" + error_message = "" + return 1 + +/datum/nano_module/library/proc/view_book(var/id) + if(current_book || !id) + return 0 + + var/sqlid = sanitizeSQL(id) + establish_old_db_connection() + if(!dbcon_old.IsConnected()) + error_message = "Network Error: Connection to the Archive has been severed." + return 1 + + var/DBQuery/query = dbcon_old.NewQuery("SELECT * FROM library WHERE id=[sqlid]") + query.Execute() + + while(query.NextRow()) + current_book = list( + "id" = query.item[1], + "author" = query.item[2], + "title" = query.item[3], + "content" = query.item[4] + ) + break + return 1 diff --git a/code/modules/modular_computers/file_system/programs/generic/news_browser.dm b/code/modules/modular_computers/file_system/programs/generic/news_browser.dm index d06741d934..1d4da6d4d5 100644 --- a/code/modules/modular_computers/file_system/programs/generic/news_browser.dm +++ b/code/modules/modular_computers/file_system/programs/generic/news_browser.dm @@ -3,6 +3,8 @@ filedesc = "NTNet/ExoNet News Browser" extended_desc = "This program may be used to view and download news articles from the network." program_icon_state = "generic" + program_key_state = "generic_key" + program_menu_icon = "contact" size = 4 requires_ntnet = 1 available_on_ntnet = 1 diff --git a/code/modules/modular_computers/file_system/programs/generic/ntdownloader.dm b/code/modules/modular_computers/file_system/programs/generic/ntdownloader.dm index 5968fea260..a0b2194168 100644 --- a/code/modules/modular_computers/file_system/programs/generic/ntdownloader.dm +++ b/code/modules/modular_computers/file_system/programs/generic/ntdownloader.dm @@ -2,6 +2,8 @@ filename = "ntndownloader" filedesc = "NTNet Software Download Tool" program_icon_state = "generic" + program_key_state = "generic_key" + program_menu_icon = "arrowthickstop-1-s" extended_desc = "This program allows downloads of software from official NT repositories" unsendable = 1 undeletable = 1 @@ -16,6 +18,7 @@ var/download_completion = 0 //GQ of downloaded data. var/download_netspeed = 0 var/downloaderror = "" + var/list/downloads_queue[0] /datum/computer_file/program/ntnetdownload/kill_program() ..() @@ -25,20 +28,14 @@ downloaderror = "" ui_header = "downloader_finished.gif" + /datum/computer_file/program/ntnetdownload/proc/begin_file_download(var/filename) if(downloaded_file) return 0 var/datum/computer_file/program/PRG = ntnet_global.find_ntnet_file_by_name(filename) - if(!PRG || !istype(PRG)) - return 0 - - // Attempting to download antag only program, but without having emagged computer. No. - if(PRG.available_on_syndinet && !computer_emagged) - return 0 - - if(!computer || !computer.hard_drive || !computer.hard_drive.try_store_file(PRG)) + if(!check_file_download(filename)) return 0 ui_header = "downloader_running.gif" @@ -55,6 +52,22 @@ downloaded_file = PRG.clone() +/datum/computer_file/program/ntnetdownload/proc/check_file_download(var/filename) + //returns 1 if file can be downloaded, returns 0 if download prohibited + var/datum/computer_file/program/PRG = ntnet_global.find_ntnet_file_by_name(filename) + + if(!PRG || !istype(PRG)) + return 0 + + // Attempting to download antag only program, but without having emagged computer. No. + if(PRG.available_on_syndinet && !computer_emagged) + return 0 + + if(!computer || !computer.hard_drive || !computer.hard_drive.try_store_file(PRG)) + return 0 + + return 1 + /datum/computer_file/program/ntnetdownload/proc/abort_file_download() if(!downloaded_file) return @@ -79,6 +92,10 @@ return if(download_completion >= downloaded_file.size) complete_file_download() + if(downloads_queue.len > 0) + begin_file_download(downloads_queue[1]) + downloads_queue.Remove(downloads_queue[1]) + // Download speed according to connectivity state. NTNet server is assumed to be on unlimited speed so we're limited by our local connectivity download_netspeed = 0 // Speed defines are found in misc.dm @@ -97,6 +114,11 @@ if(href_list["PRG_downloadfile"]) if(!downloaded_file) begin_file_download(href_list["PRG_downloadfile"]) + else if(check_file_download(href_list["PRG_downloadfile"]) && !downloads_queue.Find(href_list["PRG_downloadfile"]) && downloaded_file.filename != href_list["PRG_downloadfile"]) + downloads_queue += href_list["PRG_downloadfile"] + return 1 + if(href_list["PRG_removequeued"]) + downloads_queue.Remove(href_list["PRG_removequeued"]) return 1 if(href_list["PRG_reseterror"]) if(downloaderror) @@ -129,40 +151,46 @@ // This IF cuts on data transferred to client, so i guess it's worth it. if(prog.downloaderror) // Download errored. Wait until user resets the program. data["error"] = prog.downloaderror - else if(prog.downloaded_file) // Download running. Wait please.. + if(prog.downloaded_file) // Download running. Wait please.. data["downloadname"] = prog.downloaded_file.filename data["downloaddesc"] = prog.downloaded_file.filedesc data["downloadsize"] = prog.downloaded_file.size data["downloadspeed"] = prog.download_netspeed data["downloadcompletion"] = round(prog.download_completion, 0.1) - else // No download running, pick file. - data["disk_size"] = my_computer.hard_drive.max_capacity - data["disk_used"] = my_computer.hard_drive.used_capacity - var/list/all_entries[0] - for(var/datum/computer_file/program/P in ntnet_global.available_station_software) - // Only those programs our user can run will show in the list - if(!P.can_run(user) && P.requires_access_to_download) - continue - all_entries.Add(list(list( + + data["disk_size"] = my_computer.hard_drive.max_capacity + data["disk_used"] = my_computer.hard_drive.used_capacity + var/list/all_entries[0] + for(var/datum/computer_file/program/P in ntnet_global.available_station_software) + // Only those programs our user can run will show in the list + if(!P.can_run(user) && P.requires_access_to_download) + continue + all_entries.Add(list(list( + "filename" = P.filename, + "filedesc" = P.filedesc, + "fileinfo" = P.extended_desc, + "size" = P.size, + "icon" = P.program_menu_icon + ))) + data["hackedavailable"] = 0 + if(prog.computer_emagged) // If we are running on emagged computer we have access to some "bonus" software + var/list/hacked_programs[0] + for(var/datum/computer_file/program/P in ntnet_global.available_antag_software) + data["hackedavailable"] = 1 + hacked_programs.Add(list(list( "filename" = P.filename, "filedesc" = P.filedesc, "fileinfo" = P.extended_desc, - "size" = P.size + "size" = P.size, + "icon" = P.program_menu_icon ))) - data["hackedavailable"] = 0 - if(prog.computer_emagged) // If we are running on emagged computer we have access to some "bonus" software - var/list/hacked_programs[0] - for(var/datum/computer_file/program/P in ntnet_global.available_antag_software) - data["hackedavailable"] = 1 - hacked_programs.Add(list(list( - "filename" = P.filename, - "filedesc" = P.filedesc, - "fileinfo" = P.extended_desc, - "size" = P.size - ))) - data["hacked_programs"] = hacked_programs + data["hacked_programs"] = hacked_programs + + data["downloadable_programs"] = all_entries + + if(prog.downloads_queue.len > 0) + data["downloads_queue"] = prog.downloads_queue - data["downloadable_programs"] = all_entries ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "ntnet_downloader.tmpl", "NTNet Download Program", 575, 700, state = state) diff --git a/code/modules/modular_computers/file_system/programs/generic/ntnrc_client.dm b/code/modules/modular_computers/file_system/programs/generic/ntnrc_client.dm index 5b384ba4e8..6c67c02c0d 100644 --- a/code/modules/modular_computers/file_system/programs/generic/ntnrc_client.dm +++ b/code/modules/modular_computers/file_system/programs/generic/ntnrc_client.dm @@ -2,6 +2,8 @@ filename = "ntnrc_client" filedesc = "NTNet Relay Chat Client" program_icon_state = "command" + program_key_state = "med_key" + program_menu_icon = "comment" extended_desc = "This program allows communication over NTNRC network" size = 8 requires_ntnet = 1 diff --git a/code/modules/modular_computers/file_system/programs/generic/nttransfer.dm b/code/modules/modular_computers/file_system/programs/generic/nttransfer.dm index 9630613397..0efed986ae 100644 --- a/code/modules/modular_computers/file_system/programs/generic/nttransfer.dm +++ b/code/modules/modular_computers/file_system/programs/generic/nttransfer.dm @@ -5,6 +5,8 @@ var/global/nttransfer_uid = 0 filedesc = "NTNet P2P Transfer Client" extended_desc = "This program allows for simple file transfer via direct peer to peer connection." program_icon_state = "comm_logs" + program_key_state = "generic_key" + program_menu_icon = "transferthick-e-w" size = 7 requires_ntnet = 1 requires_ntnet_feature = NTNET_PEERTOPEER @@ -29,6 +31,7 @@ var/global/nttransfer_uid = 0 ..() /datum/computer_file/program/nttransfer/process_tick() + ..() // Server mode if(provided_file) for(var/datum/computer_file/program/nttransfer/C in connected_clients) diff --git a/code/modules/modular_computers/file_system/programs/generic/wordprocessor.dm b/code/modules/modular_computers/file_system/programs/generic/wordprocessor.dm new file mode 100644 index 0000000000..24c43669be --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/generic/wordprocessor.dm @@ -0,0 +1,236 @@ +/datum/computer_file/program/wordprocessor + filename = "wordprocessor" + filedesc = "NanoWord" + extended_desc = "This program allows the editing and preview of text documents." + program_icon_state = "word" + program_key_state = "atmos_key" + size = 4 + requires_ntnet = 0 + available_on_ntnet = 1 + nanomodule_path = /datum/nano_module/program/computer_wordprocessor/ + var/browsing + var/open_file + var/loaded_data + var/error + var/is_edited + +/datum/computer_file/program/wordprocessor/proc/get_file(var/filename) + var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.hard_drive + if(!HDD) + return + var/datum/computer_file/data/F = HDD.find_file_by_name(filename) + if(!istype(F)) + return + return F + +/datum/computer_file/program/wordprocessor/proc/open_file(var/filename) + var/datum/computer_file/data/F = get_file(filename) + if(F) + open_file = F.filename + loaded_data = F.stored_data + return 1 + +/datum/computer_file/program/wordprocessor/proc/save_file(var/filename) + var/datum/computer_file/data/F = get_file(filename) + if(!F) //try to make one if it doesn't exist + F = create_file(filename, loaded_data) + return !isnull(F) + var/datum/computer_file/data/backup = F.clone() + var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.hard_drive + if(!HDD) + return + HDD.remove_file(F) + F.stored_data = loaded_data + F.calculate_size() + if(!HDD.store_file(F)) + HDD.store_file(backup) + return 0 + is_edited = 0 + return 1 + +/datum/computer_file/program/wordprocessor/proc/create_file(var/newname, var/data = "") + if(!newname) + return + var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.hard_drive + if(!HDD) + return + if(get_file(newname)) + return + var/datum/computer_file/data/F = new/datum/computer_file/data() + F.filename = newname + F.filetype = "TXT" + F.stored_data = data + F.calculate_size() + if(HDD.store_file(F)) + return F + +/datum/computer_file/program/wordprocessor/Topic(href, href_list) + if(..()) + return 1 + + if(href_list["PRG_txtrpeview"]) + show_browser(usr,"[open_file][pencode2html(loaded_data)]", "window=[open_file]") + return 1 + + if(href_list["PRG_taghelp"]) + to_chat(usr, "The hologram of a googly-eyed paper clip helpfully tells you:") + var/help = {" + \[br\] : Creates a linebreak. + \[center\] - \[/center\] : Centers the text. + \[h1\] - \[/h1\] : First level heading. + \[h2\] - \[/h2\] : Second level heading. + \[h3\] - \[/h3\] : Third level heading. + \[b\] - \[/b\] : Bold. + \[i\] - \[/i\] : Italic. + \[u\] - \[/u\] : Underlined. + \[small\] - \[/small\] : Decreases the size of the text. + \[large\] - \[/large\] : Increases the size of the text. + \[field\] : Inserts a blank text field, which can be filled later. Useful for forms. + \[date\] : Current station date. + \[time\] : Current station time. + \[list\] - \[/list\] : Begins and ends a list. + \[*\] : A list item. + \[hr\] : Horizontal rule. + \[table\] - \[/table\] : Creates table using \[row\] and \[cell\] tags. + \[grid\] - \[/grid\] : Table without visible borders, for layouts. + \[row\] - New table row. + \[cell\] - New table cell. + \[logo\] - Inserts NT logo image. + \[bluelogo\] - Inserts blue NT logo image. + \[solcrest\] - Inserts SCG crest image. + \[terraseal\] - Inserts TCC seal"} + + to_chat(usr, help) + return 1 + + if(href_list["PRG_closebrowser"]) + browsing = 0 + return 1 + + if(href_list["PRG_backtomenu"]) + error = null + return 1 + + if(href_list["PRG_loadmenu"]) + browsing = 1 + return 1 + + if(href_list["PRG_openfile"]) + . = 1 + if(is_edited) + if(alert("Would you like to save your changes first?",,"Yes","No") == "Yes") + save_file(open_file) + browsing = 0 + if(!open_file(href_list["PRG_openfile"])) + error = "I/O error: Unable to open file '[href_list["PRG_openfile"]]'." + + if(href_list["PRG_newfile"]) + . = 1 + if(is_edited) + if(alert("Would you like to save your changes first?",,"Yes","No") == "Yes") + save_file(open_file) + + var/newname = sanitize(input(usr, "Enter file name:", "New File") as text|null) + if(!newname) + return 1 + var/datum/computer_file/data/F = create_file(newname) + if(F) + open_file = F.filename + loaded_data = "" + return 1 + else + error = "I/O error: Unable to create file '[href_list["PRG_saveasfile"]]'." + + if(href_list["PRG_saveasfile"]) + . = 1 + var/newname = sanitize(input(usr, "Enter file name:", "Save As") as text|null) + if(!newname) + return 1 + var/datum/computer_file/data/F = create_file(newname, loaded_data) + if(F) + open_file = F.filename + else + error = "I/O error: Unable to create file '[href_list["PRG_saveasfile"]]'." + return 1 + + if(href_list["PRG_savefile"]) + . = 1 + if(!open_file) + open_file = sanitize(input(usr, "Enter file name:", "Save As") as text|null) + if(!open_file) + return 0 + if(!save_file(open_file)) + error = "I/O error: Unable to save file '[open_file]'." + return 1 + + if(href_list["PRG_editfile"]) + var/oldtext = html_decode(loaded_data) + oldtext = replacetext(oldtext, "\[br\]", "\n") + + var/newtext = sanitize(replacetext(input(usr, "Editing file '[open_file]'. You may use most tags used in paper formatting:", "Text Editor", oldtext) as message|null, "\n", "\[br\]"), MAX_TEXTFILE_LENGTH) + if(!newtext) + return + loaded_data = newtext + is_edited = 1 + return 1 + + if(href_list["PRG_printfile"]) + . = 1 + if(!computer.nano_printer) + error = "Missing Hardware: Your computer does not have the required hardware to complete this operation." + return 1 + if(!computer.nano_printer.print_text(pencode2html(loaded_data))) + error = "Hardware error: Printer was unable to print the file. It may be out of paper." + return 1 + +/datum/nano_module/program/computer_wordprocessor + name = "Word Processor" + +/datum/nano_module/program/computer_wordprocessor/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) + var/list/data = host.initial_data() + var/datum/computer_file/program/wordprocessor/PRG + PRG = program + + var/obj/item/weapon/computer_hardware/hard_drive/HDD + var/obj/item/weapon/computer_hardware/hard_drive/portable/RHDD + if(PRG.error) + data["error"] = PRG.error + if(PRG.browsing) + data["browsing"] = PRG.browsing + if(!PRG.computer || !PRG.computer.hard_drive) + data["error"] = "I/O ERROR: Unable to access hard drive." + else + HDD = PRG.computer.hard_drive + var/list/files[0] + for(var/datum/computer_file/F in HDD.stored_files) + if(F.filetype == "TXT") + files.Add(list(list( + "name" = F.filename, + "size" = F.size + ))) + data["files"] = files + + RHDD = PRG.computer.portable_drive + if(RHDD) + data["usbconnected"] = 1 + var/list/usbfiles[0] + for(var/datum/computer_file/F in RHDD.stored_files) + if(F.filetype == "TXT") + usbfiles.Add(list(list( + "name" = F.filename, + "size" = F.size, + ))) + data["usbfiles"] = usbfiles + else if(PRG.open_file) + data["filedata"] = pencode2html(PRG.loaded_data) + data["filename"] = PRG.is_edited ? "[PRG.open_file]*" : PRG.open_file + else + data["filedata"] = pencode2html(PRG.loaded_data) + data["filename"] = "UNNAMED" + + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "word_processor.tmpl", "Word Processor", 575, 700, state = state) + ui.auto_update_layout = 1 + ui.set_initial_data(data) + ui.open() \ No newline at end of file diff --git a/code/modules/modular_computers/file_system/programs/medical/suit_sensors.dm b/code/modules/modular_computers/file_system/programs/medical/suit_sensors.dm index 3e83dd2248..86ccaa73bc 100644 --- a/code/modules/modular_computers/file_system/programs/medical/suit_sensors.dm +++ b/code/modules/modular_computers/file_system/programs/medical/suit_sensors.dm @@ -3,12 +3,18 @@ filedesc = "Suit Sensors Monitoring" nanomodule_path = /datum/nano_module/crew_monitor program_icon_state = "crew" + program_key_state = "med_key" + program_menu_icon = "heart" extended_desc = "This program connects to life signs monitoring system to provide basic information on crew health." required_access = access_medical requires_ntnet = 1 network_destination = "crew lifesigns monitoring system" size = 11 + + + + /datum/nano_module/crew_monitor name = "Crew monitor" diff --git a/code/modules/modular_computers/file_system/programs/research/email_administration.dm b/code/modules/modular_computers/file_system/programs/research/email_administration.dm index 5e9a7a1bc1..93ba0bded3 100644 --- a/code/modules/modular_computers/file_system/programs/research/email_administration.dm +++ b/code/modules/modular_computers/file_system/programs/research/email_administration.dm @@ -3,6 +3,8 @@ filedesc = "Email Administration Utility" extended_desc = "This program may be used to administrate NTNet's emailing service." program_icon_state = "comm_monitor" + program_key_state = "generic_key" + program_menu_icon = "mail-open" size = 12 requires_ntnet = 1 available_on_ntnet = 1 diff --git a/code/modules/modular_computers/file_system/programs/research/ntmonitor.dm b/code/modules/modular_computers/file_system/programs/research/ntmonitor.dm index 8b28f71fc7..590837f2b5 100644 --- a/code/modules/modular_computers/file_system/programs/research/ntmonitor.dm +++ b/code/modules/modular_computers/file_system/programs/research/ntmonitor.dm @@ -2,6 +2,8 @@ filename = "ntmonitor" filedesc = "NTNet Diagnostics and Monitoring" program_icon_state = "comm_monitor" + program_key_state = "generic_key" + program_menu_icon = "wrench" extended_desc = "This program monitors the local NTNet network, provides access to logging systems, and allows for configuration changes" size = 12 requires_ntnet = 1 diff --git a/code/modules/modular_computers/file_system/programs/security/digitalwarrant.dm b/code/modules/modular_computers/file_system/programs/security/digitalwarrant.dm index ed7b404b75..28ca1b73f5 100644 --- a/code/modules/modular_computers/file_system/programs/security/digitalwarrant.dm +++ b/code/modules/modular_computers/file_system/programs/security/digitalwarrant.dm @@ -14,6 +14,8 @@ var/warrant_uid = 0 extended_desc = "Official NTsec program for creation and handling of warrants." size = 8 program_icon_state = "warrant" + program_key_state = "security_key" + program_menu_icon = "star" requires_ntnet = 1 available_on_ntnet = 1 required_access = access_security diff --git a/code/modules/modular_computers/hardware/nano_printer.dm b/code/modules/modular_computers/hardware/nano_printer.dm index ac5816345b..0eb2a7b065 100644 --- a/code/modules/modular_computers/hardware/nano_printer.dm +++ b/code/modules/modular_computers/hardware/nano_printer.dm @@ -32,12 +32,37 @@ /obj/item/weapon/computer_hardware/nano_printer/attackby(obj/item/W as obj, mob/user as mob) if(istype(W, /obj/item/weapon/paper)) if(stored_paper >= max_paper) - to_chat(user, "You try to add \the [W] into [src], but it's paper bin is full") + to_chat(user, "You try to add \the [W] into \the [src], but its paper bin is full.") return to_chat(user, "You insert \the [W] into [src].") qdel(W) stored_paper++ + else if(istype(W, /obj/item/weapon/paper_bundle)) + var/obj/item/weapon/paper_bundle/B = W + var/num_of_pages_added = 0 + if(stored_paper >= max_paper) + to_chat(user, "You try to add \the [W] into \the [src], but its paper bin is full.") + return + for(var/obj/item/weapon/bundleitem in B) //loop through items in bundle + if(istype(bundleitem, /obj/item/weapon/paper)) //if item is paper (and not photo), add into the bin + B.pages.Remove(bundleitem) + qdel(bundleitem) + num_of_pages_added++ + stored_paper++ + if(stored_paper >= max_paper) //check if the printer is full yet + to_chat(user, "The printer has been filled to full capacity.") + break + if(B.pages.len == 0) //if all its papers have been put into the printer, delete bundle + qdel(W) + else if(B.pages.len == 1) //if only one item left, extract item and delete the one-item bundle + user.drop_from_inventory(B) + user.put_in_hands(B[1]) + qdel(B) + else //if at least two items remain, just update the bundle icon + B.update_icon() + to_chat(user, "You add [num_of_pages_added] papers from \the [W] into \the [src].") + return /obj/item/weapon/computer_hardware/nano_printer/Destroy() if(holder2 && (holder2.nano_printer == src)) diff --git a/code/modules/nano/modules/nano_module.dm b/code/modules/nano/modules/nano_module.dm index e5e0bf64f1..90c213da1c 100644 --- a/code/modules/nano/modules/nano_module.dm +++ b/code/modules/nano/modules/nano_module.dm @@ -2,6 +2,7 @@ var/name var/datum/host var/datum/topic_manager/topic_manager + var/list/using_access /datum/nano_module/New(var/datum/host, var/topic_manager) ..() @@ -21,6 +22,12 @@ if(!access) return 1 + if(using_access) + if(access in using_access) + return 1 + else + return 0 + if(!istype(user)) return 0 @@ -38,6 +45,18 @@ return TRUE . = ..() +/datum/nano_module/proc/print_text(var/text, var/mob/user) + var/obj/item/modular_computer/MC = nano_host() + if(istype(MC)) + if(!MC.nano_printer) + to_chat(user, "Error: No printer detected. Unable to print document.") + return + + if(!MC.nano_printer.print_text(text)) + to_chat(user, "Error: Printer was unable to print the document. It may be out of paper.") + else + to_chat(user, "Error: Unable to detect compatible printer interface. Are you running NTOSv2 compatible system?") + /datum/proc/initial_data() return list() diff --git a/icons/obj/modular_console.dmi b/icons/obj/modular_console.dmi index 7d28d26da9..e16c2c7be8 100644 Binary files a/icons/obj/modular_console.dmi and b/icons/obj/modular_console.dmi differ diff --git a/icons/obj/modular_laptop.dmi b/icons/obj/modular_laptop.dmi index e0ad11b6da..af1883055e 100644 Binary files a/icons/obj/modular_laptop.dmi and b/icons/obj/modular_laptop.dmi differ diff --git a/icons/obj/modular_tablet.dmi b/icons/obj/modular_tablet.dmi index 1e7b8d253d..5c86d27d89 100644 Binary files a/icons/obj/modular_tablet.dmi and b/icons/obj/modular_tablet.dmi differ diff --git a/icons/obj/modular_telescreen.dmi b/icons/obj/modular_telescreen.dmi index 30c7b8da22..2b82cdb11f 100644 Binary files a/icons/obj/modular_telescreen.dmi and b/icons/obj/modular_telescreen.dmi differ diff --git a/nano/templates/arcade_classic.tmpl b/nano/templates/arcade_classic.tmpl index 5792a15b6e..996e8e4715 100644 --- a/nano/templates/arcade_classic.tmpl +++ b/nano/templates/arcade_classic.tmpl @@ -1,44 +1,44 @@ {{if data.gameover}} - centerh2Game Over!h2 - h3{{data.information}}h3 - {{helper.link('New Game', null, { new_game 1 })}}center +

Game Over!

+

{{:data.information}}

+ {{:helper.link('New Game', null, { "new_game" : 1 })}}
{{else}} {{if data.information}} - centeri{{data.information}}icenter - {{if}} -centerh3Playerh3center - div class='item' - div class='itemLabel' - Health - div - div class='itemContent' - {{data.player_health}} - div - div class='itemLabel' - Mana - div - div class='itemContent' - {{data.player_mana}} - div - div -centerh3Enemy {{data.enemy_name}}h3center - div class='item' - div class='itemLabel' - Health - div - div class='itemContent' - {{data.enemy_health}} - div - div class='itemLabel' - Mana - div - div class='itemContent' - {{data.enemy_mana}} - div - div -centerh3Actionsh3center - {{helper.link('Attack', null, { attack 1 })}} - {{helper.link('Heal', null, { heal 1 })}} - {{helper.link('Regain Mana', null, { regain_mana 1 })}} - {{helper.link('New Game', null, { new_game 1 })}} -{{if}} \ No newline at end of file +
{{:data.information}}
+ {{/if}} +

Player

+
+
+ Health: +
+
+ {{:data.player_health}} +
+
+ Mana: +
+
+ {{:data.player_mana}} +
+
+

Enemy: {{:data.enemy_name}}

+
+
+ Health: +
+
+ {{:data.enemy_health}} +
+
+ Mana: +
+
+ {{:data.enemy_mana}} +
+
+

Actions

+ {{:helper.link('Attack', null, { "attack" : 1 })}} + {{:helper.link('Heal', null, { "heal" : 1 })}} + {{:helper.link('Regain Mana', null, { "regain_mana" : 1 })}} + {{:helper.link('New Game', null, { "new_game" : 1 })}} +{{/if}} \ No newline at end of file diff --git a/nano/templates/laptop_configuration.tmpl b/nano/templates/laptop_configuration.tmpl index bd9197feff..69af3bd6c0 100644 --- a/nano/templates/laptop_configuration.tmpl +++ b/nano/templates/laptop_configuration.tmpl @@ -67,4 +67,4 @@

{{/for}}

-NTOS v2.0.4b Copyright NanoTrasen 2557 - 2559 \ No newline at end of file +NTOS v2.0.4b Copyright NanoTrasen 2557 - 2559 \ No newline at end of file diff --git a/nano/templates/laptop_mainscreen.tmpl b/nano/templates/laptop_mainscreen.tmpl index 4e3479b989..9d7804ae72 100644 --- a/nano/templates/laptop_mainscreen.tmpl +++ b/nano/templates/laptop_mainscreen.tmpl @@ -1,8 +1,8 @@ No program loaded. Please select program from list below. {{for data.programs}} -
{{:helper.link(value.desc, null, {'PC_runprogram' : value.name})}} - {{:helper.link('X', null, {'PC_killprogram' : value.name}, (value.running ? null : 'disabled'))}} - {{:helper.link('AR', null, {'PC_setautorun' : value.name}, null, (value.autorun ? 'yellowButton' : null))}} +
{{:helper.link(value.desc, value.icon, {'PC_runprogram' : value.name})}} + {{:helper.link('X', null, {'PC_killprogram' : value.name}, (value.running ? null : 'disabled'))}} + {{:helper.link('AR', null, {'PC_setautorun' : value.name}, null, (value.autorun ? 'yellowButton' : null))}} {{/for}} -
\ No newline at end of file + \ No newline at end of file diff --git a/nano/templates/library.tmpl b/nano/templates/library.tmpl new file mode 100644 index 0000000000..fa8f3f6622 --- /dev/null +++ b/nano/templates/library.tmpl @@ -0,0 +1,75 @@ +{{if data.error}} +

Error

+ {{:data.error}}

+ {{:helper.link("Reset", null, {'reseterror' : 1})}} +{{else data.current_book}} +

{{:data.current_book.title}}

+
+
+ Author: +
+
+ {{:data.current_book.author}} +
+
+ USBN: +
+
+ {{:data.current_book.id}} +
+
+ Commands: +
+
+ {{:helper.link("Close", null, {'closebook' : 1})}} + {{:helper.link("Print", null, {'printbook' : 1})}} +
+
+
+ {{:data.current_book.content}} +
+{{else}} +

External Archives

+
+
+ Scanner: +
+
+ {{:data.scanner ? 'Connected' : 'Not Connected'}} +
+
+
+
+ Commands: +
+
+ {{:helper.link("View By USBN", null, {'viewid' : 1})}} + {{:helper.link("Upload From Scanner", null, {'uploadbook' : 1})}} + {{:helper.link("Connect to Scanner", null, {'connectscanner' : 1})}} +
+
+
+
+ Sort by: +
+
+ {{:helper.link("Title", null, {'sortby' : 'title'})}} + {{:helper.link("Author", null, {'sortby' : 'author'})}} + {{:helper.link("Category", null, {'sortby' : 'category'})}} + {{:helper.link("USBN", null, {'sortby' : 'id'})}} +
+
+ + +
CommandsTitleAuthorCategoryUSBN + {{for data.book_list}} +
{{:helper.link("View", null, {'viewbook' : value.id})}} + {{:value.title}} + {{:value.author}} + {{:value.category}} + {{:value.id}} + + {{/for}} +
+{{/if}} +


NTOS v2.0.4b Copyright NanoTrasen 2557 - 2561 diff --git a/nano/templates/news_browser.tmpl b/nano/templates/news_browser.tmpl index 17b02614f3..ed32814bec 100644 --- a/nano/templates/news_browser.tmpl +++ b/nano/templates/news_browser.tmpl @@ -1,3 +1,4 @@ + {{if data.message}}
{{:data.message}} @@ -5,14 +6,15 @@
{{/if}} {{if data.article}} - Viewing: {{:data.title}}

- - {{:data.article}} - -

+ Viewing: {{:data.title}}
{{:helper.link('CLOSE', null, { "PRG_reset" : 1 })}} {{:helper.link('SAVE', null, { "PRG_savearticle" : 1 })}} -{{else data.download_progress}} +

+ {{if data.cover}} + + {{/if}} + {{:data.article}} +{{else data.download_running}} Downloading file...

@@ -26,37 +28,50 @@ Download speed:
- {{data.download_rate}} GQ/s + {{:data.download_rate}} GQ/s
Controls:
{{:helper.link('ABORT', null, { "PRG_reset" : 1 })}} -
+
{{else}} - Listing available files
+

Listing available files

+
+
+ Show archived files: +
+
+ {{if data.showing_archived}} + {{:helper.link('YES', null, { "PRG_toggle_archived" : 1 })}} + {{else}} + {{:helper.link('NO', null, { "PRG_toggle_archived" : 1 })}} + {{/if}} +
+
+

{{for data.all_articles}}
- Name: + Name:
{{:value.name}}
- Size: + Size:
{{:value.size}} GQ
- Actions: + Actions:
{{:helper.link('OPEN', null, { "PRG_openarticle" : value.uid })}}
{{/for}} -{{/if}} \ No newline at end of file +{{/if}} diff --git a/nano/templates/ntnet_chat.tmpl b/nano/templates/ntnet_chat.tmpl index b91afd613c..592b648177 100644 --- a/nano/templates/ntnet_chat.tmpl +++ b/nano/templates/ntnet_chat.tmpl @@ -63,4 +63,4 @@ {{:helper.link(value.chan, null, {'PRG_joinchannel' : value.id})}}
{{/for}} -{{/if}} \ No newline at end of file +{{/if}} \ No newline at end of file diff --git a/nano/templates/ntnet_dos.tmpl b/nano/templates/ntnet_dos.tmpl index c8562706cc..1ddf8eb06e 100644 --- a/nano/templates/ntnet_dos.tmpl +++ b/nano/templates/ntnet_dos.tmpl @@ -19,4 +19,4 @@ {{for data.relays}} {{:helper.link(value , null, { 'PRG_target_relay' : value })}} {{/for}} -{{/if}} \ No newline at end of file +{{/if}} \ No newline at end of file diff --git a/nano/templates/ntnet_downloader.tmpl b/nano/templates/ntnet_downloader.tmpl index 0bce1ff451..b53f36d696 100644 --- a/nano/templates/ntnet_downloader.tmpl +++ b/nano/templates/ntnet_downloader.tmpl @@ -1,4 +1,4 @@ -Welcome to software download utility. Please select which software you wish to download.
+Welcome to the software download utility. Please select which software you wish to download.
{{if data.error}}

Download Error

@@ -13,40 +13,62 @@
{{:helper.link("RESET", null, {'PRG_reseterror' : 1})}}
-{{else data.downloadname}} -

Download Running

- Please wait... -
- File name: +
+{{/if}} + +

{{:data.downloadname ? 'Download Running' : 'No Downloads In Progress'}}

+ {{:data.downloadname ? 'Please wait...' : 'Standing by...'}} +
+
+ File name: +
+
+ {{:data.downloadname ? data.downloadname : 'N/A'}} +
+
+ File description: +
+
+ {{:data.downloadname ? data.downloaddesc : 'N/A'}} +
+
+ File size: +
+
+ {{:data.downloadname ? (data.downloadcompletion + 'GQ / ' + data.downloadsize + 'GQ') : 'N/A'}} +
+
+ Transfer Rate: +
+
+ {{:data.downloadname ? data.downloadspeed : '0'}} GQ/s +
+
+ Download progress: +
+
+ {{:helper.displayBar(data.downloadcompletion, 0, data.downloadname ? data.downloadsize : 0, 'good')}} +
-
- {{:data.downloadname}} + +

+ +

Downloads Queue

+
+ {{for data.downloads_queue}} +
+ {{:index + 1}}: +
+
+ {{:value}} + {{:helper.link('', 'close', {'PRG_removequeued' : value})}} +
+ {{empty}} + The queue is currently empty. + {{/for}}
-
- File description: -
-
- {{:data.downloaddesc}} -
-
- File size: -
-
- {{:data.downloadcompletion}}GQ / {{:data.downloadsize}}GQ -
-
- Transfer Rate: -
-
- {{:data.downloadspeed}} GQ/s -
-
- Download progress: -
-
- {{:helper.displayBar(data.downloadcompletion, 0, data.downloadsize, 'good')}} -
-{{else}} +

+

Primary software repository

Hard drive: @@ -55,66 +77,24 @@ {{:helper.displayBar(data.disk_used, 0, data.disk_size, 'good')}} {{:data.disk_used}}GQ / {{:data.disk_size}}GQ
+ {{for data.downloadable_programs}} -
-
- File name: -
-
- {{:value.filename}} ({{:value.size}} GQ) -
-
- Program name: -
-
- {{:value.filedesc}} -
-
- Description: -
-
- {{:value.fileinfo}} -
-
- File controls: -
-
- {{:helper.link("DOWNLOAD", null, {'PRG_downloadfile' : value.filename})}} -
+
{{:helper.link('', value.icon, {'PRG_downloadfile' : value.filename})}} + {{:value.filedesc}} + {{:value.fileinfo}} + {{:value.size}} GQ {{/for}} +
{{if data.hackedavailable}}

*UNKNOWN* software repository

Please note that NanoTrasen does not recommend download of software from non-official servers. {{for data.hacked_programs}} -
-
- File name: -
-
- {{:value.filename}} ({{:value.size}} GQ) -
-
- Program name: -
-
- {{:value.filedesc}} -
-
- Description: -
-
- {{:value.fileinfo}} -
-
- File controls: -
-
- {{:helper.link("DOWNLOAD", null, {'PRG_downloadfile' : value.filename})}} -
-
+ {{:helper.link(value.filedesc, value.icon, {'PRG_downloadfile' : value.filename})}} + {{:value.fileinfo}} + {{:value.size}} GQ +
{{/for}} {{/if}} -{{/if}} -


NTOS v2.0.4b Copyright NanoTrasen 2557 - 2559 \ No newline at end of file +


NTOS v2.0.4b Copyright NanoTrasen 2557 - 2559 \ No newline at end of file diff --git a/nano/templates/ntnet_monitor.tmpl b/nano/templates/ntnet_monitor.tmpl index 89c9b8144c..3ab1f307c3 100644 --- a/nano/templates/ntnet_monitor.tmpl +++ b/nano/templates/ntnet_monitor.tmpl @@ -68,7 +68,7 @@
{{:data.idsstatus ? 'ENABLED' : 'DISABLED'}}
-
+
Maximal Log Count: @@ -109,4 +109,4 @@ {{/for}}
- \ No newline at end of file + \ No newline at end of file diff --git a/nano/templates/ntnet_relay.tmpl b/nano/templates/ntnet_relay.tmpl index 97b68368f6..24bd831782 100644 --- a/nano/templates/ntnet_relay.tmpl +++ b/nano/templates/ntnet_relay.tmpl @@ -15,7 +15,7 @@ {{else}} {{:helper.link('DISABLED', null, { 'toggle' : 1 })}} {{/if}} - +
Network buffer status: @@ -29,4 +29,4 @@
{{:helper.link('Purge network blacklist', null, { 'purge' : 1 })}}
-{{/if}} \ No newline at end of file +{{/if}} \ No newline at end of file diff --git a/nano/templates/ntnet_transfer.tmpl b/nano/templates/ntnet_transfer.tmpl index fa770295aa..e7a9da892a 100644 --- a/nano/templates/ntnet_transfer.tmpl +++ b/nano/templates/ntnet_transfer.tmpl @@ -91,4 +91,4 @@
{{:helper.link('Send file', null, { "PRG_uploadmenu" : 1 })}} -{{/if}} \ No newline at end of file +{{/if}} \ No newline at end of file diff --git a/nano/templates/word_processor.tmpl b/nano/templates/word_processor.tmpl new file mode 100644 index 0000000000..0a786f4973 --- /dev/null +++ b/nano/templates/word_processor.tmpl @@ -0,0 +1,49 @@ +{{if data.error}} +

An error has occurred:

+Additional information: {{:data.error}}
+Please try again. If the problem persists, contact your system administrator for assistance. +{{:helper.link('Back to menu', null, { "PRG_backtomenu" : 1 })}} +{{else}} +{{if data.browsing}} + {{:helper.link('BACK TO EDITOR', null, { "PRG_closebrowser" : 1 })}} +

Available documents (local):

+ +
Name + Size (GQ) + {{for data.files}} +
{{:value.name}} + {{:value.size}}GQ + {{:helper.link('OPEN', null, { "PRG_openfile" : value.name })}} + {{/for}} +
+ {{if data.usbconnected}} +

Available documents (portable device):

+ +
Name + Size (GQ) + {{for data.usbfiles}} +
{{:value.name}} + {{:value.size}}GQ + {{:helper.link('OPEN', null, { "PRG_openfile" : value.name })}} + {{/for}} +
+ {{/if}} +{{else}} +

Document: {{:data.filename}}

+
+ {{:helper.link('NEW', null, { "PRG_newfile" : 1 })}} + {{:helper.link('LOAD', null, { "PRG_loadmenu" : 1 })}} + {{:helper.link('SAVE', null, { "PRG_savefile" : 1 })}} + {{:helper.link('SAVE AS', null, { "PRG_saveasfile" : 1 })}} +
+
+ {{:helper.link('EDIT', null, { "PRG_editfile" : 1 })}} + {{:helper.link('PREVIEW', null, { "PRG_txtrpeview" : 1 }, data.filedata ? null : 'disabled')}} + {{:helper.link('FORMATTING HELP', null, { "PRG_taghelp" : 1 })}} + {{:helper.link('PRINT', null, { "PRG_printfile" : 1 })}} +

+
+ {{:data.filedata}} +
+{{/if}} +{{/if}} diff --git a/polaris.dme b/polaris.dme index 0c62b7553a..26838190d4 100644 --- a/polaris.dme +++ b/polaris.dme @@ -2134,10 +2134,12 @@ #include "code\modules\modular_computers\file_system\programs\generic\email_client.dm" #include "code\modules\modular_computers\file_system\programs\generic\file_browser.dm" #include "code\modules\modular_computers\file_system\programs\generic\game.dm" +#include "code\modules\modular_computers\file_system\programs\generic\library.dm" #include "code\modules\modular_computers\file_system\programs\generic\news_browser.dm" #include "code\modules\modular_computers\file_system\programs\generic\ntdownloader.dm" #include "code\modules\modular_computers\file_system\programs\generic\ntnrc_client.dm" #include "code\modules\modular_computers\file_system\programs\generic\nttransfer.dm" +#include "code\modules\modular_computers\file_system\programs\generic\wordprocessor.dm" #include "code\modules\modular_computers\file_system\programs\medical\suit_sensors.dm" #include "code\modules\modular_computers\file_system\programs\research\email_administration.dm" #include "code\modules\modular_computers\file_system\programs\research\ntmonitor.dm"