From 2a0bece9545bc18007ba5c3d227a0fb23bd563ae Mon Sep 17 00:00:00 2001 From: Ccomp5950 Date: Fri, 21 Mar 2014 08:25:20 -0500 Subject: [PATCH 1/5] Saycode rewrite initial commit. Create structure for modular saycode Regular chat: specific_paths/say() -> living/say() -> specific_paths/hear_say() Radio chat: specific_paths/say() -> Telecoms shit -> specific_paths/hear_radio() Humans done. Todo: AI, Robot, simple_animal, and ghosts. --- baystation12.dme | 1 + code/game/machinery/telecomms/broadcaster.dm | 38 +- .../machinery/telecomms/telecomunications.dm | 4 +- .../game/objects/items/devices/radio/radio.dm | 24 +- code/modules/mob/hear_say.dm | 65 +++ .../mob/living/carbon/human/human_defines.dm | 4 +- code/modules/mob/living/carbon/human/say.dm | 193 +++++++-- code/modules/mob/living/say.dm | 380 ++---------------- 8 files changed, 309 insertions(+), 400 deletions(-) create mode 100644 code/modules/mob/hear_say.dm diff --git a/baystation12.dme b/baystation12.dme index 35fb099fd8..b0974426c7 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -845,6 +845,7 @@ #include "code\modules\mob\abilities.dm" #include "code\modules\mob\death.dm" #include "code\modules\mob\emote.dm" +#include "code\modules\mob\hear_say.dm" #include "code\modules\mob\inventory.dm" #include "code\modules\mob\language.dm" #include "code\modules\mob\login.dm" diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm index 7775e3aa20..ff865733f2 100644 --- a/code/game/machinery/telecomms/broadcaster.dm +++ b/code/game/machinery/telecomms/broadcaster.dm @@ -59,7 +59,9 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept signal.data["vmask"], signal.data["vmessage"], signal.data["radio"], signal.data["message"], signal.data["name"], signal.data["job"], - signal.data["realname"], signal.data["vname"],, signal.data["compression"], signal.data["level"], signal.frequency) + signal.data["realname"], signal.data["vname"],, + signal.data["compression"], signal.data["level"], signal.frequency, + signal.data["verb"], signal.data["language"] ) /** #### - Simple Broadcast - #### **/ @@ -84,7 +86,8 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept signal.data["vmask"], signal.data["vmessage"], signal.data["radio"], signal.data["message"], signal.data["name"], signal.data["job"], - signal.data["realname"], signal.data["vname"], 4, signal.data["compression"], signal.data["level"], signal.frequency) + signal.data["realname"], signal.data["vname"], 4, signal.data["compression"], signal.data["level"], signal.frequency, + signal.data["verb"], signal.data["language"]) if(!message_delay) message_delay = 1 @@ -147,14 +150,16 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept signal.data["vmask"], signal.data["vmessage"], signal.data["radio"], signal.data["message"], signal.data["name"], signal.data["job"], - signal.data["realname"], signal.data["vname"],, signal.data["compression"], list(0), connection.frequency) + signal.data["realname"], signal.data["vname"],, signal.data["compression"], list(0), connection.frequency, + signal.data["verb"], signal.data["language"]) else if(intercept) Broadcast_Message(signal.data["connection"], signal.data["mob"], signal.data["vmask"], signal.data["vmessage"], signal.data["radio"], signal.data["message"], signal.data["name"], signal.data["job"], - signal.data["realname"], signal.data["vname"], 3, signal.data["compression"], list(0), connection.frequency) + signal.data["realname"], signal.data["vname"], 3, signal.data["compression"], list(0), connection.frequency, + signal.data["verb"], signal.data["language"]) @@ -218,7 +223,9 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept /proc/Broadcast_Message(var/datum/radio_frequency/connection, var/mob/M, var/vmask, var/vmessage, var/obj/item/device/radio/radio, var/message, var/name, var/job, var/realname, var/vname, - var/data, var/compression, var/list/level, var/freq) + var/data, var/compression, var/list/level, var/freq, var/verbage = "says", var/datum/language/speaking = null) + + world << "in broadcast_message, verb = [verbage], language = [speaking ? speaking.name : null] ([src])" /* ###### Prepare the radio connection ###### */ @@ -369,7 +376,6 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept // syndies! if (display_freq == SYND_FREQ) part_a = "" - // centcomm channels (deathsquid and ert) else if (display_freq in CENT_FREQS) part_a = "" @@ -449,6 +455,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept if (length(heard_masked)) var/N = name var/J = job + world << "heard_masked" var/rendered = "[part_a][N][part_b][quotedmsg][part_c]" for (var/mob/R in heard_masked) aitrack = "" @@ -456,24 +463,25 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept aitrack = "" if(istype(R, /mob/living/silicon/ai)) - R.show_message("[part_a][aitrack][N] ([J]) [part_b][quotedmsg][part_c]", 2) + //R.show_message("[part_a][aitrack][N] ([J]) [part_b][quotedmsg][part_c]", 2) else - R.show_message(rendered, 2) + //R.show_message(rendered, 2) /* --- Process all the mobs that heard the voice normally (understood) --- */ if (length(heard_normal)) var/rendered = "[part_a][realname][part_b][quotedmsg][part_c]" - + world << "heard_normal" for (var/mob/R in heard_normal) aitrack = "" if(data == 4) aitrack = "" - if(istype(R, /mob/living/silicon/ai)) - R.show_message("[part_a][aitrack][realname] ([job]) [part_b][quotedmsg][part_c]", 2) - else - R.show_message(rendered, 2) + //if(istype(R, /mob/living/silicon/ai)) + R.hear_radio(message, verbage, speaking, part_a, part_b, M) + //R.show_message("[part_a][aitrack][realname] ([job]) [part_b][quotedmsg][part_c]", 2) + //else + //R.show_message(rendered, 2) /* --- Process all the mobs that heard the voice normally (did not understand) --- */ @@ -485,11 +493,13 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept if(data == 4) aitrack = "" - + R.hear_radio(message,verbage, speaking, part_a, part_b, M) +/* if(istype(R, /mob/living/silicon/ai)) R.show_message("[part_a][aitrack][vname] ([job]) [part_b][vmessage]][part_c]", 2) else R.show_message(rendered, 2) +*/ /* --- Process all the mobs that heard a garbled voice (did not understand) --- */ // Displays garbled message (ie "f*c* **u, **i*er!") diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm index f3d8372353..95995fa2b9 100644 --- a/code/game/machinery/telecomms/telecomunications.dm +++ b/code/game/machinery/telecomms/telecomunications.dm @@ -91,7 +91,9 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() "type" = signal.data["type"], "server" = signal.data["server"], "reject" = signal.data["reject"], - "level" = signal.data["level"] + "level" = signal.data["level"], + "verb" = signal.data["verb"], + "language" = signal.data["language"] ) // Keep the "original" signal constant diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index ea3a216878..814b92909f 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -218,7 +218,11 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use del(A) return -/obj/item/device/radio/talk_into(mob/living/M as mob, message, channel) +/obj/item/device/radio/talk_into(mob/living/M as mob, message, channel, var/verb = "says", var/datum/language/speaking = null) + if(speaking) + world << "radio talk_into language = [speaking.name]" + else + world << "radio talk_into language = null" if(!on) return // the device has to be on // Fix for permacell radios, but kinda eh about actually fixing them. if(!M || !message) return @@ -348,7 +352,9 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use "type" = 0, // determines what type of radio input it is: normal broadcast "server" = null, // the last server to log this signal "reject" = 0, // if nonzero, the signal will not be accepted by any broadcasting machinery - "level" = position.z // The source's z level + "level" = position.z, // The source's z level + "language" = speaking, + "verb" = verb ) signal.frequency = connection.frequency // Quick frequency set @@ -401,7 +407,9 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use "type" = 0, "server" = null, "reject" = 0, - "level" = position.z + "level" = position.z, + "language" = speaking, + "verb" = verb ) signal.frequency = connection.frequency // Quick frequency set @@ -421,14 +429,16 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use //THIS IS TEMPORARY. if(!connection) return //~Carn + world << "WTF, WE'RE JUST DOING A STRAIGHT BROADCAST" Broadcast_Message(connection, M, voicemask, pick(M.speak_emote), src, message, displayname, jobname, real_name, M.voice_name, - filter_type, signal.data["compression"], list(position.z), connection.frequency) + filter_type, signal.data["compression"], list(position.z), connection.frequency,verb,speaking) else // OLD RADIO SYSTEMS: By Goons? + world << "WTF we're in old system" var/datum/radio_frequency/connection = null if(channel && channels && channels.len > 0) if (channel == "department") @@ -596,11 +606,13 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use else R.show_message(rendered, 2) -/obj/item/device/radio/hear_talk(mob/M as mob, msg) +/obj/item/device/radio/hear_talk(mob/M as mob, msg, var/verb = "says", var/datum/language/speaking = null) if (broadcasting) if(get_dist(src, M) <= canhear_range) - talk_into(M, msg) + talk_into(M, msg,null,verb,speaking) + + /* /obj/item/device/radio/proc/accept_rad(obj/item/device/radio/R as obj, message) diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm new file mode 100644 index 0000000000..6e98e06e16 --- /dev/null +++ b/code/modules/mob/hear_say.dm @@ -0,0 +1,65 @@ +// At minimum every mob has a hear_say proc. + +/mob/proc/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/alt_name = "",var/italics = 0, var/mob/speaker = null) + if(!client) + return + + var/style = "body" + if(language) + if(!say_understands(speaker,language)) + message = stars(message) + verb = language.speech_verb + style = language.colour + + if(verb == "says") + var/ending = copytext(message, length(message)) + if(ending=="!") + verb="exclaims" + if(ending=="?") + verb="asks" + + var/speaker_name = speaker.name + if(istype(speaker, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = speaker + speaker_name = H.GetVoice() + + + if(sdisabilities & DEAF || ear_deaf) + if(speaker == src) + src << "You cannot hear yourself speak!" + else + src << "[speaker_name][alt_name] talks but you cannot hear them." + else + src << "[speaker_name][alt_name] [verb], \"[message]\"" + + + +/mob/proc/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/mob/speaker = null) + if(!client) + return + var/style = "body" + world << "in hear_radio and language = [language ? language.name : null]" + if(language) + world << "in language check" + if(!say_understands(speaker,language)) + message = stars(message) + verb = language.speech_verb + style = language.colour + + if(verb == "says") + var/ending = copytext(message,length(message)) + if(ending=="!") + verb="exclaims" + if(ending=="?") + verb="asks" + + var/speaker_name = speaker.name + if(istype(speaker, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = speaker + speaker_name = H.GetVoice() + + if(sdisabilities & DEAF || ear_deaf) + if(prob(20)) + src << "You feel your headset vibrate but can hear nothing from it!" + else + src << "[part_a][speaker_name][part_b] [verb], \"[message]\"" diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 4611dda0d8..6e5b1625a7 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -47,6 +47,8 @@ var/icon/stand_icon = null var/icon/lying_icon = null + + var/speech_problem_flag = 0 var/miming = null //Toggle for the mime's abilities. var/special_voice = "" // For changing our voice. Used by a symptom. @@ -56,4 +58,4 @@ var/xylophone = 0 //For the spoooooooky xylophone cooldown var/mob/remoteview_target = null - var/hand_blood_color \ No newline at end of file + var/hand_blood_color diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index f284a5fda8..0a827946f4 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -1,39 +1,121 @@ /mob/living/carbon/human/say(var/message) + var/verb = "says" + var/alt_name = "" + var/message_range = world.view + var/italics = 0 - if(wear_mask) - if(istype(wear_mask, /obj/item/clothing/mask/gas/voice/space_ninja) && wear_mask:voice == "Unknown") - if(copytext(message, 1, 2) != "*") - var/list/temp_message = text2list(message, " ") - var/list/pick_list = list() - for(var/i = 1, i <= temp_message.len, i++) - pick_list += i - for(var/i=1, i <= abs(temp_message.len/3), i++) - var/H = pick(pick_list) - if(findtext(temp_message[H], "*") || findtext(temp_message[H], ";") || findtext(temp_message[H], ":")) continue - temp_message[H] = ninjaspeak(temp_message[H]) - pick_list -= H - message = list2text(temp_message, " ") - message = replacetext(message, "o", "¤") - message = replacetext(message, "p", "þ") - message = replacetext(message, "l", "£") - message = replacetext(message, "s", "§") - message = replacetext(message, "u", "µ") - message = replacetext(message, "b", "ß") + if(stat == 2) + return say_dead(message) - else if(istype(wear_mask, /obj/item/clothing/mask/horsehead)) - var/obj/item/clothing/mask/horsehead/hoers = wear_mask - if(hoers.voicechange) - if(!(copytext(message, 1, 2) == "*" || (mind && mind.changeling && department_radio_keys[copytext(message, 1, 3)] != "changeling"))) - message = pick("NEEIIGGGHHHH!", "NEEEIIIIGHH!", "NEIIIGGHH!", "HAAWWWWW!", "HAAAWWW!") + if(copytext(message,1,2) == "*") + return emote(copytext(message,2)) - if ((HULK in mutations) && health >= 25 && length(message)) - if(copytext(message, 1, 2) != "*") - message = "[uppertext(message)]!!" //because I don't know how to code properly in getting vars from other files -Bro + if(name != GetVoice()) + alt_name = "(as [get_id_name("Unknown")])" + + var/message_mode = null + var/datum/language/speaking = null + + if(copytext(message,1,2) == ";") + message_mode = "headset" + message = copytext(message,2) - if (src.slurring) - if(copytext(message, 1, 2) != "*") - message = slur(message) - ..(message) + else if(length(message) >= 2) + var/channel_prefix = copytext(message, 1 ,3) + var/check_language_and_radio = copytext(message,3,5) + if(languages.len) + for(var/datum/language/L in languages) + if(lowertext(channel_prefix) == ":[L.key]" || lowertext(check_language_and_radio) == ":[L.key]") + verb = L.speech_verb + speaking = L + break + if(!message_mode) + message_mode = department_radio_keys[channel_prefix] + + if(speaking || copytext(message,1,2) == ":") + var/positioncut = 3 + if(speaking && (message_mode && copytext(message,3,4)==":")) + positioncut += 2 + message = trim(copytext(message,positioncut)) + + + message = capitalize(trim_left(message)) + + if(speech_problem_flag) + var/list/handle_r = handle_speech_problems(message) + message = handle_r[1] + verb = handle_r[2] + speech_problem_flag = handle_r[3] + + if(!message || stat) + return + + var/list/obj/item/used_radios = new + + switch (message_mode) + if("headset") + if(l_ear && istype(l_ear,/obj/item/device/radio)) + var/obj/item/device/radio/R = l_ear + R.talk_into(src,message,null,verb,speaking) + used_radios += l_ear + else if(r_ear && istype(r_ear,/obj/item/device/radio)) + var/obj/item/device/radio/R = r_ear + R.talk_into(src,message,null,verb,speaking) + used_radios += r_ear + + if("right_ear") + if(r_ear && istype(r_ear,/obj/item/device/radio)) + var/obj/item/device/radio/R = r_ear + R.talk_into(src,message,verb,speaking) + used_radios += r_ear + + + if("left_ear") + if(l_ear && istype(l_ear,/obj/item/device/radio)) + var/obj/item/device/radio/R = l_ear + R.talk_into(src,message,verb,speaking) + used_radios += l_ear + + if("intercom") + for(var/obj/item/device/radio/intercom/I in view(1, null)) + I.talk_into(src, message, verb, speaking) + used_radios += I + if("whisper") + whisper(message) + return + if("binary") + if(robot_talk_understand || binarycheck()) + robot_talk(message) + return + if("changeling") + if(mind && mind.changeling) + for(var/mob/Changeling in mob_list) + if((Changeling.mind && Changeling.mind.changeling) || istype(Changeling, /mob/dead/observer)) + Changeling << "[mind.changeling.changelingID]: [message]" + return + else + if(message_mode) + if(message_mode in radiochannels) + if(l_ear && istype(l_ear,/obj/item/device/radio)) + l_ear.talk_into(src,message, message_mode, verb, speaking) + used_radios += l_ear + else if(r_ear && istype(r_ear,/obj/item/device/radio)) + r_ear.talk_into(src,message, message_mode, verb, speaking) + used_radios += r_ear + + + if(used_radios.len) + italics = 1 + message_range = 3 + + var/datum/gas_mixture/environment = loc.return_air() + if(environment) + var/pressure = environment.return_pressure() + if(pressure < SAY_MINIMUM_PRESSURE) + italics = 1 + message_range =1 + + ..(message, speaking, verb, alt_name, italics, message_range, used_radios) /mob/living/carbon/human/say_understands(var/other,var/datum/language/speaking = null) @@ -71,3 +153,52 @@ /mob/living/carbon/human/proc/GetSpecialVoice() return special_voice + +/mob/living/carbon/human/proc/handle_speech_problems(var/message) + var/list/returns[3] + var/verb = "says" + var/handled = 0 + if(silent) + message = "" + handled = 1 + if(client) + if(client.prefs.muted & MUTE_IC) + src << "\red You cannot speak in IC (Muted)." + message = "" + handled = 1 + if(sdisabilities & MUTE) + message = "" + handled = 1 + if(wear_mask) + if(istype(wear_mask, /obj/item/clothing/mask/horsehead)) + var/obj/item/clothing/mask/horsehead/hoers = wear_mask + if(hoers.voicechange) + if(mind && mind.changeling && department_radio_keys[copytext(message, 1, 3)] != "changeling") + message = pick("NEEIIGGGHHHH!", "NEEEIIIIGHH!", "NEIIIGGHH!", "HAAWWWWW!", "HAAAWWW!") + verb = pick("whinnies","neighs", "says") + handled = 1 + + if((HULK in mutations) && health >= 25 && length(message)) + message = "[uppertext(message)]!!!" + verb = pick("yells","roars","hollars") + handled = 1 + if(slurring) + message = slur(message) + verb = pick("stammers","stutters") + handled = 1 + + var/braindam = getBrainLoss() + if(braindam >= 60) + handled = 1 + if(prob(braindam/4)) + message = stutter(message) + verb = pick("stammers", "stutters") + if(prob(braindam)) + message = uppertext(message) + verb = pick("yells like an idiot","says rather loudly") + + returns[1] = message + returns[2] = verb + returns[3] = handled + + return returns diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 3f7bd7c02d..a81d8c841d 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -81,366 +81,52 @@ var/list/department_radio_keys = list( if(!istype(dongle)) return if(dongle.translate_binary) return 1 -/mob/living/say(var/message) - - /* - Formatting and sanitizing. - */ - - message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) - - /* - Sanity checking and speech failure. - */ - - if (!message) - return - - if(silent) - return - - if (stat == 2) // Dead. - return say_dead(message) - else if (stat) // Unconcious. - return - - if (src.client) - if(client.prefs.muted & MUTE_IC) - src << "\red You cannot speak in IC (muted)." - return - if (src.client.handle_spam_prevention(message, MUTE_IC)) - return - - // Mute disability - if (sdisabilities & MUTE) - return - - // Muzzled. - if (istype(wear_mask, /obj/item/clothing/mask/muzzle)) - return - - // Emotes. - if (copytext(message, 1, 2) == "*" && !stat) - return emote(copytext(message, 2)) - - /* - Identity hiding. - */ - var/alt_name = "" - if (istype(src, /mob/living/carbon/human) && name != GetVoice()) - var/mob/living/carbon/human/H = src - alt_name = " (as [H.get_id_name("Unknown")])" - - /* - Now we get into the real meat of the say processing. Determining the message mode. - */ - - var/italics = 0 - var/message_range = null - var/message_mode = null - var/datum/language/speaking = null //For use if a specific language is being spoken. - - var/braindam = getBrainLoss() - if (braindam >= 60) - if(prob(braindam/4)) - message = stutter(message) - if(prob(braindam)) - message = uppertext(message) - - // General public key. Special message handling - else if (copytext(message, 1, 2) == ";" || prob(braindam/2)) - if (ishuman(src)) - message_mode = "headset" - else if(ispAI(src) || isrobot(src)) - message_mode = "pAI" - message = copytext(message, 2) - // Begin checking for either a message mode or a language to speak. - else if (length(message) >= 2) - var/channel_prefix = copytext(message, 1, 3) - - //Check if the person is speaking a language that they know. - if(languages.len) - for(var/datum/language/L in languages) - if(lowertext(channel_prefix) == ":[L.key]") - speaking = L - break - message_mode = department_radio_keys[channel_prefix] - if (message_mode || speaking || copytext(message,1,2) == ":") - message = trim(copytext(message, 3)) - if (!(istype(src,/mob/living/carbon/human) || istype(src,/mob/living/carbon/monkey) || istype(src, /mob/living/simple_animal/parrot) || isrobot(src) && (message_mode=="department" || (message_mode in radiochannels)))) - message_mode = null //only humans can use headsets - - if(src.stunned > 2 || (traumatic_shock > 61 && prob(50))) - message_mode = null //Stunned people shouldn't be able to physically turn on their radio/hold down the button to speak into it - - message = capitalize(trim_left(message)) - - if (!message) - return - - if (stuttering) - message = stutter(message) - - var/list/obj/item/used_radios = new - var/is_speaking_radio = 0 - - switch (message_mode) - if ("headset") - if (src:l_ear && istype(src:l_ear,/obj/item/device/radio)) - src:l_ear.talk_into(src, message) - used_radios += src:l_ear - is_speaking_radio = 1 - else if (src:r_ear) - src:r_ear.talk_into(src, message) - used_radios += src:r_ear - is_speaking_radio = 1 - - message_range = 1 - italics = 1 - - if ("right ear") - if (src:r_ear) - src:r_ear.talk_into(src, message) - used_radios += src:r_ear - is_speaking_radio = 1 - - message_range = 1 - italics = 1 - - if ("left ear") - if (src:l_ear) - src:l_ear.talk_into(src, message) - used_radios += src:l_ear - is_speaking_radio = 1 - - message_range = 1 - italics = 1 - - if ("intercom") - for (var/obj/item/device/radio/intercom/I in view(1, null)) - I.talk_into(src, message) - used_radios += I - is_speaking_radio = 1 - - message_range = 1 - italics = 1 - - //I see no reason to restrict such way of whispering - if ("whisper") - whisper(message) - return - - if ("binary") - if(robot_talk_understand || binarycheck()) - //message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) //seems redundant - robot_talk(message) - return - - if ("alientalk") - if(alien_talk_understand || hivecheck()) - //message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) //seems redundant - alien_talk(message) - return - - if ("department") - if(istype(src, /mob/living/carbon)) - if (src:l_ear && istype(src:l_ear,/obj/item/device/radio)) - src:l_ear.talk_into(src, message, message_mode) - used_radios += src:l_ear - is_speaking_radio = 1 - if (src:r_ear) - src:r_ear.talk_into(src, message, message_mode) - used_radios += src:r_ear - is_speaking_radio = 1 - else if(istype(src, /mob/living/silicon/robot)) - if (src:radio) - src:radio.talk_into(src, message, message_mode) - used_radios += src:radio - message_range = 1 - italics = 1 - - if ("pAI") - if (src:radio) - src:radio.talk_into(src, message) - used_radios += src:radio - message_range = 1 - italics = 1 - - if("changeling") - if(mind && mind.changeling) - for(var/mob/Changeling in mob_list) - if((Changeling.mind && Changeling.mind.changeling) || istype(Changeling, /mob/dead/observer)) - Changeling << "[mind.changeling.changelingID]: [message]" - return -////SPECIAL HEADSETS START - else - //world << "SPECIAL HEADSETS" - if (message_mode in radiochannels) - if(isrobot(src))//Seperates robots to prevent runtimes from the ear stuff - var/mob/living/silicon/robot/R = src - if(R.radio)//Sanityyyy - R.radio.talk_into(src, message, message_mode) - used_radios += R.radio - else - if (src:l_ear && istype(src:l_ear,/obj/item/device/radio)) - src:l_ear.talk_into(src, message, message_mode) - used_radios += src:l_ear - else if (src:r_ear) - src:r_ear.talk_into(src, message, message_mode) - used_radios += src:r_ear - message_range = 1 - italics = 1 -/////SPECIAL HEADSETS END - - var/datum/gas_mixture/environment = loc.return_air() - if(environment) - var/pressure = environment.return_pressure() - if (pressure < SAY_MINIMUM_PRESSURE) //in space no one can hear you scream - italics = 1 - message_range = 1 - - var/list/listening - - listening = get_mobs_in_view(message_range, src) - var/list/onscreen = viewers() - for(var/mob/M in player_list) - if (!M.client) - continue //skip monkeys and leavers - if (istype(M, /mob/new_player)) - continue - if(M.stat == DEAD && (M.client.prefs.toggles & CHAT_GHOSTEARS) && src.client) // src.client is so that ghosts don't have to listen to mice - listening|=M +/mob/living/say(var/message, var/datum/language/speaking = null, var/verb="says", var/alt_name="", var/italics=0, var/message_range = world.view, var/list/used_radios = list()) var/turf/T = get_turf(src) - var/list/W = hear(message_range, T) - for (var/obj/O in ((W | contents)-used_radios)) - W |= O + var/list/listening = list() + if(T) - for (var/mob/M in W) - W |= M.contents + var/list/hear = hear(message_range, T) + var/list/hearturfs = list() - for (var/atom/A in W) - if(istype(A, /mob/living/simple_animal/parrot)) //Parrot speech mimickry - if(A == src) - continue //Dont imitate ourselves - - var/mob/living/simple_animal/parrot/P = A - if(P.speech_buffer.len >= 10) - P.speech_buffer.Remove(pick(P.speech_buffer)) - P.speech_buffer.Add(message) - - if(istype(A, /obj/)) //radio in pocket could work, radio in backpack wouldn't --rastaf0 - var/obj/O = A - spawn (0) - if(O && !istype(O.loc, /obj/item/weapon/storage)) - O.hear_talk(src, message) - - -/* Commented out as replaced by code above from BS12 - for (var/obj/O in ((V | contents)-used_radios)) //radio in pocket could work, radio in backpack wouldn't --rastaf0 - spawn (0) - if (O) - O.hear_talk(src, message) -*/ - -/* if(isbrain(src))//For brains to properly talk if they are in an MMI..or in a brain. Could be extended to other mobs I guess. - for(var/obj/O in loc)//Kinda ugly but whatever. - if(O) - spawn(0) - O.hear_talk(src, message) -*/ - - - var/list/heard_a = list() // understood us - var/list/heard_b = list() // didn't understand us - - for (var/M in listening) - if(hascall(M,"say_understands")) - if (M:say_understands(src,speaking)) - heard_a += M - else - heard_b += M - else - heard_a += M + for(var/I in hear) + if(istype(I, /mob/)) + var/mob/M = I + listening += M + hearturfs += M.locs[1] + for(var/obj/item/device/radio/R in contents) + spawn(0) + R.hear_talk(src, message, verb, speaking) + else if(istype(I, /obj/)) + var/obj/O = I + hearturfs += O.locs[1] + if(istype(O, /obj/item/device/radio)) + spawn(0) + O.hear_talk(src, message, verb, speaking) + for(var/mob/M in player_list) + if(M.stat == DEAD && client && (M.client.prefs.toggles & CHAT_GHOSTEARS)) + listening |= M + continue + if(M.locs[1] in hearturfs) + listening |= M var/speech_bubble_test = say_test(message) var/image/speech_bubble = image('icons/mob/talk.dmi',src,"h[speech_bubble_test]") spawn(30) del(speech_bubble) - for(var/mob/M in hearers(5, src)) - if(M != src && is_speaking_radio) - M:show_message("[src] talks into [used_radios.len ? used_radios[1] : "radio"]") - - var/rendered = null - - if (length(heard_a)) - var/message_a = say_quote(message,speaking) - - if (italics) - message_a = "[message_a]" - - var/message_ghost = "[message_a]" // bold so ghosts know the person is in view. - rendered = "[GetVoice()][alt_name] [message_a]" - var/rendered_ghost = "[GetVoice()][alt_name] [message_ghost]" - for (var/mob/M in heard_a) - if(M.client) - if(hascall(M,"show_message")) - var/deaf_message = "" - var/deaf_type = 1 - if(M != src) - deaf_message = "[name][alt_name] talks but you cannot hear them." - else - deaf_message = "You cannot hear yourself!" - deaf_type = 2 // Since you should be able to hear yourself without looking - if (M.stat == DEAD && (M.client.prefs.toggles & CHAT_GHOSTEARS) && M in onscreen) - M:show_message(rendered_ghost, 2, deaf_message, deaf_type) - else - M:show_message(rendered, 2, deaf_message, deaf_type) - M << speech_bubble - - if (length(heard_b)) - - var/message_b - message_b = stars(message) - message_b = say_quote(message_b,speaking) - - if (italics) - message_b = "[message_b]" - - rendered = "[name][alt_name] [message_b]" //Voice_name isn't too useful. You'd be able to tell who was talking presumably. + if(used_radios.len) + for(var/mob/M in hearers(5, src)) + if(M != src) + M.show_message("[src] talks into [used_radios.len ? used_radios[1] : "radio"]") - for (var/M in heard_b) - if(hascall(M,"show_message")) - M:show_message(rendered, 2) - M << speech_bubble + for(var/mob/M in listening) + if(M.client) + M << speech_bubble + M.hear_say(message,verb,speaking,alt_name, italics, src) - /* - if(M.client) - - if(!M.client.bubbles || M == src) - var/image/I = image('icons/effects/speechbubble.dmi', B, "override") - I.override = 1 - M << I - */ /* - - flick("[presay]say", B) - - if(istype(loc, /turf)) - B.loc = loc - else - B.loc = loc.loc - - spawn() - sleep(11) - del(B) - */ - - //talking items - for(var/obj/item/weapon/O in view(3,src)) - if(O.listening_to_players) - O.catchMessage(message, src) log_say("[name]/[key] : [message]") From e23530e31ca0494e3d67e4a6e06ac6a8640dda67 Mon Sep 17 00:00:00 2001 From: Ccomp5950 Date: Sat, 29 Mar 2014 23:28:47 -0500 Subject: [PATCH 2/5] Say code rewrite, Silicon jerks now using new saycode. Tracking added for AI's and Observers Instead of calling GetVoice() over and over for everyone that can hear you we're checking a variable that is updated with Life() removed a bunch of my debug verbs. --- code/game/machinery/telecomms/broadcaster.dm | 73 +---------- .../game/objects/items/devices/radio/radio.dm | 6 - code/modules/mob/dead/observer/observer.dm | 9 ++ code/modules/mob/hear_say.dm | 52 +++++++- .../mob/living/carbon/human/human_defines.dm | 2 + code/modules/mob/living/carbon/human/life.dm | 2 + code/modules/mob/living/say.dm | 4 +- code/modules/mob/living/silicon/ai/ai.dm | 4 + code/modules/mob/living/silicon/say.dm | 123 ++++++++++++++---- 9 files changed, 163 insertions(+), 112 deletions(-) diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm index ff865733f2..a204bbb448 100644 --- a/code/game/machinery/telecomms/broadcaster.dm +++ b/code/game/machinery/telecomms/broadcaster.dm @@ -225,7 +225,6 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept var/message, var/name, var/job, var/realname, var/vname, var/data, var/compression, var/list/level, var/freq, var/verbage = "says", var/datum/language/speaking = null) - world << "in broadcast_message, verb = [verbage], language = [speaking ? speaking.name : null] ([src])" /* ###### Prepare the radio connection ###### */ @@ -445,106 +444,40 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept //End of research and feedback code. - var/aitrack = "" - /* ###### Send the message ###### */ /* --- Process all the mobs that heard a masked voice (understood) --- */ if (length(heard_masked)) - var/N = name - var/J = job - world << "heard_masked" - var/rendered = "[part_a][N][part_b][quotedmsg][part_c]" for (var/mob/R in heard_masked) - aitrack = "" - if(data == 4) - aitrack = "" - - if(istype(R, /mob/living/silicon/ai)) - //R.show_message("[part_a][aitrack][N] ([J]) [part_b][quotedmsg][part_c]", 2) - else - //R.show_message(rendered, 2) + R.hear_radio(message,verbage, speaking, part_a, part_b, M) /* --- Process all the mobs that heard the voice normally (understood) --- */ if (length(heard_normal)) - var/rendered = "[part_a][realname][part_b][quotedmsg][part_c]" - world << "heard_normal" for (var/mob/R in heard_normal) - aitrack = "" - if(data == 4) - aitrack = "" - - //if(istype(R, /mob/living/silicon/ai)) R.hear_radio(message, verbage, speaking, part_a, part_b, M) - //R.show_message("[part_a][aitrack][realname] ([job]) [part_b][quotedmsg][part_c]", 2) - //else - //R.show_message(rendered, 2) /* --- Process all the mobs that heard the voice normally (did not understand) --- */ if (length(heard_voice)) - var/rendered = "[part_a][vname][part_b][vmessage][part_c]" - for (var/mob/R in heard_voice) - aitrack = "" - if(data == 4) - aitrack = "" - R.hear_radio(message,verbage, speaking, part_a, part_b, M) -/* - if(istype(R, /mob/living/silicon/ai)) - R.show_message("[part_a][aitrack][vname] ([job]) [part_b][vmessage]][part_c]", 2) - else - R.show_message(rendered, 2) -*/ /* --- Process all the mobs that heard a garbled voice (did not understand) --- */ // Displays garbled message (ie "f*c* **u, **i*er!") if (length(heard_garbled)) - if(M) - quotedmsg = M.say_quote(stars(message)) - else - quotedmsg = stars(quotedmsg) - - var/rendered = "[part_a][vname][part_b][quotedmsg][part_c]" - for (var/mob/R in heard_garbled) - aitrack = "" - if(data == 4) - aitrack = "" - - - if(istype(R, /mob/living/silicon/ai)) - R.show_message("[part_a][aitrack][vname][part_b][quotedmsg][part_c]", 2) - else - R.show_message(rendered, 2) + R.hear_radio(message, verbage, speaking, part_a, part_b, M, 1) /* --- Complete gibberish. Usually happens when there's a compressed message --- */ if (length(heard_gibberish)) - if(M) - quotedmsg = M.say_quote(Gibberish(message, compression + 50)) - else - quotedmsg = Gibberish(quotedmsg, compression + 50) - - var/rendered = "[part_a][Gibberish(name, compression + 50)][part_b][quotedmsg][part_c]" - for (var/mob/R in heard_gibberish) - aitrack = "" - if(data == 4) - aitrack = "" - - - if(istype(R, /mob/living/silicon/ai)) - R.show_message("[part_a][aitrack][Gibberish(realname, compression + 50)] ([Gibberish(job, compression + 50)]) [part_b][quotedmsg][part_c]", 2) - else - R.show_message(rendered, 2) - + R.hear_radio(message, verbage, speaking, part_a, part_b, M, 1) /proc/Broadcast_SimpleMessage(var/source, var/frequency, var/text, var/data, var/mob/M, var/compression, var/level) diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 814b92909f..569aad1c84 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -219,10 +219,6 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use return /obj/item/device/radio/talk_into(mob/living/M as mob, message, channel, var/verb = "says", var/datum/language/speaking = null) - if(speaking) - world << "radio talk_into language = [speaking.name]" - else - world << "radio talk_into language = null" if(!on) return // the device has to be on // Fix for permacell radios, but kinda eh about actually fixing them. if(!M || !message) return @@ -429,7 +425,6 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use //THIS IS TEMPORARY. if(!connection) return //~Carn - world << "WTF, WE'RE JUST DOING A STRAIGHT BROADCAST" Broadcast_Message(connection, M, voicemask, pick(M.speak_emote), src, message, displayname, jobname, real_name, M.voice_name, filter_type, signal.data["compression"], list(position.z), connection.frequency,verb,speaking) @@ -438,7 +433,6 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use else // OLD RADIO SYSTEMS: By Goons? - world << "WTF we're in old system" var/datum/radio_frequency/connection = null if(channel && channels && channels.len > 0) if (channel == "department") diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index ec85aaeaa4..dcd7e6a261 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -69,6 +69,15 @@ ..() + +/mob/dead/observer/Topic(href, href_list) + if (href_list["track"]) + var/mob/target = locate(href_list["track"]) in mob_list + if(target) + ManualFollow(target) + + + /mob/dead/attackby(obj/item/W, mob/user) if(istype(W,/obj/item/weapon/tome)) var/mob/dead/M = src diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm index 6e98e06e16..6268e3c14a 100644 --- a/code/modules/mob/hear_say.dm +++ b/code/modules/mob/hear_say.dm @@ -23,6 +23,16 @@ var/mob/living/carbon/human/H = speaker speaker_name = H.GetVoice() + if(italics) + message = "[message]" + + var/track = null + if(istype(src, /mob/dead/observer)) + if(speaker_name != speaker.real_name) + speaker_name = "[speaker.real_name] ([speaker_name])" + track = "(follow) " + if(client.prefs.toggles & CHAT_GHOSTEARS && speaker in view(src)) + message = "[message]" if(sdisabilities & DEAF || ear_deaf) if(speaker == src) @@ -30,15 +40,15 @@ else src << "[speaker_name][alt_name] talks but you cannot hear them." else - src << "[speaker_name][alt_name] [verb], \"[message]\"" + src << "[speaker_name][alt_name] [track][verb], \"[message]\"" - -/mob/proc/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/mob/speaker = null) +/mob/proc/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/mob/speaker = null, var/hard_to_hear = 0) if(!client) return + var/track = "" + var/style = "body" - world << "in hear_radio and language = [language ? language.name : null]" if(language) world << "in language check" if(!say_understands(speaker,language)) @@ -46,6 +56,9 @@ verb = language.speech_verb style = language.colour + if(hard_to_hear) + message = stars(message) + if(verb == "says") var/ending = copytext(message,length(message)) if(ending=="!") @@ -56,10 +69,39 @@ var/speaker_name = speaker.name if(istype(speaker, /mob/living/carbon/human)) var/mob/living/carbon/human/H = speaker - speaker_name = H.GetVoice() + if(H.voice) + speaker_name = H.voice + + if(hard_to_hear) + speaker_name = "unknown" + + if(istype(src, /mob/living/silicon/ai) && !hard_to_hear) + var/jobname // the mob's "job" + if (ishuman(speaker)) + var/mob/living/carbon/human/H = speaker + jobname = H.get_assignment() + else if (iscarbon(speaker)) // Nonhuman carbon mob + jobname = "No id" + else if (isAI(speaker)) + jobname = "AI" + else if (isrobot(speaker)) + jobname = "Cyborg" + else if (istype(speaker, /mob/living/silicon/pai)) + jobname = "Personal AI" + else + jobname = "Unknown" + + track = "[speaker_name] ([jobname])" + + if(istype(src, /mob/dead/observer)) + if(speaker_name != speaker.real_name) + speaker_name = "[speaker.real_name] ([speaker_name])" + track = "[speaker_name] (follow)" if(sdisabilities & DEAF || ear_deaf) if(prob(20)) src << "You feel your headset vibrate but can hear nothing from it!" + else if(track) + src << "[part_a][track][part_b] [verb], \"[message]\"" else src << "[part_a][speaker_name][part_b] [verb], \"[message]\"" diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 6e5b1625a7..eaee9814fb 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -48,6 +48,8 @@ var/icon/stand_icon = null var/icon/lying_icon = null + var/voice = "" //Instead of new say code calling GetVoice() over and over and over, we're just going to ask this variable, which gets updated in Life() + var/speech_problem_flag = 0 var/miming = null //Toggle for the mime's abilities. diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 9ddb5a7c08..46cafd27d1 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -66,6 +66,8 @@ if(life_tick%30==15) hud_updateflag = 1022 + voice = GetVoice() + //No need to update all of these procs if the guy is dead. if(stat != DEAD && !in_stasis) if(air_master.current_cycle%4==2 || failed_last_breath) //First, resolve location and get a breath diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index a81d8c841d..586441efe3 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -117,7 +117,7 @@ var/list/department_radio_keys = list( spawn(30) del(speech_bubble) if(used_radios.len) - for(var/mob/M in hearers(5, src)) + for(var/mob/living/M in hearers(5, src)) if(M != src) M.show_message("[src] talks into [used_radios.len ? used_radios[1] : "radio"]") @@ -135,5 +135,3 @@ var/list/department_radio_keys = list( /mob/living/proc/GetVoice() return name - - diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 8fd90aa571..62331233a8 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -405,9 +405,13 @@ var/list/ai_list = list() if (href_list["track"]) var/mob/target = locate(href_list["track"]) in mob_list +/* var/mob/living/silicon/ai/A = locate(href_list["track2"]) in mob_list if(A && target) A.ai_actual_track(target) +*/ + if(target) + ai_actual_track(target) return else if (href_list["faketrack"]) diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm index 7c63628ced..520ff0a0f3 100644 --- a/code/modules/mob/living/silicon/say.dm +++ b/code/modules/mob/living/silicon/say.dm @@ -2,11 +2,15 @@ var/ending = copytext(text, length(text)) if (ending == "?") - return "queries, \"[text]\""; + return "queries" else if (ending == "!") - return "declares, \"[text]\""; + return "declares" - return "states, \"[text]\""; + return "states" + +#define IS_AI 1 +#define IS_ROBOT 2 +#define IS_PAI 3 /mob/living/silicon/say(var/message) if (!message) @@ -23,39 +27,98 @@ message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) return say_dead(message) + var/bot_type = 0 //Let's not do a fuck ton of type checks, thanks. + if(istype(src, /mob/living/silicon/ai)) + bot_type = IS_AI + else if(istype(src, /mob/living/silicon/robot)) + bot_type = IS_ROBOT + else if(istype(src, /mob/living/silicon/pai)) + bot_type = IS_PAI + + var/mob/living/silicon/ai/AI = src //and let's not declare vars over and over and over for these guys. + var/mob/living/silicon/robot/R = src + var/mob/living/silicon/pai/P = src + + //Must be concious to speak if (stat) return - if (length(message) >= 2) - var/prefix = copytext(message, 1, 3) - if (department_radio_keys[prefix] == "binary") - if(istype(src, /mob/living/silicon/pai)) - return ..(message) - message = copytext(message, 3) - message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) + var/verb = say_quote(message) + var/message_mode = null - // TODO: move the component system up to silicon so we don't have to use this ugly hack.. - if(istype(src, /mob/living/silicon/robot)) - var/mob/living/silicon/robot/R = src - if(!R.is_component_functioning("comms")) - src << "\red Your binary communications component isn't functional." + + if(copytext(message,1,2) == ";") + message_mode = "general" // I don't know why but regular radio = fuck you we ain't broadcasting, pAI mode was what was in old say code. + message = trim(copytext(message,2)) + + else if(length(message) >= 2) + var/channel_prefix = copytext(message, 1 ,3) + if(!message_mode) + message_mode = department_radio_keys[channel_prefix] + + if(message_mode && bot_type == IS_ROBOT) + if(message_mode != "binary" && !R.is_component_functioning("radio")) + src << "\red Your radio isn't functional at this time." + return + + + if(message_mode && message_mode != "general") + message = trim(copytext(message,3)) + + switch(message_mode) + if("department") + switch(bot_type) + if(IS_AI) + AI.holopad_talk(message) + if(IS_ROBOT) + log_say("[key_name(src)] : [message]") + R.radio.talk_into(src,message,message_mode,verb) + if(IS_PAI) + log_say("[key_name(src)] : [message]") + P.radio.talk_into(src,message,message_mode,verb) + return + + if("binary") + switch(bot_type) + if(IS_ROBOT) + if(!R.is_component_functioning("comms")) + src << "\red Your binary communications component isn't functional." + return + if(IS_PAI) + src << "You do not appear to have that function" return robot_talk(message) - else if (department_radio_keys[prefix] == "department") - if(isAI(src)&&client)//For patching directly into AI holopads. - var/mob/living/silicon/ai/U = src - message = copytext(message, 3) - message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) - U.holopad_talk(message) - else//Will not allow anyone by an active AI to use this function. - src << "This function is not available to you." - return + return + if("general") + switch(bot_type) + if(IS_AI) + src << "Yeah, not yet, sorry" + if(IS_ROBOT) + log_say("[key_name(src)] : [message]") + R.radio.talk_into(src,message,null,verb) + if(IS_PAI) + log_say("[key_name(src)] : [message]") + P.radio.talk_into(src,message,null,verb) + return + else - return ..(message) - else - return ..(message) + if(message_mode && message_mode in radiochannels) + switch(bot_type) + if(IS_AI) + src << "You don't have this function yet, I'm working on it" + return + if(IS_ROBOT) + log_say("[key_name(src)] : [message]") + R.radio.talk_into(src,message,message_mode,verb) + if(IS_PAI) + log_say("[key_name(src)] : [message]") + P.radio.talk_into(src,message,message_mode,verb) + return + + + return ..(message,null,verb) //For holopads only. Usable by AI. /mob/living/silicon/ai/proc/holopad_talk(var/message) @@ -146,4 +209,8 @@ 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(rendered, 2) \ No newline at end of file + M.show_message(rendered, 2) + +#undef IS_AI +#undef IS_ROBOT +#undef IS_PAI From 9915d28fb13dbb37cf0bed3a95871f803ace7793 Mon Sep 17 00:00:00 2001 From: Ccomp5950 Date: Sun, 30 Mar 2014 01:10:02 -0500 Subject: [PATCH 3/5] Removal of last debug message and making players be able to use languages over general comms ;:k = skrell speak over general comms for example. --- code/modules/mob/hear_say.dm | 3 +-- code/modules/mob/living/carbon/human/say.dm | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm index 6268e3c14a..cd7a7053b3 100644 --- a/code/modules/mob/hear_say.dm +++ b/code/modules/mob/hear_say.dm @@ -46,11 +46,10 @@ /mob/proc/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/mob/speaker = null, var/hard_to_hear = 0) if(!client) return - var/track = "" + var/track = null var/style = "body" if(language) - world << "in language check" if(!say_understands(speaker,language)) message = stars(message) verb = language.speech_verb diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 0a827946f4..e436414390 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -20,7 +20,7 @@ message_mode = "headset" message = copytext(message,2) - else if(length(message) >= 2) + if(length(message) >= 2) var/channel_prefix = copytext(message, 1 ,3) var/check_language_and_radio = copytext(message,3,5) if(languages.len) From 46704a436bec3495e7b6c4e5f59bf1ba0e21bce0 Mon Sep 17 00:00:00 2001 From: Ccomp5950 Date: Tue, 8 Apr 2014 21:50:01 -0500 Subject: [PATCH 4/5] Saycode rewrite: Add support for speech_problem_flag Ready for Dev --- code/modules/mob/living/carbon/human/human_damage.dm | 2 ++ code/modules/mob/living/carbon/human/life.dm | 8 +++++++- code/modules/mob/living/carbon/human/say.dm | 10 +++++----- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 3996467013..d685e512cc 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -142,6 +142,7 @@ UpdateDamageIcon() hud_updateflag |= 1 << HEALTH_HUD updatehealth() + speech_problem_flag = 1 //Heal MANY external organs, in random order @@ -163,6 +164,7 @@ parts -= picked updatehealth() hud_updateflag |= 1 << HEALTH_HUD + speech_problem_flag = 1 if(update) UpdateDamageIcon() // damage MANY external organs, in random order diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 46cafd27d1..3f51ca218c 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -142,7 +142,6 @@ return ONE_ATMOSPHERE - pressure_difference /mob/living/carbon/human - proc/handle_disabilities() if (disabilities & EPILEPSY) if ((prob(1) && paralysis < 1)) @@ -160,6 +159,7 @@ emote("cough") return if (disabilities & TOURETTES) + speech_problem_flag = 1 if ((prob(10) && paralysis <= 1)) Stun(10) spawn( 0 ) @@ -177,6 +177,7 @@ pixel_y = old_y return if (disabilities & NERVOUS) + speech_problem_flag = 1 if (prob(10)) stuttering = max(10, stuttering) // No. -- cib @@ -231,6 +232,7 @@ if(!gene.block) continue if(gene.is_active(src)) + speech_problem_flag = 1 gene.OnMobLife(src) if (radiation) @@ -1053,6 +1055,7 @@ if(halloss > 0) adjustHalLoss(-3) else if(sleeping) + speech_problem_flag = 1 handle_dreams() adjustHalLoss(-3) if (mind) @@ -1104,16 +1107,19 @@ //Other if(stunned) + speech_problem_flag = 1 AdjustStunned(-1) if(weakened) weakened = max(weakened-1,0) //before you get mad Rockdtben: I done this so update_canmove isn't called multiple times if(stuttering) + speech_problem_flag = 1 stuttering = max(stuttering-1, 0) if (src.slurring) slurring = max(slurring-1, 0) if(silent) + speech_problem_flag = 1 silent = max(silent-1, 0) if(druggy) diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index e436414390..f426d494ce 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -4,6 +4,11 @@ var/message_range = world.view var/italics = 0 + if(client) + if(client.prefs.muted & MUTE_IC) + src << "\red You cannot speak in IC (Muted)." + return + if(stat == 2) return say_dead(message) @@ -161,11 +166,6 @@ if(silent) message = "" handled = 1 - if(client) - if(client.prefs.muted & MUTE_IC) - src << "\red You cannot speak in IC (Muted)." - message = "" - handled = 1 if(sdisabilities & MUTE) message = "" handled = 1 From 6056b5dc3d3e66cca93f9a97c5ed584b5afaefb7 Mon Sep 17 00:00:00 2001 From: Ccomp5950 Date: Wed, 9 Apr 2014 23:34:18 -0500 Subject: [PATCH 5/5] Some fixes saycode cleanups Moved the verb check from hear to the speaker Spellcheck on hulk so Dragor doesn't beat me up. --- code/modules/mob/hear_say.dm | 14 -------------- code/modules/mob/living/carbon/human/say.dm | 8 +++++++- 2 files changed, 7 insertions(+), 15 deletions(-) diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm index cd7a7053b3..a175009a03 100644 --- a/code/modules/mob/hear_say.dm +++ b/code/modules/mob/hear_say.dm @@ -11,13 +11,6 @@ verb = language.speech_verb style = language.colour - if(verb == "says") - var/ending = copytext(message, length(message)) - if(ending=="!") - verb="exclaims" - if(ending=="?") - verb="asks" - var/speaker_name = speaker.name if(istype(speaker, /mob/living/carbon/human)) var/mob/living/carbon/human/H = speaker @@ -58,13 +51,6 @@ if(hard_to_hear) message = stars(message) - if(verb == "says") - var/ending = copytext(message,length(message)) - if(ending=="!") - verb="exclaims" - if(ending=="?") - verb="asks" - var/speaker_name = speaker.name if(istype(speaker, /mob/living/carbon/human)) var/mob/living/carbon/human/H = speaker diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index f426d494ce..3f3aa32c79 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -55,6 +55,12 @@ if(!message || stat) return + var/ending = copytext(message, length(message)) + if(ending=="!") + verb=pick("exclaims","shouts","yells") + if(ending=="?") + verb="asks" + var/list/obj/item/used_radios = new switch (message_mode) @@ -180,7 +186,7 @@ if((HULK in mutations) && health >= 25 && length(message)) message = "[uppertext(message)]!!!" - verb = pick("yells","roars","hollars") + verb = pick("yells","roars","hollers") handled = 1 if(slurring) message = slur(message)