diff --git a/code/game/gamemodes/blob/overmind.dm b/code/game/gamemodes/blob/overmind.dm
index 39f6d7b6014..531f5f1897d 100644
--- a/code/game/gamemodes/blob/overmind.dm
+++ b/code/game/gamemodes/blob/overmind.dm
@@ -79,7 +79,7 @@
for (var/mob/M in dead_mob_list)
if(!istype(M,/mob/new_player) && !istype(M,/mob/living/carbon/brain)) //No meta-evesdropping
- rendered = "Blob Telepathy, [name] (Follow) [verb] \"[message]\""
+ rendered = "Blob Telepathy, [name] (follow) [verb] \"[message]\""
M.show_message(rendered, 2)
/mob/camera/blob/emote(var/act,var/m_type=1,var/message = null)
diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm
index 75ecbe0570d..172d52ac98c 100644
--- a/code/modules/mob/language.dm
+++ b/code/modules/mob/language.dm
@@ -18,6 +18,7 @@
var/native // If set, non-native speakers will have trouble speaking.
var/list/syllables // Used when scrambling text for a non-speaker.
var/list/space_chance = 55 // Likelihood of getting a space in the random scramble string.
+ var/follow = 0 // Applies to HIVEMIND languages - should a follow link be included for dead mobs?
/datum/language/proc/get_random_name(var/gender, name_count=2, syllable_count=4)
if(!syllables || !syllables.len)
@@ -102,7 +103,12 @@
var/msg = "[name], [speaker_mask] [format_message(message, get_spoken_verb(message))]"
for(var/mob/player in player_list)
- if(istype(player,/mob/dead) || ((src in player.languages) && check_special_condition(player)))
+ if(istype(player,/mob/dead) && follow)
+ var/msg_dead = "[name], [speaker_mask] (follow) [format_message(message, get_spoken_verb(message))]"
+ player << msg_dead
+ continue
+
+ else if(istype(player,/mob/dead) || ((src in player.languages) && check_special_condition(player)))
player << msg
/datum/language/proc/check_special_condition(var/mob/other)
@@ -340,12 +346,7 @@
colour = "alien"
key = "a"
flags = RESTRICTED | HIVEMIND
-
-/datum/language/xenos/check_special_condition(var/mob/other)
- var/mob/living/carbon/M = other
- if(!istype(M))
- return 1
- return 0
+ follow = 1
/datum/language/ling
name = "Changeling"
@@ -395,6 +396,7 @@
exclaim_verb = "declares"
key = "b"
flags = RESTRICTED | HIVEMIND
+ follow = 1
var/drone_only
/datum/language/binary/broadcast(var/mob/living/speaker,var/message,var/speaker_mask)
@@ -409,8 +411,9 @@
var/message_body = "[speaker.say_quote(message)], \"[message]\""
for (var/mob/M in dead_mob_list)
- if(!istype(M,/mob/new_player) && !istype(M,/mob/living/carbon/brain)) //No meta-evesdropping
- M.show_message("[message_start] [message_body]", 2)
+ if(!istype(M,/mob/new_player) && !istype(M,/mob/living/carbon/brain))
+ var/message_start_dead = "[name] (follow), [speaker.name]"
+ M.show_message("[message_start_dead] [message_body]", 2)
for (var/mob/living/S in living_mob_list)
@@ -447,6 +450,7 @@
key = "d"
flags = RESTRICTED | HIVEMIND
drone_only = 1
+ follow = 1
// Language handling.
/mob/proc/add_language(var/language)
diff --git a/code/modules/mob/living/carbon/alien/say.dm b/code/modules/mob/living/carbon/alien/say.dm
index 8b4177470a4..4aeace5be7b 100644
--- a/code/modules/mob/living/carbon/alien/say.dm
+++ b/code/modules/mob/living/carbon/alien/say.dm
@@ -16,9 +16,20 @@
return emote(copytext(message,2))
var/datum/language/speaking = parse_language(message)
-
if(speaking)
- message = copytext(message, 2+length(speaking.key))
+ message = copytext(message,2+length(speaking.key))
+ else
+ speaking = all_languages["Xenomorph"]
+
+ var/ending = copytext(message, length(message))
+ if (speaking)
+ // This is broadcast to all mobs with the language,
+ // irrespective of distance or anything else.
+ if(speaking.flags & HIVEMIND)
+ speaking.broadcast(src,trim(message))
+ return
+ //If we've gotten this far, keep going!
+ verb = speaking.get_spoken_verb(ending)
message = trim(message)
diff --git a/maps/cyberiad.dmm b/maps/cyberiad.dmm
index 94578207e79..e7a7823100c 100644
--- a/maps/cyberiad.dmm
+++ b/maps/cyberiad.dmm
@@ -90,7 +90,7 @@
"abL" = (/obj/effect/decal/cleanable/cobweb2,/obj/structure/table,/obj/item/weapon/paper,/obj/machinery/light/small{dir = 1},/obj/item/weapon/pen,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating,/area/security/permabrig)
"abM" = (/obj/structure/grille,/obj/structure/sign/securearea,/turf/simulated/floor/airless{icon_state = "circuit"},/area)
"abN" = (/obj/structure/table,/obj/item/weapon/wrench,/obj/machinery/light/small{dir = 8},/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; frequency = 1475; listening = 1; name = "Station Intercom (Security)"; pixel_x = -30; pixel_y = 0},/turf/simulated/floor/plating,/area/security/permabrig)
-"abO" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plating,/area/security/permabrig)
+"abO" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 5},/turf/simulated/floor/plating,/area/security/permabrig)
"abP" = (/obj/machinery/atmospherics/valve{dir = 4},/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor/plating,/area/security/permabrig)
"abQ" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/atmospherics/pipe/simple/visible{dir = 9},/turf/simulated/floor/plating,/area/security/permabrig)
"abR" = (/turf/simulated/floor/plating,/area/security/permabrig)