Say verb & skin shenanigans (Pray is a hotkey, Whisper is in commandbar) (#95477)

## About The Pull Request

Removes Say/Me/OOC/Pray/Whisper as stat panel verbs

1. Adds a hotkey for Pray, P by default, and also adds it to the list of
say modes (so tabbing on tgui-say will show it)
2. Makes Whisper a button on the commandbar, which is literally just
``say "#``, letting players know it exists in a more direct manner.
3. You now need 2 characters to be considered "typing", so `#` for
whisper won't cause you to start to think anymore.

Also messes around with the skin a bit, moving the commandbar to be
separate from the chat window, therefore not resizing if the chat
window/stat panel splitter changes, since I was already messing with the
command bar entirely I might as well look into getting this fixed. This
will go even better with
https://github.com/tgstation/tgstation/pull/95383 as it wont stretch the
command bar when the stat panel is closed.



https://github.com/user-attachments/assets/26cd9df0-7582-445e-9f67-c03d2c9cf46d


Also adds a new Adminhelp submenu for the Pray button for additional
visibility



https://github.com/user-attachments/assets/64f31f86-92a2-4f04-b248-6bbe301919fe


My current goal is the deletion of the IC tab so I've been trying to
inch towards that.

## Why It's Good For The Game

Moves Praying & Whispering into something that's more easily seen by
newer players, and helps cut some of the more useless verbs out of the
stat panel.

This is also part of my project you can see more of here -
https://hackmd.io/443_dE5lRWeEAp9bjGcKYw?view

## Changelog

🆑
qol: Pray verb is now a hotkey, Whisper is now a command bar button, and
all say verbs have been removed from the stat panel.
qol: Admin button on the escape menu is now its own section for praying,
as well as seeing your latest ticket & admin notes.
fix: Resizing the stat panel will no longer change the size of the
command bar.
/🆑
This commit is contained in:
John Willard
2026-04-26 07:20:58 +03:00
committed by GitHub
parent 092107651c
commit 475fe94750
22 changed files with 293 additions and 146 deletions
@@ -1,12 +1,12 @@
/atom/movable/screen/escape_menu/text/clickable/admin_help
///Text that gets highlighted when you have an admin ticket notification.
/atom/movable/screen/escape_menu/text/clickable/admin_ticket_notification
VAR_PRIVATE
current_blink = FALSE
is_blinking = FALSE
last_blink_time = 0
blink_interval = 0.4 SECONDS
/atom/movable/screen/escape_menu/text/clickable/admin_help/Initialize(
/atom/movable/screen/escape_menu/text/clickable/admin_ticket_notification/Initialize(
mapload,
datum/hud/hud_owner,
datum/escape_menu/escape_menu,
@@ -18,7 +18,6 @@
. = ..()
RegisterSignal(escape_menu.client, COMSIG_ADMIN_HELP_RECEIVED, PROC_REF(on_admin_help_received))
RegisterSignals(escape_menu.client, list(COMSIG_CLIENT_VERB_ADDED, COMSIG_CLIENT_VERB_REMOVED), PROC_REF(on_client_verb_changed))
var/datum/admin_help/current_ticket = escape_menu.client?.current_ticket
if (!isnull(current_ticket))
@@ -26,48 +25,12 @@
if (!current_ticket?.player_replied)
begin_processing()
/atom/movable/screen/escape_menu/text/clickable/admin_help/Click(location, control, params)
if (!enabled())
return
QDEL_IN(escape_menu, 0)
var/client/client = escape_menu.client
if (has_open_adminhelp())
client?.view_latest_ticket()
else
client?.adminhelp()
/atom/movable/screen/escape_menu/text/clickable/admin_help/proc/has_open_adminhelp()
var/client/client = escape_menu.client
var/datum/admin_help/current_ticket = client?.current_ticket
// This is null with a closed ticket.
// This is okay since the View Latest Ticket panel already tells you if your ticket is closed, intentionally.
if (isnull(current_ticket))
return FALSE
// If we sent a ticket, but nobody has responded, send another one instead.
// Not worth opening a menu when there's nothing to read, you're only going to want to send.
if (length(current_ticket.admins_involved - client?.ckey) == 0)
return FALSE
return TRUE
/atom/movable/screen/escape_menu/text/clickable/admin_help/proc/on_admin_help_received()
/atom/movable/screen/escape_menu/text/clickable/admin_ticket_notification/proc/on_admin_help_received()
SIGNAL_HANDLER
begin_processing()
/atom/movable/screen/escape_menu/text/clickable/admin_help/proc/on_client_verb_changed(client/source, list/verbs_changed)
SIGNAL_HANDLER
if (/client/verb/adminhelp in verbs_changed)
update_text()
/atom/movable/screen/escape_menu/text/clickable/admin_help/proc/begin_processing()
/atom/movable/screen/escape_menu/text/clickable/admin_ticket_notification/proc/begin_processing()
if (is_blinking)
return
@@ -76,7 +39,7 @@
START_PROCESSING(SSescape_menu, src)
update_text()
/atom/movable/screen/escape_menu/text/clickable/admin_help/proc/end_processing()
/atom/movable/screen/escape_menu/text/clickable/admin_ticket_notification/proc/end_processing()
if (!is_blinking)
return
@@ -85,26 +48,17 @@
STOP_PROCESSING(SSescape_menu, src)
update_text()
/atom/movable/screen/escape_menu/text/clickable/admin_help/proc/connect_ticket(datum/admin_help/admin_help)
/atom/movable/screen/escape_menu/text/clickable/admin_ticket_notification/proc/connect_ticket(datum/admin_help/admin_help)
ASSERT(istype(admin_help))
RegisterSignal(admin_help, COMSIG_ADMIN_HELP_REPLIED, PROC_REF(on_admin_help_replied))
/atom/movable/screen/escape_menu/text/clickable/admin_help/proc/on_admin_help_replied()
/atom/movable/screen/escape_menu/text/clickable/admin_ticket_notification/proc/on_admin_help_replied()
SIGNAL_HANDLER
end_processing()
/atom/movable/screen/escape_menu/text/clickable/admin_help/enabled()
if (!..())
return FALSE
if (!has_open_adminhelp())
return /client/verb/adminhelp in escape_menu.client?.verbs
return TRUE
/atom/movable/screen/escape_menu/text/clickable/admin_help/process(seconds_per_tick)
/atom/movable/screen/escape_menu/text/clickable/admin_ticket_notification/process(seconds_per_tick)
if (world.time - last_blink_time < blink_interval)
return
@@ -112,19 +66,42 @@
last_blink_time = world.time
update_text()
/atom/movable/screen/escape_menu/text/clickable/admin_help/text_color()
/atom/movable/screen/escape_menu/text/clickable/admin_ticket_notification/text_color()
if (!enabled())
return ..()
return current_blink ? "red" : ..()
/atom/movable/screen/escape_menu/text/clickable/admin_help/MouseEntered(location, control, params)
/atom/movable/screen/escape_menu/text/clickable/admin_ticket_notification/MouseEntered(location, control, params)
. = ..()
if (is_blinking)
openToolTip(usr, src, params, content = "An admin is trying to talk to you!")
/atom/movable/screen/escape_menu/text/clickable/admin_help/MouseExited(location, control, params)
/atom/movable/screen/escape_menu/text/clickable/admin_ticket_notification/MouseExited(location, control, params)
. = ..()
closeToolTip(usr)
///The button used for adminhelping, this is used to grey it out when you're on cooldown.
/atom/movable/screen/escape_menu/text/clickable/admin_help/Initialize(
mapload,
datum/hud/hud_owner,
datum/escape_menu/escape_menu,
button_text,
list/offset,
font_size = 24,
on_click_callback,
)
. = ..()
RegisterSignals(escape_menu.client, list(COMSIG_CLIENT_VERB_ADDED, COMSIG_CLIENT_VERB_REMOVED), PROC_REF(on_client_verb_changed))
/atom/movable/screen/escape_menu/text/clickable/admin_help/proc/on_client_verb_changed(client/source, list/verbs_changed)
SIGNAL_HANDLER
if (/client/verb/adminhelp in verbs_changed)
update_text()
/atom/movable/screen/escape_menu/text/clickable/admin_help/enabled()
return (/client/verb/adminhelp in escape_menu.client?.verbs)
@@ -23,7 +23,7 @@
//this decides how far out you can 'click' on this, so it's important to keep it short.
//yes even here, maptext can still embed links without using clickable subtype.
src.maptext_width = round((max(length(button_text), 20) * (font_size / 2.25)), 1)
src.maptext_width = max(round(length(button_text) * font_size * 0.75), font_size * 4)
src.maptext_height = (maptext_height * (font_size / 5))
src.maptext_height *= length(splittext(button_text, "\n"))