Modular PDAs: The End of an Era (#10319)

PDAs are dead, long live PDAs. All trace of old PDAs has been scoured from the codebase, and in its place are modular computer PDAs that are feature-equivalent. Essentially every PDA function except the Syndicate detonation feature and Notepad has been ported over, and battery life for handheld computers has been boosted alongside the addition of charging cables to make things easier.
This commit is contained in:
JohnWildkins
2020-11-01 14:09:50 -05:00
committed by GitHub
parent a5d891763c
commit 616776f886
167 changed files with 2017 additions and 3332 deletions
@@ -0,0 +1,52 @@
/datum/computer_file/program/atmos
filename = "atmos"
filedesc = "Atmosphere Sensor"
program_icon_state = "generic"
extended_desc = "This program is for viewing local atmospheric data."
size = 2
available_on_ntnet = TRUE
usage_flags = PROGRAM_ALL
/datum/computer_file/program/atmos/ui_interact(mob/user)
var/datum/vueui/ui = SSvueui.get_open_ui(user, src)
if (!ui)
ui = new /datum/vueui/modularcomputer(user, src, "mcomputer-atmosphere", 400, 200, "Atmosphere Sensor")
ui.open()
/datum/computer_file/program/atmos/vueui_transfer(oldobj)
SSvueui.transfer_uis(oldobj, src, "mcomputer-atmosphere", 400, 200, "Atmosphere Sensor")
return TRUE
// Gaters data for ui
/datum/computer_file/program/atmos/vueui_data_change(var/list/data, var/mob/user, var/datum/vueui/ui)
. = ..()
data = . || data || list()
// Gather data for computer header
var/headerdata = get_header_data(data["_PC"])
if(headerdata)
data["_PC"] = headerdata
. = data
var/turf/T = get_turf_or_move(computer)
if(T)
var/datum/gas_mixture/env = T.return_air()
VUEUI_SET_CHECK(data["read"], TRUE, ., data)
VUEUI_SET_CHECK(data["press"], env.return_pressure(), ., data)
VUEUI_SET_CHECK(data["temp"], env.temperature, ., data)
VUEUI_SET_CHECK(data["tempC"], env.temperature-T0C, ., data)
VUEUI_SET_CHECK_IFNOTSET(data["gas"], list("_" = "_"), ., data)
for(var/g in gas_data.gases)
if(!(g in env.gas))
VUEUI_SET_CHECK(data["gas"][g], null, ., data)
else
VUEUI_SET_CHECK(data["gas"][g], env.gas[g], ., data)
else
VUEUI_SET_CHECK(data["read"], FALSE, ., data)
VUEUI_SET_CHECK(data["press"], 0, ., data)
VUEUI_SET_CHECK(data["temp"], T0C, ., data)
VUEUI_SET_CHECK(data["tempC"], 0, ., data)
VUEUI_SET_CHECK_IFNOTSET(data["gas"], list("_" = "_"), ., data)
for(var/g in gas_data.gases)
VUEUI_SET_CHECK(data["gas"][g], null, ., data)
@@ -1,6 +1,6 @@
/datum/computer_file/program/newsbrowser
filename = "newsbrowser"
filedesc = "NTNet/ExoNet News Browser"
filedesc = "News Browser"
extended_desc = "This program may be used to view and download news articles from the network."
program_icon_state = "generic"
usage_flags = PROGRAM_CONSOLE | PROGRAM_LAPTOP | PROGRAM_TABLET | PROGRAM_STATIONBOUND | PROGRAM_WRISTBOUND
@@ -87,7 +87,7 @@
/datum/nano_module/program/computer_newsbrowser
name = "NTNet/ExoNet News Browser"
name = "News Browser"
/datum/nano_module/program/computer_newsbrowser/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state)
@@ -1,6 +1,6 @@
/datum/computer_file/program/chatclient
filename = "ntnrc_client"
filedesc = "NTNet Relay Chat Client"
filedesc = "Chat Client"
program_icon_state = "command"
extended_desc = "This program allows communication over the NTNRC network."
size = 2
@@ -10,27 +10,54 @@
ui_header = "ntnrc_idle.gif"
available_on_ntnet = TRUE
nanomodule_path = /datum/nano_module/program/computer_chatclient
color = LIGHT_COLOR_GREEN
silent = TRUE
var/last_message // Used to generate the toolbar icon
var/username
var/datum/ntnet_conversation/channel
var/operator_mode = FALSE // Channel operator mode
var/netadmin_mode = FALSE // Administrator mode (invisible to other users + bypasses passwords)
var/set_offline = FALSE // appear "invisible"
var/list/directmessagechannels = list()
color = LIGHT_COLOR_GREEN
/datum/computer_file/program/chatclient/New()
..()
username = "DefaultUser[rand(100, 999)]"
var/ringtone = "beep"
var/syndi_auth = FALSE
/datum/computer_file/program/chatclient/New(var/obj/item/modular_computer/comp)
..(comp)
if(!comp)
return
/datum/computer_file/program/chatclient/Topic(href, href_list)
if(..())
return TRUE
if(href_list["PRG_toggleringer"])
. = TRUE
silent = !silent
if(href_list["PRG_setringtone"])
. = TRUE
var/t = input(usr, "Please enter new ringtone", filedesc, ringtone) as text|null
if(!usr.Adjacent(computer) || !t)
return
var/obj/item/device/uplink/hidden/H = computer.hidden_uplink
if(istype(H) && H.check_trigger(usr, lowertext(t), lowertext(H.pda_code)))
to_chat(usr, SPAN_NOTICE("\The [computer] softly beeps."))
syndi_auth = TRUE
SSnanoui.close_uis(NM)
else
t = sanitize(t, 20)
ringtone = t
if(href_list["PRG_speak"])
. = TRUE
if(!channel)
return TRUE
var/mob/living/user = usr
if(ishuman(user))
user.visible_message("[SPAN_BOLD("\The [user]")] taps on [user.get_pronoun("his")] computer's screen.")
var/message = sanitize(input(user, "Enter message or leave blank to cancel: "))
if(!message || !channel)
return
@@ -43,6 +70,8 @@
to_chat(usr, SPAN_WARNING("The target chat isn't active on your program anymore!"))
return
var/mob/living/user = usr
if(ishuman(user))
user.visible_message("[SPAN_BOLD("\The [user]")] taps on [user.get_pronoun("his")] computer's screen.")
var/message = sanitize(input(user, "Enter message or leave blank to cancel: "))
if(!message)
return
@@ -192,9 +221,10 @@
var/names = list()
for(var/cl in ntnet_global.chat_clients)
var/datum/computer_file/program/chatclient/C = cl
if(C.set_offline || C == src)
continue
clients[C.username] = C
names += C.username
names -= username // Remove ourselves
names += "== Cancel =="
var/picked = input(usr, "Select with whom you would like to start a conversation.") in names
if(picked == "== Cancel ==")
@@ -230,26 +260,67 @@
ui_header = "ntnrc_idle.gif"
/datum/computer_file/program/chatclient/kill_program(var/forced = FALSE)
if(!forced)
var/confirm = alert("Are you sure you want to close the NTNRC Client? You will not be reachable via messaging if you do so.", "Close?", "Yes", "No")
if((confirm != "Yes") || (CanUseTopic(usr) != STATUS_INTERACTIVE))
return FALSE
channel = null
ntnet_global.chat_clients -= src
..(forced)
return TRUE
/datum/computer_file/program/chatclient/run_program(var/mob/user)
ntnet_global.chat_clients += src
if(!computer)
return
if(!istype(computer, /obj/item/modular_computer/silicon))
if((!computer.registered_id && !computer.register_account(src)))
return
if(!(src in ntnet_global.chat_clients))
ntnet_global.chat_clients += src
if(!username)
username = username_from_id()
return ..(user)
/datum/computer_file/program/chatclient/proc/username_from_id()
if(istype(computer, /obj/item/modular_computer/silicon))
var/obj/item/modular_computer/silicon/SC = computer
return SC.computer_host.name
if(!computer.registered_id)
return "Unknown"
return "[computer.registered_id.registered_name] ([computer.registered_id.assignment])"
/datum/computer_file/program/chatclient/event_unregistered()
..()
computer.set_autorun(filename)
ntnet_global.chat_clients -= src
kill_program(TRUE)
/datum/computer_file/program/chatclient/event_silentmode()
..()
if(silent == computer.silent)
silent = !silent
/datum/nano_module/program/computer_chatclient
name = "NTNet Relay Chat Client"
name = "Chat Client"
/datum/nano_module/program/computer_chatclient/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state)
if(!ntnet_global || !ntnet_global.chat_channels)
return
var/datum/computer_file/program/chatclient/C = program
if(C.computer.hidden_uplink && C.syndi_auth)
if(alert(user, "Resume or close and secure?", name, "Resume", "Close") == "Resume")
C.computer.hidden_uplink.trigger(user)
return
else
C.syndi_auth = FALSE
var/list/data = list()
if(program)
data = list("_PC" = program.get_header_data())
var/datum/computer_file/program/chatclient/C = program
if(!istype(C))
return
@@ -0,0 +1,46 @@
/datum/computer_file/program/scanner
size = 2
program_type = PROGRAM_SERVICE
available_on_ntnet = FALSE
usage_flags = PROGRAM_ALL_HANDHELD
var/mode = null
/datum/computer_file/program/scanner/service_activate()
. = ..()
if(!computer.scan_mode)
computer.scan_mode = mode
return TRUE
else
computer.visible_message(SPAN_WARNING("Cannot activate [filedesc]: Another scanner is already active!"))
return FALSE
/datum/computer_file/program/scanner/service_deactivate()
. = ..()
computer.scan_mode = null
/datum/computer_file/program/scanner/medical
filename = "med_scanner"
filedesc = "Medical Analyzer"
extended_desc = "A scanning suite capable of detecting major medical problems in individuals."
available_on_ntnet = TRUE
required_access_run = access_medical
required_access_download = access_medical
mode = SCANNER_MEDICAL
/datum/computer_file/program/scanner/science
filename = "sci_scanner"
filedesc = "Reagent Analyzer"
extended_desc = "A scanning suite capable of detecting active chemical reagents."
available_on_ntnet = TRUE
required_access_run = access_research
required_access_download = access_research
mode = SCANNER_REAGENT
/datum/computer_file/program/scanner/gas
filename = "gas_scanner"
filedesc = "Gas Analyzer"
extended_desc = "A scanning suite capable of detecting and parsing gaseous conditions within a closed atmospheric system."
available_on_ntnet = TRUE
required_access_run = list(access_atmospherics, access_research)
required_access_download = list(access_atmospherics, access_research)
mode = SCANNER_GAS
@@ -0,0 +1,107 @@
/datum/computer_file/program/signaler
filename = "signaler"
filedesc = "Remote Signaller"
program_icon_state = "generic"
extended_desc = "This program can be used to send wide-range signals of various frequencies."
size = 2
available_on_ntnet = TRUE
usage_flags = PROGRAM_ALL
var/obj/item/radio/integrated/signal/radio
var/doorcode
/datum/computer_file/program/signaler/New(var/obj/item/modular_computer/comp)
..(comp)
if(computer && computer.computer_emagged && computer.doorcode)
doorcode = computer.doorcode
/datum/computer_file/program/signaler/can_run(mob/user, loud, access_to_check, check_type)
. = ..()
if(!get_radio())
computer.output_error("Cannot open [filedesc]: missing signaler hardware.", 0)
return FALSE
/datum/computer_file/program/signaler/ui_interact(mob/user)
var/datum/vueui/ui = SSvueui.get_open_ui(user, src)
if (!ui)
ui = new /datum/vueui/modularcomputer(user, src, "mcomputer-signaler", 400, 300, "Remote Signaller")
ui.open()
/datum/computer_file/program/signaler/vueui_transfer(oldobj)
SSvueui.transfer_uis(oldobj, src, "mcomputer-signaler", 400, 300, "Remote Signaller")
return TRUE
/datum/computer_file/program/signaler/proc/get_radio()
if(istype(computer, /obj/item/modular_computer/silicon))
var/obj/item/modular_computer/silicon/true_computer = computer
if(!istype(true_computer.computer_host, /mob/living/silicon/pai))
return
var/mob/living/silicon/pai/host = true_computer.computer_host
return host.sradio
else
if(!computer || !computer.network_card?.sradio)
return
return computer.network_card.sradio
// Gathers data for ui
/datum/computer_file/program/signaler/vueui_data_change(var/list/data, var/mob/user, var/datum/vueui/ui)
. = ..()
data = . || data || list()
// Gather data for computer header
var/headerdata = get_header_data(data["_PC"])
if(headerdata)
data["_PC"] = headerdata
. = data
radio = get_radio()
if(!radio)
return
VUEUI_SET_CHECK(data["code"], radio.code, ., data)
VUEUI_SET_CHECK(data["frequency"], format_frequency(radio.frequency), ., data)
VUEUI_SET_CHECK(data["emagged"], computer.computer_emagged, ., data)
if(computer.computer_emagged)
if(doorcode == "RESET")
VUEUI_SET_CHECK(data["doorcode"], computer.doorcode, ., data)
VUEUI_SET_CHECK(doorcode, data["doorcode"], ., data)
/datum/computer_file/program/signaler/Topic(href, href_list)
. = ..()
radio = get_radio()
if(!radio)
return
if(href_list["send"])
radio.send_signal("ACTIVATE")
computer.output_message("[icon2html(host, viewers(get_turf(src)))] *beep* *beep*", 1)
return TRUE
else if(href_list["freq"])
var/new_frequency = (radio.frequency + href_list["freq"])
if(new_frequency < PUBLIC_LOW_FREQ || new_frequency > PUBLIC_HIGH_FREQ)
new_frequency = sanitize_frequency(new_frequency)
radio.set_frequency(new_frequency)
return TRUE
else if(href_list["code"])
radio.code += href_list["code"]
radio.code = Clamp(1, round(radio.code), 100)
return TRUE
else if(href_list["toggledoor"])
for(var/obj/machinery/door/blast/M in SSmachinery.all_machines)
if(M.id == href_list["toggledoor"])
if(M.density)
M.open()
else
M.close()
return TRUE
else if(href_list["resetcode"])
if(computer?.doorcode)
doorcode = "RESET"
SSvueui.check_uis_for_change(src)
return TRUE