mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-09 07:46:20 +00:00
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)

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

2) Add frequency at Bus (you will not see channel name):

3) Add frequency at Server
4) Add settings for your frequency

5) See the result:

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:
@@ -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"
|
||||
|
||||
@@ -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 // -------------------------------------------------
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 ..()
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>"
|
||||
|
||||
|
||||
@@ -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)))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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')}
|
||||
|
||||
Reference in New Issue
Block a user