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