GLOBAL_DATUM_INIT(minor_announcement, /datum/announcer, new(config_type = /datum/announcement_configuration/minor)) GLOBAL_DATUM_INIT(major_announcement, /datum/announcer, new(config_type = /datum/announcement_configuration/major)) /datum/announcement_configuration var/default_title = "Attention" /// The name used when describing the announcement type in logs. var/log_name = ANNOUNCE_KIND_DEFAULT /// Whether or not to log the announcement when made. var/add_log = FALSE /// Global announcements are received regardless of being in range of a /// radio, unless you're in the lobby, to prevent metagaming. var/global_announcement = FALSE /// What sound to play when the announcement is made. var/sound/sound /// A CSS class name. var/style /datum/announcer // The default configuration for new announcements. var/datum/announcement_configuration/config /// The name used to sign off on announcements. var/author var/language = "Galactic Common" /datum/announcer/New(config_type = null) config = config_type ? new config_type : new // TODO: Make new_sound+new_sound2 a list to clean things up more /datum/announcer/proc/Announce( message, new_title = null, new_sound = null, msg_sanitized = FALSE, msg_language, new_sound2 = null, new_subtitle = null ) if(!message) return var/title = html_encode(new_title || config.default_title) var/subtitle = new_subtitle ? html_encode(new_subtitle) : null var/message_sound = new_sound ? sound(new_sound) : config.sound var/message_sound2 = new_sound2 ? sound(new_sound2) : null if(!msg_sanitized) message = trim_strip_html_properly(message, allow_lines = TRUE) var/datum/language/message_language = GLOB.all_languages[msg_language ? msg_language : language] var/list/combined_receivers = Get_Receivers(message_language) var/list/receivers = combined_receivers[1] var/list/garbled_receivers = combined_receivers[2] var/formatted_message = Format(message, title, subtitle) var/garbled_formatted_message = Format( message_language.scramble(message), message_language.scramble(title), message_language.scramble(subtitle) ) Message(formatted_message, garbled_formatted_message, receivers, garbled_receivers) Sound(message_sound, combined_receivers[1] + combined_receivers[2]) if(message_sound2) Sound(message_sound2, combined_receivers[1] + combined_receivers[2]) if(config.add_log) Log(message, title) /datum/announcer/proc/Get_Receivers(datum/language/message_language) var/list/receivers = list() var/list/garbled_receivers = list() if(config.global_announcement) for(var/mob/M in GLOB.player_list) if(!isnewplayer(M) && M.client) receivers |= M else for(var/obj/item/radio/R in GLOB.global_radios) receivers |= R.send_announcement() for(var/mob/M in receivers) if(!istype(M) || !M.client || M.stat || !M.can_hear()) receivers -= M continue if(!M.say_understands(null, message_language)) receivers -= M garbled_receivers |= M for(var/mob/M in GLOB.dead_mob_list) if(M.client && M.stat == DEAD && !isnewplayer(M)) receivers |= M return list(receivers, garbled_receivers) /datum/announcer/proc/Message(message, garbled_message, receivers, garbled_receivers) for(var/mob/M in receivers) to_chat(M, message) for(var/mob/M in garbled_receivers) to_chat(M, garbled_message) /datum/announcer/proc/Format(message, title, subtitle = null) var/formatted_message var/style = config.style ? "announcement [config.style]" : "announcement" formatted_message += "
" formatted_message += "

[title]

" if(subtitle) formatted_message += "

[subtitle]

" formatted_message += "

[message]

" if(author) formatted_message += "

- [html_encode(author)]

" formatted_message += "
" return formatted_message /datum/announcer/proc/Sound(message_sound, receivers) if(!message_sound) return for(var/mob/M in receivers) SEND_SOUND(M, message_sound) /datum/announcer/proc/Log(message, message_title) log_game("[key_name(usr)] has made \a [config.log_name]: [message_title] - [message] - [author]") message_admins("[key_name_admin(usr)] has made \a [config.log_name].", 1) /proc/GetNameAndAssignmentFromId(obj/item/card/id/I) // Format currently matches that of newscaster feeds: Registered Name (Assigned Rank) return I.assignment ? "[I.registered_name] ([I.assignment])" : I.registered_name /datum/announcement_configuration/event default_title = ANNOUNCE_KIND_EVENT sound = sound('sound/misc/notice2.ogg') style = "minor" /datum/announcement_configuration/major default_title = ANNOUNCE_KIND_MAJOR global_announcement = TRUE sound = sound('sound/misc/notice2.ogg') /datum/announcement_configuration/security default_title = ANNOUNCE_KIND_SECURITY sound = sound('sound/misc/notice2.ogg') style = "sec" /datum/announcement_configuration/minor sound = sound('sound/misc/notice2.ogg') style = "minor" /datum/announcement_configuration/requests_console style = "minor" add_log = TRUE sound = sound('sound/misc/notice2.ogg') /datum/announcement_configuration/comms_console default_title = "Priority Announcement" add_log = TRUE log_name = ANNOUNCE_KIND_PRIORITY sound = sound('sound/misc/announce.ogg') style = "major" /datum/announcement_configuration/ai default_title = ANNOUNCE_KIND_AI add_log = TRUE log_name = ANNOUNCE_KIND_AI sound = sound('sound/misc/notice2.ogg') style = "major"