diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm index 7d5de0cec8b..9eb4ff80176 100644 --- a/code/game/machinery/telecomms/broadcaster.dm +++ b/code/game/machinery/telecomms/broadcaster.dm @@ -57,10 +57,9 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept /* ###### Broadcast a message using signal.data ###### */ Broadcast_Message(signal.data["mob"], - signal.data["vmask"], - signal.data["radio"], signal.data["message"], - signal.data["name"], signal.data["job"], - signal.data["realname"], 0, signal.data["compression"], signal.data["level"], signal.frequency) + signal.data["vmask"], signal.data["radio"], + signal.data["message"], signal.data["name"], signal.data["job"], signal.data["realname"], + 0, signal.data["compression"], signal.data["level"], signal.frequency) /** #### - Simple Broadcast - #### **/ @@ -81,10 +80,10 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept /* ###### Broadcast a message using signal.data ###### */ // Parameter "data" as 4: AI can't track this person/mob Broadcast_Message(signal.data["mob"], - signal.data["vmask"], signal.data["vmessage"], + signal.data["vmask"], 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"], 4, signal.data["compression"], signal.data["level"], signal.frequency) if(!message_delay) message_delay = 1 @@ -209,19 +208,37 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept **/ -//this proc is cursed. save yourself while you still can. + /proc/Broadcast_Message(var/atom/movable/AM, var/vmask, var/obj/item/device/radio/radio, var/message, var/name, var/job, var/realname, var/data, var/compression, var/list/level, var/freq) + /*world << "broadcast_message() called" + world << "AM = [AM]" + world << "vmask = [vmask]" + world << "radio = [radio]" + world << "message = [message]" + world << "name = [name]" + world << "job = [job]" + world << "realname = [realname]" + world << "data = [data]" + world << "compression = [compression]" + world << "level:" + for(var/i in level) + world << i + world << "freq = [freq]"*/ message = copytext(message, 1, MAX_BROADCAST_LEN) + if(!message) + return var/list/radios = list() var/atom/movable/virtualspeaker/virt = new(null) //fuck this code. virt.name = name virt.job = job virt.languages = AM.languages + virt.source = AM + virt.faketrack = data == 4 ? 1 : 0 if(compression > 0) message = Gibberish(message, compression + 50) @@ -253,9 +270,6 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept if(R.receive_range(SYND_FREQ, level) > -1) radios += R - else if(data == 4) //whoever added this argument to the data key instead of a new one was an idiot. - virt.faketrack = 1 - // --- Broadcast to ALL radio devices --- else @@ -276,25 +290,10 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept for(var/atom/movable/hearer in receive) hearer.Hear(message, virt, AM.languages, message, freq) -/* // ###### Organize the receivers into categories for displaying the message ###### - - // Understood the message: - var/list/heard_masked = list() // masked name or no real name - var/list/heard_normal = list() // normal message - - // Did not understand the message: - var/list/heard_voice = list() // voice message (ie "chimpers") - var/list/heard_garbled = list() // garbled message (ie "f*c* **u, **i*er!") - var/list/heard_gibberish= list() // completely screwed over message (ie "F%! (O*# *#!<>&**%!") -*/ - if(length(receive)) // --- This following recording is intended for research and feedback in the use of department radio channels --- var/blackbox_msg = "[AM] [AM.say_quote(message)]" - //var/blackbox_admin_msg = "[part_a][M.name] (Real name: [M.real_name])[part_blackbox_b][quotedmsg][part_c]" - - //BR.messages_admin += blackbox_admin_msg if(istype(blackbox)) switch(freq) if(1459) @@ -320,107 +319,6 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept else blackbox.messages += blackbox_msg - //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 - 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) - - // --- Process all the mobs that heard the voice normally (understood) --- - - if (length(heard_normal)) - var/rendered = "[part_a][realname][part_b][quotedmsg][part_c]" - - 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) - - // --- Process all the mobs that heard the voice normally (did not understand) --- - // Does not display message; displayes the mob's voice_message (ie "chimpers") - - 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 = "" - - - 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) - - - // --- 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) - -*/ - /proc/Broadcast_SimpleMessage(var/source, var/frequency, var/text, var/data, var/mob/M, var/compression, var/level) /* ###### Prepare the radio connection ###### */ diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index dcf79fbf9e4..b993cd35aa7 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -46,6 +46,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use new_frequency = num2text(new_frequency) remove_radio(src, radio_connection) radio_connection = add_radio(src, new_frequency) + frequency = text2num(new_frequency) /obj/item/device/radio/New() wires = new(src) @@ -388,18 +389,17 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use R.receive_signal(signal) - sleep(rand(10,25)) // wait a little... + spawn(20) // wait a little... - if(signal.data["done"] && position.z in signal.data["level"]) - // we're done here. - return + if(signal.data["done"] && position.z in signal.data["level"]) + // we're done here. + return - // Oh my god; the comms are down or something because the signal hasn't been broadcasted yet in our level. - // Send a mundane broadcast with limited targets: - world << "radio mundane broadcast" - Broadcast_Message(M, voicemask, - src, message, displayname, jobname, real_name, - filter_type, signal.data["compression"], list(position.z), freq) + // Oh my god; the comms are down or something because the signal hasn't been broadcasted yet in our level. + // Send a mundane broadcast with limited targets: + Broadcast_Message(M, voicemask, + src, message, displayname, jobname, real_name, + filter_type, signal.data["compression"], list(position.z), freq) diff --git a/code/modules/mob/living/carbon/human/whisper.dm b/code/modules/mob/living/carbon/human/whisper.dm index ec1ca3fc1c5..a09b4327305 100644 --- a/code/modules/mob/living/carbon/human/whisper.dm +++ b/code/modules/mob/living/carbon/human/whisper.dm @@ -48,14 +48,12 @@ rendered = "[GetVoice()][alt_name] [whispers], \"[message]\"" for(var/mob/M in listening) - M.Hear(rendered, src, languages, message, 1) + M.Hear(rendered, src, languages, message) message = stars(message) rendered = "[GetVoice()][alt_name] [whispers], \"[message]\"" for(var/mob/M in eavesdropping) - M.Hear(rendered, src, languages, message, 2) + M.Hear(rendered, src, languages, message) - // We whispered our final breath, now we die and show the message you have sent - // since it might have been cut off and it would be annoying not being able to know. - if(critical) + if(critical) //Dying words. succumb(1) diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index ca07f0e73ce..b709928331e 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -59,16 +59,20 @@ var/list/department_radio_keys = list( /mob/living/say(message, bubble_type) message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) - check_emote(message) + if(check_emote(message)) + return if(!can_speak_basic(message) || stat) //Stat is seperate so I can handle whispers properly. return + var/message_mode = get_message_mode(message) if(message_mode == "headset" || message_mode == "robot") message = copytext(message, 2) else if(message_mode) message = copytext(message, 3) + if(findtext(message, " ", 1, 2)) + message = copytext(message, 2) if(handle_inherent_channels(message, message_mode)) //Hiveminds, binary chat & holopad. return @@ -109,7 +113,7 @@ var/list/department_radio_keys = list( /mob/living/send_speech(message, message_range = 7, obj/source = src, bubble_type) var/list/listening = get_hearers_in_view(message_range, source) - var/list/listening_dead + var/list/listening_dead = list() for(var/mob/M in player_list) if(M.stat == DEAD && (M.client.prefs.toggles & CHAT_GHOSTEARS) && client) // client is so that ghosts don't have to listen to mice listening_dead |= M @@ -224,7 +228,7 @@ var/list/department_radio_keys = list( if("binary") if(binarycheck()) robot_talk(message) - return 1 + return 1 //Does not return 0 since this is only reached by humans, not borgs or AIs. if("whisper") whisper(message) diff --git a/code/modules/mob/living/silicon/ai/say.dm b/code/modules/mob/living/silicon/ai/say.dm index d6f426d7054..c0084e11a8b 100644 --- a/code/modules/mob/living/silicon/ai/say.dm +++ b/code/modules/mob/living/silicon/ai/say.dm @@ -16,7 +16,7 @@ /mob/living/silicon/ai/compose_job(message, atom/movable/speaker, message_langs, raw_message, radio_freq) //Also includes the for AI hrefs, for convenience. - return "[radio_freq ? "(" + speaker.GetJob() + ") " : ""]" + speaker.GetSource() ? "" : "" + return " [radio_freq ? "(" + speaker.GetJob() + ")" : ""]" + "[speaker.GetSource() ? "" : ""] " /mob/living/silicon/ai/say_quote(var/text) var/ending = copytext(text, length(text)) @@ -34,6 +34,8 @@ /mob/living/silicon/ai/get_message_mode(message) if(copytext(message, 1, 3) in list(":h", ":H", ".h", ".H", "#h", "#H")) return "holopad" + else + return ..() /mob/living/silicon/ai/handle_inherent_channels(message, message_mode) . = ..() diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm index e7b18333363..683b1d37250 100644 --- a/code/modules/mob/living/silicon/say.dm +++ b/code/modules/mob/living/silicon/say.dm @@ -42,5 +42,19 @@ return 2 /mob/living/silicon/get_message_mode(message) + . = ..() if(..() == "headset") return "robot" + else + return . + +/mob/living/silicon/handle_inherent_channels(message, message_mode) + . = ..() + if(.) + return . + + if(message_mode == "binary") + if(binarycheck()) + robot_talk(message) + return 1 + return 0 diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index 4eb7b43c01c..8bc8ea2e741 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -7,7 +7,7 @@ return usr.say(message) -/mob/verb/whisper() +/mob/verb/whisper(message as text) set name = "Whisper" set category = "IC" return @@ -60,14 +60,18 @@ . += "" + //Start name span. + . += "" //Radio freq/name display . += radio_freq ? "\[[get_radio_name(radio_freq)]\] " : "" //Begin track (AI only) . += compose_track_href(message, speaker, message_langs, raw_message, radio_freq) //Speaker name - . += "[speaker.GetVoice()][speaker.get_alt_name()]" + . += "[speaker.GetVoice()][speaker.get_alt_name()]" //Job & end track (AI only) . += compose_job(message, speaker, message_langs, raw_message, radio_freq) + //End name span. + . += "" //Message . += " [lang_treat(message, speaker, message_langs, raw_message)]" return . diff --git a/code/modules/scripting/Implementations/Telecomms.dm b/code/modules/scripting/Implementations/Telecomms.dm index d8f1121f07b..ab3b73cdbfa 100644 --- a/code/modules/scripting/Implementations/Telecomms.dm +++ b/code/modules/scripting/Implementations/Telecomms.dm @@ -300,9 +300,18 @@ datum/signal freq *= 10 // shift the decimal one place if(!job) - job = "?" + job = "Unknown" + + //SAY REWRITE RELATED CODE. + //This code is a little hacky, but it *should* work. Even though it'll result in a virtual speaker referencing another virtual speaker. vOv + var/atom/movable/virtualspeaker/virt = new(null) + virt.name = source + virt.job = job + virt.faketrack = 1 + virt.languages = HUMAN + //END SAY REWRITE RELATED CODE. - newsign.data["mob"] = null + newsign.data["mob"] = virt newsign.data["mobtype"] = /mob/living/carbon/human newsign.data["name"] = source newsign.data["realname"] = newsign.data["name"] @@ -319,7 +328,7 @@ datum/signal newsign.data["vmessage"] = message newsign.data["vname"] = source newsign.data["vmask"] = 0 - newsign.data["level"] = list() + newsign.data["level"] = data["level"] newsign.sanitize_data()