diff --git a/code/datums/chat_message.dm b/code/datums/chat_message.dm
index db10b4ca5fb..b3b76a38ba8 100644
--- a/code/datums/chat_message.dm
+++ b/code/datums/chat_message.dm
@@ -95,8 +95,8 @@
if (!ismob(target))
extra_classes |= "small"
- // Append radio icon if from a virtual speaker
- if (extra_classes.Find("virtual-speaker"))
+ // Append radio icon if comes from a radio
+ if (extra_classes.Find("spoken_into_radio"))
var/image/r_icon = image('icons/chat_icons.dmi', icon_state = "radio")
text = "\icon[r_icon] " + text
@@ -172,13 +172,14 @@
* * spans - Additional classes to be added to the message
* * message_mode - Bitflags relating to the mode of the message
*/
-/mob/proc/create_chat_message(atom/movable/speaker, datum/language/message_language, raw_message, mode)
- var/extra_classes = list()
-
+/mob/proc/create_chat_message(atom/movable/speaker, datum/language/message_language, raw_message, mode, list/existing_extra_classes)
// Check for virtual speakers (aka hearing a message through a radio)
- if (istype(speaker, /atom/movable/virtualspeaker))
+ if (existing_extra_classes.Find("radio"))
return
+ var/list/extra_classes = list()
+ extra_classes += existing_extra_classes
+
if (mode == SPEECH_MODE_WHISPER)
extra_classes |= "small"
@@ -249,3 +250,9 @@
return "[rgb(x,m,c)]C8"
if(5)
return "[rgb(c,m,x)]C8"
+
+/client/verb/toggle_runechat_outline()
+ set category = "OOC"
+ set name = "Toggle Runechat Outlines"
+ toggle_runechat_outlines = !toggle_runechat_outlines
+ to_chat(mob, "Runechat outlines are now [toggle_runechat_outlines ? "enabled" : "disabled"].")
diff --git a/code/datums/saycode/speech.dm b/code/datums/saycode/speech.dm
index fbf45c478ad..6768e5bc205 100644
--- a/code/datums/saycode/speech.dm
+++ b/code/datums/saycode/speech.dm
@@ -164,5 +164,7 @@
if(data)
wrapper_classes=data.Copy()
+ wrapper_classes.Add("radio")
+
/datum/speech/proc/set_language(var/lang_id)
language = all_languages[lang_id]
diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm
index f0243269f6a..ab01320723d 100644
--- a/code/modules/client/client procs.dm
+++ b/code/modules/client/client procs.dm
@@ -546,9 +546,3 @@ NOTE: You will only be polled about this role once per round. To change your ch
/client/proc/handle_hear_voice(var/mob/origin)
if(prefs.hear_voicesound)
mob.playsound_local(get_turf(origin), get_sfx("voice"),50,1)
-
-/client/verb/toggle_runechat_outlight()
- set category = "OOC"
- set name = "Toggle Runechat Outlines"
- toggle_runechat_outlines = !toggle_runechat_outlines
- to_chat(mob, "Runechat outlines are now [toggle_runechat_outlines ? "enabled" : "disabled"].")
diff --git a/code/modules/mob/dead/observer/say.dm b/code/modules/mob/dead/observer/say.dm
index 5ba9f875181..f302ed4bf94 100644
--- a/code/modules/mob/dead/observer/say.dm
+++ b/code/modules/mob/dead/observer/say.dm
@@ -46,6 +46,6 @@
say_testing(src, "/mob/dead/observer/Hear(): CHAT_GHOSTRADIO is disabled, blocking. ([client.prefs.toggles] & [CHAT_GHOSTRADIO]) = [client.prefs.toggles & CHAT_GHOSTRADIO]")
return
if (client?.prefs.mob_chat_on_map && (client.prefs.obj_chat_on_map || ismob(speech.speaker)))
- create_chat_message(speech.speaker, speech.language, speech.message, speech.mode)
+ create_chat_message(speech.speaker, speech.language, speech.message, speech.mode, speech.wrapper_classes)
to_chat(src, "(Follow) [rendered_speech]")
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index fe339e87780..aaac7eed6f7 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -74,6 +74,19 @@ var/list/department_radio_keys = list(
":&" = "borerchat", "#&" = "borerchat", ".&" = "borerchat",
)
+var/list/headset_modes = list(
+ "Response Team",
+ "Command",
+ "Service",
+ "Engineering",
+ "Security",
+ "Syndicate",
+ "Supply",
+ "Medical",
+ "Science",
+ "department",
+)
+
/mob/living/proc/get_default_language()
if(!default_language)
if(languages && languages.len)
@@ -181,6 +194,8 @@ var/list/department_radio_keys = list(
treat_speech(speech)
var/radio_return = get_speech_flags(message_mode)
+ if (speech_was_spoken_into_radio(message_mode))
+ speech.wrapper_classes.Add("spoken_into_radio")
if(radio_return & NOPASS) //There's a whisper() message_mode, no need to continue the proc if that is called
whisper(speech.message, speech.language)
returnToPool(speech)
@@ -263,9 +278,9 @@ var/list/department_radio_keys = list(
// Runechat messages
if (ismob(speech.speaker) && client?.prefs.mob_chat_on_map && stat != UNCONSCIOUS && !is_deaf())
- create_chat_message(speech.speaker, speech.language, speech.message, speech.mode)
+ create_chat_message(speech.speaker, speech.language, speech.message, speech.mode, speech.wrapper_classes)
else if (client?.prefs.obj_chat_on_map && stat != UNCONSCIOUS && !is_deaf())
- create_chat_message(speech.speaker, speech.language, speech.message, speech.mode)
+ create_chat_message(speech.speaker, speech.language, speech.message, speech.mode, speech.wrapper_classes)
if (ismob(speech.speaker))
show_message(rendered_message, type, deaf_message, deaf_type, src)
else if (!client.prefs.no_goonchat_for_obj || length_char(speech.message) > client?.prefs.max_chat_length) // Objects : only display if no goonchat on map or if the runemessage is too small.
@@ -463,6 +478,14 @@ var/list/department_radio_keys = list(
return 0
+/mob/living/proc/speech_was_spoken_into_radio(var/message_mode)
+ if (message_mode in headset_modes)
+ return TRUE
+ switch (message_mode)
+ if(MODE_HEADSET, MODE_SECURE_HEADSET, MODE_R_HAND, MODE_L_HAND, MODE_INTERCOM, MODE_BINARY)
+ return TRUE
+ return FALSE
+
/mob/living/proc/radio(var/datum/speech/speech, var/message_mode)
switch(message_mode)
if(MODE_R_HAND)