mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-02 13:02:38 +00:00
## About The Pull Request This PR lets pAIs inserted into a PDA to control the PDA of their owner. They can see their own pAI configurations but cannot edit any of it. They also can't eject themselves from it. This means they can receive and send PDA messages as their owner, acting like a personal secretary This also adds support for multiple people using a PDA and its UI updating for all of them and PDA messages being received and responded to from multiple people under the same PDA It also removes pAI camera in favor of using siliconcamera, which is the same thing; this just cuts down on some copy paste. I also reverted PDA's ringer being off preventing messages from being sent to your chat, silent mode was meant to prevent only the ringing sound. ## Why It's Good For The Game pAIs can now do a little bit more to help their owners on a personal level, and adds support for more stuff like this in the future (an idea I had was being able to hack into PDAs in the same way the CE can hack into APCs remotely) This is a re-PR of https://github.com/tgstation/tgstation/pull/76445 but it's a little better this time and does not remove the PDA Messenger app from pAIs. ## Changelog 🆑 fix: PDAs being on silent no longer prevents PDAs from being sent to your chat, again. add: pAIs inserted into a PDA can now control the PDA, and will receive PDA messages sent to it (and can respond under the PDA's name). /🆑
234 lines
6.2 KiB
Plaintext
234 lines
6.2 KiB
Plaintext
/**
|
|
* update_tablet_open_uis
|
|
*
|
|
* Will search the user to see if they have the tablet open.
|
|
* If they don't, we'll open a new UI depending on the tab the tablet is meant to be on.
|
|
* If they do, we'll update the interface and title, then update all static data and re-send assets.
|
|
*
|
|
* This is best called when you're actually changing the app, as we don't check
|
|
* if we're swapping to the current UI repeatedly.
|
|
* Args:
|
|
* user - The person whose UI we're updating.
|
|
*/
|
|
/obj/item/modular_computer/proc/update_tablet_open_uis(mob/user)
|
|
var/datum/tgui/active_ui = SStgui.get_open_ui(user, src)
|
|
if(!active_ui)
|
|
if(active_program)
|
|
active_ui = new(user, src, active_program.tgui_id, active_program.filedesc)
|
|
active_program.ui_interact(user, active_ui)
|
|
else
|
|
active_ui = new(user, src, "NtosMain")
|
|
return active_ui.open()
|
|
|
|
for (var/datum/tgui/window as anything in open_uis)
|
|
if(active_program)
|
|
window.interface = active_program.tgui_id
|
|
window.title = active_program.filedesc
|
|
active_program.ui_interact(user, window)
|
|
else
|
|
window.interface = "NtosMain"
|
|
window.send_assets()
|
|
update_static_data_for_all_viewers()
|
|
|
|
|
|
/obj/item/modular_computer/ui_state(mob/user)
|
|
if(inserted_pai && (user == inserted_pai.pai))
|
|
return GLOB.contained_state
|
|
return ..()
|
|
|
|
/obj/item/modular_computer/interact(mob/user)
|
|
if(enabled)
|
|
ui_interact(user)
|
|
else
|
|
turn_on(user)
|
|
|
|
// Operates TGUI
|
|
/obj/item/modular_computer/ui_interact(mob/user, datum/tgui/ui)
|
|
if(!enabled || !user.can_read(src, READING_CHECK_LITERACY) || !use_power())
|
|
if(ui)
|
|
ui.close()
|
|
return
|
|
|
|
// Robots don't really need to see the screen, their wireless connection works as long as computer is on.
|
|
if(!screen_on && !issilicon(user))
|
|
if(ui)
|
|
ui.close()
|
|
return
|
|
|
|
if(honkvirus_amount > 0) // EXTRA annoying, huh!
|
|
honkvirus_amount--
|
|
playsound(src, 'sound/items/bikehorn.ogg', 30, TRUE)
|
|
|
|
ui = SStgui.try_update_ui(user, src, ui)
|
|
if(!ui)
|
|
update_tablet_open_uis(user)
|
|
|
|
/obj/item/modular_computer/ui_assets(mob/user)
|
|
var/list/data = list()
|
|
data += get_asset_datum(/datum/asset/simple/headers)
|
|
if(active_program)
|
|
data += active_program.ui_assets(user)
|
|
return data
|
|
|
|
/obj/item/modular_computer/ui_static_data(mob/user)
|
|
var/list/data = list()
|
|
if(active_program)
|
|
data += active_program.ui_static_data(user)
|
|
return data
|
|
|
|
data["show_imprint"] = istype(src, /obj/item/modular_computer/pda)
|
|
return data
|
|
|
|
/obj/item/modular_computer/ui_data(mob/user)
|
|
var/list/data = get_header_data()
|
|
if(active_program)
|
|
data += active_program.ui_data(user)
|
|
return data
|
|
|
|
data["pai"] = inserted_pai
|
|
data["has_light"] = has_light
|
|
data["light_on"] = light_on
|
|
data["comp_light_color"] = comp_light_color
|
|
|
|
data["login"] = list(
|
|
IDName = saved_identification || "Unknown",
|
|
IDJob = saved_job || "Unknown",
|
|
)
|
|
|
|
data["proposed_login"] = list(
|
|
IDName = computer_id_slot?.registered_name,
|
|
IDJob = computer_id_slot?.assignment,
|
|
)
|
|
|
|
data["removable_media"] = list()
|
|
if(inserted_disk)
|
|
data["removable_media"] += "Eject Disk"
|
|
var/datum/computer_file/program/ai_restorer/airestore_app = locate() in stored_files
|
|
if(airestore_app?.stored_card)
|
|
data["removable_media"] += "intelliCard"
|
|
|
|
data["programs"] = list()
|
|
for(var/datum/computer_file/program/program in stored_files)
|
|
data["programs"] += list(list(
|
|
"name" = program.filename,
|
|
"desc" = program.filedesc,
|
|
"header_program" = program.header_program,
|
|
"running" = !!(program in idle_threads),
|
|
"icon" = program.program_icon,
|
|
"alert" = program.alert_pending,
|
|
))
|
|
|
|
return data
|
|
|
|
// Handles user's GUI input
|
|
/obj/item/modular_computer/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
|
|
. = ..()
|
|
if(.)
|
|
return
|
|
|
|
if(ishuman(usr) && !allow_chunky)
|
|
var/mob/living/carbon/human/human_user = usr
|
|
if(human_user.check_chunky_fingers())
|
|
balloon_alert(human_user, "fingers are too big!")
|
|
return TRUE
|
|
|
|
switch(action)
|
|
if("PC_exit")
|
|
active_program.kill_program(usr)
|
|
return TRUE
|
|
if("PC_shutdown")
|
|
shutdown_computer()
|
|
return TRUE
|
|
if("PC_minimize")
|
|
if(!active_program)
|
|
return
|
|
active_program.background_program()
|
|
return TRUE
|
|
|
|
if("PC_killprogram")
|
|
var/prog = params["name"]
|
|
var/datum/computer_file/program/killed_program = find_file_by_name(prog)
|
|
|
|
if(!istype(killed_program))
|
|
return
|
|
|
|
killed_program.kill_program(usr)
|
|
to_chat(usr, span_notice("Program [killed_program.filename].[killed_program.filetype] with PID [rand(100,999)] has been killed."))
|
|
return TRUE
|
|
|
|
if("PC_runprogram")
|
|
open_program(usr, find_file_by_name(params["name"]))
|
|
return TRUE
|
|
|
|
if("PC_toggle_light")
|
|
toggle_flashlight()
|
|
return TRUE
|
|
|
|
if("PC_light_color")
|
|
var/mob/user = usr
|
|
var/new_color
|
|
while(!new_color)
|
|
new_color = input(user, "Choose a new color for [src]'s flashlight.", "Light Color",light_color) as color|null
|
|
if(!new_color)
|
|
return
|
|
if(is_color_dark(new_color, 50) ) //Colors too dark are rejected
|
|
to_chat(user, span_warning("That color is too dark! Choose a lighter one."))
|
|
new_color = null
|
|
set_flashlight_color(new_color)
|
|
return TRUE
|
|
|
|
if("PC_Eject_Disk")
|
|
var/param = params["name"]
|
|
var/mob/user = usr
|
|
switch(param)
|
|
if("Eject Disk")
|
|
if(!inserted_disk)
|
|
return
|
|
|
|
user.put_in_hands(inserted_disk)
|
|
inserted_disk = null
|
|
playsound(src, 'sound/machines/card_slide.ogg', 50)
|
|
return TRUE
|
|
|
|
if("intelliCard")
|
|
var/datum/computer_file/program/ai_restorer/airestore_app = locate() in stored_files
|
|
if(!airestore_app)
|
|
return
|
|
|
|
if(airestore_app.try_eject(user))
|
|
playsound(src, 'sound/machines/card_slide.ogg', 50)
|
|
return TRUE
|
|
|
|
if("ID")
|
|
if(RemoveID(user))
|
|
playsound(src, 'sound/machines/card_slide.ogg', 50)
|
|
return TRUE
|
|
|
|
if("PC_Imprint_ID")
|
|
imprint_id()
|
|
UpdateDisplay()
|
|
playsound(src, 'sound/machines/terminal_processing.ogg', 15, TRUE)
|
|
|
|
if("PC_Pai_Interact")
|
|
switch(params["option"])
|
|
if("eject")
|
|
if(!ishuman(usr))
|
|
return
|
|
remove_pai(usr)
|
|
if("interact")
|
|
inserted_pai.attack_self(usr)
|
|
return TRUE
|
|
|
|
if(active_program)
|
|
return active_program.ui_act(action, params, ui, state)
|
|
|
|
/obj/item/modular_computer/ui_host()
|
|
if(physical)
|
|
return physical
|
|
return src
|
|
|
|
/obj/item/modular_computer/ui_close(mob/user)
|
|
. = ..()
|
|
if(active_program)
|
|
active_program.ui_close(user)
|