mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-30 03:22:41 +00:00
## 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 /🆑
127 lines
3.9 KiB
Plaintext
127 lines
3.9 KiB
Plaintext
#define INCLUSIVE_MODE 1
|
|
#define EXCLUSIVE_MODE 2
|
|
#define RECOGNIZER_MODE 3
|
|
#define VOICE_SENSOR_MODE 4
|
|
|
|
/obj/item/assembly/voice
|
|
name = "voice analyzer"
|
|
desc = "A small electronic device able to record a voice sample, and send a signal when that sample is repeated."
|
|
icon_state = "voice"
|
|
custom_materials = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT*5, /datum/material/glass=SMALL_MATERIAL_AMOUNT*0.5)
|
|
assembly_behavior = ASSEMBLY_TOGGLEABLE_INPUT
|
|
verb_say = "beeps"
|
|
verb_ask = "beeps"
|
|
verb_exclaim = "beeps"
|
|
var/listening = FALSE
|
|
/// The activation message is tracked using this var.
|
|
var/recorded = ""
|
|
var/mode = INCLUSIVE_MODE
|
|
var/static/list/modes = list(
|
|
"inclusive",
|
|
"exclusive",
|
|
"recognizer",
|
|
"voice sensor",
|
|
)
|
|
drop_sound = 'sound/items/handling/component_drop.ogg'
|
|
pickup_sound = 'sound/items/handling/component_pickup.ogg'
|
|
|
|
/obj/item/assembly/voice/Initialize(mapload)
|
|
. = ..()
|
|
become_hearing_sensitive(ROUNDSTART_TRAIT)
|
|
|
|
/obj/item/assembly/voice/examine(mob/user)
|
|
. = ..()
|
|
. += 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, 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
|
|
if(speaker == src)
|
|
return FALSE
|
|
|
|
// raw_message can contain multiple spaces between words etc which are not seen in chat due to HTML rendering
|
|
// this means if the teller records a message with e.g. double spaces or tabs, other people will not be able to trigger the sensor since they don't know how to perform the same combination
|
|
raw_message = htmlrendertext(raw_message)
|
|
|
|
if(listening && !radio_freq)
|
|
record_speech(speaker, raw_message, message_language)
|
|
else
|
|
if(check_activation(speaker, raw_message))
|
|
send_pulse()
|
|
return TRUE
|
|
|
|
/obj/item/assembly/voice/proc/record_speech(atom/movable/speaker, raw_message, datum/language/message_language)
|
|
switch(mode)
|
|
if(INCLUSIVE_MODE)
|
|
recorded = raw_message
|
|
listening = FALSE
|
|
say("Activation message is '[recorded]'.", sanitize = FALSE, language = message_language)
|
|
if(EXCLUSIVE_MODE)
|
|
recorded = raw_message
|
|
listening = FALSE
|
|
say("Activation message is '[recorded]'.", sanitize = FALSE, language = message_language)
|
|
if(RECOGNIZER_MODE)
|
|
recorded = speaker.GetVoice()
|
|
listening = FALSE
|
|
say("Your voice pattern is saved.", language = message_language)
|
|
if(VOICE_SENSOR_MODE)
|
|
if(length(raw_message))
|
|
send_pulse()
|
|
|
|
/obj/item/assembly/voice/proc/check_activation(atom/movable/speaker, raw_message)
|
|
if (recorded == "")
|
|
return FALSE
|
|
|
|
switch(mode)
|
|
if(INCLUSIVE_MODE)
|
|
if(findtext(raw_message, recorded))
|
|
return TRUE
|
|
if(EXCLUSIVE_MODE)
|
|
if(raw_message == recorded)
|
|
return TRUE
|
|
if(RECOGNIZER_MODE)
|
|
if(speaker.GetVoice() == recorded)
|
|
return TRUE
|
|
if(VOICE_SENSOR_MODE)
|
|
if(length(raw_message))
|
|
return TRUE
|
|
|
|
return FALSE
|
|
|
|
/obj/item/assembly/voice/proc/send_pulse()
|
|
visible_message("clicks", visible_message_flags = EMOTE_MESSAGE)
|
|
playsound(src, 'sound/effects/whirthunk.ogg', 30)
|
|
addtimer(CALLBACK(src, PROC_REF(pulse)), 2 SECONDS)
|
|
|
|
/obj/item/assembly/voice/multitool_act(mob/living/user, obj/item/I)
|
|
..()
|
|
mode %= modes.len
|
|
mode++
|
|
to_chat(user, span_notice("You set [src] into [modes[mode]] mode."))
|
|
listening = FALSE
|
|
recorded = ""
|
|
return TRUE
|
|
|
|
/obj/item/assembly/voice/activate()
|
|
if(!secured || holder)
|
|
return FALSE
|
|
listening = !listening
|
|
say("[listening ? "Now" : "No longer"] recording input.")
|
|
return TRUE
|
|
|
|
/obj/item/assembly/voice/attack_self(mob/user)
|
|
if(!user)
|
|
return FALSE
|
|
activate()
|
|
return TRUE
|
|
|
|
/obj/item/assembly/voice/toggle_secure()
|
|
. = ..()
|
|
listening = FALSE
|
|
|
|
#undef INCLUSIVE_MODE
|
|
#undef EXCLUSIVE_MODE
|
|
#undef RECOGNIZER_MODE
|
|
#undef VOICE_SENSOR_MODE
|