diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index b6fcfc104c8..7f1a33d0b33 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -220,4 +220,14 @@
#define R_HAND_LAYER 28
#define TARGETED_LAYER 29 //BS12: Layer for the target overlay from weapon targeting system
#define FIRE_LAYER 30 //If you're on fire
-#define TOTAL_LAYERS 30
\ No newline at end of file
+#define TOTAL_LAYERS 30
+
+///Access Region Codes///
+#define REGION_ALL 0
+#define REGION_GENERAL 1
+#define REGION_SECURITY 2
+#define REGION_MEDBAY 3
+#define REGION_RESEARCH 4
+#define REGION_ENGINEERING 5
+#define REGION_SUPPLY 6
+#define REGION_COMMAND 7
\ No newline at end of file
diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm
index d43d5e17e8f..e3649f5e445 100644
--- a/code/game/jobs/access.dm
+++ b/code/game/jobs/access.dm
@@ -249,43 +249,43 @@
/proc/get_absolutely_all_accesses()
return (get_all_accesses() | get_all_centcom_access() | get_all_syndicate_access() | get_all_misc_access())
-/proc/get_region_accesses(var/code)
+/proc/get_region_accesses(code)
switch(code)
- if(0)
+ if(REGION_ALL)
return get_all_accesses()
- if(1) //security
+ if(REGION_GENERAL) //station general
+ return list(access_kitchen, access_bar, access_hydroponics, access_janitor, access_chapel_office, access_crematorium, access_library, access_theatre, access_lawyer, access_magistrate, access_clown, access_mime)
+ if(REGION_SECURITY) //security
return list(access_sec_doors, access_weapons, access_security, access_brig, access_armory, access_forensics_lockers, access_court, access_pilot, access_hos)
- if(2) //medbay
+ if(REGION_MEDBAY) //medbay
return list(access_medical, access_genetics, access_morgue, access_chemistry, access_psychiatrist, access_virology, access_surgery, access_cmo, access_paramedic)
- if(3) //research
- return list(access_research, access_tox, access_tox_storage, access_robotics, access_xenobiology, access_xenoarch, access_minisat, access_rd)
- if(4) //engineering and maintenance
+ if(REGION_RESEARCH) //research
+ return list(access_research, access_tox, access_tox_storage, access_genetics, access_robotics, access_xenobiology, access_xenoarch, access_minisat, access_rd)
+ if(REGION_ENGINEERING) //engineering and maintenance
return list(access_construction, access_maint_tunnels, access_engine, access_engine_equip, access_external_airlocks, access_tech_storage, access_atmospherics, access_minisat, access_ce, access_mechanic)
- if(5) //command
- return list(access_heads, access_RC_announce, access_keycard_auth, access_change_ids, access_ai_upload, access_teleporter, access_eva, access_tcomsat, access_gateway, access_all_personal_lockers, access_heads_vault, access_blueshield, access_ntrep, access_hop, access_captain)
- if(6) //station general
- return list(access_kitchen,access_bar, access_hydroponics, access_janitor, access_chapel_office, access_crematorium, access_library, access_theatre, access_lawyer, access_magistrate, access_clown, access_mime)
- if(7) //supply
+ if(REGION_SUPPLY) //supply
return list(access_mailsorting, access_mining, access_mining_station, access_mineral_storeroom, access_cargo, access_qm)
+ if(REGION_COMMAND) //command
+ return list(access_heads, access_RC_announce, access_keycard_auth, access_change_ids, access_ai_upload, access_teleporter, access_eva, access_tcomsat, access_gateway, access_all_personal_lockers, access_heads_vault, access_blueshield, access_ntrep, access_hop, access_captain)
-/proc/get_region_accesses_name(var/code)
+/proc/get_region_accesses_name(code)
switch(code)
- if(0)
+ if(REGION_ALL)
return "All"
- if(1) //security
+ if(REGION_GENERAL) //station general
+ return "General"
+ if(REGION_SECURITY) //security
return "Security"
- if(2) //medbay
+ if(REGION_MEDBAY) //medbay
return "Medbay"
- if(3) //research
+ if(REGION_RESEARCH) //research
return "Research"
- if(4) //engineering and maintenance
+ if(REGION_ENGINEERING) //engineering and maintenance
return "Engineering"
- if(5) //command
- return "Command"
- if(6) //station general
- return "Station General"
- if(7) //supply
+ if(REGION_SUPPLY) //supply
return "Supply"
+ if(REGION_COMMAND) //command
+ return "Command"
/proc/get_access_desc(A)
diff --git a/code/game/objects/items/control_wand.dm b/code/game/objects/items/control_wand.dm
new file mode 100644
index 00000000000..86f6fd5a74d
--- /dev/null
+++ b/code/game/objects/items/control_wand.dm
@@ -0,0 +1,104 @@
+#define WAND_OPEN "Open Door"
+#define WAND_BOLT "Toggle Bolts"
+#define WAND_EMERGENCY "Toggle Emergency Access"
+
+/obj/item/weapon/door_remote
+ icon_state = "gangtool-white"
+ item_state = "electronic"
+ icon = 'icons/obj/device.dmi'
+ name = "control wand"
+ desc = "Remotely controls airlocks."
+ w_class = 1
+ var/mode = WAND_OPEN
+ var/region_access = 1 //See access.dm
+ var/obj/item/weapon/card/id/ID
+
+/obj/item/weapon/door_remote/New()
+ ..()
+ ID = new /obj/item/weapon/card/id
+ ID.access = get_region_accesses(region_access)
+
+/obj/item/weapon/door_remote/attack_self(mob/user)
+ switch(mode)
+ if(WAND_OPEN)
+ mode = WAND_BOLT
+ if(WAND_BOLT)
+ mode = WAND_EMERGENCY
+ if(WAND_EMERGENCY)
+ mode = WAND_OPEN
+ to_chat(user, "Now in mode: [mode].")
+
+/obj/item/weapon/door_remote/afterattack(obj/machinery/door/airlock/D, mob/user)
+ if(!istype(D))
+ return
+ if(!(D.arePowerSystemsOn()))
+ to_chat(user, "[D] has no power!")
+ return
+ if(!D.requiresID())
+ to_chat(user, "[D]'s ID scan is disabled!")
+ return
+ if(D.check_access(src.ID))
+ switch(mode)
+ if(WAND_OPEN)
+ if(D.density)
+ D.open()
+ else
+ D.close()
+ if(WAND_BOLT)
+ if(D.locked)
+ D.unlock()
+ else
+ D.lock()
+ if(WAND_EMERGENCY)
+ if(D.emergency)
+ D.emergency = 0
+ else
+ D.emergency = 1
+ D.update_icon()
+ else
+ to_chat(user, "[src] does not have access to this door.")
+
+/obj/item/weapon/door_remote/omni
+ name = "omni door remote"
+ desc = "This control wand can access any door on the station."
+ icon_state = "gangtool-yellow"
+ region_access = REGION_ALL
+
+/obj/item/weapon/door_remote/captain
+ name = "command door remote"
+ icon_state = "gangtool-yellow"
+ region_access = REGION_COMMAND
+
+/obj/item/weapon/door_remote/chief_engineer
+ name = "engineering door remote"
+ icon_state = "gangtool-orange"
+ region_access = REGION_ENGINEERING
+
+/obj/item/weapon/door_remote/research_director
+ name = "research door remote"
+ icon_state = "gangtool-purple"
+ region_access = REGION_RESEARCH
+
+/obj/item/weapon/door_remote/head_of_security
+ name = "security door remote"
+ icon_state = "gangtool-red"
+ region_access = REGION_SECURITY
+
+/obj/item/weapon/door_remote/quartermaster
+ name = "supply door remote"
+ icon_state = "gangtool-green"
+ region_access = REGION_SUPPLY
+
+/obj/item/weapon/door_remote/chief_medical_officer
+ name = "medical door remote"
+ icon_state = "gangtool-blue"
+ region_access = REGION_MEDBAY
+
+/obj/item/weapon/door_remote/civillian
+ name = "civillian door remote"
+ icon_state = "gangtool-white"
+ region_access = REGION_GENERAL
+
+#undef WAND_OPEN
+#undef WAND_BOLT
+#undef WAND_EMERGENCY
\ No newline at end of file
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
index 945f4f4d818..51f01d874a8 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
@@ -39,4 +39,5 @@
new /obj/item/weapon/tank/emergency_oxygen(src)
new /obj/item/clothing/mask/gas(src)
new /obj/item/clothing/glasses/meson(src)
- new /obj/item/clothing/head/soft(src)
\ No newline at end of file
+ new /obj/item/clothing/head/soft(src)
+ new /obj/item/weapon/door_remote/quartermaster(src)
\ No newline at end of file
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
index d7fd20b6d37..1746211e248 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
@@ -31,6 +31,7 @@
new /obj/item/device/flash(src)
new /obj/item/taperoll/engineering(src)
new /obj/item/clothing/head/beret/eng(src)
+ new /obj/item/weapon/door_remote/chief_engineer(src)
/obj/structure/closet/secure_closet/engineering_electrical
name = "electrical supplies locker"
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
index ad76cfc9409..17f208e28e9 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
@@ -175,6 +175,7 @@
new /obj/item/device/flash(src)
new /obj/item/weapon/reagent_containers/hypospray/CMO(src)
new /obj/item/organ/internal/cyberimp/eyes/hud/medical(src)
+ new /obj/item/weapon/door_remote/chief_medical_officer(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
index 321b71b6eaa..488a422af86 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
@@ -49,6 +49,7 @@
new /obj/item/clothing/suit/armor/reactive(src)
new /obj/item/device/flash(src)
new /obj/item/device/laser_pointer(src)
+ new /obj/item/weapon/door_remote/research_director(src)
/obj/structure/closet/secure_closet/research_reagents
name = "research chemical storage closet"
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
index 05f077e64d1..4a2ced79339 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -26,6 +26,7 @@
new /obj/item/device/radio/headset/heads/captain/alt(src)
new /obj/item/clothing/gloves/color/captain(src)
new /obj/item/weapon/gun/energy/gun(src)
+ new /obj/item/weapon/door_remote/captain(src)
@@ -52,6 +53,7 @@
new /obj/item/device/flash(src)
new /obj/item/weapon/mining_voucher(src)
new /obj/item/clothing/accessory/petcollar(src)
+ new /obj/item/weapon/door_remote/civillian(src)
/obj/structure/closet/secure_closet/hop2
name = "head of personnel's attire"
@@ -114,6 +116,7 @@
new /obj/item/weapon/storage/belt/security/sec(src)
new /obj/item/taperoll/police(src)
new /obj/item/weapon/gun/energy/hos(src)
+ new /obj/item/weapon/door_remote/head_of_security(src)
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index 37026b153be..46a4a974316 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ
diff --git a/paradise.dme b/paradise.dme
index 6f4d9659940..1689caca4e1 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -699,6 +699,7 @@
#include "code\game\objects\items\candle.dm"
#include "code\game\objects\items\changestone.dm"
#include "code\game\objects\items\contraband.dm"
+#include "code\game\objects\items\control_wand.dm"
#include "code\game\objects\items\crayons.dm"
#include "code\game\objects\items\dehy_carp.dm"
#include "code\game\objects\items\documents.dm"