diff --git a/code/__DEFINES/radio.dm b/code/__DEFINES/radio.dm index a598703047c..d236b91551f 100644 --- a/code/__DEFINES/radio.dm +++ b/code/__DEFINES/radio.dm @@ -121,3 +121,10 @@ ///give this to can_receive to specify that there is no restriction on what z level this signal is sent to #define RADIO_NO_Z_LEVEL_RESTRICTION 0 + +/// Radio frequency is unlocked and can be ajusted by anyone +#define RADIO_FREQENCY_UNLOCKED 0 +/// Radio frequency is locked, unchangeable by players +#define RADIO_FREQENCY_LOCKED 1 +/// Radio frequency is locked and unchangeable, but can be unlocked by an emag +#define RADIO_FREQENCY_EMAGGABLE_LOCK 2 diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index 67d4b416ddc..fe522c3da5b 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -39,6 +39,15 @@ else . += span_notice("It's unscrewed from the wall, and can be detached.") + if(anonymize) + . += span_notice("Speaking through this intercom will anonymize your voice.") + + if(freqlock == RADIO_FREQENCY_UNLOCKED) + if(obj_flags & EMAGGED) + . += span_warning("Its frequency lock has been shorted...") + else + . += span_notice("It has a frequency lock set to [frequency/10].") + /obj/item/radio/intercom/screwdriver_act(mob/living/user, obj/item/tool) if(unscrewed) user.visible_message(span_notice("[user] starts tightening [src]'s screws..."), span_notice("You start screwing in [src]...")) @@ -112,6 +121,29 @@ . = ..() AreaPowerCheck() // Make sure the area/local APC is powered first before we actually turn back on. +/obj/item/radio/intercom/emag_act(mob/user, obj/item/card/emag/emag_card) + if(obj_flags & EMAGGED) + return + + switch(freqlock) + // Emagging an intercom with an emaggable lock will remove the lock + if(RADIO_FREQENCY_EMAGGABLE_LOCK) + balloon_alert(user, "frequency lock cleared") + playsound(src, SFX_SPARKS, 75, TRUE, SILENCED_SOUND_EXTRARANGE) + freqlock = RADIO_FREQENCY_UNLOCKED + obj_flags |= EMAGGED + + // A fully locked one will do nothing, as locked is intended to be used for stuff that should never be changed + if(RADIO_FREQENCY_LOCKED) + balloon_alert(user, "can't override frequency lock!") + playsound(src, 'sound/machines/buzz-two.ogg', 50, FALSE, SILENCED_SOUND_EXTRARANGE) + + // Emagging an unlocked one will do nothing, for now + else + return + + return ..() + /obj/item/radio/intercom/update_icon_state() icon_state = on ? initial(icon_state) : "intercom-p" return ..() @@ -148,7 +180,9 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/item/radio/intercom, 26) /obj/item/radio/intercom/chapel name = "Confessional intercom" + desc = "Talk through this... to confess your many sins. Conceals your voice, to keep them secret." anonymize = TRUE + freqlock = RADIO_FREQENCY_EMAGGABLE_LOCK /obj/item/radio/intercom/chapel/Initialize(mapload, ndir, building) . = ..() diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index dba7b3dfc9a..501a94fb601 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -52,7 +52,7 @@ /// If true, subspace_transmission can be toggled at will. var/subspace_switchable = FALSE /// Frequency lock to stop the user from untuning specialist radios. - var/freqlock = FALSE + var/freqlock = RADIO_FREQENCY_UNLOCKED /// If true, broadcasts will be large and BOLD. var/use_command = FALSE /// If true, use_command can be toggled at will. @@ -368,7 +368,7 @@ data["frequency"] = frequency data["minFrequency"] = freerange ? MIN_FREE_FREQ : MIN_FREQ data["maxFrequency"] = freerange ? MAX_FREE_FREQ : MAX_FREQ - data["freqlock"] = freqlock + data["freqlock"] = freqlock != RADIO_FREQENCY_UNLOCKED data["channels"] = list() for(var/channel in channels) data["channels"][channel] = channels[channel] & FREQ_LISTENING @@ -386,7 +386,7 @@ return switch(action) if("frequency") - if(freqlock) + if(freqlock != RADIO_FREQENCY_UNLOCKED) return var/tune = params["tune"] var/adjust = text2num(params["adjust"]) diff --git a/code/modules/antagonists/nukeop/outfits.dm b/code/modules/antagonists/nukeop/outfits.dm index e6223a72770..f6f74b276f6 100644 --- a/code/modules/antagonists/nukeop/outfits.dm +++ b/code/modules/antagonists/nukeop/outfits.dm @@ -30,7 +30,7 @@ return var/obj/item/radio/radio = nukie.ears radio.set_frequency(FREQ_SYNDICATE) - radio.freqlock = TRUE + radio.freqlock = RADIO_FREQENCY_LOCKED if(command_radio) radio.command = TRUE radio.use_command = TRUE diff --git a/code/modules/capture_the_flag/ctf_classes.dm b/code/modules/capture_the_flag/ctf_classes.dm index 58ea6fd105b..50be334aca7 100644 --- a/code/modules/capture_the_flag/ctf_classes.dm +++ b/code/modules/capture_the_flag/ctf_classes.dm @@ -54,7 +54,7 @@ if(has_radio) var/obj/item/radio/headset = human_to_equip.ears headset.set_frequency(team_radio_freq) - headset.freqlock = TRUE + headset.freqlock = RADIO_FREQENCY_LOCKED headset.independent = TRUE human_to_equip.dna.species.stunmod = 0 diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm index 0a73faa16f1..b46f4ddf7c9 100644 --- a/code/modules/clothing/outfits/ert.dm +++ b/code/modules/clothing/outfits/ert.dm @@ -23,7 +23,7 @@ var/obj/item/radio/headset/R = H.ears R.set_frequency(FREQ_CENTCOM) - R.freqlock = TRUE + R.freqlock = RADIO_FREQENCY_LOCKED if(additional_radio) R.keyslot2 = new additional_radio() R.recalculateChannels() @@ -460,7 +460,7 @@ var/obj/item/radio/R = H.ears R.set_frequency(FREQ_CENTCOM) - R.freqlock = TRUE + R.freqlock = RADIO_FREQENCY_LOCKED var/obj/item/card/id/W = H.wear_id W.registered_name = H.real_name W.update_label() diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm index e737dccf2ef..23183901756 100644 --- a/code/modules/clothing/outfits/standard.dm +++ b/code/modules/clothing/outfits/standard.dm @@ -26,7 +26,7 @@ var/obj/item/radio/headset/R = H.ears R.set_frequency(FREQ_CENTCOM) - R.freqlock = TRUE + R.freqlock = RADIO_FREQENCY_LOCKED ..() /datum/outfit/space @@ -135,7 +135,7 @@ var/obj/item/radio/outfit_radio = equipped.ears if(outfit_radio) outfit_radio.set_frequency(FREQ_SYNDICATE) - outfit_radio.freqlock = TRUE + outfit_radio.freqlock = RADIO_FREQENCY_LOCKED var/obj/item/card/id/outfit_id = equipped.wear_id if(outfit_id)