diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 65f79185e3a..3fa9337059a 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -476,4 +476,7 @@ its easier to just keep the beam vertical.
if((!message))
return
for(var/mob/O in hearers(src, null))
- O.show_message("[src] [atom_say_verb], \"[message]\"",2)
\ No newline at end of file
+ O.show_message("[src] [atom_say_verb], \"[message]\"",2)
+
+/atom/proc/speech_bubble(var/bubble_state = "",var/bubble_loc = src, var/list/bubble_recipients = list())
+ return
\ No newline at end of file
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index bc461924377..4133d8eb014 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -1943,3 +1943,7 @@
//src.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
return
*/
+
+
+/obj/mecha/speech_bubble(var/bubble_state = "",var/bubble_loc = src, var/list/bubble_recipients = list())
+ flick_overlay(image('icons/mob/talk.dmi', bubble_loc, bubble_state,MOB_LAYER+1), bubble_recipients, 30)
\ No newline at end of file
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index 1720dad0f69..72035ee078b 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -255,10 +255,11 @@ proc/get_radio_key_from_channel(var/channel)
if(M.client)
speech_bubble_recipients.Add(M.client)
spawn(0)
- if(istype(src.loc, /obj/mecha))
- flick_overlay(image('icons/mob/talk.dmi', src.loc, "hR[speech_bubble_test]",MOB_LAYER+1), speech_bubble_recipients, 30)
- else
- flick_overlay(image('icons/mob/talk.dmi', src, "h[speech_bubble_test]",MOB_LAYER+1), speech_bubble_recipients, 30)
+ if(loc && !isturf(loc))
+ var/atom/A = loc //Non-turf, let it handle the speech bubble
+ A.speech_bubble("hR[speech_bubble_test]", A.loc, speech_bubble_recipients)
+ else //Turf, leave speech bubbles to the mob
+ speech_bubble("h[speech_bubble_test]", src, speech_bubble_recipients)
for(var/obj/O in listening_obj)
spawn(0)
@@ -433,3 +434,6 @@ proc/get_radio_key_from_channel(var/channel)
log_whisper("[src.name]/[src.key] : [message]")
return 1
+
+/mob/living/speech_bubble(var/bubble_state = "",var/bubble_loc = src, var/list/bubble_recipients = list())
+ flick_overlay(image('icons/mob/talk.dmi', bubble_loc, bubble_state,MOB_LAYER+1), bubble_recipients, 30)
\ No newline at end of file