diff --git a/aurorastation.dme b/aurorastation.dme
index e1bc290aaa0..d7ad510aec5 100644
--- a/aurorastation.dme
+++ b/aurorastation.dme
@@ -1538,6 +1538,7 @@
#include "code\modules\effects\ion_trail_follow.dm"
#include "code\modules\effects\visual_effect.dm"
#include "code\modules\effects\map_effects\beam_point.dm"
+#include "code\modules\effects\map_effects\door_helper.dm"
#include "code\modules\effects\map_effects\effect_emitter.dm"
#include "code\modules\effects\map_effects\map_effects.dm"
#include "code\modules\effects\map_effects\perma_light.dm"
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 23e8c05a5c7..67285def82c 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -1463,6 +1463,8 @@ About the new airlock wires panel:
//get the dir from the assembly
set_dir(assembly.dir)
+ unres_dir = electronics.unres_dir
+
if (on_admin_z)
secured_wires = TRUE
diff --git a/code/game/machinery/doors/airlock_electronics.dm b/code/game/machinery/doors/airlock_electronics.dm
index 228ef388fe8..44740f2a927 100644
--- a/code/game/machinery/doors/airlock_electronics.dm
+++ b/code/game/machinery/doors/airlock_electronics.dm
@@ -14,6 +14,7 @@
var/last_configurator
var/locked = TRUE
var/is_installed = FALSE // no double-spending
+ var/unres_dir = null
/obj/item/airlock_electronics/attack_self(mob/user)
if(!ishuman(user) && !istype(user,/mob/living/silicon/robot))
@@ -29,6 +30,17 @@
else
t1 += "Block
"
+ t1 += "Unrestricted Access Settings
"
+
+
+ for(var/direction in cardinal)
+ if(direction & unres_dir)
+ t1 += "[capitalize(dir2text(direction))]
"
+ else
+ t1 += "[capitalize(dir2text(direction))]
"
+
+ t1 += "
"
+
t1 += "Access requirement is set to "
t1 += one_access ? "ONE
" : "ALL
"
@@ -69,6 +81,10 @@
if(locked)
return
+ if(href_list["unres_dir"])
+ var/new_unres_dir = text2num(href_list["unres_dir"])
+ unres_dir ^= new_unres_dir
+
if(href_list["logout"])
locked = TRUE
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index f708acf0a5d..2d94c11be71 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -21,6 +21,7 @@
var/normalspeed = 1
var/heat_proof = 0 // For glass airlocks/opacity firedoors
var/air_properties_vary_with_direction = 0
+ var/unres_dir = null // corresponds to dirs. if opened from this dir, no access is required
var/maxhealth = 300
var/health
var/destroy_hits = 10 //How many strong hits it takes to destroy the door
@@ -555,9 +556,16 @@
/obj/machinery/door/allowed(mob/M)
if(!requiresID())
- return 1 // Door doesn't require an ID. So obviously they're allowed.
+ return TRUE // Door doesn't require an ID. So obviously they're allowed.
+ if(unrestricted_side(M))
+ return TRUE
return ..(M)
+/obj/machinery/door/proc/unrestricted_side(mob/M) //Allows for specific side of airlocks to be unrestrected (IE, can exit maint freely, but need access to enter)
+ if(!unres_dir)
+ return FALSE
+ return get_dir(src, M) & unres_dir
+
/obj/machinery/door/update_nearby_tiles(need_rebuild)
for(var/turf/T in locs)
if (istype(T, /turf/simulated))
diff --git a/code/modules/effects/map_effects/door_helper.dm b/code/modules/effects/map_effects/door_helper.dm
new file mode 100644
index 00000000000..ddcfc2201cc
--- /dev/null
+++ b/code/modules/effects/map_effects/door_helper.dm
@@ -0,0 +1,13 @@
+/obj/effect/map_effect/door_helper
+ layer = DOOR_CLOSED_LAYER + 0.1
+
+/obj/effect/map_effect/door_helper/unres
+ icon_state = "unres_door"
+
+/obj/effect/map_effect/door_helper/unres/Initialize(mapload, ...)
+ ..()
+ for(var/obj/machinery/door/D in loc)
+ if(istype(D, /obj/machinery/door/blast) || istype(D, /obj/machinery/door/firedoor))
+ continue
+ D.unres_dir ^= dir
+ return INITIALIZE_HINT_QDEL
\ No newline at end of file
diff --git a/html/changelogs/geeves-oneway_airlock.yml b/html/changelogs/geeves-oneway_airlock.yml
new file mode 100644
index 00000000000..952d618dd31
--- /dev/null
+++ b/html/changelogs/geeves-oneway_airlock.yml
@@ -0,0 +1,7 @@
+author: Geeves
+
+delete-after: True
+
+changes:
+ - rscadd: "Mapped in various airlocks with one-way exits, meaning that you don't need access to exit if you come from that direction. This is primarily to let people out of departments without escorts."
+ - rscadd: "Added the option to put one-way exits in airlocks via airlock electronics."
\ No newline at end of file
diff --git a/icons/effects/map_effects.dmi b/icons/effects/map_effects.dmi
index 0f28f9d2da8..b8f8f2fac00 100644
Binary files a/icons/effects/map_effects.dmi and b/icons/effects/map_effects.dmi differ
diff --git a/maps/aurora/aurora-3_sublevel.dmm b/maps/aurora/aurora-3_sublevel.dmm
index 5dec1a7244c..eb3357ac59e 100644
--- a/maps/aurora/aurora-3_sublevel.dmm
+++ b/maps/aurora/aurora-3_sublevel.dmm
@@ -4351,6 +4351,9 @@
name = "Atmosphere Control";
req_access = list(24)
},
+/obj/effect/map_effect/door_helper/unres{
+ dir = 1
+ },
/turf/simulated/floor/tiled,
/area/engineering/atmos)
"akd" = (
@@ -4361,6 +4364,9 @@
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/effect/map_effect/door_helper/unres{
+ dir = 1
+ },
/turf/simulated/floor/tiled,
/area/engineering/atmos)
"ake" = (
@@ -4793,6 +4799,9 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
},
+/obj/effect/map_effect/door_helper/unres{
+ dir = 4
+ },
/turf/simulated/floor/tiled,
/area/engineering/atmos)
"ala" = (
@@ -16155,6 +16164,7 @@
name = "Morgue";
req_access = list(6)
},
+/obj/effect/map_effect/door_helper/unres,
/turf/simulated/floor/tiled{
name = "cooled floor";
temperature = 278
@@ -17931,6 +17941,9 @@
dir = 4
},
/obj/structure/plasticflaps/airtight,
+/obj/effect/map_effect/door_helper/unres{
+ dir = 8
+ },
/turf/simulated/floor/tiled{
name = "cooled floor";
temperature = 278
@@ -27169,6 +27182,9 @@
d2 = 2;
icon_state = "1-2"
},
+/obj/effect/map_effect/door_helper/unres{
+ dir = 1
+ },
/turf/simulated/floor/plating,
/area/outpost/engineering/power)
"dPZ" = (
diff --git a/maps/aurora/aurora-4_mainlevel.dmm b/maps/aurora/aurora-4_mainlevel.dmm
index 664d580445e..8c65ce7141b 100644
--- a/maps/aurora/aurora-4_mainlevel.dmm
+++ b/maps/aurora/aurora-4_mainlevel.dmm
@@ -2922,6 +2922,9 @@
name = "Biohazard Shutter";
opacity = 0
},
+/obj/effect/map_effect/door_helper/unres{
+ dir = 8
+ },
/turf/simulated/floor/tiled/white,
/area/rnd/research)
"afn" = (
@@ -6148,6 +6151,7 @@
},
/obj/structure/disposalpipe/segment,
/obj/effect/floor_decal/corner/mauve/diagonal,
+/obj/effect/map_effect/door_helper/unres,
/turf/simulated/floor/tiled/white,
/area/rnd/research)
"alq" = (
@@ -6858,6 +6862,9 @@
req_access = list(47)
},
/obj/effect/floor_decal/corner/mauve/diagonal,
+/obj/effect/map_effect/door_helper/unres{
+ dir = 8
+ },
/turf/simulated/floor/tiled/white,
/area/crew_quarters/sleep/research)
"amH" = (
@@ -10047,6 +10054,9 @@
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/machinery/atmospherics/pipe/simple/hidden/cyan,
+/obj/effect/map_effect/door_helper/unres{
+ dir = 1
+ },
/turf/simulated/floor/tiled,
/area/engineering/atmos/storage)
"asF" = (
@@ -10059,6 +10069,9 @@
name = "Atmospherics Storage";
req_access = list(24)
},
+/obj/effect/map_effect/door_helper/unres{
+ dir = 1
+ },
/turf/simulated/floor/tiled,
/area/engineering/atmos/storage)
"asH" = (
@@ -12142,6 +12155,9 @@
d2 = 8;
icon_state = "4-8"
},
+/obj/effect/map_effect/door_helper/unres{
+ dir = 4
+ },
/turf/simulated/floor/tiled,
/area/engineering/locker_room)
"avY" = (
@@ -14941,6 +14957,9 @@
name = "Engineering Hallway";
req_one_access = list(10)
},
+/obj/effect/map_effect/door_helper/unres{
+ dir = 1
+ },
/turf/simulated/floor/tiled,
/area/engineering/engine_monitoring)
"aAD" = (
@@ -15001,6 +15020,9 @@
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/effect/map_effect/door_helper/unres{
+ dir = 1
+ },
/turf/simulated/floor/tiled,
/area/engineering/atmos/monitoring)
"aAH" = (
@@ -15018,6 +15040,9 @@
d2 = 2;
icon_state = "1-2"
},
+/obj/effect/map_effect/door_helper/unres{
+ dir = 1
+ },
/turf/simulated/floor/tiled,
/area/engineering/locker_room)
"aAJ" = (
@@ -15535,6 +15560,9 @@
d2 = 2;
icon_state = "1-2"
},
+/obj/effect/map_effect/door_helper/unres{
+ dir = 1
+ },
/turf/simulated/floor/tiled,
/area/bridge)
"aBB" = (
@@ -18067,6 +18095,9 @@
d2 = 8;
icon_state = "4-8"
},
+/obj/effect/map_effect/door_helper/unres{
+ dir = 8
+ },
/turf/simulated/floor/tiled,
/area/engineering/storage_eva)
"aFG" = (
@@ -18240,6 +18271,9 @@
name = "Medical Voidsuits";
req_one_access = list(5)
},
+/obj/effect/map_effect/door_helper/unres{
+ dir = 8
+ },
/turf/simulated/floor/tiled/dark,
/area/ai_monitored/storage/eva)
"aFT" = (
@@ -18306,6 +18340,9 @@
name = "Security Voidsuits";
req_access = list(2)
},
+/obj/effect/map_effect/door_helper/unres{
+ dir = 4
+ },
/turf/simulated/floor/tiled/dark,
/area/ai_monitored/storage/eva)
"aFZ" = (
@@ -19383,6 +19420,9 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
},
+/obj/effect/map_effect/door_helper/unres{
+ dir = 8
+ },
/turf/simulated/floor/tiled,
/area/engineering/storage_eva)
"aHH" = (
@@ -19745,6 +19785,9 @@
name = "Security Wing";
req_access = list(63)
},
+/obj/effect/map_effect/door_helper/unres{
+ dir = 1
+ },
/turf/simulated/floor/tiled,
/area/security/lobby)
"aIk" = (
@@ -19793,6 +19836,9 @@
name = "Security Wing";
req_access = list(63)
},
+/obj/effect/map_effect/door_helper/unres{
+ dir = 1
+ },
/turf/simulated/floor/tiled,
/area/security/lobby)
"aIm" = (
@@ -20148,6 +20194,9 @@
req_access = list(19)
},
/obj/effect/floor_decal/corner_wide/paleblue/diagonal,
+/obj/effect/map_effect/door_helper/unres{
+ dir = 1
+ },
/turf/simulated/floor/tiled/white,
/area/bridge)
"aIO" = (
@@ -20873,6 +20922,9 @@
name = "Security Blast Door";
opacity = 0
},
+/obj/effect/map_effect/door_helper/unres{
+ dir = 8
+ },
/turf/simulated/floor/tiled,
/area/security/brig)
"aKb" = (
@@ -20959,6 +21011,9 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/effect/map_effect/door_helper/unres{
+ dir = 4
+ },
/turf/simulated/floor/tiled,
/area/bridge)
"aKl" = (
@@ -22572,6 +22627,9 @@
name = "Engineering Voidsuits";
req_one_access = list(11,24)
},
+/obj/effect/map_effect/door_helper/unres{
+ dir = 8
+ },
/turf/simulated/floor/tiled/dark,
/area/ai_monitored/storage/eva)
"aMZ" = (
@@ -23061,6 +23119,9 @@
d2 = 8;
icon_state = "4-8"
},
+/obj/effect/map_effect/door_helper/unres{
+ dir = 4
+ },
/turf/simulated/floor/tiled,
/area/bridge)
"aNV" = (
@@ -23569,6 +23630,9 @@
name = "E.V.A.";
req_one_access = list(18)
},
+/obj/effect/map_effect/door_helper/unres{
+ dir = 4
+ },
/turf/simulated/floor/tiled/dark,
/area/ai_monitored/storage/eva)
"aOR" = (
@@ -25653,6 +25717,9 @@
name = "E.V.A. Cycler Access";
req_one_access = list(18)
},
+/obj/effect/map_effect/door_helper/unres{
+ dir = 8
+ },
/turf/simulated/floor/tiled/dark,
/area/ai_monitored/storage/eva)
"aSl" = (
@@ -27168,6 +27235,9 @@
icon_state = "4-8"
},
/obj/effect/floor_decal/industrial/hatch/yellow,
+/obj/effect/map_effect/door_helper/unres{
+ dir = 4
+ },
/turf/simulated/floor/tiled,
/area/bridge/ailobby)
"aUN" = (
@@ -27377,6 +27447,9 @@
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/effect/map_effect/door_helper/unres{
+ dir = 1
+ },
/turf/simulated/floor/tiled,
/area/engineering/foyer)
"aVf" = (
@@ -27386,6 +27459,9 @@
req_one_access = list(10)
},
/obj/structure/disposalpipe/segment,
+/obj/effect/map_effect/door_helper/unres{
+ dir = 1
+ },
/turf/simulated/floor/tiled,
/area/engineering/foyer)
"aVg" = (
@@ -27489,6 +27565,9 @@
d2 = 4;
icon_state = "2-4"
},
+/obj/effect/map_effect/door_helper/unres{
+ dir = 1
+ },
/turf/simulated/floor/tiled/dark,
/area/ai_monitored/storage/eva)
"aVo" = (
@@ -27586,6 +27665,9 @@
name = "Security Aft Entrance";
req_access = list(63)
},
+/obj/effect/map_effect/door_helper/unres{
+ dir = 1
+ },
/turf/simulated/floor/tiled,
/area/security/brig)
"aVw" = (
@@ -27788,6 +27870,9 @@
name = "B Lift Access";
req_access = list(19)
},
+/obj/effect/map_effect/door_helper/unres{
+ dir = 4
+ },
/turf/simulated/floor/tiled,
/area/bridge/ailobby)
"aVT" = (
@@ -35938,6 +36023,9 @@
},
/obj/machinery/door/firedoor,
/obj/effect/floor_decal/industrial/hatch/yellow,
+/obj/effect/map_effect/door_helper/unres{
+ dir = 1
+ },
/turf/simulated/floor/tiled,
/area/medical/icu)
"bki" = (
@@ -38077,6 +38165,9 @@
d2 = 8;
icon_state = "4-8"
},
+/obj/effect/map_effect/door_helper/unres{
+ dir = 4
+ },
/turf/simulated/floor/tiled/white,
/area/medical/med_office{
name = "\improper Medical - Psych Stairway"
@@ -38729,6 +38820,7 @@
},
/obj/machinery/atmospherics/pipe/simple/hidden,
/obj/effect/floor_decal/industrial/hatch/yellow,
+/obj/effect/map_effect/door_helper/unres,
/turf/simulated/floor/tiled,
/area/medical/gen_treatment)
"bpC" = (
@@ -39691,6 +39783,9 @@
req_access = list(66)
},
/obj/effect/floor_decal/industrial/hatch/yellow,
+/obj/effect/map_effect/door_helper/unres{
+ dir = 4
+ },
/turf/simulated/floor/tiled,
/area/medical/gen_treatment)
"brM" = (
@@ -40780,6 +40875,9 @@
name = "Biohazard Shutter";
opacity = 0
},
+/obj/effect/map_effect/door_helper/unres{
+ dir = 8
+ },
/turf/simulated/floor/tiled/white,
/area/rnd/research)
"btS" = (
@@ -41281,6 +41379,9 @@
dir = 4
},
/obj/machinery/door/firedoor,
+/obj/effect/map_effect/door_helper/unres{
+ dir = 8
+ },
/turf/simulated/floor/lino/grey,
/area/crew_quarters/bar)
"buX" = (
@@ -44733,6 +44834,9 @@
/obj/machinery/holosign/surgery{
id = 1
},
+/obj/effect/map_effect/door_helper/unres{
+ dir = 4
+ },
/turf/simulated/floor/tiled/white,
/area/medical/surgerywing)
"bBY" = (
@@ -45589,6 +45693,9 @@
/obj/machinery/holosign/surgery{
id = 2
},
+/obj/effect/map_effect/door_helper/unres{
+ dir = 4
+ },
/turf/simulated/floor/tiled/white,
/area/medical/surgerywing)
"bDP" = (
@@ -47294,6 +47401,7 @@
/obj/machinery/door/firedoor,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/effect/map_effect/door_helper/unres,
/turf/simulated/floor/tiled/white,
/area/medical/surgeryprep)
"bHB" = (
@@ -50230,6 +50338,9 @@
req_access = list(28)
},
/obj/machinery/door/firedoor,
+/obj/effect/map_effect/door_helper/unres{
+ dir = 4
+ },
/turf/simulated/floor/tiled/white,
/area/crew_quarters/kitchen)
"bOV" = (
@@ -54533,6 +54644,9 @@
dir = 4
},
/obj/machinery/door/firedoor,
+/obj/effect/map_effect/door_helper/unres{
+ dir = 8
+ },
/turf/simulated/floor/tiled,
/area/quartermaster/lobby)
"bZN" = (
@@ -55015,6 +55129,7 @@
icon_state = "1-2"
},
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/effect/map_effect/door_helper/unres,
/turf/simulated/floor/tiled,
/area/quartermaster/break_room)
"caD" = (
@@ -56638,6 +56753,7 @@
req_one_access = list(31,48,67)
},
/obj/machinery/door/firedoor,
+/obj/effect/map_effect/door_helper/unres,
/turf/simulated/floor/tiled,
/area/quartermaster/break_room)
"cea" = (
@@ -57012,6 +57128,7 @@
},
/obj/machinery/door/firedoor,
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/effect/map_effect/door_helper/unres,
/turf/simulated/floor/tiled,
/area/outpost/mining_main/refinery)
"ceB" = (
@@ -57672,6 +57789,7 @@
icon_state = "1-2"
},
/obj/structure/disposalpipe/segment,
+/obj/effect/map_effect/door_helper/unres,
/turf/simulated/floor/tiled,
/area/outpost/mining_main/refinery)
"cfT" = (
@@ -62195,6 +62313,9 @@
req_access = list(66)
},
/obj/effect/floor_decal/industrial/hatch/yellow,
+/obj/effect/map_effect/door_helper/unres{
+ dir = 4
+ },
/turf/simulated/floor/tiled,
/area/medical/icu)
"jyi" = (
@@ -62393,6 +62514,21 @@
/obj/structure/cable/green,
/turf/simulated/floor/plating,
/area/maintenance/substation/medical)
+"kcx" = (
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/medical{
+ autoclose = 0;
+ icon_state = "door_open";
+ id_tag = null;
+ name = "General Treatment Room";
+ req_access = list(66)
+ },
+/obj/effect/floor_decal/industrial/hatch/yellow,
+/obj/effect/map_effect/door_helper/unres{
+ dir = 8
+ },
+/turf/simulated/floor/tiled,
+/area/medical/gen_treatment)
"kcG" = (
/obj/structure/cable{
d1 = 4;
@@ -104690,7 +104826,7 @@ bpA
bqM
brR
bth
-brL
+kcx
bvv
bwn
bxP
diff --git a/maps/aurora/aurora-6_surface.dmm b/maps/aurora/aurora-6_surface.dmm
index c4bf1c11a96..139c757c48a 100644
--- a/maps/aurora/aurora-6_surface.dmm
+++ b/maps/aurora/aurora-6_surface.dmm
@@ -16866,6 +16866,9 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/effect/map_effect/door_helper/unres{
+ dir = 8
+ },
/turf/simulated/floor/tiled,
/area/quartermaster/loading)
"Fy" = (