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