From ef64187fc2747b02800079afaa059a2af41df3bf Mon Sep 17 00:00:00 2001 From: Atlantis Date: Sun, 28 Jun 2015 08:19:43 +0200 Subject: [PATCH 01/23] Initial (buggy) implementation - Implements modular computers, starting with single program (power monitoring console) - Implements most hardware. Some is still TBD, but the important stuff is in place - Implements file-based system. Currently two file types exist, programs, which have NanoUI/Topic() interaction with user and data files, which may be used to store string of data. --- baystation12.dme | 40 +- code/game/machinery/computer3/NTOS.dm | 12 +- code/game/machinery/recharger.dm | 10 +- .../objects/items/devices/uplink_items.dm | 5 - .../items/devices/uplink_random_lists.dm | 1 - .../modules/modular_computers/_description.dm | 87 ++++ .../computers/modular_computer.dm | 375 ++++++++++++++++++ .../computers/status_icons.dmi | Bin 0 -> 682 bytes .../file_system/computer_file.dm | 18 + .../modular_computers/file_system/data.dm | 5 + .../modular_computers/file_system/program.dm | 83 ++++ .../file_system/programs/engineering.dm | 5 + .../modular_computers/hardware/card_slot.dm | 7 + .../modular_computers/hardware/hard_drive.dm | 36 ++ .../modular_computers/hardware/hardware.dm | 11 + .../hardware/network_card.dm | 44 ++ .../modular_computers/hardware/tesla_link.dm | 5 + code/modules/nano/modules/nano_module.dm | 8 + code/modules/nano/modules/power_monitor.dm | 11 +- code/modules/nano/nanomanager.dm | 1 + .../batt_100.gif | Bin .../batt_20.gif | Bin .../batt_40.gif | Bin .../batt_5.gif | Bin .../batt_60.gif | Bin .../batt_80.gif | Bin .../batt_none.gif | Bin icons/NTOS/status_icons/charging.gif | Bin 0 -> 106 bytes icons/NTOS/status_icons/sig_high.gif | Bin 0 -> 337 bytes icons/NTOS/status_icons/sig_low.gif | Bin 0 -> 160 bytes icons/NTOS/status_icons/sig_none.gif | Bin 0 -> 154 bytes icons/obj/computer3.dmi | Bin 37465 -> 29514 bytes interface/skin.dmf | 155 ++++++++ nano/images/status_icons/batt_100.gif | Bin 0 -> 173 bytes nano/images/status_icons/batt_20.gif | Bin 0 -> 284 bytes nano/images/status_icons/batt_40.gif | Bin 0 -> 185 bytes nano/images/status_icons/batt_5.gif | Bin 0 -> 273 bytes nano/images/status_icons/batt_60.gif | Bin 0 -> 166 bytes nano/images/status_icons/batt_80.gif | Bin 0 -> 172 bytes nano/images/status_icons/charging.gif | Bin 0 -> 160 bytes nano/images/status_icons/sig_high.gif | Bin 0 -> 182 bytes nano/images/status_icons/sig_low.gif | Bin 0 -> 179 bytes nano/images/status_icons/sig_none.gif | Bin 0 -> 202 bytes nano/templates/laptop_header.tmpl | 35 ++ nano/templates/laptop_mainscreen.tmpl | 34 ++ nano/templates/power_monitor.tmpl | 31 ++ 46 files changed, 970 insertions(+), 49 deletions(-) create mode 100644 code/modules/modular_computers/_description.dm create mode 100644 code/modules/modular_computers/computers/modular_computer.dm create mode 100644 code/modules/modular_computers/computers/status_icons.dmi create mode 100644 code/modules/modular_computers/file_system/computer_file.dm create mode 100644 code/modules/modular_computers/file_system/data.dm create mode 100644 code/modules/modular_computers/file_system/program.dm create mode 100644 code/modules/modular_computers/file_system/programs/engineering.dm create mode 100644 code/modules/modular_computers/hardware/card_slot.dm create mode 100644 code/modules/modular_computers/hardware/hard_drive.dm create mode 100644 code/modules/modular_computers/hardware/hardware.dm create mode 100644 code/modules/modular_computers/hardware/network_card.dm create mode 100644 code/modules/modular_computers/hardware/tesla_link.dm rename icons/NTOS/{battery_icons => status_icons}/batt_100.gif (100%) rename icons/NTOS/{battery_icons => status_icons}/batt_20.gif (100%) rename icons/NTOS/{battery_icons => status_icons}/batt_40.gif (100%) rename icons/NTOS/{battery_icons => status_icons}/batt_5.gif (100%) rename icons/NTOS/{battery_icons => status_icons}/batt_60.gif (100%) rename icons/NTOS/{battery_icons => status_icons}/batt_80.gif (100%) rename icons/NTOS/{battery_icons => status_icons}/batt_none.gif (100%) create mode 100644 icons/NTOS/status_icons/charging.gif create mode 100644 icons/NTOS/status_icons/sig_high.gif create mode 100644 icons/NTOS/status_icons/sig_low.gif create mode 100644 icons/NTOS/status_icons/sig_none.gif create mode 100644 nano/images/status_icons/batt_100.gif create mode 100644 nano/images/status_icons/batt_20.gif create mode 100644 nano/images/status_icons/batt_40.gif create mode 100644 nano/images/status_icons/batt_5.gif create mode 100644 nano/images/status_icons/batt_60.gif create mode 100644 nano/images/status_icons/batt_80.gif create mode 100644 nano/images/status_icons/charging.gif create mode 100644 nano/images/status_icons/sig_high.gif create mode 100644 nano/images/status_icons/sig_low.gif create mode 100644 nano/images/status_icons/sig_none.gif create mode 100644 nano/templates/laptop_header.tmpl create mode 100644 nano/templates/laptop_mainscreen.tmpl diff --git a/baystation12.dme b/baystation12.dme index abca8d814cd..f97cd4ece5a 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -447,36 +447,6 @@ #include "code\game\machinery\computer\station_alert.dm" #include "code\game\machinery\computer\supply.dm" #include "code\game\machinery\computer\syndicate_specops_shuttle.dm" -#include "code\game\machinery\computer3\bios.dm" -#include "code\game\machinery\computer3\buildandrepair.dm" -#include "code\game\machinery\computer3\component.dm" -#include "code\game\machinery\computer3\computer.dm" -#include "code\game\machinery\computer3\computer3_notes.dm" -#include "code\game\machinery\computer3\file.dm" -#include "code\game\machinery\computer3\laptop.dm" -#include "code\game\machinery\computer3\lapvend.dm" -#include "code\game\machinery\computer3\networking.dm" -#include "code\game\machinery\computer3\NTOS.dm" -#include "code\game\machinery\computer3\program.dm" -#include "code\game\machinery\computer3\program_disks.dm" -#include "code\game\machinery\computer3\server.dm" -#include "code\game\machinery\computer3\storage.dm" -#include "code\game\machinery\computer3\computers\arcade.dm" -#include "code\game\machinery\computer3\computers\atmos_alert.dm" -#include "code\game\machinery\computer3\computers\camera.dm" -#include "code\game\machinery\computer3\computers\card.dm" -#include "code\game\machinery\computer3\computers\communications.dm" -#include "code\game\machinery\computer3\computers\crew.dm" -#include "code\game\machinery\computer3\computers\customs.dm" -#include "code\game\machinery\computer3\computers\HolodeckControl.dm" -#include "code\game\machinery\computer3\computers\law.dm" -#include "code\game\machinery\computer3\computers\medical.dm" -#include "code\game\machinery\computer3\computers\Operating.dm" -#include "code\game\machinery\computer3\computers\power.dm" -#include "code\game\machinery\computer3\computers\prisoner.dm" -#include "code\game\machinery\computer3\computers\robot.dm" -#include "code\game\machinery\computer3\computers\security.dm" -#include "code\game\machinery\computer3\computers\welcome.dm" #include "code\game\machinery\doors\airlock.dm" #include "code\game\machinery\doors\airlock_control.dm" #include "code\game\machinery\doors\airlock_electronics.dm" @@ -1352,6 +1322,16 @@ #include "code\modules\mob\new_player\preferences_setup.dm" #include "code\modules\mob\new_player\skill.dm" #include "code\modules\mob\new_player\sprite_accessories.dm" +#include "code\modules\modular_computers\computers\modular_computer.dm" +#include "code\modules\modular_computers\file_system\computer_file.dm" +#include "code\modules\modular_computers\file_system\data.dm" +#include "code\modules\modular_computers\file_system\program.dm" +#include "code\modules\modular_computers\file_system\programs\engineering.dm" +#include "code\modules\modular_computers\hardware\card_slot.dm" +#include "code\modules\modular_computers\hardware\hard_drive.dm" +#include "code\modules\modular_computers\hardware\hardware.dm" +#include "code\modules\modular_computers\hardware\network_card.dm" +#include "code\modules\modular_computers\hardware\tesla_link.dm" #include "code\modules\nano\_JSON.dm" #include "code\modules\nano\JSON Reader.dm" #include "code\modules\nano\JSON Writer.dm" diff --git a/code/game/machinery/computer3/NTOS.dm b/code/game/machinery/computer3/NTOS.dm index 5119084f0e6..678a8eb71fa 100644 --- a/code/game/machinery/computer3/NTOS.dm +++ b/code/game/machinery/computer3/NTOS.dm @@ -188,15 +188,15 @@ // Battery level icon switch(computer.check_battery_status()) if(-1) - dat += "" + dat += "" if(0 to 5) - dat += "" + dat += "" if(6 to 20) - dat += "" + dat += "" if(21 to 40) - dat += "" + dat += "" if(41 to 60) - dat += "" + dat += "" if(61 to 80) dat += "" if(81 to 100) @@ -212,7 +212,7 @@ var/obj/item/part/computer/C = locate(href_list["viewperipheral"]) if(!istype(C) || (C.loc != src.computer)) return - + if(istype(C,/obj/item/part/computer/storage)) current = C interact() diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index e86a5c771f3..9e07de1ef4a 100644 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -9,7 +9,7 @@ obj/machinery/recharger idle_power_usage = 4 active_power_usage = 15000 //15 kW var/obj/item/charging = null - var/list/allowed_devices = list(/obj/item/weapon/gun/energy, /obj/item/weapon/melee/baton, /obj/item/device/laptop, /obj/item/weapon/cell) + var/list/allowed_devices = list(/obj/item/weapon/gun/energy, /obj/item/weapon/melee/baton, /obj/item/laptop, /obj/item/weapon/cell) var/icon_state_charged = "recharger2" var/icon_state_charging = "recharger1" var/icon_state_idle = "recharger0" //also when unpowered @@ -36,8 +36,8 @@ obj/machinery/recharger/attackby(obj/item/weapon/G as obj, mob/user as mob) return if (istype(G, /obj/item/weapon/gun/energy/staff)) return - if(istype(G, /obj/item/device/laptop)) - var/obj/item/device/laptop/L = G + if(istype(G, /obj/item/laptop)) + var/obj/item/laptop/L = G if(!L.stored_computer.battery) user << "There's no battery in it!" return @@ -101,8 +101,8 @@ obj/machinery/recharger/process() update_use_power(1) return - if(istype(charging, /obj/item/device/laptop)) - var/obj/item/device/laptop/L = charging + if(istype(charging, /obj/item/laptop)) + var/obj/item/laptop/L = charging if(!L.stored_computer.battery.fully_charged()) icon_state = icon_state_charging L.stored_computer.battery.give(active_power_usage*CELLRATE) diff --git a/code/game/objects/items/devices/uplink_items.dm b/code/game/objects/items/devices/uplink_items.dm index 97655196222..6ad0915b62f 100644 --- a/code/game/objects/items/devices/uplink_items.dm +++ b/code/game/objects/items/devices/uplink_items.dm @@ -265,11 +265,6 @@ datum/uplink_item/dd_SortValue() item_cost = 4 path = /obj/item/clothing/mask/gas/voice -/datum/uplink_item/item/stealth_items/camera_floppy - name = "Camera Network Access - Floppy" - item_cost = 6 - path = /obj/item/weapon/disk/file/cameras/syndicate - /******************** * Devices and Tools * ********************/ diff --git a/code/game/objects/items/devices/uplink_random_lists.dm b/code/game/objects/items/devices/uplink_random_lists.dm index 5e843388c54..af8bf1719c9 100644 --- a/code/game/objects/items/devices/uplink_random_lists.dm +++ b/code/game/objects/items/devices/uplink_random_lists.dm @@ -59,7 +59,6 @@ var/datum/uplink_random_selection/default_uplink_selection = new/datum/uplink_ra items += new/datum/uplink_random_item(/datum/uplink_item/item/stealth_items/chameleon_kit) items += new/datum/uplink_random_item(/datum/uplink_item/item/stealth_items/chameleon_projector) items += new/datum/uplink_random_item(/datum/uplink_item/item/stealth_items/voice) - items += new/datum/uplink_random_item(/datum/uplink_item/item/stealth_items/camera_floppy, 10, 0) items += new/datum/uplink_random_item(/datum/uplink_item/item/tools/toolbox, reselect_propbability = 10) items += new/datum/uplink_random_item(/datum/uplink_item/item/tools/plastique) diff --git a/code/modules/modular_computers/_description.dm b/code/modules/modular_computers/_description.dm new file mode 100644 index 00000000000..431552438da --- /dev/null +++ b/code/modules/modular_computers/_description.dm @@ -0,0 +1,87 @@ +/* +Program-based computers (similar to computer3 project, which this system replaces. It may, in future, be extended to other devices) + + +1. Basic information +Program based computers will allow you to do multiple things from single computer. Each computer will have programs, with more being downloadable from NTNet (stationwide wireless network) +if user has apropriate ID card access. It will be possible to hack the computer by using an emag on it - the emag will have to be completely new and will be consumed on use, but it will +lift ALL locks on ALL installed programs, and allow download of programs even if your ID doesn't have access to them. Computers will have hard drives that can store files. +Files can be programs (datum/computer_file/program/ subtype) or data files (datum/computer_file/data/ subtypes). Program for sending files will be available that will allow transfer via NTNet. +NTNet coverage will be limited to station's Z level, but better network card (=more expensive and higher power use) will allow usage everywhere. Hard drives will have limited capacity for files +which will be related to how good hard drive you buy when purchasing the laptop. For storing more files USB-style drives will be buildable with Protolathe in research. + +2. Laptops +Laptops are vendable via vending machine similar to how original laptops worked. This vending machine will allow hardware selection (hardware will be described below). Laptops will be +quite expensive, basic cost being 1499$ + cost of any extra hardware. When purchased they will contain only basic software (text editor, game, etc.) but more will be downloadable via NTNet. + +3. Laptop Hardware +Laptops will come with basic hardware installed, with upgrades being selectable when purchasing the laptop. +Hard Drive: Basic (20 GQ, free), Advanced (35 GQ, +199$), Super (60 GQ, +499$) One file (program or data file) equals 1GQ of capacity, regardless of file contents. +Network Card: Basic (NTNet on station Z levels, free), Advanced (NTNet on all Z levels, +399$) +Battery: Basic (about 10 minutes of charge, free), Advanced (about 20 minutes of charge, +199$), Super (about 30 minutes of charge, +399$) +Extras (those won't be installed by default) +ID Card Slot (required for HoP-style programs to work. Access for security record-style programs is read from ID of user [RFID?] without requiring this) - 99$ +APC Wireless Relay (allows the computer to run from APC, including slow recharge) - 499$ +Disk Drive (allows usage of data disks that store 10GQ of data, comes with FREE disk already inside!) - 199$ +Nano Printer (allows the computer to store few pieces of paper and print text files on them [NOTE: Paper not included!]) - 199$ // HoP's best friend! + +4. NTNet +NTNet is stationwide network that allows users to download programs needed for their work. It will be possible to send any files to other active computers using relevant program (NTN Transfer). +NTNet is under jurisdiction of both Engineering and Research. Engineering is responsible for any repairs if necessary and research is responsible for monitoring. It is similar to PDA messaging. +Operation requires functional "NTNet Relay" which is by default placed on tcommsat. If the relay is damaged NTNet will be offline until it is replaced. Multiple relays bring extra redundancy, +if one is destroyed the second will take over. If all relays are gone it stops working, simple as that. NTNet may be altered via administration console available to Research Director. It is +possible to enable/disable Software Downloading, P2P file transfers and Communication (IC version of IRC, PDA messages for more than two people) + +5. Software +Software would almost exclusively use NanoUI modules. Few exceptions are text editor (uses similar screen as TCS IDE used for editing and classic HTML for previewing as Nano looks differently) +and similar programs which for some reason require HTML UI. Most software will be highly dependent on NTNet to work as laptops are not physically connected to the station's network. +What i plan to add: + +Note: XXXXDB programs will use ingame_manuals to display basic help for players, similar to how books, etc. do + +Basic - Software in this bundle is automagically preinstalled in every new computer + NTN Transfer - Allows P2P transfer of files to other computers that run this. + Configurator - Allows configuration of computer's hardware, basically status screen. + File Browser - Allows you to browse all files stored on the computer. Allows renaming/deleting of files. + TXT Editor - Allows you editing data files in text editor mode. + NanoPrint - Allows you to operate NanoPrinter hardware to print text files. + NTNRC Chat - NTNet Relay Chat client. Allows PDA-messaging style messaging for more than two users. Person which created the conversation is Host and has administrative privilegies (kicking, etc.) + NTNet News - Allows reading news from newscaster network. + +Engineering - Requires "Engineering" access on ID card (ie. CE, Atmostech, Engineer) + Alarm Monitor - Allows monitoring alarms, same as the stationbound one. + Power Monitor - Power monitoring computer, connects to sensors in same way as regular one does. + Atmospheric Control - Allows access to the Atmospherics Monitor Console that operates air alarms. Requires extra access: "Atmospherics" + RCON Remote Control Console - Allows access to the RCON Remote Control Console. Requires extra access: "Power Equipment" + EngiDB - Allows accessing NTNet information repository for information about engineering-related things. + +Medical - Requires "Medbay" access on ID card (ie. CMO, Doctor,..) + Medical Records Uplink - Allows editing/reading of medical records. Printing requires NanoPrinter hardware. + MediDB - Allows accessing NTNet information repository for information about medical procedures + ChemDB - Requires extra access: "Chemistry" - Downloads basic information about recipes from NTNet + +Research - Requires "Research and Development" access on ID card (ie. RD, Roboticist, etc.) + Research Server Monitor - Allows monitoring of research levels on RnD servers. (read only) + Robotics Monitor Console - Allows monitoring of robots and exosuits. Lockdown/Self-Destruct options are unavailable [balance reasons for malf/traitor AIs]. Requires extra access: "Robotics" + NTNRC Administration Console - Allows administrative access to NTNRC. This includes bypassing any channel passwords and enabling "invisible" mode for spying on conversations. Requires extra access: "Research Director" + NTNet Administration Console - Allows remote configuration of NTNet Relay - CAUTION: If NTNet is turned off it won't be possible to turn it on again from the computer, as operation requires NTNet to work! Requires extra access: "Research Director" + +Security - Requires "Security" access on ID card (ie. HOS, Security officer, Detective) + Security Records Uplink - Allows editing/reading of security records. Printing requires Nanoprinter hardware. + LawDB - Allows accessing NTNet information repository for security information (corporate regulations) + Camera Uplink - Allows viewing cameras around the station. + +Command - Requires "Bridge" access on ID card (all heads) + Alertcon Access - Allows changing of alert levels. Red requires activation from two computers with two IDs similar to how those wall mounted devices do. + Employment Records Access - Allows reading of employment records. Printing requires NanoPrinter hardware. + Communication Console - Allows sending emergency messages to Central. + Emergency Shuttle Control Console - Allows calling/recalling the emergency shuttle. + Shuttle Control Console - Allows control of various shuttles around the station (mining, research, engineering) + +6. Security +Laptops will be password-lockable. If password is set a MD5 hash of it is stored and password is required every time you turn on the laptop. +Passwords may be decrypted by using special Decrypter (protolathable, RDs office starts with one) device that will slowly decrypt the password. +Decryption time would be length_of_password * 30 seconds, with maximum being 9 minutes (due to battery life limitations, which is 10+ min). +If decrypted the password is cleared, so you can keep using your favorite password without people ever actually revealing it (for meta prevention reasons mostly). +Emagged laptops will have option to enable "Safe Encryption". If safely encrypted laptop is decrypted it loses it's emag status and 50% of files is deleted (randomly selected). +*/ \ No newline at end of file diff --git a/code/modules/modular_computers/computers/modular_computer.dm b/code/modules/modular_computers/computers/modular_computer.dm new file mode 100644 index 00000000000..dc0f2284086 --- /dev/null +++ b/code/modules/modular_computers/computers/modular_computer.dm @@ -0,0 +1,375 @@ +// Portable item-based laptop + +/obj/item/laptop + name = "laptop computer" + desc = "A portable computer. It is closed." + icon = 'icons/obj/computer3.dmi' // Let's recycle the icons from computer3, they are decent. + icon_state = "laptop-closed" + item_state = "laptop-inhand" + w_class = 3 + var/obj/machinery/modular_computer/laptop/stored_computer = null + +/obj/item/laptop/verb/open_computer() + set name = "Open Laptop" + set category = "Object" + set src in view(1) + + if(usr.stat || usr.restrained() || usr.lying || !istype(usr, /mob/living)) + usr << "You can't do that." + return + + if(!Adjacent(usr)) + usr << "You can't reach it." + return + + if(!istype(loc,/turf)) + usr << "[src] is too bulky! You'll have to set it down." + return + + if(!stored_computer) + if(contents.len) + for(var/obj/O in contents) + O.loc = loc + usr << "\The [src] crumbles to pieces." + spawn(5) + qdel(src) + return + + stored_computer.loc = loc + stored_computer.stat &= ~MAINT + stored_computer.update_icon() + stored_computer.open = 1 + loc = stored_computer + usr << "You open \the [src]." + + +/obj/item/laptop/AltClick() + if(Adjacent(usr)) + open_computer() + + +// Laptop itself + +// Defaults in here are for laptops, and are overriden for stationbound consoles. +/obj/machinery/modular_computer/ + name = "laptop computer" + desc = "A portable computer." + var/open = 1 // Whether the laptop is open. + var/enabled = 1 // Whether the laptop is turned on. + var/datum/computer_file/program/active_program = null // A currently active program running on the computer. + var/obj/item/laptop/portable = null // Portable version of this computer, dropped on alt-click to allow transport. Used by laptops. + use_power = 0 + + icon = 'icons/obj/computer3.dmi' + icon_state = "laptop-open" + var/icon_state_unpowered = "laptop-open" // Icon state when the computer is turned off + var/icon_state_menu = "menu" // Icon state overlay when the computer is turned on, but no program is loaded that would override the screen. + + // Important hardware (must be installed for computer to work) + var/datum/computer_hardware/network_card/network_card // Network Card component of this computer. Allows connection to NTNet + var/datum/computer_hardware/hard_drive/hard_drive // Hard Drive component of this computer. Stores programs and files. + var/obj/item/weapon/cell/battery = null // Battery component of this computer. Powers the computer. Áll computers can have batteries. + // Optional hardware (improves functionality, but is not critical for computer to work) + var/datum/computer_hardware/tesla_link/tesla_link // Tesla Link component of this computer. Allows remote charging from nearest APC. + var/datum/computer_hardware/card_slot/card_slot // ID Card slot component of this computer. Mostly for HoP modification console that needs ID slot for modification. + +/obj/machinery/modular_computer/laptop/update_icon() + icon_state = icon_state_unpowered + + overlays.Cut() + if(!enabled) + return + if(active_program) + overlays.Add(active_program.laptop_icon_state ? active_program.laptop_icon_state : icon_state_menu) + else + overlays.Add(icon_state_menu) + +// Close the computer. collapsing it into movable item that can't be used. +/obj/machinery/modular_computer/laptop/verb/close_computer() + set name = "Close Laptop" + set category = "Object" + set src in view(1) + + if(usr.stat || usr.restrained() || usr.lying || !istype(usr, /mob/living)) + usr << "You can't do that." + return + + if(!Adjacent(usr)) + usr << "You can't reach it." + return + + close_laptop(usr) + +/obj/machinery/modular_computer/laptop/proc/close_laptop(mob/user = null) + if(istype(loc,/obj/item/laptop)) + return + if(!istype(loc,/turf)) + return + + if(!portable) + portable=new + portable.stored_computer = src + + portable.loc = loc + loc = portable + stat |= MAINT + if(user) + user << "You close \the [src]." + open = 0 + +/obj/machinery/modular_computer/laptop/AltClick() + if(Adjacent(usr)) + close_laptop() + +// Eject ID card from computer, if it has ID slot with card inside. +/obj/machinery/modular_computer/verb/eject_id() + set name = "Eject ID" + set category = "Object" + set src in view(1) + + if(usr.stat || usr.restrained() || usr.lying || !istype(usr, /mob/living)) + usr << "You can't do that." + return + + if(!Adjacent(usr)) + usr << "You can't reach it." + return + + proc_eject_id(usr) + +/obj/machinery/modular_computer/proc/proc_eject_id(mob/user) + if(!user) + user = usr + + if(!card_slot) + user << "\The [src] does not have an ID card slot" + return + + if(!card_slot.stored_card) + user << "There is no card in \the [src]" + return + + card_slot.stored_card.loc = src.loc + card_slot.stored_card = null + user << "You remove the card from \the [src]" + + +// TODO: Convert hardware creation specific stuff to vending machine that handles laptops. +/obj/machinery/modular_computer/New() + network_card = new(src) + hard_drive = new(src) + tesla_link = new(src) + battery = new(src) + battery.maxcharge = 500 + battery.charge = 500 + + hard_drive.stored_files.Add(new/datum/computer_file/program/power_monitor(src)) + update_icon() + ..() + +// Operates NanoUI +/obj/machinery/modular_computer/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + if(!open || !enabled) + if(ui) + ui.close() + return 0 + if(stat & (BROKEN | NOPOWER | MAINT)) + if(ui) + ui.close() + return 0 + + // If we have an active program switch to it now. + if(active_program) + if(ui) // This is the main laptop screen. Since we are switching to program's UI close it for now. + ui.close() + active_program.ui_interact(user) + return + + // We are still here, that means there is no program loaded. Load the BIOS/ROM/OS/whatever you want to call it. + // This screen simply lists available programs and user may select them. + if(!hard_drive || !hard_drive.stored_files || !hard_drive.stored_files.len) + visible_message("\The [src] beeps three times, it's screen displaying \"DISK ERROR\" warning.") + return // No HDD, No HDD files list or no stored files. Something is very broken. + + var/list/data = get_header_data() + + var/list/programs = list() + for(var/datum/computer_file/program/P in hard_drive.stored_files) + var/list/program = list() + program["name"] = P.filename + program["desc"] = P.filedesc + program["icon_link"] = P.fileicon + programs.Add(list(program)) + + data["programs"] = programs + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "laptop_mainscreen.tmpl", "NTOS Main Menu", 400, 500) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) + +// On-click handling. Turns on the computer if it's off and opens the GUI. +/obj/machinery/modular_computer/attack_hand(mob/user) + if(enabled) + ui_interact(user) + else if((battery && battery.charge > 0) || (!battery && powered())) // Battery-run and charged or non-battery but powered by APC. + user << "You press the power button and start up \the [src]" + enabled = 1 + update_icon() + +// Process currently calls handle_power(), may be expanded in future if more things are added. +/obj/machinery/modular_computer/process() + if(!enabled) // The computer is turned off + use_power = 0 + return 0 + + handle_power() // Handles all laptop power interaction + +// Function used by NanoUI's to obtain data for header. All relevant entries begin with "PC_" +/obj/machinery/modular_computer/proc/get_header_data() + var/list/data = list() + + if(battery) + switch(battery.percent()) + if(80 to 200) // 100 should be maximal but just in case.. + data["PC_batteryicon"] = "batt_100.gif" + if(60 to 80) + data["PC_batteryicon"] = "batt_80.gif" + if(40 to 60) + data["PC_batteryicon"] = "batt_60.gif" + if(20 to 40) + data["PC_batteryicon"] = "batt_40.gif" + if(5 to 20) + data["PC_batteryicon"] = "batt_20.gif" + else + data["PC_batteryicon"] = "batt_5.gif" + data["PC_batterypercent"] = "[round(battery.percent())] %" + else // Computer without battery shouldn't work at all, but in case we implement computers without batteries in future that run solely on APC network, it's here. + data["PC_batteryicon"] = "batt_5.gif" + data["PC_batterypercent"] = "N/C" + + switch(get_ntnet_status()) + if(0) + data["PC_ntneticon"] = "sig_none.gif" + if(1) + data["PC_ntneticon"] = "sig_low.gif" + if(2) + data["PC_ntneticon"] = "sig_high.gif" + + if(tesla_link && tesla_link.enabled && powered()) + data["PC_apclinkicon"] = "charging.gif" + + data["PC_stationtime"] = worldtime2text() + data["PC_hasheader"] = 1 + return data + + +// Relays kill program request to currently active program. Use this to quit current program. +/obj/machinery/modular_computer/proc/kill_program(var/forced = 0) + if(active_program) + active_program.kill_program(forced) + active_program = null + var/mob/user = usr + if(user && istype(user)) + ui_interact(user) // Re-open the UI on this computer. It should show the main screen now. + update_icon() + +// Returns 0 for No Signal, 1 for Low Signal and 2 for Good Signal. 3 is for wired connection (always-on) +/obj/machinery/modular_computer/proc/get_ntnet_status() + if(network_card) + return network_card.get_signal() + else + return 0 + +// Handles user's GUI input +/obj/machinery/modular_computer/Topic(href, href_list) + if( href_list["PC_exit"] ) + kill_program() + return + if( href_list["PC_shutdown"] ) + kill_program(1) + visible_message("\The [src] shuts down.") + enabled = 0 + return + if( href_list["PC_runprogram"] ) + var/prog = href_list["PC_runprogram"] + var/datum/computer_file/program/P = null + var/mob/user = usr + if(hard_drive) + P = hard_drive.find_file_by_name(prog) + + if(!P || !istype(P)) // Program not found or it's not executable program. + return + + if(P.run_program(user)) + active_program = P + update_icon() + return + +// Used in following function to reduce copypaste +/obj/machinery/modular_computer/proc/power_failure() + if(enabled) // Shut down the computer) + visible_message("\The [src]'s screen flickers \"BATTERY CRITICAL\" warning as it shuts down unexpectedly.") + kill_program(1) + enabled = 0 + update_icon() + stat |= NOPOWER +// Handles power-related things, such as battery interaction, recharging, shutdown when it's discharged, NOPOWER flag, etc. +/obj/machinery/modular_computer/proc/handle_power() + if(battery && battery.charge <= 0) // Battery-run but battery is depleted. + power_failure() + return 0 + else if(!battery && (!powered() || !tesla_link || !tesla_link.enabled)) // Not battery run, but lacking APC connection. + power_failure() + return 0 + else if(stat & NOPOWER) + stat &= ~NOPOWER + + var/power_usage = open ? 300 : 25 // 300W when it's open and only 25W when closed (sleep mode)? Screen probably uses a lot. + if(network_card && network_card.enabled) + power_usage += network_card.power_usage + + if(hard_drive && hard_drive.enabled) + power_usage += hard_drive.power_usage + + // Wireless APC connection exists. + if(tesla_link && tesla_link.enabled) + idle_power_usage = power_usage + active_power_usage = idle_power_usage + 100 // APCLink only charges at 100W rate, but covers any power usage. + use_power = 1 + // Battery is not fully charged. Begin slowly recharging. + if(battery && battery.charge < battery.maxcharge) + use_power = 2 + + if(battery && powered() && (use_power == 2)) // Battery charging itself + battery.give(100 * CELLRATE) + else if(battery && !powered()) // Unpowered, but battery covers the usage. + battery.use(idle_power_usage * CELLRATE) + + else // No wireless connection run only on battery. + use_power = 0 + if (battery) + battery.use(power_usage * CELLRATE) + +// Modular computers can have battery in them, we handle power in previous proc, so prevent this from messing it up for us. +/obj/machinery/modular_computer/power_change() + return + +/obj/machinery/modular_computer/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) + if(istype(W, /obj/item/weapon/card/id)) // ID Card, try to insert it. + var/obj/item/weapon/card/id/I = W + if(!card_slot) + user << "You try to insert \the [I] into \the [src], but it does not have an ID card slot installed." + return + + if(card_slot.stored_card) + user << "You try to insert \the [I] into \the [src], but it's ID card slot is occupied." + return + + card_slot.stored_card = I + I.loc = src + user << "You insert \the [I] into \the [src]." + return + + ..() diff --git a/code/modules/modular_computers/computers/status_icons.dmi b/code/modules/modular_computers/computers/status_icons.dmi new file mode 100644 index 0000000000000000000000000000000000000000..8bd9c03971748163812a305c8fc65b659d9c986c GIT binary patch literal 682 zcmV;b0#*HqP)YD7 z3IGVQYy-U)ahCu90l!H^K~z|U?UzfAgD?z+odsQI=n0$~j4E|MQoCnC_mz78I}GG) zVj$r$ozY+v^u#h~A41CuB_Lr+$ z2zL*nTXi`s5D}KbT~ou3i{W_3JHVr@+5|Q`UI-i1!I{Ef;ao|waDJ?UL2pS&eZAYb zIakbfO3oEsuCkv^uf)JQXJ9)Xl@)Y)!jqK^W!@oF|0m0-avnBV<@MYJl0{6ynzM^H zmGzTC57kVA`>yuCKBx$E^xIAtz>b%)s%G1UNo1 zlYCtnn2e`~V}*>vL>L|>tr~}^B*QNT{1X9=Vv59eh1IaHS0-TwH QM*si-07*qoM6N<$f)Z~iGXMYp literal 0 HcmV?d00001 diff --git a/code/modules/modular_computers/file_system/computer_file.dm b/code/modules/modular_computers/file_system/computer_file.dm new file mode 100644 index 00000000000..b62c01cff0d --- /dev/null +++ b/code/modules/modular_computers/file_system/computer_file.dm @@ -0,0 +1,18 @@ +/datum/computer_file/ + var/filename = "NewFile" // Placeholder. No spacebars + var/filetype = "XXX" // File full names are [filename].[filetype] so like NewFile.XXX in this case + var/size = 1 // File size in GQ (default 1, do not change unless you really have to). Non-1 values are currently unused but they should be supported. + var/datum/computer_hardware/hard_drive/holder // Holder that contains this file. + var/icon_path = null // !!32x32!! icon of this program + + +/datum/computer_file/Destroy() + if(!holder) + return ..() + + holder.stored_files -= src + // holder.holder is the computer that has drive installed. If we are Destroy()ing program that's currently running kill it. + if(holder.holder && holder.holder.active_program == src) + holder.holder.kill_program(1) + holder = null + ..() diff --git a/code/modules/modular_computers/file_system/data.dm b/code/modules/modular_computers/file_system/data.dm new file mode 100644 index 00000000000..204c86ced72 --- /dev/null +++ b/code/modules/modular_computers/file_system/data.dm @@ -0,0 +1,5 @@ +// /data/ files store data in string format. +// They don't contain other logic for now. +/datum/computer_file/data + var/stored_data = "" // Stored data in string format. + filetype = "DAT" \ No newline at end of file diff --git a/code/modules/modular_computers/file_system/program.dm b/code/modules/modular_computers/file_system/program.dm new file mode 100644 index 00000000000..ccbc9d881dc --- /dev/null +++ b/code/modules/modular_computers/file_system/program.dm @@ -0,0 +1,83 @@ +// /program/ files are executable programs that do things. +/datum/computer_file/program + filetype = "PRG" + filename = "UnknownProgram" // File name. + var/required_access = null // List of required accesses to *run* the program. + var/datum/nano_module/NM = null // If the program uses NanoModule, put it here and it will be automagically opened. Otherwise implement ui_interact. + var/nanomodule_path = null // Path to nanomodule, make sure to set this if implementing new program. + var/running = 1 // Set to 1 when the program is run and back to 0 when it's stopped. + var/atom/movable/computer = null // Device that runs this program. + var/filedesc = "Unknown Program" // User-friendly name of this program. + var/fileicon = "unknwn" // Name of relevant icon that is displayed with the program + var/laptop_icon_state = null // Program-specific icon state (stored in /icons/obj/computer3.dmi) + +/datum/computer_file/program/New(var/atom/movable/comp = null) + ..() + if(comp) + computer = comp + +// Check if the user can run program. Only humans can operate computer. Automatically called in run_program() +// User has to wear their ID or have it inhand for ID Scan to work. +/datum/computer_file/program/proc/can_run(var/mob/living/user) + if(!required_access) // No required_access, allow it. + return 1 + if(istype(user, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = user + var/obj/item/weapon/card/id/I = H.wear_id + if(!H) // No equipped ID, let's try checking active hand too + I = H.get_active_hand() + if(!H || !istype(I)) // Still no ID. + return 0 + + if(required_access in I.access) + return 1 + return 0 + +// This attempts to retrieve header data for NanoUIs. If implementing completely new device of different type than existing ones +// always include the device here in this proc. This proc basically relays the request to whatever is running the program. +/datum/computer_file/program/proc/get_header_data() + if(istype(computer, /obj/machinery/modular_computer)) + var/obj/machinery/modular_computer/L = computer + return L.get_header_data() + +// This is performed on program startup. May be overriden to add extra logic. Remember to include ..() call. Return 1 on success, 0 on failure. +// When implementing new program based device, use this to run the program. +/datum/computer_file/program/proc/run_program(var/mob/living/user) + if(can_run(user)) + if(nanomodule_path) + NM = new nanomodule_path(computer) // Computer is passed here as it's (probably!) physical object. Some UI's perform get_turf() and passing program datum wouldn't go well with this. + NM.program = src // Set the program reference to separate variable, instead. + running = 1 + return 1 + return 0 + +// Use this proc to kill the program. Designed to be implemented by each program if it requires on-quit logic, such as the NTNRC client. +/datum/computer_file/program/proc/kill_program(var/forced = 0) + running = 0 + qdel(NM) + NM = null + return 1 + +// This is called every tick when the program is enabled. Ensure you do parent call if you override it. If parent returns 1 continue with UI initialisation. +// It returns 0 if it can't run or if NanoModule was used instead. I suggest using NanoModules where applicable. +/datum/computer_file/program/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + if(!running) // Our program was closed. Close the ui if it exists. + if(ui) + ui.close() + return 0 + if(NM) + NM.ui_interact(user, ui_key, ui, force_open) + return 0 + return 1 + + +// CONVENTIONS, READ THIS WHEN CREATING NEW PROGRAM AND OVERRIDING THIS PROC: +// Topic calls are automagically forwarded from NanoModule this program contains. +// Calls beginning with "PRG_" are reserved for programs handling. +// Calls beginning with "PC_" are reserved for computer handling (by whatever runs the program) +// ALWAYS INCLUDE PARENT CALL ..() OR DIE IN FIRE. +/datum/computer_file/program/Topic(href, href_list) + + if(computer) + computer.Topic(href, href_list) + ..() \ No newline at end of file diff --git a/code/modules/modular_computers/file_system/programs/engineering.dm b/code/modules/modular_computers/file_system/programs/engineering.dm new file mode 100644 index 00000000000..5c212b4031a --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/engineering.dm @@ -0,0 +1,5 @@ +/datum/computer_file/program/power_monitor + filename = "powermonitor" + filedesc = "Power Monitoring" + nanomodule_path = /datum/nano_module/power_monitor/ + laptop_icon_state = "power_monitor" \ No newline at end of file diff --git a/code/modules/modular_computers/hardware/card_slot.dm b/code/modules/modular_computers/hardware/card_slot.dm new file mode 100644 index 00000000000..c3008a19fdc --- /dev/null +++ b/code/modules/modular_computers/hardware/card_slot.dm @@ -0,0 +1,7 @@ +/datum/computer_hardware/card_slot + name = "RFID Card Slot" + desc = "Slot that allows this computer to write data on RFID cards. Necessary for some programs to run properly." + power_usage = 10 //W + critical = 0 + + var/obj/item/weapon/card/id/stored_card = null \ No newline at end of file diff --git a/code/modules/modular_computers/hardware/hard_drive.dm b/code/modules/modular_computers/hardware/hard_drive.dm new file mode 100644 index 00000000000..3e9d2fbf94e --- /dev/null +++ b/code/modules/modular_computers/hardware/hard_drive.dm @@ -0,0 +1,36 @@ +/datum/computer_hardware/hard_drive/ + name = "Hard Drive" + desc = "A small power efficient solid state drive, with 25GQ of storage capacity for use in basic computers where power efficiency is desired." + power_usage = 25 // SSD or something with low power usage + var/max_capacity = 25 + var/list/stored_files = list() // List of stored files on this drive. + +/datum/computer_hardware/hard_drive/advanced + desc = "A small hybrid hard drive with 35GQ of storage capacity for use in higher grade computers where balance between power efficiency and capacity is desired." + max_capacity = 35 + power_usage = 50 // Hybrid, medium capacity and medium power storage + +/datum/computer_hardware/hard_drive/super + desc = "A small hard drive with 60GQ of storage capacity for use in cluster storage solutions where capacity is more important than power efficiency." + max_capacity = 60 + power_usage = 100 // High-capacity but uses lots of power, shortening battery life. Best used with APC link. + +// Checks whether file can be stored on the hard drive. +/datum/computer_hardware/hard_drive/proc/can_store_file(var/size = 1) + if(stored_files.len + size > max_capacity) + return 0 + else + return 1 + +// Tries to find the file by filename. Returns null on failure +/datum/computer_hardware/hard_drive/proc/find_file_by_name(var/filename) + if(!filename) + return null + + if(!stored_files) + return null + + for(var/datum/computer_file/F in stored_files) + if(F.filename == filename) + return F + return null \ No newline at end of file diff --git a/code/modules/modular_computers/hardware/hardware.dm b/code/modules/modular_computers/hardware/hardware.dm new file mode 100644 index 00000000000..77f550433ed --- /dev/null +++ b/code/modules/modular_computers/hardware/hardware.dm @@ -0,0 +1,11 @@ +/datum/computer_hardware/ + var/name = "Hardware" + var/desc = "Unknown Hardware" + var/obj/machinery/modular_computer/holder = null + var/power_usage = 0 // If the hardware uses extra power, change this. + var/enabled = 1 // If the hardware is turned off set this to 0. + var/critical = 1 // Prevent disabling for important component, like the HDD. + +/datum/computer_hardware/New(var/obj/machinery/modular_computer/L) + holder = L + ..() \ No newline at end of file diff --git a/code/modules/modular_computers/hardware/network_card.dm b/code/modules/modular_computers/hardware/network_card.dm new file mode 100644 index 00000000000..40e4c4b1ca1 --- /dev/null +++ b/code/modules/modular_computers/hardware/network_card.dm @@ -0,0 +1,44 @@ +/datum/computer_hardware/network_card/ + name = "NTNet Network Card" + desc = "A basic network card for usage with standard NTNet frequencies." + power_usage = 50 + critical = 0 + var/long_range = 0 + var/ethernet = 0 // Hard-wired, therefore always on, ignores NTNet wireless checks. + +/datum/computer_hardware/network_card/advanced + desc = "An advanced network card for usage with standard NTNet frequencies. It's transmitter is strong enough to connect even off-station." + long_range = 1 + power_usage = 100 // Better range but higher power usage. + +/datum/computer_hardware/network_card/wired + desc = "An advanced network card for usage with NTNet. This one uses wired connection." + ethernet = 1 + power_usage = 100 // Better range but higher power usage. + +/datum/computer_hardware/network_card/Destroy() + if(holder && (holder.network_card == src)) + holder.network_card = null + holder = null + ..() + +// 0 - No signal, 1 - Low signal, 2 - High signal. 3 - Wired Connection +/datum/computer_hardware/network_card/proc/get_signal() + if(!holder) // Hardware is not installed in anything. No signal. How did this even get called? + return 0 + + if(!enabled) + return 0 + + if(ethernet) // Computer is connected via wired connection. + return 3 + + // TODO: Add checks for NTNet Relays here! + + if(holder.z in config.station_levels) // Computer is on station, High signal + return 2 + + if(long_range) // Computer is not on station, but it has upgraded network card. Low signal. + return 1 + + return 0 // Computer is not on station and does not have upgraded network card. No signal. \ No newline at end of file diff --git a/code/modules/modular_computers/hardware/tesla_link.dm b/code/modules/modular_computers/hardware/tesla_link.dm new file mode 100644 index 00000000000..638b309daf4 --- /dev/null +++ b/code/modules/modular_computers/hardware/tesla_link.dm @@ -0,0 +1,5 @@ +/datum/computer_hardware/tesla_link + name = "Tesla Link" + desc = "An advanced tesla link that wirelessly recharges connected device from nearby area power controller." + critical = 0 + enabled = 0 // Starts turned off diff --git a/code/modules/nano/modules/nano_module.dm b/code/modules/nano/modules/nano_module.dm index 0cdf451d6fb..b6a17ec8d67 100644 --- a/code/modules/nano/modules/nano_module.dm +++ b/code/modules/nano/modules/nano_module.dm @@ -1,6 +1,7 @@ /datum/nano_module var/name var/host + var/datum/computer_file/program/program = null // Program-Based computer program that runs this nano module. Defaults to null. /datum/nano_module/New(var/host) src.host = host @@ -10,3 +11,10 @@ /datum/nano_module/proc/can_still_topic(var/datum/topic_state/state = default_state) return CanUseTopic(usr, state) == STATUS_INTERACTIVE + +/datum/nano_module/Topic(href, href_list) + // Calls forwarded to PROGRAM itself should begin with "PRG_" + // Calls forwarded to COMPUTER running the program should begin with "PC_" + if(program) + program.Topic(href, href_list) + return ..() \ No newline at end of file diff --git a/code/modules/nano/modules/power_monitor.dm b/code/modules/nano/modules/power_monitor.dm index 9d386e8c932..f9c37afadbf 100644 --- a/code/modules/nano/modules/power_monitor.dm +++ b/code/modules/nano/modules/power_monitor.dm @@ -7,8 +7,13 @@ ..() refresh_sensors() +// If PC is not null header template is loaded. Use PC.get_header_data() to get relevant nanoui data from it. All data entries begin with "PC_...." +// In future it may be expanded to other modular computer devices. /datum/nano_module/power_monitor/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 = list() + if(program) + data = program.get_header_data() + var/list/sensors = list() // Focus: If it remains null if no sensor is selected and UI will display sensor list, otherwise it will display sensor reading. var/obj/machinery/power/sensor/focus = null @@ -37,6 +42,8 @@ /datum/nano_module/power_monitor/proc/refresh_sensors() grid_sensors = list() var/turf/T = get_turf(nano_host()) + if(!T) // Safety check + return for(var/obj/machinery/power/sensor/S in machines) if((T && S.loc.z == T.z) || (S.long_range)) // Consoles have range on their Z-Level. Sensors with long_range var will work between Z levels. if(S.name_tag == "#UNKN#") // Default name. Shouldn't happen! @@ -46,11 +53,11 @@ // Allows us to process UI clicks, which are relayed in form of hrefs. /datum/nano_module/power_monitor/Topic(href, href_list) - if(..()) + if(..(href, href_list)) return if( href_list["clear"] ) active_sensor = null if( href_list["refresh"] ) refresh_sensors() else if( href_list["setsensor"] ) - active_sensor = href_list["setsensor"] + active_sensor = href_list["setsensor"] \ No newline at end of file diff --git a/code/modules/nano/nanomanager.dm b/code/modules/nano/nanomanager.dm index f6325fd4f71..b208950cfab 100644 --- a/code/modules/nano/nanomanager.dm +++ b/code/modules/nano/nanomanager.dm @@ -18,6 +18,7 @@ var/list/nano_asset_dirs = list(\ "nano/css/",\ "nano/images/",\ + "nano/images/status_icons/",\ "nano/js/",\ "nano/templates/"\ ) diff --git a/icons/NTOS/battery_icons/batt_100.gif b/icons/NTOS/status_icons/batt_100.gif similarity index 100% rename from icons/NTOS/battery_icons/batt_100.gif rename to icons/NTOS/status_icons/batt_100.gif diff --git a/icons/NTOS/battery_icons/batt_20.gif b/icons/NTOS/status_icons/batt_20.gif similarity index 100% rename from icons/NTOS/battery_icons/batt_20.gif rename to icons/NTOS/status_icons/batt_20.gif diff --git a/icons/NTOS/battery_icons/batt_40.gif b/icons/NTOS/status_icons/batt_40.gif similarity index 100% rename from icons/NTOS/battery_icons/batt_40.gif rename to icons/NTOS/status_icons/batt_40.gif diff --git a/icons/NTOS/battery_icons/batt_5.gif b/icons/NTOS/status_icons/batt_5.gif similarity index 100% rename from icons/NTOS/battery_icons/batt_5.gif rename to icons/NTOS/status_icons/batt_5.gif diff --git a/icons/NTOS/battery_icons/batt_60.gif b/icons/NTOS/status_icons/batt_60.gif similarity index 100% rename from icons/NTOS/battery_icons/batt_60.gif rename to icons/NTOS/status_icons/batt_60.gif diff --git a/icons/NTOS/battery_icons/batt_80.gif b/icons/NTOS/status_icons/batt_80.gif similarity index 100% rename from icons/NTOS/battery_icons/batt_80.gif rename to icons/NTOS/status_icons/batt_80.gif diff --git a/icons/NTOS/battery_icons/batt_none.gif b/icons/NTOS/status_icons/batt_none.gif similarity index 100% rename from icons/NTOS/battery_icons/batt_none.gif rename to icons/NTOS/status_icons/batt_none.gif diff --git a/icons/NTOS/status_icons/charging.gif b/icons/NTOS/status_icons/charging.gif new file mode 100644 index 0000000000000000000000000000000000000000..0c66c9d17b501a21a27d31d9acfacd5e9a33a65e GIT binary patch literal 106 zcmZ?wbhEHb6krfwSjYeZ2M!$g@dLzA{Lk&@8WQa67~pE8XTZz|68g!)X~e+HpaYTz zX<=Z}nA6{RU=~kf^~RN2zWd5LHu}y}lahaFa7e3#yJ%U#&ZCo~n=D)31~W2P0|2j_ BA7B6g literal 0 HcmV?d00001 diff --git a/icons/NTOS/status_icons/sig_high.gif b/icons/NTOS/status_icons/sig_high.gif new file mode 100644 index 0000000000000000000000000000000000000000..2cb9c504115a9cd74d4ad102be521deafc8504f1 GIT binary patch literal 337 zcmZ?wbhEHb6krfwIK%(~Kfw6M4~7E=4uJSzp!lEL&ow02*)hP?NY8+o5h$qmlZ7*d zft5iAqyVIyf!QQt*BxFiv6pFku4cVja$fvMs>4nWrV|UZ4sKd7`_Nefjr>yS=MOn{g^eI6Re91RhJAF RUGp?VSYFK9m(Ijs4FINwE@%J% literal 0 HcmV?d00001 diff --git a/icons/NTOS/status_icons/sig_none.gif b/icons/NTOS/status_icons/sig_none.gif new file mode 100644 index 0000000000000000000000000000000000000000..e43f72feda1358d4f98c9c659ca362c7b735dfee GIT binary patch literal 154 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�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 YWRZ*09ES6b;u+{)H_<89a(wxJ0ndyaSpWb4 diff --git a/interface/skin.dmf b/interface/skin.dmf index 68acfba6077..7bca3e6df99 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -1357,6 +1357,8 @@ window "chemdispenser" keep-aspect = false align = center text-wrap = false + allow-html = false + letterbox = true elem "eject" type = BUTTON pos = 264,4 @@ -1523,6 +1525,8 @@ window "chemdispenser" keep-aspect = false align = center text-wrap = false + allow-html = false + letterbox = true elem "child1" type = CHILD pos = 0,40 @@ -1644,6 +1648,8 @@ window "chemdispenser_reagents" keep-aspect = false align = center text-wrap = false + allow-html = false + letterbox = true window "mainwindow" elem "mainwindow" @@ -2331,3 +2337,152 @@ window "infowindow" prefix-color = none suffix-color = none +window "text_editor" + elem "text_editor" + type = MAIN + pos = 281,0 + size = 360x488 + anchor1 = none + anchor2 = none + font-family = "" + font-size = 0 + font-style = "" + text-color = #000000 + background-color = none + is-visible = false + is-disabled = false + is-transparent = false + is-default = false + border = sunken + drop-zone = false + right-click = false + saved-params = "pos;size;is-minimized;is-maximized" + on-size = "" + title = "Text Editor" + titlebar = true + statusbar = true + can-close = true + can-minimize = false + can-resize = false + is-pane = false + is-minimized = false + is-maximized = false + can-scroll = none + icon = "" + image = "" + image-mode = stretch + keep-aspect = false + transparent-color = none + alpha = 255 + macro = "" + menu = "" + on-close = "" + elem "exit" + type = BUTTON + pos = 248,456 + size = 104x24 + anchor1 = none + anchor2 = none + font-family = "" + font-size = 0 + font-style = "" + text-color = #000000 + background-color = none + is-visible = true + is-disabled = false + is-transparent = false + is-default = false + border = none + drop-zone = false + right-click = false + saved-params = "is-checked" + on-size = "" + text = "Exit without saving" + image = "" + command = "" + is-flat = false + stretch = false + is-checked = false + group = "" + button-type = pushbutton + elem "save" + type = BUTTON + pos = 128,456 + size = 104x24 + anchor1 = none + anchor2 = none + font-family = "" + font-size = 0 + font-style = "" + text-color = #000000 + background-color = none + is-visible = true + is-disabled = false + is-transparent = false + is-default = false + border = none + drop-zone = false + right-click = false + saved-params = "is-checked" + on-size = "" + text = "Save" + image = "" + command = "" + is-flat = false + stretch = false + is-checked = false + group = "" + button-type = pushbutton + elem "saveexit" + type = BUTTON + pos = 8,456 + size = 104x24 + anchor1 = none + anchor2 = none + font-family = "" + font-size = 0 + font-style = "" + text-color = #000000 + background-color = none + is-visible = true + is-disabled = false + is-transparent = false + is-default = false + border = none + drop-zone = false + right-click = false + saved-params = "is-checked" + on-size = "" + text = "Save + Exit" + image = "" + command = "" + is-flat = false + stretch = false + is-checked = false + group = "" + button-type = pushbutton + elem "textedit" + type = INPUT + pos = 0,0 + size = 360x448 + anchor1 = none + anchor2 = none + font-family = "" + font-size = 0 + font-style = "" + text-color = #000000 + background-color = #ffffff + is-visible = true + is-disabled = false + is-transparent = false + is-default = false + border = line + drop-zone = false + right-click = false + saved-params = "" + on-size = "" + command = "" + multi-line = true + is-password = false + no-command = false + diff --git a/nano/images/status_icons/batt_100.gif b/nano/images/status_icons/batt_100.gif new file mode 100644 index 0000000000000000000000000000000000000000..ccdbd4333e98df930bd8d5d1df46ff55b6c9678b GIT binary patch literal 173 zcmZ?wbhEHb)L;-}SjfP@@PmQDg5kh{13;$Ye{Mh5kYH!W09PYD17=2$&`%alE(T@> z9Uz+lq=kVgdrtq#({K3~&(XZmz4_ijR))4m9@89-*W5WZulLlknX~7~XS7<@-QM-< z)5p3a3k8=ph_;@YD-fCaZO)aKyj=lOOHa#wTkte*^$w}Z9NjwJhnsI~PrIE`a*N4r Z`pwD9_U->OX}Y^(L`Fr2MIZx%H2^2XMuq?Y literal 0 HcmV?d00001 diff --git a/nano/images/status_icons/batt_20.gif b/nano/images/status_icons/batt_20.gif new file mode 100644 index 0000000000000000000000000000000000000000..1d5e38fc888430a7bb2a1062468c7d822d7c66e1 GIT binary patch literal 284 zcmZ?wbhEHb)L;-}IK;rf@PmQD0tgun95?`E!hzy{Za>$MU}whwS0gveMHo^t=VfrUT;SOEL275g-IH&n1op^o z=9lV!P(86h^6mx>t7j(O%Z^Kid|P5Z$GPHY-im1Li@&d`EsQmCFt|K%`J3m`_rh+z z&%XGl`Q`8b4UOWQ*sKjFXl>T}cWXYI3Y~UjK2~sKzM#q(-TuQppDLZbR{Cf!?s%H9 d{c_%U&2Mf?S8e&VTesZc!;Tui{VEI$)&M66a}odm literal 0 HcmV?d00001 diff --git a/nano/images/status_icons/batt_40.gif b/nano/images/status_icons/batt_40.gif new file mode 100644 index 0000000000000000000000000000000000000000..d5cedb996759170d5e2477619ca9f40d66a18c6a GIT binary patch literal 185 zcmZ?wbhEHb)L;-}*u=oV@PmQDg5kh{13!QaB%t`8+s`#5*x50_)kx2PnGq+Z` zi-Cnf2c!(7oq;*qW7nO32B$n%@6~;AcK82A5r&k^c^OP*m|J z3#SnSD}xS51xPysb9ltAJO2z$d9L2e`{L~G{|zi0DVg&!v|283?E4_Kv*7N@w^{Gs zt@&&!blQ>mSizC`f+}Zp`w#bgs&w{R>7%{4<7vkB%X#NDzqu`4wdL1t-ExBuJ8Jy) Vs}Qg&7i3qn2@A+BDa!4#1^~mJZcP9H literal 0 HcmV?d00001 diff --git a/nano/images/status_icons/batt_60.gif b/nano/images/status_icons/batt_60.gif new file mode 100644 index 0000000000000000000000000000000000000000..d39534c8cb03fd6b7580267d38ebbed0e7d16433 GIT binary patch literal 166 zcmZ?wbhEHb)L;-}SjfP@@PmQDg5kh{13;$Ye{Mh5kYH!W09PYD17=2$&`%alE(T@> z9Uz+lq=kVgWlsOf({K3~&(XZmz4_ijR))4m9@89-*W5WZulLlknX~7~XS7<%UFKf1 z`(~4FeCi2qq3|8I_&BGU)(1We&T?Ux91|_L^hVh9IhhrArZ%15RF+p;vVC*Z z9Uz+lq=kVgYfk^l({K3~&(XZmz4_ijR))4m9@89-*W5WZulLlknX~7~XS7<@-8SCU z@UqJKc7ar_(qx0*Qj WFFrMOA(iFsh8__a6&8UE4AubO+dx48 literal 0 HcmV?d00001 diff --git a/nano/images/status_icons/charging.gif b/nano/images/status_icons/charging.gif new file mode 100644 index 0000000000000000000000000000000000000000..cf19ca72876b33bb683ea14aa4d9dc4c6c621bc8 GIT binary patch literal 160 zcmZ?wbhEHb)L;-}SjfP@V8L+UzyXFIKo*1Ie{Mh5kYH!W09PYD17=2$&`%alE(T@> z9gsXo3jy+yJb<5u_TVtSn;qvt0wAPESQ>533&YSr0)^5#} LkH0rFF<1itpY1(Q literal 0 HcmV?d00001 diff --git a/nano/images/status_icons/sig_high.gif b/nano/images/status_icons/sig_high.gif new file mode 100644 index 0000000000000000000000000000000000000000..efb20f6730654a761fa061b451efae0122d0aa71 GIT binary patch literal 182 zcmZ?wbhEHb)L;-}SjfP@V8L+UzyXFIKo*1Ie{Mh5kYH!W09PYD17=2$&`%alBL-#$ z9gsXo3jk%Fip~B~z57xb zi)?z*Z*Xy0o|rpPO~Z+yA@$@>1_6#hWrL)ndfU%un{lK$aNjjtzs6(v{wv#ltnFR= VJZVQz-_mTu^o*>a79LIpYXEgwJ&phX literal 0 HcmV?d00001 diff --git a/nano/images/status_icons/sig_none.gif b/nano/images/status_icons/sig_none.gif new file mode 100644 index 0000000000000000000000000000000000000000..79840d8a2bd4b30c263cbc680aa2727dfeb27555 GIT binary patch literal 202 zcmZ?wbhEHb)L;-}IK;rfV8QSMNd5rQ3P*m|J z3#SnSD}xS51xPysb4|pqJO2!r%))zrFb0-CKQlph(PPc@iDJ$HNpG_owf1h(n=`wt zUenMc;IZ>XC+j6^CT7V^4LFneD~G3DvVYsFjzo7kzV8>k`g)oSEfegn*X=s^y{0?n tc4VnY$MhFJy)7CAO2cZKN~((6ntigmW7~}j6!Ut0@@CGO&CkhT4FK +
+ + {{if data.PC_batteryicon}} +
+ {{/if}} + {{if data.PC_batterypercent}} + {{:data.PC_batterypercent}} + {{/if}} + {{if data.PC_ntneticon}} + + {{/if}} + {{if data.PC_apclinkicon}} + + {{/if}} + {{if data.PC_stationtime}} + {{:data.PC_stationtime}} + {{/if}} +
+
+ +
+ +
{{:helper.link('Shutdown', 'icon-power', {'PC_shutdown' : 1})}} + {{:helper.link('Exit Program', 'icon-close', {'PC_exit' : 1})}} +
+
+
+
+{{/if}} \ No newline at end of file diff --git a/nano/templates/laptop_mainscreen.tmpl b/nano/templates/laptop_mainscreen.tmpl new file mode 100644 index 00000000000..f29607bf4ab --- /dev/null +++ b/nano/templates/laptop_mainscreen.tmpl @@ -0,0 +1,34 @@ +{{if data.PC_hasheader}} +
+
+ + {{if data.PC_batteryicon}} +
+ {{/if}} + {{if data.PC_batterypercent}} + {{:data.PC_batterypercent}} + {{/if}} + {{if data.PC_ntneticon}} + + {{/if}} + {{if data.PC_apclinkicon}} + + {{/if}} + {{if data.PC_stationtime}} + {{:data.PC_stationtime}} + {{/if}} +
+
+
+
+ +
{{:helper.link('Shutdown', 'icon-power', {'PC_shutdown' : 1})}} +
+
+
+
+{{/if}} +No program loaded. Please select program from list below. +{{for data.programs}} + {{:helper.link(value.desc, 'icon-power', {'PC_runprogram' : value.name})}} +{{/for}} \ No newline at end of file diff --git a/nano/templates/power_monitor.tmpl b/nano/templates/power_monitor.tmpl index bf07238784f..f1961727a8f 100644 --- a/nano/templates/power_monitor.tmpl +++ b/nano/templates/power_monitor.tmpl @@ -1,3 +1,34 @@ +{{if data.PC_hasheader}} +
+
+ + {{if data.PC_batteryicon}} +
+ {{/if}} + {{if data.PC_batterypercent}} + {{:data.PC_batterypercent}} + {{/if}} + {{if data.PC_ntneticon}} + + {{/if}} + {{if data.PC_apclinkicon}} + + {{/if}} + {{if data.PC_stationtime}} + {{:data.PC_stationtime}} + {{/if}} +
+
+
+
+ +
{{:helper.link('Shutdown', 'icon-power', {'PC_shutdown' : 1})}} + {{:helper.link('Exit Program', 'icon-close', {'PC_exit' : 1})}} +
+
+
+
+{{/if}} {{if data.focus}}
{{:helper.link('Show List', 'cancel', { 'clear' : 1})}} Sensor selected: {{:data.focus.name}} From 566c1d0963ec04ed1042d3f1b8f6f7298ab5f0e3 Mon Sep 17 00:00:00 2001 From: Atlantis Date: Tue, 30 Jun 2015 09:17:16 +0200 Subject: [PATCH 02/23] Adds NTNet, more programs, improvements - Overall improvements of code, fixes, etc. - Adds NTNet and NTNet relays. They currently miss deconstruction/construction but that's planned for later. - Adds few more programs (still preinstalled in the laptop, for debugging) - Successfully gets rid of copypaste formerly needed in templates. Now the header is in default template itself. This seems to be least problematic solution without making change to nanoui's code itself. --- baystation12.dme | 2 + code/__defines/misc.dm | 6 +++ code/modules/modular_computers/NTNet/NTNet.dm | 40 ++++++++++++++++++ .../modular_computers/NTNet/NTNet_relay.dm | 21 +++++++++ .../computers/modular_computer.dm | 22 ++++++++-- .../modular_computers/file_system/program.dm | 20 +++++++-- .../file_system/programs/engineering.dm | 35 ++++++++++++++- .../hardware/network_card.dm | 5 ++- code/modules/nano/modules/alarm_monitor.dm | 5 +++ code/modules/nano/modules/atmos_control.dm | 5 +++ code/modules/nano/modules/crew_monitor.dm | 6 ++- code/modules/nano/modules/power_monitor.dm | 2 + code/modules/nano/modules/rcon.dm | 4 ++ icons/obj/computer3.dmi | Bin 29514 -> 32266 bytes nano/templates/alarm_monitor.tmpl | 1 - nano/templates/laptop_header.tmpl | 35 --------------- nano/templates/laptop_mainscreen.tmpl | 36 ++-------------- nano/templates/layout_default.tmpl | 31 ++++++++++++++ nano/templates/power_monitor.tmpl | 31 -------------- 19 files changed, 195 insertions(+), 112 deletions(-) create mode 100644 code/modules/modular_computers/NTNet/NTNet.dm create mode 100644 code/modules/modular_computers/NTNet/NTNet_relay.dm delete mode 100644 nano/templates/laptop_header.tmpl diff --git a/baystation12.dme b/baystation12.dme index f97cd4ece5a..295f8b8e9c6 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -1332,6 +1332,8 @@ #include "code\modules\modular_computers\hardware\hardware.dm" #include "code\modules\modular_computers\hardware\network_card.dm" #include "code\modules\modular_computers\hardware\tesla_link.dm" +#include "code\modules\modular_computers\NTNet\NTNet.dm" +#include "code\modules\modular_computers\NTNet\NTNet_relay.dm" #include "code\modules\nano\_JSON.dm" #include "code\modules\nano\JSON Reader.dm" #include "code\modules\nano\JSON Writer.dm" diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm index ecca29bfd19..575caa17f44 100644 --- a/code/__defines/misc.dm +++ b/code/__defines/misc.dm @@ -154,3 +154,9 @@ #define BOMBCAP_HEAVY_RADIUS (max_explosion_range/2) #define BOMBCAP_LIGHT_RADIUS max_explosion_range #define BOMBCAP_FLASH_RADIUS (max_explosion_range*1.5) + + // NTNet configuration options +#define NTNET_SOFTWAREDOWNLOAD 1 // Downloads of software from NTNet +#define NTNET_PEERTOPEER 2 // P2P transfers of files between devices +#define NTNET_COMMUNICATION 3 // Communication (messaging) +#define NTNET_SYSTEMCONTROL 4 // Control of various systems, RCon, air alarm control, etc. diff --git a/code/modules/modular_computers/NTNet/NTNet.dm b/code/modules/modular_computers/NTNet/NTNet.dm new file mode 100644 index 00000000000..f076cdf8a55 --- /dev/null +++ b/code/modules/modular_computers/NTNet/NTNet.dm @@ -0,0 +1,40 @@ +var/global/datum/ntnet/ntnet_global = new() + + +// This is the NTNet datum. There can be only one NTNet datum in game at once. Modular computers read data from this. +/datum/ntnet/ + var/list/relays = list() + var/setting_softwaredownload = 1 + var/setting_peertopeer = 1 + var/setting_communication = 1 + var/setting_systemcontrol = 1 + + +// If new NTNet datum is spawned, it replaces the old one. +/datum/ntnet/New() + if(ntnet_global && (ntnet_global != src)) + ntnet_global = src // There can be only one. + for(var/obj/machinery/ntnet_relay/R in machines) + relays.Add(R) + +/datum/ntnet/proc/check_function(var/specific_action = 0) + if(!relays || !relays.len) // No relays found. NTNet is down + return 0 + + var/operating = 0 + + // Check all relays. If we have at least one working relay, network is up. + for(var/obj/machinery/ntnet_relay/R in relays) + if(R.is_operational()) + operating = 1 + break + + if(specific_action == NTNET_SOFTWAREDOWNLOAD) + return (operating && setting_softwaredownload) + if(specific_action == NTNET_PEERTOPEER) + return (operating && setting_peertopeer) + if(specific_action == NTNET_COMMUNICATION) + return (operating && setting_communication) + if(specific_action == NTNET_SYSTEMCONTROL) + return (operating && setting_systemcontrol) + return operating \ No newline at end of file diff --git a/code/modules/modular_computers/NTNet/NTNet_relay.dm b/code/modules/modular_computers/NTNet/NTNet_relay.dm new file mode 100644 index 00000000000..528a7e00136 --- /dev/null +++ b/code/modules/modular_computers/NTNet/NTNet_relay.dm @@ -0,0 +1,21 @@ +// Relays don't handle any actual communication. Global NTNet datum does that, relays only tell the datum if it should or shouldn't work. +/obj/machinery/ntnet_relay + name = "NTNet Quantum Relay" + desc = "A very complex router and transmitter capable of connecting electronic devices together. Looks fragile." + use_power = 1 + idle_power_usage = 20000 //20kW, apropriate for machine that keeps massive cross-Zlevel wireless network operational. + icon_state = "bus" + +// TODO: Implement more logic here. For now it's only a placeholder. +/obj/machinery/ntnet_relay/proc/is_operational() + if(stat & (BROKEN | NOPOWER | EMPED)) + return 0 + return 1 + +/obj/machinery/ntnet_relay/New() + if(ntnet_global) + ntnet_global.relays.Add(src) + +/obj/machinery/ntnet_relay/Destroy() + if(ntnet_global) + ntnet_global.relays.Remove(src) \ No newline at end of file diff --git a/code/modules/modular_computers/computers/modular_computer.dm b/code/modules/modular_computers/computers/modular_computer.dm index dc0f2284086..e040d1716e1 100644 --- a/code/modules/modular_computers/computers/modular_computer.dm +++ b/code/modules/modular_computers/computers/modular_computer.dm @@ -163,7 +163,11 @@ battery.maxcharge = 500 battery.charge = 500 + hard_drive.stored_files.Add(new/datum/computer_file/program/alarm_monitor(src)) hard_drive.stored_files.Add(new/datum/computer_file/program/power_monitor(src)) + hard_drive.stored_files.Add(new/datum/computer_file/program/atmos_control(src)) + hard_drive.stored_files.Add(new/datum/computer_file/program/rcon_console(src)) + hard_drive.stored_files.Add(new/datum/computer_file/program/suit_sensors(src)) update_icon() ..() @@ -205,6 +209,7 @@ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "laptop_mainscreen.tmpl", "NTOS Main Menu", 400, 500) + ui.auto_update_layout = 1 ui.set_initial_data(data) ui.open() ui.set_auto_update(1) @@ -224,7 +229,11 @@ use_power = 0 return 0 - handle_power() // Handles all laptop power interaction + if(active_program && active_program.requires_ntnet && !get_ntnet_status(active_program.requires_ntnet_feature)) // Active program requires NTNet to run but we've just lost connection. Crash. + kill_program(1) + visible_message("\The [src]'s screen briefly freezes and then shows \"NETWORK ERROR - NTNet connection lost. Please retry. If problem persists contact your system administrator.\" error.") + + handle_power() // Handles all computer power interaction // Function used by NanoUI's to obtain data for header. All relevant entries begin with "PC_" /obj/machinery/modular_computer/proc/get_header_data() @@ -276,9 +285,9 @@ update_icon() // Returns 0 for No Signal, 1 for Low Signal and 2 for Good Signal. 3 is for wired connection (always-on) -/obj/machinery/modular_computer/proc/get_ntnet_status() +/obj/machinery/modular_computer/proc/get_ntnet_status(var/specific_action = 0) if(network_card) - return network_card.get_signal() + return network_card.get_signal(specific_action) else return 0 @@ -291,6 +300,7 @@ kill_program(1) visible_message("\The [src] shuts down.") enabled = 0 + update_icon() return if( href_list["PC_runprogram"] ) var/prog = href_list["PC_runprogram"] @@ -300,8 +310,12 @@ P = hard_drive.find_file_by_name(prog) if(!P || !istype(P)) // Program not found or it's not executable program. + user << "\The [src]'s screen shows \"I/O ERROR - Unable to run program\" warning." return + if(P.requires_ntnet && !get_ntnet_status(P.requires_ntnet_feature)) // The program requires NTNet connection, but we are not connected to NTNet. + user << "\The [src]'s screen shows \"NETWORK ERROR - Unable to connect to NTNet. Please retry. If problem persists contact your system administrator.\" warning." + return if(P.run_program(user)) active_program = P update_icon() @@ -310,7 +324,7 @@ // Used in following function to reduce copypaste /obj/machinery/modular_computer/proc/power_failure() if(enabled) // Shut down the computer) - visible_message("\The [src]'s screen flickers \"BATTERY CRITICAL\" warning as it shuts down unexpectedly.") + visible_message("\The [src]'s screen flickers \"BATTERY CRITICAL\" warning as it shuts down unexpectedly.") kill_program(1) enabled = 0 update_icon() diff --git a/code/modules/modular_computers/file_system/program.dm b/code/modules/modular_computers/file_system/program.dm index ccbc9d881dc..b16cd8918c3 100644 --- a/code/modules/modular_computers/file_system/program.dm +++ b/code/modules/modular_computers/file_system/program.dm @@ -10,6 +10,8 @@ var/filedesc = "Unknown Program" // User-friendly name of this program. var/fileicon = "unknwn" // Name of relevant icon that is displayed with the program var/laptop_icon_state = null // Program-specific icon state (stored in /icons/obj/computer3.dmi) + 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) /datum/computer_file/program/New(var/atom/movable/comp = null) ..() @@ -18,19 +20,29 @@ // Check if the user can run program. Only humans can operate computer. Automatically called in run_program() // User has to wear their ID or have it inhand for ID Scan to work. -/datum/computer_file/program/proc/can_run(var/mob/living/user) +/datum/computer_file/program/proc/can_run(var/mob/living/user, var/loud = 0) if(!required_access) // No required_access, allow it. return 1 if(istype(user, /mob/living/carbon/human)) var/mob/living/carbon/human/H = user var/obj/item/weapon/card/id/I = H.wear_id - if(!H) // No equipped ID, let's try checking active hand too + var/obj/item/device/pda/P = H.wear_id + if(P && istype(P)) // PDA. Try to grab the ID from it then. + I = P.id + if(!I) // No equipped ID, let's try checking active hand too I = H.get_active_hand() - if(!H || !istype(I)) // Still no ID. + P = H.get_active_hand() + if(P && istype(P)) + I = P.id + if(!I || !istype(I)) // Still no ID. + if(loud && computer) + user << "\The [computer] flashes an \"RFID Error - Unable to scan ID\" warning." return 0 if(required_access in I.access) return 1 + if(loud && computer) + user << "\The [computer] flashes an \"Access Denied\" warning." return 0 // This attempts to retrieve header data for NanoUIs. If implementing completely new device of different type than existing ones @@ -43,7 +55,7 @@ // This is performed on program startup. May be overriden to add extra logic. Remember to include ..() call. Return 1 on success, 0 on failure. // When implementing new program based device, use this to run the program. /datum/computer_file/program/proc/run_program(var/mob/living/user) - if(can_run(user)) + if(can_run(user, 1)) if(nanomodule_path) NM = new nanomodule_path(computer) // Computer is passed here as it's (probably!) physical object. Some UI's perform get_turf() and passing program datum wouldn't go well with this. NM.program = src // Set the program reference to separate variable, instead. diff --git a/code/modules/modular_computers/file_system/programs/engineering.dm b/code/modules/modular_computers/file_system/programs/engineering.dm index 5c212b4031a..5152c540ce2 100644 --- a/code/modules/modular_computers/file_system/programs/engineering.dm +++ b/code/modules/modular_computers/file_system/programs/engineering.dm @@ -2,4 +2,37 @@ filename = "powermonitor" filedesc = "Power Monitoring" nanomodule_path = /datum/nano_module/power_monitor/ - laptop_icon_state = "power_monitor" \ No newline at end of file + laptop_icon_state = "power_monitor" + requires_ntnet = 1 + +/datum/computer_file/program/alarm_monitor + filename = "alarmmonitor" + filedesc = "Alarm Monitoring" + nanomodule_path = /datum/nano_module/alarm_monitor/engineering + laptop_icon_state = "alarm_monitor" + requires_ntnet = 1 + +/datum/computer_file/program/atmos_control + filename = "atmoscontrol" + filedesc = "Atmosphere Control" + nanomodule_path = /datum/nano_module/atmos_control + laptop_icon_state = "atmos_control" + required_access = access_atmospherics + requires_ntnet = 1 + requires_ntnet_feature = NTNET_SYSTEMCONTROL + +/datum/computer_file/program/rcon_console + filename = "rconconsole" + filedesc = "RCON Remote Control" + nanomodule_path = /datum/nano_module/rcon + laptop_icon_state = "rcon_console" + required_access = access_engine + requires_ntnet = 1 + requires_ntnet_feature = NTNET_SYSTEMCONTROL + +/datum/computer_file/program/suit_sensors + filename = "sensormonitor" + filedesc = "Suit Sensors Monitoring" + nanomodule_path = /datum/nano_module/crew_monitor + laptop_icon_state = "suit_sensors" + requires_ntnet = 1 \ No newline at end of file diff --git a/code/modules/modular_computers/hardware/network_card.dm b/code/modules/modular_computers/hardware/network_card.dm index 40e4c4b1ca1..ff2fb20eb64 100644 --- a/code/modules/modular_computers/hardware/network_card.dm +++ b/code/modules/modular_computers/hardware/network_card.dm @@ -23,7 +23,7 @@ ..() // 0 - No signal, 1 - Low signal, 2 - High signal. 3 - Wired Connection -/datum/computer_hardware/network_card/proc/get_signal() +/datum/computer_hardware/network_card/proc/get_signal(var/specific_action = 0) if(!holder) // Hardware is not installed in anything. No signal. How did this even get called? return 0 @@ -33,7 +33,8 @@ if(ethernet) // Computer is connected via wired connection. return 3 - // TODO: Add checks for NTNet Relays here! + if(!ntnet_global || !ntnet_global.check_function(specific_action)) // NTNet is down and we are not connected via wired connection. No signal. + return 0 if(holder.z in config.station_levels) // Computer is on station, High signal return 2 diff --git a/code/modules/nano/modules/alarm_monitor.dm b/code/modules/nano/modules/alarm_monitor.dm index 5040241d0ff..63cf21e0a29 100644 --- a/code/modules/nano/modules/alarm_monitor.dm +++ b/code/modules/nano/modules/alarm_monitor.dm @@ -59,6 +59,9 @@ /datum/nano_module/alarm_monitor/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) var/data[0] + if(program) + data = program.get_header_data() + var/categories[0] for(var/datum/alarm_handler/AH in alarm_handlers) categories[++categories.len] = list("category" = AH.category, "alarms" = list()) @@ -84,6 +87,8 @@ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "alarm_monitor.tmpl", "Alarm Monitoring Console", 800, 800, state = state) + if(program) // This is necessary to ensure the status bar remains updated along with rest of the UI. + ui.auto_update_layout = 1 ui.set_initial_data(data) ui.open() ui.set_auto_update(1) diff --git a/code/modules/nano/modules/atmos_control.dm b/code/modules/nano/modules/atmos_control.dm index e1cc519b2f9..c39c3fc6379 100644 --- a/code/modules/nano/modules/atmos_control.dm +++ b/code/modules/nano/modules/atmos_control.dm @@ -33,6 +33,9 @@ var/data[0] var/alarms[0] + if(program) + data = program.get_header_data() + // TODO: Move these to a cache, similar to cameras for(var/obj/machinery/alarm/alarm in (monitored_alarms.len ? monitored_alarms : machines)) alarms[++alarms.len] = list("name" = sanitize(alarm.name), "ref"= "\ref[alarm]", "danger" = max(alarm.danger_level, alarm.alarm_area.atmosalm)) @@ -41,6 +44,8 @@ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) if(!ui) ui = new(user, src, ui_key, "atmos_control.tmpl", src.name, 625, 625, state = state) + if(program) // This is necessary to ensure the status bar remains updated along with rest of the UI. + ui.auto_update_layout = 1 ui.set_initial_data(data) ui.open() ui.set_auto_update(1) diff --git a/code/modules/nano/modules/crew_monitor.dm b/code/modules/nano/modules/crew_monitor.dm index 4c4c5abbb01..72f61684903 100644 --- a/code/modules/nano/modules/crew_monitor.dm +++ b/code/modules/nano/modules/crew_monitor.dm @@ -4,7 +4,7 @@ /datum/nano_module/crew_monitor/Topic(href, href_list) if(..()) return - var/turf/T = get_turf(src) + var/turf/T = get_turf(nano_host()) if (!T || !(T.z in config.player_levels)) usr << "Unable to establish a connection: You're too far away from the station!" return 0 @@ -27,7 +27,9 @@ src.scan() var/data[0] - var/turf/T = get_turf(src) + if(program) + data = program.get_header_data() + var/turf/T = get_turf(nano_host()) var/list/crewmembers = list() for(var/obj/item/clothing/under/C in src.tracked) diff --git a/code/modules/nano/modules/power_monitor.dm b/code/modules/nano/modules/power_monitor.dm index f9c37afadbf..3b3aaaf4dc6 100644 --- a/code/modules/nano/modules/power_monitor.dm +++ b/code/modules/nano/modules/power_monitor.dm @@ -34,6 +34,8 @@ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "power_monitor.tmpl", "Power Monitoring Console", 800, 500, state = state) + if(program) // This is necessary to ensure the status bar remains updated along with rest of the UI. + ui.auto_update_layout = 1 ui.set_initial_data(data) ui.open() ui.set_auto_update(1) diff --git a/code/modules/nano/modules/rcon.dm b/code/modules/nano/modules/rcon.dm index 8950f1228e8..bca092b622a 100644 --- a/code/modules/nano/modules/rcon.dm +++ b/code/modules/nano/modules/rcon.dm @@ -10,6 +10,8 @@ /datum/nano_module/rcon/ui_interact(mob/user, ui_key = "rcon", datum/nanoui/ui=null, force_open=1, var/datum/topic_state/state = default_state) FindDevices() // Update our devices list var/data[0] + if(program) + data = program.get_header_data() // SMES DATA (simplified view) var/list/smeslist[0] @@ -41,6 +43,8 @@ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "rcon.tmpl", "RCON Console", 600, 400, state = state) + if(program) // This is necessary to ensure the status bar remains updated along with rest of the UI. + ui.auto_update_layout = 1 ui.set_initial_data(data) ui.open() ui.set_auto_update(1) diff --git a/icons/obj/computer3.dmi b/icons/obj/computer3.dmi index acbd026b489120ac3bd29ebef34172e26f3a0204..d4408f5037c89aa7cc74a39c9818def9cb8d3c51 100644 GIT binary patch literal 32266 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 z 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 DDiDnv literal 29514 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�CIB9@V8DYfPf7*IM7`(J*xZr>WnmTD@9h_^;yjr= zEP>So!oqN;ik$~j%PTZ(a1-iUoMXRq@!n6S9dF;9H*bXsfMj=FQu}j6JuyF#UzmUL z2NKHRnEI@dzu7n{ kj;yls53f1cV3JB4E>Ob_A?>J8g7CBouJ|*?U#BO>yIDpXt zUlC}A2#kJ#&p>^6!YxeARy~;IBcDGJgZ#7D1Q8^ZiU_Y5-$@4^w~4yab`Jp<#EzyF z@65rq-red5eV!SfAQCsXnZeJs&+Khf-Ijk-y-dlZcV24J?_u0h-^@XlH>_E_1v4f! zs!AOW$t_(54&z!5$@TQHWf=tfkGCC-5XbZE=}*{-(MPmqBjsjlh76g=n+i(5A6EzZ0+=JIN5das5QbkVXB9 zKB*y*QuxBBW4$m;ei%tX?dwNo0{y^CMJ-6YxP0(}Jkn@g<#&zC)EBRbbYF2ew)?IC)doh;najo+`8NLop(Y4(-J9nl2zFCT97)G*i(rctta0 z(L}nnq`WB|Z>`U>!z+^~5Fm6&X20dWZ3ng=KMI$oq{i-GI1H z0&hEG?78 - {{for data.categories}}

{{:value.category}}

{{for value.alarms :alarmValue:alarmIndex}} diff --git a/nano/templates/laptop_header.tmpl b/nano/templates/laptop_header.tmpl deleted file mode 100644 index 850da8e8323..00000000000 --- a/nano/templates/laptop_header.tmpl +++ /dev/null @@ -1,35 +0,0 @@ -///// This template has to be copypasted on top of each NanoUI that supports modular computers -///// Unfortunately, i didn't find better way to do it. If author of NanoUI reads this, i'd -///// appreciate any suggestions on how to append this on top of multiple templates automatically. - -{{if data.PC_hasheader}} -
-
- - {{if data.PC_batteryicon}} -
- {{/if}} - {{if data.PC_batterypercent}} - {{:data.PC_batterypercent}} - {{/if}} - {{if data.PC_ntneticon}} - - {{/if}} - {{if data.PC_apclinkicon}} - - {{/if}} - {{if data.PC_stationtime}} - {{:data.PC_stationtime}} - {{/if}} -
-
-
-
- -
{{:helper.link('Shutdown', 'icon-power', {'PC_shutdown' : 1})}} - {{:helper.link('Exit Program', 'icon-close', {'PC_exit' : 1})}} -
-
-
-
-{{/if}} \ No newline at end of file diff --git a/nano/templates/laptop_mainscreen.tmpl b/nano/templates/laptop_mainscreen.tmpl index f29607bf4ab..bc05416e830 100644 --- a/nano/templates/laptop_mainscreen.tmpl +++ b/nano/templates/laptop_mainscreen.tmpl @@ -1,34 +1,6 @@ -{{if data.PC_hasheader}} -
-
- - {{if data.PC_batteryicon}} -
- {{/if}} - {{if data.PC_batterypercent}} - {{:data.PC_batterypercent}} - {{/if}} - {{if data.PC_ntneticon}} - - {{/if}} - {{if data.PC_apclinkicon}} - - {{/if}} - {{if data.PC_stationtime}} - {{:data.PC_stationtime}} - {{/if}} -
-
-
-
- -
{{:helper.link('Shutdown', 'icon-power', {'PC_shutdown' : 1})}} -
-
-
-
-{{/if}} No program loaded. Please select program from list below. + {{for data.programs}} - {{:helper.link(value.desc, 'icon-power', {'PC_runprogram' : value.name})}} -{{/for}} \ No newline at end of file +
{{:helper.link(value.desc, 'icon-power', {'PC_runprogram' : value.name})}} +{{/for}} +
\ No newline at end of file diff --git a/nano/templates/layout_default.tmpl b/nano/templates/layout_default.tmpl index ec3e225bb67..7d30d5a4219 100644 --- a/nano/templates/layout_default.tmpl +++ b/nano/templates/layout_default.tmpl @@ -1,3 +1,34 @@ +{{if data.PC_hasheader}} +
+
+ + {{if data.PC_batteryicon}} +
+ {{/if}} + {{if data.PC_batterypercent}} + {{:data.PC_batterypercent}} + {{/if}} + {{if data.PC_ntneticon}} + + {{/if}} + {{if data.PC_apclinkicon}} + + {{/if}} + {{if data.PC_stationtime}} + {{:data.PC_stationtime}} + {{/if}} +
+
+
+
+ +
{{:helper.link('Shutdown', 'icon-power', {'PC_shutdown' : 1})}} + {{:helper.link('Exit Program', 'icon-close', {'PC_exit' : 1})}} +
+
+
+{{/if}} +
{{:config.title}}