diff --git a/code/__DEFINES/donator_groupings.dm b/code/__DEFINES/donator_groupings.dm new file mode 100644 index 0000000000..6d28d2acb5 --- /dev/null +++ b/code/__DEFINES/donator_groupings.dm @@ -0,0 +1,18 @@ +#define DONATOR_GROUPING_TIER_1_CONFIG_PATH /datum/config_entry/keyed_list/donator/tier_1_donators +#define DONATOR_GROUPING_TIER_2_CONFIG_PATH /datum/config_entry/keyed_list/donator/tier_2_donators +#define DONATOR_GROUPING_TIER_3_CONFIG_PATH /datum/config_entry/keyed_list/donator/tier_3_donators + +#define DONATOR_GROUPING_TIER_1_CONFIG_SUBPATH keyed_list/donator/tier_1_donators +#define DONATOR_GROUPING_TIER_2_CONFIG_SUBPATH keyed_list/donator/tier_2_donators +#define DONATOR_GROUPING_TIER_3_CONFIG_SUBPATH keyed_list/donator/tier_3_donators + +#define TIER_1_DONATORS CONFIG_GET(DONATOR_GROUPING_TIER_1_CONFIG_SUBPATH) +#define TIER_2_DONATORS CONFIG_GET(DONATOR_GROUPING_TIER_2_CONFIG_SUBPATH) +#define TIER_3_DONATORS CONFIG_GET(DONATOR_GROUPING_TIER_3_CONFIG_SUBPATH) + +//flags +#define DONATOR_GROUP_TIER_1 "T1" +#define DONATOR_GROUP_TIER_2 "T2" +#define DONATOR_GROUP_TIER_3 "T3" + +#define IS_CKEY_DONATOR_GROUP(ckey, group) is_donator_group(ckey, group) diff --git a/code/__HELPERS/donator_groupings.dm b/code/__HELPERS/donator_groupings.dm new file mode 100644 index 0000000000..3dad088629 --- /dev/null +++ b/code/__HELPERS/donator_groupings.dm @@ -0,0 +1,26 @@ +/* +Current specifications: + +Donator groups in __DEFINES/donator_groupings.dm, config entries in controllers/configuration/entries/donator.dm + +3 groups, Tier 1/2/3 +Each tier includes the one before it (ascending) +For fast lookups, this is generated using regenerate_donator_grouping_list() + +*/ + +/proc/is_donator_group(ckey, group) + ckey = ckey(ckey) //make sure it's ckey'd. + return GLOB.donators_by_group[group]?.Find(ckey) + +/proc/regenerate_donator_grouping_list() + var/list/donator_list = GLOB.donators_by_group = list() //reinit everything + + var/list/inclusive_add = list() //speed! + + inclusive_add += TIER_1_DONATORS + donator_list[DONATOR_GROUP_TIER_1] = inclusive_add.Copy() + inclusive_add += TIER_2_DONATORS + donator_list[DONATOR_GROUP_TIER_2] = inclusive_add.Copy() + inclusive_add += TIER_3_DONATORS + donator_list[DONATOR_GROUP_TIER_3] = inclusive_add.Copy() diff --git a/code/_globalvars/lists/misc.dm b/code/_globalvars/lists/misc.dm new file mode 100644 index 0000000000..1dcde53a72 --- /dev/null +++ b/code/_globalvars/lists/misc.dm @@ -0,0 +1 @@ +GLOBAL_LIST_EMPTY(donators_by_group) //group id = donator list of ckeys diff --git a/code/controllers/configuration/config_entry.dm b/code/controllers/configuration/config_entry.dm index 49ff1c8d49..3ac103affc 100644 --- a/code/controllers/configuration/config_entry.dm +++ b/code/controllers/configuration/config_entry.dm @@ -19,6 +19,7 @@ var/abstract_type = /datum/config_entry //do not instantiate if type matches this var/vv_VAS = TRUE //Force validate and set on VV. VAS proccall guard will run regardless. + var/postload_required = FALSE //requires running OnPostload() var/dupes_allowed = FALSE @@ -72,6 +73,9 @@ /datum/config_entry/proc/DeprecationUpdate(value) return +/datum/config_entry/proc/OnPostload() + return + /datum/config_entry/string config_entry_value = "" abstract_type = /datum/config_entry/string @@ -80,7 +84,7 @@ /datum/config_entry/string/vv_edit_var(var_name, var_value) return var_name != "auto_trim" && ..() -/datum/config_entry/string/ValidateAndSet(str_val) +/datum/config_entry/string/ValidateAndSet(str_val, during_load) if(!VASProcCallGuard(str_val)) return FALSE config_entry_value = auto_trim ? trim(str_val) : str_val diff --git a/code/controllers/configuration/configuration.dm b/code/controllers/configuration/configuration.dm index 0232081c1a..ea2919f342 100644 --- a/code/controllers/configuration/configuration.dm +++ b/code/controllers/configuration/configuration.dm @@ -101,6 +101,7 @@ log_config("Loading config file [filename]...") var/list/lines = world.file2list("[directory]/[filename]") var/list/_entries = entries + var/list/postload_required = list() for(var/L in lines) L = trim(L) if(!L) @@ -157,18 +158,24 @@ else warning("[new_ver.type] is deprecated but gave no proper return for DeprecationUpdate()") - var/validated = E.ValidateAndSet(value) + var/validated = E.ValidateAndSet(value, TRUE) if(!validated) log_config("Failed to validate setting \"[value]\" for [entry]") else if(E.modified && !E.dupes_allowed) log_config("Duplicate setting for [entry] ([value], [E.resident_file]) detected! Using latest.") + if(E.postload_required) + postload_required[E] = TRUE E.resident_file = filename if(validated) E.modified = TRUE + for(var/i in postload_required) + var/datum/config_entry/E = i + E.OnPostload() + ++. /datum/controller/configuration/can_vv_get(var_name) diff --git a/code/controllers/configuration/entries/donator.dm b/code/controllers/configuration/entries/donator.dm new file mode 100644 index 0000000000..b74d5f5839 --- /dev/null +++ b/code/controllers/configuration/entries/donator.dm @@ -0,0 +1,22 @@ +/datum/config_entry/keyed_list/donator_group + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_FLAG + abstract_type = /datum/config_entry/keyed_list/donator_group + +//If we're in the middle of a config load, only do the regeneration afterwards to prevent this from wasting a massive amount of CPU for list regenerations. +/datum/config_entry/keyed_list/donator_group/ValidateAndSet(str_val, during_load) + . = ..() + if(. && during_load) + regenerate_donator_grouping_list() + +/datum/config_entry/keyed_list/donator_group/OnPostload() + . = ..() + regenerate_donator_grouping_list() + +//This is kinda weird in that the config entries are defined here but all the handling/calculations are in __HELPERS/donator_groupings.dm + +/datum/config_entry/keyed_list/donator_group/tier_1_donators + +/datum/config_entry/keyed_list/donator_group/tier_2_donators + +/datum/config_entry/keyed_list/donator_group/tier_3_donators diff --git a/config/config.txt b/config/config.txt index 3bc9f873a9..a01f5424da 100644 --- a/config/config.txt +++ b/config/config.txt @@ -4,6 +4,7 @@ $include game_options.txt $include dbconfig.txt $include comms.txt $include antag_rep.txt +$include donator_groupings.txt # You can use the @ character at the beginning of a config option to lock it from being edited in-game # Example usage: diff --git a/config/donator_groupings.txt b/config/donator_groupings.txt new file mode 100644 index 0000000000..b26d1efe22 --- /dev/null +++ b/config/donator_groupings.txt @@ -0,0 +1,8 @@ +#this is a bad system but I'm lazy so it piggybacks off config loader system. +#Specify group followed by ckey for each ckey. + +#TIER_1_DONATORS test_ckey + +#TIER_2_DONATORS test_ckey + +#TIER_3_DONATORS test_ckey diff --git a/modular_citadel/code/modules/client/loadout/loadout.dm b/modular_citadel/code/modules/client/loadout/_loadout.dm similarity index 97% rename from modular_citadel/code/modules/client/loadout/loadout.dm rename to modular_citadel/code/modules/client/loadout/_loadout.dm index 2e11519d0b..8571a62893 100644 --- a/modular_citadel/code/modules/client/loadout/loadout.dm +++ b/modular_citadel/code/modules/client/loadout/_loadout.dm @@ -50,6 +50,9 @@ GLOBAL_LIST_EMPTY(loadout_whitelist_ids) var/path //item-to-spawn path var/cost = 1 //normally, each loadout costs a single point. var/geargroupID //defines the ID that the gear inherits from the config + + var/donator_group_id //New donator group ID system. + var/list/restricted_roles var/list/ckeywhitelist var/restricted_desc