diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm
index a175009a03..06a76218e7 100644
--- a/code/modules/mob/hear_say.dm
+++ b/code/modules/mob/hear_say.dm
@@ -4,10 +4,19 @@
if(!client)
return
+ if(sleeping)
+ hear_sleep(message)
+ return
+
var/style = "body"
- if(language)
- if(!say_understands(speaker,language))
+ if(!say_understands(speaker,language))
+ if(istype(speaker,/mob/living/simple_animal))
+ var/mob/living/simple_animal/S = speaker
+ message = pick(S.speak)
+ else
message = stars(message)
+
+ if(language)
verb = language.speech_verb
style = language.colour
@@ -36,15 +45,29 @@
src << "[speaker_name][alt_name] [track][verb], \"[message]\""
+
+
+
/mob/proc/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/mob/speaker = null, var/hard_to_hear = 0)
if(!client)
return
+
+ if(sleeping)
+ hear_sleep(message)
+ return
+
var/track = null
var/style = "body"
- if(language)
- if(!say_understands(speaker,language))
+
+ if(!say_understands(speaker,language))
+ if(istype(speaker,/mob/living/simple_animal))
+ var/mob/living/simple_animal/S = speaker
+ message = pick(S.speak)
+ else
message = stars(message)
+
+ if(language)
verb = language.speech_verb
style = language.colour
@@ -90,3 +113,25 @@
src << "[part_a][track][part_b] [verb], \"[message]\""
else
src << "[part_a][speaker_name][part_b] [verb], \"[message]\""
+
+/mob/proc/hear_sleep(var/message)
+ if(prob(15))
+ var/list/punctuation = list(",", "!", ".", ";", "?")
+ var/list/messages = text2list(message, " ")
+ var/R = rand(1, messages.len)
+ var/heardword = messages[R]
+ if(copytext(heardword,1, 1) in punctuation)
+ heardword = copytext(heardword,2)
+ if(copytext(heardword,-1) in punctuation)
+ heardword = copytext(heardword,1,lentext(heardword))
+ var/heard = "...You hear something about...[heardword]"
+
+ src << heard
+ else
+ var/heard = "...You almost hear someone talking..."
+
+ src << heard
+
+
+
+
diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm
index 3f3aa32c79..153dedd3bd 100644
--- a/code/modules/mob/living/carbon/human/say.dm
+++ b/code/modules/mob/living/carbon/human/say.dm
@@ -128,7 +128,7 @@
..(message, speaking, verb, alt_name, italics, message_range, used_radios)
-/mob/living/carbon/human/say_understands(var/other,var/datum/language/speaking = null)
+/mob/living/carbon/human/say_understands(var/mob/other,var/datum/language/speaking = null)
if(has_brain_worms()) //Brain worms translate everything. Even mice and alien speak.
return 1
@@ -138,6 +138,11 @@
return 1
if (istype(other, /mob/living/carbon/slime))
return 1
+ if (istype(other, /mob/living/simple_animal))
+ if(other.universal_speak || src.universal_speak || src.universal_understand)
+ return 1
+ return 0
+
return ..()
/mob/living/carbon/human/GetVoice()
diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm
index 80fafbf80e..55d0929e78 100644
--- a/code/modules/mob/living/simple_animal/constructs.dm
+++ b/code/modules/mob/living/simple_animal/constructs.dm
@@ -13,6 +13,7 @@
a_intent = "harm"
stop_automated_movement = 1
status_flags = CANPUSH
+ universal_speak = 1
attack_sound = 'sound/weapons/punch1.ogg'
min_oxy = 0
max_oxy = 0
@@ -320,4 +321,4 @@
if (cultist == usr) //just to be sure.
return
cultist.loc = usr.loc
- usr.visible_message("/red [cultist] appears in a flash of red light as [usr] glows with power")*/
\ No newline at end of file
+ usr.visible_message("/red [cultist] appears in a flash of red light as [usr] glows with power")*/
diff --git a/code/modules/mob/living/simple_animal/head.dm b/code/modules/mob/living/simple_animal/head.dm
index fdf381f279..9b12edb4ed 100644
--- a/code/modules/mob/living/simple_animal/head.dm
+++ b/code/modules/mob/living/simple_animal/head.dm
@@ -8,6 +8,7 @@
speak_emote = list("clicks")
emote_hear = list("clicks")
emote_see = list("clacks")
+ universal_speak = 1
speak_chance = 1
turns_per_move = 5
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
@@ -56,4 +57,4 @@
src.say(msg)
else
var/msg = pick(comments)
- src.say(msg)
\ No newline at end of file
+ src.say(msg)
diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm
index 756d49bbf2..73a5ca8382 100644
--- a/code/modules/mob/living/simple_animal/parrot.dm
+++ b/code/modules/mob/living/simple_animal/parrot.dm
@@ -48,6 +48,7 @@
response_disarm = "gently moves aside the"
response_harm = "swats the"
stop_automated_movement = 1
+ universal_speak = 1
var/parrot_state = PARROT_WANDER //Hunt for a perch when created
var/parrot_sleep_max = 25 //The time the parrot sits while perched before looking around. Mosly a way to avoid the parrot's AI in life() being run every single tick.
diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm
index 7c31082bba..ae0fc99e5d 100644
--- a/code/modules/mob/living/simple_animal/shade.dm
+++ b/code/modules/mob/living/simple_animal/shade.dm
@@ -8,6 +8,7 @@
icon_dead = "shade_dead"
maxHealth = 50
health = 50
+ universal_speak = 1
speak_emote = list("hisses")
emote_hear = list("wails","screeches")
response_help = "puts their hand through"
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 350471f1b3..a9a166d530 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -15,7 +15,7 @@
var/turns_per_move = 1
var/turns_since_move = 0
- universal_speak = 1
+ universal_speak = 0 //No, just no.
var/meat_amount = 0
var/meat_type
var/stop_automated_movement = 0 //Use this to temporarely stop random movement or to if you write special movement code for animals.
@@ -453,4 +453,16 @@
del(target_locked)
overlays = null
if (targeted_by && target_locked)
- overlays += target_locked
\ No newline at end of file
+ overlays += target_locked
+
+
+/mob/living/simple_animal/say(var/message, var/datum/language/speaking= null, var/verb = "says")
+
+ if(stat)
+ return
+ if(speak_emote.len)
+ verb = pick(speak_emote)
+
+ ..(message, null, verb)
+
+
diff --git a/code/modules/mob/living/simple_animal/worm.dm b/code/modules/mob/living/simple_animal/worm.dm
index 14faaffdd5..f95555dbd1 100644
--- a/code/modules/mob/living/simple_animal/worm.dm
+++ b/code/modules/mob/living/simple_animal/worm.dm
@@ -19,6 +19,8 @@
maxHealth = 30
health = 30
+ universal_speak =1
+
stop_automated_movement = 1
animate_movement = SYNC_STEPS
@@ -196,4 +198,4 @@
for(var/atom/movable/stomachContent in contents) //or poop it out
loc.contents += stomachContent
- return
\ No newline at end of file
+ return
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index 26e1715a80..ec650f33ce 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -413,3 +413,10 @@
proc/close_spawn_windows()
src << browse(null, "window=latechoices") //closes late choices window
src << browse(null, "window=playersetup") //closes the player setup window
+
+
+/mob/new_player/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/alt_name = "",var/italics = 0, var/mob/speaker = null)
+ return
+
+/mob/new_player/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/mob/speaker = null, var/hard_to_hear = 0)
+ return