From fe104cf8dae81332af96c415c0819b064e05da24 Mon Sep 17 00:00:00 2001 From: John Willard <53777086+JohnFulpWillard@users.noreply.github.com> Date: Mon, 4 Sep 2023 16:32:52 +0000 Subject: [PATCH] pAIs control a PDA they're inserted into (#78103) ## 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 :cl: 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). /:cl: --- .../newscaster/newscaster_machine.dm | 3 +- code/modules/mob/living/living.dm | 2 +- .../computers/item/computer.dm | 43 +++++++++++++----- .../computers/item/computer_ui.dm | 29 +++++++----- .../modular_computers/computers/item/pda.dm | 2 +- .../modular_computers/file_system/program.dm | 2 +- .../programs/messenger/messenger_program.dm | 28 ++++++------ code/modules/pai/actions.dm | 15 ++++++ code/modules/pai/camera.dm | 19 ++++---- code/modules/pai/hud.dm | 8 ++-- code/modules/pai/pai.dm | 9 +--- code/modules/pai/software.dm | 2 +- icons/mob/actions/actions_silicon.dmi | Bin 10423 -> 10687 bytes 13 files changed, 97 insertions(+), 65 deletions(-) diff --git a/code/game/machinery/newscaster/newscaster_machine.dm b/code/game/machinery/newscaster/newscaster_machine.dm index ad08823981b..98cce390010 100644 --- a/code/game/machinery/newscaster/newscaster_machine.dm +++ b/code/game/machinery/newscaster/newscaster_machine.dm @@ -578,7 +578,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/newscaster, 30) targetcam = R.aicamera else if(ispAI(user)) var/mob/living/silicon/pai/R = user - targetcam = R.camera + if(R.aicamera) + targetcam = R.aicamera else if(iscyborg(user)) var/mob/living/silicon/robot/R = user if(R.connected_ai) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 5fda090dd9f..5cb45e8b089 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1252,7 +1252,7 @@ to_chat(src, span_warning("You don't have the physical ability to do this!")) return FALSE - if(!Adjacent(target) && (target.loc != src)) + if(!Adjacent(target) && (target.loc != src) && !recursive_loc_check(src, target)) if(issilicon(src) && !ispAI(src)) if(!(action_bitflags & ALLOW_SILICON_REACH)) // silicons can ignore range checks (except pAIs) to_chat(src, span_warning("You are too far away!")) diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm index 18a17311c3f..da83445a641 100644 --- a/code/modules/modular_computers/computers/item/computer.dm +++ b/code/modules/modular_computers/computers/item/computer.dm @@ -200,10 +200,7 @@ return TRUE if(istype(inserted_pai)) // Remove pAI - user.put_in_hands(inserted_pai) - balloon_alert(user, "removed pAI") - inserted_pai = null - update_appearance(UPDATE_ICON) + remove_pai(user) return TRUE // Gets IDs/access levels from card slot. Would be useful when/if PDAs would become modular PCs. //guess what @@ -414,7 +411,7 @@ var/mob/living/carbon/human/human_wearer = loc human_wearer.sec_hud_set_ID() if(inserted_pai == gone) - inserted_pai = null + update_appearance(UPDATE_ICON) if(inserted_disk == gone) inserted_disk = null update_appearance(UPDATE_ICON) @@ -713,12 +710,7 @@ return // Inserting a pAI - if(istype(attacking_item, /obj/item/pai_card) && !inserted_pai) - if(!user.transferItemToLoc(attacking_item, src)) - return - inserted_pai = attacking_item - balloon_alert(user, "inserted pai") - update_appearance(UPDATE_ICON) + if(istype(attacking_item, /obj/item/pai_card) && insert_pai(user, attacking_item)) return if(istype(attacking_item, /obj/item/stock_parts/cell)) @@ -792,7 +784,7 @@ internal_cell?.forceMove(drop_location()) computer_id_slot?.forceMove(drop_location()) inserted_disk?.forceMove(drop_location()) - inserted_pai?.forceMove(drop_location()) + remove_pai() new /obj/item/stack/sheet/iron(get_turf(loc), steel_sheet_cost) user.balloon_alert(user, "disassembled") relay_qdel() @@ -840,3 +832,30 @@ ///Returns a string of what to send at the end of messenger's messages. /obj/item/modular_computer/proc/get_messenger_ending() return "Sent from my PDA" + +/obj/item/modular_computer/proc/insert_pai(mob/user, obj/item/pai_card/card) + if(inserted_pai) + return FALSE + if(!user.transferItemToLoc(card, src)) + return FALSE + inserted_pai = card + balloon_alert(user, "inserted pai") + var/datum/action/innate/pai/messenger/messenger_ability = new(inserted_pai.pai) + messenger_ability.Grant(inserted_pai.pai) + update_appearance(UPDATE_ICON) + return TRUE + +/obj/item/modular_computer/proc/remove_pai(mob/user) + if(!inserted_pai) + return FALSE + var/datum/action/innate/pai/messenger/messenger_ability = locate() in inserted_pai.pai.actions + messenger_ability.Remove(inserted_pai.pai) + qdel(messenger_ability) + if(user) + user.put_in_hands(inserted_pai) + balloon_alert(user, "removed pAI") + else + inserted_pai.forceMove(drop_location()) + inserted_pai = null + update_appearance(UPDATE_ICON) + return TRUE diff --git a/code/modules/modular_computers/computers/item/computer_ui.dm b/code/modules/modular_computers/computers/item/computer_ui.dm index 11c12ea0c47..d5dcf98c623 100644 --- a/code/modules/modular_computers/computers/item/computer_ui.dm +++ b/code/modules/modular_computers/computers/item/computer_ui.dm @@ -20,15 +20,21 @@ active_ui = new(user, src, "NtosMain") return active_ui.open() - if(active_program) - active_ui.interface = active_program.tgui_id - active_ui.title = active_program.filedesc - active_program.ui_interact(user, active_ui) - else - active_ui.interface = "NtosMain" + 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() - update_static_data(user, active_ui) - active_ui.send_assets() + +/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) @@ -206,10 +212,9 @@ if("PC_Pai_Interact") switch(params["option"]) if("eject") - usr.put_in_hands(inserted_pai) - to_chat(usr, span_notice("You remove [inserted_pai] from the [name].")) - inserted_pai = null - update_appearance(UPDATE_ICON) + if(!ishuman(usr)) + return + remove_pai(usr) if("interact") inserted_pai.attack_self(usr) return TRUE diff --git a/code/modules/modular_computers/computers/item/pda.dm b/code/modules/modular_computers/computers/item/pda.dm index 9728e8c6f7f..1a766c3de7d 100644 --- a/code/modules/modular_computers/computers/item/pda.dm +++ b/code/modules/modular_computers/computers/item/pda.dm @@ -83,7 +83,7 @@ /obj/item/modular_computer/pda/interact(mob/user) . = ..() if(HAS_TRAIT(src, TRAIT_PDA_MESSAGE_MENU_RIGGED)) - explode(usr, from_message_menu = TRUE) + explode(user, from_message_menu = TRUE) /obj/item/modular_computer/pda/attack_self(mob/user) // bypass literacy checks to access syndicate uplink diff --git a/code/modules/modular_computers/file_system/program.dm b/code/modules/modular_computers/file_system/program.dm index 59ef183f6d6..1f36713380d 100644 --- a/code/modules/modular_computers/file_system/program.dm +++ b/code/modules/modular_computers/file_system/program.dm @@ -120,7 +120,7 @@ *access can contain a list of access numbers to check against. If access is not empty, it will be used istead of checking any inserted ID. */ /datum/computer_file/program/proc/can_run(mob/user, loud = FALSE, access_to_check, transfer = FALSE, list/access) - if(issilicon(user)) + if(issilicon(user) && !ispAI(user)) return TRUE if(isAdminGhostAI(user)) diff --git a/code/modules/modular_computers/file_system/programs/messenger/messenger_program.dm b/code/modules/modular_computers/file_system/programs/messenger/messenger_program.dm index e77e876c648..423f9c32dec 100644 --- a/code/modules/modular_computers/file_system/programs/messenger/messenger_program.dm +++ b/code/modules/modular_computers/file_system/programs/messenger/messenger_program.dm @@ -651,17 +651,17 @@ if(!isnull(viewing_messages_of) && viewing_messages_of == sender_ref) viewing_messages_of = REF(chat) - var/mob/living/receiver_mob = null - //Check our immediate loc - if(isliving(computer.loc)) - receiver_mob = computer.loc - //Maybe they are a silicon! - else - receiver_mob = get(computer, /mob/living/silicon) + var/list/mob/living/receievers = list() + if(computer.inserted_pai) + receievers += computer.inserted_pai.pai + if(computer.loc && isliving(computer.loc)) + receievers += computer.loc - var/should_ring = !alert_silenced || is_rigged - - if(should_ring && istype(receiver_mob) && receiver_mob.is_literate() && (receiver_mob.stat == CONSCIOUS || receiver_mob.stat == SOFT_CRIT)) + for(var/mob/living/messaged_mob as anything in receievers) + if(messaged_mob.stat >= UNCONSCIOUS) + continue + if(!messaged_mob.is_literate()) + continue var/reply_href = signal.data["rigged"] ? "explode" : "message" var/photo_href = signal.data["rigged"] ? "explode" : "open" var/reply @@ -676,16 +676,16 @@ var/sender_title = is_fake_user ? STRINGIFY_PDA_TARGET(fake_name, fake_job) : get_messenger_name(sender_messenger) var/sender_name = is_fake_user ? fake_name : sender_messenger.computer.saved_identification - if (isAI(receiver_mob)) - sender_title = "[sender_title]" + if (isAI(messaged_mob)) + sender_title = "[sender_title]" var/inbound_message = "[signal.format_message()]" inbound_message = emoji_parse(inbound_message) var/photo_message = signal.data["photo"] ? " (Photo Attached)" : "" - to_chat(receiver_mob, span_infoplain("[icon2html(computer, receiver_mob)] PDA message from [sender_title], \"[inbound_message]\"[photo_message] [reply]")) + to_chat(messaged_mob, span_infoplain("[icon2html(computer, messaged_mob)] PDA message from [sender_title], \"[inbound_message]\"[photo_message] [reply]")) - if (alert_able && should_ring) + if (alert_able && (!alert_silenced || is_rigged)) computer.ring(ringtone) SStgui.update_uis(computer) diff --git a/code/modules/pai/actions.dm b/code/modules/pai/actions.dm index 0d22d828382..e067cca01e9 100644 --- a/code/modules/pai/actions.dm +++ b/code/modules/pai/actions.dm @@ -61,3 +61,18 @@ /datum/action/innate/pai/light/Trigger(trigger_flags) ..() pai_owner.toggle_integrated_light() + +/datum/action/innate/pai/messenger + name = "Interact with PDA" + button_icon_state = "pda" + background_icon_state = "bg_tech" + overlay_icon_state = "bg_tech_border" + +/datum/action/innate/pai/messenger/Trigger(trigger_flags) + . = ..() + var/obj/item/pai_card/pai_holder = owner.loc + if(!istype(pai_holder.loc, /obj/item/modular_computer)) + owner.balloon_alert(owner, "not in a pda!") + return + var/obj/item/modular_computer/computer_host = pai_holder.loc + computer_host.interact(owner) diff --git a/code/modules/pai/camera.dm b/code/modules/pai/camera.dm index 30b1918651e..a091b208638 100644 --- a/code/modules/pai/camera.dm +++ b/code/modules/pai/camera.dm @@ -1,10 +1,8 @@ /mob/living/silicon/pai/ClickOn(atom/target, params) - ..() - if(!camera?.in_camera_mode) - return FALSE - //pAI picture taking - camera.toggle_camera_mode(sound = FALSE) - camera.captureimage(target, usr, camera.picture_size_x - 1, camera.picture_size_y - 1) + . = ..() + if(aicamera && aicamera.in_camera_mode) + aicamera.toggle_camera_mode(sound = FALSE) + aicamera.captureimage(target, usr) return TRUE /obj/item/camera/siliconcam/pai_camera @@ -46,13 +44,14 @@ * @returns {boolean} - TRUE if the camera worked. */ /mob/living/silicon/pai/proc/use_camera(mob/user, mode) - if(!camera || isnull(mode)) + if(!aicamera || isnull(mode)) return FALSE switch(mode) if(PAI_PHOTO_MODE_CAMERA) - camera.toggle_camera_mode(user) + aicamera.toggle_camera_mode(user) if(PAI_PHOTO_MODE_PRINTER) - camera.pai_print(user) + var/obj/item/camera/siliconcam/pai_camera/paicam = aicamera + paicam.pai_print(user) if(PAI_PHOTO_MODE_ZOOM) - camera.adjust_zoom(user) + aicamera.adjust_zoom(user) return TRUE diff --git a/code/modules/pai/hud.dm b/code/modules/pai/hud.dm index 057a199cdad..530780758d2 100644 --- a/code/modules/pai/hud.dm +++ b/code/modules/pai/hud.dm @@ -150,7 +150,7 @@ if(!..()) return var/mob/living/silicon/pai/pAI = usr - pAI.camera.toggle_camera_mode(usr) + pAI.aicamera.toggle_camera_mode(usr) /atom/movable/screen/pai/image_view name = "View Images" @@ -161,7 +161,7 @@ if(!..()) return var/mob/living/silicon/pai/pAI = usr - pAI.camera.viewpictures(usr) + pAI.aicamera.viewpictures(usr) /atom/movable/screen/pai/radio name = "radio" @@ -177,7 +177,6 @@ /datum/hud/pai/New(mob/living/silicon/pai/owner) ..() var/atom/movable/screen/using - var/mob/living/silicon/pai/mypai = mymob // Software menu using = new /atom/movable/screen/pai/software(null, src) @@ -238,9 +237,8 @@ using = new /atom/movable/screen/pai/modpc(null, src) using.screen_loc = ui_pai_mod_int static_inventory += using - mypai.pda_button = using var/atom/movable/screen/pai/modpc/tablet_button = using - tablet_button.pAI = mypai + tablet_button.pAI = mymob // Internal GPS using = new /atom/movable/screen/pai/internal_gps(null, src) diff --git a/code/modules/pai/pai.dm b/code/modules/pai/pai.dm index f8476339468..490e614b51f 100644 --- a/code/modules/pai/pai.dm +++ b/code/modules/pai/pai.dm @@ -79,10 +79,6 @@ var/obj/item/instrument/piano_synth/instrument /// Newscaster var/obj/machinery/newscaster/pai/newscaster - /// PDA - var/atom/movable/screen/ai/modpc/pda_button - /// Photography module - var/obj/item/camera/siliconcam/pai_camera/camera /// Remote signaler var/obj/item/assembly/signaler/internal/signaler @@ -155,7 +151,6 @@ /mob/living/silicon/pai/Destroy() QDEL_NULL(atmos_analyzer) - QDEL_NULL(camera) QDEL_NULL(hacking_cable) QDEL_NULL(host_scan) QDEL_NULL(instrument) @@ -195,8 +190,8 @@ /mob/living/silicon/pai/Exited(atom/movable/gone, direction) if(gone == atmos_analyzer) atmos_analyzer = null - else if(gone == camera) - camera = null + else if(gone == aicamera) + aicamera = null else if(gone == host_scan) host_scan = null else if(gone == internal_gps) diff --git a/code/modules/pai/software.dm b/code/modules/pai/software.dm index 85f952c43eb..103056a5535 100644 --- a/code/modules/pai/software.dm +++ b/code/modules/pai/software.dm @@ -125,7 +125,7 @@ if("Newscaster") newscaster = new(src) if("Photography Module") - camera = new(src) + aicamera = new /obj/item/camera/siliconcam/pai_camera(src) if("Remote Signaler") signaler = new(src) return TRUE diff --git a/icons/mob/actions/actions_silicon.dmi b/icons/mob/actions/actions_silicon.dmi index 7be634e9f6ca36db23b01a9dfb667549ff9391e2..9c4b7ec7fbe85d5eb629bea648420ad9ba1924c7 100644 GIT binary patch literal 10687 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 D(dnuF literal 10423 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