diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm
index f6966f67917..0e893c1882d 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm
@@ -176,7 +176,7 @@
/turf/open/floor/wood,
/area/ruin/powered/snow_biodome)
"aO" = (
-/obj/machinery/door/airlock/glass_large,
+/obj/machinery/door/airlock/multi_tile/glass,
/obj/structure/fans/tiny,
/turf/open/floor/pod/dark,
/area/ruin/powered/snow_biodome)
@@ -360,7 +360,7 @@
/area/ruin/powered/snow_biodome)
"Ez" = (
/obj/structure/fans/tiny,
-/obj/machinery/door/airlock/glass_large,
+/obj/machinery/door/airlock/multi_tile/glass,
/turf/open/floor/pod/dark,
/area/ruin/powered/snow_biodome)
"EA" = (
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm
index 5c327ba1455..6584122df46 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm
@@ -88,7 +88,7 @@
/turf/open/floor/iron/dark,
/area/ruin/powered/seedvault)
"as" = (
-/obj/machinery/door/airlock/glass_large,
+/obj/machinery/door/airlock/multi_tile/glass,
/turf/open/floor/iron/freezer,
/area/ruin/powered/seedvault)
"at" = (
diff --git a/_maps/RandomRuins/SpaceRuins/spacehotel_skyrat.dmm b/_maps/RandomRuins/SpaceRuins/spacehotel_skyrat.dmm
index 98b9cdd0d9e..9c18ebf6929 100644
--- a/_maps/RandomRuins/SpaceRuins/spacehotel_skyrat.dmm
+++ b/_maps/RandomRuins/SpaceRuins/spacehotel_skyrat.dmm
@@ -1618,7 +1618,7 @@
dir = 8
},
/obj/structure/cable,
-/obj/machinery/door/airlock/glass_large{
+/obj/machinery/door/airlock/multi_tile/glass{
dir = 4;
id_tag = "HotelRoom8"
},
@@ -5485,7 +5485,7 @@
/area/ruin/space/has_grav/hotel/power)
"Fm" = (
/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/glass_large{
+/obj/machinery/door/airlock/multi_tile/glass{
dir = 4;
id_tag = "HotelRoom8"
},
diff --git a/_maps/RandomRuins/SpaceRuins/the_outlet.dmm b/_maps/RandomRuins/SpaceRuins/the_outlet.dmm
index 699d509495d..7e238fe600d 100644
--- a/_maps/RandomRuins/SpaceRuins/the_outlet.dmm
+++ b/_maps/RandomRuins/SpaceRuins/the_outlet.dmm
@@ -2006,7 +2006,7 @@
/turf/open/floor/plating/rust,
/area/ruin/space/has_grav/the_outlet/researchrooms)
"Wz" = (
-/obj/machinery/door/airlock/glass_large,
+/obj/machinery/door/airlock/multi_tile/glass,
/turf/open/floor/iron,
/area/ruin/space/has_grav/the_outlet/storefront)
"WC" = (
diff --git a/_maps/RandomZLevels/SnowCabin.dmm b/_maps/RandomZLevels/SnowCabin.dmm
index 471290bc568..a40afa56077 100644
--- a/_maps/RandomZLevels/SnowCabin.dmm
+++ b/_maps/RandomZLevels/SnowCabin.dmm
@@ -2594,7 +2594,7 @@
},
/area/awaymission/cabin/caves/sovietcave)
"nM" = (
-/obj/machinery/door/airlock/glass_large{
+/obj/machinery/door/airlock/multi_tile/glass{
name = "Medical Bay"
},
/obj/structure/cable,
diff --git a/_maps/map_files/Birdshot/birdshot.dmm b/_maps/map_files/Birdshot/birdshot.dmm
index bf747e57f11..dc50b7c8cd3 100644
--- a/_maps/map_files/Birdshot/birdshot.dmm
+++ b/_maps/map_files/Birdshot/birdshot.dmm
@@ -39287,7 +39287,7 @@
/obj/effect/turf_decal/siding/wood{
dir = 1
},
-/obj/machinery/door/airlock/glass_large{
+/obj/machinery/door/airlock/multi_tile/glass{
name = "Library"
},
/obj/machinery/door/firedoor,
@@ -53594,7 +53594,7 @@
"sTa" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/door/airlock/glass_large{
+/obj/machinery/door/airlock/multi_tile/glass{
name = "Diner"
},
/obj/machinery/door/firedoor,
@@ -53677,7 +53677,7 @@
/turf/open/floor/iron,
/area/station/commons/dorms)
"sTW" = (
-/obj/machinery/door/airlock/glass_large{
+/obj/machinery/door/airlock/multi_tile/glass{
name = "Theatre"
},
/obj/machinery/door/firedoor,
diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm
index 2c91d906a4b..c50f8f2b12f 100644
--- a/_maps/map_files/Deltastation/DeltaStation2.dmm
+++ b/_maps/map_files/Deltastation/DeltaStation2.dmm
@@ -50468,7 +50468,7 @@
/turf/open/floor/iron,
/area/station/service/kitchen/abandoned)
"mDO" = (
-/obj/machinery/door/airlock/glass_large{
+/obj/machinery/door/airlock/multi_tile/glass{
name = "Laundromat"
},
/obj/effect/turf_decal/stripes/line,
@@ -61976,7 +61976,7 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/door/firedoor,
/obj/structure/disposalpipe/segment,
-/obj/machinery/door/airlock/glass_large{
+/obj/machinery/door/airlock/multi_tile/glass{
name = "Laundromat"
},
/turf/open/floor/iron,
diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm
index 8b5d413621c..9ac3282052f 100644
--- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm
+++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm
@@ -9043,7 +9043,7 @@
/turf/open/floor/plating,
/area/station/maintenance/fore)
"cKp" = (
-/obj/machinery/door/airlock/glass_large{
+/obj/machinery/door/airlock/multi_tile/glass{
name = "Hydroponics"
},
/obj/effect/mapping_helpers/airlock/access/all/service/hydroponics,
@@ -27508,7 +27508,7 @@
dir = 1
},
/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/glass_large{
+/obj/machinery/door/airlock/multi_tile/glass{
name = "The Girly Boar"
},
/turf/open/floor/iron/dark/textured_half,
@@ -71127,7 +71127,7 @@
},
/obj/effect/turf_decal/siding/wood,
/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/glass_large{
+/obj/machinery/door/airlock/multi_tile/glass{
name = "The Girly Boar"
},
/turf/open/floor/iron/dark/textured_half,
diff --git a/_maps/map_files/NorthStar/north_star.dmm b/_maps/map_files/NorthStar/north_star.dmm
index c189dd8ded2..9eb43f65788 100644
--- a/_maps/map_files/NorthStar/north_star.dmm
+++ b/_maps/map_files/NorthStar/north_star.dmm
@@ -17328,7 +17328,7 @@
/area/station/maintenance/floor1/starboard/fore)
"eur" = (
/obj/effect/mapping_helpers/airlock/access/any/supply/mining,
-/obj/machinery/door/airlock/glass_large{
+/obj/machinery/door/airlock/multi_tile/glass{
name = "Xenoflora"
},
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
diff --git a/_maps/templates/battlecruiser_starfury.dmm b/_maps/templates/battlecruiser_starfury.dmm
index 979b5f2b058..66fa9cba9ab 100644
--- a/_maps/templates/battlecruiser_starfury.dmm
+++ b/_maps/templates/battlecruiser_starfury.dmm
@@ -1028,7 +1028,7 @@
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/door/airlock/glass_large,
+/obj/machinery/door/airlock/multi_tile/glass,
/obj/effect/mapping_helpers/airlock/access/all/syndicate/general,
/turf/open/floor/pod/light,
/area/shuttle/sbc_starfury)
@@ -1590,14 +1590,14 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/door/firedoor/heavy,
/obj/effect/mapping_helpers/airlock/cutaiwire,
-/obj/machinery/door/airlock/glass_large,
+/obj/machinery/door/airlock/multi_tile/glass,
/turf/open/floor/pod/light,
/area/shuttle/sbc_starfury)
"fF" = (
/obj/effect/mapping_helpers/airlock/access/all/syndicate/general,
/obj/machinery/door/firedoor/heavy,
/obj/effect/mapping_helpers/airlock/cutaiwire,
-/obj/machinery/door/airlock/glass_large,
+/obj/machinery/door/airlock/multi_tile/glass,
/turf/open/floor/pod/light,
/area/shuttle/sbc_starfury)
"fG" = (
@@ -4457,7 +4457,7 @@
"AJ" = (
/obj/machinery/door/firedoor/heavy,
/obj/effect/mapping_helpers/airlock/cutaiwire,
-/obj/machinery/door/airlock/glass_large,
+/obj/machinery/door/airlock/multi_tile/glass,
/obj/effect/mapping_helpers/airlock/access/all/syndicate/general,
/turf/open/floor/pod/light,
/area/shuttle/sbc_starfury)
diff --git a/_maps/templates/lazy_templates/nukie_base.dmm b/_maps/templates/lazy_templates/nukie_base.dmm
index c2ace1e7441..1fda7034220 100644
--- a/_maps/templates/lazy_templates/nukie_base.dmm
+++ b/_maps/templates/lazy_templates/nukie_base.dmm
@@ -647,7 +647,7 @@
dir = 1
},
/obj/effect/turf_decal/siding/wideplating,
-/obj/machinery/door/airlock/glass_large{
+/obj/machinery/door/airlock/multi_tile/glass{
name = "Disembarkents"
},
/obj/effect/mapping_helpers/airlock/access/all/syndicate/general,
diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm
index 4a8aa5e33c7..61eefd916b4 100644
--- a/code/__HELPERS/icons.dm
+++ b/code/__HELPERS/icons.dm
@@ -1433,3 +1433,16 @@ GLOBAL_LIST_EMPTY(transformation_animation_objects)
if(scream)
stack_trace("Icon Lookup for state: [state] in file [file] failed.")
return FALSE
+
+/**
+ * Returns the size of the sprite in tiles.
+ * Takes the icon size and divides it by the world icon size (default 32).
+ * This gives the size of the sprite in tiles.
+ *
+ * @return size of the sprite in tiles
+ */
+/proc/get_size_in_tiles(obj/target)
+ var/icon/size_check = icon(target.icon, target.icon_state)
+ var/size = size_check.Width() / world.icon_size
+
+ return size
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index ac42acd062c..b6dbd8c5268 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -1239,17 +1239,13 @@
update_icon(ALL, AIRLOCK_OPENING, TRUE)
sleep(0.1 SECONDS)
set_opacity(0)
- //SKYRAT EDIT ADDITION BEGIN - LARGE_DOOR
if(multi_tile)
filler.set_opacity(FALSE)
- //SKYRAT EDIT END
update_freelook_sight()
sleep(0.4 SECONDS)
set_density(FALSE)
- //SKYRAT EDIT ADDITION BEGIN - LARGE_DOOR
if(multi_tile)
filler.set_density(FALSE)
- //SKYRAT EDIT END
flags_1 &= ~PREVENT_CLICK_UNDER_1
air_update_turf(TRUE, FALSE)
sleep(0.1 SECONDS)
@@ -1300,10 +1296,9 @@
var/dangerous_close = !safe || force_crush
if(!dangerous_close)
- for(var/turf/checked_turf in get_turfs()) // SKYRAT EDIT ADD
- //for(var/atom/movable/M in get_turf(src)) // Original
- for(var/atom/movable/M in checked_turf) // SKYRAT EDIT CHANGE
- if(M.density && M != src) //something is blocking the door
+ for(var/turf/checked_turf in locs)
+ for(var/atom/movable/blocking in checked_turf)
+ if(blocking.density && blocking != src)
autoclose_in(DOOR_CLOSE_WAIT)
return FALSE
@@ -1319,6 +1314,8 @@
layer = CLOSED_DOOR_LAYER
if(air_tight)
set_density(TRUE)
+ if(multi_tile)
+ filler.density = TRUE
flags_1 |= PREVENT_CLICK_UNDER_1
//SKYRAT EDIT ADDITION BEGIN - LARGE_DOOR
if(multi_tile)
@@ -1327,6 +1324,8 @@
sleep(0.1 SECONDS)
if(!air_tight)
set_density(TRUE)
+ if(multi_tile)
+ filler.density = TRUE
flags_1 |= PREVENT_CLICK_UNDER_1
//SKYRAT EDIT ADDITION BEGIN - LARGE_DOOR
if(multi_tile)
@@ -1337,7 +1336,7 @@
if(dangerous_close)
crush()
if(visible && !glass)
- set_opacity(1)
+ set_opacity(TRUE)
if(multi_tile)
filler.set_opacity(TRUE)
update_freelook_sight()
@@ -1764,6 +1763,728 @@
var/area/source_area = get_area(src)
return source_area?.airlock_wires ? new source_area.airlock_wires(src) : new /datum/wires/airlock(src)
+/obj/structure/fluff/airlock_filler/Destroy(force)
+ filled_airlock = null
+ return ..()
+
+/**
+ * Create a ref to our parent airlock and listen for a QDEL, which we will al
+ */
+/obj/structure/fluff/airlock_filler/proc/pair_airlock(obj/machinery/door/parent_airlock)
+ if(isnull(parent_airlock))
+ stack_trace("Attempted to pair an airlock filler with no parent airlock specified!")
+ return
+
+ filled_airlock = parent_airlock
+ RegisterSignal(filled_airlock, COMSIG_QDELETING, PROC_REF(no_airlock))
+
+/**
+ * Multi-tile airlocks pair with a filler panel, if one goes so does the other.
+ */
+/obj/structure/fluff/airlock_filler/proc/no_airlock()
+ SIGNAL_HANDLER
+
+ qdel(src)
+
+/**
+ * Multi-tile airlocks (using a filler panel) have special handling for movables with PASSGLASS
+ */
+/obj/structure/fluff/airlock_filler/CanAllowThrough(atom/movable/mover, turf/target)
+ . = ..()
+ if(.)
+ return
+
+ if(istype(mover) && (mover.pass_flags & PASSGLASS))
+ return !opacity
+
+/obj/structure/fluff/airlock_filler/can_be_pulled(user, grab_state, force)
+ return FALSE
+
+/obj/structure/fluff/airlock_filler/singularity_act()
+ return
+
+/obj/structure/fluff/airlock_filler/singularity_pull(S, current_size)
+ return
+
+/*
+ Station Airlocks Regular
+*/
+
+/obj/machinery/door/airlock/command
+ icon = 'icons/obj/doors/airlocks/station/command.dmi'
+ assemblytype = /obj/structure/door_assembly/door_assembly_com
+ normal_integrity = 450
+
+/obj/machinery/door/airlock/security
+ icon = 'icons/obj/doors/airlocks/station/security.dmi'
+ assemblytype = /obj/structure/door_assembly/door_assembly_sec
+ normal_integrity = 450
+
+/obj/machinery/door/airlock/engineering
+ icon = 'icons/obj/doors/airlocks/station/engineering.dmi'
+ assemblytype = /obj/structure/door_assembly/door_assembly_eng
+
+/obj/machinery/door/airlock/medical
+ icon = 'icons/obj/doors/airlocks/station/medical.dmi'
+ assemblytype = /obj/structure/door_assembly/door_assembly_med
+
+/obj/machinery/door/airlock/hydroponics //Hydroponics front doors!
+ icon = 'icons/obj/doors/airlocks/station/hydroponics.dmi'
+ assemblytype = /obj/structure/door_assembly/door_assembly_hydro
+
+/obj/machinery/door/airlock/maintenance
+ name = "maintenance access"
+ icon = 'icons/obj/doors/airlocks/station/maintenance.dmi'
+ assemblytype = /obj/structure/door_assembly/door_assembly_mai
+ normal_integrity = 250
+
+/obj/machinery/door/airlock/maintenance/external
+ name = "external airlock access"
+ icon = 'icons/obj/doors/airlocks/station/maintenanceexternal.dmi'
+ assemblytype = /obj/structure/door_assembly/door_assembly_extmai
+
+/obj/machinery/door/airlock/mining
+ name = "mining airlock"
+ icon = 'icons/obj/doors/airlocks/station/mining.dmi'
+ assemblytype = /obj/structure/door_assembly/door_assembly_min
+
+/obj/machinery/door/airlock/atmos
+ name = "atmospherics airlock"
+ icon = 'icons/obj/doors/airlocks/station/atmos.dmi'
+ assemblytype = /obj/structure/door_assembly/door_assembly_atmo
+
+/obj/machinery/door/airlock/research
+ icon = 'icons/obj/doors/airlocks/station/research.dmi'
+ assemblytype = /obj/structure/door_assembly/door_assembly_research
+
+/obj/machinery/door/airlock/freezer
+ name = "freezer airlock"
+ icon = 'icons/obj/doors/airlocks/station/freezer.dmi'
+ assemblytype = /obj/structure/door_assembly/door_assembly_fre
+
+/obj/machinery/door/airlock/science
+ icon = 'icons/obj/doors/airlocks/station/science.dmi'
+ assemblytype = /obj/structure/door_assembly/door_assembly_science
+
+/obj/machinery/door/airlock/virology
+ icon = 'icons/obj/doors/airlocks/station/virology.dmi'
+ assemblytype = /obj/structure/door_assembly/door_assembly_viro
+
+//////////////////////////////////
+/*
+ Station Airlocks Glass
+*/
+
+/obj/machinery/door/airlock/glass
+ opacity = FALSE
+ glass = TRUE
+
+/obj/machinery/door/airlock/glass/incinerator
+ autoclose = FALSE
+ heat_proof = TRUE
+ req_access = list(ACCESS_SYNDICATE)
+
+/obj/machinery/door/airlock/glass/incinerator/syndicatelava_interior
+ name = "Turbine Interior Airlock"
+ id_tag = INCINERATOR_SYNDICATELAVA_AIRLOCK_INTERIOR
+
+/obj/machinery/door/airlock/glass/incinerator/syndicatelava_exterior
+ name = "Turbine Exterior Airlock"
+ id_tag = INCINERATOR_SYNDICATELAVA_AIRLOCK_EXTERIOR
+
+/obj/machinery/door/airlock/command/glass
+ opacity = FALSE
+ glass = TRUE
+ normal_integrity = 400
+
+/obj/machinery/door/airlock/engineering/glass
+ opacity = FALSE
+ glass = TRUE
+
+/obj/machinery/door/airlock/engineering/glass/critical
+ critical_machine = TRUE //stops greytide virus from opening & bolting doors in critical positions, such as the SM chamber.
+
+/obj/machinery/door/airlock/security/glass
+ opacity = FALSE
+ glass = TRUE
+ normal_integrity = 400
+
+/obj/machinery/door/airlock/medical/glass
+ opacity = FALSE
+ glass = TRUE
+
+/obj/machinery/door/airlock/hydroponics/glass //Uses same icon as medical/glass, maybe update it with its own unique icon one day?
+ opacity = FALSE
+ glass = TRUE
+
+/obj/machinery/door/airlock/research/glass
+ opacity = FALSE
+ glass = TRUE
+
+/obj/machinery/door/airlock/research/glass/incinerator
+ autoclose = FALSE
+ heat_proof = TRUE
+
+/obj/machinery/door/airlock/research/glass/incinerator/ordmix_interior
+ name = "Mixing Room Interior Airlock"
+ id_tag = INCINERATOR_ORDMIX_AIRLOCK_INTERIOR
+
+/obj/machinery/door/airlock/research/glass/incinerator/ordmix_exterior
+ name = "Mixing Room Exterior Airlock"
+ id_tag = INCINERATOR_ORDMIX_AIRLOCK_EXTERIOR
+
+/obj/machinery/door/airlock/mining/glass
+ opacity = FALSE
+ glass = TRUE
+
+/obj/machinery/door/airlock/atmos/glass
+ opacity = FALSE
+ glass = TRUE
+
+/obj/machinery/door/airlock/atmos/glass/critical
+ critical_machine = TRUE //stops greytide virus from opening & bolting doors in critical positions, such as the SM chamber.
+
+/obj/machinery/door/airlock/science/glass
+ opacity = FALSE
+ glass = TRUE
+
+/obj/machinery/door/airlock/virology/glass
+ opacity = FALSE
+ glass = TRUE
+
+/obj/machinery/door/airlock/maintenance/glass
+ opacity = FALSE
+ glass = TRUE
+
+/obj/machinery/door/airlock/maintenance/external/glass
+ opacity = FALSE
+ glass = TRUE
+ normal_integrity = 200
+
+//////////////////////////////////
+/*
+ Station Airlocks Mineral
+*/
+
+/obj/machinery/door/airlock/gold
+ name = "gold airlock"
+ icon = 'icons/obj/doors/airlocks/station/gold.dmi'
+ assemblytype = /obj/structure/door_assembly/door_assembly_gold
+
+/obj/machinery/door/airlock/gold/discoinferno
+ heat_proof = TRUE
+ resistance_flags = FIRE_PROOF
+ armor_type = /datum/armor/discoinferno_airlock
+
+/datum/armor/discoinferno_airlock
+ melee = 30
+ bullet = 30
+ laser = 20
+ energy = 20
+ bomb = 10
+ fire = 100
+ acid = 100
+
+/obj/machinery/door/airlock/gold/glass
+ opacity = FALSE
+ glass = TRUE
+
+/obj/machinery/door/airlock/silver
+ name = "silver airlock"
+ icon = 'icons/obj/doors/airlocks/station/silver.dmi'
+ assemblytype = /obj/structure/door_assembly/door_assembly_silver
+
+/obj/machinery/door/airlock/silver/glass
+ opacity = FALSE
+ glass = TRUE
+
+/obj/machinery/door/airlock/diamond
+ name = "diamond airlock"
+ icon = 'icons/obj/doors/airlocks/station/diamond.dmi'
+ assemblytype = /obj/structure/door_assembly/door_assembly_diamond
+ normal_integrity = 1000
+ explosion_block = 2
+
+/obj/machinery/door/airlock/diamond/glass
+ normal_integrity = 950
+ opacity = FALSE
+ glass = TRUE
+
+/obj/machinery/door/airlock/uranium
+ name = "uranium airlock"
+ icon = 'icons/obj/doors/airlocks/station/uranium.dmi'
+ assemblytype = /obj/structure/door_assembly/door_assembly_uranium
+ var/last_event = 0
+ //Is this airlock actually radioactive?
+ var/actually_radioactive = TRUE
+
+/obj/machinery/door/airlock/uranium/process()
+ if(actually_radioactive && world.time > last_event+20)
+ if(prob(50))
+ radiate()
+ last_event = world.time
+ ..()
+
+/obj/machinery/door/airlock/uranium/proc/radiate()
+ radiation_pulse(
+ src,
+ max_range = 2,
+ threshold = RAD_LIGHT_INSULATION,
+ chance = URANIUM_IRRADIATION_CHANCE,
+ minimum_exposure_time = URANIUM_RADIATION_MINIMUM_EXPOSURE_TIME,
+ )
+
+/obj/machinery/door/airlock/uranium/glass
+ opacity = FALSE
+ glass = TRUE
+
+/obj/machinery/door/airlock/uranium/safe
+ actually_radioactive = FALSE
+
+/obj/machinery/door/airlock/uranium/glass/safe
+ actually_radioactive = FALSE
+
+/obj/machinery/door/airlock/plasma
+ name = "plasma airlock"
+ desc = "No way this can end badly."
+ icon = 'icons/obj/doors/airlocks/station/plasma.dmi'
+ assemblytype = /obj/structure/door_assembly/door_assembly_plasma
+ material_flags = MATERIAL_EFFECTS
+ material_modifier = 0.25
+
+/obj/machinery/door/airlock/plasma/Initialize(mapload)
+ custom_materials = custom_materials ? custom_materials : list(/datum/material/plasma = SHEET_MATERIAL_AMOUNT * 10)
+ . = ..()
+
+/obj/machinery/door/airlock/plasma/block_superconductivity() //we don't stop the heat~
+ return 0
+
+/obj/machinery/door/airlock/plasma/glass
+ opacity = FALSE
+ glass = TRUE
+
+/obj/machinery/door/airlock/bananium
+ name = "bananium airlock"
+ desc = "Honkhonkhonk"
+ icon = 'icons/obj/doors/airlocks/station/bananium.dmi'
+ assemblytype = /obj/structure/door_assembly/door_assembly_bananium
+ doorOpen = 'sound/items/bikehorn.ogg'
+
+/obj/machinery/door/airlock/bananium/glass
+ opacity = FALSE
+ glass = TRUE
+
+/obj/machinery/door/airlock/sandstone
+ name = "sandstone airlock"
+ icon = 'icons/obj/doors/airlocks/station/sandstone.dmi'
+ assemblytype = /obj/structure/door_assembly/door_assembly_sandstone
+
+/obj/machinery/door/airlock/sandstone/glass
+ opacity = FALSE
+ glass = TRUE
+
+/obj/machinery/door/airlock/wood
+ name = "wooden airlock"
+ icon = 'icons/obj/doors/airlocks/station/wood.dmi'
+ assemblytype = /obj/structure/door_assembly/door_assembly_wood
+
+/obj/machinery/door/airlock/wood/glass
+ opacity = FALSE
+ glass = TRUE
+
+/obj/machinery/door/airlock/titanium
+ name = "shuttle airlock"
+ assemblytype = /obj/structure/door_assembly/door_assembly_titanium
+ icon = 'icons/obj/doors/airlocks/shuttle/shuttle.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/shuttle/overlays.dmi'
+ normal_integrity = 400
+
+/obj/machinery/door/airlock/titanium/glass
+ normal_integrity = 350
+ opacity = FALSE
+ glass = TRUE
+
+/obj/machinery/door/airlock/bronze
+ name = "bronze airlock"
+ icon = 'icons/obj/doors/airlocks/clockwork/pinion_airlock.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/clockwork/overlays.dmi'
+ assemblytype = /obj/structure/door_assembly/door_assembly_bronze
+
+/obj/machinery/door/airlock/bronze/seethru
+ assemblytype = /obj/structure/door_assembly/door_assembly_bronze/seethru
+ opacity = FALSE
+ glass = TRUE
+//////////////////////////////////
+/*
+ Station2 Airlocks
+*/
+
+/obj/machinery/door/airlock/public
+ icon = 'icons/obj/doors/airlocks/station2/glass.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/station2/overlays.dmi'
+ assemblytype = /obj/structure/door_assembly/door_assembly_public
+
+/obj/machinery/door/airlock/public/glass
+ opacity = FALSE
+ glass = TRUE
+
+/obj/machinery/door/airlock/public/glass/incinerator
+ autoclose = FALSE
+ heat_proof = TRUE
+
+/obj/machinery/door/airlock/public/glass/incinerator/atmos_interior
+ name = "Turbine Interior Airlock"
+ id_tag = INCINERATOR_ATMOS_AIRLOCK_INTERIOR
+
+/obj/machinery/door/airlock/public/glass/incinerator/atmos_exterior
+ name = "Turbine Exterior Airlock"
+ id_tag = INCINERATOR_ATMOS_AIRLOCK_EXTERIOR
+
+//////////////////////////////////
+/*
+ External Airlocks
+*/
+
+/obj/machinery/door/airlock/external
+ name = "external airlock"
+ icon = 'icons/obj/doors/airlocks/external/external.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/external/overlays.dmi'
+ note_overlay_file = 'icons/obj/doors/airlocks/external/overlays.dmi'
+ assemblytype = /obj/structure/door_assembly/door_assembly_ext
+
+ /// Whether or not the airlock can be opened without access from a certain direction while powered, or with bare hands from any direction while unpowered OR pressurized.
+ var/space_dir = null
+
+/obj/machinery/door/airlock/external/Initialize(mapload, ...)
+ // default setting is for mapping only, let overrides work
+ if(!mapload)
+ req_access = null
+
+ return ..()
+
+/obj/machinery/door/airlock/external/LateInitialize()
+ . = ..()
+ if(space_dir)
+ unres_sides |= space_dir
+
+/obj/machinery/door/airlock/external/examine(mob/user)
+ . = ..()
+ if(space_dir)
+ . += span_notice("It has labels indicating that it has an emergency mechanism to open from the [dir2text(space_dir)] side with just your hands even if there's no power.")
+
+/obj/machinery/door/airlock/external/cyclelinkairlock()
+ . = ..()
+ var/obj/machinery/door/airlock/external/cycle_linked_external_airlock = cyclelinkedairlock
+ if(istype(cycle_linked_external_airlock))
+ cycle_linked_external_airlock.space_dir |= space_dir
+ space_dir |= cycle_linked_external_airlock.space_dir
+
+/obj/machinery/door/airlock/external/try_safety_unlock(mob/user)
+ if(space_dir && density)
+ if(!hasPower())
+ to_chat(user, span_notice("You begin unlocking the airlock safety mechanism..."))
+ if(do_after(user, 15 SECONDS, target = src))
+ try_to_crowbar(null, user, TRUE)
+ return TRUE
+ else
+ // always open from the space side
+ // get_dir(src, user) & space_dir, checked in unresricted_sides
+ var/should_safety_open = shuttledocked || cyclelinkedairlock?.shuttledocked || is_safe_turf(get_step(src, space_dir), TRUE, FALSE)
+ return try_to_activate_door(user, should_safety_open)
+
+ return ..()
+
+/// Access free external airlock
+/obj/machinery/door/airlock/external/ruin
+
+/obj/machinery/door/airlock/external/glass
+ opacity = FALSE
+ glass = TRUE
+
+/// Access free external glass airlock
+/obj/machinery/door/airlock/external/glass/ruin
+
+//////////////////////////////////
+/*
+ CentCom Airlocks
+*/
+
+/obj/machinery/door/airlock/centcom //Use grunge as a station side version, as these have special effects related to them via phobias and such.
+ icon = 'icons/obj/doors/airlocks/centcom/centcom.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/centcom/overlays.dmi'
+ assemblytype = /obj/structure/door_assembly/door_assembly_centcom
+ normal_integrity = 1000
+ security_level = 6
+ explosion_block = 2
+
+/obj/machinery/door/airlock/grunge
+ icon = 'icons/obj/doors/airlocks/centcom/centcom.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/centcom/overlays.dmi'
+ assemblytype = /obj/structure/door_assembly/door_assembly_grunge
+
+//////////////////////////////////
+/*
+ Vault Airlocks
+*/
+
+/obj/machinery/door/airlock/vault
+ name = "vault door"
+ icon = 'icons/obj/doors/airlocks/vault/vault.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/vault/overlays.dmi'
+ assemblytype = /obj/structure/door_assembly/door_assembly_vault
+ explosion_block = 2
+ normal_integrity = 400 // reverse engieneerd: 400 * 1.5 (sec lvl 6) = 600 = original
+ security_level = 6
+
+//////////////////////////////////
+/*
+ Hatch Airlocks
+*/
+
+/obj/machinery/door/airlock/hatch
+ name = "airtight hatch"
+ icon = 'icons/obj/doors/airlocks/hatch/centcom.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/hatch/overlays.dmi'
+ note_overlay_file = 'icons/obj/doors/airlocks/hatch/overlays.dmi'
+ assemblytype = /obj/structure/door_assembly/door_assembly_hatch
+
+/obj/machinery/door/airlock/maintenance_hatch
+ name = "maintenance hatch"
+ icon = 'icons/obj/doors/airlocks/hatch/maintenance.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/hatch/overlays.dmi'
+ note_overlay_file = 'icons/obj/doors/airlocks/hatch/overlays.dmi'
+ assemblytype = /obj/structure/door_assembly/door_assembly_mhatch
+
+//////////////////////////////////
+/*
+ High Security Airlocks
+*/
+
+/obj/machinery/door/airlock/highsecurity
+ name = "high tech security airlock"
+ icon = 'icons/obj/doors/airlocks/highsec/highsec.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/highsec/overlays.dmi'
+ assemblytype = /obj/structure/door_assembly/door_assembly_highsecurity
+ explosion_block = 2
+ normal_integrity = 500
+ security_level = 1
+ damage_deflection = 30
+
+//////////////////////////////////
+/*
+ Shuttle Airlocks
+*/
+
+/obj/machinery/door/airlock/shuttle
+ name = "shuttle airlock"
+ icon = 'icons/obj/doors/airlocks/shuttle/shuttle.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/shuttle/overlays.dmi'
+ assemblytype = /obj/structure/door_assembly/door_assembly_shuttle
+
+/obj/machinery/door/airlock/shuttle/glass
+ opacity = FALSE
+ glass = TRUE
+
+/obj/machinery/door/airlock/abductor
+ name = "alien airlock"
+ desc = "With humanity's current technological level, it could take years to hack this advanced airlock... or maybe we should give a screwdriver a try?"
+ icon = 'icons/obj/doors/airlocks/abductor/abductor_airlock.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/abductor/overlays.dmi'
+ assemblytype = /obj/structure/door_assembly/door_assembly_abductor
+ note_overlay_file = 'icons/obj/doors/airlocks/external/overlays.dmi'
+ damage_deflection = 30
+ explosion_block = 3
+ hackProof = TRUE
+ aiControlDisabled = AI_WIRE_DISABLED
+ normal_integrity = 700
+ security_level = 1
+
+//////////////////////////////////
+/*
+ Cult Airlocks
+*/
+
+/obj/machinery/door/airlock/cult
+ name = "cult airlock"
+ icon = 'icons/obj/doors/airlocks/cult/runed/cult.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/cult/runed/overlays.dmi'
+ assemblytype = /obj/structure/door_assembly/door_assembly_cult
+ hackProof = TRUE
+ aiControlDisabled = AI_WIRE_DISABLED
+ req_access = list(ACCESS_BLOODCULT)
+ damage_deflection = 10
+ var/openingoverlaytype = /obj/effect/temp_visual/cult/door
+ var/friendly = FALSE
+ var/stealthy = FALSE
+
+/obj/machinery/door/airlock/cult/Initialize(mapload)
+ . = ..()
+ new openingoverlaytype(loc)
+
+/obj/machinery/door/airlock/cult/canAIControl(mob/user)
+ return (IS_CULTIST(user) && !isAllPowerCut())
+
+/obj/machinery/door/airlock/cult/on_break()
+ set_panel_open(TRUE)
+
+/obj/machinery/door/airlock/cult/isElectrified()
+ return FALSE
+
+/obj/machinery/door/airlock/cult/hasPower()
+ return TRUE
+
+/obj/machinery/door/airlock/cult/allowed(mob/living/L)
+ if(!density)
+ return TRUE
+ if(friendly || IS_CULTIST(L) || isshade(L) || isconstruct(L))
+ if(!stealthy)
+ new openingoverlaytype(loc)
+ return TRUE
+ else
+ if(!stealthy)
+ new /obj/effect/temp_visual/cult/sac(loc)
+ var/atom/throwtarget
+ throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(L, src)))
+ SEND_SOUND(L, sound(pick('sound/hallucinations/turn_around1.ogg','sound/hallucinations/turn_around2.ogg'),0,1,50))
+ flash_color(L, flash_color="#960000", flash_time=20)
+ L.Paralyze(40)
+ L.throw_at(throwtarget, 5, 1)
+ return FALSE
+
+/obj/machinery/door/airlock/cult/proc/conceal()
+ icon = 'icons/obj/doors/airlocks/station/maintenance.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
+ name = "Airlock"
+ desc = "It opens and closes."
+ stealthy = TRUE
+ update_appearance()
+
+/obj/machinery/door/airlock/cult/proc/reveal()
+ icon = initial(icon)
+ overlays_file = initial(overlays_file)
+ name = initial(name)
+ desc = initial(desc)
+ stealthy = initial(stealthy)
+ update_appearance()
+
+/obj/machinery/door/airlock/cult/narsie_act()
+ return
+
+/obj/machinery/door/airlock/cult/emp_act(severity)
+ return
+
+/obj/machinery/door/airlock/cult/friendly
+ friendly = TRUE
+
+/obj/machinery/door/airlock/cult/glass
+ glass = TRUE
+ opacity = FALSE
+
+/obj/machinery/door/airlock/cult/glass/friendly
+ friendly = TRUE
+
+/obj/machinery/door/airlock/cult/unruned
+ icon = 'icons/obj/doors/airlocks/cult/unruned/cult.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/cult/unruned/overlays.dmi'
+ assemblytype = /obj/structure/door_assembly/door_assembly_cult/unruned
+ openingoverlaytype = /obj/effect/temp_visual/cult/door/unruned
+
+/obj/machinery/door/airlock/cult/unruned/friendly
+ friendly = TRUE
+
+/obj/machinery/door/airlock/cult/unruned/glass
+ glass = TRUE
+ opacity = FALSE
+
+/obj/machinery/door/airlock/cult/unruned/glass/friendly
+ friendly = TRUE
+
+/obj/machinery/door/airlock/cult/weak
+ name = "brittle cult airlock"
+ desc = "An airlock hastily corrupted by blood magic, it is unusually brittle in this state."
+ normal_integrity = 150
+ damage_deflection = 5
+ armor_type = /datum/armor/none
+
+
+//////////////////////////////////
+/*
+ Material Airlocks
+*/
+/obj/machinery/door/airlock/material
+ name = "Airlock"
+ material_flags = MATERIAL_EFFECTS | MATERIAL_ADD_PREFIX | MATERIAL_GREYSCALE | MATERIAL_AFFECT_STATISTICS
+ greyscale_config = /datum/greyscale_config/material_airlock
+ assemblytype = /obj/structure/door_assembly/door_assembly_material
+
+/obj/machinery/door/airlock/material/close(forced, force_crush)
+ . = ..()
+ if(!.)
+ return
+ for(var/datum/material/mat in custom_materials)
+ if(mat.alpha < 255)
+ set_opacity(FALSE)
+ break
+
+/obj/machinery/door/airlock/material/prepare_deconstruction_assembly(obj/structure/door_assembly/assembly)
+ assembly.set_custom_materials(custom_materials)
+ ..()
+
+/obj/machinery/door/airlock/material/glass
+ opacity = FALSE
+ glass = TRUE
+
+//////////////////////////////////
+/*
+ Misc Airlocks
+*/
+
+/obj/machinery/door/airlock/multi_tile/glass
+ multi_tile = TRUE
+ name = "large glass airlock"
+ icon = 'icons/obj/doors/airlocks/glass_large/glass_large.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/glass_large/overlays.dmi'
+ opacity = FALSE
+ assemblytype = /obj/structure/door_assembly/multi_tile/glass
+ glass = TRUE
+ bound_width = 64 // 2x1
+
+/obj/structure/fluff/airlock_filler
+ name = "airlock fluff"
+ desc = "You shouldn't be able to see this fluff!"
+ icon = null
+ icon_state = null
+ density = TRUE
+ opacity = TRUE
+ anchored = TRUE
+ invisibility = INVISIBILITY_MAXIMUM
+ can_atmos_pass = ATMOS_PASS_DENSITY
+ /// The door/airlock this fluff panel is attached to
+ var/obj/machinery/door/filled_airlock
+
+/obj/machinery/door/airlock/multi_tile/narsie_act()
+ return
+
+/// Subtype used in unit tests to ensure instant airlock opening/closing. Pretty much just excises everything that would delay the process or is un-needed for the sake of the test (sleeps, icon animations).
+/obj/machinery/door/airlock/instant
+
+// set_density on both open and close procs has a check and return builtin.
+
+/obj/machinery/door/airlock/instant/open(forced = DEFAULT_DOOR_CHECKS)
+ operating = TRUE
+ SEND_SIGNAL(src, COMSIG_AIRLOCK_OPEN, forced)
+ set_density(FALSE)
+ operating = FALSE
+ return TRUE
+
+/obj/machinery/door/airlock/instant/close(forced = DEFAULT_DOOR_CHECKS, force_crush = FALSE)
+ operating = TRUE
+ SEND_SIGNAL(src, COMSIG_AIRLOCK_CLOSE, forced)
+ set_density(TRUE)
+ operating = FALSE
+ return TRUE
+
+
#undef AIRLOCK_CLOSED
#undef AIRLOCK_CLOSING
#undef AIRLOCK_OPEN
diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm
deleted file mode 100644
index 0d5ea4c8bb0..00000000000
--- a/code/game/machinery/doors/airlock_types.dm
+++ /dev/null
@@ -1,663 +0,0 @@
-/*
- Station Airlocks Regular
-*/
-
-/obj/machinery/door/airlock/command
- icon = 'icons/obj/doors/airlocks/station/command.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_com
- normal_integrity = 450
-
-/obj/machinery/door/airlock/security
- icon = 'icons/obj/doors/airlocks/station/security.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_sec
- normal_integrity = 450
-
-/obj/machinery/door/airlock/engineering
- icon = 'icons/obj/doors/airlocks/station/engineering.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_eng
-
-/obj/machinery/door/airlock/medical
- icon = 'icons/obj/doors/airlocks/station/medical.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_med
-
-/obj/machinery/door/airlock/hydroponics //Hydroponics front doors!
- icon = 'icons/obj/doors/airlocks/station/hydroponics.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_hydro
-
-/obj/machinery/door/airlock/maintenance
- name = "maintenance access"
- icon = 'icons/obj/doors/airlocks/station/maintenance.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_mai
- normal_integrity = 250
-
-/obj/machinery/door/airlock/maintenance/external
- name = "external airlock access"
- icon = 'icons/obj/doors/airlocks/station/maintenanceexternal.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_extmai
-
-/obj/machinery/door/airlock/mining
- name = "mining airlock"
- icon = 'icons/obj/doors/airlocks/station/mining.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_min
-
-/obj/machinery/door/airlock/atmos
- name = "atmospherics airlock"
- icon = 'icons/obj/doors/airlocks/station/atmos.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_atmo
-
-/obj/machinery/door/airlock/research
- icon = 'icons/obj/doors/airlocks/station/research.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_research
-
-/obj/machinery/door/airlock/freezer
- name = "freezer airlock"
- icon = 'icons/obj/doors/airlocks/station/freezer.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_fre
-
-/obj/machinery/door/airlock/science
- icon = 'icons/obj/doors/airlocks/station/science.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_science
-
-/obj/machinery/door/airlock/virology
- icon = 'icons/obj/doors/airlocks/station/virology.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_viro
-
-//////////////////////////////////
-/*
- Station Airlocks Glass
-*/
-
-/obj/machinery/door/airlock/glass
- opacity = FALSE
- glass = TRUE
-
-/obj/machinery/door/airlock/glass/incinerator
- autoclose = FALSE
- heat_proof = TRUE
- req_access = list(ACCESS_SYNDICATE)
-
-/obj/machinery/door/airlock/glass/incinerator/syndicatelava_interior
- name = "Turbine Interior Airlock"
- id_tag = INCINERATOR_SYNDICATELAVA_AIRLOCK_INTERIOR
-
-/obj/machinery/door/airlock/glass/incinerator/syndicatelava_exterior
- name = "Turbine Exterior Airlock"
- id_tag = INCINERATOR_SYNDICATELAVA_AIRLOCK_EXTERIOR
-
-/obj/machinery/door/airlock/command/glass
- opacity = FALSE
- glass = TRUE
- normal_integrity = 400
-
-/obj/machinery/door/airlock/engineering/glass
- opacity = FALSE
- glass = TRUE
-
-/obj/machinery/door/airlock/engineering/glass/critical
- critical_machine = TRUE //stops greytide virus from opening & bolting doors in critical positions, such as the SM chamber.
-
-/obj/machinery/door/airlock/security/glass
- opacity = FALSE
- glass = TRUE
- normal_integrity = 400
-
-/obj/machinery/door/airlock/medical/glass
- opacity = FALSE
- glass = TRUE
-
-/obj/machinery/door/airlock/hydroponics/glass //Uses same icon as medical/glass, maybe update it with its own unique icon one day?
- opacity = FALSE
- glass = TRUE
-
-/obj/machinery/door/airlock/research/glass
- opacity = FALSE
- glass = TRUE
-
-/obj/machinery/door/airlock/research/glass/incinerator
- autoclose = FALSE
- heat_proof = TRUE
-
-/obj/machinery/door/airlock/research/glass/incinerator/ordmix_interior
- name = "Mixing Room Interior Airlock"
- id_tag = INCINERATOR_ORDMIX_AIRLOCK_INTERIOR
-
-/obj/machinery/door/airlock/research/glass/incinerator/ordmix_exterior
- name = "Mixing Room Exterior Airlock"
- id_tag = INCINERATOR_ORDMIX_AIRLOCK_EXTERIOR
-
-/obj/machinery/door/airlock/mining/glass
- opacity = FALSE
- glass = TRUE
-
-/obj/machinery/door/airlock/atmos/glass
- opacity = FALSE
- glass = TRUE
-
-/obj/machinery/door/airlock/atmos/glass/critical
- critical_machine = TRUE //stops greytide virus from opening & bolting doors in critical positions, such as the SM chamber.
-
-/obj/machinery/door/airlock/science/glass
- opacity = FALSE
- glass = TRUE
-
-/obj/machinery/door/airlock/virology/glass
- opacity = FALSE
- glass = TRUE
-
-/obj/machinery/door/airlock/maintenance/glass
- opacity = FALSE
- glass = TRUE
-
-/obj/machinery/door/airlock/maintenance/external/glass
- opacity = FALSE
- glass = TRUE
- normal_integrity = 200
-
-//////////////////////////////////
-/*
- Station Airlocks Mineral
-*/
-
-/obj/machinery/door/airlock/gold
- name = "gold airlock"
- icon = 'icons/obj/doors/airlocks/station/gold.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_gold
-
-/obj/machinery/door/airlock/gold/discoinferno
- heat_proof = TRUE
- resistance_flags = FIRE_PROOF
- armor_type = /datum/armor/discoinferno_airlock
-
-/datum/armor/discoinferno_airlock
- melee = 30
- bullet = 30
- laser = 20
- energy = 20
- bomb = 10
- fire = 100
- acid = 100
-
-/obj/machinery/door/airlock/gold/glass
- opacity = FALSE
- glass = TRUE
-
-/obj/machinery/door/airlock/silver
- name = "silver airlock"
- icon = 'icons/obj/doors/airlocks/station/silver.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_silver
-
-/obj/machinery/door/airlock/silver/glass
- opacity = FALSE
- glass = TRUE
-
-/obj/machinery/door/airlock/diamond
- name = "diamond airlock"
- icon = 'icons/obj/doors/airlocks/station/diamond.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_diamond
- normal_integrity = 1000
- explosion_block = 2
-
-/obj/machinery/door/airlock/diamond/glass
- normal_integrity = 950
- opacity = FALSE
- glass = TRUE
-
-/obj/machinery/door/airlock/uranium
- name = "uranium airlock"
- icon = 'icons/obj/doors/airlocks/station/uranium.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_uranium
- var/last_event = 0
- //Is this airlock actually radioactive?
- var/actually_radioactive = TRUE
-
-/obj/machinery/door/airlock/uranium/process()
- if(actually_radioactive && world.time > last_event+20)
- if(prob(50))
- radiate()
- last_event = world.time
- ..()
-
-/obj/machinery/door/airlock/uranium/proc/radiate()
- radiation_pulse(
- src,
- max_range = 2,
- threshold = RAD_LIGHT_INSULATION,
- chance = URANIUM_IRRADIATION_CHANCE,
- minimum_exposure_time = URANIUM_RADIATION_MINIMUM_EXPOSURE_TIME,
- )
-
-/obj/machinery/door/airlock/uranium/glass
- opacity = FALSE
- glass = TRUE
-
-/obj/machinery/door/airlock/uranium/safe
- actually_radioactive = FALSE
-
-/obj/machinery/door/airlock/uranium/glass/safe
- actually_radioactive = FALSE
-
-/obj/machinery/door/airlock/plasma
- name = "plasma airlock"
- desc = "No way this can end badly."
- icon = 'icons/obj/doors/airlocks/station/plasma.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_plasma
- material_flags = MATERIAL_EFFECTS
- material_modifier = 0.25
-
-/obj/machinery/door/airlock/plasma/Initialize(mapload)
- custom_materials = custom_materials ? custom_materials : list(/datum/material/plasma = SHEET_MATERIAL_AMOUNT * 10)
- . = ..()
-
-/obj/machinery/door/airlock/plasma/block_superconductivity() //we don't stop the heat~
- return 0
-
-/obj/machinery/door/airlock/plasma/glass
- opacity = FALSE
- glass = TRUE
-
-/obj/machinery/door/airlock/bananium
- name = "bananium airlock"
- desc = "Honkhonkhonk"
- icon = 'icons/obj/doors/airlocks/station/bananium.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_bananium
- doorOpen = 'sound/items/bikehorn.ogg'
-
-/obj/machinery/door/airlock/bananium/glass
- opacity = FALSE
- glass = TRUE
-
-/obj/machinery/door/airlock/sandstone
- name = "sandstone airlock"
- icon = 'icons/obj/doors/airlocks/station/sandstone.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_sandstone
-
-/obj/machinery/door/airlock/sandstone/glass
- opacity = FALSE
- glass = TRUE
-
-/obj/machinery/door/airlock/wood
- name = "wooden airlock"
- icon = 'icons/obj/doors/airlocks/station/wood.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_wood
-
-/obj/machinery/door/airlock/wood/glass
- opacity = FALSE
- glass = TRUE
-
-/obj/machinery/door/airlock/titanium
- name = "shuttle airlock"
- assemblytype = /obj/structure/door_assembly/door_assembly_titanium
- icon = 'icons/obj/doors/airlocks/shuttle/shuttle.dmi'
- overlays_file = 'icons/obj/doors/airlocks/shuttle/overlays.dmi'
- normal_integrity = 400
-
-/obj/machinery/door/airlock/titanium/glass
- normal_integrity = 350
- opacity = FALSE
- glass = TRUE
-
-/obj/machinery/door/airlock/bronze
- name = "bronze airlock"
- icon = 'icons/obj/doors/airlocks/clockwork/pinion_airlock.dmi'
- overlays_file = 'icons/obj/doors/airlocks/clockwork/overlays.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_bronze
-
-/obj/machinery/door/airlock/bronze/seethru
- assemblytype = /obj/structure/door_assembly/door_assembly_bronze/seethru
- opacity = FALSE
- glass = TRUE
-//////////////////////////////////
-/*
- Station2 Airlocks
-*/
-
-/obj/machinery/door/airlock/public
- icon = 'icons/obj/doors/airlocks/station2/glass.dmi'
- overlays_file = 'icons/obj/doors/airlocks/station2/overlays.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_public
-
-/obj/machinery/door/airlock/public/glass
- opacity = FALSE
- glass = TRUE
-
-/obj/machinery/door/airlock/public/glass/incinerator
- autoclose = FALSE
- heat_proof = TRUE
-
-/obj/machinery/door/airlock/public/glass/incinerator/atmos_interior
- name = "Turbine Interior Airlock"
- id_tag = INCINERATOR_ATMOS_AIRLOCK_INTERIOR
-
-/obj/machinery/door/airlock/public/glass/incinerator/atmos_exterior
- name = "Turbine Exterior Airlock"
- id_tag = INCINERATOR_ATMOS_AIRLOCK_EXTERIOR
-
-//////////////////////////////////
-/*
- External Airlocks
-*/
-
-/obj/machinery/door/airlock/external
- name = "external airlock"
- icon = 'icons/obj/doors/airlocks/external/external.dmi'
- overlays_file = 'icons/obj/doors/airlocks/external/overlays.dmi'
- note_overlay_file = 'icons/obj/doors/airlocks/external/overlays.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_ext
-
- /// Whether or not the airlock can be opened without access from a certain direction while powered, or with bare hands from any direction while unpowered OR pressurized.
- var/space_dir = null
-
-/obj/machinery/door/airlock/external/Initialize(mapload, ...)
- // default setting is for mapping only, let overrides work
- if(!mapload)
- req_access = null
-
- return ..()
-
-/obj/machinery/door/airlock/external/LateInitialize()
- . = ..()
- if(space_dir)
- unres_sides |= space_dir
-
-/obj/machinery/door/airlock/external/examine(mob/user)
- . = ..()
- if(space_dir)
- . += span_notice("It has labels indicating that it has an emergency mechanism to open from the [dir2text(space_dir)] side with just your hands even if there's no power.")
-
-/obj/machinery/door/airlock/external/cyclelinkairlock()
- . = ..()
- var/obj/machinery/door/airlock/external/cycle_linked_external_airlock = cyclelinkedairlock
- if(istype(cycle_linked_external_airlock))
- cycle_linked_external_airlock.space_dir |= space_dir
- space_dir |= cycle_linked_external_airlock.space_dir
-
-/obj/machinery/door/airlock/external/try_safety_unlock(mob/user)
- if(space_dir && density)
- if(!hasPower())
- to_chat(user, span_notice("You begin unlocking the airlock safety mechanism..."))
- if(do_after(user, 15 SECONDS, target = src))
- try_to_crowbar(null, user, TRUE)
- return TRUE
- else
- // always open from the space side
- // get_dir(src, user) & space_dir, checked in unresricted_sides
- var/should_safety_open = shuttledocked || cyclelinkedairlock?.shuttledocked || is_safe_turf(get_step(src, space_dir), TRUE, FALSE)
- return try_to_activate_door(user, should_safety_open)
-
- return ..()
-
-/// Access free external airlock
-/obj/machinery/door/airlock/external/ruin
-
-/obj/machinery/door/airlock/external/glass
- opacity = FALSE
- glass = TRUE
-
-/// Access free external glass airlock
-/obj/machinery/door/airlock/external/glass/ruin
-
-//////////////////////////////////
-/*
- CentCom Airlocks
-*/
-
-/obj/machinery/door/airlock/centcom //Use grunge as a station side version, as these have special effects related to them via phobias and such.
- icon = 'icons/obj/doors/airlocks/centcom/centcom.dmi'
- overlays_file = 'icons/obj/doors/airlocks/centcom/overlays.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_centcom
- normal_integrity = 1000
- security_level = 6
- explosion_block = 2
-
-/obj/machinery/door/airlock/grunge
- icon = 'icons/obj/doors/airlocks/centcom/centcom.dmi'
- overlays_file = 'icons/obj/doors/airlocks/centcom/overlays.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_grunge
-
-//////////////////////////////////
-/*
- Vault Airlocks
-*/
-
-/obj/machinery/door/airlock/vault
- name = "vault door"
- icon = 'icons/obj/doors/airlocks/vault/vault.dmi'
- overlays_file = 'icons/obj/doors/airlocks/vault/overlays.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_vault
- explosion_block = 2
- normal_integrity = 400 // reverse engieneerd: 400 * 1.5 (sec lvl 6) = 600 = original
- security_level = 6
-
-//////////////////////////////////
-/*
- Hatch Airlocks
-*/
-
-/obj/machinery/door/airlock/hatch
- name = "airtight hatch"
- icon = 'icons/obj/doors/airlocks/hatch/centcom.dmi'
- overlays_file = 'icons/obj/doors/airlocks/hatch/overlays.dmi'
- note_overlay_file = 'icons/obj/doors/airlocks/hatch/overlays.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_hatch
-
-/obj/machinery/door/airlock/maintenance_hatch
- name = "maintenance hatch"
- icon = 'icons/obj/doors/airlocks/hatch/maintenance.dmi'
- overlays_file = 'icons/obj/doors/airlocks/hatch/overlays.dmi'
- note_overlay_file = 'icons/obj/doors/airlocks/hatch/overlays.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_mhatch
-
-//////////////////////////////////
-/*
- High Security Airlocks
-*/
-
-/obj/machinery/door/airlock/highsecurity
- name = "high tech security airlock"
- icon = 'icons/obj/doors/airlocks/highsec/highsec.dmi'
- overlays_file = 'icons/obj/doors/airlocks/highsec/overlays.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_highsecurity
- explosion_block = 2
- normal_integrity = 500
- security_level = 1
- damage_deflection = 30
-
-//////////////////////////////////
-/*
- Shuttle Airlocks
-*/
-
-/obj/machinery/door/airlock/shuttle
- name = "shuttle airlock"
- icon = 'icons/obj/doors/airlocks/shuttle/shuttle.dmi'
- overlays_file = 'icons/obj/doors/airlocks/shuttle/overlays.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_shuttle
-
-/obj/machinery/door/airlock/shuttle/glass
- opacity = FALSE
- glass = TRUE
-
-/obj/machinery/door/airlock/abductor
- name = "alien airlock"
- desc = "With humanity's current technological level, it could take years to hack this advanced airlock... or maybe we should give a screwdriver a try?"
- icon = 'icons/obj/doors/airlocks/abductor/abductor_airlock.dmi'
- overlays_file = 'icons/obj/doors/airlocks/abductor/overlays.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_abductor
- note_overlay_file = 'icons/obj/doors/airlocks/external/overlays.dmi'
- damage_deflection = 30
- explosion_block = 3
- hackProof = TRUE
- aiControlDisabled = AI_WIRE_DISABLED
- normal_integrity = 700
- security_level = 1
-
-//////////////////////////////////
-/*
- Cult Airlocks
-*/
-
-/obj/machinery/door/airlock/cult
- name = "cult airlock"
- icon = 'icons/obj/doors/airlocks/cult/runed/cult.dmi'
- overlays_file = 'icons/obj/doors/airlocks/cult/runed/overlays.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_cult
- hackProof = TRUE
- aiControlDisabled = AI_WIRE_DISABLED
- req_access = list(ACCESS_BLOODCULT)
- damage_deflection = 10
- var/openingoverlaytype = /obj/effect/temp_visual/cult/door
- var/friendly = FALSE
- var/stealthy = FALSE
-
-/obj/machinery/door/airlock/cult/Initialize(mapload)
- . = ..()
- new openingoverlaytype(loc)
-
-/obj/machinery/door/airlock/cult/canAIControl(mob/user)
- return (IS_CULTIST(user) && !isAllPowerCut())
-
-/obj/machinery/door/airlock/cult/on_break()
- set_panel_open(TRUE)
-
-/obj/machinery/door/airlock/cult/isElectrified()
- return FALSE
-
-/obj/machinery/door/airlock/cult/hasPower()
- return TRUE
-
-/obj/machinery/door/airlock/cult/allowed(mob/living/L)
- if(!density)
- return TRUE
- if(friendly || IS_CULTIST(L) || isshade(L) || isconstruct(L))
- if(!stealthy)
- new openingoverlaytype(loc)
- return TRUE
- else
- if(!stealthy)
- new /obj/effect/temp_visual/cult/sac(loc)
- var/atom/throwtarget
- throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(L, src)))
- SEND_SOUND(L, sound(pick('sound/hallucinations/turn_around1.ogg','sound/hallucinations/turn_around2.ogg'),0,1,50))
- flash_color(L, flash_color="#960000", flash_time=20)
- L.Paralyze(40)
- L.throw_at(throwtarget, 5, 1)
- return FALSE
-
-/obj/machinery/door/airlock/cult/proc/conceal()
- icon = 'icons/obj/doors/airlocks/station/maintenance.dmi'
- overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
- name = "Airlock"
- desc = "It opens and closes."
- stealthy = TRUE
- update_appearance()
-
-/obj/machinery/door/airlock/cult/proc/reveal()
- icon = initial(icon)
- overlays_file = initial(overlays_file)
- name = initial(name)
- desc = initial(desc)
- stealthy = initial(stealthy)
- update_appearance()
-
-/obj/machinery/door/airlock/cult/narsie_act()
- return
-
-/obj/machinery/door/airlock/cult/emp_act(severity)
- return
-
-/obj/machinery/door/airlock/cult/friendly
- friendly = TRUE
-
-/obj/machinery/door/airlock/cult/glass
- glass = TRUE
- opacity = FALSE
-
-/obj/machinery/door/airlock/cult/glass/friendly
- friendly = TRUE
-
-/obj/machinery/door/airlock/cult/unruned
- icon = 'icons/obj/doors/airlocks/cult/unruned/cult.dmi'
- overlays_file = 'icons/obj/doors/airlocks/cult/unruned/overlays.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_cult/unruned
- openingoverlaytype = /obj/effect/temp_visual/cult/door/unruned
-
-/obj/machinery/door/airlock/cult/unruned/friendly
- friendly = TRUE
-
-/obj/machinery/door/airlock/cult/unruned/glass
- glass = TRUE
- opacity = FALSE
-
-/obj/machinery/door/airlock/cult/unruned/glass/friendly
- friendly = TRUE
-
-/obj/machinery/door/airlock/cult/weak
- name = "brittle cult airlock"
- desc = "An airlock hastily corrupted by blood magic, it is unusually brittle in this state."
- normal_integrity = 150
- damage_deflection = 5
- armor_type = /datum/armor/none
-
-
-//////////////////////////////////
-/*
- Material Airlocks
-*/
-/obj/machinery/door/airlock/material
- name = "Airlock"
- material_flags = MATERIAL_EFFECTS | MATERIAL_ADD_PREFIX | MATERIAL_GREYSCALE | MATERIAL_AFFECT_STATISTICS
- greyscale_config = /datum/greyscale_config/material_airlock
- assemblytype = /obj/structure/door_assembly/door_assembly_material
-
-/obj/machinery/door/airlock/material/close(forced, force_crush)
- . = ..()
- if(!.)
- return
- for(var/datum/material/mat in custom_materials)
- if(mat.alpha < 255)
- set_opacity(FALSE)
- break
-
-/obj/machinery/door/airlock/material/prepare_deconstruction_assembly(obj/structure/door_assembly/assembly)
- assembly.set_custom_materials(custom_materials)
- ..()
-
-/obj/machinery/door/airlock/material/glass
- opacity = FALSE
- glass = TRUE
-
-//////////////////////////////////
-/*
- Misc Airlocks
-*/
-
-/obj/machinery/door/airlock/glass_large
- name = "large glass airlock"
- icon = 'icons/obj/doors/airlocks/glass_large/glass_large.dmi'
- overlays_file = 'icons/obj/doors/airlocks/glass_large/overlays.dmi'
- opacity = FALSE
- assemblytype = null
- glass = TRUE
- bound_width = 64 // 2x1
-
-/obj/machinery/door/airlock/glass_large/narsie_act()
- return
-
-/// Subtype used in unit tests to ensure instant airlock opening/closing. Pretty much just excises everything that would delay the process or is un-needed for the sake of the test (sleeps, icon animations).
-/obj/machinery/door/airlock/instant
-
-// set_density on both open and close procs has a check and return builtin.
-
-/obj/machinery/door/airlock/instant/open(forced = DEFAULT_DOOR_CHECKS)
- operating = TRUE
- SEND_SIGNAL(src, COMSIG_AIRLOCK_OPEN, forced)
- set_density(FALSE)
- operating = FALSE
- return TRUE
-
-/obj/machinery/door/airlock/instant/close(forced = DEFAULT_DOOR_CHECKS, force_crush = FALSE)
- operating = TRUE
- SEND_SIGNAL(src, COMSIG_AIRLOCK_CLOSE, forced)
- set_density(TRUE)
- operating = FALSE
- return TRUE
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index 671e3efb197..3d9a22387f2 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -27,6 +27,10 @@
var/visible = TRUE
var/operating = FALSE
var/glass = FALSE
+ /// Do we need to keep track of a filler panel with the airlock
+ var/multi_tile
+ /// A filler object used to fill the space of multi-tile airlocks
+ var/obj/structure/fluff/airlock_filler/filler
var/welded = FALSE
var/heat_proof = FALSE // For rglass-windowed airlocks and firedoors
var/emergency = FALSE // Emergency access override
@@ -66,6 +70,10 @@
AddElement(/datum/element/blocks_explosives)
. = ..()
set_init_door_layer()
+ if(bound_width > world.icon_size)
+ multi_tile = TRUE
+ set_filler()
+ update_overlays()
update_freelook_sight()
air_update_turf(TRUE, TRUE)
register_context()
@@ -133,9 +141,46 @@
if(spark_system)
qdel(spark_system)
spark_system = null
+ QDEL_NULL(filler)
air_update_turf(TRUE, FALSE)
return ..()
+/obj/machinery/door/Move()
+ if(multi_tile)
+ set_filler()
+ return ..()
+
+/**
+ * Sets the bounds of the airlock. For use with multi-tile airlocks.
+ * If the airlock is multi-tile, it will set the bounds to be the size of the airlock.
+ * If the airlock doesn't already have a filler object, it will create one.
+ * If the airlock already has a filler object, it will move it to the correct location.
+ */
+/obj/machinery/door/proc/set_filler()
+ if(!multi_tile)
+ return
+ if(!filler)
+ filler = new(get_step(src, get_adjusted_dir(dir)))
+ filler.pair_airlock(src)
+ else
+ filler.loc = get_step(src, get_adjusted_dir(dir))
+
+ filler.density = density
+ filler.set_opacity(opacity)
+
+/**
+ * Checks which way the airlock is facing and adjusts the direction accordingly.
+ * For use with multi-tile airlocks.
+ *
+ * @param dir direction to adjust
+ * @return adjusted direction
+ */
+/obj/machinery/door/proc/get_adjusted_dir(dir)
+ if(dir in list(NORTH, SOUTH))
+ return EAST
+ else
+ return NORTH
+
/**
* Signal handler for checking if we notify our surrounding that access requirements are lifted accordingly to a newly set security level
*
@@ -453,31 +498,31 @@
open()
/obj/machinery/door/proc/crush()
- for(var/mob/living/L in get_turf(src))
- L.visible_message(span_warning("[src] closes on [L], crushing [L.p_them()]!"), span_userdanger("[src] closes on you and crushes you!"))
- SEND_SIGNAL(L, COMSIG_LIVING_DOORCRUSHED, src)
- if(isalien(L)) //For xenos
- L.adjustBruteLoss(DOOR_CRUSH_DAMAGE * 1.5) //Xenos go into crit after aproximately the same amount of crushes as humans.
- L.emote("roar")
- else if(ishuman(L)) //For humans
- L.adjustBruteLoss(DOOR_CRUSH_DAMAGE)
- L.emote("scream")
- //L.Paralyze(100) //SKYRAT EDIT CHANGE - COMBAT - ORIGINAL
- L.StaminaKnockdown(20, TRUE, TRUE)
- else if(ismonkey(L)) //For monkeys
- L.adjustBruteLoss(DOOR_CRUSH_DAMAGE)
- //L.Paralyze(100) //ORIGINAL
- L.StaminaKnockdown(20, TRUE, TRUE)
- //SKYRAT EDIT END
- else //for simple_animals & borgs
- L.adjustBruteLoss(DOOR_CRUSH_DAMAGE)
- var/turf/location = get_turf(src)
- //add_blood doesn't work for borgs/xenos, but add_blood_floor does.
- L.add_splatter_floor(location)
- log_combat(src, L, "crushed")
- for(var/obj/vehicle/sealed/mecha/M in get_turf(src))
- M.take_damage(DOOR_CRUSH_DAMAGE)
- log_combat(src, M, "crushed")
+ for(var/turf/checked_turf in locs)
+ for(var/mob/living/future_pancake in checked_turf)
+ future_pancake.visible_message(span_warning("[src] closes on [future_pancake], crushing [future_pancake.p_them()]!"), span_userdanger("[src] closes on you and crushes you!"))
+ SEND_SIGNAL(future_pancake, COMSIG_LIVING_DOORCRUSHED, src)
+ if(isalien(future_pancake)) //For xenos
+ future_pancake.adjustBruteLoss(DOOR_CRUSH_DAMAGE * 1.5) //Xenos go into crit after aproximately the same amount of crushes as humans.
+ future_pancake.emote("roar")
+ else if(ishuman(future_pancake)) //For humans
+ future_pancake.adjustBruteLoss(DOOR_CRUSH_DAMAGE)
+ future_pancake.emote("scream")
+ // future_pancake.Paralyze(100) // ORIGINAL
+ future_pancake.StaminaKnockdown(20, TRUE, TRUE) // SKYRAT EDIT CHANGE - AIRLOCKS
+ else if(ismonkey(future_pancake)) //For monkeys
+ future_pancake.adjustBruteLoss(DOOR_CRUSH_DAMAGE)
+ // future_pancake.Paralyze(100) // ORIGINAL
+ future_pancake.StaminaKnockdown(20, TRUE, TRUE) // SKYRAT EDIT CHANGE - AIRLOCKS
+ else //for simple_animals & borgs
+ future_pancake.adjustBruteLoss(DOOR_CRUSH_DAMAGE)
+ var/turf/location = get_turf(src)
+ //add_blood doesn't work for borgs/xenos, but add_blood_floor does.
+ future_pancake.add_splatter_floor(location)
+ log_combat(src, future_pancake, "crushed")
+ for(var/obj/vehicle/sealed/mecha/mech in get_turf(src)) // Your fancy metal won't save you here!
+ mech.take_damage(DOOR_CRUSH_DAMAGE)
+ log_combat(src, mech, "crushed")
/obj/machinery/door/proc/autoclose()
if(!QDELETED(src) && !density && !operating && !locked && !welded && autoclose)
diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm
index 23da14ec788..b09dd7a5f83 100644
--- a/code/game/objects/structures/door_assembly.dm
+++ b/code/game/objects/structures/door_assembly.dm
@@ -6,26 +6,51 @@
anchored = FALSE
density = TRUE
max_integrity = 200
+ /// Airlock's current construction state
var/state = AIRLOCK_ASSEMBLY_NEEDS_WIRES
var/base_name = "Airlock"
+ var/created_name = null
var/mineral = null
var/obj/item/electronics/airlock/electronics = null
- var/airlock_type = /obj/machinery/door/airlock //the type path of the airlock once completed
+ /// Do we perform the extra checks required for multi-tile (large) airlocks
+ var/multi_tile = FALSE
+ /// The type path of the airlock once completed (solid version)
+ var/airlock_type = /obj/machinery/door/airlock
+ /// The type path of the airlock once completed (glass version)
var/glass_type = /obj/machinery/door/airlock/glass
- var/glass = 0 // 0 = glass can be installed. 1 = glass is already installed.
- var/created_name = null
- var/heat_proof_finished = 0 //whether to heat-proof the finished airlock
+ /// FALSE = glass can be installed. TRUE = glass is already installed.
+ var/glass = FALSE
+ /// Whether to heat-proof the finished airlock
+ var/heat_proof_finished = FALSE
+ /// If you're changing the airlock material, what is the previous type
var/previous_assembly = /obj/structure/door_assembly
- var/noglass = FALSE //airlocks with no glass version, also cannot be modified with sheets
- var/nomineral = FALSE //airlock with glass version, but cannot be modified with sheets
+ /// Airlocks with no glass version, also cannot be modified with sheets
+ var/noglass = FALSE
+ /// Airlock with glass version, but cannot be modified with sheets
+ var/nomineral = FALSE
+ /// What type of material the airlock drops when deconstructed
var/material_type = /obj/item/stack/sheet/iron
+ /// Amount of material the airlock drops when deconstructed
var/material_amt = 4
+/obj/structure/door_assembly/multi_tile
+ dir = EAST
+ multi_tile = TRUE
+
/obj/structure/door_assembly/Initialize(mapload)
. = ..()
update_appearance()
update_name()
+/obj/structure/door_assembly/multi_tile/Initialize(mapload)
+ . = ..()
+ set_bounds()
+ update_overlays()
+
+/obj/structure/door_assembly/multi_tile/Move()
+ . = ..()
+ set_bounds()
+
/obj/structure/door_assembly/examine(mob/user)
. = ..()
var/doorname = ""
@@ -78,7 +103,7 @@
to_chat(user, span_notice("You weld the glass panel out."))
if(heat_proof_finished)
new /obj/item/stack/sheet/rglass(get_turf(src))
- heat_proof_finished = 0
+ heat_proof_finished = FALSE
else
new /obj/item/stack/sheet/glass(get_turf(src))
glass = 0
@@ -259,10 +284,6 @@
else
door = new airlock_type( loc )
door.setDir(dir)
- //SKYRAT EDIT ADDITION BEGIN - LARGE_DOORS
- if(door.multi_tile)
- door.set_bounds()
- //SKYRAT EDIT END
door.unres_sides = electronics.unres_sides
//door.req_access = req_access
door.electronics = electronics
@@ -364,3 +385,18 @@
qdel(src)
return TRUE
return FALSE
+
+/**
+ * Updates the bounds of the airlock assembly
+ * Sets the bounds of the airlock assembly according to the direction.
+ * This ensures that the bounds are always correct, even if the airlock is rotated.
+ */
+/obj/structure/door_assembly/multi_tile/proc/set_bounds()
+ var/size = get_size_in_tiles(src)
+
+ if(dir in list(NORTH, SOUTH))
+ bound_width = size * world.icon_size
+ bound_height = world.icon_size
+ else
+ bound_width = world.icon_size
+ bound_height = size * world.icon_size
diff --git a/code/game/objects/structures/door_assembly_types.dm b/code/game/objects/structures/door_assembly_types.dm
index 2d7e607cd22..05efc4ae489 100644
--- a/code/game/objects/structures/door_assembly_types.dm
+++ b/code/game/objects/structures/door_assembly_types.dm
@@ -267,6 +267,15 @@
nomineral = TRUE
material_flags = MATERIAL_EFFECTS | MATERIAL_ADD_PREFIX | MATERIAL_GREYSCALE | MATERIAL_AFFECT_STATISTICS
+/obj/structure/door_assembly/multi_tile/glass
+ name = "large glass airlock assembly"
+ base_name = "large glass airlock"
+ icon = 'icons/obj/doors/airlocks/glass_large/glass_large.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/glass_large/overlays.dmi'
+ airlock_type = /obj/machinery/door/airlock/multi_tile/glass
+ glass_type = /obj/machinery/door/airlock/multi_tile/glass
+
+
/obj/structure/door_assembly/door_assembly_material/deconstruct(disassembled = TRUE)
if(!(flags_1 & NODECONSTRUCT_1))
var/turf/T = get_turf(src)
diff --git a/code/modules/industrial_lift/tram/tram_doors.dm b/code/modules/industrial_lift/tram/tram_doors.dm
index 3515adad900..f0253659eb6 100644
--- a/code/modules/industrial_lift/tram/tram_doors.dm
+++ b/code/modules/industrial_lift/tram/tram_doors.dm
@@ -3,6 +3,7 @@
desc = "Probably won't crush you if you try to rush them as they close. But we know you live on that danger, try and beat the tram!"
icon = 'icons/obj/doors/tramdoor.dmi'
req_access = list("tcomms")
+ multi_tile = TRUE
var/associated_lift = MAIN_STATION_TRAM
var/datum/weakref/tram_ref
/// Are the doors in a malfunctioning state (dangerous)
@@ -99,6 +100,8 @@
/obj/machinery/door/window/tram/Initialize(mapload, set_dir, unres_sides)
. = ..()
RemoveElement(/datum/element/atmos_sensitive, mapload)
+ if(filler)
+ filler.set_density(FALSE) // tram doors allow you to stand on the tile
INVOKE_ASYNC(src, PROC_REF(open))
GLOB.tram_doors += src
find_tram()
diff --git a/modular_skyrat/modules/aesthetics/airlock/code/airlock.dm b/modular_skyrat/modules/aesthetics/airlock/code/airlock.dm
index 49425abf1dc..2ee98cd64e0 100644
--- a/modular_skyrat/modules/aesthetics/airlock/code/airlock.dm
+++ b/modular_skyrat/modules/aesthetics/airlock/code/airlock.dm
@@ -382,11 +382,20 @@
icon = 'modular_skyrat/modules/aesthetics/airlock/icons/airlocks/highsec/highsec.dmi'
overlays_file = 'modular_skyrat/modules/aesthetics/airlock/icons/airlocks/highsec/overlays.dmi'
-//GLASS
-/obj/machinery/door/airlock/glass_large
- icon = 'modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile/multi_tile.dmi'
- overlays_file = 'modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile/overlays.dmi'
- multi_tile = TRUE
+//MULTI-TILE
+
+/obj/machinery/door/airlock/multi_tile
+ icon = 'modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile/glass.dmi'
+ overlays_file = 'modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile/glass_overlays.dmi'
+ bound_width = 64
+
+/obj/machinery/door/airlock/multi_tile/glass
+ icon = 'modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile/glass.dmi'
+ overlays_file = 'modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile/glass_overlays.dmi'
+
+/obj/machinery/door/airlock/multi_tile/metal
+ icon = 'modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile/metal.dmi'
+ overlays_file = 'modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile/metal_overlays.dmi'
//ASSEMBLYS
/obj/structure/door_assembly/door_assembly_public
diff --git a/modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile/multi_tile.dmi b/modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile/glass.dmi
similarity index 100%
rename from modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile/multi_tile.dmi
rename to modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile/glass.dmi
diff --git a/modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile/overlays.dmi b/modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile/glass_overlays.dmi
similarity index 100%
rename from modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile/overlays.dmi
rename to modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile/glass_overlays.dmi
diff --git a/modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile2/multi_tile.dmi b/modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile/metal.dmi
similarity index 100%
rename from modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile2/multi_tile.dmi
rename to modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile/metal.dmi
diff --git a/modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile2/overlays.dmi b/modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile/metal_overlays.dmi
similarity index 100%
rename from modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile2/overlays.dmi
rename to modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile/metal_overlays.dmi
diff --git a/modular_skyrat/modules/large_doors/code/large_doors.dm b/modular_skyrat/modules/large_doors/code/large_doors.dm
deleted file mode 100644
index 799968fcb8e..00000000000
--- a/modular_skyrat/modules/large_doors/code/large_doors.dm
+++ /dev/null
@@ -1,189 +0,0 @@
-/**
- * Returns the size of the sprite in tiles.
- * Takes the icon size and divides it by the world icon size (default 32).
- * This gives the size of the sprite in tiles.
- *
- * @return size of the sprite in tiles
- */
-/proc/get_size_in_tiles(obj/target)
- var/icon/size_check = icon(target.icon, target.icon_state)
- var/size = size_check.Width() / world.icon_size
-
- return size
-
-/obj/machinery/door/airlock
- /// Whether or not the door is a multi-tile airlock.
- var/multi_tile
- /// A filler object used to fill the space of multi-tile airlocks.
- var/obj/airlock_filler_object/filler
-
-/obj/machinery/door/airlock/Initialize(mapload)
- . = ..()
- multi_tile = get_size_in_tiles(src) > 1
- if(multi_tile)
- set_bounds()
- update_overlays()
-
-/obj/machinery/door/airlock/Move()
- if(multi_tile)
- set_bounds()
- return ..()
-
-/obj/machinery/door/airlock/Destroy()
- if(filler)
- qdel(filler)
- filler = null
- return ..()
-
-/**
- * Sets the bounds of the airlock. For use with multi-tile airlocks.
- * If the airlock is multi-tile, it will set the bounds to be the size of the airlock.
- * If the airlock doesn't already have a filler object, it will create one.
- * If the airlock already has a filler object, it will move it to the correct location.
- */
-/obj/machinery/door/airlock/proc/set_bounds()
- if(!multi_tile)
- return
- var/size = get_size_in_tiles(src)
- bound_width = (get_adjusted_dir(dir) == NORTH) ? world.icon_size : size * world.icon_size
- bound_height = (get_adjusted_dir(dir) == NORTH) ? size * world.icon_size : world.icon_size
- if(!filler)
- filler = new(get_step(src, get_adjusted_dir(dir)))
- filler.parent_airlock = src
- else
- filler.loc = get_step(src, get_adjusted_dir(dir))
-
- filler.density = density
- filler.set_opacity(opacity)
-
-
-/**
- * Checks which way the airlock is facing and adjusts the direction accordingly.
- * For use with multi-tile airlocks.
- *
- * @param dir direction to adjust
- * @return adjusted direction
- */
-/obj/machinery/door/proc/get_adjusted_dir(dir)
- if(dir in list(NORTH, SOUTH))
- return EAST
- else
- return NORTH
-
-/**
- * Returns a list of turfs that the door occupies.
- * If the door is multi-tile, it will return a list of turfs that the door occupies.
- * If the door is not multi-tile, it will return only the current turf.
- *
- * @return list of turfs the door occupies
- */
-/obj/machinery/door/airlock/proc/get_turfs()
- var/turf/current_turf = get_turf(src)
- if(!multi_tile)
- return current_turf
- var/list/occupied_turfs = list()
- for(var/i in 1 to get_size_in_tiles(src))
- occupied_turfs += current_turf
- current_turf = get_step(current_turf, get_adjusted_dir(dir))
- return occupied_turfs
-
-
-/obj/machinery/door/airlock/multi_tile
- multi_tile = TRUE
- has_environment_lights = FALSE
-
-/obj/machinery/door/airlock/multi_tile/glass
- name = "large glass airlock"
- icon = 'modular_skyrat/modules/large_doors/icons/glass/multi_tile.dmi'
- overlays_file = 'modular_skyrat/modules/large_doors/icons/glass/overlays.dmi'
- opacity = FALSE
- airlock_material = "glass"
- glass = TRUE
- assemblytype = /obj/structure/door_assembly/multi_tile/glass
-
-/obj/machinery/door/airlock/multi_tile/metal
- name = "large airlock"
- icon = 'modular_skyrat/modules/large_doors/icons/metal/multi_tile.dmi'
- overlays_file = 'modular_skyrat/modules/large_doors/icons/metal/overlays.dmi'
- assemblytype = /obj/structure/door_assembly/multi_tile/metal
-
-/obj/airlock_filler_object
- name = ""
- density = TRUE
- opacity = TRUE
- anchored = TRUE
- can_atmos_pass = ATMOS_PASS_DENSITY
- var/parent_airlock
-
-/obj/airlock_filler_object/CanAllowThrough(atom/movable/mover, turf/target)
- . = ..()
- if(.)
- return
- // Snowflake handling for PASSGLASS.
- if(istype(mover) && (mover.pass_flags & PASSGLASS))
- return !opacity
-
-/obj/airlock_filler_object/can_be_pulled(user, grab_state, force)
- return FALSE
-
-/obj/airlock_filler_object/singularity_act()
- return
-
-/obj/airlock_filler_object/singularity_pull(S, current_size)
- return
-
-/obj/airlock_filler_object/Destroy(force)
- if(parent_airlock)
- parent_airlock = null
- return ..()
-
-//ASSEMBLYS!
-/obj/structure/door_assembly/multi_tile
- dir = EAST
- /// Whether or not the assembly is for a multi-tile airlock.
- var/multi_tile
-
-/obj/structure/door_assembly/multi_tile/Initialize(mapload)
- . = ..()
- multi_tile = get_size_in_tiles(src) > 1
- if(multi_tile)
- set_bounds()
- update_overlays()
-
-
-/obj/structure/door_assembly/multi_tile/Move()
- . = ..()
- set_bounds()
-
-
-/**
- * Updates the bounds of the airlock assembly
- * Sets the bounds of the airlock assembly according to the direction.
- * This ensures that the bounds are always correct, even if the airlock is rotated.
- */
-/obj/structure/door_assembly/multi_tile/proc/set_bounds()
- var/size = get_size_in_tiles(src)
-
- if(dir in list(NORTH, SOUTH))
- bound_width = size * world.icon_size
- bound_height = world.icon_size
- else
- bound_width = world.icon_size
- bound_height = size * world.icon_size
-
-
-/obj/structure/door_assembly/multi_tile/metal
- name = "large airlock assembly"
- base_name = "large airlock"
- icon = 'modular_skyrat/modules/large_doors/icons/metal/multi_tile.dmi'
- overlays_file = 'modular_skyrat/modules/large_doors/icons/metal/overlays.dmi'
- airlock_type = /obj/machinery/door/airlock/multi_tile/metal
- glass_type = /obj/machinery/door/airlock/multi_tile/glass
-
-/obj/structure/door_assembly/multi_tile/glass
- name = "large glass airlock assembly"
- base_name = "large glass airlock"
- icon = 'modular_skyrat/modules/large_doors/icons/glass/multi_tile.dmi'
- overlays_file = 'modular_skyrat/modules/large_doors/icons/glass/overlays.dmi'
- airlock_type = /obj/machinery/door/airlock/multi_tile/glass
-
diff --git a/modular_skyrat/modules/large_doors/icons/glass/multi_tile.dmi b/modular_skyrat/modules/large_doors/icons/glass/multi_tile.dmi
deleted file mode 100644
index a400cb6c61d..00000000000
Binary files a/modular_skyrat/modules/large_doors/icons/glass/multi_tile.dmi and /dev/null differ
diff --git a/modular_skyrat/modules/large_doors/icons/glass/overlays.dmi b/modular_skyrat/modules/large_doors/icons/glass/overlays.dmi
deleted file mode 100644
index 2f08ff85ea3..00000000000
Binary files a/modular_skyrat/modules/large_doors/icons/glass/overlays.dmi and /dev/null differ
diff --git a/modular_skyrat/modules/large_doors/icons/metal/multi_tile.dmi b/modular_skyrat/modules/large_doors/icons/metal/multi_tile.dmi
deleted file mode 100644
index b0b5ca2b20e..00000000000
Binary files a/modular_skyrat/modules/large_doors/icons/metal/multi_tile.dmi and /dev/null differ
diff --git a/modular_skyrat/modules/large_doors/icons/metal/overlays.dmi b/modular_skyrat/modules/large_doors/icons/metal/overlays.dmi
deleted file mode 100644
index a47008823b4..00000000000
Binary files a/modular_skyrat/modules/large_doors/icons/metal/overlays.dmi and /dev/null differ
diff --git a/modular_skyrat/modules/large_doors/readme.md b/modular_skyrat/modules/large_doors/readme.md
deleted file mode 100644
index 1717340292a..00000000000
--- a/modular_skyrat/modules/large_doors/readme.md
+++ /dev/null
@@ -1,26 +0,0 @@
-## Title: Large Airlocks
-
-MODULE ID: LARGE_DOORS
-
-### Description:
-
-Adds double doors with atmos functionality.
-
-### TG Proc Changes:
-
-- /obj/machinery/door/airlock/open()
-- /obj/machinery/door/airlock/close()
-
-### Defines:
-
-
-### Master file additions
-
-
-### Included files that are not contained in this module:
-
-- N/A
-
-### Credits:
-Gandalf2k15 - Original code
-Eris / Tau Ceti - Sprites
diff --git a/tgstation.dme b/tgstation.dme
index b50ec5d6323..fc4e4326d48 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -1851,7 +1851,6 @@
#include "code\game\machinery\dna_infuser\organ_sets\roach_organs.dm"
#include "code\game\machinery\doors\airlock.dm"
#include "code\game\machinery\doors\airlock_electronics.dm"
-#include "code\game\machinery\doors\airlock_types.dm"
#include "code\game\machinery\doors\brigdoors.dm"
#include "code\game\machinery\doors\door.dm"
#include "code\game\machinery\doors\firedoor.dm"
@@ -6641,7 +6640,6 @@
#include "modular_skyrat\modules\jukebox\code\jukebox_subsystem.dm"
#include "modular_skyrat\modules\jungle\code\flora.dm"
#include "modular_skyrat\modules\knives\knives.dm"
-#include "modular_skyrat\modules\large_doors\code\large_doors.dm"
#include "modular_skyrat\modules\layer_shift\code\mob_movement.dm"
#include "modular_skyrat\modules\liquids\code\drains.dm"
#include "modular_skyrat\modules\liquids\code\height_floors.dm"
diff --git a/tools/UpdatePaths/Scripts/76732_multi-tile_airlocks.txt b/tools/UpdatePaths/Scripts/76732_multi-tile_airlocks.txt
new file mode 100644
index 00000000000..dffbbbe93d2
--- /dev/null
+++ b/tools/UpdatePaths/Scripts/76732_multi-tile_airlocks.txt
@@ -0,0 +1,3 @@
+#comment New path for large glass airlock.
+
+/obj/machinery/door/airlock/glass_large : /obj/machinery/door/airlock/multi_tile/glass{@OLD}
\ No newline at end of file