From 775b9727a015417c32d19e33062de73804f29471 Mon Sep 17 00:00:00 2001
From: littleboobs <179515704+littleboobs@users.noreply.github.com>
Date: Wed, 4 Mar 2026 01:49:35 +0300
Subject: [PATCH 1/2] chat fix
---
.../modules/mob/dead/observer/observer_say.dm | 2 +-
code/modules/mob/hear_say.dm | 93 ++++++++++++-------
code/modules/mob/living/silicon/ai/ai_say.dm | 21 +++--
3 files changed, 72 insertions(+), 44 deletions(-)
diff --git a/code/modules/mob/dead/observer/observer_say.dm b/code/modules/mob/dead/observer/observer_say.dm
index b58f50ce012a..4e57af78baa9 100644
--- a/code/modules/mob/dead/observer/observer_say.dm
+++ b/code/modules/mob/dead/observer/observer_say.dm
@@ -8,7 +8,7 @@
return say_dead(message)
/mob/dead/observer/handle_track(message, verb = "говор%(ит,ят)%", atom/movable/speaker = null, speaker_name, atom/follow_target, hard_to_hear)
- return "([ghost_follow_link(follow_target, ghost = src)]) [speaker_name]"
+ return "([ghost_follow_link(follow_target, ghost = src)])"
/mob/dead/observer/handle_speaker_name(atom/movable/speaker = null, vname, hard_to_hear, check_name_against)
var/speaker_name = ..()
diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm
index a84abe4531b0..b58f272ddea0 100644
--- a/code/modules/mob/hear_say.dm
+++ b/code/modules/mob/hear_say.dm
@@ -173,31 +173,6 @@
var/turf/source = speaker? get_turf(speaker) : get_turf(src)
playsound_local(source, speech_sound, sound_vol, 1, sound_frequency)
-/mob/proc/colorize_name(atom/movable/speaker = null, speaker_name)
- if(!client)
- return speaker_name
-
- if(!speaker.chat_color || speaker.chat_color_name != speaker.name)
-
- var/step = round(length_char(speaker_name)/3)
- var/rgb[3]
- for(var/i = 1 to 3)
- rgb[i] = text2ascii_char(speaker_name, step*i)
- if(rgb[i] > 1071) rgb[i] -= 1072
- if(rgb[i] > 1039) rgb[i] -= 1040
- if(rgb[i] > 96) rgb[i] -= 97
- if(rgb[i] > 64) rgb[i] -= 65
- if(rgb[i] > 31) rgb[i] -= 32
- rgb[i] = rgb[i]*4 + 63 // base brightness
-
- speaker.chat_color = rgb(rgb[1],rgb[2],rgb[3])
- speaker.chat_color_darkened = rgb(rgb[1]-23,rgb[2]-23,rgb[3]-23)
- speaker.chat_color_name = speaker_name
-
- return "[speaker_name]"
- else
- return "[speaker_name]"
-
/mob/proc/hear_radio(list/message_pieces, verb = "говор%(ит,ят)%", part_a, part_b, atom/movable/speaker = null, hard_to_hear = 0, vname = "", atom/follow_target, check_name_against)
if(!client)
return
@@ -223,22 +198,21 @@
speaker_name = colorize_name(speaker, speaker_name)
track = handle_track(message, genderize_decode(speaker, verb), speaker, speaker_name, follow_target, hard_to_hear)
- if(!can_hear())
- if(prob(20))
- to_chat(src, span_warning("Ваша гарнитура вибрирует, но вы не слышите ни звука!"))
+ if(!can_hear() && prob(20))
+ to_chat(src, span_warning("Ваша гарнитура вибрирует, но вы не слышите ни звука!"))
+ else if(track)
+ to_chat(src, "[track] [part_a][speaker_name][part_b][message]")
else
- if(track)
- to_chat(src, "[part_a][track][message]")
- else
- to_chat(src, "[part_a][speaker_name][part_b][message]")
+ to_chat(src, "[part_a][speaker_name][part_b][message]")
if(client?.prefs.toggles2 & PREFTOGGLE_2_RUNECHAT)
create_chat_message(speaker, message_clean, list("radio"))
+
if(src != speaker || isrobot(src) || isAI(src))
INVOKE_ASYNC(GLOBAL_PROC, /proc/tts_cast, src, src, message_tts, speaker.tts_seed, FALSE, SOUND_EFFECT_RADIO, null, null, 'sound/effects/radio_chatter.ogg', speaker)
/mob/proc/handle_speaker_name(atom/movable/speaker = null, vname, hard_to_hear)
- var/speaker_name = "неизвестный"
+ var/speaker_name = UNKNOWN_NAME_RUS
if(speaker)
speaker_name = speaker.name
@@ -246,7 +220,7 @@
speaker_name = vname
if(hard_to_hear)
- speaker_name = "неизвестный"
+ speaker_name = UNKNOWN_NAME_RUS
return speaker_name
@@ -266,7 +240,7 @@
heardword = copytext(heardword,2)
if(copytext(heardword,-1) in punctuation)
heardword = copytext(heardword,1,length(heardword))
- heard = span_gamesay("...Вы слышите что-то про... \"[heardword]\"...")
+ heard = span_gamesay("...Вы слышите что-то про... \"[heardword]\"...")
else
heard = span_gamesay("...Вы почти что смогли расслышать что-то...")
else
@@ -312,3 +286,52 @@
continue
if(piece.speaking?.runechat_span)
return piece.speaking
+
+/**
+ * Returns speaker's name colored based on a hash of the name.
+ *
+ * Arguments:
+ * * speaker - atom whose name to color
+ * * speaker_name - display name
+ */
+/mob/proc/colorize_name(atom/movable/speaker = null, speaker_name)
+ if(!speaker)
+ return speaker_name
+
+ if(!speaker.chat_color || speaker.chat_color_name != speaker.name)
+ var/list/components = generate_color_components(speaker_name)
+ speaker.chat_color = rgb(components[1], components[2], components[3])
+ speaker.chat_color_darkened = rgb(
+ max(components[1] - 23, 0),
+ max(components[2] - 23, 0),
+ max(components[3] - 23, 0)
+ )
+ speaker.chat_color_name = speaker.name
+
+ return "[speaker_name]"
+
+/// Generates RGB components from a name by sampling three characters.
+/atom/movable/proc/generate_color_components(name)
+ var/step = round(length_char(name) / 3)
+ var/list/components = list(0, 0, 0)
+
+ for(var/i in 1 to 3)
+ var/char_code = text2ascii_char(name, step * i)
+ components[i] = normalize_char_code(char_code)
+
+ return components
+
+/// Normalizes character code to a color component (0–255).
+/proc/normalize_char_code(char_code)
+ if(char_code > 1071)
+ char_code -= 1072
+ else if(char_code > 1039)
+ char_code -= 1040
+ else if(char_code > 96)
+ char_code -= 97
+ else if(char_code > 64)
+ char_code -= 65
+ else if(char_code > 31)
+ char_code -= 32
+
+ return char_code * 4 + 63
diff --git a/code/modules/mob/living/silicon/ai/ai_say.dm b/code/modules/mob/living/silicon/ai/ai_say.dm
index 565dd8b1f3d1..7ebde8188d9d 100644
--- a/code/modules/mob/living/silicon/ai/ai_say.dm
+++ b/code/modules/mob/living/silicon/ai/ai_say.dm
@@ -40,17 +40,22 @@
var/track = ""
var/mob/mob_to_track = null
- jobname = html_encode(jobname)
- if(changed_voice && impersonating)
- mob_to_track = impersonating
- else if(isbot(follow_target))
- track = "[speaker_name] ([jobname])"
+
+ if(changed_voice)
+ if(impersonating)
+ mob_to_track = impersonating
+ else
+ track = "[speaker_name] ([jobname])"
else
- mob_to_track = speaker
+ if(isbot(follow_target))
+ track = "[speaker_name] ([jobname])"
+ else
+ mob_to_track = speaker
if(mob_to_track)
- track = "[speaker_name] ([jobname])"
- track += " \[Open\]"
+ track = "\[СЛЕД\]"
+ track += " \[ОТКР\]"
+
return track
// MARK: AI VOX Announcements
From 96fd71a36d8c239cc5991601935c5bbb3905a49c Mon Sep 17 00:00:00 2001
From: littleboobs <179515704+littleboobs@users.noreply.github.com>
Date: Wed, 4 Mar 2026 01:59:18 +0300
Subject: [PATCH 2/2] gemini review
---
code/modules/mob/hear_say.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm
index b58f272ddea0..0a1a6f552db3 100644
--- a/code/modules/mob/hear_say.dm
+++ b/code/modules/mob/hear_say.dm
@@ -334,4 +334,4 @@
else if(char_code > 31)
char_code -= 32
- return char_code * 4 + 63
+ return char_code * 4 + 63 // base brightness