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.