From 35494b93bbd7d262faa6b836ea9d65ed56c93db4 Mon Sep 17 00:00:00 2001 From: FeudeyTF <72273449+FeudeyTF@users.noreply.github.com> Date: Fri, 27 Jun 2025 18:19:18 +0300 Subject: [PATCH] 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 :cl: add: Added ability to change existing radio channels and create new qol: Added color for some buttons in Telecomms UI /:cl: --- .../signals_atom/signals_atom_movable.dm | 8 +- code/__DEFINES/radio.dm | 17 +++ code/__HELPERS/radio.dm | 2 +- code/datums/brain_damage/imaginary_friend.dm | 8 +- code/game/communications.dm | 27 +---- code/game/machinery/doors/passworddoor.dm | 2 +- code/game/machinery/hologram.dm | 4 +- code/game/machinery/telecomms/broadcasting.dm | 13 ++- .../telecomms/machine_interactions.dm | 109 +++++++++++++++++- .../machinery/telecomms/machines/server.dm | 73 +++++++++++- .../objects/items/devices/radio/headset.dm | 6 +- .../objects/items/devices/radio/intercom.dm | 2 +- .../game/objects/items/devices/radio/radio.dm | 12 +- .../objects/items/devices/taperecorder.dm | 2 +- code/game/say.dm | 31 +++-- code/modules/admin/verbs/borgpanel.dm | 2 +- code/modules/assembly/voice.dm | 2 +- code/modules/clothing/head/jobs.dm | 2 +- code/modules/hallucination/fake_chat.dm | 2 +- code/modules/hallucination/mother.dm | 2 +- .../mining_loot/megafauna/colossus.dm | 2 +- .../mining_loot/megafauna/the_thing.dm | 2 +- .../modules/mob/dead/observer/observer_say.dm | 4 +- code/modules/mob/living/basic/bots/_bots.dm | 2 +- .../mob/living/basic/pets/parrot/_parrot.dm | 2 +- .../mob/living/carbon/human/human_say.dm | 2 +- .../carbon/human/species_types/dullahan.dm | 4 +- code/modules/mob/living/living_say.dm | 10 +- code/modules/mob/living/silicon/ai/ai_say.dm | 2 +- .../mob/living/silicon/ai/freelook/eye.dm | 2 +- .../modules/mob/living/silicon/robot/robot.dm | 2 +- .../modules/mob/living/silicon/silicon_say.dm | 2 +- .../mob/living/simple_animal/bot/bot.dm | 2 +- .../simple_animal/bot/bot_announcement.dm | 2 +- code/modules/mob/say_readme.md | 2 +- code/modules/mod/mod_link.dm | 4 +- code/modules/wiremod/components/atom/hear.dm | 2 +- interface/stylesheet.dm | 9 -- .../tgui-panel/styles/tgchat/chat-dark.scss | 37 ------ .../tgui-panel/styles/tgchat/chat-light.scss | 36 ------ tgui/packages/tgui/interfaces/Telecomms.jsx | 98 ++++++++++++---- 41 files changed, 360 insertions(+), 194 deletions(-) diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm index 2d257b6ffda..1df2f39cc1b 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm @@ -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" diff --git a/code/__DEFINES/radio.dm b/code/__DEFINES/radio.dm index 03dd4cc0e2f..582e0d9a4a4 100644 --- a/code/__DEFINES/radio.dm +++ b/code/__DEFINES/radio.dm @@ -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 // ------------------------------------------------- diff --git a/code/__HELPERS/radio.dm b/code/__HELPERS/radio.dm index 64d70181d9b..9f25af914dd 100644 --- a/code/__HELPERS/radio.dm +++ b/code/__HELPERS/radio.dm @@ -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 diff --git a/code/datums/brain_damage/imaginary_friend.dm b/code/datums/brain_damage/imaginary_friend.dm index bb1e149ffe6..449b0ec0657 100644 --- a/code/datums/brain_damage/imaginary_friend.dm +++ b/code/datums/brain_damage/imaginary_friend.dm @@ -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() diff --git a/code/game/communications.dm b/code/game/communications.dm index 1eff3571f57..9e40080a49d 100644 --- a/code/game/communications.dm +++ b/code/game/communications.dm @@ -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, @@ -112,20 +112,10 @@ 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_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, @@ -133,19 +123,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", diff --git a/code/game/machinery/doors/passworddoor.dm b/code/game/machinery/doors/passworddoor.dm index 8d35f44b0d8..cb20b6a44f0 100644 --- a/code/game/machinery/doors/passworddoor.dm +++ b/code/game/machinery/doors/passworddoor.dm @@ -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 diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 0e027bfe357..d53667e61b8 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -575,7 +575,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) @@ -587,7 +587,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) diff --git a/code/game/machinery/telecomms/broadcasting.dm b/code/game/machinery/telecomms/broadcasting.dm index a65b31223b9..289ac960f8f 100644 --- a/code/game/machinery/telecomms/broadcasting.dm +++ b/code/game/machinery/telecomms/broadcasting.dm @@ -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)) diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm index f61349208a3..054edc51763 100644 --- a/code/game/machinery/telecomms/machine_interactions.dm +++ b/code/game/machinery/telecomms/machine_interactions.dm @@ -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 diff --git a/code/game/machinery/telecomms/machines/server.dm b/code/game/machinery/telecomms/machines/server.dm index 1c7557b79de..943bffe82c2 100644 --- a/code/game/machinery/telecomms/machines/server.dm +++ b/code/game/machinery/telecomms/machines/server.dm @@ -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() diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 620c12d6041..beaab018372 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -62,7 +62,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 += "
  • [span_class(channel_span_class, MODE_TOKEN_DEPARTMENT)] or [span_class(channel_span_class, channel_token)] for [span_class(channel_span_class, channel_name)]
  • " @@ -450,7 +450,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) @@ -499,7 +499,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 diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index cd8535e8d28..ca8ca44ad2c 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -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 ..() diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 59a29e66ce1..e092a9334dc 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -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 @@ -422,7 +422,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 @@ -635,7 +635,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)) diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index a34d5a4e3c8..5dfe8ebce47 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -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 diff --git a/code/game/say.dm b/code/game/say.dm index 93775b74fa5..1c2a464622a 100644 --- a/code/game/say.dm +++ b/code/game/say.dm @@ -66,7 +66,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 @@ -117,7 +117,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 @@ -137,14 +137,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 = "" + var/freq_color = get_radio_color(radio_freq, radio_freq_color) + var/spanpart1 = "" //Start name span. var/spanpart2 = "" //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) @@ -285,12 +286,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]" diff --git a/code/modules/admin/verbs/borgpanel.dm b/code/modules/admin/verbs/borgpanel.dm index 57ad91d691a..4714bd6cd1f 100644 --- a/code/modules/admin/verbs/borgpanel.dm +++ b/code/modules/admin/verbs/borgpanel.dm @@ -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))) diff --git a/code/modules/assembly/voice.dm b/code/modules/assembly/voice.dm index 106b8127307..ffe5eab54ce 100644 --- a/code/modules/assembly/voice.dm +++ b/code/modules/assembly/voice.dm @@ -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 diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index c6622fe1e88..9bf727f9130 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -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 \"[prefix] [found_phrase]\"!") -/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 diff --git a/code/modules/hallucination/fake_chat.dm b/code/modules/hallucination/fake_chat.dm index 3f2d39e4661..42d16bf3c89 100644 --- a/code/modules/hallucination/fake_chat.dm +++ b/code/modules/hallucination/fake_chat.dm @@ -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. diff --git a/code/modules/hallucination/mother.dm b/code/modules/hallucination/mother.dm index e3bb3c91af0..a0b3194ce5f 100644 --- a/code/modules/hallucination/mother.dm +++ b/code/modules/hallucination/mother.dm @@ -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() diff --git a/code/modules/mining/lavaland/mining_loot/megafauna/colossus.dm b/code/modules/mining/lavaland/mining_loot/megafauna/colossus.dm index 76e3153e4e0..5460287ac56 100644 --- a/code/modules/mining/lavaland/mining_loot/megafauna/colossus.dm +++ b/code/modules/mining/lavaland/mining_loot/megafauna/colossus.dm @@ -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) diff --git a/code/modules/mining/lavaland/mining_loot/megafauna/the_thing.dm b/code/modules/mining/lavaland/mining_loot/megafauna/the_thing.dm index dd4ea13b351..d96bd6b0280 100644 --- a/code/modules/mining/lavaland/mining_loot/megafauna/the_thing.dm +++ b/code/modules/mining/lavaland/mining_loot/megafauna/the_thing.dm @@ -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 diff --git a/code/modules/mob/dead/observer/observer_say.dm b/code/modules/mob/dead/observer/observer_say.dm index a8fd0094934..d88271cfe44 100644 --- a/code/modules/mob/dead/observer/observer_say.dm +++ b/code/modules/mob/dead/observer/observer_say.dm @@ -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) diff --git a/code/modules/mob/living/basic/bots/_bots.dm b/code/modules/mob/living/basic/bots/_bots.dm index bc3bd7bf08e..db05f26c664 100644 --- a/code/modules/mob/living/basic/bots/_bots.dm +++ b/code/modules/mob/living/basic/bots/_bots.dm @@ -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 diff --git a/code/modules/mob/living/basic/pets/parrot/_parrot.dm b/code/modules/mob/living/basic/pets/parrot/_parrot.dm index 0f75c37ef98..31b525e5c8f 100644 --- a/code/modules/mob/living/basic/pets/parrot/_parrot.dm +++ b/code/modules/mob/living/basic/pets/parrot/_parrot.dm @@ -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 diff --git a/code/modules/mob/living/carbon/human/human_say.dm b/code/modules/mob/living/carbon/human/human_say.dm index d2cae392447..053582174d1 100644 --- a/code/modules/mob/living/carbon/human/human_say.dm +++ b/code/modules/mob/living/carbon/human/human_say.dm @@ -91,7 +91,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 diff --git a/code/modules/mob/living/carbon/human/species_types/dullahan.dm b/code/modules/mob/living/carbon/human/species_types/dullahan.dm index 5580b2c4a2c..d3fabb91bc8 100644 --- a/code/modules/mob/living/carbon/human/species_types/dullahan.dm +++ b/code/modules/mob/living/carbon/human/species_types/dullahan.dm @@ -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) diff --git a/code/modules/mob/living/living_say.dm b/code/modules/mob/living/living_say.dm index bf606b7af29..37695af09c5 100644 --- a/code/modules/mob/living/living_say.dm +++ b/code/modules/mob/living/living_say.dm @@ -259,12 +259,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 @@ -332,7 +332,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 @@ -371,7 +371,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 @@ -417,7 +417,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 diff --git a/code/modules/mob/living/silicon/ai/ai_say.dm b/code/modules/mob/living/silicon/ai/ai_say.dm index cc837cbd07d..b6f4d4ded36 100644 --- a/code/modules/mob/living/silicon/ai/ai_say.dm +++ b/code/modules/mob/living/silicon/ai/ai_say.dm @@ -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 diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm index 25ccafe26c0..c1741faa121 100644 --- a/code/modules/mob/living/silicon/ai/freelook/eye.dm +++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm @@ -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) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 485c496756c..329b09282fe 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -897,7 +897,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) diff --git a/code/modules/mob/living/silicon/silicon_say.dm b/code/modules/mob/living/silicon/silicon_say.dm index 3c3813e110a..d2b83890171 100644 --- a/code/modules/mob/living/silicon/silicon_say.dm +++ b/code/modules/mob/living/silicon/silicon_say.dm @@ -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 diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index 88b6cd48d94..77f339c7859 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -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 diff --git a/code/modules/mob/living/simple_animal/bot/bot_announcement.dm b/code/modules/mob/living/simple_animal/bot/bot_announcement.dm index 5d63fbdee2b..0a9f8d8d59c 100644 --- a/code/modules/mob/living/simple_animal/bot/bot_announcement.dm +++ b/code/modules/mob/living/simple_animal/bot/bot_announcement.dm @@ -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 diff --git a/code/modules/mob/say_readme.md b/code/modules/mob/say_readme.md index 68f490331e2..5284012de29 100644 --- a/code/modules/mob/say_readme.md +++ b/code/modules/mob/say_readme.md @@ -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) diff --git a/code/modules/mod/mod_link.dm b/code/modules/mod/mod_link.dm index 03049b363a6..2002469a16e 100644 --- a/code/modules/mod/mod_link.dm +++ b/code/modules/mod/mod_link.dm @@ -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 @@ -298,7 +298,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 diff --git a/code/modules/wiremod/components/atom/hear.dm b/code/modules/wiremod/components/atom/hear.dm index 98c45a77f6f..c846c4c7f83 100644 --- a/code/modules/wiremod/components/atom/hear.dm +++ b/code/modules/wiremod/components/atom/hear.dm @@ -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) diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm index 16d66f61a92..65fda5e4237 100644 --- a/interface/stylesheet.dm +++ b/interface/stylesheet.dm @@ -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;} diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss index 76560849374..37a9c9b3586 100644 --- a/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss +++ b/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss @@ -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; } diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss index 23d1542fe68..48f42122928 100644 --- a/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss +++ b/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss @@ -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; } diff --git a/tgui/packages/tgui/interfaces/Telecomms.jsx b/tgui/packages/tgui/interfaces/Telecomms.jsx index 2458dc70e46..a34d35b020c 100644 --- a/tgui/packages/tgui/interfaces/Telecomms.jsx +++ b/tgui/packages/tgui/interfaces/Telecomms.jsx @@ -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={