diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index 0e0283b0aed..33507289e54 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -460,7 +460,14 @@ var/global/list/default_medbay_channels = list(
R.receive_signal(signal)
// Receiving code can be located in Telecommunications.dm
- return signal.data["done"] && (position.z in signal.data["level"])
+ var/position_z_in_level = FALSE // this particular band-aid is required to make antag radios say "talks into" and not "tries to talk into" when using a radio, due to how their signals are made
+ if(islist(signal.data["level"]))
+ if(position.z in signal.data["level"])
+ position_z_in_level = TRUE
+ else
+ if(position.z == signal.data["level"])
+ position_z_in_level = TRUE
+ return signal.data["done"] && position_z_in_level
/* ###### Intercoms and station-bounced radios ###### */
diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm
index 58d308d54b6..28134a14fd2 100644
--- a/code/modules/mob/living/carbon/human/say.dm
+++ b/code/modules/mob/living/carbon/human/say.dm
@@ -147,57 +147,64 @@
returns = species.handle_speech_problems(src, returns, message, verb, message_mode)
return returns
-/mob/living/carbon/human/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name)
+/mob/living/carbon/human/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name, successful_radio)
switch(message_mode)
if("intercom")
for(var/obj/item/device/radio/intercom/I in view(1))
+ I.add_fingerprint(src)
+ used_radios += I
if(I.talk_into(src, message, null, verb, speaking))
- I.add_fingerprint(src)
- used_radios += I
+ successful_radio += I
if("headset")
- if(l_ear && istype(l_ear,/obj/item/device/radio))
+ if(istype(l_ear,/obj/item/device/radio))
var/obj/item/device/radio/R = l_ear
+ used_radios += l_ear
if(R.talk_into(src,message,null,verb,speaking))
- used_radios += l_ear
- else if(r_ear && istype(r_ear,/obj/item/device/radio))
+ successful_radio += R
+ else if(istype(r_ear,/obj/item/device/radio))
var/obj/item/device/radio/R = r_ear
+ used_radios += r_ear
if(R.talk_into(src,message,null,verb,speaking))
- used_radios += r_ear
+ successful_radio += R
if("right ear")
var/obj/item/device/radio/R
var/has_radio = 0
- if(r_ear && istype(r_ear,/obj/item/device/radio))
+ if(istype(r_ear,/obj/item/device/radio))
R = r_ear
has_radio = 1
- if(r_hand && istype(r_hand, /obj/item/device/radio))
+ if(istype(r_hand, /obj/item/device/radio))
R = r_hand
has_radio = 1
if(has_radio)
+ used_radios += R
if(R.talk_into(src,message,null,verb,speaking))
- used_radios += R
+ successful_radio += R
if("left ear")
var/obj/item/device/radio/R
var/has_radio = 0
- if(l_ear && istype(l_ear,/obj/item/device/radio))
+ if(istype(l_ear, /obj/item/device/radio))
R = l_ear
has_radio = 1
- if(l_hand && istype(l_hand,/obj/item/device/radio))
+ if(istype(l_hand, /obj/item/device/radio))
R = l_hand
has_radio = 1
if(has_radio)
+ used_radios += R
if(R.talk_into(src,message,null,verb,speaking))
- used_radios += R
+ successful_radio += R
if("whisper")
whisper_say(message, speaking, alt_name)
return 1
else
if(message_mode)
- if(l_ear && istype(l_ear,/obj/item/device/radio))
+ if(istype(l_ear, /obj/item/device/radio))
+ used_radios += l_ear
if(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))
+ successful_radio += l_ear
+ else if(istype(r_ear, /obj/item/device/radio))
+ used_radios += r_ear
if(r_ear.talk_into(src,message, message_mode, verb, speaking))
- used_radios += r_ear
+ successful_radio += r_ear
/mob/living/carbon/human/handle_speech_sound()
var/list/returns = ..()
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index eb7e2b16f5f..a86279eb46d 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -137,11 +137,12 @@ proc/get_radio_key_from_channel(var/channel)
returns[4] = world.view
return returns
-/mob/living/proc/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name)
+/mob/living/proc/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name, successful_radio)
if(message_mode == "intercom")
for(var/obj/item/device/radio/intercom/I in view(1, null))
+ used_radios += I
if(I.talk_into(src, message, verb, speaking))
- used_radios += I
+ successful_radio += I
return 0
/mob/living/proc/handle_speech_sound()
@@ -230,7 +231,8 @@ proc/get_radio_key_from_channel(var/channel)
return say_signlang(message, pick(speaking.signlang_verb), speaking)
var/list/obj/item/used_radios = new
- if(handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name))
+ var/list/successful_radio = new // passes a list because standard vars don't work when passed
+ if(handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name, successful_radio))
return 1
var/list/handle_v = handle_speech_sound()
@@ -241,19 +243,19 @@ proc/get_radio_key_from_channel(var/channel)
//speaking into radios
- if(used_radios.len)
+ if(length(used_radios))
italics = 1
message_range = 1
if(speaking)
message_range = speaking.get_talkinto_msg_range(message)
var/msg
if(!speaking || !(speaking.flags & NO_TALK_MSG))
- msg = "\The [src] talks into \the [used_radios[1]]."
- for(var/mob/living/M in hearers(5, src))
- if((M != src) && msg)
+ msg = "\The [src] [length(successful_radio) ? "talks into" : "tries talking into"] \the [used_radios[1]]."
+ for(var/mob/living/M in hearers(5, src) - src)
+ if(msg)
M.show_message(msg)
- if (speech_sound)
- sound_vol *= 0.5
+ if(speech_sound)
+ sound_vol *= 0.5
var/list/listening = list()
var/list/listening_obj = list()
diff --git a/html/changelogs/geeves-radio_speech.yml b/html/changelogs/geeves-radio_speech.yml
new file mode 100644
index 00000000000..fa550d43b3a
--- /dev/null
+++ b/html/changelogs/geeves-radio_speech.yml
@@ -0,0 +1,7 @@
+author: Geeves
+
+delete-after: True
+
+changes:
+ - bugfix: "Failing to speak into a radio will no longer just slap your message out loud, instead, you will still whisper, and the visible message for speaking will be 'tries speaking into the'."
+ - bugfix: "Speaking on antagonist channels will no longer speak it out loud."