From 307ab2ab6b91ef09f5b44f75fa8bff5a0e3730c3 Mon Sep 17 00:00:00 2001 From: Jeremiah <42397676+jlsnow301@users.noreply.github.com> Date: Fri, 3 Dec 2021 12:16:52 -0800 Subject: [PATCH] TGUI pAI Hotfix 1 (#63160) Adds a new ui state so that players can access the paicard tgui while it's slotted in their PDA (inside the pda wasn't technically in the user's close inventory). Adds some documentation for the pAI candidate file Users now get notifications if they can't save files (guest keys). pAIs previously had NO on screen indicator of hack progress, so I've given them a progressbar over the door More visual output for pAIs More output for edge cases More documentation Fixes #63161 --- code/__DEFINES/pai.dm | 2 ++ code/controllers/subsystem/pai.dm | 17 +++++++++++----- code/game/objects/items/devices/PDA/PDA.dm | 2 ++ code/game/objects/items/devices/paicard.dm | 8 ++++++-- code/modules/mob/living/silicon/pai/pai.dm | 17 +++++++++++----- .../mob/living/silicon/pai/personality.dm | 7 ++----- .../mob/living/silicon/pai/software.dm | 2 ++ code/modules/tgui/states/paicard.dm | 20 +++++++++++++++++++ tgstation.dme | 2 ++ tgui/packages/tgui/interfaces/PaiCard.tsx | 2 +- tgui/packages/tgui/interfaces/PaiSubmit.tsx | 1 + 11 files changed, 62 insertions(+), 18 deletions(-) create mode 100644 code/__DEFINES/pai.dm create mode 100644 code/modules/tgui/states/paicard.dm diff --git a/code/__DEFINES/pai.dm b/code/__DEFINES/pai.dm new file mode 100644 index 00000000000..4359cf9d8ea --- /dev/null +++ b/code/__DEFINES/pai.dm @@ -0,0 +1,2 @@ +/// Total percent required to hack a door. +#define HACK_COMPLETE 100 diff --git a/code/controllers/subsystem/pai.dm b/code/controllers/subsystem/pai.dm index 3171a27ebbf..3c66d28dc15 100644 --- a/code/controllers/subsystem/pai.dm +++ b/code/controllers/subsystem/pai.dm @@ -3,16 +3,26 @@ SUBSYSTEM_DEF(pai) flags = SS_NO_INIT|SS_NO_FIRE + /// List of pAI candidates, including those not submitted. var/list/candidates = list() + /// Prevents a crew member from hitting "request pAI" var/request_spam = FALSE + /// Prevents a pAI from submitting itself repeatedly and sounding an alert. var/submit_spam = FALSE + /// All pAI cards on the map. var/list/pai_card_list = list() +/// Created when a user clicks the "pAI candidate" window /datum/pai_candidate + /// User inputted OOC comments var/comments + /// User inputted behavior description var/description + /// User's ckey - not input var/key + /// User's pAI name. If blank, ninja name. var/name + /// If the user has hit "submit" var/ready = FALSE /** @@ -53,11 +63,9 @@ SUBSYSTEM_DEF(pai) candidates.Add(candidate) ui_interact(user) -/// Ensures an observer has the window open /datum/controller/subsystem/pai/ui_state(mob/user) return GLOB.observer_state -/// Opens the TGUI window /datum/controller/subsystem/pai/ui_interact(mob/user, datum/tgui/ui) . = ..() ui = SStgui.try_update_ui(user, src, ui) @@ -65,7 +73,6 @@ SUBSYSTEM_DEF(pai) ui = new(user, src, "PaiSubmit") ui.open() -/// The data sent to the window. /datum/controller/subsystem/pai/ui_static_data(mob/user) . = ..() var/list/data = list() @@ -78,7 +85,6 @@ SUBSYSTEM_DEF(pai) data["name"] = candidate.name return data -/// Actions sent by TGUI /datum/controller/subsystem/pai/ui_act(action, list/params, datum/tgui/ui) . = ..() if(.) @@ -86,6 +92,8 @@ SUBSYSTEM_DEF(pai) /// The matching candidate from search var/datum/pai_candidate/candidate = check_candidate(usr) if(isnull(candidate)) + to_chat(usr, span_warning("There was an error. Please resubmit.")) + ui.close() return FALSE switch(action) if("submit") @@ -100,7 +108,6 @@ SUBSYSTEM_DEF(pai) candidate.description = params["candidate"]["description"] candidate.name = params["candidate"]["name"] candidate.savefile_save(usr) - to_chat(usr, span_boldnotice("You have saved pAI information locally.")) if("load") candidate.savefile_load(usr) //In case people have saved unsanitized stuff. diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 5be3455948f..5accfb8efc9 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -678,6 +678,7 @@ GLOBAL_LIST_EMPTY(PDAs) pai.attack_self(U) if("2") // Eject pAI device usr.put_in_hands(pai) + pai.slotted = FALSE to_chat(usr, span_notice("You remove the pAI from the [name].")) //SKILL FUNCTIONS=================================== @@ -1085,6 +1086,7 @@ GLOBAL_LIST_EMPTY(PDAs) if(!user.transferItemToLoc(C, src)) return pai = C + pai.slotted = TRUE to_chat(user, span_notice("You slot \the [C] into [src].")) update_appearance() updateUsrDialog() diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm index efc25807657..32e6db7dbc1 100644 --- a/code/game/objects/items/devices/paicard.dm +++ b/code/game/objects/items/devices/paicard.dm @@ -11,8 +11,12 @@ custom_premium_price = PAYCHECK_HARD * 1.25 ///don't spam alert messages. var/alert_cooldown + /// If the pAIcard is slotted in a PDA + var/slotted = FALSE + /// Any pAI personalities inserted var/mob/living/silicon/pai/pai - var/emotion_icon = "off" ///what emotion icon we have. handled in /mob/living/silicon/pai/Topic() + ///what emotion icon we have. handled in /mob/living/silicon/pai/Topic() + var/emotion_icon = "off" resistance_flags = FIRE_PROOF | ACID_PROOF | INDESTRUCTIBLE /obj/item/paicard/suicide_act(mob/living/user) @@ -63,7 +67,7 @@ ui.open() /obj/item/paicard/ui_state(mob/user) - return GLOB.inventory_state + return GLOB.paicard_state /obj/item/paicard/ui_data(mob/user) . = ..() diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 920cf9e8c19..ddd88e42018 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -34,6 +34,8 @@ var/obj/item/paicard/card /// Are we hacking a door? var/hacking = FALSE + /// The progress for hacking + var/datum/progressbar/hackbar /// Changes the display to syndi if true var/emagged = FALSE @@ -174,22 +176,27 @@ aiPDA.name = real_name + " (" + aiPDA.ownjob + ")" /mob/living/silicon/pai/proc/process_hack(delta_time, times_fired) - if(hacking_cable && hacking_cable.machine && istype(hacking_cable.machine, /obj/machinery/door) && hacking_cable.machine == hackdoor && get_dist(src, hackdoor) <= 1) - hackprogress = clamp(hackprogress + (2 * delta_time), 0, 100) + if(hacking_cable?.machine && istype(hacking_cable.machine, /obj/machinery/door) && hacking_cable.machine == hackdoor && get_dist(src, hackdoor) <= 1) + hackprogress = clamp(hackprogress + (2 * delta_time), 0, HACK_COMPLETE) + hackbar.update(hackprogress) else to_chat(src, span_notice("Door Jack: Connection to airlock has been lost. Hack aborted.")) hackprogress = 0 hacking = FALSE hackdoor = null + hackbar.end_progress() + QDEL_NULL(hackbar) QDEL_NULL(hacking_cable) if(!QDELETED(card)) card.update_appearance() return - if(hackprogress >= 100) + if(hackprogress >= HACK_COMPLETE) hackprogress = 0 - var/obj/machinery/door/D = hacking_cable.machine - D.open() hacking = FALSE + hackbar.end_progress() + var/obj/machinery/door/door = hacking_cable.machine + door.open() + QDEL_NULL(hackbar) QDEL_NULL(hacking_cable) /mob/living/silicon/pai/make_laws() diff --git a/code/modules/mob/living/silicon/pai/personality.dm b/code/modules/mob/living/silicon/pai/personality.dm index 57f248cba48..b00fe994c10 100644 --- a/code/modules/mob/living/silicon/pai/personality.dm +++ b/code/modules/mob/living/silicon/pai/personality.dm @@ -12,17 +12,14 @@ /datum/pai_candidate/proc/savefile_save(mob/user) if(is_guest_key(user.key)) + to_chat(usr, span_warning("You cannot save pAI information as a guest.")) return FALSE - var/savefile/F = new /savefile(src.savefile_path(user)) - - WRITE_FILE(F["name"], name) WRITE_FILE(F["description"], description) WRITE_FILE(F["comments"], comments) - WRITE_FILE(F["version"], 1) - + to_chat(usr, span_boldnotice("You have saved pAI information locally.")) return TRUE // loads the savefile corresponding to the mob's ckey diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index 3a52930f388..433dae8614d 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -277,6 +277,8 @@ to_chat(AI, "Network Alert: Brute-force security override in progress in [turf.loc].") else to_chat(AI, "Network Alert: Brute-force security override in progress. Unable to pinpoint location.") + if(!hackbar) + hackbar = new(src, HACK_COMPLETE, hacking_cable.machine) hacking = TRUE /** diff --git a/code/modules/tgui/states/paicard.dm b/code/modules/tgui/states/paicard.dm new file mode 100644 index 00000000000..a2450b7588c --- /dev/null +++ b/code/modules/tgui/states/paicard.dm @@ -0,0 +1,20 @@ +/** + * tgui state: paicard_state + * + * Checks that the paicard is in the user's top-level + * (hand, ear, pocket, belt, etc) inventory OR + * if the paicard has been slotted into a PDA which + * is also on the user's person. + * + */ + +GLOBAL_DATUM_INIT(paicard_state, /datum/ui_state/paicard_state, new) + +/datum/ui_state/paicard_state/can_use_topic(obj/item/paicard/paicard, mob/user) + /// paicard is in the user's closest inventory + if(!paicard.slotted && (paicard in user)) + return user.shared_ui_interaction(paicard) + /// paicard is in a pda slot which is in the user's closest inventory + if(paicard.slotted && (paicard.loc in user)) + return user.shared_ui_interaction(paicard) + return UI_CLOSE diff --git a/tgstation.dme b/tgstation.dme index 44aa93739be..ef03c15dbce 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -109,6 +109,7 @@ #include "code\__DEFINES\networks.dm" #include "code\__DEFINES\nitrile.dm" #include "code\__DEFINES\obj_flags.dm" +#include "code\__DEFINES\pai.dm" #include "code\__DEFINES\pinpointers.dm" #include "code\__DEFINES\pipe_construction.dm" #include "code\__DEFINES\plumbing.dm" @@ -3851,6 +3852,7 @@ #include "code\modules\tgui\states\not_incapacitated.dm" #include "code\modules\tgui\states\notcontained.dm" #include "code\modules\tgui\states\observer.dm" +#include "code\modules\tgui\states\paicard.dm" #include "code\modules\tgui\states\physical.dm" #include "code\modules\tgui\states\self.dm" #include "code\modules\tgui\states\zlevel.dm" diff --git a/tgui/packages/tgui/interfaces/PaiCard.tsx b/tgui/packages/tgui/interfaces/PaiCard.tsx index e0fb1f56839..a46017eb750 100644 --- a/tgui/packages/tgui/interfaces/PaiCard.tsx +++ b/tgui/packages/tgui/interfaces/PaiCard.tsx @@ -169,7 +169,7 @@ const PaiOptions = (_, context) => { )} - {master && {dna}} + {!!master && {dna}} {laws}