Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions code/__defines/lists.dm
Original file line number Diff line number Diff line change
Expand Up @@ -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; }
Expand Down
46 changes: 30 additions & 16 deletions code/game/jobs/access.dm
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down Expand Up @@ -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"
Expand Down
23 changes: 12 additions & 11 deletions code/game/machinery/_machines_base/stock_parts/access_lock.dm
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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), " ", "&nbsp"),
"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, " ", "&nbsp"),
"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)
Expand Down
22 changes: 12 additions & 10 deletions code/modules/modular_computers/file_system/programs/command/card.dm
Original file line number Diff line number Diff line change
Expand Up @@ -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), " ", "&nbsp"),
"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, " ", "&nbsp"),
"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)
Expand Down
Loading