mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-11 10:11:09 +00:00
## About The Pull Request At roundstart when the intercept report is sent, two announcements are created at the same time. It's loud and overlaps. This combines them into a single announcement. Before:  After:  ## Why It's Good For The Game Two Centcom or any other announcements playing at the same time (especially with two different sound files) can be annoying and the sounds distort each other. ## Changelog 🆑 LT3 qol: Roundstart intercept report and security level announcements are combined into a single announcement /🆑
96 lines
3.9 KiB
Plaintext
96 lines
3.9 KiB
Plaintext
SUBSYSTEM_DEF(security_level)
|
|
name = "Security Level"
|
|
can_fire = FALSE // We will control when we fire in this subsystem
|
|
init_order = INIT_ORDER_SECURITY_LEVEL
|
|
/// Currently set security level
|
|
var/datum/security_level/current_security_level
|
|
/// A list of initialised security level datums.
|
|
var/list/available_levels = list()
|
|
|
|
/datum/controller/subsystem/security_level/Initialize()
|
|
for(var/iterating_security_level_type in subtypesof(/datum/security_level))
|
|
var/datum/security_level/new_security_level = new iterating_security_level_type
|
|
available_levels[new_security_level.name] = new_security_level
|
|
current_security_level = available_levels[number_level_to_text(SEC_LEVEL_GREEN)]
|
|
return SS_INIT_SUCCESS
|
|
|
|
/datum/controller/subsystem/security_level/fire(resumed)
|
|
if(!current_security_level.looping_sound) // No sound? No play.
|
|
can_fire = FALSE
|
|
return
|
|
sound_to_playing_players(current_security_level.looping_sound)
|
|
|
|
|
|
/**
|
|
* Sets a new security level as our current level
|
|
*
|
|
* This is how everything should change the security level.
|
|
*
|
|
* Arguments:
|
|
* * new_level - The new security level that will become our current level
|
|
* * announce - Play the announcement, set FALSE if you're doing your own custom announcement to prevent duplicates
|
|
*/
|
|
/datum/controller/subsystem/security_level/proc/set_level(new_level, announce = TRUE)
|
|
new_level = istext(new_level) ? new_level : number_level_to_text(new_level)
|
|
if(new_level == current_security_level.name) // If we are already at the desired level, do nothing
|
|
return
|
|
|
|
var/datum/security_level/selected_level = available_levels[new_level]
|
|
|
|
if(!selected_level)
|
|
CRASH("set_level was called with an invalid security level([new_level])")
|
|
|
|
if(SSnightshift.can_fire && (selected_level.number_level >= SEC_LEVEL_RED || current_security_level.number_level >= SEC_LEVEL_RED))
|
|
SSnightshift.next_fire = world.time + 7 SECONDS // Fire nightshift after the security level announcement is complete
|
|
|
|
if(announce)
|
|
level_announce(selected_level, current_security_level.number_level) // We want to announce BEFORE updating to the new level
|
|
|
|
SSsecurity_level.current_security_level = selected_level
|
|
|
|
if(selected_level.looping_sound)
|
|
wait = selected_level.looping_sound_interval
|
|
can_fire = TRUE
|
|
else
|
|
can_fire = FALSE
|
|
|
|
if(SSshuttle.emergency.mode == SHUTTLE_CALL || SSshuttle.emergency.mode == SHUTTLE_RECALL) // By god this is absolutely shit
|
|
SSshuttle.emergency.alert_coeff_change(selected_level.shuttle_call_time_mod)
|
|
|
|
SEND_SIGNAL(src, COMSIG_SECURITY_LEVEL_CHANGED, selected_level.number_level)
|
|
SSblackbox.record_feedback("tally", "security_level_changes", 1, selected_level.name)
|
|
|
|
/**
|
|
* Returns the current security level as a number
|
|
*/
|
|
/datum/controller/subsystem/security_level/proc/get_current_level_as_number()
|
|
return ((!initialized || !current_security_level) ? SEC_LEVEL_GREEN : current_security_level.number_level) //Send the default security level in case the subsystem hasn't finished initializing yet
|
|
|
|
/**
|
|
* Returns the current security level as text
|
|
*/
|
|
/datum/controller/subsystem/security_level/proc/get_current_level_as_text()
|
|
return ((!initialized || !current_security_level) ? "green" : current_security_level.name)
|
|
|
|
/**
|
|
* Converts a text security level to a number
|
|
*
|
|
* Arguments:
|
|
* * level - The text security level to convert
|
|
*/
|
|
/datum/controller/subsystem/security_level/proc/text_level_to_number(text_level)
|
|
var/datum/security_level/selected_level = available_levels[text_level]
|
|
return selected_level?.number_level
|
|
|
|
/**
|
|
* Converts a number security level to a text
|
|
*
|
|
* Arguments:
|
|
* * level - The number security level to convert
|
|
*/
|
|
/datum/controller/subsystem/security_level/proc/number_level_to_text(number_level)
|
|
for(var/iterating_level_text in available_levels)
|
|
var/datum/security_level/iterating_security_level = available_levels[iterating_level_text]
|
|
if(iterating_security_level.number_level == number_level)
|
|
return iterating_security_level.name
|