diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm
index 85f1c2e1df..9f5b3ed69d 100644
--- a/code/_helpers/unsorted.dm
+++ b/code/_helpers/unsorted.dm
@@ -245,8 +245,8 @@ Turf and target are seperate in case you want to teleport some distance from a t
//Ensure the frequency is within bounds of what it should be sending/recieving at
/proc/sanitize_frequency(var/f, var/low = PUBLIC_LOW_FREQ, var/high = PUBLIC_HIGH_FREQ)
f = round(f)
- f = max(high, f)
- f = min(low, f)
+ f = max(low, f)
+ f = min(high, f)
if ((f % 2) == 0) //Ensure the last digit is an odd number
f += 1
return f
@@ -569,7 +569,7 @@ proc/GaussRandRound(var/sigma,var/roundto)
var/turf/current = get_turf(source)
var/turf/target_turf = get_turf(target)
var/steps = 0
-
+
if(!current || !target_turf)
return 0
diff --git a/code/game/antagonist/station/traitor.dm b/code/game/antagonist/station/traitor.dm
index 35f55692f8..d0dd250058 100644
--- a/code/game/antagonist/station/traitor.dm
+++ b/code/game/antagonist/station/traitor.dm
@@ -139,7 +139,7 @@ var/datum/antagonist/traitor/traitors
if(istype(R,/obj/item/device/radio))
// generate list of radio freqs
var/obj/item/device/radio/target_radio = R
- var/freq = 1441
+ var/freq = PUBLIC_LOW_FREQ
var/list/freqlist = list()
while (freq <= PUBLIC_HIGH_FREQ)
if (freq < 1451 || freq > PUB_FREQ)
diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm
index 8ace531430..55f603f362 100644
--- a/code/game/jobs/access.dm
+++ b/code/game/jobs/access.dm
@@ -28,12 +28,15 @@
if(!req_one_access) req_one_access = list()
if(!L) return 0
if(!istype(L, /list)) return 0
- for(var/req in src.req_access)
- if(!(req in L)) //doesn't have this access
+ return has_access(req_access, req_one_access, L)
+
+/proc/has_access(var/list/req_access, var/list/req_one_access, var/list/accesses)
+ for(var/req in req_access)
+ if(!(req in accesses)) //doesn't have this access
return 0
- if(src.req_one_access.len)
- for(var/req in src.req_one_access)
- if(req in L) //has an access from the single access list
+ if(req_one_access.len)
+ for(var/req in req_one_access)
+ if(req in accesses) //has an access from the single access list
return 1
return 0
return 1
@@ -219,13 +222,12 @@ proc/get_all_job_icons() //For all existing HUD icons
if(I)
var/job_icons = get_all_job_icons()
- var/centcom = get_all_centcom_jobs()
-
if(I.assignment in job_icons) //Check if the job has a hud icon
return I.assignment
if(I.rank in job_icons)
return I.rank
+ var/centcom = get_all_centcom_jobs()
if(I.assignment in centcom) //Return with the NT logo if it is a Centcom job
return "Centcom"
if(I.rank in centcom)
diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm
index 90f36d3742..61be05870b 100644
--- a/code/game/machinery/telecomms/broadcaster.dm
+++ b/code/game/machinery/telecomms/broadcaster.dm
@@ -353,7 +353,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
// --- This following recording is intended for research and feedback in the use of department radio channels ---
var/part_blackbox_b = " \[[freq_text]\] " // Tweaked for security headsets -- TLE
- var/blackbox_msg = "[part_a][name][part_blackbox_b][quotedmsg][part_c]"
+ var/blackbox_msg = "[part_a][name][part_blackbox_b][quotedmsg][part_c]"
//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
@@ -531,13 +531,10 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
var/obj/item/device/radio/headset/radio = new
var/part_b = " \icon[radio]\[[freq_text]\][part_b_extra] " // Tweaked for security headsets -- TLE
+ var/part_blackbox_b = " \[[freq_text]\] " // Tweaked for security headsets -- TLE
var/part_c = ""
- // --- This following recording is intended for research and feedback in the use of department radio channels ---
-
- var/part_blackbox_b = " \[[freq_text]\] " // Tweaked for security headsets -- TLE
var/blackbox_msg = "[part_a][source][part_blackbox_b]\"[text]\"[part_c]"
- //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))
diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm
index 647583b5c1..a8f2591259 100644
--- a/code/game/objects/items/devices/radio/intercom.dm
+++ b/code/game/objects/items/devices/radio/intercom.dm
@@ -1,3 +1,17 @@
+// Access check is of the type requires one. These have been carefully selected to avoid allowing the janitor to see channels he shouldn't
+var/global/list/default_intercom_channels = list(
+ num2text(PUB_FREQ) = list(),
+ num2text(AI_FREQ) = list(access_synth),
+ num2text(ERT_FREQ) = list(access_cent_specops),
+ num2text(COMM_FREQ) = list(access_heads),
+ num2text(ENG_FREQ) = list(access_engine_equip, access_atmospherics),
+ num2text(MED_FREQ) = list(access_medical_equip),
+ num2text(SEC_FREQ) = list(access_security),
+ num2text(SCI_FREQ) = list(access_tox,access_robotics,access_xenobiology),
+ num2text(SUP_FREQ) = list(access_cargo),
+ num2text(SRV_FREQ) = list(access_janitor, access_hydroponics)
+)
+
/obj/item/device/radio/intercom
name = "station intercom"
desc = "Talk through this."
@@ -11,9 +25,39 @@
var/mob/living/silicon/ai/ai = list()
var/last_tick //used to delay the powercheck
+ var/list/intercom_channels
+
/obj/item/device/radio/intercom/New()
..()
processing_objects += src
+ intercom_channels = default_intercom_channels
+
+/obj/item/device/radio/intercom/syndicate
+ name = "illicit intercom"
+
+/obj/item/device/radio/intercom/syndicate/New()
+ ..()
+ intercom_channels = list(
+ num2text(PUB_FREQ) = list(),
+ num2text(SYND_FREQ) = list(access_syndicate),
+ num2text(COMM_FREQ) = list(access_syndicate),
+ num2text(ENG_FREQ) = list(access_syndicate),
+ num2text(MED_FREQ) = list(access_syndicate),
+ num2text(SEC_FREQ) = list(access_syndicate),
+ num2text(SCI_FREQ) = list(access_syndicate),
+ num2text(SUP_FREQ) = list(access_syndicate),
+ num2text(SRV_FREQ) = list(access_syndicate)
+ )
+
+/obj/item/device/radio/intercom/proc/has_channel_access(var/mob/user, var/freq)
+ if(!user)
+ return 0
+
+ if(!(freq in intercom_channels))
+ return 0
+
+ var/obj/item/weapon/card/id/I = user.GetIdCard()
+ return has_access(list(), intercom_channels[freq], I ? I.GetAccess() : list())
/obj/item/device/radio/intercom/Destroy()
processing_objects -= src
@@ -29,6 +73,16 @@
spawn (0)
attack_self(user)
+/obj/item/device/radio/intercom/list_channels(var/mob/user)
+ var/dat = ""
+ for (var/priv_chan in intercom_channels)
+ if(has_channel_access(user, priv_chan))
+ dat+="[get_frequency_name(text2num(priv_chan))]
"
+
+ if(dat)
+ dat = "
Available Channels
" + dat
+ return dat
+
/obj/item/device/radio/intercom/receive_range(freq, level)
if (!on)
return -1
@@ -57,8 +111,8 @@
if(!src.loc)
on = 0
else
- var/area/A = src.loc.loc
- if(!A || !isarea(A))
+ var/area/A = get_area(src)
+ if(!A)
on = 0
else
on = A.powered(EQUIP) // set "on" to the power status
@@ -68,9 +122,25 @@
else
icon_state = "intercom"
+/obj/item/device/radio/intercom/Topic(href, href_list)
+ if(..())
+ return 1
+
+ if(href_list["spec_freq"])
+ var freq = href_list["spec_freq"]
+ if(has_channel_access(usr, freq))
+ set_frequency(text2num(freq))
+ . = 1
+
+ if(.)
+ interact(usr)
+
/obj/item/device/radio/intercom/locked
var/locked_frequency
/obj/item/device/radio/intercom/locked/set_frequency(var/frequency)
if(frequency == locked_frequency)
..(locked_frequency)
+
+/obj/item/device/radio/intercom/locked/list_channels()
+ return ""
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index 3b5f3e5411..ad68b5e8ee 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -4,7 +4,6 @@
suffix = "\[3\]"
icon_state = "walkietalkie"
item_state = "walkietalkie"
- req_access = list(access_synth)
var/on = 1 // 0 for off
var/last_transmission
@@ -89,17 +88,19 @@
+
"}
- for (var/ch_name in channels)
- dat+=text_sec_channel(ch_name, channels[ch_name])
-
- if(allowed(user))
- dat+= "Channel Name: [(frequency in DEPT_FREQS) ? get_frequency_name(frequency) : "Unknown"]
"
+ dat+=list_channels(user)
dat+={"[text_wires()]