diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 6e9cf6f11f0..5fd9d9efaaf 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -950,7 +950,10 @@ About the new airlock wires panel:
var/obj/item/weapon/airlock_electronics/ae
if(!electronics)
ae = new/obj/item/weapon/airlock_electronics( src.loc )
- ae.conf_access = src.req_access
+ if(req_one_access)
+ ae.conf_access = src.req_one_access
+ else
+ ae.conf_access = src.req_access
else
ae = electronics
electronics = null
diff --git a/code/game/machinery/doors/airlock_electronics.dm b/code/game/machinery/doors/airlock_electronics.dm
index 07198623d76..e4ed8d78bc4 100644
--- a/code/game/machinery/doors/airlock_electronics.dm
+++ b/code/game/machinery/doors/airlock_electronics.dm
@@ -11,89 +11,106 @@
req_access = list(access_maint_tunnels)
var/list/conf_access = null
+ var/use_one_access = 0 //If the door should require ALL or only ONE of the listed accesses.
var/last_configurator = null
var/locked = 1
- attack_self(mob/user as mob)
- if (!ishuman(user))
- return ..(user)
+/obj/item/weapon/airlock_electronics/attack_self(mob/user as mob)
+ if (!ishuman(user))
+ return ..(user)
- var/mob/living/carbon/human/H = user
- if(H.getBrainLoss() >= 60)
- return
+ var/mob/living/carbon/human/H = user
+ if(H.getBrainLoss() >= 60)
+ return
- var/t1 = text("Access control
\n")
+ var/t1 = text("")
- if (last_configurator)
- t1 += "Operator: [last_configurator]
"
+ if (last_configurator)
+ t1 += "Operator: [last_configurator]
"
- if (locked)
- t1 += "Swipe ID
"
+ if (locked)
+ t1 += "Swipe ID
"
+ else
+ t1 += "Lock Interface
"
+
+ if(use_one_access)
+ t1 += "Restriction Type: At least one access required
"
else
- t1 += "Block
"
+ t1 += "Restriction Type: All accesses required
"
+ t1 += "Remove All
"
- t1 += conf_access == null ? "All
" : "All
"
-
- t1 += "
"
-
- var/list/accesses = get_all_accesses()
- for (var/acc in accesses)
- var/aname = get_access_desc(acc)
-
- if (!conf_access || !conf_access.len || !(acc in conf_access))
- t1 += "[aname]
"
+ var/accesses = ""
+ accesses += "Access
"
+ accesses += ""
+ t1 += "[accesses]"
- t1 += text("Close
\n", src)
+ t1 += text("Close
\n", src)
- user << browse(t1, "window=airlock_electronics")
- onclose(user, "airlock")
+ var/datum/browser/popup = new(user, "airlock_electronics", "Access Control", 900, 500)
+ popup.set_content(t1)
+ popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
+ popup.open()
+ onclose(user, "airlock")
- Topic(href, href_list)
- ..()
- if (usr.stat || usr.restrained() || !ishuman(usr))
- return
- if (href_list["close"])
- usr << browse(null, "window=airlock")
- return
+/obj/item/weapon/airlock_electronics/Topic(href, href_list)
+ ..()
+ if (usr.stat || usr.restrained() || !ishuman(usr))
+ return
+ if (href_list["close"])
+ usr << browse(null, "window=airlock")
+ return
- if (href_list["login"])
- var/obj/item/I = usr.get_active_hand()
- if (istype(I, /obj/item/device/pda))
- var/obj/item/device/pda/pda = I
- I = pda.id
- if (I && src.check_access(I))
- src.locked = 0
- src.last_configurator = I:registered_name
+ if (href_list["login"])
+ var/obj/item/I = usr.get_active_hand()
+ if (istype(I, /obj/item/device/pda))
+ var/obj/item/device/pda/pda = I
+ I = pda.id
+ if (I && src.check_access(I))
+ src.locked = 0
+ src.last_configurator = I:registered_name
- if (locked)
- return
+ if (locked)
+ return
- if (href_list["logout"])
- locked = 1
+ if (href_list["logout"])
+ locked = 1
- if (href_list["access"])
- toggle_access(href_list["access"])
+ if (href_list["access"])
+ toggle_access(href_list["access"])
- attack_self(usr)
+ attack_self(usr)
- proc
- toggle_access(var/acc)
- if (acc == "all")
+/obj/item/weapon/airlock_electronics/proc/toggle_access(var/acc)
+ if (acc == "all")
+ conf_access = null
+ else if(acc == "one")
+ use_one_access = !use_one_access
+ else
+ var/req = text2num(acc)
+
+ if (conf_access == null)
+ conf_access = list()
+
+ if (!(req in conf_access))
+ conf_access += req
+ else
+ conf_access -= req
+ if (!conf_access.len)
conf_access = null
- else
- var/req = text2num(acc)
-
- if (conf_access == null)
- conf_access = list()
-
- if (!(req in conf_access))
- conf_access += req
- else
- conf_access -= req
- if (!conf_access.len)
- conf_access = null
diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm
index c184c6f3bb5..edfcdf5c5ce 100644
--- a/code/game/objects/structures/door_assembly.dm
+++ b/code/game/objects/structures/door_assembly.dm
@@ -555,7 +555,10 @@ obj/structure/door_assembly
door = new src.airlock_type( src.loc )
//door.req_access = src.req_access
door.electronics = src.electronics
- door.req_access = src.electronics.conf_access
+ if(src.electronics.use_one_access)
+ door.req_one_access = src.electronics.conf_access
+ else
+ door.req_access = src.electronics.conf_access
if(created_name)
door.name = created_name
src.electronics.loc = door
diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm
index af17d680569..9bf25c153a8 100644
--- a/code/game/objects/structures/windoor_assembly.dm
+++ b/code/game/objects/structures/windoor_assembly.dm
@@ -238,7 +238,10 @@ obj/structure/windoor_assembly/Destroy()
windoor.dir = src.dir
windoor.density = 0
- windoor.req_access = src.electronics.conf_access
+ if(src.electronics.use_one_access)
+ windoor.req_one_access = src.electronics.conf_access
+ else
+ windoor.req_access = src.electronics.conf_access
windoor.electronics = src.electronics
src.electronics.loc = windoor
windoor.close()