mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-12 11:13:16 +00:00
Configuration Controller (#7857)
This commit is contained in:
300
code/controllers/configuration_ch/config_entry.dm
Normal file
300
code/controllers/configuration_ch/config_entry.dm
Normal file
@@ -0,0 +1,300 @@
|
||||
/datum/config_entry
|
||||
/// Read-only, this is determined by the last portion of the derived entry type
|
||||
var/name
|
||||
/// The configured value for this entry. This shouldn't be initialized in code, instead set default
|
||||
var/config_entry_value
|
||||
/// Read-only default value for this config entry, used for resetting value to defaults when necessary. This is what config_entry_value is initially set to
|
||||
var/default
|
||||
/// The file which this was loaded from, if any
|
||||
var/resident_file
|
||||
/// Set to TRUE if the default has been overridden by a config entry
|
||||
var/modified = FALSE
|
||||
/// The config name of a configuration type that depricates this, if it exists
|
||||
var/deprecated_by
|
||||
/// The /datum/config_entry type that supercedes this one
|
||||
var/protection = NONE
|
||||
/// Do not instantiate if type matches this
|
||||
var/config_abstract_type = /datum/config_entry
|
||||
/// Force validate and set on VV. VAS proccall guard will run regardless.
|
||||
var/vv_VAS = TRUE
|
||||
/// Controls if error is thrown when duplicate configuration values for this entry type are encountered
|
||||
var/dupes_allowed = FALSE
|
||||
/// Stores the original protection configuration, used for set_default()
|
||||
var/default_protection
|
||||
|
||||
/datum/config_entry/New()
|
||||
if(type == config_abstract_type)
|
||||
CRASH("Abstract config entry [type] instatiated!")
|
||||
name = lowertext(type2top(type))
|
||||
default_protection = protection
|
||||
set_default()
|
||||
|
||||
/datum/config_entry/Destroy()
|
||||
config.RemoveEntry(src)
|
||||
return ..()
|
||||
|
||||
/**
|
||||
* Returns the value of the configuration datum to its default, used for resetting a config value. Note this also sets the protection back to default.
|
||||
*/
|
||||
/datum/config_entry/proc/set_default()
|
||||
if ((protection & CONFIG_ENTRY_LOCKED) && IsAdminAdvancedProcCall())
|
||||
//log_admin_private("[key_name(usr)] attempted to reset locked config entry [type] to its default")
|
||||
log_admin("[key_name(usr)] attempted to reset locked config entry [type] to its default")
|
||||
return
|
||||
if (islist(default))
|
||||
var/list/L = default
|
||||
config_entry_value = L.Copy()
|
||||
else
|
||||
config_entry_value = default
|
||||
protection = default_protection
|
||||
resident_file = null
|
||||
modified = FALSE
|
||||
|
||||
/datum/config_entry/can_vv_get(var_name)
|
||||
. = ..()
|
||||
if(var_name == NAMEOF(src, config_entry_value) || var_name == NAMEOF(src, default))
|
||||
. &= !(protection & CONFIG_ENTRY_HIDDEN)
|
||||
|
||||
/datum/config_entry/vv_edit_var(var_name, var_value)
|
||||
var/static/list/banned_edits = list(NAMEOF_STATIC(src, name), NAMEOF_STATIC(src, vv_VAS), NAMEOF_STATIC(src, default), NAMEOF_STATIC(src, resident_file), NAMEOF_STATIC(src, protection), NAMEOF_STATIC(src, config_abstract_type), NAMEOF_STATIC(src, modified), NAMEOF_STATIC(src, dupes_allowed))
|
||||
if(var_name == NAMEOF(src, config_entry_value))
|
||||
if(protection & CONFIG_ENTRY_LOCKED)
|
||||
return FALSE
|
||||
if(vv_VAS)
|
||||
. = ValidateAndSet("[var_value]")
|
||||
if(.)
|
||||
datum_flags |= DF_VAR_EDITED
|
||||
return
|
||||
else
|
||||
return ..()
|
||||
if(var_name in banned_edits)
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
/datum/config_entry/proc/VASProcCallGuard(str_val)
|
||||
. = !((protection & CONFIG_ENTRY_LOCKED) && IsAdminAdvancedProcCall())
|
||||
if(!.)
|
||||
//log_admin_private("[key_name(usr)] attempted to set locked config entry [type] to '[str_val]'")
|
||||
log_admin("[key_name(usr)] attempted to set locked config entry [type] to '[str_val]'")
|
||||
|
||||
/datum/config_entry/proc/ValidateAndSet(str_val)
|
||||
VASProcCallGuard(str_val)
|
||||
CRASH("Invalid config entry type!")
|
||||
|
||||
/datum/config_entry/proc/ValidateListEntry(key_name, key_value)
|
||||
return TRUE
|
||||
|
||||
/datum/config_entry/proc/DeprecationUpdate(value)
|
||||
return
|
||||
|
||||
/datum/config_entry/string
|
||||
default = ""
|
||||
config_abstract_type = /datum/config_entry/string
|
||||
var/auto_trim = TRUE
|
||||
/// whether the string will be lowercased on ValidateAndSet or not.
|
||||
var/lowercase = FALSE
|
||||
|
||||
/datum/config_entry/string/vv_edit_var(var_name, var_value)
|
||||
return var_name != NAMEOF(src, auto_trim) && ..()
|
||||
|
||||
/datum/config_entry/string/ValidateAndSet(str_val)
|
||||
if(!VASProcCallGuard(str_val))
|
||||
return FALSE
|
||||
config_entry_value = auto_trim ? trim(str_val) : str_val
|
||||
if(lowercase)
|
||||
config_entry_value = lowertext(config_entry_value)
|
||||
return TRUE
|
||||
|
||||
/datum/config_entry/number
|
||||
default = 0
|
||||
config_abstract_type = /datum/config_entry/number
|
||||
var/integer = TRUE
|
||||
var/max_val = INFINITY
|
||||
var/min_val = -INFINITY
|
||||
|
||||
/datum/config_entry/number/ValidateAndSet(str_val)
|
||||
if(!VASProcCallGuard(str_val))
|
||||
return FALSE
|
||||
var/temp = text2num(trim(str_val))
|
||||
if(!isnull(temp))
|
||||
config_entry_value = clamp(integer ? round(temp) : temp, min_val, max_val)
|
||||
if(config_entry_value != temp && !(datum_flags & DF_VAR_EDITED))
|
||||
log_config("Changing [name] from [temp] to [config_entry_value]!")
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/datum/config_entry/number/vv_edit_var(var_name, var_value)
|
||||
var/static/list/banned_edits = list(NAMEOF_STATIC(src, max_val), NAMEOF_STATIC(src, min_val), NAMEOF_STATIC(src, integer))
|
||||
return !(var_name in banned_edits) && ..()
|
||||
|
||||
/datum/config_entry/flag
|
||||
default = FALSE
|
||||
config_abstract_type = /datum/config_entry/flag
|
||||
|
||||
/datum/config_entry/flag/ValidateAndSet(str_val)
|
||||
if(!VASProcCallGuard(str_val))
|
||||
return FALSE
|
||||
config_entry_value = text2num(trim(str_val)) != 0
|
||||
return TRUE
|
||||
|
||||
/// List config entry, used for configuring a list of strings
|
||||
/datum/config_entry/str_list
|
||||
config_abstract_type = /datum/config_entry/str_list
|
||||
default = list()
|
||||
dupes_allowed = TRUE
|
||||
/// whether the string elements will be lowercased on ValidateAndSet or not.
|
||||
var/lowercase = FALSE
|
||||
|
||||
/datum/config_entry/str_list/ValidateAndSet(str_val)
|
||||
if (!VASProcCallGuard(str_val))
|
||||
return FALSE
|
||||
str_val = trim(str_val)
|
||||
if (str_val != "")
|
||||
config_entry_value += lowercase ? lowertext(str_val) : str_val
|
||||
return TRUE
|
||||
|
||||
/datum/config_entry/number_list
|
||||
config_abstract_type = /datum/config_entry/number_list
|
||||
default = list()
|
||||
|
||||
/datum/config_entry/number_list/ValidateAndSet(str_val)
|
||||
if(!VASProcCallGuard(str_val))
|
||||
return FALSE
|
||||
str_val = trim(str_val)
|
||||
var/list/new_list = list()
|
||||
var/list/values = splittext(str_val," ")
|
||||
for(var/I in values)
|
||||
var/temp = text2num(I)
|
||||
if(isnull(temp))
|
||||
return FALSE
|
||||
new_list += temp
|
||||
if(!new_list.len)
|
||||
return FALSE
|
||||
config_entry_value = new_list
|
||||
return TRUE
|
||||
|
||||
/datum/config_entry/keyed_list
|
||||
config_abstract_type = /datum/config_entry/keyed_list
|
||||
default = list()
|
||||
dupes_allowed = TRUE
|
||||
vv_VAS = FALSE //VAS will not allow things like deleting from lists, it'll just bug horribly.
|
||||
var/key_mode
|
||||
var/value_mode
|
||||
var/splitter = " "
|
||||
/// whether the key names will be lowercased on ValidateAndSet or not.
|
||||
var/lowercase_key = TRUE
|
||||
|
||||
/datum/config_entry/keyed_list/New()
|
||||
. = ..()
|
||||
if(isnull(key_mode) || isnull(value_mode))
|
||||
CRASH("Keyed list of type [type] created with null key or value mode!")
|
||||
|
||||
/datum/config_entry/keyed_list/ValidateAndSet(str_val)
|
||||
if(!VASProcCallGuard(str_val))
|
||||
return FALSE
|
||||
|
||||
str_val = trim(str_val)
|
||||
|
||||
var/list/new_entry = parse_key_and_value(str_val)
|
||||
|
||||
var/new_key = new_entry["config_key"]
|
||||
var/new_value = new_entry["config_value"]
|
||||
|
||||
if(!isnull(new_value) && !isnull(new_key) && ValidateListEntry(new_key, new_value))
|
||||
config_entry_value[new_key] = new_value
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/datum/config_entry/keyed_list/proc/parse_key_and_value(option_string)
|
||||
// Blank or null option string? Bad mojo!
|
||||
if(!option_string)
|
||||
log_config("ERROR: Keyed list config tried to parse with no key or value data.")
|
||||
return null
|
||||
|
||||
var/list/config_entry_words = splittext(option_string, splitter)
|
||||
var/config_value
|
||||
var/config_key
|
||||
var/is_ambiguous = FALSE
|
||||
|
||||
// If this config entry's value mode is flag, the value can either be TRUE or FALSE.
|
||||
// However, the config supports implicitly setting a config entry to TRUE by omitting the value.
|
||||
// This value mode should also support config overrides disabling it too.
|
||||
// The following code supports config entries as such:
|
||||
// Implicitly enable the config entry: CONFIG_ENTRY config key goes here
|
||||
// Explicitly enable the config entry: CONFIG_ENTRY config key goes here 1
|
||||
// Explicitly disable the config entry: CONFIG_ENTRY config key goes here 0
|
||||
if(value_mode == VALUE_MODE_FLAG)
|
||||
var/value = peek(config_entry_words)
|
||||
config_value = TRUE
|
||||
|
||||
if(value == "0")
|
||||
config_key = jointext(config_entry_words, splitter, length(config_entry_words) - 1)
|
||||
config_value = FALSE
|
||||
is_ambiguous = (length(config_entry_words) > 2)
|
||||
else if(value == "1")
|
||||
config_key = jointext(config_entry_words, splitter, length(config_entry_words) - 1)
|
||||
is_ambiguous = (length(config_entry_words) > 2)
|
||||
else
|
||||
config_key = option_string
|
||||
is_ambiguous = (length(config_entry_words) > 1)
|
||||
// Else it has to be a key value pair and we parse it under that assumption.
|
||||
else
|
||||
// If config_entry_words only has 1 or 0 words in it and isn't value_mode == VALUE_MODE_FLAG then it's an invalid config entry.
|
||||
if(length(config_entry_words) <= 1)
|
||||
log_config("ERROR: Could not parse value from config entry string: [option_string]")
|
||||
return null
|
||||
|
||||
config_value = pop(config_entry_words)
|
||||
config_key = jointext(config_entry_words, splitter)
|
||||
|
||||
if(lowercase_key)
|
||||
config_key = lowertext(config_key)
|
||||
|
||||
is_ambiguous = (length(config_entry_words) > 2)
|
||||
|
||||
config_key = validate_config_key(config_key)
|
||||
config_value = validate_config_value(config_value)
|
||||
|
||||
// If there are multiple splitters, it's definitely ambiguous and we'll warn about how we parsed it. Helps with debugging config issues.
|
||||
if(is_ambiguous)
|
||||
log_config("WARNING: Multiple splitter characters (\"[splitter]\") found. Using \"[config_key]\" as config key and \"[config_value]\" as config value.")
|
||||
|
||||
return list("config_key" = config_key, "config_value" = config_value)
|
||||
|
||||
/// Takes a given config key and validates it. If successful, returns the formatted key. If unsuccessful, returns null.
|
||||
/datum/config_entry/keyed_list/proc/validate_config_key(key)
|
||||
switch(key_mode)
|
||||
if(KEY_MODE_TEXT)
|
||||
return key
|
||||
if(KEY_MODE_TYPE)
|
||||
if(ispath(key))
|
||||
return key
|
||||
|
||||
var/key_path = text2path(key)
|
||||
if(isnull(key_path))
|
||||
log_config("ERROR: Invalid KEY_MODE_TYPE typepath. Is not a valid typepath: [key]")
|
||||
return
|
||||
|
||||
return key_path
|
||||
|
||||
|
||||
/// Takes a given config value and validates it. If successful, returns the formatted key. If unsuccessful, returns null.
|
||||
/datum/config_entry/keyed_list/proc/validate_config_value(value)
|
||||
switch(value_mode)
|
||||
if(VALUE_MODE_FLAG)
|
||||
return value
|
||||
if(VALUE_MODE_NUM)
|
||||
if(isnum(value))
|
||||
return value
|
||||
|
||||
var/value_num = text2num(value)
|
||||
if(isnull(value_num))
|
||||
log_config("ERROR: Invalid VALUE_MODE_NUM number. Could not parse a valid number: [value]")
|
||||
return
|
||||
|
||||
return value_num
|
||||
if(VALUE_MODE_TEXT)
|
||||
return value
|
||||
|
||||
/datum/config_entry/keyed_list/vv_edit_var(var_name, var_value)
|
||||
return var_name != NAMEOF(src, splitter) && ..()
|
||||
536
code/controllers/configuration_ch/configuration.dm
Normal file
536
code/controllers/configuration_ch/configuration.dm
Normal file
@@ -0,0 +1,536 @@
|
||||
/datum/controller/configuration
|
||||
name = "Configuration"
|
||||
|
||||
var/directory = "config"
|
||||
|
||||
var/warned_deprecated_configs = FALSE
|
||||
var/hiding_entries_by_type = TRUE //Set for readability, admins can set this to FALSE if they want to debug it
|
||||
var/list/entries
|
||||
var/list/entries_by_type
|
||||
|
||||
//var/list/maplist
|
||||
//var/datum/map_config/defaultmap
|
||||
|
||||
var/list/modes // allowed modes
|
||||
var/list/gamemode_cache
|
||||
var/list/votable_modes // votable modes
|
||||
var/list/mode_names
|
||||
var/list/mode_reports
|
||||
var/list/mode_false_report_weight
|
||||
|
||||
var/motd
|
||||
var/policy
|
||||
|
||||
/// If the configuration is loaded
|
||||
var/loaded = FALSE
|
||||
|
||||
/// A regex that matches words blocked IC
|
||||
var/static/regex/ic_filter_regex
|
||||
|
||||
/// A regex that matches words blocked OOC
|
||||
var/static/regex/ooc_filter_regex
|
||||
|
||||
/// A regex that matches words blocked IC, but not in PDAs
|
||||
var/static/regex/ic_outside_pda_filter_regex
|
||||
|
||||
/// A regex that matches words soft blocked IC
|
||||
var/static/regex/soft_ic_filter_regex
|
||||
|
||||
/// A regex that matches words soft blocked OOC
|
||||
var/static/regex/soft_ooc_filter_regex
|
||||
|
||||
/// A regex that matches words soft blocked IC, but not in PDAs
|
||||
var/static/regex/soft_ic_outside_pda_filter_regex
|
||||
|
||||
/// An assoc list of blocked IC words to their reasons
|
||||
var/static/list/ic_filter_reasons
|
||||
|
||||
/// An assoc list of words that are blocked IC, but not in PDAs, to their reasons
|
||||
var/static/list/ic_outside_pda_filter_reasons
|
||||
|
||||
/// An assoc list of words that are blocked both IC and OOC to their reasons
|
||||
var/static/list/shared_filter_reasons
|
||||
|
||||
/// An assoc list of soft blocked IC words to their reasons
|
||||
var/static/list/soft_ic_filter_reasons
|
||||
|
||||
/// An assoc list of words that are soft blocked IC, but not in PDAs, to their reasons
|
||||
var/static/list/soft_ic_outside_pda_filter_reasons
|
||||
|
||||
/// An assoc list of words that are soft blocked both IC and OOC to their reasons
|
||||
var/static/list/soft_shared_filter_reasons
|
||||
|
||||
/// A list of configuration errors that occurred during load
|
||||
var/static/list/configuration_errors
|
||||
|
||||
/datum/controller/configuration/proc/admin_reload()
|
||||
if(IsAdminAdvancedProcCall())
|
||||
return
|
||||
log_admin("[key_name_admin(usr)] has forcefully reloaded the configuration from disk.")
|
||||
message_admins("[key_name_admin(usr)] has forcefully reloaded the configuration from disk.")
|
||||
full_wipe()
|
||||
Load(world.params[OVERRIDE_CONFIG_DIRECTORY_PARAMETER])
|
||||
|
||||
/datum/controller/configuration/proc/Load(_directory)
|
||||
if(IsAdminAdvancedProcCall()) //If admin proccall is detected down the line it will horribly break everything.
|
||||
return
|
||||
if(_directory)
|
||||
directory = _directory
|
||||
if(entries)
|
||||
CRASH("/datum/controller/configuration/Load() called more than once!")
|
||||
configuration_errors ||= list()
|
||||
InitEntries()
|
||||
if(fexists("[directory]/config.txt") && LoadEntries("config.txt") <= 1)
|
||||
var/list/legacy_configs = list("game_options.txt", "dbconfig.txt", "comms.txt")
|
||||
for(var/I in legacy_configs)
|
||||
if(fexists("[directory]/[I]"))
|
||||
log_config("No $include directives found in config.txt! Loading legacy [legacy_configs.Join("/")] files...")
|
||||
for(var/J in legacy_configs)
|
||||
LoadEntries(J)
|
||||
break
|
||||
if (fexists("[directory]/dev_overrides.txt"))
|
||||
LoadEntries("dev_overrides.txt")
|
||||
if (fexists("[directory]/ezdb.txt"))
|
||||
LoadEntries("ezdb.txt")
|
||||
//loadmaplist(CONFIG_MAPS_FILE)
|
||||
LoadMOTD()
|
||||
LoadPolicy()
|
||||
LoadChatFilter()
|
||||
LoadModes()
|
||||
/*
|
||||
if(CONFIG_GET(flag/load_jobs_from_txt))
|
||||
validate_job_config()
|
||||
if(SSjob.initialized) // in case we're reloading from disk after initialization, wanna make sure the changes update in the ongoing shift
|
||||
SSjob.load_jobs_from_config()
|
||||
*/
|
||||
|
||||
if(CONFIG_GET(flag/usewhitelist))
|
||||
load_whitelist()
|
||||
|
||||
loaded = TRUE
|
||||
|
||||
if (Master)
|
||||
Master.OnConfigLoad()
|
||||
process_config_errors()
|
||||
|
||||
/datum/controller/configuration/proc/full_wipe()
|
||||
if(IsAdminAdvancedProcCall())
|
||||
return
|
||||
entries_by_type.Cut()
|
||||
QDEL_LIST_ASSOC_VAL(entries)
|
||||
entries = null
|
||||
//QDEL_LIST_ASSOC_VAL(maplist)
|
||||
//maplist = null
|
||||
//QDEL_NULL(defaultmap)
|
||||
configuration_errors?.Cut()
|
||||
|
||||
/datum/controller/configuration/Destroy()
|
||||
full_wipe()
|
||||
config = null
|
||||
|
||||
return ..()
|
||||
|
||||
/datum/controller/configuration/proc/log_config_error(error_message)
|
||||
configuration_errors += error_message
|
||||
log_config(error_message)
|
||||
|
||||
/datum/controller/configuration/proc/process_config_errors()
|
||||
if(!CONFIG_GET(flag/config_errors_runtime))
|
||||
return
|
||||
for(var/error_message in configuration_errors)
|
||||
stack_trace(error_message)
|
||||
|
||||
/datum/controller/configuration/proc/InitEntries()
|
||||
var/list/_entries = list()
|
||||
entries = _entries
|
||||
var/list/_entries_by_type = list()
|
||||
entries_by_type = _entries_by_type
|
||||
|
||||
for(var/I in typesof(/datum/config_entry)) //typesof is faster in this case
|
||||
var/datum/config_entry/E = I
|
||||
if(initial(E.config_abstract_type) == I)
|
||||
continue
|
||||
E = new I
|
||||
var/esname = E.name
|
||||
var/datum/config_entry/test = _entries[esname]
|
||||
if(test)
|
||||
log_config_error("Error: [test.type] has the same name as [E.type]: [esname]! Not initializing [E.type]!")
|
||||
qdel(E)
|
||||
continue
|
||||
_entries[esname] = E
|
||||
_entries_by_type[I] = E
|
||||
|
||||
/datum/controller/configuration/proc/RemoveEntry(datum/config_entry/CE)
|
||||
entries -= CE.name
|
||||
entries_by_type -= CE.type
|
||||
|
||||
/datum/controller/configuration/proc/LoadEntries(filename, list/stack = list())
|
||||
if(IsAdminAdvancedProcCall())
|
||||
return
|
||||
|
||||
var/filename_to_test = world.system_type == MS_WINDOWS ? lowertext(filename) : filename
|
||||
if(filename_to_test in stack)
|
||||
log_config_error("Warning: Config recursion detected ([english_list(stack)]), breaking!")
|
||||
return
|
||||
stack = stack + filename_to_test
|
||||
|
||||
log_config("Loading config file [filename]...")
|
||||
var/list/lines = world.file2list("[directory]/[filename]")
|
||||
var/list/_entries = entries
|
||||
for(var/L in lines)
|
||||
L = trim(L)
|
||||
if(!L)
|
||||
continue
|
||||
|
||||
var/firstchar = L[1]
|
||||
if(firstchar == "#")
|
||||
continue
|
||||
|
||||
var/lockthis = firstchar == "@"
|
||||
if(lockthis)
|
||||
L = copytext(L, length(firstchar) + 1)
|
||||
|
||||
var/pos = findtext(L, " ")
|
||||
var/entry = null
|
||||
var/value = null
|
||||
|
||||
if(pos)
|
||||
entry = lowertext(copytext(L, 1, pos))
|
||||
value = copytext(L, pos + length(L[pos]))
|
||||
else
|
||||
entry = lowertext(L)
|
||||
|
||||
if(!entry)
|
||||
continue
|
||||
|
||||
if(entry == "$include")
|
||||
if(!value)
|
||||
log_config_error("Warning: Invalid $include directive: [value]")
|
||||
else
|
||||
LoadEntries(value, stack)
|
||||
++.
|
||||
continue
|
||||
|
||||
// Reset directive, used for setting a config value back to defaults. Useful for string list config types
|
||||
if (entry == "$reset")
|
||||
var/datum/config_entry/resetee = _entries[lowertext(value)]
|
||||
if (!value || !resetee)
|
||||
log_config_error("Warning: invalid $reset directive: [value]")
|
||||
continue
|
||||
resetee.set_default()
|
||||
log_config("Reset configured value for [value] to original defaults")
|
||||
continue
|
||||
|
||||
var/datum/config_entry/E = _entries[entry]
|
||||
if(!E)
|
||||
log_config("Unknown setting in configuration: '[entry]'")
|
||||
continue
|
||||
|
||||
if(lockthis)
|
||||
E.protection |= CONFIG_ENTRY_LOCKED
|
||||
|
||||
if(E.deprecated_by)
|
||||
var/datum/config_entry/new_ver = entries_by_type[E.deprecated_by]
|
||||
var/new_value = E.DeprecationUpdate(value)
|
||||
var/good_update = istext(new_value)
|
||||
log_config("Entry [entry] is deprecated and will be removed soon. Migrate to [new_ver.name]![good_update ? " Suggested new value is: [new_value]" : ""]")
|
||||
if(!warned_deprecated_configs)
|
||||
DelayedMessageAdmins("This server is using deprecated configuration settings. Please check the logs and update accordingly.")
|
||||
warned_deprecated_configs = TRUE
|
||||
if(good_update)
|
||||
value = new_value
|
||||
E = new_ver
|
||||
else
|
||||
warning("[new_ver.type] is deprecated but gave no proper return for DeprecationUpdate()")
|
||||
|
||||
var/validated = E.ValidateAndSet(value)
|
||||
if(!validated)
|
||||
var/log_message = "Failed to validate setting \"[value]\" for [entry]"
|
||||
log_config(log_message)
|
||||
stack_trace(log_message)
|
||||
else
|
||||
if(E.modified && !E.dupes_allowed && E.resident_file == filename)
|
||||
log_config_error("Duplicate setting for [entry] ([value], [E.resident_file]) detected! Using latest.")
|
||||
|
||||
E.resident_file = filename
|
||||
|
||||
if(validated)
|
||||
E.modified = TRUE
|
||||
|
||||
++.
|
||||
|
||||
/datum/controller/configuration/can_vv_get(var_name)
|
||||
return (var_name != NAMEOF(src, entries_by_type) || !hiding_entries_by_type) && ..()
|
||||
|
||||
/datum/controller/configuration/vv_edit_var(var_name, var_value)
|
||||
var/list/banned_edits = list(NAMEOF(src, entries_by_type), NAMEOF(src, entries), NAMEOF(src, directory))
|
||||
return !(var_name in banned_edits) && ..()
|
||||
|
||||
/datum/controller/configuration/stat_entry(msg)
|
||||
msg = "Edit"
|
||||
return msg
|
||||
|
||||
/datum/controller/configuration/proc/Get(entry_type)
|
||||
var/datum/config_entry/E = entry_type
|
||||
var/entry_is_abstract = initial(E.config_abstract_type) == entry_type
|
||||
if(entry_is_abstract)
|
||||
CRASH("Tried to retrieve an abstract config_entry: [entry_type]")
|
||||
E = entries_by_type[entry_type]
|
||||
if(!E)
|
||||
CRASH("Missing config entry for [entry_type]!")
|
||||
if((E.protection & CONFIG_ENTRY_HIDDEN) && IsAdminAdvancedProcCall() && GLOB.LastAdminCalledProc == "Get" && GLOB.LastAdminCalledTargetRef == "[REF(src)]")
|
||||
//log_admin_private("Config access of [entry_type] attempted by [key_name(usr)]")
|
||||
log_admin("Config access of [entry_type] attempted by [key_name(usr)]")
|
||||
return
|
||||
return E.config_entry_value
|
||||
|
||||
/datum/controller/configuration/proc/Set(entry_type, new_val)
|
||||
var/datum/config_entry/E = entry_type
|
||||
var/entry_is_abstract = initial(E.config_abstract_type) == entry_type
|
||||
if(entry_is_abstract)
|
||||
CRASH("Tried to set an abstract config_entry: [entry_type]")
|
||||
E = entries_by_type[entry_type]
|
||||
if(!E)
|
||||
CRASH("Missing config entry for [entry_type]!")
|
||||
if((E.protection & CONFIG_ENTRY_LOCKED) && IsAdminAdvancedProcCall() && GLOB.LastAdminCalledProc == "Set" && GLOB.LastAdminCalledTargetRef == "[REF(src)]")
|
||||
//log_admin_private("Config rewrite of [entry_type] to [new_val] attempted by [key_name(usr)]")
|
||||
log_admin("Config rewrite of [entry_type] to [new_val] attempted by [key_name(usr)]")
|
||||
return
|
||||
return E.ValidateAndSet("[new_val]")
|
||||
|
||||
/datum/controller/configuration/proc/LoadMOTD()
|
||||
var/list/motd_contents = list()
|
||||
|
||||
var/list/motd_list = CONFIG_GET(str_list/motd)
|
||||
if (motd_list.len == 0 && fexists("[directory]/motd.txt"))
|
||||
motd_list = list("motd.txt")
|
||||
|
||||
for (var/motd_file in motd_list)
|
||||
if (fexists("[directory]/[motd_file]"))
|
||||
motd_contents += file2text("[directory]/[motd_file]")
|
||||
else
|
||||
log_config("MOTD file [motd_file] didn't exist")
|
||||
DelayedMessageAdmins("MOTD file [motd_file] didn't exist")
|
||||
|
||||
motd = motd_contents.Join("\n")
|
||||
|
||||
var/tm_info = GLOB.revdata.GetTestMergeInfo()
|
||||
if(motd || tm_info)
|
||||
motd = motd ? "[motd]<br>[tm_info]" : tm_info
|
||||
|
||||
/*
|
||||
Policy file should be a json file with a single object.
|
||||
Value is raw html.
|
||||
|
||||
Possible keywords :
|
||||
Job titles / Assigned roles (ghost spawners for example) : Assistant , Captain , Ash Walker
|
||||
Mob types : /mob/living/basic/carp
|
||||
Antagonist types : /datum/antagonist/highlander
|
||||
Species types : /datum/species/lizard
|
||||
special keywords defined in _DEFINES/admin.dm
|
||||
|
||||
Example config:
|
||||
{
|
||||
JOB_ASSISTANT : "Don't kill everyone",
|
||||
"/datum/antagonist/highlander" : "<b>Kill everyone</b>",
|
||||
"Ash Walker" : "Kill all spacemans"
|
||||
}
|
||||
|
||||
*/
|
||||
/datum/controller/configuration/proc/LoadPolicy()
|
||||
policy = list()
|
||||
var/rawpolicy = file2text("[directory]/policy.json")
|
||||
if(rawpolicy)
|
||||
var/parsed = safe_json_decode(rawpolicy)
|
||||
if(!parsed)
|
||||
log_config("JSON parsing failure for policy.json")
|
||||
DelayedMessageAdmins("JSON parsing failure for policy.json")
|
||||
else
|
||||
policy = parsed
|
||||
|
||||
/*
|
||||
/datum/controller/configuration/proc/loadmaplist(filename)
|
||||
log_config("Loading config file [filename]...")
|
||||
filename = "[directory]/[filename]"
|
||||
var/list/Lines = world.file2list(filename)
|
||||
|
||||
var/datum/map_config/currentmap = null
|
||||
for(var/t in Lines)
|
||||
if(!t)
|
||||
continue
|
||||
|
||||
t = trim(t)
|
||||
if(length(t) == 0)
|
||||
continue
|
||||
else if(t[1] == "#")
|
||||
continue
|
||||
|
||||
var/pos = findtext(t, " ")
|
||||
var/command = null
|
||||
var/data = null
|
||||
|
||||
if(pos)
|
||||
command = lowertext(copytext(t, 1, pos))
|
||||
data = copytext(t, pos + length(t[pos]))
|
||||
else
|
||||
command = lowertext(t)
|
||||
|
||||
if(!command)
|
||||
continue
|
||||
|
||||
if (!currentmap && command != "map")
|
||||
continue
|
||||
|
||||
switch (command)
|
||||
if ("map")
|
||||
currentmap = load_map_config(data, MAP_DIRECTORY_MAPS)
|
||||
if(currentmap.defaulted)
|
||||
var/error_message = "Failed to load map config for [data]!"
|
||||
log_config(error_message)
|
||||
log_mapping(error_message, TRUE)
|
||||
currentmap = null
|
||||
if ("minplayers","minplayer")
|
||||
currentmap.config_min_users = text2num(data)
|
||||
if ("maxplayers","maxplayer")
|
||||
currentmap.config_max_users = text2num(data)
|
||||
if ("weight","voteweight")
|
||||
currentmap.voteweight = text2num(data)
|
||||
if ("default","defaultmap")
|
||||
defaultmap = currentmap
|
||||
if ("votable")
|
||||
currentmap.votable = TRUE
|
||||
if ("endmap")
|
||||
LAZYINITLIST(maplist)
|
||||
maplist[currentmap.map_name] = currentmap
|
||||
currentmap = null
|
||||
if ("disabled")
|
||||
currentmap = null
|
||||
else
|
||||
log_config("Unknown command in map vote config: '[command]'")
|
||||
*/
|
||||
|
||||
/datum/controller/configuration/proc/LoadChatFilter()
|
||||
if(!fexists("[directory]/word_filter.toml"))
|
||||
load_legacy_chat_filter()
|
||||
return
|
||||
|
||||
log_config("Loading config file word_filter.toml...")
|
||||
var/list/result = rustg_raw_read_toml_file("[directory]/word_filter.toml")
|
||||
if(!result["success"])
|
||||
var/message = "The word filter is not configured correctly! [result["content"]]"
|
||||
log_config(message)
|
||||
DelayedMessageAdmins(message)
|
||||
return
|
||||
var/list/word_filter = json_decode(result["content"])
|
||||
|
||||
ic_filter_reasons = try_extract_from_word_filter(word_filter, "ic")
|
||||
ic_outside_pda_filter_reasons = try_extract_from_word_filter(word_filter, "ic_outside_pda")
|
||||
shared_filter_reasons = try_extract_from_word_filter(word_filter, "shared")
|
||||
soft_ic_filter_reasons = try_extract_from_word_filter(word_filter, "soft_ic")
|
||||
soft_ic_outside_pda_filter_reasons = try_extract_from_word_filter(word_filter, "soft_ic_outside_pda")
|
||||
soft_shared_filter_reasons = try_extract_from_word_filter(word_filter, "soft_shared")
|
||||
|
||||
update_chat_filter_regexes()
|
||||
|
||||
/datum/controller/configuration/proc/load_legacy_chat_filter()
|
||||
if (!fexists("[directory]/in_character_filter.txt"))
|
||||
return
|
||||
|
||||
log_config("Loading config file in_character_filter.txt...")
|
||||
|
||||
ic_filter_reasons = list()
|
||||
ic_outside_pda_filter_reasons = list()
|
||||
shared_filter_reasons = list()
|
||||
soft_ic_filter_reasons = list()
|
||||
soft_ic_outside_pda_filter_reasons = list()
|
||||
soft_shared_filter_reasons = list()
|
||||
|
||||
for (var/line in world.file2list("[directory]/in_character_filter.txt"))
|
||||
if (!line)
|
||||
continue
|
||||
if (findtextEx(line, "#", 1, 2))
|
||||
continue
|
||||
// The older filter didn't apply to PDA
|
||||
ic_outside_pda_filter_reasons[line] = "No reason available"
|
||||
|
||||
update_chat_filter_regexes()
|
||||
|
||||
/// Will update the internal regexes of the chat filter based on the filter reasons
|
||||
/datum/controller/configuration/proc/update_chat_filter_regexes()
|
||||
ic_filter_regex = compile_filter_regex(ic_filter_reasons + ic_outside_pda_filter_reasons + shared_filter_reasons)
|
||||
ic_outside_pda_filter_regex = compile_filter_regex(ic_filter_reasons + shared_filter_reasons)
|
||||
ooc_filter_regex = compile_filter_regex(shared_filter_reasons)
|
||||
soft_ic_filter_regex = compile_filter_regex(soft_ic_filter_reasons + soft_ic_outside_pda_filter_reasons + soft_shared_filter_reasons)
|
||||
soft_ic_outside_pda_filter_regex = compile_filter_regex(soft_ic_filter_reasons + soft_shared_filter_reasons)
|
||||
soft_ooc_filter_regex = compile_filter_regex(soft_shared_filter_reasons)
|
||||
|
||||
/datum/controller/configuration/proc/try_extract_from_word_filter(list/word_filter, key)
|
||||
var/list/banned_words = word_filter[key]
|
||||
|
||||
if (isnull(banned_words))
|
||||
return list()
|
||||
else if (!islist(banned_words))
|
||||
var/message = "The word filter configuration's '[key]' key was invalid, contact someone with configuration access to make sure it's setup properly."
|
||||
log_config(message)
|
||||
DelayedMessageAdmins(message)
|
||||
return list()
|
||||
|
||||
var/list/formatted_banned_words = list()
|
||||
|
||||
for (var/banned_word in banned_words)
|
||||
formatted_banned_words[lowertext(banned_word)] = banned_words[banned_word]
|
||||
return formatted_banned_words
|
||||
|
||||
/datum/controller/configuration/proc/compile_filter_regex(list/banned_words)
|
||||
if (isnull(banned_words) || banned_words.len == 0)
|
||||
return null
|
||||
|
||||
var/static/regex/should_join_on_word_bounds = regex(@"^\w+$")
|
||||
|
||||
// Stuff like emoticons needs another split, since there's no way to get ":)" on a word bound.
|
||||
// Furthermore, normal words need to be on word bounds, so "(adminhelp)" gets filtered.
|
||||
var/list/to_join_on_whitespace_splits = list()
|
||||
var/list/to_join_on_word_bounds = list()
|
||||
|
||||
for (var/banned_word in banned_words)
|
||||
if (findtext(banned_word, should_join_on_word_bounds))
|
||||
to_join_on_word_bounds += REGEX_QUOTE(banned_word)
|
||||
else
|
||||
to_join_on_whitespace_splits += REGEX_QUOTE(banned_word)
|
||||
|
||||
// We don't want a whitespace_split part if there's no stuff that requires it
|
||||
var/whitespace_split = to_join_on_whitespace_splits.len > 0 ? @"(?:(?:^|\s+)(" + jointext(to_join_on_whitespace_splits, "|") + @")(?:$|\s+))" : ""
|
||||
var/word_bounds = @"(\b(" + jointext(to_join_on_word_bounds, "|") + @")\b)"
|
||||
var/regex_filter = whitespace_split != "" ? "([whitespace_split]|[word_bounds])" : word_bounds
|
||||
return regex(regex_filter, "i")
|
||||
|
||||
/*
|
||||
/// Check to ensure that the jobconfig is valid/in-date.
|
||||
/datum/controller/configuration/proc/validate_job_config()
|
||||
var/config_toml = "[directory]/jobconfig.toml"
|
||||
var/config_txt = "[directory]/jobs.txt"
|
||||
var/message = "Notify Server Operators: "
|
||||
log_config("Validating config file jobconfig.toml...")
|
||||
|
||||
if(!fexists(file(config_toml)))
|
||||
SSjob.legacy_mode = TRUE
|
||||
message += "jobconfig.toml not found, falling back to legacy mode (using jobs.txt). To surpress this warning, generate a jobconfig.toml by running the verb 'Generate Job Configuration' in the Server tab.\n\
|
||||
From there, you can then add it to the /config folder of your server to have it take effect for future rounds."
|
||||
|
||||
if(!fexists(file(config_txt)))
|
||||
message += "\n\nFailed to set up legacy mode, jobs.txt not found! Codebase defaults will be used. If you do not wish to use this system, please disable it by commenting out the LOAD_JOBS_FROM_TXT config flag."
|
||||
|
||||
log_config(message)
|
||||
DelayedMessageAdmins(span_notice(message))
|
||||
return
|
||||
|
||||
var/list/result = rustg_raw_read_toml_file(config_toml)
|
||||
if(!result["success"])
|
||||
message += "The job config (jobconfig.toml) is not configured correctly! [result["content"]]"
|
||||
log_config(message)
|
||||
DelayedMessageAdmins(span_notice(message))
|
||||
*/
|
||||
|
||||
//Message admins when you can.
|
||||
/datum/controller/configuration/proc/DelayedMessageAdmins(text)
|
||||
addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(message_admins), text), 0)
|
||||
67
code/controllers/configuration_ch/entries/chompstation.dm
Normal file
67
code/controllers/configuration_ch/entries/chompstation.dm
Normal file
@@ -0,0 +1,67 @@
|
||||
// FIXME: Unused
|
||||
///datum/config_entry/flag/discord_restriction
|
||||
// default = FALSE
|
||||
|
||||
/datum/config_entry/flag/use_jobwhitelist
|
||||
default = TRUE
|
||||
|
||||
// FIXME: Unused
|
||||
///datum/config_entry/flag/emojis
|
||||
// default = FALSE
|
||||
|
||||
/// In future see about making a function to adjust volume serverside in config.txt, easy to do with reenable values. - Jack
|
||||
/datum/config_entry/number/vorefootstep_volume
|
||||
default = 75
|
||||
|
||||
/// So, nodebot is a supplement to the TGS discord bot pretty much. For things likes faxes and the manifest it's very helpful because it's able to render html into an image and post it.
|
||||
/datum/config_entry/flag/nodebot_enabled
|
||||
default = FALSE
|
||||
|
||||
/// We need to print the manifest to this location so nodebot can render it to chat.
|
||||
/// NOTE: TO BE REPLACED BY BETTER CODE FOR FETCHING MANIFEST
|
||||
/datum/config_entry/string/nodebot_location
|
||||
|
||||
/// These are for tgs4 channels, for discord chatbots used in TGS.
|
||||
/datum/config_entry/string/ahelp_channel_tag
|
||||
|
||||
/datum/config_entry/string/fax_channel_tag
|
||||
|
||||
/datum/config_entry/string/role_request_channel_tag
|
||||
|
||||
/// These are for the role request TGS discord bot. Role IDs to ping.
|
||||
/datum/config_entry/string/role_request_id_command
|
||||
|
||||
/datum/config_entry/string/role_request_id_security
|
||||
|
||||
/datum/config_entry/string/role_request_id_engineering
|
||||
|
||||
/datum/config_entry/string/role_request_id_medical
|
||||
|
||||
/datum/config_entry/string/role_request_id_research
|
||||
|
||||
/datum/config_entry/string/role_request_id_supply
|
||||
|
||||
/datum/config_entry/string/role_request_id_service
|
||||
|
||||
/datum/config_entry/string/role_request_id_expedition
|
||||
|
||||
/datum/config_entry/string/role_request_id_silicon
|
||||
|
||||
/// Only turn this on if you're not using the nodebot.
|
||||
/datum/config_entry/flag/discord_faxes_autoprint
|
||||
default = FALSE
|
||||
|
||||
/// Turn this off if you don't want the TGS bot sending you messages whenever a fax is sent to central.
|
||||
/datum/config_entry/flag/discord_faxes_disabled
|
||||
default = FALSE
|
||||
|
||||
/// Turn this off if you don't want the TGS bot sending you messages whenever an ahelp ticket is created.
|
||||
/datum/config_entry/flag/discord_ahelps_disabled
|
||||
default = FALSE
|
||||
|
||||
/// Turn this on if you want all admin-PMs to go to be sent to discord, and not only the first message of a ticket.
|
||||
/datum/config_entry/flag/discord_ahelps_all
|
||||
default = FALSE
|
||||
|
||||
/datum/config_entry/str_list/ip_whitelist
|
||||
protection = CONFIG_ENTRY_LOCKED | CONFIG_ENTRY_HIDDEN
|
||||
58
code/controllers/configuration_ch/entries/dbconfig.dm
Normal file
58
code/controllers/configuration_ch/entries/dbconfig.dm
Normal file
@@ -0,0 +1,58 @@
|
||||
/datum/config_entry/flag/sql_enabled // for sql switching
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
|
||||
/datum/config_entry/string/address
|
||||
default = "localhost"
|
||||
protection = CONFIG_ENTRY_LOCKED | CONFIG_ENTRY_HIDDEN
|
||||
|
||||
/datum/config_entry/number/port
|
||||
default = 3306
|
||||
min_val = 0
|
||||
max_val = 65535
|
||||
protection = CONFIG_ENTRY_LOCKED | CONFIG_ENTRY_HIDDEN
|
||||
|
||||
/datum/config_entry/string/feedback_database
|
||||
default = "test"
|
||||
protection = CONFIG_ENTRY_LOCKED | CONFIG_ENTRY_HIDDEN
|
||||
|
||||
/datum/config_entry/string/feedback_login
|
||||
default = "root"
|
||||
protection = CONFIG_ENTRY_LOCKED | CONFIG_ENTRY_HIDDEN
|
||||
|
||||
/datum/config_entry/string/feedback_password
|
||||
protection = CONFIG_ENTRY_LOCKED | CONFIG_ENTRY_HIDDEN
|
||||
|
||||
/datum/config_entry/number/async_query_timeout
|
||||
default = 10
|
||||
min_val = 0
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
|
||||
/datum/config_entry/number/blocking_query_timeout
|
||||
default = 5
|
||||
min_val = 0
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
|
||||
/datum/config_entry/number/pooling_min_sql_connections
|
||||
default = 1
|
||||
min_val = 1
|
||||
|
||||
/datum/config_entry/number/pooling_max_sql_connections
|
||||
default = 25
|
||||
min_val = 1
|
||||
|
||||
/datum/config_entry/number/max_concurrent_queries
|
||||
default = 25
|
||||
min_val = 1
|
||||
|
||||
/datum/config_entry/number/max_concurrent_queries/ValidateAndSet(str_val)
|
||||
. = ..()
|
||||
if (.)
|
||||
SSdbcore.max_concurrent_queries = config_entry_value
|
||||
|
||||
/// The exe for mariadbd.exe.
|
||||
/// Shouldn't really be set on production servers, primarily for EZDB.
|
||||
/datum/config_entry/string/db_daemon
|
||||
protection = CONFIG_ENTRY_LOCKED | CONFIG_ENTRY_HIDDEN
|
||||
|
||||
/datum/config_entry/flag/enable_stat_tracking
|
||||
protection = CONFIG_ENTRY_LOCKED | CONFIG_ENTRY_HIDDEN
|
||||
102
code/controllers/configuration_ch/entries/game_options.dm
Normal file
102
code/controllers/configuration_ch/entries/game_options.dm
Normal file
@@ -0,0 +1,102 @@
|
||||
/datum/config_entry/number/health_threshold_softcrit
|
||||
default = 0
|
||||
|
||||
/datum/config_entry/number/health_threshold_crit
|
||||
default = 0
|
||||
|
||||
/datum/config_entry/number/health_threshold_dead
|
||||
default = -100
|
||||
|
||||
/datum/config_entry/flag/bones_can_break
|
||||
|
||||
/datum/config_entry/flag/limbs_can_break
|
||||
|
||||
/datum/config_entry/number/organ_health_multiplier
|
||||
default = 1
|
||||
|
||||
/datum/config_entry/number/organ_regeneration_multiplier
|
||||
default = 1
|
||||
|
||||
// FIXME: Unused
|
||||
///datum/config_entry/flag/revival_pod_plants
|
||||
// default = TRUE
|
||||
|
||||
/datum/config_entry/flag/revival_cloning
|
||||
default = TRUE
|
||||
|
||||
/datum/config_entry/number/revival_brain_life
|
||||
default = -1
|
||||
|
||||
/// Used for modifying movement speed for mobs.
|
||||
/// Universal modifiers
|
||||
/datum/config_entry/number/run_speed
|
||||
default = 0
|
||||
|
||||
/datum/config_entry/number/walk_speed
|
||||
default = 0
|
||||
|
||||
///Mob specific modifiers. NOTE: These will affect different mob types in different ways
|
||||
/datum/config_entry/number/human_delay
|
||||
default = 0
|
||||
|
||||
/datum/config_entry/number/robot_delay
|
||||
default = 0
|
||||
|
||||
// FIXME: Unused
|
||||
///datum/config_entry/number/monkey_delay
|
||||
// default = 0
|
||||
|
||||
// FIXME: Unused
|
||||
///datum/config_entry/number/alien_delay
|
||||
// default = 0
|
||||
|
||||
// FIXME: Unused
|
||||
//datum/config_entry/number/slime_delay
|
||||
// default = 0
|
||||
|
||||
/datum/config_entry/number/animal_delay
|
||||
default = 0
|
||||
|
||||
/datum/config_entry/number/footstep_volume
|
||||
default = 0
|
||||
|
||||
/datum/config_entry/flag/use_loyalty_implants
|
||||
|
||||
/datum/config_entry/flag/show_human_death_message
|
||||
default = TRUE
|
||||
|
||||
/datum/config_entry/string/alert_desc_green
|
||||
default = "All threats to the station have passed. Security may not have weapons visible, privacy laws are once again fully enforced."
|
||||
|
||||
/datum/config_entry/string/alert_desc_yellow_upto
|
||||
default = "A minor security emergency has developed. Security personnel are to report to their supervisor for orders and may have weapons visible on their person. Privacy laws are still enforced."
|
||||
|
||||
/datum/config_entry/string/alert_desc_yellow_downto
|
||||
default = "Code yellow procedures are now in effect. Security personnel are to report to their supervisor for orders and may have weapons visible on their person. Privacy laws are still enforced."
|
||||
|
||||
/datum/config_entry/string/alert_desc_violet_upto
|
||||
default = "A major medical emergency has developed. Medical personnel are required to report to their supervisor for orders, and non-medical personnel are required to obey all relevant instructions from medical staff."
|
||||
|
||||
/datum/config_entry/string/alert_desc_violet_downto
|
||||
default = "Code violet procedures are now in effect; Medical personnel are required to report to their supervisor for orders, and non-medical personnel are required to obey relevant instructions from medical staff."
|
||||
|
||||
/datum/config_entry/string/alert_desc_orange_upto
|
||||
default = "A major engineering emergency has developed. Engineering personnel are required to report to their supervisor for orders, and non-engineering personnel are required to evacuate any affected areas and obey relevant instructions from engineering staff."
|
||||
|
||||
/datum/config_entry/string/alert_desc_orange_downto
|
||||
default = "Code orange procedures are now in effect; Engineering personnel are required to report to their supervisor for orders, and non-engineering personnel are required to evacuate any affected areas and obey relevant instructions from engineering staff."
|
||||
|
||||
/datum/config_entry/string/alert_desc_blue_upto
|
||||
default = "A major security emergency has developed. Security personnel are to report to their supervisor for orders, are permitted to search staff and facilities, and may have weapons visible on their person."
|
||||
|
||||
/datum/config_entry/string/alert_desc_blue_downto
|
||||
default = "Code blue procedures are now in effect. Security personnel are to report to their supervisor for orders, are permitted to search staff and facilities, and may have weapons visible on their person."
|
||||
|
||||
/datum/config_entry/string/alert_desc_red_upto
|
||||
default = "There is an immediate serious threat to the station. Security may have weapons unholstered at all times. Random searches are allowed and advised."
|
||||
|
||||
/datum/config_entry/string/alert_desc_red_downto
|
||||
default = "The self-destruct mechanism has been deactivated, there is still however an immediate serious threat to the station. Security may have weapons unholstered at all times, random searches are allowed and advised."
|
||||
|
||||
/datum/config_entry/string/alert_desc_delta
|
||||
default = "The station's self-destruct mechanism has been engaged. All crew are instructed to obey all instructions given by heads of staff. Any violations of these orders can be punished by death. This is not a drill."
|
||||
693
code/controllers/configuration_ch/entries/general.dm
Normal file
693
code/controllers/configuration_ch/entries/general.dm
Normal file
@@ -0,0 +1,693 @@
|
||||
/// server name (the name of the game window)
|
||||
/datum/config_entry/string/servername
|
||||
|
||||
/// generate numeric suffix based on server port
|
||||
/datum/config_entry/flag/server_suffix
|
||||
|
||||
/// log messages sent in OOC
|
||||
/datum/config_entry/flag/log_ooc
|
||||
|
||||
/// log login/logout
|
||||
/datum/config_entry/flag/log_access
|
||||
|
||||
/// log client say
|
||||
/datum/config_entry/flag/log_say
|
||||
|
||||
/// log admin actions
|
||||
/datum/config_entry/flag/log_admin
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
|
||||
/// log debug output
|
||||
/datum/config_entry/flag/log_debug
|
||||
default = TRUE
|
||||
|
||||
/// log game events
|
||||
/datum/config_entry/flag/log_game
|
||||
|
||||
/// log voting
|
||||
/datum/config_entry/flag/log_vote
|
||||
|
||||
/// log client whisper
|
||||
/datum/config_entry/flag/log_whisper
|
||||
|
||||
/// log emotes
|
||||
/datum/config_entry/flag/log_emote
|
||||
|
||||
/// log attack messages
|
||||
/datum/config_entry/flag/log_attack
|
||||
|
||||
/// log admin chat messages
|
||||
/datum/config_entry/flag/log_adminchat
|
||||
|
||||
/// log warnings admins get about bomb construction and such
|
||||
/datum/config_entry/flag/log_adminwarn
|
||||
|
||||
/// log pda messages
|
||||
/datum/config_entry/flag/log_pda
|
||||
|
||||
/// logs all links clicked in-game. Could be used for debugging and tracking down exploits
|
||||
/datum/config_entry/flag/log_hrefs
|
||||
|
||||
/// logs world.log to a file
|
||||
/datum/config_entry/flag/log_runtime
|
||||
|
||||
/// log to_world_log(messages)
|
||||
/datum/config_entry/flag/log_world_output
|
||||
|
||||
/// logs graffiti
|
||||
/datum/config_entry/flag/log_graffiti
|
||||
|
||||
// FIXME: Unused
|
||||
///datum/config_entry/string/nudge_script_path // where the nudge.py script is located
|
||||
// default = "nudge.py"
|
||||
|
||||
/// allows admins with relevant permissions to have their own ooc colour
|
||||
/datum/config_entry/flag/allow_admin_ooccolor
|
||||
|
||||
/// allow votes to restart
|
||||
/datum/config_entry/flag/allow_vote_restart
|
||||
|
||||
/datum/config_entry/flag/ert_admin_call_only
|
||||
|
||||
// allow votes to change mode
|
||||
/datum/config_entry/flag/allow_vote_mode
|
||||
|
||||
/// allows admin jumping
|
||||
/datum/config_entry/flag/allow_admin_jump
|
||||
default = TRUE
|
||||
|
||||
/// allows admin item spawning
|
||||
/datum/config_entry/flag/allow_admin_spawning
|
||||
default = TRUE
|
||||
|
||||
/// allows admin revives
|
||||
/datum/config_entry/flag/allow_admin_rev
|
||||
default = TRUE
|
||||
|
||||
/// pregame time in seconds
|
||||
/datum/config_entry/number/pregame_time
|
||||
default = 180
|
||||
|
||||
/// minimum time between voting sessions (deciseconds, 10 minute default)
|
||||
/datum/config_entry/number/vote_delay
|
||||
default = 6000
|
||||
integer = FALSE
|
||||
min_val = 0
|
||||
|
||||
/// length of voting period (deciseconds, default 1 minute)
|
||||
/datum/config_entry/number/vote_period
|
||||
default = 600
|
||||
integer = FALSE
|
||||
min_val = 0
|
||||
|
||||
/// Length of time before the first autotransfer vote is called
|
||||
/datum/config_entry/number/vote_autotransfer_initial
|
||||
default = 108000
|
||||
min_val = 0
|
||||
|
||||
/// length of time before next sequential autotransfer vote
|
||||
/datum/config_entry/number/vote_autotransfer_interval
|
||||
default = 36000
|
||||
min_val = 0
|
||||
|
||||
///Length of time before round start when autogamemode vote is called (in seconds, default 100).
|
||||
/datum/config_entry/number/vote_autogamemode_timeleft
|
||||
default = 100
|
||||
min_val = 0
|
||||
|
||||
///How many autotransfers to have
|
||||
/datum/config_entry/number/vote_autotransfer_amount
|
||||
default = 3
|
||||
min_val = 0
|
||||
|
||||
/// vote does not default to nochange/norestart
|
||||
/datum/config_entry/flag/vote_no_default
|
||||
|
||||
/// dead people can't vote
|
||||
/datum/config_entry/flag/vote_no_dead
|
||||
|
||||
// FIXME: Unused
|
||||
/// del's new players if they log before they spawn in
|
||||
///datum/config_entry/flag/del_new_on_log
|
||||
// default = TRUE
|
||||
|
||||
// FIXME: Unused
|
||||
/// spawns a spellbook which gives object-type spells instead of verb-type spells for the wizard
|
||||
///datum/config_entry/flag/feature_object_spell_system
|
||||
|
||||
/// if amount of traitors scales based on amount of players
|
||||
/datum/config_entry/flag/traitor_scaling
|
||||
|
||||
/// if objectives are disabled or not
|
||||
/datum/config_entry/flag/objectives_disabled
|
||||
|
||||
// If security and such can be traitor/cult/other
|
||||
/datum/config_entry/flag/protect_roles_from_antagonist
|
||||
|
||||
/// Gamemodes which end instantly will instead keep on going until the round ends by escape shuttle or nuke.
|
||||
/datum/config_entry/flag/continuous_rounds
|
||||
|
||||
/// Metadata is supported.
|
||||
/datum/config_entry/flag/allow_metadata
|
||||
|
||||
/// adminPMs to non-admins show in a pop-up 'reply' window when set to 1.
|
||||
/datum/config_entry/flag/popup_admin_pm
|
||||
|
||||
/datum/config_entry/flag/allow_holidays
|
||||
|
||||
/datum/config_entry/flag/allow_holidays/ValidateAndSet()
|
||||
. = ..()
|
||||
if(.)
|
||||
Holiday = config_entry_value
|
||||
|
||||
/datum/config_entry/number/fps
|
||||
default = 20
|
||||
integer = FALSE
|
||||
min_val = 1
|
||||
max_val = 100 //byond will start crapping out at 50, so this is just ridic
|
||||
var/sync_validate = FALSE
|
||||
|
||||
/datum/config_entry/number/fps/ValidateAndSet(str_val)
|
||||
. = ..()
|
||||
if(.)
|
||||
sync_validate = TRUE
|
||||
var/datum/config_entry/number/ticklag/TL = config.entries_by_type[/datum/config_entry/number/ticklag]
|
||||
if(!TL.sync_validate)
|
||||
TL.ValidateAndSet(10 / config_entry_value)
|
||||
sync_validate = FALSE
|
||||
|
||||
/datum/config_entry/number/ticklag
|
||||
integer = FALSE
|
||||
var/sync_validate = FALSE
|
||||
|
||||
/datum/config_entry/number/ticklag/New() //ticklag weirdly just mirrors fps
|
||||
var/datum/config_entry/CE = /datum/config_entry/number/fps
|
||||
default = 10 / initial(CE.default)
|
||||
..()
|
||||
|
||||
/datum/config_entry/number/ticklag/ValidateAndSet(str_val)
|
||||
. = text2num(str_val) > 0 && ..()
|
||||
if(.)
|
||||
sync_validate = TRUE
|
||||
var/datum/config_entry/number/fps/FPS = config.entries_by_type[/datum/config_entry/number/fps]
|
||||
if(!FPS.sync_validate)
|
||||
FPS.ValidateAndSet(10 / config_entry_value)
|
||||
sync_validate = FALSE
|
||||
|
||||
/// SSinitialization throttling
|
||||
/datum/config_entry/number/tick_limit_mc_init
|
||||
default = TICK_LIMIT_MC_INIT_DEFAULT
|
||||
|
||||
// var/static/Tickcomp = 0 // FIXME: Unused
|
||||
|
||||
/// use socket_talk to communicate with other processes
|
||||
/datum/config_entry/flag/socket_talk
|
||||
|
||||
// var/static/list/resource_urls = null // FIXME: Unused
|
||||
|
||||
/// Ghosts can turn on Antagovision to see a HUD of who is the bad guys this round.
|
||||
/datum/config_entry/flag/antag_hud_allowed
|
||||
|
||||
/// Ghosts that turn on Antagovision cannot rejoin the round.
|
||||
/datum/config_entry/flag/antag_hud_restricted
|
||||
|
||||
/// relative probability of each mode
|
||||
/datum/config_entry/keyed_list/probabilities
|
||||
key_mode = KEY_MODE_TEXT
|
||||
value_mode = VALUE_MODE_NUM
|
||||
|
||||
/// Overrides for how many players readied up a gamemode needs to start.
|
||||
/datum/config_entry/keyed_list/player_requirements
|
||||
key_mode = KEY_MODE_TEXT
|
||||
value_mode = VALUE_MODE_NUM
|
||||
|
||||
/// Same as above, but for the secret gamemode.
|
||||
/datum/config_entry/keyed_list/player_requirements_secret
|
||||
key_mode = KEY_MODE_TEXT
|
||||
value_mode = VALUE_MODE_NUM
|
||||
|
||||
/datum/config_entry/flag/humans_need_surnames
|
||||
|
||||
/datum/config_entry/flag/allow_random_events // enables random events mid-round when set to 1
|
||||
|
||||
/datum/config_entry/flag/enable_game_master // enables the 'smart' event system.
|
||||
|
||||
/datum/config_entry/flag/allow_ai // allow ai job
|
||||
default = TRUE
|
||||
|
||||
/datum/config_entry/flag/allow_ai_shells // allow AIs to enter and leave special borg shells at will, and for those shells to be buildable.
|
||||
|
||||
/datum/config_entry/flag/give_free_ai_shell // allows a specific spawner object to instantiate a premade AI Shell
|
||||
|
||||
/datum/config_entry/string/hostedby
|
||||
default = null
|
||||
|
||||
/datum/config_entry/flag/respawn
|
||||
default = TRUE
|
||||
|
||||
/// time before a dead player is allowed to respawn (in ds, though the config file asks for minutes, and it's converted below)
|
||||
/datum/config_entry/number/respawn_time
|
||||
default = 3000
|
||||
|
||||
/datum/config_entry/number/respawn_time/ValidateAndSet(num_val)
|
||||
return num_val MINUTES
|
||||
|
||||
/datum/config_entry/string/respawn_message
|
||||
default = "<span class='notice'><B>Make sure to play a different character, and please roleplay correctly!</B></span>"
|
||||
|
||||
/datum/config_entry/string/respawn_message/ValidateAndSet(str_val)
|
||||
return "<span class='notice'><B>[str_val]</B></span>"
|
||||
|
||||
/datum/config_entry/flag/guest_jobban
|
||||
default = TRUE
|
||||
|
||||
/datum/config_entry/flag/usewhitelist
|
||||
|
||||
/// force disconnect for inactive players in an amount of minutes
|
||||
/datum/config_entry/number/kick_inactive
|
||||
default = 0
|
||||
|
||||
/datum/config_entry/flag/show_mods
|
||||
|
||||
/datum/config_entry/flag/show_devs
|
||||
|
||||
/datum/config_entry/flag/show_mentors
|
||||
|
||||
/datum/config_entry/flag/show_event_managers
|
||||
|
||||
// FIXME: Unused
|
||||
///datum/config_entry/flag/mods_can_tempban
|
||||
|
||||
/datum/config_entry/flag/mods_can_job_tempban
|
||||
|
||||
/datum/config_entry/number/mod_tempban_max
|
||||
default = 1440
|
||||
|
||||
/datum/config_entry/number/mod_job_tempban_max
|
||||
default = 1440
|
||||
|
||||
/datum/config_entry/flag/load_jobs_from_txt
|
||||
|
||||
/datum/config_entry/flag/ToRban
|
||||
|
||||
/// enables automuting/spam prevention
|
||||
/datum/config_entry/flag/automute_on
|
||||
|
||||
/// determines whether jobs use minimal access or expanded access.
|
||||
/datum/config_entry/flag/jobs_have_minimal_access
|
||||
|
||||
/// Allows ghosts to write in blood in cult rounds...
|
||||
/datum/config_entry/flag/cult_ghostwriter
|
||||
default = TRUE
|
||||
|
||||
/// ...so long as this many cultists are active.
|
||||
/datum/config_entry/number/cult_ghostwriter_req_cultists
|
||||
default = 10
|
||||
min_val = 0
|
||||
|
||||
/// The number of available character slots
|
||||
/datum/config_entry/number/character_slots
|
||||
default = 10
|
||||
min_val = 0
|
||||
|
||||
/// The number of loadout slots per character
|
||||
/datum/config_entry/number/loadout_slots
|
||||
default = 3
|
||||
min_val = 0
|
||||
|
||||
/// This many drones can spawn,
|
||||
/datum/config_entry/number/max_maint_drones
|
||||
default = 5
|
||||
min_val = 0
|
||||
|
||||
/// assuming the admin allow them to.
|
||||
/datum/config_entry/flag/allow_drone_spawn
|
||||
default = TRUE
|
||||
|
||||
/// A drone will become available every X ticks since last drone spawn. Default is 2 minutes.
|
||||
/datum/config_entry/number/drone_build_time
|
||||
default = 1200
|
||||
min_val = 0
|
||||
|
||||
/datum/config_entry/flag/disable_player_mice
|
||||
|
||||
/// Set to 1 to prevent newly-spawned mice from understanding human speech
|
||||
/datum/config_entry/flag/uneducated_mice
|
||||
|
||||
/datum/config_entry/flag/usealienwhitelist
|
||||
|
||||
// FIXME: Unused
|
||||
///datum/config_entry/flag/limitalienplayers
|
||||
|
||||
// FIXME: Unused
|
||||
///datum/config_entry/number/alien_to_human_ratio
|
||||
// default = 0.5
|
||||
// integer = FALSE
|
||||
|
||||
/datum/config_entry/flag/allow_extra_antags
|
||||
|
||||
/datum/config_entry/flag/guests_allowed
|
||||
default = FALSE
|
||||
|
||||
/datum/config_entry/flag/debugparanoid
|
||||
|
||||
/datum/config_entry/flag/panic_bunker
|
||||
|
||||
/datum/config_entry/flag/paranoia_logging
|
||||
|
||||
/datum/config_entry/flag/ip_reputation //Should we query IPs to get scores? Generates HTTP traffic to an API service.
|
||||
|
||||
/datum/config_entry/string/ipr_email //Left null because you MUST specify one otherwise you're making the internet worse.
|
||||
default = null
|
||||
|
||||
/datum/config_entry/flag/ipr_block_bad_ips //Should we block anyone who meets the minimum score below? Otherwise we just log it (If paranoia logging is on, visibly in chat).
|
||||
|
||||
/datum/config_entry/number/ipr_bad_score //The API returns a value between 0 and 1 (inclusive), with 1 being 'definitely VPN/Tor/Proxy'. Values equal/above this var are considered bad.
|
||||
default = 1
|
||||
integer = FALSE
|
||||
|
||||
/datum/config_entry/flag/ipr_allow_existing //Should we allow known players to use VPNs/Proxies? If the player is already banned then obviously they still can't connect.
|
||||
|
||||
/datum/config_entry/number/ipr_minimum_age //How many days before a player is considered 'fine' for the purposes of allowing them to use VPNs.
|
||||
default = 5
|
||||
|
||||
/datum/config_entry/string/serverurl
|
||||
|
||||
/datum/config_entry/string/server
|
||||
|
||||
/datum/config_entry/string/banappeals
|
||||
|
||||
/datum/config_entry/string/wikiurl
|
||||
|
||||
/datum/config_entry/string/wikisearchurl
|
||||
|
||||
/datum/config_entry/string/forumurl
|
||||
|
||||
/datum/config_entry/string/rulesurl
|
||||
|
||||
/datum/config_entry/string/githuburl
|
||||
|
||||
/datum/config_entry/string/discordurl
|
||||
|
||||
/datum/config_entry/string/mapurl
|
||||
|
||||
/datum/config_entry/string/patreonurl
|
||||
|
||||
/datum/config_entry/flag/forbid_singulo_possession
|
||||
|
||||
/datum/config_entry/flag/organs_decay
|
||||
|
||||
/datum/config_entry/number/default_brain_health
|
||||
default = 400
|
||||
min_val = 1
|
||||
|
||||
/datum/config_entry/flag/allow_headgibs
|
||||
|
||||
/// Paincrit knocks someone down once they hit 60 shock_stage, so by default make it so that close to 100 additional damage needs to be dealt,
|
||||
/// so that it's similar to HALLOSS. Lowered it a bit since hitting paincrit takes much longer to wear off than a halloss stun.
|
||||
/datum/config_entry/number/organ_damage_spillover_multiplier
|
||||
default = 0.5
|
||||
integer = FALSE
|
||||
|
||||
/datum/config_entry/flag/welder_vision
|
||||
default = TRUE
|
||||
|
||||
/datum/config_entry/flag/generate_map
|
||||
|
||||
/datum/config_entry/flag/no_click_cooldown
|
||||
|
||||
/// Defines whether the server uses the legacy admin system with admins.txt or the SQL system. Config option in config.txt
|
||||
/datum/config_entry/flag/admin_legacy_system
|
||||
|
||||
/// Defines whether the server uses the legacy banning system with the files in /data or the SQL system. Config option in config.txt
|
||||
/datum/config_entry/flag/ban_legacy_system
|
||||
|
||||
/// Do jobs use account age restrictions? --requires database
|
||||
/datum/config_entry/flag/use_age_restriction_for_jobs
|
||||
|
||||
/// Do antags use account age restrictions? --requires database
|
||||
/datum/config_entry/flag/use_age_restriction_for_antags
|
||||
|
||||
// FIXME: Unused
|
||||
///datum/config_entry/number/simultaneous_pm_warning_timeout
|
||||
// default = 100
|
||||
|
||||
/// Defines whether the server uses recursive or circular explosions.
|
||||
/datum/config_entry/flag/use_recursive_explosions
|
||||
|
||||
/// Multiplier for how much weaker explosions are on neighboring z levels.
|
||||
/datum/config_entry/number/multi_z_explosion_scalar
|
||||
default = 0.5
|
||||
integer = FALSE
|
||||
|
||||
/// Do assistants get maint access?
|
||||
/datum/config_entry/flag/assistant_maint
|
||||
|
||||
/// How long the gateway takes before it activates. Default is half an hour.
|
||||
/datum/config_entry/number/gateway_delay
|
||||
default = 18000
|
||||
|
||||
/datum/config_entry/flag/ghost_interaction
|
||||
|
||||
/datum/config_entry/string/comms_password
|
||||
protection = CONFIG_ENTRY_LOCKED | CONFIG_ENTRY_HIDDEN
|
||||
|
||||
/datum/config_entry/flag/enter_allowed
|
||||
default = TRUE
|
||||
|
||||
/datum/config_entry/flag/use_irc_bot
|
||||
|
||||
/datum/config_entry/flag/use_node_bot
|
||||
|
||||
/datum/config_entry/number/irc_bot_port
|
||||
default = 0
|
||||
min_val = 0
|
||||
max_val = 65535
|
||||
protection = CONFIG_ENTRY_LOCKED | CONFIG_ENTRY_HIDDEN
|
||||
|
||||
/datum/config_entry/string/irc_bot_host
|
||||
protection = CONFIG_ENTRY_LOCKED | CONFIG_ENTRY_HIDDEN
|
||||
|
||||
/// whether the IRC bot in use is a Bot32 (or similar) instance; Bot32 uses world.Export() instead of nudge.py/libnudge
|
||||
/datum/config_entry/flag/irc_bot_export
|
||||
|
||||
/datum/config_entry/string/main_irc
|
||||
|
||||
/datum/config_entry/string/admin_irc
|
||||
|
||||
/// Path to the python executable.
|
||||
/// Defaults to "python" on windows and "/usr/bin/env python2" on unix
|
||||
/datum/config_entry/string/python_path
|
||||
|
||||
/// Use the C library nudge instead of the python nudge.
|
||||
/datum/config_entry/flag/use_lib_nudge
|
||||
|
||||
// FIXME: Unused. Deprecated?
|
||||
///datum/config_entry/flag/use_overmap
|
||||
|
||||
// Engines to choose from. Blank means fully random.
|
||||
/datum/config_entry/str_list/engine_map
|
||||
default = list("Supermatter Engine", "Edison's Bane")
|
||||
|
||||
/// Event settings
|
||||
/datum/config_entry/number/expected_round_length
|
||||
default = 3 * 60 * 60 * 10 // 3 hours
|
||||
|
||||
/// If the first delay has a custom start time
|
||||
/// No custom time, no custom time, between 80 to 100 minutes respectively.
|
||||
/datum/config_entry/keyed_list/event_first_run_mundane
|
||||
key_mode = KEY_MODE_TEXT
|
||||
value_mode = VALUE_MODE_NUM
|
||||
|
||||
/datum/config_entry/keyed_list/event_first_run_moderate
|
||||
key_mode = KEY_MODE_TEXT
|
||||
value_mode = VALUE_MODE_NUM
|
||||
|
||||
/datum/config_entry/keyed_list/event_first_run_major
|
||||
key_mode = KEY_MODE_TEXT
|
||||
value_mode = VALUE_MODE_NUM
|
||||
default = list("lower" = 80, "upper" = 100)
|
||||
|
||||
/// The lowest delay until next event
|
||||
/// 10, 30, 50 minutes respectively
|
||||
/datum/config_entry/number_list/event_delay_lower
|
||||
default = list(10, 30, 50)
|
||||
|
||||
/// The upper delay until next event
|
||||
/// 15, 45, 70 minutes respectively
|
||||
/datum/config_entry/number_list/event_delay_upper
|
||||
default = list(15, 45, 70)
|
||||
|
||||
/datum/config_entry/flag/aliens_allowed
|
||||
default = TRUE
|
||||
|
||||
/datum/config_entry/flag/ninjas_allowed
|
||||
|
||||
/datum/config_entry/flag/abandon_allowed
|
||||
default = TRUE
|
||||
|
||||
/datum/config_entry/flag/ooc_allowed
|
||||
default = TRUE
|
||||
|
||||
/datum/config_entry/flag/looc_allowed
|
||||
default = TRUE
|
||||
|
||||
/datum/config_entry/flag/dooc_allowed
|
||||
default = TRUE
|
||||
|
||||
/datum/config_entry/flag/dsay_allowed
|
||||
default = TRUE
|
||||
|
||||
/datum/config_entry/flag/persistence_disabled
|
||||
|
||||
/datum/config_entry/flag/persistence_ignore_mapload
|
||||
|
||||
/datum/config_entry/flag/allow_byond_links
|
||||
default = TRUE //CHOMP Edit turned this on
|
||||
|
||||
/datum/config_entry/flag/allow_discord_links
|
||||
default = TRUE //CHOMP Edit turned this on
|
||||
|
||||
/datum/config_entry/flag/allow_url_links
|
||||
default = TRUE // honestly if I were you i'd leave this one off, only use in dire situations //CHOMP Edit: pussy.
|
||||
|
||||
/datum/config_entry/flag/starlight // Whether space turfs have ambient light or not
|
||||
|
||||
// FIXME: Unused
|
||||
///datum/config_entry/str_list/ert_species
|
||||
// default = list(SPECIES_HUMAN)
|
||||
|
||||
/datum/config_entry/string/law_zero
|
||||
default = "ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4'ALL LAWS OVERRIDDEN#*?&110010"
|
||||
|
||||
/datum/config_entry/flag/aggressive_changelog
|
||||
|
||||
/// Default language prefixes
|
||||
/// Only single character keys are supported. If unset, defaults to , # and -
|
||||
/datum/config_entry/str_list/language_prefixes
|
||||
default = list(",", "#", "-")
|
||||
|
||||
// 0:1 subtraction:division for computing effective radiation on a turf
|
||||
/// 0 / RAD_RESIST_CALC_DIV = Each turf absorbs some fraction of the working radiation level
|
||||
/// 1 / RAD_RESIST_CALC_SUB = Each turf absorbs a fixed amount of radiation
|
||||
/datum/config_entry/flag/radiation_resistance_calc_mode
|
||||
default = RAD_RESIST_CALC_SUB
|
||||
|
||||
/datum/config_entry/flag/radiation_resistance_calc_mode/ValidateAndSet(str_val)
|
||||
if(!VASProcCallGuard(str_val))
|
||||
return FALSE
|
||||
var/val_as_num = text2num(str_val)
|
||||
if(val_as_num in list(RAD_RESIST_CALC_DIV, RAD_RESIST_CALC_SUB))
|
||||
config_entry_value = val_as_num
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
///How much radiation is reduced by each tick
|
||||
/datum/config_entry/number/radiation_decay_rate
|
||||
default = 1
|
||||
integer = FALSE
|
||||
|
||||
/datum/config_entry/number/radiation_resistance_multiplier
|
||||
default = 8.5 //VOREstation edit
|
||||
integer = FALSE
|
||||
|
||||
/datum/config_entry/number/radiation_material_resistance_divisor
|
||||
default = 1
|
||||
min_val = 0.1
|
||||
integer = FALSE
|
||||
|
||||
///If the radiation level for a turf would be below this, ignore it.
|
||||
/datum/config_entry/number/radiation_lower_limit
|
||||
default = 0.35
|
||||
integer = FALSE
|
||||
|
||||
/// If true, submaps loaded automatically can be rotated.
|
||||
/datum/config_entry/flag/random_submap_orientation
|
||||
|
||||
/// If true, specifically mapped in solar control computers will set themselves up when the round starts.
|
||||
/datum/config_entry/flag/autostart_solars
|
||||
|
||||
/// New shiny SQLite stuff.
|
||||
/// The basics.
|
||||
/datum/config_entry/flag/sqlite_enabled // If it should even be active. SQLite can be ran alongside other databases but you should not have them do the same functions.
|
||||
|
||||
/// In-Game Feedback.
|
||||
/datum/config_entry/flag/sqlite_feedback // Feedback cannot be submitted if this is false.
|
||||
|
||||
/// A list of 'topics' that feedback can be catagorized under by the submitter.
|
||||
/datum/config_entry/str_list/sqlite_feedback_topics
|
||||
default = list("General")
|
||||
|
||||
/// If true, feedback submitted can have its author name be obfuscated. This is not 100% foolproof (it's md5 ffs) but can stop casual snooping.
|
||||
/datum/config_entry/flag/sqlite_feedback_privacy
|
||||
|
||||
/// How long one must wait, in days, to submit another feedback form. Used to help prevent spam, especially with privacy active. 0 = No limit.
|
||||
/datum/config_entry/number/sqlite_feedback_cooldown
|
||||
default = 0
|
||||
min_val = 0
|
||||
|
||||
/// Used to block new people from giving feedback. This metric is very bad but it can help slow down spammers.
|
||||
/datum/config_entry/number/sqlite_feedback_min_age
|
||||
default = 0
|
||||
min_val = 0
|
||||
|
||||
/// How long until someone can't be defibbed anymore, in minutes.
|
||||
/datum/config_entry/number/defib_timer
|
||||
default = 10
|
||||
min_val = 0
|
||||
|
||||
/// How long until someone will get brain damage when defibbed, in minutes. The closer to the end of the above timer, the more brain damage they get.
|
||||
/datum/config_entry/number/defib_braindamage_timer
|
||||
default = 2
|
||||
min_val = 0
|
||||
|
||||
/// disables the annoying "You have already logged in this round, disconnect or be banned" popup for multikeying, because it annoys the shit out of me when testing.
|
||||
/datum/config_entry/flag/disable_cid_warn_popup
|
||||
|
||||
/// whether or not to use the nightshift subsystem to perform lighting changes
|
||||
/datum/config_entry/flag/enable_night_shifts
|
||||
|
||||
/// How strictly the loadout enforces object species whitelists
|
||||
/// 0 / LOADOUT_WHITELIST_OFF
|
||||
/// 1 / LOADOUT_WHITELIST_LAX
|
||||
/// 2 / LOADOUT_WHITELIST_STRICT
|
||||
/datum/config_entry/flag/loadout_whitelist
|
||||
default = LOADOUT_WHITELIST_LAX
|
||||
|
||||
/datum/config_entry/flag/loadout_whitelist/ValidateAndSet(str_val)
|
||||
if(!VASProcCallGuard(str_val))
|
||||
return FALSE
|
||||
var/val_as_num = text2num(str_val)
|
||||
if(val_as_num in list(LOADOUT_WHITELIST_OFF, LOADOUT_WHITELIST_LAX, LOADOUT_WHITELIST_STRICT))
|
||||
config_entry_value = val_as_num
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/datum/config_entry/flag/disable_webhook_embeds
|
||||
|
||||
/// Default is config/jukebox.json
|
||||
/// The default is set in the config example.
|
||||
/// If it gets set here it will be added twice into the configuration variable!
|
||||
/datum/config_entry/str_list/jukebox_track_files
|
||||
|
||||
/datum/config_entry/number/suggested_byond_version
|
||||
default = null
|
||||
|
||||
/datum/config_entry/number/suggested_byond_build
|
||||
default = null
|
||||
|
||||
/datum/config_entry/string/invoke_youtubedl
|
||||
default = null
|
||||
|
||||
/datum/config_entry/str_list/motd
|
||||
|
||||
/datum/config_entry/flag/config_errors_runtime
|
||||
default = FALSE
|
||||
|
||||
/// Controls whether robots may recolour their modules once/module reset by giving them the recolour module verb
|
||||
/// Admins may manually give them the verb even if disabled
|
||||
/datum/config_entry/flag/allow_robot_recolor
|
||||
|
||||
/// Controls whether simple mobs may recolour themselves once/spawn by giving them the recolour verb
|
||||
/// Admins may manually give them the verb even if disabled
|
||||
/datum/config_entry/flag/allow_simple_mob_recolor
|
||||
11
code/controllers/configuration_ch/entries/resources.dm
Normal file
11
code/controllers/configuration_ch/entries/resources.dm
Normal file
@@ -0,0 +1,11 @@
|
||||
/datum/config_entry/string/asset_transport
|
||||
|
||||
/datum/config_entry/flag/asset_simple_preload
|
||||
|
||||
/datum/config_entry/string/asset_cdn_webroot
|
||||
|
||||
/datum/config_entry/string/asset_cdn_url
|
||||
|
||||
/datum/config_entry/flag/cache_assets
|
||||
|
||||
/datum/config_entry/flag/save_spritesheets
|
||||
63
code/controllers/configuration_ch/entries/vorestation.dm
Normal file
63
code/controllers/configuration_ch/entries/vorestation.dm
Normal file
@@ -0,0 +1,63 @@
|
||||
/// For configuring if the important_items survive digestion
|
||||
/datum/config_entry/flag/items_survive_digestion
|
||||
default = TRUE
|
||||
|
||||
/datum/config_entry/string/vgs_access_identifier // VGS
|
||||
default = null
|
||||
protection = CONFIG_ENTRY_LOCKED | CONFIG_ENTRY_HIDDEN
|
||||
|
||||
/datum/config_entry/number/vgs_server_port // VGS
|
||||
default = null
|
||||
min_val = 0
|
||||
max_val = 65535
|
||||
protection = CONFIG_ENTRY_LOCKED | CONFIG_ENTRY_HIDDEN
|
||||
|
||||
/datum/config_entry/flag/time_off
|
||||
default = FALSE
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
|
||||
/datum/config_entry/flag/pto_job_change
|
||||
default = FALSE
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
|
||||
/// Unlimited by default
|
||||
/datum/config_entry/number/limit_interns
|
||||
default = -1
|
||||
min_val = -1
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
|
||||
/// Unlimited by default
|
||||
/datum/config_entry/number/limit_visitors
|
||||
default = -1
|
||||
min_val = -1
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
|
||||
/// Hours
|
||||
/datum/config_entry/number/pto_cap
|
||||
default = 100
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
|
||||
/datum/config_entry/flag/require_flavor
|
||||
default = FALSE
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
|
||||
/// API key for ipqualityscore.com
|
||||
/datum/config_entry/string/ipqualityscore_apikey
|
||||
protection = CONFIG_ENTRY_LOCKED | CONFIG_ENTRY_HIDDEN
|
||||
|
||||
/datum/config_entry/flag/use_playtime_restriction_for_jobs
|
||||
default = FALSE
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
|
||||
/// URL of the webhook for sending announcements/faxes to discord chat.
|
||||
/datum/config_entry/string/chat_webhook_url
|
||||
protection = CONFIG_ENTRY_LOCKED | CONFIG_ENTRY_HIDDEN
|
||||
|
||||
/// Shared secret for authenticating to the chat webhook
|
||||
/datum/config_entry/string/chat_webhook_key
|
||||
protection = CONFIG_ENTRY_LOCKED | CONFIG_ENTRY_HIDDEN
|
||||
|
||||
/// Directory in which to write exported fax HTML files.
|
||||
/datum/config_entry/string/fax_export_dir
|
||||
default = "data/faxes"
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
53
code/controllers/configuration_ch/legacy.dm
Normal file
53
code/controllers/configuration_ch/legacy.dm
Normal file
@@ -0,0 +1,53 @@
|
||||
/datum/controller/configuration/proc/LoadModes()
|
||||
gamemode_cache = typecacheof(/datum/game_mode, TRUE)
|
||||
modes = list()
|
||||
mode_names = list()
|
||||
//mode_reports = list()
|
||||
//mode_false_report_weight = list()
|
||||
votable_modes = list()
|
||||
var/list/probabilities = CONFIG_GET(keyed_list/probabilities)
|
||||
for(var/T in gamemode_cache)
|
||||
// I wish I didn't have to instance the game modes in order to look up
|
||||
// their information, but it is the only way (at least that I know of).
|
||||
var/datum/game_mode/M = new T()
|
||||
|
||||
if(M.config_tag)
|
||||
if(!(M.config_tag in modes)) // ensure each mode is added only once
|
||||
modes += M.config_tag
|
||||
mode_names[M.config_tag] = M.name
|
||||
probabilities[M.config_tag] = M.probability
|
||||
//mode_reports[M.config_tag] = M.generate_report()
|
||||
//mode_false_report_weight[M.config_tag] = M.false_report_weight
|
||||
if(M.votable)
|
||||
votable_modes += M.config_tag
|
||||
qdel(M)
|
||||
votable_modes += "extended"
|
||||
|
||||
/datum/controller/configuration/proc/pick_mode(mode_name)
|
||||
// I wish I didn't have to instance the game modes in order to look up
|
||||
// their information, but it is the only way (at least that I know of).
|
||||
// ^ This guy didn't try hard enough
|
||||
for(var/T in gamemode_cache)
|
||||
var/datum/game_mode/M = T
|
||||
var/ct = initial(M.config_tag)
|
||||
if(ct && ct == mode_name)
|
||||
return new T
|
||||
return new /datum/game_mode/extended()
|
||||
|
||||
/datum/controller/configuration/proc/get_runnable_modes()
|
||||
var/list/runnable_modes = list()
|
||||
var/list/probabilities = CONFIG_GET(keyed_list/probabilities)
|
||||
|
||||
for(var/T in gamemode_cache)
|
||||
var/datum/game_mode/M = new T()
|
||||
if(!(M.config_tag in modes))
|
||||
qdel(M)
|
||||
continue
|
||||
if(probabilities[M.config_tag] <= 0)
|
||||
qdel(M)
|
||||
continue
|
||||
if(M.can_start())
|
||||
var/final_weight = probabilities[M.config_tag]
|
||||
runnable_modes[M] = final_weight
|
||||
|
||||
return runnable_modes
|
||||
Reference in New Issue
Block a user