Telecomms Update: Ability to change existing radio channels and create new ones (#91647)

## About The Pull Request
I have added the ability to create and edit station radio channels
through the existing telecommunications system.
You can change the name of the radio channel and its color.

The channel settings are changed and created through the servers
(Frequencies Settings)

![ui](https://github.com/user-attachments/assets/cb010d75-bb00-4e3c-86b6-351b39b832e3)

Here i created my own channel:
1) Add frequency at Receiver (you will not see channel name):

![TestChannelInReceiver](https://github.com/user-attachments/assets/d3934e96-fb2d-492a-a1d6-84e8bfbd6628)
2) Add frequency at Bus (you will not see channel name):

![TestChannelnBus](https://github.com/user-attachments/assets/9955fb9c-9ca0-44f5-8d8f-caf02c0b3a9c)
3) Add frequency at Server
4) Add settings for your frequency

![NewChannel](https://github.com/user-attachments/assets/14a86eae-a000-4106-848b-a140ab678c3c)
5) See the result:

![TestChannel](https://github.com/user-attachments/assets/a720c660-43f6-47c0-8e85-fd313e8ce8d7)

Important Notes:
1) Headsets, radios, and intercoms will not see a change in
telecommunications, but will use standard names (Common, Security etc.).
2) There are still reserved names that cannot be used: CentComm,
Syndicate, Uplink, CTFs channels
3) Servers must filter frequency for applying settings on them

## Why It's Good For The Game

Now telecommunication channels names and colors depends on the settings
of the network servers, which makes it more flexible and logical. It is
also useful for foreign language servers, as you can translate channel
names.

## Changelog

🆑
add: Added ability to change existing radio channels and create new
qol: Added color for some buttons in Telecomms UI
/🆑

(cherry picked from commit 35494b93bb)
This commit is contained in:
FeudeyTF
2025-06-27 18:19:18 +03:00
committed by Roxy
parent 5011459f21
commit 161d744035
41 changed files with 360 additions and 194 deletions

View File

@@ -70,9 +70,11 @@
#define HEARING_LANGUAGE 3
#define HEARING_RAW_MESSAGE 4
#define HEARING_RADIO_FREQ 5
#define HEARING_SPANS 6
#define HEARING_MESSAGE_MODE 7
#define HEARING_RANGE 8
#define HEARING_RADIO_FREQ_NAME 6
#define HEARING_RADIO_FREQ_COLOR 7
#define HEARING_SPANS 8
#define HEARING_MESSAGE_MODE 9
#define HEARING_RANGE 10
///called when the movable is added to a disposal holder object for disposal movement: (obj/structure/disposalholder/holder, obj/machinery/disposal/source)
#define COMSIG_MOVABLE_DISPOSING "movable_disposing"

View File

@@ -4,61 +4,78 @@
#define RADIO_CHANNEL_COMMON "Common"
#define RADIO_KEY_COMMON ";"
#define RADIO_COLOR_COMMON "#1ecc43"
#define RADIO_CHANNEL_SECURITY "Security"
#define RADIO_KEY_SECURITY "s"
#define RADIO_TOKEN_SECURITY ":s"
#define RADIO_COLOR_SECURITY "#dd3535"
#define RADIO_CHANNEL_ENGINEERING "Engineering"
#define RADIO_KEY_ENGINEERING "e"
#define RADIO_TOKEN_ENGINEERING ":e"
#define RADIO_COLOR_ENGINEERING "#f37746"
#define RADIO_CHANNEL_COMMAND "Command"
#define RADIO_KEY_COMMAND "c"
#define RADIO_TOKEN_COMMAND ":c"
#define RADIO_COLOR_COMMAND "#fcdf03"
#define RADIO_CHANNEL_SCIENCE "Science"
#define RADIO_KEY_SCIENCE "n"
#define RADIO_TOKEN_SCIENCE ":n"
#define RADIO_COLOR_SCIENCE "#c68cfa"
#define RADIO_CHANNEL_MEDICAL "Medical"
#define RADIO_KEY_MEDICAL "m"
#define RADIO_TOKEN_MEDICAL ":m"
#define RADIO_COLOR_MEDICAL "#57b8f0"
#define RADIO_CHANNEL_SUPPLY "Supply"
#define RADIO_KEY_SUPPLY "u"
#define RADIO_TOKEN_SUPPLY ":u"
#define RADIO_COLOR_SUPPLY "#b88646"
#define RADIO_CHANNEL_SERVICE "Service"
#define RADIO_KEY_SERVICE "v"
#define RADIO_TOKEN_SERVICE ":v"
#define RADIO_COLOR_SERVICE "#6ca729"
#define RADIO_CHANNEL_AI_PRIVATE "AI Private"
#define RADIO_KEY_AI_PRIVATE "o"
#define RADIO_TOKEN_AI_PRIVATE ":o"
#define RADIO_COLOR_AI_PRIVATE "#d65d95"
#define RADIO_CHANNEL_ENTERTAINMENT "Entertainment"
#define RADIO_KEY_ENTERTAINMENT "p"
#define RADIO_TOKEN_ENTERTAINMENT ":p"
#define RADIO_COLOR_ENTERTAIMENT "#79c5a8"
#define STATUS_DISPLAY_RELAY "Captain-Cast"
#define RADIO_CHANNEL_SYNDICATE "Syndicate"
#define RADIO_KEY_SYNDICATE "t"
#define RADIO_TOKEN_SYNDICATE ":t"
#define RADIO_COLOR_SYNDICATE "#8f4a4b"
#define RADIO_CHANNEL_CENTCOM "CentCom"
#define RADIO_KEY_CENTCOM "y"
#define RADIO_TOKEN_CENTCOM ":y"
#define RADIO_COLOR_CENTCOM "#2681a5"
#define RADIO_CHANNEL_UPLINK "Uplink"
#define RADIO_KEY_UPLINK "z"
#define RADIO_TOKEN_UPLINK ":z"
#define RADIO_COLOR_UPLINK "#8f4a4b"
#define RADIO_CHANNEL_CTF_RED "Red Team"
#define RADIO_COLOR_CTF_RED "#ff0000"
#define RADIO_CHANNEL_CTF_BLUE "Blue Team"
#define RADIO_COLOR_CTF_BLUE "#0000ff"
#define RADIO_CHANNEL_CTF_GREEN "Green Team"
#define RADIO_COLOR_GREEN "#00ff00"
#define RADIO_CHANNEL_CTF_YELLOW "Yellow Team"
#define RADIO_COLOR_YELLOW "#d1ba22"
#define MIN_FREE_FREQ 1201 // -------------------------------------------------

View File

@@ -30,6 +30,6 @@
freq_to_check = rand(start, end)
if(!(freq_to_check % 2)) // Ensure the last digit is an odd number
freq_to_check++
while((freq_to_check == 0) || ("[freq_to_check]" in GLOB.reverseradiochannels))
while((freq_to_check == 0) || ("[freq_to_check]" in GLOB.reserved_radio_frequencies))
return freq_to_check

View File

@@ -216,10 +216,10 @@
owner.imaginary_group -= src
return ..()
/mob/eye/imaginary_friend/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), message_range)
/mob/eye/imaginary_friend/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, freq_name, freq_color, list/spans, list/message_mods = list(), message_range)
if (safe_read_pref(client, /datum/preference/toggle/enable_runechat) && (safe_read_pref(client, /datum/preference/toggle/enable_runechat_non_mobs) || ismob(speaker)))
create_chat_message(speaker, message_language, raw_message, spans)
to_chat(src, compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mods))
to_chat(src, compose_message(speaker, message_language, raw_message, radio_freq, freq_name, freq_color, spans, message_mods))
/mob/eye/imaginary_friend/send_speech(message, range = IMAGINARY_FRIEND_SPEECH_RANGE, obj/source = src, bubble_type = bubble_icon, list/spans = list(), datum/language/message_language = null, list/message_mods = list(), forced = null)
message = get_message_mods(message, message_mods)
@@ -263,10 +263,10 @@
var/dead_rendered = "[span_name("[name] (Imaginary friend of [owner])")] [quoted_message]"
var/language = message_language || owner.get_selected_language()
Hear(rendered, src, language, message, null, spans, message_mods) // We always hear what we say
Hear(rendered, src, language, message, null, null, null, spans, message_mods) // We always hear what we say
var/group = owner.imaginary_group - src // The people in our group don't, so we have to exclude ourselves not to hear twice
for(var/mob/person in group)
person.Hear(null, src, language, message, null, spans, message_mods, range)
person.Hear(null, src, language, message, null, null, null, spans, message_mods, range)
// Speech bubble, but only for those who have runechat off
var/list/speech_bubble_recipients = list()

View File

@@ -91,7 +91,7 @@ GLOBAL_LIST_EMPTY(all_radios)
// see __DEFINES/radio.dm. Mappers may also select additional frequencies for
// use in maps, such as in intercoms.
GLOBAL_LIST_INIT(radiochannels, list(
GLOBAL_LIST_INIT(default_radio_channels, list(
RADIO_CHANNEL_COMMON = FREQ_COMMON,
RADIO_CHANNEL_SCIENCE = FREQ_SCIENCE,
RADIO_CHANNEL_COMMAND = FREQ_COMMAND,
@@ -118,13 +118,7 @@ GLOBAL_LIST_INIT(radiochannels, list(
STATUS_DISPLAY_RELAY = FREQ_STATUS_DISPLAYS,
))
GLOBAL_LIST_INIT(reverseradiochannels, list(
"[FREQ_COMMON]" = RADIO_CHANNEL_COMMON,
"[FREQ_SCIENCE]" = RADIO_CHANNEL_SCIENCE,
"[FREQ_COMMAND]" = RADIO_CHANNEL_COMMAND,
"[FREQ_MEDICAL]" = RADIO_CHANNEL_MEDICAL,
"[FREQ_ENGINEERING]" = RADIO_CHANNEL_ENGINEERING,
"[FREQ_SECURITY]" = RADIO_CHANNEL_SECURITY,
GLOBAL_LIST_INIT(reserved_radio_frequencies, list(
"[FREQ_CENTCOM]" = RADIO_CHANNEL_CENTCOM,
"[FREQ_FACTION]" = RADIO_CHANNEL_FACTION, //SKYRAT EDIT ADDITION - FACTION
"[FREQ_CYBERSUN]" = RADIO_CHANNEL_CYBERSUN, //SKYRAT EDIT ADDITION - MAPPING
@@ -133,10 +127,6 @@ GLOBAL_LIST_INIT(reverseradiochannels, list(
"[FREQ_TERRAGOV]" = RADIO_CHANNEL_TERRAGOV, //BUBBER EDIT ADDITION - TERRAGOV
"[FREQ_SYNDICATE]" = RADIO_CHANNEL_SYNDICATE,
"[FREQ_UPLINK]" = RADIO_CHANNEL_UPLINK,
"[FREQ_SUPPLY]" = RADIO_CHANNEL_SUPPLY,
"[FREQ_SERVICE]" = RADIO_CHANNEL_SERVICE,
"[FREQ_AI_PRIVATE]" = RADIO_CHANNEL_AI_PRIVATE,
"[FREQ_ENTERTAINMENT]" = RADIO_CHANNEL_ENTERTAINMENT,
"[FREQ_CTF_RED]" = RADIO_CHANNEL_CTF_RED,
"[FREQ_CTF_BLUE]" = RADIO_CHANNEL_CTF_BLUE,
"[FREQ_CTF_GREEN]" = RADIO_CHANNEL_CTF_GREEN,
@@ -144,19 +134,10 @@ GLOBAL_LIST_INIT(reverseradiochannels, list(
"[FREQ_STATUS_DISPLAYS]" = STATUS_DISPLAY_RELAY,
))
GLOBAL_LIST_INIT(radiocolors, list(
RADIO_CHANNEL_COMMON = "#008000",
RADIO_CHANNEL_SCIENCE = "#993399",
RADIO_CHANNEL_COMMAND = "#948f02",
RADIO_CHANNEL_MEDICAL = "#337296",
RADIO_CHANNEL_ENGINEERING = "#fb5613",
RADIO_CHANNEL_SECURITY = "#a30000",
GLOBAL_LIST_INIT(reserved_radio_colors, list(
RADIO_CHANNEL_CENTCOM = "#686868",
RADIO_CHANNEL_SYNDICATE = "#6d3f40",
RADIO_CHANNEL_SUPPLY = "#a8732b",
RADIO_CHANNEL_SERVICE = "#6eaa2c",
RADIO_CHANNEL_AI_PRIVATE = "#ff00ff",
RADIO_CHANNEL_ENTERTAINMENT = "#00ff99",
RADIO_CHANNEL_UPLINK = "#6d3f40",
RADIO_CHANNEL_CTF_RED = "#ff0000",
RADIO_CHANNEL_CTF_BLUE = "#0000ff",
RADIO_CHANNEL_CTF_GREEN = "#00ff00",

View File

@@ -44,7 +44,7 @@
/obj/machinery/door/password/get_save_vars()
return ..() + NAMEOF(src, password)
/obj/machinery/door/password/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), message_range)
/obj/machinery/door/password/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range)
. = ..()
if(!density || !voice_activated || radio_freq)
return

View File

@@ -577,7 +577,7 @@ Possible to do for anyone motivated enough:
/*This is the proc for special two-way communication between AI and holopad/people talking near holopad.
For the other part of the code, check silicon say.dm. Particularly robot talk.*/
/obj/machinery/holopad/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), message_range)
/obj/machinery/holopad/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range)
. = ..()
if(speaker && LAZYLEN(masters) && !radio_freq)//Master is mostly a safety in case lag hits or something. Radio_freq so AIs dont hear holopad stuff through radios.
for(var/mob/living/silicon/ai/master in masters)
@@ -589,7 +589,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
if(speaker == holocall_to_update.hologram && holocall_to_update.user.client?.prefs.read_preference(/datum/preference/toggle/enable_runechat))
holocall_to_update.user.create_chat_message(speaker, message_language, raw_message, spans)
else
holocall_to_update.user.Hear(message, speaker, message_language, raw_message, radio_freq, spans, message_mods, message_range = INFINITY)
holocall_to_update.user.Hear(message, speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, spans, message_mods, message_range = INFINITY)
if(outgoing_call?.hologram && speaker == outgoing_call.user)
outgoing_call.hologram.say(raw_message, sanitize = FALSE)

View File

@@ -141,10 +141,11 @@
radios -= subspace_radio
// Syndicate radios can hear all well-known radio channels
if (num2text(frequency) in GLOB.reverseradiochannels)
for(var/obj/item/radio/syndicate_radios in GLOB.all_radios["[FREQ_SYNDICATE]"])
if(syndicate_radios.can_receive(FREQ_SYNDICATE, RADIO_NO_Z_LEVEL_RESTRICTION))
radios |= syndicate_radios
for(var/channel in GLOB.default_radio_channels)
if (GLOB.default_radio_channels[channel] == frequency)
for(var/obj/item/radio/syndicate_radios in GLOB.all_radios["[FREQ_SYNDICATE]"])
if(syndicate_radios.can_receive(FREQ_SYNDICATE, RADIO_NO_Z_LEVEL_RESTRICTION))
radios |= syndicate_radios
if (TRANSMISSION_RADIO)
// Only radios not currently in subspace mode
@@ -173,14 +174,14 @@
// Always call this on the virtualspeaker to avoid issues.
var/spans = data["spans"]
var/list/message_mods = data["mods"]
var/rendered = virt.compose_message(virt, language, message, frequency, spans)
var/rendered = virt.compose_message(virt, language, message, frequency, data["frequency_name"], data["frequency_color"], spans)
for(var/atom/movable/hearer as anything in receive)
if(!hearer)
stack_trace("null found in the hearers list returned by the spatial grid. this is bad")
continue
spans -= blacklisted_spans
hearer.Hear(rendered, virt, language, message, frequency, spans, message_mods, message_range = INFINITY)
hearer.Hear(rendered, virt, language, message, frequency, data["frequency_name"], data["frequency_color"], spans, message_mods, message_range = INFINITY)
// This following recording is intended for research and feedback in the use of department radio channels
if(length(receive))

View File

@@ -45,6 +45,7 @@
data += add_option()
data["channels"] = get_channels()
data["minfreq"] = MIN_FREE_FREQ
data["maxfreq"] = MAX_FREE_FREQ
data["frequency"] = tempfreq
@@ -79,7 +80,6 @@
for(var/x in freq_listening)
frequencies += list(x)
data["frequencies"] = frequencies
return data
/obj/machinery/telecomms/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
@@ -194,6 +194,52 @@
return TRUE
/**
*
* Returns information (name and color) about all channels in machine's network
*/
/obj/machinery/telecomms/proc/get_channels()
var/list/channels = list()
for(var/channel_freq in GLOB.reserved_radio_frequencies)
var/channel_name = GLOB.reserved_radio_frequencies[channel_freq]
channels += list(list(
"freq" = text2num(channel_freq),
"name" = channel_name,
"color" = GLOB.reserved_radio_colors[channel_name]
))
var/obj/machinery/telecomms/hub/hub
if(istype(src, /obj/machinery/telecomms/hub))
hub = src
else
for(var/obj/machinery/telecomms/link in links)
if(istype(link, /obj/machinery/telecomms/hub))
hub = link
break
if(hub)
for(var/obj/machinery/telecomms/link in hub.links)
if(istype(link, /obj/machinery/telecomms/server))
var/obj/machinery/telecomms/server/server = link
for(var/freq_info_freq in server.frequency_infos)
var/list/freq_info = server.frequency_infos[freq_info_freq]
channels += list(list(
"freq" = text2num(freq_info_freq),
"name" = freq_info["name"],
"color" = freq_info["color"]
))
else if(istype(src, /obj/machinery/telecomms/server))
var/obj/machinery/telecomms/server/server = src
for(var/freq_info_freq in server.frequency_infos)
var/list/freq_info = server.frequency_infos[freq_info_freq]
channels += list(list(
"freq" = text2num(freq_info_freq),
"name" = freq_info["name"],
"color" = freq_info["color"]
))
return channels
/**
* Wrapper for adding additional options to a machine's interface.
*
@@ -215,6 +261,21 @@
data["receiving"] = receiving
return data
/obj/machinery/telecomms/server/add_option()
var/list/data = list()
data["type"] = "server"
var/list/infos = list()
for(var/freq_info_freq in frequency_infos)
var/list/freq_info = frequency_infos[freq_info_freq]
infos += list(list(
"frequency" = freq_info_freq,
"name" = freq_info["name"],
"color" = freq_info["color"]
))
data["frequencyinfos"] = infos
return data
/**
* Wrapper for adding another time of action for `ui_act()`, rather than
* having you override `ui_act` yourself.
@@ -244,6 +305,52 @@
else
change_frequency = 0
/obj/machinery/telecomms/server/add_act(action, params)
switch(action)
if("delete")
frequency_infos.Remove(num2text(params["value"]))
. = TRUE
if("modify_freq_info")
var/freq = params["freq"]
var/info = frequency_infos[freq]
if(info)
var/new_name = tgui_input_text(usr, "Please enter new frequency name", "Modifying Frequency Information", info["name"], MAX_NAME_LEN)
if(new_name)
for(var/list/channel in get_channels())
if(num2text(channel["freq"]) != freq && channel["name"] == new_name)
return
info["name"] = new_name
var/new_color = input(usr, "Choose color for frequency", "Modifying Frequency Information", info["color"]) as color|null
if(new_color)
info["color"] = new_color
frequency_infos[params["freq"]] = info
. = TRUE
if("add_freq_info")
var/freq = tgui_input_number(usr, "Please enter frequency", "Adding Frequency Information", 145.9, 160, 120, round_value = FALSE)
if(!freq)
return
freq = round(freq*10)
if(!(freq in freq_listening))
return
var/name = tgui_input_text(usr, "Please enter frequency name", "Adding Frequency Information", max_length = MAX_NAME_LEN)
if(!name)
return
for(var/list/channel in get_channels())
if(channel["freq"] == freq || channel["name"] == name)
return
var/color = input(usr, "Choose color for frequency", "Adding Frequency Information") as color|null
if(!color)
return
frequency_infos[num2text(freq)] = list(
"name" = name,
"color" = color
)
. = TRUE
if("delete_freq_info")
frequency_infos.Remove(params["freq"])
. = TRUE
/// Returns a multitool from a user depending on their mobtype.
/obj/machinery/telecomms/proc/get_multitool(mob/user)
. = null

View File

@@ -14,6 +14,8 @@
density = TRUE
idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 0.01
circuit = /obj/item/circuitboard/machine/telecomms/server
/// List of frequency info: the name and color of each frequency that the server processes
var/list/frequency_infos = list()
/// A list of previous entries on the network. It will not exceed
/// `MAX_LOG_ENTRIES` entries in length, flushing the oldest entries
/// automatically.
@@ -30,6 +32,11 @@
if(traffic > 0)
total_traffic += traffic // add current traffic to total traffic
var/freq_info = frequency_infos["[signal.frequency]"]
if(freq_info)
signal.data["frequency_name"] = freq_info["name"]
signal.data["frequency_color"] = freq_info["color"]
// Delete particularly old logs
if (log_entries.len >= MAX_LOG_ENTRIES)
log_entries.Cut(1, 2)
@@ -89,26 +96,69 @@
freq_listening = list(FREQ_SCIENCE)
autolinkers = list("science")
/obj/machinery/telecomms/server/presets/science/New()
. = ..()
frequency_infos["[FREQ_SCIENCE]"] = list(
"name" = RADIO_CHANNEL_SCIENCE,
"color" = RADIO_COLOR_SCIENCE
)
/obj/machinery/telecomms/server/presets/medical
id = "Medical Server"
freq_listening = list(FREQ_MEDICAL)
autolinkers = list("medical")
/obj/machinery/telecomms/server/presets/medical/New()
. = ..()
frequency_infos["[FREQ_MEDICAL]"] = list(
"name" = RADIO_CHANNEL_MEDICAL,
"color" = RADIO_COLOR_MEDICAL
)
/obj/machinery/telecomms/server/presets/supply
id = "Supply Server"
freq_listening = list(FREQ_SUPPLY)
autolinkers = list("supply")
/obj/machinery/telecomms/server/presets/supply/New()
. = ..()
frequency_infos["[FREQ_SUPPLY]"] = list(
"name" = RADIO_CHANNEL_SUPPLY,
"color" = RADIO_COLOR_SUPPLY
)
/obj/machinery/telecomms/server/presets/service
id = "Service & Entertainment Server"
freq_listening = list(FREQ_SERVICE, FREQ_ENTERTAINMENT)
autolinkers = list("service", "entertainment")
/obj/machinery/telecomms/server/presets/service/New()
. = ..()
frequency_infos["[FREQ_SERVICE]"] = list(
"name" = RADIO_CHANNEL_SERVICE,
"color" = RADIO_COLOR_SERVICE
)
frequency_infos["[FREQ_ENTERTAINMENT]"] = list(
"name" = RADIO_CHANNEL_ENTERTAINMENT,
"color" = RADIO_COLOR_ENTERTAIMENT
)
/obj/machinery/telecomms/server/presets/common
id = "Common Server"
id = "Common & AI Server"
freq_listening = list()
autolinkers = list("common")
/obj/machinery/telecomms/server/presets/common/New()
. = ..()
frequency_infos["[FREQ_COMMON]"] = list(
"name" = RADIO_CHANNEL_COMMON,
"color" = RADIO_COLOR_COMMON
)
frequency_infos["[FREQ_AI_PRIVATE]"] = list(
"name" = RADIO_CHANNEL_AI_PRIVATE,
"color" = RADIO_COLOR_AI_PRIVATE
)
/obj/machinery/telecomms/server/presets/common/Initialize(mapload)
. = ..()
// Common and other radio frequencies for people to freely use
@@ -120,16 +170,37 @@
freq_listening = list(FREQ_COMMAND)
autolinkers = list("command")
/obj/machinery/telecomms/server/presets/command/New()
. = ..()
frequency_infos["[FREQ_COMMAND]"] = list(
"name" = RADIO_CHANNEL_COMMAND,
"color" = RADIO_COLOR_COMMAND
)
/obj/machinery/telecomms/server/presets/engineering
id = "Engineering Server"
freq_listening = list(FREQ_ENGINEERING)
autolinkers = list("engineering")
/obj/machinery/telecomms/server/presets/engineering/New()
. = ..()
frequency_infos["[FREQ_ENGINEERING]"] = list(
"name" = RADIO_CHANNEL_ENGINEERING,
"color" = RADIO_COLOR_ENGINEERING
)
/obj/machinery/telecomms/server/presets/security
id = "Security Server"
freq_listening = list(FREQ_SECURITY)
autolinkers = list("security")
/obj/machinery/telecomms/server/presets/security/New()
. = ..()
frequency_infos["[FREQ_SECURITY]"] = list(
"name" = RADIO_CHANNEL_SECURITY,
"color" = RADIO_COLOR_SECURITY
)
/obj/machinery/telecomms/server/presets/common/birdstation/Initialize(mapload)
. = ..()
freq_listening = list()

View File

@@ -68,7 +68,7 @@ GLOBAL_LIST_INIT(channel_tokens, list(
for(var/i in 1 to length(channels))
var/channel_name = channels[i]
var/channel_token = GLOB.channel_tokens[channel_name]
var/channel_span_class = get_radio_span(GLOB.radiochannels[channel_name])
var/channel_span_class = get_radio_span(GLOB.default_radio_channels[channel_name])
if(i == 1)
available_channels += "<li><b>[span_class(channel_span_class, MODE_TOKEN_DEPARTMENT)]</b> or <b>[span_class(channel_span_class, channel_token)]</b> for <b>[span_class(channel_span_class, channel_name)]</b></li>"
@@ -456,7 +456,7 @@ GLOBAL_LIST_INIT(channel_tokens, list(
/obj/item/radio/headset/screwdriver_act(mob/living/user, obj/item/tool)
if(keyslot || keyslot2)
for(var/ch_name in channels)
SSradio.remove_object(src, GLOB.radiochannels[ch_name])
SSradio.remove_object(src, GLOB.default_radio_channels[ch_name])
secure_radio_connections[ch_name] = null
if(keyslot)
@@ -505,7 +505,7 @@ GLOBAL_LIST_INIT(channel_tokens, list(
special_channels |= keyslot2.special_channels
for(var/ch_name in channels)
secure_radio_connections[ch_name] = add_radio(src, GLOB.radiochannels[ch_name])
secure_radio_connections[ch_name] = add_radio(src, GLOB.default_radio_channels[ch_name])
// Updates radio languages entirely for the mob wearing the headset
var/mob/mob_loc = loc

View File

@@ -123,7 +123,7 @@
return TRUE
/obj/item/radio/intercom/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans, list/message_mods = list(), message_range)
/obj/item/radio/intercom/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range)
if(message_mods[RADIO_EXTENSION] == MODE_INTERCOM)
return // Avoid hearing the same thing twice
return ..()

View File

@@ -102,7 +102,7 @@
if(ispath(keyslot))
keyslot = new keyslot()
for(var/ch_name in channels)
secure_radio_connections[ch_name] = add_radio(src, GLOB.radiochannels[ch_name])
secure_radio_connections[ch_name] = add_radio(src, GLOB.default_radio_channels[ch_name])
perform_update_icon = FALSE
set_listening(listening)
@@ -155,7 +155,7 @@
special_channels = keyslot.special_channels
for(var/channel_name in channels)
secure_radio_connections[channel_name] = add_radio(src, GLOB.radiochannels[channel_name])
secure_radio_connections[channel_name] = add_radio(src, GLOB.default_radio_channels[channel_name])
if(!listening)
remove_radio_all(src)
@@ -169,7 +169,7 @@
///goes through all radio channels we should be listening for and readds them to the global list
/obj/item/radio/proc/readd_listening_radio_channels()
for(var/channel_name in channels)
add_radio(src, GLOB.radiochannels[channel_name])
add_radio(src, GLOB.default_radio_channels[channel_name])
add_radio(src, frequency)
@@ -381,7 +381,7 @@
signal.levels = SSmapping.get_connected_levels(T)
signal.broadcast()
/obj/item/radio/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), message_range)
/obj/item/radio/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range)
. = ..()
if(radio_freq || !broadcasting || get_dist(src, speaker) > canhear_range || message_mods[MODE_RELAY])
return
@@ -428,7 +428,7 @@
return TRUE
for(var/ch_name in channels)
if(channels[ch_name] & FREQ_LISTENING)
if(GLOB.radiochannels[ch_name] == text2num(input_frequency) || special_channels & RADIO_SPECIAL_SYNDIE)
if(GLOB.default_radio_channels[ch_name] == text2num(input_frequency) || special_channels & RADIO_SPECIAL_SYNDIE)
return TRUE
return FALSE
@@ -641,7 +641,7 @@
return
for(var/ch_name in channels)
SSradio.remove_object(src, GLOB.radiochannels[ch_name])
SSradio.remove_object(src, GLOB.default_radio_channels[ch_name])
secure_radio_connections[ch_name] = null
if (!user.put_in_hands(keyslot))

View File

@@ -153,7 +153,7 @@
return ..()
/obj/item/taperecorder/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, list/message_mods = list(), message_range)
/obj/item/taperecorder/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, radio_freq_name, radio_freq_color, spans, list/message_mods = list(), message_range)
. = ..()
if(message_mods[MODE_RELAY] || !mytape || istype(speaker, /obj/item/taperecorder))
return

View File

@@ -72,7 +72,7 @@ GLOBAL_LIST_INIT(freqtospan, list(
/// Called when this movable hears a message from a source.
/// Returns TRUE if the message was received and understood.
/atom/movable/proc/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), message_range=0)
/atom/movable/proc/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range=0)
SEND_SIGNAL(src, COMSIG_MOVABLE_HEAR, args)
return TRUE
@@ -123,7 +123,7 @@ GLOBAL_LIST_INIT(freqtospan, list(
if(!hearing_movable)//theoretically this should use as anything because it shouldnt be able to get nulls but there are reports that it does.
stack_trace("somehow theres a null returned from get_hearers_in_view() in send_speech!")
continue
if(hearing_movable.Hear(null, src, message_language, message, null, spans, message_mods, range))
if(hearing_movable.Hear(null, src, message_language, message, null, null, null, spans, message_mods, range))
listened += hearing_movable
if(!found_client && length(hearing_movable.client_mobs_in_contents))
found_client = TRUE
@@ -143,14 +143,15 @@ GLOBAL_LIST_INIT(freqtospan, list(
if (!CONFIG_GET(flag/tts_no_whisper) || (CONFIG_GET(flag/tts_no_whisper) && !message_mods[WHISPER_MODE]))
INVOKE_ASYNC(SStts, TYPE_PROC_REF(/datum/controller/subsystem/tts, queue_tts_message), src, html_decode(tts_message_to_use), message_language, voice, filter.Join(","), listened, message_range = range, pitch = pitch)
/atom/movable/proc/compose_message(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), visible_name = FALSE)
/atom/movable/proc/compose_message(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), visible_name = FALSE)
//This proc uses [] because it is faster than continually appending strings. Thanks BYOND.
//Basic span
var/spanpart1 = "<span class='[radio_freq ? get_radio_span(radio_freq) : "game say"]'>"
var/freq_color = get_radio_color(radio_freq, radio_freq_color)
var/spanpart1 = "<span class='[radio_freq ? get_radio_span(radio_freq) : "game say"]' [freq_color ? "style='color:[freq_color];'" : ""]>"
//Start name span.
var/spanpart2 = "<span class='name'>"
//Radio freq/name display
var/freqpart = radio_freq ? "\[[get_radio_name(radio_freq)]\] " : ""
var/freqpart = radio_freq ? "\[[get_radio_name(radio_freq, radio_freq_name)]\] " : ""
//Speaker name
var/namepart
var/list/stored_name = list(null)
@@ -291,12 +292,24 @@ GLOBAL_LIST_INIT(freqtospan, list(
return returntext
return "radio"
/proc/get_radio_name(freq)
var/returntext = GLOB.reverseradiochannels["[freq]"]
if(returntext)
return returntext
/proc/get_radio_name(freq, freq_name)
if(freq_name)
return freq_name
var/name = GLOB.reserved_radio_frequencies["[freq]"]
if(name)
return name
return "[copytext_char("[freq]", 1, 4)].[copytext_char("[freq]", 4, 5)]"
/proc/get_radio_color(freq, freq_color)
if(freq)
if(freq_color)
return freq_color
var/color = GLOB.reserved_radio_colors[get_radio_name(freq, null)]
if(color)
return color
return RADIO_COLOR_COMMON
return ""
/proc/attach_spans(input, list/spans)
return "[message_spans_start(spans)][input]</span>"

View File

@@ -47,7 +47,7 @@ ADMIN_VERB(borg_panel, R_ADMIN, "Show Borg Panel", ADMIN_VERB_NO_DESCRIPTION, AD
.["upgrades"] += list(list("name" = initial(upgrade.name), "installed" = installed, "type" = upgradetype))
.["laws"] = borg.laws ? borg.laws.get_law_list(include_zeroth = TRUE, render_html = FALSE) : list()
.["channels"] = list()
for (var/k in GLOB.radiochannels)
for (var/k in GLOB.default_radio_channels)
if (k == RADIO_CHANNEL_COMMON)
continue
.["channels"] += list(list("name" = k, "installed" = (k in borg.radio.channels)))

View File

@@ -33,7 +33,7 @@
. = ..()
. += span_notice("Use a multitool to swap between \"inclusive\", \"exclusive\", \"recognizer\", and \"voice sensor\" mode.")
/obj/item/assembly/voice/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), message_range)
/obj/item/assembly/voice/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range)
. = ..()
if(message_mods[WHISPER_MODE] || message_mods[MODE_RELAY]) //Too quiet lad
return FALSE

View File

@@ -292,7 +292,7 @@
var/obj/item/found_item = items_by_regex[found_regex]
. += span_notice("[icon2html(found_item, user)] You can remove [found_item] by saying <b>\"[prefix] [found_phrase]\"</b>!")
/obj/item/clothing/head/fedora/inspector_hat/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), message_range)
/obj/item/clothing/head/fedora/inspector_hat/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range)
. = ..()
var/mob/living/carbon/wearer = loc
if(!istype(wearer) || speaker != wearer) //if we are worn

View File

@@ -119,7 +119,7 @@
hallucinator.create_chat_message(speaker, understood_language, chosen, spans)
// And actually show them the message, for real.
var/message = hallucinator.compose_message(speaker, understood_language, chosen, is_radio ? "[FREQ_COMMON]" : null, spans, visible_name = TRUE)
var/message = hallucinator.compose_message(speaker, understood_language, chosen, is_radio ? "[FREQ_COMMON]" : null, is_radio ? RADIO_CHANNEL_COMMON : null, is_radio ? RADIO_COLOR_COMMON : null, spans, visible_name = TRUE)
to_chat(hallucinator, message)
// Then clean up.

View File

@@ -52,7 +52,7 @@
else
hallucinator.create_chat_message(mother, understood_language, text, spans)
var/message = hallucinator.compose_message(mother, understood_language, text, null, spans, visible_name = TRUE)
var/message = hallucinator.compose_message(mother, understood_language, text, null, null, null, spans, visible_name = TRUE)
to_chat(hallucinator, message)
/datum/hallucination/your_mother/proc/exit()

View File

@@ -112,7 +112,7 @@
. += observer_desc
. += "It is activated by [activation_method]."
/obj/machinery/anomalous_crystal/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, list/message_mods = list(), message_range)
/obj/machinery/anomalous_crystal/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, radio_freq_name, radio_freq_color, spans, list/message_mods = list(), message_range)
. = ..()
if(isliving(speaker))
ActivationReaction(speaker, ACTIVATE_SPEECH)

View File

@@ -151,7 +151,7 @@
implant.radio.command = TRUE
implant.radio.channels = AI.radio.channels
for(var/channel in implant.radio.channels)
implant.radio.secure_radio_connections[channel] = add_radio(implant.radio, GLOB.radiochannels[channel])
implant.radio.secure_radio_connections[channel] = add_radio(implant.radio, GLOB.default_radio_channels[channel])
/obj/item/organ/brain/cybernetic/ai/proc/undeploy(datum/source)
SIGNAL_HANDLER

View File

@@ -58,7 +58,7 @@
. = say_dead(message)
/mob/dead/observer/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), message_range)
/mob/dead/observer/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range)
. = ..()
var/atom/movable/to_follow = speaker
if(radio_freq)
@@ -74,7 +74,7 @@
if (safe_read_pref(client, /datum/preference/toggle/enable_runechat) && (safe_read_pref(client, /datum/preference/toggle/enable_runechat_non_mobs) || ismob(speaker)))
create_chat_message(speaker, message_language, raw_message, spans)
// Recompose the message, because it's scrambled by default
message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mods)
message = compose_message(speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, spans, message_mods)
to_chat(src,
html = "[link] [message]",
avoid_highlighting = speaker == src)

View File

@@ -508,7 +508,7 @@ GLOBAL_LIST_INIT(command_strings, list(
if(message_mods[RADIO_EXTENSION] == MODE_DEPARTMENT)
internal_radio.talk_into(src, message, message_mods[RADIO_EXTENSION], spans, language, message_mods)
return REDUCE_RANGE
if(message_mods[RADIO_EXTENSION] in GLOB.radiochannels)
if(message_mods[RADIO_EXTENSION] in GLOB.default_radio_channels)
internal_radio.talk_into(src, message, message_mods[RADIO_EXTENSION], spans, language, message_mods)
return REDUCE_RANGE

View File

@@ -171,7 +171,7 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list(
if(ears)
ears.talk_into(src, message, message_mods[RADIO_EXTENSION], spans, language, message_mods)
return ITALICS | REDUCE_RANGE
else if(message_mods[RADIO_EXTENSION] in GLOB.radiochannels)
else if(message_mods[RADIO_EXTENSION] in GLOB.default_radio_channels)
if(ears)
ears.talk_into(src, message, message_mods[RADIO_EXTENSION], spans, language, message_mods)
return ITALICS | REDUCE_RANGE

View File

@@ -90,7 +90,7 @@
if(ears)
ears.talk_into(src, message, message_mods[RADIO_EXTENSION], spans, language, message_mods)
return ITALICS | REDUCE_RANGE
else if(GLOB.radiochannels[message_mods[RADIO_EXTENSION]])
else if(GLOB.default_radio_channels[message_mods[RADIO_EXTENSION]])
if(ears)
ears.talk_into(src, message, message_mods[RADIO_EXTENSION], spans, language, message_mods)
return ITALICS | REDUCE_RANGE

View File

@@ -248,10 +248,10 @@
var/obj/item/organ/brain/brain = locate(/obj/item/organ/brain) in detached_head
brain.name = "[wearer.name]'s brain"
/obj/item/dullahan_relay/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), message_range)
/obj/item/dullahan_relay/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range)
. = ..()
if(owner)
owner.Hear(message, speaker, message_language, raw_message, radio_freq, spans, message_mods, message_range)
owner.Hear(message, speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, spans, message_mods, message_range)
///Adds the owner to the list of hearers in hearers_in_view(), for visible/hearable on top of say messages
/obj/item/dullahan_relay/proc/include_owner(datum/source, list/hearers)

View File

@@ -269,12 +269,12 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list(
send_speech(message, message_range, src, bubble_type, spans, language, message_mods, forced = forced, tts_message = tts_message, tts_filter = tts_filter)//roughly 58% of living/say()'s total cost
if(succumbed)
succumb(TRUE)
to_chat(src, compose_message(src, language, message, , spans, message_mods))
to_chat(src, compose_message(src, language, message, null, null, null, spans, message_mods))
return TRUE
/mob/living/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), message_range=0)
/mob/living/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range=0)
if((SEND_SIGNAL(src, COMSIG_MOVABLE_PRE_HEAR, args) & COMSIG_MOVABLE_CANCEL_HEARING) || !GET_CLIENT(src))
return FALSE
@@ -342,7 +342,7 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list(
SEND_SIGNAL(src, COMSIG_MOVABLE_HEAR, args)
if(speaker_is_signing) //Checks if speaker is using sign language
deaf_message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mods, TRUE)
deaf_message = compose_message(speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, spans, message_mods, TRUE)
if(speaker != src)
if(!radio_freq) //I'm about 90% sure there's a way to make this less cluttered
@@ -381,7 +381,7 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list(
create_chat_message(speaker, message_language, raw_message, spans)
// Recompose message for AI hrefs, language incomprehension.
message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mods)
message = compose_message(speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, spans, message_mods)
var/show_message_success = show_message(message, MSG_AUDIBLE, deaf_message, deaf_type, avoid_highlight)
return understood && show_message_success
@@ -427,7 +427,7 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list(
stack_trace("somehow theres a null returned from get_hearers_in_view() in send_speech!")
continue
if(listening_movable.Hear(null, src, message_language, message_raw, null, spans, message_mods, message_range))
if(listening_movable.Hear(null, src, message_language, message_raw, null, null, null, spans, message_mods, message_range))
listened += listening_movable
//speech bubble

View File

@@ -35,7 +35,7 @@
if(radio)
radio.talk_into(src, message, , spans, language, message_mods)
return NOPASS
else if(message_mods[RADIO_EXTENSION] in GLOB.radiochannels)
else if(message_mods[RADIO_EXTENSION] in GLOB.default_radio_channels)
if(radio)
radio.talk_into(src, message, message_mods[RADIO_EXTENSION], spans, language, message_mods)
return NOPASS

View File

@@ -219,7 +219,7 @@
acceleration = !acceleration
to_chat(usr, "Camera acceleration has been toggled [acceleration ? "on" : "off"].")
/mob/eye/camera/ai/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), message_range)
/mob/eye/camera/ai/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range)
. = ..()
if(relay_speech && speaker && ai && !radio_freq && speaker != ai && GLOB.cameranet.checkCameraVis(speaker))
ai.relay_speech(message, speaker, message_language, raw_message, radio_freq, spans, message_mods)

View File

@@ -917,7 +917,7 @@
radio.command = TRUE
radio.channels = AI.radio.channels
for(var/chan in radio.channels)
radio.secure_radio_connections[chan] = add_radio(radio, GLOB.radiochannels[chan])
radio.secure_radio_connections[chan] = add_radio(radio, GLOB.default_radio_channels[chan])
diag_hud_set_aishell()
undeployment_action.Grant(src)

View File

@@ -92,7 +92,7 @@
if(radio)
radio.talk_into(src, message, , spans, language, message_mods)
return NOPASS
else if(message_mods[RADIO_EXTENSION] in GLOB.radiochannels)
else if(message_mods[RADIO_EXTENSION] in GLOB.default_radio_channels)
if(radio)
radio.talk_into(src, message, message_mods[RADIO_EXTENSION], spans, language, message_mods)
return NOPASS

View File

@@ -542,7 +542,7 @@
else if(message_mods[RADIO_EXTENSION] == MODE_DEPARTMENT)
internal_radio.talk_into(src, message, message_mods[RADIO_EXTENSION], spans, language, message_mods)
return REDUCE_RANGE
else if(message_mods[RADIO_EXTENSION] in GLOB.radiochannels)
else if(message_mods[RADIO_EXTENSION] in GLOB.default_radio_channels)
internal_radio.talk_into(src, message, message_mods[RADIO_EXTENSION], spans, language, message_mods)
return REDUCE_RANGE

View File

@@ -122,7 +122,7 @@
var/datum/action/cooldown/bot_announcement_shortcut/shortcut = new(src)
shortcut.prefix = copytext(line, 1, 4)
var/color = GLOB.radiocolors["[channel]"]
var/color = GLOB.reserved_radio_colors["[channel]"]
if(color)
shortcut.prefix_color = color
shortcut.name = line

View File

@@ -90,7 +90,7 @@ global procs
say_dead(message)
Sends a message to all dead people. Does not use Hear().
compose_message(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, list/message_mods)
compose_message(message, atom/movable/speaker, message_langs, raw_message, radio_freq, freq_name, freq_color, spans, list/message_mods)
Composes the message mobs see on their screen when they hear something.
compose_track_href(message, atom/movable/speaker, message_langs, raw_message, radio_freq)

View File

@@ -118,7 +118,7 @@
/obj/item/mod/control/proc/delete_link_visual()
return delete_link_visual_generic(mod_link)
/obj/item/mod/control/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods, message_range)
/obj/item/mod/control/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods, message_range)
. = ..()
if(speaker != wearer && speaker != ai_assistant)
return
@@ -302,7 +302,7 @@
user.update_worn_neck()
return delete_link_visual_generic(mod_link)
/obj/item/clothing/neck/link_scryer/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods, message_range)
/obj/item/clothing/neck/link_scryer/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods, message_range)
. = ..()
if(speaker != loc)
return

View File

@@ -43,7 +43,7 @@
SIGNAL_HANDLER
return Hear(arglist(arguments))
/obj/item/circuit_component/hear/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, list/message_mods, message_range)
/obj/item/circuit_component/hear/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods, message_range)
if(!on.value)
return FALSE
if(speaker == parent?.shell)

View File

@@ -40,18 +40,9 @@ em {font-style: normal; font-weight: bold;}
.binarysay {color: #20c20e; background-color: #000000; display: block;}
.binarysay a {color: #00ff00;}
.binarysay a:active, .binarysay a:visited {color: #88ff88;}
.radio {color: #008000;}
.sciradio {color: #993399;}
.comradio {color: #948f02;}
.secradio {color: #a30000;}
.medradio {color: #337296;}
.engradio {color: #fb5613;}
.suppradio {color: #a8732b;}
.servradio {color: #6eaa2c;}
.syndradio {color: #6d3f40;}
.centcomradio {color: #686868;}
.aiprivradio {color: #ff00ff;}
.enteradio {color: #00ff99;}
.redteamradio {color: #ff0000;}
.blueteamradio {color: #0000ff;}
.greenteamradio {color: #00ff00;}

View File

@@ -334,39 +334,6 @@ em {
/* RADIO COLORS */
/* IF YOU CHANGE THIS KEEP IT IN SYNC WITH TGUI CONSTANTS */
.radio {
color: hsl(132.8, 74.4%, 45.9%);
}
.sciradio {
color: hsl(271.6, 91.7%, 76.5%);
}
.comradio {
color: hsl(53, 97.6%, 50%);
}
.secradio {
color: hsl(0, 71.2%, 53.7%);
}
.medradio {
color: hsl(202, 83.6%, 64.1%);
}
.engradio {
color: hsl(17, 87.8%, 61.4%);
}
.suppradio {
color: hsl(33.7, 44.9%, 49.8%);
}
.servradio {
color: hsl(88.1, 60.6%, 40.8%);
}
.syndradio {
color: hsl(359.1, 31.8%, 42.5%);
}
@@ -383,10 +350,6 @@ em {
color: hsl(332.2, 59.6%, 60.2%);
}
.enteradio {
color: hsl(157.1, 39.6%, 62.4%);
}
.redteamradio {
color: hsl(0, 100%, 63.3%) !important;
}

View File

@@ -342,38 +342,6 @@ em {
color: hsl(120, 100%, 76.7%);
}
.radio {
color: hsl(120, 100%, 25.1%);
}
.sciradio {
color: hsl(300, 50%, 40%);
}
.comradio {
color: hsl(57.9, 97.3%, 29.4%);
}
.secradio {
color: hsl(0, 100%, 32%);
}
.medradio {
color: hsl(201.8, 49.3%, 39.4%);
}
.engradio {
color: hsl(17.3, 96.7%, 52.9%);
}
.suppradio {
color: hsl(34.6, 59.2%, 41.4%);
}
.servradio {
color: hsl(88.6, 58.9%, 42%);
}
.syndradio {
color: hsl(358.7, 26.7%, 33.7%);
}
@@ -390,10 +358,6 @@ em {
color: hsl(300, 100%, 50%);
}
.enteradio {
color: hsl(176.1, 20%, 45.1%);
}
.redteamradio {
color: hsl(0, 100%, 50%) !important;
}

View File

@@ -1,6 +1,7 @@
import {
Box,
Button,
Flex,
Input,
LabeledControls,
LabeledList,
@@ -11,12 +12,12 @@ import {
} from 'tgui-core/components';
import { useBackend } from '../backend';
import { RADIO_CHANNELS } from '../constants';
import { Window } from '../layouts';
export const Telecomms = (props) => {
const { act, data } = useBackend();
const {
channels,
type,
minfreq,
maxfreq,
@@ -31,6 +32,7 @@ export const Telecomms = (props) => {
currfrequency,
broadcasting,
receiving,
frequencyinfos,
} = data;
const linked = data.linked || [];
const frequencies = data.frequencies || [];
@@ -78,6 +80,7 @@ export const Telecomms = (props) => {
buttons={
<Button
icon={prefab ? 'check' : 'times'}
color={prefab ? 'good' : 'bad'}
content={prefab ? 'True' : 'False'}
disabled={'True'}
/>
@@ -93,13 +96,13 @@ export const Telecomms = (props) => {
<Table.Row>
<Table.Cell>Change Frequency:</Table.Cell>
<Table.Cell>
{RADIO_CHANNELS.find(
{channels.find(
(channel) => channel.freq === changefrequency,
) && (
<Box
inline
color={
RADIO_CHANNELS.find(
channels.find(
(channel) => channel.freq === changefrequency,
).color
}
@@ -107,7 +110,7 @@ export const Telecomms = (props) => {
>
[
{
RADIO_CHANNELS.find(
channels.find(
(channel) => channel.freq === changefrequency,
).name
}
@@ -126,7 +129,8 @@ export const Telecomms = (props) => {
onChange={(value) => act('change_freq', { value })}
/>
<Button
icon={'times'}
icon="times"
color="bad"
disabled={changefrequency === 0}
onClick={() => act('change_freq', { value: 10001 })}
/>
@@ -159,7 +163,8 @@ export const Telecomms = (props) => {
</Table.Cell>
{!!multitool && (
<Button
icon={'times'}
icon="times"
color="bad"
disabled={!multitool}
onClick={() => act('unlink', { value: entry.index })}
/>
@@ -174,24 +179,20 @@ export const Telecomms = (props) => {
<Table.Row key={frequencies.i} className="candystripe">
<Table.Cell bold>{entry / 10} kHz</Table.Cell>
<Table.Cell>
{RADIO_CHANNELS.find(
(channel) => channel.freq === entry,
) && (
{channels.find((channel) => channel.freq === entry) && (
<Box
inline
color={
RADIO_CHANNELS.find(
(channel) => channel.freq === entry,
).color
channels.find((channel) => channel.freq === entry)
.color
}
ml={2}
>
[
{
RADIO_CHANNELS.find(
(channel) => channel.freq === entry,
).name
}{' '}
channels.find((channel) => channel.freq === entry)
.name
}
]
</Box>
)}
@@ -199,7 +200,8 @@ export const Telecomms = (props) => {
<Table.Cell />
{!!multitool && (
<Button
icon={'times'}
icon="times"
color="bad"
disabled={!multitool}
onClick={() => act('delete', { value: entry })}
/>
@@ -210,13 +212,13 @@ export const Telecomms = (props) => {
<Table.Row className="candystripe" collapsing>
<Table.Cell>Add Frequency</Table.Cell>
<Table.Cell>
{RADIO_CHANNELS.find(
{channels.find(
(channel) => channel.freq === frequency,
) && (
<Box
inline
color={
RADIO_CHANNELS.find(
channels.find(
(channel) => channel.freq === frequency,
).color
}
@@ -224,7 +226,7 @@ export const Telecomms = (props) => {
>
[
{
RADIO_CHANNELS.find(
channels.find(
(channel) => channel.freq === frequency,
).name
}
@@ -253,6 +255,59 @@ export const Telecomms = (props) => {
)}
</Table>
</Section>
{type === 'server' && (
<Section
title="Frequencies Settings"
buttons={
<Button
icon="plus"
color="good"
onClick={() => act('add_freq_info')}
/>
}
>
<Table>
{frequencyinfos.map((freq) => (
<Table.Row key={freq.frequency} className="candystripe">
<Flex justify="space-between" align="center">
<Flex.Item bold>{freq.frequency / 10} kHz</Flex.Item>
<Flex.Item>
<Box inline color={freq.color} ml={2}>
[{freq.name}]
</Box>
</Flex.Item>
<Flex.Item>
{!!multitool && (
<>
<Button
icon="wrench"
color="good"
disabled={!multitool}
onClick={() =>
act('modify_freq_info', {
freq: freq.frequency,
})
}
/>
<Button
icon="times"
color="bad"
disabled={!multitool}
onClick={() =>
act('delete_freq_info', {
freq: freq.frequency,
})
}
/>
</>
)}
</Flex.Item>
</Flex>
</Table.Row>
))}
</Table>
</Section>
)}
{!!multitool && (
<Section title="Multitool">
{!!multibuff && (
@@ -274,7 +329,8 @@ export const Telecomms = (props) => {
onClick={() => act('link')}
/>
<Button
icon={'times'}
icon="times"
color="bad"
content={'Flush'}
disabled={!multibuff}
onClick={() => act('flush')}