diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm
index bdd5ac8e110..5b460ff9340 100644
--- a/code/__DEFINES/layers.dm
+++ b/code/__DEFINES/layers.dm
@@ -110,37 +110,44 @@
#define LIGHTING_PLANE 15
#define LIGHTING_LAYER 15
-#define RAD_TEXT_LAYER 15.1
+#define LIGHTING_LAMPS_GLARE 16 // Light glare (optional setting)
+#define LIGHTING_EXPOSURE_PLANE 17 // Light sources "cones"
+#define LIGHTING_LAMPS_SELFGLOW 18 // Light sources glow (lamps, doors overlay, etc.)
+#define LIGHTING_LAMPS_PLANE 19 // Light sources themselves (lamps, screens, etc.)
-#define ABOVE_LIGHTING_PLANE 16
-#define ABOVE_LIGHTING_LAYER 16
+#define LIGHTING_LAMPS_RENDER_TARGET "*LIGHTING_LAMPS_RENDER_TARGET"
-#define FLOOR_OPENSPACE_PLANE 17
-#define OPENSPACE_LAYER 17
+#define RAD_TEXT_LAYER 19.1
-#define BYOND_LIGHTING_PLANE 18
-#define BYOND_LIGHTING_LAYER 18
+#define ABOVE_LIGHTING_PLANE 20
+#define ABOVE_LIGHTING_LAYER 20
-#define CAMERA_STATIC_PLANE 19
-#define CAMERA_STATIC_LAYER 19
+#define FLOOR_OPENSPACE_PLANE 21
+#define OPENSPACE_LAYER 21
+
+#define BYOND_LIGHTING_PLANE 22
+#define BYOND_LIGHTING_LAYER 22
+
+#define CAMERA_STATIC_PLANE 23
+#define CAMERA_STATIC_LAYER 23
//HUD layer defines
-#define FULLSCREEN_PLANE 20
-#define FLASH_LAYER 20
-#define FULLSCREEN_LAYER 20.1
-#define UI_DAMAGE_LAYER 20.2
-#define BLIND_LAYER 20.3
-#define CRIT_LAYER 20.4
-#define CURSE_LAYER 20.5
+#define FULLSCREEN_PLANE 24
+#define FLASH_LAYER 24
+#define FULLSCREEN_LAYER 24.1
+#define UI_DAMAGE_LAYER 24.2
+#define BLIND_LAYER 24.3
+#define CRIT_LAYER 24.4
+#define CURSE_LAYER 24.5
-#define HUD_PLANE 21
-#define HUD_LAYER 21
-#define ABOVE_HUD_PLANE 22
-#define ABOVE_HUD_LAYER 22
+#define HUD_PLANE 25
+#define HUD_LAYER 25
+#define ABOVE_HUD_PLANE 26
+#define ABOVE_HUD_LAYER 26
-#define SPLASHSCREEN_LAYER 23
-#define SPLASHSCREEN_PLANE 23
+#define SPLASHSCREEN_LAYER 27
+#define SPLASHSCREEN_PLANE 27
#define HUD_PLANE_BUILDMODE 30
diff --git a/code/__DEFINES/preferences_defines.dm b/code/__DEFINES/preferences_defines.dm
index 162df1bb973..f4fc5baecb5 100644
--- a/code/__DEFINES/preferences_defines.dm
+++ b/code/__DEFINES/preferences_defines.dm
@@ -13,6 +13,12 @@
#define SOUND_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|SOUND_HEARTBEAT|SOUND_BUZZ|SOUND_INSTRUMENTS|SOUND_MENTORHELP|SOUND_DISCO|SOUND_AI_VOICE|SOUND_PRAYERNOTIFY)
+#define LIGHT_NEW_LIGHTING (1<<0)
+#define LIGHT_EXPOSURE (1<<1)
+#define LIGHT_GLARE (1<<2)
+
+#define LIGHT_DEFAULT (LIGHT_NEW_LIGHTING|LIGHT_EXPOSURE|LIGHT_GLARE)
+
#define PREFTOGGLE_CHAT_OOC (1<<0)
#define PREFTOGGLE_CHAT_DEAD (1<<1)
#define PREFTOGGLE_CHAT_GHOSTEARS (1<<2)
@@ -92,10 +98,12 @@
#define PREFTOGGLE_SPECIAL 0
/// Interacts with the sound bitflag
#define PREFTOGGLE_SOUND 1
+/// Interacts with the light bitflag
+#define PREFTOGGLE_LIGHT 2
/// Interacts with the toggles bitflag
-#define PREFTOGGLE_TOGGLE1 2
+#define PREFTOGGLE_TOGGLE1 3
/// Interacts with the toggles2 bitflag
-#define PREFTOGGLE_TOGGLE2 3
+#define PREFTOGGLE_TOGGLE2 4
// Admin attack logs filter system, see /proc/add_attack_logs and /proc/msg_admin_attack
@@ -121,6 +129,12 @@
#define EXP_DEPT_TYPE_LIST list(EXP_TYPE_SUPPLY, EXP_TYPE_SERVICE, EXP_TYPE_MEDICAL, EXP_TYPE_ENGINEERING, EXP_TYPE_SCIENCE, EXP_TYPE_SECURITY, EXP_TYPE_COMMAND, EXP_TYPE_SILICON, EXP_TYPE_SPECIAL, EXP_TYPE_GHOST)
+// Defines for the glow level preference for the lighting.
+#define GLOW_HIGH 0
+#define GLOW_MED 1 // Default.
+#define GLOW_LOW 2
+#define GLOW_DISABLE 3
+
// Defines just for parallax because its levels make storing it in the regular prefs a pain in the ass
// These dont need to be bitflags because there isnt going to be more than one at a time of these active
// But its gonna piss off my OCD if it isnt bitflags, so deal with it, -affected
diff --git a/code/__HELPERS/filters.dm b/code/__HELPERS/filters.dm
index 9550f4c9bfc..c086658a614 100644
--- a/code/__HELPERS/filters.dm
+++ b/code/__HELPERS/filters.dm
@@ -321,3 +321,13 @@ GLOBAL_LIST_INIT(master_filter_info, list(
/atom/proc/ray_filter_helper(_priority = 1, _size = 40, _color = "#FFFFFF", _factor = 6, _density = 20, _y = 0)
add_filter(name = "ray", priority = _priority, params = list(type = "rays", size = _size, color = _color , factor = _factor, density = _density, y = _y))
+/proc/bloom_filter(threshold, size, offset, alpha)
+ . = list("type" = "bloom")
+ if(!isnull(threshold))
+ .["threshold"] = threshold
+ if(!isnull(size))
+ .["size"] = size
+ if(!isnull(offset))
+ .["offset"] = offset
+ if(!isnull(alpha))
+ .["alpha"] = alpha
diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index 174ecddda53..50618189a48 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -142,7 +142,7 @@
for(var/path in subtypesof(/datum/preference_toggle))
var/datum/preference_toggle/pref_toggle = path
if(initial(pref_toggle.name))
- GLOB.preference_toggles += new path()
+ GLOB.preference_toggles[path] = new path()
for(var/path in subtypesof(/datum/objective))
var/datum/objective/O = path
diff --git a/code/__HELPERS/matrices.dm b/code/__HELPERS/matrices.dm
index e77b730404a..08a9967b7c1 100644
--- a/code/__HELPERS/matrices.dm
+++ b/code/__HELPERS/matrices.dm
@@ -1,3 +1,8 @@
+// Brightness (Luminance) of RGB on grayscale. Used for saturation matrix
+#define LUM_R 0.3086 // or 0.2125
+#define LUM_G 0.6094 // or 0.7154
+#define LUM_B 0.0820 // or 0.0721
+
/matrix/proc/TurnTo(old_angle, new_angle)
. = new_angle - old_angle
Turn(.) //BYOND handles cases such as -270, 360, 540 etc. DOES NOT HANDLE 180 TURNS WELL, THEY TWEEN AND LOOK LIKE SHIT
@@ -63,3 +68,111 @@
//The Y pixel offset of this matrix
/matrix/proc/get_y_shift()
. = f
+
+/// A color matrix allows us to set the color of an atom in a list form, thus allowing us to change color in more flexible ways. For example, we can set the brightness and contrast of the bloom and exposure of lamps
+/datum/color_matrix
+ var/list/matrix
+
+/// Value can be color as text (e.g. "#735184") that will set matrix to be the same color / number that will set the saturation of matrix / the color list itself, contrast as number, brightness as number
+/datum/color_matrix/New(value, contrast = 1, brightness = null)
+ ..()
+ if(istext(value))
+ set_color(value, contrast, brightness)
+ else if(isnum(value))
+ set_saturation(value, contrast, brightness)
+ else
+ matrix = value
+
+/datum/color_matrix/proc/reset()
+ matrix = list(1, 0, 0,
+ 0, 1, 0,
+ 0, 0, 1)
+
+/datum/color_matrix/proc/get(contrast = 1)
+ var/list/mat = matrix
+ mat = mat.Copy()
+
+ for(var/i = 1 to min(length(mat), 12))
+ mat[i] *= contrast
+ return mat
+
+/datum/color_matrix/proc/set_saturation(saturation, contrast = 1, brightness = null)
+ var/r_adjustment = (1 - saturation) * LUM_R
+ var/g_adjustment = (1 - saturation) * LUM_G
+ var/b_adjustment = (1 - saturation) * LUM_B
+
+ matrix = list(contrast * (r_adjustment + saturation), contrast * (r_adjustment), contrast * (r_adjustment),
+ contrast * (g_adjustment), contrast * (g_adjustment + saturation), contrast * (g_adjustment),
+ contrast * (b_adjustment), contrast * (b_adjustment), contrast * (b_adjustment + saturation))
+ set_brightness(brightness)
+
+/datum/color_matrix/proc/set_brightness(brightness)
+ if(isnull(brightness))
+ return
+
+ if(!matrix)
+ reset()
+
+ var/matrix_length = length(matrix)
+
+ // Here we have CCM matrix of type:
+ // | rr rg rb |
+ // | gr gg gb |
+ // | br bg bb |
+ // with no brightness row, just append it.
+ if(matrix_length == 9)
+ matrix += list(brightness, brightness, brightness)
+ return
+
+ // Here we have CCM matrix of type:
+ // | rr rg rb ra |
+ // | gr gg gb ga |
+ // | br bg bb ba |
+ // | ar ag ab aa |
+ // with no brightness row, just append it.
+ if(matrix_length == 16)
+ matrix += list(brightness, brightness, brightness, 0)
+ return
+
+ // We already have brightness row, just override.
+ if(matrix_length == 12)
+ for(var/i = matrix_length to matrix_length - 3 step -1)
+ matrix[i] = brightness
+ return
+
+ // Just brightness matrix, override.
+ if(matrix_length == 3)
+ for(var/i = 1 to matrix_length)
+ matrix[i] = brightness
+ return
+
+ CRASH("Couldn't figure out how to apply brightness to a matrix of length: [matrix_length]")
+
+/// Handles values from 00 to FF.
+/datum/color_matrix/proc/hex2value(hex)
+ var/const/radix = 16
+ var/num1 = text2num(hex[1], radix)
+ var/num2 = text2num(hex[2], radix)
+ if(!isnum(num1) || !isnum(num2))
+ CRASH("Invalid hex value: [hex]")
+
+ return num1 * radix + num2
+
+/datum/color_matrix/proc/set_color(color_hex, contrast = 1, brightness = null)
+ var/rr = hex2value(copytext(color_hex, 2, 4)) / 255
+ var/gg = hex2value(copytext(color_hex, 4, 6)) / 255
+ var/bb = hex2value(copytext(color_hex, 6, 8)) / 255
+
+ rr = round(rr * 1000) / 1000 * contrast
+ gg = round(gg * 1000) / 1000 * contrast
+ bb = round(bb * 1000) / 1000 * contrast
+
+ matrix = list(rr, gg, bb,
+ rr, gg, bb,
+ rr, gg, bb)
+
+ set_brightness(brightness)
+
+#undef LUM_R
+#undef LUM_G
+#undef LUM_B
diff --git a/code/_onclick/hud/plane_master.dm b/code/_onclick/hud/plane_master.dm
index bc7ae0dca0f..4ac17efb7f9 100644
--- a/code/_onclick/hud/plane_master.dm
+++ b/code/_onclick/hud/plane_master.dm
@@ -110,3 +110,82 @@
plane = SMOKE_PLANE
appearance_flags = PLANE_MASTER
blend_mode = BLEND_OVERLAY
+
+/atom/movable/screen/plane_master/lamps
+ name = "lamps plane master"
+ plane = LIGHTING_LAMPS_PLANE
+ blend_mode = BLEND_OVERLAY
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
+ render_target = LIGHTING_LAMPS_RENDER_TARGET
+
+/atom/movable/screen/plane_master/exposure
+ name = "exposure plane master"
+ plane = LIGHTING_EXPOSURE_PLANE
+ appearance_flags = parent_type::appearance_flags | PIXEL_SCALE //should use client color
+ blend_mode = BLEND_ADD
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
+
+/atom/movable/screen/plane_master/exposure/backdrop(mob/mymob)
+ remove_filter("blur_exposure")
+ if(!istype(mymob) || !(mymob?.client?.prefs?.light & LIGHT_NEW_LIGHTING))
+ return
+ var/enabled = mymob?.client?.prefs?.light & LIGHT_EXPOSURE
+
+ if(enabled)
+ alpha = 255
+ add_filter("blur_exposure", 1, gauss_blur_filter(size = 20)) // by refs such blur is heavy, but tests were okay and this allow us more flexibility with setup. Possible point for improvements
+ else
+ alpha = 0
+
+/atom/movable/screen/plane_master/lamps_selfglow
+ name = "lamps selfglow plane master"
+ plane = LIGHTING_LAMPS_SELFGLOW
+ appearance_flags = PLANE_MASTER //should use client color
+ blend_mode = BLEND_ADD
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
+
+/atom/movable/screen/plane_master/lamps_selfglow/backdrop(mob/mymob)
+ remove_filter("add_lamps_to_selfglow")
+ remove_filter("lamps_selfglow_bloom")
+
+ if(!istype(mymob) || !(mymob?.client?.prefs?.light & LIGHT_NEW_LIGHTING))
+ return
+ var/level = mymob?.client?.prefs?.glowlevel
+
+ if(isnull(level))
+ return
+ var/bloomsize = 0
+ var/bloomoffset = 0
+ switch(level)
+ if(GLOW_LOW)
+ bloomsize = 2
+ bloomoffset = 1
+ if(GLOW_MED)
+ bloomsize = 3
+ bloomoffset = 2
+ if(GLOW_HIGH)
+ bloomsize = 5
+ bloomoffset = 3
+ else
+ return
+
+ add_filter("add_lamps_to_selfglow", 1, layering_filter(render_source = LIGHTING_LAMPS_RENDER_TARGET, blend_mode = BLEND_OVERLAY))
+ add_filter("lamps_selfglow_bloom", 1, bloom_filter(threshold = "#777777", size = bloomsize, offset = bloomoffset, alpha = 80))
+
+/atom/movable/screen/plane_master/lamps_glare
+ name = "lamps glare plane master"
+ plane = LIGHTING_LAMPS_GLARE
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
+
+/atom/movable/screen/plane_master/lamps_glare/backdrop(mob/mymob)
+ remove_filter("add_lamps_to_glare")
+ remove_filter("lamps_glare")
+
+ if(!istype(mymob) || !(mymob?.client?.prefs?.light & LIGHT_NEW_LIGHTING))
+ return
+
+ var/enabled = mymob?.client?.prefs?.light & LIGHT_GLARE
+
+ if(enabled)
+ add_filter("add_lamps_to_glare", 1, layering_filter(render_source = LIGHTING_LAMPS_RENDER_TARGET, blend_mode = BLEND_ADD))
+ add_filter("lamps_glare", 1, radial_blur_filter(size = 0.035))
diff --git a/code/_onclick/hud/plane_master_controller.dm b/code/_onclick/hud/plane_master_controller.dm
index c5bbbb743d2..1e3d317fc1a 100644
--- a/code/_onclick/hud/plane_master_controller.dm
+++ b/code/_onclick/hud/plane_master_controller.dm
@@ -74,4 +74,14 @@
/atom/movable/plane_master_controller/game
name = PLANE_MASTERS_GAME
- controlled_planes = list(FLOOR_PLANE, GAME_PLANE, LIGHTING_PLANE, PLANE_SPACE_PARALLAX, PLANE_SPACE)
+ controlled_planes = list(
+ FLOOR_PLANE,
+ GAME_PLANE,
+ LIGHTING_PLANE,
+ PLANE_SPACE_PARALLAX,
+ PLANE_SPACE,
+ LIGHTING_EXPOSURE_PLANE,
+ LIGHTING_LAMPS_SELFGLOW,
+ LIGHTING_LAMPS_PLANE,
+ LIGHTING_LAMPS_GLARE
+ )
diff --git a/code/controllers/configuration/configuration_core.dm b/code/controllers/configuration/configuration_core.dm
index 0ace31c5bd8..8619c03c26c 100644
--- a/code/controllers/configuration/configuration_core.dm
+++ b/code/controllers/configuration/configuration_core.dm
@@ -22,6 +22,8 @@ GLOBAL_DATUM_INIT(configuration, /datum/server_configuration, new())
var/datum/configuration_section/gamemode_configuration/gamemode
/// Holder for the general configuration datum
var/datum/configuration_section/general_configuration/general
+ /// Holder for the lighting effects configuration datum
+ var/datum/configuration_section/lighting_effects_configuration/lighting_effects
/// Holder for the IPIntel configuration datum
var/datum/configuration_section/ipintel_configuration/ipintel
/// Holder for the job configuration datum
@@ -82,6 +84,7 @@ GLOBAL_DATUM_INIT(configuration, /datum/server_configuration, new())
event = new()
gamemode = new()
general = new()
+ lighting_effects = new()
ipintel = new()
jobs = new()
logging = new()
@@ -120,6 +123,7 @@ GLOBAL_DATUM_INIT(configuration, /datum/server_configuration, new())
safe_load(event, "event_configuration")
safe_load(gamemode, "gamemode_configuration")
safe_load(general, "general_configuration")
+ safe_load(lighting_effects, "lighting_effects_configuration")
safe_load(ipintel, "ipintel_configuration")
safe_load(jobs, "job_configuration")
safe_load(logging, "logging_configuration")
diff --git a/code/controllers/configuration/sections/lighting_effects_configuration.dm b/code/controllers/configuration/sections/lighting_effects_configuration.dm
new file mode 100644
index 00000000000..c173497d429
--- /dev/null
+++ b/code/controllers/configuration/sections/lighting_effects_configuration.dm
@@ -0,0 +1,29 @@
+/// Config holder for all ligting effect related things
+/datum/configuration_section/lighting_effects_configuration
+ /// Brightness of bloom effect independent of light_power
+ var/glow_brightness_base = 0
+ /// Brightness of bloom effect that depends on light_power
+ var/glow_brightness_power = -0.25
+ /// Contrast of bloom effect independent of light_power
+ var/glow_contrast_base = 0
+ /// Contrast of bloom effect that depends on light_power
+ var/glow_contrast_power = 0.5
+ /// Brightness of exposure effect independent of light_power
+ var/exposure_brightness_base = 0.01
+ /// Brightness of exposure effect that depends on light_power
+ var/exposure_brightness_power = 0
+ /// Contrast of exposure effect independent of light_power
+ var/exposure_contrast_base = 9.5
+ /// Contrast of exposure effect that depends on light_power
+ var/exposure_contrast_power = 0
+
+/datum/configuration_section/lighting_effects_configuration/load_data(list/data)
+ // Use the load wrappers here. That way the default isnt made 'null' if you comment out the config line
+ CONFIG_LOAD_NUM(glow_brightness_base, data["glow_brightness_base"])
+ CONFIG_LOAD_NUM(glow_brightness_power, data["glow_brightness_power"])
+ CONFIG_LOAD_NUM(glow_contrast_base, data["glow_contrast_base"])
+ CONFIG_LOAD_NUM(glow_contrast_power, data["glow_contrast_power"])
+ CONFIG_LOAD_NUM(exposure_brightness_base, data["exposure_brightness_base"])
+ CONFIG_LOAD_NUM(exposure_brightness_power, data["exposure_brightness_power"])
+ CONFIG_LOAD_NUM(exposure_contrast_base, data["exposure_contrast_base"])
+ CONFIG_LOAD_NUM(exposure_contrast_power, data["exposure_contrast_power"])
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 78d92c6673d..1ea76eade0a 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -104,6 +104,17 @@
var/tmp/datum/light_source/light
// Any light sources that are "inside" of us, for example, if src here was a mob that's carrying a flashlight, that flashlight's light source would be part of this list.
var/tmp/list/light_sources
+ // Variables for bloom and exposure
+ var/glow_icon = 'icons/obj/lamps.dmi'
+ var/exposure_icon = 'icons/effects/exposures.dmi'
+
+ var/glow_icon_state
+ var/glow_colored = TRUE
+ var/exposure_icon_state
+ var/exposure_colored = TRUE
+
+ var/image/glow_overlay
+ var/image/exposure_overlay
/// The alternate appearances we own. Lazylist
var/list/alternate_appearances
/// The alternate appearances we're viewing, stored here to reestablish them after Logout()s. Lazylist
diff --git a/code/game/machinery/computer/camera_console.dm b/code/game/machinery/computer/camera_console.dm
index ae5764d4da3..4fb418a35b7 100644
--- a/code/game/machinery/computer/camera_console.dm
+++ b/code/game/machinery/computer/camera_console.dm
@@ -40,11 +40,7 @@
cam_screen.screen_loc = "[map_name]:1,1"
cam_plane_masters = list()
for(var/plane in subtypesof(/atom/movable/screen/plane_master))
- var/atom/movable/screen/instance = new plane()
- instance.assigned_map = map_name
- instance.del_on_map_removal = FALSE
- instance.screen_loc = "[map_name]:CENTER"
- cam_plane_masters += instance
+ cam_plane_masters += plane
cam_background = new
cam_background.assigned_map = map_name
cam_background.del_on_map_removal = FALSE
@@ -79,7 +75,13 @@
// Register map objects
user.client.register_map_obj(cam_screen)
for(var/plane in cam_plane_masters)
- user.client.register_map_obj(plane)
+ var/atom/movable/screen/plane_master/instance = new plane()
+ instance.assigned_map = map_name
+ instance.del_on_map_removal = FALSE
+ instance.screen_loc = "[map_name]:CENTER"
+ instance.backdrop(user)
+
+ user.client.register_map_obj(instance)
user.client.register_map_obj(cam_background)
// Open UI
ui = new(user, src, "CameraConsole", name)
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 249816bc388..fce20414789 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -176,7 +176,8 @@ GLOBAL_LIST_INIT(admin_verbs_debug, list(
/client/proc/teleport_interesting_turf,
/client/proc/visualize_interesting_turfs,
/client/proc/profile_code,
- /client/proc/debug_atom_init
+ /client/proc/debug_atom_init,
+ /client/proc/debug_bloom
))
GLOBAL_LIST_INIT(admin_verbs_possess, list(
/proc/possess,
diff --git a/code/modules/admin/verbs/bloom_edit.dm b/code/modules/admin/verbs/bloom_edit.dm
new file mode 100644
index 00000000000..864c7f17911
--- /dev/null
+++ b/code/modules/admin/verbs/bloom_edit.dm
@@ -0,0 +1,71 @@
+/client/proc/debug_bloom()
+ set name = "Bloom Edit"
+ set category = "Debug"
+
+ if(!check_rights(R_DEBUG))
+ return
+ var/datum/bloom_edit/editor = new()
+ editor.ui_interact(usr)
+
+ message_admins("[key_name(src)] opened Bloom Edit panel.")
+ log_admin("[key_name(src)] opened Bloom Edit panel.")
+
+/datum/bloom_edit
+
+/datum/bloom_edit/ui_interact(mob/user, datum/tgui/ui = null)
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "BloomEdit", "Bloom Edit")
+ ui.open()
+
+/datum/bloom_edit/ui_data(mob/user)
+ var/list/data = list()
+
+ data["glow_brightness_base"] = GLOB.configuration.lighting_effects.glow_brightness_base
+ data["glow_brightness_power"] = GLOB.configuration.lighting_effects.glow_brightness_power
+ data["glow_contrast_base"] = GLOB.configuration.lighting_effects.glow_contrast_base
+ data["glow_contrast_power"] = GLOB.configuration.lighting_effects.glow_contrast_power
+ data["exposure_brightness_base"] = GLOB.configuration.lighting_effects.exposure_brightness_base
+ data["exposure_brightness_power"] = GLOB.configuration.lighting_effects.exposure_brightness_power
+ data["exposure_contrast_base"] = GLOB.configuration.lighting_effects.exposure_contrast_base
+ data["exposure_contrast_power"] = GLOB.configuration.lighting_effects.exposure_contrast_power
+ return data
+
+/datum/bloom_edit/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
+ . = ..()
+ if(.)
+ return
+ switch(action)
+ if("glow_brightness_base")
+ GLOB.configuration.lighting_effects.glow_brightness_base = clamp(params["value"], -10, 10)
+ if("glow_brightness_power")
+ GLOB.configuration.lighting_effects.glow_brightness_power = clamp(params["value"], -10, 10)
+ if("glow_contrast_base")
+ GLOB.configuration.lighting_effects.glow_contrast_base = clamp(params["value"], -10, 10)
+ if("glow_contrast_power")
+ GLOB.configuration.lighting_effects.glow_contrast_power = clamp(params["value"], -10, 10)
+ if("exposure_brightness_base")
+ GLOB.configuration.lighting_effects.exposure_brightness_base = clamp(params["value"], -10, 10)
+ if("exposure_brightness_power")
+ GLOB.configuration.lighting_effects.exposure_brightness_power = clamp(params["value"], -10, 10)
+ if("exposure_contrast_base")
+ GLOB.configuration.lighting_effects.exposure_contrast_base = clamp(params["value"], -10, 10)
+ if("exposure_contrast_power")
+ GLOB.configuration.lighting_effects.exposure_contrast_power = clamp(params["value"], -10, 10)
+ if("default")
+ GLOB.configuration.lighting_effects.glow_brightness_base = initial(GLOB.configuration.lighting_effects.glow_brightness_base)
+ GLOB.configuration.lighting_effects.glow_brightness_power = initial(GLOB.configuration.lighting_effects.glow_brightness_power)
+ GLOB.configuration.lighting_effects.glow_contrast_base = initial(GLOB.configuration.lighting_effects.glow_contrast_base)
+ GLOB.configuration.lighting_effects.glow_contrast_power = initial(GLOB.configuration.lighting_effects.glow_contrast_power)
+ GLOB.configuration.lighting_effects.exposure_brightness_base = initial(GLOB.configuration.lighting_effects.exposure_brightness_base)
+ GLOB.configuration.lighting_effects.exposure_brightness_power = initial(GLOB.configuration.lighting_effects.exposure_brightness_power)
+ GLOB.configuration.lighting_effects.exposure_contrast_base = initial(GLOB.configuration.lighting_effects.exposure_contrast_base)
+ GLOB.configuration.lighting_effects.exposure_contrast_power = initial(GLOB.configuration.lighting_effects.exposure_contrast_power)
+ if("update_lamps")
+ for(var/obj/machinery/light/L in GLOB.machines)
+ if(L.glow_overlay || L.exposure_overlay)
+ L.update_bloom()
+ return TRUE
+
+/datum/bloom_edit/ui_state(mob/user)
+ return GLOB.admin_state
diff --git a/code/modules/client/login_processing/10-load_preferences.dm b/code/modules/client/login_processing/10-load_preferences.dm
index 94ff3027223..0ef03d03c4c 100644
--- a/code/modules/client/login_processing/10-load_preferences.dm
+++ b/code/modules/client/login_processing/10-load_preferences.dm
@@ -14,6 +14,8 @@
toggles,
toggles_2,
sound,
+ light,
+ glowlevel,
volume_mixer,
lastchangelog,
exp,
diff --git a/code/modules/client/preference/link_processing.dm b/code/modules/client/preference/link_processing.dm
index 961b6394074..4d75ceea471 100644
--- a/code/modules/client/preference/link_processing.dm
+++ b/code/modules/client/preference/link_processing.dm
@@ -896,7 +896,6 @@
return
switch(newgender)
if("Male")
-
active_character.gender = MALE
if("Female")
active_character.gender = FEMALE
@@ -954,6 +953,22 @@
if("ghost_att_anim")
toggles2 ^= PREFTOGGLE_2_ITEMATTACK
+ if("enablelighting")
+ var/datum/preference_toggle/special_toggle/toggle = GLOB.preference_toggles[/datum/preference_toggle/toggle_new_lighting]
+ toggle.set_toggles(user.client)
+
+ if("glowlevel")
+ var/datum/preference_toggle/special_toggle/toggle = GLOB.preference_toggles[/datum/preference_toggle/special_toggle/set_glow_level]
+ toggle.set_toggles(user.client)
+
+ if("exposure")
+ var/datum/preference_toggle/special_toggle/toggle = GLOB.preference_toggles[/datum/preference_toggle/toggle_lamp_exposure]
+ toggle.set_toggles(user.client)
+
+ if("glare")
+ var/datum/preference_toggle/special_toggle/toggle = GLOB.preference_toggles[/datum/preference_toggle/toggle_lamps_glare]
+ toggle.set_toggles(user.client)
+
if("winflash")
toggles2 ^= PREFTOGGLE_2_WINDOWFLASHING
diff --git a/code/modules/client/preference/preferences.dm b/code/modules/client/preference/preferences.dm
index bb2816be556..1c27e42e130 100644
--- a/code/modules/client/preference/preferences.dm
+++ b/code/modules/client/preference/preferences.dm
@@ -63,11 +63,15 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts
var/toggles = TOGGLES_DEFAULT
var/toggles2 = TOGGLES_2_DEFAULT // Created because 1 column has a bitflag limit of 24 (BYOND limitation not MySQL)
var/sound = SOUND_DEFAULT
+ var/light = LIGHT_DEFAULT
+ /// Glow level for the lighting. Takes values from GLOW_HIGH to GLOW_DISABLE.
+ var/glowlevel = GLOW_MED
var/UI_style_color = "#ffffff"
var/UI_style_alpha = 255
var/clientfps = 63
var/atklog = ATKLOG_ALL
- var/fuid // forum userid
+ /// Forum userid
+ var/fuid
/// Volume mixer, indexed by channel as TEXT (numerical indexes will not work). Volume goes from 0 to 100.
var/list/volume_mixer = list(
@@ -437,6 +441,23 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts
dat += "View Range: [viewrange]
"
dat += "Window Flashing: [(toggles2 & PREFTOGGLE_2_WINDOWFLASHING) ? "Yes" : "No"]
"
dat += "Modsuit Activation Method: [(toggles2 & PREFTOGGLE_2_MOD_ACTIVATION_METHOD) ? "Middle Click" : "Alt Click"]
"
+ dat += "Lighting settings:
"
+ dat += " - New Lighting: [(light & LIGHT_NEW_LIGHTING) ? "Yes" : "No"]
"
+ dat += " - Glow Level: "
+ switch(glowlevel)
+ if(GLOW_LOW)
+ dat += "Low"
+ if(GLOW_MED)
+ dat += "Medium"
+ if(GLOW_HIGH)
+ dat += "High"
+ if(GLOW_DISABLE)
+ dat += "Disabled"
+ else
+ dat += "Medium"
+ dat += "
"
+ dat += " - Lamp Exposure: [(light & LIGHT_EXPOSURE) ? "Yes" : "No"]
"
+ dat += " - Lamp Glare: [(light & LIGHT_GLARE) ? "Yes" : "No"]
"
// RIGHT SIDE OF THE PAGE
dat += "
m;)u[m]=l[m++];return u}return S}(),k)},74188:function(w,r,n){"use strict";var e=n(72951),a=n(67480).some,t=e.aTypedArray,o=e.exportTypedArrayMethod;o("some",function(){function f(V){return a(t(this),V,arguments.length>1?arguments[1]:void 0)}return f}())},81976:function(w,r,n){"use strict";var e=n(40224),a=n(85067),t=n(41746),o=n(97361),f=n(44815),V=n(72951),k=n(49847),S=n(56605),b=n(82709),h=n(53125),l=V.aTypedArray,c=V.exportTypedArrayMethod,m=e.Uint16Array,d=m&&a(m.prototype.sort),u=!!d&&!(t(function(){d(new m(2),null)})&&t(function(){d(new m(2),{})})),s=!!d&&!t(function(){if(b)return b<74;if(k)return k<67;if(S)return!0;if(h)return h<602;var C=new m(516),v=Array(516),g,p;for(g=0;g<516;g++)p=g%4,C[g]=515-g,v[g]=g-2*p+3;for(d(C,function(N,y){return(N/4|0)-(y/4|0)}),g=0;g<516;g++)if(C[g]!==v[g])return!0}),i=function(v){return function(g,p){return v!==void 0?+v(g,p)||0:p!==p?-1:g!==g?1:g===0&&p===0?1/g>0&&1/p<0?1:-1:g>p}};c("sort",function(){function C(v){return v!==void 0&&o(v),s?d(this,v):f(l(this),i(v))}return C}(),!s||u)},78651:function(w,r,n){"use strict";var e=n(72951),a=n(10475),t=n(74067),o=n(489),f=e.aTypedArray,V=e.exportTypedArrayMethod;V("subarray",function(){function k(S,b){var h=f(this),l=h.length,c=t(S,l),m=o(h);return new m(h.buffer,h.byteOffset+c*h.BYTES_PER_ELEMENT,a((b===void 0?l:t(b,l))-c))}return k}())},81664:function(w,r,n){"use strict";var e=n(40224),a=n(70918),t=n(72951),o=n(41746),f=n(77713),V=e.Int8Array,k=t.aTypedArray,S=t.exportTypedArrayMethod,b=[].toLocaleString,h=!!V&&o(function(){b.call(new V(1))}),l=o(function(){return[1,2].toLocaleString()!==new V([1,2]).toLocaleString()})||!o(function(){V.prototype.toLocaleString.call([1,2])});S("toLocaleString",function(){function c(){return a(b,h?f(k(this)):k(this),f(arguments))}return c}(),l)},35579:function(w,r,n){"use strict";var e=n(72951).exportTypedArrayMethod,a=n(41746),t=n(40224),o=n(18161),f=t.Uint8Array,V=f&&f.prototype||{},k=[].toString,S=o([].join);a(function(){k.call({})})&&(k=function(){function h(){return S(this)}return h}());var b=V.toString!==k;e("toString",k,b)},99683:function(w,r,n){"use strict";var e=n(12218);e("Uint16",function(a){return function(){function t(o,f,V){return a(this,o,f,V)}return t}()})},80941:function(w,r,n){"use strict";var e=n(12218);e("Uint32",function(a){return function(){function t(o,f,V){return a(this,o,f,V)}return t}()})},45338:function(w,r,n){"use strict";var e=n(12218);e("Uint8",function(a){return function(){function t(o,f,V){return a(this,o,f,V)}return t}()})},40737:function(w,r,n){"use strict";var e=n(12218);e("Uint8",function(a){return function(){function t(o,f,V){return a(this,o,f,V)}return t}()},!0)},74283:function(w,r,n){"use strict";var e=n(56255),a=n(40224),t=n(18161),o=n(13648),f=n(29126),V=n(93439),k=n(32920),S=n(56831),b=n(35086).enforce,h=n(41746),l=n(90777),c=Object,m=Array.isArray,d=c.isExtensible,u=c.isFrozen,s=c.isSealed,i=c.freeze,C=c.seal,v=!a.ActiveXObject&&"ActiveXObject"in a,g,p=function(E){return function(){function M(){return E(this,arguments.length?arguments[0]:void 0)}return M}()},N=V("WeakMap",p,k),y=N.prototype,B=t(y.set),I=function(){return e&&h(function(){var E=i([]);return B(new N,E,1),!u(E)})};if(l)if(v){g=k.getConstructor(p,"WeakMap",!0),f.enable();var L=t(y.delete),T=t(y.has),A=t(y.get);o(y,{delete:function(){function x(E){if(S(E)&&!d(E)){var M=b(this);return M.frozen||(M.frozen=new g),L(this,E)||M.frozen.delete(E)}return L(this,E)}return x}(),has:function(){function x(E){if(S(E)&&!d(E)){var M=b(this);return M.frozen||(M.frozen=new g),T(this,E)||M.frozen.has(E)}return T(this,E)}return x}(),get:function(){function x(E){if(S(E)&&!d(E)){var M=b(this);return M.frozen||(M.frozen=new g),T(this,E)?A(this,E):M.frozen.get(E)}return A(this,E)}return x}(),set:function(){function x(E,M){if(S(E)&&!d(E)){var j=b(this);j.frozen||(j.frozen=new g),T(this,E)?B(this,E,M):j.frozen.set(E,M)}else B(this,E,M);return this}return x}()})}else I()&&o(y,{set:function(){function x(E,M){var j;return m(E)&&(u(E)?j=i:s(E)&&(j=C)),B(this,E,M),j&&j(E),this}return x}()})},84033:function(w,r,n){"use strict";n(74283)},82389:function(w,r,n){"use strict";var e=n(93439),a=n(32920);e("WeakSet",function(t){return function(){function o(){return t(this,arguments.length?arguments[0]:void 0)}return o}()},a)},71863:function(w,r,n){"use strict";n(82389)},73993:function(w,r,n){"use strict";var e=n(77549),a=n(40224),t=n(91314).clear;e({global:!0,bind:!0,enumerable:!0,forced:a.clearImmediate!==t},{clearImmediate:t})},55457:function(w,r,n){"use strict";n(73993),n(72532)},57399:function(w,r,n){"use strict";var e=n(77549),a=n(40224),t=n(27150),o=n(97361),f=n(22789),V=n(41746),k=n(14141),S=V(function(){return k&&Object.getOwnPropertyDescriptor(a,"queueMicrotask").value.length!==1});e({global:!0,enumerable:!0,dontCallGetSet:!0,forced:S},{queueMicrotask:function(){function b(h){f(arguments.length,1),t(o(h))}return b}()})},72532:function(w,r,n){"use strict";var e=n(77549),a=n(40224),t=n(91314).set,o=n(83827),f=a.setImmediate?o(t,!1):t;e({global:!0,bind:!0,enumerable:!0,forced:a.setImmediate!==f},{setImmediate:f})},48112:function(w,r,n){"use strict";var e=n(77549),a=n(40224),t=n(83827),o=t(a.setInterval,!0);e({global:!0,bind:!0,forced:a.setInterval!==o},{setInterval:o})},82274:function(w,r,n){"use strict";var e=n(77549),a=n(40224),t=n(83827),o=t(a.setTimeout,!0);e({global:!0,bind:!0,forced:a.setTimeout!==o},{setTimeout:o})},65836:function(w,r,n){"use strict";n(48112),n(82274)},50719:function(w){"use strict";/**
+ */var t=r.BoxWithSampleText=function(){function o(f){return(0,e.normalizeProps)((0,e.createComponentVNode)(2,a.Box,Object.assign({},f,{children:[(0,e.createComponentVNode)(2,a.Box,{italic:!0,children:"Jackdaws love my big sphinx of quartz."}),(0,e.createComponentVNode)(2,a.Box,{mt:1,bold:!0,children:"The wide electrification of the southern provinces will give a powerful impetus to the growth of agriculture."})]})))}return o}()},21965:function(){},28169:function(){},36487:function(){},35739:function(){},33631:function(){},74785:function(){},6895:function(){},3251:function(){},38265:function(){},7455:function(){},58823:function(){},49265:function(){},55350:function(){},45503:function(){},36557:function(){},70555:function(){},70752:function(w,r,n){var e={"./pai_atmosphere.js":24704,"./pai_bioscan.js":4209,"./pai_directives.js":44430,"./pai_doorjack.js":3367,"./pai_main_menu.js":73395,"./pai_manifest.js":37645,"./pai_medrecords.js":15836,"./pai_messenger.js":91737,"./pai_radio.js":94077,"./pai_secrecords.js":72621,"./pai_signaler.js":53483};function a(o){var f=t(o);return n(f)}function t(o){if(!n.o(e,o)){var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}return e[o]}a.keys=function(){return Object.keys(e)},a.resolve=t,w.exports=a,a.id=70752},59395:function(w,r,n){var e={"./pda_atmos_scan.js":21606,"./pda_janitor.js":12339,"./pda_main_menu.js":36615,"./pda_manifest.js":99737,"./pda_medical.js":61597,"./pda_messenger.js":30709,"./pda_mule.js":68053,"./pda_nanobank.js":31728,"./pda_notes.js":29415,"./pda_power.js":52363,"./pda_secbot.js":23914,"./pda_security.js":68878,"./pda_signaler.js":95135,"./pda_status_display.js":20835,"./pda_supplyrecords.js":11741};function a(o){var f=t(o);return n(f)}function t(o){if(!n.o(e,o)){var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}return e[o]}a.keys=function(){return Object.keys(e)},a.resolve=t,w.exports=a,a.id=59395},32054:function(w,r,n){var e={"./AICard":29732,"./AICard.js":29732,"./AIFixer":78468,"./AIFixer.js":78468,"./APC":73544,"./APC.js":73544,"./ATM":79098,"./ATM.js":79098,"./AccountsUplinkTerminal":64613,"./AccountsUplinkTerminal.js":64613,"./AiAirlock":56839,"./AiAirlock.js":56839,"./AirAlarm":5565,"./AirAlarm.js":5565,"./AirlockAccessController":82915,"./AirlockAccessController.js":82915,"./AirlockElectronics":14962,"./AirlockElectronics.js":14962,"./AlertModal":99327,"./AlertModal.tsx":99327,"./AppearanceChanger":88642,"./AppearanceChanger.js":88642,"./AtmosAlertConsole":51731,"./AtmosAlertConsole.js":51731,"./AtmosControl":57467,"./AtmosControl.js":57467,"./AtmosFilter":41550,"./AtmosFilter.js":41550,"./AtmosMixer":70151,"./AtmosMixer.js":70151,"./AtmosPump":54090,"./AtmosPump.js":54090,"./AtmosTankControl":31335,"./AtmosTankControl.js":31335,"./Autolathe":85909,"./Autolathe.js":85909,"./BioChipPad":81617,"./BioChipPad.js":81617,"./Biogenerator":26215,"./Biogenerator.js":26215,"./BloomEdit":70225,"./BloomEdit.js":70225,"./BlueSpaceArtilleryControl":65483,"./BlueSpaceArtilleryControl.js":65483,"./BluespaceTap":69099,"./BluespaceTap.js":69099,"./BodyScanner":71736,"./BodyScanner.js":71736,"./BookBinder":99449,"./BookBinder.js":99449,"./BotCall":85951,"./BotCall.js":85951,"./BotClean":43506,"./BotClean.js":43506,"./BotFloor":89593,"./BotFloor.js":89593,"./BotHonk":89513,"./BotHonk.js":89513,"./BotMed":19297,"./BotMed.js":19297,"./BotSecurity":4249,"./BotSecurity.js":4249,"./BrigCells":27267,"./BrigCells.js":27267,"./BrigTimer":26623,"./BrigTimer.js":26623,"./CameraConsole":43542,"./CameraConsole.js":43542,"./Canister":95513,"./Canister.js":95513,"./CardComputer":60463,"./CardComputer.js":60463,"./CargoConsole":16377,"./CargoConsole.js":16377,"./ChangelogView":89917,"./ChangelogView.js":89917,"./ChemDispenser":71254,"./ChemDispenser.js":71254,"./ChemHeater":27004,"./ChemHeater.js":27004,"./ChemMaster":41099,"./ChemMaster.tsx":41099,"./CloningConsole":51327,"./CloningConsole.js":51327,"./CloningPod":66373,"./CloningPod.js":66373,"./CoinMint":38781,"./CoinMint.tsx":38781,"./ColourMatrixTester":11866,"./ColourMatrixTester.js":11866,"./CommunicationsComputer":22420,"./CommunicationsComputer.js":22420,"./CompostBin":46868,"./CompostBin.js":46868,"./Contractor":64707,"./Contractor.js":64707,"./ConveyorSwitch":52141,"./ConveyorSwitch.js":52141,"./CrewMonitor":94187,"./CrewMonitor.js":94187,"./Cryo":60561,"./Cryo.js":60561,"./CryopodConsole":27889,"./CryopodConsole.js":27889,"./DNAModifier":81434,"./DNAModifier.js":81434,"./DestinationTagger":99127,"./DestinationTagger.js":99127,"./DisposalBin":93430,"./DisposalBin.js":93430,"./DnaVault":31491,"./DnaVault.js":31491,"./DroneConsole":30747,"./DroneConsole.js":30747,"./EFTPOS":74781,"./EFTPOS.js":74781,"./ERTManager":30672,"./ERTManager.js":30672,"./EconomyManager":24503,"./EconomyManager.js":24503,"./Electropack":15543,"./Electropack.js":15543,"./Emojipedia":57013,"./Emojipedia.tsx":57013,"./EvolutionMenu":99012,"./EvolutionMenu.js":99012,"./ExosuitFabricator":37504,"./ExosuitFabricator.js":37504,"./ExperimentConsole":9466,"./ExperimentConsole.js":9466,"./ExternalAirlockController":77284,"./ExternalAirlockController.js":77284,"./FaxMachine":52516,"./FaxMachine.js":52516,"./FilingCabinet":24777,"./FilingCabinet.js":24777,"./FloorPainter":88361,"./FloorPainter.js":88361,"./GPS":70078,"./GPS.js":70078,"./GeneModder":92246,"./GeneModder.js":92246,"./GenericCrewManifest":27163,"./GenericCrewManifest.js":27163,"./GhostHudPanel":53808,"./GhostHudPanel.js":53808,"./GlandDispenser":32035,"./GlandDispenser.js":32035,"./GravityGen":33004,"./GravityGen.js":33004,"./GuestPass":39775,"./GuestPass.js":39775,"./HandheldChemDispenser":22480,"./HandheldChemDispenser.js":22480,"./HealthSensor":22616,"./HealthSensor.js":22616,"./Holodeck":76861,"./Holodeck.js":76861,"./Instrument":96729,"./Instrument.js":96729,"./KeycardAuth":53385,"./KeycardAuth.js":53385,"./KitchenMachine":58553,"./KitchenMachine.js":58553,"./LawManager":14047,"./LawManager.js":14047,"./LibraryComputer":5872,"./LibraryComputer.js":5872,"./LibraryManager":37782,"./LibraryManager.js":37782,"./ListInputModal":26133,"./ListInputModal.tsx":26133,"./MODsuit":71963,"./MODsuit.js":71963,"./MagnetController":84274,"./MagnetController.js":84274,"./MechBayConsole":95752,"./MechBayConsole.js":95752,"./MechaControlConsole":53668,"./MechaControlConsole.js":53668,"./MedicalRecords":96467,"./MedicalRecords.js":96467,"./MerchVendor":68211,"./MerchVendor.js":68211,"./MiningVendor":14162,"./MiningVendor.js":14162,"./NTRecruiter":68977,"./NTRecruiter.js":68977,"./Newscaster":17067,"./Newscaster.js":17067,"./Noticeboard":26148,"./Noticeboard.tsx":26148,"./NuclearBomb":46940,"./NuclearBomb.js":46940,"./NumberInputModal":35478,"./NumberInputModal.tsx":35478,"./OperatingComputer":98476,"./OperatingComputer.js":98476,"./Orbit":98702,"./Orbit.js":98702,"./OreRedemption":74015,"./OreRedemption.js":74015,"./PAI":48824,"./PAI.js":48824,"./PDA":41565,"./PDA.js":41565,"./Pacman":78704,"./Pacman.js":78704,"./PanDEMIC":6887,"./PanDEMIC.tsx":6887,"./ParticleAccelerator":78643,"./ParticleAccelerator.js":78643,"./PdaPainter":34026,"./PdaPainter.js":34026,"./PersonalCrafting":81378,"./PersonalCrafting.js":81378,"./Photocopier":58792,"./Photocopier.js":58792,"./PoolController":27902,"./PoolController.js":27902,"./PortablePump":52025,"./PortablePump.js":52025,"./PortableScrubber":57827,"./PortableScrubber.js":57827,"./PortableTurret":63825,"./PortableTurret.js":63825,"./PowerMonitor":70373,"./PowerMonitor.js":70373,"./PrisonerImplantManager":27262,"./PrisonerImplantManager.js":27262,"./PrisonerShuttleConsole":22046,"./PrisonerShuttleConsole.js":22046,"./PrizeCounter":92014,"./PrizeCounter.tsx":92014,"./RCD":87963,"./RCD.js":87963,"./RPD":84364,"./RPD.js":84364,"./Radio":14641,"./Radio.js":14641,"./ReagentGrinder":40483,"./ReagentGrinder.js":40483,"./ReagentsEditor":70976,"./ReagentsEditor.tsx":70976,"./RemoteSignaler":94049,"./RemoteSignaler.js":94049,"./RequestConsole":12326,"./RequestConsole.js":12326,"./RndConsole":89641,"./RndConsole.js":89641,"./RndConsoleComponents":3422,"./RndConsoleComponents/":3422,"./RndConsoleComponents/CurrentLevels":19348,"./RndConsoleComponents/CurrentLevels.js":19348,"./RndConsoleComponents/DataDiskMenu":338,"./RndConsoleComponents/DataDiskMenu.js":338,"./RndConsoleComponents/DeconstructionMenu":90785,"./RndConsoleComponents/DeconstructionMenu.js":90785,"./RndConsoleComponents/LatheCategory":34492,"./RndConsoleComponents/LatheCategory.js":34492,"./RndConsoleComponents/LatheChemicalStorage":84275,"./RndConsoleComponents/LatheChemicalStorage.js":84275,"./RndConsoleComponents/LatheMainMenu":12638,"./RndConsoleComponents/LatheMainMenu.js":12638,"./RndConsoleComponents/LatheMaterialStorage":89004,"./RndConsoleComponents/LatheMaterialStorage.js":89004,"./RndConsoleComponents/LatheMaterials":73856,"./RndConsoleComponents/LatheMaterials.js":73856,"./RndConsoleComponents/LatheMenu":75955,"./RndConsoleComponents/LatheMenu.js":75955,"./RndConsoleComponents/LatheSearch":72880,"./RndConsoleComponents/LatheSearch.js":72880,"./RndConsoleComponents/MainMenu":62306,"./RndConsoleComponents/MainMenu.js":62306,"./RndConsoleComponents/RndNavButton":99941,"./RndConsoleComponents/RndNavButton.js":99941,"./RndConsoleComponents/RndNavbar":24448,"./RndConsoleComponents/RndNavbar.js":24448,"./RndConsoleComponents/RndRoute":78345,"./RndConsoleComponents/RndRoute.js":78345,"./RndConsoleComponents/SettingsMenu":56454,"./RndConsoleComponents/SettingsMenu.js":56454,"./RndConsoleComponents/index":3422,"./RndConsoleComponents/index.js":3422,"./RobotSelfDiagnosis":71123,"./RobotSelfDiagnosis.js":71123,"./RoboticsControlConsole":98951,"./RoboticsControlConsole.js":98951,"./Safe":2289,"./Safe.js":2289,"./SatelliteControl":49334,"./SatelliteControl.js":49334,"./SecureStorage":54892,"./SecureStorage.js":54892,"./SecurityRecords":56798,"./SecurityRecords.js":56798,"./SeedExtractor":59981,"./SeedExtractor.js":59981,"./ShuttleConsole":33454,"./ShuttleConsole.js":33454,"./ShuttleManipulator":50451,"./ShuttleManipulator.js":50451,"./Sleeper":99050,"./Sleeper.js":99050,"./SlotMachine":37763,"./SlotMachine.js":37763,"./Smartfridge":26654,"./Smartfridge.js":26654,"./Smes":71124,"./Smes.js":71124,"./SolarControl":21786,"./SolarControl.js":21786,"./SpawnersMenu":31202,"./SpawnersMenu.js":31202,"./SpecMenu":84800,"./SpecMenu.js":84800,"./StationAlertConsole":46501,"./StationAlertConsole.js":46501,"./StationTraitsPanel":18565,"./StationTraitsPanel.tsx":18565,"./StripMenu":95147,"./StripMenu.tsx":95147,"./SuitStorage":61284,"./SuitStorage.js":61284,"./SupermatterMonitor":19796,"./SupermatterMonitor.js":19796,"./SyndicateComputerSimple":30047,"./SyndicateComputerSimple.js":30047,"./TEG":28830,"./TEG.js":28830,"./TachyonArray":39903,"./TachyonArray.js":39903,"./Tank":17068,"./Tank.js":17068,"./TankDispenser":69161,"./TankDispenser.js":69161,"./TcommsCore":87394,"./TcommsCore.js":87394,"./TcommsRelay":55684,"./TcommsRelay.js":55684,"./Teleporter":81088,"./Teleporter.js":81088,"./TelescienceConsole":65875,"./TelescienceConsole.js":65875,"./TempGun":96150,"./TempGun.js":96150,"./TextInputModal":95484,"./TextInputModal.tsx":95484,"./ThermoMachine":378,"./ThermoMachine.js":378,"./TransferValve":3365,"./TransferValve.js":3365,"./TurbineComputer":13860,"./TurbineComputer.js":13860,"./Uplink":22169,"./Uplink.js":22169,"./Vending":70547,"./Vending.js":70547,"./VolumeMixer":33045,"./VolumeMixer.js":33045,"./VotePanel":53792,"./VotePanel.js":53792,"./Wires":64860,"./Wires.js":64860,"./WizardApprenticeContract":78262,"./WizardApprenticeContract.js":78262,"./common/AccessList":57842,"./common/AccessList.js":57842,"./common/AtmosScan":79449,"./common/AtmosScan.js":79449,"./common/BeakerContents":1496,"./common/BeakerContents.js":1496,"./common/BotStatus":69521,"./common/BotStatus.js":69521,"./common/ComplexModal":99665,"./common/ComplexModal.js":99665,"./common/CrewManifest":98444,"./common/CrewManifest.js":98444,"./common/InputButtons":15113,"./common/InputButtons.tsx":15113,"./common/InterfaceLockNoticeBox":26893,"./common/InterfaceLockNoticeBox.js":26893,"./common/Loader":14299,"./common/Loader.tsx":14299,"./common/LoginInfo":68159,"./common/LoginInfo.js":68159,"./common/LoginScreen":27527,"./common/LoginScreen.js":27527,"./common/Operating":75201,"./common/Operating.js":75201,"./common/Signaler":65435,"./common/Signaler.js":65435,"./common/SimpleRecords":77534,"./common/SimpleRecords.js":77534,"./common/TemporaryNotice":84537,"./common/TemporaryNotice.js":84537,"./pai/pai_atmosphere":24704,"./pai/pai_atmosphere.js":24704,"./pai/pai_bioscan":4209,"./pai/pai_bioscan.js":4209,"./pai/pai_directives":44430,"./pai/pai_directives.js":44430,"./pai/pai_doorjack":3367,"./pai/pai_doorjack.js":3367,"./pai/pai_main_menu":73395,"./pai/pai_main_menu.js":73395,"./pai/pai_manifest":37645,"./pai/pai_manifest.js":37645,"./pai/pai_medrecords":15836,"./pai/pai_medrecords.js":15836,"./pai/pai_messenger":91737,"./pai/pai_messenger.js":91737,"./pai/pai_radio":94077,"./pai/pai_radio.js":94077,"./pai/pai_secrecords":72621,"./pai/pai_secrecords.js":72621,"./pai/pai_signaler":53483,"./pai/pai_signaler.js":53483,"./pda/pda_atmos_scan":21606,"./pda/pda_atmos_scan.js":21606,"./pda/pda_janitor":12339,"./pda/pda_janitor.js":12339,"./pda/pda_main_menu":36615,"./pda/pda_main_menu.js":36615,"./pda/pda_manifest":99737,"./pda/pda_manifest.js":99737,"./pda/pda_medical":61597,"./pda/pda_medical.js":61597,"./pda/pda_messenger":30709,"./pda/pda_messenger.js":30709,"./pda/pda_mule":68053,"./pda/pda_mule.js":68053,"./pda/pda_nanobank":31728,"./pda/pda_nanobank.js":31728,"./pda/pda_notes":29415,"./pda/pda_notes.js":29415,"./pda/pda_power":52363,"./pda/pda_power.js":52363,"./pda/pda_secbot":23914,"./pda/pda_secbot.js":23914,"./pda/pda_security":68878,"./pda/pda_security.js":68878,"./pda/pda_signaler":95135,"./pda/pda_signaler.js":95135,"./pda/pda_status_display":20835,"./pda/pda_status_display.js":20835,"./pda/pda_supplyrecords":11741,"./pda/pda_supplyrecords.js":11741};function a(o){var f=t(o);return n(f)}function t(o){if(!n.o(e,o)){var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}return e[o]}a.keys=function(){return Object.keys(e)},a.resolve=t,w.exports=a,a.id=32054},4085:function(w,r,n){var e={"./Blink.stories.js":61498,"./BlockQuote.stories.js":27431,"./Box.stories.js":6517,"./Button.stories.js":20648,"./ByondUi.stories.js":14906,"./Collapsible.stories.js":59948,"./Flex.stories.js":37227,"./ImageButton.stories.js":16189,"./Input.stories.js":32304,"./Popper.stories.js":50394,"./ProgressBar.stories.js":75096,"./Stack.stories.js":30268,"./Storage.stories.js":22645,"./Tabs.stories.js":42120,"./Themes.stories.js":80254,"./Tooltip.stories.js":90823};function a(o){var f=t(o);return n(f)}function t(o){if(!n.o(e,o)){var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}return e[o]}a.keys=function(){return Object.keys(e)},a.resolve=t,w.exports=a,a.id=4085},97361:function(w,r,n){"use strict";var e=n(7532),a=n(62518),t=TypeError;w.exports=function(o){if(e(o))return o;throw new t(a(o)+" is not a function")}},76833:function(w,r,n){"use strict";var e=n(60354),a=n(62518),t=TypeError;w.exports=function(o){if(e(o))return o;throw new t(a(o)+" is not a constructor")}},51689:function(w,r,n){"use strict";var e=n(41224),a=String,t=TypeError;w.exports=function(o){if(e(o))return o;throw new t("Can't set "+a(o)+" as a prototype")}},91138:function(w,r,n){"use strict";var e=n(66266),a=n(28969),t=n(56018).f,o=e("unscopables"),f=Array.prototype;f[o]===void 0&&t(f,o,{configurable:!0,value:a(null)}),w.exports=function(V){f[o][V]=!0}},62970:function(w,r,n){"use strict";var e=n(56852).charAt;w.exports=function(a,t,o){return t+(o?e(a,t).length:1)}},19870:function(w,r,n){"use strict";var e=n(33314),a=TypeError;w.exports=function(t,o){if(e(o,t))return t;throw new a("Incorrect invocation")}},39482:function(w,r,n){"use strict";var e=n(56831),a=String,t=TypeError;w.exports=function(o){if(e(o))return o;throw new t(a(o)+" is not an object")}},67404:function(w){"use strict";w.exports=typeof ArrayBuffer!="undefined"&&typeof DataView!="undefined"},65693:function(w,r,n){"use strict";var e=n(41746);w.exports=e(function(){if(typeof ArrayBuffer=="function"){var a=new ArrayBuffer(8);Object.isExtensible(a)&&Object.defineProperty(a,"a",{value:8})}})},72951:function(w,r,n){"use strict";var e=n(67404),a=n(14141),t=n(40224),o=n(7532),f=n(56831),V=n(89458),k=n(27806),S=n(62518),b=n(16216),h=n(59173),l=n(10069),c=n(33314),m=n(31658),d=n(42878),u=n(66266),s=n(33345),i=n(35086),C=i.enforce,v=i.get,g=t.Int8Array,p=g&&g.prototype,N=t.Uint8ClampedArray,y=N&&N.prototype,B=g&&m(g),I=p&&m(p),L=Object.prototype,T=t.TypeError,A=u("toStringTag"),x=s("TYPED_ARRAY_TAG"),E="TypedArrayConstructor",M=e&&!!d&&k(t.opera)!=="Opera",j=!1,P,R,D,F={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8},U={BigInt64Array:8,BigUint64Array:8},_=function(){function ae(fe){if(!f(fe))return!1;var pe=k(fe);return pe==="DataView"||V(F,pe)||V(U,pe)}return ae}(),z=function ae(fe){var pe=m(fe);if(f(pe)){var be=v(pe);return be&&V(be,E)?be[E]:ae(pe)}},G=function(fe){if(!f(fe))return!1;var pe=k(fe);return V(F,pe)||V(U,pe)},X=function(fe){if(G(fe))return fe;throw new T("Target is not a typed array")},Y=function(fe){if(o(fe)&&(!d||c(B,fe)))return fe;throw new T(S(fe)+" is not a typed array constructor")},J=function(fe,pe,be,te){if(a){if(be)for(var Q in F){var ne=t[Q];if(ne&&V(ne.prototype,fe))try{delete ne.prototype[fe]}catch(me){try{ne.prototype[fe]=pe}catch(ce){}}}(!I[fe]||be)&&h(I,fe,be?pe:M&&p[fe]||pe,te)}},ie=function(fe,pe,be){var te,Q;if(a){if(d){if(be){for(te in F)if(Q=t[te],Q&&V(Q,fe))try{delete Q[fe]}catch(ne){}}if(!B[fe]||be)try{return h(B,fe,be?pe:M&&B[fe]||pe)}catch(ne){}else return}for(te in F)Q=t[te],Q&&(!Q[fe]||be)&&h(Q,fe,pe)}};for(P in F)R=t[P],D=R&&R.prototype,D?C(D)[E]=R:M=!1;for(P in U)R=t[P],D=R&&R.prototype,D&&(C(D)[E]=R);if((!M||!o(B)||B===Function.prototype)&&(B=function(){function ae(){throw new T("Incorrect invocation")}return ae}(),M))for(P in F)t[P]&&d(t[P],B);if((!M||!I||I===L)&&(I=B.prototype,M))for(P in F)t[P]&&d(t[P].prototype,I);if(M&&m(y)!==I&&d(y,I),a&&!V(I,A)){j=!0,l(I,A,{configurable:!0,get:function(){function ae(){return f(this)?this[x]:void 0}return ae}()});for(P in F)t[P]&&b(t[P],x,P)}w.exports={NATIVE_ARRAY_BUFFER_VIEWS:M,TYPED_ARRAY_TAG:j&&x,aTypedArray:X,aTypedArrayConstructor:Y,exportTypedArrayMethod:J,exportTypedArrayStaticMethod:ie,getTypedArrayConstructor:z,isView:_,isTypedArray:G,TypedArray:B,TypedArrayPrototype:I}},46185:function(w,r,n){"use strict";var e=n(40224),a=n(18161),t=n(14141),o=n(67404),f=n(26463),V=n(16216),k=n(10069),S=n(13648),b=n(41746),h=n(19870),l=n(74952),c=n(10475),m=n(90835),d=n(75988),u=n(62263),s=n(31658),i=n(42878),C=n(59942),v=n(77713),g=n(2566),p=n(70113),N=n(94234),y=n(35086),B=f.PROPER,I=f.CONFIGURABLE,L="ArrayBuffer",T="DataView",A="prototype",x="Wrong length",E="Wrong index",M=y.getterFor(L),j=y.getterFor(T),P=y.set,R=e[L],D=R,F=D&&D[A],U=e[T],_=U&&U[A],z=Object.prototype,G=e.Array,X=e.RangeError,Y=a(C),J=a([].reverse),ie=u.pack,ae=u.unpack,fe=function(ge){return[ge&255]},pe=function(ge){return[ge&255,ge>>8&255]},be=function(ge){return[ge&255,ge>>8&255,ge>>16&255,ge>>24&255]},te=function(ge){return ge[3]<<24|ge[2]<<16|ge[1]<<8|ge[0]},Q=function(ge){return ie(d(ge),23,4)},ne=function(ge){return ie(ge,52,8)},me=function(ge,ye,Ve){k(ge[A],ye,{configurable:!0,get:function(){function Ie(){return Ve(this)[ye]}return Ie}()})},ce=function(ge,ye,Ve,Ie){var we=j(ge),xe=m(Ve),Oe=!!Ie;if(xe+ye>we.byteLength)throw new X(E);var We=we.bytes,Ne=xe+we.byteOffset,re=v(We,Ne,Ne+ye);return Oe?re:J(re)},ue=function(ge,ye,Ve,Ie,we,xe){var Oe=j(ge),We=m(Ve),Ne=Ie(+we),re=!!xe;if(We+ye>Oe.byteLength)throw new X(E);for(var de=Oe.bytes,he=We+Oe.byteOffset,se=0;se m;)u[m]=l[m++];return u}return S}(),k)},74188:function(w,r,n){"use strict";var e=n(72951),a=n(67480).some,t=e.aTypedArray,o=e.exportTypedArrayMethod;o("some",function(){function f(V){return a(t(this),V,arguments.length>1?arguments[1]:void 0)}return f}())},81976:function(w,r,n){"use strict";var e=n(40224),a=n(85067),t=n(41746),o=n(97361),f=n(44815),V=n(72951),k=n(49847),S=n(56605),b=n(82709),h=n(53125),l=V.aTypedArray,c=V.exportTypedArrayMethod,m=e.Uint16Array,d=m&&a(m.prototype.sort),u=!!d&&!(t(function(){d(new m(2),null)})&&t(function(){d(new m(2),{})})),s=!!d&&!t(function(){if(b)return b<74;if(k)return k<67;if(S)return!0;if(h)return h<602;var C=new m(516),v=Array(516),g,p;for(g=0;g<516;g++)p=g%4,C[g]=515-g,v[g]=g-2*p+3;for(d(C,function(N,y){return(N/4|0)-(y/4|0)}),g=0;g<516;g++)if(C[g]!==v[g])return!0}),i=function(v){return function(g,p){return v!==void 0?+v(g,p)||0:p!==p?-1:g!==g?1:g===0&&p===0?1/g>0&&1/p<0?1:-1:g>p}};c("sort",function(){function C(v){return v!==void 0&&o(v),s?d(this,v):f(l(this),i(v))}return C}(),!s||u)},78651:function(w,r,n){"use strict";var e=n(72951),a=n(10475),t=n(74067),o=n(489),f=e.aTypedArray,V=e.exportTypedArrayMethod;V("subarray",function(){function k(S,b){var h=f(this),l=h.length,c=t(S,l),m=o(h);return new m(h.buffer,h.byteOffset+c*h.BYTES_PER_ELEMENT,a((b===void 0?l:t(b,l))-c))}return k}())},81664:function(w,r,n){"use strict";var e=n(40224),a=n(70918),t=n(72951),o=n(41746),f=n(77713),V=e.Int8Array,k=t.aTypedArray,S=t.exportTypedArrayMethod,b=[].toLocaleString,h=!!V&&o(function(){b.call(new V(1))}),l=o(function(){return[1,2].toLocaleString()!==new V([1,2]).toLocaleString()})||!o(function(){V.prototype.toLocaleString.call([1,2])});S("toLocaleString",function(){function c(){return a(b,h?f(k(this)):k(this),f(arguments))}return c}(),l)},35579:function(w,r,n){"use strict";var e=n(72951).exportTypedArrayMethod,a=n(41746),t=n(40224),o=n(18161),f=t.Uint8Array,V=f&&f.prototype||{},k=[].toString,S=o([].join);a(function(){k.call({})})&&(k=function(){function h(){return S(this)}return h}());var b=V.toString!==k;e("toString",k,b)},99683:function(w,r,n){"use strict";var e=n(12218);e("Uint16",function(a){return function(){function t(o,f,V){return a(this,o,f,V)}return t}()})},80941:function(w,r,n){"use strict";var e=n(12218);e("Uint32",function(a){return function(){function t(o,f,V){return a(this,o,f,V)}return t}()})},45338:function(w,r,n){"use strict";var e=n(12218);e("Uint8",function(a){return function(){function t(o,f,V){return a(this,o,f,V)}return t}()})},40737:function(w,r,n){"use strict";var e=n(12218);e("Uint8",function(a){return function(){function t(o,f,V){return a(this,o,f,V)}return t}()},!0)},74283:function(w,r,n){"use strict";var e=n(56255),a=n(40224),t=n(18161),o=n(13648),f=n(29126),V=n(93439),k=n(32920),S=n(56831),b=n(35086).enforce,h=n(41746),l=n(90777),c=Object,m=Array.isArray,d=c.isExtensible,u=c.isFrozen,s=c.isSealed,i=c.freeze,C=c.seal,v=!a.ActiveXObject&&"ActiveXObject"in a,g,p=function(E){return function(){function M(){return E(this,arguments.length?arguments[0]:void 0)}return M}()},N=V("WeakMap",p,k),y=N.prototype,B=t(y.set),I=function(){return e&&h(function(){var E=i([]);return B(new N,E,1),!u(E)})};if(l)if(v){g=k.getConstructor(p,"WeakMap",!0),f.enable();var L=t(y.delete),T=t(y.has),A=t(y.get);o(y,{delete:function(){function x(E){if(S(E)&&!d(E)){var M=b(this);return M.frozen||(M.frozen=new g),L(this,E)||M.frozen.delete(E)}return L(this,E)}return x}(),has:function(){function x(E){if(S(E)&&!d(E)){var M=b(this);return M.frozen||(M.frozen=new g),T(this,E)||M.frozen.has(E)}return T(this,E)}return x}(),get:function(){function x(E){if(S(E)&&!d(E)){var M=b(this);return M.frozen||(M.frozen=new g),T(this,E)?A(this,E):M.frozen.get(E)}return A(this,E)}return x}(),set:function(){function x(E,M){if(S(E)&&!d(E)){var j=b(this);j.frozen||(j.frozen=new g),T(this,E)?B(this,E,M):j.frozen.set(E,M)}else B(this,E,M);return this}return x}()})}else I()&&o(y,{set:function(){function x(E,M){var j;return m(E)&&(u(E)?j=i:s(E)&&(j=C)),B(this,E,M),j&&j(E),this}return x}()})},84033:function(w,r,n){"use strict";n(74283)},82389:function(w,r,n){"use strict";var e=n(93439),a=n(32920);e("WeakSet",function(t){return function(){function o(){return t(this,arguments.length?arguments[0]:void 0)}return o}()},a)},71863:function(w,r,n){"use strict";n(82389)},73993:function(w,r,n){"use strict";var e=n(77549),a=n(40224),t=n(91314).clear;e({global:!0,bind:!0,enumerable:!0,forced:a.clearImmediate!==t},{clearImmediate:t})},55457:function(w,r,n){"use strict";n(73993),n(72532)},57399:function(w,r,n){"use strict";var e=n(77549),a=n(40224),t=n(27150),o=n(97361),f=n(22789),V=n(41746),k=n(14141),S=V(function(){return k&&Object.getOwnPropertyDescriptor(a,"queueMicrotask").value.length!==1});e({global:!0,enumerable:!0,dontCallGetSet:!0,forced:S},{queueMicrotask:function(){function b(h){f(arguments.length,1),t(o(h))}return b}()})},72532:function(w,r,n){"use strict";var e=n(77549),a=n(40224),t=n(91314).set,o=n(83827),f=a.setImmediate?o(t,!1):t;e({global:!0,bind:!0,enumerable:!0,forced:a.setImmediate!==f},{setImmediate:f})},48112:function(w,r,n){"use strict";var e=n(77549),a=n(40224),t=n(83827),o=t(a.setInterval,!0);e({global:!0,bind:!0,forced:a.setInterval!==o},{setInterval:o})},82274:function(w,r,n){"use strict";var e=n(77549),a=n(40224),t=n(83827),o=t(a.setTimeout,!0);e({global:!0,bind:!0,forced:a.setTimeout!==o},{setTimeout:o})},65836:function(w,r,n){"use strict";n(48112),n(82274)},50719:function(w){"use strict";/**
* @file
* @copyright 2020 Aleksej Komarov
* @license MIT
1?arguments[1]:void 0,1),v=V(i);if(d)return a(l,this,v,C);var g=this.length,p=o(v),N=0;if(p+C>g)throw new S("Wrong length");for(;N