diff --git a/code/game/machinery/doors/airlock_electronics.dm b/code/game/machinery/doors/airlock_electronics.dm
index 39ca2d5f40..da093091f7 100644
--- a/code/game/machinery/doors/airlock_electronics.dm
+++ b/code/game/machinery/doors/airlock_electronics.dm
@@ -1,5 +1,3 @@
-//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
-
/obj/item/weapon/airlock_electronics
name = "airlock electronics"
icon = 'icons/obj/doors/door_assembly.dmi'
@@ -8,106 +6,148 @@
matter = list(DEFAULT_WALL_MATERIAL = 50,"glass" = 50)
- req_access = list(access_engine)
+ req_one_access = list(access_engine) // Access to unlock the device, ignored if emagged
+ var/list/apply_any_access = list(access_engine) // Can apply any access, not just their own
var/secure = 0 //if set, then wires will be randomized and bolts will drop if the door is broken
var/list/conf_access = null
var/one_access = 0 //if set to 1, door would receive req_one_access instead of req_access
var/last_configurator = null
var/locked = 1
+ var/emagged = 0
- attack_self(mob/user as mob)
- if (!ishuman(user) && !istype(user,/mob/living/silicon/robot))
- return ..(user)
+/obj/item/weapon/airlock_electronics/emag_act(var/remaining_charges, var/mob/user)
+ if(!emagged)
+ emagged = 1
+ to_chat(user, "You remove the access restrictions on [src]!")
+ return 1
- var/t1 = text("Access control
\n")
+/obj/item/weapon/airlock_electronics/attack_self(mob/user as mob)
+ if (!ishuman(user) && !istype(user,/mob/living/silicon/robot))
+ return ..(user)
- if (last_configurator)
- t1 += "Operator: [last_configurator]
"
+ var/t1 = text("Access control
\n")
- if (locked)
- t1 += "Swipe ID
"
- else
- t1 += "Block
"
+ if (last_configurator)
+ t1 += "Operator: [last_configurator]
"
- t1 += "Access requirement is set to "
- t1 += one_access ? "ONE
" : "ALL
"
+ if (locked)
+ t1 += "Unlock Interface
"
+ else
+ t1 += "Lock Interface
"
- t1 += conf_access == null ? "All
" : "All
"
+ t1 += "Access requirement is set to "
+ t1 += one_access ? "ONE
" : "ALL
"
- t1 += "
"
+ t1 += conf_access == null ? "All
" : "All
"
- var/list/accesses = get_all_station_access()
- for (var/acc in accesses)
- var/aname = get_access_desc(acc)
+ t1 += "
"
- if (!conf_access || !conf_access.len || !(acc in conf_access))
- t1 += "[aname]
"
- else if(one_access)
- t1 += "[aname]
"
- else
- t1 += "[aname]
"
+ var/list/accesses = get_available_accesses(user)
+ for (var/acc in accesses)
+ var/aname = get_access_desc(acc)
- t1 += text("Close
\n", src)
-
- user << browse(t1, "window=airlock_electronics")
- onclose(user, "airlock")
-
- Topic(href, href_list)
- ..()
- if (usr.stat || usr.restrained() || (!ishuman(usr) && !istype(usr,/mob/living/silicon)))
- return
- if (href_list["close"])
- usr << browse(null, "window=airlock")
- return
-
- if (href_list["login"])
- if(istype(usr,/mob/living/silicon))
- src.locked = 0
- src.last_configurator = usr.name
+ if (!conf_access || !conf_access.len || !(acc in conf_access))
+ t1 += "[aname]
"
+ else if(one_access)
+ t1 += "[aname]
"
else
- 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))
+ t1 += "[aname]
"
+
+ t1 += text("Close
\n", src)
+
+ user << browse(t1, "window=airlock_electronics")
+ onclose(user, "airlock")
+
+/obj/item/weapon/airlock_electronics/Topic(href, href_list)
+ ..()
+ if (usr.stat || usr.restrained() || (!ishuman(usr) && !istype(usr,/mob/living/silicon)))
+ return
+ if (href_list["close"])
+ usr << browse(null, "window=airlock")
+ return
+
+ if (href_list["login"])
+ if(emagged)
+ src.locked = 0
+ src.last_configurator = usr.name
+ else if(issilicon(usr))
+ src.locked = 0
+ src.last_configurator = usr.name
+ else if(isliving(usr))
+ var/obj/item/weapon/card/id/id
+ if(ishuman(usr))
+ var/mob/living/carbon/human/H = usr
+ id = H.get_idcard()
+ // In their ID slot?
+ if(id && src.check_access(id))
src.locked = 0
- src.last_configurator = I:registered_name
+ src.last_configurator = id.registered_name
+ // Still locked, human handling didn't do it!
+ if(locked)
+ var/obj/item/I = usr.get_active_hand()
+ id = I?.GetID()
+ if(id && src.check_access(id))
+ src.locked = 0
+ src.last_configurator = id.registered_name
- if (locked)
- return
+ if (locked)
+ return
- if (href_list["logout"])
- locked = 1
+ if (href_list["logout"])
+ locked = 1
- if (href_list["one_access"])
- one_access = !one_access
+ if (href_list["one_access"])
+ one_access = !one_access
- 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
+ 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
+/obj/item/weapon/airlock_electronics/proc/get_available_accesses(var/mob/user)
+ var/obj/item/weapon/card/id/id
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ id = H.get_idcard()
+ else if(issilicon(user))
+ var/mob/living/silicon/R = user
+ id = R.idcard
+ // Nothing
+ if(!id || !id.access)
+ return list()
+
+ // Has engineer access, can put any access
+ else if(has_access(null, apply_any_access, id.access))
+ return get_all_station_access()
+
+ // Not an engineer, can only pick your own accesses to program
+ else
+ return id.access
/obj/item/weapon/airlock_electronics/secure
name = "secure airlock electronics"
desc = "designed to be somewhat more resistant to hacking than standard electronics."
origin_tech = list(TECH_DATA = 2)
secure = 1
+
+/obj/item/weapon/airlock_electronics/secure/emag_act(var/remaining_charges, var/mob/user)
+ to_chat(user, "You don't appear to be able to bypass this hardened device!")
+ return -1