diff --git a/code/__DEFINES/__game.dm b/code/__DEFINES/__game.dm
index 765603df629c..11c6e335d932 100644
--- a/code/__DEFINES/__game.dm
+++ b/code/__DEFINES/__game.dm
@@ -124,6 +124,7 @@ block( \
#define CHAT_FFATTACKLOGS (1<<11)
#define CHAT_GHOSTHIVEMIND (1<<12)
#define CHAT_NICHELOGS (1<<13)
+#define CHAT_LISTENINGBUG (1<<14)
//toggles_ghost
#define GHOST_HEALTH_SCAN (1<<0)
diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm
index f8250fad271c..e992ef02f8a5 100644
--- a/code/game/machinery/telecomms/broadcaster.dm
+++ b/code/game/machinery/telecomms/broadcaster.dm
@@ -83,7 +83,7 @@
vmask, vmessage, obj/item/device/radio/radio,
message, name, job, realname, vname,
data, compression, list/level, freq, verbage = "says",
- datum/language/speaking = null, volume = RADIO_VOLUME_QUIET)
+ datum/language/speaking = null, volume = RADIO_VOLUME_QUIET, listening_device = FALSE)
/* ###### Prepare the radio connection ###### */
var/display_freq = freq
@@ -175,13 +175,16 @@
volume = RADIO_VOLUME_CRITICAL
for (var/mob/R in receive)
+ var/is_ghost = istype(R, /mob/dead/observer)
/* --- Loop through the receivers and categorize them --- */
if (R.client && !(R.client.prefs.toggles_chat & CHAT_RADIO)) //Adminning with 80 people on can be fun when you're trying to talk and all you can hear is radios.
continue
if(istype(R, /mob/new_player)) // we don't want new players to hear messages. rare but generates runtimes.
continue
// Ghosts hearing all radio chat don't want to hear syndicate intercepts, they're duplicates
- if(data == 3 && istype(R, /mob/dead/observer) && R.client && (R.client.prefs.toggles_chat & CHAT_GHOSTRADIO))
+ if(data == 3 && is_ghost && R.client && (R.client.prefs.toggles_chat & CHAT_GHOSTRADIO))
+ continue
+ if(is_ghost && listening_device && !(R.client.prefs.toggles_chat & CHAT_LISTENINGBUG))
continue
// --- Check for compression ---
if(compression > 0)
diff --git a/code/game/objects/items/devices/radio/listening_bugs.dm b/code/game/objects/items/devices/radio/listening_bugs.dm
index 4a84df071c60..67a91de1bd56 100644
--- a/code/game/objects/items/devices/radio/listening_bugs.dm
+++ b/code/game/objects/items/devices/radio/listening_bugs.dm
@@ -90,7 +90,7 @@
var/processed_verb = "[SPAN_RED("\[LSTN [nametag]\]")] [verb]"
if(broadcasting)
if(get_dist(src, M) <= 7)
- talk_into(M, msg,null,processed_verb,speaking)
+ talk_into(M, msg, null, processed_verb, speaking, listening_device = TRUE)
/obj/item/device/radio/listening_bug/afterattack(atom/target_atom, mob/user as mob, proximity)
if(!ready_to_disguise)
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index c628758c74e8..43eb1810d700 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -206,7 +206,7 @@
// If we were to send to a channel we don't have, drop it.
return null
-/obj/item/device/radio/talk_into(mob/living/M as mob, message, channel, verb = "says", datum/language/speaking = null)
+/obj/item/device/radio/talk_into(mob/living/M as mob, message, channel, verb = "says", datum/language/speaking = null, listening_device = FALSE)
if(!on) return // the device has to be on
// Fix for permacell radios, but kinda eh about actually fixing them.
if(!M || !message) return
@@ -297,11 +297,11 @@
if(use_volume)
Broadcast_Message(connection, M, voicemask, pick(M.speak_emote),
src, message, displayname, jobname, real_name, M.voice_name,
- filter_type, 0, target_zs, connection.frequency, verb, speaking, volume)
+ filter_type, 0, target_zs, connection.frequency, verb, speaking, volume, listening_device)
else
Broadcast_Message(connection, M, voicemask, pick(M.speak_emote),
src, message, displayname, jobname, real_name, M.voice_name,
- filter_type, 0, target_zs, connection.frequency, verb, speaking, RADIO_VOLUME_QUIET)
+ filter_type, 0, target_zs, connection.frequency, verb, speaking, RADIO_VOLUME_QUIET, listening_device)
/obj/item/device/radio/proc/get_target_zs(frequency)
var/turf/position = get_turf(src)
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 6c52b497f9a3..c11d35451656 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -573,6 +573,7 @@ GLOBAL_LIST_INIT(bgstate_options, list(
dat += "Ghost Ears: [(toggles_chat & CHAT_GHOSTEARS) ? "All Speech" : "Nearest Creatures"]
"
dat += "Ghost Sight: [(toggles_chat & CHAT_GHOSTSIGHT) ? "All Emotes" : "Nearest Creatures"]
"
dat += "Ghost Radio: [(toggles_chat & CHAT_GHOSTRADIO) ? "All Chatter" : "Nearest Speakers"]
"
+ dat += "Ghost Spy Radio: [(toggles_chat & CHAT_LISTENINGBUG) ? "Hear" : "Silence"] listening devices
"
dat += "Ghost Hivemind: [(toggles_chat & CHAT_GHOSTHIVEMIND) ? "Show Hivemind" : "Hide Hivemind"]
"
dat += "Abovehead Chat: [lang_chat_disabled ? "Hide" : "Show"]
"
dat += "Abovehead Emotes: [(toggles_langchat & LANGCHAT_SEE_EMOTES) ? "Show" : "Hide"]
"
@@ -1832,6 +1833,9 @@ GLOBAL_LIST_INIT(bgstate_options, list(
if("ghost_radio")
toggles_chat ^= CHAT_GHOSTRADIO
+ if("ghost_spyradio")
+ toggles_chat ^= CHAT_LISTENINGBUG
+
if("ghost_hivemind")
toggles_chat ^= CHAT_GHOSTHIVEMIND
diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm
index 6fe334a2a0ab..d246a17bf5c0 100644
--- a/code/modules/client/preferences_toggles.dm
+++ b/code/modules/client/preferences_toggles.dm
@@ -602,6 +602,14 @@
to_chat(src,SPAN_BOLDNOTICE( "As a ghost, you will now [(prefs.toggles_chat & CHAT_GHOSTRADIO) ? "hear all radio chat in the world" : "only hear from nearby speakers"]."))
prefs.save_preferences()
+/client/proc/toggle_ghost_spyradio()
+ set name = "Toggle GhostSpyRadio"
+ set category = "Preferences.Ghost"
+ set desc = "Toggle between hearing listening devices or not."
+ prefs.toggles_chat ^= CHAT_LISTENINGBUG
+ to_chat(src,SPAN_BOLDNOTICE( "As a ghost, you will [(prefs.toggles_chat & CHAT_LISTENINGBUG) ? "now" : "no longer"] hear listening devices as a ghost."))
+ prefs.save_preferences()
+
/client/proc/toggle_ghost_hud()
set name = "Toggle Ghost HUDs"
set category = "Preferences.Ghost"
@@ -757,6 +765,7 @@ GLOBAL_LIST_INIT(ghost_prefs_verbs, list(
/client/proc/toggle_ghost_ears,
/client/proc/toggle_ghost_sight,
/client/proc/toggle_ghost_radio,
+ /client/proc/toggle_ghost_spyradio,
/client/proc/toggle_ghost_hivemind,
/client/proc/deadchat,
/client/proc/toggle_ghost_hud,