From 4b1dde3872e697b9baf959b852c16bf428cdf596 Mon Sep 17 00:00:00 2001 From: VerySoft Date: Mon, 6 Jun 2022 23:25:35 -0400 Subject: [PATCH] Yet more pAI tweaks! Makes a 'Save Configuration' verb, that saves your name, flavortext, eye color, chassis, and card emotion! Then, to go with this, updates the various ways to become a pAI to allow you to load your configuration data into the pAI, rather than having to manually enter it every time. Also makes the ghost notification verb and the 'new personality submitted' message both print the same message, and puts it on a 5 minute cooldown so it can't be spammed too often (the ghost one still makes the screens light up as often as you push it, it just only prints the message in the chat every so often) Additionally, tweaks the release all proc so that it won't trigger the release message and sound when the only targets inside of you are absorbed and it's not releasing absorbed people. Also removes the admin notification when people use the 'Adjust Mass' verb to not deliver an admin notification, because it doesn't reeeally matter? It's the kind of message we never pay any attention to. So! Instead I changed it to log it instead, so it can still be investigated if need be, but without clogging up chat. --- code/game/objects/items/devices/paicard.dm | 69 +++++++++++++----- code/modules/admin/admin_verb_lists_vr.dm | 4 +- code/modules/admin/verbs/debug.dm | 22 +++--- code/modules/mob/dead/observer/observer.dm | 2 +- .../modules/mob/living/silicon/pai/examine.dm | 10 +-- code/modules/mob/living/silicon/pai/pai.dm | 1 + code/modules/mob/living/silicon/pai/pai_vr.dm | 62 +++++++++++++++- .../mob/living/silicon/pai/personality.dm | 4 + .../modules/mob/living/silicon/pai/recruit.dm | 27 +++++-- code/modules/vore/eating/belly_obj_vr.dm | 2 +- code/modules/vore/resizing/resize_vr.dm | 4 +- icons/obj/pda.dmi | Bin 29716 -> 29698 bytes vorestation.dme | 1 - 13 files changed, 155 insertions(+), 53 deletions(-) diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm index 23d7452f3d..0a73ea74c6 100644 --- a/code/game/objects/items/devices/paicard.dm +++ b/code/game/objects/items/devices/paicard.dm @@ -16,6 +16,7 @@ GLOBAL_LIST_BOILERPLATE(all_pai_cards, /obj/item/device/paicard) var/mob/living/silicon/pai/pai var/image/screen_layer var/screen_color = "#00ff0d" + var/last_notify = 0 /obj/item/device/paicard/relaymove(var/mob/user, var/direction) if(user.stat || user.stunned) @@ -44,26 +45,52 @@ GLOBAL_LIST_BOILERPLATE(all_pai_cards, /obj/item/device/paicard) if(choice == "No") return ..() - var/pai_name = input(user, "Choose your character's name", "Character Name") as text - var/actual_pai_name = sanitize_name(pai_name, ,1) - if(isnull(actual_pai_name)) - return ..() - + choice = tgui_alert(user, "Do you want to load your pAI data?", "Load", list("Yes", "No")) + var/actual_pai_name var/turf/location = get_turf(src) - if(istype(src , /obj/item/device/paicard/typeb)) - var/obj/item/device/paicard/typeb/card = new(location) - var/mob/living/silicon/pai/new_pai = new(card) - new_pai.key = user.key - card.setPersonality(new_pai) - new_pai.SetName(actual_pai_name) - else - var/obj/item/device/paicard/card = new(location) - var/mob/living/silicon/pai/new_pai = new(card) - new_pai.key = user.key - card.setPersonality(new_pai) - new_pai.SetName(actual_pai_name) + if(choice == "No") + var/pai_name = input(user, "Choose your character's name", "Character Name") as text + actual_pai_name = sanitize_name(pai_name, ,1) + if(isnull(actual_pai_name)) + return ..() + if(istype(src , /obj/item/device/paicard/typeb)) + var/obj/item/device/paicard/typeb/card = new(location) + var/mob/living/silicon/pai/new_pai = new(card) + new_pai.key = user.key + card.setPersonality(new_pai) + new_pai.SetName(actual_pai_name) + else + var/obj/item/device/paicard/card = new(location) + var/mob/living/silicon/pai/new_pai = new(card) + new_pai.key = user.key + card.setPersonality(new_pai) + new_pai.SetName(actual_pai_name) + + if(choice == "Yes") + if(istype(src , /obj/item/device/paicard/typeb)) + var/obj/item/device/paicard/typeb/card = new(location) + var/mob/living/silicon/pai/new_pai = new(card) + new_pai.key = user.key + card.setPersonality(new_pai) + if(!new_pai.savefile_load(new_pai)) + var/pai_name = input(new_pai, "Choose your character's name", "Character Name") as text + actual_pai_name = sanitize_name(pai_name, ,1) + if(isnull(actual_pai_name)) + return ..() + else + var/obj/item/device/paicard/card = new(location) + var/mob/living/silicon/pai/new_pai = new(card) + new_pai.key = user.key + card.setPersonality(new_pai) + if(!new_pai.savefile_load(new_pai)) + var/pai_name = input(new_pai, "Choose your character's name", "Character Name") as text + actual_pai_name = sanitize_name(pai_name, ,1) + if(isnull(actual_pai_name)) + return ..() + qdel(src) return ..() + // VOREStation Edit End /obj/item/device/paicard/attack_self(mob/user) @@ -352,9 +379,11 @@ GLOBAL_LIST_BOILERPLATE(all_pai_cards, /obj/item/device/paicard) current_emotion = emotion /obj/item/device/paicard/proc/alertUpdate() - var/turf/T = get_turf_or_move(src.loc) - for (var/mob/M in viewers(T)) - M.show_message("\The [src] flashes a message across its screen, \"Additional personalities available for download.\"", 3, "\The [src] bleeps electronically.", 2) + if(pai) + return + if(last_notify == 0 || (5 MINUTES <= world.time - last_notify)) + audible_message("\The [src] flashes a message across its screen, \"Additional personalities available for download.\"", hearing_distance = world.view, runemessage = "bleeps!") + last_notify = world.time /obj/item/device/paicard/emp_act(severity) for(var/mob/M in src) diff --git a/code/modules/admin/admin_verb_lists_vr.dm b/code/modules/admin/admin_verb_lists_vr.dm index 9f4d81120c..b871c3315b 100644 --- a/code/modules/admin/admin_verb_lists_vr.dm +++ b/code/modules/admin/admin_verb_lists_vr.dm @@ -112,7 +112,7 @@ var/list/admin_verbs_admin = list( /client/proc/change_human_appearance_self, // Allows the human-based mob itself change its basic appearance , /client/proc/change_security_level, /client/proc/view_chemical_reaction_logs, - /client/proc/makePAI, + /client/proc/makepAI, /client/proc/toggle_debug_logs, /client/proc/toggle_attack_logs, /datum/admins/proc/paralyze_mob, @@ -519,7 +519,7 @@ var/list/admin_verbs_event_manager = list( /client/proc/change_human_appearance_admin, // Allows an admin to change the basic appearance of human-based mobs , /client/proc/change_human_appearance_self, // Allows the human-based mob itself change its basic appearance , /client/proc/change_security_level, - /client/proc/makePAI, + /client/proc/makepAI, /client/proc/toggle_debug_logs, /client/proc/toggle_attack_logs, /datum/admins/proc/paralyze_mob, diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 8b0baa5967..40635bb7fe 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -129,31 +129,35 @@ M.Animalize() -/client/proc/makepAI(var/turf/T in mob_list) +/client/proc/makepAI() set category = "Fun" set name = "Make pAI" - set desc = "Specify a location to spawn a pAI device, then specify a key to play that pAI" + set desc = "Spawn someone in as a pAI!" + if(!check_rights(R_ADMIN|R_EVENT|R_DEBUG)) + return + var/turf/T = get_turf(mob) var/list/available = list() for(var/mob/C in mob_list) - if(C.key) + if(C.key && isobserver(C)) available.Add(C) var/mob/choice = tgui_input_list(usr, "Choose a player to play the pAI", "Spawn pAI", available) if(!choice) return 0 - if(!istype(choice, /mob/observer/dead)) - var/confirm = tgui_alert(usr, "[choice.key] isn't ghosting right now. Are you sure you want to yank them out of them out of their body and place them in this pAI?", "Spawn pAI Confirmation", list("No", "Yes")) - if(confirm != "Yes") - return 0 - var/obj/item/device/paicard/card = new(T) + var/obj/item/device/paicard/typeb/card = new(T) var/mob/living/silicon/pai/pai = new(card) - pai.name = sanitizeSafe(input(choice, "Enter your pAI name:", "pAI Name", "Personal AI") as text) pai.real_name = pai.name pai.key = choice.key card.setPersonality(pai) + if(tgui_alert(pai, "Do you want to load your pAI data?", "Load", list("Yes", "No")) == "Yes") + pai.savefile_load(pai) + else + pai.name = sanitizeSafe(input(pai, "Enter your pAI name:", "pAI Name", "Personal AI") as text) + card.setPersonality(pai) for(var/datum/paiCandidate/candidate in paiController.pai_candidates) if(candidate.key == choice.key) paiController.pai_candidates.Remove(candidate) + log_admin("made a pAI with key=[pai.key] at ([T.x],[T.y],[T.z])") feedback_add_details("admin_verb","MPAI") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_alienize(var/mob/M in mob_list) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 2d991e7290..f642131278 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -984,8 +984,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp var/obj/item/device/paicard/PP = p if(PP.pai == null) count++ - PP.icon = 'icons/obj/pda_vr.dmi' // VOREStation Edit PP.add_overlay("pai-ghostalert") + PP.alertUpdate() spawn(54) PP.cut_overlays() to_chat(usr,"Flashing the displays of [count] unoccupied PAIs.") diff --git a/code/modules/mob/living/silicon/pai/examine.dm b/code/modules/mob/living/silicon/pai/examine.dm index b6890470c9..9c009dcf6f 100644 --- a/code/modules/mob/living/silicon/pai/examine.dm +++ b/code/modules/mob/living/silicon/pai/examine.dm @@ -9,16 +9,10 @@ // VOREStation Edit: Start . += attempt_vr(src,"examine_bellies",args) //VOREStation Edit - if(ooc_notes) - . += "OOC Notes: \[View\]" - // VOREStation Edit: End - - . += "*---------*" - if(print_flavor_text()) . += "\n[print_flavor_text()]\n" - + // VOREStation Edit: End + . += "*---------*" if (pose) if(!findtext(pose, regex("\[.?!]$"))) // Will be zero if the last character is not a member of [.?!] pose = addtext(pose,".") //Makes sure all emotes end with a period. . += "
It is [pose]" //Extra
intentional - \ No newline at end of file diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 9c82783928..7187b245aa 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -286,6 +286,7 @@ if(istype(T)) T.visible_message("[src] folds outwards, expanding into a mobile form.") verbs |= /mob/living/silicon/pai/proc/pai_nom verbs |= /mob/living/proc/vertical_nom + update_icon() /mob/living/silicon/pai/verb/fold_up() set category = "pAI Commands" diff --git a/code/modules/mob/living/silicon/pai/pai_vr.dm b/code/modules/mob/living/silicon/pai/pai_vr.dm index f8eef7b8fe..6c36c82419 100644 --- a/code/modules/mob/living/silicon/pai/pai_vr.dm +++ b/code/modules/mob/living/silicon/pai/pai_vr.dm @@ -213,4 +213,64 @@ if(FEMALE) t_him = "her" visible_message("\The [src] hugs [A] to make [t_him] feel better!", \ - "You hug [A] to make [t_him] feel better!") \ No newline at end of file + "You hug [A] to make [t_him] feel better!") + +/mob/living/silicon/pai/proc/savefile_path(mob/user) + return "data/player_saves/[copytext(user.ckey, 1, 2)]/[user.ckey]/pai.sav" + +/mob/living/silicon/pai/proc/savefile_save(mob/user) + if(IsGuestKey(user.key)) + return 0 + + var/savefile/F = new /savefile(src.savefile_path(user)) + + + F["name"] << src.name + F["description"] << src.flavor_text + F["eyecolor"] << src.eye_color + F["chassis"] << src.chassis + F["emotion"] << src.card.current_emotion + F["version"] << 1 + + return 1 + +/mob/living/silicon/pai/proc/savefile_load(mob/user, var/silent = 1) + if (IsGuestKey(user.key)) + return 0 + + var/path = savefile_path(user) + + if (!fexists(path)) + return 0 + + var/savefile/F = new /savefile(path) + + if(!F) return //Not everyone has a pai savefile. + + var/version = null + F["version"] >> version + + if (isnull(version) || version != 1) + fdel(path) + if (!silent) + tgui_alert_async(user, "Your savefile was incompatible with this version and was deleted.") + return 0 + var/ourname + var/ouremotion + F["name"] >> ourname + SetName(ourname) + F["description"] >> flavor_text + F["eyecolor"] >> eye_color + F["chassis"] >> chassis + F["emotion"] >> ouremotion + card.screen_color = eye_color + if(ouremotion) + card.setEmotion(ouremotion) + update_icon() + return 1 + +/mob/living/silicon/pai/verb/save_pai_to_slot() + set category = "pAI Commands" + set name = "Save Configuration" + savefile_save(src) + to_chat(src, "[name] configuration saved to global pAI settings.") diff --git a/code/modules/mob/living/silicon/pai/personality.dm b/code/modules/mob/living/silicon/pai/personality.dm index 73ae49dcb7..de2b8fa202 100644 --- a/code/modules/mob/living/silicon/pai/personality.dm +++ b/code/modules/mob/living/silicon/pai/personality.dm @@ -57,4 +57,8 @@ F["description"] >> src.description F["role"] >> src.role F["comments"] >> src.comments + F["eyecolor"] >> src.eye_color + F["chassis"] >> src.chassis + F["emotion"] >> src.ouremotion + return 1 diff --git a/code/modules/mob/living/silicon/pai/recruit.dm b/code/modules/mob/living/silicon/pai/recruit.dm index ffd817d9c4..9b5afc434b 100644 --- a/code/modules/mob/living/silicon/pai/recruit.dm +++ b/code/modules/mob/living/silicon/pai/recruit.dm @@ -11,7 +11,9 @@ var/datum/paiController/paiController // Global handler for pAI candidates var/role var/comments var/ready = 0 - + var/chassis + var/ouremotion + var/eye_color /hook/startup/proc/paiControllerSetup() paiController = new /datum/paiController() @@ -33,14 +35,23 @@ var/datum/paiController/paiController // Global handler for pAI candidates return if(istype(card,/obj/item/device/paicard) && istype(candidate,/datum/paiCandidate)) var/mob/living/silicon/pai/pai = new(card) - if(!candidate.name) - pai.name = pick(ninja_names) - else - pai.name = candidate.name - pai.real_name = pai.name pai.key = candidate.key - card.setPersonality(pai) + if(!candidate.name) + pai.SetName(pick(ninja_names)) + else + pai.SetName(candidate.name) + if(candidate.description) + pai.flavor_text = candidate.description + if(candidate.eye_color) + pai.eye_color = candidate.eye_color + card.screen_color = pai.eye_color + if(candidate.chassis) + pai.chassis = candidate.chassis + if(candidate.ouremotion) + card.setEmotion(candidate.ouremotion) + pai.update_icon() + pai.real_name = pai.name card.looking_for_personality = 0 if(pai.mind) update_antag_icons(pai.mind) @@ -210,7 +221,7 @@ var/datum/paiController/paiController // Global handler for pAI candidates - Load Personality + Load Personality
diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm index 4054caa54e..fa1b2a0bdf 100644 --- a/code/modules/vore/eating/belly_obj_vr.dm +++ b/code/modules/vore/eating/belly_obj_vr.dm @@ -342,7 +342,7 @@ owner.update_icons() //Print notifications/sound if necessary - if(!silent) + if(!silent && count) owner.visible_message("[owner] expels everything from their [lowertext(name)]!") var/soundfile if(!fancy_vore) diff --git a/code/modules/vore/resizing/resize_vr.dm b/code/modules/vore/resizing/resize_vr.dm index b82ecb07e7..aa356e74b1 100644 --- a/code/modules/vore/resizing/resize_vr.dm +++ b/code/modules/vore/resizing/resize_vr.dm @@ -147,8 +147,8 @@ resize(new_size/100, uncapped = has_large_resize_bounds(), ignore_prefs = TRUE) // I'm not entirely convinced that `src ? ADMIN_JMP(src) : "null"` here does anything // but just in case it does, I'm leaving the null-src checking - message_admins("[key_name(src)] used the resize command in-game to be [new_size]% size. [src ? ADMIN_JMP(src) : "null"]") - + log_admin("[key_name(src)] used the resize command in-game to be [new_size]% size. [src ? ADMIN_JMP(src) : "null"]") + /* //Add the set_size() proc to usable verbs. By commenting this out, we can leave the proc and hand it to species that need it. /hook/living_new/proc/resize_setup(mob/living/H) diff --git a/icons/obj/pda.dmi b/icons/obj/pda.dmi index e7e7f0859cfc5938d7d106587e3bbcf29d1ae23c..f98d60b5bdf9955be072b6fc47909d5cb08dbf36 100644 GIT binary patch delta 9696 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 b0|zQwDadq?AuocM1TngPQ?FL%&L95+-xh&p delta 9714 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 diff --git a/vorestation.dme b/vorestation.dme index f8347cdadc..add3c1e377 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -2906,7 +2906,6 @@ #include "code\modules\mob\living\silicon\decoy\death.dm" #include "code\modules\mob\living\silicon\decoy\decoy.dm" #include "code\modules\mob\living\silicon\decoy\life.dm" -#include "code\modules\mob\living\silicon\pai\admin.dm" #include "code\modules\mob\living\silicon\pai\death.dm" #include "code\modules\mob\living\silicon\pai\examine.dm" #include "code\modules\mob\living\silicon\pai\life.dm"