Storyteller Narration Filters (#21767)

This PR adds a feature requested of me by @Fyniiy , adding optional
Filters to the Narrate panel that allow Storytellers to narrate only to
people that meet a set condition. The conditions themselves were
specifically requested to be "Psi Narrates" and "Synth Narrates", with
optional variations on Synth narrates that include people with cranial
implants. While I was touching these files, I've also fixed the improper
message sanitization bug with admin messages in general.

<img width="926" height="536" alt="image"
src="https://github.com/user-attachments/assets/08dcfd2a-5399-48b0-a13d-2bfd3a2c88f0"
/>

Here's a breakdown of the filter options.

1. **Skrell-like Psi-sensitives**: Anyone with a Psi-sensitivity score
of "At least 1". This will include Skrell, anyone with a Psi-receiver,
and people with the High Psi-sensitivity trait. It will exclude people
who are blocked from receiving telepathy for any reason, such as having
a mindshield, mindblanker, or having the psi-suppression power active.
Skrell with the Low Psi-sensitivity trait are counted as "Human-like
Psi-sensitives", and so won't be caught by this filter.
2. **Human-like Psi-sensitives**: Anyone who isn't blocked from
receiving telepathy, and also has a Psi-sensitivity score of "At least
0". This will basically catch "Most people who aren't a Vaurca,
Synthetic, or Diona". It will ignore Humanoids with the Low
Psi-sensitivity trait.
3. **Silicons**: Basically all of the possible robots/IPCs.
4. **Silicons + Implants**: It's fairly common practice during Hivebot
related events for Storytellers to also include characters with brain
implants. This filter automates that by including said brain implant
owners in the "Are you a synthetic?" check.
5. **Hivenet**: Pretty simple, people with the Vaurca language. This
would be Vaurca, plus anyone with the hivenet implants.
This commit is contained in:
VMSolidus
2026-02-02 10:40:30 -05:00
committed by GitHub
parent d0f44e1a14
commit cc0a809b4c
7 changed files with 130 additions and 4 deletions
+2
View File
@@ -49,6 +49,7 @@ GLOBAL_LIST_INIT(admin_verbs_admin, list(
/client/proc/cmd_admin_local_narrate, //sends text to all mobs within 7 tiles of src.mob
/client/proc/cmd_admin_local_screen_text,
/client/proc/cmd_admin_global_screen_text,
/client/proc/cmd_admin_open_narrate_panel, // Admin logged variant of the narrator panel.
/client/proc/cmd_admin_world_narrate, //sends text to all players with no padding,
/client/proc/cmd_admin_create_centcom_report,
/client/proc/check_ai_laws, //shows AI and borg laws,
@@ -309,6 +310,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, list(
/client/proc/cmd_admin_local_narrate,
/client/proc/cmd_admin_local_screen_text,
/client/proc/cmd_admin_global_screen_text,
/client/proc/cmd_admin_open_narrate_panel, // Admin logged variant of the narrator panel.
/client/proc/cmd_admin_world_narrate,
/client/proc/cmd_admin_grab_observers,
/client/proc/cmd_admin_create_centcom_report,
+19 -4
View File
@@ -26,7 +26,7 @@
to_chat(src, "Only administrators may use this command.")
return
var/msg = sanitize(input("Message:", "Subtle PM to [M.key]"))
var/msg = tgui_input_text(usr, "Enter your subtle message", "Subtle PM to [M.key]")
if (!msg)
return
@@ -83,7 +83,7 @@
to_chat(src, "Only administrators may use this command.")
return
var/msg = html_decode(sanitize(input("Message:", "Enter the text you wish to appear to everyone:")))
var/msg = tgui_input_text(usr, "Enter the text you wish to appear to everyone:", "Message:")
if (!msg)
return
@@ -110,7 +110,7 @@
else
return
var/msg = html_decode(sanitize(input("Message:", "Enter the text you wish to appear to everyone within seven tiles of you:")))
var/msg = tgui_input_text(usr, "Enter the text you wish to appear to everyone within seven tiles of you:", "Message:")
if(!msg)
return
for(var/M in message_mobs)
@@ -192,7 +192,7 @@
if(!M)
return
var/msg = html_decode(sanitize(input("Message:", "Enter the text you wish to appear to your target:")))
var/msg = tgui_input_text(usr, "Enter the text you wish to appear to your target:", "Message:")
if( !msg )
return
@@ -1126,3 +1126,18 @@ Traitors and the like can also be revived with the previous role mostly intact.
message_admins("[key_name_admin(usr)] sent a pregenerated tip of the round.")
log_admin("[key_name(usr)] sent a pregenerated Tip of the Round.")
feedback_add_details("admin_verb","FAP")
// Variant of the narrate panel that is for admins. This is logged to check if people are abusing it.
/client/proc/cmd_admin_open_narrate_panel()
set category = "Special Verbs"
set name = "Narration Panel"
if (!check_rights(R_ADMIN, TRUE))
return
var/datum/tgui_module/narrate_panel/NP = new /datum/tgui_module/narrate_panel(usr)
NP.ui_interact(usr)
message_admins("[key_name_admin(usr)] used the Narration Panel")
log_admin("[key_name(usr)] used the Narration Panel")
feedback_add_details("admin_verb", "AONP")