diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm
index 5d0e61a3b11..24abe73e2b8 100644
--- a/code/game/gamemodes/blob/blobs/blob_mobs.dm
+++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm
@@ -8,6 +8,7 @@
icon = 'icons/mob/blob.dmi'
pass_flags = PASSBLOB
faction = list("blob")
+ bubble_icon = "blob"
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
maxbodytemp = 360
diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
index 6baf88b688a..d317e8f25c9 100644
--- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
+++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
@@ -34,6 +34,7 @@
icon = 'icons/mob/swarmer.dmi'
desc = "A robot of unknown design, they seek only to consume materials and replicate themselves indefinitely."
speak_emote = list("tones")
+ bubble_icon = "swarmer"
health = 40
maxHealth = 40
status_flags = CANPUSH
@@ -59,7 +60,6 @@
speed = 0
faction = list("swarmer")
AIStatus = AI_OFF
- projectiletype = /obj/item/projectile/beam/disabler
pass_flags = PASSTABLE
ventcrawler = 2
ranged = 1
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index ef0df6e2e06..c1ab8a6a7e6 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -345,7 +345,7 @@
if(M.client)
speech_bubble_recipients.Add(M.client)
spawn(0)
- flick_overlay(image('icons/mob/talk.dmi', src, "hR[say_test(raw_message)]",MOB_LAYER+1), speech_bubble_recipients, 30)
+ flick_overlay(image('icons/mob/talk.dmi', src, "machine[say_test(raw_message)]",MOB_LAYER+1), speech_bubble_recipients, 30)
return
////////////////////////////
diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm
index 4e444378c6f..1d78e69955a 100644
--- a/code/modules/mob/living/carbon/alien/alien.dm
+++ b/code/modules/mob/living/carbon/alien/alien.dm
@@ -12,6 +12,7 @@
ventcrawler = 2
languages = ALIEN
verb_say = "hisses"
+ bubble_icon = "alien"
type_of_meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/xeno
var/nightvision = 1
diff --git a/code/modules/mob/living/carbon/alien/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm
index 25f8bf1f9bd..e8e94b0f044 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/queen.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/queen.dm
@@ -5,8 +5,9 @@
ventcrawler = 0 //pull over that ass too fat
unique_name = 0
pixel_x = -16
+ bubble_icon = "alienroyal"
mob_size = MOB_SIZE_LARGE
- layer = 6
+ layer = MOB_LAYER + 0.5 //above most mobs, but below speechbubbles
pressure_resistance = 200 //Because big, stompy xenos should not be blown around like paper.
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat/slab/xeno = 20, /obj/item/stack/sheet/animalhide/xeno = 3)
diff --git a/code/modules/mob/living/carbon/alien/say.dm b/code/modules/mob/living/carbon/alien/say.dm
index f66c3c8794d..dec01676dd5 100644
--- a/code/modules/mob/living/carbon/alien/say.dm
+++ b/code/modules/mob/living/carbon/alien/say.dm
@@ -1,5 +1,5 @@
/mob/living/carbon/alien/say(message)
- . = ..(message, "A")
+ . = ..()
if(.)
playsound(loc, "hiss", 25, 1, 1) //erp just isn't the same without sound feedback
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index 27bd2ccb751..4d70e5f0a6a 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -50,6 +50,8 @@
var/list/say_log = list() //a log of what we've said, plain text, no spans or junk, essentially just each individual "message"
+ var/bubble_icon = "default" //what icon the mob uses for speechbubbles
+
var/last_bumped = 0
var/unique_name = 0 //if a mob's name should be appended with an id when created e.g. Mob (666)
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index 471cec390b6..c273cf9371f 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -142,7 +142,7 @@ var/list/crit_allowed_modes = list(MODE_WHISPER,MODE_CHANGELING,MODE_ALIEN)
show_message(message, 2, deaf_message, deaf_type)
return message
-/mob/living/send_speech(message, message_range = 7, obj/source = src, bubble_type, list/spans)
+/mob/living/send_speech(message, message_range = 7, obj/source = src, bubble_type = bubble_icon, list/spans)
var/list/listening = get_hearers_in_view(message_range, source)
for(var/mob/M in player_list)
if(M.stat == DEAD && M.client && ((M.client.prefs.chat_toggles & CHAT_GHOSTEARS) || (get_dist(M, src) <= 7)) && client) // client is so that ghosts don't have to listen to mice
@@ -158,7 +158,7 @@ var/list/crit_allowed_modes = list(MODE_WHISPER,MODE_CHANGELING,MODE_ALIEN)
if(M.client)
speech_bubble_recipients.Add(M.client)
spawn(0)
- flick_overlay(image('icons/mob/talk.dmi', src, "h[bubble_type][say_test(message)]",MOB_LAYER+1), speech_bubble_recipients, 30)
+ flick_overlay(image('icons/mob/talk.dmi', src, "[bubble_type][say_test(message)]",MOB_LAYER+1), speech_bubble_recipients, 30)
/mob/proc/binarycheck()
return 0
diff --git a/code/modules/mob/living/silicon/ai/say.dm b/code/modules/mob/living/silicon/ai/say.dm
index 014dd45b84c..b43ef3552f4 100644
--- a/code/modules/mob/living/silicon/ai/say.dm
+++ b/code/modules/mob/living/silicon/ai/say.dm
@@ -49,7 +49,7 @@
var/obj/machinery/hologram/holopad/T = current
if(istype(T) && T.masters[src])//If there is a hologram and its master is the user.
- send_speech(message, 7, T, "R", get_spans())
+ send_speech(message, 7, T, "robot", get_spans())
src << "Holopad transmitted, [real_name] \"[message]\""//The AI can "hear" its own message.
else
src << "No holopad connected."
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 51ffa99333c..bfcebcb0ce5 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -1,10 +1,11 @@
/mob/living/silicon/robot
name = "Cyborg"
real_name = "Cyborg"
- icon = 'icons/mob/robots.dmi'//
+ icon = 'icons/mob/robots.dmi'
icon_state = "robot"
maxHealth = 100
health = 100
+ bubble_icon = "robot"
var/sight_mode = 0
var/custom_name = ""
designation = "Default" //used for displaying the prefix & getting the current module of cyborg
@@ -1109,6 +1110,7 @@
scrambledcodes = 1
modtype = "Synd"
faction = list("syndicate")
+ bubble_icon = "syndibot"
designation = "Syndicate Assault"
req_access = list(access_syndicate)
var/playstyle_string = "You are a Syndicate assault cyborg!
\
diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm
index 00cdfcc10e4..2d8e31e3c97 100644
--- a/code/modules/mob/living/silicon/say.dm
+++ b/code/modules/mob/living/silicon/say.dm
@@ -1,5 +1,3 @@
-/mob/living/silicon/say(message)
- return ..(message, "R")
/mob/living/silicon/get_spans()
return ..() | SPAN_ROBOT
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index b4604dbc0b9..fb71eca98c0 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -7,6 +7,7 @@
verb_ask = "queries"
verb_exclaim = "declares"
verb_yell = "alarms"
+ bubble_icon = "machine"
var/syndicate = 0
var/datum/ai_laws/laws = null//Now... THEY ALL CAN ALL HAVE LAWS
var/list/alarms_to_show = list()
diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm
index 0948a51da80..8e18387a10a 100644
--- a/code/modules/mob/living/simple_animal/bot/bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/bot.dm
@@ -15,6 +15,9 @@
sentience_type = SENTIENCE_ARTIFICIAL
status_flags = NONE //no default canpush
+ speak_emote = list("states")
+ bubble_icon = "machine"
+
var/obj/machinery/bot_core/bot_core = null
var/bot_core_type = /obj/machinery/bot_core
var/list/users = list() //for dialog updates
@@ -288,9 +291,6 @@
say(message)
return
-/mob/living/simple_animal/bot/say(message)
- return ..(message, "R")
-
/mob/living/simple_animal/bot/get_spans()
return ..() | SPAN_ROBOT
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm
index 54a6b86c314..ebc51360660 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm
@@ -35,6 +35,8 @@
status_flags = (CANPUSH | CANSTUN | CANWEAKEN)
gender = NEUTER
voice_name = "synthesized chirp"
+ speak_emote = list("chirps")
+ bubble_icon = "machine"
languages = DRONE
mob_size = MOB_SIZE_SMALL
has_unlimited_silicon_privilege = 1
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm
index e17a9a0dcb0..597b528ea9f 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm
@@ -17,6 +17,8 @@
health = 30
maxHealth = 120 //If you murder other drones and cannibalize them you can get much stronger
faction = list("syndicate")
+ speak_emote = list("hisses")
+ bubble_icon = "syndibot"
heavy_emp_damage = 10
laws = \
"1. Interfere.\n"+\
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/say.dm b/code/modules/mob/living/simple_animal/friendly/drone/say.dm
index b8152458ea6..5bd5dbb8eb7 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/say.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/say.dm
@@ -5,11 +5,6 @@
//Drone speach
//Drone hearing
-
-/mob/living/simple_animal/drone/say(message)
- return ..(message, "R")
-
-
/mob/living/simple_animal/drone/lang_treat(atom/movable/speaker, message_langs, raw_message) //This is so drones can understand humans without being able to speak human
. = ..()
var/hear_override_langs = HUMAN
diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm
index 83fe038b649..be62cfce185 100644
--- a/code/modules/mob/living/simple_animal/guardian/guardian.dm
+++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm
@@ -3,6 +3,7 @@
real_name = "Guardian Spirit"
desc = "A mysterious being that stands by its charge, ever vigilant."
speak_emote = list("hisses")
+ bubble_icon = "guardian"
response_help = "passes through"
response_disarm = "flails at"
response_harm = "punches"
@@ -655,6 +656,7 @@
picked_name = pick("Aries", "Leo", "Sagittarius", "Taurus", "Virgo", "Capricorn", "Gemini", "Libra", "Aquarius", "Cancer", "Scorpio", "Pisces")
if("tech")
user << "[G.tech_fluff_string]."
+ G.bubble_icon = "holo"
colour = pick("Rose", "Peony", "Lily", "Daisy", "Zinnia", "Ivy", "Iris", "Petunia", "Violet", "Lilac", "Orchid") //technically not colors, just flowers that can be specific colors
picked_name = pick("Gallium", "Indium", "Thallium", "Bismuth", "Aluminium", "Mercury", "Iron", "Silver", "Zinc", "Titanium", "Chromium", "Nickel", "Platinum", "Tellurium", "Palladium", "Rhodium", "Cobalt", "Osmium", "Tungsten", "Iridium")
diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm
index c7f49bf27a2..8bd71dd3313 100644
--- a/code/modules/mob/living/simple_animal/hostile/alien.dm
+++ b/code/modules/mob/living/simple_animal/hostile/alien.dm
@@ -19,6 +19,7 @@
melee_damage_upper = 25
attacktext = "slashes"
speak_emote = list("hisses")
+ bubble_icon = "alien"
a_intent = "harm"
attack_sound = 'sound/weapons/bladeslice.ogg'
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
@@ -125,6 +126,7 @@
icon_state = "alienq"
icon_living = "alienq"
icon_dead = "alienq_dead"
+ bubble_icon = "alienroyal"
move_to_delay = 4
maxHealth = 400
health = 400
diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
index 7e037b9b5f5..27719e385dc 100644
--- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm
+++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
@@ -126,6 +126,7 @@
mob_size = MOB_SIZE_TINY
flying = 1
speak_emote = list("states")
+ bubble_icon = "syndibot"
gold_core_spawnable = 1
del_on_death = 1
diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm
index 12243cf713a..af6de1b80bc 100644
--- a/code/modules/mob/living/simple_animal/slime/slime.dm
+++ b/code/modules/mob/living/simple_animal/slime/slime.dm
@@ -17,6 +17,7 @@
response_harm = "stomps on"
emote_see = list("jiggles", "bounces in place")
speak_emote = list("chirps")
+ bubble_icon = "slime"
layer = 5
diff --git a/icons/mob/swarmer.dmi b/icons/mob/swarmer.dmi
index dffd6b2490c..f8ff43f3b9f 100644
Binary files a/icons/mob/swarmer.dmi and b/icons/mob/swarmer.dmi differ
diff --git a/icons/mob/talk.dmi b/icons/mob/talk.dmi
index 7f0efa39cbe..e5074d3d03f 100644
Binary files a/icons/mob/talk.dmi and b/icons/mob/talk.dmi differ