Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add 🟠 and 🟣 security levels #1444

Closed
34 changes: 34 additions & 0 deletions code/__DEFINES/_ss220.dm
Original file line number Diff line number Diff line change
@@ -1,5 +1,39 @@
#define MODPACK_CHAT_BADGES

#ifdef SEC_LEVEL_GREEN
#undef SEC_LEVEL_GREEN
#endif
#ifdef SEC_LEVEL_BLUE
#undef SEC_LEVEL_BLUE
#endif
#ifdef SEC_LEVEL_VIOLET
#undef SEC_LEVEL_VIOLET
#endif
#ifdef SEC_LEVEL_ORANGE
#undef SEC_LEVEL_ORANGE
#endif
#ifdef SEC_LEVEL_RED
#undef SEC_LEVEL_RED
#endif
#ifdef SEC_LEVEL_GAMMA
#undef SEC_LEVEL_GAMMA
#endif
#ifdef SEC_LEVEL_EPSILON
#undef SEC_LEVEL_EPSILON
#endif
#ifdef SEC_LEVEL_DELTA
#undef SEC_LEVEL_DELTA
#endif

#define SEC_LEVEL_GREEN 0
#define SEC_LEVEL_BLUE 1
#define SEC_LEVEL_VIOLET 2
#define SEC_LEVEL_ORANGE 3
#define SEC_LEVEL_RED 4
#define SEC_LEVEL_GAMMA 5
#define SEC_LEVEL_EPSILON 6
#define SEC_LEVEL_DELTA 7

// TODO: someday preferences will use TGUI and you will probably be able to move it to modular_ss220\_defines220\code\preferences_defines.dm
/// Interacts with the toggles220 bitflag
#define PREFTOGGLE_TOGGLE220 220
40 changes: 40 additions & 0 deletions code/controllers/subsystem/non_firing/SSmapping.dm
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@ SUBSYSTEM_DEF(mapping)
var/datum/lavaland_theme/lavaland_theme
///What primary cave theme we have picked for cave generation today.
var/cave_theme
// Tells if all maintenance airlocks have emergency access enabled
var/maint_all_access = FALSE
// Tells if all station airlocks have emergency access enabled
var/station_all_access = FALSE

/// A mapping of environment names to MILLA environment IDs.
var/list/environments
Expand Down Expand Up @@ -356,5 +360,41 @@ SUBSYSTEM_DEF(mapping)

log_world("Ruin loader finished with [budget] left to spend.")

/datum/controller/subsystem/mapping/proc/make_maint_all_access()
for(var/area/station/maintenance/A in existing_station_areas)
for(var/obj/machinery/door/airlock/D in A)
D.emergency = TRUE
D.update_icon()
GLOB.minor_announcement.Announce("Access restrictions on maintenance and external airlocks have been removed.")
maint_all_access = TRUE
SSblackbox.record_feedback("nested tally", "keycard_auths", 1, list("emergency maintenance access", "enabled"))

/datum/controller/subsystem/mapping/proc/revoke_maint_all_access()
for(var/area/station/maintenance/A in existing_station_areas)
for(var/obj/machinery/door/airlock/D in A)
D.emergency = FALSE
D.update_icon()
GLOB.minor_announcement.Announce("Access restrictions on maintenance and external airlocks have been re-added.")
maint_all_access = FALSE
SSblackbox.record_feedback("nested tally", "keycard_auths", 1, list("emergency maintenance access", "disabled"))

/datum/controller/subsystem/mapping/proc/make_station_all_access()
for(var/obj/machinery/door/airlock/D in GLOB.airlocks)
if(is_station_level(D.z))
D.emergency = TRUE
D.update_icon()
GLOB.minor_announcement.Announce("Access restrictions on all station airlocks have been removed due to an ongoing crisis. Trespassing laws still apply unless ordered otherwise by Command staff.")
station_all_access = TRUE
SSblackbox.record_feedback("nested tally", "keycard_auths", 1, list("emergency station access", "enabled"))

/datum/controller/subsystem/mapping/proc/revoke_station_all_access()
for(var/obj/machinery/door/airlock/D in GLOB.airlocks)
if(is_station_level(D.z))
D.emergency = FALSE
D.update_icon()
GLOB.minor_announcement.Announce("Access restrictions on all station airlocks have been re-added. Seek station AI or a colleague's assistance if you are stuck.")
station_all_access = FALSE
SSblackbox.record_feedback("nested tally", "keycard_auths", 1, list("emergency station access", "disabled"))

/datum/controller/subsystem/mapping/Recover()
flags |= SS_NO_INIT
8 changes: 4 additions & 4 deletions code/datums/weather/weather_types/radiation_storm.dm
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,9 @@
/datum/weather/rad_storm/telegraph()
..()
status_alarm(TRUE)
pre_maint_all_access = GLOB.maint_all_access
if(!GLOB.maint_all_access)
make_maint_all_access()
pre_maint_all_access = SSmapping.maint_all_access
if(!SSmapping.maint_all_access)
SSmapping.make_maint_all_access()

/datum/weather/rad_storm/weather_act(mob/living/L)
if(!prob(60))
Expand Down Expand Up @@ -74,7 +74,7 @@
status_alarm(FALSE)
if(!pre_maint_all_access)
GLOB.minor_announcement.Announce("The radiation threat has passed. Please return to your workplaces. Door access resetting momentarily.", "Anomaly Alert")
addtimer(CALLBACK(SSweather, GLOBAL_PROC_REF(revoke_maint_all_access)), 10 SECONDS) // Bit of time to get out / break into somewhere.
addtimer(CALLBACK(SSmapping, TYPE_PROC_REF(/datum/controller/subsystem/mapping, revoke_maint_all_access)), 10 SECONDS) // Bit of time to get out / break into somewhere.
else
GLOB.minor_announcement.Announce("The radiation threat has passed. Please return to your workplaces.", "Anomaly Alert")

Expand Down
48 changes: 4 additions & 44 deletions code/modules/security_levels/keycard_authentication.dm
Original file line number Diff line number Diff line change
Expand Up @@ -177,13 +177,13 @@
if("Red Alert")
INVOKE_ASYNC(SSsecurity_level, TYPE_PROC_REF(/datum/controller/subsystem/security_level, set_level), SEC_LEVEL_RED)
if("Grant Emergency Maintenance Access")
make_maint_all_access()
SSmapping.make_maint_all_access()
if("Revoke Emergency Maintenance Access")
revoke_maint_all_access()
SSmapping.revoke_maint_all_access()
if("Activate Station-Wide Emergency Access")
make_station_all_access()
SSmapping.make_station_all_access()
if("Deactivate Station-Wide Emergency Access")
revoke_station_all_access()
SSmapping.revoke_station_all_access()
if("Emergency Response Team")
if(is_ert_blocked())
atom_say("All Emergency Response Teams are dispatched and can not be called at this time.")
Expand Down Expand Up @@ -215,43 +215,3 @@

/obj/machinery/keycard_auth/proc/is_ert_blocked()
return SSticker.mode && SSticker.mode.ert_disabled

GLOBAL_VAR_INIT(maint_all_access, 0)
GLOBAL_VAR_INIT(station_all_access, 0)

// Why are these global procs?
/proc/make_maint_all_access()
for(var/area/station/maintenance/A in world) // Why are these global lists? AAAAAAAAAAAAAA
for(var/obj/machinery/door/airlock/D in A)
D.emergency = 1
D.update_icon()
GLOB.minor_announcement.Announce("Access restrictions on maintenance and external airlocks have been removed.")
GLOB.maint_all_access = 1
SSblackbox.record_feedback("nested tally", "keycard_auths", 1, list("emergency maintenance access", "enabled"))

/proc/revoke_maint_all_access()
for(var/area/station/maintenance/A in world)
for(var/obj/machinery/door/airlock/D in A)
D.emergency = 0
D.update_icon()
GLOB.minor_announcement.Announce("Access restrictions on maintenance and external airlocks have been re-added.")
GLOB.maint_all_access = 0
SSblackbox.record_feedback("nested tally", "keycard_auths", 1, list("emergency maintenance access", "disabled"))

/proc/make_station_all_access()
for(var/obj/machinery/door/airlock/D in GLOB.airlocks)
if(is_station_level(D.z))
D.emergency = 1
D.update_icon()
GLOB.minor_announcement.Announce("Access restrictions on all station airlocks have been removed due to an ongoing crisis. Trespassing laws still apply unless ordered otherwise by Command staff.")
GLOB.station_all_access = 1
SSblackbox.record_feedback("nested tally", "keycard_auths", 1, list("emergency station access", "enabled"))

/proc/revoke_station_all_access()
for(var/obj/machinery/door/airlock/D in GLOB.airlocks)
if(is_station_level(D.z))
D.emergency = 0
D.update_icon()
GLOB.minor_announcement.Announce("Access restrictions on all station airlocks have been re-added. Seek station AI or a colleague's assistance if you are stuck.")
GLOB.station_all_access = 0
SSblackbox.record_feedback("nested tally", "keycard_auths", 1, list("emergency station access", "disabled"))
1 change: 1 addition & 0 deletions modular_ss220/_misc/_misc.dme
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@
#include "code/icons.dm"
#include "code/pronouns.dm"
#include "code/ss220_general_config.dm"
#include "code/area.dm"
8 changes: 8 additions & 0 deletions modular_ss220/_misc/code/area.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/area/proc/has_power_alarm()
return !poweralm

/area/proc/has_atmos_alarm()
return atmosalm != ATMOS_ALARM_NONE

/area/proc/has_fire_alarm()
return fire
Binary file modified modular_ss220/aesthetics/firealarm/icons/firealarm.dmi
Binary file not shown.
6 changes: 6 additions & 0 deletions modular_ss220/modular_ss220.dme
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@
#include "shuttles/_shuttles.dme"
#include "redis220/_redis220.dme"
#include "robolimbs/_robolimbs.dme"
#include "security_levels/_security_levels.dme"

// --- PRIME --- //
// #define MODPACK_MAIN_ONLY
Expand All @@ -107,3 +108,8 @@
---------------------------------------------------------------------*/

// #include "crit_rework/_crit_rework.dme"

// --- TESTING --- //
#ifdef UNIT_TESTS
#include "unit_tests/_unit_tests.dme"
#endif
1 change: 1 addition & 0 deletions modular_ss220/objects/_objects.dme
Original file line number Diff line number Diff line change
Expand Up @@ -47,3 +47,4 @@
#include "code/components.dm"
#include "code/airlock_painter.dm"
#include "code/animalhide.dm"
#include "code/airlock.dm"
99 changes: 99 additions & 0 deletions modular_ss220/objects/code/airlock.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
#define EMERGENCY_NONE 0
#define EMERGENCY_STATION_WIDE (1<<0)
#define EMERGENCY_MAINTENANCE (1<<1)
#define EMERGENCY_MANUAL (1<<2)
#define EMERGENCY_ALARM (1<<3)

/obj/machinery/door/airlock
var/alarm_sensitive = TRUE
var/emergency_handling = FALSE
var/emergency_reason = EMERGENCY_NONE

/obj/machinery/door/airlock/Initialize()
. = ..()
if(is_station_level(z))
emergency_handling = TRUE
if(has_constant_processing())
START_PROCESSING(SSmachines, src)

/obj/machinery/door/airlock/process()
if(emergency_handling)
if(alarm_sensitive)
var/area/this_area = get_area(src)
if(SSsecurity_level.get_current_level_as_number() == SEC_LEVEL_ORANGE \
&& (this_area.has_power_alarm() || this_area.has_atmos_alarm() || this_area.has_fire_alarm()))
set_emergency_reason(EMERGENCY_ALARM)
else
reset_emergency_reason(EMERGENCY_ALARM)
var/old_emergency = emergency
emergency = emergency_reason != EMERGENCY_NONE
if(emergency != old_emergency)
update_icon()
. = ..()
return has_constant_processing() || .

/obj/machinery/door/airlock/toggle_emergency_status(mob/user)
. = ..()
if(emergency)
set_emergency_reason(EMERGENCY_MANUAL)
else
emergency_handling = FALSE

/obj/machinery/door/airlock/proc/set_emergency_reason(reason)
emergency_handling = TRUE
emergency_reason |= reason

/obj/machinery/door/airlock/proc/reset_emergency_reason(reason)
emergency_handling = TRUE
emergency_reason &= ~reason

/obj/machinery/door/airlock/proc/has_constant_processing()
return alarm_sensitive && is_station_level(z)

/obj/machinery/door/airlock/abductor
alarm_sensitive = FALSE

/obj/machinery/door/airlock/cult
alarm_sensitive = FALSE

/obj/machinery/door/airlock/external
alarm_sensitive = FALSE

/obj/machinery/door/airlock/external_no_weld
alarm_sensitive = FALSE

/obj/machinery/door/airlock/highsecurity
alarm_sensitive = FALSE

/obj/machinery/door/airlock/vault
alarm_sensitive = FALSE

/datum/controller/subsystem/mapping/make_maint_all_access()
for(var/area/station/maintenance/A in existing_station_areas)
for(var/obj/machinery/door/airlock/D in A)
D.set_emergency_reason(EMERGENCY_MAINTENANCE)
. = ..()

/datum/controller/subsystem/mapping/revoke_maint_all_access()
for(var/area/station/maintenance/A in existing_station_areas)
for(var/obj/machinery/door/airlock/D in A)
D.reset_emergency_reason(EMERGENCY_MAINTENANCE)
. = ..()

/datum/controller/subsystem/mapping/make_station_all_access()
for(var/obj/machinery/door/airlock/D in GLOB.airlocks)
if(is_station_level(D.z))
D.set_emergency_reason(EMERGENCY_STATION_WIDE)
. = ..()

/datum/controller/subsystem/mapping/revoke_station_all_access()
for(var/obj/machinery/door/airlock/D in GLOB.airlocks)
if(is_station_level(D.z))
D.reset_emergency_reason(EMERGENCY_STATION_WIDE)
. = ..()

#undef EMERGENCY_NONE
#undef EMERGENCY_STATION_WIDE
#undef EMERGENCY_MAINTENANCE
#undef EMERGENCY_MANUAL
#undef EMERGENCY_ALARM
4 changes: 4 additions & 0 deletions modular_ss220/security_levels/_security_levels.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
/datum/modpack/security_levels
name = "Дополнительные коды на станции"
desc = "Добавляет оранжевый и фиолетовый коды в игру"
author = "Maxiemar"
4 changes: 4 additions & 0 deletions modular_ss220/security_levels/_security_levels.dme
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#include "_security_levels.dm"

#include "code/security_level_datums.dm"
#include "code/SSsecurity_level.dm"
13 changes: 13 additions & 0 deletions modular_ss220/security_levels/code/SSsecurity_level.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
/datum/controller/subsystem/security_level/Initialize()
var/list/sorted_levels = list()
for(var/security_level_type in subtypesof(/datum/security_level))
var/datum/security_level/new_level = new security_level_type
sorted_levels[list("number" = num2text(new_level.number_level, 1), "level" = new_level)] = null // this shit adds list to a list
sorted_levels = sortByKey(sorted_levels, "number")

SSsecurity_level.available_levels.Cut();
for(var/security_level_entry in sorted_levels)
var/datum/security_level/level = security_level_entry["level"]
SSsecurity_level.available_levels[level.name] = level

return ..()
36 changes: 36 additions & 0 deletions modular_ss220/security_levels/code/security_level_datums.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
/**
* VIOLET
*
* Medical threat
*/
/datum/security_level/violet
name = "violet"
number_level = SEC_LEVEL_VIOLET
elevating_to_sound = 'sound/misc/notice1.ogg'
ai_announcement_sound = 'sound/AI/blue.ogg' // TODO: to update
color = "darkviolet"
lowering_to_announcement_title = "ВНИМАНИЕ! Уровень угрозы понижен до ФИОЛЕТОВОГО."
lowering_to_announcement_text = "В настоящее время действуют процедуры Фиолетового кода. Медицинский персонал должен получить распоряжения от руководителя отдела. Немедицинский персонал обязан выполнять все соответствующие инструкции медицинского персонала."
elevating_to_announcement_title = "Внимание! Уровень угрозы повышен до ФИОЛЕТОВОГО."
elevating_to_announcement_text = "Возникла серьезная медицинская угроза экипажу станции. Медицинский персонал должен получить распоряжения от руководителя отдела. Немедицинский персонал обязан выполнять все соответствующие инструкции медицинского персонала."

/**
* ORANGE
*
* Engineering emergency
*/
/datum/security_level/orange
name = "orange"
number_level = SEC_LEVEL_ORANGE
elevating_to_sound = 'sound/misc/notice1.ogg'
ai_announcement_sound = 'sound/AI/blue.ogg' // TODO: to update
color = "gold"
lowering_to_announcement_title = "ВНИМАНИЕ! Уровень угрозы понижен до ОРАНЖЕВОГО."
lowering_to_announcement_text = "В настоящее время действуют процедуры Оранжевого кода. Инженерный персонал должен получить распоряжения от руководителя отдела. Неинженерный персонал обязан покинуть аварийные помещения и выполнять все соответствующие инструкции инженерного персонала."
elevating_to_announcement_title = "Внимание! Уровень угрозы повышен до ОРАНЖЕВОГО."
elevating_to_announcement_text = "Произошла серьезная техническая авария. Инженерный персонал должен получить распоряжения от руководителя отдела. Неинженерный персонал обязан покинуть аварийные помещения и выполнять все соответствующие инструкции инженерного персонала."

/datum/security_level/orange/pre_change()
for(var/obj/machinery/door/airlock/D in GLOB.airlocks)
if(is_station_level(D.z))
D.emergency_handling = TRUE
4 changes: 4 additions & 0 deletions modular_ss220/unit_tests/_unit_tests.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
/datum/modpack/unit_tests
name = "Тестирование"
desc = "Здесь тестируется все, что стоит протестировать"
author = "Maxiemar"
3 changes: 3 additions & 0 deletions modular_ss220/unit_tests/_unit_tests.dme
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#include "_unit_tests.dm"

#include "code/security_levels.dm"
Loading
Loading