diff --git a/code/controllers/configuration/configuration.dm b/code/controllers/configuration/configuration.dm index 0ca9e039e4e..a07ab33f80b 100644 --- a/code/controllers/configuration/configuration.dm +++ b/code/controllers/configuration/configuration.dm @@ -60,6 +60,9 @@ /// 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 @@ -75,6 +78,7 @@ 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") @@ -97,6 +101,7 @@ if (Master) Master.OnConfigLoad() + process_config_errors() /datum/controller/configuration/proc/full_wipe() if(IsAdminAdvancedProcCall()) @@ -107,6 +112,7 @@ QDEL_LIST_ASSOC_VAL(maplist) maplist = null QDEL_NULL(defaultmap) + configuration_errors?.Cut() /datum/controller/configuration/Destroy() full_wipe() @@ -114,6 +120,16 @@ 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 @@ -128,7 +144,7 @@ var/esname = E.name var/datum/config_entry/test = _entries[esname] if(test) - log_config("Error: [test.type] has the same name as [E.type]: [esname]! Not initializing [E.type]!") + log_config_error("Error: [test.type] has the same name as [E.type]: [esname]! Not initializing [E.type]!") qdel(E) continue _entries[esname] = E @@ -144,7 +160,7 @@ var/filename_to_test = world.system_type == MS_WINDOWS ? lowertext(filename) : filename if(filename_to_test in stack) - log_config("Warning: Config recursion detected ([english_list(stack)]), breaking!") + log_config_error("Warning: Config recursion detected ([english_list(stack)]), breaking!") return stack = stack + filename_to_test @@ -179,7 +195,7 @@ if(entry == "$include") if(!value) - log_config("Warning: Invalid $include directive: [value]") + log_config_error("Warning: Invalid $include directive: [value]") else LoadEntries(value, stack) ++. @@ -189,7 +205,7 @@ if (entry == "$reset") var/datum/config_entry/resetee = _entries[lowertext(value)] if (!value || !resetee) - log_config("Warning: invalid $reset directive: [value]") + log_config_error("Warning: invalid $reset directive: [value]") continue resetee.set_default() log_config("Reset configured value for [value] to original defaults") @@ -219,10 +235,12 @@ var/validated = E.ValidateAndSet(value) if(!validated) - log_config("Failed to validate setting \"[value]\" for [entry]") + 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) - log_config("Duplicate setting for [entry] ([value], [E.resident_file]) detected! Using latest.") + log_config_error("Duplicate setting for [entry] ([value], [E.resident_file]) detected! Using latest.") E.resident_file = filename diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm index da57c49a1e5..db651b88a64 100644 --- a/code/controllers/configuration/entries/general.dm +++ b/code/controllers/configuration/entries/general.dm @@ -525,7 +525,7 @@ /datum/config_entry/string/chat_announce_new_game deprecated_by = /datum/config_entry/string/channel_announce_new_game -/datum/config_entry/flag/chat_announce_new_game/DeprecationUpdate(value) +/datum/config_entry/string/chat_announce_new_game/DeprecationUpdate(value) return "" //default broadcast /datum/config_entry/string/channel_announce_new_game @@ -659,3 +659,6 @@ /datum/config_entry/string/morgue_cadaver_override_species /datum/config_entry/flag/toast_notification_on_init + +/datum/config_entry/flag/config_errors_runtime + default = FALSE diff --git a/config/config.txt b/config/config.txt index 68afbf5b7e4..a0d1ca448b8 100644 --- a/config/config.txt +++ b/config/config.txt @@ -642,3 +642,6 @@ PR_ANNOUNCEMENTS_PER_ROUND 5 ## Comment to disable sending a toast notification on the host server when initializations complete. ## Even if this is enabled, a notification will only be sent if there are no clients connected. TOAST_NOTIFICATION_ON_INIT + +## Causes configuration errors to spit out runtimes +CONFIG_ERRORS_RUNTIME