Ghosts now have (better) runechat (#95843)

## About The Pull Request

Ports our optimizations to the version of ghost runechat introduced by
https://github.com/tgstation/tgstation/pull/95223

Instead of looping through all the mobs a second time it will do it in
deadchat_broadcast(). Also adds a global for if drunechat is
enabled/disabled and an admin verb for toggling it on or off.

<details><summary>still works</summary>

<img width="330" height="220" alt="dreamseeker_kkNBPBjbMv"
src="https://github.com/user-attachments/assets/4706ad98-fafe-4f88-9de0-6b72983ab044"
/>

</details>

## Why It's Good For The Game

Better option for performance

## Changelog

🆑
code: speeds ghost runechat up a bit, and makes it show as italic
admin: adds a 'toggle dead runechat' admin verb in case you need to
disable it midround for an event or something
/🆑
This commit is contained in:
Bloop
2026-05-05 14:54:04 -04:00
committed by GitHub
parent 5da29c311b
commit faaa1f1516
6 changed files with 21 additions and 14 deletions
+3 -1
View File
@@ -16,5 +16,7 @@
#define DISABLE_PARALLAX 7
/// Disables footsteps, TRAIT_BYPASS_MEASURES exempted
#define DISABLE_FOOTSTEPS 8
/// Disables runechat for ghosts
#define DISABLE_DEAD_RUNECHAT 9
#define MEASURES_AMOUNT 8 // The total number of switches defined above
#define MEASURES_AMOUNT 9 // The total number of switches defined above
+15 -5
View File
@@ -363,9 +363,11 @@ GLOBAL_LIST_INIT(skin_tone_names, list(
return spawned_mobs
#define SEE_DEADCHAT_ADMIN (1<<0)
#define SEE_DEADCHAT_NORMAL (1<<1)
// Displays a message in deadchat, sent by source. source is not linkified, message is, to avoid stuff like character names to be linkified.
// Automatically gives the class deadsay to the whole message (message + source)
/proc/deadchat_broadcast(message, source=null, mob/follow_target=null, turf/turf_target=null, speaker_key=null, message_type=DEADCHAT_REGULAR, admin_only=FALSE)
/proc/deadchat_broadcast(message, source=null, mob/follow_target=null, turf/turf_target=null, speaker_key=null, message_type=DEADCHAT_REGULAR, admin_only=FALSE, original_message)
message = span_deadsay("[source][span_linkify(message)]")
if(admin_only)
@@ -383,13 +385,13 @@ GLOBAL_LIST_INIT(skin_tone_names, list(
if(admin_only)
if(!M.client?.holder)
continue
var/override = FALSE
var/override = NONE
if(M.client?.holder && (chat_toggles & CHAT_DEAD))
override = TRUE
override = SEE_DEADCHAT_ADMIN
if(HAS_TRAIT(M, TRAIT_SIXTHSENSE) && message_type == DEADCHAT_REGULAR)
override = TRUE
override = SEE_DEADCHAT_NORMAL
if(SSticker.current_state == GAME_STATE_FINISHED)
override = TRUE
override = SEE_DEADCHAT_NORMAL
if(isnewplayer(M) && !override)
continue
if(M.stat != DEAD && !override)
@@ -413,6 +415,7 @@ GLOBAL_LIST_INIT(skin_tone_names, list(
if(isobserver(M))
var/rendered_message = message
override = SEE_DEADCHAT_NORMAL
if(follow_target)
var/F
@@ -429,6 +432,13 @@ GLOBAL_LIST_INIT(skin_tone_names, list(
else
to_chat(M, message, avoid_highlighting = speaker_key == M.key)
// Ghost runechat
if(original_message && ((override & SEE_DEADCHAT_NORMAL) || M.see_invisible >= follow_target.invisibility) && (!SSlag_switch.measures[DISABLE_DEAD_RUNECHAT] || HAS_TRAIT(M, TRAIT_BYPASS_MEASURES)) && M.runechat_prefs_check(M))
M.create_chat_message(follow_target, /datum/language/common, original_message, list(SPAN_ITALICS))
#undef SEE_DEADCHAT_ADMIN
#undef SEE_DEADCHAT_NORMAL
//Used in chemical_mob_spawn. Generates a random mob based on a given gold_core_spawnable value.
/proc/create_random_mob(spawn_location, mob_class = HOSTILE_SPAWN)
var/static/list/mob_spawn_meancritters = list() // list of possible hostile mobs
+1 -1
View File
@@ -10,7 +10,7 @@ SUBSYSTEM_DEF(lag_switch)
/// List of bools corresponding to code/__DEFINES/lag_switch.dm
var/static/list/measures[MEASURES_AMOUNT]
/// List of measures that toggle automatically
var/list/auto_measures = list(DISABLE_GHOST_ZOOM_TRAY, DISABLE_RUNECHAT, DISABLE_USR_ICON2HTML, DISABLE_PARALLAX, DISABLE_FOOTSTEPS)
var/list/auto_measures = list(DISABLE_GHOST_ZOOM_TRAY, DISABLE_RUNECHAT, DISABLE_USR_ICON2HTML, DISABLE_PARALLAX, DISABLE_FOOTSTEPS, DISABLE_DEAD_RUNECHAT)
/// Timer ID for the automatic veto period
var/veto_timer_id
/// Cooldown between say verb uses when slowmode is enabled
+1
View File
@@ -484,6 +484,7 @@ ADMIN_VERB(lag_switch_panel, R_ADMIN, "Show Lag Switches", "Display the controls
dat += "<br/><b>Measures below can be bypassed with a <abbr title='TRAIT_BYPASS_MEASURES'><u>special trait</u></abbr></b><br/>"
dat += "Slowmode say verb (informs world): <a href='byond://?_src_=holder;[HrefToken()];change_lag_switch=[SLOWMODE_SAY]'><b>[SSlag_switch.measures[SLOWMODE_SAY] ? "On" : "Off"]</b></a><br/>"
dat += "Disable runechat: <a href='byond://?_src_=holder;[HrefToken()];change_lag_switch=[DISABLE_RUNECHAT]'><b>[SSlag_switch.measures[DISABLE_RUNECHAT] ? "On" : "Off"]</b></a> - <span style='font-size:80%'>trait applies to speaker</span><br/>"
dat += "Disable dead runechat: <a href='byond://?_src_=holder;[HrefToken()];change_lag_switch=[DISABLE_DEAD_RUNECHAT]'><b>[SSlag_switch.measures[DISABLE_DEAD_RUNECHAT] ? "On" : "Off"]</b></a> - <span style='font-size:80%'>trait applies to speaker</span><br/>"
dat += "Disable examine icons: <a href='byond://?_src_=holder;[HrefToken()];change_lag_switch=[DISABLE_USR_ICON2HTML]'><b>[SSlag_switch.measures[DISABLE_USR_ICON2HTML] ? "On" : "Off"]</b></a> - <span style='font-size:80%'>trait applies to examiner</span><br/>"
dat += "Disable parallax: <a href='byond://?_src_=holder;[HrefToken()];change_lag_switch=[DISABLE_PARALLAX]'><b>[SSlag_switch.measures[DISABLE_PARALLAX] ? "On" : "Off"]</b></a> - <span style='font-size:80%'>trait applies to character</span><br />"
dat += "Disable footsteps: <a href='byond://?_src_=holder;[HrefToken()];change_lag_switch=[DISABLE_FOOTSTEPS]'><b>[SSlag_switch.measures[DISABLE_FOOTSTEPS] ? "On" : "Off"]</b></a> - <span style='font-size:80%'>trait applies to character</span><br />"
-1
View File
@@ -133,7 +133,6 @@ GLOBAL_VAR_INIT(normal_ooc_colour, "#002eb8")
else
GLOB.dooc_allowed = !GLOB.dooc_allowed
/client/proc/set_ooc()
set name = "Set Player OOC Color"
set desc = "Modifies player OOC Color"
+1 -6
View File
@@ -159,12 +159,7 @@
var/displayed_key = key
if(client?.holder?.fakekey)
displayed_key = null
deadchat_broadcast(rendered, source, follow_target = src, speaker_key = displayed_key)
for(var/mob/mobs_hearing as anything in GLOB.player_list)
if(SSticker.current_state != GAME_STATE_FINISHED && (mobs_hearing.see_invisible < invisibility || !isdead(mobs_hearing)))
continue
if(runechat_prefs_check(mobs_hearing))
mobs_hearing.create_chat_message(src, /datum/language/common, message)
deadchat_broadcast(rendered, source, follow_target = src, speaker_key = displayed_key, original_message = message)
///Check if this message is an emote
/mob/proc/check_emote(message, forced)