diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm
index 69c891d2a41..c56a5d1e687 100644
--- a/code/_helpers/unsorted.dm
+++ b/code/_helpers/unsorted.dm
@@ -243,10 +243,10 @@ Turf and target are seperate in case you want to teleport some distance from a t
return 1
//Ensure the frequency is within bounds of what it should be sending/recieving at
-/proc/sanitize_frequency(var/f)
+/proc/sanitize_frequency(var/f, var/low = PUBLIC_LOW_FREQ, var/high = PUBLIC_HIGH_FREQ)
f = round(f)
- f = max(1441, f) // 144.1
- f = min(1489, f) // 148.9
+ 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/controllers/communications.dm b/code/controllers/communications.dm
index c1594665a1b..f9e7b67c742 100644
--- a/code/controllers/communications.dm
+++ b/code/controllers/communications.dm
@@ -97,11 +97,16 @@ On the map:
1455 for AI access
*/
-var/const/BOT_FREQ = 1447
+var/const/RADIO_LOW_FREQ = 1200
+var/const/PUBLIC_LOW_FREQ = 1441
+var/const/PUBLIC_HIGH_FREQ = 1489
+var/const/RADIO_HIGH_FREQ = 1600
+
+var/const/BOT_FREQ = 1447
var/const/COMM_FREQ = 1353
-var/const/ERT_FREQ = 1345
-var/const/AI_FREQ = 1343
-var/const/DTH_FREQ = 1341
+var/const/ERT_FREQ = 1345
+var/const/AI_FREQ = 1343
+var/const/DTH_FREQ = 1341
var/const/SYND_FREQ = 1213
// department channels
@@ -113,6 +118,10 @@ var/const/SCI_FREQ = 1351
var/const/SRV_FREQ = 1349
var/const/SUP_FREQ = 1347
+// internal department channels
+var/const/MED_I_FREQ = 1485
+var/const/SEC_I_FREQ = 1475
+
var/list/radiochannels = list(
"Common" = PUB_FREQ,
"Science" = SCI_FREQ,
@@ -125,7 +134,9 @@ var/list/radiochannels = list(
"Mercenary" = SYND_FREQ,
"Supply" = SUP_FREQ,
"Service" = SRV_FREQ,
- "AI Private" = AI_FREQ
+ "AI Private" = AI_FREQ,
+ "Medical(I)" = MED_I_FREQ,
+ "Security(I)" = SEC_I_FREQ
)
// central command channels, i.e deathsquid & response teams
@@ -134,8 +145,8 @@ var/list/CENT_FREQS = list(ERT_FREQ, DTH_FREQ)
// Antag channels, i.e. Syndicate
var/list/ANTAG_FREQS = list(SYND_FREQ)
-//depenging helpers
-var/list/DEPT_FREQS = list(SCI_FREQ, MED_FREQ, ENG_FREQ, SEC_FREQ, SUP_FREQ, SRV_FREQ, ERT_FREQ, SYND_FREQ, DTH_FREQ)
+//Department channels, arranged lexically
+var/list/DEPT_FREQS = list(AI_FREQ, COMM_FREQ, ENG_FREQ, MED_FREQ, SEC_FREQ, SCI_FREQ, SRV_FREQ, SUP_FREQ)
#define TRANSMISSION_WIRE 0
#define TRANSMISSION_RADIO 1
@@ -145,29 +156,28 @@ var/list/DEPT_FREQS = list(SCI_FREQ, MED_FREQ, ENG_FREQ, SEC_FREQ, SUP_FREQ, SRV
if (frequency in ANTAG_FREQS)
return "syndradio"
// centcomm channels (deathsquid and ert)
- else if(frequency in CENT_FREQS)
+ if(frequency in CENT_FREQS)
return "centradio"
// command channel
- else if(frequency == COMM_FREQ)
+ if(frequency == COMM_FREQ)
return "comradio"
// AI private channel
- else if(frequency == AI_FREQ)
+ if(frequency == AI_FREQ)
return "airadio"
// department radio formatting (poorly optimized, ugh)
- else if(frequency == SEC_FREQ)
+ if(frequency == SEC_FREQ)
return "secradio"
- else if (frequency == ENG_FREQ)
+ if (frequency == ENG_FREQ)
return "engradio"
- else if(frequency == SCI_FREQ)
+ if(frequency == SCI_FREQ)
return "sciradio"
- else if(frequency == MED_FREQ)
+ if(frequency == MED_FREQ)
return "medradio"
- else if(frequency == SUP_FREQ) // cargo
+ if(frequency == SUP_FREQ) // cargo
return "supradio"
- else if(frequency == SRV_FREQ) // service
+ if(frequency == SRV_FREQ) // service
return "srvradio"
- // If all else fails and it's a dept_freq, color me purple!
- else if(frequency in DEPT_FREQS)
+ if(frequency in DEPT_FREQS)
return "deptradio"
return "radio"
diff --git a/code/game/antagonist/station/traitor.dm b/code/game/antagonist/station/traitor.dm
index a4f14dccf8e..d0dd2500589 100644
--- a/code/game/antagonist/station/traitor.dm
+++ b/code/game/antagonist/station/traitor.dm
@@ -139,9 +139,9 @@ 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 <= 1489)
+ while (freq <= PUBLIC_HIGH_FREQ)
if (freq < 1451 || freq > PUB_FREQ)
freqlist += freq
freq += 2
diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm
index 8ace5314300..55f603f3620 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/jobs/access_datum.dm b/code/game/jobs/access_datum.dm
index 5e1cb90f1f2..7292f23d4b5 100644
--- a/code/game/jobs/access_datum.dm
+++ b/code/game/jobs/access_datum.dm
@@ -447,6 +447,12 @@
/*******
* Misc *
*******/
+/var/const/access_synth = 199
+/datum/access/synthetic
+ id = access_synth
+ desc = "Synthetic"
+ access_type = ACCESS_TYPE_NONE
+
/var/const/access_crate_cash = 200
/datum/access/crate_cash
id = access_crate_cash
diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm
index fdacef6f710..6a61a082b98 100644
--- a/code/game/machinery/telecomms/broadcaster.dm
+++ b/code/game/machinery/telecomms/broadcaster.dm
@@ -357,7 +357,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
@@ -526,7 +526,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
if (length(heard_normal) || length(heard_garbled) || length(heard_gibberish))
/* --- Some miscellaneous variables to format the string output --- */
- var/part_a = "" // goes in the actual output
+ var/part_a = "" // goes in the actual output
var/freq_text = get_frequency_name(display_freq)
// --- Some more pre-message formatting ---
@@ -539,23 +539,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 = ""
- part_a = ""
-
- // --- 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/machinery/telecomms/presets.dm b/code/game/machinery/telecomms/presets.dm
index dcb555b7552..ca35f592360 100644
--- a/code/game/machinery/telecomms/presets.dm
+++ b/code/game/machinery/telecomms/presets.dm
@@ -60,7 +60,7 @@
//Common and other radio frequencies for people to freely use
New()
- for(var/i = 1441, i < 1489, i += 2)
+ for(var/i = PUBLIC_LOW_FREQ, i < PUBLIC_HIGH_FREQ, i += 2)
freq_listening |= i
..()
@@ -87,7 +87,7 @@
autolinkers = list("processor2", "supply", "service", "unused")
/obj/machinery/telecomms/bus/preset_two/New()
- for(var/i = 1441, i < 1489, i += 2)
+ for(var/i = PUBLIC_LOW_FREQ, i < PUBLIC_HIGH_FREQ, i += 2)
if(i == PUB_FREQ)
continue
freq_listening |= i
@@ -178,7 +178,7 @@
autolinkers = list("unused")
/obj/machinery/telecomms/server/presets/unused/New()
- for(var/i = 1441, i < 1489, i += 2)
+ for(var/i = PUBLIC_LOW_FREQ, i < PUBLIC_HIGH_FREQ, i += 2)
if(i == AI_FREQ || i == PUB_FREQ)
continue
freq_listening |= i
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 573ede3fb0f..270227a2fc5 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -1455,7 +1455,7 @@
if(href_list["rfreq"])
if(usr != src.occupant) return
var/new_frequency = (radio.frequency + filter.getNum("rfreq"))
- if (!radio.freerange || (radio.frequency < 1200 || radio.frequency > 1600))
+ if ((radio.frequency < PUBLIC_LOW_FREQ || radio.frequency > PUBLIC_HIGH_FREQ))
new_frequency = sanitize_frequency(new_frequency)
radio.set_frequency(new_frequency)
send_byjax(src.occupant,"exosuit.browser","rfreq","[format_frequency(radio.frequency)]")
diff --git a/code/game/objects/items/devices/PDA/radio.dm b/code/game/objects/items/devices/PDA/radio.dm
index 94fb81fc77c..7ad2b002009 100644
--- a/code/game/objects/items/devices/PDA/radio.dm
+++ b/code/game/objects/items/devices/PDA/radio.dm
@@ -221,7 +221,7 @@
if(!radio_controller)
return
- if (src.frequency < 1441 || src.frequency > 1489)
+ if (src.frequency < PUBLIC_LOW_FREQ || src.frequency > PUBLIC_HIGH_FREQ)
src.frequency = sanitize_frequency(src.frequency)
set_frequency(frequency)
diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm
index 43a4c5bf568..bcf932009de 100644
--- a/code/game/objects/items/devices/radio/headset.dm
+++ b/code/game/objects/items/devices/radio/headset.dm
@@ -13,13 +13,13 @@
var/translate_hive = 0
var/obj/item/device/encryptionkey/keyslot1 = null
var/obj/item/device/encryptionkey/keyslot2 = null
- maxf = 1489
var/ks1type = /obj/item/device/encryptionkey
var/ks2type = null
/obj/item/device/radio/headset/New()
..()
+ internal_channels.Cut()
if(ks1type)
keyslot1 = new ks1type(src)
if(ks2type)
@@ -33,11 +33,14 @@
keyslot2 = null
..()
+/obj/item/device/radio/headset/list_channels(var/mob/user)
+ return list_secure_channels()
+
/obj/item/device/radio/headset/examine(mob/user)
if(!(..(user, 1) && radio_desc))
return
- user << "The following channels are built-in:"
+ user << "The following channels are available:"
user << radio_desc
/obj/item/device/radio/headset/handle_message_mode(mob/living/M as mob, message, channel)
@@ -209,7 +212,6 @@
desc = "The headset of the boss's boss."
icon_state = "com_headset"
item_state = "headset"
- freerange = 1
ks2type = /obj/item/device/encryptionkey/ert
/obj/item/device/radio/headset/ia
diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm
index 1abccb5e77d..2a0341a77ef 100644
--- a/code/game/objects/items/devices/radio/intercom.dm
+++ b/code/game/objects/items/devices/radio/intercom.dm
@@ -1,5 +1,5 @@
/obj/item/device/radio/intercom
- name = "station intercom"
+ name = "station intercom (General)"
desc = "Talk through this."
icon_state = "intercom"
anchored = 1
@@ -7,14 +7,64 @@
canhear_range = 2
flags = CONDUCT | NOBLOODY
var/number = 0
- var/anyai = 1
- var/mob/living/silicon/ai/ai = list()
var/last_tick //used to delay the powercheck
+/obj/item/device/radio/intercom/custom
+ name = "station intercom (Custom)"
+ broadcasting = 0
+ listening = 0
+
+/obj/item/device/radio/intercom/interrogation
+ name = "station intercom (Interrogation)"
+ frequency = 1449
+
+/obj/item/device/radio/intercom/private
+ name = "station intercom (Private)"
+ frequency = AI_FREQ
+
+/obj/item/device/radio/intercom/specops
+ name = "\improper Spec Ops intercom"
+ frequency = ERT_FREQ
+
+/obj/item/device/radio/intercom/department
+ canhear_range = 5
+ broadcasting = 0
+ listening = 1
+
+/obj/item/device/radio/intercom/department/medbay
+ name = "station intercom (Medbay)"
+ frequency = MED_I_FREQ
+
+/obj/item/device/radio/intercom/department/security
+ name = "station intercom (Security)"
+ frequency = SEC_I_FREQ
+
/obj/item/device/radio/intercom/New()
..()
processing_objects += src
+/obj/item/device/radio/intercom/department/medbay/New()
+ ..()
+ internal_channels = default_medbay_channels.Copy()
+
+/obj/item/device/radio/intercom/department/security/New()
+ ..()
+ internal_channels = list(
+ num2text(PUB_FREQ) = list(),
+ num2text(SEC_I_FREQ) = list(access_security)
+ )
+
+/obj/item/device/radio/intercom/syndicate
+ name = "illicit intercom"
+ desc = "Talk through this. Evilly"
+ frequency = SYND_FREQ
+ subspace_transmission = 1
+ syndie = 1
+
+/obj/item/device/radio/intercom/syndicate/New()
+ ..()
+ internal_channels[num2text(SYND_FREQ)] = list(access_syndicate)
+
/obj/item/device/radio/intercom/Destroy()
processing_objects -= src
..()
@@ -44,12 +94,6 @@
return canhear_range
-
-/obj/item/device/radio/intercom/hear_talk(mob/M as mob, msg)
- if(!src.anyai && !(M in src.ai))
- return
- ..()
-
/obj/item/device/radio/intercom/process()
if(((world.timeofday - last_tick) > 30) || ((world.timeofday - last_tick) < 0))
last_tick = world.timeofday
@@ -57,8 +101,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
@@ -69,8 +113,19 @@
icon_state = "intercom"
/obj/item/device/radio/intercom/locked
- freerange = 1
var/locked_frequency
-
-/obj/item/device/radio/intercom/locked/set_frequency()
- ..(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 ""
+
+/obj/item/device/radio/intercom/locked/ai_private
+ name = "\improper AI intercom"
+ frequency = AI_FREQ
+
+/obj/item/device/radio/intercom/locked/confessional
+ name = "confessional intercom"
+ frequency = 1480
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index 0353c25f59a..1231f97541e 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -1,9 +1,32 @@
+// 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_internal_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(MED_I_FREQ)=list(access_medical_equip),
+ num2text(SEC_FREQ) = list(access_security),
+ num2text(SEC_I_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)
+)
+
+var/global/list/default_medbay_channels = list(
+ num2text(PUB_FREQ) = list(),
+ num2text(MED_FREQ) = list(access_medical_equip),
+ num2text(MED_I_FREQ) = list(access_medical_equip)
+)
+
/obj/item/device/radio
icon = 'icons/obj/radio.dmi'
name = "station bounced radio"
suffix = "\[3\]"
icon_state = "walkietalkie"
item_state = "walkietalkie"
+
var/on = 1 // 0 for off
var/last_transmission
var/frequency = PUB_FREQ //common chat
@@ -14,12 +37,9 @@
var/b_stat = 0
var/broadcasting = 0
var/listening = 1
- var/freerange = 0 // 0 - Sanitize frequencies, 1 - Full range
- var/list/channels = list() //see communications.dm for full list. First channes is a "default" for :h
+ var/list/channels = list() //see communications.dm for full list. First channel is a "default" for :h
var/subspace_transmission = 0
- var/syndie = 0//Holder to see if it's a syndicate encrpyed radio
- var/maxf = 1499
-// "Example" = FREQ_LISTENING|FREQ_BROADCASTING
+ var/syndie = 0//Holder to see if it's a syndicate encrypted radio
flags = CONDUCT
slot_flags = SLOT_BELT
throw_speed = 2
@@ -28,7 +48,7 @@
matter = list("glass" = 25,DEFAULT_WALL_MATERIAL = 75)
var/const/FREQ_LISTENING = 1
-
+ var/list/internal_channels
/obj/item/device/radio
var/datum/radio_frequency/radio_connection
@@ -42,6 +62,7 @@
/obj/item/device/radio/New()
..()
wires = new(src)
+ internal_channels = default_internal_channels.Copy()
/obj/item/device/radio/Destroy()
qdel(wires)
@@ -55,14 +76,8 @@
/obj/item/device/radio/initialize()
- if(freerange)
- if(frequency < 1200 || frequency > 1600)
- frequency = sanitize_frequency(frequency, maxf)
- // The max freq is higher than a regular headset to decrease the chance of people listening in, if you use the higher channels.
- else if (frequency < 1441 || frequency > maxf)
- //world.log << "[src] ([type]) has a frequency of [frequency], sanitizing."
- frequency = sanitize_frequency(frequency, maxf)
-
+ if(frequency < RADIO_LOW_FREQ || frequency > RADIO_HIGH_FREQ)
+ frequency = sanitize_frequency(frequency, RADIO_LOW_FREQ, RADIO_HIGH_FREQ)
set_frequency(frequency)
for (var/ch_name in channels)
@@ -95,13 +110,42 @@
+
"}
- for (var/ch_name in channels)
- dat+=text_sec_channel(ch_name, channels[ch_name])
+ dat+=list_channels(user)
+
dat+={"[text_wires()]