diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm
index 2734438494..5ba78b33c5 100755
--- a/code/modules/mob/language.dm
+++ b/code/modules/mob/language.dm
@@ -21,6 +21,10 @@
/datum/language/proc/format_message_radio(message, verb)
return "[verb], \"[capitalize(message)]\""
+/datum/language/proc/get_talkinto_msg_range(message)
+ // if you yell, you'll be heard from two tiles over instead of one
+ return (copytext(message, length(message)) == "!") ? 2 : 1
+
/datum/language/proc/broadcast(var/mob/living/speaker,var/message,var/speaker_mask)
log_say("[key_name(speaker)] : ([name]) [message]")
@@ -47,7 +51,7 @@
name = "Noise"
desc = "Noises"
key = ""
- flags = RESTRICTED|NONGLOBAL|INNATE
+ flags = RESTRICTED|NONGLOBAL|INNATE|NO_TALK_MSG
/datum/language/noise/format_message(message, verb)
return "[message]"
@@ -55,6 +59,10 @@
/datum/language/noise/format_message_radio(message, verb)
return "[message]"
+/datum/language/noise/get_talkinto_msg_range(message)
+ // if you make a loud noise (screams etc), you'll be heard from 4 tiles over instead of two
+ return (copytext(message, length(message)) == "!") ? 4 : 2
+
/datum/language/unathi
name = "Sinta'unathi"
desc = "The common language of Moghes, composed of sibilant hisses and rattles. Spoken natively by Unathi."
@@ -297,15 +305,14 @@
return 1
/mob/proc/remove_language(var/rem_language)
-
- languages.Remove(all_languages[rem_language])
-
- return 0
+ var/datum/language/L = all_languages[rem_language]
+ . = (L in languages)
+ languages.Remove(L)
// Can we speak this language, as opposed to just understanding it?
/mob/proc/can_speak(datum/language/speaking)
- return (universal_speak || (speaking.flags & INNATE) || speaking in src.languages)
+ return (universal_speak || (speaking && speaking.flags & INNATE) || speaking in src.languages)
//TBD
/mob/verb/check_languages()
diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm
index d787c3f733..7201cfc8e4 100644
--- a/code/modules/mob/living/carbon/human/say.dm
+++ b/code/modules/mob/living/carbon/human/say.dm
@@ -132,10 +132,14 @@
if(used_radios.len)
italics = 1
message_range = 1
-
+ if(speaking)
+ message_range = speaking.get_talkinto_msg_range(message)
+ var/msg
+ if(!speaking || !(speaking.flags & NO_TALK_MSG))
+ msg = "\The [src] talks into \the [used_radios[1]]"
for(var/mob/living/M in hearers(5, src))
- if(M != src)
- M.show_message("[src] talks into [used_radios.len ? used_radios[1] : "the radio."]")
+ if((M != src) && msg)
+ M.show_message(msg)
if (speech_sound)
sound_vol *= 0.5
diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm
index da75999c41..8a7b7aa962 100644
--- a/code/modules/mob/say.dm
+++ b/code/modules/mob/say.dm
@@ -79,6 +79,9 @@
return 1
return 0
+ if(speaking.flags & INNATE)
+ return 1
+
//Language check.
for(var/datum/language/L in src.languages)
if(speaking.name == L.name)
diff --git a/code/setup.dm b/code/setup.dm
index 9e204bf120..8b8dcd82d8 100644
--- a/code/setup.dm
+++ b/code/setup.dm
@@ -766,6 +766,7 @@ var/list/RESTRICTED_CAMERA_NETWORKS = list( //Those networks can only be accesse
#define HIVEMIND 16 // Broadcast to all mobs with this language.
#define NONGLOBAL 32 // Do not add to general languages list
#define INNATE 64 // All mobs can be assumed to speak and understand this language (audible emotes)
+#define NO_TALK_MSG 128 // Do not show the "\The [speaker] talks into \the [radio]" message
//Flags for zone sleeping
#define ZONE_ACTIVE 1