mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-11 18:22:14 +00:00
## About The Pull Request Oh man, so this entire pr started because of two things: 1. A kinda hacky fix to #92123 that got closed a good while ago. 2. A borg I know mentioning you can't do custom say verbs over robotic talk. Which subsequently led me down this rabbit hole of say modes and custom say verbs. So! The most wide-reaching thing this does is merge the custom say verb/radio emote logic that used to be specialcased in `compose_message(...)` into `say_quote(...)`, renaming this to `generate_messagepart(...)` with its new functionality. This means things that don't use the exact same chain as living things talking normally can still generate custom say verbs if given that message modifier. Then, we split up say modes into a "can we do this" and "try to do this" check to reduce conflicts (like #92123), and forward more of our data to the latter. This allows us to then edit the say modes to actually make use of that data, and with the previous addition of `generate_messagepart(...)` allow for custom say verbs to be used. In doing this I realized the logging was kind of awkward and all over the place, so we create the new logging helper `log_sayverb_talk(...)` which handles selecting how we should log things based on the given message modifiers. For better or worse I forgot about this pr for a few weeks, so I don't perfectly remember all the details, but those are the big key parts. ## Why It's Good For The Game Fixes #92123. I think custom say verbs are some of the best flavour we have for talking over radio, and any situation benefits from that being possible. It's great to be able to tap your microphone, and it's hilarious for an AI to be able to emote beaming an image directly into the heads of their borgs over robotic talk. The rest is mostly cleanup.
105 lines
3.6 KiB
Plaintext
105 lines
3.6 KiB
Plaintext
/*
|
|
|
|
Here's how to use the TGS chat system with configs
|
|
|
|
send2adminchat is a simple function that broadcasts to all admin channels that are designated in TGS
|
|
|
|
send2chat is a bit verbose but can be very specific
|
|
|
|
In TGS3 it will always be sent to all connected designated game chats.
|
|
|
|
In TGS4+ they use the new tagging system
|
|
|
|
The second parameter is a string, this string should be read from a config.
|
|
What this does is dictate which TGS channels can be sent to.
|
|
|
|
For example if you have the following channels in tgs4 set up
|
|
- Channel 1, Tag: asdf
|
|
- Channel 2, Tag: bombay,asdf
|
|
- Channel 3, Tag: Hello my name is asdf
|
|
- Channel 4, No Tag
|
|
- Channel 5, Tag: butts
|
|
|
|
and you make the call:
|
|
|
|
send2chat(new /datum/tgs_message_content("I sniff butts"), CONFIG_GET(string/where_to_send_sniff_butts))
|
|
|
|
and the config option is set like:
|
|
|
|
WHERE_TO_SEND_SNIFF_BUTTS asdf
|
|
|
|
It will be sent to channels 1 and 2
|
|
|
|
Alternatively if you set the config option to just:
|
|
|
|
WHERE_TO_SEND_SNIFF_BUTTS
|
|
|
|
it will be sent to all connected chats.
|
|
*/
|
|
|
|
/**
|
|
* Asynchronously sends a message to TGS chat channels.
|
|
*
|
|
* message - The [/datum/tgs_message_content] to send.
|
|
* channel_tag - Required. If "", the message with be sent to all connected (Game-type for TGS3) channels. Otherwise, it will be sent to TGS4 channels with that tag (Delimited by ','s).
|
|
* admin_only - Determines if this communication can only be sent to admin only channels.
|
|
*/
|
|
/proc/send2chat(datum/tgs_message_content/message, channel_tag, admin_only = FALSE)
|
|
set waitfor = FALSE
|
|
if(channel_tag == null || !world.TgsAvailable())
|
|
return
|
|
|
|
var/datum/tgs_version/version = world.TgsVersion()
|
|
if(channel_tag == "" || version.suite == 3)
|
|
world.TgsTargetedChatBroadcast(message, admin_only)
|
|
return
|
|
|
|
var/list/channels_to_use = list()
|
|
for(var/I in world.TgsChatChannelInfo())
|
|
var/datum/tgs_chat_channel/channel = I
|
|
var/list/applicable_tags = splittext(channel.custom_tag, ",")
|
|
if((!admin_only || channel.is_admin_channel) && (channel_tag in applicable_tags))
|
|
channels_to_use += channel
|
|
|
|
if(channels_to_use.len)
|
|
world.TgsChatBroadcast(message, channels_to_use)
|
|
|
|
/**
|
|
* Asynchronously sends a message to TGS admin chat channels.
|
|
*
|
|
* category - The category of the mssage.
|
|
* message - The message to send.
|
|
*/
|
|
/proc/send2adminchat(category, message, embed_links = FALSE)
|
|
set waitfor = FALSE
|
|
|
|
category = replacetext(replacetext(category, "\proper", ""), "\improper", "")
|
|
message = replacetext(replacetext(message, "\proper", ""), "\improper", "")
|
|
if(!embed_links)
|
|
message = GLOB.has_discord_embeddable_links.Replace(replacetext(message, "`", ""), " ```$1``` ")
|
|
world.TgsTargetedChatBroadcast(new /datum/tgs_message_content("[category] | [message]"), TRUE)
|
|
|
|
/// Handles text formatting for item use hints in examine text
|
|
#define EXAMINE_HINT(text) ("<b>" + text + "</b>")
|
|
|
|
/// Sends a message to all dead and observing players, if a source is provided a follow link will be attached.
|
|
/proc/send_to_observers(message, source, message_type = null)
|
|
var/list/all_observers = GLOB.dead_player_list + GLOB.current_observers_list
|
|
for(var/mob/observer as anything in all_observers)
|
|
if (isnull(source))
|
|
to_chat(observer, "[message]", type = message_type)
|
|
continue
|
|
var/link = FOLLOW_LINK(observer, source)
|
|
to_chat(observer, "[link] [message]", type = message_type)
|
|
|
|
/// Sends a message to everyone within the list, as well as all observers.
|
|
/proc/relay_to_list_and_observers(message, list/mob_list, source, message_type = null)
|
|
for(var/mob/creature as anything in mob_list)
|
|
to_chat(
|
|
creature,
|
|
message,
|
|
type = message_type,
|
|
avoid_highlighting = (creature == source),
|
|
)
|
|
send_to_observers(message, source)
|