diff --git a/code/game/jobs/_access_defs.dm b/code/__defines/_access_defs.dm
similarity index 100%
rename from code/game/jobs/_access_defs.dm
rename to code/__defines/_access_defs.dm
diff --git a/code/controllers/subsystems/access.dm b/code/controllers/subsystems/access.dm
new file mode 100644
index 0000000000..7e6a1333c4
--- /dev/null
+++ b/code/controllers/subsystems/access.dm
@@ -0,0 +1,126 @@
+SUBSYSTEM_DEF(access)
+ name = "Access"
+ flags = SS_NO_FIRE
+
+ VAR_PRIVATE/list/datum/access/priv_all_access_datums
+ VAR_PRIVATE/list/datum/access/priv_all_access
+ VAR_PRIVATE/list/datum/access/priv_station_access
+ VAR_PRIVATE/list/datum/access/priv_centcom_access
+ VAR_PRIVATE/list/datum/access/priv_syndicate_access
+ VAR_PRIVATE/list/datum/access/priv_private_access
+
+ VAR_PRIVATE/list/datum/access/priv_all_access_datums_id = list()
+ VAR_PRIVATE/list/datum/access/priv_all_access_datums_region = list()
+ VAR_PRIVATE/list/datum/access/priv_region_access = list()
+
+/datum/controller/subsystem/access/Initialize()
+ priv_all_access_datums = init_subtypes(/datum/access)
+ priv_all_access_datums = dd_sortedObjectList(priv_all_access_datums)
+
+ for(var/datum/access/A in get_all_access_datums())
+ priv_all_access_datums_id["[A.id]"] = A
+ LAZYADD(priv_all_access_datums_region["[A.region]"], A)
+ LAZYADD(priv_region_access["[A.region]"], A.id)
+
+ priv_all_access = get_access_ids()
+ priv_station_access = get_access_ids(ACCESS_TYPE_STATION)
+ priv_centcom_access = get_access_ids(ACCESS_TYPE_CENTCOM)
+ priv_syndicate_access = get_access_ids(ACCESS_TYPE_SYNDICATE)
+ priv_private_access = get_access_ids(ACCESS_TYPE_PRIVATE)
+
+ return SS_INIT_SUCCESS
+
+/datum/controller/subsystem/access/proc/get_centcom_access(job)
+ switch(job)
+ if("VIP Guest")
+ return list(ACCESS_CENT_GENERAL)
+ if("Custodian")
+ return list(ACCESS_CENT_GENERAL, ACCESS_CENT_LIVING, ACCESS_CENT_STORAGE)
+ if("Thunderdome Overseer")
+ return list(ACCESS_CENT_GENERAL, ACCESS_CENT_THUNDER)
+ if("Intel Officer")
+ return list(ACCESS_CENT_GENERAL, ACCESS_CENT_LIVING)
+ if("Medical Officer")
+ return list(ACCESS_CENT_GENERAL, ACCESS_CENT_LIVING, ACCESS_CENT_MEDICAL)
+ if("Death Commando")
+ return list(ACCESS_CENT_GENERAL, ACCESS_CENT_SPECOPS, ACCESS_CENT_LIVING, ACCESS_CENT_STORAGE)
+ if("Research Officer")
+ return list(ACCESS_CENT_GENERAL, ACCESS_CENT_SPECOPS, ACCESS_CENT_MEDICAL, ACCESS_CENT_TELEPORTER, ACCESS_CENT_STORAGE)
+ if("BlackOps Commander")
+ return list(ACCESS_CENT_GENERAL, ACCESS_CENT_THUNDER, ACCESS_CENT_SPECOPS, ACCESS_CENT_LIVING, ACCESS_CENT_STORAGE, ACCESS_CENT_CREED)
+ if("Supreme Commander")
+ return get_all_centcom_access()
+
+/datum/controller/subsystem/access/proc/get_all_access_datums()
+ return priv_all_access_datums
+
+/datum/controller/subsystem/access/proc/get_all_access_datums_by_id()
+ return priv_all_access_datums_id
+
+/datum/controller/subsystem/access/proc/get_all_access_datums_by_region()
+ return priv_all_access_datums_region
+
+/datum/controller/subsystem/access/proc/get_access_ids(access_types = ACCESS_TYPE_ALL)
+ var/list/L = list()
+ for(var/datum/access/A in get_all_access_datums())
+ if(A.access_type & access_types)
+ L += A.id
+ return L
+
+/datum/controller/subsystem/access/proc/get_all_accesses()
+ RETURN_TYPE(/list)
+ return priv_all_access
+
+/datum/controller/subsystem/access/proc/get_all_station_access()
+ RETURN_TYPE(/list)
+ return priv_station_access
+
+/datum/controller/subsystem/access/proc/get_all_centcom_access()
+ RETURN_TYPE(/list)
+ return priv_centcom_access
+
+/datum/controller/subsystem/access/proc/get_all_syndicate_access()
+ RETURN_TYPE(/list)
+ return priv_syndicate_access
+
+/datum/controller/subsystem/access/proc/get_all_private_access()
+ RETURN_TYPE(/list)
+ return priv_private_access
+
+/datum/controller/subsystem/access/proc/get_region_accesses(var/code)
+ if(code == ACCESS_REGION_ALL)
+ return get_all_station_access()
+
+ return priv_region_access["[code]"]
+
+/datum/controller/subsystem/access/proc/get_region_accesses_name(var/code)
+ switch(code)
+ if(ACCESS_REGION_ALL)
+ return "All"
+ if(ACCESS_REGION_SECURITY) //security
+ return "Security"
+ if(ACCESS_REGION_MEDBAY) //medbay
+ return "Medbay"
+ if(ACCESS_REGION_RESEARCH) //research
+ return "Research"
+ if(ACCESS_REGION_ENGINEERING) //engineering and maintenance
+ return "Engineering"
+ if(ACCESS_REGION_COMMAND) //command
+ return "Command"
+ if(ACCESS_REGION_GENERAL) //station general
+ return "Station General"
+ if(ACCESS_REGION_SUPPLY) //supply
+ return "Supply"
+
+/datum/controller/subsystem/access/proc/get_access_desc(id)
+ var/list/access_list = get_all_access_datums_by_id()
+ var/datum/access/access_datum = access_list["[id]"]
+
+ return access_datum ? access_datum.desc : ""
+
+/datum/controller/subsystem/access/proc/get_centcom_access_desc(A)
+ return get_access_desc(A)
+
+/datum/controller/subsystem/access/proc/get_access_by_id(id)
+ var/list/access_list = get_all_access_datums_by_id()
+ return access_list["[id]"]
diff --git a/code/datums/outfits/outfit_vr.dm b/code/datums/outfits/outfit_vr.dm
index e9e7b87d8c..5e2101524a 100644
--- a/code/datums/outfits/outfit_vr.dm
+++ b/code/datums/outfits/outfit_vr.dm
@@ -22,8 +22,8 @@
var/obj/item/card/id/C = ..()
C.name = "[H.real_name]'s military ID Card"
C.icon_state = "lifetime"
- C.access = get_all_station_access()
- C.access += get_all_centcom_access()
+ C.access = SSaccess.get_all_station_access()
+ C.access += SSaccess.get_all_centcom_access()
C.assignment = "USDF"
C.registered_name = H.real_name
return C
@@ -48,8 +48,8 @@
var/obj/item/card/id/C = ..()
C.name = "[H.real_name]'s military ID Card"
C.icon_state = "lifetime"
- C.access = get_all_station_access()
- C.access += get_all_centcom_access()
+ C.access = SSaccess.get_all_station_access()
+ C.access += SSaccess.get_all_centcom_access()
C.assignment = "USDF"
C.registered_name = H.real_name
return C
@@ -72,8 +72,8 @@
var/obj/item/card/id/C = ..()
C.name = "[H.real_name]'s SolGov ID Card" //YW EDIT: SolGov
C.icon_state = "lifetime"
- C.access = get_all_station_access()
- C.access += get_all_centcom_access()
+ C.access = SSaccess.get_all_station_access()
+ C.access += SSaccess.get_all_centcom_access()
C.assignment = "SolGov Representative" //YW EDIT: SolGov
C.registered_name = H.real_name
return C
diff --git a/code/game/antagonist/outsider/deathsquad.dm b/code/game/antagonist/outsider/deathsquad.dm
index 94bacd3113..d3cb4f0f21 100644
--- a/code/game/antagonist/outsider/deathsquad.dm
+++ b/code/game/antagonist/outsider/deathsquad.dm
@@ -54,7 +54,7 @@ GLOBAL_DATUM(deathsquad, /datum/antagonist/deathsquad)
var/obj/item/card/id/id = create_id("Asset Protection", player)
if(id)
- id.access |= get_all_station_access()
+ id.access |= SSaccess.get_all_station_access()
id.icon_state = "centcom"
create_radio(DTH_FREQ, player)
diff --git a/code/game/antagonist/station/highlander.dm b/code/game/antagonist/station/highlander.dm
index f70deed292..0479af7e83 100644
--- a/code/game/antagonist/station/highlander.dm
+++ b/code/game/antagonist/station/highlander.dm
@@ -53,7 +53,7 @@ GLOBAL_DATUM(highlanders, /datum/antagonist/highlander)
var/obj/item/card/id/id = create_id("Highlander", player)
if(id)
- id.access |= get_all_station_access()
+ id.access |= SSaccess.get_all_station_access()
id.icon_state = "centcom"
create_radio(DTH_FREQ, player)
diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm
index 933252b436..158cdf50e5 100644
--- a/code/game/jobs/access.dm
+++ b/code/game/jobs/access.dm
@@ -44,149 +44,6 @@
return TRUE
-/proc/get_centcom_access(job)
- switch(job)
- if("VIP Guest")
- return list(ACCESS_CENT_GENERAL)
- if("Custodian")
- return list(ACCESS_CENT_GENERAL, ACCESS_CENT_LIVING, ACCESS_CENT_STORAGE)
- if("Thunderdome Overseer")
- return list(ACCESS_CENT_GENERAL, ACCESS_CENT_THUNDER)
- if("Intel Officer")
- return list(ACCESS_CENT_GENERAL, ACCESS_CENT_LIVING)
- if("Medical Officer")
- return list(ACCESS_CENT_GENERAL, ACCESS_CENT_LIVING, ACCESS_CENT_MEDICAL)
- if("Death Commando")
- return list(ACCESS_CENT_GENERAL, ACCESS_CENT_SPECOPS, ACCESS_CENT_LIVING, ACCESS_CENT_STORAGE)
- if("Research Officer")
- return list(ACCESS_CENT_GENERAL, ACCESS_CENT_SPECOPS, ACCESS_CENT_MEDICAL, ACCESS_CENT_TELEPORTER, ACCESS_CENT_STORAGE)
- if("BlackOps Commander")
- return list(ACCESS_CENT_GENERAL, ACCESS_CENT_THUNDER, ACCESS_CENT_SPECOPS, ACCESS_CENT_LIVING, ACCESS_CENT_STORAGE, ACCESS_CENT_CREED)
- if("Supreme Commander")
- return get_all_centcom_access()
-
-/var/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)
-
- return priv_all_access_datums
-
-/var/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()
- for(var/datum/access/A in get_all_access_datums())
- priv_all_access_datums_id["[A.id]"] = A
-
- return priv_all_access_datums_id
-
-/var/list/datum/access/priv_all_access_datums_region
-/proc/get_all_access_datums_by_region()
- if(!priv_all_access_datums_region)
- priv_all_access_datums_region = list()
- 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
-
- return priv_all_access_datums_region
-
-/proc/get_access_ids(var/access_types = ACCESS_TYPE_ALL)
- var/list/L = new()
- for(var/datum/access/A in get_all_access_datums())
- if(A.access_type & access_types)
- L += A.id
- return L
-
-/var/list/priv_all_access
-/proc/get_all_accesses()
- RETURN_TYPE(/list)
- if(!priv_all_access)
- priv_all_access = get_access_ids()
-
- return priv_all_access.Copy()
-
-/var/list/priv_station_access
-/proc/get_all_station_access()
- RETURN_TYPE(/list)
- if(!priv_station_access)
- priv_station_access = get_access_ids(ACCESS_TYPE_STATION)
-
- return priv_station_access.Copy()
-
-/var/list/priv_centcom_access
-/proc/get_all_centcom_access()
- RETURN_TYPE(/list)
- if(!priv_centcom_access)
- priv_centcom_access = get_access_ids(ACCESS_TYPE_CENTCOM)
-
- return priv_centcom_access.Copy()
-
-/var/list/priv_syndicate_access
-/proc/get_all_syndicate_access()
- RETURN_TYPE(/list)
- if(!priv_syndicate_access)
- priv_syndicate_access = get_access_ids(ACCESS_TYPE_SYNDICATE)
-
- return priv_syndicate_access.Copy()
-
-/var/list/priv_private_access
-/proc/get_all_private_access()
- RETURN_TYPE(/list)
- if(!priv_private_access)
- priv_private_access = get_access_ids(ACCESS_TYPE_PRIVATE)
-
- return priv_syndicate_access.Copy()
-
-/var/list/priv_region_access
-/proc/get_region_accesses(var/code)
- if(code == ACCESS_REGION_ALL)
- return get_all_station_access()
-
- if(!priv_region_access)
- priv_region_access = list()
- for(var/datum/access/A in get_all_access_datums())
- if(!priv_region_access["[A.region]"])
- priv_region_access["[A.region]"] = list()
- priv_region_access["[A.region]"] += A.id
-
- var/list/L = priv_region_access["[code]"]
- return L.Copy()
-
-/proc/get_region_accesses_name(var/code)
- switch(code)
- if(ACCESS_REGION_ALL)
- return "All"
- if(ACCESS_REGION_SECURITY) //security
- return "Security"
- if(ACCESS_REGION_MEDBAY) //medbay
- return "Medbay"
- if(ACCESS_REGION_RESEARCH) //research
- return "Research"
- if(ACCESS_REGION_ENGINEERING) //engineering and maintenance
- return "Engineering"
- if(ACCESS_REGION_COMMAND) //command
- return "Command"
- if(ACCESS_REGION_GENERAL) //station general
- return "Station General"
- if(ACCESS_REGION_SUPPLY) //supply
- return "Supply"
-
-/proc/get_access_desc(id)
- var/list/AS = get_all_access_datums_by_id()
- var/datum/access/A = AS["[id]"]
-
- return A ? A.desc : ""
-
-/proc/get_centcom_access_desc(A)
- return get_access_desc(A)
-
-/proc/get_access_by_id(id)
- var/list/AS = get_all_access_datums_by_id()
- return AS["[id]"]
-
/proc/get_all_jobs()
var/list/all_jobs = list()
var/list/all_datums = typesof(/datum/job)
diff --git a/code/game/jobs/job/captain.dm b/code/game/jobs/job/captain.dm
index e242d7cc3c..e3552012d6 100644
--- a/code/game/jobs/job/captain.dm
+++ b/code/game/jobs/job/captain.dm
@@ -48,7 +48,7 @@ GLOBAL_DATUM_INIT(captain_announcement, /datum/announcement/minor, new(do_newsca
*/
/datum/job/captain/get_access()
- return get_all_station_access().Copy()
+ return SSaccess.get_all_station_access().Copy()
/datum/job/captain/get_request_reasons()
return list("Training crew", "Assembling expedition team")
diff --git a/code/game/jobs/job/special.dm b/code/game/jobs/job/special.dm
index c00f5935d7..5a6e0ffb87 100644
--- a/code/game/jobs/job/special.dm
+++ b/code/game/jobs/job/special.dm
@@ -22,7 +22,7 @@
pto_type = PTO_CIVILIAN
/datum/job/centcom_officer/get_access()
- return get_all_accesses().Copy()
+ return SSaccess.get_all_accesses().Copy()
//YW UNCOMMENTINGSTART: INSTATE LOYALTY IMPLANT
/datum/job/centcom_officer/equip(var/mob/living/carbon/human/H)
@@ -97,7 +97,7 @@
pto_type = PTO_CIVILIAN
/datum/job/emergency_responder/get_access()
- return get_all_accesses().Copy()
+ return SSaccess.get_all_accesses().Copy()
/* CHOMPEDIT: Removing Clown/Mime job from being initialized at all (These are alt titles of Entertainer on our codebase)
/datum/job/clown
title = JOB_CLOWN
diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm
index 7bc72ead75..1732523e2d 100644
--- a/code/game/machinery/computer/card.dm
+++ b/code/game/machinery/computer/card.dm
@@ -125,23 +125,23 @@
var/list/all_centcom_access = list()
var/list/regions = list()
if(modify && is_centcom())
- for(var/access in get_all_centcom_access())
+ for(var/access in SSaccess.get_all_centcom_access())
all_centcom_access.Add(list(list(
- "desc" = replacetext(get_centcom_access_desc(access), " ", " "),
+ "desc" = replacetext(SSaccess.get_centcom_access_desc(access), " ", " "),
"ref" = access,
"allowed" = (access in modify.GetAccess()) ? 1 : 0)))
else if(modify)
for(var/i in ACCESS_REGION_SECURITY to ACCESS_REGION_SUPPLY)
var/list/accesses = list()
- for(var/access in get_region_accesses(i))
- if (get_access_desc(access))
+ for(var/access in SSaccess.get_region_accesses(i))
+ if (SSaccess.get_access_desc(access))
accesses.Add(list(list(
- "desc" = replacetext(get_access_desc(access), " ", " "),
+ "desc" = replacetext(SSaccess.get_access_desc(access), " ", " "),
"ref" = access,
"allowed" = (access in modify.GetAccess()) ? 1 : 0)))
regions.Add(list(list(
- "name" = get_region_accesses_name(i),
+ "name" = SSaccess.get_region_accesses_name(i),
"accesses" = accesses)))
data["regions"] = regions
@@ -195,7 +195,7 @@
if(is_authenticated())
var/access_type = text2num(params["access_target"])
var/access_allowed = text2num(params["allowed"])
- if(access_type in (is_centcom() ? get_all_centcom_access() : get_all_station_access()))
+ if(access_type in (is_centcom() ? SSaccess.get_all_centcom_access() : SSaccess.get_all_station_access()))
modify.access -= access_type
if(!access_allowed)
modify.access += access_type
@@ -212,7 +212,7 @@
else
var/list/access = list()
if(is_centcom())
- access = get_centcom_access(t1)
+ access = SSaccess.get_centcom_access(t1)
else
var/datum/job/jobdatum = SSjob.get_job(t1)
if(!jobdatum)
@@ -273,7 +273,7 @@
"}
for(var/A in modify.access)
- P.info += " [get_access_desc(A)]"
+ P.info += " [SSaccess.get_access_desc(A)]"
. = TRUE
if("terminate")
diff --git a/code/game/machinery/computer/guestpass.dm b/code/game/machinery/computer/guestpass.dm
index 798674f6f0..0a0085cc72 100644
--- a/code/game/machinery/computer/guestpass.dm
+++ b/code/game/machinery/computer/guestpass.dm
@@ -40,7 +40,7 @@
to_chat(usr, span_notice("It grants access to following areas:"))
for (var/A in temp_access)
- to_chat(usr, span_notice("[get_access_desc(A)]."))
+ to_chat(usr, span_notice("[SSaccess.get_access_desc(A)]."))
to_chat(usr, span_notice("Issuing reason: [reason]."))
return
@@ -177,9 +177,9 @@
data["access"] = giver.GetAccess()
for (var/A in giver.GetAccess())
if(A in accesses)
- area_list.Add(list(list("area" = A, "area_name" = get_access_desc(A), "on" = 1)))
+ area_list.Add(list(list("area" = A, "area_name" = SSaccess.get_access_desc(A), "on" = 1)))
else
- area_list.Add(list(list("area" = A, "area_name" = get_access_desc(A), "on" = null)))
+ area_list.Add(list(list("area" = A, "area_name" = SSaccess.get_access_desc(A), "on" = null)))
data["area"] = area_list
data["giver"] = giver
@@ -258,7 +258,7 @@
for (var/i=1 to accesses.len)
var/A = accesses[i]
if(A)
- var/area = get_access_desc(A)
+ var/area = SSaccess.get_access_desc(A)
entry += "[i > 1 ? ", [area]" : "[area]"]"
entry += ". Expires at [worldtime2stationtime(world.time + duration*10*60)]."
internal_log.Add(entry)
diff --git a/code/game/machinery/computer/supply.dm b/code/game/machinery/computer/supply.dm
index f31aebf14c..4d086feb17 100644
--- a/code/game/machinery/computer/supply.dm
+++ b/code/game/machinery/computer/supply.dm
@@ -255,7 +255,7 @@
reqform.info += "RANK: [idrank]
"
reqform.info += "REASON: [reason]
"
reqform.info += "SUPPLY CRATE TYPE: [S.name]
"
- reqform.info += "ACCESS RESTRICTION: [get_access_desc(S.access)]
"
+ reqform.info += "ACCESS RESTRICTION: [SSaccess.get_access_desc(S.access)]
"
reqform.info += "AMOUNT: [amount]
"
reqform.info += "CONTENTS:
"
reqform.info += S.get_html_manifest()
@@ -308,7 +308,7 @@
reqform.info += "RANK: [idrank]
"
reqform.info += "REASON: [reason]
"
reqform.info += "SUPPLY CRATE TYPE: [S.name]
"
- reqform.info += "ACCESS RESTRICTION: [get_access_desc(S.access)]
"
+ reqform.info += "ACCESS RESTRICTION: [SSaccess.get_access_desc(S.access)]
"
reqform.info += "CONTENTS:
"
reqform.info += S.get_html_manifest()
reqform.info += "
| " + span_bold("[get_region_accesses_name(i)]:") + " | " + accesses += "" + span_bold("[SSaccess.get_region_accesses_name(i)]:") + " | " accesses += "
| "
- for(var/A in get_region_accesses(i))
+ for(var/A in SSaccess.get_region_accesses(i))
if(A in conf_access)
- accesses += "" + span_red("[replacetext(get_access_desc(A), " ", " ")]") + " "
+ accesses += "" + span_red("[replacetext(SSaccess.get_access_desc(A), " ", " ")]") + " "
else
- accesses += "[replacetext(get_access_desc(A), " ", " ")] "
+ accesses += "[replacetext(SSaccess.get_access_desc(A), " ", " ")] "
accesses += " " accesses += " | "
accesses += "