diff --git a/code/__defines/lists.dm b/code/__defines/lists.dm index 9935dab6b5c7..1975c8ee7f5b 100644 --- a/code/__defines/lists.dm +++ b/code/__defines/lists.dm @@ -32,6 +32,9 @@ // Reads L or an empty list if L is not a list. Note: Does NOT assign, L may be an expression. #define SANITIZE_LIST(L) ( islist(L) ? L : list() ) +/// Inserts `I` at the end of the list (NOT LAZYLIST) L. If I is a list, it will insert the list itself as an entry, rather than adding each item in I. +#define ADD_LIST_AS_ENTRY(L, I) (L[++L.len] = I) // NOTE: THIS MUST ONLY EVER REFERENCE `I` ONCE; THIS IS A MACRO AND EACH VARIABLE USAGE IS A LITERAL EXPANSION + // The above but for alists. Prefixed with A_ because inserting "A" randomly in the name just made it confusing #define A_LAZYINITLIST(AL) if (!AL) { AL = alist(); } #define A_UNSETEMPTY(AL) if(!length(AL)) { AL = null; } diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm index 4acbcff8b72f..43614e9f2094 100644 --- a/code/game/jobs/access.dm +++ b/code/game/jobs/access.dm @@ -116,31 +116,45 @@ var/global/list/datum/access/priv_all_access_datums /proc/get_all_access_datums() - if(!priv_all_access_datums) - priv_all_access_datums = init_subtypes(/datum/access) - priv_all_access_datums = dd_sortedObjectList(priv_all_access_datums) + if(!global.priv_all_access_datums) + global.priv_all_access_datums = init_subtypes(/datum/access) + global.priv_all_access_datums = dd_sortedObjectList(global.priv_all_access_datums) - return priv_all_access_datums.Copy() + return global.priv_all_access_datums.Copy() var/global/list/datum/access/priv_all_access_datums_id /proc/get_all_access_datums_by_id() - if(!priv_all_access_datums_id) - priv_all_access_datums_id = list() + if(!global.priv_all_access_datums_id) + global.priv_all_access_datums_id = list() for(var/datum/access/A in get_all_access_datums()) - priv_all_access_datums_id["[A.id]"] = A + global.priv_all_access_datums_id["[A.id]"] = A - return priv_all_access_datums_id.Copy() + return global.priv_all_access_datums_id.Copy() -var/global/list/datum/access/priv_all_access_datums_region +var/global/alist/priv_all_access_datums_region +/// Returns an alist of all region indices -> their associated access datums. /proc/get_all_access_datums_by_region() - if(!priv_all_access_datums_region) - priv_all_access_datums_region = list() + RETURN_TYPE(/alist) + if(!global.priv_all_access_datums_region) + global.priv_all_access_datums_region = alist() for(var/datum/access/A in get_all_access_datums()) - if(!priv_all_access_datums_region[A.region]) - priv_all_access_datums_region[A.region] = list() - priv_all_access_datums_region[A.region] += A + if(!global.priv_all_access_datums_region[A.region]) + global.priv_all_access_datums_region[A.region] = alist() + global.priv_all_access_datums_region[A.region] += A - return priv_all_access_datums_region.Copy() + return global.priv_all_access_datums_region.Copy() + +var/global/alist/priv_all_access_datums_region_names +/// Returns an alist of all region names -> their associated access datums. +/proc/get_all_access_datums_by_region_name() + RETURN_TYPE(/alist) + if(!global.priv_all_access_datums_region_names) + global.priv_all_access_datums_region_names = alist() + for(var/region_index, region_data in get_all_access_datums_by_region()) + var/region_name = get_access_region_name(region_index) + global.priv_all_access_datums_region_names[region_name] = region_data + + return global.priv_all_access_datums_region_names.Copy() /proc/get_access_ids(var/access_types = ACCESS_TYPE_ALL) . = list() @@ -191,7 +205,7 @@ var/global/list/priv_region_access var/list/region = priv_region_access["[code]"] return islist(region) ? region.Copy() : list() -/proc/get_region_accesses_name(var/code) +/proc/get_access_region_name(var/code) switch(code) if(ACCESS_REGION_ALL) return "All" diff --git a/code/game/machinery/_machines_base/stock_parts/access_lock.dm b/code/game/machinery/_machines_base/stock_parts/access_lock.dm index 8d6b4aec8cea..c63ed31025ff 100644 --- a/code/game/machinery/_machines_base/stock_parts/access_lock.dm +++ b/code/game/machinery/_machines_base/stock_parts/access_lock.dm @@ -80,18 +80,19 @@ var/list/data = list() var/list/regions = list() if(!autoset) - for(var/i in ACCESS_REGION_MIN to ACCESS_REGION_MAX) //code/game/jobs/_access_defs.dm - var/list/region = list() + for(var/region_name, access_data in get_all_access_datums_by_region_name()) var/list/accesses = list() - for(var/j in get_region_accesses(i)) - var/list/access = list() - access["name"] = get_access_desc(j) - access["id"] = j - access["req"] = conf_access && (j in conf_access) - accesses[++accesses.len] = access - region["name"] = get_region_accesses_name(i) - region["accesses"] = accesses - regions[++regions.len] = region + for(var/datum/access/access_datum in access_data) + // += or Add would add each individual entry + ADD_LIST_AS_ENTRY(accesses, list( + "name" = access_datum.desc, + "id" = access_datum.id, + "req" = LAZYISIN(conf_access, access_datum.id) + )) + ADD_LIST_AS_ENTRY(regions, list( + "name" = region_name, + "accesses" = accesses + )) data["regions"] = regions data["oneAccess"] = one_access data["locked"] = locked diff --git a/code/modules/modular_computers/file_system/programs/antagonist/access_decrypter.dm b/code/modules/modular_computers/file_system/programs/antagonist/access_decrypter.dm index 070f698817ac..680f62410594 100644 --- a/code/modules/modular_computers/file_system/programs/antagonist/access_decrypter.dm +++ b/code/modules/modular_computers/file_system/programs/antagonist/access_decrypter.dm @@ -137,19 +137,21 @@ else if(RFID && RFID.stored_card) var/obj/item/card/id/id_card = RFID.stored_card var/list/regions = list() - for(var/i = ACCESS_REGION_MIN; i <= ACCESS_REGION_MAX; i++) + for(var/region_name, access_data in get_all_access_datums_by_region_name()) var/list/accesses = list() - for(var/access in get_region_accesses(i)) - if (get_access_desc(access)) - accesses.Add(list(list( - "desc" = replacetext(get_access_desc(access), " ", " "), - "ref" = access, - "allowed" = (access in id_card.access) ? 1 : 0, - "blocked" = ((access in PRG.restricted_access_codes) || ((access in PRG.skill_restricted_access_codes_master) && PRG.operator_skill < SKILL_PROF)) ? 1 : 0))) - - regions.Add(list(list( - "name" = get_region_accesses_name(i), - "accesses" = accesses))) + for(var/datum/access/access_datum in access_data) + if (!access_datum.desc) + continue + // += or Add would add each individual entry + ADD_LIST_AS_ENTRY(accesses, list( + "desc" = replacetext(access_datum.desc, " ", " "), + "ref" = access_datum.id, + "allowed" = (access_datum.id in id_card.access), + "blocked" = ((access_datum.id in PRG.restricted_access_codes) || ((access_datum.id in PRG.skill_restricted_access_codes_master) && PRG.operator_skill < SKILL_PROF)) ? 1 : 0)) + + ADD_LIST_AS_ENTRY(regions, list( + "name" = region_name, + "accesses" = accesses)) data["regions"] = regions ui = SSnano.try_update_ui(user, src, ui_key, ui, data, force_open) diff --git a/code/modules/modular_computers/file_system/programs/command/card.dm b/code/modules/modular_computers/file_system/programs/command/card.dm index af9339b6a132..e7ec4d640e70 100644 --- a/code/modules/modular_computers/file_system/programs/command/card.dm +++ b/code/modules/modular_computers/file_system/programs/command/card.dm @@ -75,18 +75,20 @@ data["all_centcom_access"] = all_centcom_access else var/list/regions = list() - for(var/i = 1; i <= 8; i++) + for(var/region_name, access_data in get_all_access_datums_by_region_name()) var/list/accesses = list() - for(var/access in get_region_accesses(i)) - if (get_access_desc(access)) - accesses.Add(list(list( - "desc" = replacetext(get_access_desc(access), " ", " "), - "ref" = access, - "allowed" = (access in id_card.access) ? 1 : 0))) + for(var/datum/access/access_datum in access_data) + if (!access_datum.desc) + continue + // += or Add would add each individual entry + ADD_LIST_AS_ENTRY(accesses, list( + "desc" = replacetext(access_datum.desc, " ", " "), + "ref" = access_datum.id, + "allowed" = LAZYISIN(id_card.access, access_datum.id))) - regions.Add(list(list( - "name" = get_region_accesses_name(i), - "accesses" = accesses))) + ADD_LIST_AS_ENTRY(regions, list( + "name" = region_name, + "accesses" = accesses)) data["regions"] = regions ui = SSnano.try_update_ui(user, src, ui_key, ui, data, force_open)