diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm
index 1853826f..00e0a55e 100644
--- a/code/modules/mob/hear_say.dm
+++ b/code/modules/mob/hear_say.dm
@@ -160,3 +160,49 @@
heard = "...You almost hear someone talking..."
src << heard
+
+/mob/proc/see_say(var/message, var/verb = "signs", var/datum/language/language = null, var/alt_name = "",var/italics = 0, var/mob/signer = null)
+ if(!client)
+ return
+
+ if(sleeping || stat == 1)
+ return
+
+ var/style = "body"
+ if(!say_understands(signer,language))
+ if(istype(signer,/mob/living/simple_animal))
+ var/mob/living/simple_animal/S = signer
+ message = pick(S.speak)
+ else
+ message = stars(message)
+
+ if(language)
+ verb = language.speech_verb
+ style = language.colour
+
+ var/signer_name = signer.name
+ if(istype(signer, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = signer
+ signer_name = H.GetVoice()
+
+ if(italics)
+ message = "[message]"
+
+ var/track = null
+ if(istype(src, /mob/dead/observer))
+ if(italics && client.prefs.toggles & CHAT_GHOSTRADIO)
+ return
+ if(signer_name != signer.real_name && signer.real_name)
+ signer_name = "[signer.real_name] ([signer_name])"
+ track = "(follow) "
+ if(client.prefs.toggles & CHAT_GHOSTEARS && signer in view(src))
+ message = "[message]"
+ world << "[signer.name] / [signer_name] / [signer.real_name]"
+ if(sdisabilities & BLIND)
+ if(signer == src)
+ src << "You cannot see yourself sign!"
+ else
+ if((signer_name != signer.name) || (istype(src.wear_mask, /obj/item/clothing/mask/gas)))
+ src << "[signer.name][track] [verb], \"[message]\""
+ else
+ src << "[signer_name][alt_name][track] [verb], \"[message]\""
\ No newline at end of file
diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm
index 8c16191c..922b6133 100644
--- a/code/modules/mob/language.dm
+++ b/code/modules/mob/language.dm
@@ -10,6 +10,7 @@
var/key = "x" // Character used to speak in language eg. :o for Unathi.
var/flags = 0 // Various language flags.
var/native // If set, non-native speakers will have trouble speaking.
+ var/vocal = 1 // Is a spoken language
/datum/language/unathi
name = "Sinta'unathi"
@@ -87,6 +88,7 @@
speech_verb = "signs"
colour = "say_quote"
key = "4"
+ vocal = 0
// Language handling.
/mob/proc/add_language(var/language)
diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm
index 056ce003..8b6f484d 100644
--- a/code/modules/mob/living/carbon/human/say.dm
+++ b/code/modules/mob/living/carbon/human/say.dm
@@ -22,7 +22,7 @@
if(name != GetVoice())
alt_name = "(as [get_id_name("Unknown")])"
-
+
//parse the radio code and consume it
var/message_mode = parse_message_mode(message)
if (message_mode)
@@ -30,13 +30,12 @@
message = copytext(message,2)
else
message = copytext(message,3)
-
+
//parse the language code and consume it
var/datum/language/speaking = parse_language(message)
if (speaking)
verb = speaking.speech_verb
message = copytext(message,3)
-
message = capitalize(trim(message))
if(speech_problem_flag)
@@ -54,8 +53,12 @@
if(ending=="?")
verb="asks"
- var/list/obj/item/used_radios = new
+ if(speaking) //speaking = null if used through say without a language
+ if(!speaking.vocal)
+ sign(message, verb, speaking, alt_name, italics, message_range)
+ return
+ var/list/obj/item/used_radios = new
switch (message_mode)
if("headset")
if(l_ear && istype(l_ear,/obj/item/device/radio))
@@ -185,7 +188,7 @@
return special_voice
-/*
+/*
***Deprecated***
let this be handled at the hear_say or hear_radio proc
This is left in for robot speaking when humans gain binary channel access until I get around to rewriting
@@ -204,7 +207,7 @@
return verb
-
+
/mob/living/carbon/human/proc/handle_speech_problems(var/message)
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index b6eedfc3..cac875a2 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -138,3 +138,47 @@ var/list/department_radio_keys = list(
/mob/living/proc/GetVoice()
return name
+
+/mob/living/sign(var/message, var/verb="signs", var/datum/language/speaking = null, var/alt_name="", var/italics=0, var/message_range = world.view)
+
+ var/turf/T = get_turf(src)
+
+ var/list/listening = list()
+ if(T)
+
+ var/list/objects = list()
+ var/list/hear = hear(message_range, T)
+ var/list/hearturfs = list()
+
+ for(var/I in hear)
+ if(istype(I, /mob/))
+ var/mob/M = I
+ listening += M
+ hearturfs += M.locs[1]
+ for(var/obj/O in M.contents)
+ objects |= O
+ else if(istype(I, /obj/))
+ var/obj/O = I
+ hearturfs += O.locs[1]
+ objects |= O
+
+ for(var/mob/M in player_list)
+ if(M.stat == DEAD && M.client && (M.client.prefs.toggles & CHAT_GHOSTEARS))
+ listening |= M
+ continue
+ if(M.loc && M.locs[1] in hearturfs)
+ listening |= M
+
+// Can object see signing?
+// Only if they have cameras.
+// Do any objects currently have cameras? -- SoundScopes
+
+// for(var/obj/O in objects)
+// spawn(0)
+// if(O) //It's possible that it could be deleted in the meantime.
+// O.hear_talk(src, message, verb, speaking)
+
+ for(var/mob/M in listening)
+ M.see_say(message,verb,speaking,alt_name, italics, src)
+
+ log_say("[name]/[key] : [message]")
\ No newline at end of file
diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm
index c95d3a0d..eb329ebe 100644
--- a/code/modules/mob/say.dm
+++ b/code/modules/mob/say.dm
@@ -1,6 +1,9 @@
/mob/proc/say()
return
+/mob/proc/sign()
+ return
+
/mob/verb/whisper()
set name = "Whisper"
set category = "IC"
@@ -157,7 +160,7 @@
if(length(message) >= 2)
var/channel_prefix = copytext(message, 1 ,3)
return department_radio_keys[channel_prefix]
-
+
return null
//parses the language code (e.g. :j) from text, such as that supplied to say.