diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index 586441efe3..80f67c3347 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -123,9 +123,8 @@ var/list/department_radio_keys = list(
for(var/mob/M in listening)
- if(M.client)
- M << speech_bubble
- M.hear_say(message,verb,speaking,alt_name, italics, src)
+ M << speech_bubble
+ M.hear_say(message,verb,speaking,alt_name, italics, src)
log_say("[name]/[key] : [message]")
diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm
index 520ff0a0f3..44af910324 100644
--- a/code/modules/mob/living/silicon/say.dm
+++ b/code/modules/mob/living/silicon/say.dm
@@ -163,13 +163,15 @@
if (!message)
return
- var/message_a = say_quote(message)
- var/rendered = "Robotic Talk, [name] [message_a]"
+ var/verb = say_quote(message)
+
+
+ var/rendered = "Robotic Talk, [name] [verb], \"[message]\""
for (var/mob/living/S in living_mob_list)
if(S.robot_talk_understand && (S.robot_talk_understand == robot_talk_understand)) // This SHOULD catch everything caught by the one below, but I'm not going to change it.
if(istype(S , /mob/living/silicon/ai))
- var/renderedAI = "Robotic Talk, [name] [message_a]"
+ var/renderedAI = "Robotic Talk, [name] [verb], \"[message]\""
S.show_message(renderedAI, 2)
else
S.show_message(rendered, 2)
@@ -177,7 +179,7 @@
else if (S.binarycheck())
if(istype(S , /mob/living/silicon/ai))
- var/renderedAI = "Robotic Talk, [name] [message_a]"
+ var/renderedAI = "Robotic Talk, [name] [verb], \"[message]\""
S.show_message(renderedAI, 2)
else
S.show_message(rendered, 2)
@@ -190,22 +192,17 @@
for (var/mob/M in listening)
if(!istype(M, /mob/living/silicon) && !M.robot_talk_understand)
heard += M
-
if (length(heard))
- var/message_b
-
- message_b = "beep beep beep"
- message_b = say_quote(message_b)
- message_b = "[message_b]"
-
- rendered = "[voice_name] [message_b]"
+ var/message_beep
+ verb = "beeps"
+ message_beep = "beep beep beep"
+
+ rendered = "[voice_name] [verb], \"[message_beep]\""
for (var/mob/M in heard)
M.show_message(rendered, 2)
- message = say_quote(message)
-
- rendered = "Robotic Talk, [name] [message_a]"
+ rendered = "Robotic Talk, [name] [verb], \"[message]\""
for (var/mob/M in dead_mob_list)
if(!istype(M,/mob/new_player) && !istype(M,/mob/living/carbon/brain)) //No meta-evesdropping
diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm
index 756d49bbf2..452bc863a8 100644
--- a/code/modules/mob/living/simple_animal/parrot.dm
+++ b/code/modules/mob/living/simple_animal/parrot.dm
@@ -703,3 +703,55 @@
ears = new /obj/item/device/radio/headset/headset_eng(src)
available_channels = list(":e")
..()
+
+/mob/living/simple_animal/parrot/say(var/message)
+
+ if(stat)
+ return
+
+ var/verb = "says"
+ if(speak_emote.len)
+ verb = pick(speak_emote)
+
+
+ var/message_mode=""
+ if(copytext(message,1,2) == ";")
+ message_mode = "headset"
+ message = copytext(message,2)
+
+ if(length(message) >= 2)
+ var/channel_prefix = copytext(message, 1 ,3)
+ message_mode = department_radio_keys[channel_prefix]
+
+ if(copytext(message,1,2) == ":")
+ var/positioncut = 3
+ message = trim(copytext(message,positioncut))
+
+ message = capitalize(trim_left(message))
+
+ if(message_mode)
+ if(message_mode in radiochannels)
+ if(ears && istype(ears,/obj/item/device/radio))
+ ears.talk_into(src,message, message_mode, verb, null)
+
+
+ ..(message)
+
+
+/mob/living/simple_animal/parrot/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/alt_name = "",var/italics = 0, var/mob/speaker = null)
+ if(prob(50))
+ parrot_hear(message)
+ ..(message,verb,language,alt_name,italics,speaker)
+
+
+
+/mob/living/simple_animal/parrot/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(prob(50))
+ parrot_hear("[pick(available_channels)] [message]")
+ ..(message,verb,language,part_a,part_b,speaker,hard_to_hear)
+
+
+/mob/living/simple_animal/parrot/proc/parrot_hear(var/message="")
+ if(!message || stat)
+ return
+ speech_buffer.Add(message)
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 350471f1b3..3656b5573c 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,23 @@
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)
+ if(stat)
+ return
+
+ if(copytext(message,1,2) == "*")
+ return emote(copytext(message,2))
+
+ if(stat)
+ return
+
+ var/verb = "says"
+
+ if(speak_emote.len)
+ verb = pick(speak_emote)
+
+ message = capitalize(trim_left(message))
+
+ ..(message, null, verb)