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()